WEBVTT

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

00:00:05.160 --> 00:00:10.400
This is episode 401, recorded September 16th, 2024.

00:00:10.400 --> 00:00:11.680
And I'm Brian Okken.

00:00:11.680 --> 00:00:12.680
And I'm Michael Kennedy.

00:00:12.680 --> 00:00:15.380
And this episode is brought to you by Scout APM.

00:00:15.380 --> 00:00:17.760
Check out their section later in the show.

00:00:17.760 --> 00:00:23.520
Connect with us, Michael, Brian, or the show at fosstodon.org.

00:00:23.520 --> 00:00:26.240
But any Mastodon will work.

00:00:26.520 --> 00:00:31.460
But the links are, we're all on Fosstodon, M. Kennedy, Brian Okken, and Python Bytes.

00:00:31.460 --> 00:00:33.240
And of course, those are in the show notes.

00:00:33.240 --> 00:00:38.400
And if you'd like to join the show live, head to pythonbytes.fm/live.

00:00:38.400 --> 00:00:39.960
It's fun to do it at least once.

00:00:39.960 --> 00:00:40.540
Check it out.

00:00:40.540 --> 00:00:43.780
See what it's like to watch us in real time.

00:00:43.780 --> 00:00:47.220
And we're going to try something new today.

00:00:47.220 --> 00:00:48.740
We're streaming on X.

00:00:48.740 --> 00:00:49.340
No?

00:00:49.340 --> 00:00:50.980
We're trying to stream on X.

00:00:50.980 --> 00:00:54.080
But when I hit go, it actually said you need a premium account.

00:00:54.080 --> 00:00:55.520
So maybe we'll try that next week.

00:00:55.520 --> 00:00:56.100
Oh, never mind.

00:00:56.100 --> 00:00:56.760
See people in wrestling.

00:00:56.760 --> 00:00:58.380
Or maybe we won't do it at all.

00:00:58.380 --> 00:00:58.760
I don't know.

00:00:58.760 --> 00:00:59.360
YouTube's good.

00:00:59.360 --> 00:01:02.940
Okay.

00:01:02.940 --> 00:01:05.280
And Michael even said to keep that quiet.

00:01:05.280 --> 00:01:06.780
But just, you know, sorry.

00:01:06.780 --> 00:01:07.920
I was pretty excited.

00:01:07.920 --> 00:01:08.380
All right.

00:01:08.380 --> 00:01:08.640
I know.

00:01:08.640 --> 00:01:09.600
Well, we'll try it out.

00:01:09.600 --> 00:01:12.440
I think, you know, reaching more people, letting them participate is great.

00:01:12.440 --> 00:01:13.680
And we can give it a try.

00:01:13.960 --> 00:01:18.160
And, you know, we've told people that we both have courses and there's other stuff.

00:01:18.160 --> 00:01:20.840
But we're going to, there's a treat at the end.

00:01:20.840 --> 00:01:25.480
If you wait until the end of the show, we've got some extras that we're going to talk about

00:01:25.480 --> 00:01:26.780
with some of the courses.

00:01:27.000 --> 00:01:27.600
It's pretty exciting.

00:01:27.600 --> 00:01:29.660
So, but that's not now yet.

00:01:29.660 --> 00:01:32.080
Now we have whiskey.

00:01:32.080 --> 00:01:32.880
Whiskey, anybody?

00:01:32.880 --> 00:01:38.460
This actually might make you want to drink this whiskey, micro whiskey in particular.

00:01:38.460 --> 00:01:39.320
WSGI.

00:01:39.320 --> 00:01:41.820
As some people say it, web service gateway interface.

00:01:41.820 --> 00:01:45.440
The friend and sibling parent.

00:01:45.440 --> 00:01:49.520
I don't know what the relationship of ASCII, the async gateway interface.

00:01:49.520 --> 00:01:52.640
Anyway, this is something I ran across.

00:01:52.640 --> 00:01:55.820
Just, I was doing some work with Granian.

00:01:55.820 --> 00:01:58.980
So Granian is the web server that powers Python bytes right now.

00:01:59.020 --> 00:02:04.000
And a couple other things, as you might imagine, and I was looking at it and it had a back reference.

00:02:04.000 --> 00:02:09.100
And one of the issues that was a feature I was asking about, namely worker restarting after

00:02:09.100 --> 00:02:11.360
certain amount of work gets done, things like that.

00:02:11.360 --> 00:02:19.660
And it was coming from, I believe this comes from edX, some edX project, though I can't tell

00:02:19.660 --> 00:02:20.460
by the organization.

00:02:20.460 --> 00:02:25.620
Anyway, the title of this GitHub issue is, this is them speaking amongst themselves in this

00:02:25.620 --> 00:02:26.800
project called tutor.

00:02:27.060 --> 00:02:29.640
We must replace micro whiskey with something else.

00:02:29.640 --> 00:02:30.660
Like, wait a minute.

00:02:30.660 --> 00:02:31.860
Why must we do this?

00:02:31.860 --> 00:02:33.640
Wait, let me see what's going on here.

00:02:33.640 --> 00:02:36.080
So this is somewhat news to me.

00:02:36.080 --> 00:02:38.780
The very opening here by, let's see, what is this?

00:02:38.780 --> 00:02:39.440
I wrote this.

00:02:39.440 --> 00:02:43.820
Regis Bimo wrote, micro whiskey is now in maintenance mode.

00:02:43.820 --> 00:02:48.860
And sure enough, if you go over to read the docs, it says note, this project is in maintenance

00:02:48.860 --> 00:02:49.140
mode.

00:02:49.140 --> 00:02:52.480
Only bug fixes and updates for new language APIs.

00:02:52.880 --> 00:02:56.300
Do not expect quick answers for GitHub issues or pull requests.

00:02:56.300 --> 00:02:56.880
Sorry about that.

00:02:56.880 --> 00:03:01.240
A big thanks to all users who have contributed over the last 15 years.

00:03:01.240 --> 00:03:01.820
That's awesome.

00:03:01.820 --> 00:03:04.000
However, I don't think that's awesome.

00:03:04.000 --> 00:03:08.980
It's awesome that they've been working on it for 15 years and people, it's had such a good

00:03:08.980 --> 00:03:09.160
run.

00:03:09.580 --> 00:03:15.660
However, the part that's not great, as you point out, Brian, is this is a critical piece

00:03:15.660 --> 00:03:18.840
of internet infrastructure when you're on the internet.

00:03:18.840 --> 00:03:20.400
If this is running your app, right?

00:03:20.400 --> 00:03:26.700
This is the thing that handles all Python requests and effectively has an open socket to the internet.

00:03:26.700 --> 00:03:30.480
And anything that just listens on an open socket on the internet, especially stuff written in

00:03:30.480 --> 00:03:32.300
C should make you nervous.

00:03:32.300 --> 00:03:33.460
Right.

00:03:33.460 --> 00:03:38.080
It's just, it's there, for, for, whatever might go wrong.

00:03:38.080 --> 00:03:40.400
And so there's a couple of things going on here.

00:03:40.400 --> 00:03:45.360
One, it's kind of, it's not fully, fully abandoned, but it's nearly fully abandoned.

00:03:45.360 --> 00:03:45.700
Right.

00:03:45.700 --> 00:03:46.540
And that's not great.

00:03:46.540 --> 00:03:50.540
The other is it, I don't believe it supports asynchronous programming.

00:03:50.940 --> 00:03:55.180
So if you want to do anything and async and await in your web apps, which is becoming

00:03:55.180 --> 00:03:57.280
increasingly popular, there's also not an option.

00:03:57.280 --> 00:04:01.260
So just for lots of reasons, it's probably time to find something else.

00:04:01.260 --> 00:04:07.120
And so they listed four things, some of which I would not recommend, but maybe they're, maybe

00:04:07.120 --> 00:04:07.920
they're wrong about it.

00:04:07.920 --> 00:04:13.480
Gunicorn, which by the way, some people pronounce gunicorn, but Brian, what is their logo?

00:04:13.480 --> 00:04:14.380
It's a unicorn.

00:04:14.380 --> 00:04:15.260
And what color is it?

00:04:15.260 --> 00:04:15.820
Green.

00:04:15.820 --> 00:04:16.760
It's a green unicorn.

00:04:16.760 --> 00:04:20.160
I'm pretty sure he unicorn stands for green unicorn, not gunicorn.

00:04:20.160 --> 00:04:24.240
But you know, y'all say it how you wish, but Gunicorn is how I say it.

00:04:24.240 --> 00:04:28.200
Cause it's a green unicorn mod whiskey, cherry pine waitress.

00:04:28.200 --> 00:04:34.160
I don't hear of any of these as being kind of high end production servers, right?

00:04:34.160 --> 00:04:39.600
Waitress is included with, pyramid as a debugging one, for example.

00:04:39.600 --> 00:04:45.580
So looking through, it says some people are suggesting engine X unit, which is, like

00:04:45.580 --> 00:04:48.920
a Python worker process that can run inside of engine X.

00:04:48.920 --> 00:04:50.120
That could be interesting.

00:04:50.120 --> 00:04:53.900
someone, this is how I found out about someone says, Hey, maybe we should look at,

00:04:53.900 --> 00:04:56.020
uh, granion and granion.

00:04:56.020 --> 00:05:02.020
And I've had, I've had, Giovanni, the guy who creates it on talk Python to talk about

00:05:02.020 --> 00:05:02.200
it.

00:05:02.200 --> 00:05:03.000
It's written in rust.

00:05:03.000 --> 00:05:06.480
It's super stable in terms of its performance fluctuations.

00:05:06.480 --> 00:05:07.860
It's pretty nice.

00:05:07.860 --> 00:05:10.940
And so that's what we're using now before that it was Gunicorn.

00:05:10.940 --> 00:05:15.340
I think there's some good options, but the long and short of it is micro whiskey is now

00:05:15.340 --> 00:05:16.060
in maintenance mode.

00:05:16.060 --> 00:05:21.360
And while that's not, you know, end of the line for it, I would start making plans to not

00:05:21.360 --> 00:05:22.360
be running on micro whiskey.

00:05:22.360 --> 00:05:24.520
If I was you and you were, you know what I mean?

00:05:24.520 --> 00:05:25.380
Okay.

00:05:25.640 --> 00:05:30.480
I mean, that's, I'm actually, I'm interested to hear if we get any feedback from listeners

00:05:30.480 --> 00:05:33.660
that there might be other options or what the recommendations are.

00:05:33.660 --> 00:05:34.260
Let us know.

00:05:34.260 --> 00:05:36.920
Probably the best place would be to comment on the YouTube video.

00:05:36.920 --> 00:05:37.880
Put it below there.

00:05:37.960 --> 00:05:40.080
That's, that's kind of our comment sections these days.

00:05:40.080 --> 00:05:40.580
Yeah.

00:05:40.580 --> 00:05:40.980
Yeah.

00:05:40.980 --> 00:05:41.380
Nice.

00:05:41.380 --> 00:05:41.860
Okay.

00:05:41.860 --> 00:05:42.340
All right.

00:05:42.340 --> 00:05:42.780
Over to you.

00:05:42.780 --> 00:05:48.940
Well, I was, interested, actually, I have a project where I was thinking about writing

00:05:48.940 --> 00:05:52.620
a little segment of it in rust, even though I don't know rust yet.

00:05:52.620 --> 00:05:58.980
but, but I was interested in the, the, a lot of places are, you know, optimizing little

00:05:58.980 --> 00:06:01.240
bits of their code with rust instead of C now.

00:06:01.240 --> 00:06:04.540
So, this is a great article from itamar.

00:06:04.900 --> 00:06:11.640
I think it's itamar turing, traring Turner, try anyway, itamar, it's a article called

00:06:11.640 --> 00:06:15.000
less build and optimized a rust extension for Python.

00:06:15.000 --> 00:06:17.920
And I really love the, like the focus of this.

00:06:17.920 --> 00:06:21.100
It isn't like, let's it's the focus of it really is.

00:06:21.100 --> 00:06:24.380
I've got one algorithmic function that I want to speed up.

00:06:24.380 --> 00:06:29.220
And that's, I think that's a great place for maybe not building a package for the rest of

00:06:29.220 --> 00:06:34.140
the world to, to use, but internally for the internal tools, that's a great way to, to,

00:06:34.340 --> 00:06:35.080
to look at things.

00:06:35.080 --> 00:06:42.380
So his, his example is a, a thing of counting unique values and you could just

00:06:42.380 --> 00:06:42.880
count them.

00:06:42.880 --> 00:06:48.320
He's gotten the exact count is using sets and, the length of a set, but everything in

00:06:48.320 --> 00:06:48.660
a set.

00:06:48.660 --> 00:06:53.540
But, but he says, if you've got 10 million items, it'll be in a set with 10 million items

00:06:53.540 --> 00:06:53.860
in it.

00:06:53.860 --> 00:06:55.640
So there's a space limit there.

00:06:55.640 --> 00:06:57.800
So, and then you take the length of that.

00:06:57.800 --> 00:07:04.340
so I'm in there, you know, you probably count things or something, but, the,

00:07:04.340 --> 00:07:05.980
is like, how do, how do we speed that up?

00:07:05.980 --> 00:07:11.820
And one of the algorithms is a, it's called a very simple algorithm, from, I'm not going

00:07:11.820 --> 00:07:12.820
to try to pronounce that name.

00:07:12.820 --> 00:07:17.920
but he has a link to the algorithm that's getting an approximation of the answer,

00:07:17.920 --> 00:07:19.900
how approximately how many.

00:07:20.060 --> 00:07:25.840
And so he just implements that whole algorithm in Python and then, and then runs it and,

00:07:25.840 --> 00:07:28.540
and it, and then runs it against the exact count.

00:07:28.540 --> 00:07:29.620
And it's pretty close.

00:07:29.620 --> 00:07:31.860
He runs it a few times and he gets different answers, but.

00:07:31.860 --> 00:07:33.340
That's a crazy algorithm.

00:07:33.340 --> 00:07:33.900
Yeah.

00:07:33.900 --> 00:07:35.500
Oh, did you read it?

00:07:35.500 --> 00:07:37.260
Well, just looking over it real quick.

00:07:37.260 --> 00:07:44.360
It's, you know, given a iterable make some, and how fast adding new items is increasing the

00:07:44.360 --> 00:07:46.540
duplicity or, or lack thereof.

00:07:46.540 --> 00:07:46.960
Yeah.

00:07:46.960 --> 00:07:48.160
That's pretty wild.

00:07:48.160 --> 00:07:48.760
It is.

00:07:48.760 --> 00:07:49.500
It's pretty close.

00:07:49.840 --> 00:07:54.980
and I remember reading about this algorithm recently also, but anyway, it's kind of a

00:07:54.980 --> 00:07:57.820
neat, neat example of, okay, let's try this algorithm out.

00:07:57.820 --> 00:08:01.820
And there's other algorithms for approximating uniqueness as well.

00:08:01.820 --> 00:08:06.120
comments later, but, he just took this one cause it's kind of a small algorithm.

00:08:06.120 --> 00:08:07.360
So it kind of works.

00:08:07.360 --> 00:08:13.740
and so let's, he did a speed comparison and it's, it's significantly slower.

00:08:13.740 --> 00:08:19.620
It's, the exact count is point is 0.14 seconds and the approximation is 0.7

00:08:19.620 --> 00:08:20.600
seven, eight seconds.

00:08:20.600 --> 00:08:24.140
So it's, it's a lot slower than the exact count.

00:08:24.140 --> 00:08:26.580
but it takes up tons less memory.

00:08:26.580 --> 00:08:28.940
So if you have a like memory constraint, that's important.

00:08:28.940 --> 00:08:33.540
and also if you're just doing an example from a small count, but you have a huge set

00:08:33.540 --> 00:08:35.700
that you're really going to count, you want an approximation.

00:08:35.700 --> 00:08:41.160
So, so this is a great, a great setup for how do we make this faster in rust?

00:08:41.280 --> 00:08:43.880
And so he actually walks through all of the steps.

00:08:43.880 --> 00:08:45.600
Like you haven't done this before.

00:08:45.600 --> 00:08:51.080
let's get mature in and Pio three and set up a project.

00:08:51.080 --> 00:08:56.440
he's, so he's even like, just mature in new rust counter prox project.

00:08:56.560 --> 00:09:02.280
and then, goes into it, looks at, looks at what the project set up already.

00:09:02.280 --> 00:09:06.940
It's got some cargo Toml files, pipe project Toml and a source file.

00:09:07.220 --> 00:09:12.400
and, and then he just does it right there and, and figures out how to install it.

00:09:12.400 --> 00:09:15.860
You can already install it, even though there's nothing there in the example project, which

00:09:15.860 --> 00:09:16.380
is kind of cool.

00:09:16.380 --> 00:09:17.820
he did look into it.

00:09:17.820 --> 00:09:22.700
It needs, rust doesn't have a random in the example or the algorithm uses random.

00:09:22.700 --> 00:09:27.960
So, this is kind of neat too, is, is how do you, introduction of how do you add,

00:09:27.960 --> 00:09:32.460
uh, dependencies and it's cargo add Rand and that it adds a dependency to your project.

00:09:32.460 --> 00:09:34.300
so that's it.

00:09:34.340 --> 00:09:37.100
You've got Pio three and Rand as dependencies.

00:09:37.100 --> 00:09:42.720
And then he, just basically translated that algorithm directly to rust.

00:09:42.720 --> 00:09:46.180
And I kind of like that idea of having just a side by side comparison.

00:09:46.180 --> 00:09:50.700
And I'm thinking about like putting these in two editors so I could see them side by side.

00:09:50.700 --> 00:09:51.760
Exactly.

00:09:51.760 --> 00:09:53.140
okay.

00:09:53.140 --> 00:09:56.900
So, so that, that thing, and then how is it faster?

00:09:56.900 --> 00:10:01.720
It's, it's, it's like twice as fast as the Python version, but you would think like,

00:10:02.000 --> 00:10:04.420
aren't we supposed to have like blazing speeds with rust?

00:10:04.420 --> 00:10:09.560
so, and I kind of love that he picks something that like, isn't as, isn't as optimal.

00:10:09.560 --> 00:10:12.920
Like I don't want that much, but like twice as fast.

00:10:12.920 --> 00:10:14.300
I want it to be super fast.

00:10:14.300 --> 00:10:16.820
So yeah, he also goes into some optimization.

00:10:16.820 --> 00:10:19.480
So first, first off is link time optimization.

00:10:19.480 --> 00:10:20.840
It's just an ability.

00:10:20.840 --> 00:10:27.300
and since, since this is a rust application that you're going to not, you know, you, it's

00:10:27.300 --> 00:10:31.120
fine to take a little bit extra time in linking to make it faster runtime.

00:10:31.120 --> 00:10:32.400
Go ahead and turn that on.

00:10:32.400 --> 00:10:35.240
And then, he was looking at the random number generator.

00:10:35.460 --> 00:10:37.680
there's a couple of ways to speed that up.

00:10:37.680 --> 00:10:40.260
One of them is to use the small random number generator.

00:10:40.260 --> 00:10:42.680
It's like less random, but you know, good enough.

00:10:42.680 --> 00:10:43.960
It's not cryptography.

00:10:43.960 --> 00:10:44.920
Yeah.

00:10:44.920 --> 00:10:50.760
And then, and then also there's, instead of storing in part of the algorithm,

00:10:50.760 --> 00:10:51.760
he's storing items.

00:10:51.760 --> 00:10:56.060
And he's like, instead of, and later taking hashes and instead of storing the items,

00:10:56.060 --> 00:10:57.300
just store the hashes.

00:10:57.300 --> 00:11:03.440
And then, and then, rust or rust has a thing like you can optimize the dealing

00:11:03.440 --> 00:11:04.820
of, collections.

00:11:04.820 --> 00:11:10.240
If you tell it that you're just storing hashes in there, so it doesn't try to rehash your hash.

00:11:10.240 --> 00:11:19.980
and, so, so it's like a no hash hasher, another dependency, but that optimization,

00:11:19.980 --> 00:11:24.360
altogether makes it even faster, but it's, it's, it's 0.21.

00:11:24.800 --> 00:11:27.900
so it's, like what?

00:11:27.900 --> 00:11:32.980
Almost four times faster, like a little three and a half times faster than the native, the

00:11:32.980 --> 00:11:33.740
Python version.

00:11:33.740 --> 00:11:34.640
So that's better.

00:11:34.640 --> 00:11:39.880
then he talks about partially other things, but it's, I don't think this is a really about

00:11:39.880 --> 00:11:42.900
how much faster his implementation of this was.

00:11:42.900 --> 00:11:44.380
It's, these are the steps.

00:11:44.380 --> 00:11:49.580
If you want to go through and, speed up a chunk of your Python code, this is a good

00:11:49.580 --> 00:11:50.720
list of how to do that.

00:11:50.720 --> 00:11:50.960
So.

00:11:50.960 --> 00:11:51.320
Yeah.

00:11:51.320 --> 00:11:51.880
Looks great.

00:11:51.880 --> 00:11:53.320
I love the walkthrough.

00:11:53.320 --> 00:11:55.060
And it's not a huge project.

00:11:55.060 --> 00:11:56.480
It's not a huge rewrite and rust.

00:11:56.480 --> 00:11:58.280
It's just this function slow.

00:11:58.280 --> 00:11:59.760
Let's make this function fast.

00:11:59.760 --> 00:12:04.200
And I think that's exactly how I'm going to try to probably learn rust is I'm not going

00:12:04.200 --> 00:12:05.340
to try to learn the whole language.

00:12:05.340 --> 00:12:07.680
I'm just going to learn enough to optimize something.

00:12:07.680 --> 00:12:09.720
so, and then build on that.

00:12:09.720 --> 00:12:10.420
Yes.

00:12:10.420 --> 00:12:15.340
And now before we move on to things really quick, John out in the audience points out,

00:12:15.340 --> 00:12:18.780
says, I believe mod whiskey is an Apache plugin module, which I think he's right.

00:12:18.780 --> 00:12:19.100
Yeah.

00:12:19.100 --> 00:12:20.100
I think that's as well.

00:12:20.100 --> 00:12:22.440
And I just wouldn't really want an Apache plugin.

00:12:22.440 --> 00:12:26.600
I would kind of like a thing that's a little more dedicated, but yes, I agree.

00:12:26.600 --> 00:12:30.380
And then waitress is one of the few options available on windows based server platforms.

00:12:30.380 --> 00:12:30.820
Okay.

00:12:30.820 --> 00:12:31.720
That's interesting.

00:12:31.720 --> 00:12:36.800
The context of the GitHub issue I talked about before was a Docker image.

00:12:36.800 --> 00:12:38.920
And so I'm pretty sure it was Linux.

00:12:38.920 --> 00:12:43.740
but yeah, I didn't know about the windows aspect there and I didn't point out like, well,

00:12:43.740 --> 00:12:44.540
what would I have picked?

00:12:44.540 --> 00:12:50.040
So reasonable options to Michael sound like granion, which we're using uvicorn, which used

00:12:50.040 --> 00:12:52.460
to be a kind of dev thing.

00:12:52.460 --> 00:12:58.240
And you could plug it into Gina corn with uvicorn workers, but actually it's now its own

00:12:58.240 --> 00:13:00.120
standalone thing with worker management.

00:13:00.120 --> 00:13:02.680
And so, so uvicorn is its own possible option.

00:13:02.680 --> 00:13:08.940
Now Hypercorn from Phillip Jones and court and then Gina corn with uvicorn workers for

00:13:08.940 --> 00:13:09.680
async stuff.

00:13:09.680 --> 00:13:12.300
So anyway, putting a bow on that one.

00:13:12.300 --> 00:13:12.620
Okay.

00:13:12.620 --> 00:13:14.800
So you have a few things you do instead.

00:13:14.800 --> 00:13:15.100
Yeah.

00:13:15.100 --> 00:13:18.720
I don't, I'm just using granion right now, but all those would be good options.

00:13:18.720 --> 00:13:19.280
I think.

00:13:19.280 --> 00:13:19.960
Okay.

00:13:19.960 --> 00:13:23.620
Let me tell you real quick about doubt APM.

00:13:23.620 --> 00:13:25.680
They're big supporters of Python bytes.

00:13:25.680 --> 00:13:27.220
So we appreciate that very much.

00:13:27.220 --> 00:13:32.660
So if you are tired of spending hours trying to find the root cause of issues impacting

00:13:32.660 --> 00:13:36.140
your performance, then you owe it to yourself to check out scout APM.

00:13:36.140 --> 00:13:42.200
They're a leading Python application performance monitoring tool, APM, that helps you identify

00:13:42.200 --> 00:13:45.220
and solve performance abnormalities faster and easier.

00:13:45.220 --> 00:13:50.860
Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and the

00:13:50.860 --> 00:13:55.940
dreaded N plus one queries that you can end up if you do lazy loading in your ORM.

00:13:55.940 --> 00:13:58.340
And then you say, oh no, why is it so slow?

00:13:58.340 --> 00:14:00.680
Why are you doing 200 database queries for what should be one?

00:14:00.680 --> 00:14:02.060
So you can find out things like that.

00:14:02.220 --> 00:14:03.840
And it links it back directly to source code.

00:14:03.840 --> 00:14:08.760
So you can spend less time in the debugger and healing logs and just finding the problems

00:14:08.760 --> 00:14:09.280
and moving on.

00:14:09.280 --> 00:14:12.280
And you'll love it because it's built for developers by developers.

00:14:12.280 --> 00:14:13.880
It makes it easy to get set up.

00:14:13.880 --> 00:14:16.400
Seriously, you can do it in less than four minutes.

00:14:16.400 --> 00:14:17.220
So that's awesome.

00:14:17.220 --> 00:14:20.280
And the best part is the pricing is straightforward.

00:14:20.280 --> 00:14:25.680
You only pay for the data that you use with no hidden overage fees or per seat pricing.

00:14:26.280 --> 00:14:28.000
And I just learned this, Brian.

00:14:28.000 --> 00:14:33.120
They also have, they provide the pro version for free to all open source projects.

00:14:33.340 --> 00:14:38.080
So if you're an open source maintainer and you want to have Scout APM for that project, just

00:14:38.080 --> 00:14:40.420
shoot them a message or something on their pricing page about that.

00:14:40.420 --> 00:14:44.260
So you can start your free trial and get instant insights today.

00:14:44.260 --> 00:14:46.860
Visit pythonbytes.fm/scout.

00:14:46.860 --> 00:14:49.120
The link is in your podcast player show notes as well.

00:14:49.120 --> 00:14:50.540
And please use that link.

00:14:50.540 --> 00:14:54.380
Don't just search for them because otherwise they don't think you came from us.

00:14:54.440 --> 00:14:55.980
And then they'd stop supporting the show.

00:14:55.980 --> 00:14:58.540
So please use our link, pythonbytes.fm/scout.

00:14:58.540 --> 00:14:59.460
Check them out.

00:14:59.460 --> 00:15:01.400
It really supports the show.

00:15:01.400 --> 00:15:01.860
Definitely.

00:15:01.860 --> 00:15:02.780
I'm next, huh?

00:15:02.780 --> 00:15:03.380
Yeah.

00:15:03.380 --> 00:15:04.100
All right.

00:15:04.100 --> 00:15:09.940
What if, Brian, what if you were super excited, finally be contacted by a recruiter for one

00:15:09.940 --> 00:15:11.200
of those jobs you're looking for?

00:15:11.200 --> 00:15:11.660
Yeah.

00:15:11.660 --> 00:15:15.620
And really all they wanted was your passwords, your bank login, and your crypto.

00:15:15.620 --> 00:15:16.620
Dear.

00:15:16.620 --> 00:15:20.240
Dear, that is so, why can't people be better?

00:15:20.240 --> 00:15:22.120
You know, some people just suck.

00:15:22.120 --> 00:15:28.020
So the item I want to talk about comes to us from reversing labs and pretty cool logo

00:15:28.020 --> 00:15:31.100
there with the reversed R for reversing labs, I got to say.

00:15:31.100 --> 00:15:37.240
And the title is fake recruiter coding tests target devs with malicious Python packages.

00:15:37.240 --> 00:15:38.200
That's not ideal.

00:15:38.200 --> 00:15:41.640
And I don't know why we need to have the word Python packages in here.

00:15:41.640 --> 00:15:46.780
Just malicious Python code, because a lot of it comes from GitHub repositories, not IPI.

00:15:46.780 --> 00:15:47.960
So I don't know.

00:15:47.960 --> 00:15:50.000
I think kind of put the packages to the side.

00:15:50.000 --> 00:15:51.720
That's not germane to this, really.

00:15:51.940 --> 00:15:55.540
What is, is people are using recruiting tests.

00:15:55.540 --> 00:15:59.920
So a lot of, this is something that I never encountered in my, yes, I never encountered

00:15:59.920 --> 00:16:00.760
this in my entire life.

00:16:00.760 --> 00:16:03.300
A take home exercise or something.

00:16:03.300 --> 00:16:08.500
It was interviews and it was live sort of code performances or whatever, I guess you would

00:16:08.500 --> 00:16:10.180
call them, but never take home.

00:16:10.180 --> 00:16:13.100
And that's just something that's becoming really popular for better or worse.

00:16:13.100 --> 00:16:13.600
All right.

00:16:13.660 --> 00:16:19.440
So reversing labs found the VM connect campaign, which I don't really know much about continuing

00:16:19.440 --> 00:16:26.140
with malicious actors posing as recruiters using packages and the names of financial firms to lure

00:16:26.140 --> 00:16:26.860
developers.

00:16:26.860 --> 00:16:27.860
So that's pretty bad.

00:16:27.860 --> 00:16:29.540
What's happening here?

00:16:29.540 --> 00:16:32.480
So they've, this is not exclusive to Python.

00:16:32.480 --> 00:16:34.940
It's happened through npm before and so on.

00:16:34.940 --> 00:16:39.560
And this seems to be tied to North Korea's Lazarus group, ATP group.

00:16:39.560 --> 00:16:40.640
That means bad stuff.

00:16:40.640 --> 00:16:42.360
You know, they're pretty, pretty skilled.

00:16:42.540 --> 00:16:43.960
But here's what happens.

00:16:43.960 --> 00:16:50.520
They found that people are getting these requests for coding tests and it says, here's your, here's

00:16:50.520 --> 00:16:51.120
your coding test.

00:16:51.120 --> 00:16:53.100
And if you look at it, I think I can even zoom it here.

00:16:53.100 --> 00:16:54.100
Well, not really.

00:16:54.100 --> 00:16:55.200
It kind of zooms.

00:16:55.200 --> 00:16:58.980
Anyway, it says, here's a fully functional password manager in Python.

00:16:58.980 --> 00:17:02.080
Basically this, you can see some grammatical errors in there.

00:17:02.080 --> 00:17:04.600
You might, that might clue you off, but probably not.

00:17:04.600 --> 00:17:08.420
This is a fully functional password manager that possesses almost all of its features.

00:17:08.420 --> 00:17:09.420
And here's an image.

00:17:09.780 --> 00:17:14.660
This is the important part before making any modifications, ensure the project is running

00:17:14.660 --> 00:17:15.220
successful.

00:17:15.220 --> 00:17:19.780
And if you trusted this organization, you were really keen to get going like, all right, well,

00:17:19.780 --> 00:17:21.080
let's just, I know what I'm doing.

00:17:21.080 --> 00:17:23.020
Python space, this, boom, boom.

00:17:23.020 --> 00:17:28.340
It's the running of this project that they delivered to you over GitHub or some other, they just sent

00:17:28.340 --> 00:17:35.800
you a thing to unzip and run that then downloads all the code, installs back doors, various other

00:17:35.800 --> 00:17:37.060
malware into your machine.

00:17:37.060 --> 00:17:40.820
And then you probably go on to finish the work and submit it and never hear back oddly.

00:17:40.820 --> 00:17:41.440
Yeah.

00:17:41.440 --> 00:17:46.140
And then somebody is actually like finishing the assignment and not.

00:17:46.140 --> 00:17:47.160
Yes, I know.

00:17:47.160 --> 00:17:48.080
It's so sad.

00:17:48.080 --> 00:17:49.680
Sucks so much.

00:17:49.680 --> 00:17:51.040
Oh, that's terrible.

00:17:51.040 --> 00:17:51.540
Yeah.

00:17:51.540 --> 00:17:58.940
The analysis revealed that the direct parent of the detected malicious files is a Python PYC

00:17:58.940 --> 00:17:59.380
file.

00:17:59.740 --> 00:18:04.400
So that's how they obscure it as part of what they give you are PYC files, not Python

00:18:04.400 --> 00:18:05.160
source files.

00:18:05.160 --> 00:18:07.040
So you can't really see inside them.

00:18:07.040 --> 00:18:12.120
Oh, and you, and you kind of think, oh, well, that's legitimate because it's a, because it's

00:18:12.120 --> 00:18:12.680
an interview.

00:18:12.680 --> 00:18:15.700
I, they're going to want to show me, show me the source code or something.

00:18:15.700 --> 00:18:16.040
Exactly.

00:18:16.040 --> 00:18:16.480
Yeah.

00:18:16.480 --> 00:18:20.680
It totally makes sense because yeah, if I saw this, well, then I would be able to, nope,

00:18:20.680 --> 00:18:23.620
your job is to have this opaque thing and write this one part.

00:18:23.620 --> 00:18:25.720
But no, it's just the opaque part is a virus.

00:18:25.720 --> 00:18:27.140
Oh, that's so sucks.

00:18:27.140 --> 00:18:28.200
It totally does.

00:18:28.200 --> 00:18:28.640
Yeah.

00:18:28.640 --> 00:18:30.860
So I would, do you have recommendations?

00:18:30.860 --> 00:18:32.480
Well, I, let's hear yours first.

00:18:32.480 --> 00:18:38.820
Oh, I was thinking that, so, I've, both, taken, interviews like this,

00:18:38.820 --> 00:18:47.360
um, coding exercises and given them, but in, in, let's see, most of the times I've

00:18:47.360 --> 00:18:48.540
only given them in text form.

00:18:48.540 --> 00:18:53.400
I've given a description and then somebody can like email me back or, or submit.

00:18:53.400 --> 00:18:57.220
on a form, the, what code for answering it.

00:18:57.220 --> 00:19:02.680
and then also since there's AI and everything, or you could just like hire somebody to do the

00:19:02.680 --> 00:19:07.580
code for you, that code I then use as part of the interview process.

00:19:07.580 --> 00:19:13.140
Like we will talk about, we'll talk about what choices they made in the code during the actual

00:19:13.140 --> 00:19:14.100
talking interview.

00:19:14.100 --> 00:19:19.140
the other thing, and I've had, I've had that happen with me as well.

00:19:19.140 --> 00:19:22.680
When I've done coding exercises, the other thing is using platforms.

00:19:22.680 --> 00:19:24.440
Like there's, there's online platforms.

00:19:24.440 --> 00:19:27.860
You don't install anything on your own computer, during a coding exercise.

00:19:27.860 --> 00:19:32.160
And I would be more willing to do that, than, than believe somebody.

00:19:32.160 --> 00:19:37.200
But I know there's a lot of GitHub based, like there's a private repo you git added to,

00:19:37.200 --> 00:19:41.200
and then you can go and try to take the, do the coding assignment.

00:19:41.200 --> 00:19:45.820
I know that happens and I would just, I probably wouldn't do it, I guess, or I don't know, but.

00:19:45.820 --> 00:19:46.600
Yeah, sure.

00:19:46.760 --> 00:19:51.940
I think some other things that I had in mind was if you're just trying out a Docker container

00:19:51.940 --> 00:19:55.760
and it's something real simple, sorry, Python package, I do it in a Docker container.

00:19:55.760 --> 00:20:00.940
You know, if you're just doing it on the terminal or like a simple editor, just fire up a Docker

00:20:00.940 --> 00:20:02.640
container shell into it.

00:20:02.640 --> 00:20:08.020
You know, Docker exec GSH or bash or whatever, and then play with it over there and then throw

00:20:08.020 --> 00:20:08.740
the container away.

00:20:08.740 --> 00:20:11.360
Or like you said, there's a lot of online platforms.

00:20:11.360 --> 00:20:16.360
So for example, I think VS Code has, you know, code.dev.

00:20:16.360 --> 00:20:17.040
Is that right?

00:20:17.040 --> 00:20:21.640
I can't remember what it was the, like if you open up GitHub and just press dot, whatever

00:20:21.640 --> 00:20:23.280
happens there, maybe you could do it there.

00:20:23.280 --> 00:20:23.760
Yeah.

00:20:23.760 --> 00:20:24.780
maybe not.

00:20:24.780 --> 00:20:29.300
probably what I would actually do is I would fire up a virtual machine that has snapshotting

00:20:29.300 --> 00:20:30.100
capabilities.

00:20:30.100 --> 00:20:34.860
And by snapshot, I mean like save how it is now on the, on the disc and then make a differencing

00:20:34.860 --> 00:20:35.220
disc.

00:20:35.220 --> 00:20:39.420
And then when you're done with the project, just throw away the snapshot, the different reset

00:20:39.420 --> 00:20:40.080
to the snapshot.

00:20:40.400 --> 00:20:40.620
Right.

00:20:40.620 --> 00:20:45.740
So that's long as it's, you're not afraid of it being potentially on your network.

00:20:45.740 --> 00:20:46.140
Right.

00:20:46.140 --> 00:20:48.580
But if it's in a VM, it's probably pretty safe.

00:20:48.580 --> 00:20:48.860
Right.

00:20:48.860 --> 00:20:55.160
And then also you could go over to Azure and get a windows machine, windows VM that you can

00:20:55.160 --> 00:20:56.120
remote desktop into.

00:20:56.120 --> 00:21:01.440
That's a full windows machine in the desktop, in the cloud as a desktop, you log into right

00:21:01.440 --> 00:21:03.660
there and just throw away the virtual machine.

00:21:03.660 --> 00:21:06.060
Cause you know, then it's not even on your network.

00:21:06.060 --> 00:21:06.380
Right.

00:21:06.380 --> 00:21:06.920
Yeah.

00:21:06.920 --> 00:21:11.520
I think, and as much as I like using my own editor, I think that I'm, I think that people

00:21:11.520 --> 00:21:16.300
that are giving coding exercises really should use a platform, because it's just more

00:21:16.300 --> 00:21:17.100
fair for everybody.

00:21:17.100 --> 00:21:22.400
The, and the, even our friends at PyBytes have their own interview platform

00:21:22.400 --> 00:21:23.100
that you can do.

00:21:23.100 --> 00:21:25.420
You can do their little things.

00:21:25.420 --> 00:21:26.560
Matt agrees with you.

00:21:26.560 --> 00:21:27.820
Plus one for coding platforms.

00:21:27.820 --> 00:21:29.100
Yeah.

00:21:29.100 --> 00:21:29.580
All right.

00:21:29.940 --> 00:21:30.140
Okay.

00:21:30.140 --> 00:21:34.000
So folks be, just be on the lookout and be careful out there.

00:21:34.000 --> 00:21:34.700
It's the internet.

00:21:34.700 --> 00:21:36.580
Well, is it my turn?

00:21:36.580 --> 00:21:37.500
I think so.

00:21:37.500 --> 00:21:40.360
let's, let's talk about office hours.

00:21:40.360 --> 00:21:46.780
so the PSF has announced that the PSF board is having office hours, which is kind of cool.

00:21:46.780 --> 00:21:47.600
They're going to do it monthly.

00:21:47.600 --> 00:21:50.740
So if you have a question, if you, what do they say?

00:21:50.740 --> 00:21:52.340
greetings Pythonista.

00:21:52.340 --> 00:21:57.980
I'm not going to read all of this, but the PSF, is going to open up, office hours

00:21:57.980 --> 00:22:03.840
and monthly, the office hours will be a session, be sessions where you can share with us how

00:22:03.840 --> 00:22:08.880
we can help your community and express your perspectives and provide feedback to the PSF.

00:22:09.340 --> 00:22:13.480
And hopefully everybody will be nice, but had an issue with people being nice.

00:22:13.480 --> 00:22:14.520
So try to be nice.

00:22:14.520 --> 00:22:20.460
then also, the joining of the office hours, there's, there's, we missed the first

00:22:20.460 --> 00:22:23.520
one that was September 10, but there's one October 8th.

00:22:23.520 --> 00:22:26.940
And then, and then there's, you know, there's a list here we've got.

00:22:26.940 --> 00:22:28.700
Well, I'll just put the list in the show notes.

00:22:28.700 --> 00:22:31.220
Also, what do you, what are they going to talk about?

00:22:31.220 --> 00:22:36.940
Well, they might have, they might have a topic, but, they also might not.

00:22:36.940 --> 00:22:40.900
So it says that you can bring up, I can't remember where, where it said this, but you

00:22:40.900 --> 00:22:44.440
can bring up, there'll either be a topic, but if there's not a topic, you can bring up

00:22:44.440 --> 00:22:48.120
something that's Python related or something that the board might be able to help you with.

00:22:48.120 --> 00:22:49.540
So that's really cool.

00:22:49.540 --> 00:22:54.060
I love the accessibility that, that, that people have access to.

00:22:54.060 --> 00:22:54.560
Yeah.

00:22:54.560 --> 00:22:55.420
I think it's kind of cool.

00:22:55.420 --> 00:22:59.400
I think it's kind of like, it kind of reminds me of, you know, you can, I've never

00:22:59.400 --> 00:23:05.280
gone, but my, my little local community that I live in, I can go watch the, the,

00:23:05.280 --> 00:23:10.380
the, the city board meetings if I wanted to, I don't, I don't do that, but I like that

00:23:10.380 --> 00:23:11.780
it's possible that I can.

00:23:11.780 --> 00:23:13.220
So it's a good thing.

00:23:13.220 --> 00:23:14.500
So thanks PSF.

00:23:14.500 --> 00:23:15.320
Yep.

00:23:15.320 --> 00:23:15.940
Yeah.

00:23:15.940 --> 00:23:16.320
Very cool.

00:23:16.320 --> 00:23:16.860
All right.

00:23:16.860 --> 00:23:21.480
and I kind of made this one short cause I know we've got quite a few extras to talk

00:23:21.480 --> 00:23:21.780
about.

00:23:21.780 --> 00:23:24.220
do you want to kick off the extras?

00:23:24.220 --> 00:23:25.480
Let's kick it off.

00:23:25.480 --> 00:23:28.760
Let's, this is a good one to kick it off with cause this is a joint extra.

00:23:28.760 --> 00:23:36.000
Big news is our courses, mine, yours, and our friends are on humble bundle for a couple

00:23:36.000 --> 00:23:36.460
of weeks.

00:23:36.460 --> 00:23:43.140
So if you want to get what I think is probably a ridiculous deal, like $1,882 worth of content

00:23:43.140 --> 00:23:44.420
for $25.

00:23:44.420 --> 00:23:47.860
Check it out.

00:23:47.860 --> 00:23:52.080
One of the things that's unique about humble bundle, if you're not familiar with it and partly

00:23:52.080 --> 00:23:55.640
why we're participating is a lot of money goes to charity right now.

00:23:55.640 --> 00:23:59.280
It's just launched and so far has already raised almost $3,000 for charity.

00:23:59.280 --> 00:24:00.020
That's pretty cool.

00:24:00.020 --> 00:24:05.440
Traditionally over the years, we've worked with humble bundle and raised a lot of money for

00:24:05.440 --> 00:24:07.580
the PSF and for other organizations through this.

00:24:07.580 --> 00:24:10.880
So this year's charity is girls who code.

00:24:10.880 --> 00:24:12.260
So check it out.

00:24:12.260 --> 00:24:20.580
And there's stuff from me, from Brian, from jet brains, from Matt Harrison, from Reuben Lerner,

00:24:20.580 --> 00:24:22.960
from PyBytes, real Python.

00:24:23.600 --> 00:24:26.260
And anybody I'm leaving out there, I don't think so.

00:24:26.260 --> 00:24:26.940
But yeah.

00:24:26.940 --> 00:24:28.200
What else do you want to say about this, Brian?

00:24:28.200 --> 00:24:31.660
I'm kind of excited about checking out the CPython internals.

00:24:31.660 --> 00:24:32.900
I've put off looking at that.

00:24:32.900 --> 00:24:36.000
And I think I might grab it so I can read that.

00:24:36.000 --> 00:24:40.980
Also, I think my Visual Studio Code plus Python skills are pretty good.

00:24:41.080 --> 00:24:44.060
But I'm curious to know what your course has in there.

00:24:44.060 --> 00:24:47.500
There's actually quite a few goodies in there.

00:24:48.220 --> 00:24:50.240
And also, it's ridiculous, though.

00:24:50.240 --> 00:24:57.320
The, I'm including the, both the new Hello pytest course and, and the

00:24:57.320 --> 00:24:59.820
complete pytest course and the pytest course on your side.

00:24:59.820 --> 00:25:04.620
I know that's kind of a lot of pytest, but I kind of think about it a lot.

00:25:04.620 --> 00:25:10.260
so a lot of exciting people already joining, and I'm getting some great questions in

00:25:10.260 --> 00:25:11.200
the community forum.

00:25:11.200 --> 00:25:12.560
so that's really good.

00:25:12.600 --> 00:25:13.620
Even some great feedback.

00:25:13.620 --> 00:25:14.740
yeah, it's awesome.

00:25:14.740 --> 00:25:16.720
So I'm pretty excited about this.

00:25:16.720 --> 00:25:17.260
All right.

00:25:17.260 --> 00:25:21.880
So this is one among many extras, but do check that out if this sounds interesting to you.

00:25:21.880 --> 00:25:24.480
It's a lot of stuff and it's for a good cause.

00:25:24.480 --> 00:25:24.740
Okay.

00:25:24.740 --> 00:25:30.200
Next, I believe we've talked about the Django Not program before, which is super cool.

00:25:30.200 --> 00:25:35.600
I've had Sarah and Tushar on Talk Python and linked about that as well in the show notes.

00:25:35.600 --> 00:25:41.140
But the news here is that Django Not Space Session 3 applications are open.

00:25:41.340 --> 00:25:42.880
So get in there and apply.

00:25:42.880 --> 00:25:48.420
This is a program that helps you become a contributor, possibly on the path to core developer for

00:25:48.420 --> 00:25:48.780
Django.

00:25:48.780 --> 00:25:50.040
And I think it's a really cool program.

00:25:50.040 --> 00:25:52.680
Free eight week group mentoring program.

00:25:52.680 --> 00:25:53.120
Cool.

00:25:53.120 --> 00:25:53.520
Yeah.

00:25:53.520 --> 00:25:55.960
So if you're a fan of Django, you want to get better at open source.

00:25:55.960 --> 00:25:56.740
Here we go.

00:25:56.740 --> 00:26:00.460
like I said, a link to this, two more things real quick.

00:26:00.460 --> 00:26:03.840
One planned and one, a surprise alt tab.

00:26:03.840 --> 00:26:07.760
If you're on windows, alt tab is the way you switch between apps on macOS.

00:26:07.760 --> 00:26:09.620
If you switch to macOS, things get weird.

00:26:09.620 --> 00:26:14.360
Like command tab seems like the alt tab, but command tab switches between applications,

00:26:14.360 --> 00:26:15.440
not between windows.

00:26:15.440 --> 00:26:18.940
So for example, if there's like a, Hey, there's an update available for your app.

00:26:18.940 --> 00:26:20.600
And then it goes behind another window.

00:26:20.600 --> 00:26:23.660
There may be no way to keyboard over to it.

00:26:23.660 --> 00:26:28.520
You might have to hit control down and then find it because it doesn't register as like

00:26:28.520 --> 00:26:30.480
a top level application, but it's there.

00:26:30.480 --> 00:26:33.200
And like, you want to switch between two windows and web browser.

00:26:33.200 --> 00:26:37.040
I know there's command tab, but that, or sorry, command tilde, but that just cycles.

00:26:37.040 --> 00:26:38.360
That doesn't give you a list.

00:26:38.440 --> 00:26:45.120
So alt tab is a free open source thing for macOS with a ridiculous amount of options that

00:26:45.120 --> 00:26:51.940
has a super cool UI for switching between windows, not applications.

00:26:51.940 --> 00:26:56.800
And like I said, it's open source, but also it doesn't take over the typical commands.

00:26:56.800 --> 00:27:00.460
So it's an either or whatever you feel like hitting while you're working on Mac.

00:27:00.460 --> 00:27:01.080
What do you think, Brian?

00:27:01.080 --> 00:27:01.360
Cool.

00:27:01.640 --> 00:27:04.920
Yeah, actually, I don't, I never even tried any of this stuff.

00:27:04.920 --> 00:27:09.040
I just usually don't have very much open or I have no idea how to find my stuff.

00:27:09.040 --> 00:27:10.700
Yeah.

00:27:10.700 --> 00:27:14.400
But if you look over on GitHub, it's got 10,000, almost 11,000 stars.

00:27:14.400 --> 00:27:15.640
It's pretty neat.

00:27:15.640 --> 00:27:16.120
Yeah.

00:27:16.120 --> 00:27:17.980
So anyway, people can check that out if they want.

00:27:17.980 --> 00:27:19.160
And this is the prize.

00:27:19.160 --> 00:27:23.840
This was not true when I hit, when we logged in to hit record today.

00:27:23.840 --> 00:27:28.720
However, since then, the macOS Sequoia, the new version of macOS is now out.

00:27:28.800 --> 00:27:33.120
Now, if you go to the website, apple.com slash macOS, it says it's in a preview.

00:27:33.120 --> 00:27:36.400
But if you go to a system settings, it says, would you like to install it?

00:27:36.400 --> 00:27:38.540
So I don't know.

00:27:38.540 --> 00:27:41.780
If people want to live on the cutting edge, there you go.

00:27:41.780 --> 00:27:42.420
It's time.

00:27:42.420 --> 00:27:43.700
I'll let you do it first.

00:27:43.700 --> 00:27:48.040
And then if your computer still works to log in next week, I'll upgrade.

00:27:48.040 --> 00:27:51.200
If you ever hear from me again, then it'll be fine.

00:27:51.200 --> 00:27:52.700
Yeah.

00:27:52.700 --> 00:27:53.360
Sounds good.

00:27:53.360 --> 00:27:54.320
Anyway, those are my extras.

00:27:54.320 --> 00:27:54.840
Okay.

00:27:54.840 --> 00:27:58.400
I think that we should have covered this earlier, but oh well.

00:27:59.180 --> 00:28:02.700
PyCascades has the call for proposals is open.

00:28:02.700 --> 00:28:05.260
Maybe we covered it that I just don't remember.

00:28:05.260 --> 00:28:08.540
But anyway, CFP is open, but you only have a few days.

00:28:08.540 --> 00:28:13.320
It's September 16 right now, and the deadline is September 20th.

00:28:13.320 --> 00:28:16.280
So if you haven't gotten those in yet, get those in.

00:28:16.280 --> 00:28:18.600
And mostly I'm bringing this up because I forgot.

00:28:18.600 --> 00:28:20.460
And I'm going to submit a couple.

00:28:20.940 --> 00:28:23.020
But it's going to be exciting because it's in Portland.

00:28:23.020 --> 00:28:24.540
Yay, it's in Portland.

00:28:24.540 --> 00:28:25.660
At least I'll be there.

00:28:25.660 --> 00:28:26.680
Will you be there?

00:28:26.680 --> 00:28:27.160
Probably.

00:28:27.160 --> 00:28:27.860
Unclear.

00:28:27.860 --> 00:28:28.380
Maybe.

00:28:28.380 --> 00:28:28.660
Unclear.

00:28:28.660 --> 00:28:29.100
Okay.

00:28:29.100 --> 00:28:30.080
Let's give it a strong maybe.

00:28:30.080 --> 00:28:32.500
Well, I'm going to try to make sure to be there.

00:28:32.500 --> 00:28:33.560
Yeah, that'll be nice.

00:28:33.780 --> 00:28:34.580
I love PyCascades.

00:28:34.580 --> 00:28:35.020
Okay.

00:28:35.020 --> 00:28:36.260
So that's my first.

00:28:36.260 --> 00:28:39.160
And that's in February.

00:28:39.160 --> 00:28:45.360
So last week we talked about all the uv Python stuff being super cool.

00:28:46.600 --> 00:28:49.860
But we mentioned that you can't do Python 3.13.

00:28:49.860 --> 00:28:50.720
Well, you can now.

00:28:50.720 --> 00:28:58.960
So Python 3.13 is now available for virtual environments and for anything with uv.

00:28:58.960 --> 00:29:02.560
So uv supports Python 13, but it does not subvert.

00:29:02.560 --> 00:29:07.320
If the next question is, can I do the other one?

00:29:07.320 --> 00:29:08.800
Free-threaded.

00:29:08.800 --> 00:29:10.120
Can we do through free-threaded?

00:29:10.120 --> 00:29:11.080
No, not yet.

00:29:11.080 --> 00:29:16.480
But hey, I think it's great to just support the normal one so that people can get their stuff in.

00:29:16.700 --> 00:29:19.420
So I think that's all my extras.

00:29:19.420 --> 00:29:20.360
Awesome.

00:29:20.360 --> 00:29:20.960
Awesome.

00:29:20.960 --> 00:29:21.280
Awesome.

00:29:21.280 --> 00:29:22.660
Anyway, thanks a lot.

00:29:22.660 --> 00:29:22.880
Yeah.

00:29:22.880 --> 00:29:31.120
I just want to quickly add that I tried uv Python list dash Python preference dash online only managed.

00:29:31.120 --> 00:29:38.660
And it didn't show 3.13 or 12.6, but then a uv self-update, run it again.

00:29:38.660 --> 00:29:39.920
So just be aware.

00:29:39.920 --> 00:29:43.220
I think you have to update your uv to get it to show the thing that you put in.

00:29:43.220 --> 00:29:44.020
I'm glad you brought that up.

00:29:44.020 --> 00:29:45.020
I was going to say that.

00:29:45.020 --> 00:29:45.860
Yeah.

00:29:46.100 --> 00:29:46.760
I forgot.

00:29:46.760 --> 00:29:51.200
And also, I think uv self-update is such an awesome thing.

00:29:51.200 --> 00:29:52.280
You just have to.

00:29:52.280 --> 00:29:54.500
It's a great name, self-update.

00:29:54.500 --> 00:29:56.980
I wish I had Brian self-update.

00:29:56.980 --> 00:29:58.440
That'd be cool.

00:29:58.440 --> 00:29:59.380
Exactly.

00:29:59.380 --> 00:30:01.800
Body's getting a little old and beat up.

00:30:01.800 --> 00:30:02.380
Self-update.

00:30:02.380 --> 00:30:03.240
Oh, there we go.

00:30:03.240 --> 00:30:03.700
Yeah.

00:30:03.700 --> 00:30:04.220
Nice.

00:30:04.220 --> 00:30:06.620
Power.

00:30:06.620 --> 00:30:07.960
We can't rebuild them.

00:30:07.960 --> 00:30:08.360
Okay.

00:30:08.360 --> 00:30:08.860
Okay.

00:30:08.860 --> 00:30:10.620
Let's get something funny.

00:30:10.620 --> 00:30:11.120
All right.

00:30:11.120 --> 00:30:17.240
Well, I was saving this for the November when we have the election in the US.

00:30:17.240 --> 00:30:18.600
This is not political people.

00:30:18.600 --> 00:30:19.600
So please don't write me.

00:30:19.600 --> 00:30:21.100
But this is a tech joke.

00:30:21.440 --> 00:30:24.740
Since Biden dropped out, the joke's kind of got a shelf life.

00:30:24.740 --> 00:30:25.420
Let's go.

00:30:25.420 --> 00:30:27.060
So here it is, Brian.

00:30:27.060 --> 00:30:29.500
Errors 404 and 403 went voting.

00:30:29.500 --> 00:30:30.960
404 voted for Trump.

00:30:30.960 --> 00:30:32.540
403, 403 forbidden.

00:30:32.540 --> 00:30:35.460
Oh, Biden.

00:30:35.460 --> 00:30:36.640
Oh, dear.

00:30:36.780 --> 00:30:38.080
Because 403 is forbidden.

00:30:38.080 --> 00:30:38.700
But anyway.

00:30:38.700 --> 00:30:39.500
Oh.

00:30:39.500 --> 00:30:43.740
That's what I got for you today.

00:30:43.740 --> 00:30:46.860
That's terrible.

00:30:46.860 --> 00:30:47.680
Yeah.

00:30:47.680 --> 00:30:48.620
It's definitely a dad joke.

00:30:48.620 --> 00:30:49.160
Okay.

00:30:49.160 --> 00:30:51.380
I've got a good one for you next week.

00:30:51.380 --> 00:30:52.040
All right.

00:30:52.040 --> 00:30:52.180
Yeah.

00:30:52.180 --> 00:30:52.640
Let's do it.

00:30:52.640 --> 00:30:53.020
All right.

00:30:53.020 --> 00:30:53.940
Looking forward to it.

00:30:53.940 --> 00:30:54.840
And yeah.

00:30:54.840 --> 00:30:55.460
Thanks.

00:30:55.460 --> 00:30:57.500
Thanks to everybody for showing up.

00:30:57.500 --> 00:31:02.480
And remember, check out the Humble Bundle.

00:31:02.480 --> 00:31:03.360
We appreciate it.

00:31:03.360 --> 00:31:03.580
Yeah.

00:31:03.580 --> 00:31:04.020
Indeed.

