WEBVTT

00:00:00.020 --> 00:00:04.780
<v Brian Okken>Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:05.180 --> 00:00:10.100
<v Brian Okken>This is episode 469, recorded Monday, February 9th, 2026.

00:00:10.760 --> 00:00:11.820
<v Brian Okken>And I am Brian Okken.

00:00:12.040 --> 00:00:12.880
<v Brian Okken>And I am Michael Kennedy.

00:00:13.300 --> 00:00:18.360
<v Brian Okken>As usual, as frequently lately, this episode is brought to you by us.

00:00:18.960 --> 00:00:27.420
<v Brian Okken>So thank you for supporting us through contributing through Patreon or grabbing a course or book or whatever you want.

00:00:27.580 --> 00:00:31.340
<v Brian Okken>But, you know, chipping in a few bucks helps keep the show going.

00:00:32.400 --> 00:00:33.000
<v Brian Okken>Connect with us.

00:00:33.200 --> 00:00:34.920
<v Brian Okken>Send us news if you hear something exciting.

00:00:36.000 --> 00:00:39.200
<v Brian Okken>Even if you think we've heard it, we may not have or we may have forgotten.

00:00:39.520 --> 00:00:41.020
<v Brian Okken>So send it on over.

00:00:41.380 --> 00:00:45.340
<v Brian Okken>Connect with us through Mastodon or Bluesky.

00:00:45.820 --> 00:00:48.360
<v Brian Okken>Links are in the show notes or email.

00:00:49.080 --> 00:00:52.320
<v Brian Okken>You can also, yeah, there's a contact form on the site too.

00:00:52.820 --> 00:00:57.540
<v Brian Okken>You can join us live if you'd like to see us on YouTube or live.

00:00:57.940 --> 00:01:01.240
<v Brian Okken>Go to pythonbytes.fm/live and be part of the audience.

00:01:01.620 --> 00:01:05.780
<v Brian Okken>And you can listen to us, heckle us, send in questions, comments.

00:01:06.160 --> 00:01:09.120
<v Brian Okken>And sometimes we read those during the show, and that's fun.

00:01:09.340 --> 00:01:13.200
<v Brian Okken>And then also, you don't need to take notes because we'll send it to your inbox.

00:01:13.600 --> 00:01:16.600
<v Brian Okken>Just go over to the pythonbytes.fm.

00:01:16.820 --> 00:01:17.960
<v Brian Okken>You can sign up to the newsletter.

00:01:19.120 --> 00:01:26.360
<v Brian Okken>And we will send you links to everything we covered, plus a little background information, and send that to your email once a week.

00:01:26.820 --> 00:01:27.280
<v Brian Okken>Yeah, that's great.

00:01:28.300 --> 00:01:30.800
<v Brian Okken>Well, I am excited about this first topic, Michael.

00:01:31.180 --> 00:01:32.240
<v Brian Okken>So let's kick it off.

00:01:32.460 --> 00:01:32.900
<v Michael Kennedy>Thanks, Brian.

00:01:33.240 --> 00:01:36.620
<v Michael Kennedy>So this one is a homegrown topic.

00:01:37.180 --> 00:01:38.660
<v Michael Kennedy>So I've created a new app.

00:01:38.680 --> 00:01:45.540
<v Michael Kennedy>And I got to tell you, this is one of the very first proper desktop applications I have shipped in a long time.

00:01:45.620 --> 00:01:48.920
<v Michael Kennedy>Like when was the last time that you shipped a desktop app?

00:01:49.040 --> 00:01:50.460
<v Michael Kennedy>Like I tell you, it's been years for me.

00:01:50.800 --> 00:01:52.160
<v Michael Kennedy>I don't think I ever have.

00:01:52.480 --> 00:01:52.680
<v Michael Kennedy>Yeah.

00:01:53.110 --> 00:01:56.980
<v Michael Kennedy>Well, I used to do a lot of Windows development and build legit desktop apps.

00:01:57.030 --> 00:01:59.340
<v Michael Kennedy>I worked at this scientific visualization company.

00:01:59.500 --> 00:02:02.700
<v Michael Kennedy>We'd build like things to do, data processing and visualization.

00:02:03.110 --> 00:02:05.060
<v Michael Kennedy>And this predates the web being real powerful for that.

00:02:06.020 --> 00:02:08.080
<v Brian Okken>Oh, I guess I did way back when.

00:02:08.460 --> 00:02:08.580
<v Michael Kennedy>Systems.

00:02:09.200 --> 00:02:09.560
<v Michael Kennedy>Exactly.

00:02:10.050 --> 00:02:11.120
<v Michael Kennedy>I mean, that used to be the way.

00:02:11.440 --> 00:02:18.420
<v Michael Kennedy>And so I've been working building a ton of web apps, which is what drove me to build a desktop app, which is strange.

00:02:18.820 --> 00:02:19.660
<v Michael Kennedy>But here's the deal.

00:02:19.740 --> 00:02:21.900
<v Michael Kennedy>I built this thing called Command Book.

00:02:22.400 --> 00:02:29.280
<v Michael Kennedy>And the idea is, as developers, we have a lot of long-running processes that we keep in the terminal.

00:02:29.640 --> 00:02:31.300
<v Michael Kennedy>I want to tail this log.

00:02:31.640 --> 00:02:34.040
<v Michael Kennedy>I want to turn on some monitoring software.

00:02:34.230 --> 00:02:36.520
<v Michael Kennedy>I want to run this web app.

00:02:36.860 --> 00:02:39.520
<v Michael Kennedy>Oh, yeah, but the web app also has this background daemon thing.

00:02:39.550 --> 00:02:40.580
<v Michael Kennedy>So I got to run that.

00:02:40.760 --> 00:02:44.080
<v Michael Kennedy>And I want to run the database that powers that, those two things.

00:02:44.510 --> 00:02:49.580
<v Michael Kennedy>So then you end up with like four terminal tabs, all that just say Python, Python, Python,

00:02:49.860 --> 00:02:49.980
<v Michael Kennedy>Docker.

00:02:50.350 --> 00:02:50.860
<v Michael Kennedy>And you're like, huh?

00:02:51.260 --> 00:02:53.140
<v Michael Kennedy>Well, I need to go see the output of one of those.

00:02:53.500 --> 00:02:54.520
<v Michael Kennedy>Which one do I go to?

00:02:54.680 --> 00:02:55.900
<v Michael Kennedy>Like, maybe it's this Python.

00:02:56.030 --> 00:02:57.320
<v Michael Kennedy>No, it was no, no, that Python, right?

00:02:57.680 --> 00:02:58.220
<v Michael Kennedy>Oh, guess what?

00:02:58.470 --> 00:03:03.760
<v Michael Kennedy>I set him to auto reload so that as I'm working on the code or Claude code is working on the

00:03:03.900 --> 00:03:08.740
<v Michael Kennedy>code, I don't have to keep closing the web app, opening it back up, then refreshing it.

00:03:08.940 --> 00:03:12.500
<v Michael Kennedy>I can just set it up to auto, you know, like --reload or set it in dev

00:03:12.620 --> 00:03:14.280
<v Michael Kennedy>mode with reload true, that kind of thing.

00:03:14.560 --> 00:03:15.240
<v Michael Kennedy>That works great.

00:03:15.530 --> 00:03:20.360
<v Michael Kennedy>Except for if the timing lines up such that your app detects the change, but the

00:03:20.540 --> 00:03:24.360
<v Michael Kennedy>code is in an invalid state, like you're typing def function, open parentheses,

00:03:24.640 --> 00:03:25.620
<v Michael Kennedy>but you haven't closed it yet.

00:03:25.980 --> 00:03:26.180
<v Michael Kennedy>Boom.

00:03:26.280 --> 00:03:26.940
<v Michael Kennedy>It tries to reload.

00:03:27.010 --> 00:03:30.520
<v Michael Kennedy>It goes, cannot parse code shuts down and won't reload ever again.

00:03:30.620 --> 00:03:32.780
<v Michael Kennedy>You're like, ah, now I gotta go find it amongst those tabs again.

00:03:32.940 --> 00:03:33.020
<v Michael Kennedy>Right?

00:03:33.100 --> 00:03:35.200
<v Michael Kennedy>So that's the kind of the thing I'm like, can we just do better?

00:03:35.260 --> 00:03:39.720
<v Michael Kennedy>Like do these long running commands, should they really be four or five terminal tabs?

00:03:40.240 --> 00:03:40.320
<v Michael Kennedy>No.

00:03:40.580 --> 00:03:42.200
<v Michael Kennedy>So I created this thing called command book.

00:03:42.380 --> 00:03:46.020
<v Michael Kennedy>And the idea is that you take those long running commands and you put them into an

00:03:46.220 --> 00:03:51.500
<v Michael Kennedy>app, a native app that runs them with just the same output, but a bunch of bonuses.

00:03:52.060 --> 00:03:55.920
<v Michael Kennedy>And then you keep your terminal for actually, I want to do commands that

00:03:55.920 --> 00:03:56.660
<v Michael Kennedy>are more short lived.

00:03:56.780 --> 00:03:56.840
<v Michael Kennedy>Right.

00:03:57.270 --> 00:04:01.660
<v Michael Kennedy>And also let's, let's you jump around really quick from like, I want to quickly

00:04:01.880 --> 00:04:02.840
<v Michael Kennedy>see what this log looks like.

00:04:02.880 --> 00:04:05.440
<v Michael Kennedy>oh, I also, I need to turn on this database thing real quick.

00:04:05.490 --> 00:04:07.460
<v Michael Kennedy>Do him hit this, you know, hit this thing to run it.

00:04:08.280 --> 00:04:10.900
<v Michael Kennedy>And so here I even have a little example.

00:04:11.290 --> 00:04:12.880
<v Michael Kennedy>I could even run the Python bytes thing.

00:04:13.040 --> 00:04:17.140
<v Michael Kennedy>So if you check out the video, you can see the app in action,

00:04:17.340 --> 00:04:19.799
<v Michael Kennedy>but a link to the website at commandbookapp.com.

00:04:20.380 --> 00:04:22.300
<v Michael Kennedy>And so it does a bunch of cool things.

00:04:22.370 --> 00:04:25.140
<v Michael Kennedy>So like if I go and edit, it has a command palette.

00:04:25.400 --> 00:04:26.780
<v Michael Kennedy>So if I want to type anything with Hugo,

00:04:26.940 --> 00:04:28.520
<v Michael Kennedy>like I want to publish to the talk Python blog,

00:04:28.630 --> 00:04:30.940
<v Michael Kennedy>I just type Hugo and find that, or I want to publish this one.

00:04:31.040 --> 00:04:34.580
<v Michael Kennedy>I want to just run my personal blog, hit that one, off it goes.

00:04:34.900 --> 00:04:38.320
<v Michael Kennedy>And it doesn't just do that because what else is it doing?

00:04:38.540 --> 00:04:40.120
<v Michael Kennedy>You don't want to have merge conflicts.

00:04:40.300 --> 00:04:41.660
<v Michael Kennedy>So it runs get pull.

00:04:41.980 --> 00:04:43.060
<v Michael Kennedy>You can specify what to do.

00:04:43.080 --> 00:04:44.900
<v Michael Kennedy>It runs get pull before it runs your server.

00:04:45.100 --> 00:04:48.160
<v Michael Kennedy>Every time you say run your server and it makes sure no matter where you are,

00:04:48.260 --> 00:04:50.220
<v Michael Kennedy>you're always in the right directory, that kind of stuff.

00:04:50.220 --> 00:04:53.160
<v Michael Kennedy>And you can like chain them with ampersand ampersand,

00:04:53.260 --> 00:04:55.480
<v Michael Kennedy>which is like a Linux terminal thing.

00:04:55.860 --> 00:04:57.600
<v Michael Kennedy>And it will auto detect those, break them apart,

00:04:57.840 --> 00:05:00.320
<v Michael Kennedy>run them as multiple commands and that kind of stuff.

00:05:00.480 --> 00:05:03.120
<v Michael Kennedy>So yeah, I think this is just super neat.

00:05:03.520 --> 00:05:06.080
<v Michael Kennedy>It detects all the URLs that are shown.

00:05:06.150 --> 00:05:09.200
<v Michael Kennedy>So if you're the thing to start the browser to the right place,

00:05:09.420 --> 00:05:10.880
<v Michael Kennedy>scrolls off the screen, you don't have to scroll.

00:05:11.230 --> 00:05:13.400
<v Michael Kennedy>It shows you uptime, how much memory is being used.

00:05:13.500 --> 00:05:15.440
<v Michael Kennedy>There's a bunch of cool little things that you can do

00:05:15.550 --> 00:05:17.460
<v Michael Kennedy>if you just go like, maybe these long running things

00:05:17.740 --> 00:05:20.080
<v Michael Kennedy>don't need to live in my terminal all the time.

00:05:20.370 --> 00:05:22.600
<v Michael Kennedy>Because you'll have messages like, oh, there's an update for warp.

00:05:22.800 --> 00:05:25.080
<v Michael Kennedy>You're like, yeah, but I don't really want to install it right now

00:05:25.220 --> 00:05:27.440
<v Michael Kennedy>because all this other stuff's been going for a day

00:05:27.470 --> 00:05:28.220
<v Michael Kennedy>and I want to shut it down.

00:05:28.310 --> 00:05:29.780
<v Michael Kennedy>Like, do those need to be the same thing?

00:05:29.920 --> 00:05:31.480
<v Michael Kennedy>So I hope people really like this.

00:05:31.780 --> 00:05:37.100
<v Michael Kennedy>There's a free and a paid version over at commandbookapp.com.

00:05:37.350 --> 00:05:41.500
<v Michael Kennedy>I spent about three full-time weeks working on this thing,

00:05:41.740 --> 00:05:44.220
<v Michael Kennedy>and I'm really proud of how it came out.

00:05:44.230 --> 00:05:46.940
<v Michael Kennedy>I think it has a bunch of cool features that are not obvious,

00:05:47.280 --> 00:05:49.700
<v Michael Kennedy>but as you start to work with them, oh, and that's cool.

00:05:49.980 --> 00:05:52.740
<v Michael Kennedy>And I built it with SwiftUI if people are interested.

00:05:53.220 --> 00:05:54.900
<v Michael Kennedy>The backend is all Python, of course,

00:05:55.240 --> 00:05:58.560
<v Michael Kennedy>but the app itself is SwiftUI 20 megs.

00:05:58.780 --> 00:06:01.860
<v Brian Okken>It's not a huge electron thing and it starts in.

00:06:02.120 --> 00:06:03.960
<v Michael Kennedy>I'm excited about trying this out, Michael.

00:06:04.220 --> 00:06:04.660
<v Brian Okken>This is neat.

00:06:04.710 --> 00:06:11.920
<v Brian Okken>I like the stop all and also like there's so I don't normally have stuff running for like a long time, like days.

00:06:12.360 --> 00:06:25.620
<v Brian Okken>But I do have things that I run regularly in the background, like you said, running a server or something like that, or that I kind of forget all the command, all the prompts that I the command line things that I usually add to it.

00:06:26.320 --> 00:06:31.040
<v Brian Okken>And having them already there, just waiting, and I can go, oh, yeah, run that.

00:06:31.300 --> 00:06:31.620
<v Brian Okken>It's right there.

00:06:31.840 --> 00:06:32.380
<v Brian Okken>I can just run it.

00:06:32.540 --> 00:06:34.200
<v Brian Okken>Yeah, totally awesome.

00:06:34.520 --> 00:06:34.800
<v Michael Kennedy>Thanks, Brian.

00:06:34.980 --> 00:06:38.960
<v Michael Kennedy>I totally agree with that because it's like, oh, I got to change directory to here and

00:06:39.000 --> 00:06:40.200
<v Michael Kennedy>then activate the virtual environment.

00:06:40.280 --> 00:06:41.100
<v Michael Kennedy>And then I run this command.

00:06:41.240 --> 00:06:42.060
<v Michael Kennedy>Oh, I forgot that flag.

00:06:42.220 --> 00:06:43.780
<v Michael Kennedy>And then I got to change directory there.

00:06:43.940 --> 00:06:45.140
<v Michael Kennedy>And it's just like, click, click, click.

00:06:45.240 --> 00:06:47.820
<v Michael Kennedy>Or you can group them and say, just run all of these things for this project.

00:06:48.439 --> 00:06:49.260
<v Michael Kennedy>It's pretty neat.

00:06:49.500 --> 00:06:54.179
<v Michael Kennedy>And my experience building with SwiftUI and publishing, this has to be signed and

00:06:54.200 --> 00:06:57.720
<v Michael Kennedy>notarized by Apple, which made me worry given my last experience.

00:06:58.040 --> 00:06:59.820
<v Michael Kennedy>And I hinted at this last time we talked.

00:07:00.200 --> 00:07:05.480
<v Michael Kennedy>It was a lot better to distribute a desktop app, even though it has to be signed.

00:07:06.500 --> 00:07:09.880
<v Michael Kennedy>You've got to digitally sign it and notarize it with your developer key.

00:07:10.240 --> 00:07:14.020
<v Michael Kennedy>But then you've got to put it into one of those DMG things that you open up and drag

00:07:14.140 --> 00:07:15.680
<v Michael Kennedy>from like over to the app folder.

00:07:15.860 --> 00:07:17.400
<v Michael Kennedy>That's how the Mac stuff installs.

00:07:17.680 --> 00:07:20.100
<v Michael Kennedy>You've got to digitally sign and notarize that.

00:07:20.580 --> 00:07:24.160
<v Michael Kennedy>And I'm like, oh my gosh, where are they going to tell me I've got to add in that

00:07:24.160 --> 00:07:26.980
<v Michael Kennedy>purchasing for this just so they can have more money, you know?

00:07:26.980 --> 00:07:28.960
<v Michael Kennedy>And no, it was way better.

00:07:29.460 --> 00:07:34.260
<v Michael Kennedy>And one final wild sort of it's turtles all the way down thing.

00:07:34.590 --> 00:07:39.260
<v Michael Kennedy>With this app down here, I can run the website for command book app, of course,

00:07:39.520 --> 00:07:42.040
<v Michael Kennedy>but I can also build command book itself.

00:07:42.610 --> 00:07:44.780
<v Michael Kennedy>Like, so the app has a command that builds itself.

00:07:45.180 --> 00:07:49.080
<v Michael Kennedy>And then it has another command that will actually notarize and

00:07:49.340 --> 00:07:53.560
<v Michael Kennedy>sign the app and build the installer and upload it to the server and

00:07:53.580 --> 00:07:57.460
<v Michael Kennedy>set up an auto update sequence that starts kicking off from within the app.

00:07:57.660 --> 00:07:58.260
<v Michael Kennedy>It's super cool.

00:07:58.660 --> 00:08:01.800
<v Michael Kennedy>So yeah, anyway, people check commandbookapp.com out.

00:08:02.520 --> 00:08:02.840
<v Michael Kennedy>It's neat.

00:08:03.340 --> 00:08:04.560
<v Michael Kennedy>For now, it's Swift only.

00:08:04.920 --> 00:08:07.980
<v Michael Kennedy>If I get a bunch of people going, Michael, where's my Windows version?

00:08:08.380 --> 00:08:10.260
<v Michael Kennedy>I will gladly build us a Windows version.

00:08:11.060 --> 00:08:11.460
<v Michael Kennedy>Gladly?

00:08:13.100 --> 00:08:15.620
<v Michael Kennedy>Hey, I'm going to build this baby in Windows Forms.

00:08:15.620 --> 00:08:16.560
<v Michael Kennedy>I'm going back old school.

00:08:16.640 --> 00:08:17.580
<v Michael Kennedy>I love that.

00:08:17.620 --> 00:08:20.620
<v Michael Kennedy>It's like the VB6 style, and I would be happy to do it.

00:08:21.400 --> 00:08:26.600
<v Michael Kennedy>But again, I'd have to figure out how to notarize stuff on Windows, which I think is even harder these days.

00:08:27.100 --> 00:08:28.540
<v Brian Okken>Can I get it in DOS 6.2?

00:08:28.810 --> 00:08:29.260
<v Michael Kennedy>You know what?

00:08:29.500 --> 00:08:31.120
<v Michael Kennedy>We only support Dr. DOS.

00:08:33.280 --> 00:08:36.479
<v Michael Kennedy>No, I think this is a fun app, and hopefully people can check it out.

00:08:36.640 --> 00:08:39.580
<v Michael Kennedy>Maybe I can inspire some people to write some other desktop apps as well.

00:08:40.160 --> 00:08:45.360
<v Michael Kennedy>It's not a terrible idea, even though the web is a really nice option these days.

00:08:45.660 --> 00:08:45.740
<v Brian Okken>Yeah.

00:08:45.980 --> 00:08:46.320
<v Brian Okken>Okay.

00:08:47.000 --> 00:08:47.740
<v Brian Okken>Well, let's see.

00:08:47.790 --> 00:08:48.240
<v Brian Okken>What do I got?

00:08:48.280 --> 00:08:52.200
<v Brian Okken>I wanted to talk about uvx.sh.

00:08:52.570 --> 00:08:55.340
<v Brian Okken>So this came out from Astral.

00:08:55.700 --> 00:08:58.880
<v Brian Okken>Install Python tools with a single command powered by uv.

00:08:59.320 --> 00:09:02.300
<v Brian Okken>Okay, so I didn't quite know what to make of this.

00:09:03.760 --> 00:09:06.600
<v Brian Okken>I know that we use curl sometimes to install.

00:09:07.220 --> 00:09:10.920
<v Brian Okken>If you want toinstall ruff, you can use curl or actually uv.

00:09:11.240 --> 00:09:16.820
<v Brian Okken>If you want to install uv, you use the curl to pull in a sh and install it and stuff.

00:09:16.960 --> 00:09:19.100
<v Brian Okken>But like, why other stuff?

00:09:19.380 --> 00:09:24.960
<v Brian Okken>So I was really glad that Tim Hopper wrote a couple articles about it.

00:09:25.300 --> 00:09:31.680
<v Brian Okken>So Tim Hopper wrote, uvx.sh install Python tools without uv or Python.

00:09:32.200 --> 00:09:35.980
<v Brian Okken>And then also how to install Python CLI tools without Python.

00:09:36.480 --> 00:09:38.580
<v Brian Okken>So Astral's released UVA.

00:09:38.920 --> 00:09:40.040
<v Brian Okken>I'm just going to read right here.

00:09:40.440 --> 00:09:46.620
<v Brian Okken>Astral's released uvx.sh, a service that generates installation scripts for any Python tool on PyPI.

00:09:46.960 --> 00:09:58.740
<v Brian Okken>With a single curl or PowerShell command, users can install tools like rough pytest, a nice example, without having uv or Python already installed in their system.

00:09:59.200 --> 00:10:00.320
<v Brian Okken>Now this sort of makes sense.

00:10:00.480 --> 00:10:07.480
<v Brian Okken>So you've got like something, I don't know, some people that need to write, you want to distribute something and distribution is hard sometimes.

00:10:08.220 --> 00:10:11.760
<v Brian Okken>And you maybe don't want to write a Windows app.

00:10:12.400 --> 00:10:17.960
<v Brian Okken>you could do something like this and use this service to distribute your stuff.

00:10:19.230 --> 00:10:21.720
<v Brian Okken>Or as long as you publish it, I guess.

00:10:22.020 --> 00:10:24.520
<v Michael Kennedy>This is super interesting because it does not,

00:10:24.820 --> 00:10:27.160
<v Michael Kennedy>it just takes one more step out of the sequence.

00:10:28.260 --> 00:10:31.200
<v Michael Kennedy>The much improved sequence was first you figure out

00:10:31.340 --> 00:10:33.040
<v Michael Kennedy>however the heck you install uv with curl,

00:10:33.150 --> 00:10:36.840
<v Michael Kennedy>and then you can start running uv tool install or uv run.

00:10:37.150 --> 00:10:41.060
<v Michael Kennedy>But now you just go straight to the thing that you're actually trying to get to,

00:10:41.420 --> 00:10:43.400
<v Michael Kennedy>even though it makes uv happen, right?

00:10:43.520 --> 00:10:44.040
<v Michael Kennedy>I like it.

00:10:44.340 --> 00:10:45.760
<v Brian Okken>Yeah, so I'm not sure.

00:10:46.020 --> 00:10:49.520
<v Brian Okken>So clearly it's installing without Python or uv,

00:10:49.780 --> 00:10:54.660
<v Brian Okken>so somehow it's sort of doing a shimmed version of both, maybe?

00:10:54.660 --> 00:10:58.160
<v Michael Kennedy>I think step one is basically run the curl install command for uv,

00:10:58.560 --> 00:11:01.800
<v Michael Kennedy>and then step two is then uv toolinstall ruff,

00:11:02.180 --> 00:11:03.140
<v Michael Kennedy>or whatever it is you picked.

00:11:03.240 --> 00:11:06.700
<v Michael Kennedy>I think it's just those two things and one CLI command.

00:11:06.940 --> 00:11:07.240
<v Brian Okken>Okay.

00:11:07.960 --> 00:11:09.160
<v Brian Okken>Anyway, interesting,

00:11:09.220 --> 00:11:12.000
<v Brian Okken>and thanks Tim for writing up some examples.

00:11:12.890 --> 00:11:16.560
<v Brian Okken>So, yeah, anyway, I don't know if I'll use it,

00:11:16.780 --> 00:11:17.520
<v Brian Okken>but that doesn't matter.

00:11:17.740 --> 00:11:18.380
<v Michael Kennedy>A lot of people will.

00:11:18.680 --> 00:11:22.120
<v Michael Kennedy>I already know where I can start putting this in.

00:11:22.260 --> 00:11:22.780
<v Michael Kennedy>So this is sweet.

00:11:23.120 --> 00:11:26.060
<v Michael Kennedy>And really quick before we move on to the next topic,

00:11:26.480 --> 00:11:30.120
<v Michael Kennedy>the Command Book app is a GUI Swift UI app,

00:11:30.500 --> 00:11:33.860
<v Michael Kennedy>but it also has a command line CLI.

00:11:34.240 --> 00:11:36.100
<v Michael Kennedy>So anything that you can do in the GUI,

00:11:36.440 --> 00:11:38.180
<v Michael Kennedy>you can do in the CLI and just like,

00:11:38.320 --> 00:11:41.240
<v Michael Kennedy>If you've constructed one of these really careful commands with like six steps,

00:11:41.310 --> 00:11:44.180
<v Michael Kennedy>you can just, you know, command book space, name of your command and boom,

00:11:44.540 --> 00:11:44.880
<v Michael Kennedy>off it goes.

00:11:45.180 --> 00:11:47.980
<v Michael Kennedy>And they're always in sync, which is kind of weird for a desktop app that,

00:11:48.170 --> 00:11:49.780
<v Michael Kennedy>um, seems very gooey focused.

00:11:50.240 --> 00:11:50.480
<v Michael Kennedy>All right.

00:11:50.570 --> 00:11:52.320
<v Michael Kennedy>but let's move on.

00:11:52.670 --> 00:11:54.900
<v Michael Kennedy>I want to talk about sub process polling.

00:11:55.360 --> 00:11:57.660
<v Michael Kennedy>Now this is actually a good follow on from command book.

00:11:57.690 --> 00:12:00.900
<v Michael Kennedy>Cause all that thing does is just run a bunch of sub processes and stream the

00:12:01.020 --> 00:12:02.460
<v Michael Kennedy>output and check on their ending.

00:12:02.920 --> 00:12:03.780
<v Michael Kennedy>And do you know what it's been doing?

00:12:04.420 --> 00:12:05.120
<v Michael Kennedy>Hey, is that done?

00:12:05.350 --> 00:12:05.880
<v Michael Kennedy>Let me wait a second.

00:12:06.040 --> 00:12:06.420
<v Michael Kennedy>Is that done?

00:12:06.720 --> 00:12:07.120
<v Michael Kennedy>Is it done?

00:12:07.440 --> 00:12:07.800
<v Michael Kennedy>Is it done?

00:12:08.180 --> 00:12:08.660
<v Michael Kennedy>Is it done?

00:12:08.940 --> 00:12:10.540
<v Michael Kennedy>Like, no, that is not great.

00:12:11.100 --> 00:12:15.640
<v Michael Kennedy>So I want to talk about this thing called ending 15 years of subprocess polling.

00:12:16.100 --> 00:12:19.880
<v Michael Kennedy>So this comes to us from Yom Polo.

00:12:20.780 --> 00:12:25.420
<v Michael Kennedy>And it says from Python 3.3 until today, we've always had code that goes like this.

00:12:25.820 --> 00:12:29.600
<v Michael Kennedy>While we're waiting for some amount of time, get us, you'll wait on this,

00:12:29.960 --> 00:12:31.240
<v Michael Kennedy>get us details about this process.

00:12:31.520 --> 00:12:31.980
<v Michael Kennedy>Is it done?

00:12:32.280 --> 00:12:32.440
<v Michael Kennedy>No.

00:12:32.800 --> 00:12:33.420
<v Michael Kennedy>Time.sleep.

00:12:33.740 --> 00:12:33.880
<v Michael Kennedy>Okay.

00:12:34.040 --> 00:12:34.820
<v Michael Kennedy>We're going to try to do it again.

00:12:34.980 --> 00:12:35.360
<v Michael Kennedy>Is it done?

00:12:35.600 --> 00:12:36.060
<v Michael Kennedy>Time.sleep.

00:12:36.360 --> 00:12:42.080
<v Michael Kennedy>And obviously this means that there's a bunch of effort going into just sitting there and spinning over and over.

00:12:42.080 --> 00:12:43.440
<v Brian Okken>There's extra CPU time.

00:12:44.040 --> 00:12:46.320
<v Michael Kennedy>Yeah, it sounds like it's not that big of a deal.

00:12:46.380 --> 00:12:49.220
<v Michael Kennedy>Like, oh, you just, you know, it sleeps for a tenth of a millisecond.

00:12:49.560 --> 00:12:52.640
<v Michael Kennedy>So at first, and then like it backs off as it gets longer.

00:12:52.780 --> 00:12:54.560
<v Michael Kennedy>So it sleeps for up to 40 milliseconds.

00:12:54.980 --> 00:12:55.160
<v Michael Kennedy>Great.

00:12:55.240 --> 00:12:57.480
<v Michael Kennedy>So that's like zero CPU usage.

00:12:57.820 --> 00:12:59.560
<v Michael Kennedy>Let me tell you where it does matter.

00:12:59.840 --> 00:13:09.860
<v Michael Kennedy>If you think a little bit more deeply, when you've got multiple processes running and checking on things and so on, and your process says, I need to just wake up for a second.

00:13:10.180 --> 00:13:11.360
<v Michael Kennedy>Oh, there's nothing for me to do.

00:13:11.420 --> 00:13:12.300
<v Michael Kennedy>Let me go back to sleep.

00:13:12.680 --> 00:13:17.760
<v Michael Kennedy>It's blown out the L1, probably L2 cache of that CPU that it ran on.

00:13:18.020 --> 00:13:19.080
<v Michael Kennedy>And then it just went back to sleep.

00:13:19.240 --> 00:13:19.860
<v Michael Kennedy>You're like, great.

00:13:19.860 --> 00:13:22.540
<v Michael Kennedy>You woke up to like wreck the room and you left.

00:13:22.840 --> 00:13:22.940
<v Michael Kennedy>Right.

00:13:23.460 --> 00:13:27.420
<v Michael Kennedy>Because I don't know, a lot of people know this, but not everyone, I'm sure, is if you

00:13:27.620 --> 00:13:32.940
<v Michael Kennedy>try to access memory from your program and it's in the L2 cache, that's 400 times, 200

00:13:32.960 --> 00:13:35.280
<v Michael Kennedy>to 400 times faster than you have to access it.

00:13:35.420 --> 00:13:36.740
<v Michael Kennedy>And it's in regular RAM.

00:13:37.100 --> 00:13:37.760
<v Michael Kennedy>It's not in the cache.

00:13:38.100 --> 00:13:40.200
<v Michael Kennedy>So that's a huge challenge, right?

00:13:40.320 --> 00:13:44.540
<v Michael Kennedy>There's a bunch of things like this, plus the latency, like, you know, it might not be

00:13:44.540 --> 00:13:48.980
<v Michael Kennedy>a huge deal that it might be 20 milliseconds till you actually see the end, but still,

00:13:49.380 --> 00:13:49.940
<v Michael Kennedy>it's not ideal.

00:13:50.260 --> 00:13:57.060
<v Michael Kennedy>So it turns out that all POSIX systems provide at least one mechanism to be notified when a file descriptor becomes ready.

00:13:57.440 --> 00:14:00.060
<v Michael Kennedy>But here's the thing that unlocked it.

00:14:00.520 --> 00:14:07.640
<v Michael Kennedy>So he said, until recently, I believe that this could only be used with file descriptors, like files and sockets and so on.

00:14:07.650 --> 00:14:10.880
<v Michael Kennedy>But it turns out a file descriptor can also be a process ID.

00:14:11.840 --> 00:14:13.760
<v Michael Kennedy>How about that for great naming and documentation?

00:14:13.760 --> 00:14:14.580
<v Michael Kennedy>I didn't know that.

00:14:15.040 --> 00:14:15.220
<v Brian Okken>Yeah.

00:14:15.640 --> 00:14:19.600
<v Michael Kennedy>So what you can do is you can just give it the process ID and just go, wait until this thing is done.

00:14:20.060 --> 00:14:20.920
<v Michael Kennedy>Wake me up when it's done.

00:14:21.280 --> 00:14:26.680
<v Michael Kennedy>And Linux in 2019 introduced PIDFD underscore open,

00:14:27.200 --> 00:14:30.020
<v Michael Kennedy>which was added to the OS module for Python 3.9,

00:14:30.360 --> 00:14:31.820
<v Michael Kennedy>and it returns a file descriptor,

00:14:32.020 --> 00:14:33.940
<v Michael Kennedy>a descriptor referencing the PID, right?

00:14:34.280 --> 00:14:37.380
<v Michael Kennedy>So it can be used in conjunction with a select, a pull, or an e-pull,

00:14:37.720 --> 00:14:40.220
<v Michael Kennedy>usually like OS-level things, to effectively wait until it exits.

00:14:40.380 --> 00:14:41.500
<v Michael Kennedy>So that works well there.

00:14:42.000 --> 00:14:44.880
<v Michael Kennedy>macOS, I believe, has always had this thing called KQ,

00:14:45.020 --> 00:14:46.980
<v Michael Kennedy>which always has had this pulling capability.

00:14:47.420 --> 00:14:49.920
<v Michael Kennedy>And then Windows, actually, Windows is the winner here.

00:14:50.040 --> 00:14:52.640
<v Michael Kennedy>You know, it's fun to like, oh, Windows is in the corner eating glue.

00:14:53.080 --> 00:14:55.380
<v Michael Kennedy>No, not this time.

00:14:55.660 --> 00:14:59.960
<v Michael Kennedy>In fact, Windows is the only one that had native support from the beginning.

00:15:00.500 --> 00:15:03.680
<v Michael Kennedy>So there's a Win32 call, I believe, wait for single object or something like that,

00:15:03.980 --> 00:15:07.240
<v Michael Kennedy>which has always been able to just wait for a process to end.

00:15:07.580 --> 00:15:09.280
<v Michael Kennedy>And it can fall back to polling if it has to.

00:15:09.640 --> 00:15:10.980
<v Michael Kennedy>So anyway, pretty interesting.

00:15:11.220 --> 00:15:16.360
<v Michael Kennedy>And the big news is this bad boy right here has been merged by Victor Stinner.

00:15:16.860 --> 00:15:20.300
<v Michael Kennedy>And you can go, actually, I'll link to the pull request.

00:15:20.460 --> 00:15:22.960
<v Michael Kennedy>Pull request 144,047.

00:15:23.510 --> 00:15:24.800
<v Michael Kennedy>That was merged two weeks ago.

00:15:25.230 --> 00:15:25.620
<v Michael Kennedy>Pretty cool, huh?

00:15:25.860 --> 00:15:27.560
<v Brian Okken>Yeah, so that'll be in 3.15.

00:15:28.100 --> 00:15:28.440
<v Michael Kennedy>Exactly.

00:15:28.880 --> 00:15:29.320
<v Michael Kennedy>Yes, exactly.

00:15:29.620 --> 00:15:29.780
<v Michael Kennedy>Okay.

00:15:29.920 --> 00:15:30.400
<v Michael Kennedy>Exactly, exactly.

00:15:30.760 --> 00:15:32.020
<v Michael Kennedy>So, yeah, people can check that out.

00:15:33.260 --> 00:15:34.420
<v Michael Kennedy>And you don't have to do anything.

00:15:35.100 --> 00:15:38.460
<v Michael Kennedy>Your subprocess, your multiprocessing, et cetera, gets a little better.

00:15:38.800 --> 00:15:39.300
<v Michael Kennedy>Yeah, cool.

00:15:40.420 --> 00:15:45.280
<v Brian Okken>Also, actually, there are some people that are already doing extra things to try to get around this.

00:15:45.600 --> 00:15:48.780
<v Brian Okken>And in 3.15, they'll be able to get rid of those workarounds.

00:15:48.780 --> 00:15:48.800
<v Brian Okken>Oh, yeah.

00:15:49.320 --> 00:15:49.760
<v Brian Okken>Yeah.

00:15:50.020 --> 00:15:50.120
<v Brian Okken>Yeah.

00:15:50.720 --> 00:15:52.940
<v Brian Okken>So, OK.

00:15:53.780 --> 00:15:58.200
<v Brian Okken>I mostly wanted to talk about this next topic because of the name.

00:15:59.180 --> 00:16:03.540
<v Brian Okken>So Pedantic came out with Monty for Monty Python, of course.

00:16:04.760 --> 00:16:08.960
<v Brian Okken>So Monty Python is experimental.

00:16:09.170 --> 00:16:12.080
<v Brian Okken>This project is still in development, not ready for prime time.

00:16:12.520 --> 00:16:13.680
<v Brian Okken>But, you know, sure.

00:16:14.080 --> 00:16:15.640
<v Brian Okken>FastAPI is still on zero ver.

00:16:16.040 --> 00:16:16.780
<v Brian Okken>So who knows?

00:16:18.820 --> 00:16:20.040
<v Brian Okken>So I think.

00:16:20.500 --> 00:16:21.660
<v Brian Okken>Sorry, FastAPI, if I'm wrong.

00:16:22.940 --> 00:16:23.100
<v Brian Okken>Okay.

00:16:23.390 --> 00:16:26.980
<v Brian Okken>So pedantic folks, Lise Monty,

00:16:27.300 --> 00:16:30.440
<v Brian Okken>minimal secure Python interpreter written in Rust for use by AI.

00:16:30.960 --> 00:16:31.320
<v Brian Okken>Wait a second.

00:16:31.780 --> 00:16:33.900
<v Brian Okken>I don't know if this is the first one,

00:16:34.140 --> 00:16:39.160
<v Brian Okken>but a programming implementation of a language

00:16:39.839 --> 00:16:41.900
<v Brian Okken>primarily intended to be used by AI.

00:16:42.260 --> 00:16:43.480
<v Brian Okken>I don't know if there's others.

00:16:44.040 --> 00:16:48.160
<v Brian Okken>Anyway, it's a minimal secure interpreter.

00:16:49.560 --> 00:16:53.120
<v Brian Okken>It says, "Monty avoids the costs, latency, complexity,

00:16:53.280 --> 00:16:58.140
<v Brian Okken>and general faff of using a full container-based sandbox

00:16:58.540 --> 00:17:00.340
<v Brian Okken>for running LLM-generated code."

00:17:00.620 --> 00:17:04.959
<v Brian Okken>So I'm guessing that a lot of people in some process are

00:17:05.160 --> 00:17:10.040
<v Brian Okken>saying, hey, sandbox this so that the AI doesn't escape

00:17:10.100 --> 00:17:11.680
<v Brian Okken>and try to take over the world.

00:17:12.459 --> 00:17:15.240
<v Michael Kennedy>Maybe it can only access these directories.

00:17:15.620 --> 00:17:17.939
<v Michael Kennedy>Maybe it can't call these kernel methods or something, right?

00:17:18.000 --> 00:17:18.380
<v Michael Kennedy>Who knows?

00:17:18.520 --> 00:17:18.740
<v Brian Okken>Yeah.

00:17:19.880 --> 00:17:30.480
<v Brian Okken>And we get like, you know, so promises from the Claude people and other people that they've like turned off reasonable things or like things that we, but, you know, who knows?

00:17:30.720 --> 00:17:35.940
<v Brian Okken>So there's a subset of what Monty can do.

00:17:36.060 --> 00:17:41.900
<v Brian Okken>It has a reasonable subset of Python code enough for your agent to express what it wants to do.

00:17:43.279 --> 00:17:45.820
<v Brian Okken>completely block access to the host environment.

00:17:46.060 --> 00:17:49.580
<v Brian Okken>No access to the file system, environmental variables, or network access.

00:17:50.580 --> 00:17:51.220
<v Brian Okken>This is interesting.

00:17:53.380 --> 00:17:56.380
<v Brian Okken>Okay, file system, environmental variables, and network access

00:17:56.520 --> 00:18:00.060
<v Brian Okken>are all implemented via external function calls

00:18:00.460 --> 00:18:01.900
<v Brian Okken>that the developer can control.

00:18:02.100 --> 00:18:03.880
<v Brian Okken>Okay, so it doesn't completely block it,

00:18:04.080 --> 00:18:07.120
<v Brian Okken>but the developer can control what it can have access to.

00:18:07.340 --> 00:18:07.820
<v Brian Okken>That's cool.

00:18:09.180 --> 00:18:16.100
<v Brian Okken>Anyway, so there's basically this minimal Python set that controls what your AI can do with it.

00:18:16.900 --> 00:18:17.380
<v Brian Okken>Kind of interesting.

00:18:17.840 --> 00:18:18.400
<v Brian Okken>I'm not sure.

00:18:19.360 --> 00:18:20.240
<v Brian Okken>It can't do.

00:18:20.270 --> 00:18:21.900
<v Brian Okken>It can't do standard library yet.

00:18:22.100 --> 00:18:28.980
<v Brian Okken>So I'm not sure exactly where this use model is, but I'm interested to watch and see what's going to happen.

00:18:29.720 --> 00:18:32.140
<v Brian Okken>So any take on this at all, Michael?

00:18:32.460 --> 00:18:33.500
<v Michael Kennedy>I'm very excited about it.

00:18:33.860 --> 00:18:38.820
<v Michael Kennedy>When I do like to troll the GitHub feed, I used to think that was a dumb.

00:18:38.900 --> 00:18:41.920
<v Michael Kennedy>thing. I'm like, what is this? It's in my way, in my code. Like, get out of here. I actually really

00:18:42.100 --> 00:18:46.460
<v Michael Kennedy>love the GitHub feed. And I was watching it a day and a half ago or something. And I saw this come

00:18:46.560 --> 00:18:51.400
<v Michael Kennedy>by and I saw Samuel Colvin was behind it. I'm like, yes, this is interesting. So he and I are

00:18:51.560 --> 00:18:56.080
<v Michael Kennedy>talking next week. I think it's next week. No, wait, it might be tomorrow. I'm like, you know,

00:18:56.100 --> 00:19:00.280
<v Michael Kennedy>that joke for the progress monitor or the progress bar for the windows, the windows guy.

00:19:00.740 --> 00:19:06.520
<v Michael Kennedy>Yeah. No, it is. It's next Tuesday, the 17th. The joke is I'm on my way to your house. I'll be

00:19:06.540 --> 00:19:10.180
<v Michael Kennedy>there in about half an hour. No, wait, it's going to take a day. Actually, I'm at your front door,

00:19:10.420 --> 00:19:16.560
<v Michael Kennedy>right? That's kind of how I feel. No, I'm talking next, not tomorrow, but the week after tomorrow,

00:19:16.690 --> 00:19:20.780
<v Michael Kennedy>I said, hey, when I saw this come by, I'm like, this is looking like it could be a huge thing.

00:19:21.080 --> 00:19:26.620
<v Michael Kennedy>Let's talk. So that was my take, right? Email Samuel, say, this looks awesome. How do we share

00:19:26.720 --> 00:19:31.880
<v Michael Kennedy>it? His announcement when he said it was something like, it might be a little early for this, but

00:19:31.970 --> 00:19:35.919
<v Michael Kennedy>what the heck, here we go, right? And sharing it. And that thing, like maybe the standard library

00:19:36.040 --> 00:19:37.760
<v Michael Kennedy>and so on is a bit of that.

00:19:38.860 --> 00:19:41.000
<v Michael Kennedy>Look, the possibility of what's on the other side of this

00:19:41.420 --> 00:19:42.400
<v Michael Kennedy>is incredible, right?

00:19:42.700 --> 00:19:45.480
<v Michael Kennedy>Like if we get a fully working Python

00:19:45.730 --> 00:19:47.540
<v Michael Kennedy>or nearly fully working, right?

00:19:47.640 --> 00:19:48.800
<v Michael Kennedy>One of the things that you can do

00:19:48.830 --> 00:19:50.320
<v Michael Kennedy>when you're doing this kind of stuff is you're like,

00:19:50.460 --> 00:19:52.800
<v Michael Kennedy>well, do we really need to support that edge case

00:19:52.850 --> 00:19:54.460
<v Michael Kennedy>that was carried over from 2.4?

00:19:55.440 --> 00:19:57.520
<v Michael Kennedy>No, the AI is not going to try to do that anyway.

00:19:57.630 --> 00:19:58.140
<v Michael Kennedy>You know what I mean?

00:19:58.220 --> 00:20:01.300
<v Michael Kennedy>Like you can cut some corners and like drop some baggage,

00:20:01.740 --> 00:20:03.760
<v Michael Kennedy>which may or may not make it generally useful,

00:20:04.220 --> 00:20:05.640
<v Michael Kennedy>but I don't know.

00:20:05.740 --> 00:20:07.300
<v Michael Kennedy>I think it's super interesting.

00:20:08.420 --> 00:20:11.240
<v Brian Okken>So how, like, okay, hype-driven development maybe.

00:20:12.860 --> 00:20:15.540
<v Brian Okken>He just announced it within the last week,

00:20:15.780 --> 00:20:17.580
<v Brian Okken>and it's got 2,000 stars already?

00:20:17.920 --> 00:20:18.700
<v Michael Kennedy>Yeah, I know.

00:20:19.350 --> 00:20:23.120
<v Michael Kennedy>A day ago when I saw it or something, it had like 500 stars,

00:20:23.300 --> 00:20:24.640
<v Michael Kennedy>but it was going click, click, click.

00:20:24.870 --> 00:20:25.700
<v Michael Kennedy>You know, it was incredible.

00:20:26.360 --> 00:20:30.420
<v Michael Kennedy>Yeah, it shows you the faith and the trust that the Pynantic team has earned.

00:20:30.720 --> 00:20:31.880
<v Michael Kennedy>And, you know, I don't know.

00:20:31.940 --> 00:20:32.740
<v Michael Kennedy>Well-deserved.

00:20:33.140 --> 00:20:33.600
<v Michael Kennedy>Yeah, absolutely.

00:20:34.080 --> 00:20:40.020
<v Michael Kennedy>Also, one of their big projects, not just Pydantic, but is Pydantic AI, right?

00:20:40.230 --> 00:20:44.380
<v Michael Kennedy>So they've got a whole agent system for running AIs and stuff.

00:20:44.550 --> 00:20:49.740
<v Michael Kennedy>And so this is a really interesting building block to make that more of a self-contained world, you know?

00:20:49.960 --> 00:20:50.200
<v Brian Okken>Yeah.

00:20:50.460 --> 00:20:52.920
<v Brian Okken>Yeah, it's also possible that they're already using it.

00:20:53.040 --> 00:20:57.000
<v Brian Okken>It's just they're exposing it for other people to have access to or something.

00:20:57.280 --> 00:20:57.900
<v Michael Kennedy>Yeah, exactly.

00:20:58.420 --> 00:21:00.340
<v Brian Okken>But it absolutely is a popular one.

00:21:00.680 --> 00:21:01.680
<v Brian Okken>And cool.

00:21:01.920 --> 00:21:03.840
<v Brian Okken>They're using COD speed also.

00:21:04.000 --> 00:21:04.560
<v Brian Okken>We covered that.

00:21:04.720 --> 00:21:06.040
<v Michael Kennedy>Oh, yeah, they are.

00:21:06.220 --> 00:21:06.920
<v Michael Kennedy>OK, cool.

00:21:07.620 --> 00:21:07.720
<v Michael Kennedy>Sweet.

00:21:07.820 --> 00:21:08.560
<v Michael Kennedy>All right.

00:21:08.640 --> 00:21:10.480
<v Michael Kennedy>Well, that's it for our main stuff, right?

00:21:10.760 --> 00:21:10.860
<v Michael Kennedy>Yep.

00:21:11.860 --> 00:21:11.960
<v Michael Kennedy>Yep.

00:21:12.460 --> 00:21:13.100
<v Michael Kennedy>Do you have any extras?

00:21:13.540 --> 00:21:14.440
<v Michael Kennedy>Yes, I do.

00:21:14.740 --> 00:21:15.480
<v Michael Kennedy>Yes, I do.

00:21:15.720 --> 00:21:17.580
<v Michael Kennedy>Let's jump over here to the extras.

00:21:18.160 --> 00:21:19.200
<v Michael Kennedy>First off, command book.

00:21:19.340 --> 00:21:19.440
<v Michael Kennedy>No.

00:21:20.940 --> 00:21:23.220
<v Michael Kennedy>No, but more CLIs from Talk Python things.

00:21:23.340 --> 00:21:24.720
<v Michael Kennedy>This is another thing that I wrote.

00:21:24.800 --> 00:21:26.040
<v Michael Kennedy>I have a couple of things that I wrote, actually,

00:21:26.260 --> 00:21:27.000
<v Michael Kennedy>that I want to talk about.

00:21:27.380 --> 00:21:30.040
<v Michael Kennedy>So a while ago, over at Talk Python,

00:21:31.160 --> 00:21:33.560
<v Michael Kennedy>I added this MCP and AI section, right?

00:21:33.610 --> 00:21:36.220
<v Michael Kennedy>And I talked about that, like, okay, here's how you can plug that into

00:21:36.420 --> 00:21:39.240
<v Michael Kennedy>Claude and other systems and the LLMs.txt.

00:21:39.630 --> 00:21:43.600
<v Michael Kennedy>But it occurred to me as I played with different AI tools, trying to make it

00:21:43.740 --> 00:21:45.100
<v Michael Kennedy>talk to this thing, like, you know what?

00:21:45.360 --> 00:21:47.120
<v Michael Kennedy>Most things don't do MCPs.

00:21:47.540 --> 00:21:52.500
<v Michael Kennedy>And even the ones that do, most of the users of those projects don't install

00:21:53.150 --> 00:21:55.080
<v Michael Kennedy>the custom MCP into their thing.

00:21:55.140 --> 00:22:01.940
<v Michael Kennedy>So could I give people access to all the talk Python data in a more wide ranging way?

00:22:02.170 --> 00:22:02.320
<v Michael Kennedy>Right.

00:22:02.700 --> 00:22:07.460
<v Michael Kennedy>So I decided the way to do that would be to create a talk Python CLI.

00:22:07.790 --> 00:22:09.920
<v Michael Kennedy>So now you can listen to this.

00:22:10.220 --> 00:22:11.880
<v Michael Kennedy>How recent is this, Brian?

00:22:11.890 --> 00:22:19.280
<v Michael Kennedy>I literally have not written this down, but in my mind, I can uvx-sh slash talk Python

00:22:19.940 --> 00:22:22.000
<v Michael Kennedy>CLI with dashes install.sh.

00:22:22.360 --> 00:22:25.500
<v Michael Kennedy>And then I will be able to just type things like down here somewhere.

00:22:25.780 --> 00:22:30.040
<v Michael Kennedy>I could just type Talk Python, then episodes, search, put some text in there,

00:22:30.060 --> 00:22:36.380
<v Michael Kennedy>or Talk Python guests list, or Talk Python guests get and give them an ID that came from the list.

00:22:36.440 --> 00:22:41.260
<v Michael Kennedy>And basically all the data that is behind Talk Python, which is insane.

00:22:41.940 --> 00:22:45.840
<v Michael Kennedy>7.5 million words in the corpus of content at Talk Python.

00:22:46.200 --> 00:22:46.380
<v Michael Kennedy>Wow.

00:22:46.740 --> 00:22:46.800
<v Michael Kennedy>Yeah.

00:22:47.040 --> 00:22:52.280
<v Michael Kennedy>If you take the transcripts, the show notes, the guest bios, you know, and you go, how many words is that?

00:22:52.620 --> 00:22:53.300
<v Michael Kennedy>7.5 million.

00:22:53.580 --> 00:22:53.860
<v Michael Kennedy>It's a couple.

00:22:54.260 --> 00:23:01.120
<v Michael Kennedy>So this is like a huge resource for people to go back and use to ask questions like what has changed over time and so on, right?

00:23:01.420 --> 00:23:03.900
<v Michael Kennedy>So I thought it'd be really cool to create this CLI tool for that.

00:23:04.220 --> 00:23:05.300
<v Michael Kennedy>And so I have.

00:23:05.520 --> 00:23:05.980
<v Brian Okken>Oh, that's cool.

00:23:06.240 --> 00:23:06.340
<v Michael Kennedy>Yeah.

00:23:06.600 --> 00:23:07.640
<v Michael Kennedy>So super easy.

00:23:07.980 --> 00:23:08.740
<v Michael Kennedy>It's all written in Python.

00:23:09.300 --> 00:23:09.920
<v Michael Kennedy>Install it with uv.

00:23:10.320 --> 00:23:14.200
<v Michael Kennedy>And then once you install it, just you have a talk Python, no spaces command, right?

00:23:14.520 --> 00:23:16.520
<v Michael Kennedy>Oh, one final thing is it has three different outputs.

00:23:17.060 --> 00:23:23.500
<v Michael Kennedy>it has uh does anyone here i don't know it doesn't there but you can have yeah it does normally it

00:23:23.560 --> 00:23:29.360
<v Michael Kennedy>puts out text formatted by the rich library you know will googan of will googan creation but it

00:23:29.400 --> 00:23:33.980
<v Michael Kennedy>can also put out json which is good for apps and it can put out markdown which is really good if

00:23:33.980 --> 00:23:38.760
<v Michael Kennedy>you would say go to claude code and say claude use this talk python thing and talk to it and give me

00:23:38.860 --> 00:23:43.600
<v Michael Kennedy>answers or something you know what i mean so you tell for any agentic stuff give it the markdown

00:23:43.620 --> 00:23:47.380
<v Michael Kennedy>That's what those want, which is, I always thought JSON, but no, Markdown is what they want.

00:23:47.440 --> 00:23:47.720
<v Michael Kennedy>Very weird.

00:23:48.000 --> 00:23:48.100
<v Michael Kennedy>Okay.

00:23:48.600 --> 00:23:53.140
<v Michael Kennedy>Speaking of which, I wrote a little riff on someone else's article called,

00:23:53.540 --> 00:23:55.540
<v Michael Kennedy>It's Not Vibe Coding, Agentic Engineering.

00:23:55.800 --> 00:24:01.660
<v Michael Kennedy>This guy, Addy Ozimani, wrote a really good article.

00:24:02.040 --> 00:24:06.480
<v Michael Kennedy>This guy's from one of the Google teams called Agentic Engineering.

00:24:06.660 --> 00:24:07.700
<v Michael Kennedy>So I wrote some stuff about that.

00:24:07.860 --> 00:24:09.400
<v Michael Kennedy>People can check that out if they want.

00:24:10.320 --> 00:24:16.160
<v Michael Kennedy>Honestly, the idea is like, I think a lot of serious work with agentic coding tools and vibe coding.

00:24:16.380 --> 00:24:18.440
<v Michael Kennedy>Hey, my manager made this last night.

00:24:18.500 --> 00:24:19.380
<v Michael Kennedy>Now we have to build it.

00:24:19.460 --> 00:24:21.420
<v Michael Kennedy>Like those two worlds get grouped into one thing.

00:24:21.520 --> 00:24:24.000
<v Michael Kennedy>And this article is a little bit to like, love it or hate it.

00:24:24.140 --> 00:24:26.400
<v Michael Kennedy>There's two different things you should be talking about in this world.

00:24:26.720 --> 00:24:27.420
<v Michael Kennedy>So check that out.

00:24:28.060 --> 00:24:29.300
<v Michael Kennedy>GitHub was having a day this morning.

00:24:29.360 --> 00:24:30.060
<v Michael Kennedy>Did you notice this?

00:24:30.360 --> 00:24:30.520
<v Michael Kennedy>No.

00:24:31.020 --> 00:24:31.100
<v Michael Kennedy>Yeah.

00:24:31.440 --> 00:24:37.000
<v Michael Kennedy>I got the magic unicorn and status code 503 just trying to do some work getting ready for the show.

00:24:37.340 --> 00:24:38.900
<v Michael Kennedy>So the issues didn't work.

00:24:39.300 --> 00:24:44.460
<v Michael Kennedy>pull requests were degraded actions are degraded uh it says other things were fine but like going

00:24:44.460 --> 00:24:49.120
<v Michael Kennedy>to the website wouldn't work it would 503 i couldn't git clone anything so if you're having

00:24:49.370 --> 00:24:55.040
<v Michael Kennedy>problems this morning you know many people were python 3 14 3 is now available third maintenance

00:24:55.270 --> 00:25:01.920
<v Michael Kennedy>release of 3 14 so i really dislike this format i mean whoever wrote it thank you for writing it

00:25:01.920 --> 00:25:07.780
<v Michael Kennedy>but i do dislike this format of hey we got this new minor vert we have this release i'm going to

00:25:07.600 --> 00:25:10.200
<v Michael Kennedy>tell you about all the changes that have happened over the last year.

00:25:10.840 --> 00:25:13.640
<v Michael Kennedy>No, all I want to know is the changes in this release.

00:25:14.180 --> 00:25:14.500
<v Michael Kennedy>Yeah.

00:25:14.880 --> 00:25:18.040
<v Michael Kennedy>If I want to know the changes that have lasted over a year over a year, I could go check that

00:25:18.140 --> 00:25:18.220
<v Michael Kennedy>out.

00:25:18.320 --> 00:25:21.400
<v Michael Kennedy>But it says, here's the changes of 314 to 313.

00:25:21.620 --> 00:25:24.100
<v Michael Kennedy>You're like, no, well, what about the one that I had before?

00:25:24.320 --> 00:25:25.200
<v Michael Kennedy>Like, how is this related?

00:25:25.340 --> 00:25:25.740
<v Michael Kennedy>Do you know what I mean?

00:25:26.240 --> 00:25:29.860
<v Michael Kennedy>I know if I track it down, there's other places I can find that information, but I don't have

00:25:29.860 --> 00:25:30.300
<v Michael Kennedy>it on the screen.

00:25:30.660 --> 00:25:31.960
<v Brian Okken>Yeah, but you have to track it down.

00:25:32.180 --> 00:25:33.700
<v Brian Okken>Why, why shouldn't, why wouldn't it be right here?

00:25:34.040 --> 00:25:34.140
<v Michael Kennedy>Yeah.

00:25:34.220 --> 00:25:37.580
<v Michael Kennedy>What is the value of saying this like eight times before you say, you know what I mean?

00:25:37.780 --> 00:25:38.340
<v Michael Kennedy>Anyway, it's weird.

00:25:38.600 --> 00:25:40.640
<v Michael Kennedy>Just restate the changelog year over year.

00:25:41.000 --> 00:25:41.440
<v Michael Kennedy>But awesome.

00:25:42.000 --> 00:25:42.580
<v Michael Kennedy>Upgrade to this.

00:25:43.500 --> 00:25:49.980
<v Michael Kennedy>UV Python install 3143 --manage only.

00:25:50.160 --> 00:25:50.540
<v Michael Kennedy>Something like that.

00:25:50.820 --> 00:25:51.460
<v Michael Kennedy>Anyway, that's how you get it.

00:25:51.660 --> 00:25:51.800
<v Michael Kennedy>All right.

00:25:52.160 --> 00:25:53.400
<v Michael Kennedy>This is the wildest story.

00:25:53.680 --> 00:25:54.540
<v Michael Kennedy>Absolute wildest story.

00:25:54.660 --> 00:25:56.020
<v Michael Kennedy>And my last extra, Brian.

00:25:56.340 --> 00:25:56.480
<v Michael Kennedy>Okay.

00:25:56.530 --> 00:25:59.680
<v Michael Kennedy>This is already out of date because the number is wrong.

00:26:00.240 --> 00:26:04.060
<v Michael Kennedy>But Wall Street just lost $285 billion.

00:26:05.020 --> 00:26:07.440
<v Michael Kennedy>The valuation of companies like Salesforce,

00:26:08.220 --> 00:26:10.940
<v Michael Kennedy>bunch of sort of offshoring,

00:26:11.600 --> 00:26:14.560
<v Michael Kennedy>like support team programmer companies,

00:26:15.120 --> 00:26:17.440
<v Michael Kennedy>like, hey, we have a bunch of experts

00:26:17.580 --> 00:26:19.240
<v Michael Kennedy>who will like be your legal review

00:26:19.440 --> 00:26:21.320
<v Michael Kennedy>and like write code to help you do that kind of stuff.

00:26:21.400 --> 00:26:23.580
<v Michael Kennedy>And so on, they just lost $285 billion

00:26:24.160 --> 00:26:25.600
<v Michael Kennedy>because of 13 Markdown files.

00:26:27.500 --> 00:26:29.100
<v Michael Kennedy>And the Markdown files are short, by the way.

00:26:29.200 --> 00:26:32.640
<v Michael Kennedy>This is not like an Epstein type thing where like some thing has been revealed.

00:26:33.080 --> 00:26:39.580
<v Michael Kennedy>So we live in this like in this weird dichotomy of two bizarre viewpoints.

00:26:39.960 --> 00:26:41.240
<v Michael Kennedy>One, AI is a fad.

00:26:41.240 --> 00:26:42.260
<v Michael Kennedy>The bubble is going to burst.

00:26:42.760 --> 00:26:45.520
<v Michael Kennedy>And that's just not very much of an important thing.

00:26:45.740 --> 00:26:47.300
<v Michael Kennedy>So, you know, don't even bother learning.

00:26:47.460 --> 00:26:48.240
<v Michael Kennedy>It's going to crash.

00:26:48.700 --> 00:26:49.720
<v Michael Kennedy>It's never going to replace people.

00:26:49.880 --> 00:26:51.740
<v Michael Kennedy>Remember, we've replaced, we tried all these layoffs.

00:26:52.040 --> 00:26:53.300
<v Michael Kennedy>They try to replace people with AI.

00:26:53.360 --> 00:26:53.900
<v Michael Kennedy>It's going badly.

00:26:54.100 --> 00:26:55.240
<v Michael Kennedy>Like there's a hundred of those articles.

00:26:55.620 --> 00:27:02.920
<v Michael Kennedy>This article says Anthropic released something that would help Claude Code basically do better legal work.

00:27:03.420 --> 00:27:08.240
<v Michael Kennedy>So all of these companies lost $285 billion because it was so good.

00:27:08.700 --> 00:27:15.440
<v Michael Kennedy>And all it is, literally all it is, is if you go to knowledgeworkplugin.com slash legal on the Anthropic Claude Code repo,

00:27:15.860 --> 00:27:22.120
<v Michael Kennedy>it's just a handful of markdown files that are just pre-prompts or skills to be given to Anthropic.

00:27:22.500 --> 00:27:23.480
<v Michael Kennedy>How insane is that?

00:27:24.920 --> 00:27:26.660
<v Brian Okken>Yeah, that's something.

00:27:26.980 --> 00:27:27.620
<v Michael Kennedy>It is something.

00:27:27.920 --> 00:27:31.260
<v Michael Kennedy>So we live in this world where both AI is a bubble that's going to pop,

00:27:31.400 --> 00:27:35.100
<v Michael Kennedy>and even just a few focus prompts will destroy large companies.

00:27:35.380 --> 00:27:36.200
<v Michael Kennedy>So I don't know.

00:27:36.360 --> 00:27:36.700
<v Michael Kennedy>It's good.

00:27:36.740 --> 00:27:37.560
<v Michael Kennedy>We're going to see how it shakes out.

00:27:37.860 --> 00:27:39.160
<v Brian Okken>We got to go up to the name.

00:27:39.320 --> 00:27:40.800
<v Brian Okken>Like go up to the top of that article.

00:27:42.960 --> 00:27:43.360
<v Brian Okken>Sasspocalypse.

00:27:44.520 --> 00:27:46.840
<v Michael Kennedy>Sasspocalypse, again, on the 3rd of February 26th.

00:27:48.380 --> 00:27:51.560
<v Michael Kennedy>Yeah, because it's these, you know, there's a link to a Bloomberg article.

00:27:51.700 --> 00:27:52.860
<v Michael Kennedy>What's behind the Sasspocalypse?

00:27:53.200 --> 00:27:54.960
<v Michael Kennedy>I do not care about your, you know what?

00:27:55.380 --> 00:27:56.100
<v Michael Kennedy>Unlimited access.

00:27:56.940 --> 00:27:57.340
<v Michael Kennedy>There we go.

00:27:57.490 --> 00:27:58.160
<v Michael Kennedy>We'll go into the reader.

00:27:58.740 --> 00:27:58.800
<v Michael Kennedy>Yeah.

00:27:59.100 --> 00:27:59.840
<v Michael Kennedy>So yeah.

00:27:59.900 --> 00:28:01.480
<v Michael Kennedy>Anyway, you can see like, I'm not sure.

00:28:01.480 --> 00:28:01.900
<v Michael Kennedy>It's a good name.

00:28:02.050 --> 00:28:03.700
<v Michael Kennedy>It's a very good name.

00:28:04.040 --> 00:28:05.080
<v Michael Kennedy>Forgot some of the companies.

00:28:05.280 --> 00:28:08.000
<v Michael Kennedy>There are probably ones you wouldn't have heard of, but yeah, they, they, they opened

00:28:08.100 --> 00:28:11.020
<v Michael Kennedy>this up for like a legal specialization and then like it broke loose.

00:28:11.420 --> 00:28:13.160
<v Brian Okken>I guess hurry up and copy those files.

00:28:13.920 --> 00:28:14.140
<v Brian Okken>Exactly.

00:28:14.960 --> 00:28:16.540
<v Brian Okken>Clone those things before they get banned.

00:28:17.340 --> 00:28:17.900
<v Brian Okken>Over to you.

00:28:18.720 --> 00:28:26.300
<v Brian Okken>Well, you just, your comment about Epstein files reminded me of an extra I saw recently,

00:28:27.560 --> 00:28:31.380
<v Brian Okken>that the Bash shell manual was part of the Epstein files.

00:28:31.860 --> 00:28:32.740
<v Brian Okken>I saw that.

00:28:33.150 --> 00:28:33.260
<v Brian Okken>What?

00:28:33.320 --> 00:28:34.180
<v Brian Okken>That's bizarre.

00:28:35.060 --> 00:28:35.300
<v Brian Okken>Anyway.

00:28:35.370 --> 00:28:36.160
<v Brian Okken>Yeah, it's so bizarre.

00:28:37.040 --> 00:28:37.920
<v Brian Okken>There's whatever.

00:28:38.300 --> 00:28:38.940
<v Brian Okken>There's a bunch of stuff.

00:28:39.500 --> 00:28:43.080
<v Brian Okken>My daughter was telling me some, I don't know if this is true or not.

00:28:43.160 --> 00:28:47.740
<v Brian Okken>this is way third hand through a teenager. but that like, 

00:28:48.100 --> 00:28:52.240
<v Brian Okken>that Biden was like a clone or something. Oh, geez.

00:28:52.620 --> 00:28:57.620
<v Brian Okken>Anyway. Okay. back to, back to sort of reality. Um,

00:28:58.260 --> 00:29:00.980
<v Brian Okken>Rand's, Michael Lopp, wrote,

00:29:01.200 --> 00:29:04.920
<v Brian Okken>wrote under the name of Rand's for a while. has there's a couple,

00:29:05.040 --> 00:29:06.740
<v Brian Okken>I just want to point out a couple articles. I,

00:29:06.980 --> 00:29:10.600
<v Brian Okken>I found amusing recently or just helpful and interesting,

00:29:10.820 --> 00:29:15.460
<v Brian Okken>Rand's article, I Hate Fish, is not really about fish.

00:29:15.700 --> 00:29:21.660
<v Brian Okken>It's about productivity systems and also just sort of talking about productivity systems.

00:29:21.780 --> 00:29:27.660
<v Brian Okken>Because I know a lot of people kind of go down that rabbit hole of getting things done and whatever.

00:29:28.500 --> 00:29:31.700
<v Brian Okken>But there's an interesting discussion around email.

00:29:31.960 --> 00:29:35.420
<v Brian Okken>And I thought the email discussion was worth a peruse.

00:29:35.980 --> 00:29:37.540
<v Brian Okken>So good writing there.

00:29:38.140 --> 00:29:39.700
<v Brian Okken>He's also just a great author.

00:29:39.980 --> 00:29:40.120
<v Brian Okken>Cool.

00:29:40.140 --> 00:29:40.620
<v Brian Okken>I'll check it out.

00:29:40.900 --> 00:29:45.880
<v Brian Okken>And then also this one is expertise is the art of ignoring.

00:29:46.380 --> 00:29:47.500
<v Brian Okken>And this is very true.

00:29:47.850 --> 00:29:55.420
<v Brian Okken>This is from Kevin Renskers and who is apparently open for side work.

00:29:55.700 --> 00:30:02.820
<v Brian Okken>So, you know, so, but I'm not going to go through the whole thing near the end.

00:30:03.080 --> 00:30:04.640
<v Brian Okken>He had some final thoughts.

00:30:06.280 --> 00:30:06.680
<v Brian Okken>Let's see.

00:30:07.620 --> 00:30:08.540
<v Brian Okken>Oh, here, here they are.

00:30:08.570 --> 00:30:08.980
<v Brian Okken>Some lessons.

00:30:09.500 --> 00:30:14.660
<v Brian Okken>you don't need to master the language you need to master your slice which is very important and

00:30:14.800 --> 00:30:19.300
<v Brian Okken>that's that that actually used to be we used to talk about python being the language you could fit

00:30:19.380 --> 00:30:26.280
<v Brian Okken>in your head all at once and it kind of isn't now um so it's okay that you can't fit it all in there

00:30:26.500 --> 00:30:32.600
<v Brian Okken>if you don't really understand comprehensions yet don't worry about it um actually and even if it

00:30:33.120 --> 00:30:38.679
<v Michael Kennedy>you should but even if you could fit the whole language in your head pypi yeah pypi and even the

00:30:38.620 --> 00:30:45.720
<v Brian Okken>standard library though like i forget stuff that's in the standard library all the time so um and you

00:30:45.720 --> 00:30:51.440
<v Brian Okken>know you don't need to master your language master your slice and uh build things um and you'll you'll

00:30:51.680 --> 00:30:57.020
<v Brian Okken>provide value as you build things uh learn everything up front is wasted effort again um

00:30:57.740 --> 00:31:03.520
<v Brian Okken>knowledge decays fast um learn what the problem demands when it demands it i like to go a little

00:31:03.340 --> 00:31:08.340
<v Brian Okken>further obviously i'm kind of like you know how does that work and and uh explore a little bit

00:31:08.540 --> 00:31:13.880
<v Brian Okken>further but that's just that's my entertainment so and also expertise changes

00:31:14.600 --> 00:31:20.200
<v Brian Okken>what you pay attention to so um a senior developers don't necessarily know more facts

00:31:20.500 --> 00:31:25.520
<v Brian Okken>they're better at recognizing which details matter right now and which ones don't and that's

00:31:25.640 --> 00:31:32.320
<v Brian Okken>definitely true i think when i was all of my years as a a project lead um i think my main skill was

00:31:32.300 --> 00:31:37.320
<v Brian Okken>the ability to say yeah it's probably not actually going to happen so let's not work on that right now

00:31:37.760 --> 00:31:44.120
<v Michael Kennedy>um yeah so and why does that matter it's not just oh i probably should ignore that it that stops you

00:31:44.160 --> 00:31:48.820
<v Michael Kennedy>from going and i'm going to spend two weeks learning that framework or that angle or something

00:31:48.930 --> 00:31:53.580
<v Michael Kennedy>and then try and then decide i don't need it right that's a big deal yeah and actually context the

00:31:53.860 --> 00:32:00.999
<v Brian Okken>the context shift time is very real and context shift time for uh entire engineers is um is

00:32:01.060 --> 00:32:07.580
<v Brian Okken>destructive and so um the more time you can i'm talking to leaders here the more time you can um

00:32:08.100 --> 00:32:14.520
<v Brian Okken>save individual contributors from having to shift gears all the time um if you can keep them going

00:32:14.940 --> 00:32:20.000
<v Brian Okken>like you know hey i need you to start working on something new uh when are you done with the

00:32:20.120 --> 00:32:24.759
<v Brian Okken>current thing if it's like less than a day or a day or so let them finish uh you'll get more

00:32:24.760 --> 00:32:30.920
<v Brian Okken>productivity that way. So 100%. Okay. That's just, just a couple of nice articles. That's it.

00:32:31.300 --> 00:32:36.320
<v Michael Kennedy>Awesome. Well, you have set the stage perfectly with this context switching story, mental context

00:32:36.500 --> 00:32:40.240
<v Michael Kennedy>switching for the joke. And this one, I feel called out. I'm going to just tell people I feel

00:32:40.400 --> 00:32:46.260
<v Michael Kennedy>called out here. So I've entitled this joke, silence current side project. Oh yeah. Are you

00:32:46.340 --> 00:32:54.680
<v Michael Kennedy>ready? Yeah. Silence current side project. A new side project is talking. Oh, oh, it hurts. I mean,

00:32:55.140 --> 00:33:08.880
<v Michael Kennedy>How many people out here listening have like worked on a side project, got it 65% of the way done and like squirrel and they go off and do another thing to get 40% done, come back, get distracted, you know, just silence current side project and new side project is talking.

00:33:10.160 --> 00:33:10.420
<v Brian Okken>Yes.

00:33:10.880 --> 00:33:21.360
<v Brian Okken>Well, my existing current book that I'm writing that I need to get back to that I'd rather spend on my time on a new SaaS project right now.

00:33:22.500 --> 00:33:25.420
<v Michael Kennedy>Even my new projects get subverted by my other new projects.

00:33:25.560 --> 00:33:26.600
<v Michael Kennedy>I'm like, stop, please.

00:33:26.760 --> 00:33:27.580
<v Michael Kennedy>This cannot go on.

00:33:27.900 --> 00:33:38.180
<v Michael Kennedy>That's why I'm so thrilled about getting the command book app out because it literally went from like zero to documentation published for sale without me not being able to focus.

00:33:38.520 --> 00:33:39.220
<v Michael Kennedy>So it's a good deal.

00:33:39.380 --> 00:33:39.820
<v Michael Kennedy>Nice.

00:33:40.400 --> 00:33:40.520
<v Michael Kennedy>Yeah.

00:33:40.820 --> 00:33:44.440
<v Michael Kennedy>But in the shadow of that experience, there are many things that are still pending.

00:33:45.140 --> 00:33:45.820
<v Brian Okken>And awesome.

00:33:46.130 --> 00:33:50.320
<v Brian Okken>Well, once again, lovely to talk to you about Python and catch up.

00:33:50.500 --> 00:33:53.600
<v Brian Okken>Thanks everybody for sending in ideas and keep them coming.

00:33:54.060 --> 00:33:54.780
<v Brian Okken>And yeah,

00:33:54.890 --> 00:33:55.900
<v Brian Okken>we'll talk to you all next week.

00:33:56.200 --> 00:33:56.480
<v Brian Okken>Bye everyone.

