WEBVTT

00:00:00.020 --> 00:00:12.900
<v Michael Kennedy>Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 488, and it is Tuesday, July 14, 2026. I'm Michael Kennedy.

00:00:13.180 --> 00:00:15.120
<v Calvin Hendryx-Parker>And I'm Calvin Hendryx-Parker. Happy Bastille Day.

00:00:15.500 --> 00:00:27.760
<v Michael Kennedy>Yes, indeed. Happy Bastille Day to you. And this episode is brought to you by us, so check out our things. Courses over at Talk Python. I have many in the works, competing for what comes next, maybe Rust.

00:00:28.110 --> 00:00:30.540
<v Michael Kennedy>I think a Rust course is going to be next out the gate.

00:00:30.720 --> 00:00:33.440
<v Michael Kennedy>So we'll talk more about that at some point soon.

00:00:33.800 --> 00:00:40.020
<v Michael Kennedy>If you have a project and you would like some expert help for the really hard projects, reach out to Six Feet Up.

00:00:40.240 --> 00:00:42.080
<v Michael Kennedy>You can subscribe to our newsletter.

00:00:42.700 --> 00:00:44.240
<v Michael Kennedy>Got some nice announcements there.

00:00:44.800 --> 00:00:50.460
<v Michael Kennedy>Follow us on all the socials and watch us live or the replays on YouTube.

00:00:50.640 --> 00:00:53.160
<v Michael Kennedy>Every episode has a little YouTube thumbnail.

00:00:53.290 --> 00:00:54.520
<v Michael Kennedy>If you click it, guess what you get?

00:00:54.740 --> 00:00:55.760
<v Michael Kennedy>YouTube, YouTube version.

00:00:56.320 --> 00:00:59.500
<v Michael Kennedy>So we appreciate the people who are part of the live show, but definitely not required.

00:00:59.900 --> 00:01:05.239
<v Michael Kennedy>And with that, Calvin, I would say, I want to talk about the Eno Such blog.

00:01:06.120 --> 00:01:07.760
<v Michael Kennedy>Yes, who do you trust?

00:01:08.140 --> 00:01:08.520
<v Calvin Hendryx-Parker>It's interesting.

00:01:08.680 --> 00:01:13.720
<v Calvin Hendryx-Parker>This is actually a pair of blog posts that both came out last week on the 7th.

00:01:14.140 --> 00:01:17.140
<v Calvin Hendryx-Parker>One from William Woodruff, that's this blog right here.

00:01:17.450 --> 00:01:20.220
<v Calvin Hendryx-Parker>And the other one's actually from Brett Cannon, which I'll show here in a second.

00:01:20.480 --> 00:01:24.460
<v Calvin Hendryx-Parker>But they're both around trusted publishing and who you should trust.

00:01:25.300 --> 00:01:34.500
<v Calvin Hendryx-Parker>What I think is important to understand, and I think what they both emphasize in their posts, is that trusted publishing is not for you. It is for the machines. So if you're not familiar

00:01:34.600 --> 00:01:48.459
<v Calvin Hendryx-Parker>with trusted publishing, it is PyPI's OIDC-based auth scheme. So you can now, it's used by other groups too, NPM, RubyGems, Crates, and Nougat. They basically want to replace long-lived API

00:01:48.480 --> 00:01:59.720
<v Calvin Hendryx-Parker>tokens with short-lived auto-scoped credentials tied to the CI/CD machine identity. So this may sound really great and like you could trust everything coming out of these tools, but really

00:01:59.900 --> 00:02:11.760
<v Calvin Hendryx-Parker>what it's about is making sure places the software is coming from and going to is trusted. And you can actually see that in this post, William goes into why you shouldn't trust trusted publishing

00:02:12.160 --> 00:02:22.700
<v Calvin Hendryx-Parker>alone. And then the other post is actually from Brett Cannon, but that was actually quite interesting, which is how to publish to PyPI using GitHub Actions securely. And he actually

00:02:23.060 --> 00:02:27.740
<v Calvin Hendryx-Parker>mentions Zizmor, how do you pronounce that? Is that the right pronunciation of the tool?

00:02:28.200 --> 00:02:33.060
<v Calvin Hendryx-Parker>So William wrote the tool mentioned in here, and he also mentioned in his own post.

00:02:34.000 --> 00:02:45.080
<v Michael Kennedy>All right, the security episode I just did with the Python security folks, Mike Fiedler and Seth and Juanita, they called it Zizmor, I believe?

00:02:45.220 --> 00:02:46.340
<v Calvin Hendryx-Parker>We'll go Zizmor. We'll go Zizmor then.

00:02:46.920 --> 00:02:47.520
<v Calvin Hendryx-Parker>I believe.

00:02:48.340 --> 00:02:51.000
<v Calvin Hendryx-Parker>Mike would know, and Mike will correct me momentarily.

00:02:51.040 --> 00:02:51.340
<v Calvin Hendryx-Parker>I'm sure.

00:02:51.340 --> 00:02:53.360
<v Calvin Hendryx-Parker>But you've got to trust me.

00:02:53.480 --> 00:02:56.060
<v Michael Kennedy>I mean, speaking about trust, you've got to trust that I'm remembering this correctly.

00:02:56.060 --> 00:02:57.080
<v Calvin Hendryx-Parker>Right, they're remembering correctly.

00:02:57.720 --> 00:03:03.300
<v Calvin Hendryx-Parker>But this is a tool that will help you clear, make the CI/CD actions happy.

00:03:03.340 --> 00:03:16.040
<v Calvin Hendryx-Parker>So once you make Zizmor happy, it's going to reduce scopes of tokens and double check for things like the old API tokens being in existence and what their scopes may be.

00:03:16.520 --> 00:03:23.420
<v Calvin Hendryx-Parker>It'll also make sure that when you do a checkout in GitHub Actions, the credentials that are used for that checkout act as you.

00:03:23.700 --> 00:03:27.360
<v Calvin Hendryx-Parker>And then you can make sure that things like those remain short-lived.

00:03:27.600 --> 00:03:30.040
<v Calvin Hendryx-Parker>And so that those don't persist throughout the rest of that run.

00:03:30.800 --> 00:03:38.060
<v Calvin Hendryx-Parker>Keeping the building of your package or your software separate from the publishing of your package and the software.

00:03:38.200 --> 00:03:52.560
<v Calvin Hendryx-Parker>So keeping those kinds of concerns separate from one another helps you make sure that these kinds of attestations can be made and have some level of assurances that you're doing the right things, that things are going to the right places,

00:03:52.790 --> 00:04:07.500
<v Calvin Hendryx-Parker>that no one's exploiting something they shouldn't be. So it's a little bit of like least privilege wrapped around the ability to establish trust between the machines that are building and the machine that would be publishing it. If you want to see an example of this,

00:04:07.920 --> 00:04:09.680
<v Calvin Hendryx-Parker>You can look at the Zismore package.

00:04:10.260 --> 00:04:15.740
<v Calvin Hendryx-Parker>You'll see this is a Williams package that does the kind of work you need to make sure that you're doing the right practices.

00:04:16.359 --> 00:04:19.120
<v Calvin Hendryx-Parker>You'll see this verified details over here on PyPI.

00:04:19.579 --> 00:04:26.300
<v Calvin Hendryx-Parker>Again, this does not mean that this package is of a known quality, or you should definitely include it as a dependency into your system.

00:04:26.800 --> 00:04:39.720
<v Calvin Hendryx-Parker>It just means that these are verified and have come from trusted sources, that the person who is listed here as maintainer has some level of control or has exercised some proof of ownership over these pieces,

00:04:40.320 --> 00:04:45.640
<v Calvin Hendryx-Parker>you'll also notice in PyPI that there are unverified details like the homepage and documentation in this specific case.

00:04:45.720 --> 00:04:54.320
<v Calvin Hendryx-Parker>So you can look for those as levels of quality that you want to check into when you want to look into including a package like this.

00:04:54.700 --> 00:04:57.780
<v Calvin Hendryx-Parker>But don't confuse trusted with trustworthy.

00:04:59.280 --> 00:05:05.860
<v Calvin Hendryx-Parker>Make sure you have human judgment in the loop about the package you're getting ready to bring in to your potential project.

00:05:06.370 --> 00:05:13.160
<v Calvin Hendryx-Parker>This is no substitute also for securing your own CI pipeline or actually vetting the packages that you install.

00:05:13.420 --> 00:05:19.840
<v Calvin Hendryx-Parker>So stay diligent out there, but this is another great way to keep things tidy, secure, exercise some least privilege.

00:05:20.320 --> 00:05:23.260
<v Calvin Hendryx-Parker>If something does happen, it can help contain the blast radius.

00:05:23.590 --> 00:05:32.740
<v Calvin Hendryx-Parker>If something were to sneak into your CI pipeline and try and exploit something that it shouldn't, hopefully you've narrowed down the scopes for the OIDC tokens so that they couldn't do those actions.

00:05:33.100 --> 00:05:33.880
<v Michael Kennedy>Sounds good to me.

00:05:34.220 --> 00:05:34.320
<v Michael Kennedy>Yeah.

00:05:35.160 --> 00:05:38.460
<v Michael Kennedy>William Woodruff is, by the way, from the Astral team.

00:05:38.880 --> 00:05:39.000
<v Michael Kennedy>Yes.

00:05:39.580 --> 00:05:40.980
<v Michael Kennedy>And uv and all that.

00:05:41.180 --> 00:05:43.300
<v Michael Kennedy>So they've thought a little bit about this.

00:05:43.640 --> 00:05:43.820
<v Calvin Hendryx-Parker>Yeah.

00:05:43.940 --> 00:05:47.700
<v Calvin Hendryx-Parker>So, I mean, table stakes, just use this tool no matter what.

00:05:48.280 --> 00:05:54.220
<v Calvin Hendryx-Parker>It's going to give you at least some level of clarity around your current state of operations for the CI/CD pipeline.

00:05:54.620 --> 00:05:54.780
<v Michael Kennedy>Yeah.

00:05:54.920 --> 00:06:00.820
<v Michael Kennedy>I asked at the end of the Talk Python episode was about there's a whole security track at PyCon.

00:06:01.120 --> 00:06:06.000
<v Michael Kennedy>I said, let's go through that, all the talks there and kind of like talk about the arc that that's telling about Python security, right?

00:06:06.300 --> 00:06:06.400
<v Calvin Hendryx-Parker>Yeah.

00:06:06.820 --> 00:06:11.420
<v Michael Kennedy>And at the end, I said, what is one thing people can do to be better at Python security?

00:06:11.590 --> 00:06:13.820
<v Michael Kennedy>I think two out of three people said Sismar.

00:06:14.060 --> 00:06:14.200
<v Michael Kennedy>Yeah.

00:06:14.430 --> 00:06:14.900
<v Michael Kennedy>Just use it.

00:06:15.220 --> 00:06:15.340
<v Calvin Hendryx-Parker>Yep.

00:06:15.760 --> 00:06:24.720
<v Calvin Hendryx-Parker>And Brett Cannon's post here is a really just a straight walkthrough of the three or four things you should just be doing out of the box by default.

00:06:25.120 --> 00:06:26.040
<v Calvin Hendryx-Parker>So follow his instructions.

00:06:26.270 --> 00:06:28.820
<v Calvin Hendryx-Parker>He knows a lot of this stuff, you know, better than we all do.

00:06:29.220 --> 00:06:34.660
<v Calvin Hendryx-Parker>I trust Brett and Brett will make sure you get trusted publishing in place, but don't just trust it blindly.

00:06:35.110 --> 00:06:35.260
<v Michael Kennedy>Okay.

00:06:35.800 --> 00:06:35.960
<v Michael Kennedy>Amazing.

00:06:36.340 --> 00:06:36.900
<v Michael Kennedy>Michael, what you got?

00:06:37.260 --> 00:06:42.140
<v Michael Kennedy>I want to talk about what I thought would be just a small little extra at the end.

00:06:42.140 --> 00:06:42.840
<v Michael Kennedy>Oh, hey everyone.

00:06:43.360 --> 00:06:46.980
<v Michael Kennedy>New release, point release, Jupyter Notebooks and JupyterLab.

00:06:47.360 --> 00:06:47.440
<v Michael Kennedy>Nope.

00:06:47.720 --> 00:06:47.820
<v Michael Kennedy>Nope.

00:06:47.980 --> 00:06:48.920
<v Michael Kennedy>It is a lot.

00:06:49.100 --> 00:06:52.220
<v Michael Kennedy>And let me just jump to the end here and I don't need to see a pop up.

00:06:52.380 --> 00:06:52.720
<v Michael Kennedy>That's fine.

00:06:53.639 --> 00:06:57.480
<v Michael Kennedy>It says, as large as minor releases get, basically.

00:06:58.860 --> 00:06:59.720
<v Michael Kennedy>So Jupyter Lab.

00:07:00.000 --> 00:07:01.160
<v Calvin Hendryx-Parker>Pumped right up against the ceiling.

00:07:02.000 --> 00:07:02.260
<v Michael Kennedy>Exactly.

00:07:02.380 --> 00:07:06.380
<v Michael Kennedy>They're like, we almost called it a new release, but we didn't want to update the docs dropdown.

00:07:08.660 --> 00:07:19.100
<v Michael Kennedy>So it says this Jupyter Lab release includes 68 new features, 97 bug fixes, 38 documentation improvements, 95 contributors, and 171 maintenance tasks.

00:07:19.540 --> 00:07:19.960
<v Michael Kennedy>Very minor.

00:07:21.080 --> 00:07:25.060
<v Michael Kennedy>I would just call this, like, you know, consider it a pretty big release, let's say.

00:07:25.340 --> 00:07:26.220
<v Michael Kennedy>So there's a couple of things.

00:07:26.400 --> 00:07:33.920
<v Michael Kennedy>And I think probably the most efficient way is to just pull up this little diagram that they've annotated of Jupyter's JupyterLab.

00:07:34.260 --> 00:07:35.840
<v Michael Kennedy>By the way, you can test this out online.

00:07:36.880 --> 00:07:39.980
<v Michael Kennedy>And there's a test it in JupyterLite.

00:07:40.100 --> 00:07:41.220
<v Michael Kennedy>Are you familiar with JupyterLite?

00:07:41.540 --> 00:07:41.820
<v Calvin Hendryx-Parker>No.

00:07:42.100 --> 00:07:46.180
<v Michael Kennedy>So if we go to JupyterLite, available in JupyterLite.

00:07:46.180 --> 00:07:47.760
<v Michael Kennedy>Let me click that and just see what happens.

00:07:48.140 --> 00:07:49.540
<v Michael Kennedy>I'm glad that that opened a new window.

00:07:50.100 --> 00:07:57.620
<v Michael Kennedy>So JupyterLite is basically a WASM WebAssembly powered Jupyter and uses local storage and stuff for it.

00:07:57.720 --> 00:08:00.660
<v Michael Kennedy>So like I'm pulling up here and there you have it.

00:08:00.800 --> 00:08:03.240
<v Michael Kennedy>Like full on JupyterLab, but running JupyterLite.

00:08:03.500 --> 00:08:04.480
<v Michael Kennedy>Like in a browser, right?

00:08:04.760 --> 00:08:05.160
<v Michael Kennedy>In the browser.

00:08:05.580 --> 00:08:06.300
<v Michael Kennedy>That is pretty sweet.

00:08:06.680 --> 00:08:07.020
<v Michael Kennedy>Yeah, yeah, yeah.

00:08:07.160 --> 00:08:09.620
<v Michael Kennedy>Like full client side, nothing but just a download there.

00:08:09.900 --> 00:08:10.880
<v Calvin Hendryx-Parker>Well, I think that's a smart move.

00:08:11.660 --> 00:08:12.040
<v Michael Kennedy>Yeah, yeah.

00:08:12.100 --> 00:08:13.020
<v Michael Kennedy>So you can test this out.

00:08:13.260 --> 00:08:17.000
<v Calvin Hendryx-Parker>Bring your Jupyter notebook to your data wherever it lives.

00:08:17.400 --> 00:08:17.780
<v Michael Kennedy>Exactly.

00:08:18.180 --> 00:08:19.420
<v Michael Kennedy>It's all powered by Pyodide.

00:08:19.700 --> 00:08:21.200
<v Michael Kennedy>So you can test these changes out there.

00:08:21.220 --> 00:08:22.280
<v Michael Kennedy>But let me pull up the little diagram.

00:08:22.740 --> 00:08:28.120
<v Michael Kennedy>And it says you have a new activity bar options, like files or extensions or whatever.

00:08:28.480 --> 00:08:29.460
<v Michael Kennedy>There's a breadcrumb.

00:08:29.640 --> 00:08:33.340
<v Michael Kennedy>So like on the left in JupyterLab, you've got a file browser.

00:08:33.440 --> 00:08:38.219
<v Michael Kennedy>So you can open Python or IPYNB files.

00:08:38.599 --> 00:08:40.580
<v Michael Kennedy>And now there's a breadcrumb that you can edit.

00:08:41.180 --> 00:08:47.520
<v Michael Kennedy>macOS should take this to heart, please, someday, maybe, that you can just type up there.

00:08:48.320 --> 00:08:49.580
<v Michael Kennedy>And it'll say, you're in this directory.

00:08:49.620 --> 00:08:51.240
<v Michael Kennedy>and you put your cursor there, and guess what you can do?

00:08:51.510 --> 00:08:54.180
<v Michael Kennedy>You can go to a subdirectory or another folder.

00:08:55.040 --> 00:08:56.100
<v Michael Kennedy>Very cool, so that's there.

00:08:57.300 --> 00:08:59.660
<v Michael Kennedy>I guess it was missing that it didn't show the creation date.

00:08:59.930 --> 00:09:03.440
<v Michael Kennedy>It only showed modified in Files before, so now you can figure out the creation dates.

00:09:03.760 --> 00:09:09.120
<v Michael Kennedy>You can move the sections in that whole left panel, and I guess the right one around as well.

00:09:09.480 --> 00:09:12.700
<v Michael Kennedy>You can take stuff out of the sidebar, like widgets out of the sidebar.

00:09:12.900 --> 00:09:17.240
<v Michael Kennedy>That's kind of cool, and make them more top level, so you can create a feeling that you might like this.

00:09:17.680 --> 00:09:20.660
<v Michael Kennedy>Calvin, you can create this like custom layout here.

00:09:21.040 --> 00:09:22.180
<v Calvin Hendryx-Parker>Yeah, I do like my tiles.

00:09:22.640 --> 00:09:27.700
<v Michael Kennedy>Yeah, it's got a kind of a VS Code like dropdown when you hit play for the debugger.

00:09:28.030 --> 00:09:29.680
<v Michael Kennedy>So that kind of drops in right in the middle.

00:09:29.840 --> 00:09:32.620
<v Michael Kennedy>So it's easy to understand your debugging and chase that around.

00:09:33.280 --> 00:09:35.800
<v Michael Kennedy>You can add hotkeys from the editor.

00:09:36.170 --> 00:09:39.500
<v Michael Kennedy>It has a cell number count in the debugger.

00:09:39.660 --> 00:09:42.600
<v Michael Kennedy>You can like filter out your different sources and interact with the kernel.

00:09:43.160 --> 00:09:47.240
<v Michael Kennedy>And you can go forwards and backwards in history of your edits.

00:09:47.640 --> 00:09:56.880
<v Michael Kennedy>So one of the things that's kind of chaotic, you know, chaotic good, I guess, of character of Jupyter is that you can edit and execute things in different orders.

00:09:57.440 --> 00:09:57.520
<v Michael Kennedy>Yeah.

00:09:58.920 --> 00:10:02.440
<v Calvin Hendryx-Parker>It's mind bendy and will mess most new people up for sure.

00:10:02.540 --> 00:10:03.160
<v Calvin Hendryx-Parker>Yes, exactly.

00:10:03.480 --> 00:10:07.180
<v Michael Kennedy>It's like, oh, go to is bad, but maybe you could just manually go to at whim.

00:10:07.700 --> 00:10:13.160
<v Michael Kennedy>Anyway, one of the features is you can jump forwards and backwards in terms of last edits.

00:10:13.680 --> 00:10:18.340
<v Michael Kennedy>So maybe you edited cell seven and then cell 22 and then 20.

00:10:18.760 --> 00:10:20.780
<v Michael Kennedy>So you can jump around in that through like some UI.

00:10:21.240 --> 00:10:23.280
<v Calvin Hendryx-Parker>So it's like a history order of like where you've been.

00:10:23.640 --> 00:10:25.140
<v Calvin Hendryx-Parker>Yeah, it's like a back forward button.

00:10:25.540 --> 00:10:29.240
<v Calvin Hendryx-Parker>Now if I could just have something similar in Slack to know where the heck I've been in Slack.

00:10:29.520 --> 00:10:30.040
<v Calvin Hendryx-Parker>That's fair.

00:10:30.420 --> 00:10:31.020
<v Calvin Hendryx-Parker>That's totally fair.

00:10:31.700 --> 00:10:33.100
<v Michael Kennedy>Let me just flip through, see what else there is.

00:10:33.180 --> 00:10:34.060
<v Michael Kennedy>There's a bunch of other things.

00:10:34.070 --> 00:10:35.300
<v Michael Kennedy>Like there's only some of them, right?

00:10:35.420 --> 00:10:37.020
<v Michael Kennedy>That's just the stuff they had annotated.

00:10:37.200 --> 00:10:41.400
<v Michael Kennedy>The terminal is a little more, how shall we say, coding agent friendly.

00:10:41.800 --> 00:10:43.700
<v Michael Kennedy>So you can open stuff in the terminal.

00:10:44.740 --> 00:10:46.380
<v Michael Kennedy>Oh, we should get nerd fonts.

00:10:46.450 --> 00:10:48.300
<v Michael Kennedy>I don't know if you can put nerd fonts in there or not.

00:10:48.960 --> 00:10:51.560
<v Michael Kennedy>But there's a way they say it.

00:10:51.700 --> 00:10:52.480
<v Michael Kennedy>That's not it.

00:10:52.960 --> 00:10:53.020
<v Michael Kennedy>Yeah.

00:10:53.370 --> 00:10:57.100
<v Michael Kennedy>So the terminal no longer traps keyboard focus, which is interesting.

00:10:57.420 --> 00:10:58.200
<v Michael Kennedy>And here we go.

00:10:58.340 --> 00:10:59.120
<v Michael Kennedy>This is the one.

00:10:59.440 --> 00:11:04.300
<v Michael Kennedy>Pressing shift enter in the terminal now inserts a new line without executing the current line.

00:11:04.620 --> 00:11:08.880
<v Michael Kennedy>This matches the behavior expected by certain terminal applications.

00:11:09.260 --> 00:11:10.540
<v Michael Kennedy>I wonder which ones those are.

00:11:11.340 --> 00:11:11.960
<v Calvin Hendryx-Parker>It's a...

00:11:12.040 --> 00:11:15.200
<v Calvin Hendryx-Parker>Pi, Claude Code, et cetera, et cetera, right?

00:11:15.440 --> 00:11:27.100
<v Calvin Hendryx-Parker>The annoying thing is that some of the web UI versions of those tools uses like command enter or control enter or shift enter instead of a standard shift enter.

00:11:27.440 --> 00:11:33.320
<v Calvin Hendryx-Parker>I had to fix that for some folks around here who wanted the consistency between OpenAI and Anthropic tooling.

00:11:33.760 --> 00:11:34.100
<v Calvin Hendryx-Parker>That's fair.

00:11:34.440 --> 00:11:34.560
<v Calvin Hendryx-Parker>Yeah.

00:11:35.220 --> 00:11:36.800
<v Michael Kennedy>So I think I'm going to leave it there.

00:11:36.880 --> 00:11:40.100
<v Michael Kennedy>There's a bunch more features, as you can see, and I kind of called out and so on.

00:11:40.140 --> 00:11:45.160
<v Michael Kennedy>But yeah, it's if you notebook and especially if you do stuff with Jupyter, a lot of changes there.

00:11:45.480 --> 00:11:45.840
<v Michael Kennedy>People can.

00:11:46.040 --> 00:11:49.900
<v Calvin Hendryx-Parker>I mean, it looks like they got a ton of new features, like a lot of like creature comforts.

00:11:50.440 --> 00:11:55.440
<v Calvin Hendryx-Parker>That's pretty exciting for folks who are living day in and day out in the Jupyter notebook, Jupyter server world.

00:11:55.620 --> 00:12:01.160
<v Calvin Hendryx-Parker>But let's talk about another AI agent that got released very, very recently.

00:12:01.300 --> 00:12:02.800
<v Calvin Hendryx-Parker>This is probably within the last two weeks.

00:12:03.200 --> 00:12:08.760
<v Calvin Hendryx-Parker>The fine folks at Hugging Face have released Tau, which is two times pi.

00:12:09.480 --> 00:12:14.040
<v Calvin Hendryx-Parker>and it is a agent built mimicking a lot of pies.

00:12:15.699 --> 00:12:22.280
<v Calvin Hendryx-Parker>I think they were inspired by the fact that how minimalistic pie was, but they wanted pie to do some other things.

00:12:22.850 --> 00:12:29.220
<v Calvin Hendryx-Parker>And most of it being written in Python, watching it and teach you how it is working under the cover.

00:12:29.250 --> 00:12:39.280
<v Calvin Hendryx-Parker>So part of the goals with this coding agent is actually to have small readable layers, have it output back to you what it is working on, what it's doing.

00:12:39.900 --> 00:12:51.420
<v Calvin Hendryx-Parker>A lot of that gets kind of, if you've ever used Claude Code or even Pi, you'll see a lot of thinking dot, dot, dot, or, you know, conjugulating, whatever the verb of the randomizer put in there for you.

00:12:51.880 --> 00:12:54.280
<v Calvin Hendryx-Parker>But it kind of hides what's going on under the covers.

00:12:54.400 --> 00:12:55.800
<v Calvin Hendryx-Parker>But here, this is actually the opposite.

00:12:56.000 --> 00:12:57.500
<v Calvin Hendryx-Parker>They're trying to know hidden machinery.

00:12:57.840 --> 00:12:59.660
<v Calvin Hendryx-Parker>Every moving part is put on the page.

00:13:00.200 --> 00:13:02.740
<v Calvin Hendryx-Parker>I think it's kind of, it's pretty, I tried it out yesterday.

00:13:03.520 --> 00:13:04.880
<v Calvin Hendryx-Parker>The models become streams.

00:13:04.920 --> 00:13:17.340
<v Calvin Hendryx-Parker>you basically want to build an agent loop. So tau, it's going to be hard not to say pi, tau is made up of three pieces, the tau AI, the tau agent, and the tau coding. And any of these

00:13:17.500 --> 00:13:30.179
<v Calvin Hendryx-Parker>pieces are able to be swapped out. So the idea is you could make your own front ends for the tau coding part of this, build your own TUI, CLI, shell scripts, tools, et cetera, that are on the front

00:13:30.200 --> 00:13:40.660
<v Calvin Hendryx-Parker>of that. What's nice is every part is visible. If you've used one of the things I liked about Claude Cowork is it on the sidebar inside of Claude Cowork, it shows you like the to-do list it's

00:13:40.760 --> 00:13:55.719
<v Calvin Hendryx-Parker>putting together for the actions it's going to take. It shows you which skills have been picked up and used, which connectors got pulled into the context window. This one goes a step further and shows you what tools are currently active in the current window. If there's anything else

00:13:55.740 --> 00:14:07.260
<v Calvin Hendryx-Parker>interesting down through here. One thing I wanted, I'll just, let me just show it. I've got it running over here. I will unshare this bit here and I'll put my terminal in here. This will be

00:14:07.500 --> 00:14:13.900
<v Calvin Hendryx-Parker>obviously live real-time potential danger, but it's kind of pretty. I'm here for it. I'm here for it.

00:14:13.900 --> 00:14:22.300
<v Michael Kennedy>I saw many people say, oh, you should never do demos. I'm like, you know what? No, that makes it real. Let's do it. Yeah. Seeing on the left-hand bar here, you've got details about the session,

00:14:22.420 --> 00:14:27.040
<v Calvin Hendryx-Parker>what provider you're currently running, what level of thinking, number of tools, number of skills.

00:14:27.480 --> 00:14:40.840
<v Calvin Hendryx-Parker>I think this is important because a lot of this gets hidden under the covers when you're using Claude Code. Unless you go and investigate and kind of ask it specifically what it's using in its current context window, I like having this available because then you could see something get out of

00:14:40.960 --> 00:14:50.660
<v Calvin Hendryx-Parker>hand. If there's all of a sudden brought in 20 tools and the context window is exploding and you're not sure why you're getting back poor results, this would surface that sooner for you.

00:14:51.060 --> 00:14:52.600
<v Calvin Hendryx-Parker>You can see what skills are currently loaded.

00:14:52.900 --> 00:14:55.260
<v Calvin Hendryx-Parker>Actually, that skill I wrote as part of this session.

00:14:55.640 --> 00:15:02.240
<v Calvin Hendryx-Parker>So I came in and I said, let's build a memory system for my AI agents.

00:15:02.540 --> 00:15:07.980
<v Calvin Hendryx-Parker>And so the memory system, then I kind of asked it for an explanation about what a memory system would be.

00:15:08.480 --> 00:15:09.060
<v Calvin Hendryx-Parker>And you can see it.

00:15:09.200 --> 00:15:15.600
<v Calvin Hendryx-Parker>It's really more like reading a textbook than it is having it code up the just the code for you.

00:15:15.700 --> 00:15:17.380
<v Calvin Hendryx-Parker>So it really gives you full examples.

00:15:17.620 --> 00:15:20.220
<v Michael Kennedy>I'm getting a little bit of notebook vibes.

00:15:20.320 --> 00:15:25.780
<v Michael Kennedy>actually it's got a little bit of like a storytelling UI. That's the goal is for it to tell

00:15:25.830 --> 00:15:37.160
<v Calvin Hendryx-Parker>you as it goes teach you even here it doesn't need to output all this to do its work it's outputting all this to help you understand and that was me asking it about dictionaries but then I went in

00:15:37.220 --> 00:15:47.279
<v Calvin Hendryx-Parker>and was like okay from the dictionary let's let's start a new here it is the memory piece right here we've got the idea of semantic memory episodic memory and procedural memory and so it explains

00:15:47.300 --> 00:15:53.200
<v Calvin Hendryx-Parker>each of those terms to you, what the goals are, you know, what the memory retrieval loop would be.

00:15:53.850 --> 00:16:04.220
<v Calvin Hendryx-Parker>And this was just the explanation. At some point, then I said, okay, great. Build me a simple memory system that understands episodic, semantic, and procedural memory. So then it goes into planning.

00:16:04.760 --> 00:16:17.860
<v Calvin Hendryx-Parker>It looks at what's already inside the system, created the whole first couple of modules, created some documentation, and then it shows me how to run it. At some point, I'm like, oh, updateagents.md to make sure we're always using uv. So if you want to check out Tau,

00:16:18.290 --> 00:16:26.560
<v Calvin Hendryx-Parker>you can uv install, tool install tau-ai, and that will get you the Tau CLI ready for you to use.

00:16:27.320 --> 00:16:39.160
<v Calvin Hendryx-Parker>It is, again, very early days. It is only a couple weeks old, but I'm a learner at heart, so I love the idea of having this explained to me so that I understand what's going on. I can make

00:16:39.160 --> 00:16:48.840
<v Calvin Hendryx-Parker>better decisions about the code and I can have fun playing at the same time. So this actually built the skill, installed the skill into the system, and now is using its own skill for memory. So again,

00:16:49.040 --> 00:16:58.840
<v Calvin Hendryx-Parker>that essence of Pi where you build your extensions, you make your coding environment the way you want it to be. That's what they're trying to take, but also with more of the explainer going on behind

00:16:58.860 --> 00:17:13.000
<v Michael Kennedy>the scenes too. So pretty cool. It actually reminds me a little bit of Hermes, which I talked about last week in the sense that it's kind of self-improving and you can sort of change around the pieces honestly this inspires me a little bit more than Claude Code the terminal version well and

00:17:13.060 --> 00:17:27.260
<v Calvin Hendryx-Parker>that's the piece i didn't do yet is like in the docs and talk about it is take this to the next level by establishing what your harness looks like and then you create a loop you add the looping part to it to schedule and do work so i was one step away from i've got memory now i can now create the

00:17:27.300 --> 00:17:42.140
<v Michael Kennedy>loop and have it set it loose on tasks yeah very neat very cool i see you got yeah you've got gpt 5.5 yeah have you tried 5.6 soul or any of these i have not yet no i haven't had a chance to um i i did

00:17:42.170 --> 00:17:47.420
<v Calvin Hendryx-Parker>the most basic of basic thing i said slash login open ai and that's what it gave me like let's go

00:17:48.580 --> 00:17:53.720
<v Michael Kennedy>perfect well it definitely definitely looks really cool yeah so thanks to the fine folks over hugging

00:17:53.960 --> 00:17:58.700
<v Calvin Hendryx-Parker>face they're doing still doing great work over there year after year love it yeah also i was

00:17:58.760 --> 00:18:11.680
<v Michael Kennedy>gonna say like you said it has a kind of like just getting started vibes and so on and i would be a little bit, not concerned, but just hesitant to go all in on something that's like a side project of someone's, but hugging face.

00:18:12.180 --> 00:18:16.240
<v Calvin Hendryx-Parker>Yeah, and it's already got like 1500 GitHub stars.

00:18:17.060 --> 00:18:18.020
<v Calvin Hendryx-Parker>I think I like it.

00:18:18.120 --> 00:18:18.460
<v Calvin Hendryx-Parker>It's beautiful.

00:18:18.820 --> 00:18:19.740
<v Calvin Hendryx-Parker>It does look nice.

00:18:19.800 --> 00:18:21.400
<v Calvin Hendryx-Parker>It shows me all the information I want to see.

00:18:21.880 --> 00:18:22.380
<v Calvin Hendryx-Parker>That's important.

00:18:22.560 --> 00:18:25.060
<v Calvin Hendryx-Parker>I'm about the experience of my workstation.

00:18:25.360 --> 00:18:26.700
<v Calvin Hendryx-Parker>So this definitely falls into that.

00:18:27.180 --> 00:18:36.560
<v Michael Kennedy>Yeah, and I think the other thing is I really like how it shows you and what it's doing and how it's thinking because it's so easy to just make these things become an easy button, turn your brain off and go.

00:18:36.830 --> 00:18:39.760
<v Michael Kennedy>But on the other side, it can be an incredible learning thing.

00:18:39.800 --> 00:18:40.420
<v Michael Kennedy>You're like, what?

00:18:40.980 --> 00:18:42.880
<v Michael Kennedy>Okay, I don't make, that is actually new to me.

00:18:43.000 --> 00:18:43.880
<v Michael Kennedy>Tell me what that does.

00:18:43.960 --> 00:18:44.740
<v Michael Kennedy>Why are you doing this?

00:18:44.810 --> 00:18:45.320
<v Michael Kennedy>You know what I mean?

00:18:45.420 --> 00:18:47.980
<v Michael Kennedy>If you don't know what's happening, how do you know to ask that?

00:18:48.200 --> 00:18:49.820
<v Calvin Hendryx-Parker>Well, it's funny because I asked about memories.

00:18:50.380 --> 00:18:54.060
<v Calvin Hendryx-Parker>And so it actually looked into its memories and obviously says user prefers uv.

00:18:54.480 --> 00:18:58.680
<v Calvin Hendryx-Parker>And then I love to execute Python from uv and I created a simple memory system.

00:18:59.060 --> 00:19:01.440
<v Calvin Hendryx-Parker>So it's already using its own memory system they built.

00:19:01.720 --> 00:19:07.320
<v Calvin Hendryx-Parker>with two prompts. That's awesome. Yeah. Super cool. Very cool. All right. If you're going to have a

00:19:07.800 --> 00:19:13.200
<v Michael Kennedy>some kind of agent, you probably want to run it in the background. So let's talk about Django.

00:19:13.660 --> 00:19:28.319
<v Michael Kennedy>I just had a really cool episode with Carlton Gibson over on Talk Python about, he basically rewrote Django's async documentation saying it's gotten really out. It was really out of date and it had a lot of warnings like, oh, you shouldn't do this or this won't perform that well. And they're

00:19:28.340 --> 00:19:42.900
<v Michael Kennedy>actually like, you know what? That's not true. The stuff is really good now. You should probably use async in Django, but our docs tell people they should be weary. So let me rewrite that. And part of that conversation, we talked about Django's new task framework, which is part of version 6,

00:19:43.440 --> 00:19:57.160
<v Michael Kennedy>6.0. So, so often you have got to think like, all right, well, I'm working on some requests and maybe it's slow. So I could use async and await on it potentially, but a better way often is like people don't actually even need the response.

00:19:57.590 --> 00:19:58.720
<v Michael Kennedy>They don't need to wait on this.

00:19:58.840 --> 00:20:00.840
<v Michael Kennedy>Like I'm going to send you a reset email.

00:20:01.500 --> 00:20:04.660
<v Michael Kennedy>Email already is oddly asynchronous and non-verifiable.

00:20:04.850 --> 00:20:09.080
<v Michael Kennedy>So what are you going to, you're going to send an email and like what, wait for a pixel to open before you respond?

00:20:09.140 --> 00:20:10.000
<v Michael Kennedy>Like you can't do that, right?

00:20:10.000 --> 00:20:11.940
<v Michael Kennedy>You just got to just send it and let it go.

00:20:12.110 --> 00:20:18.080
<v Michael Kennedy>And so a lot of times people would do something like Celery or RabbitMQ or some other mechanism to run.

00:20:18.270 --> 00:20:19.220
<v Michael Kennedy>Which is heavy, yeah, very heavy.

00:20:19.480 --> 00:20:19.940
<v Michael Kennedy>Yeah, exactly.

00:20:20.220 --> 00:20:28.980
<v Michael Kennedy>It's like you've gone from running like a single worker and a platform as a service to Now you've got a DevOps and a virtual private network for your servers to live in.

00:20:29.540 --> 00:20:31.280
<v Michael Kennedy>It's like a huge jump, right?

00:20:31.740 --> 00:20:35.960
<v Michael Kennedy>So this task framework kind of attempts to solve that in a framework-y way.

00:20:36.260 --> 00:20:41.380
<v Michael Kennedy>What you can do is it's not exactly a task execution story.

00:20:41.540 --> 00:20:49.180
<v Michael Kennedy>It's more of a way to like, I guess, like an adapter or a facade type of design pattern that says, here's how you program tasks in Django.

00:20:49.280 --> 00:20:54.900
<v Michael Kennedy>the task backend that you stick in it means maybe it still goes to Celery or maybe it runs in a background thread.

00:20:55.160 --> 00:20:55.540
<v Michael Kennedy>I don't know.

00:20:56.400 --> 00:20:57.040
<v Michael Kennedy>We'll figure that out.

00:20:57.100 --> 00:20:58.960
<v Michael Kennedy>You configure the thing in different ways.

00:20:59.240 --> 00:20:59.480
<v Michael Kennedy>All right.

00:20:59.680 --> 00:21:01.220
<v Michael Kennedy>So basically that's how it works.

00:21:01.540 --> 00:21:02.620
<v Michael Kennedy>You set up your tasks.

00:21:02.840 --> 00:21:04.080
<v Michael Kennedy>You define the backend.

00:21:04.180 --> 00:21:07.500
<v Michael Kennedy>There's only one that comes with it and it's oddly unsatisfying to me.

00:21:07.860 --> 00:21:13.220
<v Michael Kennedy>It's the immediate execution backend, which means like when you enqueue a task, it just blocks and executes.

00:21:13.260 --> 00:21:15.040
<v Michael Kennedy>It goes, okay, it's enqueued when it's done.

00:21:15.980 --> 00:21:20.440
<v Michael Kennedy>And really that's just for execution as a developer so you don't have to set up anything.

00:21:21.040 --> 00:21:26.820
<v Michael Kennedy>I'll tell you what I wish was actually in there for development and for like 75% of all deployments.

00:21:27.100 --> 00:21:28.700
<v Michael Kennedy>There's also the dummy backend.

00:21:29.880 --> 00:21:34.060
<v Michael Kennedy>They missed a chance at like the null backend, like the null pattern.

00:21:34.220 --> 00:21:38.060
<v Michael Kennedy>Like here's the thing you don't have to check for null or see if it's configured, but it just does nothing, right?

00:21:38.320 --> 00:21:39.560
<v Michael Kennedy>So this is for like testing.

00:21:40.000 --> 00:21:42.580
<v Michael Kennedy>So you can enqueue things and so on and like, you know what?

00:21:42.900 --> 00:21:43.920
<v Michael Kennedy>No, nothing happened.

00:21:44.980 --> 00:21:50.700
<v Michael Kennedy>Basically like a built-in way to say turn off tasks, which is, I would imagine, really just for testing.

00:21:51.480 --> 00:21:55.160
<v Michael Kennedy>Anyway, so there's third-party backends, and there's an ecosystem here.

00:21:55.160 --> 00:21:56.320
<v Michael Kennedy>It also has async support.

00:21:56.680 --> 00:21:58.060
<v Michael Kennedy>Yeah, that's what I was going to say.

00:21:58.360 --> 00:21:59.340
<v Michael Kennedy>Yeah, that's pretty neat.

00:21:59.800 --> 00:22:01.280
<v Michael Kennedy>So a lot of cool stuff here.

00:22:02.180 --> 00:22:06.700
<v Michael Kennedy>You can just put the at task decorator on a function, and it's now a task and so on.

00:22:07.020 --> 00:22:08.860
<v Calvin Hendryx-Parker>This is so nice compared to what it used to be.

00:22:08.960 --> 00:22:20.240
<v Calvin Hendryx-Parker>So Django has had this level of ability, like with Django channels and async and workers, backend workers, but the usability of it as a developer was always tricky.

00:22:20.660 --> 00:22:22.180
<v Calvin Hendryx-Parker>Like it wasn't very well published.

00:22:22.240 --> 00:22:23.860
<v Calvin Hendryx-Parker>It wasn't, it was hard to use.

00:22:23.860 --> 00:22:28.760
<v Calvin Hendryx-Parker>You had to do a little bit of, we did this back in 2020 when we first launched the Loudswarm platform.

00:22:29.420 --> 00:22:35.100
<v Calvin Hendryx-Parker>We had to use background async workers like that to establish connections, WebSocket connections to things like Discord.

00:22:35.700 --> 00:22:38.540
<v Calvin Hendryx-Parker>And it was some gymnastics to make it work.

00:22:38.700 --> 00:22:39.940
<v Calvin Hendryx-Parker>This looks so much nicer.

00:22:40.840 --> 00:22:49.200
<v Calvin Hendryx-Parker>So thank you all to whoever put in the effort to make this usability and the API, the usability as a developer for this to be so nice.

00:22:49.460 --> 00:22:50.660
<v Michael Kennedy>Yeah, it looks really, really nice.

00:22:50.670 --> 00:22:52.880
<v Michael Kennedy>And then the community stuff is good.

00:22:53.180 --> 00:22:59.740
<v Michael Kennedy>Yeah, Loudsworn being your online conference stuff that you launched at a very timely time of 2020.

00:23:01.400 --> 00:23:01.580
<v Michael Kennedy>Definitely.

00:23:02.080 --> 00:23:10.580
<v Michael Kennedy>So for 75% of the people, I would recommend, I would point them at this project by Lincoln Loop called Django Tasks Local.

00:23:11.100 --> 00:23:16.940
<v Michael Kennedy>And the idea here is it uses either threading or processing backends.

00:23:17.840 --> 00:23:22.860
<v Michael Kennedy>No Celery, no Redis, no database, no configuration necessary, right?

00:23:23.060 --> 00:23:23.860
<v Michael Kennedy>So this is really cool.

00:23:23.860 --> 00:23:27.760
<v Michael Kennedy>You basically just plug this in, and then when you run it, it just runs in a background thread.

00:23:28.220 --> 00:23:31.180
<v Michael Kennedy>And so it really does immediately return, and it really does do these things.

00:23:31.540 --> 00:23:39.820
<v Michael Kennedy>The one thing that you've really given up here, I guess, depending on what you choose in Threadpool, until you do free-threaded Python, you're still subject to the guild.

00:23:40.240 --> 00:23:44.340
<v Michael Kennedy>But most of these background tasks are not heavily computational.

00:23:44.960 --> 00:23:45.900
<v Michael Kennedy>They're talking to a database.

00:23:46.320 --> 00:23:47.800
<v Michael Kennedy>They're talking to a SMTP.

00:23:47.960 --> 00:23:48.620
<v Calvin Hendryx-Parker>There's some kind of weight.

00:23:49.080 --> 00:23:50.260
<v Calvin Hendryx-Parker>Yeah, it's not a lot of CPU.

00:23:50.480 --> 00:23:56.780
<v Calvin Hendryx-Parker>It's mostly probably IO weight, or you just need to be unbounded and get a quick response back to your end users.

00:23:57.360 --> 00:23:59.460
<v Calvin Hendryx-Parker>Or you have startup tasks.

00:23:59.720 --> 00:24:00.900
<v Calvin Hendryx-Parker>That was the thing we needed it for.

00:24:01.060 --> 00:24:02.460
<v Calvin Hendryx-Parker>We needed something to happen at Django startup.

00:24:03.120 --> 00:24:03.600
<v Michael Kennedy>Oh, interesting.

00:24:03.890 --> 00:24:04.000
<v Michael Kennedy>Okay.

00:24:04.540 --> 00:24:05.380
<v Michael Kennedy>So you just fire that off.

00:24:05.620 --> 00:24:08.560
<v Michael Kennedy>Yes, you could choose process backend if you really want like true separation.

00:24:08.790 --> 00:24:11.040
<v Michael Kennedy>The one thing that you're giving up here is durability, right?

00:24:11.220 --> 00:24:17.800
<v Michael Kennedy>Like if you deploy a new version and the task thing is grinding through some tasks and Docker says, time for a new one, goodbye.

00:24:20.160 --> 00:24:27.660
<v Calvin Hendryx-Parker>Yeah, well, you go into it knowing that I's wide open and you account for, I'm okay if it dies, but I know how to handle recovery.

00:24:27.960 --> 00:24:28.340
<v Michael Kennedy>Yeah, sure.

00:24:28.780 --> 00:24:33.580
<v Michael Kennedy>And how most projects, how much back end traffic do they really have?

00:24:33.860 --> 00:24:33.920
<v Michael Kennedy>Right.

00:24:34.020 --> 00:24:36.440
<v Michael Kennedy>They're sending an email because you said reset my email or something.

00:24:36.640 --> 00:24:41.680
<v Michael Kennedy>But yeah, most most sites are, you know, a thousand people at your company use this internal thing.

00:24:41.740 --> 00:24:44.240
<v Michael Kennedy>And that would be a big deal, you know, or something like that.

00:24:44.300 --> 00:24:44.400
<v Michael Kennedy>Right.

00:24:45.260 --> 00:24:47.300
<v Michael Kennedy>It's not it's not Netflix scale or.

00:24:47.840 --> 00:24:47.960
<v Calvin Hendryx-Parker>No.

00:24:48.040 --> 00:24:50.020
<v Calvin Hendryx-Parker>But when you need celery, you know, you need celery.

00:24:50.400 --> 00:24:54.840
<v Calvin Hendryx-Parker>And then you can get into more durable cues and retry patterns and those kinds of things.

00:24:55.300 --> 00:24:55.460
<v Michael Kennedy>Right.

00:24:55.480 --> 00:24:56.920
<v Michael Kennedy>Or temporal or something like that.

00:24:56.920 --> 00:24:57.060
<v Michael Kennedy>Yeah.

00:24:57.440 --> 00:24:57.600
<v Michael Kennedy>Absolutely.

00:24:57.940 --> 00:24:58.020
<v Michael Kennedy>Yep.

00:24:58.400 --> 00:24:59.120
<v Calvin Hendryx-Parker>That's awesome.

00:24:59.450 --> 00:25:00.020
<v Michael Kennedy>Yeah, cool.

00:25:00.150 --> 00:25:03.360
<v Michael Kennedy>So check out Django Task and Django Task Local.

00:25:03.740 --> 00:25:04.060
<v Calvin Hendryx-Parker>All right, Calvin.

00:25:04.580 --> 00:25:06.440
<v Calvin Hendryx-Parker>I got one extra for you.

00:25:07.920 --> 00:25:18.500
<v Calvin Hendryx-Parker>The current release manager for Python 3.14, they've always been looking for fun little puns to do on the fact that this is the Py release of Python.

00:25:19.130 --> 00:25:22.120
<v Calvin Hendryx-Parker>But actually, it ended up becoming a fix in the dictionary.

00:25:22.640 --> 00:25:24.820
<v Calvin Hendryx-Parker>And Michael, it's not the dictionary you're thinking of.

00:25:25.040 --> 00:25:27.840
<v Calvin Hendryx-Parker>It is actually the Oxford Dictionary.

00:25:28.200 --> 00:25:36.580
<v Calvin Hendryx-Parker>They found a bug in the dictionary in its own citation usage of pi symbol from 1706.

00:25:37.220 --> 00:25:39.340
<v Calvin Hendryx-Parker>So they have upstreamed the fix.

00:25:39.420 --> 00:25:40.860
<v Calvin Hendryx-Parker>It's got approved and published.

00:25:41.180 --> 00:25:53.680
<v Calvin Hendryx-Parker>And so because of the messings around and playing with pi and the latest release of Python, we got stumbled upon an actual markup bug in their own dictionary and got it published.

00:25:54.060 --> 00:25:57.040
<v Calvin Hendryx-Parker>So thanks to Hugo for doing that for us.

00:25:57.300 --> 00:25:58.420
<v Calvin Hendryx-Parker>It is not the dict.

00:25:58.630 --> 00:26:00.320
<v Calvin Hendryx-Parker>It is the actual dictionary.

00:26:00.700 --> 00:26:01.280
<v Calvin Hendryx-Parker>Oh, okay.

00:26:01.470 --> 00:26:02.400
<v Calvin Hendryx-Parker>I didn't see that coming.

00:26:02.720 --> 00:26:02.940
<v Michael Kennedy>Yeah.

00:26:03.220 --> 00:26:04.060
<v Michael Kennedy>Oxford English Dictionary.

00:26:04.720 --> 00:26:06.260
<v Michael Kennedy>Not quite a joke, but almost.

00:26:06.680 --> 00:26:06.880
<v Calvin Hendryx-Parker>Almost.

00:26:07.220 --> 00:26:07.280
<v Calvin Hendryx-Parker>Very cool.

00:26:07.860 --> 00:26:13.820
<v Calvin Hendryx-Parker>Very fun, though, to think that the Python community has gotten a fix upstreamed into the Oxford English Dictionary.

00:26:14.180 --> 00:26:16.539
<v Michael Kennedy>Well, I sure hope they use Oxford commas when they...

00:26:19.280 --> 00:26:21.240
<v Michael Kennedy>You're inciting some flames, Michael.

00:26:21.660 --> 00:26:22.020
<v Michael Kennedy>Exactly.

00:26:22.050 --> 00:26:24.400
<v Michael Kennedy>Like, rejected, improper use of comma.

00:26:24.860 --> 00:26:26.600
<v Michael Kennedy>So I want to talk about for my one extra.

00:26:27.060 --> 00:26:28.000
<v Michael Kennedy>Yeah, I think that's the only thing.

00:26:28.640 --> 00:26:30.220
<v Michael Kennedy>I have other stuff, but I'm going to leave it with this.

00:26:30.520 --> 00:26:32.100
<v Michael Kennedy>So I'm a big fan of Bunny.net.

00:26:32.320 --> 00:26:34.620
<v Michael Kennedy>I mean, Cloudflare is all the rage, right?

00:26:34.800 --> 00:26:35.540
<v Michael Kennedy>I've never used this.

00:26:36.080 --> 00:26:37.220
<v Michael Kennedy>Bunny.net is awesome.

00:26:37.420 --> 00:26:38.380
<v Michael Kennedy>The pricing is great.

00:26:38.600 --> 00:26:39.260
<v Michael Kennedy>It's so easy to use.

00:26:39.580 --> 00:26:40.580
<v Michael Kennedy>I use it for CDN.

00:26:40.680 --> 00:26:51.720
<v Michael Kennedy>So, for example, when you get a download of Python Bytes, like the weekly episode, that comes through the CDN for, if I can pull it up, comes through the CDN of Bunny.net.

00:26:52.220 --> 00:26:58.380
<v Michael Kennedy>But primarily, the reason I chose it, Ian Maurer recommended this to me, is because I want to use it for the courses.

00:26:58.960 --> 00:27:03.260
<v Michael Kennedy>So for the course videos, one of the things that's a hassle is you can use CDNs a lot.

00:27:03.540 --> 00:27:11.700
<v Michael Kennedy>There's a bunch of options there, but it's not very common that you can share private files through CDNs, which you can with bunny.net.

00:27:12.040 --> 00:27:13.080
<v Michael Kennedy>So that's super cool, right?

00:27:13.180 --> 00:27:17.060
<v Michael Kennedy>So for kind of like an S3 URL, you can sign it temporarily.

00:27:17.660 --> 00:27:21.400
<v Michael Kennedy>Like this URL is good with this special link for 20 minutes.

00:27:21.860 --> 00:27:22.160
<v Michael Kennedy>Play it.

00:27:22.420 --> 00:27:23.080
<v Michael Kennedy>Something like that, right?

00:27:23.420 --> 00:27:23.500
<v Calvin Hendryx-Parker>Yeah.

00:27:23.860 --> 00:27:26.700
<v Michael Kennedy>And so you can do that here, which is really, really great.

00:27:26.800 --> 00:27:29.420
<v Michael Kennedy>So that's kind of how it just pays you go, which is cool.

00:27:29.660 --> 00:27:32.200
<v Michael Kennedy>That's not what I want to talk about, though, but that's why I was interested.

00:27:32.720 --> 00:27:36.200
<v Michael Kennedy>They announced that this is another thing I use is BunnyDNS.

00:27:36.560 --> 00:27:44.280
<v Michael Kennedy>I probably should have pulled up my DNS dashboard because I've got some ridiculous DNS, ridiculously complicated DNS stuff that would have been fun to show.

00:27:44.620 --> 00:27:45.740
<v Michael Kennedy>But I'm not logged in on this machine.

00:27:45.860 --> 00:27:46.380
<v Michael Kennedy>It would take too long.

00:27:46.860 --> 00:27:56.700
<v Michael Kennedy>So bunny DNS, all you do to use it is you go to your fork bun or hover or name cheap or whatever you're using and you go to your domain and you just change two things.

00:27:57.220 --> 00:27:59.980
<v Michael Kennedy>You just change what your, gosh, what's it called?

00:28:00.520 --> 00:28:00.960
<v Michael Kennedy>Name servers.

00:28:01.380 --> 00:28:02.240
<v Michael Kennedy>You just change your name server.

00:28:02.420 --> 00:28:02.800
<v Michael Kennedy>There's two.

00:28:03.120 --> 00:28:05.220
<v Michael Kennedy>Usually you got to enter for redundancy.

00:28:05.740 --> 00:28:05.820
<v Michael Kennedy>Yeah.

00:28:06.000 --> 00:28:06.960
<v Michael Kennedy>And then that's it.

00:28:07.140 --> 00:28:16.040
<v Michael Kennedy>And so then you're basically running your DS through this really nice DNS management console instead of whatever crappy thing that like GoDaddy gives you.

00:28:16.280 --> 00:28:18.120
<v Michael Kennedy>Like, why is this so hard?

00:28:18.500 --> 00:28:19.720
<v Michael Kennedy>So you just like make one change.

00:28:19.770 --> 00:28:20.620
<v Michael Kennedy>You don't change your provider.

00:28:20.670 --> 00:28:21.540
<v Michael Kennedy>You don't move your domains.

00:28:21.590 --> 00:28:23.840
<v Michael Kennedy>You just flip the name server and you're over here.

00:28:23.840 --> 00:28:30.220
<v Michael Kennedy>And this has really cool things like, I would like this key or this domain or this TXT, whatever, right?

00:28:30.340 --> 00:28:31.160
<v Michael Kennedy>Whatever you manage in DNS.

00:28:31.500 --> 00:28:35.760
<v Michael Kennedy>Like I want this valid for 15 seconds because I'm testing right now or things like that.

00:28:36.520 --> 00:28:37.020
<v Calvin Hendryx-Parker>So it's really cool.

00:28:37.260 --> 00:28:38.560
<v Calvin Hendryx-Parker>That's packed into their API platform.

00:28:38.940 --> 00:28:39.480
<v Calvin Hendryx-Parker>That's pretty cool.

00:28:39.840 --> 00:28:40.200
<v Michael Kennedy>Yeah, yeah.

00:28:40.300 --> 00:28:43.340
<v Michael Kennedy>So, I mean, you can put it for an hour or a day or whatever for the time to live.

00:28:43.480 --> 00:28:49.700
<v Michael Kennedy>But if you're working, like while you're setting stuff up, That is so painful because if you leave it in a half an hour or an hour, then you change something.

00:28:49.840 --> 00:28:51.960
<v Michael Kennedy>You're like, oh no, I set it up wrong.

00:28:52.300 --> 00:28:53.220
<v Michael Kennedy>Well, I'm going to go to lunch.

00:28:53.380 --> 00:28:53.900
<v Michael Kennedy>We'll try it again.

00:28:54.080 --> 00:28:55.160
<v Michael Kennedy>Hope I get it right next time.

00:28:55.540 --> 00:29:00.040
<v Michael Kennedy>But if you put it on five, 15 seconds or whatever, it's just like, try it again, try it again, try it again.

00:29:00.440 --> 00:29:02.020
<v Michael Kennedy>And it's really, really sweet.

00:29:02.180 --> 00:29:04.840
<v Michael Kennedy>Gives you a bunch of cool graphs and stats and analytics.

00:29:05.260 --> 00:29:06.060
<v Michael Kennedy>So all this is free.

00:29:06.580 --> 00:29:07.240
<v Michael Kennedy>So play with it.

00:29:07.300 --> 00:29:07.520
<v Michael Kennedy>It's cool.

00:29:07.620 --> 00:29:08.780
<v Michael Kennedy>I'm a fan of bunny.net.

00:29:08.980 --> 00:29:09.380
<v Calvin Hendryx-Parker>Very cool.

00:29:09.680 --> 00:29:12.640
<v Calvin Hendryx-Parker>Do you know if they have a Terraform or a Tofu provider?

00:29:12.980 --> 00:29:13.520
<v Michael Kennedy>Fine question.

00:29:13.660 --> 00:29:14.180
<v Michael Kennedy>I have no idea.

00:29:15.160 --> 00:29:15.640
<v Calvin Hendryx-Parker>For next time.

00:29:15.940 --> 00:29:21.840
<v Michael Kennedy>I do know that they do a Google Fonts alternative.

00:29:21.840 --> 00:29:22.820
<v Michael Kennedy>Oh, that's nice too, yeah.

00:29:23.120 --> 00:29:29.140
<v Michael Kennedy>And what's really nice about this is it's, I believe they're a European company, and this is like a privacy first Google Fonts.

00:29:29.260 --> 00:29:30.160
<v Michael Kennedy>No tracking, yeah.

00:29:30.540 --> 00:29:31.440
<v Michael Kennedy>Exactly, no tracking.

00:29:31.800 --> 00:29:38.280
<v Michael Kennedy>And it also means if the only reason you had one of those terrible, you didn't think about the consequences when you made this law, did you?

00:29:38.680 --> 00:29:45.120
<v Michael Kennedy>Cookie banners, because you used Google Fonts, you can switch to this, and then you don't have to have a cookie banner, which is great.

00:29:45.340 --> 00:29:45.700
<v Calvin Hendryx-Parker>I like that.

00:29:45.860 --> 00:29:50.540
<v Michael Kennedy>i like that a lot if if it was google fonts the only reason right there's obviously yeah other

00:29:50.980 --> 00:29:56.740
<v Calvin Hendryx-Parker>other ones so anyway check it out it's free i'm a fan you got any jokes for us michael i do have

00:29:56.880 --> 00:30:09.820
<v Michael Kennedy>some jokes now these jokes they cracked me up are you peaked oh okay i think i think they're gonna be fun so a lot of times we just have um pictures or some kind of cartoon or something these

00:30:10.010 --> 00:30:19.540
<v Michael Kennedy>are just i hesitate to call them dad jokes i was gonna say they're good old i think they're good old school dad jokes yeah so i got three i picked three maybe we'll come back with some more but

00:30:19.760 --> 00:30:33.120
<v Michael Kennedy>you know so here we go are you ready calvin i'm ready hit me what's the object oriented way to become wealthy inheritance i mean oop is not as popular as it used to be especially in the python

00:30:33.380 --> 00:30:38.119
<v Calvin Hendryx-Parker>world but i'm definitely a designated laugher for dad jokes i i can't help myself i know i'm

00:30:38.140 --> 00:30:44.660
<v Michael Kennedy>My daughter and I found like a 200 dad jokes page once and just sat there all day and ran it.

00:30:44.820 --> 00:30:45.320
<v Michael Kennedy>It was great.

00:30:46.160 --> 00:30:48.820
<v Michael Kennedy>I mean, think of how rich Java and.NET people are.

00:30:49.540 --> 00:30:50.160
<v Calvin Hendryx-Parker>Tons of inheritance.

00:30:50.740 --> 00:30:51.060
<v Michael Kennedy>Tons.

00:30:51.280 --> 00:30:52.240
<v Michael Kennedy>I mean, so much more.

00:30:52.880 --> 00:30:53.540
<v Michael Kennedy>It's so corporate.

00:30:53.720 --> 00:30:54.900
<v Michael Kennedy>It's just money flows through that.

00:30:54.910 --> 00:30:57.580
<v Michael Kennedy>But is it inheritance if it's tech debt?

00:30:57.920 --> 00:30:58.540
<v Michael Kennedy>I don't think so.

00:30:58.600 --> 00:30:59.380
<v Michael Kennedy>And you spread it out.

00:30:59.480 --> 00:31:00.540
<v Michael Kennedy>Everyone's getting inheritance.

00:31:00.980 --> 00:31:02.000
<v Michael Kennedy>That's the difference, right?

00:31:02.140 --> 00:31:02.700
<v Michael Kennedy>It's diluted.

00:31:04.940 --> 00:31:05.720
<v Michael Kennedy>All right, next one.

00:31:06.140 --> 00:31:13.080
<v Michael Kennedy>this is very confucius or neo to understand what recursion is you must first understand what

00:31:13.200 --> 00:31:18.440
<v Calvin Hendryx-Parker>recursion is that one hits that one hits for sure uh because yeah you have to sit and think

00:31:18.860 --> 00:31:33.639
<v Michael Kennedy>i still remember my first uh cs class that i took i only took a couple because i was a math major but the first one in the lisp as well like we're gonna tell you about recursion like first of all what is this language why are there so many parentheses and why is it always recursion this is so crazy

00:31:33.660 --> 00:31:43.720
<v Calvin Hendryx-Parker>Yeah. I only took a couple of CS classes in college as well, but I remember my first time I hit recursion hardcore production problem. I was like, whoa, this is crazy what it can do.

00:31:44.000 --> 00:31:56.340
<v Michael Kennedy>Totally. All right. The last one to take us out of here is three SQL statements walk into a no SQL bar. Soon they walk out. They couldn't find a table. Oh, it's too good. It was good.

00:31:56.900 --> 00:32:03.620
<v Calvin Hendryx-Parker>And some people have a knack for joke telling like this. I'm a consumer of them, not a creator of

00:32:03.640 --> 00:32:07.420
<v Michael Kennedy>Yes. I'm always impressed with people that can come up with these jokes as well, but I do love them.

00:32:08.080 --> 00:32:08.460
<v Michael Kennedy>I love it.

00:32:08.680 --> 00:32:08.960
<v Michael Kennedy>That's right.

00:32:09.540 --> 00:32:09.960
<v Michael Kennedy>That's awesome.

00:32:10.180 --> 00:32:13.380
<v Michael Kennedy>All right, Calvin. Awesome to spend some time talking Python with you.

00:32:13.620 --> 00:32:14.560
<v Michael Kennedy>Yeah. See you later. Thanks everyone.

00:32:14.920 --> 00:32:15.020
<v Michael Kennedy>Yeah.
