Transcript #401: We must replace uWSGI with something else
Return to episode page view on github00: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.
00:15 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, M. Kennedy, 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:39 Check it out.
00:40 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.
00:48 No?
00:49 We're trying to stream on X.
00:50 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.
00:56 See people in wrestling.
00:56 Or maybe we won't do it at all.
00:58 I don't know.
00:58 YouTube's good.
00:59 Okay.
01:02 And Michael even said to keep that quiet.
01:05 But just, you know, sorry.
01:06 I was pretty excited.
01:07 All right.
01:08 I know.
01:08 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.
01:13 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 treat at the end.
01:20 If you wait until the end of the show, we've got some extras that we're going to talk about
01:25 with some of the courses.
01:27 It's pretty exciting.
01:27 So, but that's not now yet.
01:29 Now we have whiskey.
01:32 Whiskey, anybody?
01:32 This actually might make you want to drink this whiskey, micro whiskey in particular.
01:38 WSGI.
01:39 As some people say it, web service gateway interface.
01:41 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:52 Just, I was doing some work with Granian.
01:55 So Granian is the web server that powers Python bytes right now.
01:59 And a couple other things, as you might imagine, 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 worker restarting after
02:09 certain amount of work gets done, things like that.
02:11 And it was coming from, I believe this comes from edX, some edX project, though I can't tell
02:19 by the organization.
02:20 Anyway, the title of this GitHub issue is, this is them speaking amongst themselves in this
02:25 project called tutor.
02:27 We must replace micro whiskey with something else.
02:29 Like, wait a minute.
02:30 Why must we do this?
02:31 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, what is this?
02:38 I wrote this.
02:39 Regis Bimo 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
02:48 mode.
02:49 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.
02:56 A big thanks to all users who have contributed over the last 15 years.
03:01 That's awesome.
03:01 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
03:08 run.
03:09 However, the part that's not great, as you point out, Brian, is this is a critical piece
03:15 of internet infrastructure when you're on the internet.
03:18 If this is running your app, right?
03:20 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
03:30 C should make you nervous.
03:32 Right.
03:33 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.
03:45 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
03:55 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 they're, maybe
04:07 they're wrong about it.
04:07 G unicorn, which by the way, some people pronounce gunicorn, but Brian, what is their logo?
04:13 It's a unicorn.
04:14 And what color is it?
04:15 Green.
04:15 It's a green unicorn.
04:16 I'm pretty sure he unicorn stands for green unicorn, not gunicorn.
04:20 But you know, y'all say it how you wish, but G unicorn is how I say it.
04:24 Cause it's a green unicorn mod whiskey, cherry pine waitress.
04:28 I don't hear of any of these as being kind of high end production servers, right?
04:34 Waitress is included with, pyramid as a debugging one, for example.
04:39 So looking through, it says some people are suggesting engine X unit, which is, like
04:45 a Python worker process that can run inside of engine X.
04:48 That could be interesting.
04:50 someone, this is how I found out about someone says, Hey, maybe we should look at,
04:53 granion and granion.
04:56 And I've had, I've had, Giovanni, the guy who creates it on talk Python to talk about
05:02 it.
05:02 It's written in rust.
05:03 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 before that it was G unicorn.
05:10 I think there's some good options, but the long and short of it is micro whiskey is now
05:15 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
05:21 be running on micro whiskey.
05:22 If I was you and you were, you know what I mean?
05:24 Okay.
05:25 I mean, that's, I'm actually, I'm interested to hear if we get any feedback from listeners
05:30 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:36 Put it below there.
05:37 That's, that's kind of our comment sections these days.
05:40 Yeah.
05:40 Yeah.
05:40 Nice.
05:41 Okay.
05:41 All right.
05:42 Over to you.
05:42 Well, I was, interested, actually, I have a project where I was thinking about writing
05:48 a little segment of it in rust, even though I don't know rust yet.
05:52 but, but I was interested in the, the, a lot of places are, you know, optimizing little
05:58 bits of their code with rust instead of C now.
06:01 So, this is a great article from itamar.
06:04 I think it's itamar turing, traring Turner, try anyway, itamar, it's a article called
06:11 less build and optimized a rust extension for Python.
06:15 And I really love the, like the focus of this.
06:17 It isn't like, let's it's the focus of it really is.
06:21 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
06:29 the world to, to use, but internally for the internal tools, that's a great way to, to,
06:34 to look at things.
06:35 So his, his example is a, a thing of counting unique values and you could just
06:42 count them.
06:42 He's gotten the exact count is using sets and, the length of a set, but everything in
06:48 a set.
06:48 But, but he says, if you've got 10 million items, it'll be in a set with 10 million items
06:53 in it.
06:53 So there's a space limit there.
06:55 So, and then you take the length of that.
06:57 so I'm in there, you know, you probably count things or something, but, the,
07:04 is like, how do, 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
07:11 to try to pronounce that name.
07:12 but he has a link to the algorithm that's getting an approximation of the answer,
07:17 how approximately how many.
07:20 And so he just implements that whole algorithm in Python and then, and then runs it and,
07:25 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, but.
07:31 That's a crazy algorithm.
07:33 Yeah.
07:33 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
07:44 duplicity or, or lack thereof.
07:46 Yeah.
07:46 That's pretty wild.
07:48 It is.
07:48 It's pretty close.
07:49 and I remember reading about this algorithm recently also, but anyway, it's kind of a
07:54 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 comments later, but, he just took this one cause it's kind of a small algorithm.
08:06 So it kind of works.
08:07 and so let's, he did a speed comparison and it's, it's significantly slower.
08:13 It's, the, the exact count is point is 0.14 seconds and the approximation is 0.7
08:19 seven, eight seconds.
08:20 So it's, 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 like memory constraint, that's important.
08:28 and also if you're just doing an example from a small count, but you have a huge set
08:33 that you're really going to count, you want an approximation.
08:35 So, so this is a great, 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:45 let's get mature in and Pio three and set up a project.
08:51 he's, so he's even like, just mature in new rust counter prox project.
08:56 and then, goes into it, looks at, looks at what the project set up already.
09:02 It's got some cargo Toml files, pipe project Toml and a source file.
09:07 and, and then he just does it right there and, 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
09:15 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, is how do you, introduction of how do you add,
09:27 dependencies and it's cargo add Rand and that it adds a dependency to your project.
09:32 so that's it.
09:34 You've got Pio three 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:50 Exactly.
09:51 okay.
09:53 So, so that, that thing, and then how is it faster?
09:56 It's, it's, it's like twice as fast as the Python version, but you would think like,
10:02 aren't we supposed to have like blazing speeds with rust?
10:04 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, but like twice as fast.
10:12 I want it to be super fast.
10:14 So yeah, he also goes into some optimization.
10:16 So first, first off is link time optimization.
10:19 It's just an ability.
10:20 and since, since this is a rust application that you're going to not, you know, you, it's
10:27 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 of 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:42 It's not cryptography.
10:43 Yeah.
10:44 And then, and then also there's, instead of storing in part of the algorithm,
10:50 he's storing items.
10:51 And he's like, instead of, and later taking hashes and instead of storing the items,
10:56 just store the hashes.
10:57 And then, and then, rust or rust has a thing like you can optimize the, the dealing
11:03 of, collections.
11:04 If you tell it that you're just storing hashes in there, so it doesn't try to rehash your hash.
11:10 and, so, so it's like a no hash hasher, another dependency, but that optimization,
11:19 altogether makes it even faster, but it's, it's, it's 0.21.
11:24 so it's, like what?
11:27 Almost four times faster, like a little three and a half times faster than the native, the
11:32 Python version.
11:33 So that's better.
11:34 then he talks about partially other things, but it's, I don't think this is a really about
11:39 how much faster his implementation of this was.
11:42 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
11:49 list of how to do that.
11:50 So.
11:50 Yeah.
11:51 Looks great.
11:51 I love the, the walkthrough.
11:53 And it's not a huge project.
11:55 It's not a huge rewrite and rust.
11:56 It's just this function slow.
11:58 Let's make this function fast.
11:59 And I think that's exactly how I'm going to try to probably learn rust is I'm not going
12:04 to try to learn the whole language.
12:05 I'm just going to learn enough to optimize something.
12:07 so, and then build on that.
12:09 Yes.
12:10 And now before we move on to things really quick, John out in the audience points out,
12:15 says, I believe mod whiskey is an Apache plugin module, which I think he's right.
12:18 Yeah.
12:19 I think that's as well.
12:20 And I just wouldn't really want an Apache plugin.
12:22 I would 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:30 That's interesting.
12:31 The context of the, the GitHub issue I talked about before was a Docker image.
12:36 And so I'm pretty sure it was Linux.
12:38 but yeah, I didn't know about the windows aspect there and I didn't point out like, well,
12:43 what would I have picked?
12:44 So reasonable options to Michael sound like granion, which we're using UV a corn, which used
12:50 to be a kind of dev thing.
12:52 And you could plug it into Gina corn with UV a corn workers, but actually it's now its own
12:58 standalone thing with worker management.
13:00 And so, so UV a corn is its own possible option.
13:02 Now hyper corn from Phillip Jones and court and then Gina corn with UV corn workers for
13:08 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:14 Yeah.
13:15 I don't, I'm just using granion right now, but all those would be good options.
13:18 I think.
13:19 Okay.
13:19 Let me tell you real quick about doubt APM.
13:23 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
13:32 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
13:42 and solve performance abnormalities faster and easier.
13:45 Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and the
13:50 dreaded N plus one queries that you can end up if you do lazy loading in your ORM.
13:55 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 source code.
14:03 So you can spend less time in the debugger and healing logs and just finding the problems
14:08 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:13 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 you use with no hidden overage fees or per seat pricing.
14:26 And I just learned this, Brian.
14:28 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
14:38 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:46 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.
14:54 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:01 I'm next, huh?
15:02 Yeah.
15:03 All right.
15:04 What if, Brian, what if you were super excited, finally be contacted by a recruiter for one
15:09 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:15 Dear.
15:16 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
15:28 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.
15:41 Just malicious Python code, because a lot of it comes from GitHub repositories, not IPI.
15:46 So I don't know.
15:47 I think kind of put the packages to the side.
15:50 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
15:59 this in my entire life.
16:00 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
16:08 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
16:19 with malicious actors posing as recruiters using packages and the names of financial firms to lure
16:26 developers.
16:26 So that's pretty bad.
16:27 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, ATP group.
16:39 That means bad stuff.
16:40 You know, they're pretty, pretty skilled.
16:42 But here's what happens.
16:43 They found that people are getting these requests for coding tests and it says, here's your, here's
16:50 your coding test.
16:51 And if you look at it, I think I can even zoom it 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:58 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 This is the important part before making any modifications, ensure the project is running
17:14 successful.
17:15 And if you trusted this organization, you were really keen to get going like, all right, well,
17:19 let's just, I know what I'm doing.
17:21 Python space, this, boom, boom.
17:23 It's the running of this project that they delivered to you over GitHub or some other, they just sent
17:28 you a thing to unzip and run that then downloads all the code, installs back doors, various other
17:35 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:40 Yeah.
17:41 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 The analysis revealed that the direct parent of the detected malicious files is a Python PYC
17:58 file.
17:59 So that's how they obscure it as part of what they give you are PYC files, not Python
18:04 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
18:12 an interview.
18:12 I, they're going to 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, nope,
18:20 your job is to have this opaque thing and write this one part.
18:23 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:30 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
18:47 only given them in text form.
18:48 I've given a description and then somebody can like email me back or, or submit.
18:53 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
19:02 code for you, that code I then use as part of the interview process.
19:07 Like we will talk about, we'll talk about what choices they made in the code during the actual
19:13 talking interview.
19:14 the other thing, and I've had, I've had that happen with me as well.
19:19 When I've done coding exercises, 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:27 And I would be more willing to do that, than, than believe somebody.
19:32 But I know there's a lot of GitHub based, like there's a private repo you get added to,
19:37 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.
19:45 Yeah, sure.
19:46 I think some other things that I had in mind was if you're just trying out a Docker container
19:51 and it's something real simple, sorry, Python package, I 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
20:00 container shell into it.
20:02 You know, Docker exec GSH or bash or whatever, and then play with it over there and then throw
20:08 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 the, like if you open up GitHub and just press dot, whatever
20:21 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
20:29 capabilities.
20:30 And by snapshot, I mean like save how it is now on the, on the disc and then make a differencing
20:34 disc.
20:35 And then when you're done with the project, just throw away the snapshot, the, the different reset
20:39 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
20:55 remote desktop into.
20:56 That's a full windows machine in the desktop, in the cloud as a desktop, you log into right
21:01 there and just throw away the virtual machine.
21:03 Cause 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
21:11 that are giving coding exercises really should use a platform, because it's just more
21:16 fair for everybody.
21:17 The, and the, even our friends at PyBytes have their own interview platform
21:22 that you can do.
21:23 You can do their little things.
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, just be on the lookout and 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, 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
21:57 and monthly, the office hours will be a session, be sessions where you can share with us how
22:03 we can help your community and express your perspectives and provide feedback to the PSF.
22:09 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
22:20 one that was September 10, but there's one October 8th.
22:23 And then, and then there's, you know, there's a list here we've got.
22:26 Well, I'll just put the list in the show notes.
22:28 Also, 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:36 So it says that you can bring up, I can't remember where, where it said this, but you
22:40 can bring up, there'll either be a topic, but if there's not a topic, you can bring up
22:44 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.
22:54 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
22:59 gone, but my, my little local community that I live in, I can go watch the, the,
23:05 the, the city board meetings if I wanted to, 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
23:21 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 cause this is a joint extra.
23:28 Big news is our courses, mine, yours, and our friends are on humble bundle for a couple
23:36 of weeks.
23:36 So if you want to get what I think is probably a ridiculous deal, like $1,882 worth of content
23:43 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
23:52 why we're participating is a lot of money goes to charity right now.
23:55 It's just launched and so far has already raised almost $3,000 for charity.
23:59 That's pretty cool.
24:00 Traditionally over the years, we've worked with humble bundle and raised a lot of money for
24:05 the PSF and for other organizations through this.
24:07 So this year's charity is girls who code.
24:10 So check it out.
24:12 And there's stuff from me, from Brian, from jet brains, from Matt Harrison, from Reuben Lerner,
24:20 from PyBytes, real Python.
24:23 And anybody I'm leaving out there, I don't think so.
24:26 But yeah.
24:26 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.
24:41 But I'm curious to know what your course has in there.
24:44 There's actually quite a few goodies in there.
24:48 And also, it's ridiculous, though.
24:50 The, I'm including the, both the, the new Hello pytest course and, and the
24:57 complete pytest course and the pytest course on your side.
24:59 I know that's kind of a lot of pytest, but I kind of think about it a lot.
25:04 so a lot of exciting people already joining, and I'm getting some great questions in
25:10 the community forum.
25:11 so that's really good.
25:12 Even some great feedback.
25:13 yeah, it'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.
25:24 Next, I believe we've talked about the Django Not 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 Not 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
25:48 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.
25:53 So if you're a fan of Django, you want to get better at open source.
25:55 Here we go.
25:56 like I said, a link to this, two more things real quick.
26:00 One planned and one, a surprise alt tab.
26:03 If you're on windows, alt tab is the way you switch between apps on macOS.
26:07 If you switch to macOS, things get weird.
26:09 Like command tab seems like the alt tab, but command tab switches between applications,
26:14 not between windows.
26:15 So for example, if there's like a, Hey, there's an update available for your app.
26:18 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
26:28 a top level application, but it's there.
26:30 And like, you want to switch between two windows and web browser.
26:33 I know there's command tab, but that, or sorry, command tilde, 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
26:45 has a super cool UI for switching between windows, not applications.
26:51 And like I said, it's open source, but also it doesn't take over the typical commands.
26:56 So it's an either or whatever you feel like hitting while you're working on Mac.
27:00 What do you think, Brian?
27:01 Cool.
27:01 Yeah, actually, I don't, I never even tried any of this stuff.
27:04 I just usually don't have very much open or I have no idea how to find my stuff.
27:09 Yeah.
27:10 But if you look over on GitHub, it's got 10,000, almost 11,000 stars.
27:14 It's pretty neat.
27:15 Yeah.
27:16 So anyway, people can check that out if they want.
27:17 And this is the prize.
27:19 This was not true when I hit, when we logged in to hit record today.
27:23 However, since then, the macOS Sequoia, the new version of macOS is now out.
27:28 Now, if you go to the website, apple.com slash 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, there you go.
27:41 It's time.
27:42 I'll let you do it 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:51 Yeah.
27:52 Sounds good.
27:53 Anyway, those are my extras.
27:54 Okay.
27:54 I think that we should have covered this earlier, but oh well.
27:59 PyCascades has the call for proposals is open.
28:02 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.
28:18 And I'm going to submit a couple.
28:20 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:25 Will you be there?
28:26 Probably.
28:27 Unclear.
28:27 Maybe.
28:28 Unclear.
28:28 Okay.
28:29 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'll be nice.
28:33 I love PyCascades.
28:34 Okay.
28:35 So that's my first.
28:36 And that's in February.
28:39 So last week we talked about all the UV Python stuff being super cool.
28:46 But we mentioned that you can't do Python 3.13.
28:49 Well, you can now.
28:50 So Python 3.13 is now available for virtual environments and for anything with UV.
28:58 So UV supports Python 13, but it does not subvert.
29:02 If the next question is, can I do the other one?
29:07 Free-threaded.
29:08 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 stuff in.
29:16 So I think that's all my extras.
29:19 Awesome.
29:20 Awesome.
29:20 Awesome.
29:21 Anyway, thanks a lot.
29:22 Yeah.
29:22 I just want to quickly add that I tried UV Python list dash Python preference dash online only managed.
29:31 And it didn't show 3.13 or 12.6, but then a UV self-update, run it again.
29:38 So just be aware.
29:39 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.
29:46 I forgot.
29:46 And also, I think UV self-update is such an awesome thing.
29:51 You just have to.
29:52 It's a great name, self-update.
29:54 I wish I had Brian self-update.
29:56 That'd be cool.
29:58 Exactly.
29:59 Body'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:04 Power.
30:06 We can't rebuild them.
30:07 Okay.
30:08 Okay.
30:08 Let's get something funny.
30:10 All right.
30:11 Well, I was saving this for the November when we have the election in the US.
30:17 This is not political people.
30:18 So please don't write me.
30:19 But this is a tech joke.
30:21 Since Biden dropped out, the joke's kind of got a shelf life.
30:24 Let's go.
30:25 So here it is, Brian.
30:27 Errors 404 and 403 went voting.
30:29 404 voted for Trump.
30:30 403, 403 forbidden.
30:32 Oh, Biden.
30:35 Oh, dear.
30:36 Because 403 is forbidden.
30:38 But anyway.
30:38 Oh.
30:39 That's what I got for you today.
30:43 That's terrible.
30:46 Yeah.
30:47 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.
30:52 Yeah.
30:52 Let's do it.
30:52 All right.
30:53 Looking forward to it.
30:53 And yeah.
30:54 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.
31:03 Indeed.