Python Bytes - #412 Closing the loop
Episode Date: December 2, 2024Topics covered in this episode: Loop targets asyncstdlib Bagels: TUI Expense Tracker rloop: An AsyncIO event loop implemented in Rust Extras Joke Watch on YouTube About the show Sponsored by us!... Support our work through: Our courses at Talk Python Training The Complete pytest Course Patreon Supporters Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Brian #1: Loop targets Ned Batchelder I don’t think I would have covered this had it not been the surprising opposition to Ned’s code. Here’s the snippet: params = { "query": QUERY, "page_size": 100, } *# Get page=0, page=1, page=2, ...* **for** params["page"] in itertools.count(): data = requests.get(SEARCH_URL, params).json() **if** not data["results"]: **break** ... Ned is utilizing the assignment in the for loop to use the value of count() and store it into the params["page"]. The article includes another version with a temp variable page_num, which I think the naysayers would prefer. But frankly, I think both are fine. Why not put the value right where you want it? Michael #2: asyncstdlib The asyncstdlib library re-implements functions and classes of the Python standard library to make them compatible with async callables, iterables and context managers. It is fully agnostic to async event loops and seamlessly works with asyncio, third-party libraries such as trio, as well as any custom async event loop. Full set of async versions of advantageous standard library helpers, such as zip, map, enumerate, functools.reduce, itertools.tee, itertools.groupby and many others. Safe handling of async iterators to ensure prompt cleanup, as well as various helpers to simplify safely using custom async iterators. Small but powerful toolset to seamlessly integrate existing sync code into async programs and libraries. Brian #3: Bagels: TUI Expense Tracker Jax Tam “Bagels expense tracker is a TUI application where you can track and analyse your money flow, with convenience oriented features and a complete interface. Why an expense tracker in the terminal? I found it easier to build a habit and keep an accurate track of my expenses if I do it at the end of the day, instead of on the go. So why not in the terminal where it's fast, and I can keep all my data locally?” Who hasn’t wanted to write their own expense tracker? This implementation is fun for lots of reasons It’s still new and pretty small, so forking it for your own uses should be easy Built on textual is fun install instructions based on uv tool seems to be the new normal: uv tool install --python 3.13 bagels test suite started pretty useful as is, actually Nice that it includes a roadmap of future goals Would be a fun project to help out with for anyone looking for anyone looking for a shiny new codebase to contribute to. Michael #4: rloop: An AsyncIO event loop implemented in Rust An AsyncIO event loop implemented in Rust From Giovanni Barillari, Creator of Granian RLoop is an AsyncIO event loop implemented in Rust on top of the mio crate. Disclaimer: This is a work in progress and definitely not ready for production usage. Run asyncio.set_event_loop_policy(rloop.EventLoopPolicy()) and done. Similar to uvloop. Extras Brian: I’m currently listening to Four Thousand Weeks - Time Management for Mortals by Oliver Burkeman for the second time. Highly recommend. Development Advent Calendars for 2024 - Adrian Roselli Black Friday at PythonTest.com Michael: Docker cluster monitor Compare engagement across Mastodon / Bsky / Twitter https://bsky.app/profile/pythonbytes.fm/post/3lbseqgr5m22z https://fosstodon.org/@pythonbytes/113545509565796190 https://x.com/pythonbytes/status/1861166179236319288 Back on #277 we talked about StrEnum. Got a nice chance to use it this weekend. Maybe Finance Go sponsor a bunch of projects on GitHub Black Friday at Talk Python Joke: CTRL + X onion
Transcript
Discussion (0)
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 412, recorded Monday, December 2nd, 2024.
I am Michael Kennedy.
And I am Brian Ocken.
This episode is brought to you by us, especially our Black Friday things.
Visit our website for the Black Friday things.
You have 14 hours, so make haste.
Make haste. Hopefully, hopefully listen straight away. And if not,
you know, thanks for supporting our work and check out our courses and things like that.
Links are in the show notes. You can also get the summary of every episode delivered directly to you,
handcrafted, artisanal newsletter by Brian Ocken here. So check that out. And we mentioned this
last time, but we are now BlueSkyians.
We now live in the sky, the blue sky.
In particular, Python Bytes is over there
with the handle python, you know,
at pythonbytes.fm.
And both Brian and I are linked directly from there.
So come follow us.
I have a little extra, extra, extra to follow up
on BlueSky and Mastodon and twitter x twitter whatever
all of these things so i think you will find that interesting but right now i would like to know
brian what you find interesting i find interesting that there's a controversy over loop targets
this is so inside baseball i think but um the okay so ned batchelder uh wrote a blog post
and apparently a uh social media post on um on uh on blue sky actually but um
about what loop targets are so what i'm talking about is a four loop so if you say four like four
x in range 10 or something like that then x X gets assigned 10, like one zero through nine.
Right. So what's the controversy?
The controversy is what you should put in for X.
So in his little code example, he's got for for param.
He's got a parameter dictionary and there's a query in a page size.
There's no page element, but we're going to fill that in later.
So what he's doing is he has coded for params, quote, page in iter tools count.
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.
And there's a break to get out of the loop
once there are no results left.
I think this is kind of clever,
and I don't see the problem here.
So the problem is this kind of this index
into the dictionary,
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, you'd say maybe key comma value in the loop target.
And that's perfectly normal.
But assigning a key in a dictionary, this is new to me.
Really?
Okay.
Yeah.
I'm not necessarily, I'm neutral on it's whether or not it should be done, but I'm just learning about it now.
Okay. neutral on it whether or not it should be done but i'm just learning about it now okay so that the in the discussion so really what's happening is there's a there's in the discussion he talks
about it that you could have like an extra variable you could say page num so for page num
in iter tools count it makes it more clear and then you assign the page num to the you assign
that to the dictionary but really you're just using this page num just as a temporary
variable just to stuff it in there so i say why not just put just just assign it where you're
gonna use it and because this extra line of code i i don't know i'm kind of on the fence because
this is more clear i think it's more clear to use a temporary variable it's more readable however
there's an extra line of code so it is like that much more it's not that much more readable. However, there's an extra line of code. So it is like that much more.
It's not that much more readable, I don't think.
And it's not.
And there's that.
If this in this short code snippet, not a big deal.
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.
So anyway, I'm'm like this is weird this
is controversy but even he so he wrote this up just to talk about it and ask what people think
and most of the responses are like no or one i think it's a cool idea and uh i think it's a
terrible idea anyway uh i guess i i'm bringing this up because i just want to point out that um with for loops
it's there's an implicit assignment and so you can use that assignment to assign to wherever
you want to use the variable so i'm gonna make an observation here you tell me what you think
i believe the people who are for this are also fans of the walrus operator and people who are
against this are anti-walrus oh that might be true right it's kind of the samerus operator. And people who are against this are anti-walrus. Oh, that might be true.
Right?
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.
Whereas, you know, the walrus operator
does it for if statements.
But it's like not assign the variable, then test it.
It's like all at once do the assign and test
or assign and loop.
But there is already an assign in the for loop.
It's always assignment.
But is it colon equals?
No, just kidding.
Is it colon in?
Yeah, anyway.
No, it's interesting.
It does.
Yeah.
It's for loop, the original walrus operator.
All right.
All right.
I'm actually going to come back to loops, but not yet.
I want to talk about the standard library.
No, no, not the one that you know.
Not the one that comes with CPython. talk about the standard library. No, no, not the one that you know.
Not the one that comes with CPython.
The async standard library.
It's the missing toolbox for an async world.
Did you know we're living in an async world? I feel like Madonna is rocking in my back.
Is that Madonna?
I don't know.
Yeah.
So one of the problems is if you go and look at many of the things that you know and love,
say iter tools or func tools, those things have not been,
kind of blowing my mind,
because they could be,
have not been updated to support async.
Okay?
So when you do like func tools,
you know, say a decorator at functools.lrucache,
that is perfect for a synchronous function.
It doesn't work for an async one.
And why do I think that
it should work for it? Because just a couple of weeks ago, I covered my chameleon flask
decorator for templates. And I, in a hundred lines of code, I wrote something that decorates and
operates on both sync and async functions. So surely the people who create async IO could
probably like write a multi operator decorator deal, but they don't.
And I have no idea if there's any intention ever for them to do so. So what this is, is it's kind
of like a clone of those things. Not totally. It also has some other nice features, but it's like
an async version of those. So if you have an async function, you want to apply an LRU cache to it,
well, go grab this bad boy. So it's got a bunch of built-ins for things like asynchronous ZipSum
or even converting to list.
It has func tools that supports things like I talked about, LRU cache.
And if you look at it, it looks a whole lot like you would imagine.
It has a max size.
It has typed and so on.
But it operates on awaitables,
and it returns an LRU async callable,
something you can await like you should the function,
rather than just a coroutine that is, I don't know,
you cache the coroutine.
I don't know.
It doesn't make a lot of sense.
So this is what this is about.
It's got a bunch of things like that.
It has the built-ins. It's got the functuals libraries for iterators, async caches, attributes, the context lib,
an async context lib.
So I can do things like add an async decorator and context that derives from a context decorator.
And you can basically short circuit the implementation, a simple implementation of a
enter and a exit, so on.
It has a heap queue, which implements Python's heap queue,
but for async, which is pretty cool.
So you want to merge and stuff.
And then it has some extra tools.
And I don't really, I haven't done enough with this to know whether this is useful, how I would use it.
So stick with it.
Anyway, it has things like borrow,
where you can borrow an async iterator
to prevent it from closing.
Okay, I don't know about that.
You got scoped ones, But this one is really nice.
I've written this code before,
and it's not easy to get completely right.
It has a thing that you can just call asyncstandardlib.sync,
giving it an async function, and it'll just, sorry,
the way I have it, given a sync function,
it will turn it into an async function that you can await if you need to.
That's cool.
Yeah, or you can give it an async
one as well and it doesn't really care i think it adapts 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 work
with async well check out the async standard lib very cool i think it seems like there we have a
we have typed python and non-typed python and and now we have async Python and synchronous Python,
and then we're going to have free-threaded and non-free-threaded Python.
We're going to have typed async free-threaded Python.
Yeah.
And every other combinatorial possibility there.
It's going to be nuts.
Yeah.
But I think this is a cool one.
It's not super popular.
Let me go back to it and see what its GitHub stars are.
But it's kind of one of those things that's like, yeah, this is definitely worth it.
I don't know.
So it has some, oh, here we go.
No, don't say.
240.
So it's starting to pick up some speed.
But I think it's real simple.
It's like the kind of thing that's either going to work or not work.
So if it's useful for you, go for it.
Nice.
Yeah, it's cool.
I was going to talk about, I haven't had breakfast yet. So i was going to talk about i'm i have i haven't
had breakfast yet so i was going to talk about some maybe getting a bagel you want a bagel okay
yeah i mean i love bagels as long as i got everything we're good and everything bagel
let's go well um i am taking a look at a project called enhanced jack it's it's called bagels from
enhanced jack who's enhanced jacks it's a jack's tam um cool aspiring student studying
oh no university student cool anyway why am i bringing up bagels well bagels is um is kind of
a fun little uh expense tracker but i think it's a great it's a great example of using textual uh
for um something that you know people probably could sink their teeth into pretty easy so it's
expense tracker uh with multiple accounts using Textual.
I've tried it out. It's really pretty easy.
There's a bunch of stuff I like about this.
And I'm bringing it up, not really because I think everybody needs an expense tracker,
but I think a lot of people look for a starter project to possibly tweak and make their own.
And I think this might be kind of a fun thing for people to look at.
A few things about it.
I like it that it's in the command line.
It's a textual app.
But it's also the install instructions.
I love seeing this.
It's starting to use the UV tool install so that you can just run bagels from anywhere.
It's the way.
This is the way.
This is the way.
And it's so fast to get started uh the um there's quite i also like that the project is it's pretty new um
but it's uh yeah it's just a like a few weeks started but the um there's already like some
features included features included is great and then. And then also how to development setup is listed
and how to, no, it doesn't talk about how to run tests,
but that's all right.
It's running PyTest, of course.
But then a roadmap of like sort of things
that they'd like to add to it.
Heavily inspired by posting.
So anyway, just a fun little project.
The tests are in place.
It's not a complete coverage yet, 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.
Also, I've always wanted to write my own little expense tracker.
And so this is a good start for, even if it doesn't do everything I want it to do,
to take up the code base and maybe play with it, learn some stuff.
It's also written written it's using
can't remember it was using
a post
like a SQL alchemy
also if you want to have a
simple small project that uses SQL
alchemy to learn that be a good one
to take a look at awesome yeah that's really cool
and we covered postling
what was it called
the posting
that was written
in Posting.
That was the Postman
alternative for the terminal
written in textual, which is cool.
Yeah, which is like a dream to work with.
It's a fun one.
Very nice. Since you brought this up,
I'll throw this out here. Not super
necessarily relevant, but I recently ran
across Maybe.co. It's almost a company, but they lost the M along the way. Anyway, it's a fully open
source OS for your personal finances running on Docker. If you want to do self-hosting,
keep all of your data private instead of like sending off to Intuit or somewhere that it
probably doesn't belong. So anyway, people can check that out. That's kind of cool. Not an
endorsement. Haven't used it,
but kind of thinking about it.
I would rather bring it full circle.
We began with loops, let us end with loops.
Isn't that perfect for a full circle?
They go in circles, don't they?
Yeah.
So this is an early days sort of thing,
but Giovanni, who is the creator of the Emmet framework
and more relevant to us,
the Grainian async sync Rust-based web server
that powers Python bytes and other things that we have
is creating this thing that is an alternative to UV loop.
So UV loop is a, I think it's based on lib UV.
I can't remember exactly the origins of it,
but it's a loop that you can plug in as an alternative
for the async IO event loop implementation.
Okay.
So why would you do that?
Well, it turns out that you can optimize some of the juggling of the little tasks.
So if you have like three tasks, one is call the website, one is talk to the database,
one is write a file or whatever, don't do anything.
The built-in one's fine.
But if you have a million tasks and you're breaking up into little tiny pieces and they're jumping all over, like that juggling could be faster with UV
loop. And I think that's where we're going to see it go with R loop. So R loop is an async event loop
implemented in Rust and it's coming along. It is a work in progress and not ready. But the reason I
bring it up early in its life here is it's a really cool option. We've seen how significant
the improvements for other Rust things like Pydantic and UV have been. And so if you're
passionate about this and you want to have maybe a little influence before it gets fully baked,
as this thing's coming to life, you know, jump in. The way you use it is just like UV,
super easy. Just before you do async things, you just say async IO dot set event loop policy,
which is a factory.
I'm thinking kind of a factory method more.
I don't know.
Whatever.
And you just give it our loop dot event loop policy.
And that means anytime code creates a new event loop,
it's going to be using the factory method from our loop rather than the
built-in one.
Off you go.
Cool.
Yeah.
Well,
cool.
Well,
that's it for our items,
right?
I think so.
Yeah,
I think it is extras what do you
think extras yeah i have a few let me jump in jump in um i am uh i've had a lot of stuff going on
personal life lately and trying to fit everything into my life is sometimes difficult so i'm i've
been reading i've reading reading in quotes listening to the audio book for 4000 weeks, a time management,
time management for mortals. It's a book by Oliver Berkman. And I'm listening to it for the second
time now in the last couple weeks, I just picked it up a week or so ago. But I'm really enjoying it.
And it's, it's more of a more of a you can't get everything done. But that's okay. Um, just, uh, how to be okay with the limitations
of life. Um, so very refreshing time management book. Um, it's also got some practical advice too,
but, uh, it's great. So, uh, highly, highly recommend that. Um, it's advent of advent of
code time. And I've heard of the, so I've definitely heard of the Advent of Code, but at adventofcode.com, very cool.
A lot of people do that every year in December to do little code snippets every year.
But today I came across Adrian Roselli's development Advent calendars for 2024.
So if Advent of Code isn't quite up your alley, there's a whole bunch here.
There's HTML Hell Advent Calendar.
There's a whole bunch of code-based Advent Calendars here.
So none of them Python-specific.
There's a Perl-specific, but C Sharp, Advent of Cyber.
Just quite a few fun different calendars.
CSS, if you wanted to learn CSS, maybe there's a CSS.
The Joomla Advent Calendar.
You too can host it so yeah um and apparently he's going it's gone back since he's got links back to 2010 so it's
fun wow um yeah if you get your homework done early you can do more advent account yeah i don't
so i tried um advent of code a couple years ago, and then I just realized that in my free time,
I'm doing so much coding at work,
besides hassles and everything,
that I kind of want to do things like draw and paint and cook
and things like that when I'm doing other stuff.
Anyway.
I hear you.
I'm the same.
I already do a lot of programming.
Even in my spare time, I do more programming.
Yeah.
And so I don't need extra ones, but I know it helps people,
especially people who are trying to learn a topic.
It can kind of force you if you don't have a way to apply it.
And today is December 2nd, Monday, traditionally Cyber Monday,
and it is the last day for the Black Friday sale,
Turkey sale for the PythonTest.com courses, however.
And so I'll take off the automatic
but if you um if you hit me if you're listening to this later you know close in it close ish to
december 2nd uh direct message me on um on blue sky and i'll hook you up so anyway blue sky that's
a good transition all right also black friday talk python so talk python.fm slash black friday 20
to 50 off the course library nice logo there the image is great thanks that's pure css by the way
that's some mad glow in css yeah it's cool yeah awesome all right so we talk blue sky so i just
you know last week when i finished producing the show and i published it onto the internet
typically go to the social networks and I'll do a quick post.
Hey, new episodes out.
Enjoy it if you want.
This one had a little guitar solo at the end, which was super fun.
And so it said, latest episode out, 4.11, TLS client, hello, guitar solo was the name.
And I published that.
And I published it at the same time with the same text to X, Fostadon, Macedon, and Blue Sky.
And I just thought, huh, I wonder what the engagement looks like.
Because I don't know how you've been feeling, Brian,
but I feel like people, I tried and tried to get folks to go to Macedon
and some people came along, but a bunch just didn't.
You would go back to X and you would just see them all talking there.
I'm like, man, I don't know.
And I'm not necessarily super against X. I'm a little bit against it, but I'm not a lot, but it's just,
it's become not very practical as you'll see in just a second, not very useful. So, you know,
you want to go talk to yourself in a closet. It's awesome. You want to talk to other people? Well,
that's so. Anyway, so my, my test here, this is a non-scientific test that I put out there.
What is the interaction level per
platform? And what you have to keep in mind before I tell you guys this, there's a dramatic
difference in number of followers, subscribers, whatever they're called at that particular
location. Okay. So basically take the numbers, divide by the number of followers and consider
that like 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 that's a bit of a getting ahead. So check this out. So over on
X, we have 27,000 followers. Okay. Posting this exact message one week ago, we got eight likes
and two retweets, reposts, boost, name it, whatever. Yeah. So I don't know what that is.
Two divided by 27,000, but it's a small percentage.
Okay.
Fostodon, Mastodon, right?
It's not Fostodon, Mastodon, because it's across all the Fediverse.
Same post, identical.
Here we have 3,000, let me see, 3,100 followers.
Okay.
So yeah, that's great.
But this is almost nine times less, something like that, right?
It's many, many less times, but four boosts, which is not out of control, honestly,
and two favorites, two likes.
But as a ratio, it's still a lot more because you multiply by nine, right?
Yeah.
Blue Sky, which we've been there a couple of days,
we had something like that.
We only have a, somebody hover, different hover targets, 750 followers.
Yeah.
Follow us on Blue Sky.
Get over there.
Yeah.
Anyway, we have 16 likes and two reposts and a quote post and then some conversation about it.
And that's 30 times less followers and more engagement than both platforms.
So anyway, I, y'all take that for what it is.
I just thought that was an interesting experiment.
What do you think, Brian?
Yeah, I'm finding, I'm finding Blue Sky more interactive.
I've got about the approximate same numbers
on Fostodon or Mastodon and Blue Sky.
And I'll get like twice as much interaction on,
I mean, approximate gut feel,
twice as much interaction on Blue Sky
as I do on Mastodon.
Yeah.
Yeah, and I'm not saying this to bag on some social network or try to promote uh they're too much i'm like people are trying to
find their community i think right now this is where the community is and if you go here you
can go to my account and go to the starter pack and there's the python personalities and you can
follow a bunch of us the onboarding experience is way better the the
onboarding experience for mastodon still feels like it's too many decisions right at once and
then it's like if you wanted to play games on linux you probably could yeah yeah and i'm uh by
the way i'm i'm no longer on x so don't notify me there yeah sounds good all right a couple of other
real quick things.
On episode 277, I believe, and I'm not showing this up,
but I'm pretty sure that was the number,
way back when I talked about strnum, string enumeration,
which is a thing that basically backports the string enum
from Python 3.11, so it can be used in other places.
It's super cool.
It's even better than the built-in one, by the way.
So I can have, I can say, give me a string enum so it can be used in other places. It's super cool. It's even better than the built-in one, by the way.
So I can say, give me a string enum and derive a class from that.
That becomes an enumeration where you say that thing dot,
but then you have the fields
and just say equals auto, auto, auto, auto,
and it'll actually set it to the text
of whatever the variable is.
If you refactor, rename it,
it will apply that refactoring to the string version
and the variable version of it.
And you can even do things like use a lowercase or an uppercase one as the base class, a lowercase strenum.
And that will make the string version lowercase, even if you have a different representation for the variable names.
Anyway, why did I do this?
Because on my ListMonk little client, somebody came and said, why doesn't this work on anything less than 3.11?
I'm like, because it uses string in them from 3.11.
So I'm like, you know what?
I'll just derive for the other class.
Add that as a dependency.
I already had dependencies.
That's one more small one.
And guess what?
Now it supports older versions of Python.
I stopped it at 3.10 because I want nice type hints.
I don't want ugly type hints.
You're nicer than me, man.
I'm like, it doesn't support it.
So it doesn't, because I don't want to support it.
Yeah, but then I was curious, like, well, why doesn't it?
And I remember we talked about this thing.
And if I literally just change a bass class and don't do anything else,
that was pretty low effort.
So, you know, it took like five minutes, right?
All right.
Yeah.
So anyway.
All right. That's So anyway. All right.
That's it for my extras.
Shall we close it out with a joke?
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 with Thanksgiving and all.
And I hope everyone's was good if you celebrate it.
However, sometimes there's a lot of food prep and it can be, it can be hard, right?
It can be hard.
Like you're shopping, you're chopping all of these things. So here is a programmer or just a computer user,
really, who has a grocery list. And the grocery list says eggs, corn, tomatoes, onions, rice,
milk. 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 it does when you cut onions.
That's really funny.
It's pretty good, right?
I mean, yeah, it's good.
I don't know why.
It's cheesy.
It's a little cheesy.
Well, it's easy.
Yeah, I'll do one more for us.
That's straight out of the comments
because Cohen did a pretty good one.
When we were talking about the loop targets,
he says, how about this?
We're putting two controversial ideas together sum of sum of numbers plus x for numbers of zero in numbers if
x colon equal numbers squared is such and such like oh my goodness this is there's a lot of
stuff going i said here's a job interview for you job interview question if you answer with a straight face you fail
that's good man I think that's all right nope you're out I don't know not
seriously but it's as a joke it's pretty good you know it's yeah that's what job
interview stuff job interviews are tough I know a lot of people are going through
that now so yeah well you know the control X part and also the job
interview might bring a tear to the eyes i i don't know i haven't
i haven't applied for a job in well since the 90s however which is insane it is insane man
it's actually insane um but because all my job transitions have been like hey you'd be awesome
like why don't you consider working for it was more the other way around you know which is
pretty fortunate but it sounds like your resume has like, like a lawn mowing on it still or something. Exactly. I've worked for companies. They just
reached out to me and said, would you consider working for us? And then I know, but you probably
didn't have to, you haven't probably had to update your resume 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. So no, but I was just going to say,
I think it's probably pretty brutal.
You've got to,
you know,
pass the AI gauntlets and all sorts of weird business and take home quizzes.
And I can see why there would be tears,
but not for listening to the show.
Thank you everyone for coming.
Thank you,
Brian.
See y'all later.
Bye.