WEBVTT

00:00:00.100 --> 00:00:04.220
<v Michael Kennedy>Hello and welcome to Python Bytes, where we deliver Python news and headlines directly

00:00:04.740 --> 00:00:13.980
<v Michael Kennedy>to your earbuds. This is episode 464, recorded January 5th, 2026. Brian, it's 2026. Amazing.

00:00:14.600 --> 00:00:15.160
<v Brian Okken>It is amazing.

00:00:15.560 --> 00:00:16.100
<v Michael Kennedy>I'm Michael Kennedy.

00:00:16.480 --> 00:00:17.080
<v Michael Kennedy>I'm Brian Okken.

00:00:17.400 --> 00:00:22.860
<v Michael Kennedy>We're here to bring you another year of awesome Python news, and we've got a bunch of good ones

00:00:23.260 --> 00:00:27.699
<v Michael Kennedy>queued up here. I've got a pretty interesting spy story to tell people, Brian. It's going to be

00:00:27.640 --> 00:00:32.439
<v Michael Kennedy>very fun. Cool. Yes. If you're listening and you're not subscribed to the newsletter, you

00:00:32.560 --> 00:00:37.140
<v Michael Kennedy>definitely should. It's super high quality. We put a lot of extra details, extra information,

00:00:37.420 --> 00:00:42.760
<v Michael Kennedy>not just a emailing version of the show notes. Follow us on the socials. You'll find them on

00:00:43.100 --> 00:00:46.740
<v Michael Kennedy>probably in the newsletter. I believe they're right there at the top, but also in the show notes.

00:00:47.420 --> 00:00:51.880
<v Michael Kennedy>And yeah, with that, Brian, how would you like to kick things off for the new year?

00:00:52.400 --> 00:00:56.080
<v Brian Okken>Ty, I think I'm pronouncing it Ty. I don't know how it's supposed to be.

00:00:56.100 --> 00:00:57.040
<v Michael Kennedy>I've asked Charlie Marsh.

00:00:57.450 --> 00:00:57.940
<v Michael Kennedy>No, it's ty.

00:00:58.440 --> 00:00:58.520
<v Michael Kennedy>TY.

00:00:58.720 --> 00:00:59.080
<v Michael Kennedy>It's ty.

00:00:59.550 --> 00:00:59.660
<v Brian Okken>Okay.

00:00:59.780 --> 00:01:00.880
<v Michael Kennedy>I believe because it's uv.

00:01:01.400 --> 00:01:01.500
<v Michael Kennedy>TY.

00:01:01.800 --> 00:01:07.220
<v Michael Kennedy>So now I'm starting to doubt myself, but when I interviewed him about ty, I asked, I'm pretty

00:01:07.220 --> 00:01:07.620
<v Michael Kennedy>sure it's ty.

00:01:08.000 --> 00:01:08.820
<v Brian Okken>Oh, that makes sense.

00:01:09.000 --> 00:01:10.160
<v Brian Okken>UV and TY?

00:01:10.860 --> 00:01:11.300
<v Michael Kennedy>TY.

00:01:11.670 --> 00:01:11.780
<v Brian Okken>TY.

00:01:12.380 --> 00:01:12.820
<v Brian Okken>Okay.

00:01:13.880 --> 00:01:20.260
<v Brian Okken>It's an extreme, it says it is an extremely fast Python type checker and LSP, which is

00:01:20.580 --> 00:01:22.660
<v Brian Okken>what a language server protocol.

00:01:23.290 --> 00:01:24.640
<v Brian Okken>I don't know what LSP stands for.

00:01:24.730 --> 00:01:25.000
<v Michael Kennedy>Do you?

00:01:25.860 --> 00:01:33.080
<v Michael Kennedy>server protocol uh yeah lsp something yep anyway um it's okay so ty's been out for a while but the

00:01:33.110 --> 00:01:39.800
<v Brian Okken>news as of december 16th is that it's um it's in beta um people have been playing with it for a

00:01:39.800 --> 00:01:46.040
<v Brian Okken>while anyway but i thought um uh so we're gonna link to the uh charlie marsh's announcement of it

00:01:46.160 --> 00:01:52.100
<v Brian Okken>but and this was going to actually to be clear this was going to be an extra um but um i was

00:01:52.120 --> 00:01:59.280
<v Brian Okken>playing with it this weekend and i'm kind of in love i really like uh ty um so really fast type

00:01:59.460 --> 00:02:05.700
<v Brian Okken>checker and language server and um and luckily this is not one where you you it's so fast that

00:02:05.700 --> 00:02:10.259
<v Brian Okken>you say did it actually run because it actually prints something out when you when you run like

00:02:10.500 --> 00:02:16.819
<v Brian Okken>tie check it'll it'll say yeah it even if every if it doesn't find anything it says like all done or

00:02:16.840 --> 00:02:23.160
<v Brian Okken>or so thank you thank you to you astral to actually letting us know that it's finished but it is super

00:02:23.360 --> 00:02:33.140
<v Brian Okken>fast so um type checking i i've used my pi before i think that's pronounced my pie and uh and pyrite

00:02:33.240 --> 00:02:39.900
<v Brian Okken>i tried that and pilance um so actually i remember pilot pailance has been a while but i have tried

00:02:40.040 --> 00:02:44.820
<v Brian Okken>pyrite and my pie because people have submitted issues with some of my projects to say hey these

00:02:44.840 --> 00:02:51.600
<v Brian Okken>these throw problems with mypy can we fix this so we've had some fixes on like a py test check

00:02:51.630 --> 00:02:59.880
<v Brian Okken>has been one project that we've made some changes however okay so installed ty this just the other

00:02:59.890 --> 00:03:08.460
<v Brian Okken>day and yes it is super fast i didn't did i'm using expecting um in they have a graph that shows uh

00:03:08.780 --> 00:03:11.640
<v Brian Okken>Oh, what are they typing?

00:03:12.000 --> 00:03:15.400
<v Brian Okken>Oh, they checked home assistant project, which is a pretty big project.

00:03:15.980 --> 00:03:22.920
<v Brian Okken>And my pie takes 45 seconds to run and ty takes two seconds.

00:03:23.660 --> 00:03:26.320
<v Brian Okken>And I didn't have anything that large.

00:03:26.720 --> 00:03:30.220
<v Brian Okken>It just ran instantly and spit out a ton of stuff.

00:03:30.510 --> 00:03:33.360
<v Brian Okken>So I tried actually went back and tried a couple other projects.

00:03:33.920 --> 00:03:36.880
<v Brian Okken>So here's another project running it.

00:03:37.260 --> 00:03:38.800
<v Brian Okken>Let's see, in the Torch project.

00:03:39.120 --> 00:03:40.300
<v Brian Okken>Oh, recompute.

00:03:40.380 --> 00:03:41.680
<v Brian Okken>I'm getting ahead of myself.

00:03:42.220 --> 00:03:45.240
<v Brian Okken>So it's really fast, but that's not the coolest part.

00:03:45.400 --> 00:03:47.980
<v Brian Okken>The coolest part is it's really fast just the first time.

00:03:48.080 --> 00:03:50.680
<v Brian Okken>And then it's even faster when you run it again,

00:03:51.140 --> 00:03:55.640
<v Brian Okken>because they're doing regenerative stuff.

00:03:55.820 --> 00:03:58.720
<v Brian Okken>So when you, after, what did they write down?

00:03:59.400 --> 00:04:03.160
<v Brian Okken>It was designed from the ground up to be incremental.

00:04:03.760 --> 00:04:09.620
<v Brian Okken>to have incrementality. I don't think that's a word guys, but, to incrementally, just,

00:04:10.040 --> 00:04:15.660
<v Brian Okken>just check the things you've changed to make it faster. And the reason why is to try to get it

00:04:15.900 --> 00:04:22.200
<v Brian Okken>running within your editor as well. So, yeah, so it's pretty, pretty fun. I actually ran it.

00:04:22.480 --> 00:04:27.900
<v Brian Okken>So, like I said, I ran it on some small projects and it, it, a couple of things I'm like,

00:04:27.980 --> 00:04:33.720
<v Brian Okken>why is it bugging me about this? But I just tried to fix the suggestions and I found that

00:04:33.740 --> 00:04:38.580
<v Brian Okken>So it was making easier to read code, even though I didn't, some of the things I didn't

00:04:38.720 --> 00:04:40.400
<v Brian Okken>quite get, like here's one that tripped me up.

00:04:40.720 --> 00:04:46.200
<v Brian Okken>So if you, if you declare, if you've got a function with a input parameter and you declare

00:04:46.290 --> 00:04:49.060
<v Brian Okken>the input type, I always think of that as like the input type.

00:04:49.110 --> 00:04:54.360
<v Brian Okken>I expect the user to call this function with, but once I'm in the function, I can, I can

00:04:54.420 --> 00:04:55.260
<v Brian Okken>like change the type.

00:04:55.330 --> 00:05:00.360
<v Brian Okken>If I, it came in as a list of strings and I wanted to turn it into just a concatenated

00:05:00.600 --> 00:05:01.000
<v Brian Okken>full string.

00:05:01.960 --> 00:05:04.020
<v Brian Okken>That was actually the example I had.

00:05:04.380 --> 00:05:06.200
<v Brian Okken>And it said, yeah, that's the wrong type.

00:05:06.380 --> 00:05:08.860
<v Brian Okken>You said list of strings, but then you assigned it a string.

00:05:09.360 --> 00:05:14.420
<v Brian Okken>And I'm like, well, okay, would it be more clear if I add a new variable?

00:05:14.700 --> 00:05:16.260
<v Brian Okken>And I actually just tried to clean it up.

00:05:16.260 --> 00:05:17.880
<v Brian Okken>And I'm like, yeah, this is easier to read, actually.

00:05:18.120 --> 00:05:18.900
<v Brian Okken>It'll be better to maintain.

00:05:19.500 --> 00:05:24.660
<v Brian Okken>So I'm trying to embrace the error messages as something that might make it easier to read,

00:05:24.750 --> 00:05:26.720
<v Brian Okken>even and not become combative.

00:05:26.960 --> 00:05:33.500
<v Brian Okken>But I tried installing, there's an extension that they released also to the ty extension for VS Code.

00:05:33.960 --> 00:05:36.060
<v Brian Okken>And this does a ton of stuff.

00:05:36.780 --> 00:05:39.340
<v Brian Okken>Inlay type hints, go to definition information.

00:05:40.620 --> 00:05:43.260
<v Brian Okken>I'm pointing this out because I know people will try it out.

00:05:43.640 --> 00:05:51.380
<v Brian Okken>But you'll have to be sure to read the documentation because there's a warning in there to say it's a language server also.

00:05:51.480 --> 00:05:55.400
<v Brian Okken>So you need to either turn off the default language server

00:05:55.720 --> 00:05:58.020
<v Brian Okken>or turn off TY's language server.

00:05:58.480 --> 00:06:00.320
<v Brian Okken>Having two at the same time don't work great.

00:06:00.580 --> 00:06:03.920
<v Brian Okken>So I'm super happy with the project so far, but yeah.

00:06:04.140 --> 00:06:04.460
<v Michael Kennedy>That's cool.

00:06:04.710 --> 00:06:06.880
<v Michael Kennedy>I definitely want to give the extension a try.

00:06:07.240 --> 00:06:10.240
<v Michael Kennedy>I've been using PyRite as well, and it's also, sorry, PowerFly,

00:06:10.570 --> 00:06:13.720
<v Michael Kennedy>all the PIs, PowerFly, and it has the same deal.

00:06:14.080 --> 00:06:17.920
<v Michael Kennedy>You've got to go disable a bunch of stuff in the Visual Studio editors

00:06:18.500 --> 00:06:19.800
<v Michael Kennedy>and, you know, like Cursor and others.

00:06:20.340 --> 00:06:22.080
<v Michael Kennedy>And it's annoying that you got to do it.

00:06:22.080 --> 00:06:26.060
<v Michael Kennedy>I feel like that is a fault of Visual Studio code.

00:06:26.520 --> 00:06:29.140
<v Michael Kennedy>Why would it let you run two language servers for the same language?

00:06:29.900 --> 00:06:32.240
<v Michael Kennedy>That should be like, which one do you want to use?

00:06:32.880 --> 00:06:33.600
<v Michael Kennedy>Just tell me, right?

00:06:33.680 --> 00:06:34.940
<v Michael Kennedy>I detected that two are running.

00:06:35.440 --> 00:06:37.220
<v Michael Kennedy>It's kind of the nature of Visual Studio

00:06:37.440 --> 00:06:39.820
<v Michael Kennedy>being just composed out of a bunch of disjointed things.

00:06:41.260 --> 00:06:42.720
<v Michael Kennedy>But once you get it set up, it's super nice.

00:06:42.960 --> 00:06:43.560
<v Michael Kennedy>I totally agree.

00:06:44.120 --> 00:06:46.839
<v Brian Okken>One thing I wanted to bring up that I haven't yet also

00:06:46.860 --> 00:06:50.520
<v Brian Okken>is when I ran it on pytestCheck, it ran it like,

00:06:50.780 --> 00:06:52.700
<v Brian Okken>and actually I've known that the pytestCheck

00:06:52.720 --> 00:06:55.940
<v Brian Okken>is kind of a fun plugin, but it has some,

00:06:56.260 --> 00:06:58.000
<v Brian Okken>like I'm hacking Python with this.

00:06:58.180 --> 00:06:59.680
<v Brian Okken>I'm like overloading a bunch of stuff

00:07:00.180 --> 00:07:03.840
<v Brian Okken>and a package that's also a context manager

00:07:04.060 --> 00:07:04.600
<v Brian Okken>and stuff like that.

00:07:05.400 --> 00:07:08.880
<v Brian Okken>I do plan on like, it's noting a whole bunch of errors

00:07:09.120 --> 00:07:10.260
<v Brian Okken>and I do want to fix all those

00:07:10.340 --> 00:07:12.100
<v Brian Okken>that just have a lot of other stuff going on.

00:07:12.780 --> 00:07:15.840
<v Brian Okken>And so I'm not like a really,

00:07:16.160 --> 00:07:18.160
<v Brian Okken>I didn't intend for this to be an apology.

00:07:18.600 --> 00:07:21.300
<v Brian Okken>What I'm meaning is when I go to check these,

00:07:22.340 --> 00:07:23.760
<v Brian Okken>TY has a whole bunch of settings.

00:07:23.920 --> 00:07:25.240
<v Brian Okken>You can turn off any check.

00:07:25.660 --> 00:07:26.740
<v Brian Okken>So that's what I think I'll do.

00:07:26.840 --> 00:07:28.880
<v Brian Okken>I'll probably like any of them that are failing,

00:07:29.320 --> 00:07:30.280
<v Brian Okken>I'll probably turn them off

00:07:30.580 --> 00:07:33.040
<v Brian Okken>and then fix them one at a time and go through.

00:07:33.280 --> 00:07:35.060
<v Brian Okken>And I like that they just said,

00:07:35.360 --> 00:07:35.780
<v Brian Okken>you know what?

00:07:35.980 --> 00:07:37.900
<v Brian Okken>People might want to like turn any of these off.

00:07:38.060 --> 00:07:40.380
<v Brian Okken>So we'll just give you access to all of them.

00:07:40.580 --> 00:07:41.760
<v Michael Kennedy>So yeah, that's very cool.

00:07:42.100 --> 00:07:44.300
<v Michael Kennedy>I'd like to throw out one more thing about the fast,

00:07:44.420 --> 00:07:46.060
<v Michael Kennedy>like, well, my editor's fast enough.

00:07:46.180 --> 00:07:47.200
<v Michael Kennedy>I don't really care, right?

00:07:47.320 --> 00:07:49.900
<v Michael Kennedy>Or what's it matter if it takes 20 seconds

00:07:50.220 --> 00:07:51.180
<v Michael Kennedy>for Pyright to run?

00:07:51.740 --> 00:07:53.360
<v Michael Kennedy>One of the things that you can do with these

00:07:53.580 --> 00:07:54.860
<v Michael Kennedy>that I don't think a lot of people are doing,

00:07:55.220 --> 00:07:57.280
<v Michael Kennedy>but you can tell, you can set up rules

00:07:57.480 --> 00:07:59.040
<v Michael Kennedy>and tell your agentic coding tools,

00:07:59.240 --> 00:08:00.800
<v Michael Kennedy>like whenever you make a change,

00:08:01.200 --> 00:08:03.740
<v Michael Kennedy>please run ty or Pyright or whatever

00:08:04.260 --> 00:08:05.680
<v Michael Kennedy>against my code base

00:08:05.980 --> 00:08:08.260
<v Michael Kennedy>and verify that you haven't made any typing mistakes.

00:08:08.860 --> 00:08:10.060
<v Michael Kennedy>Everything's hanging together, right?

00:08:10.360 --> 00:08:12.500
<v Michael Kennedy>And those tools will do that like over and over

00:08:13.100 --> 00:08:15.240
<v Michael Kennedy>and it can just make it super slow, right?

00:08:15.540 --> 00:08:17.000
<v Michael Kennedy>So you're not sitting there waiting

00:08:17.500 --> 00:08:18.920
<v Michael Kennedy>for the thing to run and run, you know,

00:08:19.180 --> 00:08:22.400
<v Michael Kennedy>just reanalyze, reanalyze, just tell it to use TY

00:08:22.510 --> 00:08:24.000
<v Michael Kennedy>and it'll just be nearly instant.

00:08:24.100 --> 00:08:24.880
<v Michael Kennedy>Nope, it's fine.

00:08:25.040 --> 00:08:26.080
<v Michael Kennedy>Oh, I got to fix something, right?

00:08:26.260 --> 00:08:27.460
<v Michael Kennedy>So one more use case here.

00:08:27.680 --> 00:08:30.280
<v Brian Okken>Yeah, and like we said, since it's incremental,

00:08:30.620 --> 00:08:32.640
<v Brian Okken>it'll be like milliseconds to rerun it.

00:08:32.840 --> 00:08:33.260
<v Michael Kennedy>Yeah, exactly.

00:08:33.919 --> 00:08:34.580
<v Michael Kennedy>Exactly, super cool.

00:08:35.000 --> 00:08:39.500
<v Michael Kennedy>All right, I have a scary story for you, Brian.

00:08:39.820 --> 00:08:40.060
<v Michael Kennedy>Okay.

00:08:40.159 --> 00:08:49.080
<v Michael Kennedy>So I want to talk about a pair of articles I wrote, and I think they're very, very constructive, very helpful for people to use.

00:08:49.540 --> 00:08:56.220
<v Michael Kennedy>So increasingly in open source, we're dealing with issues around supply chain problems, right?

00:08:56.600 --> 00:09:06.400
<v Michael Kennedy>This first surfaced most prominently with typosquatting, and I'm sure people have heard of that word by now, but it's like Django without the J or whatever.

00:09:06.560 --> 00:09:15.420
<v Michael Kennedy>And if people don't really know and they type, you know, pip install dango or whatever, it might go and find nothing and say that's there.

00:09:15.610 --> 00:09:22.400
<v Michael Kennedy>Or it might find something that someone put up there to look like Django, but also bring down some kind of malicious badness, right?

00:09:22.680 --> 00:09:23.440
<v Michael Kennedy>And that's a problem.

00:09:23.880 --> 00:09:24.880
<v Michael Kennedy>You can fix it by being careful.

00:09:25.420 --> 00:09:31.760
<v Michael Kennedy>The PyPI folks are doing a lot of work to fight that and to like preserve misspellings of common, common things.

00:09:32.030 --> 00:09:33.380
<v Michael Kennedy>But it's still, it's an issue, right?

00:09:33.660 --> 00:09:44.460
<v Michael Kennedy>I mean, it's gone so far that there are people trying to see what agent encoding and LLMs would recommend because sometimes they would make up package names and then they would go put stuff there.

00:09:44.980 --> 00:09:49.040
<v Michael Kennedy>So that when the next time it recommends that non-existing thing, it actually exists as a virus.

00:09:49.420 --> 00:09:49.540
<v Michael Kennedy>Right.

00:09:49.640 --> 00:09:50.180
<v Michael Kennedy>So you got to be careful.

00:09:50.800 --> 00:10:07.680
<v Michael Kennedy>But way more serious than that is there was some announcements that some folks had been phished who worked on some project and their PyPI credentials were hacked and their projects were replaced with lookalike projects, but that also had bad things in it, right?

00:10:07.680 --> 00:10:08.780
<v Michael Kennedy>And that's way worse.

00:10:09.140 --> 00:10:21.980
<v Michael Kennedy>So if I use some library and it uses a library, which itself uses a less known library way down the chain and that third level gets hacked and I pip install the new version of my library, I'm toast.

00:10:22.490 --> 00:10:25.480
<v Michael Kennedy>Right. And it's not because I misspelled something and nobody misspelled anything.

00:10:25.940 --> 00:10:30.400
<v Michael Kennedy>It's because somewhere along the way, somebody's computer got taken over in some way.

00:10:30.710 --> 00:10:31.780
<v Michael Kennedy>Off it goes. This is bad.

00:10:32.080 --> 00:10:34.880
<v Michael Kennedy>So I thought I was thinking about this over winter break.

00:10:34.990 --> 00:10:36.180
<v Michael Kennedy>I'm like, well, what can we do about it?

00:10:36.300 --> 00:10:39.200
<v Michael Kennedy>So I wrote two articles with concrete advice.

00:10:39.800 --> 00:10:42.320
<v Michael Kennedy>First one, Python supply chain made easy, right?

00:10:42.620 --> 00:10:43.220
<v Michael Kennedy>And what are you going to do?

00:10:43.220 --> 00:10:44.160
<v Michael Kennedy>I gave out some examples.

00:10:44.840 --> 00:10:45.680
<v Michael Kennedy>So here's the thing.

00:10:46.060 --> 00:10:48.820
<v Michael Kennedy>We have this tool called pip Audit, right?

00:10:49.120 --> 00:10:49.940
<v Michael Kennedy>Pip Audit is cool.

00:10:50.120 --> 00:10:51.300
<v Michael Kennedy>It audits Python environments.

00:10:51.580 --> 00:10:52.880
<v Michael Kennedy>It's officially part of the PyPA.

00:10:53.460 --> 00:10:54.880
<v Michael Kennedy>It's under their GitHub organization,

00:10:55.510 --> 00:10:57.160
<v Michael Kennedy>even though it's Trellabits and Google

00:10:57.340 --> 00:10:58.960
<v Michael Kennedy>have also had influence on it.

00:10:59.240 --> 00:11:01.580
<v Michael Kennedy>It audits Python environments, requirement files,

00:11:01.880 --> 00:11:04.080
<v Michael Kennedy>and dependency trees for known security vulnerabilities,

00:11:04.860 --> 00:11:05.840
<v Michael Kennedy>and it can even fix them.

00:11:05.960 --> 00:11:08.140
<v Michael Kennedy>I don't care about fixing them because it may be too late.

00:11:08.190 --> 00:11:09.100
<v Michael Kennedy>I just want that to not happen.

00:11:09.390 --> 00:11:12.900
<v Michael Kennedy>So what I was thinking is like, well, how do we use that tool?

00:11:13.320 --> 00:11:14.640
<v Michael Kennedy>And how do we use UV?

00:11:15.300 --> 00:11:19.300
<v Michael Kennedy>So one thing you can do is with pip audit is you can just say this virtual environment,

00:11:19.580 --> 00:11:21.120
<v Michael Kennedy>everything installed in here, how's it looking?

00:11:21.520 --> 00:11:23.500
<v Michael Kennedy>Is it bad or is it not bad, right?

00:11:23.840 --> 00:11:25.560
<v Michael Kennedy>And you can just uv tool install it.

00:11:25.680 --> 00:11:28.680
<v Michael Kennedy>So because it doesn't have to be installed in your local environment, not necessarily,

00:11:28.980 --> 00:11:29.080
<v Michael Kennedy>right?

00:11:29.310 --> 00:11:31.140
<v Michael Kennedy>You just have that active when you run it.

00:11:31.270 --> 00:11:32.040
<v Michael Kennedy>So that's pretty cool.

00:11:33.480 --> 00:11:35.880
<v Michael Kennedy>But what if people don't run it?

00:11:36.360 --> 00:11:42.020
<v Michael Kennedy>you know like this is always the problem is like I set up this thing this um this way to lint code

00:11:42.020 --> 00:11:45.380
<v Michael Kennedy>or format it to make sure we always do it right but then there's those people that just don't run

00:11:45.390 --> 00:11:52.300
<v Michael Kennedy>it right so one thing you can do this nice is I created a unit test py test test which will run

00:11:52.960 --> 00:11:58.780
<v Michael Kennedy>pip audit on wherever py test is running so like your application is being tested it will also run

00:11:58.950 --> 00:12:04.799
<v Michael Kennedy>pip audit against that so that's cool it just does a sub process figures out which version of python

00:12:04.820 --> 00:12:06.780
<v Michael Kennedy>on it is, and then it just runs pip on it.

00:12:06.790 --> 00:12:08.780
<v Michael Kennedy>For this to work, you've got to actually have it installed

00:12:09.240 --> 00:12:10.340
<v Michael Kennedy>as part of the virtual environment.

00:12:10.480 --> 00:12:11.460
<v Michael Kennedy>But that's all good, right?

00:12:11.700 --> 00:12:16.520
<v Michael Kennedy>So then it will just look at all the stuff you've got installed,

00:12:16.880 --> 00:12:19.900
<v Michael Kennedy>and your test will fail, which means your CI will fail

00:12:20.290 --> 00:12:21.860
<v Michael Kennedy>if some kind of vulnerable thing gets in there.

00:12:22.140 --> 00:12:22.700
<v Brian Okken>That's pretty cool.

00:12:22.900 --> 00:12:23.540
<v Michael Kennedy>Yeah, pretty nice.

00:12:23.680 --> 00:12:25.760
<v Michael Kennedy>So people can just grab this test and drop it in,

00:12:25.960 --> 00:12:27.200
<v Michael Kennedy>and there's really not much to it.

00:12:27.520 --> 00:12:27.940
<v Michael Kennedy>And you run it.

00:12:28.000 --> 00:12:29.060
<v Michael Kennedy>It's cool.

00:12:29.480 --> 00:12:32.640
<v Michael Kennedy>Also, you could-- I mean, you could set it up as a git commit

00:12:32.820 --> 00:12:34.040
<v Michael Kennedy>hook, but it's a little bit slow.

00:12:34.400 --> 00:12:39.020
<v Michael Kennedy>So next thing you can do is very often something like this will happen.

00:12:39.480 --> 00:12:41.980
<v Michael Kennedy>A couple of days later, people are like, why is my CPU at a hundred percent?

00:12:42.819 --> 00:12:45.920
<v Michael Kennedy>And why is it this project I'm working on?

00:12:46.180 --> 00:12:48.000
<v Michael Kennedy>You know, it'll get discovered, right?

00:12:48.080 --> 00:12:49.440
<v Michael Kennedy>And these things get ganked pretty quickly.

00:12:49.580 --> 00:12:52.280
<v Michael Kennedy>That's kind of the positive side is they don't typically last.

00:12:52.560 --> 00:12:56.060
<v Michael Kennedy>So the other thing you can do was with uv, as you can say,

00:12:56.580 --> 00:13:01.020
<v Michael Kennedy>UV pip compile or uv sync --upgrade,

00:13:01.180 --> 00:13:05.320
<v Michael Kennedy>I think is the command for the uv lock file version.

00:13:05.670 --> 00:13:09.980
<v Michael Kennedy>But regardless, you can always pass a exclude newer than,

00:13:10.510 --> 00:13:13.040
<v Michael Kennedy>just dash, dash, exclude, dash newer, some timeframe.

00:13:13.410 --> 00:13:14.560
<v Michael Kennedy>So I chose one week.

00:13:14.960 --> 00:13:16.060
<v Michael Kennedy>And what that means is,

00:13:16.060 --> 00:13:19.960
<v Michael Kennedy>if when I say update my requirements in the pinned lock file,

00:13:20.380 --> 00:13:24.120
<v Michael Kennedy>it will basically pretend anything released in the last week

00:13:24.720 --> 00:13:27.300
<v Michael Kennedy>doesn't exist and only update them to a week ago.

00:13:27.630 --> 00:13:29.680
<v Michael Kennedy>That way, because the problem is,

00:13:30.100 --> 00:13:34.660
<v Michael Kennedy>PipAudit can know that there's a bad one, but if it was released 10 minutes ago, PipAudit,

00:13:34.720 --> 00:13:39.560
<v Michael Kennedy>no one's going to have reported it and formalized it, right? There's this window in the really early

00:13:39.760 --> 00:13:43.980
<v Michael Kennedy>days of a package being updated that no one's going to catch it and get it into the ecosystem

00:13:44.040 --> 00:13:49.700
<v Michael Kennedy>in time, right? And so just having a little bit of time, like let other people try this project

00:13:49.820 --> 00:13:55.219
<v Michael Kennedy>for a week. If no one freaks out and says, oh my gosh, it's taking over the world, it's more likely

00:13:55.240 --> 00:14:00.900
<v Michael Kennedy>to be okay, right? Yeah, sure. I mean, look, it's not a complete defense. It's not like, well,

00:14:00.940 --> 00:14:05.280
<v Michael Kennedy>if it's a week or older, it's never going to be a problem. But almost all of these that are big

00:14:05.420 --> 00:14:09.880
<v Michael Kennedy>problems are discovered within a week or, you know, put a month, whatever you put a year, like

00:14:10.060 --> 00:14:14.480
<v Michael Kennedy>whatever you feel is like enough that it's very unlikely you're going to get tied up in it. Right.

00:14:14.680 --> 00:14:19.360
<v Michael Kennedy>We can put whatever number you want, but the point is you can put a delay. So whenever you say update

00:14:19.500 --> 00:14:23.699
<v Michael Kennedy>my dependencies, it says, but not the very, very, very new ones. And I've been doing that for a

00:14:23.640 --> 00:14:27.520
<v Michael Kennedy>and it's been fine for a while. I mean like a week and a half. But I thought, okay, well, what about,

00:14:28.000 --> 00:14:32.260
<v Michael Kennedy>this is all well and good if you have CI, but what about production? What if you're doing like

00:14:32.860 --> 00:14:39.920
<v Michael Kennedy>DevOps with Docker or stuff? Also, if you run your pip audit and it tells you that you have a virus

00:14:40.180 --> 00:14:45.460
<v Michael Kennedy>you've pip installed into your dev machine, too late. Once you've installed a virus, like it could

00:14:45.460 --> 00:14:50.499
<v Michael Kennedy>have downloaded stuff off the internet. It could put root kits, like you're done, right? That machine

00:14:50.520 --> 00:14:55.120
<v Michael Kennedy>probably needs formatted. It's very bad. So is there a way that we could do this before we put

00:14:55.120 --> 00:15:01.420
<v Michael Kennedy>it into our computer with pipaudit, right? You can, under some circumstances, give it like a

00:15:01.600 --> 00:15:05.340
<v Michael Kennedy>requirements file, but I think a better way is to just install stuff into a virtual environment.

00:15:05.880 --> 00:15:13.359
<v Michael Kennedy>So I did a follow-up thing here that says, here's how you create a Docker instance that can copy

00:15:13.500 --> 00:15:20.900
<v Michael Kennedy>whatever lock file you have into your temporary Docker container, install the requirements with

00:15:21.000 --> 00:15:25.940
<v Michael Kennedy>UV, run pip audit on it, and then give you an answer back. That way, even if it does find something,

00:15:26.440 --> 00:15:32.660
<v Michael Kennedy>it finds them over there, not in your computer, but in an isolated Docker environment, which should

00:15:32.660 --> 00:15:37.180
<v Michael Kennedy>be safe. So it talks to you that, which is pretty cool. I'll give you a little Docker file that works

00:15:37.550 --> 00:15:41.959
<v Michael Kennedy>nice and easy. You can do whatever you want, create an alias so that it'll run with nice

00:15:41.980 --> 00:15:44.040
<v Michael Kennedy>reporting, you can skip things you don't care about.

00:15:44.170 --> 00:15:51.320
<v Michael Kennedy>Like this PDF library on Windows, if you give it a SVG file, image file, it has a vulnerability.

00:15:51.450 --> 00:15:53.100
<v Michael Kennedy>I'm like, well, one, I'm not running on Windows.

00:15:53.960 --> 00:15:55.280
<v Michael Kennedy>I'm not giving it user input.

00:15:55.430 --> 00:15:58.080
<v Michael Kennedy>Like I don't care about, like I just, that's not a problem to me.

00:15:58.180 --> 00:16:00.060
<v Michael Kennedy>No, there's certain things you might want to just ignore.

00:16:00.480 --> 00:16:06.839
<v Michael Kennedy>And then finally, you can put, I'll show you how to use like super good build time caching

00:16:06.840 --> 00:16:10.920
<v Michael Kennedy>to actually run as part of your Docker build pip audit

00:16:11.260 --> 00:16:13.520
<v Michael Kennedy>so that you can't even build a container

00:16:13.720 --> 00:16:14.520
<v Michael Kennedy>that has a vulnerability.

00:16:14.860 --> 00:16:16.320
<v Michael Kennedy>Like it will fail the Docker build

00:16:16.630 --> 00:16:18.300
<v Michael Kennedy>if it has a problem, according to pip audit.

00:16:18.580 --> 00:16:20.100
<v Michael Kennedy>I mean, for some definition of a problem.

00:16:20.360 --> 00:16:20.500
<v Brian Okken>Yeah.

00:16:20.820 --> 00:16:24.120
<v Michael Kennedy>So that whole series I wrote over winter break,

00:16:24.260 --> 00:16:25.240
<v Michael Kennedy>and I think it'll help people.

00:16:25.640 --> 00:16:26.500
<v Michael Kennedy>Super easy to adopt.

00:16:26.620 --> 00:16:27.340
<v Michael Kennedy>There's not much to it.

00:16:27.580 --> 00:16:29.180
<v Michael Kennedy>If you're using Docker, it's got good things for that.

00:16:29.280 --> 00:16:31.680
<v Michael Kennedy>If you're not, it also has things you can adopt.

00:16:32.520 --> 00:16:34.260
<v Brian Okken>I'm curious with the, yeah,

00:16:34.700 --> 00:16:46.580
<v Brian Okken>On this topic of dependencies and stuff and possible vulnerabilities, I was trying to remember the name of the word, but basically if you take some other project and just copy its source into yours.

00:16:47.680 --> 00:16:48.220
<v Brian Okken>Vendoring.

00:16:48.620 --> 00:16:49.660
<v Brian Okken>Vendoring, that's it.

00:16:50.700 --> 00:17:04.459
<v Brian Okken>I'm just wondering if that's going to happen more often for production projects because you could have something automatically or have an agent or something checked to see if there's any updates in the project.

00:17:04.600 --> 00:17:05.900
<v Brian Okken>and copy them in and test them.

00:17:06.260 --> 00:17:07.660
<v Michael Kennedy>Yeah, I think that's going to happen a lot,

00:17:07.939 --> 00:17:09.040
<v Michael Kennedy>especially for small libraries.

00:17:09.329 --> 00:17:11.480
<v Michael Kennedy>Like, oh, this one just adds color to your output.

00:17:11.660 --> 00:17:13.060
<v Michael Kennedy>You're like, hmm, do I really need,

00:17:13.310 --> 00:17:14.959
<v Michael Kennedy>like how often is that going to change?

00:17:15.140 --> 00:17:15.740
<v Michael Kennedy>Probably never.

00:17:16.160 --> 00:17:16.420
<v Michael Kennedy>Yeah.

00:17:16.680 --> 00:17:20.180
<v Michael Kennedy>Do I need to be subjected to a supply chain story

00:17:20.569 --> 00:17:21.780
<v Michael Kennedy>or could I just copy it in?

00:17:22.530 --> 00:17:24.280
<v Michael Kennedy>Or with the agent encoding things,

00:17:24.350 --> 00:17:26.040
<v Michael Kennedy>you're like, I really just need these two functions.

00:17:26.560 --> 00:17:27.900
<v Michael Kennedy>Can I just ask it to write these functions?

00:17:28.069 --> 00:17:30.600
<v Michael Kennedy>And if they're working, like I don't need a library at all.

00:17:30.980 --> 00:17:32.720
<v Michael Kennedy>You know, I agree 100%.

00:17:32.900 --> 00:17:33.600
<v Michael Kennedy>I think so.

00:17:34.040 --> 00:17:34.200
<v Brian Okken>Okay.

00:17:34.940 --> 00:17:40.680
<v Brian Okken>I'm going to actually talk about main updates as well in a different sense, I guess.

00:17:41.580 --> 00:17:44.440
<v Brian Okken>So I want to talk about typing extensions.

00:17:44.900 --> 00:17:49.580
<v Brian Okken>And again, this comes out of a suggestion from a listener.

00:17:50.080 --> 00:17:55.040
<v Brian Okken>It was going to be just an extra, but I started using it and it's pretty cool.

00:17:55.400 --> 00:18:00.340
<v Brian Okken>So in December, we were talking about, or I was talking about at least,

00:18:00.460 --> 00:18:06.480
<v Brian Okken>deprecation warnings and the topic of how do you deal with that of deprecated items.

00:18:06.880 --> 00:18:13.880
<v Brian Okken>And one recommendation is, was the deprecated, using the deprecated decorator.

00:18:14.340 --> 00:18:19.080
<v Brian Okken>So you could say warnings import from warnings, import deprecated,

00:18:19.460 --> 00:18:21.200
<v Brian Okken>and decorate a deprecated function.

00:18:21.760 --> 00:18:25.580
<v Brian Okken>However, we were reminded that that's Python 3.13 only.

00:18:26.560 --> 00:18:32.500
<v Brian Okken>Somebody named PrioInv on Mastodon notified us and said, hey, there's the typing extensions

00:18:32.900 --> 00:18:33.560
<v Brian Okken>and they have them.

00:18:33.980 --> 00:18:35.860
<v Brian Okken>And so I was checking this out.

00:18:35.940 --> 00:18:38.540
<v Brian Okken>So the typing extensions, let's see, deprecated.

00:18:40.300 --> 00:18:43.420
<v Brian Okken>We could just say, get it from typing extensions.

00:18:43.880 --> 00:18:46.860
<v Brian Okken>And now we've got it on earlier versions of Python.

00:18:47.220 --> 00:18:53.800
<v Brian Okken>I haven't, like, I don't know if this is a, okay, I'll save my comments, a couple of

00:18:53.800 --> 00:18:54.460
<v Brian Okken>comments for the end.

00:18:54.640 --> 00:18:56.440
<v Brian Okken>But I'm pretty excited about this.

00:18:56.600 --> 00:19:02.420
<v Brian Okken>So I'm hoping that I can just use like the modern type,

00:19:02.830 --> 00:19:05.120
<v Brian Okken>modern typing for different projects.

00:19:05.420 --> 00:19:06.780
<v Brian Okken>And like, why is this important?

00:19:06.960 --> 00:19:08.660
<v Brian Okken>It's important because me as a developer,

00:19:09.160 --> 00:19:12.700
<v Brian Okken>I can kind of remember how to do typing in one version of Python.

00:19:12.850 --> 00:19:14.400
<v Brian Okken>But if I'm trying to remember,

00:19:14.450 --> 00:19:20.460
<v Brian Okken>well, what typing decorators and all that stuff do I use for 3.12

00:19:20.570 --> 00:19:22.320
<v Brian Okken>versus 3.13 versus 3.14?

00:19:23.110 --> 00:19:24.380
<v Brian Okken>And that's hard to keep a track.

00:19:24.660 --> 00:19:27.880
<v Brian Okken>So I'm excited to start using typing extensions.

00:19:28.520 --> 00:19:31.560
<v Brian Okken>And hopefully this cures the trying to keep track of it all.

00:19:31.900 --> 00:19:32.600
<v Brian Okken>So of it.

00:19:32.880 --> 00:19:34.860
<v Brian Okken>So there's a whole bunch of stuff in here.

00:19:34.860 --> 00:19:42.500
<v Brian Okken>We've got, it's got typing primitives, protocols, decorators, functions, enums, pure aliases,

00:19:43.500 --> 00:19:48.220
<v Brian Okken>all sorts of stuff that, and it tells you when things were added and all that.

00:19:48.410 --> 00:19:50.520
<v Brian Okken>So anyway, kind of fun.

00:19:50.640 --> 00:19:50.860
<v Brian Okken>Okay.

00:19:51.260 --> 00:19:51.880
<v Brian Okken>Yeah, that's very nice.

00:19:52.300 --> 00:19:57.380
<v Brian Okken>So hopefully I can get away with just using the deprecated wrapper, even in 3.12.

00:19:58.340 --> 00:20:03.680
<v Brian Okken>So because I mean, like, come on, everybody's got like a project that uses a new, the newest

00:20:03.900 --> 00:20:05.240
<v Brian Okken>because it's my side project.

00:20:05.500 --> 00:20:06.520
<v Brian Okken>It's using the newest version.

00:20:06.940 --> 00:20:13.300
<v Brian Okken>Or I've got a library that I'm supporting that's supporting everything back to 3.12 maybe

00:20:13.360 --> 00:20:15.000
<v Brian Okken>or 3.8 or 3.9 or whatever.

00:20:15.380 --> 00:20:18.960
<v Brian Okken>And then a work project that's using 3.13, stuff like that.

00:20:19.560 --> 00:20:24.700
<v Michael Kennedy>Yeah, I got a message from somebody saying, what am I open source little smaller libraries?

00:20:25.100 --> 00:20:25.980
<v Michael Kennedy>They can't get it to work.

00:20:26.080 --> 00:20:28.060
<v Michael Kennedy>They can't get it to install or something.

00:20:28.679 --> 00:20:31.680
<v Michael Kennedy>And I'm like, hmm, can't really see what the problem is.

00:20:32.040 --> 00:20:37.740
<v Michael Kennedy>Oh, you're using 3.9 and it's using some feature of 3.10 and it says it needs 3.10.

00:20:37.880 --> 00:20:38.840
<v Michael Kennedy>They're like, why doesn't this work?

00:20:38.920 --> 00:20:43.380
<v Michael Kennedy>I'm like, literally, it sounds new, but that is no longer supported at all.

00:20:44.419 --> 00:20:47.660
<v Michael Kennedy>It's easy for these to sound like, ah, 3.9 is not that old.

00:20:47.740 --> 00:20:51.580
<v Michael Kennedy>But it's out of even the bug fixes and security fixes.

00:20:52.040 --> 00:20:54.820
<v Brian Okken>Yeah, so people remember to do a min version

00:20:55.100 --> 00:20:58.940
<v Brian Okken>in your PyProject.toml if you're doing a library

00:20:59.180 --> 00:21:01.440
<v Brian Okken>that other people install so that it just doesn't even

00:21:01.900 --> 00:21:02.680
<v Brian Okken>update to that version.

00:21:02.940 --> 00:21:03.360
<v Michael Kennedy>Exactly.

00:21:03.860 --> 00:21:04.380
<v Michael Kennedy>That's what I did.

00:21:04.840 --> 00:21:07.480
<v Michael Kennedy>But there was not a fallbacks older version they could use,

00:21:07.860 --> 00:21:11.440
<v Michael Kennedy>because it uses types that are not available,

00:21:11.680 --> 00:21:14.300
<v Michael Kennedy>like the lowercase d dict of string string

00:21:14.400 --> 00:21:15.040
<v Michael Kennedy>or something like that.

00:21:15.460 --> 00:21:15.960
<v Brian Okken>Oh, yeah.

00:21:16.480 --> 00:21:16.640
<v Brian Okken>Right.

00:21:17.300 --> 00:21:19.960
<v Brian Okken>Who wants to go back to importing uppercase dict?

00:21:20.170 --> 00:21:20.860
<v Brian Okken>I don't want to do that.

00:21:21.200 --> 00:21:21.460
<v Brian Okken>Exactly.

00:21:21.960 --> 00:21:23.540
<v Brian Okken>I'm like, I will do it when he needs support.

00:21:23.720 --> 00:21:25.760
<v Michael Kennedy>But like, if it's literally out of support, I'm sorry.

00:21:25.940 --> 00:21:30.040
<v Michael Kennedy>This is not on me to like make my library work on, you know, as far back as history goes.

00:21:30.400 --> 00:21:30.620
<v Michael Kennedy>All right.

00:21:31.340 --> 00:21:33.560
<v Michael Kennedy>Let's talk about my spy story.

00:21:34.100 --> 00:21:34.380
<v Michael Kennedy>Okay.

00:21:34.750 --> 00:21:35.800
<v Michael Kennedy>So this is a real short one.

00:21:35.930 --> 00:21:36.880
<v Michael Kennedy>My first one was really long.

00:21:36.960 --> 00:21:37.560
<v Michael Kennedy>This one's really short.

00:21:38.040 --> 00:21:43.560
<v Michael Kennedy>New MI6 chief Blaze Metroeli outlined her vision for a technologically,

00:21:45.560 --> 00:21:50.580
<v Michael Kennedy>augmented intelligence gathering in her first public speech on December 15th,

00:21:50.760 --> 00:21:53.640
<v Michael Kennedy>warning that the UK operates in a space between peace and war.

00:21:53.820 --> 00:21:56.140
<v Michael Kennedy>I mean, MI6, come on, James Bond, pretty cool.

00:21:56.760 --> 00:22:01.920
<v Michael Kennedy>At the Tameside headquarters, she said previously the UK,

00:22:02.200 --> 00:22:05.260
<v Michael Kennedy>she was previously in charge of Q, which is kind of cool.

00:22:05.400 --> 00:22:08.120
<v Michael Kennedy>Anyway, said the headline is,

00:22:08.900 --> 00:22:15.280
<v Michael Kennedy>We will need our MI6 spies agents to be as fluent in Python as they are in Russian.

00:22:15.600 --> 00:22:16.560
<v Michael Kennedy>It's kind of interesting, right?

00:22:16.860 --> 00:22:17.060
<v Michael Kennedy>Yeah.

00:22:17.740 --> 00:22:20.220
<v Michael Kennedy>Look, we live in this super technological world,

00:22:20.260 --> 00:22:23.920
<v Michael Kennedy>and so much of this is becoming cyber more and more.

00:22:24.280 --> 00:22:27.060
<v Michael Kennedy>One of the main bits is, while mentioning China,

00:22:27.480 --> 00:22:29.680
<v Michael Kennedy>Miraweli focused mainly on the threats from Russia.

00:22:30.160 --> 00:22:31.900
<v Michael Kennedy>She said the country is, Russia is,

00:22:32.300 --> 00:22:36.680
<v Michael Kennedy>testing us in the gray zone with tactics that are just below the threshold of war.

00:22:37.580 --> 00:22:46.700
<v Michael Kennedy>Pretty much cyber attacks, critical infrastructure, drones, propaganda, all the stuff that having some kind of programming skill will super help.

00:22:46.740 --> 00:22:50.800
<v Michael Kennedy>So anyway, I just thought I thought this was an interesting headline and worth a little shout out.

00:22:51.520 --> 00:22:53.620
<v Brian Okken>Also, I didn't know Q was real.

00:22:53.940 --> 00:22:54.640
<v Michael Kennedy>I didn't either.

00:22:54.700 --> 00:22:56.360
<v Michael Kennedy>I was like, oh, that's so cool.

00:22:56.980 --> 00:22:59.860
<v Brian Okken>I knew MI6 was a real thing, but Q, that's awesome.

00:23:00.200 --> 00:23:00.660
<v Brian Okken>I know.

00:23:01.000 --> 00:23:02.060
<v Michael Kennedy>It's definitely cool.

00:23:02.340 --> 00:23:02.480
<v Michael Kennedy>Cool.

00:23:02.600 --> 00:23:02.820
<v Michael Kennedy>All right.

00:23:03.200 --> 00:23:05.800
<v Michael Kennedy>Anyway, everyone needs to know Python these days.

00:23:06.660 --> 00:23:20.040
<v Michael Kennedy>Jake Vander Plaas in 2017, as the PyCon keynote said, Python is a, gosh, basically like a quilt of all these different uses, use cases of people doing interesting things.

00:23:20.080 --> 00:23:21.760
<v Michael Kennedy>Well, here's one more patch in the quilt.

00:23:22.040 --> 00:23:22.240
<v Brian Okken>Yeah.

00:23:22.460 --> 00:23:25.300
<v Brian Okken>Even if you got a cooler language, we'll just incorporate it into Python.

00:23:25.780 --> 00:23:26.460
<v Brian Okken>We are the Borg.

00:23:26.960 --> 00:23:27.280
<v Michael Kennedy>Exactly.

00:23:27.960 --> 00:23:28.860
<v Michael Kennedy>There's something to that.

00:23:30.680 --> 00:23:31.040
<v Michael Kennedy>All right.

00:23:31.580 --> 00:23:32.860
<v Michael Kennedy>What are you going to lean into next here?

00:23:33.900 --> 00:23:35.640
<v Brian Okken>So we're into extras now.

00:23:35.760 --> 00:23:39.820
<v Brian Okken>So I said that I was going to take some time off for,

00:23:40.220 --> 00:23:43.400
<v Brian Okken>from writing in December and I had a wonderful break with my family.

00:23:43.900 --> 00:23:45.260
<v Brian Okken>And now I'm back to writing again.

00:23:45.540 --> 00:23:46.160
<v Brian Okken>I almost,

00:23:46.420 --> 00:23:51.360
<v Brian Okken>I wanted to announce that the next chapter was the next chapter is going to

00:23:51.400 --> 00:23:55.340
<v Brian Okken>be finding waste in T tester of development.

00:23:55.820 --> 00:23:56.000
<v Brian Okken>And,

00:23:56.680 --> 00:23:57.000
<v Brian Okken>and I was,

00:23:57.520 --> 00:23:59.380
<v Brian Okken>I don't know why I was stressed out about it,

00:23:59.500 --> 00:24:01.860
<v Brian Okken>but yesterday I just sat down and wrote,

00:24:02.180 --> 00:24:03.200
<v Brian Okken>I think a first draft.

00:24:03.220 --> 00:24:04.620
<v Brian Okken>I need to clean it up a little bit,

00:24:04.920 --> 00:24:06.400
<v Brian Okken>but I want to get this released today.

00:24:06.700 --> 00:24:08.920
<v Brian Okken>So hopefully by the time you listen to this,

00:24:09.140 --> 00:24:11.300
<v Brian Okken>if you're not watching it live, it'll be around.

00:24:11.500 --> 00:24:14.480
<v Brian Okken>And I'll, yeah, so the next one will be there.

00:24:14.920 --> 00:24:17.000
<v Brian Okken>I've still got a goal of finishing this,

00:24:17.560 --> 00:24:20.160
<v Brian Okken>at least the first draft by the end of January.

00:24:20.840 --> 00:24:22.020
<v Brian Okken>It's a tight deadline.

00:24:22.210 --> 00:24:25.300
<v Brian Okken>I don't, I only have half the chapters written so far,

00:24:26.220 --> 00:24:27.960
<v Brian Okken>but I think that we can get there.

00:24:28.030 --> 00:24:31.440
<v Brian Okken>These, I think that the later chapters are possibly shorter

00:24:32.170 --> 00:24:33.360
<v Brian Okken>and I'm going to try to read it.

00:24:33.480 --> 00:24:39.000
<v Brian Okken>release it as an audiobook too so i can't make them too long or else they'll kill me okay so

00:24:39.180 --> 00:24:45.180
<v Brian Okken>that's that's going on uh one of the things keeping me uh uh updated and on track hopefully

00:24:45.680 --> 00:24:54.540
<v Brian Okken>is uh is it watches so a slight change of topic but i um i am back to sporting a non-smart watch

00:24:55.020 --> 00:25:03.440
<v Brian Okken>um i'm doing what i've got a right now i'm wearing a uh victorinox watch and uh i picked it up at an

00:25:03.460 --> 00:25:10.080
<v Brian Okken>for 40 bucks and it was a steal it was great great watch um uh but i've and then uh since i'm now

00:25:10.680 --> 00:25:17.420
<v Brian Okken>looking for watches my i picked up a couple more estate sales in the last last week too so um that's

00:25:17.540 --> 00:25:23.140
<v Brian Okken>fun something getting in the way of writing though is uh my christmas present i got from my family so

00:25:23.370 --> 00:25:31.040
<v Brian Okken>um they uh they got me a steam deck and um uh i'm having a blast with it i like i like not having a

00:25:31.040 --> 00:25:36.200
<v Brian Okken>console like just sitting on the couch and uh or sitting back in a chair and and uh and playing

00:25:36.290 --> 00:25:41.900
<v Brian Okken>video games i'm having fun with that again so um i'd loved and i'm i've been like looking through

00:25:41.900 --> 00:25:47.220
<v Brian Okken>the store and everything i'd love to have anybody uh let me know uh so um let me know on blue sky or

00:25:47.300 --> 00:25:51.720
<v Brian Okken>mastodon if there's a particular game i should check out i haven't been into the gaming scene

00:25:51.940 --> 00:25:56.340
<v Michael Kennedy>since the early 90s i've got some good recommendations for you i don't know for sure

00:25:56.340 --> 00:25:57.300
<v Michael Kennedy>that they'll run on the Steam Deck,

00:25:57.900 --> 00:26:02.520
<v Michael Kennedy>but they do run on Windows Steam in On X-Force Now.

00:26:02.960 --> 00:26:06.180
<v Michael Kennedy>Small Lands, S-M-A-L-L-A-N-D-S.

00:26:06.340 --> 00:26:08.660
<v Michael Kennedy>Small Lands, you're like a little tiny creature

00:26:09.100 --> 00:26:11.260
<v Michael Kennedy>running around this forest exploring it,

00:26:11.520 --> 00:26:14.200
<v Michael Kennedy>and ladybugs come by and they're like hip height.

00:26:14.480 --> 00:26:15.740
<v Michael Kennedy>It's a really cool experience.

00:26:16.120 --> 00:26:17.940
<v Michael Kennedy>The graphics is incredible.

00:26:17.990 --> 00:26:18.960
<v Michael Kennedy>The music is peaceful.

00:26:19.260 --> 00:26:19.900
<v Michael Kennedy>It's cool.

00:26:20.470 --> 00:26:21.040
<v Michael Kennedy>Give that one a go.

00:26:21.400 --> 00:26:22.480
<v Brian Okken>All right, thanks.

00:26:23.460 --> 00:26:25.240
<v Brian Okken>But anyway, reach out on Mastodon and Bluesky.

00:26:25.600 --> 00:26:26.440
<v Brian Okken>Let me know what you were playing.

00:26:27.820 --> 00:26:28.680
<v Michael Kennedy>Michael, do you have any extras?

00:26:29.140 --> 00:26:29.440
<v Michael Kennedy>I do.

00:26:29.620 --> 00:26:31.700
<v Michael Kennedy>I got actually two follow-ups now that you've mentioned these things.

00:26:31.720 --> 00:26:35.260
<v Michael Kennedy>They were not originally there, but I've been dreaming of the Steam Machine,

00:26:35.860 --> 00:26:42.800
<v Michael Kennedy>which is like a six-inch by six-inch cube that is kind of like a local,

00:26:43.360 --> 00:26:44.680
<v Michael Kennedy>you put it by your TV or something.

00:26:44.880 --> 00:26:46.780
<v Michael Kennedy>I'm not sure if it makes sense for me to get it,

00:26:46.960 --> 00:26:49.100
<v Michael Kennedy>but it looks like a really neat machine.

00:26:49.440 --> 00:26:50.180
<v Michael Kennedy>I've been thinking about that.

00:26:50.320 --> 00:26:51.160
<v Michael Kennedy>Just got it now, so that's cool.

00:26:52.140 --> 00:26:53.100
<v Michael Kennedy>But back to watches.

00:26:53.720 --> 00:27:02.760
<v Michael Kennedy>I used to have a Pebble Round 2, which is a really cool little round watch that had a traditional watch look, but it was a smart watch.

00:27:02.960 --> 00:27:04.620
<v Michael Kennedy>This predates Apple Watch, I think.

00:27:05.000 --> 00:27:06.380
<v Michael Kennedy>And it was so good.

00:27:06.420 --> 00:27:07.360
<v Michael Kennedy>I loved it so much.

00:27:07.360 --> 00:27:08.560
<v Michael Kennedy>It was incredibly thin.

00:27:09.040 --> 00:27:12.100
<v Michael Kennedy>The e-ink display just looked like a real watch face.

00:27:12.500 --> 00:27:16.380
<v Michael Kennedy>And I had so many people come up to me and say, wow, that is a cool watch.

00:27:16.660 --> 00:27:17.740
<v Michael Kennedy>What kind of watch is that?

00:27:18.060 --> 00:27:20.960
<v Michael Kennedy>And these would be like older people or people that were not techie.

00:27:20.960 --> 00:27:23.500
<v Michael Kennedy>And they didn't realize even that it was a smart watch.

00:27:23.840 --> 00:27:26.680
<v Michael Kennedy>they were saying that's a cool and i'm like actually that's a smart one they're like what

00:27:26.700 --> 00:27:33.140
<v Michael Kennedy>is it oh my gosh incredible uh why am i saying this it's coming back they're remaking it pebble's

00:27:33.220 --> 00:27:36.920
<v Michael Kennedy>coming back and is open source and so if you're a fan of pebble there's a couple of pebble things

00:27:37.060 --> 00:27:41.240
<v Michael Kennedy>coming back so yay for watches although i'm still sticking with my apple watch because i love all

00:27:41.300 --> 00:27:47.540
<v Michael Kennedy>the like health analytics it gathers about me all right here's my actual extras better not follow

00:27:47.560 --> 00:27:48.700
<v Michael Kennedy>of impromptu follows.

00:27:49.440 --> 00:27:53.040
<v Michael Kennedy>So Ruben Lerner just posted a 12 video series

00:27:53.400 --> 00:27:55.220
<v Michael Kennedy>on what's coming up in Pandas 3.

00:27:55.260 --> 00:27:57.960
<v Michael Kennedy>So getting ready for Pandas 3 short focused video series.

00:27:58.420 --> 00:28:00.400
<v Michael Kennedy>So like I said, 12 videos, come check it out

00:28:00.540 --> 00:28:03.520
<v Michael Kennedy>if you're looking forward to what's coming up in Pandas.

00:28:03.880 --> 00:28:05.680
<v Michael Kennedy>And I just released as in two hours ago,

00:28:05.940 --> 00:28:08.380
<v Michael Kennedy>a really awesome talk Python episode called

00:28:08.560 --> 00:28:10.820
<v Michael Kennedy>Web Frameworks in production by their creators.

00:28:11.340 --> 00:28:13.540
<v Michael Kennedy>So I have folks from the Django team,

00:28:13.980 --> 00:28:15.180
<v Michael Kennedy>folks from the Litestar team,

00:28:15.520 --> 00:28:17.700
<v Michael Kennedy>from Flask and Cort and FastAPI,

00:28:18.080 --> 00:28:19.540
<v Michael Kennedy>all of the people who create all of those

00:28:19.730 --> 00:28:21.420
<v Michael Kennedy>coming on to talk about how you should run

00:28:21.880 --> 00:28:23.500
<v Michael Kennedy>their web framework in production.

00:28:23.800 --> 00:28:25.460
<v Michael Kennedy>I thought that was just super, super fun,

00:28:25.640 --> 00:28:26.220
<v Michael Kennedy>cool conversation.

00:28:26.500 --> 00:28:26.980
<v Brian Okken>Oh, wow.

00:28:27.190 --> 00:28:28.260
<v Brian Okken>I'm looking forward to watching that.

00:28:28.500 --> 00:28:30.880
<v Michael Kennedy>Yeah, somebody in the audience said that

00:28:30.930 --> 00:28:33.720
<v Michael Kennedy>I basically put the Python Avengers team together

00:28:34.400 --> 00:28:35.700
<v Michael Kennedy>when it comes to web frameworks.

00:28:35.830 --> 00:28:36.560
<v Michael Kennedy>It was really incredible.

00:28:36.980 --> 00:28:38.700
<v Michael Kennedy>Quite the crew there.

00:28:38.980 --> 00:28:40.600
<v Michael Kennedy>Okay, that's it for my extras.

00:28:41.060 --> 00:28:42.700
<v Michael Kennedy>How are you feeling about a joke?

00:28:43.120 --> 00:28:44.020
<v Michael Kennedy>Oh, a joke would be great.

00:28:44.300 --> 00:28:46.100
<v Michael Kennedy>This one has to have the stage set just a little bit, okay?

00:28:46.520 --> 00:28:46.680
<v Michael Kennedy>Okay.

00:28:47.040 --> 00:28:48.040
<v Michael Kennedy>So by telling another joke.

00:28:48.110 --> 00:28:53.580
<v Michael Kennedy>So there's this funny joke meme that went around like 15 years ago.

00:28:54.100 --> 00:28:59.920
<v Michael Kennedy>There's JavaScript, the definitive guide, which is like this 600-page tome of a huge book.

00:29:00.450 --> 00:29:05.700
<v Michael Kennedy>And then Douglas Crawford published a follow-up book called JavaScript, the good parts.

00:29:06.020 --> 00:29:07.460
<v Michael Kennedy>And it's like 100 pages.

00:29:07.590 --> 00:29:13.240
<v Michael Kennedy>I don't know how big it is, but it's much, much smaller than the definitive guide.

00:29:13.460 --> 00:29:15.680
<v Michael Kennedy>Like this is the slice that you should only pay attention to

00:29:15.740 --> 00:29:17.120
<v Michael Kennedy>and the rest is wrong, right?

00:29:17.240 --> 00:29:17.680
<v Michael Kennedy>Isn't this funny?

00:29:18.000 --> 00:29:18.160
<v Brian Okken>- Yeah.

00:29:18.420 --> 00:29:19.500
<v Michael Kennedy>- Oh yeah, I remember that.

00:29:19.940 --> 00:29:21.200
<v Michael Kennedy>- Yeah, yeah, it's kind of old,

00:29:21.400 --> 00:29:22.600
<v Michael Kennedy>but here's the new joke.

00:29:23.720 --> 00:29:24.240
<v Michael Kennedy>Error handling.

00:29:25.140 --> 00:29:26.640
<v Michael Kennedy>It's this huge, huge book.

00:29:26.860 --> 00:29:27.840
<v Michael Kennedy>And then there's a little tiny one,

00:29:28.000 --> 00:29:29.100
<v Michael Kennedy>error handling before AI.

00:29:30.100 --> 00:29:32.100
<v Michael Kennedy>It's just like how much you gotta deal with

00:29:32.220 --> 00:29:33.080
<v Michael Kennedy>and like keep track of it.

00:29:33.080 --> 00:29:34.440
<v Michael Kennedy>Like what is all this stuff going on?

00:29:34.480 --> 00:29:35.260
<v Michael Kennedy>Why is this all here?

00:29:35.560 --> 00:29:36.240
<v Michael Kennedy>It's the opposite.

00:29:36.480 --> 00:29:38.960
<v Michael Kennedy>It's the inverse of going from a huge thing

00:29:39.100 --> 00:29:40.160
<v Michael Kennedy>to like a focused good one.

00:29:40.200 --> 00:29:41.720
<v Michael Kennedy>It's like, oh, we had this focused little bit

00:29:41.740 --> 00:29:42.340
<v Michael Kennedy>of error handling.

00:29:42.560 --> 00:29:43.080
<v Michael Kennedy>Now we got this.

00:29:43.400 --> 00:29:50.420
<v Brian Okken>mega thing i gotta deal with yeah there's there's joke yeah i'm looking forward to people

00:29:50.860 --> 00:29:56.040
<v Brian Okken>people are already starting to actually care about they're making their tests readable um because um

00:29:56.300 --> 00:30:04.560
<v Michael Kennedy>they're having to figure out what's wrong you know so me too well happy 2026 to everybody

00:30:05.180 --> 00:30:09.500
<v Michael Kennedy>brian good to see you nice looking forward to another year of good stuff yeah we should have

00:30:09.360 --> 00:30:09.800
<v Michael Kennedy>Little poppers.

00:30:10.330 --> 00:30:10.400
<v Michael Kennedy>Yeah.

00:30:10.700 --> 00:30:11.240
<v Michael Kennedy>Little, yeah.

00:30:11.620 --> 00:30:11.980
<v Michael Kennedy>Those things.

00:30:12.380 --> 00:30:13.500
<v Michael Kennedy>She's got the little confetti or whatever.

00:30:14.220 --> 00:30:15.420
<v Michael Kennedy>But no, we're just going to say goodbye.

00:30:15.800 --> 00:30:15.960
<v Michael Kennedy>Goodbye.

00:30:17.080 --> 00:30:17.320
<v Michael Kennedy>Bye.

00:30:17.400 --> 00:30:17.820
<v Michael Kennedy>Talk to you next week.

00:30:18.360 --> 00:30:18.660
<v Michael Kennedy>See you later.

