WEBVTT

00:00:00.001 --> 00:00:04.500
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:04.500 --> 00:00:09.020
This is episode 363, recorded December 5th.

00:00:09.020 --> 00:00:09.800
And I'm Brian Okken.

00:00:09.800 --> 00:00:10.760
I'm Michael Kennedy.

00:00:10.760 --> 00:00:13.480
And this week we are sponsored by ourselves.

00:00:13.480 --> 00:00:16.540
So we will plug our own stuff a little bit later.

00:00:16.540 --> 00:00:23.200
And if you want to follow the show, follow it at pythonbytes at fosstodon.org.

00:00:23.200 --> 00:00:28.700
And also Michael and I are both on Fosstodon as well, which is Mastodon.

00:00:28.700 --> 00:00:32.360
If you're anywhere other than Fosstodon also, that's fine.

00:00:32.360 --> 00:00:33.400
You can still follow us.

00:00:33.400 --> 00:00:37.380
But if you would like an invite, hit one of us up and we will send you an invite.

00:00:37.380 --> 00:00:42.380
Mastodon has made it easier to start following people from other instances, by the way.

00:00:42.380 --> 00:00:43.740
I don't know if you remember how it used to be.

00:00:43.740 --> 00:00:48.440
You'd go and somebody would be like at mass.to and it'd be like, sign in.

00:00:48.440 --> 00:00:50.320
And you couldn't follow them.

00:00:50.320 --> 00:00:51.020
You have to sign in.

00:00:51.020 --> 00:00:52.260
You're like, but I have an account here.

00:00:52.260 --> 00:00:53.240
What is this weirdness?

00:00:53.240 --> 00:00:57.380
So now if you say follow, it'll pull a dropdown and say, you know, give me a few letters out of your

00:00:57.380 --> 00:01:01.240
instance and then we'll direct you over there where you're signed in to click follow.

00:01:01.240 --> 00:01:04.080
So it's a little bit easier to follow anybody on Mastodon.

00:01:04.080 --> 00:01:05.560
It's still clunky.

00:01:05.560 --> 00:01:06.980
I don't know why it's so hard.

00:01:06.980 --> 00:01:10.340
So what I usually do is I'm not trying that.

00:01:10.340 --> 00:01:16.460
I usually like pop somebody's whole, like say, at mkennedy at fosstodon.org or something.

00:01:16.720 --> 00:01:18.940
I pop it in the search, the search bar.

00:01:18.940 --> 00:01:20.400
That's what I did previously as well.

00:01:20.400 --> 00:01:20.600
Yeah.

00:01:20.600 --> 00:01:20.940
Yeah.

00:01:20.940 --> 00:01:23.160
It usually, usually finds the person, right?

00:01:23.160 --> 00:01:23.580
So yeah.

00:01:23.580 --> 00:01:23.920
Yeah.

00:01:23.920 --> 00:01:27.960
You can even put just the whole URL of their profile without reordering it to their username.

00:01:27.960 --> 00:01:31.300
But if I'm trying to find the URL, that's sometimes, yeah.

00:01:31.300 --> 00:01:32.320
Indeed.

00:01:32.320 --> 00:01:33.120
All right.

00:01:33.120 --> 00:01:38.580
Well, it's Mastodon's getting a little smoother and actually Mastodon conversations are going

00:01:38.580 --> 00:01:41.200
to be featured at least in my, my stuff here somewhat heavily.

00:01:41.700 --> 00:01:42.920
So yeah, let's talk about FixIt.

00:01:42.920 --> 00:01:46.180
So FixIt is this, what's the best way to put it?

00:01:46.180 --> 00:01:50.140
It's probably a Flake 8 like, they compare it to Flake 8.

00:01:50.140 --> 00:01:56.380
This comes from Meta, AKA Facebook, and it's a linter for their monorepo.

00:01:56.380 --> 00:01:59.400
And when you hear monorepo, that is not a monolith.

00:01:59.400 --> 00:02:04.380
Ironically, a lot of times the more broken up your code is, the more it fits a monorepo.

00:02:04.380 --> 00:02:08.240
But anyway, it's, they have literally a single repo.

00:02:08.240 --> 00:02:08.760
Is it Git?

00:02:08.760 --> 00:02:09.260
I'm not sure.

00:02:09.400 --> 00:02:13.700
But something like a single Git repo for all of Facebook, which is just insane.

00:02:13.700 --> 00:02:15.160
They want to lint that.

00:02:15.160 --> 00:02:18.940
And they want to have things like Black applied to it.

00:02:18.940 --> 00:02:22.620
And Black actually came from Łukasz Langa, who was at Meta at the time.

00:02:22.620 --> 00:02:23.480
So kind of funny.

00:02:23.480 --> 00:02:24.740
But they don't use Black.

00:02:24.740 --> 00:02:26.680
I don't know why they don't use Black.

00:02:26.680 --> 00:02:27.740
They have some reasons.

00:02:27.740 --> 00:02:32.840
Seems like Black saw some of them and could be probably adapted while Łukasz was there.

00:02:32.840 --> 00:02:33.920
But anyway, they don't.

00:02:33.920 --> 00:02:38.260
So they had this thing called FixIt that goes through and is more like Black,

00:02:38.360 --> 00:02:42.320
even though they compare it to Flake 8 in that it not just finds problems,

00:02:42.320 --> 00:02:47.620
but fixes them and normalizes things like, where do your commas go in a list?

00:02:47.620 --> 00:02:50.820
You know, or you have a plus to continue a line.

00:02:50.820 --> 00:02:53.400
Is that at the end of the one line or the beginning of the other line?

00:02:53.400 --> 00:02:53.580
Right?

00:02:53.580 --> 00:02:55.220
Those kinds of things we're all familiar with.

00:02:55.220 --> 00:02:57.140
So they built one called FixIt.

00:02:57.260 --> 00:03:01.000
And now they released another one called FixIt 2 that's supposed to be better.

00:03:01.000 --> 00:03:04.600
And they open sourced it so people can check this out if they're interested.

00:03:04.600 --> 00:03:05.040
Right?

00:03:05.040 --> 00:03:06.600
So I'll tell you quick about it.

00:03:06.600 --> 00:03:07.740
A quick few things about it.

00:03:07.900 --> 00:03:10.940
And let's bump over to the Mastodon.

00:03:10.940 --> 00:03:11.700
Not the Mastodon.

00:03:11.700 --> 00:03:12.240
Omnivore.

00:03:12.240 --> 00:03:12.960
Other thing.

00:03:12.960 --> 00:03:13.380
Other thing.

00:03:13.380 --> 00:03:15.240
Because I have notes on this big, long thing.

00:03:15.240 --> 00:03:21.020
So it turns out that Python is super popular over at Meta, which is really cool.

00:03:21.020 --> 00:03:24.280
They have production engineers and software engineers.

00:03:24.280 --> 00:03:28.040
So production engineers are like software devs who do production.

00:03:28.040 --> 00:03:29.540
Their main role is to do production.

00:03:29.540 --> 00:03:34.180
And they also have a whole Python language foundation team, which is pretty interesting.

00:03:34.180 --> 00:03:39.140
And the job of this team is basically to build tools for the rest of the team.

00:03:39.140 --> 00:03:40.660
And that's where this FixIt thing comes.

00:03:40.660 --> 00:03:46.860
So one question is like, why not just use, say, Black or Flake 8 or whatever, right?

00:03:46.860 --> 00:03:47.220
Or Format.

00:03:47.220 --> 00:03:49.180
Well, hey, now we're getting there.

00:03:49.180 --> 00:03:49.420
Okay.

00:03:49.420 --> 00:03:52.600
So it says, of course, there's alternatives to Flake 8.

00:03:52.920 --> 00:03:56.500
But, for example, Flake 8 doesn't fix things.

00:03:56.500 --> 00:03:58.460
It just tells you that there are errors.

00:03:58.460 --> 00:03:58.960
Yeah.

00:03:58.960 --> 00:04:01.940
It has limited support.

00:04:01.940 --> 00:04:06.680
This is kind of interesting for hierarchical configurations for different projects within

00:04:06.680 --> 00:04:07.300
a monorepo.

00:04:07.300 --> 00:04:12.020
So even though it's a monorepo, maybe like the API gets formatted this way.

00:04:12.020 --> 00:04:17.660
But the, I don't know, the DevOps decode gets a different set of configurations because it's

00:04:17.660 --> 00:04:18.160
a different team.

00:04:18.160 --> 00:04:20.440
But you still want to just hit the repo with it, right?

00:04:20.440 --> 00:04:21.080
Interesting.

00:04:21.080 --> 00:04:21.740
Yeah.

00:04:21.740 --> 00:04:22.000
Yeah.

00:04:22.000 --> 00:04:24.900
That's an interesting, so there's, it's worth bringing up, I thought, because there are

00:04:24.900 --> 00:04:27.120
some interesting ideas and some interesting challenges.

00:04:27.120 --> 00:04:30.420
Slow performance on code, on large code bases.

00:04:30.420 --> 00:04:36.860
And then another thing that they do a lot is they plug in custom rules, blending rules and

00:04:36.860 --> 00:04:37.540
correction rules.

00:04:37.540 --> 00:04:41.880
Like at a hierarchical level, which is kind of interesting, right?

00:04:41.880 --> 00:04:45.440
Now, Brian, I don't know, everyone sees it, but I have a list of these four things, these

00:04:45.440 --> 00:04:47.860
four reasons of why not just X.

00:04:47.860 --> 00:04:54.080
Three of them are green because rough space format hits all of those.

00:04:54.080 --> 00:04:55.320
Rough format didn't exist.

00:04:55.320 --> 00:05:00.820
And I honestly wonder if Ruff format existed, you know, this is, is this a thing that gets

00:05:00.820 --> 00:05:01.120
created?

00:05:01.120 --> 00:05:01.940
I'm not sure.

00:05:01.940 --> 00:05:03.100
I mean, it's an open question.

00:05:03.440 --> 00:05:06.260
I didn't know that rough could do hierarchical configuration.

00:05:06.260 --> 00:05:07.300
I actually am.

00:05:07.300 --> 00:05:12.960
Well, what rough can do is you can have a ruff.toml that configures it at different levels.

00:05:12.960 --> 00:05:13.400
Right.

00:05:13.480 --> 00:05:19.000
So given the number of engineers and the fact there's a single repo, how hard would it be

00:05:19.000 --> 00:05:26.200
to automate, search this repo for all the ruff.tomls, run Ruff format dot in that working directory?

00:05:26.200 --> 00:05:26.740
Yeah.

00:05:26.740 --> 00:05:27.160
Done.

00:05:27.160 --> 00:05:27.800
You know what I mean?

00:05:27.800 --> 00:05:28.200
Right.

00:05:28.200 --> 00:05:32.020
It would, I don't think it inherently does, but in 30 minutes it does.

00:05:32.020 --> 00:05:32.980
You know what I mean?

00:05:32.980 --> 00:05:33.200
Yeah.

00:05:33.200 --> 00:05:34.780
Of one person's time.

00:05:34.780 --> 00:05:39.200
So I wouldn't suspect like as a company, like, well, we couldn't possibly have somebody write

00:05:39.200 --> 00:05:39.860
that automation.

00:05:39.860 --> 00:05:41.300
That's way too much for us.

00:05:41.580 --> 00:05:45.960
So, you know, so I think that obviously I don't believe that's a, you know, dash dash

00:05:45.960 --> 00:05:50.120
hierarchical sort of option, but I think that could easily, easily be added.

00:05:50.120 --> 00:05:51.820
So that's pretty cool.

00:05:51.820 --> 00:05:57.180
It says even with, here's the irony is even with the one we built, the, it didn't contain

00:05:57.180 --> 00:06:01.040
the local rent, linting rules or the hierarchical configuration.

00:06:01.040 --> 00:06:03.120
And those are the core requirements.

00:06:03.120 --> 00:06:05.880
So it's like, okay, well, we redesigned it to this new one.

00:06:05.880 --> 00:06:06.160
Right.

00:06:06.160 --> 00:06:10.700
And what's interesting is it works on the, using the LibCST module.

00:06:10.700 --> 00:06:11.260
Okay.

00:06:11.460 --> 00:06:14.260
Which is a concrete syntax tree.

00:06:14.260 --> 00:06:18.860
You often hear of the AST or abstract syntax tree, which is like the intent of the code

00:06:18.860 --> 00:06:21.580
is to loop over this iterable, but it is not.

00:06:21.580 --> 00:06:26.260
The variable is named this and there's two spaces here and there's a comment, right?

00:06:26.260 --> 00:06:28.300
It tries to like throw away, just get to the essence.

00:06:28.300 --> 00:06:31.620
But the CST is the code just in hierarchy form.

00:06:31.620 --> 00:06:33.620
And which means if you want to fix it, right?

00:06:33.620 --> 00:06:36.980
That's way more applicable for, these kinds of tools here.

00:06:37.100 --> 00:06:38.660
So anyway, people can check it out.

00:06:38.660 --> 00:06:39.460
It's on PyPI.

00:06:39.460 --> 00:06:43.260
And I think it's an, it's an interesting thing to contrast with rough.

00:06:43.260 --> 00:06:44.420
So yeah.

00:06:44.420 --> 00:06:44.880
Yeah.

00:06:44.880 --> 00:06:46.020
Anyway, it's out there for people.

00:06:46.020 --> 00:06:51.900
It's obviously tested on some pretty seriously large code bases and it could be interesting,

00:06:51.900 --> 00:06:57.560
but I'm still going to rough space format dot for my, for my money.

00:06:57.560 --> 00:06:58.460
Yeah.

00:06:58.460 --> 00:06:58.940
Yeah.

00:06:58.940 --> 00:07:05.820
Interesting comment from a grant, in the chat, another YAML file for each, sub

00:07:05.820 --> 00:07:08.340
project as opposed to supporting PyProject.com.

00:07:08.700 --> 00:07:08.940
Yuck.

00:07:08.940 --> 00:07:08.980
Yuck.

00:07:08.980 --> 00:07:10.820
But you know, totally fair.

00:07:10.820 --> 00:07:16.020
In this case, I think it might be like, you gotta remember this isn't just Python, right?

00:07:16.020 --> 00:07:18.180
This is like every bit of code at Facebook.

00:07:18.180 --> 00:07:18.920
Oh yeah.

00:07:18.920 --> 00:07:19.480
Right.

00:07:19.480 --> 00:07:24.900
So it's, it's probably react PHP, optimize PHP, go.

00:07:24.900 --> 00:07:26.380
I, who knows how much stuff is in there.

00:07:26.380 --> 00:07:28.340
Gobs of config files in each project.

00:07:28.340 --> 00:07:28.620
Yes.

00:07:28.620 --> 00:07:29.260
It's yeah.

00:07:29.260 --> 00:07:33.180
I mean, you wouldn't want all the configs for all the languages all mixed together.

00:07:33.180 --> 00:07:33.480
Right.

00:07:33.480 --> 00:07:37.160
So anyway, but still interesting, interesting stuff.

00:07:37.160 --> 00:07:38.880
Anyway, all right.

00:07:38.880 --> 00:07:41.180
how would you like to talk about user interfaces?

00:07:41.180 --> 00:07:45.420
No, we have been known to go on a GUI kick before.

00:07:45.420 --> 00:07:47.740
It's been a while.

00:07:47.740 --> 00:07:48.320
Let's do it.

00:07:48.320 --> 00:07:48.600
Yeah.

00:07:48.600 --> 00:07:49.060
I'm here for it.

00:07:49.060 --> 00:07:49.520
All right.

00:07:49.520 --> 00:07:53.760
So, Samuel Colvin, the, make it fast, Brian.

00:07:53.760 --> 00:07:56.580
That was funny.

00:07:56.580 --> 00:08:03.840
the, the person that brought us, Pydantic is, has, has worked very closely with,

00:08:03.840 --> 00:08:05.240
uh, FastAPI as well.

00:08:05.240 --> 00:08:07.620
So FastAPI and Pydantic work great together.

00:08:07.620 --> 00:08:09.320
Now there's fast UI.

00:08:09.320 --> 00:08:15.020
Well, fast UI is working with, FastAPI, but it also works with other stuff too.

00:08:15.020 --> 00:08:21.800
So, so a Samuel Colvin has just recently brought us fast UI, which is, looks like an

00:08:21.800 --> 00:08:22.760
active development.

00:08:22.760 --> 00:08:29.000
It's been modified five hours ago and the, it's already got, but it only, I only heard

00:08:29.000 --> 00:08:33.860
about it like last week and, it's now at 1.8 thousand stars.

00:08:33.860 --> 00:08:35.240
that's pretty awesome.

00:08:35.240 --> 00:08:35.660
Anyway.

00:08:35.660 --> 00:08:42.480
so what's this, it is supposedly a, it's still a work in progress.

00:08:42.480 --> 00:08:49.340
So not production ready, but it's a way to build app web applications and web UIs, defined

00:08:49.340 --> 00:08:51.220
by declarative Python code.

00:08:51.220 --> 00:08:53.620
So, there's a few points around this.

00:08:53.620 --> 00:08:56.800
It's, so it's for, there's a bunch of parts of it.

00:08:56.860 --> 00:09:02.280
It's, it's a pipe UI package, fast UI, but so it brings in some models and some

00:09:02.280 --> 00:09:03.580
UI elements and components.

00:09:03.580 --> 00:09:05.760
it's also an MPM package.

00:09:05.760 --> 00:09:09.400
So you, it brings in a little, react type script stuff.

00:09:09.400 --> 00:09:12.600
the, so what does it really mean though?

00:09:12.600 --> 00:09:18.140
It means that you can kind of look at in, in, there's a couple examples he shows, you

00:09:18.140 --> 00:09:26.000
declare it kind of like this, you're declaring, is sort of for a, or a FastAPI endpoint

00:09:26.000 --> 00:09:27.840
like user table or something like that.

00:09:27.840 --> 00:09:28.640
That's an endpoint.

00:09:28.640 --> 00:09:35.500
It's going to, return this thing that doesn't look like HTML and it doesn't quite look like

00:09:35.500 --> 00:09:41.280
Python either, but it is, it's like a, there's a C page object, which wraps the page.

00:09:41.280 --> 00:09:46.100
There's components inside, which is a list of things like headings and a table.

00:09:46.100 --> 00:09:51.020
And it, it, I don't really know what this looks like, but it's not bad.

00:09:51.020 --> 00:09:54.740
so I'm kind of excited to play with it.

00:09:54.740 --> 00:09:59.900
But in a few lines of code, he shows a fairly workable, clean looking user interface.

00:09:59.900 --> 00:10:06.320
And then, along with it, for the release, he released a full demo, which you can walk

00:10:06.320 --> 00:10:11.500
through, a UI demo that was really zippy and works pretty good.

00:10:11.500 --> 00:10:16.260
Like the tables one is kind of fun because it shows like, a whole bunch of names and

00:10:16.260 --> 00:10:18.500
popular of names of cities and populations.

00:10:18.500 --> 00:10:22.320
And you can quickly filter by country and it's like super fast.

00:10:22.320 --> 00:10:26.320
So, I think you get kind of a lot for not much work.

00:10:26.320 --> 00:10:30.260
If the, if the workflow looks okay.

00:10:30.260 --> 00:10:32.320
So you've done more UIs than I have.

00:10:32.320 --> 00:10:33.260
What do you think of this?

00:10:33.260 --> 00:10:34.180
It's interesting.

00:10:34.180 --> 00:10:35.100
Okay.

00:10:35.100 --> 00:10:40.900
so when I think of building web apps for myself, I don't shy away from saying, oh, I

00:10:40.900 --> 00:10:46.100
have to write HTML or there has to be a template model or something like that.

00:10:46.100 --> 00:10:46.220
Right.

00:10:46.220 --> 00:10:47.360
That's, that's okay for me.

00:10:47.360 --> 00:10:47.760
Yeah.

00:10:47.980 --> 00:10:53.040
But I've been doing it for 15 years, at least I would say probably started doing web stuff

00:10:53.040 --> 00:10:53.680
in 2000.

00:10:53.680 --> 00:10:55.360
So that's a little bit more than that.

00:10:55.360 --> 00:10:56.800
Anyway, that's a long time.

00:10:56.800 --> 00:11:00.240
And so I'm super comfortable with it, but I know there's a lot of use cases where I just

00:11:00.240 --> 00:11:01.340
want something quick and easy.

00:11:01.340 --> 00:11:06.640
I want a simple deployment or I'm not a web developer and I just want to get this up and

00:11:06.640 --> 00:11:06.960
going.

00:11:06.960 --> 00:11:07.920
I like it.

00:11:07.920 --> 00:11:15.980
a lot of the sort of low code zero HTML styles of that I've seen like, oh, here you

00:11:15.980 --> 00:11:21.600
can do it in Python have kind of a top to bottom linear way of creating the code.

00:11:21.600 --> 00:11:23.500
And I super dislike that, right?

00:11:23.500 --> 00:11:25.200
Like first I'm going to create a page object.

00:11:25.200 --> 00:11:27.260
Then I'm going to say page.components.add.

00:11:27.260 --> 00:11:29.840
Then I'm going to go page.components.add.

00:11:29.840 --> 00:11:34.240
And then I'll get a table and I'll say table.rows.add, you know, like, wow, like makes it really

00:11:34.240 --> 00:11:36.820
hard to see the visual look.

00:11:36.820 --> 00:11:40.800
So you go check out the fast UI, GitHub readme.

00:11:40.800 --> 00:11:45.300
You'll see that the structure and the indentation of the code matches the DOM.

00:11:45.300 --> 00:11:46.580
And that's quite nice.

00:11:46.580 --> 00:11:47.080
Yeah.

00:11:47.080 --> 00:11:48.840
So I really liked that aspect of it.

00:11:48.840 --> 00:11:54.500
it reminds me a lot of Flutter where you write code in the exact same way.

00:11:54.500 --> 00:11:59.620
You've got, I don't know if you call it a DOM, but whatever the widget graph is in called

00:11:59.620 --> 00:12:01.780
in Flutter, you do the same type of thing.

00:12:01.780 --> 00:12:07.040
Like you, you'd have a body and then the body has a child and then the child can be some complex

00:12:07.040 --> 00:12:07.480
thing.

00:12:07.480 --> 00:12:10.680
And it's all inherited, nested in a very, very similar way.

00:12:10.680 --> 00:12:12.640
So yeah, I think it's super interesting.

00:12:12.640 --> 00:12:14.220
I think it will empower a lot of people.

00:12:14.220 --> 00:12:18.340
I like the structure of the code matches the thing you're building.

00:12:18.340 --> 00:12:20.140
That makes it way more appealing to me.

00:12:20.140 --> 00:12:21.700
Cause that's part of what's nice about HTML.

00:12:21.700 --> 00:12:25.240
You go in there and you're like, you're in the table and you're indented in the table

00:12:25.240 --> 00:12:25.740
visually.

00:12:25.740 --> 00:12:26.340
You know what I mean?

00:12:26.340 --> 00:12:26.800
Yeah.

00:12:26.800 --> 00:12:27.360
Yeah.

00:12:27.360 --> 00:12:30.800
The, and there's, there's, there's a lot of fun stuff here too.

00:12:31.020 --> 00:12:35.640
So even like forms and stuff that you can do with, even server side validation.

00:12:35.640 --> 00:12:43.380
So, that it's not just a component library, but also some, some react and some other

00:12:43.380 --> 00:12:45.340
things going with it is pretty cool.

00:12:45.340 --> 00:12:50.880
The, Kim brings up, something that I thought of directly for myself.

00:12:50.880 --> 00:12:56.500
he says it's got a lot of appeal for enterprise grade web apps where boring, simple table layout

00:12:56.500 --> 00:12:57.640
is more than enough.

00:12:57.780 --> 00:13:03.840
And, I'm kind of thinking of it, I was thinking of it kind of like that, a dataset

00:13:03.840 --> 00:13:04.620
sort of thing.

00:13:04.620 --> 00:13:09.540
If basically I've got a database that I want to front in for, but if, but I, you know, it's

00:13:09.540 --> 00:13:12.960
not necessarily SQL or something or dataset just freaks me out maybe.

00:13:12.960 --> 00:13:17.140
but something like this is I think pretty nice.

00:13:17.140 --> 00:13:21.980
And I think a lot of enterprise projects will be using, using this to play with.

00:13:21.980 --> 00:13:26.740
So yeah, I'm actually thinking about it for my own, for an internal project myself.

00:13:26.740 --> 00:13:27.640
So yeah, sure.

00:13:27.640 --> 00:13:28.360
It looks quite neat.

00:13:28.360 --> 00:13:30.220
And being based on FastAPI.

00:13:30.220 --> 00:13:30.840
Yeah.

00:13:30.840 --> 00:13:37.940
boy, would it be cool if there was a run it locally as an electron app like thing where,

00:13:37.940 --> 00:13:42.680
where the electron app shipped with Python and just ran a hidden building user.

00:13:42.680 --> 00:13:48.320
So like it becomes a, make it a thing, an exe or a dot app I could share with my users.

00:13:48.800 --> 00:13:49.240
Yeah.

00:13:49.240 --> 00:13:50.620
But yeah, I agree.

00:13:50.620 --> 00:13:52.580
I agree with Kim that forms over data.

00:13:52.580 --> 00:13:53.360
This nails it.

00:13:53.360 --> 00:13:53.540
Yeah.

00:13:53.540 --> 00:13:58.860
And like you said, if, I mean, a most web app, a web, a lot of web developers, it doesn't

00:13:58.860 --> 00:14:02.160
take that much web training to, to write some HTML.

00:14:02.500 --> 00:14:09.040
I mean, to do it well, it takes a little bit, but, but to do it good enough for a lot

00:14:09.040 --> 00:14:10.620
of projects, it's not bad.

00:14:10.620 --> 00:14:17.320
And, or a normal HTML, CSS and the normal tool chain is still pretty good or build a

00:14:17.320 --> 00:14:18.360
Django app or something.

00:14:18.360 --> 00:14:22.880
But, there's a lot of people that don't even, that don't even want to get into it at

00:14:22.880 --> 00:14:23.260
all.

00:14:23.360 --> 00:14:25.820
So I think this is a good fit for that.

00:14:25.820 --> 00:14:27.740
So anyway, indeed.

00:14:27.740 --> 00:14:31.540
And Chris may ask about, you know, Hey, I wonder what the escape hatch story is.

00:14:31.540 --> 00:14:34.840
That's always a good question when you're in a framework that kind of defines so much for

00:14:34.840 --> 00:14:34.980
you.

00:14:34.980 --> 00:14:38.420
Like, well, what if I went a little bit more, then what?

00:14:38.420 --> 00:14:39.380
So yeah.

00:14:39.380 --> 00:14:40.060
Yeah.

00:14:40.060 --> 00:14:45.420
Brian, is it a good time to remind people that maybe they should check out a course or two?

00:14:45.420 --> 00:14:46.420
Yeah, sure.

00:14:46.420 --> 00:14:48.520
Let's, I will.

00:14:48.520 --> 00:14:52.820
So I'll, I'll remind people that this, this episode is brought to you by both of us,

00:14:52.820 --> 00:14:53.540
Michael and Brian.

00:14:53.540 --> 00:15:00.140
And the thing that I've been working on a lot lately is courses, courses, python

00:15:00.140 --> 00:15:01.500
test.com.

00:15:01.500 --> 00:15:04.580
And that is the complete by test course.

00:15:04.580 --> 00:15:06.500
And, it's almost done.

00:15:06.500 --> 00:15:07.460
We'll be done this month.

00:15:07.460 --> 00:15:12.500
I've got 13 out of 16 chapters done so far and it will grow then.

00:15:12.500 --> 00:15:17.260
after, after I've gone through the entire Python testing with my test book, there's extras

00:15:17.260 --> 00:15:17.540
there.

00:15:17.540 --> 00:15:22.280
And as I've noted before, there's a lot of stuff at the end, that has changed a

00:15:22.280 --> 00:15:25.780
lot like talks and CI and things, since the book came out.

00:15:25.780 --> 00:15:27.300
So, it's pretty excited.

00:15:27.300 --> 00:15:28.540
So how about you?

00:15:28.540 --> 00:15:28.960
Sure.

00:15:28.960 --> 00:15:29.220
Yeah.

00:15:29.220 --> 00:15:29.840
Very awesome.

00:15:29.840 --> 00:15:32.880
I would just want to like highlight maybe some of our new courses.

00:15:32.880 --> 00:15:38.460
We have an early access Visual Studio Code for Python developers course, which is partway

00:15:38.460 --> 00:15:40.360
done, but available in early access mode.

00:15:40.360 --> 00:15:44.360
If you want to check that out, we have a data science jumpstart with 10 projects from Matt

00:15:44.360 --> 00:15:50.660
Harrison and, HTMX plus Django course by Christopher Trudeau.

00:15:50.660 --> 00:15:55.080
So all of those are excellent and we've got plenty more coming as well.

00:15:55.080 --> 00:15:56.240
So people should check those out.

00:15:56.240 --> 00:15:56.620
Sweet.

00:15:56.620 --> 00:15:57.160
All right.

00:15:57.160 --> 00:15:58.240
Let's go to Mastodon.

00:15:58.240 --> 00:16:03.180
So this one's not exactly Python, but there are Python elements to it.

00:16:03.180 --> 00:16:07.760
And basically I said, like, we talked about this after the show and I thought, you know,

00:16:07.760 --> 00:16:10.280
why don't I just have this conversation for people out there?

00:16:10.280 --> 00:16:11.100
I'll throw out a list.

00:16:11.100 --> 00:16:12.980
It's like, I've got a bunch of emails.

00:16:12.980 --> 00:16:15.400
want to be able to reach out to people.

00:16:15.420 --> 00:16:19.620
I want to run a newsletter or I want to run a training company in a podcast, you know,

00:16:19.620 --> 00:16:21.140
and wouldn't gather those up.

00:16:21.140 --> 00:16:25.700
And for many years I've been using MailChimp and they just increasingly rubbed me the wrong

00:16:25.700 --> 00:16:25.960
way.

00:16:25.960 --> 00:16:27.140
It's just on principle.

00:16:27.140 --> 00:16:29.660
I'm not super keen about it.

00:16:29.660 --> 00:16:34.040
Like three months ago, like, oh, we got to raise our prices because the database storage

00:16:34.040 --> 00:16:37.640
for your 20 K or whatever it turns out to be is really rough.

00:16:37.640 --> 00:16:38.740
So it's another a hundred dollars.

00:16:38.740 --> 00:16:41.020
Then the next month, like, oh, we're going to need to raise our prices.

00:16:41.020 --> 00:16:44.020
It's another a hundred dollars on top of the previous another a hundred dollars.

00:16:44.360 --> 00:16:46.760
And she's like, I'm not really using a lot of this.

00:16:46.760 --> 00:16:48.640
And it's, I kind of want to look for something else.

00:16:48.640 --> 00:16:48.860
Right.

00:16:48.860 --> 00:16:52.140
So I went to Mastodon and said, Hey folks, MailChimp alternatives.

00:16:52.140 --> 00:16:56.520
And boy, oh boy, do we get like a ton of conversation about this.

00:16:56.520 --> 00:17:03.580
And so I've gathered this all up and put the results of that into, into a list that I

00:17:03.580 --> 00:17:04.900
posted on the show notes.

00:17:04.900 --> 00:17:08.340
So I just want to run through this really quick because there's some interesting choices

00:17:08.340 --> 00:17:11.340
for people that have like small or large mailing lists.

00:17:11.340 --> 00:17:11.600
Right.

00:17:11.600 --> 00:17:15.540
So they come from all these different places and interesting choices.

00:17:15.540 --> 00:17:21.620
So for example, one of them is called email octopus because it can how much it can send

00:17:21.620 --> 00:17:26.260
like eight times as much email as like a regular, maybe for like a two handed creature with all

00:17:26.260 --> 00:17:26.960
of its eight arms.

00:17:26.960 --> 00:17:27.800
It can really send email.

00:17:27.800 --> 00:17:28.060
Now.

00:17:28.160 --> 00:17:30.760
So this one is email marketing, which is kind of interesting.

00:17:30.760 --> 00:17:37.500
There's list monk, which is an open source free self-hosted newsletter and mailing list manager.

00:17:37.500 --> 00:17:38.360
Interesting.

00:17:38.360 --> 00:17:38.620
Right.

00:17:38.620 --> 00:17:40.160
With 12,000 GitHub stars.

00:17:40.160 --> 00:17:44.860
There's Calia, which, is similar is also open source.

00:17:44.860 --> 00:17:46.840
Gemacht in Deutschland made in Germany.

00:17:46.840 --> 00:17:47.840
Very, very cool.

00:17:47.840 --> 00:17:49.640
It looks kind of visually nice.

00:17:49.640 --> 00:17:49.920
Right.

00:17:50.340 --> 00:17:57.260
There's Millie Harold, which is a Ruby on rails one also self-hosted, which is kind of fun.

00:17:57.260 --> 00:17:59.100
There's send portal again.

00:17:59.100 --> 00:18:01.640
So I didn't know about so many of these open source ones.

00:18:01.640 --> 00:18:05.700
And that's kind of why I thought my, it might be interesting to point this out to people on

00:18:05.700 --> 00:18:06.000
the show.

00:18:06.000 --> 00:18:06.160
Right.

00:18:06.160 --> 00:18:08.120
Like there's actually a bunch of open source ones.

00:18:08.120 --> 00:18:10.580
Quite sadly, I haven't found a decent Python one.

00:18:10.780 --> 00:18:14.360
So there's that there's Brevo, which is another one.

00:18:14.360 --> 00:18:15.680
button down.

00:18:15.680 --> 00:18:19.360
This one is not open source, but it is made with Python open source.

00:18:19.360 --> 00:18:23.180
So I talked to the guy who runs button down and this one is written in Django.

00:18:23.180 --> 00:18:29.020
So if you want your newsletters powered by Django, I don't think it's open source, but anyway,

00:18:29.020 --> 00:18:30.800
pretty, pretty neat option there.

00:18:30.800 --> 00:18:33.540
There's Zoho, which is pretty cool.

00:18:33.540 --> 00:18:34.320
Cindy.

00:18:34.320 --> 00:18:35.500
Here's another cool one.

00:18:35.500 --> 00:18:40.760
Cindy as also self-hosted, but you, it's not open source, but you buy it.

00:18:40.760 --> 00:18:44.480
It wants for like $70 and then you run it on your system.

00:18:44.480 --> 00:18:49.700
And what's cool is it hooks into AWS SES, which is our simple email service, which if

00:18:49.700 --> 00:18:51.340
you send a bunch of emails, you probably have.

00:18:51.340 --> 00:18:53.000
I don't, I do, but I don't use it.

00:18:53.000 --> 00:18:56.300
I have SendGrid, which it also works with and mail jet and elastic email.

00:18:56.300 --> 00:19:00.320
And the thing that's cool about these is you can send like 10,000 emails for a dollar.

00:19:00.320 --> 00:19:01.240
Right.

00:19:01.240 --> 00:19:02.760
And it's based on consumption, right?

00:19:02.760 --> 00:19:08.420
Like even if I don't send a mail in MailChimp, it's many hundreds of dollars to just say, well,

00:19:08.420 --> 00:19:10.200
we're going to keep your database records fresh for you.

00:19:10.200 --> 00:19:11.120
We'll sit here.

00:19:11.120 --> 00:19:15.340
But this one, it's like, you know, they say a hundred times cheaper.

00:19:15.340 --> 00:19:19.040
I mean, obviously it matters how you use it, but you plug it into one of these super, super

00:19:19.040 --> 00:19:21.080
simple things and they'll even set it up for you.

00:19:21.080 --> 00:19:25.000
You can pay them like another 70 bucks and they'll set up a server and a Ubuntu server or

00:19:25.000 --> 00:19:25.460
Linux server.

00:19:25.460 --> 00:19:26.240
I'll set it for you.

00:19:26.240 --> 00:19:28.520
So this is the one I'm actually thinking of going with potentially.

00:19:28.520 --> 00:19:35.520
And there's ConvertKit, Mautic, I don't know, open source marketing instead of just email,

00:19:35.520 --> 00:19:37.020
Constant Contact.

00:19:37.520 --> 00:19:41.280
I don't have any relations with any of these, by the way, folks, get response, ConvertKit,

00:19:41.280 --> 00:19:42.120
all of those.

00:19:42.120 --> 00:19:48.200
So if you want to see the Mastodon conversation about why people suggested them, some people

00:19:48.200 --> 00:19:49.760
are like, oh, I worked with that, but it sucks.

00:19:49.760 --> 00:19:50.540
Don't use that.

00:19:50.540 --> 00:19:51.880
And so on.

00:19:51.880 --> 00:19:52.560
You can check it out.

00:19:52.560 --> 00:19:56.520
So I thought there's probably enough people out there who are going like, I have this

00:19:56.520 --> 00:19:59.480
problem and I just see so many choices and what are they?

00:19:59.480 --> 00:20:00.480
Maybe there's open source.

00:20:00.480 --> 00:20:01.600
Maybe there's some Python thing.

00:20:01.600 --> 00:20:02.340
So there it is.

00:20:02.340 --> 00:20:05.540
So we don't have a solution, but you've got something.

00:20:05.540 --> 00:20:06.160
Well, I'll.

00:20:06.160 --> 00:20:09.300
Well, I can report back to people how things go.

00:20:09.300 --> 00:20:11.280
So it's a fork in the road for me.

00:20:11.280 --> 00:20:11.800
Right.

00:20:11.800 --> 00:20:12.180
Yeah.

00:20:12.680 --> 00:20:14.520
On one hand, I don't really do.

00:20:14.520 --> 00:20:16.100
I don't do any tracking of people.

00:20:16.100 --> 00:20:19.680
And so I don't know, like retargeting and all these kind of like campaigns where like, if

00:20:19.680 --> 00:20:23.220
you come and visit this page, but then two days you visit that page, then we're going to

00:20:23.220 --> 00:20:24.920
send, you know, like that kind of stuff.

00:20:24.920 --> 00:20:25.800
I don't really do that.

00:20:26.180 --> 00:20:28.520
So I just basically send emails to people.

00:20:28.520 --> 00:20:32.600
And in that case, right, you should be looking at something simpler.

00:20:32.600 --> 00:20:34.540
Maybe one of those open source ones is pretty nice.

00:20:34.540 --> 00:20:40.020
But if you want to do really interesting automations, which maybe I should look into, I don't know.

00:20:40.020 --> 00:20:43.180
Then maybe one of the real simple ones is not the right choice.

00:20:43.180 --> 00:20:47.740
So I should either go way more simpler or more advanced, but I'm in this like middle ground

00:20:47.740 --> 00:20:50.520
paying tons of money for something that I don't really appreciate.

00:20:50.520 --> 00:20:53.120
And I've also finally wrapping this, put a bow on this.

00:20:53.260 --> 00:20:57.480
People have said, well, you know, you can just use mail merge with Excel, with Google

00:20:57.480 --> 00:20:59.140
sheets and like send it out of your Gmail.

00:20:59.140 --> 00:21:00.880
Like, no, that's awesome.

00:21:00.880 --> 00:21:06.060
If you want to, if you run like a, like a soccer team and you want to send them a message or

00:21:06.060 --> 00:21:06.720
something like that.

00:21:06.720 --> 00:21:08.880
But if you have to be subjected to the U.S.

00:21:08.880 --> 00:21:14.980
Can't spam act, the GDPR, people delete my stuff, delete my, my info you have on me.

00:21:14.980 --> 00:21:17.180
I want to unsubscribe.

00:21:17.180 --> 00:21:20.220
I want to partially unsubscribe or my mail bounced.

00:21:20.220 --> 00:21:21.340
And then you got to stop sending it.

00:21:21.420 --> 00:21:25.040
Like all of that, you can't just like automate send.

00:21:25.040 --> 00:21:26.840
Even out of send grade is not enough, right?

00:21:26.840 --> 00:21:29.580
You need to have a whole backend that like deals with all that crap.

00:21:29.580 --> 00:21:32.460
And that's what a lot of these like open source ones bring.

00:21:32.460 --> 00:21:33.900
So anyway, pretty cool.

00:21:33.900 --> 00:21:40.660
Newsletter is having a newsletter is more complicated than people think because it, it's just is.

00:21:40.660 --> 00:21:43.060
It's way more complicated.

00:21:43.460 --> 00:21:49.080
And the weird thing that like the first time I tried to set one up was that you have to put your address down.

00:21:49.080 --> 00:21:52.580
And, it's, it's kind of a weird work.

00:21:52.580 --> 00:21:55.060
It makes sense, but also it's weird.

00:21:55.060 --> 00:21:56.640
But it kind of doesn't make sense.

00:21:56.640 --> 00:21:58.280
It kind of doesn't make sense.

00:21:58.280 --> 00:21:58.700
Yeah.

00:21:58.700 --> 00:21:59.200
Yeah.

00:21:59.200 --> 00:21:59.900
Like, yeah.

00:21:59.900 --> 00:22:01.540
I really just have to put my house there.

00:22:01.540 --> 00:22:02.400
What can I put there?

00:22:02.400 --> 00:22:06.120
Like, but because the U S can't spam act, I think is the reason that that is there.

00:22:06.120 --> 00:22:09.260
And yeah, you know, that's the government, right?

00:22:09.260 --> 00:22:15.960
Like maybe we should have cook up cookie banners that everyone clicks like five times an hour a day for the rest of their life.

00:22:15.960 --> 00:22:17.120
That's going to make things better.

00:22:17.120 --> 00:22:22.680
Well, you know, I used to like, I know we've done this enough, but sorry about that.

00:22:22.680 --> 00:22:28.160
the, I used to do MailChimp, but I had a PO box set up just for that.

00:22:28.160 --> 00:22:30.220
And I was like, I don't use it for anything.

00:22:30.220 --> 00:22:35.440
So instead of paying the post office, I switched to paying a convert kit because convert.

00:22:35.440 --> 00:22:40.400
One of the things convert kit does is you can use their address, which, which is interesting.

00:22:40.400 --> 00:22:44.420
but, I'm, I'm, I'm still on the fence on convert kit.

00:22:44.420 --> 00:22:45.080
I'm trying it out.

00:22:45.200 --> 00:22:45.880
So we'll see.

00:22:45.880 --> 00:22:46.420
Yeah.

00:22:46.420 --> 00:22:50.220
We can both report back to people and see, but it's tricky stuff.

00:22:50.220 --> 00:22:51.800
So anyway, hopefully it helps the folks.

00:22:51.800 --> 00:22:56.260
Now completely change of gears, back to command line interfaces.

00:22:56.260 --> 00:23:01.180
I talked about user interfaces, on GUIs, but let's talk CLIs a little bit.

00:23:01.180 --> 00:23:04.740
so back on episode, what was it?

00:23:04.740 --> 00:23:05.640
361.

00:23:05.640 --> 00:23:07.540
We talked about appeal.

00:23:07.540 --> 00:23:13.420
and I've talked about art person click and typer and stuff like that before appeal was another one.

00:23:13.440 --> 00:23:21.640
and, and this all came out because I did an episode on, on Python test about, art parse applications and testing.

00:23:22.260 --> 00:23:33.920
So somebody actually Sander 76, on fostered on, contacted me and said, Hey, there's a bunch of other options other than the ones you've covered so far.

00:23:34.040 --> 00:23:35.040
have you looked at this?

00:23:35.040 --> 00:23:36.240
have you looked at these and how do you test them?

00:23:36.240 --> 00:23:41.740
I don't have an answer about how to test them, but I was interested in this whole kind of line of things.

00:23:41.740 --> 00:23:56.340
So there's a, there's a, a, a, a, a set of command line interface tools that instead of, instead of art parse style or something of telling, you know, defining flags, they define it based on an object, a configurable object.

00:23:56.560 --> 00:24:02.480
So, let's, his, clip stick for instance, let's, let's start with Tyro.

00:24:02.480 --> 00:24:04.260
This is one of the early ones.

00:24:04.260 --> 00:24:05.680
It's kind of easy to figure out.

00:24:05.680 --> 00:24:16.540
Tyro is a, is a command line interface, tool that you can use, data classes or Pydantic or attrs to define the, the, all the options.

00:24:16.540 --> 00:24:20.980
So for instance, here's an example it was showing the video.

00:24:20.980 --> 00:24:29.220
you can take a, you import Tyro and then you define a data class with, types on, on a bunch of arcs.

00:24:29.220 --> 00:24:34.360
You just, it doesn't matter what it is, what's called, but you have a class with a bunch of elements in it.

00:24:34.360 --> 00:24:37.160
And those are the things that you can pass to your application now.

00:24:37.160 --> 00:24:42.500
And then you just, you, you implement a Tyro CLI, application.

00:24:42.500 --> 00:24:44.500
That's, that's the arguments.

00:24:44.640 --> 00:24:47.920
And that's, it's kind of cool on parsing arcs that way.

00:24:47.920 --> 00:24:50.060
so that, that's Tyro.

00:24:50.060 --> 00:24:53.640
And then there's, there's clip stick, which is kind of cute.

00:24:53.640 --> 00:24:54.640
Like CLI.

00:24:54.640 --> 00:24:56.060
Yeah.

00:24:56.060 --> 00:25:05.380
Anyway, that defines, defines all of your types within a, a base model, like from Pydantic, Pydantic base model.

00:25:05.380 --> 00:25:07.660
And then you can define a whole bunch of types in there.

00:25:07.660 --> 00:25:11.400
and then you can, and it has help and all that stuff.

00:25:11.400 --> 00:25:14.580
So basing it on, on, on, Pydantic object.

00:25:14.580 --> 00:25:21.820
And then also there's, there's a, a, nicely designed website called, with, Pydantic art parse.

00:25:21.820 --> 00:25:23.800
So art parse with Pydantic.

00:25:23.800 --> 00:25:29.840
So there's another one that's, defining, arguments based on a base model.

00:25:29.840 --> 00:25:32.960
and I just, I haven't played with these yet.

00:25:32.960 --> 00:25:43.780
I just wanted to report back that these are some different ways to, to set up user interfaces using, using like Pydantic or data classes or attrs or something like that.

00:25:43.780 --> 00:25:44.040
Yeah.

00:25:44.040 --> 00:25:45.240
As an object.

00:25:45.240 --> 00:25:55.800
And then, and then you have, instead of, you get like this Arga, Args object, instead of having a whole bunch of different elements, you have like this object with all of your arguments that you can pass around.

00:25:55.800 --> 00:25:59.000
And since it's things like Pydantic, you can do things.

00:25:59.000 --> 00:26:03.680
I'm, I haven't played with it, but I'm guessing that you can do things like limit the scope.

00:26:03.680 --> 00:26:08.300
So it's not just an integer, but it's an integer between one and five or something like that.

00:26:08.300 --> 00:26:09.060
right.

00:26:09.060 --> 00:26:09.400
Yeah.

00:26:09.400 --> 00:26:09.720
That's cool.

00:26:09.720 --> 00:26:10.240
Yeah.

00:26:10.240 --> 00:26:11.340
So these are fun.

00:26:11.340 --> 00:26:12.460
Those are super fun.

00:26:12.460 --> 00:26:12.880
Yeah.

00:26:12.880 --> 00:26:14.040
Pydantic is great.

00:26:14.260 --> 00:26:18.620
Typing for this kind of stuff is great because it, it's usually not open-ended, right?

00:26:18.620 --> 00:26:19.660
That should be a number.

00:26:19.660 --> 00:26:23.540
And if it's not, it's going to be a problem or that should be a string for the host name.

00:26:23.540 --> 00:26:23.960
Yeah.

00:26:23.960 --> 00:26:24.400
It's required.

00:26:24.400 --> 00:26:27.400
All these things like really map over to that validation side of Pydantic.

00:26:27.400 --> 00:26:32.020
But I do want to, so, from, Sandra 76 is a question.

00:26:32.020 --> 00:26:34.960
How do you test these or, or is testing easier?

00:26:34.960 --> 00:26:36.680
it is a good question.

00:26:36.680 --> 00:26:43.560
And I, it, I've put it on my to-do list for January, January or sometime in 2024 to take a look at.

00:26:43.700 --> 00:26:45.960
So I'll have to report back about that also.

00:26:45.960 --> 00:26:46.380
Yeah.

00:26:46.380 --> 00:26:46.840
Very nice.

00:26:46.840 --> 00:26:47.400
Very nice.

00:26:47.400 --> 00:26:54.040
So it's the, Samuel Colvin and team day for you with fast UI and the Pydantic based stuff.

00:26:54.040 --> 00:26:54.460
Yeah, indeed.

00:26:54.460 --> 00:26:55.120
Good stuff.

00:26:55.120 --> 00:26:55.560
So.

00:26:55.560 --> 00:26:56.120
All right.

00:26:56.120 --> 00:26:57.200
Extras.

00:26:57.200 --> 00:26:58.100
You want me to do mine first?

00:26:58.100 --> 00:26:58.640
Yeah.

00:26:58.640 --> 00:26:59.520
Let's hit yours first.

00:26:59.520 --> 00:27:00.040
All right.

00:27:00.040 --> 00:27:01.780
Well, I have one and it's super quick.

00:27:01.780 --> 00:27:09.420
So I just, you know, there was this, announcement here that Google is, Google Chrome in particular

00:27:09.420 --> 00:27:16.080
is looking to limit ad blockers and start like limiting how much control people have over their

00:27:16.080 --> 00:27:22.640
privacy and data and stuff with what's called the manifest V three, API for basically for

00:27:22.640 --> 00:27:24.400
using, extensions.

00:27:24.400 --> 00:27:30.840
And the main rule here is that they're limiting how many domains and rules you can apply to block

00:27:30.840 --> 00:27:32.760
basically to limit network traffic.

00:27:32.760 --> 00:27:38.100
So you can say, well, there's 500 ads you can block, but those are the only 500, right?

00:27:38.100 --> 00:27:39.040
Which really limits it.

00:27:39.040 --> 00:27:40.540
So people are whining.

00:27:40.540 --> 00:27:42.000
I'm like, you know, why don't I just write an article?

00:27:42.000 --> 00:27:46.300
Because like I could turn all that stuff off and I don't care at my house.

00:27:46.300 --> 00:27:51.080
And you could too, just instead of worrying about what these browsers are doing, just go

00:27:51.080 --> 00:27:52.720
and turn on a network level ad blocker.

00:27:52.720 --> 00:27:56.860
Like you can use next DNS, which I've talked about before, or you can, if you want to run

00:27:56.860 --> 00:27:59.620
your own server and only have it when you're home, you can do this pie hole.

00:27:59.980 --> 00:28:04.260
I know that's super awesome, but next DNS is a service, which so when you're at the

00:28:04.260 --> 00:28:08.980
coffee shop or traveling or on your phone, you can also have the benefit of pie hole.

00:28:08.980 --> 00:28:12.820
But anyway, I talked a lot about how, how that works and how you set it up with some cool

00:28:12.820 --> 00:28:17.460
graphs, like it's like 10,000 block queries on my network for just two people for a little

00:28:17.460 --> 00:28:17.660
bit.

00:28:17.660 --> 00:28:19.080
And also this is all great.

00:28:19.080 --> 00:28:22.760
Once you set this up though, when you get to a place that says, Hey, you have to disable

00:28:22.760 --> 00:28:25.540
your ad blocker or you can't watch this movie, read this article.

00:28:25.540 --> 00:28:26.240
You're like, you know what?

00:28:26.240 --> 00:28:29.740
I hate you, but just for a minute, I have to do this because I really, really need to get

00:28:29.740 --> 00:28:29.900
here.

00:28:29.900 --> 00:28:32.360
It talks about how you can set up a second browser.

00:28:32.360 --> 00:28:37.260
Like for me, it's Firefox, not Vivaldi, like Vivaldi's my own, but Firefox, I set it up

00:28:37.260 --> 00:28:42.920
to use a DNS over HTTPS, but one that doesn't block like Cloudflare or something that doesn't

00:28:42.920 --> 00:28:43.400
filter anything.

00:28:43.400 --> 00:28:47.900
So if I have to escape my, my blocking network for whatever reason, I can just run Firefox

00:28:47.900 --> 00:28:52.840
and it tunnels out of all this restrictions, which is usually nice, but when you need to turn

00:28:52.840 --> 00:28:54.000
it off, you got to turn it off.

00:28:54.000 --> 00:28:58.100
So there's quick article essay, whatever you want to call it for people to check out.

00:28:58.400 --> 00:28:58.480
Yeah.

00:28:58.480 --> 00:29:00.060
Things like that still bug me though.

00:29:00.060 --> 00:29:02.380
Like the turn off ad blockers.

00:29:02.380 --> 00:29:07.060
There's, it's not, can't be that high of a percentage of the population that's turning them off.

00:29:07.060 --> 00:29:08.780
So yeah, I know.

00:29:08.780 --> 00:29:09.120
Weird.

00:29:09.120 --> 00:29:09.560
Yeah.

00:29:09.560 --> 00:29:13.900
There was a, one show was like Peacock or Paramount.

00:29:13.900 --> 00:29:20.120
One of those streaming platforms would not let my wife watch some show because it says she

00:29:20.120 --> 00:29:20.940
had her ad blocker on.

00:29:20.940 --> 00:29:21.740
Of course she didn't.

00:29:21.740 --> 00:29:24.460
She had, she was on the wifi, which was blocking everything.

00:29:24.740 --> 00:29:29.520
and also the side of the extra benefit here is this means your mobile apps have ad

00:29:29.520 --> 00:29:30.340
blockers built in.

00:29:30.340 --> 00:29:32.340
This means your TV has an ad blocker built in.

00:29:32.340 --> 00:29:35.300
This means like everything has an ad blocker built in, not just your browser.

00:29:35.300 --> 00:29:35.680
Right.

00:29:35.680 --> 00:29:40.500
So, all this whinging over, like whether or not you're, you can do blocking in a browser,

00:29:40.500 --> 00:29:43.640
like, you know, you could just do better and it's not even your problem anymore.

00:29:43.640 --> 00:29:43.980
Right.

00:29:44.240 --> 00:29:46.780
So yeah, it was super.

00:29:46.780 --> 00:29:48.560
She's like, well, Michael, how do I watch this?

00:29:48.560 --> 00:29:50.160
I'm like, I don't know, actually.

00:29:50.160 --> 00:29:52.820
I'm sorry, but I don't want to turn it off for the whole everything.

00:29:52.820 --> 00:29:53.160
Right.

00:29:53.160 --> 00:29:54.620
Like, I just want to let you watch your movies.

00:29:54.620 --> 00:29:55.260
How do you do that?

00:29:55.260 --> 00:29:56.160
So that's in there as well.

00:29:56.160 --> 00:29:56.540
Yeah.

00:29:56.540 --> 00:29:57.240
Okay, cool.

00:29:57.240 --> 00:29:57.820
Nice.

00:29:57.820 --> 00:29:58.380
Okay.

00:29:58.380 --> 00:29:59.800
I've got a few extras.

00:29:59.800 --> 00:30:01.280
won't take long though.

00:30:01.280 --> 00:30:03.380
Django five released yesterday.

00:30:03.380 --> 00:30:07.020
we've already talked about all the cool features of Django five.

00:30:07.020 --> 00:30:07.360
Didn't we?

00:30:07.360 --> 00:30:08.920
I think you covered it a couple of weeks ago.

00:30:08.920 --> 00:30:15.200
but, it, I just noticed that it is, it's not a beta or anything anymore.

00:30:15.200 --> 00:30:16.740
It's, it's released.

00:30:16.740 --> 00:30:19.280
So as of December 4th, it's all grown up.

00:30:19.280 --> 00:30:19.600
Yeah.

00:30:19.600 --> 00:30:20.660
So that's awesome.

00:30:20.660 --> 00:30:22.340
I'm excited to play with that.

00:30:22.340 --> 00:30:23.760
so that that's fun.

00:30:23.760 --> 00:30:26.220
A, and then something submitted by Paul Barry.

00:30:26.220 --> 00:30:31.500
So thank you is, it's Brian seemed, he says, Brian seems to like Vim and you can use

00:30:31.500 --> 00:30:33.140
Vim key bindings in a lot of places.

00:30:33.140 --> 00:30:38.300
And so he sent over the Vim key bindings everywhere, the ultimate list.

00:30:38.540 --> 00:30:45.580
And, it is a GitHub repo with a whole bunch of awesome, things like, debuggers

00:30:45.580 --> 00:30:47.740
and, like Vim PDB.

00:30:47.740 --> 00:30:48.820
I didn't know you could do that.

00:30:48.820 --> 00:30:49.940
That's, that'd be fun.

00:30:49.940 --> 00:30:54.660
IPython, you can turn, VIK bindings on with IPython.

00:30:54.660 --> 00:31:01.660
anyway, quite a few fun, fun settings and telling you how to do it for different

00:31:01.660 --> 00:31:02.080
things.

00:31:02.080 --> 00:31:04.640
So even email clients, look at that.

00:31:04.640 --> 00:31:06.320
Yeah.

00:31:06.640 --> 00:31:09.660
None of them I use, but I used to use mutt a long time ago.

00:31:09.660 --> 00:31:13.340
yeah, I don't see mine either, but that's so good.

00:31:13.340 --> 00:31:13.620
Thunderbird.

00:31:13.620 --> 00:31:14.780
I should try that.

00:31:14.780 --> 00:31:15.280
Yeah.

00:31:15.280 --> 00:31:16.800
So, okay.

00:31:16.800 --> 00:31:21.440
So, and then I've got for my last extra, I have a little drama.

00:31:21.440 --> 00:31:27.760
So I talked about last week that I think that Python or we have before the testing code is

00:31:27.760 --> 00:31:33.640
now Python test my other podcast, but I left it on the domain testing code for a while.

00:31:33.640 --> 00:31:38.400
But, recently I tried switching it to, to podcasts.

00:31:38.400 --> 00:31:42.080
so what we're looking at now is podcast.pythontest.com.

00:31:42.180 --> 00:31:44.000
So the new URL is that.

00:31:44.000 --> 00:31:48.280
but if you just go to, if you just go to pythontest.com, there's a, there's a link to

00:31:48.280 --> 00:31:48.840
the podcast.

00:31:48.840 --> 00:31:50.600
So you can find it that way.

00:31:50.600 --> 00:31:52.640
Just podcast.pythontest.com.

00:31:52.640 --> 00:31:54.640
Anyway, what do I do with the old domain?

00:31:54.640 --> 00:31:56.860
I redirected it, but it didn't work.

00:31:56.860 --> 00:31:58.200
I don't know what I did wrong.

00:31:58.460 --> 00:32:02.300
I contacted, name cheap and they said, it looks fine to us.

00:32:02.300 --> 00:32:04.200
so not sure what went wrong.

00:32:04.200 --> 00:32:11.200
So I changed it, changed the DNS settings last night to, to just point to like a small

00:32:11.200 --> 00:32:11.640
site.

00:32:11.640 --> 00:32:17.120
So, a small site that looks like this, this morning, it just says, Hey, I'm here.

00:32:17.120 --> 00:32:17.760
Testing code.

00:32:17.760 --> 00:32:19.040
The podcast moved.

00:32:19.040 --> 00:32:19.600
It's over there.

00:32:19.600 --> 00:32:23.120
and so just so that it won't 404 on people.

00:32:23.120 --> 00:32:24.660
And I also have some redirects.

00:32:24.660 --> 00:32:30.540
So if you say like testing code.com slash 23, it'll redirect to the 23rd episode over

00:32:30.540 --> 00:32:31.200
on the other one.

00:32:31.200 --> 00:32:31.760
Awesome.

00:32:31.760 --> 00:32:33.760
Except it didn't work last night.

00:32:33.760 --> 00:32:39.000
I was pulling my hair out and then, I woke up this morning and it worked on my phone,

00:32:39.000 --> 00:32:40.540
but not here yet.

00:32:40.540 --> 00:32:45.900
So, I know that there's this thing of saying, if you ever muck with DNS, it can take up to

00:32:45.900 --> 00:32:48.220
72 hours to like ripple through the internet.

00:32:48.220 --> 00:32:50.400
I haven't ever had to deal with that before.

00:32:50.400 --> 00:32:51.820
It's always been pretty quick.

00:32:51.820 --> 00:32:54.640
Whenever I muck with DNS settings, apparently I'm,

00:32:54.640 --> 00:32:55.180
hitting that.

00:32:55.180 --> 00:32:58.060
So hopefully in a few days, it'll be all resolved.

00:32:58.060 --> 00:33:03.660
And so now I have to reset my, days since it lasts DNS problem to zero.

00:33:03.660 --> 00:33:04.640
so.

00:33:04.640 --> 00:33:05.980
Days since last.

00:33:05.980 --> 00:33:07.240
Oh my God.

00:33:07.240 --> 00:33:08.340
That is so amazing.

00:33:08.340 --> 00:33:09.380
I love it.

00:33:09.380 --> 00:33:11.620
So I'm showing a, an Etsy.

00:33:11.620 --> 00:33:15.940
I think you can find them lots of places, but there's an Etsy state sticker that says zero

00:33:15.940 --> 00:33:19.760
days since it, it was DNS and in parentheses, it's always DNS.

00:33:19.760 --> 00:33:22.060
It is anyway.

00:33:22.060 --> 00:33:23.780
Oh my gosh, Brian.

00:33:24.100 --> 00:33:26.780
Are you, are you foreshadowing here?

00:33:26.780 --> 00:33:27.420
Maybe.

00:33:27.420 --> 00:33:28.780
Do you know what I did this whole weekend?

00:33:28.780 --> 00:33:30.380
I have two things to cover for my extras.

00:33:30.380 --> 00:33:30.960
Okay.

00:33:30.960 --> 00:33:35.460
well I covered the one and I also just realized I wanted to give a quick mention just

00:33:35.460 --> 00:33:35.920
in case.

00:33:36.160 --> 00:33:39.900
I spent my, I don't know anything to show, but so let's just leave this up because it's

00:33:39.900 --> 00:33:40.140
perfect.

00:33:40.140 --> 00:33:40.480
Okay.

00:33:40.480 --> 00:33:46.860
I spent all of the weekend and a good chunk of Monday migrating domains from different places.

00:33:46.860 --> 00:33:47.860
I have a bunch of old ones.

00:33:47.860 --> 00:33:52.420
I have a bunch of old ones at GoDaddy because 15 years ago that seemed all right.

00:33:52.420 --> 00:33:53.440
Yeah.

00:33:53.680 --> 00:33:55.300
And they're super hard to get out of there.

00:33:55.300 --> 00:34:01.280
so I've got a bunch of Google domains because I thought Google domains is beautiful until Google

00:34:01.280 --> 00:34:06.900
decided to shut that down because apparently it's too much work to store like a DNS file.

00:34:06.900 --> 00:34:08.420
That's it's a hundred characters.

00:34:08.420 --> 00:34:09.000
I don't know.

00:34:09.160 --> 00:34:11.800
Cause it's a commodity now and they can't make money off of it.

00:34:11.800 --> 00:34:12.800
I know.

00:34:12.800 --> 00:34:13.380
I know.

00:34:13.380 --> 00:34:14.800
Anyway, I can understand it.

00:34:14.800 --> 00:34:17.300
But anyway, so I had like, well, I don't want to stuff on that thing.

00:34:17.300 --> 00:34:18.820
That's like shutting down.

00:34:18.820 --> 00:34:21.620
I got to move that off and I got some others in other place.

00:34:21.620 --> 00:34:24.980
So moving that all together, holy moly, does that take some time?

00:34:24.980 --> 00:34:26.300
And sometimes they move quickly.

00:34:26.300 --> 00:34:27.780
Sometimes they don't.

00:34:27.780 --> 00:34:33.240
Some of the domains have, security turned on that if they transfer, it takes three days

00:34:33.240 --> 00:34:35.700
for it to disable, but the domain will transfer right away.

00:34:35.800 --> 00:34:40.240
But if you transfer it to, you reset it too quickly, it'll like just permanently stop working.

00:34:40.240 --> 00:34:47.140
Some of them have to have SSL as part of the DNS definition, like, dot dev requires

00:34:47.140 --> 00:34:48.060
only SSL.

00:34:48.060 --> 00:34:51.880
But if you want to use let's encrypt, well, it's got to resolve to someplace, but it can't

00:34:51.880 --> 00:34:52.600
resolve to someplace.

00:34:52.600 --> 00:34:53.500
It's not as SSL.

00:34:53.500 --> 00:34:57.380
You're like, okay, who decided to invent a catch 22 for domain names?

00:34:57.380 --> 00:34:58.460
Like, oh, ah.

00:34:58.460 --> 00:35:04.200
So the last one of the last ones switching is Python bytes.fm, which I requested after a

00:35:04.200 --> 00:35:09.500
45 minute phone call, figure out why GoDaddy couldn't give me the access code to do the

00:35:09.500 --> 00:35:09.820
switch.

00:35:09.820 --> 00:35:15.920
I finally did this morning and I got it, but I hope everyone gets to hear from us after

00:35:15.920 --> 00:35:16.800
it switches.

00:35:16.800 --> 00:35:21.480
So if there's the reason, the whole reason to tell the story is that for some reason it

00:35:21.480 --> 00:35:23.060
stops working, it will be back.

00:35:23.060 --> 00:35:23.800
I apologize.

00:35:23.800 --> 00:35:24.780
I'll get it.

00:35:24.780 --> 00:35:25.360
I'll get it there.

00:35:25.360 --> 00:35:26.400
I think it's going to go seamlessly.

00:35:26.400 --> 00:35:27.500
Sometimes I do.

00:35:27.500 --> 00:35:28.560
Sometimes they don't.

00:35:28.560 --> 00:35:29.540
Fingers crossed for this one.

00:35:29.540 --> 00:35:32.160
So we need to buy these stickers in bulk then.

00:35:32.160 --> 00:35:35.740
We're going to zero days since it was DNS.

00:35:35.740 --> 00:35:36.720
It's always DNS.

00:35:36.720 --> 00:35:37.160
Yeah.

00:35:37.160 --> 00:35:38.760
So we need to get those ordered now.

00:35:38.760 --> 00:35:42.580
Mojo's asking where I ended up.

00:35:42.580 --> 00:35:46.300
I ended up, let me do it like this so I don't give away the joke.

00:35:46.300 --> 00:35:49.300
I ended up at hover.com.

00:35:49.300 --> 00:35:49.840
Okay.

00:35:49.840 --> 00:35:51.460
It's the one thing that they do.

00:35:51.460 --> 00:35:53.140
They don't do other stuff.

00:35:53.140 --> 00:35:58.280
They don't kill white rhinos for sport, nor do they not care about their DNS.

00:35:58.280 --> 00:35:59.080
It's like their job.

00:35:59.080 --> 00:36:01.040
So it seemed like a good place so far.

00:36:01.040 --> 00:36:02.000
Fingers crossed.

00:36:02.000 --> 00:36:02.700
Thank you, Robert.

00:36:02.700 --> 00:36:03.800
All right.

00:36:03.800 --> 00:36:07.160
So you already had probably the best joke for the show, but I've got a joke as well.

00:36:07.160 --> 00:36:07.920
You ready for it?

00:36:07.920 --> 00:36:08.300
Okay.

00:36:08.300 --> 00:36:08.700
Yeah.

00:36:08.700 --> 00:36:09.380
Okay.

00:36:09.380 --> 00:36:10.280
Oh, I love this.

00:36:10.280 --> 00:36:10.960
So, yeah.

00:36:10.960 --> 00:36:17.020
So Chris, no, Josh Collinsworth, sorry, came up with this thing and it looks like some kind

00:36:17.020 --> 00:36:17.860
of code he's written.

00:36:17.860 --> 00:36:20.780
It's over on codepen.io that generates these.

00:36:20.780 --> 00:36:25.040
So it's an honest LinkedIn notification generator.

00:36:25.500 --> 00:36:29.760
So, you know, you go to like your activity or your notifications and it tells you stuff.

00:36:29.760 --> 00:36:35.640
Well, this one tells you stuff that is, you know, more in line with the reality of LinkedIn

00:36:35.640 --> 00:36:37.940
rather than what LinkedIn wants to tell you.

00:36:37.940 --> 00:36:39.420
So here's a picture of this woman.

00:36:39.420 --> 00:36:42.540
It says, congratulate a near stranger for tears at a job.

00:36:42.540 --> 00:36:44.440
You didn't know they had, they had.

00:36:44.440 --> 00:36:46.740
And then there's like a, yeah, it's so good.

00:36:46.740 --> 00:36:48.760
There's like a blurred picture of somebody.

00:36:48.760 --> 00:36:50.380
It says, someone looked at your profile.

00:36:50.380 --> 00:36:50.720
Who?

00:36:50.720 --> 00:36:52.620
We're holding that information for ransom.

00:36:52.620 --> 00:36:59.640
It says, smiling guys, says, follow the worst coworker you've ever had for their sudden

00:36:59.640 --> 00:37:00.960
unsolicited insights.

00:37:00.960 --> 00:37:02.360
And it just goes on and on.

00:37:02.360 --> 00:37:03.880
I think it even has infinite scroll.

00:37:03.880 --> 00:37:10.080
Somebody connected with your first manager from your job in 2014 reacted to a former classmate's

00:37:10.080 --> 00:37:10.380
post.

00:37:10.380 --> 00:37:11.400
Thought you should know.

00:37:11.400 --> 00:37:16.880
So one of the influencers shared an incredibly crappy opinion just for the engagement.

00:37:16.880 --> 00:37:17.820
Click to engage.

00:37:17.820 --> 00:37:20.520
Never hire anyone who writes CSF ever.

00:37:20.520 --> 00:37:21.500
No CSS.

00:37:21.500 --> 00:37:23.520
So on and so on.

00:37:23.520 --> 00:37:25.080
It's just, it's so good.

00:37:25.080 --> 00:37:28.720
Wish that guy who made you cry in the bathroom a happy birthday.

00:37:28.720 --> 00:37:30.200
That was great.

00:37:30.200 --> 00:37:34.180
Oh, that was, that was a, did you already get the one where it was like free work?

00:37:34.180 --> 00:37:35.160
The free labor one?

00:37:35.160 --> 00:37:35.740
Oh yeah.

00:37:35.740 --> 00:37:36.920
No, where is it?

00:37:36.920 --> 00:37:37.580
No, right there.

00:37:37.580 --> 00:37:39.760
You're, you're one of the few experts invited.

00:37:39.760 --> 00:37:40.520
Oh yeah.

00:37:40.520 --> 00:37:40.720
Yeah.

00:37:40.740 --> 00:37:46.960
You're one of the few experts invited to slash do free unpaid labor rather add to this

00:37:46.960 --> 00:37:48.000
collaborative article.

00:37:48.000 --> 00:37:50.180
How do you exploit users without them noticing?

00:37:50.180 --> 00:37:54.780
Well, I've been getting those like a whole bunch lately and I, and I actually clicked on

00:37:54.780 --> 00:37:56.460
it when I'm like, what are they talking about?

00:37:56.460 --> 00:37:58.800
Oh, they want me to write articles for free.

00:37:58.800 --> 00:38:00.700
no, I'm not doing that.

00:38:00.700 --> 00:38:03.840
I got one this morning even.

00:38:03.840 --> 00:38:10.220
So I got not one of these, but I got a congratulate John Gould on his new or gold, on his new,

00:38:10.220 --> 00:38:11.100
uh, promotion.

00:38:11.180 --> 00:38:12.560
And I'm like, he owns the company.

00:38:12.560 --> 00:38:13.560
I don't understand.

00:38:13.560 --> 00:38:15.560
I don't understand.

00:38:15.560 --> 00:38:16.400
I don't understand.

00:38:16.400 --> 00:38:16.700
Yeah.

00:38:16.700 --> 00:38:19.080
Good little pat on the old back there, John.

00:38:19.080 --> 00:38:19.720
Good job.

00:38:19.720 --> 00:38:21.200
Giving yourself a promotion there.

00:38:21.200 --> 00:38:22.600
Exactly.

00:38:23.060 --> 00:38:27.860
Chris Taylor and 36 others at soul sucking corporation shared this post from the CEO in hopes of

00:38:27.860 --> 00:38:29.180
avoiding the next round of layoffs.

00:38:29.180 --> 00:38:30.300
These are good.

00:38:30.300 --> 00:38:31.400
Get a lot of those.

00:38:31.400 --> 00:38:31.740
Yeah.

00:38:31.740 --> 00:38:32.340
All right.

00:38:32.340 --> 00:38:35.320
Well, I don't know if it's too dark, but that's what I brought for the joke.

00:38:35.700 --> 00:38:36.680
I think it's great.

00:38:36.680 --> 00:38:37.640
I think I do.

00:38:37.640 --> 00:38:42.780
I kind of like LinkedIn to like keep in touch with people and keep up your resume and stuff

00:38:42.780 --> 00:38:43.260
like that.

00:38:43.260 --> 00:38:49.680
But I don't actually ever use it as a finding new articles through service.

00:38:49.680 --> 00:38:51.560
But anyway, there's a whole group of people who do.

00:38:51.560 --> 00:38:54.460
I don't think I'm part of it either, but yeah, I'm not the target audience.

00:38:54.460 --> 00:38:55.520
So it's all right.

00:38:55.520 --> 00:38:55.900
Yeah.

00:38:55.900 --> 00:38:56.500
All right.

00:38:56.500 --> 00:38:59.700
Well, thanks again for a lovely Python bites.

00:38:59.700 --> 00:39:00.500
Absolutely.

00:39:00.500 --> 00:39:01.120
Bye.

