WEBVTT

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

00:00:04.720 --> 00:00:10.960
This is episode 322, recorded February 7th, 2023. I'm Michael Kennedy.

00:00:10.960 --> 00:00:12.280
And I'm Brian Okken.

00:00:12.280 --> 00:00:13.800
I'm Calvin Hendryx-Parker.

00:00:13.800 --> 00:00:15.760
Welcome, Calvin. Awesome to have you here.

00:00:15.760 --> 00:00:18.500
I'm excited to be back. I love it's kind of my annual retreat.

00:00:18.500 --> 00:00:23.580
That's right. That's right. Your annual drop-in to share all your ideas with us.

00:00:23.580 --> 00:00:25.640
You got some good ones to talk about, I know.

00:00:25.640 --> 00:00:30.700
Also want to say thank you to Microsoft for Startups Founders Hub for sponsoring this episode.

00:00:30.700 --> 00:00:37.860
If you want to connect with any of us, me, Brian, Calvin, or even just the show, you can find us over on Fastedon.

00:00:37.860 --> 00:00:41.480
We're all over there, actually, on Mastodon, so you can find the links in the show notes.

00:00:41.480 --> 00:00:46.600
And if you're listening but not watching, just go to pythonby.fm.com slash stream slash live,

00:00:46.600 --> 00:00:50.820
where we will be streaming live every Tuesday, usually.

00:00:50.820 --> 00:00:52.980
But you can definitely subscribe to get notified there.

00:00:53.140 --> 00:00:56.760
Calvin, I know you've been here before, multiple times.

00:00:56.760 --> 00:01:01.560
You always come to put us to shame with your fancy camera that you got going.

00:01:01.560 --> 00:01:02.080
We love it.

00:01:02.080 --> 00:01:06.400
Tell people who maybe haven't heard about you or met you before who you are.

00:01:06.400 --> 00:01:08.380
Sure. So I'm Calvin Hendryx-Parker.

00:01:08.380 --> 00:01:10.480
I'm co-founder and CTO of Six Feet Up.

00:01:10.480 --> 00:01:15.940
We are a software development company that helps digital leaders transform their impact.

00:01:15.940 --> 00:01:19.220
We do a lot of interesting work now around impactful projects.

00:01:19.220 --> 00:01:22.240
So it's like climate change, making the world a better place.

00:01:22.240 --> 00:01:24.980
In addition, I've started a couple of communities.

00:01:24.980 --> 00:01:27.240
So the IndiePy community here, local Indianapolis.

00:01:27.240 --> 00:01:33.240
And then we kind of branched out from that into some little local conferences into now Python Web Conference.

00:01:33.240 --> 00:01:38.040
So that's probably the big thing you'll hear from me at least this month and next month.

00:01:38.300 --> 00:01:39.980
Yeah, we'll talk about that at the end of the show.

00:01:39.980 --> 00:01:41.460
But that's an amazing conference.

00:01:41.460 --> 00:01:47.700
You have, I would say, potentially more talks or on par as many talks as US PyCon.

00:01:47.700 --> 00:01:49.580
It's really a lot going on there.

00:01:49.580 --> 00:01:51.500
Last year, there were almost too many.

00:01:51.500 --> 00:01:52.800
Like, it was so good.

00:01:52.800 --> 00:01:54.140
I just kept saying yes to everybody.

00:01:54.140 --> 00:01:56.640
This year, we pulled back a little bit.

00:01:56.640 --> 00:01:58.420
We had more submissions.

00:01:58.420 --> 00:01:59.280
We'll talk about this later.

00:01:59.360 --> 00:02:00.940
But it was really hard to choose.

00:02:00.940 --> 00:02:03.920
Yeah, it's tough to say no to deserving people.

00:02:03.920 --> 00:02:05.200
But it's so much talent.

00:02:05.200 --> 00:02:06.320
So many great people.

00:02:06.320 --> 00:02:07.180
Indeed.

00:02:07.180 --> 00:02:09.060
All right, Brian, kick us off.

00:02:09.060 --> 00:02:12.600
I just wanted to talk about packaging today a little bit.

00:02:12.600 --> 00:02:14.540
I've got, I'm splitting it up into two segments.

00:02:14.540 --> 00:02:22.140
But I really want to focus on right now on the PyPA has a packaging Python projects tutorial page.

00:02:22.140 --> 00:02:25.240
It's linked in the show notes, of course.

00:02:25.240 --> 00:02:29.340
But I think this is a good, it's really pretty good, well written.

00:02:29.340 --> 00:02:31.600
And so I want to point people in this direction.

00:02:31.600 --> 00:02:37.080
If you want to share your Python code with somebody else, packaging it is the right way to go, I think.

00:02:37.080 --> 00:02:43.660
And this tutorial walks through, it's not necessarily trivial to do it.

00:02:43.660 --> 00:02:47.420
So, and it, I wish it was easier, but it, it's not bad.

00:02:47.420 --> 00:02:52.700
So it walks through what you, you know, walks through setting up your directory structure.

00:02:52.700 --> 00:02:56.480
It's, and then you have to have some package files with it.

00:02:56.480 --> 00:03:01.260
You've got to have a license file and a pyproject.toml now and a readme.

00:03:01.260 --> 00:03:05.040
And then it talks about your source directory and your test directory.

00:03:05.040 --> 00:03:07.040
So you've got the directory set up.

00:03:07.040 --> 00:03:10.300
I know you're a fan of the source directory for packages.

00:03:10.300 --> 00:03:11.220
It looks like.

00:03:11.220 --> 00:03:12.100
Yeah.

00:03:12.320 --> 00:03:13.760
Exactly.

00:03:13.760 --> 00:03:17.040
Your philosophy is winning out here is the official recommendation.

00:03:17.040 --> 00:03:17.800
Yeah.

00:03:17.800 --> 00:03:21.960
And I mostly, I used to have good reasons behind it.

00:03:21.960 --> 00:03:27.880
Now I just like having the top level stuff, just be packaging and having the actual source

00:03:27.880 --> 00:03:29.720
code be somewhere else in the source directory.

00:03:29.720 --> 00:03:33.720
So it just, it's a, it's a, while you're developing, it's, it's nicer.

00:03:33.720 --> 00:03:36.780
If you have a single that there is like caveats though.

00:03:36.780 --> 00:03:41.440
If you have a single file that you're just sharing, that might seem like overkill.

00:03:41.440 --> 00:03:46.440
And I, I, I, I'm fine with, of course, I have packages as well that are single file that

00:03:46.440 --> 00:03:47.440
I don't do this with.

00:03:47.440 --> 00:03:51.900
So you don't have to, but most things, most projects are going to have more than one file

00:03:51.900 --> 00:03:53.360
if you're sharing it.

00:03:53.360 --> 00:03:54.940
So there's this.

00:03:54.940 --> 00:03:56.440
So, and then what do you put in it?

00:03:56.440 --> 00:04:01.940
So it talks about what you put in the different things in the PyProject.toml and a little

00:04:01.940 --> 00:04:03.800
bit into the readme and some of the metadata.

00:04:03.800 --> 00:04:10.260
The, one of the things we're going to jump into a little bit later in the show is that

00:04:10.260 --> 00:04:13.720
there are lots of options for what build backend you use.

00:04:14.440 --> 00:04:20.740
This, this project itself, or this document talks about hatchling, setup tools, FLIT and

00:04:20.740 --> 00:04:21.440
PDM.

00:04:21.440 --> 00:04:26.380
And they, neither of them look that different and they kind of do the same thing, but you

00:04:26.380 --> 00:04:28.160
can have different metadata that goes with it.

00:04:28.160 --> 00:04:33.360
So that's, I think both a good thing that we have options and a bad thing that some people

00:04:33.360 --> 00:04:34.700
don't know how to choose.

00:04:34.700 --> 00:04:39.120
So is it really tough to like, know why should you do it?

00:04:39.120 --> 00:04:42.740
Maybe setup tools probably shouldn't be the choice.

00:04:42.860 --> 00:04:46.160
I don't feel like that you're kind of moving a little bit away from that, but yeah.

00:04:46.160 --> 00:04:47.300
The history here is so deep.

00:04:47.300 --> 00:04:52.500
Like, I feel like there's like a whole day, a whole college course you could give on why

00:04:52.500 --> 00:04:53.880
these things are the way they are now.

00:04:53.880 --> 00:04:54.340
Yeah.

00:04:54.340 --> 00:04:55.320
Yeah.

00:04:55.320 --> 00:05:00.880
So the, in it, the project, the tutorial goes down into even distributing.

00:05:00.880 --> 00:05:09.020
So all the way down to recommending that you use Twine to upload to the test repository,

00:05:09.020 --> 00:05:09.740
test by PI.

00:05:10.240 --> 00:05:14.740
And you have to get a token and it's not trivial and all this sort of stuff.

00:05:15.120 --> 00:05:19.260
So it's a little, it's still a little daunting, but this will walk through, walk you through

00:05:19.260 --> 00:05:20.340
the, all the steps.

00:05:20.340 --> 00:05:22.420
I have a personal opinion, of course.

00:05:22.420 --> 00:05:26.000
And my opinion is read this and then check out Flit.

00:05:26.680 --> 00:05:31.040
Because for simple projects, Flit is, I think, still the easiest.

00:05:31.040 --> 00:05:35.640
It replaces the build step with Flit build.

00:05:35.640 --> 00:05:40.120
And it replaces the creation of some of these files with Flit init.

00:05:40.120 --> 00:05:44.260
And it replaces the Twine upload with just Flit publish.

00:05:44.260 --> 00:05:49.680
And I use it on a few projects and I haven't had reason to switch yet.

00:05:50.240 --> 00:05:54.400
There's, it's not perfect, but it's pretty easy for small projects.

00:05:54.400 --> 00:05:57.940
So I would say read both of these if you want to share some Python code.

00:05:57.940 --> 00:05:58.340
So.

00:05:58.340 --> 00:05:59.200
Excellent.

00:05:59.200 --> 00:05:59.620
Yeah.

00:05:59.620 --> 00:06:00.500
Very good recommendation.

00:06:00.500 --> 00:06:03.760
And I think people need guidance here because there are so many choices.

00:06:03.760 --> 00:06:07.220
There's going to be a lot of conversation in the Python space around this actually.

00:06:07.220 --> 00:06:07.980
For sure.

00:06:07.980 --> 00:06:08.580
Yep.

00:06:09.460 --> 00:06:10.120
All right.

00:06:10.120 --> 00:06:11.920
Let's move on though for right now.

00:06:11.920 --> 00:06:14.380
Real time follow up here.

00:06:14.380 --> 00:06:20.780
As of about 30 minutes ago, OFEC, the creator of Hatch, and I are going to have a conversation

00:06:20.780 --> 00:06:22.260
March 1st on Talk Python.

00:06:22.260 --> 00:06:26.920
So if people want to hear more about Hatch, that's coming up in about three weeks or so.

00:06:26.920 --> 00:06:28.460
But what do I want to talk about?

00:06:28.460 --> 00:06:30.080
Something fun.

00:06:30.080 --> 00:06:32.100
Last time we had the Unreple.

00:06:32.100 --> 00:06:33.980
This time we have the Untangle.

00:06:33.980 --> 00:06:39.260
So Untangle by ST Chris on GitHub.

00:06:39.260 --> 00:06:43.220
Converts XML to dynamic Python objects.

00:06:43.220 --> 00:06:47.020
So thankfully we've largely moved past XML.

00:06:47.020 --> 00:06:51.560
And really thankfully we've largely moved past XML namespaces.

00:06:51.560 --> 00:06:54.480
Because that just is a complication that never needed to exist.

00:06:54.480 --> 00:06:58.860
But there's still plenty of XML stuff out there that people have to work with.

00:06:58.860 --> 00:07:01.680
So here's a cool little library that people can use.

00:07:01.680 --> 00:07:09.020
So we already have XML support in Python through the element tree API, which is pretty nice.

00:07:09.140 --> 00:07:09.680
It works well.

00:07:09.680 --> 00:07:11.900
You give it an XML document.

00:07:11.900 --> 00:07:18.960
But then you do sort of navigate it through like child parent or dot attribute.

00:07:18.960 --> 00:07:24.100
There's like some, you know, it's not totally the cleanest, most straightforward API.

00:07:24.100 --> 00:07:35.280
So with this Untangle thing, you can treat it like a Python object that just dynamically adopts the nodes as fields of those objects as a hierarchy.

00:07:36.020 --> 00:07:37.560
So super simple.

00:07:37.560 --> 00:07:37.660
So super simple.

00:07:37.660 --> 00:07:43.080
You just get it to parse either a URL, a file, or from a string, just an XML string.

00:07:43.080 --> 00:07:45.600
There's an example that is just real simple.

00:07:45.600 --> 00:07:48.260
It has a root and it has a child node.

00:07:48.480 --> 00:07:53.220
And on the child node, it has an attribute where it says name equals child one.

00:07:53.220 --> 00:07:53.700
Okay.

00:07:53.700 --> 00:08:01.060
So if you were to load that up with this Untangle thing, you just, whatever you get back, you say dot root, because that's the first element.

00:08:01.060 --> 00:08:07.020
You wanted to say, for example, that name attribute, say dot root, because that's the name of the root is whatever the first element.

00:08:07.020 --> 00:08:08.740
Then the next element is dot child.

00:08:09.040 --> 00:08:14.880
And then to get the attribute, you just treat it like a dictionary and say bracket name and outcomes, outcomes have value.

00:08:14.880 --> 00:08:16.920
So that seems really, really clean and nice.

00:08:16.920 --> 00:08:17.920
It does look clean.

00:08:17.920 --> 00:08:19.560
Other than the fact you're still dealing with XML.

00:08:19.560 --> 00:08:20.340
Yeah, well.

00:08:20.340 --> 00:08:24.000
I was just dealing with XML this morning.

00:08:24.000 --> 00:08:24.580
Yuck.

00:08:24.580 --> 00:08:26.020
Yeah, absolutely.

00:08:26.020 --> 00:08:32.740
So I suppose there's an API for enumerating things where you have multiple ones, right?

00:08:32.740 --> 00:08:36.440
You could have child, child, child, child with name one, child with name two, right?

00:08:36.500 --> 00:08:39.120
As a list of things in this XML.

00:08:39.120 --> 00:08:44.520
So it's, there's probably, you know, maybe if there's multiple ones, I don't know, maybe it's a list or something.

00:08:44.520 --> 00:08:49.640
I have to look, actually realize I didn't totally look into that, but it's a pretty cool library.

00:08:49.640 --> 00:08:54.100
If people are doing things like that, they can definitely check it out.

00:08:54.100 --> 00:08:54.560
Here we go.

00:08:54.560 --> 00:08:54.780
Maybe.

00:08:54.780 --> 00:08:55.400
Yeah.

00:08:55.400 --> 00:09:04.440
I think I will try this out because I have used elementary and it does the job, but I always thought maybe it could be easier.

00:09:04.440 --> 00:09:06.260
What's the speed like?

00:09:06.360 --> 00:09:08.360
Do you know anything on if it's fast, slow?

00:09:08.360 --> 00:09:13.220
Honestly, I would imagine what it's doing is it's probably using element tree.

00:09:13.220 --> 00:09:13.820
Yeah.

00:09:13.820 --> 00:09:18.380
It's just like a thin wrapper over top of it, but I don't, I don't know.

00:09:18.380 --> 00:09:18.880
Let's see.

00:09:18.880 --> 00:09:23.780
Oh, it's using defused XML.

00:09:23.780 --> 00:09:23.920
Yeah.

00:09:23.920 --> 00:09:24.700
Sax.

00:09:24.700 --> 00:09:25.100
Okay.

00:09:25.100 --> 00:09:29.140
I have no, I don't know anything about Sax XML, but yeah.

00:09:29.140 --> 00:09:29.480
Okay.

00:09:29.480 --> 00:09:30.240
Pretty interesting.

00:09:31.080 --> 00:09:31.960
No, I don't know anything.

00:09:31.960 --> 00:09:32.360
It doesn't.

00:09:32.360 --> 00:09:38.460
Unfortunately, the read me doesn't have a lot of information about, you know, like its performance and other things.

00:09:38.460 --> 00:09:39.100
But yeah.

00:09:39.100 --> 00:09:40.320
They also have a blog post.

00:09:40.320 --> 00:09:42.720
You can check out about why they built it, which is kind of neat.

00:09:42.920 --> 00:09:46.360
So also sweet, short and sweet, but check it out.

00:09:46.360 --> 00:09:48.320
If that sounds like something that would benefit you.

00:09:48.320 --> 00:09:49.220
That's very cool.

00:09:49.220 --> 00:09:49.740
Indeed.

00:09:49.740 --> 00:09:50.260
All right.

00:09:50.260 --> 00:09:50.840
Over to you, Calvin.

00:09:50.840 --> 00:09:56.640
Well, something else that could benefit you is going to be, my pie is official one.

00:09:56.800 --> 00:10:00.680
Oh, released, I think this was as of about a week and a half ago.

00:10:00.680 --> 00:10:02.520
So it was pretty, pretty new news.

00:10:02.520 --> 00:10:03.780
A ton of stuff here.

00:10:03.780 --> 00:10:10.680
So for those, you don't know, my pie is the static type checker for Python, basically a Python linter on steroids.

00:10:10.680 --> 00:10:19.740
so if you are using type hints, this is going to be a great way for you to make sure your code is, basically ready to go before it even runs.

00:10:19.740 --> 00:10:27.340
something a lot of developers coming to Python from other statically or strongly type languages, really appreciate.

00:10:27.340 --> 00:10:38.100
And I think it's something that a lot of Python developers are moving to, especially with like the surge in populative languages like TypeScript, because the IDEs are really supporting this like so well.

00:10:38.100 --> 00:10:41.620
So it, you, you get a significant improvement in your quality of life.

00:10:41.620 --> 00:10:45.900
If you move to a tool like my pie and start using my Python and Python hints.

00:10:45.900 --> 00:10:47.900
So, type hints in Python.

00:10:48.080 --> 00:10:49.840
there's some things to watch out for.

00:10:49.840 --> 00:10:53.400
So as this new release rolls out, they are changing their numbering scheme.

00:10:53.400 --> 00:11:03.760
It used to be like 0.999, you know, they kept kind of extending this like 0.9, beta release window, but it's actually now 1.0.

00:11:03.760 --> 00:11:04.720
It is not Simver.

00:11:04.720 --> 00:11:09.840
so do not count on minor releases, not having backward incompatibilities.

00:11:09.840 --> 00:11:12.920
although they should be very minimal is what they claim.

00:11:12.920 --> 00:11:16.180
But something you may want to be aware of if you are upgrading to this.

00:11:16.420 --> 00:11:28.740
And when you go in and pin your, you know, my pie version, you want to be really explicit about it because they're going to make sure they announce those significant backward incompatibilities in any kind of blog posts in the release before that feature releases.

00:11:28.740 --> 00:11:29.660
So the idea is...

00:11:29.660 --> 00:11:31.940
Do you say it has a, like a gut feel ver?

00:11:31.940 --> 00:11:32.980
Yeah, yeah, right.

00:11:32.980 --> 00:11:33.800
A season dance ver?

00:11:33.800 --> 00:11:35.000
Like what's the official term?

00:11:35.000 --> 00:11:36.580
Like, yeah, it feels like a big release.

00:11:36.580 --> 00:11:38.140
Let's go ahead and change this part of the version.

00:11:38.140 --> 00:11:42.140
But on that same note, they do have feature flags for this.

00:11:42.140 --> 00:11:46.240
So if there is a new big feature coming, there's going to be a backward incompatible feature.

00:11:46.240 --> 00:11:48.140
The previous release notes will note it.

00:11:48.140 --> 00:11:49.560
The release will have it.

00:11:49.560 --> 00:11:50.980
There'll be a flag to turn it on.

00:11:50.980 --> 00:11:53.140
So you can try it out easily in your workflow.

00:11:53.140 --> 00:11:57.240
See what breaks without having to, you know, downgrade, re-upgrade, downgrade, re-upgrade.

00:11:57.240 --> 00:12:01.500
So you can actually turn it on and off and make sure it works inside your workflow and your process.

00:12:01.920 --> 00:12:03.140
Lots of performance improvements.

00:12:03.140 --> 00:12:06.980
So 1.0 is 40% faster than 0.991.

00:12:06.980 --> 00:12:10.560
There's about 20 optimizations in this list.

00:12:10.560 --> 00:12:16.200
And this is, you can see by my scroll bar, there's a ton of stuff that happened when they went to release 1.0.

00:12:16.200 --> 00:12:21.300
But some more things in here that are nice features, for example, warning about variables before definition

00:12:21.300 --> 00:12:24.500
kind of goes along with this possibly undefined variables.

00:12:24.500 --> 00:12:26.420
So for example, B is never true.

00:12:26.420 --> 00:12:27.380
X never happens.

00:12:27.380 --> 00:12:29.060
You'll never be able to print X.

00:12:29.060 --> 00:12:31.720
mypy will tell you about that before you ever run your code.

00:12:31.720 --> 00:12:35.700
So it's kind of like just a lot of those belts and suspenders, nice safety checks.

00:12:35.700 --> 00:12:37.220
Keep your code nice and clean.

00:12:37.220 --> 00:12:43.860
Combine this with, you know, tools like black and things like that to just have super tight code that is easy to read for everybody.

00:12:43.860 --> 00:12:47.380
Some new features that are supported as of Python 3.11.

00:12:47.380 --> 00:12:49.700
The new self type is supported.

00:12:49.700 --> 00:12:57.460
So if you are having a method that returns an instance of the class, you can use the self type.

00:12:57.460 --> 00:13:02.980
So if you have a sub class, you get the correct sub class return instead of having to explicitly, you know,

00:13:02.980 --> 00:13:05.620
redefine that for every sub class you are doing.

00:13:05.620 --> 00:13:10.560
So more convenience methods for those who are diving deep into the typing system here.

00:13:10.560 --> 00:13:12.160
The self type is so good.

00:13:12.160 --> 00:13:12.620
Yeah.

00:13:12.620 --> 00:13:14.700
It's really, it cleans up a lot of problems.

00:13:14.700 --> 00:13:20.500
It was really janky to, you know, if you're inside the class, you put in quotes, the name of the class.

00:13:20.640 --> 00:13:26.800
Well, how's it supposed to find, you know, that one, or if it's going to create a circular dependency, you've got to do weird things.

00:13:26.800 --> 00:13:28.880
So yeah, that's really, really nice.

00:13:28.880 --> 00:13:37.720
I do wish that Python had like a two stage parser aspect where it would say, go through, here's all the stuff that's defined in the class.

00:13:37.720 --> 00:13:40.420
Oh, here's some type things and other reference.

00:13:40.420 --> 00:13:41.480
We might not know what that is.

00:13:41.480 --> 00:13:45.320
Let's go all through and then go back again and see if we can figure out what that is, you know.

00:13:45.320 --> 00:13:52.660
But the way it works now is when you're in the middle of a class, that class doesn't exist yet because it's not done defining until you're at the end.

00:13:52.660 --> 00:13:57.420
But if you've got to say, I'm going to compare this against another one of me, well, how do you say that in types?

00:13:57.420 --> 00:13:57.780
Self.

00:13:57.780 --> 00:13:58.660
Right.

00:13:58.660 --> 00:13:59.700
That's what we got.

00:13:59.700 --> 00:14:04.220
And I can see this like being rolled in to proper Python.

00:14:04.220 --> 00:14:05.680
It seems like at some point.

00:14:05.680 --> 00:14:18.120
I just feel like types went on from being this pie in the sky idea to bolted on type feature to it's really getting ironed out and really well supported by the community and really well supported by all the editors.

00:14:18.120 --> 00:14:22.900
There's some new stuff in here that I don't know too much about.

00:14:22.900 --> 00:14:25.980
We're not heavy into types yet.

00:14:26.040 --> 00:14:30.640
We're doing a lot with Django and doing some type ins there to start making some APIs.

00:14:30.640 --> 00:14:32.360
But that's where we're still diving in.

00:14:32.360 --> 00:14:34.220
A bunch of new like miscellaneous features.

00:14:34.220 --> 00:14:40.840
So if you are looking for features galore that has happened in mypy 1.0, there's a bunch of fixes to crashes.

00:14:40.840 --> 00:14:43.540
So this seems like it's a really robust release.

00:14:43.540 --> 00:14:48.780
Another important one here is going to be the Python 310 match statement support.

00:14:48.780 --> 00:14:50.640
So it can compile those as well.

00:14:50.640 --> 00:14:58.680
So they're staying on top of all the recent language features, which is obviously what's needed to get momentum behind a project like this.

00:14:58.680 --> 00:15:02.400
I think anybody who's using type ins better be using the mypy stuff.

00:15:02.400 --> 00:15:06.040
For those who don't know, it's also supported by Dropbox.

00:15:06.040 --> 00:15:13.880
So when I said 40% or no, yeah, the 40% faster, that was actually running against the Dropbox main code base.

00:15:13.880 --> 00:15:17.200
So they're actually, that's the benchmark against Dropbox itself.

00:15:17.200 --> 00:15:18.240
Interesting.

00:15:18.240 --> 00:15:18.860
Yeah.

00:15:18.860 --> 00:15:19.260
Yeah.

00:15:19.260 --> 00:15:22.940
mypyC is pretty an interesting thing that opens up once you start to adopt types.

00:15:22.940 --> 00:15:29.580
For me, the main reason I use types in my world, and I realize that I live in a different world than a lot of folks.

00:15:29.580 --> 00:15:38.080
But for me, it's really about making the editor tell me what it should know already and not, do I need to go look in that method?

00:15:38.080 --> 00:15:44.100
Does this actually take, when it says user ID, is that a string or is that a BSON from MongoDB?

00:15:44.200 --> 00:15:48.160
I can't remember what kind of thing this stores for this day, it says, you know?

00:15:48.160 --> 00:15:48.840
Yeah.

00:15:48.840 --> 00:15:49.980
And then, oh, okay, that's obvious, right?

00:15:49.980 --> 00:15:51.840
Just so you don't have to keep bouncing around.

00:15:51.840 --> 00:15:54.340
You just stay in the way you're trying to focus.

00:15:54.340 --> 00:15:54.740
And I love it.

00:15:54.740 --> 00:15:54.820
Yeah.

00:15:54.820 --> 00:15:55.660
It's that extra smart.

00:15:55.820 --> 00:16:03.640
I mean, if you're using a PyCharm or VS Code and you thought it was smart before, once you introduce these types in there, it gets even smarter.

00:16:03.640 --> 00:16:04.980
Absolutely.

00:16:04.980 --> 00:16:05.980
All right.

00:16:05.980 --> 00:16:06.260
Awesome.

00:16:06.260 --> 00:16:06.820
Awesome one.

00:16:07.100 --> 00:16:08.760
Now, two pieces of real-time feedback.

00:16:08.760 --> 00:16:19.140
One, I found out with the untangle that if you have multiple nodes of the same thing, like you would in an RSS feed, you have multiple posts or a blog post, same thing for the posts.

00:16:20.920 --> 00:16:26.400
You just still say root dot, you know, main thing dot child or whatever the name of that node is.

00:16:26.400 --> 00:16:30.240
That becomes a list instead of a single thing if there's more than one.

00:16:30.240 --> 00:16:31.080
Okay.

00:16:31.080 --> 00:16:33.280
So that's pretty interesting.

00:16:33.280 --> 00:16:37.680
And then the other one here is over to you, Brian.

00:16:37.680 --> 00:16:41.160
Jeff asked, can an old project be converted to work with Flit?

00:16:41.560 --> 00:16:43.580
And yes, probably, maybe.

00:16:43.580 --> 00:16:45.680
It really depends on the project.

00:16:45.680 --> 00:16:48.800
Some of it can be re...

00:16:48.800 --> 00:16:50.480
There's not that much to it, right?

00:16:50.480 --> 00:16:56.920
There's PyProject.toml and a few other things, and it's probably not that much work to migrate it, I guess.

00:16:56.920 --> 00:16:59.360
Yeah, but I mean, an old...

00:16:59.360 --> 00:17:07.400
I'm assuming by old project, it's an old setup.py setup tools project, and you could do anything in that.

00:17:07.400 --> 00:17:11.820
So if you were going crazy, you can't go crazy anymore.

00:17:11.820 --> 00:17:16.340
But if it was a fairly simple, straightforward, then yeah, probably.

00:17:16.340 --> 00:17:18.400
If you were going crazy, you get what you deserve.

00:17:18.400 --> 00:17:18.940
How about that?

00:17:18.940 --> 00:17:30.440
So, all right, before we move on to our next topic, let me tell you about our sponsor for this week, Microsoft First Startups Founders Hub.

00:17:30.440 --> 00:17:32.100
Really great program.

00:17:32.100 --> 00:17:44.500
If you have a startup and you want to get tons of support, not just technical support, but also networking with people who have founded their own startups, then you should check out Microsoft First Startup Founders Hub.

00:17:44.500 --> 00:17:50.200
As Brian mentioned last time, we heard back from one of our listeners who signed up and had done several startups and said,

00:17:50.200 --> 00:17:53.140
I was a little skeptical, but this is a really great program.

00:17:53.140 --> 00:17:56.580
It's fantastic for us, and I just wanted to let you know how well it's working out.

00:17:57.040 --> 00:17:58.500
So definitely a good program.

00:17:58.500 --> 00:17:59.300
People will check it out.

00:17:59.300 --> 00:18:06.260
So what it is Microsoft created this program to help people become successful starting a business.

00:18:06.260 --> 00:18:10.360
By some estimates, 90% of startups go out of business within the first year.

00:18:10.360 --> 00:18:12.480
That's not what you want for your startup.

00:18:12.480 --> 00:18:13.560
You want it to succeed.

00:18:14.200 --> 00:18:18.400
So with Microsoft First Startup Founders Hub, you get access to free resources.

00:18:18.400 --> 00:18:23.380
So this includes platform technologies like Azure, GitHub.

00:18:23.380 --> 00:18:25.240
They partner with OpenAI.

00:18:25.240 --> 00:18:28.580
I've heard ChatGPT is catching on, so that's kind of cool.

00:18:28.580 --> 00:18:32.520
So you get access to some of the resources from them, which is fantastic.

00:18:32.520 --> 00:18:38.080
But you also get access to the mentorship network, which I think maybe is even the most important part.

00:18:38.080 --> 00:18:48.400
You get access to a pool of hundreds of mentors across ranges of disciplines, across areas like idea validation, fundraising, management and coaching, sales and marketing, and others.

00:18:48.400 --> 00:18:53.800
So you can go and book one-on-one meetings with these folks, and many of them are former founders themselves.

00:18:53.800 --> 00:19:00.240
So you can make your idea a reality today with the critical support you get from Microsoft for startups, Founders Hub.

00:19:00.240 --> 00:19:07.020
Just visit pythonbytes.fm/foundershub 2022 to go apply.

00:19:07.020 --> 00:19:08.320
The link's in your show notes.

00:19:08.320 --> 00:19:10.640
You don't have to be VC-backed.

00:19:10.640 --> 00:19:12.740
You don't have to be third-party validated.

00:19:12.740 --> 00:19:13.820
You just apply.

00:19:13.820 --> 00:19:18.780
If they like what you want, it's free, and they'll take you on to the program, and you can get started.

00:19:18.780 --> 00:19:21.960
So thank you to Microsoft for supporting our show.

00:19:22.680 --> 00:19:24.740
And with that, Brian, over to you.

00:19:24.740 --> 00:19:25.240
Yeah.

00:19:25.240 --> 00:19:29.060
So go back to the same article for a second.

00:19:29.060 --> 00:19:31.060
Just scroll a little further down the same page.

00:19:31.060 --> 00:19:31.620
Okay, got it.

00:19:31.620 --> 00:19:38.060
So within the same packaging Python projects thing, there was...

00:19:38.060 --> 00:19:39.940
I have a reason to bring this up.

00:19:39.940 --> 00:19:44.700
But anyway, it lists a whole bunch of tools you can use for your build a backend.

00:19:44.700 --> 00:19:47.740
It's got PDM, FLIT, Subtools, and HatchLink.

00:19:47.740 --> 00:19:54.520
There's another page on the same in PyPI or PyPA that is the packaging flow.

00:19:54.520 --> 00:19:57.780
And this one talks about it as more of a high level.

00:19:57.780 --> 00:20:00.220
It's not a tutorial that talks about the high level thing.

00:20:00.220 --> 00:20:08.980
And there, it lists all of those, FLIT, Hatch, PDM, Poetry, Subtools, and then also Trampolin and Way, which I've not heard of.

00:20:08.980 --> 00:20:11.700
So this can cause confusion.

00:20:11.700 --> 00:20:13.260
And that's really what we're talking about.

00:20:13.260 --> 00:20:14.940
Is I have...

00:20:14.940 --> 00:20:27.340
And I'm bringing this up because just independent of my involvement with Python bytes, I've been involved with people having trouble figuring out how to package their Python code independently.

00:20:27.340 --> 00:20:32.760
I've got a web developer doing it, a tools backend person, and then somebody that's just trying...

00:20:32.760 --> 00:20:38.520
He's a C# person that just was trying to package a front end to his tool, a Python front end.

00:20:38.520 --> 00:20:40.860
And he was like, I don't know how to do all this.

00:20:40.860 --> 00:20:43.020
And it is confusing.

00:20:43.020 --> 00:20:46.920
And it even is confusing for seasoned Python developers.

00:20:47.340 --> 00:20:48.680
And here, we've got...

00:20:48.680 --> 00:20:50.100
Oh, I didn't link it right now.

00:20:50.100 --> 00:20:59.580
But there was a Doug Hellman from Module of the Week posted that he's published lots of packages.

00:20:59.580 --> 00:21:03.820
And he went to do it again and was a little lost and wanted some advice.

00:21:03.820 --> 00:21:09.340
So new people or people that are outside of the scope are confused.

00:21:09.340 --> 00:21:12.420
And I think it's fair to recognize that.

00:21:12.420 --> 00:21:15.500
And so there's a lot of discussion around it.

00:21:15.900 --> 00:21:22.540
And Pradyan put together a blog post, was talking about it on Disqus.

00:21:22.540 --> 00:21:27.800
And he put together an article called Thoughts on the Python Packaging Ecosystem.

00:21:27.800 --> 00:21:30.920
And I think it's a kind of a fair discussion around it.

00:21:30.920 --> 00:21:37.680
And one of the points is that a lot of Python users are not software engineers.

00:21:37.680 --> 00:21:40.900
But we also have to recognize that a lot are.

00:21:40.900 --> 00:21:44.360
So it's a diverse ecosystem.

00:21:44.860 --> 00:21:47.500
And I think it's going to be a mess.

00:21:47.500 --> 00:21:48.860
It's going to be a mess for a while.

00:21:48.860 --> 00:21:50.880
And I think it's going to be...

00:21:50.880 --> 00:21:53.180
I think it's good that it's a mess in some cases.

00:21:53.180 --> 00:21:54.500
It's good that we have...

00:21:54.500 --> 00:21:56.760
We don't just have setup tools now.

00:21:56.760 --> 00:22:07.300
We have a lot of ways that are working on different pieces of the problem of, you know, how to make it easier around PyProject.atomla.

00:22:07.300 --> 00:22:09.160
And you can have a different build backend.

00:22:09.760 --> 00:22:12.400
He breaks down the points.

00:22:12.400 --> 00:22:13.920
It's a big article.

00:22:13.920 --> 00:22:22.300
But one of the things is it kind of unintentionally, the packaging ecosystem unintentionally became a competitive space that it is today.

00:22:22.980 --> 00:22:25.620
And maybe we need to make an...

00:22:25.620 --> 00:22:32.480
The community needs to make an explicit decision if we should continue operating under that model that led to what we have now.

00:22:32.480 --> 00:22:37.640
We could pick from in different tools to do in different things.

00:22:37.640 --> 00:22:40.340
That's a good model, according to this.

00:22:40.840 --> 00:22:46.860
Or in approximately the same choices to get a really bad user experience.

00:22:46.860 --> 00:22:48.880
Bad for some people, good for others.

00:22:48.880 --> 00:22:55.440
And then, you know, also maybe we should pick a default because picking a default doesn't make the other approaches illegal.

00:22:55.440 --> 00:22:57.220
They just aren't the default.

00:22:57.220 --> 00:22:59.040
And I'm kind of leaning towards that.

00:22:59.040 --> 00:23:02.120
I think it would be good to have something, but I'm not sure what.

00:23:03.580 --> 00:23:09.060
Longer down the line, pardon me, of the scroll, is pip.

00:23:09.060 --> 00:23:12.680
One of the top ideas is maybe we should have pip.

00:23:12.680 --> 00:23:14.540
Well, okay, I'll back up a little bit.

00:23:14.540 --> 00:23:18.880
Some of these tools like Poetry and PDM are workflow tools.

00:23:18.880 --> 00:23:23.560
And other tools like Flit are more build.

00:23:23.560 --> 00:23:26.500
Flit's more like I want to build, just build a wheel.

00:23:26.740 --> 00:23:31.000
It also does publish, but mostly the workload is around building the wheel.

00:23:31.000 --> 00:23:39.580
Whereas PDM and Poetry are like this whole workflow thing, control your virtual environment, do a whole bunch of stuff.

00:23:39.580 --> 00:23:51.040
And I know a lot of people from other languages like JavaScript, maybe Go, I don't know, are used to these high-end workflow things that do everything for you.

00:23:51.040 --> 00:23:56.440
But we're already used to a multi-tool model now, so I'm not sure how to get from here to there.

00:23:56.800 --> 00:23:59.440
It would be interesting to have pip do it.

00:23:59.440 --> 00:24:01.160
I mean, we already all use pip.

00:24:01.160 --> 00:24:10.980
So could pip expand to do both the focus thing it's doing now, installing a package, and then also do some workflow stuff?

00:24:10.980 --> 00:24:16.120
And I guess I'd be kind of open to explore that idea, but I was curious what you guys thought.

00:24:16.120 --> 00:24:17.360
I'd be open to explore it.

00:24:17.360 --> 00:24:22.500
Not to disparage anything, but I personally dislike the things that try to put their workflow onto you.

00:24:22.500 --> 00:24:24.880
I'd much rather have something simpler.

00:24:25.040 --> 00:24:29.280
And as someone who teaches Python, this is a huge problem for people getting into language.

00:24:29.280 --> 00:24:31.420
They feel like it's a big challenge.

00:24:31.420 --> 00:24:33.080
Why is it so hard?

00:24:33.080 --> 00:24:34.680
Why do I have to learn all these things?

00:24:34.680 --> 00:24:36.840
I picked the wrong thing, and now am I screwed?

00:24:36.840 --> 00:24:38.320
No, you're not out of luck.

00:24:38.320 --> 00:24:41.460
You just delete your virtual environment and start over.

00:24:41.460 --> 00:24:42.880
But yes, things are a little...

00:24:42.880 --> 00:24:46.860
I think having many of them, one, is a problem.

00:24:47.320 --> 00:24:53.160
And I think something that forces workflows on you, I'm not a huge fan of.

00:24:53.160 --> 00:24:57.680
I feel like we've already got lots of tools that solve it pretty well.

00:24:57.680 --> 00:25:00.560
I'm kind of not against pip doing a little bit more.

00:25:00.560 --> 00:25:04.860
I use pip-tools for managing my dependencies, and it is so good.

00:25:04.860 --> 00:25:06.580
It is so good.

00:25:06.700 --> 00:25:09.620
You state just your top-level dependencies, and when it's time to...

00:25:09.620 --> 00:25:10.300
Let's see what new.

00:25:10.300 --> 00:25:11.760
Let's make sure we upgrade to the new things.

00:25:11.760 --> 00:25:14.020
You just run pip-tools upgrade, and it'll regenerate.

00:25:14.020 --> 00:25:15.740
You can evaluate what the changes are.

00:25:15.740 --> 00:25:17.400
I really, really like pip-tools.

00:25:17.400 --> 00:25:21.320
I think it's a much simpler scenario than a lot of them.

00:25:21.320 --> 00:25:23.180
And I know other people really like it.

00:25:23.180 --> 00:25:25.040
Anyway, this is what I like.

00:25:25.040 --> 00:25:29.620
We could possibly leave pip alone and expand pip-tools to do the rest of the workflow stuff.

00:25:29.620 --> 00:25:30.540
Yes, potentially.

00:25:30.540 --> 00:25:33.140
Yeah, we could, but I kind of agree with that.

00:25:33.140 --> 00:25:38.520
Like, Unix small tools do one thing really well, which is why I've kind of gone with the

00:25:38.520 --> 00:25:42.320
pip-tools approach as well, because I really feel like pip-tools does such an incredible

00:25:42.320 --> 00:25:48.280
job at that dependency resolution and getting exactly what you need way better and way faster

00:25:48.280 --> 00:25:49.480
than pip itself does.

00:25:49.480 --> 00:25:52.280
I think that approach that, like, Flit takes, it seems like...

00:25:52.280 --> 00:25:56.740
I've never used Flit, but the fact that it can just wrap around pre-existing tools to

00:25:56.740 --> 00:26:03.680
provide a common interface for users to be able to build, package, push the whole deal

00:26:03.680 --> 00:26:08.380
seems, like, really nice because it guides them through step-by-step that process until

00:26:08.380 --> 00:26:12.080
maybe at some point they don't need it or they just enjoy it, and it's using some of those

00:26:12.080 --> 00:26:13.240
standard tools behind the scenes.

00:26:13.240 --> 00:26:13.800
Yeah.

00:26:13.800 --> 00:26:18.880
But also with Michael, I don't like the predefined workflows that, like, I'm not a huge fan of

00:26:18.880 --> 00:26:22.240
poetry necessarily because it just doesn't fit the way my brain wants.

00:26:22.240 --> 00:26:23.420
the work down a project.

00:26:23.420 --> 00:26:24.860
And I'm not surprised.

00:26:24.860 --> 00:26:31.420
So I was thinking an analogy of, like, if you're going to have a pocket knife, which tools should

00:26:31.420 --> 00:26:32.660
be in the pocket knife?

00:26:32.660 --> 00:26:36.640
And if you go into, like, the medium pocket knives on the Victorinox site...

00:26:36.640 --> 00:26:37.520
Oh, no, it won't load.

00:26:37.520 --> 00:26:38.920
You get, like, tons...

00:26:38.920 --> 00:26:39.880
Even the small ones.

00:26:39.880 --> 00:26:42.560
So the medium ones, you get, like, tons of different tools.

00:26:42.560 --> 00:26:43.760
Which tools should be there?

00:26:43.760 --> 00:26:44.800
Nobody's going to agree.

00:26:45.420 --> 00:26:49.560
And I thought, well, at least in the small ones, maybe people can agree.

00:26:49.560 --> 00:26:52.880
Because, oh, no, not even in the small ones, people can't agree.

00:26:52.880 --> 00:26:54.440
Which should go together.

00:26:54.440 --> 00:26:55.280
So, yeah.

00:26:55.280 --> 00:27:00.520
I want my Swiss Army knife to also have drywall tools and something from my car.

00:27:01.900 --> 00:27:06.460
But it seems like the combination, though, of really small tools that do one thing really

00:27:06.460 --> 00:27:11.000
well with some tools to layer on top of it, whether it's your IDE, whether it's FLIT.

00:27:11.000 --> 00:27:15.160
And you can have the opinionated workflows layered on top of it.

00:27:15.160 --> 00:27:20.720
They rest on top of a solid set of identical tools that produce the identical thing.

00:27:20.720 --> 00:27:21.200
Yeah.

00:27:21.200 --> 00:27:24.140
I'm in that camp as well.

00:27:24.140 --> 00:27:24.520
That's why.

00:27:24.520 --> 00:27:27.820
But I totally get that that's confusing for people.

00:27:27.820 --> 00:27:28.520
Oh, totally confusing.

00:27:29.040 --> 00:27:32.760
The first time I go to explain to someone how they're going to manage, like, their

00:27:32.760 --> 00:27:36.860
dependencies on a Django project, I'm like, oh, my gosh, I have to step back and think about

00:27:36.860 --> 00:27:41.760
the 20 steps that kind of go into how I learned to do this that I'm now explaining to some new

00:27:41.760 --> 00:27:42.200
person.

00:27:42.200 --> 00:27:44.780
I'm like, I'm sorry, this doesn't sound easy at all.

00:27:44.780 --> 00:27:46.420
There's got to be a better way.

00:27:46.420 --> 00:27:47.780
But I don't know if there is.

00:27:47.780 --> 00:27:48.300
Yeah.

00:27:48.300 --> 00:27:49.300
Anyway.

00:27:49.300 --> 00:27:49.880
Okay.

00:27:49.880 --> 00:27:51.260
Rabbit hole.

00:27:51.260 --> 00:27:51.760
But.

00:27:51.760 --> 00:27:52.420
Oh, totally.

00:27:52.420 --> 00:27:56.180
I mean, Python packaging is the ultimate rabbit hole in the Python community.

00:27:56.180 --> 00:27:56.740
Yeah.

00:27:56.740 --> 00:27:58.040
Speaking of packages.

00:27:58.040 --> 00:27:58.200
Packages.

00:27:58.200 --> 00:28:01.760
Michael, do you want to jump into yours?

00:28:01.760 --> 00:28:03.600
I do want to talk about more packages.

00:28:03.600 --> 00:28:07.500
This is the simplified version, but also a bit of real time follow up as well.

00:28:07.500 --> 00:28:13.780
Again, I'm having many of the folks that were on that discuss thread that you mentioned,

00:28:13.780 --> 00:28:18.960
Brian, about this topic on Talk Python probably in a couple of weeks as a big panel discussion

00:28:18.960 --> 00:28:19.280
about it.

00:28:19.280 --> 00:28:24.360
So if you all want to hear more of this, but for a long time with the folks who are participating

00:28:24.360 --> 00:28:25.580
and dive on in.

00:28:25.580 --> 00:28:26.720
Okay.

00:28:26.720 --> 00:28:32.020
Oh, also, apparently, I said chat GTP, right?

00:28:32.020 --> 00:28:35.980
And I meant ChatGPT, as Sharaf pointed out.

00:28:35.980 --> 00:28:36.640
So thanks for that.

00:28:36.640 --> 00:28:38.060
That's the one I meant.

00:28:38.060 --> 00:28:38.860
You know the one.

00:28:38.860 --> 00:28:39.120
All right.

00:28:39.160 --> 00:28:44.880
So there's this cool GitHub page, I guess, called Top PyPI Packages.

00:28:44.880 --> 00:28:47.780
And so this is a pretty neat place.

00:28:47.780 --> 00:28:53.600
It shows you the top 5,000 most downloaded PyPI packages updated monthly.

00:28:53.880 --> 00:28:59.840
So you can scroll down here and you can say, show me the top 100, show me the top 1,000 or

00:28:59.840 --> 00:29:00.100
whatever.

00:29:00.100 --> 00:29:02.340
I'll pull up the 1,000 for you, Brian.

00:29:02.340 --> 00:29:03.060
There you go.

00:29:03.060 --> 00:29:05.620
So these are updated over the last 30 days.

00:29:05.620 --> 00:29:07.380
And it actually says when it was last updated.

00:29:07.380 --> 00:29:11.360
And that was February 1st, which is a week ago as of this recording.

00:29:11.360 --> 00:29:12.800
So that's pretty fresh, really.

00:29:13.520 --> 00:29:16.860
And so you can find things like pytestCheck.

00:29:16.860 --> 00:29:18.040
Is that in here somewhere, Brian?

00:29:18.040 --> 00:29:21.820
It's in the top 5,000, but not the top 1,000.

00:29:21.820 --> 00:29:22.520
Oh, okay.

00:29:22.520 --> 00:29:23.360
Did I get the wrong one?

00:29:23.360 --> 00:29:23.640
Sorry.

00:29:23.640 --> 00:29:24.700
I tried to pull you up there.

00:29:24.700 --> 00:29:29.860
But you see things like Boto3 and URLlib are the most popular.

00:29:29.860 --> 00:29:38.180
So Boto3 is downloaded 522 million times every month, every 30 days or so, which is just insane.

00:29:38.580 --> 00:29:44.920
You got to be careful because some of these are really popular dependencies rather than directly really important libraries.

00:29:44.920 --> 00:29:49.700
Like I use Boto3 all the time as a dependency, less often directly.

00:29:49.700 --> 00:29:53.960
Definitely for URLlib3, I don't think I've ever used it directly, but obviously it gets installed.

00:29:53.960 --> 00:29:55.340
But I'm going to use many things.

00:29:55.340 --> 00:29:58.120
So this is pretty cool if people want to check it out.

00:29:58.120 --> 00:29:59.020
Calvin, what do you think?

00:29:59.020 --> 00:30:08.440
Oh, I'm excited about this too because just thinking about the number of times the Amazon cloud must go download Boto3 from PyPy.

00:30:08.440 --> 00:30:10.140
Mind-blowing.

00:30:10.140 --> 00:30:15.540
Like there's all the serverless that's on server someplace downloading packages in the background.

00:30:15.540 --> 00:30:18.100
Now you get a feel for it with a big number.

00:30:18.100 --> 00:30:24.640
Yeah, it's really nuts, which is also a little bit ironic because it comes from AWS and they send it over to PyPI and then it comes back to AWS.

00:30:24.640 --> 00:30:28.640
It's a weird world.

00:30:28.640 --> 00:30:31.860
Don't they use Fastly for their CDN?

00:30:31.860 --> 00:30:32.920
I think they use Fastly.

00:30:32.920 --> 00:30:34.340
PyPI?

00:30:34.340 --> 00:30:34.880
Yeah.

00:30:34.880 --> 00:30:35.940
I believe so.

00:30:36.300 --> 00:30:36.500
Yeah.

00:30:36.500 --> 00:30:39.120
It's like they have to go to a competitor to get like...

00:30:39.120 --> 00:30:39.920
Yes, exactly.

00:30:39.920 --> 00:30:41.540
Yeah.

00:30:41.540 --> 00:30:42.120
How interesting.

00:30:42.120 --> 00:30:44.200
So this is interesting in and of itself.

00:30:44.200 --> 00:30:45.380
And it tells you which ones are there.

00:30:45.380 --> 00:30:46.980
And there's an API which you can hit.

00:30:46.980 --> 00:30:48.280
Let's not hit the minified one.

00:30:48.280 --> 00:30:49.660
Let's hit the non-minified one.

00:30:50.000 --> 00:30:55.280
And it'll tell you actually returns when it was updated, what the query was, et cetera, et cetera.

00:30:55.280 --> 00:30:58.820
And so you actually can get this as a JSON endpoint, which is pretty cool.

00:30:58.820 --> 00:31:04.420
It's just a static file that gets updated every couple of days on this GitHub page setup.

00:31:04.420 --> 00:31:06.960
So that's also an interesting way to think of an API.

00:31:06.960 --> 00:31:10.160
My API is a static file that periodically gets refreshed.

00:31:10.160 --> 00:31:11.120
But there it is.

00:31:11.120 --> 00:31:12.980
So you don't have to go hard on much there.

00:31:13.480 --> 00:31:14.400
I kind of love it, though.

00:31:14.400 --> 00:31:15.680
I kind of do, too.

00:31:15.680 --> 00:31:16.760
Just a static file.

00:31:16.760 --> 00:31:17.320
Yeah.

00:31:17.320 --> 00:31:18.240
Yeah.

00:31:18.240 --> 00:31:20.120
Think how scalable that bad boy is.

00:31:20.120 --> 00:31:20.440
Okay.

00:31:20.440 --> 00:31:22.540
Especially if you put a CD in behind it.

00:31:23.380 --> 00:31:31.100
And then related to that by the same person, there is Hugovic top PyPI packages on GitHub,

00:31:31.100 --> 00:31:34.940
which is a regular dump of the most downloaded packages from PyPI.

00:31:34.940 --> 00:31:38.060
So that sounds like, yeah, Michael, you told us about that.

00:31:38.060 --> 00:31:38.940
Thanks a bunch.

00:31:38.940 --> 00:31:41.480
No, it's not the names.

00:31:41.480 --> 00:31:42.820
It's all of it.

00:31:42.820 --> 00:31:46.300
It's all of the data that is here.

00:31:46.300 --> 00:31:47.780
Where do they have it?

00:31:47.780 --> 00:31:48.180
This one?

00:31:48.180 --> 00:31:49.400
I don't know if I want to open this up.

00:31:49.400 --> 00:31:50.820
But it's really big.

00:31:50.820 --> 00:31:52.780
So it's all the XML.

00:31:52.780 --> 00:31:54.540
I'm not sure where it is in here.

00:31:54.540 --> 00:31:58.540
But it's all the XML files of, or rather, XML.

00:31:58.540 --> 00:32:01.300
The JSON files that Untangle got me thinking XML.

00:32:01.300 --> 00:32:06.580
So it's all the JSON files of what comes out of the PyPI API.

00:32:06.580 --> 00:32:07.760
But all of them.

00:32:07.760 --> 00:32:12.360
It's when I checked it out and unzipped it, and it was like 22 gigs on disk.

00:32:12.360 --> 00:32:16.820
So this is a big beast right here if you download it.

00:32:16.820 --> 00:32:18.420
Actually, no, this is not the right link.

00:32:18.420 --> 00:32:19.640
I'll have to find it.

00:32:19.640 --> 00:32:20.960
I'll put it in the show notes.

00:32:20.960 --> 00:32:23.060
But there's this guy.

00:32:23.060 --> 00:32:23.580
Darn it.

00:32:23.580 --> 00:32:24.720
This is the wrong one.

00:32:24.720 --> 00:32:29.860
But there's also, linked off of this, there's one where you get all of the packages, which

00:32:29.860 --> 00:32:31.940
is all the JSON for every package.

00:32:31.940 --> 00:32:33.940
I'll have to figure out where I got that from, unfortunately.

00:32:33.940 --> 00:32:35.580
It's the wrong link I pulled up.

00:32:35.580 --> 00:32:38.160
But anyway, these are both really cool resources.

00:32:38.160 --> 00:32:40.420
And you'll have to check the links for that other one.

00:32:40.420 --> 00:32:40.960
Cool.

00:32:40.960 --> 00:32:41.260
Yeah, definitely.

00:32:41.260 --> 00:32:41.820
Yeah.

00:32:41.820 --> 00:32:42.820
All right.

00:32:42.820 --> 00:32:43.680
Calum?

00:32:43.680 --> 00:32:48.800
Coming in at 57 on that list for the last 30 days is SQLAlchemy.

00:32:49.640 --> 00:32:53.540
So for those of you who aren't familiar and do like Swiss Army Knives, this is the Swiss

00:32:53.540 --> 00:32:55.000
Army Knife of database tools.

00:32:55.000 --> 00:32:59.640
It's not only an ORM, but it has a whole SQL toolkit built into it.

00:32:59.640 --> 00:33:03.140
So if you've never touched SQLAlchemy, but do deal with databases, you may want to check

00:33:03.140 --> 00:33:03.560
this out.

00:33:03.880 --> 00:33:07.780
And more importantly, and this kind of ties in with my previous announcement on the mypy

00:33:07.780 --> 00:33:08.960
1.0 release.

00:33:08.960 --> 00:33:13.400
There's a lot more support in this release for types and typing.

00:33:13.400 --> 00:33:18.580
So there's kind of native out of the box mypy experience has been improved.

00:33:18.580 --> 00:33:24.120
Now, the author of SQLAlchemy, Mike Baer, is actually going to be joining us in a few weeks

00:33:24.120 --> 00:33:29.140
here at Python Web Conference and giving a tutorial length session on SQLAlchemy.

00:33:29.140 --> 00:33:32.120
He did this last time two years ago when he released 1.4.

00:33:32.560 --> 00:33:36.780
So for those of you who've kind of been following along in the background, the 1.4 release was

00:33:36.780 --> 00:33:41.880
kind of the first half of this major revamp of SQLAlchemy into this new world.

00:33:41.880 --> 00:33:44.820
And so 2.0 is the second half of that revamp.

00:33:44.820 --> 00:33:49.700
So it's really been like four years coming for this major release of SQLAlchemy.

00:33:49.700 --> 00:33:53.680
So if you want to know what's new and hear it from the horse's mouth, Mike Baer is going

00:33:53.680 --> 00:33:57.280
to be joining us and he'll be happy to answer all of your questions.

00:33:57.280 --> 00:33:58.060
Let's see.

00:33:58.060 --> 00:34:01.240
There's a ton of new things released in here.

00:34:01.240 --> 00:34:03.060
I think if I scroll down.

00:34:03.060 --> 00:34:03.520
Yeah.

00:34:03.520 --> 00:34:08.020
So plugin free, 484 compatible ORM syntaxes.

00:34:08.020 --> 00:34:10.160
So again, kind of ripping out the old stuff.

00:34:10.160 --> 00:34:14.140
All the typing support in here is all fresh.

00:34:14.140 --> 00:34:20.580
If you are using the mypy plugins from before, you're going to want to take all those out.

00:34:20.580 --> 00:34:22.640
They're considered deprecated at this point.

00:34:22.900 --> 00:34:25.520
So that's something that's very important for you to consider.

00:34:25.520 --> 00:34:31.740
But now SQLAlchemy 2.0 is using all the new Python 3.0 wonderfulness of like data classes,

00:34:31.740 --> 00:34:33.420
enums, inline annotations.

00:34:33.420 --> 00:34:38.120
It's just really a nice modernization of a really powerful package.

00:34:38.120 --> 00:34:39.740
See what else was in here?

00:34:39.740 --> 00:34:41.220
There was a super importance.

00:34:41.220 --> 00:34:42.720
Oh yeah, some performance stuff.

00:34:42.720 --> 00:34:48.260
So this all new fully integrated ORM approach to bulk inserts is quite interesting.

00:34:48.260 --> 00:34:52.520
You will get a major speed increase, except if you're using MySQL.

00:34:52.520 --> 00:34:57.300
The MySQL folks have not implemented the insert returning syntax.

00:34:57.300 --> 00:34:59.380
But if you're on MariaDB, you're good to go.

00:34:59.380 --> 00:35:01.300
So that's something to pay attention to.

00:35:01.300 --> 00:35:06.260
In addition to that performance, there's also the bulk optimized schema reflection.

00:35:06.260 --> 00:35:12.320
So if you were using SQLAlchemy, it was basically doing a table by table reflection.

00:35:12.320 --> 00:35:15.180
If you were asking it for metadata about the tables.

00:35:15.180 --> 00:35:18.940
Now in all of the backends, there is basically a...

00:35:18.940 --> 00:35:20.420
Oh, sorry.

00:35:20.420 --> 00:35:22.680
I think it's only for Postgres and Oracle right now.

00:35:22.680 --> 00:35:26.420
So Postgres and Oracle support the bulk schema upgrades.

00:35:26.420 --> 00:35:29.680
You can see right here for Postgres, a 250% improvement.

00:35:29.680 --> 00:35:32.640
And for Oracle, a 900% improvement.

00:35:32.640 --> 00:35:36.240
I'm not sure what it was doing before, but it's a heck of a lot faster now.

00:35:36.240 --> 00:35:37.640
At 900% improvement.

00:35:37.640 --> 00:35:39.380
Always a benefit there.

00:35:39.380 --> 00:35:44.440
And in addition, I'll kind of point out some of the things that were in the migration guide

00:35:44.440 --> 00:35:45.940
and the what's new in 2.0 guide.

00:35:45.940 --> 00:35:48.660
You're going to want to make sure you check those out here.

00:35:48.660 --> 00:35:52.040
There's like the migration process linked from this article or blog post.

00:35:52.040 --> 00:35:55.780
You're going to want to make sure you read through those because there's major incompatibilities

00:35:55.780 --> 00:35:57.520
from 1.4 into 2.0.

00:35:57.680 --> 00:36:03.420
But the migration guide is really similar to like the 2 to 3 guide Python had.

00:36:03.420 --> 00:36:07.400
Tells you how to mechanically go through and make sure you're going to be compatible for

00:36:07.400 --> 00:36:08.740
the latest version of SQLAlchemy.

00:36:08.740 --> 00:36:14.520
Another speed improvement here is that all the native C extensions have been ported to Cython.

00:36:14.520 --> 00:36:16.100
Some of them are...

00:36:16.100 --> 00:36:17.380
They're all as fast.

00:36:17.380 --> 00:36:20.460
Some of them are slightly faster than their previous C extensions.

00:36:20.460 --> 00:36:26.020
But this also removes risks of memory corruption and stomping on each other and things that

00:36:26.020 --> 00:36:28.380
C does really well that you don't want.

00:36:28.380 --> 00:36:29.940
So that's also a nice benefit.

00:36:29.940 --> 00:36:36.040
And then the kind of tying into that same benefit is the SQLAlchemy is now PEP 5.17 enabled.

00:36:36.040 --> 00:36:41.220
So that means the PyProject.toml file that we just saw in the last couple of announcements

00:36:41.220 --> 00:36:46.420
is supported, which means when you're on your local machine and doing a source build of SQL

00:36:46.420 --> 00:36:51.080
Alchemy, it can automatically go grab some of the dependencies such as Cython, which can

00:36:51.080 --> 00:36:52.480
be tricky to get installed for some people.

00:36:52.480 --> 00:36:57.400
So that is simplifying a lot of people's lives to go to SQLAlchemy 2.0.

00:36:57.400 --> 00:36:59.960
Yeah, SQLAlchemy 2.0 is a huge release.

00:36:59.960 --> 00:37:01.180
Yeah, it's a big deal.

00:37:01.180 --> 00:37:02.980
It's been years in the coming.

00:37:02.980 --> 00:37:08.240
And then it was in this intermediate 1.4 mode where you could choose either API and

00:37:08.240 --> 00:37:09.960
they finally removed some things.

00:37:09.960 --> 00:37:12.080
But to me, the biggest deal is the async.

00:37:12.080 --> 00:37:12.640
Yeah.

00:37:12.640 --> 00:37:13.220
Right.

00:37:13.220 --> 00:37:17.440
It's in the prior versions, there was just no way to do any async things, which meant

00:37:17.440 --> 00:37:22.480
on all the scalable areas, you were kind of stuck trying to find somewhere else to go.

00:37:22.480 --> 00:37:25.300
Now, if you really like SQLAlchemy, you can just use the async API.

00:37:25.300 --> 00:37:25.860
Yeah.

00:37:25.860 --> 00:37:29.960
I think a lot of people are going to benefit from those types, all the type support in mypy

00:37:29.960 --> 00:37:30.700
native support.

00:37:30.700 --> 00:37:31.620
Yeah, absolutely.

00:37:31.620 --> 00:37:32.840
And game back to your editor.

00:37:32.840 --> 00:37:36.060
The Vulcan search have always been a hassle in ORMs.

00:37:36.060 --> 00:37:39.140
So it sounds like that's really gotten a lot of love too.

00:37:39.140 --> 00:37:40.160
Yeah, definitely.

00:37:40.160 --> 00:37:41.220
I look forward to it.

00:37:41.220 --> 00:37:43.060
I do as well.

00:37:43.060 --> 00:37:44.460
All right.

00:37:44.460 --> 00:37:46.920
Well, that's all of our topics.

00:37:46.920 --> 00:37:49.340
Brian, what do you got for us as an extra?

00:37:49.340 --> 00:37:55.200
I guess just one quick extra is like one of the things I've been working on the side

00:37:55.200 --> 00:38:00.380
is I'm going to create a new build backend for Python and a new workflow tool.

00:38:00.380 --> 00:38:01.820
No.

00:38:01.820 --> 00:38:04.320
I'm not.

00:38:04.320 --> 00:38:06.520
But what will you name it?

00:38:08.140 --> 00:38:12.860
Well, I think flick because I always thought flit should have been flick.

00:38:12.860 --> 00:38:14.940
So like a little football.

00:38:14.940 --> 00:38:15.740
So yeah.

00:38:15.740 --> 00:38:16.280
There you go.

00:38:16.280 --> 00:38:19.200
So how about let's go to Calvin's extras?

00:38:19.200 --> 00:38:19.720
Yeah.

00:38:20.000 --> 00:38:20.320
Sure.

00:38:20.320 --> 00:38:24.600
So I kind of mentioned this in the intro, but we are putting on the Python Web Conference.

00:38:24.600 --> 00:38:26.380
This will be our fifth annual.

00:38:26.720 --> 00:38:28.460
So big five years.

00:38:28.460 --> 00:38:31.200
I'm wearing one of the jerseys from last year.

00:38:31.200 --> 00:38:34.600
You can't see it, but it was really awesome last year.

00:38:34.600 --> 00:38:35.700
We had 90 speakers.

00:38:35.700 --> 00:38:42.640
We had, I think it was over 400 attendees, something like 23 or 22 time zones.

00:38:42.640 --> 00:38:44.340
Like it was really a global event.

00:38:44.340 --> 00:38:46.160
That's one of the things I'm really proud of.

00:38:46.160 --> 00:38:51.140
This event was meant to fill a hole, I felt like, in the Python community for folks who couldn't

00:38:51.140 --> 00:38:55.940
travel, couldn't afford to go to an in-person conference or wasn't a regional conference near

00:38:55.940 --> 00:38:56.240
them.

00:38:56.660 --> 00:38:59.500
I know the PSF is doing a lot of work right now and getting some regional conferences into

00:38:59.500 --> 00:39:05.040
other areas, but this is still, and will always be virtual and always be accessible to folks.

00:39:05.040 --> 00:39:09.720
So if you go and register and you can't afford to pay for this, we do have a grant program.

00:39:09.720 --> 00:39:13.900
We want to make sure that if you have a need to be in this room, you should be in this room

00:39:13.900 --> 00:39:15.140
and everyone is included.

00:39:15.140 --> 00:39:16.780
This year is going to be no exception.

00:39:16.780 --> 00:39:19.060
There's a lot of amazing speakers who have joined us.

00:39:19.060 --> 00:39:22.820
It'll be five half days from the 13th to the 17th.

00:39:22.820 --> 00:39:26.160
There'll be a keynote speaker kickoff every day, a keynote speaker at the end of every day.

00:39:26.600 --> 00:39:28.100
And there's some awesome speakers coming up.

00:39:28.100 --> 00:39:29.440
We've got some people from GitLab.

00:39:29.440 --> 00:39:34.740
We've been focusing on finding some folks from climate initiatives to actually come and give

00:39:34.740 --> 00:39:38.340
some of our talks where they're using technology for good in these areas.

00:39:38.340 --> 00:39:40.340
There'll be a set of tutorials as well.

00:39:40.340 --> 00:39:45.040
So I mentioned Mike Baer's tutorial already, but there'll be three or four other tutorials

00:39:45.040 --> 00:39:45.940
as well.

00:39:46.440 --> 00:39:49.580
I know Matt Harrison is going to be giving one of the tutorial, not tutorial, he'll be

00:39:49.580 --> 00:39:51.100
giving a keynote this year.

00:39:51.100 --> 00:39:53.940
So he's back again from last year.

00:39:53.940 --> 00:39:55.380
He gave a keynote and a tutorial.

00:39:55.380 --> 00:39:57.380
Man's the hardest working man in Python.

00:39:58.280 --> 00:40:01.040
But we really appreciate him joining us as well.

00:40:01.040 --> 00:40:05.200
And if you've got questions, make sure you just go to pythonwebconf.com.

00:40:05.200 --> 00:40:08.200
You can also find me on CalvinHP on Twitter.

00:40:08.200 --> 00:40:10.600
There's also a Twitter account for Python Web Conf.

00:40:10.600 --> 00:40:14.420
So you can follow Python Web Conf on all the socials and join us.

00:40:14.420 --> 00:40:16.620
There'll be socials actually during the event as well.

00:40:16.620 --> 00:40:17.800
So it should be tons of fun.

00:40:17.800 --> 00:40:20.960
We'll have just everything for the community.

00:40:21.140 --> 00:40:22.800
So I have a question right off the bat.

00:40:22.800 --> 00:40:24.360
It says webconf.

00:40:24.360 --> 00:40:27.480
If I'm not a web developer, am I still going to be interested in this?

00:40:27.480 --> 00:40:28.960
Or is it primarily web development?

00:40:28.960 --> 00:40:30.480
That's an excellent question, Brian.

00:40:30.480 --> 00:40:35.340
We originally, the webconf name meant a conference for web people.

00:40:35.340 --> 00:40:40.020
But we switched it around, you know, because we felt like this was an opportunity for the

00:40:40.020 --> 00:40:42.120
conference for Python to be on the web.

00:40:42.120 --> 00:40:45.820
And now we have app dev track, which is like not more than just web.

00:40:45.820 --> 00:40:47.100
We'll have a cloud track.

00:40:47.100 --> 00:40:49.480
We will have a PyData track.

00:40:49.580 --> 00:40:53.700
It's actually officially sanctioned PyData event.

00:40:53.700 --> 00:40:56.700
And we have a culture track in addition to the tutorial.

00:40:56.700 --> 00:41:00.220
So there is actually something for everybody in the Python world here.

00:41:00.220 --> 00:41:04.380
And we're really trying to, again, I mentioned filling the gap for people who can't make it

00:41:04.380 --> 00:41:05.200
to specific conferences.

00:41:05.200 --> 00:41:09.820
We're also trying to fill the gap for talks that I feel are a little more on the intermediate

00:41:09.820 --> 00:41:11.920
to advanced level.

00:41:11.920 --> 00:41:16.200
If you're looking for very entry-level tutorials, this may not be the conference for you.

00:41:16.200 --> 00:41:18.760
I mean, there'll be great community, lots of questions you can ask.

00:41:19.020 --> 00:41:19.660
There'll be tutorials.

00:41:19.660 --> 00:41:24.240
But I really wanted to make sure that the talks kind of scaled up that next notch.

00:41:24.240 --> 00:41:30.120
When I go to a lot of regional conferences or even PyCon, there's some entry-level stuff

00:41:30.120 --> 00:41:31.920
there that's great for people who are new to Python.

00:41:31.920 --> 00:41:33.720
This is that next step.

00:41:33.720 --> 00:41:34.160
Cool.

00:41:34.160 --> 00:41:39.020
I don't need to cut you off, but can we see if Michael's got any extras?

00:41:39.460 --> 00:41:39.660
Yeah.

00:41:39.660 --> 00:41:39.760
Yeah.

00:41:39.760 --> 00:41:40.660
I do.

00:41:40.660 --> 00:41:46.380
One, while Calvin's thing is up, I'm going to be speaking at that there conference about

00:41:46.380 --> 00:41:49.140
making your Python web apps fly with CDNs.

00:41:49.140 --> 00:41:50.300
Speaking of CDNs earlier.

00:41:50.300 --> 00:41:51.840
So I'm really excited about that one.

00:41:51.840 --> 00:41:52.620
That's a fun topic.

00:41:53.520 --> 00:41:56.280
But I want to tell you a couple tips and tricks.

00:41:56.280 --> 00:41:58.740
I'll keep these short here, but they're kind of fun.

00:41:58.740 --> 00:42:06.540
So I recently discovered that with many of the browsers like Vivaldi or Chrome, sadly not

00:42:06.540 --> 00:42:06.900
Firefox.

00:42:06.900 --> 00:42:09.140
Honestly, that's one of the reasons I quit using Firefox.

00:42:09.140 --> 00:42:12.620
They support progressive web apps, which many people may know.

00:42:12.800 --> 00:42:18.300
But even if you have a thing that is not a progressive web app, you can install it as a standalone,

00:42:18.300 --> 00:42:21.620
from your perspective, application that lives in the dock.

00:42:21.620 --> 00:42:26.100
So the thing I got on my screen and I linked to in the show notes is here's my Vivaldi, but

00:42:26.100 --> 00:42:28.520
then I have my different mail clients.

00:42:28.520 --> 00:42:31.180
I got ProtonMail and Gmail and I got the Google Calendar.

00:42:31.180 --> 00:42:33.340
All of those are just regular web apps.

00:42:33.340 --> 00:42:35.420
I don't think any of them are progressive web apps.

00:42:35.420 --> 00:42:39.000
But if you right click on the tab, you say create shortcut and say open in a window, they

00:42:39.000 --> 00:42:43.340
become their own little app that you put in your dock or your taskbar or whatever.

00:42:43.340 --> 00:42:47.260
So for example, like here's ProtonMail running.

00:42:47.260 --> 00:42:49.840
You can see, again, link in the show notes to the picture.

00:42:49.840 --> 00:42:51.180
And it just looks like an app.

00:42:51.180 --> 00:42:52.260
Like you would know it was an app.

00:42:52.260 --> 00:42:54.680
You'd think it was an ElectronJS app, basically.

00:42:54.680 --> 00:42:59.460
So if you want to have those as separate things, you're going to have running an Alt-Tab or Control-Tab

00:42:59.460 --> 00:43:00.000
over to you.

00:43:00.000 --> 00:43:00.660
There you go.

00:43:00.660 --> 00:43:03.040
Oh, no, I closed my browser and my mail's gone again.

00:43:03.040 --> 00:43:04.080
I got to open it back up.

00:43:04.080 --> 00:43:06.420
If that ever frustrates you, here's a cool fix for it.

00:43:06.420 --> 00:43:07.220
All right.

00:43:08.000 --> 00:43:10.700
Also, speaking of Proton, I started using SimpleLogin.

00:43:10.700 --> 00:43:11.920
Have either of you all used this?

00:43:11.920 --> 00:43:12.440
No.

00:43:12.440 --> 00:43:17.480
So I have a pro account at Proton, which is like, I don't know, a couple dollars a month

00:43:17.480 --> 00:43:20.220
for a bunch of years if you pay away in advance, I think.

00:43:20.220 --> 00:43:21.840
It's not very much.

00:43:21.840 --> 00:43:26.120
But along with that comes this thing called SimpleLogin, which every time you go to a

00:43:26.120 --> 00:43:30.280
website, I don't think I have the extension in this profile in my browser.

00:43:30.400 --> 00:43:35.520
But if you go to a website, it suggests, hey, we'll create an automatic fake one-off email

00:43:35.520 --> 00:43:38.060
address that gets sent to wherever you decide it gets sent to.

00:43:38.060 --> 00:43:42.120
And you can reply to it and it goes back through there and things like that.

00:43:42.120 --> 00:43:42.600
It's really cool.

00:43:42.600 --> 00:43:48.880
So if I went to arstechnica.com and I created it, it would be like some random thing at

00:43:48.880 --> 00:43:53.240
arstechnica-simple-logon-ish.io or whatever.

00:43:53.240 --> 00:43:54.920
So you kind of know where it comes from.

00:43:54.920 --> 00:43:59.780
But if you want to just delete that and make it mail stop or you can figure out if it's sold

00:43:59.780 --> 00:44:00.060
or whatever.

00:44:00.060 --> 00:44:02.800
So anyway, recommendation on checking that as well.

00:44:02.800 --> 00:44:04.540
It's also open source.

00:44:04.620 --> 00:44:07.600
You can host it yourself if you like hosting email.

00:44:07.600 --> 00:44:11.100
I don't really feel like doing that.

00:44:11.100 --> 00:44:17.000
If you've heard about a new topic, if you've heard about all the crazy stuff with chips,

00:44:17.000 --> 00:44:20.500
the Chips Act in the US, similar stuff in Europe.

00:44:20.500 --> 00:44:26.980
If you've heard about Biden banning chips or the US government banning chips to be used in

00:44:26.980 --> 00:44:29.520
certain things, primarily in China.

00:44:29.520 --> 00:44:34.380
But there's a bunch of angles in which this kind of stuff is heating up.

00:44:34.420 --> 00:44:37.640
Not just with the US, but primarily around the US.

00:44:37.640 --> 00:44:44.400
There's an incredibly good documentary on YouTube called US vs. China, The War You Can't See

00:44:44.400 --> 00:44:46.180
that talks about the history of this.

00:44:46.180 --> 00:44:49.960
And it just reminds me of how much good stuff there is on YouTube.

00:44:49.960 --> 00:44:54.320
I mean, I know there's a lot of stupid cats falling off of chairs and like idiots.

00:44:54.320 --> 00:44:56.840
But hidden in there, there are some...

00:44:56.840 --> 00:45:02.140
This is a better documentary than you would find on professional top tier television networks.

00:45:02.140 --> 00:45:03.940
It's really good.

00:45:04.220 --> 00:45:06.340
Anyway, if that's interesting to you.

00:45:06.340 --> 00:45:09.200
I will second that documentary note.

00:45:09.200 --> 00:45:13.840
I have a 15-year-old here who's obsessed with long form YouTube.

00:45:13.840 --> 00:45:16.300
And some of the things he has shown me has just blown my mind.

00:45:16.300 --> 00:45:20.060
Like why the superconducting super collider didn't succeed.

00:45:20.060 --> 00:45:22.600
Eight hours of like documentary on that.

00:45:22.600 --> 00:45:23.400
I was like, what?

00:45:23.900 --> 00:45:25.800
Yeah, there is no more Discovery Channel.

00:45:25.800 --> 00:45:27.120
There's no more History Channel.

00:45:27.120 --> 00:45:27.700
Yeah.

00:45:27.700 --> 00:45:31.700
I know they exist in name, but not in what they were, where they actually have real science and

00:45:31.700 --> 00:45:32.340
real information.

00:45:32.340 --> 00:45:34.900
They're just reality TV and other silly stuff.

00:45:34.900 --> 00:45:36.340
So, all right.

00:45:36.340 --> 00:45:37.680
I know we'll get short on time, Brian.

00:45:37.680 --> 00:45:38.880
So, I'll go quick.

00:45:38.880 --> 00:45:40.720
Talk Python's hiring.

00:45:41.020 --> 00:45:46.480
So, I'm looking to hire somebody that does Flutter and Dart, not Python.

00:45:46.480 --> 00:45:48.080
Because if it's Python, I'd be doing it myself.

00:45:48.080 --> 00:45:52.820
But if you're out there and you have experience with publishing apps and Flutter apps in particular

00:45:52.820 --> 00:45:59.100
to the various app stores, if you're used to working on like Android and iOS and others with Flutter,

00:45:59.100 --> 00:46:02.580
and you can show me an app in the app store, I would love to work with you.

00:46:02.580 --> 00:46:07.180
I'm going to post this somewhere pretty soon, but I want to put it out to the community first

00:46:07.180 --> 00:46:11.000
because I'd rather hire somebody from our community than just some random person off the internet.

00:46:11.000 --> 00:46:15.940
And it's primarily to do a complete rework of our mobile apps for Talk Python training.

00:46:15.940 --> 00:46:17.280
So, that'll be a lot of fun.

00:46:17.280 --> 00:46:22.100
If people are interested, just email me, michael at talkpython.fm.

00:46:22.100 --> 00:46:23.620
That's it.

00:46:23.620 --> 00:46:24.640
Those are all my extras.

00:46:24.640 --> 00:46:25.260
Yeah.

00:46:25.260 --> 00:46:25.960
Nice.

00:46:25.960 --> 00:46:28.100
Calvin, thanks for being here.

00:46:28.100 --> 00:46:29.320
Thanks for having me.

00:46:29.320 --> 00:46:30.680
I really enjoy it.

00:46:30.680 --> 00:46:31.320
It's lots of fun.

00:46:31.320 --> 00:46:33.280
I get to go learn new things each time I come.

00:46:33.280 --> 00:46:36.020
Yeah, we do every time we show up as well.

00:46:36.020 --> 00:46:36.480
It's a lot of fun.

00:46:36.480 --> 00:46:36.600
Yep.

00:46:36.600 --> 00:46:36.980
All right.

00:46:36.980 --> 00:46:38.040
And Brian, thanks as always.

00:46:38.040 --> 00:46:38.700
Thank you.

