WEBVTT

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

00:00:05.020 --> 00:00:11.240
<v Michael Kennedy>to your earbuds. This is episode 483, recorded June 9th, 2026. I'm Michael Kennedy.

00:00:11.560 --> 00:00:12.660
<v Michael Kennedy>I'm Calvin Hendryx-Parker.

00:00:13.120 --> 00:00:17.720
<v Michael Kennedy>And this episode is brought to you by us, All of Our Things. We'll talk a little bit about that in

00:00:17.820 --> 00:00:21.500
<v Michael Kennedy>the introduction bit here in just a second. If you want to follow us on social media,

00:00:21.640 --> 00:00:26.080
<v Michael Kennedy>we're on all the socials. We'll have those in the show notes for you. Sign up for the newsletter

00:00:26.100 --> 00:00:28.320
<v Michael Kennedy>at pythonbytes.fm/newsletter

00:00:28.440 --> 00:00:30.040
<v Michael Kennedy>or just domain click on newsletter.

00:00:30.640 --> 00:00:32.040
<v Michael Kennedy>You always get a bunch of interesting things

00:00:32.240 --> 00:00:33.720
<v Michael Kennedy>as well as some extra announcements

00:00:33.980 --> 00:00:35.580
<v Michael Kennedy>for fun stuff that we have going on.

00:00:35.980 --> 00:00:37.780
<v Michael Kennedy>And with that, I actually, Calvin,

00:00:37.920 --> 00:00:39.900
<v Michael Kennedy>have a pretty big announcement.

00:00:40.380 --> 00:00:42.880
<v Michael Kennedy>So I want to say thank you to Brian Okken.

00:00:43.440 --> 00:00:46.540
<v Michael Kennedy>The big news is that Brian has stepped back from the show.

00:00:46.900 --> 00:00:49.880
<v Michael Kennedy>He's been working on it for almost 10 years,

00:00:50.260 --> 00:00:52.240
<v Michael Kennedy>just a few months short of 10 years.

00:00:52.420 --> 00:00:52.960
<v Michael Kennedy>That's incredible.

00:00:52.960 --> 00:00:53.760
<v Michael Kennedy>That's a great run.

00:00:54.160 --> 00:00:54.920
<v Michael Kennedy>That's an incredible run.

00:00:55.080 --> 00:00:56.240
<v Michael Kennedy>That is an incredible run.

00:00:56.700 --> 00:00:59.620
<v Michael Kennedy>Obviously, the world has changed a lot over the last 10 years,

00:01:00.100 --> 00:01:03.940
<v Michael Kennedy>and Brian just needs more time to focus on some of his other projects.

00:01:04.199 --> 00:01:05.460
<v Michael Kennedy>Not stepping away from programming.

00:01:05.620 --> 00:01:09.300
<v Michael Kennedy>He's not going to go become like an organic farmer in Eastern Oregon.

00:01:09.440 --> 00:01:10.000
<v Michael Kennedy>Forest ranger.

00:01:10.700 --> 00:01:11.000
<v Michael Kennedy>Exactly.

00:01:11.140 --> 00:01:11.480
<v Michael Kennedy>You know what?

00:01:11.540 --> 00:01:12.800
<v Michael Kennedy>I'm retiring from tech.

00:01:13.000 --> 00:01:13.340
<v Michael Kennedy>That's it.

00:01:14.320 --> 00:01:16.460
<v Michael Kennedy>No, but he's moved on from the show,

00:01:16.780 --> 00:01:18.320
<v Michael Kennedy>and I just want to take a moment and say,

00:01:18.440 --> 00:01:19.880
<v Michael Kennedy>Brian, thank you very much.

00:01:20.320 --> 00:01:22.400
<v Michael Kennedy>You've made the show what it is over the years,

00:01:22.600 --> 00:01:24.620
<v Michael Kennedy>and it's been great to work with you,

00:01:24.700 --> 00:01:26.020
<v Michael Kennedy>And it's been really, really awesome.

00:01:26.340 --> 00:01:28.560
<v Michael Kennedy>And I know a lot of people in the audience are going to miss you.

00:01:28.800 --> 00:01:29.460
<v Calvin Hendryx-Parker>Yeah, I agree.

00:01:29.600 --> 00:01:31.360
<v Calvin Hendryx-Parker>I've gotten to know Brian over the years as well.

00:01:31.520 --> 00:01:35.940
<v Calvin Hendryx-Parker>And I really appreciate him being on the show and just being a part of the Python community.

00:01:36.160 --> 00:01:39.080
<v Calvin Hendryx-Parker>So I've enjoyed having Brian around as well.

00:01:39.380 --> 00:01:41.760
<v Calvin Hendryx-Parker>Not that he's going to go away, but he's just not here right now.

00:01:42.060 --> 00:01:44.520
<v Michael Kennedy>Yeah, maybe we'll have him back as a guest sometime.

00:01:44.760 --> 00:01:45.280
<v Michael Kennedy>Yes, absolutely.

00:01:45.860 --> 00:01:47.320
<v Michael Kennedy>So Brian, thank you very much.

00:01:48.120 --> 00:01:49.980
<v Michael Kennedy>And Calvin, welcome to the show.

00:01:50.440 --> 00:01:51.180
<v Calvin Hendryx-Parker>I'm glad to be here.

00:01:51.360 --> 00:01:51.720
<v Calvin Hendryx-Parker>I'm excited.

00:01:51.760 --> 00:01:55.320
<v Calvin Hendryx-Parker>This is a new, the next generation of Python Bytes.

00:01:55.520 --> 00:01:55.920
<v Calvin Hendryx-Parker>Let's do it.

00:01:56.100 --> 00:01:56.940
<v Michael Kennedy>Yeah, absolutely.

00:01:57.340 --> 00:01:57.920
<v Michael Kennedy>The next generation.

00:01:58.160 --> 00:02:04.900
<v Michael Kennedy>So I know you have your pulse on the industry in so many ways, and you have a ton to contribute.

00:02:05.240 --> 00:02:07.720
<v Michael Kennedy>And so we're going to work together on Python Bytes for a while.

00:02:07.800 --> 00:02:08.899
<v Michael Kennedy>And yeah, it's awesome.

00:02:09.160 --> 00:02:10.320
<v Michael Kennedy>So thanks for coming on the show.

00:02:10.640 --> 00:02:12.280
<v Michael Kennedy>It's really great to have you.

00:02:12.440 --> 00:02:13.260
<v Michael Kennedy>Thank you, Brian, for being here.

00:02:13.520 --> 00:02:14.160
<v Michael Kennedy>Calvin, welcome.

00:02:14.900 --> 00:02:16.680
<v Michael Kennedy>Normally, we just kick off the show.

00:02:16.800 --> 00:02:18.560
<v Michael Kennedy>Hey, I'm Brian, I'm Michael, or whatever.

00:02:19.100 --> 00:02:24.200
<v Michael Kennedy>But this time, at least you've been on the show on this show before, as well as Talk Python.

00:02:24.350 --> 00:02:28.360
<v Michael Kennedy>But just give people a real quick introduction since you're kind of new to a lot of people.

00:02:28.740 --> 00:02:29.120
<v Calvin Hendryx-Parker>Sure, sure.

00:02:29.340 --> 00:02:30.600
<v Calvin Hendryx-Parker>So I'm Calvin Hendryx-Parker.

00:02:30.680 --> 00:02:32.920
<v Calvin Hendryx-Parker>I'm co-founder and CTO of Six Feet Up.

00:02:33.140 --> 00:02:37.900
<v Calvin Hendryx-Parker>We are a Python agency that loves specializing in solving hard problems and helping impactful

00:02:38.690 --> 00:02:43.040
<v Calvin Hendryx-Parker>leaders build a better world out there and do things to benefit humankind in some way.

00:02:43.580 --> 00:02:47.100
<v Calvin Hendryx-Parker>I also am a co-founder of the IndiePy meetup here in Indianapolis.

00:02:47.320 --> 00:02:48.780
<v Calvin Hendryx-Parker>So very involved in the community.

00:02:49.740 --> 00:02:52.100
<v Calvin Hendryx-Parker>I love going to PyCon and being around all the folks.

00:02:52.540 --> 00:02:55.080
<v Calvin Hendryx-Parker>So this definitely fits well with like kind of my mission,

00:02:55.530 --> 00:02:58.960
<v Calvin Hendryx-Parker>which is to bring more to the Python community if I can.

00:02:59.440 --> 00:03:01.740
<v Michael Kennedy>And you're also an AWS hero, is that right?

00:03:01.960 --> 00:03:02.600
<v Calvin Hendryx-Parker>Oh yeah, I am.

00:03:03.200 --> 00:03:06.520
<v Calvin Hendryx-Parker>AWS hero since 2018 or 2019, I think.

00:03:06.700 --> 00:03:06.760
<v Calvin Hendryx-Parker>Yeah.

00:03:07.060 --> 00:03:09.040
<v Calvin Hendryx-Parker>So basically means AWS thinks I'm kind of a,

00:03:09.250 --> 00:03:09.860
<v Calvin Hendryx-Parker>I guess a big deal.

00:03:09.860 --> 00:03:10.180
<v Calvin Hendryx-Parker>I don't know.

00:03:10.860 --> 00:03:12.000
<v Calvin Hendryx-Parker>He's a big deal.

00:03:12.220 --> 00:03:12.800
<v Calvin Hendryx-Parker>Yeah, right.

00:03:13.220 --> 00:03:14.520
<v Calvin Hendryx-Parker>Yeah, there's only a few of them around the globe.

00:03:14.640 --> 00:03:18.600
<v Calvin Hendryx-Parker>And it's kind of cool because you can't be an Amazon employee or employed by a competitor.

00:03:19.020 --> 00:03:23.300
<v Calvin Hendryx-Parker>And so it allows me to maintain my independence and a little bit of cloud agnosticness.

00:03:24.060 --> 00:03:28.880
<v Michael Kennedy>Yeah. Awesome. All right. Well, with that, how about you kick off our first topic?

00:03:29.300 --> 00:03:41.640
<v Calvin Hendryx-Parker>Oh, sure. I'd love to. So we've got just yesterday, the fine folks at Astral have released some new features that are still in beta for checking for vulnerabilities and also some malware checks.

00:03:41.820 --> 00:03:44.840
<v Calvin Hendryx-Parker>So for example, they've added the new audit subcommand.

00:03:45.060 --> 00:03:48.260
<v Calvin Hendryx-Parker>So as you, this is not an unheard of thing in the community.

00:03:48.420 --> 00:03:50.000
<v Calvin Hendryx-Parker>There's existing tools like it,

00:03:50.060 --> 00:03:51.740
<v Calvin Hendryx-Parker>for example, safety and pip audit.

00:03:52.120 --> 00:03:54.020
<v Calvin Hendryx-Parker>What is different about uv offering this?

00:03:54.640 --> 00:03:55.960
<v Calvin Hendryx-Parker>They have basically said,

00:03:56.020 --> 00:03:58.260
<v Calvin Hendryx-Parker>we have an opinion like they've done in other ways.

00:03:58.520 --> 00:03:59.540
<v Calvin Hendryx-Parker>Astral has basically said,

00:03:59.560 --> 00:04:00.960
<v Calvin Hendryx-Parker>we have opinions about how things should be done.

00:04:01.340 --> 00:04:02.800
<v Calvin Hendryx-Parker>And we're trying to optimize

00:04:03.000 --> 00:04:04.460
<v Calvin Hendryx-Parker>the developer experience workflow

00:04:04.900 --> 00:04:08.260
<v Calvin Hendryx-Parker>to make this not suffer from some of the problems

00:04:08.320 --> 00:04:09.960
<v Calvin Hendryx-Parker>you get with like, for example, npm.

00:04:10.240 --> 00:04:11.160
<v Calvin Hendryx-Parker>When you do an npm install,

00:04:11.500 --> 00:04:14.560
<v Calvin Hendryx-Parker>you get this just overload of warnings for deprecations.

00:04:14.680 --> 00:04:16.600
<v Calvin Hendryx-Parker>And so you just kind of start ignoring it

00:04:16.600 --> 00:04:17.720
<v Calvin Hendryx-Parker>and not paying attention to it.

00:04:17.940 --> 00:04:19.500
<v Calvin Hendryx-Parker>The idea is to be explicit

00:04:19.900 --> 00:04:23.800
<v Calvin Hendryx-Parker>and call it when you want to have these kind of scans run.

00:04:23.840 --> 00:04:25.700
<v Calvin Hendryx-Parker>So you could put it into a pre-commit hook, for example,

00:04:25.720 --> 00:04:27.880
<v Calvin Hendryx-Parker>you can obviously run it in your CI pipeline,

00:04:28.000 --> 00:04:30.000
<v Calvin Hendryx-Parker>but it's meant for the developers to run locally as well.

00:04:30.500 --> 00:04:33.840
<v Calvin Hendryx-Parker>And the add command and sync commands have been updated.

00:04:34.120 --> 00:04:36.060
<v Calvin Hendryx-Parker>Well, optionally right now, they're not enabled,

00:04:36.240 --> 00:04:38.000
<v Calvin Hendryx-Parker>but if you enable the uv malware check,

00:04:38.420 --> 00:04:40.559
<v Calvin Hendryx-Parker>the add and sync commands will proactively tell you

00:04:40.580 --> 00:04:43.180
<v Calvin Hendryx-Parker>if you're adding a potential malware package

00:04:43.400 --> 00:04:46.080
<v Calvin Hendryx-Parker>to your project right now.

00:04:46.420 --> 00:04:47.240
<v Calvin Hendryx-Parker>I actually tried it out today.

00:04:47.400 --> 00:04:48.320
<v Calvin Hendryx-Parker>I actually love that.

00:04:48.520 --> 00:04:49.320
<v Calvin Hendryx-Parker>Yeah, that's really cool.

00:04:49.520 --> 00:04:51.680
<v Calvin Hendryx-Parker>I literally did it today because I was like,

00:04:51.690 --> 00:04:53.940
<v Calvin Hendryx-Parker>oh, I should go check out my last FastAPI project

00:04:53.970 --> 00:04:55.440
<v Calvin Hendryx-Parker>to make sure I'm up to date on things.

00:04:55.530 --> 00:04:57.800
<v Calvin Hendryx-Parker>And I ran the uv audit, again, super fast,

00:04:57.970 --> 00:05:00.160
<v Calvin Hendryx-Parker>as you would expect most of the tools from Astral to be.

00:05:00.760 --> 00:05:04.180
<v Calvin Hendryx-Parker>And I had my Pi coding agent go and fix all the problems.

00:05:04.410 --> 00:05:06.340
<v Calvin Hendryx-Parker>And I released a new prod release just this morning

00:05:06.950 --> 00:05:08.040
<v Calvin Hendryx-Parker>because of the uv audit tool.

00:05:08.760 --> 00:05:09.700
<v Calvin Hendryx-Parker>It seems really, really nice.

00:05:09.880 --> 00:05:10.780
<v Calvin Hendryx-Parker>I'm really excited about it.

00:05:10.920 --> 00:05:11.180
<v Michael Kennedy>Awesome.

00:05:11.500 --> 00:05:14.380
<v Michael Kennedy>I have been, I talked about it maybe six months ago or so,

00:05:14.680 --> 00:05:18.680
<v Michael Kennedy>a couple of security things you can do for the supply chain vulnerability.

00:05:19.120 --> 00:05:21.980
<v Michael Kennedy>And it's just super scary, right?

00:05:22.100 --> 00:05:25.260
<v Michael Kennedy>Because you're just working normally on your projects.

00:05:25.480 --> 00:05:28.600
<v Michael Kennedy>And if you time it wrong, well, bad things happen.

00:05:28.700 --> 00:05:30.280
<v Michael Kennedy>And they have happened to people, right?

00:05:30.560 --> 00:05:34.220
<v Michael Kennedy>Not in great numbers in the Python world, but still enough, you know,

00:05:34.480 --> 00:05:37.780
<v Michael Kennedy>some of the LLM tools I can think of were pretty, that was a pretty bad one.

00:05:38.020 --> 00:05:38.960
<v Calvin Hendryx-Parker>Well, we're paying attention now.

00:05:39.140 --> 00:05:40.920
<v Calvin Hendryx-Parker>I think folks are hopefully paying more attention

00:05:41.070 --> 00:05:43.700
<v Calvin Hendryx-Parker>and tools like this make it easier to pay attention

00:05:44.060 --> 00:05:45.980
<v Calvin Hendryx-Parker>and less friction to be safe.

00:05:46.420 --> 00:05:47.920
<v Calvin Hendryx-Parker>I think it's got options, for example,

00:05:48.120 --> 00:05:50.060
<v Calvin Hendryx-Parker>not to install the latest version of a package.

00:05:50.380 --> 00:05:52.760
<v Calvin Hendryx-Parker>Maybe you want to like a cool off period to say,

00:05:52.840 --> 00:05:54.880
<v Calvin Hendryx-Parker>I think that was already built in to uv,

00:05:55.120 --> 00:05:56.360
<v Calvin Hendryx-Parker>which does have a cool off period.

00:05:56.460 --> 00:05:57.380
<v Calvin Hendryx-Parker>That's a smart thing to do.

00:05:57.490 --> 00:05:59.380
<v Calvin Hendryx-Parker>You don't want the package that was released today

00:05:59.640 --> 00:06:00.860
<v Calvin Hendryx-Parker>because it might have a vulnerability

00:06:01.110 --> 00:06:02.900
<v Calvin Hendryx-Parker>from a supply chain attack in there.

00:06:02.990 --> 00:06:03.800
<v Calvin Hendryx-Parker>And you want to make sure,

00:06:04.080 --> 00:06:05.500
<v Calvin Hendryx-Parker>usually in a few days, those are shook out.

00:06:05.770 --> 00:06:07.980
<v Calvin Hendryx-Parker>And so grabbing a seven day old version of it,

00:06:08.240 --> 00:06:09.760
<v Calvin Hendryx-Parker>probably the safe thing to do, for example.

00:06:10.100 --> 00:06:12.040
<v Michael Kennedy>Yeah, and that's what motivated me

00:06:12.070 --> 00:06:14.000
<v Michael Kennedy>to start down that whole path of talking about those things.

00:06:14.090 --> 00:06:18.180
<v Michael Kennedy>I'm like, oh, they just shipped no earlier than whatever it was.

00:06:18.350 --> 00:06:20.440
<v Michael Kennedy>And so that was really excellent.

00:06:20.530 --> 00:06:22.620
<v Michael Kennedy>And then I started using pip Audit as well

00:06:22.690 --> 00:06:25.260
<v Michael Kennedy>and even like share how you bring that into like a Docker world.

00:06:25.740 --> 00:06:26.160
<v Michael Kennedy>And that's great.

00:06:26.720 --> 00:06:28.180
<v Michael Kennedy>I'm feeling like that needs to be, for me,

00:06:28.460 --> 00:06:30.900
<v Michael Kennedy>updated to use uv Audit instead of pip Audit,

00:06:31.010 --> 00:06:33.320
<v Michael Kennedy>which just because like one of the things I see on the screen

00:06:33.400 --> 00:06:34.480
<v Michael Kennedy>is four to 10 times faster.

00:06:34.820 --> 00:06:36.200
<v Calvin Hendryx-Parker>Everything else I'm doing with uv,

00:06:36.400 --> 00:06:38.240
<v Michael Kennedy>but I just couldn't because it didn't support this, right?

00:06:38.440 --> 00:06:39.420
<v Calvin Hendryx-Parker>There's an asterisk there.

00:06:40.160 --> 00:06:42.660
<v Calvin Hendryx-Parker>PIP audit with a fully primed cache is probably about as fast.

00:06:43.060 --> 00:06:44.820
<v Calvin Hendryx-Parker>But if you're going from a CI pipeline,

00:06:45.360 --> 00:06:47.080
<v Calvin Hendryx-Parker>you're going to get the 4 to 10x speed up.

00:06:47.120 --> 00:06:49.300
<v Calvin Hendryx-Parker>So those are the, again, creature comforts

00:06:49.360 --> 00:06:52.360
<v Calvin Hendryx-Parker>that I believe the astral folks have brought to the game.

00:06:52.600 --> 00:06:54.020
<v Calvin Hendryx-Parker>They've just said, we're going to be opinionated.

00:06:54.160 --> 00:06:55.000
<v Calvin Hendryx-Parker>This is how we're going to do it.

00:06:55.140 --> 00:06:56.740
<v Calvin Hendryx-Parker>And we're going to make it better for everybody, hopefully.

00:06:57.140 --> 00:06:58.500
<v Calvin Hendryx-Parker>So if you like those opinions, it's good for you.

00:06:58.820 --> 00:07:01.040
<v Calvin Hendryx-Parker>If you had other opinions, well, this is probably better.

00:07:01.660 --> 00:07:01.960
<v Calvin Hendryx-Parker>Yeah.

00:07:03.180 --> 00:07:03.700
<v Michael Kennedy>Yes, exactly.

00:07:04.280 --> 00:07:05.380
<v Michael Kennedy>So out in the audience, Mike.

00:07:05.640 --> 00:07:05.960
<v Michael Kennedy>Hey, Mike.

00:07:06.220 --> 00:07:11.500
<v Michael Kennedy>points out that this weekend's Miasma Hades attack is timely.

00:07:11.860 --> 00:07:13.240
<v Michael Kennedy>I don't know about it, but okay.

00:07:13.700 --> 00:07:14.920
<v Calvin Hendryx-Parker>I have to research it.

00:07:15.340 --> 00:07:17.400
<v Calvin Hendryx-Parker>If you had a CI pipeline running on the weekend

00:07:17.700 --> 00:07:19.100
<v Calvin Hendryx-Parker>and got that version over the weekend,

00:07:19.460 --> 00:07:21.580
<v Calvin Hendryx-Parker>and these things always happen on a Friday late on a weekend

00:07:21.960 --> 00:07:22.480
<v Calvin Hendryx-Parker>because no one's looking,

00:07:23.040 --> 00:07:25.220
<v Calvin Hendryx-Parker>that's exactly the timing that these kind of things happen.

00:07:25.320 --> 00:07:27.440
<v Calvin Hendryx-Parker>So make sure you've got that cool off period in there.

00:07:27.680 --> 00:07:28.140
<v Michael Kennedy>Yeah, exactly.

00:07:28.640 --> 00:07:32.440
<v Michael Kennedy>So I made the mistake of actually going on vacation for the weekend,

00:07:32.680 --> 00:07:33.980
<v Michael Kennedy>and so I wasn't paying enough attention.

00:07:34.400 --> 00:07:35.700
<v Michael Kennedy>So I got to research this.

00:07:35.880 --> 00:07:37.240
<v Calvin Hendryx-Parker>Wait, you actually took a couple days off?

00:07:37.500 --> 00:07:37.600
<v Michael Kennedy>Yeah.

00:07:37.880 --> 00:07:39.860
<v Michael Kennedy>I sat by the ocean.

00:07:40.000 --> 00:07:40.640
<v Michael Kennedy>It wasn't terrible.

00:07:41.540 --> 00:07:41.780
<v Calvin Hendryx-Parker>Nice.

00:07:43.060 --> 00:07:43.380
<v Michael Kennedy>All right.

00:07:43.820 --> 00:07:49.120
<v Michael Kennedy>Let's talk about, I think this relates a little bit back to the supply chain, but not necessarily

00:07:49.160 --> 00:07:50.260
<v Michael Kennedy>in a vulnerability way.

00:07:50.860 --> 00:07:53.000
<v Michael Kennedy>You also mentioned your Pi coding agent.

00:07:53.060 --> 00:07:54.480
<v Michael Kennedy>We need to speak about this a little bit.

00:07:54.600 --> 00:07:54.980
<v Calvin Hendryx-Parker>Yeah, we should.

00:07:55.240 --> 00:07:55.960
<v Michael Kennedy>Yeah, absolutely.

00:07:57.020 --> 00:07:58.780
<v Michael Kennedy>This is going to have to be one of your whole topics sometime.

00:07:58.940 --> 00:08:06.020
<v Michael Kennedy>But it seems to me like a lot of the projects that people depend upon have these very shallow dependencies.

00:08:06.720 --> 00:08:15.680
<v Michael Kennedy>And by that, I mean, like, yeah, I'm sure I'm using this library that lets me give, I don't know, a zip code and it gives me the state back or something like that.

00:08:15.760 --> 00:08:17.440
<v Michael Kennedy>Right. But I only call the one function.

00:08:17.900 --> 00:08:18.660
<v Michael Kennedy>You know what I mean?

00:08:19.600 --> 00:08:23.380
<v Michael Kennedy>would it be possible to just have some kind of coding agent

00:08:23.540 --> 00:08:26.120
<v Michael Kennedy>or even you just write that into your project

00:08:26.360 --> 00:08:28.500
<v Michael Kennedy>instead of adding maybe that dependency

00:08:28.720 --> 00:08:30.100
<v Michael Kennedy>and three other dependencies it has,

00:08:30.200 --> 00:08:31.680
<v Michael Kennedy>then you're worried about like cool down periods

00:08:32.080 --> 00:08:34.380
<v Michael Kennedy>and supply chain and just like,

00:08:34.620 --> 00:08:36.020
<v Michael Kennedy>oh, this one only works on 3.14.

00:08:36.280 --> 00:08:38.140
<v Michael Kennedy>This one only works or lower

00:08:38.280 --> 00:08:40.039
<v Michael Kennedy>and this other one only works in 3.15 and above.

00:08:40.140 --> 00:08:40.800
<v Michael Kennedy>Like, what do I do?

00:08:41.479 --> 00:08:42.320
<v Michael Kennedy>You know, those kinds of issues.

00:08:42.780 --> 00:08:45.060
<v Michael Kennedy>So I want to highlight this article called

00:08:45.560 --> 00:08:48.240
<v Michael Kennedy>HTTP GET requests with Python standard library.

00:08:48.600 --> 00:08:56.380
<v Michael Kennedy>by Alex Chan. And so Alex basically says, there's been all this stuff going on with HTTPX. I'm going

00:08:56.380 --> 00:09:01.020
<v Michael Kennedy>to talk about that at the end of the show a little bit more. But we've also got requests, we've got

00:09:01.100 --> 00:09:10.800
<v Michael Kennedy>URLib, we've got NyQuest, which is a little bit like a modernized request compatible API. But,

00:09:11.100 --> 00:09:16.199
<v Michael Kennedy>you know, built into the library, we've got URLib requests, could we just put the three or four

00:09:16.200 --> 00:09:22.640
<v Michael Kennedy>functions that we want to write but turn that and just instead of having actually htpx or requests

00:09:23.020 --> 00:09:28.160
<v Michael Kennedy>just have it use the built-ins right so build a little facade adapter layer on top of stuff that's

00:09:28.320 --> 00:09:32.240
<v Calvin Hendryx-Parker>already there what do you think of that idea i think that's smart kind of a little bit of shift

00:09:32.360 --> 00:09:36.860
<v Calvin Hendryx-Parker>left or first principles like if you don't need to bring along those whole packages you don't bring

00:09:36.910 --> 00:09:41.480
<v Calvin Hendryx-Parker>along a lot of complexity frameworks are nice when they solve you know they usually do like an 80

00:09:41.770 --> 00:09:46.180
<v Calvin Hendryx-Parker>kind of problem if you get a 10 kind of problem i wouldn't bring those kind of dependencies

00:09:46.200 --> 00:09:48.300
<v Calvin Hendryx-Parker>into your project because now you're on the treadmill.

00:09:48.840 --> 00:09:51.180
<v Calvin Hendryx-Parker>You've got to keep up with the release cycles

00:09:51.420 --> 00:09:53.040
<v Calvin Hendryx-Parker>and security vulnerabilities, et cetera,

00:09:53.580 --> 00:09:55.380
<v Calvin Hendryx-Parker>versus if you're controlling your own fate here

00:09:55.600 --> 00:09:57.180
<v Calvin Hendryx-Parker>for just a couple little things you need,

00:09:57.580 --> 00:10:01.900
<v Calvin Hendryx-Parker>it's probably cleaner and more explicit than implicit.

00:10:02.200 --> 00:10:04.400
<v Michael Kennedy>You're just not subject to have to deal with

00:10:04.820 --> 00:10:06.280
<v Michael Kennedy>all the stuff that goes with it, right?

00:10:06.380 --> 00:10:08.600
<v Michael Kennedy>And put security aside, just the,

00:10:08.900 --> 00:10:11.400
<v Michael Kennedy>they released a new version or they decided

00:10:11.420 --> 00:10:12.600
<v Michael Kennedy>they were going to do a breaking change

00:10:12.920 --> 00:10:14.060
<v Michael Kennedy>and that's probably worthwhile,

00:10:14.460 --> 00:10:16.220
<v Michael Kennedy>but then you've got to deal with the breaking change.

00:10:16.580 --> 00:10:19.640
<v Michael Kennedy>You know, like if the thing you're doing is not going to change really,

00:10:20.000 --> 00:10:20.860
<v Michael Kennedy>and it's pretty straightforward,

00:10:21.440 --> 00:10:23.740
<v Michael Kennedy>you could just ask Claude or Pyre or whatever,

00:10:24.240 --> 00:10:27.220
<v Michael Kennedy>hey, see this thing, could you just give me the two functions I'm using?

00:10:28.340 --> 00:10:31.240
<v Michael Kennedy>If there's enough foundational stuff in the standard library, right?

00:10:31.360 --> 00:10:34.360
<v Michael Kennedy>So I think this is a pretty interesting thing for people to think through.

00:10:34.770 --> 00:10:36.580
<v Michael Kennedy>I was going down this path.

00:10:36.590 --> 00:10:37.560
<v Michael Kennedy>I'm like, this is pretty cool.

00:10:37.780 --> 00:10:41.820
<v Michael Kennedy>What if I could just make, I think I use three functions from HTTPX.

00:10:42.140 --> 00:10:46.780
<v Michael Kennedy>What if I could do this for HTTPX instead of the thing that they were basing theirs on?

00:10:47.160 --> 00:10:49.480
<v Michael Kennedy>How hard would that be with a little bit of Claude help, right?

00:10:49.680 --> 00:10:58.300
<v Michael Kennedy>And it turns out that the standard library's HTTP call stuff does not have any async support whatsoever.

00:10:59.060 --> 00:11:00.800
<v Calvin Hendryx-Parker>I was going to ask if that was a thing.

00:11:01.759 --> 00:11:02.760
<v Michael Kennedy>No, it's not.

00:11:02.860 --> 00:11:06.260
<v Michael Kennedy>I'm like, wait, what are the use cases for asyncio?

00:11:06.920 --> 00:11:09.600
<v Michael Kennedy>Database, HTTP, API.

00:11:10.400 --> 00:11:10.900
<v Michael Kennedy>Hitting a network.

00:11:11.300 --> 00:11:11.680
<v Michael Kennedy>Hitting a network.

00:11:11.960 --> 00:11:16.700
<v Michael Kennedy>Wait, it's had that since 3.4, I believe,

00:11:16.770 --> 00:11:18.020
<v Michael Kennedy>is when async was in.

00:11:18.110 --> 00:11:20.820
<v Michael Kennedy>And then async and await came in at 3.5.

00:11:21.080 --> 00:11:22.440
<v Calvin Hendryx-Parker>Michael, you need to submit a PEP now.

00:11:23.080 --> 00:11:23.520
<v Michael Kennedy>You know what?

00:11:23.720 --> 00:11:25.720
<v Michael Kennedy>Very insightful thought.

00:11:25.860 --> 00:11:28.020
<v Michael Kennedy>I actually wrote Brett Cannon a message about this.

00:11:28.140 --> 00:11:31.540
<v Michael Kennedy>Said, hey, what would the steps to be actually submitting a PEP for this?

00:11:32.040 --> 00:11:33.680
<v Michael Kennedy>And he sent me back some stuff.

00:11:33.690 --> 00:11:35.840
<v Michael Kennedy>And Brett, I haven't had it just because I sent that message

00:11:35.910 --> 00:11:36.580
<v Michael Kennedy>and went straight on vacation.

00:11:37.110 --> 00:11:38.840
<v Michael Kennedy>I haven't had a chance to respond,

00:11:39.040 --> 00:11:41.660
<v Michael Kennedy>but it looks like there's some work to be done.

00:11:41.960 --> 00:11:42.780
<v Michael Kennedy>and research to be done.

00:11:42.980 --> 00:11:46.160
<v Michael Kennedy>But I do think that that's a totally reasonable thing.

00:11:46.280 --> 00:11:49.600
<v Michael Kennedy>And DBAPI itself also surely does not support async,

00:11:49.720 --> 00:11:50.460
<v Michael Kennedy>but should, you know?

00:11:50.680 --> 00:11:52.420
<v Calvin Hendryx-Parker>Like, I think there's a few really clear places.

00:11:52.740 --> 00:11:53.700
<v Calvin Hendryx-Parker>Yeah, there's still some hard problems

00:11:53.820 --> 00:11:54.660
<v Calvin Hendryx-Parker>left in the Python core.

00:11:55.080 --> 00:11:56.220
<v Calvin Hendryx-Parker>Yeah, we thought it was all done.

00:11:56.400 --> 00:11:56.700
<v Calvin Hendryx-Parker>It's not.

00:11:56.960 --> 00:11:57.120
<v Calvin Hendryx-Parker>Yeah, yeah.

00:11:57.480 --> 00:11:59.280
<v Calvin Hendryx-Parker>Although it is nice when you've got like HTTPX2

00:11:59.460 --> 00:12:00.780
<v Calvin Hendryx-Parker>and you can just drop in and replace.

00:12:01.240 --> 00:12:01.660
<v Michael Kennedy>Yep, exactly.

00:12:02.240 --> 00:12:02.300
<v Michael Kennedy>Yeah.

00:12:02.380 --> 00:12:02.580
<v Calvin Hendryx-Parker>Nice.

00:12:03.020 --> 00:12:05.360
<v Michael Kennedy>Yeah, we talked about that from the Pydantic folks

00:12:05.400 --> 00:12:06.740
<v Michael Kennedy>and we're going to talk about that some more.

00:12:07.220 --> 00:12:08.320
<v Calvin Hendryx-Parker>Yep, yep, sounds good.

00:12:08.580 --> 00:12:09.920
<v Michael Kennedy>All right, over to you, Calvin, for the next one.

00:12:10.200 --> 00:12:14.340
<v Calvin Hendryx-Parker>So this one's a little bit of a double-edged mixed bag.

00:12:16.290 --> 00:12:21.480
<v Calvin Hendryx-Parker>The bad host vulnerability is a critical vulnerability in Starlet, which is an ASCII framework,

00:12:21.800 --> 00:12:26.160
<v Calvin Hendryx-Parker>underlies a lot of very popular projects right now that are, if you're doing MCP or if you're

00:12:26.160 --> 00:12:32.800
<v Calvin Hendryx-Parker>doing FastAPI, it basically is kind of a core layer for the asynchronous HTTP traffic for

00:12:33.100 --> 00:12:33.900
<v Calvin Hendryx-Parker>building an API server.

00:12:34.320 --> 00:12:37.500
<v Calvin Hendryx-Parker>So this vulnerability was reported.

00:12:37.960 --> 00:12:39.320
<v Calvin Hendryx-Parker>The community responded.

00:12:39.340 --> 00:12:45.100
<v Calvin Hendryx-Parker>there was a little bit of a back and forth but I think that the exploit is trivial for example

00:12:45.240 --> 00:12:52.160
<v Calvin Hendryx-Parker>injecting a single character into an HTTP host header can bypass path-based authentication now

00:12:52.460 --> 00:12:56.460
<v Calvin Hendryx-Parker>there's this is where this gets a little more interesting is that maybe that's not a great

00:12:56.680 --> 00:13:00.680
<v Calvin Hendryx-Parker>pattern for you to do which is path-based authentication that was kind of the pushback

00:13:00.880 --> 00:13:06.719
<v Calvin Hendryx-Parker>from the Starlette maintainers which is this is not really a intended use case for Starlet

00:13:06.740 --> 00:13:11.760
<v Calvin Hendryx-Parker>it is a vulnerability. It has been patched, has been fixed, but I believe they got a little bit of

00:13:12.510 --> 00:13:19.380
<v Calvin Hendryx-Parker>a bum deal from the journalists who are covering it. So actually, in addition to this post here,

00:13:19.620 --> 00:13:24.380
<v Calvin Hendryx-Parker>there's also the maintainer's perspective, which I thought was a very interesting view into both

00:13:24.560 --> 00:13:29.020
<v Calvin Hendryx-Parker>sides of the situation. Not often do you get to see when there's a vulnerability or a CVE announced

00:13:29.420 --> 00:13:33.079
<v Calvin Hendryx-Parker>that the maintainers get to kind of post their response. And I think they post the response

00:13:33.120 --> 00:13:34.740
<v Calvin Hendryx-Parker>and it's well written, well thought out,

00:13:35.400 --> 00:13:38.000
<v Calvin Hendryx-Parker>explaining why this is probably not something that's common.

00:13:38.560 --> 00:13:39.860
<v Calvin Hendryx-Parker>Many people probably weren't as vulnerable

00:13:40.120 --> 00:13:41.460
<v Calvin Hendryx-Parker>as they thought they might be,

00:13:41.680 --> 00:13:43.520
<v Calvin Hendryx-Parker>but it would affect some really major projects.

00:13:43.650 --> 00:13:45.200
<v Calvin Hendryx-Parker>And if major projects were doing a pattern

00:13:45.350 --> 00:13:46.740
<v Calvin Hendryx-Parker>that was not originally intended

00:13:46.830 --> 00:13:47.960
<v Calvin Hendryx-Parker>by the maintainers of Starlet,

00:13:48.090 --> 00:13:49.100
<v Calvin Hendryx-Parker>then you end up in this bad spot.

00:13:49.340 --> 00:13:51.660
<v Calvin Hendryx-Parker>And it could end up in remote code execution

00:13:52.340 --> 00:13:56.040
<v Calvin Hendryx-Parker>as a worst case scenario or data exfiltration

00:13:56.160 --> 00:13:57.760
<v Calvin Hendryx-Parker>that you weren't expecting because of this,

00:13:58.000 --> 00:13:58.700
<v Calvin Hendryx-Parker>but it probably wasn't the way

00:13:58.700 --> 00:14:00.480
<v Calvin Hendryx-Parker>you should be architecting your application.

00:14:01.240 --> 00:14:05.220
<v Calvin Hendryx-Parker>They also got a little bit of a complaint against the Ars Technica reporter.

00:14:06.080 --> 00:14:11.140
<v Calvin Hendryx-Parker>Basically, they asked really demanding questions and wanted an immediate response.

00:14:11.420 --> 00:14:14.140
<v Calvin Hendryx-Parker>That's back here down at the bottom, which was kind of rude.

00:14:14.560 --> 00:14:19.940
<v Calvin Hendryx-Parker>They were very demanding, and they only gave them, I don't know, hours, maybe an hour or

00:14:20.040 --> 00:14:23.160
<v Calvin Hendryx-Parker>two notice that they were going to publish this article on the website.

00:14:23.620 --> 00:14:27.040
<v Calvin Hendryx-Parker>And the website went on, the Ars Technica website went on to say that they had contacted

00:14:27.120 --> 00:14:28.400
<v Calvin Hendryx-Parker>the maintainers but hadn't heard back.

00:14:28.620 --> 00:14:32.840
<v Calvin Hendryx-Parker>There was no comment from the maintainers, which people can read into that how they want.

00:14:32.860 --> 00:14:33.240
<v Calvin Hendryx-Parker>So I'm glad.

00:14:33.420 --> 00:14:34.500
<v Calvin Hendryx-Parker>Yeah, it sounds really bad.

00:14:34.700 --> 00:14:38.860
<v Michael Kennedy>Like Marcello is just going to go, ah, forget you.

00:14:38.960 --> 00:14:40.220
<v Michael Kennedy>I have no comment, right?

00:14:40.260 --> 00:14:42.880
<v Calvin Hendryx-Parker>Because these are open source maintainers who are doing this for the community.

00:14:42.980 --> 00:14:50.400
<v Calvin Hendryx-Parker>They don't have a security team under the covers waiting to respond to journalists and security researchers.

00:14:51.060 --> 00:14:52.840
<v Calvin Hendryx-Parker>I mean, they did work with the security researchers.

00:14:52.960 --> 00:14:57.560
<v Calvin Hendryx-Parker>They did negotiate a shared disclosure or a mutual disclosure timeframe.

00:14:58.420 --> 00:15:03.120
<v Calvin Hendryx-Parker>This ended up for the best for everyone involved, except how he got portrayed.

00:15:03.210 --> 00:15:06.400
<v Calvin Hendryx-Parker>Now, luckily, I think folks in the comments stood up for Marcelo and the team.

00:15:06.920 --> 00:15:08.980
<v Calvin Hendryx-Parker>So I think people in the community understand.

00:15:09.440 --> 00:15:14.800
<v Calvin Hendryx-Parker>But someone who's just coming to that article on Ars Technica may think differently of that project.

00:15:15.250 --> 00:15:17.880
<v Calvin Hendryx-Parker>And I think they should read this article as a response to that.

00:15:18.100 --> 00:15:18.700
<v Calvin Hendryx-Parker>Very interesting.

00:15:19.040 --> 00:15:22.220
<v Michael Kennedy>I generally enjoy reading Dan Gooden's work, and I like Ars Technica.

00:15:22.570 --> 00:15:23.120
<v Michael Kennedy>Yeah, I was surprised.

00:15:24.080 --> 00:15:24.640
<v Michael Kennedy>I was surprised.

00:15:24.940 --> 00:15:27.640
<v Michael Kennedy>You can just see the incentives at play here.

00:15:27.900 --> 00:15:29.540
<v Michael Kennedy>Like, hey, you got to do an article this week,

00:15:29.720 --> 00:15:31.620
<v Michael Kennedy>or we got to be the first to publish on this.

00:15:32.440 --> 00:15:35.100
<v Calvin Hendryx-Parker>Well, and I think because MCP servers were the prime target.

00:15:35.400 --> 00:15:37.320
<v Calvin Hendryx-Parker>If you're running an MCP server,

00:15:37.400 --> 00:15:40.800
<v Calvin Hendryx-Parker>you were probably using a Starlet-based framework under the covers.

00:15:41.200 --> 00:15:43.340
<v Calvin Hendryx-Parker>And so a lot of credentials are stored in there.

00:15:44.140 --> 00:15:48.440
<v Calvin Hendryx-Parker>And if they were slop-coded, vibe-coded versions of those servers out there,

00:15:48.760 --> 00:15:50.920
<v Calvin Hendryx-Parker>they could have used a path-based protection like this.

00:15:51.280 --> 00:15:51.460
<v Michael Kennedy>Sure.

00:15:51.700 --> 00:15:54.720
<v Michael Kennedy>And probably, I don't know how it links back to FastMCP,

00:15:54.980 --> 00:15:57.060
<v Michael Kennedy>but I think that's probably based on Starlet.

00:15:57.260 --> 00:15:58.060
<v Calvin Hendryx-Parker>That's what I was thinking too.

00:15:58.200 --> 00:15:59.400
<v Calvin Hendryx-Parker>I didn't go double check that though.

00:15:59.700 --> 00:16:03.060
<v Michael Kennedy>Yeah, I will leave that as a exercise to the audience.

00:16:03.260 --> 00:16:03.940
<v Calvin Hendryx-Parker>But I think it is.

00:16:04.060 --> 00:16:05.160
<v Calvin Hendryx-Parker>These open source maintainers

00:16:05.180 --> 00:16:07.280
<v Calvin Hendryx-Parker>are getting near daily security reports,

00:16:07.540 --> 00:16:09.280
<v Calvin Hendryx-Parker>especially when you're seeing projects

00:16:09.440 --> 00:16:10.820
<v Calvin Hendryx-Parker>like Mythos being released.

00:16:11.060 --> 00:16:12.880
<v Calvin Hendryx-Parker>I think this volume is only going to increase.

00:16:13.680 --> 00:16:15.340
<v Calvin Hendryx-Parker>So a lot of it's AI generated noise

00:16:15.800 --> 00:16:17.100
<v Calvin Hendryx-Parker>and they have to be able to deal with it.

00:16:17.120 --> 00:16:18.380
<v Calvin Hendryx-Parker>So you're seeing a lot of pushback

00:16:18.540 --> 00:16:19.400
<v Calvin Hendryx-Parker>from the open source communities

00:16:19.660 --> 00:16:22.860
<v Calvin Hendryx-Parker>against AI pull requests and security posts.

00:16:23.160 --> 00:16:23.480
<v Michael Kennedy>Absolutely.

00:16:24.060 --> 00:16:24.120
<v Michael Kennedy>Yep.

00:16:24.980 --> 00:16:26.580
<v Michael Kennedy>We could go down that a lot, but let's instead.

00:16:26.680 --> 00:16:27.160
<v Michael Kennedy>Yeah, yeah, yeah, I know.

00:16:27.220 --> 00:16:28.720
<v Michael Kennedy>Let's talk about merges.

00:16:29.300 --> 00:16:29.660
<v Michael Kennedy>Merges.

00:16:30.060 --> 00:16:30.660
<v Michael Kennedy>Let's talk about merging.

00:16:31.080 --> 00:16:33.660
<v Michael Kennedy>So are you an Alembic sort of person?

00:16:33.940 --> 00:16:34.440
<v Michael Kennedy>Do you Alembic?

00:16:34.710 --> 00:16:36.320
<v Michael Kennedy>Do you, SQLAlchemy is really the question.

00:16:36.330 --> 00:16:37.080
<v Calvin Hendryx-Parker>I do, actually.

00:16:37.490 --> 00:16:40.200
<v Calvin Hendryx-Parker>On that FastAPI project that I was mentioning from this morning,

00:16:40.290 --> 00:16:41.740
<v Calvin Hendryx-Parker>I have Alembic in there.

00:16:42.080 --> 00:16:43.100
<v Michael Kennedy>Okay, very interesting.

00:16:43.250 --> 00:16:44.640
<v Michael Kennedy>Yeah, I think FastAPI, sorry.

00:16:44.810 --> 00:16:47.260
<v Michael Kennedy>I think SQLAlchemy is pretty neat.

00:16:47.420 --> 00:16:50.140
<v Michael Kennedy>And this project, you know, Julian Fianjo

00:16:51.140 --> 00:16:52.500
<v Michael Kennedy>also does this quite a bit.

00:16:53.120 --> 00:16:55.700
<v Michael Kennedy>So he is one of the founders of Mergeify,

00:16:56.280 --> 00:16:59.680
<v Michael Kennedy>which is all about making sure that merges,

00:17:00.700 --> 00:17:01.840
<v Michael Kennedy>PRs emerge faster.

00:17:02.000 --> 00:17:02.960
<v Calvin Hendryx-Parker>That's good advice right there.

00:17:03.120 --> 00:17:03.720
<v Calvin Hendryx-Parker>Stop breaking main.

00:17:04.160 --> 00:17:04.500
<v Michael Kennedy>Exactly.

00:17:04.800 --> 00:17:05.380
<v Michael Kennedy>Stop breaking main.

00:17:06.520 --> 00:17:09.020
<v Michael Kennedy>It's a platform that allows you to handle merges better, right?

00:17:09.459 --> 00:17:11.480
<v Michael Kennedy>So, but one of the problems,

00:17:11.850 --> 00:17:12.579
<v Michael Kennedy>let me see, there we go.

00:17:12.620 --> 00:17:15.839
<v Michael Kennedy>One of the problems they ran into is the way Alembic,

00:17:15.839 --> 00:17:16.560
<v Michael Kennedy>so what is Alembic?

00:17:16.720 --> 00:17:20.400
<v Michael Kennedy>Alembic is a system that allows different developers

00:17:20.770 --> 00:17:22.439
<v Michael Kennedy>in production or Q&A or whatever

00:17:22.750 --> 00:17:25.319
<v Michael Kennedy>to have an older version of the database,

00:17:25.939 --> 00:17:29.880
<v Michael Kennedy>change the classes that map over to the ORM to the database,

00:17:30.390 --> 00:17:34.820
<v Michael Kennedy>and then apply this automation to restructure or migrate the database

00:17:35.520 --> 00:17:38.060
<v Michael Kennedy>such that it's now consistent with this new world, right?

00:17:38.390 --> 00:17:41.520
<v Michael Kennedy>And the way it works is every change you make,

00:17:41.800 --> 00:17:45.040
<v Michael Kennedy>you check in an up and a down set of changes,

00:17:45.280 --> 00:17:47.300
<v Michael Kennedy>like add this column, delete this column, right?

00:17:47.530 --> 00:17:49.700
<v Michael Kennedy>And so on, you know, like the up would be add a column

00:17:49.750 --> 00:17:51.120
<v Michael Kennedy>and then the down would be delete the column.

00:17:51.250 --> 00:17:54.560
<v Michael Kennedy>And there's this set of revisions that pile up for these projects.

00:17:55.080 --> 00:18:01.040
<v Michael Kennedy>The problem is each revision says the one that came before me was some hash or something

00:18:01.140 --> 00:18:01.620
<v Michael Kennedy>or another, right?

00:18:02.000 --> 00:18:09.100
<v Michael Kennedy>And if two people create a PR off of the same base and that PR needs a migration in it,

00:18:09.260 --> 00:18:13.520
<v Michael Kennedy>they both point back to the same one, but they really need to be done one and then the other,

00:18:14.320 --> 00:18:14.420
<v Michael Kennedy>right?

00:18:14.520 --> 00:18:20.380
<v Michael Kennedy>Like you need a linear chain of migrations, not some kind of complex hierarchy of migrations.

00:18:20.800 --> 00:18:23.080
<v Michael Kennedy>And so that is a problem, right?

00:18:23.220 --> 00:18:27.960
<v Michael Kennedy>And they saw that, Julian and all of them saw that a lot with their merging tools, right?

00:18:28.420 --> 00:18:33.660
<v Michael Kennedy>So this project here called Alembic Git Revisions.

00:18:33.880 --> 00:18:47.180
<v Michael Kennedy>So instead of using a, when you run an Alembic migrate or whatever, instead of having to just capture the back version, what it uses is Git history to figure out the orders of when those actual migrations landed in the migration series.

00:18:47.420 --> 00:18:51.520
<v Michael Kennedy>And say, well, they look like they pointed the same one, but this one came in this time.

00:18:51.660 --> 00:18:53.200
<v Michael Kennedy>And then the next one came in after that.

00:18:53.420 --> 00:18:55.940
<v Calvin Hendryx-Parker>So is the blockchain craze officially over

00:18:55.980 --> 00:18:57.540
<v Calvin Hendryx-Parker>that they didn't use blockchain to solve this?

00:18:58.000 --> 00:18:58.320
<v Calvin Hendryx-Parker>Exactly.

00:18:58.760 --> 00:19:00.560
<v Michael Kennedy>I think we should use BitTorrent and blockchain

00:19:00.940 --> 00:19:01.960
<v Michael Kennedy>and all these things.

00:19:03.260 --> 00:19:04.800
<v Michael Kennedy>So yeah, I think this is a pretty neat one.

00:19:04.800 --> 00:19:05.640
<v Michael Kennedy>So I just want to give it a shout out.

00:19:05.740 --> 00:19:06.760
<v Michael Kennedy>So if you use...

00:19:06.780 --> 00:19:07.160
<v Michael Kennedy>That's smart.

00:19:07.680 --> 00:19:08.160
<v Calvin Hendryx-Parker>That's totally smart.

00:19:08.680 --> 00:19:09.800
<v Michael Kennedy>Why would we not do this?

00:19:10.120 --> 00:19:10.360
<v Michael Kennedy>I know.

00:19:10.480 --> 00:19:11.040
<v Michael Kennedy>This is quite new.

00:19:11.600 --> 00:19:14.400
<v Michael Kennedy>You can see it's been updated seven hours ago.

00:19:14.800 --> 00:19:15.600
<v Michael Kennedy>It's about a month old.

00:19:15.840 --> 00:19:18.520
<v Michael Kennedy>I know four months old when the repo was created.

00:19:18.800 --> 00:19:21.920
<v Michael Kennedy>I think probably it was released just very, very recently, right?

00:19:22.160 --> 00:19:22.880
<v Michael Kennedy>So check it out.

00:19:22.960 --> 00:19:27.020
<v Michael Kennedy>If this sounds like it's a problem that you have, here's a really nice fix for it.

00:19:27.160 --> 00:19:27.360
<v Calvin Hendryx-Parker>Yeah.

00:19:27.560 --> 00:19:31.600
<v Calvin Hendryx-Parker>I mean, just putting in place these good guardrails makes sense across our project.

00:19:31.820 --> 00:19:34.400
<v Calvin Hendryx-Parker>So this almost should become the default behavior.

00:19:34.780 --> 00:19:34.940
<v Michael Kennedy>Yeah.

00:19:35.220 --> 00:19:37.260
<v Michael Kennedy>I mean, think of when, how old is SQLAlchemy?

00:19:37.380 --> 00:19:38.160
<v Michael Kennedy>It's pretty old.

00:19:38.280 --> 00:19:38.740
<v Michael Kennedy>It's pretty old.

00:19:39.080 --> 00:19:40.600
<v Michael Kennedy>And I don't mean that in a pejorative way.

00:19:40.740 --> 00:19:41.180
<v Michael Kennedy>I'm just thinking.

00:19:41.340 --> 00:19:41.620
<v Calvin Hendryx-Parker>No, no, no.

00:19:42.080 --> 00:19:42.800
<v Calvin Hendryx-Parker>It's mature.

00:19:43.220 --> 00:19:43.960
<v Calvin Hendryx-Parker>It's very mature.

00:19:44.520 --> 00:19:45.780
<v Michael Kennedy>It's like saying, well, Jago's old.

00:19:45.880 --> 00:19:48.900
<v Michael Kennedy>Like, Jacob's been around for a long time and is doing awesome stuff.

00:19:49.280 --> 00:19:55.260
<v Michael Kennedy>But the reason I bring that up is it's just Alembic was created in a time before all these crazy PRs.

00:19:55.260 --> 00:19:57.700
<v Michael Kennedy>And think of all the AI PRs going on now as well.

00:19:57.740 --> 00:19:58.700
<v Michael Kennedy>It's got to be worse, you know?

00:19:58.950 --> 00:19:59.040
<v Michael Kennedy>Yeah.

00:19:59.520 --> 00:20:00.120
<v Michael Kennedy>Time for that stuff.

00:20:00.170 --> 00:20:00.400
<v Michael Kennedy>All right.

00:20:00.470 --> 00:20:04.600
<v Michael Kennedy>So if you Alembic, check out Alembic Get Revisions from Julian and the team.

00:20:04.800 --> 00:20:05.020
<v Michael Kennedy>Smart.

00:20:05.290 --> 00:20:05.560
<v Michael Kennedy>Very smart.

00:20:06.180 --> 00:20:06.480
<v Michael Kennedy>Yeah, yeah.

00:20:06.600 --> 00:20:08.980
<v Michael Kennedy>So I think that's it for all of our topics, right?

00:20:09.460 --> 00:20:10.020
<v Michael Kennedy>Yeah, yeah.

00:20:10.400 --> 00:20:12.720
<v Calvin Hendryx-Parker>I did want to add in a little bit of extra here.

00:20:12.940 --> 00:20:17.880
<v Calvin Hendryx-Parker>If you've not checked it out, Library Skills is by Sebastian from the FastAPI project.

00:20:18.700 --> 00:20:23.900
<v Calvin Hendryx-Parker>FastAPI has a great skill included with the library.

00:20:24.020 --> 00:20:29.680
<v Calvin Hendryx-Parker>So if you're using agentic tools to build on top of FastAPI, your tools will now know

00:20:29.920 --> 00:20:35.240
<v Calvin Hendryx-Parker>more about the preferred best practices in that framework because those skills exist in

00:20:35.240 --> 00:20:35.940
<v Calvin Hendryx-Parker>the agents folder.

00:20:36.320 --> 00:20:40.380
<v Calvin Hendryx-Parker>This Library Skills project is a standard and allows you to build out skills for any

00:20:40.560 --> 00:20:41.800
<v Calvin Hendryx-Parker>library you may be using.

00:20:42.440 --> 00:20:47.220
<v Calvin Hendryx-Parker>if you've been using agentic AI Claude Code or others to build your software projects,

00:20:47.710 --> 00:20:50.840
<v Calvin Hendryx-Parker>sometimes they grab old dependencies because that was the popular thing at the time.

00:20:50.930 --> 00:20:55.400
<v Calvin Hendryx-Parker>They go based on what was kind of popular on the internet versus what's the best practice now.

00:20:55.630 --> 00:20:58.260
<v Calvin Hendryx-Parker>And so this helps guide your agents to those best practices.

00:20:58.520 --> 00:20:59.140
<v Calvin Hendryx-Parker>So it's a cool project.

00:20:59.720 --> 00:21:02.300
<v Calvin Hendryx-Parker>It's very, very new and also has a lot.

00:21:02.600 --> 00:21:03.940
<v Calvin Hendryx-Parker>He's already almost a 600 stars.

00:21:04.030 --> 00:21:08.900
<v Calvin Hendryx-Parker>So maybe after this episode, he'll get to pass 600 stars on the library skills repository.

00:21:09.360 --> 00:21:09.560
<v Calvin Hendryx-Parker>Wow.

00:21:09.560 --> 00:21:10.020
<v Calvin Hendryx-Parker>That's pretty cool.

00:21:10.320 --> 00:21:11.120
<v Michael Kennedy>This is super cool.

00:21:11.980 --> 00:21:13.740
<v Michael Kennedy>Well done, FastAPI team.

00:21:14.000 --> 00:21:15.700
<v Calvin Hendryx-Parker>Yeah, I mean, they don't stop.

00:21:16.580 --> 00:21:17.380
<v Calvin Hendryx-Parker>It's pretty cool.

00:21:17.720 --> 00:21:18.340
<v Calvin Hendryx-Parker>So there you go.

00:21:18.860 --> 00:21:19.580
<v Michael Kennedy>Yeah, it's really cool.

00:21:19.600 --> 00:21:20.900
<v Michael Kennedy>And I think this is a brilliant idea.

00:21:21.460 --> 00:21:26.380
<v Michael Kennedy>I actually been working on doing that just for myself

00:21:27.080 --> 00:21:28.680
<v Michael Kennedy>because this is absolutely a problem.

00:21:28.860 --> 00:21:31.480
<v Michael Kennedy>So I'm like, all right, I work on Court and Flask

00:21:31.520 --> 00:21:34.240
<v Michael Kennedy>and I'm working on Pyramid and I use DiscCache.

00:21:34.240 --> 00:21:36.120
<v Michael Kennedy>And some of these are popular, like FastAPI,

00:21:36.260 --> 00:21:38.360
<v Michael Kennedy>but others, not very popular at all.

00:21:38.420 --> 00:21:50.640
<v Michael Kennedy>So I've actually been, every project that I adopt that I think is going to be important for something like Claude is I'll go through and I'll generate this kind of document that says, here's all the stuff you need.

00:21:50.650 --> 00:21:59.280
<v Michael Kennedy>And the way that I get it is I will git cloned the documentation, the latest documentation from the project and the source code until you generate this from the documentation.

00:21:59.700 --> 00:22:03.860
<v Michael Kennedy>Everything you see in the documentation, you need to verify with the active source code of the project, right?

00:22:04.300 --> 00:22:06.040
<v Michael Kennedy>But that's just Michael randomly working on it.

00:22:06.040 --> 00:22:06.500
<v Michael Kennedy>It is on GitHub.

00:22:06.590 --> 00:22:07.100
<v Michael Kennedy>You can check it out.

00:22:07.340 --> 00:22:11.720
<v Michael Kennedy>But it's cool that they've set up this more standard way, right?

00:22:12.140 --> 00:22:14.580
<v Michael Kennedy>That it's just not just everybody trying to solve it for themselves.

00:22:15.020 --> 00:22:15.240
<v Calvin Hendryx-Parker>Yeah.

00:22:15.480 --> 00:22:16.760
<v Calvin Hendryx-Parker>And it makes sense.

00:22:17.160 --> 00:22:22.520
<v Calvin Hendryx-Parker>You want to have good, authoritative information on the versions of the things you're currently working on in your project.

00:22:22.580 --> 00:22:28.440
<v Calvin Hendryx-Parker>Because you may have a version behind, and the AI may tell you a new thing that doesn't exist in your version, and you can't upgrade yet.

00:22:28.460 --> 00:22:34.880
<v Calvin Hendryx-Parker>So again, it helps line up all the pieces and give you the best chance of building great software with these AI agents.

00:22:35.240 --> 00:22:36.200
<v Michael Kennedy>I'm going to avoid a rant.

00:22:37.060 --> 00:22:42.800
<v Michael Kennedy>But I definitely think that people who are not having great AI experiences need to think

00:22:42.910 --> 00:22:47.440
<v Michael Kennedy>of bringing some of these ideas in there and all of a sudden hallucinations just go away.

00:22:47.460 --> 00:22:47.700
<v Michael Kennedy>Go away.

00:22:47.740 --> 00:22:49.100
<v Michael Kennedy>Yeah, it's incredible.

00:22:49.340 --> 00:22:49.900
<v Calvin Hendryx-Parker>It's been told.

00:22:50.340 --> 00:22:50.460
<v Michael Kennedy>Yeah.

00:22:50.800 --> 00:22:50.980
<v Michael Kennedy>Yeah.

00:22:51.880 --> 00:22:54.900
<v Michael Kennedy>Mike asks, how does Django handle migration and serialization conflicts?

00:22:55.090 --> 00:22:55.540
<v Michael Kennedy>I don't know.

00:22:55.550 --> 00:22:56.100
<v Calvin Hendryx-Parker>Do you have any idea?

00:22:56.250 --> 00:22:57.940
<v Calvin Hendryx-Parker>I don't know either off the top of my head.

00:22:58.420 --> 00:22:59.740
<v Calvin Hendryx-Parker>I have not run into it much.

00:23:00.620 --> 00:23:02.300
<v Calvin Hendryx-Parker>I'd have to ask someone on my team if they had.

00:23:02.400 --> 00:23:02.580
<v Michael Kennedy>Yeah.

00:23:02.810 --> 00:23:02.900
<v Michael Kennedy>Yeah.

00:23:03.540 --> 00:23:04.420
<v Michael Kennedy>It's probably pretty similar.

00:23:04.720 --> 00:23:05.500
<v Calvin Hendryx-Parker>My guess is, yeah.

00:23:05.760 --> 00:23:06.300
<v Calvin Hendryx-Parker>So is that all?

00:23:06.520 --> 00:23:07.240
<v Michael Kennedy>It's pretty mature.

00:23:07.680 --> 00:23:08.260
<v Calvin Hendryx-Parker>I have one more extra.

00:23:08.700 --> 00:23:09.540
<v Calvin Hendryx-Parker>Yeah, yeah, let's do it.

00:23:09.820 --> 00:23:11.420
<v Calvin Hendryx-Parker>So this one's a bit old school.

00:23:11.900 --> 00:23:16.720
<v Calvin Hendryx-Parker>If you are a developer and you've ever used the GNU make command,

00:23:17.220 --> 00:23:21.460
<v Calvin Hendryx-Parker>did you know that it has pattern matching on the targets?

00:23:21.980 --> 00:23:26.840
<v Calvin Hendryx-Parker>So you can say train-percent colon and then have a command that runs

00:23:27.040 --> 00:23:31.560
<v Calvin Hendryx-Parker>and it will place into your command like whatever you put in that percent word.

00:23:31.620 --> 00:23:33.920
<v Calvin Hendryx-Parker>So if you said train new model and then the command,

00:23:33.960 --> 00:23:35.600
<v Calvin Hendryx-Parker>it would be like train.py.

00:23:35.820 --> 00:23:39.200
<v Calvin Hendryx-Parker>And then you put a placeholder and it would put new model right there into it for you.

00:23:39.480 --> 00:23:40.880
<v Calvin Hendryx-Parker>That has been there since 1994.

00:23:41.840 --> 00:23:45.000
<v Calvin Hendryx-Parker>Now, there are fancy new tools like Just and Task out there.

00:23:45.340 --> 00:23:46.020
<v Calvin Hendryx-Parker>They don't do this.

00:23:46.620 --> 00:23:51.000
<v Calvin Hendryx-Parker>This is actually, I think, a power move that I only heard about this week.

00:23:51.720 --> 00:23:52.620
<v Calvin Hendryx-Parker>So check it out.

00:23:52.940 --> 00:23:56.640
<v Calvin Hendryx-Parker>Make still very powerful and still very relevant in this day and age for doing task running.

00:23:57.100 --> 00:24:02.180
<v Calvin Hendryx-Parker>We do use Just and Task, but those projects should add this pattern matching to the target.

00:24:02.560 --> 00:24:03.200
<v Calvin Hendryx-Parker>That's really cool.

00:24:03.460 --> 00:24:04.120
<v Michael Kennedy>Yeah, how interesting.

00:24:04.940 --> 00:24:09.240
<v Michael Kennedy>There's just a never-ending source of learning in all these things, right?

00:24:09.380 --> 00:24:10.280
<v Michael Kennedy>You're like, oh, yeah, I'll figure this out.

00:24:10.380 --> 00:24:10.960
<v Michael Kennedy>No, maybe not.

00:24:12.140 --> 00:24:13.220
<v Calvin Hendryx-Parker>And one more thing I want to mention,

00:24:13.280 --> 00:24:14.600
<v Calvin Hendryx-Parker>because we didn't get to mention at the very beginning,

00:24:15.560 --> 00:24:18.220
<v Calvin Hendryx-Parker>or something I want to pitch for everyone to come out and hang out with me.

00:24:18.620 --> 00:24:21.560
<v Calvin Hendryx-Parker>I am going to be doing a LinkedIn Live with Whit Morris from the 6.15,

00:24:22.020 --> 00:24:25.880
<v Calvin Hendryx-Parker>June 17th at 3.30 on, oh, right, it's not a code review.

00:24:26.480 --> 00:24:28.400
<v Calvin Hendryx-Parker>I say, oh, you're right, it's not a code review.

00:24:28.860 --> 00:24:31.020
<v Calvin Hendryx-Parker>What AI proves what it checked.

00:24:31.460 --> 00:24:33.220
<v Calvin Hendryx-Parker>So basically calling the AI out.

00:24:33.440 --> 00:24:35.100
<v Calvin Hendryx-Parker>We'll be doing that on the 17th.

00:24:35.240 --> 00:24:36.780
<v Calvin Hendryx-Parker>So come hang out with me that day.

00:24:36.990 --> 00:24:37.480
<v Calvin Hendryx-Parker>I mean, wit.

00:24:37.700 --> 00:24:38.800
<v Michael Kennedy>You're absolutely right.

00:24:38.950 --> 00:24:40.220
<v Michael Kennedy>That is not what it was supposed to do.

00:24:40.310 --> 00:24:40.420
<v Michael Kennedy>Exactly.

00:24:40.580 --> 00:24:41.080
<v Michael Kennedy>Let me try again.

00:24:41.460 --> 00:24:42.660
<v Calvin Hendryx-Parker>Yeah, that's exactly it.

00:24:43.180 --> 00:24:43.640
<v Michael Kennedy>All right.

00:24:43.640 --> 00:24:45.040
<v Michael Kennedy>I got a couple of extras for us to jump on.

00:24:45.290 --> 00:24:55.320
<v Michael Kennedy>So I had recently, I had both Michael Chow and Rich Ione on Talk Python to talk about great docs.

00:24:55.410 --> 00:24:56.200
<v Michael Kennedy>Are you familiar with this?

00:24:56.320 --> 00:24:57.380
<v Michael Kennedy>I'm not familiar with great docs.

00:24:57.560 --> 00:25:01.220
<v Michael Kennedy>It's a document generator plus static site generator.

00:25:01.680 --> 00:25:06.100
<v Michael Kennedy>That's super mature because it's based on Quarto, which itself is pretty mature, right?

00:25:06.580 --> 00:25:13.380
<v Michael Kennedy>So I did my first project documentation on top of this, and I think it is really neat.

00:25:13.700 --> 00:25:19.580
<v Michael Kennedy>So this is just, I'm showing you the great docs documentation, but I haven't published mine yet.

00:25:19.740 --> 00:25:23.000
<v Michael Kennedy>I've got Nginx settings to set first, and then they'll be up.

00:25:23.700 --> 00:25:30.619
<v Michael Kennedy>But this is really cool because the reason I wanted to highlight this is you're talking about the library stuff

00:25:30.640 --> 00:25:34.240
<v Michael Kennedy>and how libraries can basically set up skills

00:25:35.140 --> 00:25:37.360
<v Michael Kennedy>that AIs can use to work with that library, right?

00:25:37.620 --> 00:25:37.720
<v Calvin Hendryx-Parker>Yeah.

00:25:38.040 --> 00:25:39.800
<v Michael Kennedy>Well, one of the things that's really cool about Great Docs

00:25:39.800 --> 00:25:42.920
<v Michael Kennedy>is it automatically generates skills for your library.

00:25:43.340 --> 00:25:43.920
<v Calvin Hendryx-Parker>Very relevant.

00:25:44.180 --> 00:25:46.520
<v Michael Kennedy>And you can even write extra ones.

00:25:46.550 --> 00:25:50.580
<v Michael Kennedy>And then you can just say install through like NPX skills from wherever

00:25:51.200 --> 00:25:55.800
<v Michael Kennedy>or run their CLI to install it for like Clot or Codex or whatever,

00:25:56.340 --> 00:25:57.080
<v Michael Kennedy>which is already neat.

00:25:57.400 --> 00:26:05.580
<v Michael Kennedy>It also generates an LLMs and an LLMs.txt, but also a full one that has all the API documentation in there.

00:26:05.890 --> 00:26:15.480
<v Michael Kennedy>And when you go to one of your references or whatever, you pull it up, you can go and view every bit of documentation as a markdown file that you can get.

00:26:16.140 --> 00:26:23.180
<v Michael Kennedy>And so I'm thinking that this is going to become a pretty popular way to document projects because it's without doing anything at all.

00:26:23.320 --> 00:26:26.860
<v Michael Kennedy>It's very sort of AI coding complete, I think you would say.

00:26:27.020 --> 00:26:27.540
<v Michael Kennedy>What do you think of that?

00:26:27.760 --> 00:26:28.380
<v Calvin Hendryx-Parker>I love it.

00:26:28.480 --> 00:26:33.720
<v Calvin Hendryx-Parker>I mean, the more context we can provide to these agents and tooling, the better off we are.

00:26:34.100 --> 00:26:36.000
<v Calvin Hendryx-Parker>And actually, the nicer it is for humans, too.

00:26:36.300 --> 00:26:38.540
<v Calvin Hendryx-Parker>I love Markdown, like reading Markdown so much.

00:26:38.640 --> 00:26:41.620
<v Calvin Hendryx-Parker>I find it to be very easy, and I can then format it how I want.

00:26:42.020 --> 00:26:43.800
<v Calvin Hendryx-Parker>So it's kind of a twofer there.

00:26:44.120 --> 00:26:45.000
<v Michael Kennedy>Yeah, 100%.

00:26:45.140 --> 00:26:45.220
<v Michael Kennedy>Yeah.

00:26:45.520 --> 00:26:45.680
<v Michael Kennedy>All right.

00:26:46.020 --> 00:26:47.840
<v Michael Kennedy>So you mentioned HTTPX2.

00:26:48.300 --> 00:26:50.220
<v Michael Kennedy>We talked about it previously on the show as well.

00:26:50.799 --> 00:26:55.020
<v Michael Kennedy>And I looked at the Talk Python Courses site.

00:26:55.140 --> 00:26:57.340
<v Michael Kennedy>And I thought, man, could I switch to HTTPX2?

00:26:57.620 --> 00:27:00.200
<v Michael Kennedy>Like technically, yes, but what is the value of it?

00:27:00.480 --> 00:27:04.980
<v Michael Kennedy>So I looked at my requirements file and I saw, well, there's five projects using HTTPX.

00:27:05.340 --> 00:27:09.160
<v Michael Kennedy>So if I just switch mine to HTTPX2, like still I'm primarily using just HTTPX.

00:27:09.220 --> 00:27:16.140
<v Michael Kennedy>So like if the libraries themselves don't swap over, no matter how much you don't, you want to use a different library, you're still using that one, right?

00:27:16.260 --> 00:27:17.600
<v Michael Kennedy>Because you want to use those libraries.

00:27:17.940 --> 00:27:19.840
<v Michael Kennedy>So I went through as well, let's walk the walk.

00:27:19.860 --> 00:27:26.300
<v Michael Kennedy>So I went through my ListMonk one, my Umami one, a memberful one, and they all now are using HPX2.

00:27:26.680 --> 00:27:29.800
<v Michael Kennedy>So if anybody uses those and they want to use HPX2.

00:27:29.880 --> 00:27:30.740
<v Calvin Hendryx-Parker>You'll now get HPX2.

00:27:31.180 --> 00:27:31.500
<v Michael Kennedy>Absolutely.

00:27:31.920 --> 00:27:32.000
<v Michael Kennedy>Absolutely.

00:27:32.600 --> 00:27:32.960
<v Michael Kennedy>Very nice.

00:27:33.140 --> 00:27:36.120
<v Michael Kennedy>Well, how about we close this episode out with a joke?

00:27:36.520 --> 00:27:36.720
<v Calvin Hendryx-Parker>All right.

00:27:36.980 --> 00:27:37.640
<v Calvin Hendryx-Parker>What do you got for me, Michael?

00:27:37.980 --> 00:27:39.560
<v Michael Kennedy>So I've named this one accurate.

00:27:40.120 --> 00:27:44.220
<v Michael Kennedy>Tell me what you think about these different classifications of types of like problem solving.

00:27:44.580 --> 00:27:46.380
<v Michael Kennedy>You know, maybe this is a CS sort of conversation.

00:27:46.780 --> 00:27:47.700
<v Michael Kennedy>You know, we've got algorithms.

00:27:47.960 --> 00:27:50.460
<v Michael Kennedy>This is when programmers don't want to explain what they did.

00:27:51.660 --> 00:27:53.280
<v Calvin Hendryx-Parker>You'll get me every time with these kind of jokes.

00:27:54.860 --> 00:27:57.280
<v Michael Kennedy>We have a heuristic, which is very interesting.

00:27:57.580 --> 00:28:00.680
<v Michael Kennedy>Less common and less provable, but often very interesting.

00:28:01.040 --> 00:28:03.920
<v Michael Kennedy>The heuristic is when programmers can't explain what they did.

00:28:04.700 --> 00:28:07.760
<v Michael Kennedy>And then machine learning, when programmers don't know what they did.

00:28:08.480 --> 00:28:09.200
<v Calvin Hendryx-Parker>Very black box.

00:28:10.000 --> 00:28:10.280
<v Michael Kennedy>Exactly.

00:28:10.600 --> 00:28:13.400
<v Michael Kennedy>And it won't do it again, but maybe it'll do something else also interesting.

00:28:15.380 --> 00:28:16.040
<v Calvin Hendryx-Parker>I appreciate that.

00:28:16.260 --> 00:28:16.980
<v Michael Kennedy>Yeah, absolutely.

00:28:17.220 --> 00:28:19.420
<v Michael Kennedy>And I just also, Marco out of the audience just says,

00:28:20.020 --> 00:28:21.920
<v Michael Kennedy>much appreciation for Posit's open source contributions.

00:28:22.220 --> 00:28:25.060
<v Michael Kennedy>Yeah, so great docs is from the folks from Posit,

00:28:25.770 --> 00:28:27.140
<v Michael Kennedy>the Shining, or Studio,

00:28:27.370 --> 00:28:29.220
<v Michael Kennedy>but they're also doing like Shiny for Python,

00:28:29.660 --> 00:28:31.200
<v Michael Kennedy>lots of Python stuff these days.

00:28:31.510 --> 00:28:31.620
<v Michael Kennedy>Yeah.

00:28:31.820 --> 00:28:32.240
<v Calvin Hendryx-Parker>Very nice.

00:28:32.760 --> 00:28:34.700
<v Michael Kennedy>All right, well, that is a wrap, Calvin.

00:28:35.060 --> 00:28:35.660
<v Michael Kennedy>That was fun.

00:28:36.000 --> 00:28:36.560
<v Michael Kennedy>Thank you for being here.

00:28:36.930 --> 00:28:37.440
<v Michael Kennedy>Awesome show with you.

00:28:37.680 --> 00:28:38.240
<v Michael Kennedy>We'll do it again.

00:28:38.520 --> 00:28:38.840
<v Michael Kennedy>We will.

00:28:39.140 --> 00:28:39.400
<v Michael Kennedy>Thanks, Michael.

00:28:39.760 --> 00:28:40.340
<v Michael Kennedy>Yep, bye, everyone.

