Python Bytes - #410 Entering the Django core
Episode Date: November 18, 2024Topics covered in this episode: Thoughts on Django’s Core futurepool Don't return named tuples in new APIs Ziglang: Migrating from AWS to Self-Hosting Extras Joke Watch on YouTube About the sho...w Sponsored by us! Support our work through: Our courses at Talk Python Training The Complete pytest Course Patreon Supporters Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Brian #1: Thoughts on Django’s Core Carlton Gibson Great discussion on Django and Core vs Plugins Sustainability with limited people Keeping core small The release cycle eembrace plugins vs endorsing plugins. Michael #2: futurepool via Pat Decker Takes the concept of multiprocessing Pool to the async/await world. Create a pool then delegate the work: async with FuturePool(2) as fp: result = await fp.map(async_pool_fn, range(10)) I would LOVE to see something like this in a broader background asyncio worker pool concept. But that concept doesn’t exist in asyncio in Python and that’s a failing of the framework IMO. Brian #3: Don't return named tuples in new APIs Brett Cannon First off, I’m grateful for any post that talks about APIs and the API is a module, class, or package API and not a Web/REST API. The term API existed long before the internet. “e.g., get_mouse_position() very likely has a two-item tuple of X and Y coordinates of the screen” “it actually makes your API more complex for both you and your users to use. For you, it doubles the data access API surface for your return type as you have to now support index-based and attribute-based data access forever (or until you choose to break your users and change your return type so it doesn't support both approaches)” “… you probably don't want people doing with your return type, like slicing, iterating over all the items …” Alternatives class dataclass dictionary TypedDict SimpleNamespace “My key point in all of this is to prefer readability and ergonomics over brevity in your code. That means avoiding named tuples except where you are expanding to tweaking an existing API where the named tuple improves over the plain tuple that's already being used.” Michael #4: Ziglang: Migrating from AWS to Self-Hosting The Rust Foundation for example, reports that they spent $404,400 on infrastructure costs in 2023. Zig lang has decided to use a single big cloud machine + mirrors Extras Brian: Changing the Python Test community Was started to answer questions for Test & Code listeners years ago. Primarily pytest questions Used to be Slack. Then moved to Podia forum. Now I’m trying to work out a Discord solution that is both sustainable and usable. Michael: PWang Bsky essay Building A Business From Python Expertise - Michael Kennedy on Work Item Podcast Subscribe to package releases, just put .atom on the end of their releases URL, for example: github.com/mikeckennedy/jinja_partials/releases ← add .atom for RSS pytest-bdd 8.0.0 was just released via Jamie Thomson The big feature (in Jamie’s opinion) is the addition of data tables https://github.com/pytest-dev/pytest-bdd/blob/master/CHANGES.rst#800---2024-11-14 Joke: Breaking: JavaScript Developer Commits to Framework for Record-Breaking 3 Weeks
Transcript
Discussion (0)
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 410, recorded Monday, November 18th at 7.37am.
Again, an unusual time for our live streaming, but here we are.
I am Michael Kennedy.
And I am Brian Ocken.
This episode is brought to you by us, our courses, the podcast, all those things, Brian's book, etc.
Check them out, links are in the podcast show notes there.
You can find them right in your podcast player.
And we have a standard introduction, Brian, of, hey, follow us on Mastodon.
But you know what?
This is not news to you.
You created us a Python Bytes Blue Sky account.
How about that?
Yeah, Blue Sky.
So you can still follow us on Mastodon.
We're still very active there.
But if you're one of the many people that never really made your way to Mastodon,
but decided to make your way to blue sky,
well, then make your way over to the pythonbytes.bsky.social account,
where that is the jumping off point to stay in touch with all of us.
So follow the podcast there.
You can follow Brian.
He's linked in the profile there. You can follow Brian. He's linked in the profile there. You can
follow me over there as well. And once you click on me, you can find TalkPython and all those
things, you know, follow the chain, follow the chain. So follow us on Mastodon and BlueSky.
I'm enjoying BlueSky, Brian. What do you think about it? I think it's, I think the default,
I like it. Also, I like that the default experience is pretty good i mastodon i i
love mastodon but i had to get to i'm using the mona um client on my iphone and it works it's a
really comfortable thing but it took me a while to get there because the there really isn't i don't
if there is a default mastodon client it's not great um yeah there is a default one but i i tried
it for a while and i switched to mona as well yeah so yeah um i'm like if people if a bunch of people want to move over there you know we
should be part of that community there's a ton of familiar faces many of the people we talk about on
the show are pretty active over there so but it doesn't you know one thing it doesn't have an edit
feature when you post you're you're done you can't edit it later just prepare people prepare to
receive a lot of typos
for some reason like type fast on my phone i don't really look it just said that may be on me
and but i think it's bad form to call people out on typos on social media platforms you know that's
just yeah anyway cool indeed indeed and you know final bits of introduction check out the live show we don't know when it is
we might like to say normally what i don't remember now well what there's what we normally
say is monday at 10 a.m pacific time but then there's what we normally do which recently has
been 7 30 a.m over the place yeah blame yeah no it's fine it's fine we'll we'll figure out a time
but you can always find the next episode pretty much right as this one ships.
So if you just click on there, it'll take you to YouTube.
That has the time.
Yeah.
Finally, subscribe to the newsletter.
You guys know the deal.
Handcrafted, artisanal, from Brian.
By the might side of him.
Hit newsletter.
And with that, what do we got?
Let's talk about Django for a bit.
So Carlton Gibson, who was the Djangoango fellow and is has stepped i think he last
year i believe he did step down he is a django chatter though django chat yeah django chat's
awesome uh another podcast um but so his he has thoughts on django core and it's kind of a long
article um but it's uh well written and the the it's talking about dango core versus Django plugins and the longevity of Django and everything and the whether or not batteries included and things like that and how to sustain it.
So one of the things that I guess I kind of forget that Django will be 20 years old.
Nick's birthday is 20 years ago or 20 years.
That's pretty long time.
So it must be 19 now.
And it's that's a long time.
And so one of the sustainability, sustainable parts is that there's lots of stuff there.
There's like this idea of the it's the web framework for perfectionists with deadlines.
And it's also the batteries included framework, but not too many batteries.
So there's a small core um and
then also talking about like a lot of people understand that the power of django isn't really
just the core 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 is a architecture. And the, so what is this talking about?
A lot of people don't realize
that there's just a few people working.
I mean, it's not a huge team
for how many people are using Django.
There's one and a half, I'm trying to find it.
I like this.
Anyway, we'll get to that.
There's one and a half.
Wait, wait, we can't just go right past it.
This is a, this is a this is a this is great pinky in the brain reference amazing yeah pink in the brain i
love them okay so g brain what are we going to do tonight same thing we do every night pinky
try to get our package into django core um this is hilarious uh so the idea is it's difficult to get features into Django core,
but maybe you don't want to.
Somebody, I can't remember the attribution that's listed in here,
but somebody mentioned that core is where plugins go to die,
which is a little harsh,
but people need to understand that if you get your feature in core,
it doesn't change very frequently then.
They do a deprecation release like every two years.
So if you want to deprecate a feature, it's two years.
If you want to add something new, it's a slow process.
There's a lot of testing involved.
It's going to be way easier to get a new feature if it's in a plugin also.
And if we look back, I mean, thinking in the future,
like we might, one example here was,
I'm not going to try to find it,
but one example was XHTML or X, yeah, that's right.
XHTML, super awesome.
A lot of people are using it.
Should that be part of supported natively in core?
Well, we look back a few years, it would have been like React or something.
Should Django natively support React?
Glad they chose no.
Now, XHTML might be the next no in a few years.
We never know.
Also, yeah, there's a lot of examples around that.
Django REST framework.
I kind of forget that that's not a core thing. That's a, it's just one of the really popular plugins. But there's like Django Ninja that is, that is awesome also. And maybe it wouldn't exist if, if Django rest framework was part of the core. So the ecosystem is great, but there is, there is a tension there that I like
this, the discussion of is that Django, even the Django website doesn't like the team doesn't like
to, um, to like pick the, the, the plugins that everybody should use or the winner plugins,
because that's kind of like bringing in a decor that's, that kind of reduces the, uh, competition
and the ecosystem. But at the same time, it's hard as a reduces the uh competition and the ecosystem but at the
same time it's hard as a beginner to jump in and say okay so which no really what plugins should
i be using um and there isn't a should for everybody of course but i think there i i guess
this i'll enjoy this discussion it's around how how should we support the ecosystem while not squelching the ecosystem?
So anyway, I saw corollaries between this and PyTest as well,
because PyTest has the same sort of issue that there's a core
and there's things in the core that I wish weren't there.
And there's things that are out of the core that I think maybe should be.
And so everybody's going to have those opinions and
dealing with um whether or not you uh sanction a plugin or not that's a it's it's a troubling
thing for all every every system so anyway it's uh it's a tough tension so anyway out in the
audience we got give henny says it's great to see jango now got task you feature added no need for
celery anymore here it is right yeah it's awesome to be Django now got task queue feature added. No need for Celery anymore.
Here it is, right?
Yeah.
It's awesome to be able to just say, no, we can run stuff asynchronously.
We don't need a mega infrastructure, like maybe just an async IO loop or a thread.
On the other hand, it's weight that's permanently on Django now, right?
Yeah.
Yeah.
Another little comic that was in there is this um is this comic of how you
think happens open source apps are maintained and there's a picture of like tons of people
hanging out drawing on whiteboards and talking and stuff and the reality is uh
one dude in a basement saying just one more ticket before I go to bed. Yeah, yeah, absolutely.
Let's go to the future.
Okay.
Where we're going, we don't need roads.
We're going to go to the future pool.
This one comes to us from Pat Decker.
Thank you, Pat.
And this is an interesting idea about library
that allows you to do multi-processing type of work,
but with Async IO.
One of the challenges with async IO
is you can overwhelm the system
and it does not, what's the term?
I think you would say it doesn't feel back pressure.
So let me give you an example.
If you're doing regular programming
where you call a function and it blocks,
I'm calling it writing a database query
and it stays there until the response,
until the database gets back to you, right?
Well, if the database is busy, that slows down the part of the code that's calling the database,
right?
The code that's calling the part of the code that's calling database,
and it kind of backs up the entire system and slows it down.
But with asyncIO, you're just sort of throwing more work at it and then carrying on.
So you can go make even more work for it, right?
So one of the challenges of asyncIO is you can just overwhelm the system.
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.
It's challenging to set that limit.
So that's kind of what this feature pool thing does.
It's cool.
It's a small use case because the way that you use it.
But still, it's cool.
So in multi-processing,
this is the traditional, I create sub processes because Python has this thing called the Gil
and we can't really do computational parallelism. So we're going to do it this way. So what you can
do is say, Hey, maybe we only have two cores or I only want to consume two cores or whatever.
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 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. As one gets done, get the next and just
keep going until you're out, right? So that's what this idea of future pool is, but for async IO.
So you can say async with future pool of however many you want, and then you can await future pool
map some function over some block of work. Simple, but interesting, right?
And this way it will stop the caller, can't go on anymore,
then while it's sort of limiting.
So why do I say this is pretty limited?
And why would it be better?
How could it be better?
So this is a local little thing that you create in one function once,
and it does the work. Also, you can't just
say run this task asynchronously. You have to use this map reduce pattern on it, which is not a
normal programming thing. It's not like I'm calling this function, I'm awaiting that, and I'm calling
that function, I'm awaiting that. What would be awesome is if some way you could go and say for
this program or this thread, or maybe not ideal,
but maybe even for this event loop, I don't care how work gets to it. Let's limit it to five at a
time. So if a web request kicks something off, awesome. It's it, it goes into that thing that's
limited by five concurrent requests. If I say a weight, something I call it's also participating
in this, this pooling throttling limiting type thing, but async IO, as far as I call, it's also participating in this, this pooling throttling limiting type thing. But
async IO, as far as I know, doesn't have that concept. So maybe this could both be useful for
some folks and motivation for someone to create something really interesting that is a little more
broadly useful. Yeah. It's probably dangerous to architect, uh, on the fly here, but, um,
isn't there like something that you've used before that is async sometimes?
Yeah, I used unsync, U-N-S-Y-N-C, which is pretty interesting.
And that would certainly be possible to do that because what that does is that converts
or processes all the asynchronous requests everywhere into a single loop on a single background thread no yeah that possibly that i was
just thinking a similar model of you'd want to you'd want to like give work to this the system
exactly and have it be async until it can't be and then have it block so i see yeah yeah yeah
um yeah that would be great the problem is i think it really needs something a little bit lower level than people can build packages for.
Yeah.
It kind of needs to be part of Python itself.
There is UV loop.
Part of the cohort.
Yeah, part of the way.
Here we go again.
So it needs to be something that is the loop itself almost as work gets added to it, right?
But, you know, UV loop can replace the regular async IO loop,
which is generally a good idea when possible.
But so maybe it's that level that you got to work at.
Maybe we could look in that realm and see what we could do.
Because it would be really cool to say,
hey, this thing can handle all the concurrency you want to throw at it,
but it's only going to pass it on
or you execute it more 10 at a time or something like that.
Anyway, people can go to
the future with future pool and check it out and maybe it's useful for your project yeah it's funny
you said uv loop and i'm like uv has loops oh no uv loop was a thing way before uv yeah uv loop was
uh yeah a magic stack right uv loop's been around i don't know how long it's been around but at least
three years at least eight years oh sorry yeah at least eight years. At least eight years. Oh, sorry, yeah, at least eight years. So that's longer than UV.
Yeah, anyway, okay.
Yeah.
All right, over to you.
I want to go to an article called from Brett Cannon,
called Don't Return Named Tuples in New APIs.
It's a simple sort of thing,
but it's a good thing to remind people of.
So first off, I want to thank Brett for using the term API
in a sense of the API for a method or for a function
or for a class or module,
and not necessarily an API for a REST API.
We're not talking about REST APIs or web APIs.
We're talking about good old function, just good old APIs.
Anyway, so the idea is named tuples are kind of awesome. And
they're fun, because you can just in one line, say, hey, I've got like, say a point, and it's,
it's cool. And why would I return that return a name tuple is because something like that,
like a point, so that it's obvious that people can access X, Y, Z or whatever.
Um, and, and in some things like point, it's easy to, you know, or get mouse position,
you know, it's an X, Y coordinate.
Um, so X and Y are probably there. However, so why, why would you not want to use this?
Um, and he's arguing that, and I kind of agree is that, um, it's really easy to implement
something with a named tuple,
but now you've got to support
both index-based, index access, like a tuple,
or named access, as if it was a dictionary.
So having both index access and name access
is probably not what you meant.
And I've seen this, a lot of people assume once it's
a name tuple, people are going to use the name, but it's also a tuple. So you can use it, you can
slice it, and I'll do all sorts of stuff. So the and it's really just to get around, like to not
have to do a class, but classes are easier now. So there's some alternatives to alternatives to
name tuple, you can return a data class. and that would be something I'd grab possibly data class or a dictionary.
Dictionary would work fine or typed dict.
The one of the things that is nice about a typed dict is dict is that you get editor support as well because you've got the types defined in there um and then something new to me which i'm gonna have to play with is a simple namespace um which gives us the ability to to access the
the names but um it's not indexable i haven't played with uh namespace simple namespace so
i'll have to do that i haven't heard of simple namespace either and i haven't really used type
dict um well they both are good options i haven't either i like kindpace either, and I haven't really used type dict. Well, they both are good options.
I haven't either.
I kind of jumped on the data class bandwagon
and use data classes a lot now
because I do think about that.
Actually, I need to think about it more,
but I haven't really been using name tuples to return stuff.
So the recommendation really is just be careful,
and I'll read his quote. He said, my key point in all of this is to prefer readability and ergonomics over brevity in
your code. That means avoiding named tuples, except when you're expanding or tweaking an
existing API, where the named tuple improves over the plain tuple that is already being used. So if you're
and that's, I guess that that's something I think I have done. If you are the return value was a
tuple before, it's been a tuple for a long time, there's existing code using it, but it really
should have been a named something. Adding a named tuple allows people to use both. And that might be ergonomically better.
But the caveat really is you've got a lot of testing to do
because you've got to test both accesses now.
So test more.
So anyway.
Awesome.
Yeah, that's a good article, Brett.
No surprise there.
No surprise.
Okay.
Let's talk about a different programming language.
But I think this is interesting, an interesting perspective.
Okay.
So the Zig programming language, are you familiar with Zig?
No.
It's kind of new to me as well. If you go and look at some examples here, it looks, I think it looks a little like Rust-like.
I'm not sure, but if you go down, it does a lot of simple things.
It interoperates really quickly and easily with either C or Windows APIs or stuff like that.
It looks pretty approachable, but it's a low-level programming language like C or Rust, right?
What are all those semicolons and curly braces doing in my code?
I know. You probably delete them. I don't think they're really needed.
So here's the interesting thing.
They recently were spending quite a bit of money on AWS,
and they've decided that they would be better off
not spending their supporters' money on hosting.
So, for example, they said the Rust Foundation reports
that it spends $404,000 on infrastructure websites
and stuff like that, and probably mostly packages.
And it says, we don't really know anything about PyPI and Python.
Like, what does python.org cost to run?
And mostly because that's a lot of the infrastructure costs are donated.
They said, look, as this language is growing,
we don't really want for that to be our issue.
They were getting upwards of $1,000 a month for their AWS bill, which is not. We don't really want for that to be our issue. They were getting upwards of $1,000 a month
for their AWS bill, which is not insane, but...
For an open source project, yeah.
Yeah, it's kind of up there.
But what they said is, look,
zigling.org, that's their equivalent of python.org,
says this is not an essential service.
It's not an emergency if it goes down.
And 99% uptime is perfectly fine.
It's the last 1% of uptime that represents 99% of the costs,
which is pretty interesting.
So they said, look, we got a $36 Hetzner server, which comes with 20 terabytes.
I think 20, at least 20 terabytes of bandwidth, which is about $2,000 of AWS
bandwidth included for the $36 and maybe someday we'll go crazy and spend a hundred
or 200 bucks, but we don't need to do more than that.
Like this,
this is enough.
Right.
And so what are they doing instead?
They're saying one,
they're encouraging and setting up a system that has package mirrors.
Right.
We remember we talked about that pep that would basically sign wheels and
then allow them to be hosted somewhere else as long as the signature still
matches so they're doing that kind of stuff from the start they're like we can spread this out in
a distributed style so no single thing has taken a huge hit and if it fails in one place the
equivalent of pip could say well let's try a mirror or something like that you know yeah and
yeah anyway so they're like all right well 36 bucks a And on top of that, what were they doing before?
AWS is what they were doing before, I believe.
So on AWS, if they wanted to push out a new website deploy, it took five minutes to push
it out, deploy, go through all the stuff just to get it up.
And on their little Hetzner server, it takes two seconds.
It's so crazy.
To set up the job.
Yeah.
Yeah.
Basically to call start and then off it goes
right there's probably something like check every second there's a new job or whatever anyway i think
this is a you know packaging is a big conversation um cloud no clown is a big conversation costs and
and risk like the black swan of well what if the people backing pythons especially pypi that
infrastructure what if they decided to stop like how do you get a
hundred thousand dollars a month all of a sudden yeah you know that's a big deal i think people
would figure it out but it would be a big disruption more like okay what are we going to
set up and this pep with self-hosted wheels is like a done a bit of a deposit down on that but
anyway this is interesting from a growing but not yet super popular language. Yeah, interesting. Cool.
Indeed.
And all the curly braces and stuff
were because it's mentioned by Corky
that it's also interoperable with C.
So that's interesting.
Cool.
Yeah, yeah.
It says it's more like C.
I suppose so.
It's an interesting link.
All right.
Well, that's it for our main topics.
Got any extras?
I just have one extra that's going on.
I wanted to let people know about.
So at the PythonTest.com, I've got courses.
And they're going well.
And I'm glad people are getting value.
But I also had a community.
And the community have a community.
But it used to be on Slack.
But it's one of those growth things. Slack was, it was free on Slack and now it's not. And so we switched to a Podia based forum and it's just not fun. So, and I mean, great that Podia offers a forum since the courses are on Podia, but the, um, I'm going to say after several
months of being on Podia and only like five comments on there, it's not, it's just not
cutting it.
It's not sparking joy.
No.
So we're going to, um, we're going to try discord and, um, um, and so just, I guess,
hang in there, everyone.
I'm trying to try to get it associated so that everybody has that has community access will get access to the discord server and um I'll probably I don't
know uh what we're gonna do I want it to be sustainable so it can't just be completely free
um but I also want it to and but I want it to be something that's easy for everybody to get into so
I guess uh just stay tuned um we'll get that all ironed out as soon as we can.
So anyway, any extras from you?
Yeah, I got a few.
It's tricky, right?
You want to pick something where people already are.
They've got some app like Slack or Discord
or something open.
There's a lot of cool options that you could pick,
even some neat self-hosted ones.
But if it's a completely different app
that people have to remember to open
instead of just another tab next to the thing they're already in i think it's it changes it you
know so there's a product like for example they got to go to podium versus like oh i'm over on
this thing and now i just go to the next tab open to see what's happening in this community
yeah so and even like when i mentioned it to my so my daughter's in health care she's not even
like my oldest daughter and and and i
mentioned it to her and she's like oh i can help you with that i'm on discord all the time i'm like
oh okay um great so that's awesome i love it anyway all right i got some extras uh one still
still living the zen zen browser lifestyle it's it's pretty good so i'm gonna keep going with
that that's fun but that's not actually an. First extra is I was on the work item podcast talking with Dan over there for an hour about
Python and business and stuff.
And people can check that out if they want.
That's fun.
Neat.
Yes.
I feel like I, let me know if I talked about this before, Brian.
I searched and searched and couldn't find it.
But in my mind, we talked about, did I talk about the fact that you can subscribe as an RSS to GitHub releases?
I don't know.
I don't think so because I couldn't find it.
In my mind, I did.
But anyway, if you go to any release and you just type.adam on the end,
what you get is a popular download window instead of showing it.
But it gives you an RSS feed.
So go to your project you like, click on the releases and put.adam on the end,
and you can put that in your RSS reader.
So that'll pop up if you like,
hey, there's a new release of this thing
that I'm interested in.
That's pretty cool.
And then let me make sure I had attribution right.
This is Jamie Thompson said this over and said,
there's a new release, a PyTest BDD,
behavior-driven design in not just a new release
but 8.0 which is a big release right and probably the most interesting thing is the data tables have
you seen these data tables that's neat it's kind of like a parameterized query but it's also kind
of like a markdown table given the following users exist and then you just have pipe you know
a header pipe name pipe email pipe twitter and then values just row, row, row, row, row.
That's pretty neat, huh?
Yeah.
All right.
So anyway, if people like their BDD, they can check out PyTest BDD.
That's pretty cool.
Also, last week I rewrote all the code.
I did a little terminal CLI magic.
And there are a little over 10,000 lines of Python code that don't involve
blank space. So meaningful lines for talk Python and Python bytes a little bit less, but not
tremendously less. Rewrote that in court, which is asynchronous flask, which was pretty awesome.
So this thing is running a little more efficiently, a little bit faster, a little bit better
than it was before and completely rewriting 10,000 lines of code in two days is quite an undertaking.
You're tired at the end of that, let me tell you.
But it's awesome.
It came out really, really well.
I did it in two rewrites, actually.
One rewrite to just convert it from Pyramid to Flask.
And then a second rewrite to convert it from sync to async for almost every endpoint.
And all the code below it and all that.
All the database queries and stuff like that so did it affect like everything or did it what were
the main parts were there was there was there's certain parts that it doesn't affect but anything
with database access required it and then there's there's all in in web frameworks when you're
writing web apps you're always dealing with little aspects of that framework's API.
So I need to get the URL of the current request to see if I should do a redirect or not.
Well, the way you get the URL is completely different in Pyramid versus Flask.
So anything that kind of touched headers, cookies, URLs, you know, if you want to know
if somebody's logged in, then that's, a cookie. It's surprisingly knock-on effects.
Flask and Quartz are a little bit funky in some ways where there's this
thread local request that you can just access out of thin air, which is cool unless
for some reason the call started here and it ends up over there. Maybe there was a
thread or some kind of delay where that's become disconnected
that it'll complain
to you that it doesn't know what the request is, even though you have a request object. Like,
there's a lot of weird changes. So yeah. But anyway, it was really fun. I'm doing a write-up
on that, but I just thought I'd throw that out there and that's going well. And that's it.
Shall we tell a joke? A joke would be wonderful. This one, we've done short form jokes and we've
done long form jokes, Brian.
This might be the best long form joke. So y'all are going to have to stick with me for just a second here, but check this out. Here's the breaking headline. Breaking. JavaScript developer
commits to a framework for a record breaking three weeks. Of course, it comes with a picture
of a clown luring JavaScript developers into some shady spot.
But let me read the press release, okay?
Simi Valley, California.
In an unprecedented display of consistency that has left the tech world reeling,
local web developer Alex Chen, 28, has reportedly stuck with the same JavaScript framework for an astonishing three weeks.
Chen, known in the local dev circles as the Framework Whisperer,
for his abilities to adopt and discard JS frameworks at breakneck speeds,
has been using Svelte without interruption since August 1st,
shattering his previous record of four days set with Vue.js back in 2022.
I don't know what came over me, Chen said, visibly shaken by his own stability.
I woke up one morning and I just don't feel like switching to Angular or React
or that new framework
that was released during the interview.
The news has sent shock waves
through the JavaScript community.
Framework creators are reportedly in crisis mode
with one anonymous source from a major tech company stating,
"'If developers start sticking with one framework,
"'how will we justify our jobs?'
Chen's colleagues have expressed a mix of awe and concern.
Senior developer Lisa Patel noted, I'm worried about Alex.
Yesterday, I caught him reading the documentation instead of immediately rewriting our entire
code base in a new framework.
It's not like him at all.
The unprecedented event has not been without its challenges.
Chen admitted to suffering from withdrawal symptoms, including uncontrollable urges to create new NPM packages
and a persistent eye twitch triggered by the site of stable, well-maintained code.
Despite the difficulties, Chen remains committed to seeing this through.
Taking it one day at a time, he said,
his fingers twitching as he resists the urge to type npx create next app.
But I've heard whispers of a revolutionary new framework
that's only been downloaded 50 times.
Maybe I'll check it out, you know, just to stay informed.
Good, right?
That's funny.
Yeah.
You ought to appreciate the stability.
Appreciate the stability, Django, of Python, of a lot of things that we got.
I mean, it's a joke, but it's also true that there's a lot of churn on that space.
Yeah.
I mean, like how many people here are like, should I stick with python or should i go to uh zig now yeah i know well we might have just
we might have sent a whole bunch of people over there unintentionally that wasn't the intention
i mean zig has a lot less i mean i don't think tractor when i think zig but rust kind of so yeah
true well and if you want to make sure you're alphabetically sorted to the very end
right by the comment section zig yeah so people just like change frameworks uh by the alphabet
and then yeah exactly you get to the end they're like well there's nothing left to change they're
here nice well always always lovely to have you here thanks thank you yep bye everyone