WEBVTT

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

00:00:05.180 --> 00:00:11.300
This is episode 410, recorded Monday, November 18th at 7.37 a.m.

00:00:11.300 --> 00:00:14.540
Again, an unusual time for our live streaming, but here we are.

00:00:14.540 --> 00:00:15.560
I am Michael Kennedy.

00:00:15.560 --> 00:00:16.820
And I am Brian Okken.

00:00:16.820 --> 00:00:23.680
This episode is brought to you by us, our courses, the podcast, all those things, Brian's book, etc.

00:00:23.680 --> 00:00:27.100
Check them out. Links are in the podcast show notes there.

00:00:27.100 --> 00:00:28.480
You can find them right in your podcast player.

00:00:28.480 --> 00:00:33.800
And we have a standard introduction, Brian, of, hey, follow us on Mastodon.

00:00:33.800 --> 00:00:35.960
But you know what? This is not news to you.

00:00:35.960 --> 00:00:40.080
You created us a Python Bytes Bluesky account. How about that?

00:00:40.080 --> 00:00:41.320
Yeah, Bluesky.

00:00:41.320 --> 00:00:44.840
So you can still follow us on Mastodon. We're still very active there.

00:00:44.840 --> 00:00:50.640
But if you're one of the many people that never really made your way to Mastodon, but decided to make your way to Bluesky,

00:00:50.640 --> 00:01:00.520
well then make your way over to the Python Bytes.bsky.social account where that is the jumping off point to stay in touch with all of us.

00:01:00.520 --> 00:01:02.120
So follow the podcast there.

00:01:02.120 --> 00:01:03.320
You can follow Brian.

00:01:03.320 --> 00:01:05.560
He's linked in the profile there.

00:01:05.560 --> 00:01:08.140
You can follow me over there as well.

00:01:08.500 --> 00:01:11.340
And once you click on me, you can find Talk Python, all those things.

00:01:11.340 --> 00:01:12.560
Follow the chain.

00:01:12.560 --> 00:01:13.520
Follow the chain.

00:01:13.520 --> 00:01:16.400
So follow us on Mastodon and Bluesky.

00:01:16.400 --> 00:01:17.880
I'm enjoying Bluesky, Brian.

00:01:17.880 --> 00:01:18.580
What do you think about it?

00:01:19.020 --> 00:01:21.980
I think the default, I like it.

00:01:21.980 --> 00:01:24.520
Also, I like that the default experience is pretty good.

00:01:24.520 --> 00:01:32.500
Mastodon, I love Mastodon, but I had to get to, I'm using the Mona client on my iPhone, and it works.

00:01:32.500 --> 00:01:40.860
It's a really comfortable thing, but it took me a while to get there because there really isn't, I don't, if there is a default Mastodon client, it's not great.

00:01:40.860 --> 00:01:45.060
Yeah, there is a default one, but I tried it for a while and I switched to Mona as well.

00:01:45.060 --> 00:01:45.800
Yeah, so.

00:01:45.800 --> 00:01:46.140
Yeah.

00:01:46.660 --> 00:01:47.420
I'm liking it.

00:01:47.420 --> 00:01:51.320
If a bunch of people want to move over there, you know, we should be part of that community.

00:01:51.320 --> 00:01:53.120
There's a ton of familiar faces.

00:01:53.120 --> 00:01:56.660
Many of the people we talk about on the show are pretty active over there, so.

00:01:56.660 --> 00:01:59.420
But it doesn't, you know, one thing, it doesn't have an edit feature.

00:01:59.420 --> 00:02:01.140
When you post, you're done.

00:02:01.140 --> 00:02:02.500
You can't edit it later.

00:02:02.500 --> 00:02:06.680
Just prepare people, prepare to receive a lot of typos from me.

00:02:06.680 --> 00:02:10.180
For some reason, I like type fast on my phone and I don't really look and just hit send.

00:02:10.180 --> 00:02:11.420
That may be on me.

00:02:11.420 --> 00:02:16.580
But I think it's bad form to call people out on typos on social media platforms.

00:02:16.580 --> 00:02:17.720
You know, that's just.

00:02:17.720 --> 00:02:18.460
Yeah.

00:02:18.460 --> 00:02:18.760
Anyway.

00:02:18.760 --> 00:02:19.460
Cool.

00:02:19.460 --> 00:02:20.120
Indeed.

00:02:20.120 --> 00:02:20.880
Indeed.

00:02:20.880 --> 00:02:22.920
And, you know, final bits of introduction.

00:02:22.920 --> 00:02:24.040
Check out the live show.

00:02:24.040 --> 00:02:25.260
We don't know when it is.

00:02:25.260 --> 00:02:27.340
Maybe Monday at 7.

00:02:27.340 --> 00:02:28.060
You'd like to say normally.

00:02:28.060 --> 00:02:28.740
What?

00:02:28.740 --> 00:02:29.860
I don't remember.

00:02:29.860 --> 00:02:30.360
No.

00:02:30.360 --> 00:02:30.880
Well, what?

00:02:30.880 --> 00:02:33.780
There's what we normally say is Monday at 10 a.m.

00:02:33.780 --> 00:02:34.400
Pacific time.

00:02:34.400 --> 00:02:37.920
But then there's what we normally do, which recently has been 7.30 a.m.

00:02:37.920 --> 00:02:38.520
All over the place.

00:02:38.520 --> 00:02:39.020
Yeah.

00:02:39.020 --> 00:02:39.500
Blame Brian.

00:02:40.000 --> 00:02:40.800
No, it's fine.

00:02:40.800 --> 00:02:41.240
It's fine.

00:02:41.240 --> 00:02:43.560
We'll figure out a time.

00:02:43.560 --> 00:02:47.240
But you can always find the next episode pretty much right as this one ships.

00:02:47.240 --> 00:02:49.240
So if you just click on there, it'll take you to YouTube.

00:02:49.240 --> 00:02:49.900
That has the time.

00:02:49.900 --> 00:02:50.220
Yeah.

00:02:50.220 --> 00:02:51.720
Finally, subscribe to the newsletter.

00:02:51.720 --> 00:02:52.760
You guys know the deal.

00:02:52.760 --> 00:02:53.600
Handcrafted.

00:02:53.600 --> 00:02:54.200
Artisanal.

00:02:54.200 --> 00:02:54.860
From Brian.

00:02:54.860 --> 00:02:56.260
By the pythonbytes.fm newsletter.

00:02:56.260 --> 00:02:58.000
And with that, what do we got?

00:02:58.000 --> 00:03:00.760
Let's talk about Django for a bit.

00:03:00.760 --> 00:03:07.960
So Carlton Gibson, who was the Django fellow and has stepped, I think, last year.

00:03:07.960 --> 00:03:08.780
I believe he did step down.

00:03:08.780 --> 00:03:10.060
He is a Django chatter, though.

00:03:10.060 --> 00:03:11.020
Django chat.

00:03:11.020 --> 00:03:11.280
Yeah.

00:03:11.280 --> 00:03:12.180
Django chat's awesome.

00:03:12.180 --> 00:03:13.340
Another podcast.

00:03:13.340 --> 00:03:16.880
But so he has thoughts on Django core.

00:03:16.880 --> 00:03:20.260
And it's kind of a long article, but it's well written.

00:03:20.260 --> 00:03:29.380
And it's talking about Django core versus Django plugins and the longevity of Django and everything.

00:03:29.820 --> 00:03:34.020
And the whether or not batteries included and things like that and how to sustain it.

00:03:34.020 --> 00:03:39.580
So one of the things that I guess I kind of forget that Django will be 20 years old.

00:03:39.580 --> 00:03:42.580
Nick's birthday is 20 years ago or 20 years.

00:03:42.580 --> 00:03:44.300
That's a pretty long time.

00:03:44.300 --> 00:03:45.480
So it must be 19 now.

00:03:45.480 --> 00:03:48.660
And that's a long time.

00:03:48.660 --> 00:03:54.640
And so one of the sustainable abilities, sustainable parts is that there's lots of stuff there.

00:03:54.640 --> 00:03:59.220
There's like this idea of the it's the web framework for perfectionists with deadlines.

00:03:59.420 --> 00:04:04.520
And it's also the batteries included framework, but not too many batteries.

00:04:04.520 --> 00:04:06.500
So there's a small core.

00:04:06.860 --> 00:04:15.600
And then also talking about like a lot of people understand that the power of Django isn't really just the core.

00:04:15.600 --> 00:04:23.300
It's that you can get something up quickly with the core, but it's the all the plugins that are available because the ecosystem is a plugin architecture.

00:04:23.920 --> 00:04:26.920
And the so what is this talking about?

00:04:26.920 --> 00:04:31.400
A lot of people don't realize that there's just a few people working.

00:04:31.400 --> 00:04:34.700
I mean, it's not a huge team for how many people are using Django.

00:04:34.700 --> 00:04:36.500
There's one and a half.

00:04:36.500 --> 00:04:38.100
I'm trying to find it.

00:04:38.100 --> 00:04:38.780
I like this.

00:04:38.780 --> 00:04:40.540
Anyway, we'll get to that.

00:04:40.540 --> 00:04:41.720
There's one and a half.

00:04:42.420 --> 00:04:43.880
Wait, wait, we can't just go right past it.

00:04:43.880 --> 00:04:47.580
This is a this is a this is great.

00:04:47.580 --> 00:04:49.420
Pinky in the brain reference.

00:04:49.420 --> 00:04:49.880
Amazing.

00:04:49.880 --> 00:04:50.440
Yeah.

00:04:50.440 --> 00:04:51.120
Pinky in the brain.

00:04:51.120 --> 00:04:51.940
I love them.

00:04:51.940 --> 00:04:53.380
OK, so G brain.

00:04:53.380 --> 00:04:54.520
What are we going to do tonight?

00:04:54.520 --> 00:04:56.100
Same thing we do every night.

00:04:56.100 --> 00:04:56.500
Pinky.

00:04:56.500 --> 00:04:58.680
Try to get our package into Django core.

00:04:58.680 --> 00:05:01.140
This is hilarious.

00:05:01.640 --> 00:05:07.500
So the idea is it's difficult to get features into Django core, but maybe you don't want to.

00:05:07.500 --> 00:05:12.140
Somebody I can't remember the attribution.

00:05:12.140 --> 00:05:19.060
It's listed in here, but somebody mentioned that core is where plugins go to die and which is a little harsh.

00:05:19.060 --> 00:05:25.700
But I people need to understand that if you get your feature in core, it doesn't change very frequently.

00:05:25.700 --> 00:05:27.580
Then they do.

00:05:27.580 --> 00:05:31.480
They do a deprecation release like every two years.

00:05:31.480 --> 00:05:34.560
So if if you want to deprecate a feature, it's two years.

00:05:34.560 --> 00:05:37.120
If you want to add something new, it's a slow process.

00:05:37.120 --> 00:05:38.420
There's a lot of testing involved.

00:05:38.420 --> 00:05:44.080
It's going to be way easier to get a new feature if it's in if it's in a plugin also.

00:05:44.080 --> 00:05:48.800
And if we look back, I mean, thinking in the future, like we might.

00:05:48.800 --> 00:05:55.840
One example here was I'm not going to try to find it, but one example was XHTML or X.

00:05:55.840 --> 00:05:56.920
Yeah, that's right.

00:05:56.920 --> 00:05:57.640
XHTML.

00:05:57.640 --> 00:05:58.540
Super awesome.

00:05:58.540 --> 00:06:00.000
A lot of people are using it.

00:06:00.000 --> 00:06:03.500
Should that be part of supported natively in core?

00:06:03.500 --> 00:06:06.380
Well, we look back a few years.

00:06:06.380 --> 00:06:09.000
It would have been like React or something.

00:06:09.000 --> 00:06:11.980
Should should Django natively support React?

00:06:11.980 --> 00:06:13.400
Glad they chose no.

00:06:13.400 --> 00:06:18.760
Now, XHTML might be the next no in a few years.

00:06:18.760 --> 00:06:19.400
We never know.

00:06:20.280 --> 00:06:23.640
Also, yeah, there's a lot of examples around that.

00:06:23.640 --> 00:06:24.900
Django REST framework.

00:06:24.900 --> 00:06:27.720
I kind of forget that that's not a core thing.

00:06:27.720 --> 00:06:30.380
That's a it's just one of the really popular plugins.

00:06:30.380 --> 00:06:35.660
But there's like Django Ninja that is that is awesome also.

00:06:35.880 --> 00:06:40.760
And maybe it wouldn't exist if Django REST framework was part of the core.

00:06:40.760 --> 00:06:42.600
So the ecosystem is great.

00:06:42.600 --> 00:06:46.440
But there is there is a tension there that I like this.

00:06:46.720 --> 00:07:01.160
The discussion of is that Django, even the Django website doesn't like the team doesn't like to to like pick the plugins that everybody should use or the winner plugins, because that's kind of like bringing in a decor.

00:07:01.160 --> 00:07:05.860
That's that kind of reduces the competition and the ecosystem.

00:07:05.860 --> 00:07:12.300
But at the same time, it's hard as a beginner to jump in and say, OK, so what know really what plugins should I be using?

00:07:12.300 --> 00:07:15.700
And there isn't a should for everybody, of course.

00:07:15.700 --> 00:07:19.780
But I think there I guess this I enjoyed this discussion.

00:07:19.780 --> 00:07:25.400
It's around how how should we support the ecosystem while not squelching the ecosystem?

00:07:25.400 --> 00:07:35.080
So anyway, I I saw corollars between this and pytest as well, because pytest has the same sort of issue that it's there's a there's a core.

00:07:35.520 --> 00:07:37.900
And there's things in the core that I wish weren't there.

00:07:37.900 --> 00:07:41.940
And there's things that are out of the core that I think maybe should be.

00:07:41.940 --> 00:07:50.640
And and so everybody's going to have those opinions and dealing with whether or not you sanction a plugin or not.

00:07:50.640 --> 00:07:54.260
That's a it's a troubling thing for every every system.

00:07:54.260 --> 00:07:56.900
So anyway, it's a it's a tough tension.

00:07:56.900 --> 00:08:03.920
So anyway, out in the audience, we got you have any says it's great to see Django now got task you feature added.

00:08:03.920 --> 00:08:05.180
No need for celery anymore.

00:08:05.180 --> 00:08:06.060
Here it is.

00:08:06.060 --> 00:08:06.260
Right.

00:08:06.260 --> 00:08:06.600
Yeah.

00:08:06.600 --> 00:08:09.460
It's awesome to be able to just say, no, we can run stuff asynchronously.

00:08:09.460 --> 00:08:15.420
We don't need a mega infrastructure like maybe just an async loop or a thread or, you know.

00:08:15.420 --> 00:08:15.800
Yeah.

00:08:15.800 --> 00:08:20.240
On the other hand, it's it's weight that's permanently on Django now.

00:08:20.240 --> 00:08:20.460
Right.

00:08:20.700 --> 00:08:21.120
Yeah.

00:08:21.120 --> 00:08:21.540
Yeah.

00:08:21.540 --> 00:08:21.600
Yeah.

00:08:21.600 --> 00:08:21.680
Yeah.

00:08:21.680 --> 00:08:21.720
Yeah.

00:08:21.720 --> 00:08:29.680
And another little comic that was in there is this is this comic of how you think happens open source apps are maintained.

00:08:29.680 --> 00:08:36.180
And there's a picture of like tons of people hanging out, drawing on whiteboards and talking and stuff.

00:08:36.180 --> 00:08:43.040
And the reality is one dude in a basement saying just one more ticket before I go to bed.

00:08:43.040 --> 00:08:44.900
So.

00:08:44.900 --> 00:08:45.420
Yeah.

00:08:45.420 --> 00:08:46.340
Yeah, absolutely.

00:08:46.640 --> 00:08:47.500
Let's go to the future.

00:08:47.500 --> 00:08:48.140
Okay.

00:08:48.140 --> 00:08:48.920
Where we're going.

00:08:48.920 --> 00:08:50.300
We don't need roads.

00:08:50.300 --> 00:08:52.160
We're going to go to the future pool.

00:08:52.160 --> 00:08:54.140
This one comes to us from Pat Decker.

00:08:54.140 --> 00:08:55.080
Thank you, Pat.

00:08:55.080 --> 00:09:05.160
So this is an interesting idea about library that allows you to do multi processing type of work, but with asyncio.

00:09:05.160 --> 00:09:11.200
One of the challenges with asyncio is you can overwhelm the system and it does not.

00:09:11.200 --> 00:09:12.540
What's the term?

00:09:12.540 --> 00:09:14.940
I think you would say it doesn't feel back pressure.

00:09:14.940 --> 00:09:16.640
So let me give you an example.

00:09:16.640 --> 00:09:26.320
If you're doing regular programming where you call a function in a blocks, I'm calling it writing a database query and it stays there until the response until the database gets back to you.

00:09:26.320 --> 00:09:26.500
Right.

00:09:26.500 --> 00:09:27.820
Well, the database is busy.

00:09:27.820 --> 00:09:31.440
That slows down the part of the code that's calling the database.

00:09:31.440 --> 00:09:31.940
Right.

00:09:31.940 --> 00:09:35.200
The code is calling the part of the code that's calling database in.

00:09:35.200 --> 00:09:37.880
It kind of backs up the entire system and slows it down.

00:09:37.880 --> 00:09:42.200
But with asyncio, you're just sort of throwing more work at it and then carrying on.

00:09:42.200 --> 00:09:44.400
So you can go make even more work for it.

00:09:44.400 --> 00:09:44.620
Right.

00:09:44.860 --> 00:09:48.760
So one of the challenges of asyncio is you can just overwhelm the system.

00:09:48.760 --> 00:09:54.040
If you know, Hey, we really can only take 10 concurrent requests, but if it gets over that, it's going to be a problem.

00:09:54.040 --> 00:09:56.040
It's challenging to set that limit.

00:09:56.040 --> 00:09:56.460
Okay.

00:09:56.460 --> 00:09:58.480
So that's kind of what this feature pool thing does.

00:09:58.480 --> 00:09:59.680
It's, it's cool.

00:09:59.680 --> 00:10:03.820
It's a small use case because the way that you use it, but still it's, it's cool.

00:10:03.820 --> 00:10:12.860
So in multi-processing, this is the traditional, I create the processes because Python has this thing called the GIL and we can't really do computational parallelism.

00:10:12.860 --> 00:10:13.840
So we're going to do it this way.

00:10:14.000 --> 00:10:18.600
So what you can do is say, Hey, maybe we only have two cores or I only want to consume two cores or whatever.

00:10:18.600 --> 00:10:29.200
So you can say with pool of two workers, create no more than two processes, just sort of like start processing as many requests as you have, but only take them two at a time.

00:10:29.200 --> 00:10:31.720
As one gets done, get the next and just keep going until you're out.

00:10:31.720 --> 00:10:31.980
Right.

00:10:31.980 --> 00:10:32.360
Yeah.

00:10:32.420 --> 00:10:35.420
So that's what this idea of future pool is, but for asyncio.

00:10:35.420 --> 00:10:39.140
So you can say async with future pool of however many you want.

00:10:39.140 --> 00:10:44.100
And then you can await future pool map, some function over some block of work.

00:10:44.100 --> 00:10:45.800
Simple, but interesting, right?

00:10:45.800 --> 00:10:46.180
Yeah.

00:10:46.180 --> 00:10:48.300
And this way it will stop the caller.

00:10:48.300 --> 00:10:49.980
Can't go on anymore.

00:10:49.980 --> 00:10:53.020
Then while it's, it's sort of limiting.

00:10:53.260 --> 00:10:57.280
So why do I say this is pretty limited and why, why would it be better?

00:10:57.280 --> 00:10:58.400
How could it be better?

00:10:58.400 --> 00:11:06.220
So this is a local little thing that you create in one function once and it, it does the work.

00:11:06.220 --> 00:11:09.780
Also, you can't just say, run this task asynchronously.

00:11:09.780 --> 00:11:13.100
You have to use this map reduce pattern on it.

00:11:13.100 --> 00:11:13.540
Yeah.

00:11:13.540 --> 00:11:15.820
Which is not a normal programming thing.

00:11:15.820 --> 00:11:17.060
It's not like I'm calling this function.

00:11:17.060 --> 00:11:17.560
I'm awaiting that.

00:11:17.560 --> 00:11:18.240
I'm calling that function.

00:11:18.240 --> 00:11:18.760
I'm awaiting that.

00:11:18.760 --> 00:11:26.000
What would be awesome is if some way you could go and say for this program or, or this thread,

00:11:26.000 --> 00:11:30.900
or maybe not ideal, but maybe even for this event loop, I don't care how work gets to it.

00:11:30.900 --> 00:11:32.320
Let's limit it to five at a time.

00:11:32.320 --> 00:11:34.600
So if a web request kicks something off, awesome.

00:11:34.600 --> 00:11:38.460
It's, it, it goes into that thing that's limited by five concurrent requests.

00:11:38.460 --> 00:11:45.140
If I say, await something I call, it's also participating in this, this pooling, throttling,

00:11:45.140 --> 00:11:45.920
limiting type thing.

00:11:45.920 --> 00:11:48.680
But asyncio, as far as I know, doesn't have that concept.

00:11:48.680 --> 00:11:54.060
So maybe this could both be useful for some folks and motivation for someone to create

00:11:54.060 --> 00:11:56.680
something really interesting that is a little more broadly useful.

00:11:56.680 --> 00:11:57.100
Yeah.

00:11:57.100 --> 00:12:04.840
It's probably dangerous to architect on the fly here, but isn't there like something that

00:12:04.840 --> 00:12:08.140
you've used before that is async sometimes that.

00:12:08.140 --> 00:12:08.620
Yeah.

00:12:08.620 --> 00:12:13.240
I used unsync, U-N-S-Y-N-C, which is pretty interesting.

00:12:13.240 --> 00:12:18.120
And that would be, that would certainly be possible to do that because what that does is that converts

00:12:18.120 --> 00:12:24.640
or processes all the asynchronous requests everywhere into a single loop on a single background thread.

00:12:24.640 --> 00:12:25.040
No.

00:12:25.040 --> 00:12:25.720
Yeah.

00:12:25.720 --> 00:12:27.160
Possibly that.

00:12:27.160 --> 00:12:32.300
I was just thinking a similar model of you'd want to, you'd want to like give work to this,

00:12:32.300 --> 00:12:33.260
this system.

00:12:33.260 --> 00:12:33.900
Exactly.

00:12:33.900 --> 00:12:38.260
And have it be async until it can't be, and then have it block.

00:12:38.460 --> 00:12:38.740
Mm-hmm.

00:12:38.740 --> 00:12:39.360
I see.

00:12:39.360 --> 00:12:39.700
Yeah.

00:12:39.700 --> 00:12:40.080
Yeah.

00:12:40.080 --> 00:12:40.220
Yeah.

00:12:40.220 --> 00:12:41.140
Yeah.

00:12:41.140 --> 00:12:41.680
That would be great.

00:12:41.680 --> 00:12:47.660
The problem is I think it really needs something a little bit lower level than people can build

00:12:47.660 --> 00:12:48.440
packages for.

00:12:48.440 --> 00:12:48.880
Yeah.

00:12:48.880 --> 00:12:51.780
It kind of needs to be part of, you know, part of Python itself.

00:12:51.780 --> 00:12:53.120
There is uv loop.

00:12:53.120 --> 00:12:53.920
Part of the cohort.

00:12:53.920 --> 00:12:54.540
Yeah.

00:12:54.540 --> 00:12:55.760
Part of the, wait, here we go again.

00:12:56.300 --> 00:13:01.900
So it needs to be something that is the loop itself almost as work gets added to it.

00:13:01.900 --> 00:13:02.060
Right.

00:13:02.060 --> 00:13:06.460
But, you know, uv loop can replace the regular asyncio loop, which is generally a good idea

00:13:06.460 --> 00:13:06.980
when possible.

00:13:06.980 --> 00:13:10.300
But so maybe, maybe it's, it's that level that you got to work at.

00:13:10.300 --> 00:13:13.040
Maybe we could look, look in that realm and, and see what we could do.

00:13:13.040 --> 00:13:16.700
Because it would be really cool to say, hey, this thing can handle all, all the concurrency

00:13:16.700 --> 00:13:21.820
you want to throw at it, but it's only going to pass it on or you execute it more 10 at

00:13:21.820 --> 00:13:22.840
a time or something like that.

00:13:22.840 --> 00:13:23.180
Yeah.

00:13:23.180 --> 00:13:23.700
Anyway.

00:13:23.700 --> 00:13:24.620
Oh dear.

00:13:24.620 --> 00:13:27.060
People can go to the future with future pool and check it out.

00:13:27.060 --> 00:13:29.340
And maybe it's useful for your project.

00:13:29.340 --> 00:13:29.720
Yeah.

00:13:29.720 --> 00:13:30.300
It's funny.

00:13:30.300 --> 00:13:32.760
You said uv loop and I'm like, uv has loops.

00:13:32.760 --> 00:13:33.340
Oh no.

00:13:33.340 --> 00:13:35.120
UV loop was a thing way before uv.

00:13:35.120 --> 00:13:35.680
Yeah.

00:13:35.680 --> 00:13:37.300
UV loop was a, yeah.

00:13:37.300 --> 00:13:38.560
Magic stack, right?

00:13:38.560 --> 00:13:39.540
UV loop's been around.

00:13:39.540 --> 00:13:42.120
I don't know how long it's been around, but at least three years.

00:13:42.320 --> 00:13:43.160
At least eight years.

00:13:43.160 --> 00:13:43.960
Oh, sorry.

00:13:43.960 --> 00:13:44.140
Yeah.

00:13:44.140 --> 00:13:44.920
At least eight years.

00:13:44.920 --> 00:13:46.360
So that's longer than uv.

00:13:46.360 --> 00:13:46.760
Yeah.

00:13:46.760 --> 00:13:47.200
Yeah.

00:13:47.200 --> 00:13:47.620
Anyway.

00:13:47.620 --> 00:13:48.100
Okay.

00:13:48.100 --> 00:13:48.500
Yeah.

00:13:48.500 --> 00:13:49.080
All right.

00:13:49.080 --> 00:13:49.460
Over to you.

00:13:49.460 --> 00:13:55.740
I want to go to an article called, from Brett Cannon, called Don't Return Named Tuples

00:13:55.740 --> 00:13:57.020
in New APIs.

00:13:57.020 --> 00:14:02.440
It's a simple sort of thing, but it's, it's a good thing to, to remind people of.

00:14:02.440 --> 00:14:10.500
So first off, I want to thank Brett for using the term API in a sense of the API for a method

00:14:10.500 --> 00:14:16.640
or for a function or for a class or module and not necessarily an API for a REST API.

00:14:16.640 --> 00:14:22.840
We're not talking about REST APIs or web APIs, talking about good old function, just good

00:14:22.840 --> 00:14:23.320
old APIs.

00:14:23.320 --> 00:14:23.760
Anyway.

00:14:24.540 --> 00:14:30.800
So the idea is named tuples are kind of awesome and they're fun because you can just in one

00:14:30.800 --> 00:14:36.140
line say, Hey, I've got like, say a point and it's, it's cool.

00:14:36.140 --> 00:14:40.980
And why would I return that where I turn a named tuple is because something like that, like a

00:14:40.980 --> 00:14:41.220
point.

00:14:41.220 --> 00:14:44.680
So that it's obvious that people can access X, Y, Z or whatever.

00:14:44.680 --> 00:14:51.800
And, and in some things like point, it's easy to, you know, or get mouse position, you know,

00:14:51.800 --> 00:14:52.800
it's an X, Y coordinate.

00:14:52.800 --> 00:14:55.440
So X and Y are probably there.

00:14:55.440 --> 00:14:58.120
However, so why, why would you not want to use this?

00:14:58.420 --> 00:15:05.140
And he's arguing that, and I kind of agree is that it's really easy to implement something

00:15:05.140 --> 00:15:05.980
with a named tuple.

00:15:05.980 --> 00:15:14.620
But now you've got to support both index based index access, like a tuple or named access as

00:15:14.620 --> 00:15:15.360
if it was a dictionary.

00:15:15.360 --> 00:15:21.660
So having both index access and name access is probably not what you meant.

00:15:21.980 --> 00:15:26.700
And I think I've seen this a lot of people assume once it's a named tuple, people are

00:15:26.700 --> 00:15:28.680
going to use the name, but it's also a tuple.

00:15:28.680 --> 00:15:32.140
So you can use it, you can slice it and I'll do all sorts of stuff.

00:15:32.140 --> 00:15:39.500
So the, and it's really just to get around like to not have to do a class, but classes are

00:15:39.500 --> 00:15:40.020
easier now.

00:15:40.020 --> 00:15:44.100
So there's some alternatives to alternatives to named tuple.

00:15:44.100 --> 00:15:51.160
You can return a data class and that would be something I'd grab possibly data class or a

00:15:51.160 --> 00:15:54.080
dictionary, dictionary would work fine or typed dict.

00:15:54.080 --> 00:15:59.500
The, one of the things that is nice about a typed dick is dict is that you get editor

00:15:59.500 --> 00:16:02.320
support as well, because you've got the types defined in there.

00:16:02.320 --> 00:16:07.900
and then something new to me, which I'm going to have to play with is a simple namespace,

00:16:07.900 --> 00:16:15.180
um, which gives us the ability to, to access the names, but, it's not indexable.

00:16:15.180 --> 00:16:18.440
I haven't played with a namespace, simple namespace.

00:16:18.440 --> 00:16:20.080
So I'll have to do that.

00:16:20.420 --> 00:16:21.840
I haven't heard a simple namespace either.

00:16:21.840 --> 00:16:23.200
And I haven't really used type dict.

00:16:23.200 --> 00:16:25.200
well, they both are good options.

00:16:25.200 --> 00:16:26.040
I haven't either.

00:16:26.040 --> 00:16:31.760
I like kind of jumped on the, data class, bandwagon, and use data classes a lot

00:16:31.760 --> 00:16:37.140
now, because I do think about that is, is actually, I need to think about it more,

00:16:37.140 --> 00:16:40.460
but I haven't really been using named tuples to return stuff.

00:16:40.460 --> 00:16:44.500
but so the, so what's the recommendation really is just be careful.

00:16:44.500 --> 00:16:48.060
and, I'll read his quote.

00:16:48.060 --> 00:16:53.740
He said, my key point in all of this is to prefer readability and ergonomics over brevity in your

00:16:53.740 --> 00:16:54.180
code.

00:16:54.240 --> 00:16:59.460
that means avoiding named tuples, except when you're expanding or tweaking in an existing

00:16:59.460 --> 00:17:05.460
API where the named tuple improves over the plain tuple that is already being used.

00:17:05.460 --> 00:17:09.780
So if you're art and that's, I guess that that's something I think I have done.

00:17:09.780 --> 00:17:16.320
If, if you are, the return value was a tuple before it's been a tuple for a long time, there's

00:17:16.320 --> 00:17:19.880
existing code using it, but it really should have been a named something.

00:17:19.880 --> 00:17:24.020
adding, adding a named tuple allows people to use both.

00:17:24.020 --> 00:17:26.940
and that might be ergonomically better.

00:17:26.940 --> 00:17:32.500
The, but, the caveat really is you've got a lot of testing to do because you've got

00:17:32.500 --> 00:17:34.160
to test both accesses now.

00:17:34.160 --> 00:17:35.460
So, test more.

00:17:35.460 --> 00:17:36.280
So, okay.

00:17:36.280 --> 00:17:36.760
Awesome.

00:17:36.760 --> 00:17:37.180
Yeah.

00:17:37.180 --> 00:17:38.280
That's a good article blog, Brett.

00:17:38.280 --> 00:17:39.920
No surprise there.

00:17:39.920 --> 00:17:40.560
No surprise.

00:17:40.560 --> 00:17:41.100
Okay.

00:17:41.100 --> 00:17:46.000
Let's talk about a different programming language, but I think this is interesting and interesting

00:17:46.000 --> 00:17:46.740
perspective.

00:17:46.740 --> 00:17:47.240
Okay.

00:17:47.240 --> 00:17:50.020
So the Zig programming language, are you familiar with Zig?

00:17:50.020 --> 00:17:50.680
No.

00:17:50.680 --> 00:17:53.060
I, it's kind of new to me as well.

00:17:53.060 --> 00:17:58.120
If you go and look at some examples here, it looks, I think it looks a little like rust

00:17:58.120 --> 00:18:02.860
like, I'm not sure, but we go down, it's, it does a lot of, simple things like

00:18:02.860 --> 00:18:08.380
it interoperates really quickly and easily with, either C or, or windows APIs or stuff

00:18:08.380 --> 00:18:08.860
like that.

00:18:08.860 --> 00:18:13.340
But yeah, it looks, it looks pretty approachable, but it's a low level level, low level programming

00:18:13.340 --> 00:18:15.220
language like here arrest.

00:18:15.220 --> 00:18:15.460
Right.

00:18:15.600 --> 00:18:20.220
What are those, what are all those, semicolons and curly braces doing in my code?

00:18:20.220 --> 00:18:21.760
I know I, you probably delete them.

00:18:21.760 --> 00:18:22.720
I don't think you really need it.

00:18:22.720 --> 00:18:26.600
So here's the interesting thing.

00:18:26.600 --> 00:18:33.020
They recently were spending quite a bit of money on AWS and they've decided that they would be

00:18:33.020 --> 00:18:36.900
better off not spending their supporters money on hosting.

00:18:37.120 --> 00:18:43.600
So for example, they said the rust foundation reports that it spends $404,000 on infrastructure

00:18:43.600 --> 00:18:45.740
websites and stuff like that.

00:18:45.740 --> 00:18:47.280
And probably mostly packages.

00:18:47.280 --> 00:18:50.800
And it says, we don't really know anything about PI PI and Python.

00:18:50.800 --> 00:18:53.760
Like what does python.org cost to run?

00:18:53.760 --> 00:18:58.360
And mostly because that's a lot of the infrastructure costs are donated.

00:18:58.360 --> 00:19:03.420
They said, look, as this language is growing, we don't really want for that to be our issue.

00:19:03.420 --> 00:19:07.660
So they were getting upwards of a thousand dollars a month for their AWS bill, which is

00:19:07.660 --> 00:19:10.160
not insane, but for an open source project.

00:19:10.160 --> 00:19:10.640
Yeah.

00:19:10.640 --> 00:19:11.040
Yeah.

00:19:11.040 --> 00:19:12.100
It's kind of up there.

00:19:12.100 --> 00:19:14.420
But what they said is look, zigling.org.

00:19:14.420 --> 00:19:16.640
That's their equivalent of python.org.

00:19:16.640 --> 00:19:18.280
It says, this is not an essential service.

00:19:18.280 --> 00:19:23.980
It's not an emergency if it goes down and 99% uptime is perfectly fine.

00:19:23.980 --> 00:19:29.560
It's the last 1% of uptime that represents 99% of the costs, which is pretty interesting.

00:19:29.560 --> 00:19:32.660
So they said, look, we got a $36 Hetzner server.

00:19:32.660 --> 00:19:35.160
Which comes with 20 terabytes.

00:19:35.160 --> 00:19:41.320
I think 20, at least 20 terabytes of bandwidth, which is about $2,000 of AWS bandwidth included

00:19:41.320 --> 00:19:42.060
for the $36.

00:19:42.060 --> 00:19:45.620
And maybe someday we'll go crazy and spend a hundred or 200 bucks, but we don't need to

00:19:45.620 --> 00:19:46.220
do more than that.

00:19:46.220 --> 00:19:47.680
Like this, this is enough.

00:19:47.680 --> 00:19:48.040
Right.

00:19:48.040 --> 00:19:50.180
And so what are they doing instead?

00:19:50.180 --> 00:19:56.580
They're saying one, they're encouraging and setting up a system that has package mirrors.

00:19:56.580 --> 00:19:57.060
Right.

00:19:57.060 --> 00:20:02.780
Remember we talked about that PEP that would basically sign wheels and then allow them

00:20:02.780 --> 00:20:05.720
to be hosted somewhere else as long as the signature still matches.

00:20:05.720 --> 00:20:07.880
So they're doing that kind of stuff from the start.

00:20:07.880 --> 00:20:10.880
They're like, we can spread this out in a distributed style.

00:20:10.880 --> 00:20:13.540
So no single thing has taken a huge hit.

00:20:13.860 --> 00:20:17.800
And if it fails in one place, the equivalent of pip could say, well, let's try a mirror

00:20:17.800 --> 00:20:19.500
or something like that, you know?

00:20:19.500 --> 00:20:19.900
Yeah.

00:20:19.900 --> 00:20:21.000
And yeah.

00:20:21.000 --> 00:20:23.620
Anyway, so they're like, all right, well, 36 bucks a month.

00:20:23.620 --> 00:20:25.960
And on top of that, what were they doing before?

00:20:25.960 --> 00:20:28.020
AWS is what they were doing before, I believe.

00:20:28.020 --> 00:20:33.100
So on AWS, if they wanted to push out a new website deploy, it took five minutes to push

00:20:33.100 --> 00:20:35.560
it out, deploy, go through all the stuff just to get it up.

00:20:35.560 --> 00:20:39.680
And on their little Hetzner server, it takes zero, takes two seconds.

00:20:39.680 --> 00:20:41.560
It's so crazy.

00:20:41.560 --> 00:20:42.480
To set up the job.

00:20:42.480 --> 00:20:42.840
Yeah.

00:20:42.840 --> 00:20:43.640
Yeah.

00:20:43.640 --> 00:20:45.920
Basically to call start and then off it goes, right?

00:20:45.920 --> 00:20:47.520
There's probably something like check every second.

00:20:47.520 --> 00:20:48.960
There's a new job or whatever.

00:20:48.960 --> 00:20:52.600
Anyway, I think this is a, you know, packaging is a big conversation.

00:20:52.600 --> 00:20:55.280
Cloud, no cloud is a big conversation.

00:20:55.280 --> 00:21:01.620
Costs and risks like the black swan of, well, what if the people backing Pythons, especially

00:21:01.620 --> 00:21:04.640
PyPI, that infrastructure, what if they decided to stop?

00:21:04.720 --> 00:21:07.400
Like how do you get a hundred thousand dollars a month all of a sudden?

00:21:07.400 --> 00:21:07.840
Yeah.

00:21:07.840 --> 00:21:08.940
You know, that's a big deal.

00:21:08.940 --> 00:21:12.860
I think people would figure it out, but it would be a big disruption where like, okay,

00:21:12.860 --> 00:21:13.780
what are we going to set up?

00:21:13.780 --> 00:21:18.640
And this PEP with self-hosted wheels is like a done, a bit of a deposit down on that.

00:21:18.640 --> 00:21:23.860
But anyway, this is interesting from a growing, but not yet super popular language.

00:21:23.860 --> 00:21:24.200
Yeah.

00:21:24.200 --> 00:21:24.780
Interesting.

00:21:24.780 --> 00:21:25.200
Cool.

00:21:25.200 --> 00:21:26.180
Indeed.

00:21:26.180 --> 00:21:34.240
And all the curly braces and stuff were because it's mentioned by Corky that it's also interoperable

00:21:34.240 --> 00:21:34.700
with C.

00:21:34.700 --> 00:21:35.860
So that's interesting.

00:21:35.860 --> 00:21:36.140
Cool.

00:21:36.140 --> 00:21:36.500
Yeah.

00:21:36.500 --> 00:21:36.980
Yeah.

00:21:36.980 --> 00:21:38.060
It says it's more like C.

00:21:38.060 --> 00:21:39.140
I suppose so.

00:21:39.140 --> 00:21:40.940
It's, it's an interesting link.

00:21:40.940 --> 00:21:41.440
All right.

00:21:41.440 --> 00:21:43.500
Well, that's it for our main topics.

00:21:43.500 --> 00:21:44.500
Got any extras?

00:21:44.500 --> 00:21:47.100
I just have one extra that's going on.

00:21:47.100 --> 00:21:48.560
I wanted to let people know about.

00:21:48.920 --> 00:21:52.660
on, at the testing code, Python test.com.

00:21:52.660 --> 00:21:58.960
I've got courses and, and that's, they're going well and I'm glad people are getting

00:21:58.960 --> 00:21:59.360
value.

00:21:59.360 --> 00:22:04.960
But I also had a community and the community have a community, but it, it used to be on Slack,

00:22:04.960 --> 00:22:06.580
but it's one of those growth things.

00:22:06.580 --> 00:22:09.620
Slack was, it was free on Slack and now it's not.

00:22:09.620 --> 00:22:16.160
and so we switched to a Podia based forum and it's just not fun.

00:22:16.160 --> 00:22:22.420
So, and, I mean, great that Podia offers a forum since the courses are on Podia,

00:22:22.420 --> 00:22:29.180
but the, I'm going to say after several months of being on Podia and only like five

00:22:29.180 --> 00:22:32.340
comments on there, it's not, it's just not cutting it.

00:22:32.340 --> 00:22:33.260
It's not sparking joy.

00:22:33.520 --> 00:22:33.960
No.

00:22:33.960 --> 00:22:40.460
So we're going to, we're going to try discord and, and so just, I guess,

00:22:40.460 --> 00:22:41.880
hang in there, everyone.

00:22:41.880 --> 00:22:46.060
I'm trying to trying to get it associated so that everybody has that has community access

00:22:46.060 --> 00:22:48.320
will get access to the discord server.

00:22:48.320 --> 00:22:52.360
And, I'll probably, I don't know what we're going to do.

00:22:52.360 --> 00:22:53.500
I want it to be sustainable.

00:22:53.500 --> 00:22:55.300
So it can't just be completely free.

00:22:55.300 --> 00:23:00.800
but I also want it to, and, but I want it to be something that's easy for everybody to

00:23:00.800 --> 00:23:01.180
get into.

00:23:01.320 --> 00:23:03.480
So I guess, just stay tuned.

00:23:03.480 --> 00:23:06.180
we'll get that all ironed out as soon as we can.

00:23:06.180 --> 00:23:08.520
So anyway, any extras from you?

00:23:08.520 --> 00:23:09.460
Yeah, I got a few.

00:23:09.460 --> 00:23:10.740
It's, it's tricky, right?

00:23:10.740 --> 00:23:13.320
You want to pick something where people already are.

00:23:13.320 --> 00:23:16.900
Like they've got some app like Slack or discord or something open.

00:23:16.900 --> 00:23:21.520
There's a lot of cool options that you could pick even some neat self hosted ones.

00:23:21.520 --> 00:23:25.260
But if it's a completely different app that people have to remember to open instead of

00:23:25.260 --> 00:23:29.320
just another tab next to the thing they're already in, I think it's, it changes it, you

00:23:29.320 --> 00:23:30.320
know?

00:23:30.320 --> 00:23:30.320
So there's a problem.

00:23:30.320 --> 00:23:33.520
Like, for example, they got to go to podium versus like, oh, I'm over on this thing.

00:23:33.520 --> 00:23:37.260
And now I just go to the next tab open to see what's happening in this community.

00:23:37.260 --> 00:23:38.280
Yeah.

00:23:38.280 --> 00:23:43.920
So, and I even like when I mentioned it to my, so my daughter's in healthcare, she's not

00:23:43.920 --> 00:23:45.280
even like my oldest daughter.

00:23:45.280 --> 00:23:48.920
And, and, and I mentioned it to her and she's like, oh, I can help you with that.

00:23:48.920 --> 00:23:50.040
I'm on discord all the time.

00:23:50.040 --> 00:23:51.020
I'm like, oh, okay.

00:23:51.020 --> 00:23:52.200
great.

00:23:52.200 --> 00:23:53.360
So that's awesome.

00:23:53.360 --> 00:23:54.300
I love it.

00:23:54.300 --> 00:23:55.240
All right.

00:23:55.240 --> 00:23:55.960
I got some extras.

00:23:55.960 --> 00:23:56.520
Okay.

00:23:56.600 --> 00:24:00.080
One, still, still living the Zen, Zen browser lifestyle.

00:24:00.080 --> 00:24:01.400
It's, it's pretty good.

00:24:01.400 --> 00:24:03.000
So I'm going to keep going with that.

00:24:03.000 --> 00:24:04.200
That's fun, but that's not actually an extra.

00:24:04.200 --> 00:24:11.340
First extra is I was on the work item podcast talking with Dan over there for an hour about

00:24:11.340 --> 00:24:13.320
Python and business and stuff.

00:24:13.320 --> 00:24:14.940
And people can check that out if they want.

00:24:14.940 --> 00:24:15.360
That's fun.

00:24:15.360 --> 00:24:15.840
Neat.

00:24:15.840 --> 00:24:16.360
Yes.

00:24:16.360 --> 00:24:21.500
I feel like I, let me know if I talked about this before, Brian, I searched and searched

00:24:21.500 --> 00:24:24.740
and couldn't find it, but in my mind, we talked about, did, did I talk about the fact

00:24:24.740 --> 00:24:28.440
that you can subscribe as an RSS to GitHub releases?

00:24:28.440 --> 00:24:29.660
I don't know.

00:24:29.660 --> 00:24:30.480
I don't think so.

00:24:30.480 --> 00:24:31.820
Cause I couldn't find it in my mind.

00:24:31.820 --> 00:24:32.100
I did.

00:24:32.100 --> 00:24:38.020
But anyway, if you go to any release and you just type dot Adam on the end, what you get

00:24:38.020 --> 00:24:42.440
is a popular download window instead of showing it, but it gives you an RSS feed.

00:24:42.440 --> 00:24:43.940
So go to your project.

00:24:43.940 --> 00:24:46.580
You like click on the releases and put dot Adam on the end.

00:24:46.580 --> 00:24:48.640
And you can put that in your RSS feeder reader.

00:24:48.820 --> 00:24:52.620
So that'll pop up if you like, Hey, there's a new release of this thing that I'm interested

00:24:52.620 --> 00:24:52.860
in.

00:24:52.860 --> 00:24:53.920
That's pretty cool.

00:24:53.920 --> 00:24:58.040
And then let me make sure I attribution, right.

00:24:58.040 --> 00:24:59.320
This is Jamie Thompson.

00:24:59.320 --> 00:25:05.940
So this over and said, there's a new release of PI test BDD behavior driven design in not

00:25:05.940 --> 00:25:08.400
just a new release, but 8.0, which is a big release.

00:25:08.400 --> 00:25:08.640
Right.

00:25:08.640 --> 00:25:11.040
And probably the most interesting thing is the data tables.

00:25:11.040 --> 00:25:12.120
Have you seen these data tables?

00:25:12.120 --> 00:25:12.960
That's neat.

00:25:12.960 --> 00:25:18.120
It's kind of like a parameterized query, but it's also kind of like a markdown table.

00:25:18.400 --> 00:25:19.940
Given the following users exist.

00:25:19.940 --> 00:25:23.640
And then you just have pipe, you know, a header pipe name, pipe email, pipe Twitter,

00:25:23.640 --> 00:25:26.600
and then values just row, row, row, row, row.

00:25:26.600 --> 00:25:27.360
That's pretty neat.

00:25:27.360 --> 00:25:27.560
Yeah.

00:25:27.560 --> 00:25:27.960
Yeah.

00:25:27.960 --> 00:25:28.460
All right.

00:25:28.460 --> 00:25:33.860
So anyway, if people like their BDD, they can check out my test BDD.

00:25:33.860 --> 00:25:34.520
That's pretty cool.

00:25:34.520 --> 00:25:38.620
Also last week I rewrote all the code.

00:25:38.740 --> 00:25:45.240
I did a little terminal CLI magic and there are a little over 10,000 lines of Python code

00:25:45.240 --> 00:25:47.080
that don't involve blank space.

00:25:47.080 --> 00:25:52.260
So meaningful lines for talk Python and Python bytes a little bit less, but not tremendously

00:25:52.260 --> 00:25:52.640
less.

00:25:52.640 --> 00:25:58.020
I rewrote that in court, which is asynchronous flask, which was pretty awesome.

00:25:58.360 --> 00:26:03.280
So this thing is, is running a little more efficiently, a little bit faster, a little bit better than

00:26:03.280 --> 00:26:03.920
it was before.

00:26:03.920 --> 00:26:09.900
And completely rewriting 10,000 lines of code in two days is, is quite a, quite an undertaking.

00:26:09.900 --> 00:26:10.980
You're tired at the end of that.

00:26:10.980 --> 00:26:11.580
Let me tell you.

00:26:12.580 --> 00:26:13.440
But it's awesome.

00:26:13.440 --> 00:26:14.480
It came out really, really well.

00:26:14.480 --> 00:26:15.960
I did it in two rewrites, actually.

00:26:15.960 --> 00:26:20.500
One rewrite to just convert it from pyramid to flask, and then a second rewrite to convert

00:26:20.500 --> 00:26:25.260
it from sync to async for almost every endpoint and all the code below it and all that, all the

00:26:25.260 --> 00:26:26.500
database queries and stuff like that.

00:26:26.500 --> 00:26:30.940
So did it affect like everything or did it, what were the main parts?

00:26:30.940 --> 00:26:35.760
There were, there was, there's certain parts that it doesn't affect, but anything with database

00:26:35.760 --> 00:26:37.500
access required it.

00:26:37.500 --> 00:26:41.460
And then there's, there's all in, in web frameworks, when you're writing web apps, you're always

00:26:41.460 --> 00:26:45.900
dealing with little aspects of that's frameworks API.

00:26:45.900 --> 00:26:51.540
So I need to get the URL of the current request to see if I should do a redirect or

00:26:51.540 --> 00:26:52.060
not.

00:26:52.060 --> 00:26:56.800
Well, the way you get the URL is completely different in pyramid versus flask.

00:26:56.800 --> 00:27:02.720
So anything that kind of touched headers, cookies, URLs, you know, if you want to know if somebody's

00:27:02.720 --> 00:27:05.540
logged in and that's, you know, that's also a cookie, right?

00:27:05.540 --> 00:27:11.280
There's, it's surprisingly knock on effects and flask and quartz a little bit funky in

00:27:11.280 --> 00:27:15.460
some ways where there's this thread local requests that you can just access out of thin air,

00:27:15.460 --> 00:27:16.220
which is cool.

00:27:16.220 --> 00:27:19.840
Unless for some reason the call started here and it ends up over there.

00:27:19.840 --> 00:27:25.060
Maybe there was a thread or some kind of delay where that's become disconnected that it'll

00:27:25.060 --> 00:27:28.300
complain to you that it doesn't know what the request is, even though you have a request

00:27:28.300 --> 00:27:28.660
object.

00:27:28.660 --> 00:27:30.640
Like there's a lot of weird changes.

00:27:30.640 --> 00:27:31.460
So yeah.

00:27:31.460 --> 00:27:32.840
But anyway, it was really fun.

00:27:32.840 --> 00:27:35.820
I'm doing a write-up on that, but I just thought I'd throw that out there and that's going

00:27:35.820 --> 00:27:36.080
well.

00:27:36.080 --> 00:27:36.460
Cool.

00:27:36.460 --> 00:27:37.200
And that's it.

00:27:37.200 --> 00:27:39.300
Shall we, shall we tell a joke?

00:27:39.300 --> 00:27:40.560
A joke would be wonderful.

00:27:40.820 --> 00:27:44.940
This one, we've done short form jokes and we've done long form jokes, Brian.

00:27:44.940 --> 00:27:47.660
This might be the best long form joke.

00:27:47.660 --> 00:27:51.480
So y'all are going to have to stick with me for just a second here, but check this out.

00:27:51.480 --> 00:27:53.320
Here's the breaking headline.

00:27:53.320 --> 00:27:53.840
Breaking.

00:27:53.840 --> 00:27:58.840
JavaScript developer commits to a framework for a record-breaking three weeks.

00:28:00.100 --> 00:28:05.200
Of course, it comes with a picture of a clown luring JavaScript developers into some shady

00:28:05.200 --> 00:28:05.500
spot.

00:28:05.500 --> 00:28:07.280
But let me read the press release, okay?

00:28:07.280 --> 00:28:08.680
Simi Valley, California.

00:28:08.680 --> 00:28:14.260
In an unprecedented display of consistency that has left the tech world reeling, local web

00:28:14.260 --> 00:28:19.120
developer Alex Chen, 28, has reportedly stuck with the same JavaScript framework for an astonishing

00:28:19.120 --> 00:28:19.820
three weeks.

00:28:19.820 --> 00:28:24.840
Chen, known in the local dev circles as the framework whisperer, or his abilities to adopt

00:28:24.840 --> 00:28:31.380
and discard JS frameworks at breakneck speeds, has been using Svelte without interruption since

00:28:31.380 --> 00:28:36.760
August 1st, shattering his previous record of four days set with Vue.js back in 2022.

00:28:36.760 --> 00:28:41.400
I don't know what came over me, Chen said, visibly shaken by his own stability.

00:28:41.400 --> 00:28:45.340
I woke up one morning and I just don't feel like switching to Angular or React or that new

00:28:45.340 --> 00:28:46.920
framework that was released during the interview.

00:28:46.920 --> 00:28:50.740
The news has sent shockwaves through the JavaScript community.

00:28:50.740 --> 00:28:56.080
Framework creators are reportedly in crisis mode, with one ace anonymous source from a

00:28:56.080 --> 00:29:00.500
major tech company stating, if developers start sticking with one framework, how will

00:29:00.500 --> 00:29:01.520
we justify our jobs?

00:29:01.520 --> 00:29:05.300
Chen's colleagues have expressed a mix of awe and concern.

00:29:05.300 --> 00:29:08.480
Senior developer Lisa Patel noted, I'm worried about Alex.

00:29:08.480 --> 00:29:12.900
Yesterday, I caught him reading the documentation instead of immediately rewriting our entire

00:29:12.900 --> 00:29:14.160
code base in a new framework.

00:29:14.160 --> 00:29:15.240
It's not like him at all.

00:29:15.240 --> 00:29:19.600
The unprecedented event has not been without its challenges.

00:29:19.600 --> 00:29:24.000
Chen admitted to suffering from withdrawal symptoms, including uncontrollable urges to

00:29:24.000 --> 00:29:30.540
create new npm packages and a persistent eye twitch triggered by the site of a stable

00:29:30.540 --> 00:29:31.320
well-maintained code.

00:29:31.320 --> 00:29:34.420
Despite the difficulties, Chen remains committed to seeing this through.

00:29:34.420 --> 00:29:38.620
Taking it one day at a time, he said, his fingers twitching as he resists the urge to type

00:29:38.620 --> 00:29:39.960
NPX create next app.

00:29:39.960 --> 00:29:44.840
But I've heard whispers of a revolutionary new framework that's only been downloaded 50 times.

00:29:44.840 --> 00:29:47.280
Maybe I'll check it out, you know, just to stay informed.

00:29:47.280 --> 00:29:48.860
Good, right?

00:29:49.660 --> 00:29:50.380
That's funny.

00:29:50.380 --> 00:29:51.700
Yeah.

00:29:51.700 --> 00:29:53.580
You got to appreciate the stability.

00:29:53.580 --> 00:29:57.140
Appreciate the stability of Django, of Python, of a lot of things that we got.

00:29:57.140 --> 00:30:03.020
I mean, it's a joke, but it's also true that there's a lot of churn on that space.

00:30:03.020 --> 00:30:03.400
Yeah.

00:30:03.400 --> 00:30:07.500
I mean, like how many people here are like, should I stick with Python or should I go to

00:30:07.500 --> 00:30:08.520
Zig now?

00:30:08.520 --> 00:30:09.400
Yeah, I know.

00:30:09.400 --> 00:30:12.960
Well, we might have just, we might have sent a whole bunch of people over there unintentionally.

00:30:13.120 --> 00:30:13.980
That wasn't the intention.

00:30:13.980 --> 00:30:16.980
I mean, Zig has a lot less.

00:30:16.980 --> 00:30:20.740
I mean, I don't think tractor when I think Zig, but Rust kind of.

00:30:20.740 --> 00:30:21.520
Yeah, true.

00:30:21.520 --> 00:30:26.200
Well, and if you want to make sure you're alphabetically sorted to the very end, right by the comment

00:30:26.200 --> 00:30:27.100
section, Zig.

00:30:27.520 --> 00:30:27.840
Yeah.

00:30:27.840 --> 00:30:31.980
So people just like change frameworks by the alphabet and then they turn out.

00:30:31.980 --> 00:30:33.300
You get to the end.

00:30:33.300 --> 00:30:34.820
They're like, well, there's nothing left to change.

00:30:34.820 --> 00:30:35.340
They're over here.

00:30:35.340 --> 00:30:37.460
Nice.

00:30:37.460 --> 00:30:39.620
Well, always, always lovely to have you here.

00:30:39.620 --> 00:30:40.000
Thanks.

00:30:40.380 --> 00:30:40.800
Thank you.

00:30:40.800 --> 00:30:41.200
Yep.

