Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #410: Entering the Django core

Return to episode page view on github
Recorded on Monday, Nov 18, 2024.

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

00:05 This is episode 410, recorded Monday, November 18th at 7.37 a.m.

00:11 Again, an unusual time for our live streaming, but here we are.

00:14 I am Michael Kennedy.

00:15 And I am Brian Okken.

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

00:23 Check them out. Links are in the podcast show notes there.

00:27 You can find them right in your podcast player.

00:28 And we have a standard introduction, Brian, of, hey, follow us on Mastodon.

00:33 But you know what? This is not news to you.

00:35 You created us a Python Bytes Blue Sky account. How about that?

00:40 Yeah, Blue Sky.

00:41 So you can still follow us on Mastodon. We're still very active there.

00:44 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,

00:50 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.

01:00 So follow the podcast there.

01:02 You can follow Brian.

01:03 He's linked in the profile there.

01:05 You can follow me over there as well.

01:08 And once you click on me, you can find Talk Python, all those things.

01:11 Follow the chain.

01:12 Follow the chain.

01:13 So follow us on Mastodon and Blue Sky.

01:16 I'm enjoying Blue Sky, Brian.

01:17 What do you think about it?

01:19 I think the default, I like it.

01:21 Also, I like that the default experience is pretty good.

01:24 Mastodon, I love Mastodon, but I had to get to, I'm using the Mona client on my iPhone, and it works.

01:32 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.

01:40 Yeah, there is a default one, but I tried it for a while and I switched to Mona as well.

01:45 Yeah, so.

01:45 Yeah.

01:46 I'm liking it.

01:47 If a bunch of people want to move over there, you know, we should be part of that community.

01:51 There's a ton of familiar faces.

01:53 Many of the people we talk about on the show are pretty active over there, so.

01:56 But it doesn't, you know, one thing, it doesn't have an edit feature.

01:59 When you post, you're done.

02:01 You can't edit it later.

02:02 Just prepare people, prepare to receive a lot of typos from me.

02:06 For some reason, I like type fast on my phone and I don't really look and just hit send.

02:10 That may be on me.

02:11 But I think it's bad form to call people out on typos on social media platforms.

02:16 You know, that's just.

02:17 Yeah.

02:18 Anyway.

02:18 Cool.

02:19 Indeed.

02:20 Indeed.

02:20 And, you know, final bits of introduction.

02:22 Check out the live show.

02:24 We don't know when it is.

02:25 Maybe Monday at 7.

02:27 You'd like to say normally.

02:28 What?

02:28 I don't remember.

02:29 No.

02:30 Well, what?

02:30 There's what we normally say is Monday at 10 a.m.

02:33 Pacific time.

02:34 But then there's what we normally do, which recently has been 7.30 a.m.

02:37 All over the place.

02:38 Yeah.

02:39 Blame Brian.

02:40 No, it's fine.

02:40 It's fine.

02:41 We'll figure out a time.

02:43 But you can always find the next episode pretty much right as this one ships.

02:47 So if you just click on there, it'll take you to YouTube.

02:49 That has the time.

02:49 Yeah.

02:50 Finally, subscribe to the newsletter.

02:51 You guys know the deal.

02:52 Handcrafted.

02:53 Artisanal.

02:54 From Brian.

02:54 By the pythonbytes.fm newsletter.

02:56 And with that, what do we got?

02:58 Let's talk about Django for a bit.

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

03:07 I believe he did step down.

03:08 He is a Django chatter, though.

03:10 Django chat.

03:11 Yeah.

03:11 Django chat's awesome.

03:12 Another podcast.

03:13 But so he has thoughts on Django core.

03:16 And it's kind of a long article, but it's well written.

03:20 And it's talking about Django core versus Django plugins and the longevity of Django and everything.

03:29 And the whether or not batteries included and things like that and how to sustain it.

03:34 So one of the things that I guess I kind of forget that Django will be 20 years old.

03:39 Nick's birthday is 20 years ago or 20 years.

03:42 That's a pretty long time.

03:44 So it must be 19 now.

03:45 And that's a long time.

03:48 And so one of the sustainable abilities, sustainable parts is that there's lots of stuff there.

03:54 There's like this idea of the it's the web framework for perfectionists with deadlines.

03:59 And it's also the batteries included framework, but not too many batteries.

04:04 So there's a small core.

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

04:15 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.

04:23 And the so what is this talking about?

04:26 A lot of people don't realize that there's just a few people working.

04:31 I mean, it's not a huge team for how many people are using Django.

04:34 There's one and a half.

04:36 I'm trying to find it.

04:38 I like this.

04:38 Anyway, we'll get to that.

04:40 There's one and a half.

04:42 Wait, wait, we can't just go right past it.

04:43 This is a this is a this is great.

04:47 Pinky in the brain reference.

04:49 Amazing.

04:49 Yeah.

04:50 Pinky in the brain.

04:51 I love them.

04:51 OK, so G brain.

04:53 What are we going to do tonight?

04:54 Same thing we do every night.

04:56 Pinky.

04:56 Try to get our package into Django core.

04:58 This is hilarious.

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

05:07 Somebody I can't remember the attribution.

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

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

05:25 Then they do.

05:27 They do a deprecation release like every two years.

05:31 So if if you want to deprecate a feature, it's two years.

05:34 If you want to add something new, it's a slow process.

05:37 There's a lot of testing involved.

05:38 It's going to be way easier to get a new feature if it's in if it's in a plugin also.

05:44 And if we look back, I mean, thinking in the future, like we might.

05:48 One example here was I'm not going to try to find it, but one example was XHTML or X.

05:55 Yeah, that's right.

05:56 XHTML.

05:57 Super awesome.

05:58 A lot of people are using it.

06:00 Should that be part of supported natively in core?

06:03 Well, we look back a few years.

06:06 It would have been like React or something.

06:09 Should should Django natively support React?

06:11 Glad they chose no.

06:13 Now, XHTML might be the next no in a few years.

06:18 We never know.

06:20 Also, yeah, there's a lot of examples around that.

06:23 Django REST framework.

06:24 I kind of forget that that's not a core thing.

06:27 That's a it's just one of the really popular plugins.

06:30 But there's like Django Ninja that is that is awesome also.

06:35 And maybe it wouldn't exist if Django REST framework was part of the core.

06:40 So the ecosystem is great.

06:42 But there is there is a tension there that I like this.

06:46 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.

07:01 That's that kind of reduces the competition and the ecosystem.

07:05 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?

07:12 And there isn't a should for everybody, of course.

07:15 But I think there I guess this I enjoyed this discussion.

07:19 It's around how how should we support the ecosystem while not squelching the ecosystem?

07:25 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.

07:35 And there's things in the core that I wish weren't there.

07:37 And there's things that are out of the core that I think maybe should be.

07:41 And and so everybody's going to have those opinions and dealing with whether or not you sanction a plugin or not.

07:50 That's a it's a troubling thing for every every system.

07:54 So anyway, it's a it's a tough tension.

07:56 So anyway, out in the audience, we got you have any says it's great to see Django now got task you feature added.

08:03 No need for celery anymore.

08:05 Here it is.

08:06 Right.

08:06 Yeah.

08:06 It's awesome to be able to just say, no, we can run stuff asynchronously.

08:09 We don't need a mega infrastructure like maybe just an async loop or a thread or, you know.

08:15 Yeah.

08:15 On the other hand, it's it's weight that's permanently on Django now.

08:20 Right.

08:20 Yeah.

08:21 Yeah.

08:21 Yeah.

08:21 Yeah.

08:21 And another little comic that was in there is this is this comic of how you think happens open source apps are maintained.

08:29 And there's a picture of like tons of people hanging out, drawing on whiteboards and talking and stuff.

08:36 And the reality is one dude in the basement saying just one more ticket before I go to bed.

08:43 So.

08:44 Yeah.

08:45 Yeah, absolutely.

08:46 Let's go to the future.

08:47 Okay.

08:48 Where we're going.

08:48 We don't need roads.

08:50 We're going to go to the future pool.

08:52 This one comes to us from Pat Decker.

08:54 Thank you, Pat.

08:55 So this is an interesting idea about library that allows you to do multi processing type of work, but with asyncio.

09:05 One of the challenges with asyncio is you can overwhelm the system and it does not.

09:11 What's the term?

09:12 I think you would say it doesn't feel back pressure.

09:14 So let me give you an example.

09:16 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.

09:26 Right.

09:26 Well, the database is busy.

09:27 That slows down the part of the code that's calling the database.

09:31 Right.

09:31 The code is calling the part of the code that's calling database in.

09:35 It kind of backs up the entire system and slows it down.

09:37 But with asyncio, you're just sort of throwing more work at it and then carrying on.

09:42 So you can go make even more work for it.

09:44 Right.

09:44 So one of the challenges of asyncio is you can just overwhelm the system.

09:48 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.

09:54 It's challenging to set that limit.

09:56 Okay.

09:56 So that's kind of what this feature pool thing does.

09:58 It's, it's cool.

09:59 It's a small use case because the way that you use it, but still it's, it's cool.

10:03 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.

10:12 So we're going to do it this way.

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

10:18 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.

10:29 As one gets done, get the next and just keep going until you're out.

10:31 Right.

10:31 Yeah.

10:32 So that's what this idea of future pool is, but for asyncio.

10:35 So you can say async with future pool of however many you want.

10:39 And then you can await future pool map, some function over some block of work.

10:44 Simple, but interesting, right?

10:45 Yeah.

10:46 And this way it will stop the caller.

10:48 Can't go on anymore.

10:49 Then while it's, it's sort of limiting.

10:53 So why do I say this is pretty limited and why, why would it be better?

10:57 How could it be better?

10:58 So this is a local little thing that you create in one function once and it, it does the work.

11:06 Also, you can't just say, run this task asynchronously.

11:09 You have to use this map reduce pattern on it.

11:13 Yeah.

11:13 Which is not a normal programming thing.

11:15 It's not like I'm calling this function.

11:17 I'm awaiting that.

11:17 I'm calling that function.

11:18 I'm awaiting that.

11:18 What would be awesome is if some way you could go and say for this program or, or this thread,

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

11:30 Let's limit it to five at a time.

11:32 So if a web request kicks something off, awesome.

11:34 It's, it, it goes into that thing that's limited by five concurrent requests.

11:38 If I say, await something I call, it's also participating in this, this pooling, throttling,

11:45 limiting type thing.

11:45 But asyncio, as far as I know, doesn't have that concept.

11:48 So maybe this could both be useful for some folks and motivation for someone to create

11:54 something really interesting that is a little more broadly useful.

11:56 Yeah.

11:57 It's probably dangerous to architect on the fly here, but isn't there like something that

12:04 you've used before that is async sometimes that.

12:08 Yeah.

12:08 I used unsync, U-N-S-Y-N-C, which is pretty interesting.

12:13 And that would be, that would certainly be possible to do that because what that does is that converts

12:18 or processes all the asynchronous requests everywhere into a single loop on a single background thread.

12:24 No.

12:25 Yeah.

12:25 Possibly that.

12:27 I was just thinking a similar model of you'd want to, you'd want to like give work to this,

12:32 this system.

12:33 Exactly.

12:33 And have it be async until it can't be, and then have it block.

12:38 Mm-hmm.

12:38 I see.

12:39 Yeah.

12:39 Yeah.

12:40 Yeah.

12:40 Yeah.

12:41 That would be great.

12:41 The problem is I think it really needs something a little bit lower level than people can build

12:47 packages for.

12:48 Yeah.

12:48 It kind of needs to be part of, you know, part of Python itself.

12:51 There is UV loop.

12:53 Part of the cohort.

12:53 Yeah.

12:54 Part of the, wait, here we go again.

12:56 So it needs to be something that is the loop itself almost as work gets added to it.

13:01 Right.

13:02 But, you know, UV loop can replace the regular asyncio loop, which is generally a good idea

13:06 when possible.

13:06 But so maybe, maybe it's, it's that level that you got to work at.

13:10 Maybe we could look, look in that realm and, and see what we could do.

13:13 Because it would be really cool to say, hey, this thing can handle all, all the concurrency

13:16 you want to throw at it, but it's only going to pass it on or you execute it more 10 at

13:21 a time or something like that.

13:22 Yeah.

13:23 Anyway.

13:23 Oh dear.

13:24 People can go to the future with future pool and check it out.

13:27 And maybe it's useful for your project.

13:29 Yeah.

13:29 It's funny.

13:30 You said UV loop and I'm like, UV has loops.

13:32 Oh no.

13:33 UV loop was a thing way before UV.

13:35 Yeah.

13:35 UV loop was a, yeah.

13:37 Magic stack, right?

13:38 UV loop's been around.

13:39 I don't know how long it's been around, but at least three years.

13:42 At least eight years.

13:43 Oh, sorry.

13:43 Yeah.

13:44 At least eight years.

13:44 So that's longer than UV.

13:46 Yeah.

13:46 Yeah.

13:47 Anyway.

13:47 Okay.

13:48 Yeah.

13:48 All right.

13:49 Over to you.

13:49 I want to go to an article called, from Brett Cannon, called Don't Return Named Tuples

13:55 in New APIs.

13:57 It's a simple sort of thing, but it's, it's a good thing to, to remind people of.

14:02 So first off, I want to thank Brett for using the term API in a sense of the API for a method

14:10 or for a function or for a class or module and not necessarily an API for a REST API.

14:16 We're not talking about REST APIs or web APIs, talking about good old function, just good

14:22 old APIs.

14:23 Anyway.

14:24 So the idea is named tuples are kind of awesome and they're fun because you can just in one

14:30 line say, Hey, I've got like, say a point and it's, it's cool.

14:36 And why would I return that where I turn a named tuple is because something like that, like a

14:40 point.

14:41 So that it's obvious that people can access X, Y, Z or whatever.

14:44 And, and in some things like point, it's easy to, you know, or get mouse position, you know,

14:51 it's an X, Y coordinate.

14:52 So X and Y are probably there.

14:55 However, so why, why would you not want to use this?

14:58 And he's arguing that, and I kind of agree is that it's really easy to implement something

15:05 with a named tuple.

15:05 But now you've got to support both index based index access, like a tuple or named access as

15:14 if it was a dictionary.

15:15 So having both index access and name access is probably not what you meant.

15:21 And I think I've seen this a lot of people assume once it's a named tuple, people are

15:26 going to use the name, but it's also a tuple.

15:28 So you can use it, you can slice it and I'll do all sorts of stuff.

15:32 So the, and it's really just to get around like to not have to do a class, but classes are

15:39 easier now.

15:40 So there's some alternatives to alternatives to named tuple.

15:44 You can return a data class and that would be something I'd grab possibly data class or a

15:51 dictionary, dictionary would work fine or typed dict.

15:54 The, one of the things that is nice about a typed dick is dict is that you get editor

15:59 support as well, because you've got the types defined in there.

16:02 and then something new to me, which I'm going to have to play with is a simple namespace,

16:07 which gives us the ability to, to access the names, but, it's not indexable.

16:15 I haven't played with a namespace, simple namespace.

16:18 So I'll have to do that.

16:20 I haven't heard a simple namespace either.

16:21 And I haven't really used type dict.

16:23 well, they both are good options.

16:25 I haven't either.

16:26 I like kind of jumped on the, data class, bandwagon, and use data classes a lot

16:31 now, because I do think about that is, is actually, I, I need to think about it more,

16:37 but I, I haven't really been using named tuples to return stuff.

16:40 but so the, so what's the recommendation really is just be careful.

16:44 and, I'll read his quote.

16:48 He said, my key point in all of this is to prefer readability and ergonomics over brevity in your

16:53 code.

16:54 that means avoiding named tuples, except when you're expanding or tweaking in an existing

16:59 API where the named tuple improves over the plain tuple that is already being used.

17:05 So if you're art and that's, I guess that that's something I think I have done.

17:09 If, if you are, the return value was a tuple before it's been a tuple for a long time, there's

17:16 existing code using it, but it really should have been a named something.

17:19 adding, adding a named tuple allows people to use both.

17:24 and that might be ergonomically better.

17:26 The, but, the caveat really is you've got a lot of testing to do because you've got

17:32 to test both accesses now.

17:34 So, test more.

17:35 So, okay.

17:36 Awesome.

17:36 Yeah.

17:37 That's a good article blog, Brett.

17:38 No surprise there.

17:39 No surprise.

17:40 Okay.

17:41 Let's talk about a different programming language, but I think this is interesting and interesting

17:46 perspective.

17:46 Okay.

17:47 So the Zig programming language, are you familiar with Zig?

17:50 No.

17:50 I, it's kind of new to me as well.

17:53 If you go and look at some examples here, it looks, I think it looks a little like rust

17:58 like, I'm not sure, but we go down, it's, it does a lot of, simple things like

18:02 it interoperates really quickly and easily with, either C or, or windows APIs or stuff

18:08 like that.

18:08 But yeah, it looks, it looks pretty approachable, but it's a low level level, low level programming

18:13 language like here arrest.

18:15 Right.

18:15 What are those, what are all those, semicolons and curly braces doing in my code?

18:20 I know I, you probably delete them.

18:21 I don't think you really need it.

18:22 So here's the interesting thing.

18:26 They recently were spending quite a bit of money on AWS and they've decided that they would be

18:33 better off not spending their supporters money on hosting.

18:37 So for example, they said the rust foundation reports that it spends $404,000 on infrastructure

18:43 websites and stuff like that.

18:45 And probably mostly packages.

18:47 And it says, we don't really know anything about PI PI and Python.

18:50 Like what does python.org cost to run?

18:53 And mostly because that's a lot of the infrastructure costs are donated.

18:58 They said, look, as this language is growing, we don't really want for that to be our issue.

19:03 So they were getting upwards of a thousand dollars a month for their AWS bill, which is

19:07 not insane, but for an open source project.

19:10 Yeah.

19:10 Yeah.

19:11 It's kind of up there.

19:12 But what they said is look, zigling.org.

19:14 That's their equivalent of python.org.

19:16 It says, this is not an essential service.

19:18 It's not an emergency if it goes down and 99% uptime is perfectly fine.

19:23 It's the last 1% of uptime that represents 99% of the costs, which is pretty interesting.

19:29 So they said, look, we got a $36 Hetzner server.

19:32 Which comes with 20 terabytes.

19:35 I think 20, at least 20 terabytes of bandwidth, which is about $2,000 of AWS bandwidth included

19:41 for the $36.

19:42 And maybe someday we'll go crazy and spend a hundred or 200 bucks, but we don't need to

19:45 do more than that.

19:46 Like this, this is enough.

19:47 Right.

19:48 And so what are they doing instead?

19:50 They're saying one, they're encouraging and setting up a system that has package mirrors.

19:56 Right.

19:57 Remember we talked about that PEP that would basically sign wheels and then allow them

20:02 to be hosted somewhere else as long as the signature still matches.

20:05 So they're doing that kind of stuff from the start.

20:07 They're like, we can spread this out in a distributed style.

20:10 So no single thing has taken a huge hit.

20:13 And if it fails in one place, the equivalent of pip could say, well, let's try a mirror

20:17 or something like that, you know?

20:19 Yeah.

20:19 And yeah.

20:21 Anyway, so they're like, all right, well, 36 bucks a month.

20:23 And on top of that, what were they doing before?

20:25 AWS is what they were doing before, I believe.

20:28 So on AWS, if they wanted to push out a new website deploy, it took five minutes to push

20:33 it out, deploy, go through all the stuff just to get it up.

20:35 And on their little Hetzner server, it takes zero, takes two seconds.

20:39 It's so crazy.

20:41 To set up the job.

20:42 Yeah.

20:42 Yeah.

20:43 Basically to call start and then off it goes, right?

20:45 There's probably something like check every second.

20:47 There's a new job or whatever.

20:48 Anyway, I think this is a, you know, packaging is a big conversation.

20:52 Cloud, no cloud is a big conversation.

20:55 Costs and risks like the black swan of, well, what if the people backing Pythons, especially

21:01 PyPI, that infrastructure, what if they decided to stop?

21:04 Like how do you get a hundred thousand dollars a month all of a sudden?

21:07 Yeah.

21:07 You know, that's a big deal.

21:08 I think people would figure it out, but it would be a big disruption where like, okay,

21:12 what are we going to set up?

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

21:18 But anyway, this is interesting from a growing, but not yet super popular language.

21:23 Yeah.

21:24 Interesting.

21:24 Cool.

21:25 Indeed.

21:26 And all the curly braces and stuff were because it's mentioned by Corky that it's also interoperable

21:34 with C.

21:34 So that's interesting.

21:35 Cool.

21:36 Yeah.

21:36 Yeah.

21:36 It says it's more like C.

21:38 I suppose so.

21:39 It's, it's an interesting link.

21:40 All right.

21:41 Well, that's it for our main topics.

21:43 Got any extras?

21:44 I just have one extra that's going on.

21:47 I wanted to let people know about.

21:48 on, at the testing code, Python test.com.

21:52 I've got courses and, and that's, they're going well and I'm glad people are getting

21:58 value.

21:59 But I also had a community and the community have a community, but it, it used to be on Slack,

22:04 but it's one of those growth things.

22:06 Slack was, it was free on Slack and now it's not.

22:09 and so we switched to a Podia based forum and it's just not fun.

22:16 So, and, I mean, great that Podia offers a forum since the courses are on Podia,

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

22:29 comments on there, it's not, it's just not cutting it.

22:32 It's not sparking joy.

22:33 No.

22:33 So we're going to, we're going to try discord and, and so just, I guess,

22:40 hang in there, everyone.

22:41 I'm trying to trying to get it associated so that everybody has that has community access

22:46 will get access to the discord server.

22:48 And, I'll probably, I don't know what we're going to do.

22:52 I want it to be sustainable.

22:53 So it can't just be completely free.

22:55 but I also want it to, and, but I want it to be something that's easy for everybody to

23:00 get into.

23:01 So I guess, just stay tuned.

23:03 we'll get that all ironed out as soon as we can.

23:06 So anyway, any extras from you?

23:08 Yeah, I got a few.

23:09 It's, it's tricky, right?

23:10 You want to pick something where people already are.

23:13 Like they've got some app like Slack or discord or something open.

23:16 There's a lot of cool options that you could pick even some neat self hosted ones.

23:21 But if it's a completely different app that people have to remember to open instead of

23:25 just another tab next to the thing they're already in, I think it's, it changes it, you

23:29 know?

23:30 So there's a problem.

23:30 Like, for example, they got to go to podium versus like, oh, I'm over on this thing.

23:33 And now I just go to the next tab open to see what's happening in this community.

23:37 Yeah.

23:38 So, and I even like when I mentioned it to my, so my daughter's in healthcare, she's not

23:43 even like my oldest daughter.

23:45 And, and, and I mentioned it to her and she's like, oh, I can help you with that.

23:48 I'm on discord all the time.

23:50 I'm like, oh, okay.

23:51 great.

23:52 So that's awesome.

23:53 I love it.

23:54 All right.

23:55 I got some extras.

23:55 Okay.

23:56 One, still, still living the Zen, Zen browser lifestyle.

24:00 It's, it's pretty good.

24:01 So I'm going to keep going with that.

24:03 That's fun, but that's not actually an extra.

24:04 First extra is I was on the work item podcast talking with Dan over there for an hour about

24:11 Python and business and stuff.

24:13 And people can check that out if they want.

24:14 That's fun.

24:15 Neat.

24:15 Yes.

24:16 I feel like I, let me know if I talked about this before, Brian, I searched and searched

24:21 and couldn't find it, but in my mind, we talked about, did, did I talk about the fact

24:24 that you can subscribe as an RSS to GitHub releases?

24:28 I don't know.

24:29 I don't think so.

24:30 Cause I couldn't find it in my mind.

24:31 I did.

24:32 But anyway, if you go to any release and you just type dot Adam on the end, what you get

24:38 is a popular download window instead of showing it, but it gives you an RSS feed.

24:42 So go to your project.

24:43 You like click on the releases and put dot Adam on the end.

24:46 And you can put that in your RSS feeder reader.

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

24:52 in.

24:52 That's pretty cool.

24:53 And then let me make sure I attribution, right.

24:58 This is Jamie Thompson.

24:59 So this over and said, there's a new release of PI test BDD behavior driven design in not

25:05 just a new release, but 8.0, which is a big release.

25:08 Right.

25:08 And probably the most interesting thing is the data tables.

25:11 Have you seen these data tables?

25:12 That's neat.

25:12 It's kind of like a parameterized query, but it's also kind of like a markdown table.

25:18 Given the following users exist.

25:19 And then you just have pipe, you know, a header pipe name, pipe email, pipe Twitter,

25:23 and then values just row, row, row, row, row.

25:26 That's pretty neat.

25:27 Yeah.

25:27 Yeah.

25:27 All right.

25:28 So anyway, if people like their BDD, they can check out my test BDD.

25:33 That's pretty cool.

25:34 Also last week I rewrote all the code.

25:38 I did a little terminal CLI magic and there are a little over 10,000 lines of Python code

25:45 that don't involve blank space.

25:47 So meaningful lines for talk Python and Python bytes a little bit less, but not tremendously

25:52 less.

25:52 I rewrote that in court, which is asynchronous flask, which was pretty awesome.

25:58 So this thing is, is running a little more efficiently, a little bit faster, a little bit better than

26:03 it was before.

26:03 And completely rewriting 10,000 lines of code in two days is, is quite a, quite an undertaking.

26:09 You're tired at the end of that.

26:10 Let me tell you.

26:12 But it's awesome.

26:13 It came out really, really well.

26:14 I did it in two rewrites, actually.

26:15 One rewrite to just convert it from pyramid to flask, and then a second rewrite to convert

26:20 it from sync to async for almost every endpoint and all the code below it and all that, all the

26:25 database queries and stuff like that.

26:26 So did it affect like everything or did it, what were the main parts?

26:30 There were, there was, there's certain parts that it doesn't affect, but anything with database

26:35 access required it.

26:37 And then there's, there's all in, in web frameworks, when you're writing web apps, you're always

26:41 dealing with little aspects of that's frameworks API.

26:45 So I need to get the, the URL of the current request to see if I should do a redirect or

26:51 not.

26:52 Well, the way you get the URL is completely different in pyramid versus flask.

26:56 So anything that kind of touched headers, cookies, URLs, you know, if you want to know if somebody's

27:02 logged in and that's, you know, that's also a cookie, right?

27:05 There's, it's surprisingly knock on effects and flask and quartz a little bit funky in

27:11 some ways where there's this thread local requests that you can just access out of thin air,

27:15 which is cool.

27:16 Unless for some reason the call started here and it ends up over there.

27:19 Maybe there was a thread or some kind of delay where that's become disconnected that it'll

27:25 complain to you that it doesn't know what the request is, even though you have a request

27:28 object.

27:28 Like there's a lot of weird changes.

27:30 So yeah.

27:31 But anyway, it was really fun.

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

27:35 well.

27:36 Cool.

27:36 And that's it.

27:37 Shall we, shall we tell a joke?

27:39 A joke would be wonderful.

27:40 This one, we've done short form jokes and we've done long form jokes, Brian.

27:44 This might be the best long form joke.

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

27:51 Here's the breaking headline.

27:53 Breaking.

27:53 JavaScript developer commits to a framework for a record-breaking three weeks.

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

28:05 spot.

28:05 But let me read the press release, okay?

28:07 Simi Valley, California.

28:08 In an unprecedented display of consistency that has left the tech world reeling, local web

28:14 developer Alex Chen, 28, has reportedly stuck with the same JavaScript framework for an astonishing

28:19 three weeks.

28:19 Chen, known in the local dev circles as the framework whisperer, or his abilities to adopt

28:24 and discard JS frameworks at breakneck speeds, has been using Svelte without interruption since

28:31 August 1st, shattering his previous record of four days set with Vue.js back in 2022.

28:36 I don't know what came over me, Chen said, visibly shaken by his own stability.

28:41 I woke up one morning and I just don't feel like switching to Angular or React or that new

28:45 framework that was released during the interview.

28:46 The news has sent shockwaves through the JavaScript community.

28:50 Framework creators are reportedly in crisis mode, with one ace anonymous source from a

28:56 major tech company stating, if developers start sticking with one framework, how will

29:00 we justify our jobs?

29:01 Chen's colleagues have expressed a mix of awe and concern.

29:05 Senior developer Lisa Patel noted, I'm worried about Alex.

29:08 Yesterday, I caught him reading the documentation instead of immediately rewriting our entire

29:12 code base in a new framework.

29:14 It's not like him at all.

29:15 The unprecedented event has not been without its challenges.

29:19 Chen admitted to suffering from withdrawal symptoms, including uncontrollable urges to

29:24 create new NPM packages and a persistent eye twitch triggered by the site of a stable

29:30 well-maintained code.

29:31 Despite the difficulties, Chen remains committed to seeing this through.

29:34 Taking it one day at a time, he said, his fingers twitching as he resists the urge to type

29:38 NPX create next app.

29:39 But I've heard whispers of a revolutionary new framework that's only been downloaded 50 times.

29:44 Maybe I'll check it out, you know, just to stay informed.

29:47 Good, right?

29:49 That's funny.

29:50 Yeah.

29:51 You got to appreciate the stability.

29:53 Appreciate the stability of Django, of Python, of a lot of things that we got.

29:57 I mean, it's a joke, but it's also true that there's a lot of churn on that space.

30:03 Yeah.

30:03 I mean, like how many people here are like, should I stick with Python or should I go to

30:07 Zig now?

30:08 Yeah, I know.

30:09 Well, we might have just, we might have sent a whole bunch of people over there unintentionally.

30:13 That wasn't the intention.

30:13 I mean, Zig has a lot less.

30:16 I mean, I don't think tractor when I think Zig, but Rust kind of.

30:20 Yeah, true.

30:21 Well, and if you want to make sure you're alphabetically sorted to the very end, right by the comment

30:26 section, Zig.

30:27 Yeah.

30:27 So people just like change frameworks by the alphabet and then they turn out.

30:31 You get to the end.

30:33 They're like, well, there's nothing left to change.

30:34 They're over here.

30:35 Nice.

30:37 Well, always, always lovely to have you here.

30:39 Thanks.

30:40 Thank you.

30:40 Yep.

Back to show page