Episode Transcript
Transcripts are displayed as originally observed. Some content, including advertisements may have changed.
Use Ctrl + F to search
0:00
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
0:05
This is episode 412, recorded Monday, December 2nd, 2024.
0:10
I am Michael Kennedy. And I am Brian Okken.
0:12
This episode is brought to you by us, especially our Black Friday things.
0:17
Visit our website for the Black Friday things.
0:19
You have 14 hours, so make haste.
0:23
Make haste. Hopefully you listen straight away.
0:26
And if not, thanks for supporting our work and check out our courses and things like that.
0:30
Links are in the show notes. You can also get the summary of every episode delivered directly to you.
0:37
Handcrafted, artisanal newsletter by Brian Okken here.
0:41
So check that out. And we mentioned this last time, but we are now Blue Skyians.
0:46
We now live in the sky, the blue sky.
0:48
In particular, Python Bytes is over there with the handle Python, you know, at pythonbytes.fm.
0:54
And both Brian and I are linked directly from there.
0:57
So come follow us. I have a little extra, extra, extra to follow up on Blue Sky and Mastodon and Twitter, X Twitter, whatever.
1:07
All of these things. So I think you will find that interesting.
1:11
But right now, I would like to know, Brian, what you find interesting.
1:14
I find interesting that there's a controversy over loop targets.
1:20
This is so inside baseball, I think.
1:23
But okay. So Ned Batchelder wrote a blog post and apparently a social media post on Blue Sky, actually.
1:34
But about what loop targets are.
1:38
So what I'm talking about is a for loop.
1: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?
1:48
So what's the controversy? The controversy is what you should put in for X.
1:53
So in his little code example, he's got for param, he's got a parameter dictionary.
1:59
And there's a query and a page size.
2:02
There's no page element, but we're going to fill that in later.
2:05
So what he's doing is he has coded for params, quote, page in iter tools count.
2: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.
2:23
And there's a break to get out of the loop once there are no results left.
2:29
I think this is kind of clever and I don't see the problem here.
2:31
So the problem is this kind of this params, this index into the dictionary.
2:37
And that's where you're putting the loop parameters. Yeah, this is wild because I've seen exploding or expanding tuples into multiple things like for thing in dictionary, the items,
2:48
it's a maybe key comma value in the loop target.
2:52
And that's perfectly normal. But assigning a key in the dictionary, this is new to me.
2:56
Really? OK. Yeah. I'm not necessarily I'm neutral on it, whether or not it should be done, but I'm just learning about it now.
3:04
OK. 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.
3:13
You could say page num. So for page num in iter tools count, it makes it more clear.
3:17
And then you assign the page num to the, you assign that to the dictionary.
3:21
But really, you're just using this page num just as a temporary variable just to stuff it in there.
3:27
So I say, why not just put just to just assign it where you're going to use it.
3:32
And because this extra line of code, I don't know, I'm kind of on the fence because this is more clear.
3:38
I think it's more clear to use a temporary variable.
3:40
It's more readable. However, there's an extra line of code.
3:43
So it is like that much more. It's not that much more readable, I don't think.
3:47
And it's not. And there's that. If this in this short code snippet, not a big deal.
3: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.
4:02
So anyway, I'm like, this is weird.
4:05
This is controversy. But even so he wrote this up just to talk about it and ask what people think.
4:11
And most of the responses are like, no.
4:14
Or one, I think it's a cool idea.
4:16
And I think it's a terrible idea.
4: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.
4:28
And so you can use that assignment to assign to wherever you want to use the variable.
4:33
So I'm going to make an observation here.
4:35
You tell me what you think. I believe the people who are for this are also fans of the walrus operator.
4:41
And people who are against this are anti-walrus.
4:44
Oh, that might be true. Right.
4:46
It's kind of the same thing. It's in a for loop, you're assigning to a variable and kind of sort of defining and assigning in a sense.
4:53
Whereas, you know, the walrus operator does it for if statements.
4:56
But it's like not assign the variable, then test it.
4:59
It's like all at once do the assign and test or assign and loop.
5:03
But there is already an assign in the for loop.
5:06
It's always assignment. But is it colon equals?
5:08
No, I'm just kidding. Is it colon in? Yeah.
5:12
No, it's interesting. It does. Yeah.
5:14
It's for loop, the original walrus operator.
5:17
All right. All right. I'm actually going to come back to loops, but not yet.
5:20
I want to talk about the standard library.
5:23
No, no. Not the one that you know. Not the one that comes with CPython.
5:26
The async standard library. It's the missing toolbox for an async world.
5:30
Did you know we're living in an async world? I feel like a little Madonna is rocking in my back.
5:34
Is that Madonna? I don't know. Yeah.
5:37
So one of the problems is if you go and look at many of the things that you know and love,
5:42
say, iter tools or functools, those things have not been kind of blowing my mind because
5:48
they could be, have not been updated to support async.
5:52
Okay. So when you do like functools, you know, say a decorator at functools.lrucache, that is
5:59
perfect for a synchronous function.
6:02
It doesn't work for an async one.
6:04
And why do I think that it should work for it?
6:07
Because just a couple of weeks ago, I covered my chameleon flask decorator for templates.
6:13
And I, in a hundred lines of code, I wrote something that decorates and operates on both
6:17
sync and async functions. So surely the people who create async.io could probably like write a multi-operator decorator
6:25
deal, but they don't. And I have no idea if there's any intention ever for them to do so.
6:30
So what this is, is it's kind of like a clone of those things.
6:33
Not totally. It also has some other nice features, but it's like an async version of those.
6:38
So if you have an async function, you want to apply an LRU cache to it.
6:41
Well, go grab this bad boy. So it's got a bunch of built-ins for things like asynchronous zip sum, or even converting
6:50
the list. It has functools that supports things like I talked about LRU cache.
6:54
And if you look at it, it's looks a whole lot like you would imagine.
6:58
It has a max size. It has typed and so on, but it operates on a waitable.
7:04
And it returns an LRU async callable, something you can await like you should the function,
7:10
rather than just a coroutine that is, I don't know, where you cache the coroutine.
7:13
I don't know. It doesn't make a lot of sense.
7:15
So this is what this is about. It's got a bunch of things like that.
7:19
It has the built-ins. It's got a functools libraries for iterators, async caches, attributes, the context lib and
7:26
async context lib. So I can do things like add async decorator in context that derives from a context decorator.
7:35
And you can basically a short circuit, the implementation, a simple implementation of a
7:39
enter and a exit. So on. It has a heap queue, which implements Python's heap queue, but for async, which is pretty cool.
7:46
So you want to merge and stuff. And then it has some extra tools.
7:50
And I don't really, I haven't done enough with this to know whether this is useful, how I
7:54
would use it. So stick with it. Anyway, it has things like borrow, where you can borrow an async iterator to prevent it from
8:01
closing. Okay. I don't know about that.
8:03
You got scoped ones, but this one is really nice.
8:05
I've written this code before and it's not easy to get completely right.
8:09
It has a thing that you can just call async standard lib dot sync, giving it a async function
8:16
and it'll just, sorry, the way around, given async function, it will turn it into an async
8:21
function that you can await if you need to.
8:23
Or, yeah, or you can give it an async one as well.
8:27
And it doesn't really care. I think it adapts.
8:30
But so a bunch of stuff going on here. If you're like, ah, there's a bunch of these cool built-ins that I'm used to and they don't
8:35
work with async. Well, check out the async standard lib.
8:38
Very cool. I think it seems like we have a typed Python and non-typed Python.
8:43
And now we have async Python and synchronous Python.
8:47
And then we're going to have free-threaded and non-free-threaded.
8:50
We're going to have typed async free-threaded Python.
8:53
Yeah.
8:55
And every other combinatorial possibility there.
8:58
It's going to be nuts. Yeah. Yeah. But I think this is a cool one.
9:01
It's not super popular. Let me go back to it and see what its GitHub stars are.
9:06
But it's kind of one of those things that's like, yeah, this is definitely worth it.
9:10
I don't know. So it has some. Oh, here we go.
9:12
No, don't say. 240. So it's starting to pick up some speed.
9:15
But I think it's real simple. It's like the kind of thing that's either going to work or not work.
9:19
So if it's useful for you, go for it. Nice.
9:21
Yeah. It's cool. I was going to talk about.
9:25
I haven't had breakfast yet. So I was going to talk about some.
9:28
Maybe getting a bagel. You want a bagel? Okay. Yeah.
9:30
I love bagels. As long as it got everything, we're good.
9:33
Everything bagel. Let's go. Well, I am taking a look at a project called Enhanced Jack.
9:38
It's called Bagels from Enhanced Jack.
9:41
Who's Enhanced Jack's? It's Jack's Tam.
9:44
Cool. Aspiring student studying.
9:46
Oh, no. University student. Cool. Anyway, why am I bringing up bagels?
9:50
Well, bagels is kind of a fun little expense tracker.
9: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. So it's an expense tracker with multiple accounts using Textual.
10:08
I've tried it out. It's really pretty easy. There's a bunch of stuff I like about this.
10:12
And I'm bringing it up. 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. And I think this might be kind of a fun thing for people to look at.
10:27
A few things about it. I like it that it's in the command line.
10:31
It's a textual app. But it's also the install instructions.
10:34
I love seeing this. It's starting to use the UV tool install so that you can just run bagels from anywhere.
10:41
It's the way. This is the way. 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. 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. 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. The tests are in place.
11:24
It's not a complete coverage yet.
11:27
But it's a new project. 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. Awesome. Yeah, that's really cool.
11:59
And we've covered Postling?
12:01
What was it called? You covered it. The Posting.
12:04
Yeah. A little app that was written in.
12:06
Posting, what was that? Remember? 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. 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. But I recently ran across maybe.co.
12:25
Okay. 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. That's kind of cool. Cool. Not an endorsement.
12:44
Haven't used it, but kind of thinking about it. I would rather bring it full circle.
12:48
We began with loops. Let us end with loops.
12:51
Isn't that perfect for a full circle? They go in circles, don't they?
12:54
Yeah. 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. 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. 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. 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. 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. Kind of a factory method more.
14:28
I don't know, whatever. 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. Cool. Yeah. Well, cool.
14:40
Well, that's it for our items, right? I think so.
14:43
Yeah. I think it is. Extras?
14:45
What do you think? Extras? Yeah, I have a few.
14:48
You want me to jump in? Jump in. 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. 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. 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. Very cool. 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. If you wanted to learn CSS, maybe there's just CSS.
16:23
The Joomla advent calendar. You too can host it.
16:27
So yeah. And apparently it's gone, it's gone back.
16:30
He's got links back to 2010.
16:33
So it's fun. Wow. Yeah.
16:35
If you get your homework done early, you can do more advent of calendars.
16:38
Yeah. 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. I'm the same.
17:00
I already do a lot of programming. Even in my spare time, I do more programming.
17:03
Yeah. And so I don't need extra ones, but I know it helps people, especially people are trying
17:07
to learn a topic. 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. 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. Blue sky. That's a good transition.
17:40
All right. 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. The image is great.
17:49
Thanks. That's pure CSS, by the way. That's some mad glow in CSS.
17:53
Yeah, it's cool. Yeah. Awesome.
17:55
All right. 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. Enjoy it. If you want it. 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. 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. 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. Not very useful. So, you know, you want to go talk to yourself in a closet.
18:55
It's awesome. You want to talk to other people?
18:57
Well, that's so. 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. So basically take the numbers, divide by the number of followers and consider that like
19:20
the amount of interaction. 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. So check this out. So over on X, we have 27,000 followers.
19:32
Okay. Posting this exact message one week ago, we got eight likes and two retweets, reposts,
19:38
boost, name it, whatever. Yeah. So I don't know what that is.
19:42
Two divided by 27,000, but it's a small percentage.
19:45
Okay. 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. 3,100 followers. Okay.
19:57
So yeah, that's great. But this is almost nine times less.
20:01
Something like that, right? 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. But as a ratio, it's still a lot more because multiply by nine, right?
20:13
Yeah. Blue sky, which we've been there a couple of days.
20:16
We have something like that. We only have a, somebody hover, different hover targets, 750 followers.
20:23
Yeah. Follow us on blue sky. Get over there.
20:25
Yeah. Anyway, we have 16 likes and two reposts and a quote posts and then some conversation
20:31
about it. 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. 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. I do on, on mastodon.
21:04
Yeah. Yeah. Yeah. 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. And then it's like, if you wanted to play games on Linux, you probably could.
21:35
Yeah.
21:37
Yeah. And I'm a, by the way, I'm, I'm no longer on X.
21:41
So don't notify me there. Yeah. Sounds good.
21:43
All right. 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. 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. 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. 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. And you can even do things like use a lowercase or an uppercase one as the base class, a lowercase
22:32
string enum. 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? Because on my list monk little client, somebody came and said, why doesn't this work on anything
22:45
less than 3.11? I'm like, because it uses string enum from 3.11.
22:50
So I'm like, you know what? I'll just, I'll just derive from the other class.
22:53
Add that as a dependency. I already had dependencies.
22:55
That's one more small one. And guess what? 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. 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. But then I was curious, like, well, why doesn't it?
23:14
And I remember we talked about this thing. And if I literally just change a base class and don't do anything else, that was pretty
23:19
low effort. So, you know, it took like five minutes, right?
23:22
All right. Yeah. So anyway.
23:24
All right. That's it for my extras. Shall we close it out with a joke?
23:29
Yeah. Let's do something funny. Man. I know we were just talking, we just experienced a food holiday in the United States last week
23:35
with Thanksgiving and all. And I hope everyone's was good.
23:38
If you celebrate it. However, sometimes there's a lot of food prep and it can be, it can be hard, right?
23:43
It can be hard. 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. 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. That's really funny.
24:06
It's pretty good, right? I mean, yeah, it's good.
24:09
I don't know why. It's cheesy. It's cheesy.
24:11
It's a little cheesy. A little cheesy.
24:13
Yeah.
24:15
I'll do one more for us. 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. 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. This is a lot of stuff going.
24:38
I said, here's a job interview for you. Job interview question.
24:42
If you answer with a straight face, you fail. No, it's good.
24:46
Yeah. If you think that's all right. Nope.
24:49
You're out. I don't know. Not seriously, but as a joke, it's pretty good.
24:53
Yeah. Job interview stuff.
24:56
Job interviews are tough. I know a lot of people are going through that now.
24:58
Yeah. Well, you know, the control X part and also the job interview might bring a tear to the
25:03
heights. I don't know. I haven't, I haven't applied for a job in, well, since the nineties, however, which is
25:10
insane. That is insane, man.
25:12
It's actually insane. Um, 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. Exactly.
25:28
I work for companies. 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. Yeah. 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. No, but I do. 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. And I can see why there would be tears.
25:54
But not for this in the show. Thank you everyone for coming.
25:58
Thank you, Brian. See y'all later.
Podchaser is the ultimate destination for podcast data, search, and discovery. Learn More