Transcript #412: Closing the loop
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 412, recorded Monday, December 2nd, 2024.
00:10 I am Michael Kennedy.
00:11 And I am Brian Okken.
00:12 This episode is brought to you by us, especially our Black Friday things.
00:17 Visit our website for the Black Friday things.
00:19 You have 14 hours, so make haste.
00:23 Make haste. Hopefully you listen straight away.
00:26 And if not, thanks for supporting our work and check out our courses and things like that.
00:30 Links are in the show notes.
00:31 You can also get the summary of every episode delivered directly to you.
00:37 Handcrafted, artisanal newsletter by Brian Okken here.
00:41 So check that out.
00:42 And we mentioned this last time, but we are now Blue Skyians.
00:46 We now live in the sky, the blue sky.
00:48 In particular, Python Bytes is over there with the handle Python, you know, at pythonbytes.fm.
00:54 And both Brian and I are linked directly from there.
00:57 So come follow us.
00:59 I have a little extra, extra, extra to follow up on Blue Sky and Mastodon and Twitter, X Twitter, whatever.
01:07 All of these things.
01:09 So I think you will find that interesting.
01:11 But right now, I would like to know, Brian, what you find interesting.
01:14 I find interesting that there's a controversy over loop targets.
01:20 This is so inside baseball, I think.
01:23 But okay.
01:24 So Ned Batchelder wrote a blog post and apparently a social media post on Blue Sky, actually.
01:34 But about what loop targets are.
01:38 So what I'm talking about is a for loop.
01:40 So if you say for, like for X in range 10 or something like that, then X gets assigned 10, like 0 through 9, right?
01:48 So what's the controversy?
01:50 The controversy is what you should put in for X.
01:53 So in his little code example, he's got for param, he's got a parameter dictionary.
01:59 And there's a query and a page size.
02:02 There's no page element, but we're going to fill that in later.
02:05 So what he's doing is he has coded for params, quote, page in iter tools count.
02:13 And what that's going to do is it's just going to go through and get 100 things at a time and put them in a page dictionary until it's empty.
02:23 And there's a break to get out of the loop once there are no results left.
02:29 I think this is kind of clever and I don't see the problem here.
02:31 So the problem is this kind of this params, this index into the dictionary.
02:37 And that's where you're putting the loop parameters.
02:38 Yeah, this is wild because I've seen exploding or expanding tuples into multiple things like for thing in dictionary, the items,
02:48 it's a maybe key comma value in the loop target.
02:52 And that's perfectly normal.
02:53 But assigning a key in the dictionary, this is new to me.
02:56 Really?
02:56 OK.
02:57 Yeah.
02:58 I'm not necessarily I'm neutral on it, whether or not it should be done, but I'm just learning about it now.
03:04 OK.
03:04 So in the discussion, so really what's happening is there's in the discussion, he talks about it, that you could have like an extra variable.
03:13 You could say page num.
03:14 So for page num in iter tools count, it makes it more clear.
03:17 And then you assign the page num to the, you assign that to the dictionary.
03:21 But really, you're just using this page num just as a temporary variable just to stuff it in there.
03:27 So I say, why not just put just to just assign it where you're going to use it.
03:32 And because this extra line of code, I don't know, I'm kind of on the fence because this is more clear.
03:38 I think it's more clear to use a temporary variable.
03:40 It's more readable.
03:41 However, there's an extra line of code.
03:43 So it is like that much more.
03:45 It's not that much more readable, I don't think.
03:47 And it's not.
03:47 And there's that.
03:49 If this in this short code snippet, not a big deal.
03:52 But in a larger for loop, you may have more reason to possibly have something break because somebody like, you know, commented that line out or something and it suddenly doesn't work.
04:02 So anyway, I'm like, this is weird.
04:05 This is controversy.
04:06 But even so he wrote this up just to talk about it and ask what people think.
04:11 And most of the responses are like, no.
04:14 Or one, I think it's a cool idea.
04:16 And I think it's a terrible idea.
04:19 Anyway, I guess I'm bringing this up because I just want to point out that with for loops, there's an implicit assignment.
04:28 And so you can use that assignment to assign to wherever you want to use the variable.
04:33 So I'm going to make an observation here.
04:35 You tell me what you think.
04:36 I believe the people who are for this are also fans of the walrus operator.
04:41 And people who are against this are anti-walrus.
04:44 Oh, that might be true.
04:45 Right.
04:46 It's kind of the same thing.
04:47 It's in a for loop, you're assigning to a variable and kind of sort of defining and assigning in a sense.
04:53 Whereas, you know, the walrus operator does it for if statements.
04:56 But it's like not assign the variable, then test it.
04:59 It's like all at once do the assign and test or assign and loop.
05:03 But there is already an assign in the for loop.
05:06 It's always assignment.
05:07 But is it colon equals?
05:08 No, I'm just kidding.
05:09 Is it colon in?
05:10 Yeah.
05:12 No, it's interesting.
05:13 It does.
05:14 Yeah.
05:14 It's for loop, the original walrus operator.
05:17 All right.
05:17 All right.
05:18 I'm actually going to come back to loops, but not yet.
05:20 I want to talk about the standard library.
05:23 No, no.
05:23 Not the one that you know.
05:24 Not the one that comes with CPython.
05:26 The async standard library.
05:28 It's the missing toolbox for an async world.
05:30 Did you know we're living in an async world?
05:32 I feel like a little Madonna is rocking in my back.
05:34 Is that Madonna?
05:35 I don't know.
05:35 Yeah.
05:37 So one of the problems is if you go and look at many of the things that you know and love,
05:42 say, iter tools or functools, those things have not been kind of blowing my mind because
05:48 they could be, have not been updated to support async.
05:52 Okay.
05:53 So when you do like functools, you know, say a decorator at functools.lrucache, that is
05:59 perfect for a synchronous function.
06:02 It doesn't work for an async one.
06:04 And why do I think that it should work for it?
06:07 Because just a couple of weeks ago, I covered my chameleon flask decorator for templates.
06:13 And I, in a hundred lines of code, I wrote something that decorates and operates on both
06:17 sync and async functions.
06:18 So surely the people who create async.io could probably like write a multi-operator decorator
06:25 deal, but they don't.
06:26 And I have no idea if there's any intention ever for them to do so.
06:30 So what this is, is it's kind of like a clone of those things.
06:33 Not totally.
06:34 It also has some other nice features, but it's like an async version of those.
06:38 So if you have an async function, you want to apply an LRU cache to it.
06:41 Well, go grab this bad boy.
06:43 So it's got a bunch of built-ins for things like asynchronous zip sum, or even converting
06:50 the list.
06:50 It has functools that supports things like I talked about LRU cache.
06:54 And if you look at it, it's looks a whole lot like you would imagine.
06:58 It has a max size.
06:59 It has typed and so on, but it operates on a waitable.
07:04 And it returns an LRU async callable, something you can await like you should the function,
07:10 rather than just a coroutine that is, I don't know, where you cache the coroutine.
07:13 I don't know.
07:14 It doesn't make a lot of sense.
07:15 So this is what this is about.
07:17 It's got a bunch of things like that.
07:19 It has the built-ins.
07:20 It's got a functools libraries for iterators, async caches, attributes, the context lib and
07:26 async context lib.
07:28 So I can do things like add async decorator in context that derives from a context decorator.
07:35 And you can basically a short circuit, the implementation, a simple implementation of a
07:39 enter and a exit.
07:40 So on.
07:41 It has a heap queue, which implements Python's heap queue, but for async, which is pretty cool.
07:46 So you want to merge and stuff.
07:48 And then it has some extra tools.
07:50 And I don't really, I haven't done enough with this to know whether this is useful, how I
07:54 would use it.
07:55 So stick with it.
07:55 Anyway, it has things like borrow, where you can borrow an async iterator to prevent it from
08:01 closing.
08:01 Okay.
08:02 I don't know about that.
08:03 You got scoped ones, but this one is really nice.
08:05 I've written this code before and it's not easy to get completely right.
08:09 It has a thing that you can just call async standard lib dot sync, giving it a async function
08:16 and it'll just, sorry, the way around, given async function, it will turn it into an async
08:21 function that you can await if you need to.
08:23 Or, yeah, or you can give it an async one as well.
08:27 And it doesn't really care.
08:29 I think it adapts.
08:30 But so a bunch of stuff going on here.
08:32 If you're like, ah, there's a bunch of these cool built-ins that I'm used to and they don't
08:35 work with async.
08:36 Well, check out the async standard lib.
08:38 Very cool.
08:39 I think it seems like we have a typed Python and non-typed Python.
08:43 And now we have async Python and synchronous Python.
08:47 And then we're going to have free-threaded and non-free-threaded.
08:50 We're going to have typed async free-threaded Python.
08:53 Yeah.
08:55 And every other combinatorial possibility there.
08:58 It's going to be nuts.
08:58 Yeah.
08:59 Yeah.
08:59 But I think this is a cool one.
09:01 It's not super popular.
09:02 Let me go back to it and see what its GitHub stars are.
09:06 But it's kind of one of those things that's like, yeah, this is definitely worth it.
09:10 I don't know.
09:10 So it has some.
09:12 Oh, here we go.
09:12 No, don't say.
09:13 240.
09:14 So it's starting to pick up some speed.
09:15 But I think it's real simple.
09:17 It's like the kind of thing that's either going to work or not work.
09:19 So if it's useful for you, go for it.
09:21 Nice.
09:21 Yeah.
09:22 It's cool.
09:22 I was going to talk about.
09:25 I haven't had breakfast yet.
09:27 So I was going to talk about some.
09:28 Maybe getting a bagel.
09:29 You want a bagel?
09:29 Okay.
09:30 Yeah.
09:30 I love bagels.
09:31 As long as it got everything, we're good.
09:33 Everything bagel.
09:34 Let's go.
09:34 Well, I am taking a look at a project called Enhanced Jack.
09:38 It's called Bagels from Enhanced Jack.
09:41 Who's Enhanced Jack's?
09:42 It's Jack's Tam.
09:44 Cool.
09:45 Aspiring student studying.
09:46 Oh, no.
09:47 University student.
09:48 Cool.
09:48 Anyway, why am I bringing up bagels?
09:50 Well, bagels is kind of a fun little expense tracker.
09:55 But I think it's a great example of using Textual for something that, you know, people probably
10:02 could sink their teeth into pretty easy.
10:04 So it's an expense tracker with multiple accounts using Textual.
10:08 I've tried it out.
10:09 It's really pretty easy.
10:10 There's a bunch of stuff I like about this.
10:12 And I'm bringing it up.
10:14 Not really because I think everybody needs an expense tracker.
10:16 But I think a lot of people look for a starter, like a starter project to possibly tweak and make
10:23 their own.
10:24 And I think this might be kind of a fun thing for people to look at.
10:27 A few things about it.
10:28 I like it that it's in the command line.
10:31 It's a textual app.
10:32 But it's also the install instructions.
10:34 I love seeing this.
10:35 It's starting to use the UV tool install so that you can just run bagels from anywhere.
10:41 It's the way.
10:42 This is the way.
10:44 This is the way.
10:44 And it's so fast to get started.
10:49 I also like that the project is pretty new.
10:53 But it's just a few weeks started.
10:57 But there's already some features included.
11:00 Features included is great.
11:02 And then also how to development setup is listed.
11:07 And it doesn't talk about how to run tests.
11:10 But that's all right.
11:10 It's running pytest, of course.
11:12 But then a roadmap of sort of things that they'd like to add to it.
11:17 It's heavily inspired by posting.
11:20 So anyway, just a fun little project.
11:22 The tests are in place.
11:24 It's not a complete coverage yet.
11:27 But it's a new project.
11:28 So if you want to help out, I think it's a good thing for people to check out.
11:32 Also, I've always wanted to write my own little expense tracker.
11:35 And so this is a good start for even if it doesn't do everything I wanted to do,
11:40 to take up the code base and maybe play with it, learn some stuff.
11:43 It's also, it's written, it's using, I can't remember.
11:46 It was using a PostgreSQL, like a SQLAlchemy.
11:51 Also, if you want to have a simple, small project that uses SQLAlchemy to learn that,
11:56 be a good one to take a look at.
11:58 Awesome.
11:58 Yeah, that's really cool.
11:59 And we've covered Postling?
12:01 What was it called?
12:02 You covered it.
12:03 The Posting.
12:04 Yeah.
12:05 A little app that was written in.
12:06 Posting, what was that?
12:07 Remember?
12:08 That was the Postman alternative for the terminal written in textual, which is cool.
12:14 Yeah, which is like a dream to work with.
12:16 It's a fun one.
12:17 Yeah, very nice.
12:18 I want to, since you brought this up, I'll throw this out here.
12:21 Not super necessarily relevant.
12:23 But I recently ran across maybe.co.
12:25 Okay.
12:26 It's almost a company, but it lost the M along the way.
12:29 Anyway, it's a fully open source OS for your personal finances running on Docker.
12:35 If you want to do self-hosting, keep all of your data private instead of like sending off
12:39 to Intuit or somewhere that it probably doesn't belong.
12:42 So anyway, people can check that out.
12:43 That's kind of cool.
12:43 Cool.
12:44 Not an endorsement.
12:44 Haven't used it, but kind of thinking about it.
12:46 I would rather bring it full circle.
12:48 We began with loops.
12:49 Let us end with loops.
12:51 Isn't that perfect for a full circle?
12:52 They go in circles, don't they?
12:54 Yeah.
12:54 So this is the early days sort of thing, but Giovanni, who is the creator of the Emmet framework
13:01 and more relevant to us, the Grannion AsyncSync Rust-based web server that powers Python bytes
13:07 and other things that we have, is creating this thing that is an alternative to UV loop.
13:13 So UV loop is a, I think it's based on LibUV.
13:16 I can't remember exactly the origins of it, but it's a loop that you can plug in as an alternative
13:22 for the AsyncIO event loop implementation.
13:25 Okay.
13:26 So why would you do that?
13:28 Well, it turns out that you can optimize some of the juggling of the little tasks.
13:34 So if you have like three tasks, one is call the website, one is talk to the database,
13:38 one is write a file or whatever, don't do anything.
13:40 The built-in one's fine.
13:41 But if you have a million tasks and you're breaking them into little tiny pieces and they're jumping
13:45 all over, like that juggling could be faster with UV loop.
13:48 And I think that's where we're going to see it go with our loop.
13:52 So our loop is an Async event loop implemented in Rust and it's coming along.
13:57 It is a work in progress and not ready.
13:59 But the reason I bring it up early in its life here is it's a really cool option.
14:03 We've seen how significant the improvements for other Rust things like Pydantic and UV have
14:09 been.
14:10 And so if you're passionate about this and you want to have maybe a little influence
14:13 before it gets fully baked as this thing's coming to life, you know, jump in.
14:17 The way you use it is just like UV.
14:19 It's super easy.
14:20 Just before you do Async things, you just say AsyncIO.setEventLoopPolicy, which is a factory,
14:26 I'm thinking.
14:27 Kind of a factory method more.
14:28 I don't know, whatever.
14:29 And you just give it Rloop.EventLoopPolicy.
14:31 And that means anytime code creates a new event loop, it's going to be using the factory
14:36 method from Rloop rather than the built-in one.
14:38 Off you go.
14:39 Cool.
14:40 Yeah.
14:40 Well, cool.
14:40 Well, that's it for our items, right?
14:42 I think so.
14:43 Yeah.
14:44 I think it is.
14:44 Extras?
14:45 What do you think?
14:46 Extras?
14:47 Yeah, I have a few.
14:48 You want me to jump in?
14:49 Jump in.
14:49 I am, I've had a lot of stuff going on in personal life lately and trying to fit everything into
14:56 my life is sometimes difficult.
14:58 So I've been reading, reading, reading in quotes, listening to the audio book for 4,000
15:04 weeks, a time management, time management for mortals.
15:07 It's a book by Oliver Berkman.
15:09 And I'm listening to it for the second time now in the last couple of weeks.
15:13 I just picked it up a week or so ago, but I'm really enjoying it.
15:17 And it's more of a, you can't get everything done, but that's okay.
15:22 Just how to be okay with the limitations of life.
15:26 So very refreshing time management book.
15:29 It's also got some practical advice too, but it's great.
15:33 So highly, highly recommend that.
15:36 It's advent of, advent of code time.
15:39 And I've heard of the, so I've definitely heard of the advent of code, but the advent of
15:46 code.com.
15:47 Very cool.
15:47 A lot of people do that every year for in December to do little code snippets every year.
15:53 But today I came across Adrian Roselli's development advent calendars for 2024.
15:58 So if advent of code isn't quite what up your alley, there's a whole bunch here.
16:04 There's HTML hell advent calendar.
16:06 There's a whole bunch of code and code-based advent calendars here.
16:10 So none of them Python specific.
16:13 There's a Perl specific, but C# advent of cyber.
16:17 Just quite a, quite a few fun, different calendars.
16:20 CSS.
16:21 If you wanted to learn CSS, maybe there's just CSS.
16:23 The Joomla advent calendar.
16:24 You too can host it.
16:27 So yeah.
16:28 And apparently it's gone, it's gone back.
16:30 He's got links back to 2010.
16:33 So it's fun.
16:34 Wow.
16:34 Yeah.
16:35 If you get your homework done early, you can do more advent of calendars.
16:38 Yeah.
16:39 I don't, so I tried, I tried advent of code a couple of years ago.
16:43 And then I just realized that like in my free time, I've, I'm doing so much code coding at
16:48 work, side hustles and everything that I kind of want to do things like draw and paint and
16:54 cook and things like that when, when I'm doing other stuff.
16:58 So anyway, I hear you.
16:59 I'm the same.
17:00 I already do a lot of programming.
17:01 Even in my spare time, I do more programming.
17:03 Yeah.
17:04 And so I don't need extra ones, but I know it helps people, especially people are trying
17:07 to learn a topic.
17:08 It can kind of force you if you don't have a way to apply it.
17:11 And today is December 2nd, Monday, traditionally a cyber Monday.
17:15 And it is the last day for the black Friday sale, turkey sale for the python test.com courses,
17:23 however.
17:24 And so I'll take, I'll take off the automatic.
17:26 But if you, if you hit me, if you're listening to this later, you know, close in it, close
17:32 ish to December 2nd, direct message me on, on blue sky and I'll hook you up.
17:37 So anyway, that's it.
17:38 Blue sky.
17:39 That's a good transition.
17:40 All right.
17:41 Also black Friday at talk python.
17:43 So talkpython.fm/ black Friday, 20 to 50% off the course library.
17:47 Nice logo there.
17:48 The image is great.
17:49 Thanks.
17:50 That's pure CSS, by the way.
17:51 That's some mad glow in CSS.
17:53 Yeah, it's cool.
17:54 Yeah.
17:54 Awesome.
17:55 All right.
17:55 So we'd talk blue sky.
17:57 So I just, you know, last week when I finished producing the show and I published it onto the
18:03 internet, typically go to the social networks and I'll do a quick post.
18:06 Hey, new episodes out.
18:06 Enjoy it.
18:07 If you want it.
18:07 This one had a little guitar solo at the end, which was super fun.
18:11 And so it said latest episode out for 11 TLS client.
18:14 Hello.
18:15 Guitar solo was the name.
18:16 And I published that and I published it at the same time with the same text to X,
18:22 Fostadon, Mastadon and blue sky.
18:25 And I just thought, huh, I wonder what the engagement looks like, because I don't know how you've been
18:29 feeling, Brian, but I feel like people, I tried and tried to get folks to go to Mastadon
18:34 and like some, some people came, came along, but a bunch just didn't, you know, they were
18:39 just, you would go back to X and you would just see them all talking there.
18:42 I'm like, man, I don't know.
18:43 And I'm not necessarily super against X.
18:45 I'm a little bit against it, but I'm not a lot, but it's just, it's become not very practical
18:50 as you'll see in just a second.
18:51 Not very useful.
18:52 So, you know, you want to go talk to yourself in a closet.
18:55 It's awesome.
18:56 You want to talk to other people?
18:57 Well, that's so.
18:58 Anyway, so my, my test here, this is a non-scientific test that I put out there.
19:03 What is the interaction level per platform?
19:07 And what you have to keep in mind before I tell you guys this, there's a dramatic difference
19:11 in number of followers, subscribers, whatever they're called at that particular location.
19:16 Okay.
19:16 So basically take the numbers, divide by the number of followers and consider that like
19:20 the amount of interaction.
19:21 The reason I tell you this is you may want to come follow us and join us on blue sky, but
19:25 that's, that's a bit of a get in the head.
19:27 So check this out.
19:27 So over on X, we have 27,000 followers.
19:32 Okay.
19:32 Posting this exact message one week ago, we got eight likes and two retweets, reposts,
19:38 boost, name it, whatever.
19:40 Yeah.
19:40 So I don't know what that is.
19:42 Two divided by 27,000, but it's a small percentage.
19:45 Okay.
19:45 Fostadon, Mastodon, right?
19:47 It's not Fostadon, Mastodon, because it's across all, all the Fediverse.
19:51 Same posts, identical.
19:53 Here we have 3,000.
19:55 Let me see.
19:55 3,100 followers.
19:57 Okay.
19:57 So yeah, that's great.
19:59 But this is almost nine times less.
20:01 Something like that, right?
20:02 It's many, many less times, but four boosts, which is not out of control, honestly, but
20:07 it's in two favorites, two likes.
20:08 But as a ratio, it's still a lot more because multiply by nine, right?
20:13 Yeah.
20:13 Blue sky, which we've been there a couple of days.
20:16 We have something like that.
20:17 We only have a, somebody hover, different hover targets, 750 followers.
20:23 Yeah.
20:24 Follow us on blue sky.
20:25 Get over there.
20:25 Yeah.
20:26 Anyway, we have 16 likes and two reposts and a quote posts and then some conversation
20:31 about it.
20:32 And that's 30 times less followers and more engagement than both platforms.
20:37 So anyway, I, y'all take that for what it is.
20:40 I just thought that was an interesting experiment.
20:42 What do you think, Brian?
20:43 Yeah, I'm finding, I'm finding blue sky more interactive.
20:46 I've got about this approximate same numbers on a fostered on or mastodon and, and blue sky
20:53 and, and I'll, I'll get like twice as much interaction on, I mean, approximate gut feel twice as
21:00 much interaction on blue skies.
21:01 I do on, on mastodon.
21:04 Yeah.
21:04 Yeah.
21:05 Yeah.
21:05 And I'm not saying this to bag on some social network or try to promote other too much.
21:10 I was like, people are trying to find their community.
21:12 I think right now this is where the community is.
21:15 And if you go here, you can go to my account and go to the starter pack and there's the
21:19 Python personalities and you can follow a bunch of us.
21:22 The onboarding experience is way better.
21:24 The, the onboarding experience for mastodon still feels like it's too many decisions right
21:30 at once.
21:31 And then it's like, if you wanted to play games on Linux, you probably could.
21:35 Yeah.
21:37 Yeah.
21:38 And I'm a, by the way, I'm, I'm no longer on X.
21:41 So don't notify me there.
21:42 Yeah.
21:43 Sounds good.
21:43 All right.
21:44 A couple of other real quick things on episode 277, I believe.
21:47 I don't have my show notes up, but I'm pretty sure that was the number.
21:49 Way back when I talked about certain string enumeration, which is a thing that basically
21:55 backports the string enum from Python 3.11.
22:00 So it can be used in other places.
22:01 It's super cool.
22:02 It's even better than the built-in one, by the way.
22:04 So I can have, I can say, give me a string enum and derive a class from that.
22:10 That becomes an enumeration where you say that thing dot, but then you have the fields and
22:15 just say equals auto, auto, auto, auto.
22:17 And it'll actually set it to the text of whatever the variable is.
22:20 If you refactor, rename it, it will apply that refactoring to the string version and the variable
22:25 version of it.
22:26 And you can even do things like use a lowercase or an uppercase one as the base class, a lowercase
22:32 string enum.
22:33 And that will make the string version lowercase.
22:35 Even if you have a different, a different representation for the variable names.
22:40 Anyway, the re why did I do this?
22:41 Because on my list monk little client, somebody came and said, why doesn't this work on anything
22:45 less than 3.11?
22:46 I'm like, because it uses string enum from 3.11.
22:50 So I'm like, you know what?
22:51 I'll just, I'll just derive from the other class.
22:53 Add that as a dependency.
22:54 I already had dependencies.
22:55 That's one more small one.
22:56 And guess what?
22:57 Now it supports older versions of Python.
22:59 I stopped it at 3.10 because I want nice type-ins.
23:03 I don't want ugly type-ins.
23:04 You're nicer than me, man.
23:06 I'm like, it doesn't support it.
23:09 It doesn't, because I don't want to support it.
23:11 Yeah.
23:12 But then I was curious, like, well, why doesn't it?
23:14 And I remember we talked about this thing.
23:15 And if I literally just change a base class and don't do anything else, that was pretty
23:19 low effort.
23:20 So, you know, it took like five minutes, right?
23:22 All right.
23:22 Yeah.
23:23 So anyway.
23:24 All right.
23:25 That's it for my extras.
23:26 Shall we close it out with a joke?
23:29 Yeah.
23:29 Let's do something funny.
23:30 Man.
23:31 I know we were just talking, we just experienced a food holiday in the United States last week
23:35 with Thanksgiving and all.
23:36 And I hope everyone's was good.
23:38 If you celebrate it.
23:39 However, sometimes there's a lot of food prep and it can be, it can be hard, right?
23:43 It can be hard.
23:44 Like you're shopping, you're chopping all of these things.
23:47 So here is a programmer or just a computer user really who has a grocery list.
23:52 And the grocery list says eggs, corn, tomatoes, onions, rice, milk.
23:56 They decide they don't want the onions.
23:57 So they highlight it and they hit control X and a tear forms in their eye because of course
24:02 it does when you cut onions.
24:03 That's really funny.
24:06 It's pretty good, right?
24:07 I mean, yeah, it's good.
24:09 I don't know why.
24:10 It's cheesy.
24:11 It's cheesy.
24:11 It's a little cheesy.
24:12 A little cheesy.
24:13 Yeah.
24:15 I'll do one more for us.
24:17 That's straight out of the comments because Cohen did a pretty good one.
24:20 When we were talking about the loop targets, it says, how about this?
24:23 We're putting two controversial ideas together.
24:25 Sum of sum of numbers plus X for numbers of zero in numbers.
24:31 If X colon equal numbers squared is such and such.
24:35 Like, oh my goodness.
24:36 This is a lot of stuff going.
24:38 I said, here's a job interview for you.
24:40 Job interview question.
24:42 If you answer with a straight face, you fail.
24:43 No, it's good.
24:46 Yeah.
24:47 If you think that's all right.
24:48 Nope.
24:49 You're out.
24:49 I don't know.
24:50 Not seriously, but as a joke, it's pretty good.
24:53 Yeah.
24:53 Job interview stuff.
24:56 Job interviews are tough.
24:57 I know a lot of people are going through that now.
24:58 Yeah.
24:59 Well, you know, the control X part and also the job interview might bring a tear to the
25:03 heights.
25:03 I don't know.
25:05 I haven't, I haven't applied for a job in, well, since the nineties, however, which is
25:10 insane.
25:10 That is insane, man.
25:12 It's actually insane.
25:13 but because all my job transitions have been like, Hey, you'd be awesome.
25:17 Like, why don't you consider working for, it was more of the other way around, you know,
25:21 which is pretty fortunate, but it sounds like your resume has like, like a lawn mowing
25:26 on it still or something.
25:27 Exactly.
25:28 I work for companies.
25:30 They just reached out to me and said, would you consider working for us?
25:33 I know, but you probably didn't have to, you haven't probably had to update your resume
25:36 for a long time.
25:37 Yeah.
25:37 My LinkedIn is like, I'm, I've had some experience at a pizza place and I've done lawn mowing.
25:43 So that was good.
25:45 No, but I do.
25:45 I was just going to say, I think it's probably pretty brutal.
25:47 You've got to, you know, pass the AI gauntlets and all sorts of weird business and take home
25:52 quizzes.
25:52 And I can see why there would be tears.
25:54 But not for this in the show.
25:56 Thank you everyone for coming.
25:58 Thank you, Brian.
25:58 See y'all later.