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


Transcript #401: We must replace uWSGI with something else

Return to episode page view on github
Recorded on Monday, Sep 16, 2024.

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

00:05 This is episode 401, recorded September 16th, 2024.

00:10 And I'm Brian Okken.

00:11 And I'm Michael Kennedy.

00:12 And this episode is brought to you by Scout APM. Check out their section later in the show.

00:17 Connect with us, Michael, Brian, or the show at fostadon.org.

00:23 But any mastodon will work.

00:26 But the links are, we're all on Fostadon, mkennedy, Brian Okken, and Python Bytes.

00:31 And of course, those are in the show notes.

00:33 And if you'd like to join the show live, head to pythonbytes.fm/live.

00:38 It's fun to do it at least once.

00:40 Check it out. See what it's like to watch us in real time.

00:43 And we're going to try something new today.

00:47 We're streaming on X. No?

00:49 We're trying to stream on X.

00:51 But when I hit go, it actually said you need a premium account.

00:54 So maybe we'll try that next week.

00:55 Oh, never mind. Sorry.

00:57 Or maybe we won't do it at all. I don't know. YouTube's good.

01:02 Oh, OK. And Michael even said to keep that quiet.

01:05 But just, you know, sorry. I'm just pretty excited.

01:08 All right. I know. Well, we'll try it out.

01:09 I think, you know, reaching more people, letting them participate is great.

01:12 And we can give it a try. And, you know, we've told people that we both have courses and there's other stuff.

01:18 But we're going to there's a there's a treat at the end.

01:21 If you wait till the end of the show, we've got some extras that we're going to talk about.

01:25 With some of the courses, it's pretty exciting.

01:27 So but that's not now yet.

01:29 Now we have whiskey. Whiskey anybody?

01:33 This is this actually might make you want to drink this whiskey.

01:37 Micro whiskey in particular. WSGI.

01:39 As some people say, web service gateway interface.

01:42 The friend and sibling parent.

01:45 I don't know what the relationship of ASCII, the async gateway interface.

01:49 Anyway, this is something I ran across.

01:53 Just I was doing some work with Granian.

01:56 So Granian is the web server that powers Python bytes right now and a couple other things, as you might imagine.

02:01 And I was looking at it and it had a back reference.

02:04 And one of the issues that was a feature I was asking about, namely, work are we starting after a certain amount of work gets done?

02:10 Things like that. And it was coming from, I believe this comes from edX, some edX project, though I can't tell by the organization.

02:20 Anyway, the title of this GitHub issue is this is them speaking amongst themselves in this project called Tutor.

02:27 We must replace micro whiskey with something else.

02:30 Like, wait a minute. Why must we do this?

02:32 Wait, let me see what's going on here.

02:33 So this is somewhat news to me.

02:36 The very opening here by, let's see, this is this Regis Bemo wrote micro whiskey is now in maintenance mode.

02:43 And sure enough, if you go over to read the docs, it says, note, this project is in maintenance mode.

02:49 It only bug fixes and updates for new language APIs.

02:52 Do not expect quick answers for GitHub issues or pull requests.

02:56 Sorry about that. A big thanks to all users who have contributed over the last 15 years.

03:01 That's awesome. However, I don't think that's awesome.

03:04 It's awesome that they've been working on it for 15 years and people it's had such a good run.

03:09 However, the part that's not great, as you point out, Brian, is this is a critical piece of Internet infrastructure when you're on the Internet.

03:19 If this is running your app, right, this is the thing that handles all Python requests and effectively has an open socket to the Internet.

03:26 And anything that just listens on an open socket on the Internet, especially stuff written in C, should make you nervous.

03:33 Right. It's just it's there for for whatever might go wrong.

03:38 And so there's a couple of things going on here.

03:40 One, it's kind of it's not fully, fully abandoned, but it's nearly fully abandoned.

03:45 Right. And that's not great.

03:46 The other is it I don't believe it supports asynchronous programming.

03:50 So if you want to do anything and async and await in your web apps, which is becoming increasingly popular, there's also not an option.

03:57 So just for lots of reasons, it's probably time to find something else.

04:01 And so they listed four things, some of which I would not recommend, but maybe there may be them wrong about it.

04:08 G-Unicorn, which, by the way, some people pronounce goonicorn.

04:12 But Brian, what is their logo? It's a unicorn.

04:14 And what color is it? Green. It's a green unicorn.

04:17 I'm pretty sure G-Unicorn stands for green unicorn, not goonicorn.

04:20 But, you know, you'll say how you wish.

04:22 But G-Unicorn is how I say it because it's a green unicorn.

04:25 ModWhiskey, Cherry Pine, Waitress.

04:29 I don't hear of any of these as being kind of high end production servers.

04:34 Like Waitress is included with Pyramid as a debugging one, for example.

04:39 So looking through, it says some people are suggesting Nginx unit, which is like a Python worker process that can run inside of Nginx.

04:48 That could be interesting.

04:51 Someone, this is how I found out about it.

04:52 Someone says, hey, maybe we should look at a Granian.

04:55 And Granian, I've had Giovanni, the guy who creates it on Python to talk about it.

05:02 It's written in Rust. It's super stable in terms of its performance fluctuations.

05:06 It's pretty nice.

05:07 And so that's what we're using now.

05:09 Before that, it was G-Unicorn.

05:11 I think there's some good options.

05:12 But the long and short of it is MicroWSGI is now in maintenance mode.

05:16 And while that's not, you know, end of the line for it, I would start making plans to not be running on MicroWSGI if I was you.

05:23 And you are, you know what I mean?

05:25 Okay.

05:25 I mean, that's, I'm actually, I'm interested to hear if we get any feedback from listeners that there might be other options or what the recommendations are.

05:33 Let us know.

05:34 Probably the best place would be to comment on the YouTube video.

05:37 Put it below there.

05:37 That's kind of our comment section these days.

05:40 Yeah.

05:41 Nice.

05:41 Okay.

05:42 All right. Over to you.

05:43 Well, I was interested.

05:46 Actually, I have a project where I was thinking about writing a little segment of it in Rust, even though I don't know Rust yet.

05:53 But I was interested in the, a lot of places are, you know, optimizing little bits of their code with Rust instead of C now.

06:01 So this is a great article from Itamar.

06:05 I think it's Itamar Turing, Turing, Turner, Turing?

06:08 Anyway, Itamar.

06:10 It's an article called "Let's Build an Optimized Rust Extension for Python."

06:15 And I really love the, like, the focus of this.

06:17 It isn't like, it's, the focus of it really is I've got one algorithmic function that I want to speed up.

06:24 And that's, I think that's a great place for maybe not building a package for the rest of the world to use, but internally, for internal tools, that's a great way to look at things.

06:35 So his example is a thing of counting unique values.

06:41 And you could just count them.

06:42 He's got the exact count is using sets and the length of a set, put everything in a set.

06:48 But he says if you've got 10 million items, it'll be a set with 10 million items in it.

06:53 So there's a space limit there.

06:55 So, and then you take the length of that.

06:58 So I'm in there, you know, you probably count things or something.

07:02 But the, how do we speed that up?

07:05 And one of the algorithms is a, it's called a very simple algorithm from, I'm not going to try to pronounce that name.

07:12 But he has a link to the algorithm that's getting an approximation of the answer of approximately how many.

07:20 And so he just implements that whole algorithm in Python.

07:23 And then runs it and it, and then runs it against the exact count.

07:28 And it's pretty close.

07:29 He runs it a few times and he gets different answers.

07:31 But that's a crazy algorithm.

07:33 Yeah.

07:34 Oh, did you read it?

07:35 Well, just looking over it real quick.

07:37 It's, you know, given a iterable, make some and how fast adding new items is increasing the duplicity or lack thereof.

07:46 Yeah.

07:47 That's pretty wild.

07:48 It is.

07:48 Pretty close.

07:49 And I remember reading about this algorithm recently also.

07:52 But anyway, it's kind of a neat, neat example of, okay, let's try this algorithm out.

07:57 And there's other algorithms for approximating uniqueness as well.

08:01 He comments later.

08:03 But he just took this one because it's kind of a small algorithm.

08:06 So it kind of works.

08:08 And so let's, he did a speed comparison and it's significantly slower.

08:13 It's the exact count is 0.14 seconds.

08:18 And the approximation is 0.78 seconds.

08:20 So it's a lot slower than the exact count.

08:24 But it takes up tons less memory.

08:26 So if you have a memory constraint, that's important.

08:29 And also if you're just doing an example from a small count, but you have a huge set that you're really going to count, you want an approximation.

08:36 So this is a great setup for how do we make this faster in Rust?

08:41 And so he actually walks through all of the steps.

08:43 Like you haven't done this before.

08:46 Let's get Maturin and Py03 and set up a project.

08:51 So he's even like just Maturin new Rust counterprox project.

08:56 And then goes into it, looks at what the project set up already.

09:02 It's got some cargo toml files, pyproject.toml and a source file.

09:07 And then he just does it right there and figures out how to install it.

09:12 You can already install it even though there's nothing there in the example project, which is kind of cool.

09:16 He did look into it.

09:17 It needs, Rust doesn't have a random in the example or the algorithm uses random.

09:22 So this is kind of neat too, is how do you, introduction of how do you add dependencies in its cargo add rand that adds a dependency to your project.

09:33 So that's it.

09:34 You've got Py03 and rand as dependencies.

09:37 And then he just basically translated that algorithm directly to Rust.

09:42 And I kind of like that idea of having just a side by side comparison.

09:46 And I'm thinking about like putting these in two editors so I could see them side by side.

09:51 Exactly.

09:52 Okay.

09:53 So that thing and then how is it faster?

09:57 It's like twice as fast as the Python version, but you would think like, are we supposed to have like blazing speeds with Rust?

10:05 So and I kind of love that he picks something that like isn't as, isn't as optimal.

10:09 Like I don't want that much, like twice as fast.

10:13 I want it to be super fast.

10:14 So he also goes into some optimization.

10:17 So first off is link time optimization.

10:19 It's just an ability.

10:21 And since this is a Rust application that you're going to not, you know, it's fine to take a little bit extra time in linking to make it faster runtime.

10:31 Go ahead and turn that on.

10:32 And then he was looking at the random number generator.

10:35 There's a couple ways to speed that up.

10:37 One of them is to use the small random number generator.

10:40 It's like less random, but you know, good enough.

10:43 It's not cryptography.

10:44 Yeah.

10:45 And then, and then also there's instead of storing in part of the algorithm, he's storing items and he's like, instead of and later taking hashes and instead of storing the items, just store the hashes.

10:57 And then, and then Rust, Rust is a thing like you can optimize the dealing of collections if you tell it that you're just storing hashes in there.

11:08 So it doesn't try to rehash your hash.

11:11 And so, so it's like a no hash hasher, another dependency, but that optimization altogether makes it even faster, but it's, it's, it's 0.21.

11:25 So it's like what, almost four times faster, like a little three and a half times faster than the native, the Python version.

11:34 So that's better.

11:35 And then it talks about partially other things, but it's, I don't think this is a really about how much faster his implementation of this was.

11:43 It's, these are the steps.

11:44 If you want to go through and speed up a chunk of your Python code, this is a good list of how to do that.

11:50 So yeah.

11:51 Looks great.

11:52 I love the, the walkthrough and it's not a huge project.

11:55 It's not a huge rewrite in Rust.

11:56 It's just this function slow.

11:58 Let's make this function fast.

12:00 And I think that's exactly, I'm going to try to probably learn Rust is I'm not going to try to learn the whole language.

12:05 I'm just going to learn enough to optimize something.

12:08 So, and then build on that.

12:10 Yes.

12:10 And now before we move on, two things really quick.

12:13 John out in the audience points out, says, I believe ModWhiskey is an Apache plugin module, which I think he's right.

12:19 And I think that's as well.

12:20 And I just wouldn't really want an Apache plugin.

12:23 Kind of like a thing that's a little more dedicated, but yes, I agree.

12:26 And then Waitress is one of the few options available on Windows based server platforms.

12:30 Okay.

12:31 That's interesting.

12:32 The context of the GitHub issue I talked about before was a Docker image.

12:37 And so I'm pretty sure it was Linux.

12:39 But yeah, I didn't know about the Windows aspect there.

12:42 And I didn't point out, well, what would I have picked?

12:44 So reasonable options to Michael sound like, Granian, which we're using, uvicorn, which used to be a kind of dev thing.

12:52 And you could plug it into g-unicorn with uvicorn workers, but actually it's now its own standalone thing with worker management.

13:00 So, so uvicorn is its own possible option now.

13:03 Hypercorn from Philip Jones and Cort, and then g-unicorn with uvicorn workers for async stuff.

13:09 So anyway, putting a bow on that one.

13:12 Okay.

13:12 So you have a few things you do instead.

13:15 Yeah, I don't, I'm just using Granian right now, but all those would be good options, I think.

13:19 Okay.

13:20 Let me tell you real quick about Scout APM.

13:24 They're big supporters of Python Bytes.

13:25 So we appreciate that very much.

13:27 So if you are tired of spending hours trying to find the root cause of issues impacting your performance, then you owe it to yourself to check out Scout APM.

13:36 They're a leading Python application performance monitoring tool, APM, that helps you identify and solve performance abnormalities faster and easier.

13:45 Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and the dreaded N plus one queries that you can end up if you do lazy loading in your ORM, and then you say, oh no, why is it so slow?

13:58 Why are you doing 200 database queries for what should be one?

14:00 So you can find out things like that.

14:02 And it links it back directly to the source code.

14:03 So you can spend less time in the debugger and healing logs and just finding the problems and moving on.

14:09 And you'll love it because it's built for developers by developers.

14:12 It makes it easy to get set up.

14:14 Seriously, you can do it in less than four minutes.

14:16 So that's awesome.

14:17 And the best part is the pricing is straightforward.

14:20 You only pay for the data that used with no hidden overage fees or per seat pricing.

14:26 And I just learned this, Brian, they also have, they provide the pro version for free to all open source projects.

14:33 So if you're an open source maintainer and you want to have Scout APM for that project, just shoot them a message or something on their pricing page about that.

14:40 So you can start your free trial and get instant insights today.

14:44 Visit pythonbytes.fm/scout.

14:47 The link is in your podcast player show notes as well.

14:49 And please use that link.

14:50 Don't just search for them because otherwise they don't think you came from us and then they'd stop supporting the show.

14:55 So please use our link pythonbytes.fm/scout.

14:58 Check them out.

14:59 It really supports the show.

15:01 Definitely.

15:02 I'm next, huh?

15:03 Yeah.

15:03 All right.

15:04 What if Brian, what if you were super excited, finally be contacted by a recruiter for one of those jobs you're looking for.

15:11 Yeah.

15:11 And really all they wanted was your passwords, your bank login and your crypto.

15:16 Dear.

15:17 Dear, that is so, why can't people be better?

15:20 You know, some people just suck.

15:22 So the item I want to talk about comes to us from Reversing Labs and pretty cool logo there with the reversed R for Reversing Labs, I got to say.

15:31 And the title is fake recruiter coding tests target devs with malicious Python packages.

15:37 That's not ideal.

15:38 And I don't know why we need to have the word Python packages in here, just malicious Python code, because a lot of it comes from GitHub repositories, not IPI.

15:46 So, I don't know.

15:48 I think kind of put the packages to the side, like that's not germane to this really.

15:51 What is, is people are using recruiting tests.

15:55 So a lot of this is something that I never encountered in my, yes, I never encountered this in my entire life, a take home exercise or something.

16:03 It was interviews and it was live sort of code performances or whatever, I guess you would call them, but never take home.

16:10 And that's just something that's becoming really popular for better or worse.

16:13 All right.

16:13 So, reversing labs found the VM connect campaign, which I don't really know much about continuing with malicious actors posing as recruiters using packages and the names of financial firms.

16:25 Tell lure developers.

16:27 So that's pretty bad.

16:28 what's happening here?

16:29 So they've, this is not exclusive to Python.

16:32 It's happened through NPM before and so on.

16:34 And this seems to be tied to North Korea's Lazarus group, a ATP group.

16:39 That means bad stuff.

16:40 You know, they're pretty, pretty skilled, but here's what happens.

16:44 They found that people are getting these requests for coding tests and it says, here's your, here's your coding tests.

16:51 And if you look at it, I think I can even zoom in here.

16:53 Well, not really.

16:54 It kind of zooms.

16:55 Anyway, it says here's a fully functional password manager in Python.

16:59 Basically this, you can see some grammatical errors in there.

17:02 You might, that might clue you off, but probably not.

17:04 This is a fully functional password manager that possesses almost all of its features.

17:08 And here's an image.

17:09 And this is the important part before making any modifications, ensure the project is running successful.

17:15 And if you trusted this organization, you were really keen to get going like, all right, well, let's just, I know I'm doing Python space.

17:22 This boom, boom, boom.

17:23 It's the running of this project that they delivered to you over GitHub or some other, they just sent you a thing to unzip and run that then downloads all the code, installs back doors, and various other malware into your machine.

17:37 And then you probably go on to finish the work and submit it and never hear back, oddly.

17:41 Yeah.

17:41 Like, and then somebody is actually like finishing the assignment and not.

17:46 Yes, I know.

17:47 It's so sad.

17:48 Sucks so much.

17:49 Oh, that's terrible.

17:51 Yeah.

17:51 So the analysis revealed that the direct parent of the detected malicious files is a Python PYC file.

17:59 So that's how they obscure it as part of what they give you are PYC files, not Python source files.

18:05 So you can't really see inside them.

18:07 Oh, and you, and you kind of think, oh, well, that's legitimate because it's a, because it's an interview.

18:12 I don't want to show me, show me the source code or something.

18:15 Exactly.

18:16 Yeah.

18:16 It totally makes sense because yeah, if I saw this, well, then I would be able to.

18:20 Nope.

18:20 Your job is to have this opaque thing and write this one part, but no, it's just the opaque part is a virus.

18:25 Oh, that's so sucks.

18:27 It totally does.

18:28 Yeah.

18:28 So I would, do you have recommendations?

18:31 Well, I, let's hear yours first.

18:32 Oh, I was thinking that, so, I've, both, taken interviews like this, coding exercises and given them, but in, in, let's see, most of the times I've only given them in text form.

18:48 I've given a description and then somebody can like email me back or, or submit, on a form the, what code for answering it.

18:57 and then also since there's AI and everything, or you could just like hire somebody to do the code for you.

19:03 that code I then use as part of the interview process.

19:07 Like we'll talk about, we'll talk about what choices they made in the code during the actual talking interview.

19:14 the other thing, and I've had, I've had that happen with me as well when I've done coding exercises.

19:21 The other thing is using platforms.

19:22 Like there's, there's online platforms.

19:24 You don't install anything on your own computer, during a coding exercise.

19:28 And I would be more willing to do that, then, then believe somebody.

19:32 But I know there's a lot of GitHub based, like there's a private repo you get add to, and then you can go and try to take the, do the coding assignment.

19:41 I know that happens and I would just, I probably wouldn't do it, I guess, or I don't know, but yeah.

19:46 Sure.

19:46 I think some other things that I had in mind was if you're just trying out a Docker container and it's something real simple, sorry, a Python package, I'd do it in a Docker container.

19:55 You know, if you're just doing it on the terminal or like a simple editor, just fire up a Docker container, shell into it, you know, Docker exec, GSH or bash or whatever, and then play with it over there and then throw the container away.

20:08 Or like you said, there's a lot of online platforms.

20:11 So for example, I think VS Code has, you know, code.dev.

20:16 Is that right?

20:17 I can't remember what it was.

20:18 The, like if you open up GitHub and just press dot, whatever happens there, maybe you could do it there.

20:23 Yeah.

20:23 maybe not.

20:24 probably what I would actually do is I would fire up a virtual machine that has snapshotting capabilities.

20:30 And by snapshot, I mean like save how it is now on the, on the disk and then make a differencing disk.

20:35 And then when you're done with the project, just throw away the snapshot, the, the different reset to the snapshot.

20:40 Right.

20:40 So that's long as it's, you're not afraid of it being potentially on your network.

20:45 Right.

20:46 But if it's in a VM, it's probably pretty safe.

20:48 Right.

20:48 And then also you could go over to Azure and get a Windows machine, Windows VM that you can remote desktop into.

20:56 That's a full Windows machine in the desktop.

20:58 Yeah.

20:58 In the cloud as a desktop, you log into right there and just throw away the virtual machine because you know, then it's not even on your network.

21:06 Right.

21:06 Yeah.

21:06 I think, and as much as I like using my own editor, I think that I'm, I think that people that are giving coding exercises really should use a platform, because it's just more fair for everybody.

21:17 The, and the, even our friends at PyBytes have their own interview platform that you can do.

21:23 Interesting.

21:24 Do their little things.

21:25 Yeah.

21:25 Matt agrees with you.

21:26 Plus one for coding platforms.

21:27 Yeah.

21:29 All right.

21:29 Okay.

21:30 So folks be, be on the lookout.

21:33 Be careful out there.

21:34 It's the internet.

21:34 Well, is it my turn?

21:36 I think so.

21:37 let's, let's talk about office hours.

21:40 so the PSF has announced that the PSF board is having office hours, which is kind of cool.

21:46 They're going to do it monthly.

21:47 So if you have a question, if you, well, what do they say?

21:50 greetings Pythonista.

21:52 I'm not going to read all of this, but the PSF, is going to open up, office hours and monthly.

21:59 The office hours will be a session, be sessions where you can share with us how we can help your community and express your perspectives and provide feedback to the PSF.

22:08 And hopefully everybody will be nice, but had an issue with people being nice.

22:13 So try to be nice.

22:14 then also, the joining of the office hours, there's, there's, we missed the first one.

22:20 It was September 10, but there's one in October 8th.

22:23 And then, and then there's, you know, there's a list here.

22:26 We've got, well, I'll just put the list in the show notes also.

22:29 what do you, what are they going to talk about?

22:31 Well, they might have, they might have a topic, but, they also might not.

22:37 So it says that you can bring up, I can't remember where, where it said this, but you can bring up, there'll either be a topic, but if there's not a topic, you can bring up something that's Python related or something that the board might be able to help you with.

22:48 So that's really cool.

22:49 I love the accessibility that, that, that people have access to.

22:54 Yeah, I think it's kind of cool.

22:55 I think it's kind of like, it kind of reminds me of, you know, you can, I've never gone, but my, my little local community that I live in, I can go watch the, the, the, the city board meetings if I wanted to.

23:07 I don't, I don't do that, but I like that.

23:10 It's possible that I can.

23:11 So it's a good thing.

23:13 So thanks PSF.

23:14 Yep.

23:15 Yeah.

23:15 Very cool.

23:16 All right.

23:16 and I kind of made this one short cause I know we've got quite a few extras to talk about.

23:21 do you want to kick off the extras?

23:24 Let's kick it off.

23:25 Let's, this is a good one to kick it off with.

23:27 Cause this is a joint extra big news is our courses, mine, yours, and our friends are on humble bundle for a couple of weeks.

23:36 So if you want to get what I think is probably a ridiculous deal, like thousand $882 worth of content for $25.

23:44 Check it out.

23:47 One of the things that's unique about humble bundle, if you're not familiar with it, and partly why we're participating is a lot of money goes to charity right now.

23:55 It's just launched.

23:56 And so far has already raised almost $3,000 for charity.

23:59 That's pretty cool.

23:59 Traditionally over the years, we've worked with humble bundle and raised a lot of money for the PSF and for other organizations through this.

24:07 So this year's charity is girls who code.

24:11 So check it out and there's stuff from me, from Brian, from JetBrains, from Matt Harrison, from Reuven Lerner, from PyBytes, real Python.

24:23 And anybody I'm leaving out there?

24:25 I don't think so.

24:26 But yeah.

24:27 What else do you want to say about this Brian?

24:28 I'm kind of excited about checking out the CPython internals.

24:31 I've put off looking at that.

24:32 and I think I might grab it so I can read that.

24:36 Also, I think my Visual Studio code plus Python skills are pretty good, but I'm curious to know what your course has in there.

24:44 There's actually quite a few goodies in there.

24:47 And also it's ridiculous though.

24:50 I'm including both the new Hello pytest course and the complete pytest course and the pytest course on your side.

25:00 I know that's kind of a lot of pytest, but I think about it a lot.

25:04 So a lot of exciting people already joining and I'm getting some great questions in the community forum.

25:11 So that's really good.

25:12 Even some great feedback.

25:13 Yeah, that's awesome.

25:14 So I'm pretty excited about this.

25:16 All right.

25:17 So this is one among many extras, but do check that out if this sounds interesting to you.

25:21 It's a lot of stuff and it's for a good cause.

25:24 Okay, next.

25:25 I believe we've talked about the Django-Naut program before, which is super cool.

25:30 I've had Sarah and Tushar on Talk Python and linked about that as well in the show notes.

25:35 But the news here is that Django-Naut Space Session 3 applications are open.

25:41 So get in there and apply.

25:42 This is a program that helps you become a contributor, possibly on the path to core developer for Django.

25:48 And I think it's a really cool program.

25:50 Free, eight-week group mentoring program.

25:52 Cool.

25:53 Yeah, so if you're a fan of Django and you want to get better at open source, here we go.

25:57 I'll, like I said, I'll link to this.

25:59 Two more things real quick.

26:00 One planned and one a surprise.

26:03 Alt-Tab.

26:04 If you're on Windows, Alt-Tab is the way you switch between apps.

26:07 On macOS, if you switch to macOS, things get weird.

26:09 Like Command-Tab seems like the Alt-Tab, but Command-Tab switches between applications, not between Windows.

26:15 So for example, if there's like a, "Hey, there's an update available for your app," and then it goes behind another window,

26:20 there may be no way to keyboard over to it.

26:23 You might have to hit Control-Down and then find it because it doesn't register as like a top-level application, but it's there.

26:30 And like, you want to switch between two Windows and a web browser, I know there's Command-Tab, but that, or sorry, Command-Tilde,

26:36 but that just cycles.

26:37 That doesn't give you a list.

26:38 So Alt-Tab is a free open source thing for macOS with a ridiculous amount of options that has a super cool UI for switching between Windows, not applications.

26:52 And like I said, it's open source, but also it doesn't take over the typical commands.

26:57 So it's an either/or, whatever you feel like hitting while you're working on Mac.

27:00 What do you think, Brian? Cool?

27:01 - Yeah, actually, I don't, I never even tried any of this stuff.

27:05 I just usually don't have very much open, or I have no idea how to find my stuff.

27:10 - Yeah, but if you look over on GitHub, it's got 10,000, almost 11,000 stars.

27:14 It's pretty neat.

27:16 Yeah, so anyway, people can check that out if they want.

27:18 And this is a surprise.

27:19 This was not true when I hit, when we logged in to hit record today.

27:24 However, since then, the macOS Sequoia, the new version of macOS is now out.

27:29 Now, if you go to the website, apple.com/macOS, it says it's in a preview.

27:33 But if you go to a system settings, it says, would you like to install it?

27:36 So. - I don't know.

27:38 - If people want to live on the cutting edge, here you go.

27:42 It's time.

27:42 - I'll let you go first.

27:43 And then if your computer still works to log in next week, I'll upgrade.

27:48 If you ever hear from me again, then it'll be fine.

27:52 - Yeah. - Sounds good.

27:53 Anyway, those are my extras.

27:54 - Okay.

27:55 I think that we should have covered this earlier, but oh well.

27:59 PyCascades has, the call for proposals is open.

28:03 We, maybe we covered it, that I just don't remember.

28:05 But anyway, CFP is open, but you only have a few days.

28:08 It's September 16 right now, and the deadline is September 20th.

28:13 So if you haven't gotten those in yet, get those in.

28:16 And mostly I'm bringing this up because I forgot, and I'm going to submit a couple.

28:21 But it's going to be exciting because it's in Portland.

28:23 - Yay, it's in Portland.

28:24 - At least I'll be there.

28:26 Will you be there?

28:26 Probably. - Unclear.

28:28 Maybe. - Unclear.

28:28 Okay. - Let's give it a strong maybe.

28:30 - Well, I'm going to try to make sure to be there.

28:32 - Yeah, that'd be nice. - I love PyCascades.

28:34 Okay, so that's my first.

28:37 And that's in February.

28:39 So last week we talked about all the UV Python stuff being super cool.

28:46 And this, but we mentioned that you can't do Python 3.13.

28:50 Well, you can now.

28:50 So Python 3.13 is now available for virtual environments and for anything with UV.

28:59 So UV supports Python 13, but it does not subvert.

29:02 If the next question is, can I do the, what, the other one?

29:08 Free-threaded.

29:09 Can we do through free-threaded?

29:10 No, not yet.

29:11 But hey, I think it's great to just support the normal one so that people can get their

29:16 stuff in.

29:16 So I think that's all my extras.

29:19 - Awesome.

29:20 Awesome.

29:21 Awesome.

29:21 - Anyway, thanks a lot.

29:22 - Yeah, I just want to quickly add that I tried UV Python list, --Python preference,

29:28 dash online only managed, and it didn't show 3.13 or 12.6.

29:35 But then a UV self-update, run it again.

29:38 So just beware, I think you have to update your UV to get it to show the thing that you put in.

29:43 - I'm glad you brought that up.

29:44 I was going to say that.

29:45 - Yeah, I forgot.

29:47 And also, I think UV self-update is such an awesome thing.

29:51 You just have to, it's a great thing, self-update.

29:54 I wish I had Brian's self-update.

29:57 That'd be cool.

29:58 - Exactly.

30:00 - It's getting a little old and beat up.

30:01 Self-update.

30:02 Oh, there we go.

30:03 - Yeah.

30:03 - Nice.

30:06 - Power.

30:07 We can rebuild them.

30:08 Okay.

30:08 - Okay, let's get something funny.

30:10 All right, well, I was saving this for the November when we have the election in the U.S.

30:17 This is not political, people, so please don't write me.

30:19 But this is a tech joke.

30:21 But since Biden dropped out, you know, the joke's kind of got a shelf life.

30:24 Let's go with it.

30:25 So here it is, Brian.

30:27 Errors 404 and 403 went voting.

30:29 404 voted for Trump.

30:31 403, 403 forbidden.

30:34 - Oh, Biden, oh, dear.

30:36 - Because 403 is forbidden, but anyway.

30:38 - Oh.

30:42 - That's what I got for you today.

30:46 - That's terrible.

30:47 - Yeah, it's definitely a dad joke.

30:48 - Okay.

30:49 I've got a good one for you next week.

30:51 - All right, yeah, let's do it.

30:52 - All right.

30:53 - Looking forward to it.

30:53 And yeah, thanks.

30:55 - Thanks to everybody for showing up.

30:57 And remember, check out the Humble Bundle.

31:02 We appreciate it.

31:03 - Yeah, indeed.

Back to show page