WEBVTT
00:00:00.001 -->
00:00:05.580Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.580 -->
00:00:10.860This is episode 362, recorded November 28th, 2023.
00:00:10.860 -->
00:00:11.820I'm Michael Kennedy.
00:00:11.820 -->
00:00:12.880And I'm Brian Okken.
00:00:12.880 -->
00:00:16.100And this episode is brought to you by Scout APM.
00:00:16.100 -->
00:00:19.260We will tell you more about them later, but please check out what they're offering.
00:00:19.260 -->
00:00:20.600It really helps support the show.
00:00:20.600 -->
00:00:28.600And 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.040I'm Adam Kennedy.
00:00:30.040 -->
00:00:31.320Brian is @brianokken.
00:00:31.320 -->
00:00:33.060And the show is at Python Bytes.
00:00:33.060 -->
00:00:35.420fosstodon.org is invite only.
00:00:35.420 -->
00:00:37.720Of course, you can follow us from any place on Mastodon.
00:00:37.720 -->
00:00:41.040But if you want to be part of it, just shoot one of us a message.
00:00:41.040 -->
00:00:42.120We can send you an invite.
00:00:42.120 -->
00:00:45.900Help you get over there to hang out a little bit closer to home for us.
00:00:45.900 -->
00:00:53.700And 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.020Check that out at pythonbytes.fm/live.
00:00:56.020 -->
00:00:58.120Usually Tuesdays at 11 p.m.
00:00:58.120 -->
00:00:59.740And older videos are there as well.
00:00:59.740 -->
00:01:00.880Let's kick it off.
00:01:00.880 -->
00:01:01.580What do you got?
00:01:01.580 -->
00:01:05.420This is a gentle ease back into the show.
00:01:05.420 -->
00:01:11.000Over 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.720Starting to think about plans for how to, where do I want to focus my time?
00:01:16.720 -->
00:01:26.580And 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.900And it's kind of, there's a lot of great stuff here.
00:01:32.080 -->
00:01:35.940So also, nice index on the right, which is cool.
00:01:35.940 -->
00:01:38.500So focusing beyond the code.
00:01:38.500 -->
00:01:40.340So I'm not going to go through all these.
00:01:40.340 -->
00:01:45.060I'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.260Focus on the code.
00:01:46.260 -->
00:01:51.760So 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.760You should excel at coding nonetheless, but it won't be enough to be great.
00:01:56.020 -->
00:01:58.300I think I code more than 20% of the time.
00:01:58.300 -->
00:01:59.040I would say too.
00:01:59.040 -->
00:02:00.900Well, define code, right?
00:02:00.900 -->
00:02:01.200Okay.
00:02:01.200 -->
00:02:04.020So is coding, is that reading code?
00:02:04.020 -->
00:02:05.560Is that thinking about code?
00:02:05.560 -->
00:02:06.440Is that...
00:02:06.440 -->
00:02:07.580Oh, the design part.
00:02:07.580 -->
00:02:08.020Right.
00:02:08.020 -->
00:02:11.260Or is it actually, I'm hitting keys on keyboard.
00:02:11.260 -->
00:02:11.820You know what I mean?
00:02:11.820 -->
00:02:12.820Yeah, that's true.
00:02:12.820 -->
00:02:13.140Right.
00:02:13.140 -->
00:02:16.860Because people say you code as read way more than it's written and stuff.
00:02:16.860 -->
00:02:23.360But 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.940even if like I'm not keystroking it at that moment.
00:02:25.940 -->
00:02:30.840So unclear, but if that encompasses all, then 20% is way too low.
00:02:30.840 -->
00:02:31.240Agreed.
00:02:31.240 -->
00:02:31.740Okay.
00:02:31.740 -->
00:02:38.340Well, 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.940And focusing on, you know, not just being a better software engineer, but also...
00:02:43.940 -->
00:02:50.720Well, 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.680Like communication skills and all that.
00:02:52.680 -->
00:02:54.980Design skills, learning other...
00:02:54.980 -->
00:02:56.740Learning to read other people's code, things like that.
00:02:56.740 -->
00:02:59.400Helping unblock your teammates who are having a challenge.
00:02:59.400 -->
00:03:03.840Instead 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.280Like...
00:03:04.280 -->
00:03:04.580Yeah.
00:03:04.580 -->
00:03:05.140Yep.
00:03:05.140 -->
00:03:05.640All those things.
00:03:05.640 -->
00:03:06.660Well, and...
00:03:06.660 -->
00:03:06.900Okay.
00:03:06.900 -->
00:03:11.200So number two was efficiency and anti-fragility.
00:03:11.200 -->
00:03:14.200I'm not really a fan of the anti-fragile word.
00:03:14.200 -->
00:03:16.720I don't even really know what it means, but I guess...
00:03:16.720 -->
00:03:23.260I 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.880Anyway.
00:03:23.880 -->
00:03:29.940It's kind of about things that get better the more they kind of get abused, right?
00:03:29.940 -->
00:03:31.600Like they sort of build up a resilience.
00:03:31.600 -->
00:03:32.260Well...
00:03:32.260 -->
00:03:34.180I think it originally comes out of economics.
00:03:34.180 -->
00:03:34.920Okay.
00:03:35.480 -->
00:03:39.600Well, the next one is one I really agree with is the joy...
00:03:39.600 -->
00:03:41.100Number three is the joy of tinkering.
00:03:41.100 -->
00:03:44.280Build projects, try out frameworks, build stuff on the side.
00:03:44.280 -->
00:03:46.860Keeps the spark alive.
00:03:46.860 -->
00:03:49.600And this is one I couldn't agree more.
00:03:49.600 -->
00:03:51.320It doesn't...
00:03:51.320 -->
00:03:51.860I...
00:03:51.860 -->
00:03:58.180For 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.120That's great.
00:03:59.520 -->
00:04:03.680You could try to at least do a side project that tries to make money or something.
00:04:03.680 -->
00:04:08.880But if you just want to try out FastAPI, for instance, just build something with FastAPI.
00:04:08.880 -->
00:04:11.880Just come up with a toy project and build it and learn it.
00:04:11.880 -->
00:04:12.640And it's fun.
00:04:12.640 -->
00:04:14.900Even if you never apply it to other stuff.
00:04:14.900 -->
00:04:22.660I'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.700I'm like, oh, yeah, I've built wikis before and stuff like that.
00:04:25.780 -->
00:04:32.340I 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.240So if I need a flask app at work, it's going to be pretty easy.
00:04:35.240 -->
00:04:36.120Things like that.
00:04:36.120 -->
00:04:38.140Tink, playing with toy projects.
00:04:38.140 -->
00:04:40.820I say, put that on top of your list for 2024.
00:04:40.820 -->
00:04:42.160More toy projects.
00:04:42.160 -->
00:04:45.020I'll go through the rest of these pretty quick.
00:04:45.020 -->
00:04:46.800Number four is knowing the why.
00:04:46.800 -->
00:04:48.820Number five, thinking and systems.
00:04:49.400 -->
00:04:51.460Number six, tech detox.
00:04:51.460 -->
00:04:54.840Recharging away for the monitor.
00:04:54.840 -->
00:04:56.140This makes you a better programmer.
00:04:56.140 -->
00:04:57.080Couldn't agree more.
00:04:57.080 -->
00:04:59.280The art of approximation.
00:04:59.280 -->
00:05:00.800I don't really know what this is about.
00:05:00.800 -->
00:05:02.320I didn't read this part.
00:05:02.320 -->
00:05:04.240Knowing important tech numbers.
00:05:04.240 -->
00:05:05.140Anyway.
00:05:05.140 -->
00:05:05.640I will.
00:05:05.640 -->
00:05:06.940I actually have one.
00:05:06.940 -->
00:05:09.600I want to cover that as one of our items.
00:05:09.600 -->
00:05:10.020Okay.
00:05:10.020 -->
00:05:10.860In the future.
00:05:10.860 -->
00:05:16.920There'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.660So this is like, what is the relative speed of L2 cache versus RAM?
00:05:21.660 -->
00:05:23.040RAM versus disk?
00:05:23.040 -->
00:05:27.560What is the cost of like a CPU core or a database operation on the cloud?
00:05:27.560 -->
00:05:28.480Et cetera, et cetera.
00:05:28.480 -->
00:05:31.140But I don't like some of the numbers there.
00:05:31.140 -->
00:05:33.020I think they're way, way skewed.
00:05:33.020 -->
00:05:36.620So I want to come up with my own table and then put them both forward.
00:05:36.620 -->
00:05:37.760So that's why I haven't covered it yet.
00:05:37.760 -->
00:05:39.000But that's what this is about, I think.
00:05:39.000 -->
00:05:39.360Okay.
00:05:39.640 -->
00:05:48.360Well, 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.020But there's a table of contents on the right.
00:05:50.020 -->
00:05:51.820So you can just look at the table of contents.
00:05:51.820 -->
00:05:59.520The last one I think is the most important for me is strong opinions loosely held.
00:05:59.520 -->
00:06:09.360And 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.720It just speeds things up.
00:06:10.820 -->
00:06:13.100It's like, if I don't care about it, just do it quickly.
00:06:13.100 -->
00:06:15.300You've got an opinion on how things are done.
00:06:15.300 -->
00:06:20.820However, 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.540Or keeping your eyes open with the tinkering, trying new ways to do things.
00:06:26.540 -->
00:06:30.860Be willing to abandon your old strong opinion and go, oh, there's a better way.
00:06:30.860 -->
00:06:31.280Cool.
00:06:31.280 -->
00:06:32.980My new opinion is this now.
00:06:32.980 -->
00:06:35.260That pretty much sums up our podcast.
00:06:35.260 -->
00:06:36.400Yeah, exactly.
00:06:36.400 -->
00:06:36.820Yes.
00:06:36.820 -->
00:06:39.000So, yeah.
00:06:39.000 -->
00:06:39.980Nice.
00:06:39.980 -->
00:06:40.740Nice post.
00:06:40.740 -->
00:06:47.120Just thinking about, you know, kind of planning for your time allotment for the upcoming year.
00:06:47.120 -->
00:06:47.880Yeah.
00:06:47.880 -->
00:06:49.720Lots of feedback on this one.
00:06:49.720 -->
00:06:53.740Jeff out there says, tech numbers like LEET1337.
00:06:53.740 -->
00:06:55.080So, excuse me.
00:06:55.080 -->
00:06:55.280Yes.
00:06:55.280 -->
00:06:56.920Those are the important tech numbers.
00:06:56.920 -->
00:06:58.260Those are the important ones.
00:06:58.260 -->
00:06:58.480Yeah.
00:06:58.480 -->
00:07:00.260LEET, NOB, all those things.
00:07:00.260 -->
00:07:04.700And then Grant, following up on the anti-fragile, says this.
00:07:04.700 -->
00:07:07.960Number two speaks more to reactive principles that came about with the cloud.
00:07:07.960 -->
00:07:13.320It 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.120Yeah, exactly.
00:07:14.120 -->
00:07:17.820That you might just use one VM, but it could die.
00:07:17.820 -->
00:07:24.720But 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.480I think that's kind of that principle there.
00:07:26.480 -->
00:07:27.160Yeah.
00:07:27.160 -->
00:07:27.820Okay.
00:07:27.820 -->
00:07:33.140But 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.040Yeah.
00:07:34.040 -->
00:07:35.520This is not a side project.
00:07:35.520 -->
00:07:35.920Yeah.
00:07:35.920 -->
00:07:38.140Maybe a habit of great software engineers.
00:07:38.140 -->
00:07:38.620I don't know.
00:07:38.620 -->
00:07:40.640I wonder how many blogs run on Kubernetes.
00:07:41.720 -->
00:07:43.620I don't know what the answer is, but I bet too many.
00:07:43.620 -->
00:07:44.600The answer is too many.
00:07:44.600 -->
00:07:45.200Too many.
00:07:45.200 -->
00:07:47.380Too many run on Kubernetes.
00:07:47.380 -->
00:07:48.180Okay.
00:07:48.180 -->
00:07:48.700Okay.
00:07:48.700 -->
00:07:49.460What do you got for us?
00:07:49.460 -->
00:07:49.980All right.
00:07:49.980 -->
00:07:53.500I got eight nines uptime on my blog.
00:07:53.500 -->
00:07:53.920Okay.
00:07:53.920 -->
00:07:59.120Although we probably do, Brian, because ours runs on a CDN as a static file.
00:07:59.120 -->
00:07:59.780Okay.
00:07:59.980 -->
00:08:01.240That's pretty good uptime, right?
00:08:01.240 -->
00:08:01.660Yeah.
00:08:01.660 -->
00:08:05.240Then the database doesn't need to be migrated for that business, does it?
00:08:05.240 -->
00:08:05.660All right.
00:08:05.660 -->
00:08:06.040Moving on.
00:08:06.040 -->
00:08:07.020We've covered this enough.
00:08:07.020 -->
00:08:09.140Let's talk about a new version of Flask.
00:08:09.140 -->
00:08:12.940So Flask obviously is a super important web framework.
00:08:12.940 -->
00:08:14.660Like everyone has heard of Flask.
00:08:14.660 -->
00:08:19.780It'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.780There's Flask and Django.
00:08:20.780 -->
00:08:24.200And 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.700What kind of web developer are you?
00:08:26.040 -->
00:08:30.660Well, Flask 3.0 was released just a little while ago.
00:08:30.660 -->
00:08:32.260Is that three weeks ago?
00:08:32.260 -->
00:08:32.900Something like that.
00:08:32.900 -->
00:08:38.200There's also a 301 that is only unreleased, but has like very, very minor changes.
00:08:38.200 -->
00:08:42.840So anyway, the changes for a two to three release are not that huge.
00:08:42.840 -->
00:08:49.000Although I think the numbering probably comes from this removed, previously deprecated code there.
00:08:49.000 -->
00:08:53.400That's probably what pushed it from a two to three rather than some mega new feature.
00:08:53.400 -->
00:08:53.760Yeah.
00:08:53.760 -->
00:08:54.700Right.
00:08:54.840 -->
00:08:57.440Because it's like, hey, it's not backwards compatible.
00:08:57.440 -->
00:09:01.500Miguel Grinberg actually wrote an interesting but controversial piece on that.
00:09:01.500 -->
00:09:04.140I'm not going to link to it, but y'all can check that out.
00:09:04.140 -->
00:09:05.440I just want to cover the release here.
00:09:05.440 -->
00:09:10.160But 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.800Neutral there.
00:09:11.800 -->
00:09:15.320So some of the things that are interesting here though, Brian, are not so much interesting because
00:09:15.320 -->
00:09:15.780they're Flask.
00:09:15.780 -->
00:09:17.120They're just like, wait, what?
00:09:17.120 -->
00:09:17.760You could do that?
00:09:17.760 -->
00:09:22.020So deprecated the Dunder version attribute.
00:09:22.220 -->
00:09:30.580So 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.040And then you can say, well, what version is the thing?
00:09:33.040 -->
00:09:36.220Well, it's Flask.Dunder version is the version.
00:09:36.220 -->
00:09:37.320And that's just a string, right?
00:09:37.320 -->
00:09:37.780Yeah.
00:09:38.040 -->
00:09:41.080So the idea is that's deprecated.
00:09:41.080 -->
00:09:51.940And 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.660Okay.
00:09:52.660 -->
00:09:57.780Which I had not, like, okay, so cool that that might work.
00:09:57.780 -->
00:10:03.260But 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.100If 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.320So do I have it here?
00:10:13.320 -->
00:10:13.720Yeah.
00:10:13.720 -->
00:10:21.560Basically, 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.520And now that's that.
00:10:22.520 -->
00:10:22.980Yeah.
00:10:23.220 -->
00:10:23.420Okay.
00:10:23.420 -->
00:10:23.920Yeah.
00:10:23.920 -->
00:10:24.480Pretty cool.
00:10:24.480 -->
00:10:29.460And so that's where that value comes from when you say import lib.metadata.version.
00:10:29.460 -->
00:10:30.120Pretty cool.
00:10:30.120 -->
00:10:33.640What's more interesting is deprecated a global variable.
00:10:33.640 -->
00:10:35.660How do you deprecate a global variable?
00:10:35.660 -->
00:10:39.220I know how to deprecate a method, a class, but a variable?
00:10:39.220 -->
00:10:41.060But just delete it.
00:10:41.060 -->
00:10:43.800No, that's removing it.
00:10:43.800 -->
00:10:46.220You wanted to give a warning when you access the variable.
00:10:46.220 -->
00:10:46.760Hmm.
00:10:46.760 -->
00:10:47.360Okay.
00:10:47.620 -->
00:10:49.620And the variable's value is a string.
00:10:49.620 -->
00:10:51.040Like, okay, what?
00:10:51.040 -->
00:10:53.000So I'm like, I got to see it.
00:10:53.000 -->
00:10:54.900So I went and I tracked down the changelog.
00:10:54.900 -->
00:10:58.780I checked down the PR that made this happen.
00:10:58.780 -->
00:10:59.960I'm like, I got to see the code.
00:10:59.960 -->
00:11:00.720What is this?
00:11:00.720 -->
00:11:02.580So it says it deprecated Dunder version.
00:11:02.580 -->
00:11:15.200And 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.340For some reason, I thought that only applied to classes, but no, apparently modules.
00:11:18.340 -->
00:11:25.140And 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.560And then it calls the import lib.version thing on itself.
00:11:28.560 -->
00:11:29.460Interesting, huh?
00:11:29.460 -->
00:11:30.080Yeah.
00:11:30.080 -->
00:11:32.960Actually, this is a handy thing to keep around.
00:11:32.960 -->
00:11:34.120Yes, exactly.
00:11:34.120 -->
00:11:38.180If you're asking for Dunder version, it warns and then it does the new thing.
00:11:38.180 -->
00:11:40.420Otherwise, it just says, no, we don't have one of them.
00:11:40.420 -->
00:11:41.800But yeah, that's wild, right?
00:11:41.800 -->
00:11:42.420Yeah.
00:11:42.420 -->
00:11:43.100Huh.
00:11:43.100 -->
00:11:45.020I love how dynamic Python is.
00:11:45.260 -->
00:11:47.900It was a global variable.
00:11:47.900 -->
00:11:49.020Now it's a function.
00:11:49.020 -->
00:11:53.160Now it's a function call to a Dunder git adder method on the module.
00:11:53.160 -->
00:11:53.760Wow.
00:11:53.760 -->
00:11:54.820Yeah.
00:11:54.820 -->
00:11:59.560I think I'm going to replace all of my global like function declarations as git adder.
00:11:59.560 -->
00:12:00.400Exactly.
00:12:00.400 -->
00:12:01.200It's going to write all.
00:12:01.200 -->
00:12:01.680Yeah.
00:12:01.680 -->
00:12:04.380The whole function is just a bunch of dispatch to git adder.
00:12:04.380 -->
00:12:05.000It's going to be awesome.
00:12:05.000 -->
00:12:05.200Yeah.
00:12:06.800 -->
00:12:13.340We structured the code such that the Flask app and blueprint classes have sans IO bases.
00:12:13.340 -->
00:12:15.100I don't know what sans IO bases are.
00:12:15.100 -->
00:12:20.340But 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.980Things like that.
00:12:20.980 -->
00:12:24.080Requires a new version of Vexoic.
00:12:24.080 -->
00:12:26.220And that's pretty much it.
00:12:26.220 -->
00:12:27.440So interesting.
00:12:27.620 -->
00:12:29.220So it's interesting that 3.0 is out.
00:12:29.220 -->
00:12:29.980Way to go.
00:12:29.980 -->
00:12:30.900Palette's team.
00:12:30.900 -->
00:12:32.920But it's this deprecate version attribute.
00:12:32.920 -->
00:12:34.940This is interesting to me.
00:12:34.940 -->
00:12:35.540Yeah.
00:12:35.540 -->
00:12:37.340And so the meta.
00:12:37.340 -->
00:12:38.860I haven't played with it.
00:12:38.860 -->
00:12:40.780But that import lib metadata version.
00:12:41.480 -->
00:12:45.220You showed it working with like a static version metadata.
00:12:45.220 -->
00:12:51.180But it probably works with dynamic versions in PyProject Toml based projects also.
00:12:51.180 -->
00:12:52.180Yes, probably.
00:12:52.180 -->
00:12:52.600Yeah.
00:12:52.600 -->
00:12:56.100It's just my lack of experience with that kind of stuff to talk about it.
00:12:56.100 -->
00:12:56.600No.
00:12:56.600 -->
00:12:58.340Interesting.
00:12:58.340 -->
00:12:58.740Cool.
00:12:58.740 -->
00:12:59.280Mm-hmm.
00:12:59.280 -->
00:12:59.920All right.
00:12:59.920 -->
00:13:01.140You know what else is cool?
00:13:01.140 -->
00:13:02.540Our sponsor this week.
00:13:02.540 -->
00:13:06.420Let me take a moment and tell everyone about them.
00:13:06.420 -->
00:13:08.120Once I find where I put my notes.
00:13:08.120 -->
00:13:08.420Okay.
00:13:08.800 -->
00:13:13.440So this episode, as a couple of recent ones, have been brought to you by Scout APM,
00:13:13.440 -->
00:13:15.760Application Performance Monitoring.
00:13:15.760 -->
00:13:17.720Definitely a cool, cool service.
00:13:17.720 -->
00:13:20.520You know, there's a lot of profiling and stuff you can do, Brian.
00:13:20.520 -->
00:13:23.560And it's great to run your code in the profiler.
00:13:23.560 -->
00:13:26.500There's a bit of a Heisenberg type of thing.
00:13:26.500 -->
00:13:29.840As you observe it, it changes the behavior of the performance.
00:13:29.840 -->
00:13:31.300But you still get a sense.
00:13:31.300 -->
00:13:34.180But it's nothing like my app is running in production.
00:13:34.180 -->
00:13:36.380Let's see how it did during Black Friday.
00:13:36.380 -->
00:13:38.360Oh, this was the part that was slow.
00:13:38.460 -->
00:13:43.660We 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.140If we change it this way, right?
00:13:45.140 -->
00:13:46.640So having that data is awesome.
00:13:46.640 -->
00:13:53.240So 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.040It'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.540It ties bottlenecks such as memory leaks, slow database queries and background jobs.
00:14:06.540 -->
00:14:15.380And 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.920I 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.040You'll love Scout because it's built for developers by developers.
00:14:24.040 -->
00:14:27.520It makes it easy to get set up and deliver insights in less than four minutes.
00:14:27.520 -->
00:14:31.920Seriously, you could be done by the time you're done listening to this episode or live stream.
00:14:31.920 -->
00:14:34.420So start your free trial and get instant insights today.
00:14:34.420 -->
00:14:36.600Visit pythonbytes.fm/scout.
00:14:37.100 -->
00:14:40.980Please use our link because it really does support the show, right?
00:14:40.980 -->
00:14:44.580If they don't know you're coming from us, then they might not sponsor us anymore.
00:14:44.580 -->
00:14:47.160So please, pythonbytes.fm/scout to check it out.
00:14:47.160 -->
00:14:50.180Thank you to Scout APM for supporting Python Bytes.
00:14:50.180 -->
00:14:50.960Off to you, Brian.
00:14:50.960 -->
00:14:51.400What's next?
00:14:51.400 -->
00:14:54.260Well, next we've got something fun.
00:14:54.260 -->
00:15:03.420On real Python, there's a post, build Conway's game of life with Python from Leodonis Ramos.
00:15:04.080 -->
00:15:08.760And 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.660like younger software folks that maybe aren't familiar with game of life.
00:15:12.660 -->
00:15:15.400Maybe I've got to live a while to know about the game of life.
00:15:15.400 -->
00:15:19.900Well, I hope everybody knows about it, but it's a it's kind of fun.
00:15:19.900 -->
00:15:25.720And 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.260And it's one of the cool things about it is building on the command line.
00:15:30.260 -->
00:15:33.180It's using art parse, but also curses.
00:15:33.620 -->
00:15:37.600And you've got a curses version in the terminal of game of life.
00:15:37.600 -->
00:15:38.580And how cool is that?
00:15:38.580 -->
00:15:39.940It's pretty, just pretty fun.
00:15:39.940 -->
00:15:46.360Looking through, I've seen some rather awful implementations of game of life over the years.
00:15:46.360 -->
00:15:49.880Like a little bit of Pearl golf going on sometimes.
00:15:49.880 -->
00:15:53.080But the this one looks pretty good.
00:15:53.260 -->
00:15:59.660It walks through setting up an entire project using PyProject.toml, which is great.
00:16:00.140 -->
00:16:06.720And then talking about the different splitting up the implementation into like a grid in one module,
00:16:06.720 -->
00:16:11.060the patterns in another, different views, and then the CLI in another.
00:16:11.060 -->
00:16:16.980Just the split up looks good for modularizing the application.
00:16:18.160 -->
00:16:23.620And 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.220And this is kind of a game that you don't actually have to play.
00:16:26.220 -->
00:16:27.080It just plays itself.
00:16:27.080 -->
00:16:30.660So it's a I just wanted to highlight it.
00:16:30.660 -->
00:16:33.900It's just a fun, fun walkthrough of implementing game of life.
00:16:34.400 -->
00:16:38.860Yeah, that's, you know, you already talked about these little projects in your first thing, right?
00:16:38.860 -->
00:16:41.080Here's a cool little project that you can play around with.
00:16:41.080 -->
00:16:43.980And I think games are a good way to get into coding.
00:16:43.980 -->
00:16:47.040Not, you know, Doom, Half-Life, whatever.
00:16:47.040 -->
00:16:49.240I've been playing a ton of Small Lands, by the way.
00:16:49.240 -->
00:16:50.820Also not a good way to get into programming.
00:16:50.820 -->
00:16:52.520Seems like something that would take forever.
00:16:52.520 -->
00:16:54.060Well, Small Lands is awesome.
00:16:54.060 -->
00:16:55.980However, I think this is like little games.
00:16:55.980 -->
00:16:56.860You know, they're easy.
00:16:56.860 -->
00:16:59.180You don't have to have a huge amount of domain knowledge.
00:16:59.180 -->
00:17:02.200You don't have to know about like databases and connection strings.
00:17:02.200 -->
00:17:03.960And like, how do I embed the password?
00:17:04.300 -->
00:17:05.440How do I make it run?
00:17:05.440 -->
00:17:05.800All that.
00:17:05.800 -->
00:17:06.780Like, just have fun.
00:17:06.780 -->
00:17:07.240Yeah.
00:17:07.240 -->
00:17:13.580And 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.660So 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.100except for the curses part.
00:17:20.100 -->
00:17:23.480Like, I'm probably not going to write a whole bunch of curses applications.
00:17:23.480 -->
00:17:26.720But that's the same thing with like most, a lot of games.
00:17:26.720 -->
00:17:29.360Unless you become a game developer, a lot of the game development,
00:17:29.360 -->
00:17:34.200it'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.120for a lot of projects.
00:17:35.120 -->
00:17:38.360Unless you go into using game, writing more games, which is great.
00:17:38.360 -->
00:17:45.760But 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.780Anyway.
00:17:46.780 -->
00:17:47.940Good.
00:17:47.940 -->
00:17:48.180Yeah.
00:17:48.180 -->
00:17:48.640It's really cool.
00:17:48.920 -->
00:17:51.700It is cool to see how you might create that little UI as, as well.
00:17:51.700 -->
00:17:57.480I mean, usually people are doing Unreal Engine, Unity, Pi Game, Arcade.
00:17:57.480 -->
00:18:00.580One of these is like quite, you quite deep down in those frameworks.
00:18:00.580 -->
00:18:00.900Yeah.
00:18:00.900 -->
00:18:02.160And it's just a little bit.
00:18:02.380 -->
00:18:07.100One 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.660I 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.560So is this a, maybe somebody in the, in the audience knows if you could.
00:18:17.560 -->
00:18:17.700Yeah.
00:18:17.700 -->
00:18:18.300Maybe someone knows.
00:18:18.300 -->
00:18:21.080It might be because of Windows terminal versus command prompt.
00:18:21.420 -->
00:18:21.880Oh, okay.
00:18:21.880 -->
00:18:22.440Yeah.
00:18:22.440 -->
00:18:22.840Yeah.
00:18:22.840 -->
00:18:23.340Possibly.
00:18:23.340 -->
00:18:25.060But I have, that's a guess.
00:18:25.060 -->
00:18:26.320Zero knowledge.
00:18:26.320 -->
00:18:26.800All right.
00:18:26.800 -->
00:18:26.920All right.
00:18:26.920 -->
00:18:27.960Enough of this fun, Brian.
00:18:27.960 -->
00:18:29.100Let's get down to business.
00:18:29.100 -->
00:18:29.380Okay.
00:18:29.380 -->
00:18:31.260Polars business, that is.
00:18:31.260 -->
00:18:32.760This comes from Marco Gorelli.
00:18:32.760 -->
00:18:36.420And this is just a simple plugin for Polars.
00:18:36.420 -->
00:18:41.020Now, if you don't know Polars, Polars is like Pandas with two major differences.
00:18:41.020 -->
00:18:43.780It has a lazy, fluent API.
00:18:43.780 -->
00:18:49.020So 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.600through them kind of like generators and those sorts of things.
00:18:51.600 -->
00:18:53.880And it's written in Rust to be super, super fast.
00:18:53.880 -->
00:18:56.460So this is a plugin for Polars.
00:18:56.460 -->
00:19:02.760And the idea is it lets you answer questions like how many business days between now and then.
00:19:02.760 -->
00:19:10.520So 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.960But one of those days is the 4th of July.
00:19:12.960 -->
00:19:14.140And then there's the weekend.
00:19:14.140 -->
00:19:18.920And then there's like how many days, you know, calendar math is already gnarly.
00:19:19.740 -->
00:19:24.280If you want to like throw in skipping weekends, skipping holidays, even worse, right?
00:19:24.280 -->
00:19:25.720So super simple.
00:19:25.720 -->
00:19:28.640This thing, the extension itself is written in Rust.
00:19:28.640 -->
00:19:30.660So it's kind of compatible with Polars.
00:19:30.660 -->
00:19:34.620I believe Polars has actually a Rust API as well as a Python API.
00:19:34.620 -->
00:19:36.660So maybe this is available there.
00:19:36.660 -->
00:19:38.040I have zero information about that.
00:19:38.620 -->
00:19:42.460All you do is you can even define your own holidays and weekends.
00:19:42.460 -->
00:19:44.980Like every Wednesday, I'm taking it off, whatever.
00:19:44.980 -->
00:19:52.340So the way it works is you just go import Polars and then Polars business.
00:19:52.340 -->
00:20:00.340Somewhere down here, you can go to grab a column, say offset by and just say 5 BD.
00:20:00.900 -->
00:20:05.920And 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.060And using vector math, convert those to five days ahead by however they offset, like each one individually.
00:20:12.060 -->
00:20:12.880That's pretty awesome, right?
00:20:12.880 -->
00:20:13.500Yeah.
00:20:13.500 -->
00:20:14.020Fun.
00:20:14.300 -->
00:20:15.640Yeah, I don't know how that works.
00:20:15.640 -->
00:20:17.140That sounds complicated.
00:20:17.140 -->
00:20:20.640But yeah, so you can put in like, what are your weekend days?
00:20:20.640 -->
00:20:22.640What are your others?
00:20:22.640 -->
00:20:28.700You 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.500They're open on Friday and Saturday.
00:20:30.500 -->
00:20:39.300So 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.820Nice.
00:20:39.820 -->
00:20:40.380Yeah.
00:20:40.500 -->
00:20:46.240Well, 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.060So many times, so much time off.
00:20:49.060 -->
00:20:49.480Yeah.
00:20:49.480 -->
00:20:56.060Like in like teacher non-work days, which or whatever, it's the teachers are still working.
00:20:56.060 -->
00:20:57.920It's just the students aren't working.
00:20:57.920 -->
00:21:00.060They should call it student non-work days.
00:21:00.060 -->
00:21:01.600They should.
00:21:01.600 -->
00:21:02.100Yeah.
00:21:02.100 -->
00:21:04.500Like my daughter is like, oh, I don't have school this week.
00:21:04.500 -->
00:21:05.420I don't have school this week.
00:21:05.420 -->
00:21:05.640Why?
00:21:05.640 -->
00:21:06.960Like, oh, it's parent teacher conference.
00:21:06.960 -->
00:21:08.300Oh, my.
00:21:08.300 -->
00:21:08.760Okay.
00:21:09.060 -->
00:21:09.420Yeah.
00:21:09.420 -->
00:21:15.180My daughter even calls, they call it, her friends call it like no school November.
00:21:15.180 -->
00:21:16.560Yes, exactly.
00:21:16.560 -->
00:21:17.640Exactly.
00:21:17.640 -->
00:21:18.340Anyway.
00:21:18.340 -->
00:21:19.460All right.
00:21:19.460 -->
00:21:20.900So that would be good for that.
00:21:20.900 -->
00:21:23.700Or lots of other businesses have wacky holidays.
00:21:23.700 -->
00:21:25.900So people can check this out.
00:21:25.900 -->
00:21:30.800It'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.200Yeah.
00:21:31.200 -->
00:21:31.780All right, Brian.
00:21:31.780 -->
00:21:33.200How extra do you feel today?
00:21:33.520 -->
00:21:35.020I just have one extra.
00:21:35.020 -->
00:21:42.600And 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.260pie test course.
00:21:43.480 -->
00:21:48.240And it is one word, Black Friday, all caps, just that.
00:21:48.240 -->
00:21:51.460And you get 50% off the course.
00:21:51.460 -->
00:21:53.040So check it out.
00:21:53.040 -->
00:21:56.160And over the break, I did a whole bunch on it.
00:21:56.300 -->
00:21:59.160So I've up to, what, chapter 13.
00:21:59.160 -->
00:22:00.860Oh, chapter 13 was great.
00:22:00.860 -->
00:22:02.160I wanted to talk about that a little bit.
00:22:02.160 -->
00:22:03.800Chapter 13 was on debugging.
00:22:04.460 -->
00:22:19.260And 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.400And then once everything was green, going back and doing a refactoring.
00:22:23.560 -->
00:22:29.160And then explored, I enjoyed learning this anyway.
00:22:29.160 -->
00:22:36.520So it was exploring testing or debugging using pytest plus PDB for the Python debugger.
00:22:36.520 -->
00:22:40.340One of the cool things about learning PDB is you can use it with talks.
00:22:40.340 -->
00:22:47.180So 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.860So anyway, that's still up.
00:22:49.860 -->
00:22:51.360And that's my extra.
00:22:51.360 -->
00:22:52.000How about you?
00:22:52.000 -->
00:22:52.600Very cool.
00:22:52.760 -->
00:22:55.540Yeah, congrats on getting chapter 13 up.
00:22:55.540 -->
00:22:59.360And I think debugging 13, I think stuff could go, that's perfect.
00:22:59.360 -->
00:23:02.760As long as you didn't release the chapter on Friday the 13th, everything will be fine.
00:23:02.760 -->
00:23:03.180Right.
00:23:03.180 -->
00:23:05.100I got a few things.
00:23:05.100 -->
00:23:10.580First, there was, like, a really heartfelt message from Kenneth Reitz that he posted on X Twitter.
00:23:10.580 -->
00:23:19.020And 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.780You up for that, Brian?
00:23:19.780 -->
00:23:20.160Yeah.
00:23:20.160 -->
00:23:20.660All right.
00:23:20.920 -->
00:23:28.120Kenneth, 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.120Python, my name is Kenneth Reitz.
00:23:30.120 -->
00:23:35.420I'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.660Today, 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.360It's a path that, while rewarding, is often fraught with challenges and moments of self-doubt.
00:23:49.360 -->
00:23:54.280I'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.800In 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.900These are feelings I'm sure many can relate to.
00:24:06.900 -->
00:24:19.340But 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.460Your 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.240So, 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.620It goes on. I'll let people read it. I'll link to it in the show notes.
00:24:33.620 -->
00:24:37.560But 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.120Yeah.
00:24:38.120 -->
00:24:43.200I 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.340And 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.320All right, so that's one.
00:24:55.320 -->
00:25:01.140Remember last time I talked about Python 3.13.0 alpha 1 being out?
00:25:01.140 -->
00:25:07.420Well, 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.880So, I just wanted to link over to that.
00:25:08.880 -->
00:25:17.660Really, 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.300But 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.660It'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.940Go find another way to implement your Telnet client instead of the standard library and so on.
00:25:32.940 -->
00:25:37.520So, alpha 3 will be scheduled for December 19th.
00:25:37.520 -->
00:25:42.480So, we can round out our year with a third Python 3.13 alpha release.
00:25:42.900 -->
00:25:43.960So, that's nice and quick.
00:25:43.960 -->
00:25:50.380And 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.800And just, we raised a bunch of money for charity, which is awesome.
00:25:54.800 -->
00:25:57.180So, really happy to have done that.
00:25:57.180 -->
00:26:00.520So, just a bit of a heartfelt thanks on my end for people who participated.
00:26:00.520 -->
00:26:01.980All right, ready for a joke?
00:26:01.980 -->
00:26:02.660Yeah.
00:26:02.660 -->
00:26:06.060The joke is called Select Star, and I think we can all relate to it.
00:26:06.060 -->
00:26:06.360Okay.
00:26:06.360 -->
00:26:09.720So, Select Star being theoretically a bad thing.
00:26:09.720 -->
00:26:11.680Can I get this image all the way over?
00:26:11.680 -->
00:26:12.360No, not really.
00:26:12.620 -->
00:26:12.800Okay.
00:26:12.800 -->
00:26:16.960So, the question here says, it's a person.
00:26:16.960 -->
00:26:20.480I think this is Will Smith from iRobot kind of type of thing.
00:26:20.480 -->
00:26:21.320Anyway, it doesn't really matter.
00:26:21.320 -->
00:26:25.520The developer says, can an AI really write efficient SQL queries?
00:26:25.520 -->
00:26:27.940And the AI looks back at the developer and goes, can you?
00:26:27.940 -->
00:26:29.280The developer goes, hmm.
00:26:29.280 -->
00:26:31.640Maybe not.
00:26:31.640 -->
00:26:38.140And, 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.840Like, pretty much the worst thing you can do for performance.
00:26:40.840 -->
00:26:41.600Like, give me everything.
00:26:41.600 -->
00:26:42.400I don't care if I use it.
00:26:42.400 -->
00:26:42.800Right.
00:26:42.800 -->
00:26:45.740I know there's like a 10 kilobyte per row description.
00:26:45.740 -->
00:26:47.260I don't need that.
00:26:47.260 -->
00:26:48.040Just give it to me anyway.
00:26:48.040 -->
00:26:54.840I think this is like the ideal use case for using an AI is optimizing SQL queries.
00:26:54.840 -->
00:26:55.600Yeah.
00:26:55.600 -->
00:26:56.080Yeah.
00:26:56.080 -->
00:26:56.680Anyway.
00:26:56.680 -->
00:26:58.300I wouldn't trust.
00:26:58.300 -->
00:27:00.340I don't trust myself with production SQL.
00:27:01.500 -->
00:27:05.380Can an AI really write efficient SQL queries?
00:27:05.380 -->
00:27:06.040Can you?
00:27:06.040 -->
00:27:06.400Okay.
00:27:06.400 -->
00:27:07.580Okay.
00:27:07.580 -->
00:27:10.020Well, I see some agreement in the audience out there as well.
00:27:10.020 -->
00:27:10.520Very nice.
00:27:10.520 -->
00:27:15.440I want to add a just a funny thing that my wife shared with me yesterday.
00:27:16.080 -->
00:27:23.260And 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.060grew it out.
00:27:24.060 -->
00:27:26.160And now I have longish hair.
00:27:26.160 -->
00:27:28.180I would say that counts as long.
00:27:28.180 -->
00:27:33.860And so often it's pulled back, but it's often not also.
00:27:34.060 -->
00:27:40.060So I wanted to share this, this funny thing that my, my wife shared said, I admire those
00:27:40.060 -->
00:27:40.920with hairstyles.
00:27:40.920 -->
00:27:42.080I don't have a hairstyle.
00:27:42.080 -->
00:27:42.780I have hair.
00:27:42.780 -->
00:27:44.160Most are most days.
00:27:44.160 -->
00:27:46.000It has zero caterpillars in it.
00:27:46.000 -->
00:27:47.560That's as good as it gets.
00:27:47.560 -->
00:27:52.620So a girl, woman with like long flowing air.
00:27:52.620 -->
00:27:55.380I just, honestly, the length is about the same as yours right now.
00:27:55.380 -->
00:27:56.000So that's pretty awesome.
00:27:56.000 -->
00:28:00.700And apparently this was, that came up by Tom Cox.
00:28:00.700 -->
00:28:01.720So that's funny.
00:28:01.720 -->
00:28:02.180Anyway.
00:28:02.180 -->
00:28:02.680Yeah.
00:28:02.680 -->
00:28:03.240Very good.
00:28:03.500 -->
00:28:05.020Well, also a very good episode.
00:28:05.020 -->
00:28:07.040Good to be back with you and with everyone.
00:28:07.040 -->
00:28:07.600Yeah.
00:28:07.600 -->
00:28:08.200Thank you.
00:28:08.200 -->
00:28:08.580Yeah.
00:28:08.580 -->
00:28:08.840You bet.
00:28:08.840 -->
00:28:09.740Thanks everyone for listening.