WEBVTT

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

00:00:05.580 --> 00:00:10.860
This is episode 362, recorded November 28th, 2023.

00:00:10.860 --> 00:00:11.820
I'm Michael Kennedy.

00:00:11.820 --> 00:00:12.880
And I'm Brian Okken.

00:00:12.880 --> 00:00:16.100
And this episode is brought to you by Scout APM.

00:00:16.100 --> 00:00:19.260
We will tell you more about them later, but please check out what they're offering.

00:00:19.260 --> 00:00:20.600
It really helps support the show.

00:00:20.600 --> 00:00:28.600
And if you want to connect with us on the socials, the place we're all hanging out at is Mastodon, fosstodon.org specifically.

00:00:28.920 --> 00:00:30.040
I'm Adam Kennedy.

00:00:30.040 --> 00:00:31.320
Brian is @brianokken.

00:00:31.320 --> 00:00:33.060
And the show is at Python Bytes.

00:00:33.060 --> 00:00:35.420
fosstodon.org is invite only.

00:00:35.420 --> 00:00:37.720
Of course, you can follow us from any place on Mastodon.

00:00:37.720 --> 00:00:41.040
But if you want to be part of it, just shoot one of us a message.

00:00:41.040 --> 00:00:42.120
We can send you an invite.

00:00:42.120 --> 00:00:45.900
Help you get over there to hang out a little bit closer to home for us.

00:00:45.900 --> 00:00:53.700
And finally, if you want to be part of the live stream and see how the show is made, see what we're doing, even the real mistakes that we might edit out.

00:00:53.700 --> 00:00:56.020
Check that out at pythonbytes.fm/live.

00:00:56.020 --> 00:00:58.120
Usually Tuesdays at 11 p.m.

00:00:58.120 --> 00:00:59.740
And older videos are there as well.

00:00:59.740 --> 00:01:00.880
Let's kick it off.

00:01:00.880 --> 00:01:01.580
What do you got?

00:01:01.580 --> 00:01:05.420
This is a gentle ease back into the show.

00:01:05.420 --> 00:01:11.000
Over the Thanksgiving break, I was thinking a lot about kind of what I wanted to do for the next year.

00:01:11.140 --> 00:01:16.720
Starting to think about plans for how to, where do I want to focus my time?

00:01:16.720 --> 00:01:26.580
And I ran across this great post by Vadim, let's just say Vadim, Habits of Great Software Engineers.

00:01:26.580 --> 00:01:31.900
And it's kind of, there's a lot of great stuff here.

00:01:32.080 --> 00:01:35.940
So also, nice index on the right, which is cool.

00:01:35.940 --> 00:01:38.500
So focusing beyond the code.

00:01:38.500 --> 00:01:40.340
So I'm not going to go through all these.

00:01:40.340 --> 00:01:45.060
I'm going to go through, there's like 12 or 13 listed, but I'll go through a few of them.

00:01:45.060 --> 00:01:46.260
Focus on the code.

00:01:46.260 --> 00:01:51.760
So I don't know if I buy this, but he says, as a developer, you will code 20% of your time.

00:01:51.760 --> 00:01:55.760
You should excel at coding nonetheless, but it won't be enough to be great.

00:01:56.020 --> 00:01:58.300
I think I code more than 20% of the time.

00:01:58.300 --> 00:01:59.040
I would say too.

00:01:59.040 --> 00:02:00.900
Well, define code, right?

00:02:00.900 --> 00:02:01.200
Okay.

00:02:01.200 --> 00:02:04.020
So is coding, is that reading code?

00:02:04.020 --> 00:02:05.560
Is that thinking about code?

00:02:05.560 --> 00:02:06.440
Is that...

00:02:06.440 --> 00:02:07.580
Oh, the design part.

00:02:07.580 --> 00:02:08.020
Right.

00:02:08.020 --> 00:02:11.260
Or is it actually, I'm hitting keys on keyboard.

00:02:11.260 --> 00:02:11.820
You know what I mean?

00:02:11.820 --> 00:02:12.820
Yeah, that's true.

00:02:12.820 --> 00:02:13.140
Right.

00:02:13.140 --> 00:02:16.860
Because people say you code as read way more than it's written and stuff.

00:02:16.860 --> 00:02:23.360
But I think for me, coding is like the act of being in the code and adding features or evolving it,

00:02:23.360 --> 00:02:25.940
even if like I'm not keystroking it at that moment.

00:02:25.940 --> 00:02:30.840
So unclear, but if that encompasses all, then 20% is way too low.

00:02:30.840 --> 00:02:31.240
Agreed.

00:02:31.240 --> 00:02:31.740
Okay.

00:02:31.740 --> 00:02:38.340
Well, I guess the point of this, regardless of the percentage, is focusing on the other parts of your job also.

00:02:38.340 --> 00:02:43.940
And focusing on, you know, not just being a better software engineer, but also...

00:02:43.940 --> 00:02:50.720
Well, being a better software engineer encompasses more than just coding well and knowing Python details and things like that.

00:02:50.720 --> 00:02:52.680
Like communication skills and all that.

00:02:52.680 --> 00:02:54.980
Design skills, learning other...

00:02:54.980 --> 00:02:56.740
Learning to read other people's code, things like that.

00:02:56.740 --> 00:02:59.400
Helping unblock your teammates who are having a challenge.

00:02:59.400 --> 00:03:03.840
Instead of writing code yourself, like I'm going to help them get that problem fixed or something, right?

00:03:03.840 --> 00:03:04.280
Like...

00:03:04.280 --> 00:03:04.580
Yeah.

00:03:04.580 --> 00:03:05.140
Yep.

00:03:05.140 --> 00:03:05.640
All those things.

00:03:05.640 --> 00:03:06.660
Well, and...

00:03:06.660 --> 00:03:06.900
Okay.

00:03:06.900 --> 00:03:11.200
So number two was efficiency and anti-fragility.

00:03:11.200 --> 00:03:14.200
I'm not really a fan of the anti-fragile word.

00:03:14.200 --> 00:03:16.720
I don't even really know what it means, but I guess...

00:03:16.720 --> 00:03:23.260
I think it originally comes from Nassim Taleb and that whole philosophy, although I haven't read a whole lot of that either.

00:03:23.260 --> 00:03:23.880
Anyway.

00:03:23.880 --> 00:03:29.940
It's kind of about things that get better the more they kind of get abused, right?

00:03:29.940 --> 00:03:31.600
Like they sort of build up a resilience.

00:03:31.600 --> 00:03:32.260
Well...

00:03:32.260 --> 00:03:34.180
I think it originally comes out of economics.

00:03:34.180 --> 00:03:34.920
Okay.

00:03:35.480 --> 00:03:39.600
Well, the next one is one I really agree with is the joy...

00:03:39.600 --> 00:03:41.100
Number three is the joy of tinkering.

00:03:41.100 --> 00:03:44.280
Build projects, try out frameworks, build stuff on the side.

00:03:44.280 --> 00:03:46.860
Keeps the spark alive.

00:03:46.860 --> 00:03:49.600
And this is one I couldn't agree more.

00:03:49.600 --> 00:03:51.320
It doesn't...

00:03:51.320 --> 00:03:51.860
I...

00:03:51.860 --> 00:03:58.180
For a while, I was often thinking about, like, what could I build that I could actually release or that I'd be proud of?

00:03:58.180 --> 00:03:59.120
That's great.

00:03:59.520 --> 00:04:03.680
You could try to at least do a side project that tries to make money or something.

00:04:03.680 --> 00:04:08.880
But if you just want to try out FastAPI, for instance, just build something with FastAPI.

00:04:08.880 --> 00:04:11.880
Just come up with a toy project and build it and learn it.

00:04:11.880 --> 00:04:12.640
And it's fun.

00:04:12.640 --> 00:04:14.900
Even if you never apply it to other stuff.

00:04:14.900 --> 00:04:22.660
I've had so many times in my career where I've had something that I tinkered with just as a toy that suddenly, like, I could use.

00:04:22.660 --> 00:04:25.700
I'm like, oh, yeah, I've built wikis before and stuff like that.

00:04:25.780 --> 00:04:32.340
I can go ahead and do that for a project or, you know, I've done a flask app on the side.

00:04:32.340 --> 00:04:35.240
So if I need a flask app at work, it's going to be pretty easy.

00:04:35.240 --> 00:04:36.120
Things like that.

00:04:36.120 --> 00:04:38.140
Tink, playing with toy projects.

00:04:38.140 --> 00:04:40.820
I say, put that on top of your list for 2024.

00:04:40.820 --> 00:04:42.160
More toy projects.

00:04:42.160 --> 00:04:45.020
I'll go through the rest of these pretty quick.

00:04:45.020 --> 00:04:46.800
Number four is knowing the why.

00:04:46.800 --> 00:04:48.820
Number five, thinking and systems.

00:04:49.400 --> 00:04:51.460
Number six, tech detox.

00:04:51.460 --> 00:04:54.840
Recharging away for the monitor.

00:04:54.840 --> 00:04:56.140
This makes you a better programmer.

00:04:56.140 --> 00:04:57.080
Couldn't agree more.

00:04:57.080 --> 00:04:59.280
The art of approximation.

00:04:59.280 --> 00:05:00.800
I don't really know what this is about.

00:05:00.800 --> 00:05:02.320
I didn't read this part.

00:05:02.320 --> 00:05:04.240
Knowing important tech numbers.

00:05:04.240 --> 00:05:05.140
Anyway.

00:05:05.140 --> 00:05:05.640
I will.

00:05:05.640 --> 00:05:06.940
I actually have one.

00:05:06.940 --> 00:05:09.600
I want to cover that as one of our items.

00:05:09.600 --> 00:05:10.020
Okay.

00:05:10.020 --> 00:05:10.860
In the future.

00:05:10.860 --> 00:05:16.920
There's a couple of hosts or charts or whatever that somebody put up that I think would be really interesting.

00:05:17.140 --> 00:05:21.660
So this is like, what is the relative speed of L2 cache versus RAM?

00:05:21.660 --> 00:05:23.040
RAM versus disk?

00:05:23.040 --> 00:05:27.560
What is the cost of like a CPU core or a database operation on the cloud?

00:05:27.560 --> 00:05:28.480
Et cetera, et cetera.

00:05:28.480 --> 00:05:31.140
But I don't like some of the numbers there.

00:05:31.140 --> 00:05:33.020
I think they're way, way skewed.

00:05:33.020 --> 00:05:36.620
So I want to come up with my own table and then put them both forward.

00:05:36.620 --> 00:05:37.760
So that's why I haven't covered it yet.

00:05:37.760 --> 00:05:39.000
But that's what this is about, I think.

00:05:39.000 --> 00:05:39.360
Okay.

00:05:39.640 --> 00:05:48.360
Well, what's funny is that like the teaser at the beginning of this post says there's only eight, but there's more if you read it.

00:05:48.360 --> 00:05:50.020
But there's a table of contents on the right.

00:05:50.020 --> 00:05:51.820
So you can just look at the table of contents.

00:05:51.820 --> 00:05:59.520
The last one I think is the most important for me is strong opinions loosely held.

00:05:59.520 --> 00:06:09.360
And for me, this means that I'm going to have a default approach to test for a lot of problems and a default way to do things.

00:06:09.360 --> 00:06:10.720
It just speeds things up.

00:06:10.820 --> 00:06:13.100
It's like, if I don't care about it, just do it quickly.

00:06:13.100 --> 00:06:15.300
You've got an opinion on how things are done.

00:06:15.300 --> 00:06:20.820
However, be open-minded enough to when somebody approaches you and says, hey, there's a better way to do this.

00:06:20.820 --> 00:06:26.540
Or keeping your eyes open with the tinkering, trying new ways to do things.

00:06:26.540 --> 00:06:30.860
Be willing to abandon your old strong opinion and go, oh, there's a better way.

00:06:30.860 --> 00:06:31.280
Cool.

00:06:31.280 --> 00:06:32.980
My new opinion is this now.

00:06:32.980 --> 00:06:35.260
That pretty much sums up our podcast.

00:06:35.260 --> 00:06:36.400
Yeah, exactly.

00:06:36.400 --> 00:06:36.820
Yes.

00:06:36.820 --> 00:06:39.000
So, yeah.

00:06:39.000 --> 00:06:39.980
Nice.

00:06:39.980 --> 00:06:40.740
Nice post.

00:06:40.740 --> 00:06:47.120
Just thinking about, you know, kind of planning for your time allotment for the upcoming year.

00:06:47.120 --> 00:06:47.880
Yeah.

00:06:47.880 --> 00:06:49.720
Lots of feedback on this one.

00:06:49.720 --> 00:06:53.740
Jeff out there says, tech numbers like LEET1337.

00:06:53.740 --> 00:06:55.080
So, excuse me.

00:06:55.080 --> 00:06:55.280
Yes.

00:06:55.280 --> 00:06:56.920
Those are the important tech numbers.

00:06:56.920 --> 00:06:58.260
Those are the important ones.

00:06:58.260 --> 00:06:58.480
Yeah.

00:06:58.480 --> 00:07:00.260
LEET, NOB, all those things.

00:07:00.260 --> 00:07:04.700
And then Grant, following up on the anti-fragile, says this.

00:07:04.700 --> 00:07:07.960
Number two speaks more to reactive principles that came about with the cloud.

00:07:07.960 --> 00:07:13.320
It could be summed up as build with the expectation that your K8 pods can be nuked mid-task at any point.

00:07:13.320 --> 00:07:14.120
Yeah, exactly.

00:07:14.120 --> 00:07:17.820
That you might just use one VM, but it could die.

00:07:17.820 --> 00:07:24.720
But if you like know that it's always getting abused, you would build like failover and those types of things into it, making it hence less fragile.

00:07:25.180 --> 00:07:26.480
I think that's kind of that principle there.

00:07:26.480 --> 00:07:27.160
Yeah.

00:07:27.160 --> 00:07:27.820
Okay.

00:07:27.820 --> 00:07:33.140
But also, if it's a side project, if it's down once in a while, it's fine.

00:07:33.140 --> 00:07:34.040
Yeah.

00:07:34.040 --> 00:07:35.520
This is not a side project.

00:07:35.520 --> 00:07:35.920
Yeah.

00:07:35.920 --> 00:07:38.140
Maybe a habit of great software engineers.

00:07:38.140 --> 00:07:38.620
I don't know.

00:07:38.620 --> 00:07:40.640
I wonder how many blogs run on Kubernetes.

00:07:41.720 --> 00:07:43.620
I don't know what the answer is, but I bet too many.

00:07:43.620 --> 00:07:44.600
The answer is too many.

00:07:44.600 --> 00:07:45.200
Too many.

00:07:45.200 --> 00:07:47.380
Too many run on Kubernetes.

00:07:47.380 --> 00:07:48.180
Okay.

00:07:48.180 --> 00:07:48.700
Okay.

00:07:48.700 --> 00:07:49.460
What do you got for us?

00:07:49.460 --> 00:07:49.980
All right.

00:07:49.980 --> 00:07:53.500
I got eight nines uptime on my blog.

00:07:53.500 --> 00:07:53.920
Okay.

00:07:53.920 --> 00:07:59.120
Although we probably do, Brian, because ours runs on a CDN as a static file.

00:07:59.120 --> 00:07:59.780
Okay.

00:07:59.980 --> 00:08:01.240
That's pretty good uptime, right?

00:08:01.240 --> 00:08:01.660
Yeah.

00:08:01.660 --> 00:08:05.240
Then the database doesn't need to be migrated for that business, does it?

00:08:05.240 --> 00:08:05.660
All right.

00:08:05.660 --> 00:08:06.040
Moving on.

00:08:06.040 --> 00:08:07.020
We've covered this enough.

00:08:07.020 --> 00:08:09.140
Let's talk about a new version of Flask.

00:08:09.140 --> 00:08:12.940
So Flask obviously is a super important web framework.

00:08:12.940 --> 00:08:14.660
Like everyone has heard of Flask.

00:08:14.660 --> 00:08:19.780
It's kind of one of the two main pillars that I would think of, like the old guard pillars, right?

00:08:19.780 --> 00:08:20.780
There's Flask and Django.

00:08:20.780 --> 00:08:24.200
And the debate for so many years has been like, do you use Flask or do you use Django?

00:08:24.200 --> 00:08:25.700
What kind of web developer are you?

00:08:26.040 --> 00:08:30.660
Well, Flask 3.0 was released just a little while ago.

00:08:30.660 --> 00:08:32.260
Is that three weeks ago?

00:08:32.260 --> 00:08:32.900
Something like that.

00:08:32.900 --> 00:08:38.200
There's also a 301 that is only unreleased, but has like very, very minor changes.

00:08:38.200 --> 00:08:42.840
So anyway, the changes for a two to three release are not that huge.

00:08:42.840 --> 00:08:49.000
Although I think the numbering probably comes from this removed, previously deprecated code there.

00:08:49.000 --> 00:08:53.400
That's probably what pushed it from a two to three rather than some mega new feature.

00:08:53.400 --> 00:08:53.760
Yeah.

00:08:53.760 --> 00:08:54.700
Right.

00:08:54.840 --> 00:08:57.440
Because it's like, hey, it's not backwards compatible.

00:08:57.440 --> 00:09:01.500
Miguel Grinberg actually wrote an interesting but controversial piece on that.

00:09:01.500 --> 00:09:04.140
I'm not going to link to it, but y'all can check that out.

00:09:04.140 --> 00:09:05.440
I just want to cover the release here.

00:09:05.440 --> 00:09:10.160
But a lot of this, actually this first line, there's a lot of discussion about it, let's say.

00:09:10.160 --> 00:09:11.800
Neutral there.

00:09:11.800 --> 00:09:15.320
So some of the things that are interesting here though, Brian, are not so much interesting because

00:09:15.320 --> 00:09:15.780
they're Flask.

00:09:15.780 --> 00:09:17.120
They're just like, wait, what?

00:09:17.120 --> 00:09:17.760
You could do that?

00:09:17.760 --> 00:09:22.020
So deprecated the Dunder version attribute.

00:09:22.220 --> 00:09:30.580
So frequently people will go to their __init__().py for their package and put a Dunder version global variable and set it to a string.

00:09:30.580 --> 00:09:33.040
And then you can say, well, what version is the thing?

00:09:33.040 --> 00:09:36.220
Well, it's Flask.Dunder version is the version.

00:09:36.220 --> 00:09:37.320
And that's just a string, right?

00:09:37.320 --> 00:09:37.780
Yeah.

00:09:38.040 --> 00:09:41.080
So the idea is that's deprecated.

00:09:41.080 --> 00:09:51.940
And now the way you're supposed to get the version of Flask is using feature detection or with import lib.metadata.version of, quote, Flask.

00:09:51.940 --> 00:09:52.660
Okay.

00:09:52.660 --> 00:09:57.780
Which I had not, like, okay, so cool that that might work.

00:09:57.780 --> 00:10:03.260
But how in the world do you make it possible for a package that that comes out of it?

00:10:03.260 --> 00:10:11.100
If I wrote a package and I wanted to say dot version of my package in import lib, how do I put a number in there that makes it the version, right?

00:10:11.100 --> 00:10:13.320
So do I have it here?

00:10:13.320 --> 00:10:13.720
Yeah.

00:10:13.720 --> 00:10:21.560
Basically, you have to go, if you use a pyproject.toml, at least one way is, and you just set the metadata category, set the version to something.

00:10:21.560 --> 00:10:22.520
And now that's that.

00:10:22.520 --> 00:10:22.980
Yeah.

00:10:23.220 --> 00:10:23.420
Okay.

00:10:23.420 --> 00:10:23.920
Yeah.

00:10:23.920 --> 00:10:24.480
Pretty cool.

00:10:24.480 --> 00:10:29.460
And so that's where that value comes from when you say import lib.metadata.version.

00:10:29.460 --> 00:10:30.120
Pretty cool.

00:10:30.120 --> 00:10:33.640
What's more interesting is deprecated a global variable.

00:10:33.640 --> 00:10:35.660
How do you deprecate a global variable?

00:10:35.660 --> 00:10:39.220
I know how to deprecate a method, a class, but a variable?

00:10:39.220 --> 00:10:41.060
But just delete it.

00:10:41.060 --> 00:10:43.800
No, that's removing it.

00:10:43.800 --> 00:10:46.220
You wanted to give a warning when you access the variable.

00:10:46.220 --> 00:10:46.760
Hmm.

00:10:46.760 --> 00:10:47.360
Okay.

00:10:47.620 --> 00:10:49.620
And the variable's value is a string.

00:10:49.620 --> 00:10:51.040
Like, okay, what?

00:10:51.040 --> 00:10:53.000
So I'm like, I got to see it.

00:10:53.000 --> 00:10:54.900
So I went and I tracked down the changelog.

00:10:54.900 --> 00:10:58.780
I checked down the PR that made this happen.

00:10:58.780 --> 00:10:59.960
I'm like, I got to see the code.

00:10:59.960 --> 00:11:00.720
What is this?

00:11:00.720 --> 00:11:02.580
So it says it deprecated Dunder version.

00:11:02.580 --> 00:11:15.200
And here you can see somewhere, you can just see they literally, like you said, they deleted the Dunder version variable, but they added a function to the module called Dunder git adder.

00:11:15.440 --> 00:11:18.340
For some reason, I thought that only applied to classes, but no, apparently modules.

00:11:18.340 --> 00:11:25.140
And given that it comes in and it asks for the version, it says no, there's a warning.

00:11:25.140 --> 00:11:28.560
And then it calls the import lib.version thing on itself.

00:11:28.560 --> 00:11:29.460
Interesting, huh?

00:11:29.460 --> 00:11:30.080
Yeah.

00:11:30.080 --> 00:11:32.960
Actually, this is a handy thing to keep around.

00:11:32.960 --> 00:11:34.120
Yes, exactly.

00:11:34.120 --> 00:11:38.180
If you're asking for Dunder version, it warns and then it does the new thing.

00:11:38.180 --> 00:11:40.420
Otherwise, it just says, no, we don't have one of them.

00:11:40.420 --> 00:11:41.800
But yeah, that's wild, right?

00:11:41.800 --> 00:11:42.420
Yeah.

00:11:42.420 --> 00:11:43.100
Huh.

00:11:43.100 --> 00:11:45.020
I love how dynamic Python is.

00:11:45.260 --> 00:11:47.900
It was a global variable.

00:11:47.900 --> 00:11:49.020
Now it's a function.

00:11:49.020 --> 00:11:53.160
Now it's a function call to a Dunder git adder method on the module.

00:11:53.160 --> 00:11:53.760
Wow.

00:11:53.760 --> 00:11:54.820
Yeah.

00:11:54.820 --> 00:11:59.560
I think I'm going to replace all of my global like function declarations as git adder.

00:11:59.560 --> 00:12:00.400
Exactly.

00:12:00.400 --> 00:12:01.200
It's going to write all.

00:12:01.200 --> 00:12:01.680
Yeah.

00:12:01.680 --> 00:12:04.380
The whole function is just a bunch of dispatch to git adder.

00:12:04.380 --> 00:12:05.000
It's going to be awesome.

00:12:05.000 --> 00:12:05.200
Yeah.

00:12:06.800 --> 00:12:13.340
We structured the code such that the Flask app and blueprint classes have sans IO bases.

00:12:13.340 --> 00:12:15.100
I don't know what sans IO bases are.

00:12:15.100 --> 00:12:20.340
But that moves things like a request and response over to wrapper sections and out of the app itself.

00:12:20.340 --> 00:12:20.980
Things like that.

00:12:20.980 --> 00:12:24.080
Requires a new version of Vexoic.

00:12:24.080 --> 00:12:26.220
And that's pretty much it.

00:12:26.220 --> 00:12:27.440
So interesting.

00:12:27.620 --> 00:12:29.220
So it's interesting that 3.0 is out.

00:12:29.220 --> 00:12:29.980
Way to go.

00:12:29.980 --> 00:12:30.900
Palette's team.

00:12:30.900 --> 00:12:32.920
But it's this deprecate version attribute.

00:12:32.920 --> 00:12:34.940
This is interesting to me.

00:12:34.940 --> 00:12:35.540
Yeah.

00:12:35.540 --> 00:12:37.340
And so the meta.

00:12:37.340 --> 00:12:38.860
I haven't played with it.

00:12:38.860 --> 00:12:40.780
But that import lib metadata version.

00:12:41.480 --> 00:12:45.220
You showed it working with like a static version metadata.

00:12:45.220 --> 00:12:51.180
But it probably works with dynamic versions in PyProject Toml based projects also.

00:12:51.180 --> 00:12:52.180
Yes, probably.

00:12:52.180 --> 00:12:52.600
Yeah.

00:12:52.600 --> 00:12:56.100
It's just my lack of experience with that kind of stuff to talk about it.

00:12:56.100 --> 00:12:56.600
No.

00:12:56.600 --> 00:12:58.340
Interesting.

00:12:58.340 --> 00:12:58.740
Cool.

00:12:58.740 --> 00:12:59.280
Mm-hmm.

00:12:59.280 --> 00:12:59.920
All right.

00:12:59.920 --> 00:13:01.140
You know what else is cool?

00:13:01.140 --> 00:13:02.540
Our sponsor this week.

00:13:02.540 --> 00:13:06.420
Let me take a moment and tell everyone about them.

00:13:06.420 --> 00:13:08.120
Once I find where I put my notes.

00:13:08.120 --> 00:13:08.420
Okay.

00:13:08.800 --> 00:13:13.440
So this episode, as a couple of recent ones, have been brought to you by Scout APM,

00:13:13.440 --> 00:13:15.760
Application Performance Monitoring.

00:13:15.760 --> 00:13:17.720
Definitely a cool, cool service.

00:13:17.720 --> 00:13:20.520
You know, there's a lot of profiling and stuff you can do, Brian.

00:13:20.520 --> 00:13:23.560
And it's great to run your code in the profiler.

00:13:23.560 --> 00:13:26.500
There's a bit of a Heisenberg type of thing.

00:13:26.500 --> 00:13:29.840
As you observe it, it changes the behavior of the performance.

00:13:29.840 --> 00:13:31.300
But you still get a sense.

00:13:31.300 --> 00:13:34.180
But it's nothing like my app is running in production.

00:13:34.180 --> 00:13:36.380
Let's see how it did during Black Friday.

00:13:36.380 --> 00:13:38.360
Oh, this was the part that was slow.

00:13:38.460 --> 00:13:43.660
We could, like, save a ton of money, run fewer servers or Kubernetes pods or whatever it is you're doing.

00:13:43.660 --> 00:13:45.140
If we change it this way, right?

00:13:45.140 --> 00:13:46.640
So having that data is awesome.

00:13:46.640 --> 00:13:53.240
So if you're tired of spending an hour trying to find the root cause of issues impacting your performance, then you need to check out Scout APM.

00:13:53.240 --> 00:14:02.040
It's a leading Python application performance monitoring tool that helps you identify and solve performance abnormalities faster and easier.

00:14:02.160 --> 00:14:06.540
It ties bottlenecks such as memory leaks, slow database queries and background jobs.

00:14:06.540 --> 00:14:15.380
And of course, the dreaded N plus one quorum query problem and more directly to source code so that you can spend less time debugging and more time building.

00:14:15.380 --> 00:14:20.920
I don't know where that fits in the 20% of your code example, but I think this kind of stuff counts too.

00:14:21.220 --> 00:14:24.040
You'll love Scout because it's built for developers by developers.

00:14:24.040 --> 00:14:27.520
It makes it easy to get set up and deliver insights in less than four minutes.

00:14:27.520 --> 00:14:31.920
Seriously, you could be done by the time you're done listening to this episode or live stream.

00:14:31.920 --> 00:14:34.420
So start your free trial and get instant insights today.

00:14:34.420 --> 00:14:36.600
Visit pythonbytes.fm/scout.

00:14:37.100 --> 00:14:40.980
Please use our link because it really does support the show, right?

00:14:40.980 --> 00:14:44.580
If they don't know you're coming from us, then they might not sponsor us anymore.

00:14:44.580 --> 00:14:47.160
So please, pythonbytes.fm/scout to check it out.

00:14:47.160 --> 00:14:50.180
Thank you to Scout APM for supporting Python Bytes.

00:14:50.180 --> 00:14:50.960
Off to you, Brian.

00:14:50.960 --> 00:14:51.400
What's next?

00:14:51.400 --> 00:14:54.260
Well, next we've got something fun.

00:14:54.260 --> 00:15:03.420
On real Python, there's a post, build Conway's game of life with Python from Leodonis Ramos.

00:15:04.080 --> 00:15:08.760
And I just couldn't resist because I think I have a feeling that maybe there's some new,

00:15:08.760 --> 00:15:12.660
like younger software folks that maybe aren't familiar with game of life.

00:15:12.660 --> 00:15:15.400
Maybe I've got to live a while to know about the game of life.

00:15:15.400 --> 00:15:19.900
Well, I hope everybody knows about it, but it's a it's kind of fun.

00:15:19.900 --> 00:15:25.720
And so this is just a fairly good walkthrough of if you were going to build game of life.

00:15:25.720 --> 00:15:30.260
And it's one of the cool things about it is building on the command line.

00:15:30.260 --> 00:15:33.180
It's using art parse, but also curses.

00:15:33.620 --> 00:15:37.600
And you've got a curses version in the terminal of game of life.

00:15:37.600 --> 00:15:38.580
And how cool is that?

00:15:38.580 --> 00:15:39.940
It's pretty, just pretty fun.

00:15:39.940 --> 00:15:46.360
Looking through, I've seen some rather awful implementations of game of life over the years.

00:15:46.360 --> 00:15:49.880
Like a little bit of Pearl golf going on sometimes.

00:15:49.880 --> 00:15:53.080
But the this one looks pretty good.

00:15:53.260 --> 00:15:59.660
It walks through setting up an entire project using PyProject.toml, which is great.

00:16:00.140 --> 00:16:06.720
And then talking about the different splitting up the implementation into like a grid in one module,

00:16:06.720 --> 00:16:11.060
the patterns in another, different views, and then the CLI in another.

00:16:11.060 --> 00:16:16.980
Just the split up looks good for modularizing the application.

00:16:18.160 --> 00:16:23.620
And kind of if you're a lot of times people want to play like build games or something.

00:16:23.620 --> 00:16:26.220
And this is kind of a game that you don't actually have to play.

00:16:26.220 --> 00:16:27.080
It just plays itself.

00:16:27.080 --> 00:16:30.660
So it's a I just wanted to highlight it.

00:16:30.660 --> 00:16:33.900
It's just a fun, fun walkthrough of implementing game of life.

00:16:34.400 --> 00:16:38.860
Yeah, that's, you know, you already talked about these little projects in your first thing, right?

00:16:38.860 --> 00:16:41.080
Here's a cool little project that you can play around with.

00:16:41.080 --> 00:16:43.980
And I think games are a good way to get into coding.

00:16:43.980 --> 00:16:47.040
Not, you know, Doom, Half-Life, whatever.

00:16:47.040 --> 00:16:49.240
I've been playing a ton of Small Lands, by the way.

00:16:49.240 --> 00:16:50.820
Also not a good way to get into programming.

00:16:50.820 --> 00:16:52.520
Seems like something that would take forever.

00:16:52.520 --> 00:16:54.060
Well, Small Lands is awesome.

00:16:54.060 --> 00:16:55.980
However, I think this is like little games.

00:16:55.980 --> 00:16:56.860
You know, they're easy.

00:16:56.860 --> 00:16:59.180
You don't have to have a huge amount of domain knowledge.

00:16:59.180 --> 00:17:02.200
You don't have to know about like databases and connection strings.

00:17:02.200 --> 00:17:03.960
And like, how do I embed the password?

00:17:04.300 --> 00:17:05.440
How do I make it run?

00:17:05.440 --> 00:17:05.800
All that.

00:17:05.800 --> 00:17:06.780
Like, just have fun.

00:17:06.780 --> 00:17:07.240
Yeah.

00:17:07.240 --> 00:17:13.580
And so one of the fun things about this is like the hiding of, so it has like a life grid.

00:17:13.580 --> 00:17:18.660
So one of the, of this project, almost all of the project is going to be transferable to other stuff,

00:17:18.660 --> 00:17:20.100
except for the curses part.

00:17:20.100 --> 00:17:23.480
Like, I'm probably not going to write a whole bunch of curses applications.

00:17:23.480 --> 00:17:26.720
But that's the same thing with like most, a lot of games.

00:17:26.720 --> 00:17:29.360
Unless you become a game developer, a lot of the game development,

00:17:29.360 --> 00:17:34.200
it's using some sort of, you know, user interface stuff that you're probably not going to use

00:17:34.200 --> 00:17:35.120
for a lot of projects.

00:17:35.120 --> 00:17:38.360
Unless you go into using game, writing more games, which is great.

00:17:38.360 --> 00:17:45.760
But having that isolated off to one little part was actually, it's pretty kind of nice to be able to set that.

00:17:45.760 --> 00:17:46.780
Anyway.

00:17:46.780 --> 00:17:47.940
Good.

00:17:47.940 --> 00:17:48.180
Yeah.

00:17:48.180 --> 00:17:48.640
It's really cool.

00:17:48.920 --> 00:17:51.700
It is cool to see how you might create that little UI as, as well.

00:17:51.700 --> 00:17:57.480
I mean, usually people are doing Unreal Engine, Unity, Pi Game, Arcade.

00:17:57.480 --> 00:18:00.580
One of these is like quite, you quite deep down in those frameworks.

00:18:00.580 --> 00:18:00.900
Yeah.

00:18:00.900 --> 00:18:02.160
And it's just a little bit.

00:18:02.380 --> 00:18:07.100
One of the things I wasn't sure about, and I, so I didn't see any disclaimer at the top.

00:18:07.100 --> 00:18:13.660
I did not run through this, but was if I didn't know that you could use curses on Windows, for instance.

00:18:13.660 --> 00:18:17.560
So is this a, maybe somebody in the, in the audience knows if you could.

00:18:17.560 --> 00:18:17.700
Yeah.

00:18:17.700 --> 00:18:18.300
Maybe someone knows.

00:18:18.300 --> 00:18:21.080
It might be because of Windows terminal versus command prompt.

00:18:21.420 --> 00:18:21.880
Oh, okay.

00:18:21.880 --> 00:18:22.440
Yeah.

00:18:22.440 --> 00:18:22.840
Yeah.

00:18:22.840 --> 00:18:23.340
Possibly.

00:18:23.340 --> 00:18:25.060
But I have, that's a guess.

00:18:25.060 --> 00:18:26.320
Zero knowledge.

00:18:26.320 --> 00:18:26.800
All right.

00:18:26.800 --> 00:18:26.920
All right.

00:18:26.920 --> 00:18:27.960
Enough of this fun, Brian.

00:18:27.960 --> 00:18:29.100
Let's get down to business.

00:18:29.100 --> 00:18:29.380
Okay.

00:18:29.380 --> 00:18:31.260
Polars business, that is.

00:18:31.260 --> 00:18:32.760
This comes from Marco Gorelli.

00:18:32.760 --> 00:18:36.420
And this is just a simple plugin for Polars.

00:18:36.420 --> 00:18:41.020
Now, if you don't know Polars, Polars is like Pandas with two major differences.

00:18:41.020 --> 00:18:43.780
It has a lazy, fluent API.

00:18:43.780 --> 00:18:49.020
So you can kind of chain commands together and it doesn't actually execute until you kind of work

00:18:49.020 --> 00:18:51.600
through them kind of like generators and those sorts of things.

00:18:51.600 --> 00:18:53.880
And it's written in Rust to be super, super fast.

00:18:53.880 --> 00:18:56.460
So this is a plugin for Polars.

00:18:56.460 --> 00:19:02.760
And the idea is it lets you answer questions like how many business days between now and then.

00:19:02.760 --> 00:19:10.520
So if like my, my payment system says you get paid net 30, well, or you get paid after 10 business days.

00:19:10.520 --> 00:19:12.960
But one of those days is the 4th of July.

00:19:12.960 --> 00:19:14.140
And then there's the weekend.

00:19:14.140 --> 00:19:18.920
And then there's like how many days, you know, calendar math is already gnarly.

00:19:19.740 --> 00:19:24.280
If you want to like throw in skipping weekends, skipping holidays, even worse, right?

00:19:24.280 --> 00:19:25.720
So super simple.

00:19:25.720 --> 00:19:28.640
This thing, the extension itself is written in Rust.

00:19:28.640 --> 00:19:30.660
So it's kind of compatible with Polars.

00:19:30.660 --> 00:19:34.620
I believe Polars has actually a Rust API as well as a Python API.

00:19:34.620 --> 00:19:36.660
So maybe this is available there.

00:19:36.660 --> 00:19:38.040
I have zero information about that.

00:19:38.620 --> 00:19:42.460
All you do is you can even define your own holidays and weekends.

00:19:42.460 --> 00:19:44.980
Like every Wednesday, I'm taking it off, whatever.

00:19:44.980 --> 00:19:52.340
So the way it works is you just go import Polars and then Polars business.

00:19:52.340 --> 00:20:00.340
Somewhere down here, you can go to grab a column, say offset by and just say 5 BD.

00:20:00.900 --> 00:20:05.920
And it'll skip by, you know, it'll go through all the columns, figure out what their dates are.

00:20:05.920 --> 00:20:12.060
And using vector math, convert those to five days ahead by however they offset, like each one individually.

00:20:12.060 --> 00:20:12.880
That's pretty awesome, right?

00:20:12.880 --> 00:20:13.500
Yeah.

00:20:13.500 --> 00:20:14.020
Fun.

00:20:14.300 --> 00:20:15.640
Yeah, I don't know how that works.

00:20:15.640 --> 00:20:17.140
That sounds complicated.

00:20:17.140 --> 00:20:20.640
But yeah, so you can put in like, what are your weekend days?

00:20:20.640 --> 00:20:22.640
What are your others?

00:20:22.640 --> 00:20:28.700
You know, obviously Saturday and Sunday is pretty standard, but like we have restaurants around here that are closed on Sunday and Monday.

00:20:28.700 --> 00:20:30.500
They're open on Friday and Saturday.

00:20:30.500 --> 00:20:39.300
So if you're trying to like do business math around like that kind of schedule, like you could just say Sunday, Monday for your weekend and you're good to go.

00:20:39.300 --> 00:20:39.820
Nice.

00:20:39.820 --> 00:20:40.380
Yeah.

00:20:40.500 --> 00:20:46.240
Well, like one of the things I was thinking about, it was like education wise, schools often have like tons of.

00:20:46.240 --> 00:20:49.060
So many times, so much time off.

00:20:49.060 --> 00:20:49.480
Yeah.

00:20:49.480 --> 00:20:56.060
Like in like teacher non-work days, which or whatever, it's the teachers are still working.

00:20:56.060 --> 00:20:57.920
It's just the students aren't working.

00:20:57.920 --> 00:21:00.060
They should call it student non-work days.

00:21:00.060 --> 00:21:01.600
They should.

00:21:01.600 --> 00:21:02.100
Yeah.

00:21:02.100 --> 00:21:04.500
Like my daughter is like, oh, I don't have school this week.

00:21:04.500 --> 00:21:05.420
I don't have school this week.

00:21:05.420 --> 00:21:05.640
Why?

00:21:05.640 --> 00:21:06.960
Like, oh, it's parent teacher conference.

00:21:06.960 --> 00:21:08.300
Oh, my.

00:21:08.300 --> 00:21:08.760
Okay.

00:21:09.060 --> 00:21:09.420
Yeah.

00:21:09.420 --> 00:21:15.180
My daughter even calls, they call it, her friends call it like no school November.

00:21:15.180 --> 00:21:16.560
Yes, exactly.

00:21:16.560 --> 00:21:17.640
Exactly.

00:21:17.640 --> 00:21:18.340
Anyway.

00:21:18.340 --> 00:21:19.460
All right.

00:21:19.460 --> 00:21:20.900
So that would be good for that.

00:21:20.900 --> 00:21:23.700
Or lots of other businesses have wacky holidays.

00:21:23.700 --> 00:21:25.900
So people can check this out.

00:21:25.900 --> 00:21:30.800
It's, you know, easy to understand, easy to adopt if it's relevant to you, but it seems pretty cool.

00:21:30.800 --> 00:21:31.200
Yeah.

00:21:31.200 --> 00:21:31.780
All right, Brian.

00:21:31.780 --> 00:21:33.200
How extra do you feel today?

00:21:33.520 --> 00:21:35.020
I just have one extra.

00:21:35.020 --> 00:21:42.600
And that is last week you get what I got convinced that to do a Black Friday sale for the complete

00:21:42.600 --> 00:21:43.260
pie test course.

00:21:43.480 --> 00:21:48.240
And it is one word, Black Friday, all caps, just that.

00:21:48.240 --> 00:21:51.460
And you get 50% off the course.

00:21:51.460 --> 00:21:53.040
So check it out.

00:21:53.040 --> 00:21:56.160
And over the break, I did a whole bunch on it.

00:21:56.300 --> 00:21:59.160
So I've up to, what, chapter 13.

00:21:59.160 --> 00:22:00.860
Oh, chapter 13 was great.

00:22:00.860 --> 00:22:02.160
I wanted to talk about that a little bit.

00:22:02.160 --> 00:22:03.800
Chapter 13 was on debugging.

00:22:04.460 --> 00:22:19.260
And instead of just, like, artificially adding errors to the code, I decided to do a, like, a test-driven development little thing of writing a couple tests first, doing the implementation, and resisting the urge to refactor during the implementation.

00:22:19.260 --> 00:22:23.400
And then once everything was green, going back and doing a refactoring.

00:22:23.560 --> 00:22:29.160
And then explored, I enjoyed learning this anyway.

00:22:29.160 --> 00:22:36.520
So it was exploring testing or debugging using pytest plus PDB for the Python debugger.

00:22:36.520 --> 00:22:40.340
One of the cool things about learning PDB is you can use it with talks.

00:22:40.340 --> 00:22:47.180
So you can debug an individual environment if maybe your code's only failing on 3.8 or 3.9 or something.

00:22:47.180 --> 00:22:49.860
So anyway, that's still up.

00:22:49.860 --> 00:22:51.360
And that's my extra.

00:22:51.360 --> 00:22:52.000
How about you?

00:22:52.000 --> 00:22:52.600
Very cool.

00:22:52.760 --> 00:22:55.540
Yeah, congrats on getting chapter 13 up.

00:22:55.540 --> 00:22:59.360
And I think debugging 13, I think stuff could go, that's perfect.

00:22:59.360 --> 00:23:02.760
As long as you didn't release the chapter on Friday the 13th, everything will be fine.

00:23:02.760 --> 00:23:03.180
Right.

00:23:03.180 --> 00:23:05.100
I got a few things.

00:23:05.100 --> 00:23:10.580
First, there was, like, a really heartfelt message from Kenneth Reitz that he posted on X Twitter.

00:23:10.580 --> 00:23:19.020
And so I thought maybe I'd just read that because it's, you know, just kind of remind everyone of, you know, how nice the community is and why we all like to be here.

00:23:19.020 --> 00:23:19.780
You up for that, Brian?

00:23:19.780 --> 00:23:20.160
Yeah.

00:23:20.160 --> 00:23:20.660
All right.

00:23:20.920 --> 00:23:28.120
Kenneth, who's done things like requests and many other projects, says, dear Python community, I hope this letter finds you well and thriving in your various endeavors.

00:23:28.120 --> 00:23:30.120
Python, my name is Kenneth Reitz.

00:23:30.120 --> 00:23:35.420
I've been part of this vibrant community for quite some time, contributing to projects like Quest, Pip, Envy, and among others.

00:23:35.500 --> 00:23:44.660
Today, I write to you not just as a fellow Python enthusiast, but as someone who, like many of you, have faced moments of uncertainty and feared my journey with programming.

00:23:44.660 --> 00:23:49.360
It's a path that, while rewarding, is often fraught with challenges and moments of self-doubt.

00:23:49.360 --> 00:23:54.280
I'm reaching out to share these feelings because I believe in the power of our community to support and uplift each other.

00:23:54.560 --> 00:24:04.800
In recent times, I've found myself grappling with a sense of fear, fear of not living up to expectations, fear of the unknown or ever-involving field, and perhaps fear of not being able to contribute as significantly as I have in the past.

00:24:04.900 --> 00:24:06.900
These are feelings I'm sure many can relate to.

00:24:06.900 --> 00:24:19.340
But in these times of vulnerability, that I'm reminded of the strength and compassion of the Python community, that we're a group that not only shares a love for programming, but also cares for the well-being of its members.

00:24:19.340 --> 00:24:25.460
Your support, encouragement, and willingness to share knowledge and experiences have always been a source of strength for me.

00:24:25.460 --> 00:24:31.240
So, reaching out to ask for your understanding and continued support, not just for me, but for everyone in the community facing similar challenges.

00:24:31.240 --> 00:24:33.620
It goes on. I'll let people read it. I'll link to it in the show notes.

00:24:33.620 --> 00:24:37.560
But I just think that's kind of a nice message, and I wanted to amplify it a bit for Kenneth.

00:24:37.560 --> 00:24:38.120
Yeah.

00:24:38.120 --> 00:24:43.200
I mean, obviously, he's someone who I know many people look up to as like, wow, look how much he's accomplished.

00:24:43.200 --> 00:24:54.340
And so, if you're feeling uncertain or like you're not contributing enough or whatever, like if Kenneth also feels that way, like, you know, maybe these are just feelings people have and not so much things that should stop you.

00:24:54.340 --> 00:24:55.320
All right, so that's one.

00:24:55.320 --> 00:25:01.140
Remember last time I talked about Python 3.13.0 alpha 1 being out?

00:25:01.140 --> 00:25:07.420
Well, this time, since it was so close to when 3.2 or alpha 2 was coming out, alpha 2 is here as well.

00:25:07.420 --> 00:25:08.880
So, I just wanted to link over to that.

00:25:08.880 --> 00:25:17.660
Really, many of the features that they talk about, what's coming in 3.13 really just has to do with like deprecations and very concrete stuff.

00:25:17.660 --> 00:25:23.300
But I know there's the faster CPython initiative making a lot of changes, although they're not even at all mentioned here.

00:25:23.300 --> 00:25:28.660
It's like we remove many deprecated things and many of the dead batteries that we talked about, like Telnet Lib.

00:25:28.660 --> 00:25:32.940
Go find another way to implement your Telnet client instead of the standard library and so on.

00:25:32.940 --> 00:25:37.520
So, alpha 3 will be scheduled for December 19th.

00:25:37.520 --> 00:25:42.480
So, we can round out our year with a third Python 3.13 alpha release.

00:25:42.900 --> 00:25:43.960
So, that's nice and quick.

00:25:43.960 --> 00:25:50.380
And finally, as you touched on as well, thank you to all the people who participated in the Black Friday thing.

00:25:50.380 --> 00:25:54.800
And just, we raised a bunch of money for charity, which is awesome.

00:25:54.800 --> 00:25:57.180
So, really happy to have done that.

00:25:57.180 --> 00:26:00.520
So, just a bit of a heartfelt thanks on my end for people who participated.

00:26:00.520 --> 00:26:01.980
All right, ready for a joke?

00:26:01.980 --> 00:26:02.660
Yeah.

00:26:02.660 --> 00:26:06.060
The joke is called Select Star, and I think we can all relate to it.

00:26:06.060 --> 00:26:06.360
Okay.

00:26:06.360 --> 00:26:09.720
So, Select Star being theoretically a bad thing.

00:26:09.720 --> 00:26:11.680
Can I get this image all the way over?

00:26:11.680 --> 00:26:12.360
No, not really.

00:26:12.620 --> 00:26:12.800
Okay.

00:26:12.800 --> 00:26:16.960
So, the question here says, it's a person.

00:26:16.960 --> 00:26:20.480
I think this is Will Smith from iRobot kind of type of thing.

00:26:20.480 --> 00:26:21.320
Anyway, it doesn't really matter.

00:26:21.320 --> 00:26:25.520
The developer says, can an AI really write efficient SQL queries?

00:26:25.520 --> 00:26:27.940
And the AI looks back at the developer and goes, can you?

00:26:27.940 --> 00:26:29.280
The developer goes, hmm.

00:26:29.280 --> 00:26:31.640
Maybe not.

00:26:31.640 --> 00:26:38.140
And, of course, the title is Select Star, which is like barring joins and other crazy group buy stuff.

00:26:38.140 --> 00:26:40.840
Like, pretty much the worst thing you can do for performance.

00:26:40.840 --> 00:26:41.600
Like, give me everything.

00:26:41.600 --> 00:26:42.400
I don't care if I use it.

00:26:42.400 --> 00:26:42.800
Right.

00:26:42.800 --> 00:26:45.740
I know there's like a 10 kilobyte per row description.

00:26:45.740 --> 00:26:47.260
I don't need that.

00:26:47.260 --> 00:26:48.040
Just give it to me anyway.

00:26:48.040 --> 00:26:54.840
I think this is like the ideal use case for using an AI is optimizing SQL queries.

00:26:54.840 --> 00:26:55.600
Yeah.

00:26:55.600 --> 00:26:56.080
Yeah.

00:26:56.080 --> 00:26:56.680
Anyway.

00:26:56.680 --> 00:26:58.300
I wouldn't trust.

00:26:58.300 --> 00:27:00.340
I don't trust myself with production SQL.

00:27:01.500 --> 00:27:05.380
Can an AI really write efficient SQL queries?

00:27:05.380 --> 00:27:06.040
Can you?

00:27:06.040 --> 00:27:06.400
Okay.

00:27:06.400 --> 00:27:07.580
Okay.

00:27:07.580 --> 00:27:10.020
Well, I see some agreement in the audience out there as well.

00:27:10.020 --> 00:27:10.520
Very nice.

00:27:10.520 --> 00:27:15.440
I want to add a just a funny thing that my wife shared with me yesterday.

00:27:16.080 --> 00:27:23.260
And as many of you know, or maybe you don't know, I used to have short hair and over the pandemic,

00:27:23.260 --> 00:27:24.060
grew it out.

00:27:24.060 --> 00:27:26.160
And now I have longish hair.

00:27:26.160 --> 00:27:28.180
I would say that counts as long.

00:27:28.180 --> 00:27:33.860
And so often it's pulled back, but it's often not also.

00:27:34.060 --> 00:27:40.060
So I wanted to share this, this funny thing that my, my wife shared said, I admire those

00:27:40.060 --> 00:27:40.920
with hairstyles.

00:27:40.920 --> 00:27:42.080
I don't have a hairstyle.

00:27:42.080 --> 00:27:42.780
I have hair.

00:27:42.780 --> 00:27:44.160
Most are most days.

00:27:44.160 --> 00:27:46.000
It has zero caterpillars in it.

00:27:46.000 --> 00:27:47.560
That's as good as it gets.

00:27:47.560 --> 00:27:52.620
So a girl, woman with like long flowing air.

00:27:52.620 --> 00:27:55.380
I just, honestly, the length is about the same as yours right now.

00:27:55.380 --> 00:27:56.000
So that's pretty awesome.

00:27:56.000 --> 00:28:00.700
And apparently this was, that came up by Tom Cox.

00:28:00.700 --> 00:28:01.720
So that's funny.

00:28:01.720 --> 00:28:02.180
Anyway.

00:28:02.180 --> 00:28:02.680
Yeah.

00:28:02.680 --> 00:28:03.240
Very good.

00:28:03.500 --> 00:28:05.020
Well, also a very good episode.

00:28:05.020 --> 00:28:07.040
Good to be back with you and with everyone.

00:28:07.040 --> 00:28:07.600
Yeah.

00:28:07.600 --> 00:28:08.200
Thank you.

00:28:08.200 --> 00:28:08.580
Yeah.

00:28:08.580 --> 00:28:08.840
You bet.

00:28:08.840 --> 00:28:09.740
Thanks everyone for listening.

