WEBVTT

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

00:00:05.080 --> 00:00:07.780
This is episode 369.

00:00:07.780 --> 00:00:08.620
69!

00:00:08.620 --> 00:00:11.600
Recorded January 29th, 2024.

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

00:00:12.940 --> 00:00:14.320
Hey, I'm Michael Kennedy.

00:00:14.320 --> 00:00:17.420
And this episode is sponsored by us.

00:00:17.420 --> 00:00:22.500
So check out our courses at Talk Python Training and the Complete pytest Course.

00:00:22.500 --> 00:00:29.820
And thanks to Patreon supporters and really everybody that just like spreads the love and shares our podcast with other people.

00:00:30.260 --> 00:00:30.860
Thanks so much.

00:00:30.860 --> 00:00:33.460
The first item is going to be Granian.

00:00:33.460 --> 00:00:34.640
Oh, neat.

00:00:34.640 --> 00:00:37.500
Yes, before we get into that, I just want to sort of set the stage.

00:00:37.500 --> 00:00:43.980
You know, when you're running Python apps, web apps in production, there's usually something that talks to the web browsers.

00:00:43.980 --> 00:00:47.040
And then there's the part that runs your Python code, right?

00:00:47.040 --> 00:00:53.660
The part that talks to your web browser is Nginx, Apache, Caddy, one of these things that does SSL.

00:00:53.660 --> 00:00:55.240
It has no knowledge of Python.

00:00:55.240 --> 00:00:59.080
But then behind that step, we've got MicroWSGI.

00:00:59.640 --> 00:01:03.280
We've got G-Unicorn and those types of things, right?

00:01:03.280 --> 00:01:05.200
So that's where your Python code runs.

00:01:05.200 --> 00:01:07.980
Usually it runs, it'll create multiple of them.

00:01:07.980 --> 00:01:11.380
And both those two that I named, I'm big fans of.

00:01:11.380 --> 00:01:12.500
MicroWSGI is awesome.

00:01:12.960 --> 00:01:19.480
Super fast, low memory usage, but only does WSGI, does no async stuff.

00:01:19.480 --> 00:01:21.460
And that's a huge drawback, right?

00:01:21.460 --> 00:01:22.360
It doesn't do async.

00:01:22.360 --> 00:01:24.940
It doesn't allow you to like properly scale async and await.

00:01:25.320 --> 00:01:34.320
G-Unicorn, on the other hand, allows you to use UVicorn workers inside there, which is kind of like one more chain in that loop.

00:01:34.320 --> 00:01:38.580
But when you deploy it that way, you can do async and await, which is awesome.

00:01:38.580 --> 00:01:47.100
But there's this new-ish thing coming along called Granian from the Emmet framework, which is a new Python web framework.

00:01:47.100 --> 00:01:51.520
But this is a Rust-based HTTP server for Python applications.

00:01:51.520 --> 00:01:55.440
So a Rust version of MicroWSGI or G-Unicorn.

00:01:55.440 --> 00:01:55.780
Yeah?

00:01:55.780 --> 00:01:56.480
Oh, cool.

00:01:56.480 --> 00:01:57.400
That's kind of cool.

00:01:57.700 --> 00:02:01.000
It has 1.5,000 stars on GitHub.

00:02:01.000 --> 00:02:02.840
It's been coming along for a while.

00:02:02.840 --> 00:02:08.620
And it's created by a guy named Giovanni, I believe.

00:02:08.620 --> 00:02:12.220
And Giovanni says, well, why build this thing?

00:02:12.220 --> 00:02:13.120
A couple of reasons.

00:02:13.120 --> 00:02:20.820
It's a correct HTTP implementation supporting version 1.2 and working on HTTP 3, which is awesome.

00:02:20.820 --> 00:02:28.020
It avoids the G-Unicorn, U-Vicorn, HTTP tools' tendency composition when deploying in production.

00:02:28.020 --> 00:02:34.560
So this natively supports async and await, like right in it, along with WSGI.

00:02:34.560 --> 00:02:41.220
So whatever kind of app you've created, you can just run it right there in this thing without chaining stuff together.

00:02:41.220 --> 00:02:46.980
And one of the things that's nice about it is it's not a ton faster, but it's way more stable.

00:02:46.980 --> 00:02:50.460
There's less jitter in its performance profile, which I think is super cool.

00:02:50.460 --> 00:02:51.660
I'll talk about that in a second.

00:02:51.660 --> 00:02:53.440
But yeah, it has HTTP 1 and 2.

00:02:53.440 --> 00:02:54.080
Excellent.

00:02:54.080 --> 00:02:56.740
Supports HTTPS and WebSockets directly.

00:02:56.740 --> 00:02:59.600
I'm not going to send HTTPS traffic to it.

00:02:59.600 --> 00:03:01.980
I'm just using, for now, Nginx or whatever.

00:03:01.980 --> 00:03:06.880
But it also supports RSGI, which is a Rust server gateway interface, I guess.

00:03:06.880 --> 00:03:08.840
You know, like ASGI and WSGI.

00:03:08.840 --> 00:03:14.640
So it does all the Python things, plus it has a Rust direct version, if that was the way you went down it.

00:03:14.640 --> 00:03:16.220
And it's super easy to run.

00:03:16.220 --> 00:03:24.300
But from the performance perspective, if you look, it'll compare it down here to, let's see, against Uveacorn.

00:03:24.300 --> 00:03:27.000
And Hypercorn is another one I should have mentioned.

00:03:27.000 --> 00:03:31.260
That's like a parallel to Uveacorn plus Unicorn.

00:03:31.260 --> 00:03:34.540
But that one, I think, handles it all directly from Philip Jones, which is great.

00:03:34.540 --> 00:03:38.060
But if you look at, so let's just say, like, the ASGI get.

00:03:38.060 --> 00:03:46.120
It says it'll do, numbers please, 1.3 million requests at, okay, that's just total, doesn't mean anything.

00:03:46.120 --> 00:03:47.580
That could be over three weeks.

00:03:47.580 --> 00:03:50.580
85,000, 86,000 requests per second.

00:03:50.580 --> 00:03:53.020
Or maybe this one's a little bit better.

00:03:53.020 --> 00:03:55.840
A different get for 94,000.

00:03:55.840 --> 00:04:02.280
Compare that against the Uveacorn one, which is 19,000 versus 94,000.

00:04:02.280 --> 00:04:06.940
Or the Hypercorn at 12,000 versus 94,000, which is great.

00:04:06.940 --> 00:04:15.820
But if you look at the variation, like, response time on, let's say, Uveacorn is, on average, 8.7 milliseconds.

00:04:15.820 --> 00:04:17.300
That's really good.

00:04:17.640 --> 00:04:20.120
But the max is 320 milliseconds.

00:04:20.120 --> 00:04:26.380
Whereas if you look at this one, it's 2.7, but the max is only 8.6, right?

00:04:26.380 --> 00:04:31.680
So that variability or jitter, or I don't know how the heck you say it, is way more stable.

00:04:31.680 --> 00:04:35.840
And you just kind of look across the board, like another example is 6 versus 70, and so on.

00:04:35.840 --> 00:04:36.860
So I thought that was pretty cool.

00:04:36.860 --> 00:04:37.520
So I switched.

00:04:37.520 --> 00:04:39.480
If you come over here, Brian, to Python Bytes.

00:04:39.480 --> 00:04:44.880
This is running on Granian right now over on my Docker cluster for the moment.

00:04:44.880 --> 00:04:46.440
So I just thought I'd see how it goes.

00:04:46.560 --> 00:04:48.580
And it's been going perfectly, from what I can tell.

00:04:48.580 --> 00:04:51.000
So it's pretty easy to switch, then?

00:04:51.000 --> 00:04:51.500
Yeah.

00:04:51.500 --> 00:04:57.420
I mean, all you got to do is pip install Granian, and then change the start command, no matter

00:04:57.420 --> 00:04:57.980
however you run it.

00:04:57.980 --> 00:05:02.460
If you run it in the systemd on, like, a VM, you change the systemd exec command.

00:05:02.460 --> 00:05:05.300
If you do it in Docker, you just change the entry point command.

00:05:05.300 --> 00:05:08.900
For a micro-whisgi this, or gunicorn that, too.

00:05:08.900 --> 00:05:11.000
It's basically just another startup command.

00:05:11.000 --> 00:05:11.520
Yeah.

00:05:11.520 --> 00:05:11.760
Okay.

00:05:11.760 --> 00:05:12.320
Interesting.

00:05:12.320 --> 00:05:12.860
Cool.

00:05:12.860 --> 00:05:14.000
Indeed, indeed.

00:05:14.000 --> 00:05:18.120
One thing I did want to add for people who are considering this.

00:05:18.120 --> 00:05:19.620
I got to move this over.

00:05:19.620 --> 00:05:20.180
Go.

00:05:20.180 --> 00:05:21.500
One thing it doesn't.

00:05:21.500 --> 00:05:26.420
You can set it up so it'll do logging, but it doesn't do, like, easy logging out of the

00:05:26.420 --> 00:05:26.760
box.

00:05:26.760 --> 00:05:30.660
So I actually was messing around, like, maybe I should just do my own logging.

00:05:30.920 --> 00:05:33.500
Not for, hey, my app started up.

00:05:33.500 --> 00:05:34.880
Hey, somebody click this button.

00:05:34.880 --> 00:05:37.740
But just request response logging, which is pretty common.

00:05:37.740 --> 00:05:43.180
So I actually ended up playing with it and using Log Guru to come up with a color-coded,

00:05:43.180 --> 00:05:48.840
added some middleware that came up with color-coded request response logging that does all sorts

00:05:48.840 --> 00:05:49.380
of cool stuff.

00:05:49.480 --> 00:05:53.800
Like, see how some of the sizes in this log are red and some are white?

00:05:53.800 --> 00:05:58.660
If it's, like, over 500K in the request size, then it colors it red.

00:05:58.660 --> 00:06:01.800
Or if the response time is too slow, it'll color it, like, yellow.

00:06:01.800 --> 00:06:03.540
Or if it gets really slow, it'll color it red.

00:06:03.540 --> 00:06:06.800
Or it's a 400 or 500 code error.

00:06:06.800 --> 00:06:09.640
It'll color that part of the request red.

00:06:10.320 --> 00:06:13.000
So you can, like, look right away and see.

00:06:13.000 --> 00:06:18.900
So I've decided doing your own Log Guru request response stuff is pretty excellent, actually.

00:06:18.900 --> 00:06:22.820
So that's kind of a cool consequence of playing around with this as well.

00:06:22.820 --> 00:06:23.300
Cool.

00:06:23.300 --> 00:06:29.220
So is your use of Log Guru that a custom thing where you look at the response times and color

00:06:29.220 --> 00:06:30.380
it differently or something?

00:06:30.380 --> 00:06:31.220
Yeah, exactly.

00:06:31.220 --> 00:06:31.840
Exactly.

00:06:31.840 --> 00:06:34.440
Like, it'd be easy enough to just go print this format.

00:06:34.440 --> 00:06:35.580
The code is this.

00:06:35.580 --> 00:06:36.500
The URL is that.

00:06:36.500 --> 00:06:41.220
But I said it would be a lot more useful if it was color-coded and meant stuff, right?

00:06:41.220 --> 00:06:45.320
Like, if it's a 404, it should be a different color than if it's a 200.

00:06:45.320 --> 00:06:47.840
Or if it's a redirect, it should be a different color.

00:06:47.840 --> 00:06:52.140
If it's really, really slow, if you see these times, like, 10 milliseconds, 9 milliseconds,

00:06:52.140 --> 00:06:56.260
8 milliseconds, 12 milliseconds, if that was a second, maybe that's a problem.

00:06:56.260 --> 00:06:57.280
Color that a different color.

00:06:57.280 --> 00:07:02.900
And I did that by installing middleware in the, this isn't Pyramid, but it could also be

00:07:02.900 --> 00:07:03.820
whatever, right?

00:07:03.820 --> 00:07:05.380
You do this in FastAPI or whatever.

00:07:05.380 --> 00:07:11.100
It just says, begin the request, do something, pass it down to the framework, and then end

00:07:11.100 --> 00:07:13.980
the request and just times it and logs it and colors it there.

00:07:13.980 --> 00:07:14.540
Okay.

00:07:14.540 --> 00:07:15.120
Neat.

00:07:15.120 --> 00:07:15.620
Yep.

00:07:15.620 --> 00:07:16.800
Indeed, indeed.

00:07:16.800 --> 00:07:23.400
Well, I also want to talk about something new and old at the same time.

00:07:23.400 --> 00:07:24.080
Nice.

00:07:24.080 --> 00:07:28.920
pytest has been around for a while, but pytest 8 is brand new.

00:07:28.920 --> 00:07:31.280
So pytest 8 just came out this weekend.

00:07:31.280 --> 00:07:33.940
I'm super excited to start running with it.

00:07:33.940 --> 00:07:35.440
Actually, I've already started running with it.

00:07:35.440 --> 00:07:38.940
We're going to put in the show notes.

00:07:38.940 --> 00:07:45.780
I put a highlighted blog post of just pytest 8 is here and links to the full changelog.

00:07:46.500 --> 00:07:54.440
What they did was they spread out, if people are running seven, like old 7x pytest, which

00:07:54.440 --> 00:07:55.920
that's what I was using before.

00:07:55.920 --> 00:08:02.920
The changelog's a little, just takes a little bit to parse because they spread it along the

00:08:02.920 --> 00:08:06.260
RC1, RC2, and the final 80 release.

00:08:06.260 --> 00:08:07.820
The changes are all there.

00:08:07.900 --> 00:08:10.060
So I pulled the highlights out.

00:08:10.060 --> 00:08:13.480
So the thing I'm really excited, there's two things I'm really excited about.

00:08:13.480 --> 00:08:19.960
One is when you had an exception, there would just be a red block of exception stuff.

00:08:20.400 --> 00:08:23.200
And there's a whole bunch of cool differences.

00:08:24.080 --> 00:08:32.000
So there's improved diffs when you fail an exception, especially if you do dash VV, so very verbose

00:08:32.000 --> 00:08:35.520
or verbose verbose, however you want to think about that.

00:08:35.520 --> 00:08:39.420
But you get a colored diff instead of the big chunk of red.

00:08:39.420 --> 00:08:40.280
That's awesome.

00:08:40.280 --> 00:08:42.060
Back to this color thing, right?

00:08:42.240 --> 00:08:43.820
Yeah, it's also more colors.

00:08:43.820 --> 00:08:48.980
Normal syntax highlighting, we're used to syntax highlighted code.

00:08:48.980 --> 00:08:52.060
So error reports are now syntax highlighted.

00:08:52.060 --> 00:08:57.920
And the different sections of the error report are separated better.

00:08:57.920 --> 00:09:05.480
And then also, there's better support for standard library containers for diffing.

00:09:05.480 --> 00:09:10.020
There was usually a pretty good tuple diff, for instance.

00:09:10.220 --> 00:09:13.940
But if you had big lists, it was a little bit hard to read.

00:09:13.940 --> 00:09:15.120
It's a little bit better now.

00:09:15.120 --> 00:09:21.340
And then more comprehensive assert rewrites for other comparisons, not just equal, but things

00:09:21.340 --> 00:09:25.080
like not equal, less than equal, other comparisons.

00:09:25.080 --> 00:09:26.900
So that's really cool.

00:09:26.900 --> 00:09:29.320
Help people debug their code.

00:09:29.320 --> 00:09:33.780
That's super nice, because you want to be able to just say, are these two things the same

00:09:33.780 --> 00:09:34.920
and not write code around?

00:09:34.920 --> 00:09:36.080
How do you do that, right?

00:09:36.080 --> 00:09:36.700
Yeah.

00:09:36.700 --> 00:09:37.300
Yep.

00:09:37.300 --> 00:09:43.380
And also, comparisons like less than or less than or equal, it's really nice for the pytest

00:09:43.380 --> 00:09:49.060
to go out and really tell you why that check failed and highlight the part of your data

00:09:49.060 --> 00:09:50.340
where it failed.

00:09:50.340 --> 00:09:52.440
So really, really fun to see that.

00:09:53.480 --> 00:10:00.080
There's the thing that the next thing I wanted to talk about for pytest 8 was probably pretty

00:10:00.080 --> 00:10:02.880
obscure for people that are not using X fail.

00:10:02.880 --> 00:10:07.860
So X fail is a way to say, I expect this test to fail.

00:10:07.860 --> 00:10:10.880
And for a lot of people, why would you expect it to fail?

00:10:11.200 --> 00:10:18.660
But for large organizations, it's pretty common to file a defect and you don't have control

00:10:18.660 --> 00:10:19.020
over it.

00:10:19.020 --> 00:10:20.160
So you can't just go fix it.

00:10:20.160 --> 00:10:22.440
Somebody else is responsible for fixing it.

00:10:22.440 --> 00:10:24.200
So that's how we use it.

00:10:24.200 --> 00:10:30.360
And I mark a test as failing, as expected to fail, and give it a defect number.

00:10:30.940 --> 00:10:39.560
And then when it, and that's not new, but if it passes, there's decisions on how to make

00:10:39.560 --> 00:10:43.360
it X pass or what to deal with, do with if an X fail passes.

00:10:43.360 --> 00:10:46.920
I've talked about that a bunch on the other podcast.

00:10:46.920 --> 00:10:54.840
However, the change for pytest 8 is that with X fails, the traceback never showed up.

00:10:54.900 --> 00:10:55.620
It didn't used to.

00:10:55.620 --> 00:11:01.180
So the change is now, if you, there's a way to turn that on with a, with a -r command,

00:11:01.180 --> 00:11:04.200
you can turn on X fail tracebacks.

00:11:04.200 --> 00:11:11.060
So that's really nice for CI test runs to be able to see what the failure was in CI and not

00:11:11.060 --> 00:11:12.420
have to try to rerun it again.

00:11:12.420 --> 00:11:13.920
So really cool.

00:11:13.920 --> 00:11:15.260
Excited about that.

00:11:15.260 --> 00:11:16.800
There's lots more things.

00:11:16.800 --> 00:11:18.760
So check out the change log.

00:11:18.760 --> 00:11:24.620
The reason why they bumped to eight, I think is because there was a bunch of, they changed

00:11:24.620 --> 00:11:25.980
the way collection works.

00:11:25.980 --> 00:11:31.860
And, and that chain, that behavior change of backwards compatibility made it so that it

00:11:31.860 --> 00:11:33.920
made sense to bump the number.

00:11:33.920 --> 00:11:35.920
I think that's the reason I'm not sure.

00:11:35.920 --> 00:11:41.220
But also it's good to bump the number every once in a while so that we have a, that so that

00:11:41.220 --> 00:11:42.700
you can deal with a deprecations.

00:11:42.700 --> 00:11:45.080
You can get rid of the code that you were meaning to get rid of.

00:11:45.080 --> 00:11:51.720
So I encourage people to run pytest 8 and check it out and turn on, you know, turn on

00:11:51.720 --> 00:11:57.560
the full strict mode and everything so that, you know, if, if anything breaks, you can roll

00:11:57.560 --> 00:11:58.360
back if you need to.

00:11:58.360 --> 00:11:59.720
Awesome.

00:11:59.720 --> 00:12:01.080
This is like Christmas for you, right?

00:12:01.080 --> 00:12:01.840
Yeah.

00:12:01.840 --> 00:12:02.180
Major.

00:12:02.180 --> 00:12:02.840
Yeah.

00:12:02.840 --> 00:12:04.180
A major version release.

00:12:04.180 --> 00:12:05.060
Yeah.

00:12:05.060 --> 00:12:08.460
And it also made me, when I was looking at this, made me realize that I think I need to

00:12:08.460 --> 00:12:09.900
add more color to my blog.

00:12:09.900 --> 00:12:13.220
It's just black and white and it's not very fun.

00:12:13.220 --> 00:12:14.980
So I'm have to add more color.

00:12:14.980 --> 00:12:16.480
Color is always fun.

00:12:16.680 --> 00:12:18.380
I mean, that's the theme of this episode last week.

00:12:18.380 --> 00:12:21.040
It was let's just ship announced open source projects.

00:12:21.040 --> 00:12:22.960
We're releasing this is like color episode.

00:12:22.960 --> 00:12:24.300
Color the color episode.

00:12:24.300 --> 00:12:24.640
Yeah.

00:12:24.640 --> 00:12:27.380
Or as midnight audience puts it out.

00:12:27.380 --> 00:12:28.860
There is a readability episode.

00:12:28.860 --> 00:12:30.200
Very good.

00:12:30.200 --> 00:12:30.940
Indeed.

00:12:30.940 --> 00:12:35.980
Well, let's harken back to a couple of things on my side here.

00:12:36.080 --> 00:12:39.400
So I talked about this Docker work that I've been doing.

00:12:39.400 --> 00:12:43.080
That also kind of led me to the Granian stuff and playing with that as well.

00:12:43.080 --> 00:12:48.600
I also forgot to give a quick shout out to the people like both Andy Shapiro and Bill Crook

00:12:48.600 --> 00:12:50.900
pointed out, said, Hey, you should check out Granian.

00:12:50.900 --> 00:12:53.000
So when I give them credit for sending that in, thank you.

00:12:53.000 --> 00:12:58.880
But as I was doing all these Docker things, I was, you know, you know, when you're in a

00:12:58.880 --> 00:13:03.120
unusual or an unfamiliar, uncomfortable space compared to what you normally do.

00:13:03.120 --> 00:13:08.520
Like right now, my little browser in this episode has maybe nine tabs and that's like

00:13:08.520 --> 00:13:09.300
kind of a lot.

00:13:09.300 --> 00:13:12.700
But when I was doing the Docker stuff, I'd have a 30, 40, 50 tabs.

00:13:12.700 --> 00:13:16.300
And then I would close 30 of them because I'd solve some problem that would work its way.

00:13:16.300 --> 00:13:17.420
It would just tabs everywhere.

00:13:17.420 --> 00:13:19.620
So it was just like exploring stuff all over the place, right?

00:13:19.620 --> 00:13:22.660
Like, wow, I must not know what I'm doing right now.

00:13:22.660 --> 00:13:23.160
And that's true.

00:13:23.160 --> 00:13:27.000
But, you know, that's how you get to where you know what's going on.

00:13:27.000 --> 00:13:31.260
Along that I'd be like, oh, people talk about, oh my gosh, totally giving up on doing

00:13:31.260 --> 00:13:31.520
this.

00:13:31.580 --> 00:13:35.460
I'm using OrbStack or Podman or if they support this OS.

00:13:35.460 --> 00:13:36.500
I'm like, what are these things?

00:13:36.500 --> 00:13:41.700
So I just want to go through a host of Docker goodies that I think people will enjoy.

00:13:41.700 --> 00:13:46.220
Not exactly Python specific, but certainly relevant if you're doing Python in any form

00:13:46.220 --> 00:13:46.980
of containers, right?

00:13:46.980 --> 00:13:49.880
So the first one of three, there's actually more, Brian.

00:13:49.880 --> 00:13:51.020
I'm not going to cover them all here.

00:13:51.020 --> 00:13:54.380
I'm saving some for later because it's just, it'll be a little out of control at that point.

00:13:54.680 --> 00:14:00.860
So OrbStack, if you use Docker and you use Docker on Mac or Windows, typically what you do is

00:14:00.860 --> 00:14:02.260
you get Docker desktop, right?

00:14:02.260 --> 00:14:05.000
So that gives you the Docker commands.

00:14:05.000 --> 00:14:06.960
It allows you to run Docker locally.

00:14:06.960 --> 00:14:11.240
I think it might use, maybe use VirtualBox or something on Mac.

00:14:11.240 --> 00:14:13.860
And it uses probably Windows subsystem for Linux on Windows.

00:14:13.860 --> 00:14:19.820
But you can run like Linux VM, Linux containers on top of some hidden thing of Linux, right?

00:14:19.820 --> 00:14:20.260
Yeah.

00:14:20.260 --> 00:14:22.000
So OrbStack is kind of that.

00:14:22.000 --> 00:14:25.980
They say, say goodbye to slow and clunky containers and VMs.

00:14:25.980 --> 00:14:31.800
It's a light and easy way to run Docker containers and Linux on one machine, right?

00:14:31.800 --> 00:14:35.220
So basically gives you a nice UI around it.

00:14:35.220 --> 00:14:38.060
It is 100% compatible with Docker.

00:14:38.060 --> 00:14:42.960
So you could say Docker run, Docker exec, Docker compose up or whatever it is you say.

00:14:42.960 --> 00:14:48.680
And instead of using the Docker engine, it'll use this OrbStack engine, which is pretty neat.

00:14:48.680 --> 00:14:53.760
It also has its own CLI if you want to directly work with it.

00:14:53.760 --> 00:14:58.120
But basically it's kind of a one open source and two more lightweight.

00:14:58.120 --> 00:15:01.340
They've got a bunch of cool commands, but they show down here somewhere.

00:15:01.340 --> 00:15:06.600
Speed, if you're going to open, it says open edX.

00:15:06.600 --> 00:15:11.340
I guess that's probably the Docker compose setup for edX.

00:15:11.340 --> 00:15:15.100
I'm going to provision a development environment for it.

00:15:15.100 --> 00:15:17.640
It's pretty long still because I guess that's a beast of an app.

00:15:17.640 --> 00:15:23.780
17 minutes on OrbStack, but 45 minutes on Docker desktop to build post-hog, whatever that is.

00:15:23.780 --> 00:15:26.740
It's like a quarter or a third of the time.

00:15:26.740 --> 00:15:31.260
It uses, if you're on a laptop, it uses like less than 25% of the battery.

00:15:31.260 --> 00:15:36.520
It's like a quarter or whatever, right?

00:15:36.520 --> 00:15:37.100
But pretty cool, right?

00:15:37.100 --> 00:15:37.500
Yeah.

00:15:37.500 --> 00:15:37.900
Yeah.

00:15:37.900 --> 00:15:38.100
Yeah.

00:15:38.100 --> 00:15:41.620
And oh, another thing, I think, I think, let me look.

00:15:41.620 --> 00:15:42.160
Yes.

00:15:42.160 --> 00:15:42.980
This is a big deal.

00:15:42.980 --> 00:15:44.860
You and I were just talking about this before we pressed record.

00:15:44.860 --> 00:15:47.360
It says you can run Linux machines without a fuss.

00:15:47.440 --> 00:15:57.580
So one of the things I can do is I can go to like parallels and I can run Linux, Ubuntu or whatever on my Mac, my M2 mini, my M2 pro mini.

00:15:57.580 --> 00:15:59.060
However, those words go together.

00:15:59.060 --> 00:16:00.940
Whatever order makes the right sense there.

00:16:01.140 --> 00:16:08.240
I can run them, but I can only run the ARM 64 versions because I only have an ARM 64 processor.

00:16:08.240 --> 00:16:23.520
But this one allows you to run Intel machines on Apple Silicon with Rosetta, which allows you then to run Intel based Docker images and basically be closer to what your production environment is if you're using Apple Silicon.

00:16:23.700 --> 00:16:24.980
So that's also a nice feature of this.

00:16:24.980 --> 00:16:25.800
That's pretty cool.

00:16:25.800 --> 00:16:26.240
Yeah.

00:16:26.240 --> 00:16:30.900
It does cost money if you're a company, but it has a free version if you're just a person.

00:16:30.900 --> 00:16:35.160
So not an endorsement, but I thought people might find this to be pretty useful.

00:16:35.160 --> 00:16:35.760
It looks pretty cool.

00:16:35.760 --> 00:16:36.200
Yeah.

00:16:36.200 --> 00:16:37.740
Next one, Podman.

00:16:37.740 --> 00:16:41.700
Podman is the best free and open source container tools.

00:16:41.700 --> 00:16:44.700
So you can manage Docker containers, pods.

00:16:44.700 --> 00:16:50.020
And that term, I believe, comes from Kubernetes, like the unit of execution in Kubernetes is called a pod.

00:16:50.020 --> 00:16:51.960
And images with Podman.

00:16:52.460 --> 00:16:57.500
So yeah, it lets you seamlessly work with containers and Kubernetes from your local environment.

00:16:57.500 --> 00:16:59.100
So this is also really cool.

00:16:59.100 --> 00:17:01.000
A lot of people are doing interesting stuff.

00:17:01.000 --> 00:17:03.180
GitHub Action plugins.

00:17:03.180 --> 00:17:07.060
It's got a Visual Studio Code plugin and different things.

00:17:07.060 --> 00:17:13.060
And then the third one, actually 3.5 because it kind of is two, is this is pretty interesting.

00:17:13.060 --> 00:17:21.900
So one of the things that kind of is inspiring once you get all the Docker stuff going is like, okay, well, if that open source big complicated thing and some technology,

00:17:21.900 --> 00:17:24.120
I don't know how to run like PHP or whatever.

00:17:24.120 --> 00:17:29.160
But if it has a Docker container or a Docker composed set of containers, I can run it.

00:17:29.160 --> 00:17:33.400
All I got to do is just tell Docker to update it when there's a new one and just run it.

00:17:33.400 --> 00:17:34.820
That's super easy to do, right?

00:17:35.180 --> 00:17:40.480
So there's this like taking that to kind of the extreme is there's this thing called Casa OS.

00:17:40.480 --> 00:17:41.180
Have you heard of this?

00:17:41.180 --> 00:17:41.740
No.

00:17:41.740 --> 00:17:42.400
I neither.

00:17:42.400 --> 00:17:45.100
But it has 20,000 GitHub stars, which is pretty cool.

00:17:45.100 --> 00:17:48.460
They call it your personal cloud operating system.

00:17:48.460 --> 00:17:55.500
Community based open source software focused on delivering simple personal cloud experience around the Docker ecosystem.

00:17:55.700 --> 00:18:01.520
So basically, if there's a thing that runs Docker, this is like an OS for running and a platform for running all that.

00:18:01.520 --> 00:18:05.820
So it gives you a UI into this OS that they give you.

00:18:05.820 --> 00:18:08.940
And it says, look, you can collect all your precious data.

00:18:08.940 --> 00:18:18.100
It'll like tie together Google Drive, Dropbox, iCloud, OneDrive, et cetera, et cetera, hard drives and everything into just one drive view.

00:18:18.340 --> 00:18:23.580
And then you can just access it and like map that drive over to your TV or your computer or whatever.

00:18:23.580 --> 00:18:30.440
There's somewhere in here where they've got all these apps that you can go just grab and install supports.

00:18:30.440 --> 00:18:33.700
A lot of them are unfamiliar to me because I haven't done this enough.

00:18:33.700 --> 00:18:38.520
But like couch potato, duck DNS, photoprism, and they just plug into this thing.

00:18:38.520 --> 00:18:39.780
So this is pretty interesting, right?

00:18:39.780 --> 00:18:40.620
I think.

00:18:40.620 --> 00:18:41.260
Yeah.

00:18:41.260 --> 00:18:42.100
You think, right?

00:18:42.100 --> 00:18:42.720
Yeah.

00:18:42.720 --> 00:18:44.920
I don't know what I would do with it.

00:18:44.920 --> 00:18:45.700
But, you know.

00:18:45.700 --> 00:18:46.440
Yeah.

00:18:46.440 --> 00:18:51.340
So one of the things that I think this is sort of coming out of is they have this thing called Zimma Cube,

00:18:51.340 --> 00:18:59.380
which instead of running all your stuff on the Internet, this is like kind of like a really fancy NAS network attached storage.

00:18:59.380 --> 00:19:02.000
But it also runs Docker and all these things.

00:19:02.000 --> 00:19:05.760
So it says you can have up to 164 terabytes of SSD.

00:19:05.760 --> 00:19:08.640
But then it also runs all of these things.

00:19:08.640 --> 00:19:10.440
And this is on Kickstarter.

00:19:10.440 --> 00:19:16.520
And it was already funded at around 1.1 million US, which is a lot apparently.

00:19:16.520 --> 00:19:20.520
So this is kind of the intended destination for that.

00:19:20.520 --> 00:19:21.660
But I think you can run it anywhere.

00:19:21.660 --> 00:19:23.040
So pretty cool, right?

00:19:23.040 --> 00:19:23.700
Yeah.

00:19:23.700 --> 00:19:26.720
I mean, some people think over a million dollars is a lot.

00:19:26.720 --> 00:19:29.040
I don't, you know, chump change.

00:19:29.040 --> 00:19:29.760
But, you know.

00:19:29.960 --> 00:19:30.200
Yeah.

00:19:30.200 --> 00:19:33.840
So I don't think this thing is shipped yet.

00:19:33.840 --> 00:19:37.380
I think it's in development still now that their Kickstarter ended.

00:19:37.380 --> 00:19:38.160
But, yeah.

00:19:38.160 --> 00:19:40.140
So there's a whole bunch of different fun things.

00:19:40.140 --> 00:19:44.600
So Orb, OrbStack, Podman, Kasa, and Zimma Cube.

00:19:44.600 --> 00:19:45.120
Okay.

00:19:45.120 --> 00:19:47.220
So I have a question about the OrbStack.

00:19:47.220 --> 00:19:51.720
That doesn't generate Docker images, though, does it?

00:19:51.720 --> 00:19:55.300
I mean, I have to have OrbStack stuff on the server as well, right?

00:19:55.300 --> 00:19:55.860
No.

00:19:55.860 --> 00:19:57.200
It will manage.

00:19:57.200 --> 00:20:04.000
It is a transparent API or CLI to the Docker CLI.

00:20:04.000 --> 00:20:04.600
Oh, okay.

00:20:04.600 --> 00:20:11.240
So if you just install this, then you can go to your command line and type Docker build, whatever.

00:20:11.240 --> 00:20:13.040
And it'll download and do all the things.

00:20:13.040 --> 00:20:16.500
But then when you ship it to production, you could have real Docker there.

00:20:16.500 --> 00:20:17.060
Okay.

00:20:17.060 --> 00:20:17.540
Okay.

00:20:17.540 --> 00:20:17.840
Right?

00:20:17.840 --> 00:20:18.460
Yeah, I didn't understand.

00:20:18.460 --> 00:20:24.440
It's more like, it's more, I think it's mostly around kind of, yeah, it's mostly on the desktop side of things.

00:20:24.440 --> 00:20:28.100
So it's like a simpler, lighter way to do desktop stuff.

00:20:28.100 --> 00:20:29.780
Possibly you could run it on your own.

00:20:29.780 --> 00:20:33.180
Like I said, it does have its own CLI for doing things its way.

00:20:33.180 --> 00:20:36.840
But I think people will just use it as a Docker desktop alternative.

00:20:36.840 --> 00:20:37.400
Yeah.

00:20:37.400 --> 00:20:46.460
And it looks like it's the business and commercial use pricing is slightly cheaper than Docker desktop right now.

00:20:46.460 --> 00:20:48.300
So there's a benefit there as well.

00:20:48.300 --> 00:20:52.080
I didn't remember that Docker had gone commercial on that side as well.

00:20:52.080 --> 00:20:54.440
So that makes them more comparable, right?

00:20:54.440 --> 00:20:56.520
As opposed to, yeah, there's this other free thing.

00:20:56.520 --> 00:20:57.920
It's not terrible though.

00:20:57.920 --> 00:21:06.600
I mean, like I just, we just had to re-up our Docker at work and it's what we, I think I paid 300 bucks for five seats per year.

00:21:06.600 --> 00:21:07.180
That's not bad.

00:21:07.180 --> 00:21:08.200
Yeah, that's not bad.

00:21:08.200 --> 00:21:09.700
Not when it's not your money, it's fine.

00:21:09.700 --> 00:21:10.620
It's not my money.

00:21:10.620 --> 00:21:13.080
It's easier to spend not your money.

00:21:13.080 --> 00:21:13.640
Yeah.

00:21:13.640 --> 00:21:16.560
So, yeah.

00:21:16.560 --> 00:21:18.280
I love not your money spending.

00:21:18.280 --> 00:21:20.940
But anyway, pretty cool.

00:21:20.940 --> 00:21:23.660
I'll look forward to checking that out.

00:21:23.660 --> 00:21:25.820
I actually think it'd be fun to have one of those Zima cubes.

00:21:25.820 --> 00:21:27.080
I do too.

00:21:27.080 --> 00:21:28.240
I would really consider it.

00:21:28.240 --> 00:21:33.560
Wouldn't it be awesome to just have all those cool apps running plus, you know, 100 terabytes of storage?

00:21:33.980 --> 00:21:34.160
Yeah.

00:21:34.160 --> 00:21:35.820
So it's like the cloud, but it's at home.

00:21:35.820 --> 00:21:36.940
So it's just-

00:21:36.940 --> 00:21:36.980
Exactly.

00:21:36.980 --> 00:21:37.720
It's topped in?

00:21:37.720 --> 00:21:40.960
It's more like fog.

00:21:40.960 --> 00:21:42.380
It's way lower down.

00:21:42.380 --> 00:21:43.160
It doesn't-

00:21:43.160 --> 00:21:43.940
It's fog.

00:21:43.940 --> 00:21:45.160
It's personal.

00:21:45.160 --> 00:21:46.780
Personal cloud is fog.

00:21:46.780 --> 00:21:48.180
Personal fog.

00:21:48.180 --> 00:21:49.340
That's nice.

00:21:49.340 --> 00:21:50.240
Okay.

00:21:50.240 --> 00:21:50.700
Cool.

00:21:50.700 --> 00:21:52.100
Okay.

00:21:52.220 --> 00:21:54.260
So that's some good news.

00:21:54.260 --> 00:21:57.960
And the next step, I don't know if this is good news or bad news.

00:21:57.960 --> 00:21:59.200
It depends on your perspective.

00:21:59.200 --> 00:22:07.120
So I'd like to talk about GitHub Copilot and other assisted AI stuff.

00:22:07.120 --> 00:22:17.980
So Visual Studio Magazine came out with this article called New GitHub Copilot Research Finds Downward Pressure on Code Quality.

00:22:18.340 --> 00:22:35.100
So the question really was kind of, if I'm using coding with Copilot, if I'm using Copilot to help me write some stuff, is the Copilot kind of like having a junior developer?

00:22:35.100 --> 00:22:38.860
Is it more intern or is it more senior dev?

00:22:38.860 --> 00:22:39.240
Yeah.

00:22:39.240 --> 00:22:40.900
Is it more intern or more senior dev?

00:22:40.900 --> 00:22:52.840
And so the result was, or their question was, is it more senior dev or more akin to the just jointed work of a short-term contractor?

00:22:52.840 --> 00:23:01.200
Which I thought that was appropriate because a contractor might be very skilled, but they don't really care about, they might not care about maintenance too much.

00:23:01.200 --> 00:23:02.240
Yeah, exactly.

00:23:02.240 --> 00:23:03.620
So-

00:23:03.620 --> 00:23:06.120
Yeah, the technical debt is not a problem when you're done next week.

00:23:06.380 --> 00:23:08.660
Yeah, and you don't have to, yeah, yeah.

00:23:08.660 --> 00:23:13.940
One of the best ways to not deal with legacy code is shift, switch jobs.

00:23:13.940 --> 00:23:22.600
Anyway, the answer is summarized of this white paper is summarized by,

00:23:23.060 --> 00:23:28.040
We find disconcerting trends for maintainability.

00:23:28.040 --> 00:23:40.880
Code churn, which is the percentage of lines that are reverted or updated less than two weeks after being authored, is projected to double in 2024 as compared to 2021, pre-AI baseline.

00:23:40.880 --> 00:23:51.480
We further find that the percentage of added code or, and copy pasted code is increasing in proportion to updated, deleted, and moved code.

00:23:51.480 --> 00:24:02.780
In this regard, AI generated code resembles an iterant contributor prone to violating the dryness, the don't repeat yourself, of the repositories visited.

00:24:03.220 --> 00:24:08.720
So this isn't that surprising to me, but it's interesting that there was a study done by GitClear.

00:24:08.720 --> 00:24:13.300
And also interesting that it was, you know, printed in Visual Studio magazine.

00:24:13.300 --> 00:24:22.880
But I don't know if this is, if the, I guess the magazine probably doesn't have any ties to Microsoft, but, or GitHub.

00:24:22.880 --> 00:24:24.260
But anyway, interesting.

00:24:25.600 --> 00:24:26.000
Indeed.

00:24:26.000 --> 00:24:29.780
So, Bart out in the audience has a different analogy.

00:24:29.780 --> 00:24:31.060
I'd like to adapt.

00:24:31.060 --> 00:24:32.220
It's not junior or senior.

00:24:32.220 --> 00:24:34.160
It's a parrot that recycles what it found on the web.

00:24:34.160 --> 00:24:38.620
So I'm thinking more stack overflow, copy and paste action type of stuff here.

00:24:38.620 --> 00:24:41.260
And Grant says, I read this too.

00:24:41.260 --> 00:24:42.400
The research makes sense.

00:24:42.400 --> 00:24:43.280
Sounds right.

00:24:43.280 --> 00:24:47.380
But Copilot has benefits of senior devs like applying good patterns faster.

00:24:47.380 --> 00:24:48.100
Yeah.

00:24:48.100 --> 00:24:48.960
Which is pretty interesting.

00:24:50.020 --> 00:24:56.120
There was some comment in the article that essentially stuff still got done faster.

00:24:56.120 --> 00:25:00.480
It's, or at least got to something working faster.

00:25:00.480 --> 00:25:06.980
It's just that people often go back and, you know, back later and modify and refactor the code.

00:25:06.980 --> 00:25:09.680
And that's not necessarily bad, but, you know.

00:25:09.680 --> 00:25:15.240
You get the sense that Copilot is very focused on what prompt did you give me?

00:25:15.240 --> 00:25:16.260
I'm going to do that.

00:25:16.260 --> 00:25:19.480
Rather than, I understand what your entire project is.

00:25:19.480 --> 00:25:21.120
I've seen all 200 files.

00:25:21.120 --> 00:25:22.360
I've thought that through.

00:25:22.360 --> 00:25:26.320
Now, in that context, the answer to your question is X rather than Y.

00:25:26.320 --> 00:25:26.640
Right?

00:25:26.640 --> 00:25:27.720
I don't think it does that.

00:25:27.720 --> 00:25:34.000
I think, I mean, I think it would be a very high level of like token usage that it would have to take into account.

00:25:34.000 --> 00:25:34.780
I just don't.

00:25:34.780 --> 00:25:37.360
I think it probably just goes like, all right, well, you asked me a sentence.

00:25:37.360 --> 00:25:38.060
Here's the answer.

00:25:38.060 --> 00:25:38.720
Python.

00:25:38.720 --> 00:25:39.480
Yeah.

00:25:39.480 --> 00:25:41.200
I actually want to play with it more.

00:25:41.200 --> 00:25:42.960
I haven't really played with Copilot too much.

00:25:42.960 --> 00:25:48.140
It's not something I can use at work, but on personal projects, I think it'd be fun to use it more.

00:25:48.140 --> 00:25:58.520
But the, we're still, I mean, it seems like, you know, it seems like, like, ChatGPT is kind of old now and Copilot is like really old.

00:25:58.520 --> 00:26:03.140
But really, we're really just starting to use these tools in development.

00:26:03.140 --> 00:26:04.700
Like they said, pre-2021.

00:26:04.700 --> 00:26:10.180
So it's still only a couple of years that we have under our belt working with these things.

00:26:10.180 --> 00:26:13.940
And I think that, I think that the tools can get better.

00:26:13.940 --> 00:26:21.540
And I, I, I'm looking forward to being able to, I both worry about the developers that are going to lose jobs and stuff because of this.

00:26:21.640 --> 00:26:25.380
But, I also, I think that the tools will probably get better.

00:26:25.380 --> 00:26:32.660
Like you said, if it can look at your entire project and say, Hey, in this context, this is the right call.

00:26:32.660 --> 00:26:34.020
You're, you're repeating something.

00:26:34.020 --> 00:26:36.700
You can, we can, we already, you already implemented that.

00:26:36.700 --> 00:26:38.340
Let's call this function instead.

00:26:38.340 --> 00:26:40.020
that would be great.

00:26:40.020 --> 00:26:49.940
And also if, if we could have AI tools to, to help, maybe keep a style similar or the, just a general philosophy similar around a project.

00:26:49.940 --> 00:26:53.260
I think there's room for that, once it gets there.

00:26:53.260 --> 00:26:55.540
So yeah, I wouldn't be surprised to see that happen.

00:26:55.540 --> 00:26:56.000
Yeah.

00:26:56.000 --> 00:26:56.600
All right.

00:26:56.600 --> 00:26:57.920
Extra, extra time.

00:26:57.920 --> 00:26:58.920
Extra, extra.

00:26:58.920 --> 00:27:00.020
Oh, yeah.

00:27:00.020 --> 00:27:04.440
So my extras are, like, did you know that pytest 8 is out?

00:27:04.440 --> 00:27:06.620
Pip install dash you.

00:27:06.620 --> 00:27:08.040
Pip install dash you.

00:27:08.240 --> 00:27:18.280
But I also, if, if, pytest is, is one of those things that you've always been thinking about doing, head on over to, courses.pythontest.com.

00:27:18.280 --> 00:27:24.340
and you can learn it really fast, using a course or you can grab the book of course.

00:27:24.340 --> 00:27:25.780
So yeah, excellent.

00:27:25.780 --> 00:27:26.260
Yeah.

00:27:26.260 --> 00:27:26.860
That's very exciting.

00:27:26.860 --> 00:27:27.960
Do you have any extras?

00:27:27.960 --> 00:27:29.780
I do have a couple of things.

00:27:29.780 --> 00:27:32.120
I want to quick give a shout out to one.

00:27:32.120 --> 00:27:37.840
This has been around for plenty long, although it's changed behind the scenes, not in a way, anyway, really necessarily notice.

00:27:38.040 --> 00:27:38.680
But it has.

00:27:38.680 --> 00:27:41.020
And that's just, I want to encourage people to join our newsletter.

00:27:41.020 --> 00:27:45.620
If you go to Python by set FM, right below the hero image, there's a thing that says new letter.

00:27:45.620 --> 00:27:47.020
If you go newsletter, you go over there.

00:27:47.020 --> 00:27:48.600
It has become a friend of the show.

00:27:48.600 --> 00:27:50.420
Put your information in there.

00:27:50.420 --> 00:28:00.840
This is actually, a revamped as part of my work that I did with ListMonk, the private self-hosted email stuff moving away from MailChimp and others.

00:28:00.900 --> 00:28:04.120
We talked about that last week, two weeks ago, some, some number of weeks ago.

00:28:04.500 --> 00:28:06.760
And that means it doesn't go anywhere.

00:28:06.760 --> 00:28:07.880
We don't share it with anyone.

00:28:07.880 --> 00:28:14.640
But Brian and I are planning some fun stuff and trying to do more with newsletters and reaching out and connecting with you all.

00:28:14.720 --> 00:28:19.640
So we would love for you to go to Python by set FM, click on newsletter and put your information in there.

00:28:19.640 --> 00:28:22.560
We won't share it, but we'll try to make, make it worth your while.

00:28:22.560 --> 00:28:26.880
But we also haven't emailed a lot on it yet in the past.

00:28:26.880 --> 00:28:32.720
So, when we start using it, don't think that we like bought your, your name off some list.

00:28:32.720 --> 00:28:34.560
It's a, that we're just starting to use it more.

00:28:34.560 --> 00:28:35.820
Yes, absolutely.

00:28:35.820 --> 00:28:42.740
It drives me crazy when people mark, they'll come sign up for your newsletter and then they'll mark it as spam, which means other people have a harder time getting it.

00:28:42.740 --> 00:28:47.900
It's like you, you typed in your information into there and then you mark just, it doesn't unsubscribe.

00:28:47.900 --> 00:28:49.060
Just please use the unsubscribe.

00:28:49.060 --> 00:28:50.560
Just use the unsubscribe.

00:28:51.180 --> 00:28:52.460
Yeah, I actually wrote a ton of software.

00:28:52.460 --> 00:28:57.440
I have a whole separate Docker thing running that like monitors for people marking stuff as spam.

00:28:57.440 --> 00:29:02.560
Cause there's ways that you can receive hooks about that information and automatically unsubscribe people.

00:29:02.560 --> 00:29:07.280
If they do that, even if they don't unsubscribe, but you know, it's kind of a sense that damage is still done a little bit.

00:29:07.280 --> 00:29:08.480
Email is a complete nightmare.

00:29:08.480 --> 00:29:09.240
All right.

00:29:09.240 --> 00:29:10.260
Let's get away from email.

00:29:10.260 --> 00:29:11.160
Cause it makes me upset.

00:29:11.160 --> 00:29:12.040
All right.

00:29:12.040 --> 00:29:15.000
So by Dantic, I Dan X, awesome.

00:29:15.000 --> 00:29:21.020
Sydney Runkle, who works, the Pydantic company, was on talk Python.

00:29:21.020 --> 00:29:25.960
And then recently released a brand new version, version 2.6.0.

00:29:25.960 --> 00:29:31.720
And Samuel Colvin said, this is probably the biggest, most important, important release since 2.0.

00:29:31.720 --> 00:29:38.580
Well, if you scroll through the release notes for Pydantic 2.6, there is a lot going on here.

00:29:39.220 --> 00:29:47.360
And even just the new contributors is massive, but apparently a ton of speed up some other things going on here that you can check it out.

00:29:47.360 --> 00:29:50.500
So if you're using Pydantic, everything's excellent.

00:29:50.500 --> 00:29:52.920
Just no more Python 3.7.

00:29:53.040 --> 00:29:57.760
Cause we've already had the thanks and goodbye to Python 3.7.

00:29:57.760 --> 00:30:00.880
We're onto 3.8 as the minimum reasonable Python these days.

00:30:00.880 --> 00:30:01.620
Cool though, huh?

00:30:01.620 --> 00:30:02.040
Yeah.

00:30:02.040 --> 00:30:02.540
Very cool.

00:30:02.540 --> 00:30:03.800
A lot of contributors.

00:30:03.800 --> 00:30:05.560
There's a lot going on here.

00:30:05.880 --> 00:30:07.060
It's a popular library.

00:30:07.060 --> 00:30:10.400
Like if we go over here and we see like, okay, well how many things depend on it?

00:30:10.400 --> 00:30:15.560
Where's the used by 318,000 projects?

00:30:15.560 --> 00:30:17.360
It lists one, two, three, four, five.

00:30:17.360 --> 00:30:18.400
It lists like six.

00:30:18.400 --> 00:30:22.560
And it says plus, as in there's more, it says plus 317,946.

00:30:22.560 --> 00:30:25.660
Like, that's not really, not really representative, but okay.

00:30:25.660 --> 00:30:26.940
I understand the UI.

00:30:26.940 --> 00:30:27.360
Anyway.

00:30:27.360 --> 00:30:27.560
Yeah.

00:30:27.560 --> 00:30:28.460
It's used by a lot of people.

00:30:28.460 --> 00:30:31.620
Well, it's used by more projects than their stars.

00:30:32.020 --> 00:30:34.120
So some people are using it and don't like it apparently.

00:30:34.120 --> 00:30:34.720
Maybe.

00:30:34.720 --> 00:30:35.260
Come on.

00:30:35.260 --> 00:30:36.140
Start this up people.

00:30:36.140 --> 00:30:38.920
The only reason you don't see a star for me is I'm not logged in.

00:30:38.920 --> 00:30:39.460
All right.

00:30:39.460 --> 00:30:44.420
And finally, I wrote a new essay called use custom search engines way more.

00:30:44.420 --> 00:30:50.280
This is not DuckDuckGo versus Google versus Bing, but rather if you use a proper browser

00:30:50.280 --> 00:30:56.840
like Vivaldi or Firefox or even Chrome, although anyway, you can go and set custom search

00:30:56.840 --> 00:30:58.180
engines for all sorts of cool stuff.

00:30:58.180 --> 00:31:00.400
Like one I set was PyPI, Brian.

00:31:00.640 --> 00:31:04.480
So if I go to my, my address bar, I don't know if I've done it on my, my streaming one

00:31:04.480 --> 00:31:04.720
here.

00:31:04.720 --> 00:31:07.380
Let me see now only my proper one.

00:31:07.380 --> 00:31:12.900
This is like a separate user account over here, but I could go and just type PyPI space

00:31:12.900 --> 00:31:20.580
pytest and it will search using PyPI.org's search results directly for pytest or whatever

00:31:20.580 --> 00:31:21.340
it is you type there.

00:31:21.340 --> 00:31:22.940
I didn't know you could do this.

00:31:22.940 --> 00:31:23.720
Isn't this awesome?

00:31:23.720 --> 00:31:29.500
So if you want to search unsplash for, stock letters, you type U space and you type

00:31:29.500 --> 00:31:33.080
the thing or S O space, you directly search on stack overflow.

00:31:33.080 --> 00:31:37.180
So instead of searching for it, oh, I was looking in, looking for stack overflow.

00:31:37.180 --> 00:31:40.900
So you scroll through till you find the result and you go, you know, just like, boom, just

00:31:40.900 --> 00:31:46.560
like a super short or GH for GitHub to search only repositories, not users or whatever you want

00:31:46.560 --> 00:31:48.360
to type in incredibly easy.

00:31:48.460 --> 00:31:50.580
So that's my, my essay and my quick little.

00:31:50.580 --> 00:31:52.740
So that's, that's not built in already.

00:31:52.740 --> 00:31:57.120
You have to, well, it's supported, but you have to like configure it on your browser.

00:31:57.120 --> 00:31:57.840
You have to type.

00:31:57.840 --> 00:31:58.220
Yeah.

00:31:58.220 --> 00:31:58.940
You have to type.

00:31:58.940 --> 00:32:04.440
Basically, you go to Vivaldi search and then you find, just go enter a new search

00:32:04.440 --> 00:32:05.960
engine or there's ways to do it in Firefox.

00:32:05.960 --> 00:32:07.100
There's a way to do it in Chrome.

00:32:07.100 --> 00:32:07.540
They're all different.

00:32:07.540 --> 00:32:07.740
Okay.

00:32:07.740 --> 00:32:11.780
But then you just figure out if you just search a site, like if you search stack overflow,

00:32:11.780 --> 00:32:16.480
you'll see it's stack overflow.com slash search question mark Q equals some string.

00:32:16.640 --> 00:32:20.040
And so you just put percent S there and say that's the search engine.

00:32:20.040 --> 00:32:20.620
Okay.

00:32:20.620 --> 00:32:23.040
I think I'll do a PB for Python bytes.

00:32:23.040 --> 00:32:25.280
Oh, you know what?

00:32:25.280 --> 00:32:28.940
I'm feeling, I'm feeling like we could totally do this.

00:32:28.940 --> 00:32:30.880
I mean, the URL's right up there.

00:32:30.880 --> 00:32:31.380
Yeah.

00:32:31.380 --> 00:32:32.040
Q equals that.

00:32:32.040 --> 00:32:32.300
Yeah.

00:32:32.300 --> 00:32:32.700
Why not?

00:32:32.700 --> 00:32:33.080
Yeah.

00:32:33.080 --> 00:32:33.700
Skip one step.

00:32:33.700 --> 00:32:34.180
Beautiful.

00:32:34.180 --> 00:32:36.260
Anyway, that's my set of extras.

00:32:36.260 --> 00:32:37.040
Very cool.

00:32:37.040 --> 00:32:37.520
Thanks.

00:32:37.520 --> 00:32:40.040
well, how about funny stuff?

00:32:40.040 --> 00:32:41.400
This one's quick and short.

00:32:41.400 --> 00:32:41.920
Okay.

00:32:41.920 --> 00:32:44.060
It's a picture, but you don't need to know anything about the picture.

00:32:44.260 --> 00:32:46.320
It's just a lawyer arguing a case.

00:32:46.320 --> 00:32:48.220
Hey, Brian says, your honor.

00:32:48.220 --> 00:32:52.000
My client didn't know they were pushing to the main branch.

00:32:52.000 --> 00:32:54.520
That's funny.

00:32:54.520 --> 00:32:54.940
Yeah.

00:32:54.940 --> 00:32:55.340
That's it.

00:32:55.340 --> 00:32:57.080
I didn't know I was pushing to the main branch.

00:32:57.080 --> 00:32:57.980
This is my defense.

00:32:57.980 --> 00:32:59.060
I'm sorry.

00:32:59.060 --> 00:33:01.180
I took down the website during Black Friday.

00:33:01.180 --> 00:33:03.420
I thought it was my, my fork.

00:33:03.420 --> 00:33:05.480
That's funny.

00:33:05.480 --> 00:33:06.000
Yeah.

00:33:06.000 --> 00:33:10.340
How often have you like, I guess you don't do this too much, but, it's a three day

00:33:10.340 --> 00:33:10.760
weekend.

00:33:10.760 --> 00:33:15.560
I want to make sure that I have my stuff pushed to, to the central repo.

00:33:15.560 --> 00:33:17.660
So push, but work at home, right?

00:33:17.660 --> 00:33:18.560
You want to like, yeah.

00:33:18.560 --> 00:33:19.840
And sync it back up or whatever.

00:33:19.840 --> 00:33:20.420
Yeah.

00:33:20.420 --> 00:33:22.500
But, but make sure you're on a branch.

00:33:22.500 --> 00:33:24.820
So, okay.

00:33:24.820 --> 00:33:28.580
We were talking about a junior versus senior a little bit on AI stuff.

00:33:28.580 --> 00:33:35.400
So I wanted to share a little picture also of, this was, I saw this on, Mastodon,

00:33:35.400 --> 00:33:40.900
um, junior versus senior developer, junior, it's a timeline thing.

00:33:40.900 --> 00:33:45.260
so the junior developer working on project encompasses the entire time.

00:33:45.260 --> 00:33:51.320
Senior developer finding the motivation to start takes up like 90%, 80% of the time, and

00:33:51.320 --> 00:33:53.060
then actually doing it at the end.

00:33:53.060 --> 00:33:55.020
and the total time is equal.

00:33:55.020 --> 00:33:56.680
Yeah.

00:33:56.680 --> 00:33:57.820
Yeah.

00:33:57.820 --> 00:33:58.340
That's amazing.

00:33:58.500 --> 00:34:01.980
I would have altered it to make the senior, like the total time is like a little bit

00:34:01.980 --> 00:34:02.460
less.

00:34:02.460 --> 00:34:04.180
It's just, yeah.

00:34:04.180 --> 00:34:04.700
Yeah.

00:34:04.700 --> 00:34:08.540
And the junior needs a little bit of finding the motivation, but just a tiny bit.

00:34:08.540 --> 00:34:08.920
Yeah.

00:34:08.920 --> 00:34:11.620
It's still, it's still a good one.

00:34:11.620 --> 00:34:12.080
Yeah.

00:34:12.080 --> 00:34:13.220
Cool.

00:34:13.220 --> 00:34:17.760
Well, thanks again for oops, such a great episode.

00:34:17.760 --> 00:34:19.240
Good to talk to you this week.

00:34:19.240 --> 00:34:22.740
It's good to have everybody in the showing up for the live show.

00:34:22.740 --> 00:34:23.640
Thank you very much.

00:34:23.640 --> 00:34:26.180
If you want to, what's that link again?

00:34:26.180 --> 00:34:28.420
If you, if people want to go watch the live show, I would have altered it to make the senior,

00:34:28.420 --> 00:34:28.760
live show.

00:34:28.760 --> 00:34:31.380
they can buy them by set of him slash live.

00:34:31.380 --> 00:34:31.940
Yeah.

00:34:31.940 --> 00:34:32.680
All right.

00:34:32.680 --> 00:34:33.120
Cool.

00:34:33.120 --> 00:34:37.300
plus if you just go to pythonbytes.fm, it's right at the top there.

00:34:37.300 --> 00:34:37.520
Yeah.

00:34:37.520 --> 00:34:39.000
So thanks a lot.

00:34:39.000 --> 00:34:39.460
We make it easy.

00:34:39.460 --> 00:34:40.660
We make it easy for people.

00:34:40.660 --> 00:34:41.320
Yeah.

00:34:41.320 --> 00:34:42.160
All right.

00:34:42.160 --> 00:34:43.020
See you next week.

