WEBVTT

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

00:00:04.800 --> 00:00:11.600
This is episode 377, recorded April 2nd, 2024, so it's not an April Fool's joke.

00:00:11.600 --> 00:00:13.340
And I am Brian Okken.

00:00:13.340 --> 00:00:14.780
I am Michael Kennedy.

00:00:14.780 --> 00:00:18.440
This episode is sponsored by Scout APM.

00:00:18.440 --> 00:00:21.240
Please listen to their segment later in the show.

00:00:21.240 --> 00:00:30.360
If you want to connect with us, we're at Fosstodon on Mastodon at Adam Kennedy @brianokken and at Python Bytes at fosstodon.org.

00:00:30.360 --> 00:00:36.600
And if you'd like to join us live for the live show, show up at pythonbytes.fm/live.

00:00:36.600 --> 00:00:41.800
Actually, you can just go there anytime and it tells you when the next recording is so you can put it on your calendar.

00:00:41.800 --> 00:00:56.640
And finally, if you want an artisanal handcrafted digest of every week of show notes in your email, so maybe you don't want to take notes while you're listening or you miss an episode, you can get it right in your email.

00:00:56.640 --> 00:01:03.040
Just go to the pythonbytes.fm and look for friends of the show and you'll get an email.

00:01:03.040 --> 00:01:05.940
Yeah, that's a cool thing we just started doing.

00:01:05.940 --> 00:01:11.240
So if you want to just, you don't have time to listen or you forget to show up for an episode, it'll just show up.

00:01:11.240 --> 00:01:13.040
And I love the artisanal part, Brian.

00:01:13.040 --> 00:01:13.760
Well done on that.

00:01:13.760 --> 00:01:16.240
Very, it's very craftsman-like.

00:01:16.240 --> 00:01:18.140
Yeah, anyway.

00:01:18.140 --> 00:01:20.680
I just want to talk about paths today.

00:01:20.680 --> 00:01:21.540
Can we just talk about paths?

00:01:21.540 --> 00:01:22.640
Yeah, just paths.

00:01:22.640 --> 00:01:23.180
Nothing else.

00:01:23.180 --> 00:01:24.060
No, nothing.

00:01:24.060 --> 00:01:24.580
Just paths.

00:01:24.580 --> 00:01:26.080
Actually, that's what it's called.

00:01:26.080 --> 00:01:26.860
Just paths.

00:01:26.860 --> 00:01:33.500
Okay, so here's a tool that is built in Python and just is just a language.

00:01:33.500 --> 00:01:35.180
It's 1.2% just.

00:01:35.380 --> 00:01:35.700
I don't know.

00:01:35.700 --> 00:01:36.760
This is too meta.

00:01:36.760 --> 00:01:41.780
Anyway, it's a quick CLI tool built with Python.

00:01:41.780 --> 00:01:46.780
And when you hear that, the first thing you should think is, PipX install the thing.

00:01:46.780 --> 00:01:50.260
Because that's how you install CLI tools for Python, right?

00:01:50.260 --> 00:01:51.900
It gets managed on its own.

00:01:51.900 --> 00:01:54.660
It's upgradable through PipX and all the things.

00:01:54.660 --> 00:01:55.820
They made a little mistake here.

00:01:55.820 --> 00:01:59.040
Like, I should do a PR and put an X on the PipX install just path.

00:01:59.040 --> 00:01:59.520
Okay.

00:01:59.560 --> 00:02:00.360
So what is this thing?

00:02:00.360 --> 00:02:05.980
What it does is it's for Windows and macOS, I believe is what it's for.

00:02:05.980 --> 00:02:06.680
No.

00:02:06.680 --> 00:02:09.620
Windows, Linux, and macOS as well.

00:02:09.620 --> 00:02:12.120
Because it basically pretends macOS is Linux.

00:02:12.120 --> 00:02:19.080
And what it does is it will look at your path variable and see, help you determine if it's good.

00:02:19.160 --> 00:02:23.700
So if you want to answer questions like, when I type Python, I always get Python 2.

00:02:23.700 --> 00:02:24.560
Why is that?

00:02:24.560 --> 00:02:27.840
When I type Python, I get Python 3.10, but I have 3.12 installed.

00:02:27.840 --> 00:02:28.640
Why is that?

00:02:29.600 --> 00:02:35.380
When I pip install or PipX install a thing, it claims that stuff that gets installed by it won't be in the path.

00:02:35.380 --> 00:02:36.480
Wait, I thought it was.

00:02:36.480 --> 00:02:37.080
Oh, no, wait.

00:02:37.080 --> 00:02:38.860
That was 3.11, not the 3.12 version of that.

00:02:38.860 --> 00:02:41.700
All these complicated little weird things that you run into all the time.

00:02:41.700 --> 00:02:45.680
This is just a CLI tool that you just say, tell me how am I doing?

00:02:45.680 --> 00:02:47.220
What is my path?

00:02:47.220 --> 00:02:48.040
What stuff?

00:02:48.040 --> 00:02:54.060
Like, do I have something in my path that links to a directory, but the directory is no longer there?

00:02:54.060 --> 00:03:06.100
So, for example, if I have Python 3.10 in my path, but I've uninstalled Python 3.10, but it's still in my .cshrc or bashrc file or Windows path environment variables or whatever, right?

00:03:06.100 --> 00:03:06.780
That kind of stuff.

00:03:06.780 --> 00:03:07.420
Cool, huh?

00:03:07.420 --> 00:03:09.000
Yeah, actually, very cool.

00:03:09.000 --> 00:03:10.940
Yeah, so it does a bunch of different things.

00:03:10.940 --> 00:03:14.220
It can do just --raw to show you what it is.

00:03:14.220 --> 00:03:20.320
You can just run it by itself, and it gives you this colored output of each element in your path.

00:03:20.480 --> 00:03:28.520
So it parses the path, and then it goes line by line and tells you green this exists, yellow it's a duplicate of something that was there before.

00:03:28.520 --> 00:03:35.680
So if you have something in your path multiple times, maybe it's earlier and later, and you thought it should be later, so that's also a weird thing going on.

00:03:35.680 --> 00:03:39.300
Or it'll turn it red if there are some that don't exist.

00:03:39.300 --> 00:03:39.900
Yeah?

00:03:39.900 --> 00:03:40.860
So that's pretty cool.

00:03:40.860 --> 00:03:44.000
You can ask for just the invalids just for the duplicates.

00:03:44.000 --> 00:03:48.020
You can ask it to follow symlinks and then resolve whether those are duplicates or not.

00:03:48.440 --> 00:03:53.660
And then you can say, give me a corrected version as a string or not as a string, as a list.

00:03:53.660 --> 00:03:58.640
And then that will let you basically remove the duplicates, remove the missings, and go from there.

00:03:58.640 --> 00:04:02.120
There's a little video here that's a giffy or something.

00:04:02.120 --> 00:04:02.600
I don't know.

00:04:02.600 --> 00:04:09.640
But if you want to watch the video, you can pull it up, and you'll see what it looks like when it runs and all the colors and stuff.

00:04:09.640 --> 00:04:11.860
But it's super easy to try out.

00:04:11.860 --> 00:04:14.240
So I recommend people check out JustPath.

00:04:14.240 --> 00:04:15.700
I think it's handy.

00:04:15.700 --> 00:04:17.800
My score is not that amazing.

00:04:17.800 --> 00:04:18.880
I just ran it, Brian.

00:04:18.880 --> 00:04:20.320
42 directories in my path.

00:04:20.320 --> 00:04:21.760
12 do not exist.

00:04:21.760 --> 00:04:22.960
Fully 12 of them.

00:04:22.960 --> 00:04:25.180
And four of which that do are duplicates.

00:04:25.180 --> 00:04:25.840
Yeah.

00:04:25.840 --> 00:04:28.200
I've got a bunch of problems with mine.

00:04:28.200 --> 00:04:28.760
Okay.

00:04:28.760 --> 00:04:29.980
Who knew, right?

00:04:30.200 --> 00:04:33.140
Well, you kind of keep things around.

00:04:33.140 --> 00:04:34.640
You install stuff, change things.

00:04:34.640 --> 00:04:34.820
Yeah.

00:04:34.820 --> 00:04:36.460
This stuff is write only, right?

00:04:36.460 --> 00:04:38.060
Why would you take stuff out of your path?

00:04:38.060 --> 00:04:40.320
You just keep adding to it and adding to it.

00:04:40.320 --> 00:04:44.420
But then, like you say, you uninstall things, stuff changes, et cetera.

00:04:44.420 --> 00:04:44.860
Yeah.

00:04:44.860 --> 00:04:52.500
I have added my user's Okken.local slash bin.

00:04:52.500 --> 00:04:56.600
Apparently, that doesn't exist anymore, and I don't even remember ever using that.

00:04:56.600 --> 00:04:58.320
Okay.

00:04:58.320 --> 00:04:59.560
Cool.

00:04:59.880 --> 00:05:00.180
Interesting.

00:05:00.180 --> 00:05:00.640
Yeah.

00:05:00.640 --> 00:05:02.980
It's easy to adopt and use.

00:05:02.980 --> 00:05:05.920
You just pipX install it, and you just run the thing, and it tells you what's up.

00:05:05.920 --> 00:05:06.380
Cool.

00:05:06.380 --> 00:05:08.500
Well, that's exciting.

00:05:08.500 --> 00:05:11.180
I have, like, you know, doom and gloom next.

00:05:11.180 --> 00:05:12.740
Oh, no.

00:05:12.740 --> 00:05:13.360
Yeah.

00:05:13.360 --> 00:05:15.380
The XZ backdoor.

00:05:15.380 --> 00:05:18.980
I don't know if everybody's heard about this.

00:05:18.980 --> 00:05:22.320
It just really sort of popped up last Friday, so it's fairly recent.

00:05:22.320 --> 00:05:24.380
Have you been keeping up on XZ?

00:05:24.380 --> 00:05:28.160
Yeah, it definitely has caught my attention and makes me quite nervous.

00:05:28.620 --> 00:05:35.840
I think we just missed this in getting released to basically every server on the internet,

00:05:35.840 --> 00:05:36.960
which is really good.

00:05:36.960 --> 00:05:37.920
Yeah.

00:05:37.920 --> 00:05:38.000
Yeah.

00:05:38.000 --> 00:05:38.080
Yeah.

00:05:38.080 --> 00:05:38.160
Yeah.

00:05:38.160 --> 00:05:44.620
So if you've just sort of heard about it, I'm going to provide a lot of articles on it,

00:05:44.620 --> 00:05:46.080
and some of it has good information.

00:05:46.080 --> 00:05:51.000
Some of it has dubious, a little bit, maybe opinionated stuff, which is fine.

00:05:51.460 --> 00:05:55.060
But I'm linking to an article from Evan Bowen.

00:05:55.060 --> 00:05:56.180
Evan Bowes?

00:05:56.180 --> 00:05:57.540
B-O-E-H-S.

00:05:57.540 --> 00:05:58.900
Not sure how to pronounce that.

00:05:58.900 --> 00:05:59.240
Anyway.

00:05:59.240 --> 00:06:01.960
Everything I know about the XZ backdoor.

00:06:01.960 --> 00:06:07.200
And it's a fairly curated timeline of what the backdoor is.

00:06:07.200 --> 00:06:10.100
But, well, it's about the timeline of how it happened.

00:06:10.100 --> 00:06:15.720
But the gist, if you haven't heard about it, this is that there was a backdoor added to,

00:06:15.720 --> 00:06:17.240
I think it's XZ Utils.

00:06:17.240 --> 00:06:22.500
XZ is the compression or like an unzipper, zipper, unzipper sort of thing.

00:06:23.320 --> 00:06:28.180
And archive tool for Linux and other Unix-like distributions.

00:06:28.180 --> 00:06:33.280
So it's a weird story that start this multi-year.

00:06:33.280 --> 00:06:42.060
That's the part that's freaky, is a little utility that's included everywhere that starting

00:06:42.060 --> 00:06:48.680
in 2021, somebody, well, they went by the name of GIA Tan, but nobody really believes

00:06:48.680 --> 00:06:54.440
that that's really their name, started contributing to open source, added a patch.

00:06:54.440 --> 00:06:58.400
And these patches were added like in long, long times apart.

00:06:58.400 --> 00:07:05.460
And then ended up becoming a maintainer of XZ and then creating in part of the test code.

00:07:05.460 --> 00:07:13.800
And there wasn't a vulnerability in GitHub, but there was in the distributed TAR release.

00:07:13.800 --> 00:07:14.580
I don't know.

00:07:14.580 --> 00:07:17.460
There's a lot of details that I didn't quite follow all of it.

00:07:17.780 --> 00:07:20.020
However, yuck and weird.

00:07:20.020 --> 00:07:24.840
And so the part that I want to talk about really is one, you should just be aware of this.

00:07:24.840 --> 00:07:26.040
And we're going to link to a good article.

00:07:26.040 --> 00:07:26.940
I think it's-

00:07:26.940 --> 00:07:31.760
Brian, before you go on a little farther, because before we watch this, the real basics of it,

00:07:31.760 --> 00:07:41.720
basically this vulnerability was intentionally put there as a backdoor to break open SSH connections.

00:07:41.720 --> 00:07:50.480
So the idea was if you can SSH to your server, this was going to give other people SSH access to your server, which is extraordinarily bad.

00:07:50.480 --> 00:07:50.920
Yeah.

00:07:50.920 --> 00:07:51.040
Yeah.

00:07:51.040 --> 00:07:53.760
And SSH into it with root access.

00:07:53.760 --> 00:07:56.620
So they have like full access, really.

00:07:56.620 --> 00:07:57.540
Yeah.

00:07:57.540 --> 00:07:57.980
Terrible.

00:07:57.980 --> 00:07:59.340
Would have been a terrible backdoor.

00:07:59.340 --> 00:08:00.360
Glad it got caught.

00:08:00.360 --> 00:08:16.720
So it got caught by like somebody at Microsoft, Microsoft Postgres team, I think, looking at some of their over like an update of XZ causing or actually a slowdown in some of their, I think it was in their test suite or something.

00:08:16.720 --> 00:08:22.220
They were running micro benchmarks and they saw like a 600 millisecond slowdown or something like, geez, that's weird.

00:08:22.220 --> 00:08:23.420
How about that?

00:08:23.420 --> 00:08:24.360
Testing for the win, Brian.

00:08:24.360 --> 00:08:24.940
Yeah.

00:08:24.940 --> 00:08:28.920
And then also, I guess, Valgrind caught some problems with it as well.

00:08:29.960 --> 00:08:39.500
So I guess good thing that people were paying attention to that and then tracked it down fairly rapidly to a update of XZ.

00:08:39.500 --> 00:08:45.000
And then, but then some of the unraveling of this is just, okay, so there was a vulnerability.

00:08:45.000 --> 00:08:46.220
It got caught.

00:08:46.220 --> 00:08:47.060
People are updating.

00:08:47.060 --> 00:08:50.540
That's good because you really don't want this here.

00:08:50.740 --> 00:08:56.180
However, some of the ways in which this happened are disturbing.

00:08:56.180 --> 00:09:08.620
And so that's why I think it's useful to read up on this a little bit, partly because this XZ utility was not, it's mostly maintained by one person over years.

00:09:08.620 --> 00:09:09.100
Right.

00:09:09.100 --> 00:09:26.360
So, and then somebody comes along and wants a patch and is sort of, there's some, some sort of kind of not nice things said, including things like clearly don't, don't do patches to this because they're, they don't, the current maintainers lost interest or doesn't care anymore.

00:09:27.040 --> 00:09:39.260
So, and then they're saying mean things like this kind of pressured, then this is way back in 2022, pressuring the person into adding another maintainer, then, Hey, there's another maintainer ready and they're adding garbage to it.

00:09:39.260 --> 00:09:39.580
So.

00:09:39.580 --> 00:09:44.120
And they just happened to work for some state sponsored hacker group.

00:09:44.120 --> 00:09:46.500
I'm sure they'll do a good job maintaining it for us.

00:09:46.500 --> 00:09:47.100
Yeah.

00:09:47.100 --> 00:09:49.400
So maybe.

00:09:49.400 --> 00:09:55.580
And, and there's, you know, basically, I guess, watch out for this, but also I think.

00:09:55.580 --> 00:09:59.280
So one of the things I wanted to talk about is how do we, how do we avoid stuff like this?

00:09:59.280 --> 00:10:05.340
This is, I don't have an answer for it, but there's a lot of people discussing like, what do we do about it?

00:10:05.340 --> 00:10:13.300
Including a glyph whose answer may have been just is I'm willing to link to his article called software needs to be more expensive.

00:10:13.300 --> 00:10:14.080
Essentially.

00:10:14.080 --> 00:10:16.380
We, we get a lot of free software.

00:10:16.380 --> 00:10:24.340
Maybe we should start paying the maintainers so that people, I mean, burnout is a real thing, but you pay people, they will work on stuff or somebody else will.

00:10:25.120 --> 00:10:26.840
However, don't think that's this.

00:10:26.840 --> 00:10:29.960
That's quite one of the interesting, his idea.

00:10:29.960 --> 00:10:38.060
I'll just mention this because I think it's interesting is he's got an idea called just JGMM, just give maintainers money.

00:10:38.120 --> 00:10:42.640
And his idea is not to have companies try to figure out who to give money to.

00:10:42.640 --> 00:10:51.680
It's, it's a, his idea is just give every software engineer with your company a discretionary budget of like, say, 50 bucks a month or whatever you want to do.

00:10:52.000 --> 00:10:56.480
And, and they can distribute that money to open source maintainers however they want.

00:10:56.480 --> 00:10:57.820
Interesting idea.

00:10:57.820 --> 00:11:02.520
I don't think if, even if that was in place, I don't think that it, which I think is a good idea.

00:11:02.840 --> 00:11:06.480
I don't think it would be, have gone to XZ really.

00:11:07.760 --> 00:11:15.960
Cause I would have thought things like, you know, Django or, you know, it's Python, but, but would I give money to a little zip utility?

00:11:15.960 --> 00:11:16.600
Probably not.

00:11:16.600 --> 00:11:17.340
Anyway.

00:11:17.720 --> 00:11:21.520
So I think this is a good thing to keep up on.

00:11:21.520 --> 00:11:26.380
And, and I do this idea of like bringing on maintainers.

00:11:26.380 --> 00:11:31.900
You didn't have to be able to do that, but you have to, how do you tell somebody who's going to be malicious a couple of years from now?

00:11:31.900 --> 00:11:32.480
I don't know.

00:11:32.480 --> 00:11:35.680
That's, that's how do you, I don't think you can check for it.

00:11:35.680 --> 00:11:36.960
It is tough.

00:11:36.960 --> 00:11:37.460
Yeah.

00:11:37.460 --> 00:11:40.800
That person, that person played the long game for sure.

00:11:40.800 --> 00:11:41.460
Yeah.

00:11:41.460 --> 00:11:44.900
So I thought, well, okay, well, I don't run any servers, so I'm fine.

00:11:44.900 --> 00:11:53.260
But then I ran across Jeff Triplett's article called upgrade, update and upgrade homebrew and the XZ versions.

00:11:53.260 --> 00:11:54.320
I'm like, what?

00:11:54.320 --> 00:11:54.900
Yeah.

00:11:54.900 --> 00:11:59.820
So if you, you should, if you run homebrew on your Mac, you should run brew info XZ.

00:11:59.820 --> 00:12:05.840
And if, if it shows up at 5.6 X you need to update.

00:12:05.840 --> 00:12:09.320
And sure enough, I had the vulnerability on my machine.

00:12:09.320 --> 00:12:14.680
I checked it and I was, I was out of date or I actually, I was, I had upgraded.

00:12:14.680 --> 00:12:15.300
To the new one.

00:12:15.300 --> 00:12:16.800
Thanks.

00:12:16.800 --> 00:12:17.340
Yeah.

00:12:17.340 --> 00:12:17.960
I just checked.

00:12:17.960 --> 00:12:20.080
I don't seem to have it, which is very good.

00:12:20.080 --> 00:12:20.860
I don't know.

00:12:20.860 --> 00:12:23.860
But the thing is you probably didn't install XZ.

00:12:23.860 --> 00:12:24.960
You probably installed.

00:12:24.960 --> 00:12:25.420
Yeah.

00:12:25.420 --> 00:12:30.020
Other thing, which depended on something, which depended on XZ, which is all parts of the supply

00:12:30.020 --> 00:12:31.620
chain problems, which is scary.

00:12:31.620 --> 00:12:32.060
Yeah.

00:12:32.060 --> 00:12:36.860
But I guess, thanks dude at Microsoft that found this.

00:12:36.860 --> 00:12:38.020
Yeah, indeed.

00:12:38.240 --> 00:12:43.160
You know, you say you probably would think that the 50 bucks wouldn't go to XZ, but I

00:12:43.160 --> 00:12:44.540
really like Glyph's article.

00:12:44.540 --> 00:12:46.180
First of all, well done Glyph.

00:12:46.180 --> 00:12:49.740
That was a very nice article you wrote and I enjoyed reading it.

00:12:50.000 --> 00:12:51.880
It's also a very thoughtful idea.

00:12:51.880 --> 00:12:58.340
I think his idea is basically instead of trying to get large companies to come on and be sponsors

00:12:58.340 --> 00:12:59.960
of open source projects.

00:12:59.960 --> 00:13:04.740
Usually that's a huge negotiation and there's all sorts of stuff and right.

00:13:04.740 --> 00:13:05.360
It's just not easy.

00:13:05.360 --> 00:13:07.880
Just give everybody 50 bucks a year or a month.

00:13:07.880 --> 00:13:08.320
I can't remember.

00:13:08.380 --> 00:13:09.660
I think it was maybe a month.

00:13:09.660 --> 00:13:14.580
Anyway, give people a card and they could just donate it to whichever open source project

00:13:14.580 --> 00:13:15.680
that they would like.

00:13:15.680 --> 00:13:20.440
And I agree if there's a thousand people that did that, Brian, that XZ probably wouldn't

00:13:20.440 --> 00:13:20.780
make it.

00:13:20.780 --> 00:13:25.880
But wouldn't it be awesome if there was a world where there were so many people who were

00:13:25.880 --> 00:13:30.180
just donating to open source that it became super lucrative that second tier projects were

00:13:30.180 --> 00:13:35.960
even potentially full-time things like rockstar developers, you know, like ballers are rolling

00:13:35.960 --> 00:13:42.000
up in their Ferrari because they're running FastAPI or, you know, Sebastian is doing that.

00:13:42.000 --> 00:13:43.140
I mean, that would be really cool.

00:13:43.140 --> 00:13:47.480
Think of how much more open source to get created if it was sort of a gold rush as well.

00:13:47.480 --> 00:13:50.260
So yeah, I think it would be neat.

00:13:50.260 --> 00:13:55.940
And also even not necessarily a full-time job, but just to be able to say, even if I have to

00:13:55.940 --> 00:14:04.200
take the time unpaid from my normal job, if I took like a day a week off and just worked

00:14:04.200 --> 00:14:06.460
on open source, my open source project instead.

00:14:06.460 --> 00:14:08.560
And sometimes it's not even adding features.

00:14:08.560 --> 00:14:12.960
It's just going through issues, doing all of the bookkeeping and the maintenance and everything.

00:14:12.960 --> 00:14:13.440
There's a lot.

00:14:13.440 --> 00:14:13.920
Review PRs.

00:14:13.920 --> 00:14:14.520
Yeah.

00:14:14.520 --> 00:14:16.420
Or maybe you're a consultant.

00:14:16.420 --> 00:14:18.880
You take one for your clients on something like that, right?

00:14:18.880 --> 00:14:19.900
Yeah, exactly.

00:14:19.900 --> 00:14:21.120
So thanks for that.

00:14:21.120 --> 00:14:21.220
Very cool.

00:14:21.220 --> 00:14:21.740
Yeah.

00:14:21.740 --> 00:14:22.340
Yeah.

00:14:22.340 --> 00:14:23.180
I'm glad you covered this.

00:14:23.180 --> 00:14:26.980
Well, we would like to thank Scout APM for sponsoring this episode.

00:14:26.980 --> 00:14:27.740
Thanks, Scout.

00:14:28.240 --> 00:14:31.900
Let me tell you real quick about Scout APM.

00:14:31.900 --> 00:14:35.620
They're big supporters of Python Bytes, so we appreciate that very much.

00:14:35.620 --> 00:14:41.620
So if you are tired of spending hours trying to find the root cause of issues impacting your

00:14:41.620 --> 00:14:44.960
performance, then you owe it to yourself to check out Scout APM.

00:14:44.960 --> 00:14:51.220
They're a leading Python application performance monitoring tool, APM, that helps you identify

00:14:51.220 --> 00:14:54.220
and solve performance abnormalities faster and easier.

00:14:54.880 --> 00:14:59.760
Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and

00:14:59.760 --> 00:15:05.340
the dreaded N plus one queries that you can end up if you do lazy loading in your ORM.

00:15:05.340 --> 00:15:07.740
And then you say, oh, no, why is it so slow?

00:15:07.740 --> 00:15:10.100
Why are you doing 200 database queries for what should be one?

00:15:10.100 --> 00:15:12.060
So you can find out things like that.

00:15:12.060 --> 00:15:16.460
And it links it back directly to source code so you can spend less time in the debugger and

00:15:16.460 --> 00:15:19.440
tailing logs and just finding the problems and moving on.

00:15:19.440 --> 00:15:22.680
And you'll love it because it's built for developers by developers.

00:15:22.680 --> 00:15:24.340
It makes it easy to get set up.

00:15:24.340 --> 00:15:26.860
Seriously, you can do it in less than four minutes.

00:15:26.860 --> 00:15:27.700
So that's awesome.

00:15:27.700 --> 00:15:30.740
And the best part is the pricing is straightforward.

00:15:30.740 --> 00:15:36.300
You only pay for the data that you use with no hidden overage fees or per seat pricing.

00:15:36.300 --> 00:15:38.820
And I just learned this, Brian.

00:15:38.820 --> 00:15:43.980
They also have they provide the pro version for free to all open source projects.

00:15:43.980 --> 00:15:48.520
So if you're an open source maintainer and you want to have Scout APM for that project,

00:15:48.520 --> 00:15:51.420
just shoot them a message or something on their pricing page about that.

00:15:51.420 --> 00:15:55.300
So you can start your free trial and get instant insights today.

00:15:55.300 --> 00:15:58.000
Visit by them by set of him slash Scout.

00:15:58.000 --> 00:16:00.240
The link is in your podcast player show notes as well.

00:16:00.240 --> 00:16:01.640
And please use that link.

00:16:01.640 --> 00:16:05.620
Don't just search for them because otherwise they don't think you came from us.

00:16:05.620 --> 00:16:07.200
And then they'd stop supporting the show.

00:16:07.200 --> 00:16:09.780
So please use our link by them by set of him slash Scout.

00:16:09.780 --> 00:16:10.700
Check them out.

00:16:10.800 --> 00:16:13.300
It really supports the show indeed.

00:16:13.300 --> 00:16:13.840
All right.

00:16:13.840 --> 00:16:16.840
Now, Brian, let's talk about some fast stuff.

00:16:16.840 --> 00:16:17.380
Okay.

00:16:17.380 --> 00:16:18.220
L Python.

00:16:18.220 --> 00:16:19.540
Have you heard of L Python?

00:16:19.540 --> 00:16:20.220
No.

00:16:20.220 --> 00:16:21.180
This is news to me.

00:16:21.180 --> 00:16:25.520
So L Python is a high performance type Python compiler.

00:16:25.520 --> 00:16:29.560
So basically if you type annotations or type hints on your Python code,

00:16:29.560 --> 00:16:33.800
it can aggressively optimize and compile your Python code.

00:16:33.800 --> 00:16:37.840
And it uses multiple backends, which is pretty interesting.

00:16:37.840 --> 00:16:40.140
So you can compile it using LLVM.

00:16:40.440 --> 00:16:41.800
You can compile it to C.

00:16:41.800 --> 00:16:45.280
You can compile it to C++ or you can compile it to WASM WebAssembly.

00:16:45.280 --> 00:16:46.280
That's wild, right?

00:16:46.280 --> 00:16:46.880
Yeah.

00:16:46.880 --> 00:16:47.460
Yeah.

00:16:47.460 --> 00:16:50.520
So right now, just a heads up before people get too excited.

00:16:50.520 --> 00:16:51.700
It's an alpha stage.

00:16:51.700 --> 00:16:55.360
So it's not quite ready for maybe adoption.

00:16:55.360 --> 00:16:58.060
But if you're curious about it, you should definitely check it out.

00:16:58.060 --> 00:16:59.620
You can play with it and so on.

00:16:59.620 --> 00:17:02.240
And so it's starting to pick up speed.

00:17:02.240 --> 00:17:03.800
It's got a little over a thousand GitHub stars.

00:17:03.800 --> 00:17:04.500
Cool.

00:17:04.720 --> 00:17:06.820
And you can try it in your browser.

00:17:06.820 --> 00:17:08.200
Let's try the browser, huh?

00:17:08.200 --> 00:17:10.640
Before I move on though, let's say it's fast.

00:17:10.640 --> 00:17:15.040
It's built from the ground up to translate primarily data science-y code because that's

00:17:15.040 --> 00:17:17.980
primarily where things get slow and actually matter in Python.

00:17:18.420 --> 00:17:22.460
But numerical array-oriented code into simple, readable, and fast code.

00:17:22.460 --> 00:17:23.500
Basic math.

00:17:23.500 --> 00:17:29.780
So it knows about, you know, sized integers, for example, in 32 and so on.

00:17:30.160 --> 00:17:36.080
It has a just-in-time compilation, which you can get if you don't want to run a compiler

00:17:36.080 --> 00:17:36.540
itself.

00:17:36.540 --> 00:17:41.220
You can just put a at lpython decorator onto a function and it'll just compile at a runtime,

00:17:41.220 --> 00:17:44.420
which is kind of cool because then I guess you probably don't need to distribute binary

00:17:44.420 --> 00:17:47.880
versions on your packages, your wheels, and so on.

00:17:47.880 --> 00:17:49.600
It's interoperable with CPython.

00:17:49.600 --> 00:17:53.360
So basically, you can call all the CPython functions.

00:17:53.360 --> 00:18:00.120
And it's also, if it works in CPython, it works here, it'll work in CPython, basically.

00:18:00.120 --> 00:18:02.020
Is it a subset, I guess, in a sense?

00:18:02.020 --> 00:18:03.040
And open source.

00:18:03.040 --> 00:18:04.460
All right, let's play with it for just a second.

00:18:04.460 --> 00:18:08.200
So if you go to dev.lpython.org, it loads up in the browser.

00:18:08.200 --> 00:18:11.900
And you can notice it loaded pretty quickly, although I have gigabit internet.

00:18:11.900 --> 00:18:12.880
It's still loaded pretty quickly.

00:18:12.880 --> 00:18:15.140
See this picture here on the screen behind?

00:18:15.140 --> 00:18:20.020
This is the Mandelbrot set, which I don't know how many people have done fractals, but it's

00:18:20.020 --> 00:18:27.060
drawing two different copies of the Mandelbrot set in, what is that, a 600 by 600 image, maybe?

00:18:27.060 --> 00:18:27.600
Okay.

00:18:27.600 --> 00:18:31.500
About a black and white one and a color map one.

00:18:31.500 --> 00:18:36.420
It says it took a little under half a second to compile it and 80 milliseconds to generate

00:18:36.420 --> 00:18:37.080
those two images.

00:18:37.080 --> 00:18:41.200
And you can come over here and you can say, like, all right, what I'm going to do is, what

00:18:41.200 --> 00:18:41.620
is that number?

00:18:41.620 --> 00:18:44.920
I'm going to make this, let's say, 355 iterations.

00:18:44.920 --> 00:18:46.880
And then we'll run it again.

00:18:46.880 --> 00:18:49.460
And 100 milliseconds, right?

00:18:49.460 --> 00:18:53.900
If I make that, if I make this something really silly here, like, oh no, why did that

00:18:53.900 --> 00:18:54.160
go away?

00:18:54.160 --> 00:18:58.180
Back button is not supposed, or the delete button is not supposed to navigate backwards.

00:18:58.180 --> 00:18:58.580
Hold on.

00:18:58.580 --> 00:18:59.700
Ooh, really big.

00:18:59.700 --> 00:19:00.140
There we go.

00:19:00.140 --> 00:19:01.140
All right, there we go.

00:19:01.140 --> 00:19:01.520
Okay.

00:19:01.520 --> 00:19:04.120
So if I run it again, though, watch how fast this is.

00:19:04.120 --> 00:19:05.160
Like, boom, that's it.

00:19:05.160 --> 00:19:07.100
And then I'll put it back to, what was it before?

00:19:07.100 --> 00:19:09.220
I'm going to be real weird the way it's like capturing my mouse.

00:19:09.220 --> 00:19:12.620
But anyway, people can come check this out and see it running.

00:19:12.740 --> 00:19:15.120
It runs super fast as Python.

00:19:15.120 --> 00:19:21.780
And you think all this iterative generating a ton of paralyzed computation in WebAssembly,

00:19:21.780 --> 00:19:23.860
in the browser, with Python.

00:19:23.860 --> 00:19:24.960
I'm pretty impressed.

00:19:24.960 --> 00:19:26.220
Yeah, that's pretty cool.

00:19:26.220 --> 00:19:26.680
Neat.

00:19:26.680 --> 00:19:27.940
Who's behind this?

00:19:27.940 --> 00:19:28.220
Do you know?

00:19:28.220 --> 00:19:29.320
Mr. L Python?

00:19:29.320 --> 00:19:30.420
I have no idea, honestly.

00:19:30.420 --> 00:19:31.120
Okay.

00:19:32.060 --> 00:19:34.680
It's by L Compilers, is what it says at the bottom.

00:19:34.680 --> 00:19:36.780
So what is that?

00:19:36.780 --> 00:19:38.460
Lcompilers.org.

00:19:38.460 --> 00:19:39.460
Yeah.

00:19:39.460 --> 00:19:41.580
Good question.

00:19:41.580 --> 00:19:43.180
It has no public members.

00:19:43.180 --> 00:19:43.760
Okay.

00:19:43.760 --> 00:19:44.580
But it is exciting.

00:19:44.580 --> 00:19:46.420
So yeah, nor does it have a web page.

00:19:46.420 --> 00:19:48.740
Hopefully it's not an APT crew.

00:19:48.740 --> 00:19:54.260
Anyway, no, seriously, it looks like a cool project and people can check it out.

00:19:54.260 --> 00:19:58.180
There's a lot of these ideas happening now, but yeah, it's quite interesting.

00:19:58.180 --> 00:19:58.620
Yeah.

00:19:59.600 --> 00:20:05.700
Well, my last topic was kind of dramatic with the whole XZ thing.

00:20:05.700 --> 00:20:11.180
So I'd like to continue the drama and bring it into Python.

00:20:11.180 --> 00:20:17.340
And with the help of Trey Hunter, and he has a way to make your Python more dramatic.

00:20:17.340 --> 00:20:22.380
Actually, your Python output more dramatic with a, I'm just kind of joking,

00:20:22.380 --> 00:20:24.100
but it's kind of fun with the name.

00:20:24.100 --> 00:20:27.140
He's got a tool called Dramatic.

00:20:27.860 --> 00:20:35.340
And what it does is it slows down the print output, which, you know, why would you want this?

00:20:35.340 --> 00:20:36.440
I don't know.

00:20:36.440 --> 00:20:39.880
It might be kind of fun if you're doing a demo or doing a presentation or something,

00:20:39.880 --> 00:20:42.700
but it does, it's just pretty fun.

00:20:42.700 --> 00:20:44.160
There's a lot of ways you can use Dramatic.

00:20:44.160 --> 00:20:51.700
You can, once you install it, you can just use a context manager so that it's only around certain print statements.

00:20:51.980 --> 00:20:54.720
You can decorate certain functions.

00:20:54.720 --> 00:20:56.200
So it temporarily does it.

00:20:56.200 --> 00:21:02.700
And you can even, there's a start and print that to do it targeted.

00:21:02.700 --> 00:21:07.520
One of the fun things, and he's got examples on his readme how to do this.

00:21:07.520 --> 00:21:14.620
One of the fun things you can do, I'm not sure why he included this, is you can do it outside the whole thing.

00:21:14.900 --> 00:21:16.480
He's got a Dramatic interpreter.

00:21:16.480 --> 00:21:22.740
So if you run like Python-M Dramatic, it just slows down everything.

00:21:22.740 --> 00:21:26.600
So you can turn it off, though.

00:21:26.600 --> 00:21:28.960
He's got a way to turn it off as well.

00:21:28.960 --> 00:21:32.080
But you can do speedups and make it.

00:21:32.080 --> 00:21:33.980
Anyway, I think this is...

00:21:33.980 --> 00:21:37.120
You want your Python code to look like ChatGPT or something like that, right?

00:21:37.120 --> 00:21:39.400
Yeah, as it's typing out and stuff.

00:21:39.400 --> 00:21:45.200
I think it's kind of, especially if you're running, I think it'd be useful.

00:21:45.200 --> 00:21:47.080
He gives an example of doing it.

00:21:47.080 --> 00:21:50.160
Like, for instance, I guess this isn't an example.

00:21:50.320 --> 00:22:04.980
But if you're doing command line interface interactions with a user, I think it is helpful sometimes to have the output go slowly so that it's visually interesting to have it not just pop up with a mountain of text for people to read.

00:22:04.980 --> 00:22:07.680
But don't do it too slow, because that's annoying also.

00:22:07.680 --> 00:22:11.160
But anyway, I think it's kind of a fun thing.

00:22:11.800 --> 00:22:14.240
Related to this, I thought it'd be...

00:22:14.240 --> 00:22:29.560
When he submitted this the other day, I remembered somebody named Alan submitted a comment to us that Terminal Text Effects library is pretty cool.

00:22:29.560 --> 00:22:31.980
And so I'll go ahead and link to that also.

00:22:31.980 --> 00:22:34.420
That's a fun thing.

00:22:34.420 --> 00:22:36.060
It's very dramatic.

00:22:36.060 --> 00:22:38.260
That's quite dramatic.

00:22:38.820 --> 00:22:40.880
You've got a whole bunch of cool effects.

00:22:40.880 --> 00:22:46.520
There's a grid one where things show up gradually in a grid.

00:22:46.520 --> 00:22:48.500
There's a bunch of great examples.

00:22:48.500 --> 00:22:50.780
There's beams that pop back and forth.

00:22:50.780 --> 00:22:51.360
This is beautiful.

00:22:51.360 --> 00:22:52.100
Laser beams.

00:22:52.100 --> 00:22:52.880
Laser beams.

00:22:52.880 --> 00:22:53.300
I like that one.

00:22:53.300 --> 00:22:54.320
Yes, let's do it.

00:22:54.320 --> 00:23:00.760
The binary path kind of looks kind of, what was it, matrix-y sort of a look.

00:23:00.760 --> 00:23:02.700
Listen, Neil, you can't go down there.

00:23:02.700 --> 00:23:05.820
There was one that I really liked a lot.

00:23:05.820 --> 00:23:07.620
The burn is neat.

00:23:08.620 --> 00:23:09.020
Crumbles.

00:23:09.020 --> 00:23:12.040
These are all animated GIFs on the GitHub repo that Brian's thinking, too.

00:23:12.040 --> 00:23:12.260
Yeah.

00:23:12.260 --> 00:23:12.560
Yeah.

00:23:12.560 --> 00:23:17.020
So I think it'd be cool for your...

00:23:17.020 --> 00:23:18.380
I wouldn't do it all over the place.

00:23:18.380 --> 00:23:21.900
But for instance, if you had a...

00:23:21.900 --> 00:23:23.880
Probably not a help, but an about.

00:23:23.880 --> 00:23:26.580
And that's sort of where it's showing here.

00:23:26.580 --> 00:23:31.820
Where you show the credits and who's worked on it and some more info and stuff.

00:23:31.820 --> 00:23:38.340
That'd be fun to do a fancy dramatic output for that.

00:23:38.340 --> 00:23:39.020
All right.

00:23:39.020 --> 00:23:40.860
With this terminal text effects thing.

00:23:40.860 --> 00:23:41.340
Yeah.

00:23:41.340 --> 00:23:47.660
I think if you work in the movie industry and you need to have a hacker breaking into a thing

00:23:47.660 --> 00:23:52.500
or somebody jacking into cyberspace or whatever one of these weird things are,

00:23:52.500 --> 00:23:54.280
where you're going to show a terminal and make it dramatic.

00:23:54.540 --> 00:23:55.080
Oh my goodness.

00:23:55.080 --> 00:23:56.980
You could just basically do this for Hollywood.

00:23:56.980 --> 00:23:57.600
Yeah.

00:23:57.600 --> 00:23:58.680
Yeah.

00:23:58.680 --> 00:23:59.160
Couldn't you?

00:23:59.160 --> 00:24:00.400
Yeah, definitely.

00:24:00.400 --> 00:24:02.500
What is this language?

00:24:02.500 --> 00:24:03.060
Oh my gosh.

00:24:03.060 --> 00:24:03.780
This is VB6.

00:24:03.780 --> 00:24:04.380
I know this.

00:24:04.380 --> 00:24:05.300
I'm tracking his IP.

00:24:05.300 --> 00:24:05.840
Like, wait a minute.

00:24:05.840 --> 00:24:06.100
What?

00:24:06.100 --> 00:24:07.960
What do you think about this?

00:24:07.960 --> 00:24:08.840
It would be a little bit better.

00:24:08.840 --> 00:24:10.200
Yeah.

00:24:10.200 --> 00:24:11.640
It'd be great.

00:24:12.040 --> 00:24:14.200
So anyway, that'd be fun.

00:24:14.200 --> 00:24:21.280
If you use both this and Textual to turn it into like a Vim clone or something like that

00:24:21.280 --> 00:24:22.800
with fun effects.

00:24:22.800 --> 00:24:24.080
Ooh, that's fun.

00:24:24.080 --> 00:24:24.760
The pour is neat.

00:24:24.760 --> 00:24:25.340
Yeah.

00:24:25.340 --> 00:24:28.500
It's almost like the Tetris terminal in a sense.

00:24:28.500 --> 00:24:29.360
Not quite, but almost.

00:24:29.360 --> 00:24:34.000
Anyway, I guess that is just a fun wrap up of our topics.

00:24:34.000 --> 00:24:36.260
But we have some extras.

00:24:36.260 --> 00:24:37.520
Do you have any extras?

00:24:37.520 --> 00:24:38.980
Go do your first since you got your screen up.

00:24:39.200 --> 00:24:39.420
Yeah.

00:24:39.420 --> 00:24:39.740
Okay.

00:24:39.740 --> 00:24:45.180
So the only thing I mentioned Textual a little bit, I'll go ahead and say that Textual

00:24:45.180 --> 00:24:46.640
has released a new version.

00:24:46.640 --> 00:24:52.400
And I'm highlighting this because there's an inline feature, which is fun.

00:24:52.400 --> 00:24:56.820
So with the inline feature, let's see if we can get an example up.

00:24:56.820 --> 00:25:02.180
You can kind of run Textual in, run?

00:25:02.180 --> 00:25:03.540
It's not running for me.

00:25:03.540 --> 00:25:07.120
But anyway, you can run it inline.

00:25:07.300 --> 00:25:12.480
So normally, if you run a Textual application, it takes up your whole terminal area.

00:25:12.480 --> 00:25:15.040
But this will just take a subset.

00:25:15.040 --> 00:25:17.800
So you can have a little input screen.

00:25:17.800 --> 00:25:19.800
So you can have kind of like an input dialogue maybe.

00:25:19.800 --> 00:25:24.100
And it's very visual, but doesn't take over everything.

00:25:24.100 --> 00:25:27.040
So anyway, kind of fun.

00:25:27.040 --> 00:25:28.980
Textual and rich, continue to impress.

00:25:28.980 --> 00:25:29.580
Yeah.

00:25:29.580 --> 00:25:30.520
How about you?

00:25:30.520 --> 00:25:31.240
Any extras?

00:25:31.700 --> 00:25:32.640
I've got a few.

00:25:32.640 --> 00:25:33.940
Let's see.

00:25:33.940 --> 00:25:37.840
Let's start with broadcasts straight out of the Philippines.

00:25:37.840 --> 00:25:46.820
So my keynote, which was entitled The State of Python in 2024, I give two weeks ago at PyCon

00:25:46.820 --> 00:25:47.960
Philippines is out.

00:25:47.960 --> 00:25:51.700
And the production quality is super high on this video.

00:25:51.820 --> 00:25:53.200
So they did a really great job.

00:25:53.200 --> 00:25:54.100
It was a fun conference.

00:25:54.100 --> 00:25:58.320
But if you would have loved to hear me give a presentation on The State of Python in 2024,

00:25:58.320 --> 00:26:01.780
but you weren't there, then you can still check it out now.

00:26:01.780 --> 00:26:02.180
It's awesome.

00:26:02.180 --> 00:26:06.220
And I really enjoyed it, by the way.

00:26:06.340 --> 00:26:06.500
Yeah.

00:26:06.500 --> 00:26:07.040
Yeah.

00:26:07.040 --> 00:26:07.740
Oh, thanks so much.

00:26:07.740 --> 00:26:12.440
A bunch of the people whose projects we talk about on this show actually get a shout out

00:26:12.440 --> 00:26:12.620
there.

00:26:12.620 --> 00:26:13.320
So all right.

00:26:13.320 --> 00:26:14.600
That's thing one.

00:26:14.600 --> 00:26:16.960
Thing two, I just want to encourage people.

00:26:16.960 --> 00:26:19.560
I've not logged in my GitHub, so I can't unfortunately show it here.

00:26:19.560 --> 00:26:24.020
But Brian, do you go to your GitHub and you know there's that feed in the middle that shows

00:26:24.020 --> 00:26:28.940
all the stuff that's going on and who starred this and who's doing that and stuff.

00:26:28.940 --> 00:26:29.800
Do you ever use that thing?

00:26:29.800 --> 00:26:30.300
No.

00:26:30.300 --> 00:26:32.200
That's the way I'm like, that's the thing's stupid.

00:26:32.200 --> 00:26:34.340
This is like 80% of the page and it's in the way.

00:26:34.340 --> 00:26:34.840
What is this?

00:26:35.440 --> 00:26:37.020
How do I get past this?

00:26:37.020 --> 00:26:40.460
I've started paying attention to it and I've found so many cool projects.

00:26:40.460 --> 00:26:45.120
So I want to inspire people to follow people on GitHub.

00:26:45.120 --> 00:26:47.160
You can follow Brian and me and see what we're starring.

00:26:47.160 --> 00:26:49.060
But who's starred what?

00:26:49.060 --> 00:26:49.660
Who's forked what?

00:26:49.660 --> 00:26:54.620
I found probably three or four really interesting projects just last week by just kind of skimming

00:26:54.620 --> 00:26:56.300
that for five minutes a week, you know?

00:26:56.300 --> 00:26:57.380
That's pretty cool.

00:26:57.380 --> 00:26:58.120
Yeah.

00:26:58.120 --> 00:26:59.600
I was really surprised that it was useful.

00:26:59.600 --> 00:27:01.100
I guess I need to follow more people.

00:27:01.100 --> 00:27:01.960
I don't know.

00:27:01.960 --> 00:27:02.380
Exactly.

00:27:02.380 --> 00:27:03.740
Because I should as well.

00:27:03.800 --> 00:27:07.480
Because I hadn't really been following more people because why do you follow them?

00:27:07.480 --> 00:27:08.560
Well, maybe this is why.

00:27:08.560 --> 00:27:13.280
On to the thing that continues to perplex me, which is interesting, is that the official

00:27:13.280 --> 00:27:16.560
way that Python works is through blogspot.com.

00:27:16.560 --> 00:27:19.060
But nonetheless, important stuff for you all.

00:27:19.320 --> 00:27:27.400
If you are living in the past, like when I ran JustPath earlier, it said your Python 310 thing is stupid because that doesn't exist on your computer anymore.

00:27:27.400 --> 00:27:35.020
But if you have 310, 3.9 or 3.8, there are security updates for the older versions of Python, but not the new one.

00:27:35.020 --> 00:27:37.060
They call them boring security releases.

00:27:37.060 --> 00:27:39.340
I never think of security releases as boring.

00:27:40.100 --> 00:27:47.880
They either go from slightly interesting to, oh my gosh, you have my full attention, like the XZ thing.

00:27:47.880 --> 00:27:55.080
Anyway, people can check that out and should probably upgrade if they're running one of those versions, 310, 3.9 or 3.8.

00:27:55.080 --> 00:27:58.960
And if you're running 3.7 or older, too bad, so sad, no updates for you.

00:27:58.960 --> 00:28:00.160
They may be vulnerable.

00:28:00.160 --> 00:28:00.940
They may be not.

00:28:00.940 --> 00:28:01.580
I don't know.

00:28:02.000 --> 00:28:04.580
And that's just the way it works if you're out of support.

00:28:04.580 --> 00:28:06.520
That's why you should stay on some of the new stuff somewhat.

00:28:06.520 --> 00:28:09.920
Like the new stuff's really been fairly easy to upgrade to.

00:28:09.920 --> 00:28:10.380
I haven't.

00:28:10.380 --> 00:28:11.140
It has been.

00:28:11.140 --> 00:28:16.160
In a lot of, most of the, well, maybe it's just my projects, but I haven't run into any issues really.

00:28:16.160 --> 00:28:21.700
I think if you stay one version behind, it's, it's, there's no effort at all almost to do it.

00:28:21.700 --> 00:28:31.800
Going from 3.11 to 3.12 was actually the hardest upgrade I've ever done because there was quite a few dependencies I had that use something that was removed as part of the dead batteries thing.

00:28:31.800 --> 00:28:32.960
Or something like that.

00:28:32.960 --> 00:28:34.800
And I can't, and it just wouldn't run.

00:28:34.800 --> 00:28:42.000
And I'm like, oh my gosh, I got to, I was just waiting until some dependency of a dependency got fixed, but it was slow for some reason.

00:28:42.000 --> 00:28:42.760
I don't know why.

00:28:42.760 --> 00:28:45.120
But, you know, that got fixed within a few weeks, right?

00:28:45.120 --> 00:28:47.300
So if you waited a little bit longer, it should be easy.

00:28:47.300 --> 00:28:48.240
Yeah.

00:28:48.240 --> 00:28:55.520
So one of the questions I got while we're looking at this, how many, I used to run a lot of versions of Python on my, on my Mac.

00:28:55.520 --> 00:29:01.340
But I got a new Mac recently and I decided to mostly push most, I only run a couple.

00:29:01.600 --> 00:29:07.360
And then I push, do most of my multi Python version testing in CI instead of locally.

00:29:07.360 --> 00:29:10.760
How many do you have on your machine or regularly?

00:29:10.760 --> 00:29:11.220
Or do you?

00:29:11.220 --> 00:29:12.640
Let's see.

00:29:12.640 --> 00:29:14.040
Which Python?

00:29:14.040 --> 00:29:14.920
Oh, we're here.

00:29:14.920 --> 00:29:15.560
Python rather.

00:29:15.560 --> 00:29:16.160
I think.

00:29:16.160 --> 00:29:16.840
Oh.

00:29:17.320 --> 00:29:18.700
I'm sorry to put you on the spot.

00:29:18.700 --> 00:29:19.320
No problem.

00:29:19.320 --> 00:29:25.140
You know, I think I have, I think I have three 11 and three 12 and that's it.

00:29:25.140 --> 00:29:26.060
Yeah.

00:29:26.060 --> 00:29:28.860
I think that I don't have three nine.

00:29:28.860 --> 00:29:29.740
I don't have three 10.

00:29:29.740 --> 00:29:31.240
I definitely don't have anything else.

00:29:31.240 --> 00:29:34.400
So three 11 or three 11 or three 12.

00:29:34.400 --> 00:29:35.660
Those are the ones that I got right now.

00:29:35.660 --> 00:29:36.520
So I'm with you.

00:29:36.560 --> 00:29:38.560
I tried to, I did not put too much stuff on there.

00:29:38.560 --> 00:29:42.720
The only reason I really have older stuff on there is because I haven't gone to the trouble

00:29:42.720 --> 00:29:46.500
of removing it because there's so a bunch of virtual environments I've created off it that

00:29:46.500 --> 00:29:47.580
I wanted to deal with.

00:29:47.580 --> 00:29:49.380
But ideally I would just have the latest.

00:29:49.380 --> 00:29:50.080
Yeah.

00:29:50.120 --> 00:29:55.000
I think, I think my normal, I don't know what I've got, but it's, it's the, well, with

00:29:55.000 --> 00:29:59.560
the packages I maintain, I usually have the newest and the oldest that I maintain.

00:29:59.560 --> 00:30:03.700
And so three 12 and then however far back I wanted to go.

00:30:03.700 --> 00:30:04.060
Yeah.

00:30:04.060 --> 00:30:09.260
And then so that, so that talks can find those and I can find those locally, but yeah.

00:30:09.260 --> 00:30:09.520
Yeah.

00:30:09.520 --> 00:30:10.500
You know what I might do?

00:30:10.500 --> 00:30:16.460
I'm not doing it because I don't have a huge set of older pythons I test for.

00:30:16.460 --> 00:30:19.000
But if I was like you where I did that, maybe I'd have Docker.

00:30:19.400 --> 00:30:23.420
We have some Docker container, so older ones, you could just do Docker run Python, this

00:30:23.420 --> 00:30:24.880
command, you know, this file or whatever.

00:30:24.880 --> 00:30:25.440
I don't know.

00:30:25.440 --> 00:30:26.160
Yeah, maybe.

00:30:26.160 --> 00:30:27.440
Keep it cleaned up.

00:30:27.440 --> 00:30:30.280
Yeah, but they run side by side pretty well.

00:30:30.280 --> 00:30:30.680
So.

00:30:30.680 --> 00:30:31.600
Yeah, they do.

00:30:31.600 --> 00:30:32.100
Anyway.

00:30:32.100 --> 00:30:33.580
Just got to keep your path in order.

00:30:33.580 --> 00:30:34.260
So just path.

00:30:34.260 --> 00:30:35.100
Just path.

00:30:35.100 --> 00:30:35.840
Just path.

00:30:35.840 --> 00:30:36.840
Just Jack.

00:30:36.840 --> 00:30:41.020
So should we have some fun, something funny?

00:30:41.020 --> 00:30:42.120
Ah, yes.

00:30:42.120 --> 00:30:45.360
This one, actually I got it pulled up, but this one is from you.

00:30:45.360 --> 00:30:48.100
So I'm going to let you take the lead on telling us about this joke here.

00:30:48.100 --> 00:30:48.740
Okay.

00:30:48.740 --> 00:30:51.760
So I saw this on LinkedIn, actually.

00:30:51.760 --> 00:30:53.500
It's from Matt Watson.

00:30:53.500 --> 00:30:54.360
Don't know him.

00:30:54.360 --> 00:30:56.620
But it's pretty funny.

00:30:56.620 --> 00:31:01.620
So we've got some definitions of some software definitions for you.

00:31:01.620 --> 00:31:04.100
So starting, I've got a whole bunch of them.

00:31:04.100 --> 00:31:05.200
So we'll try to go through them.

00:31:05.200 --> 00:31:06.380
Technical debt.

00:31:06.380 --> 00:31:09.380
What technical debt is move fast and don't fix things.

00:31:09.380 --> 00:31:13.400
Agile development is admitting you have no plan.

00:31:13.400 --> 00:31:17.100
Test driven development, guessing the future one test at a time.

00:31:17.660 --> 00:31:18.580
I love that.

00:31:18.580 --> 00:31:21.800
Open source is asking somebody else to fix it.

00:31:21.800 --> 00:31:22.680
Yeah.

00:31:22.680 --> 00:31:24.060
It's not always working.

00:31:24.060 --> 00:31:29.080
Maybe a slightly different term based on the topic I said this week.

00:31:29.080 --> 00:31:31.760
Running someone else's code from the internet.

00:31:32.480 --> 00:31:32.980
Yeah.

00:31:32.980 --> 00:31:33.040
Right.

00:31:33.040 --> 00:31:33.100
Yeah.

00:31:33.100 --> 00:31:33.500
Right.

00:31:33.500 --> 00:31:34.220
Right.

00:31:34.220 --> 00:31:37.780
So CICD, automating your mistakes into production.

00:31:37.780 --> 00:31:39.300
That's awesome.

00:31:39.300 --> 00:31:41.980
API is also asking somebody else to do it.

00:31:41.980 --> 00:31:42.480
DevOps.

00:31:42.480 --> 00:31:43.220
I love this.

00:31:43.220 --> 00:31:46.120
DevOps is the belief that more tools fix any problem.

00:31:47.540 --> 00:31:51.140
Microservices are creating enough small problems to avoid one big one.

00:31:51.140 --> 00:31:53.860
Cyber security is playing hide and seek with hackers.

00:31:53.860 --> 00:31:58.320
And serverless is pretending servers don't exist until the bill comes.

00:31:58.320 --> 00:31:59.200
Oh, yeah.

00:31:59.200 --> 00:31:59.620
Scrum.

00:31:59.620 --> 00:32:00.400
I like that.

00:32:00.400 --> 00:32:03.560
Scrum is group therapy for being behind schedule.

00:32:03.560 --> 00:32:06.040
Nice.

00:32:06.040 --> 00:32:07.240
Hi.

00:32:07.280 --> 00:32:08.000
My name is Michael.

00:32:08.000 --> 00:32:09.040
I'm blocked.

00:32:09.040 --> 00:32:11.540
Hi, Michael.

00:32:11.540 --> 00:32:15.720
I've been blocked for two months.

00:32:17.720 --> 00:32:18.160
Yeah.

00:32:18.160 --> 00:32:19.000
That's great.

00:32:19.000 --> 00:32:19.220
Yeah.

00:32:19.220 --> 00:32:22.120
We have to do that.

00:32:22.120 --> 00:32:24.920
Next, I'll have to try to incorporate that.

00:32:24.920 --> 00:32:25.580
There you go.

00:32:25.580 --> 00:32:27.060
Thanks, Brian.

00:32:27.060 --> 00:32:28.380
Well, thanks a lot.

00:32:28.380 --> 00:32:30.020
Thanks again for a wonderful episode.

00:32:30.020 --> 00:32:34.600
And thank you, everybody, for helping to make Python Bytes a wonderful podcast.

00:32:34.600 --> 00:32:41.200
And we don't ask this much, but if you find this amusing or helpful, please share with a friend.

00:32:41.200 --> 00:32:46.260
And you can sign up for one of the great ways to do that is to sign up as a friend of the show.

00:32:46.580 --> 00:32:48.540
Get the newsletter, and then you can send that.

00:32:48.540 --> 00:32:49.900
You can spam your friends with that.

00:32:49.900 --> 00:32:52.080
We're not going to spam people, but you can.

00:32:52.080 --> 00:32:53.040
So thanks.

00:32:53.040 --> 00:32:53.640
Indeed.

00:32:53.640 --> 00:32:54.120
Yeah.

