OVER DEZE AFLEVERING
- The trusted-publishing debate: how to do it right vs. why you shouldn't trust it
- JupyterLab 4.6 and Notebook 7.6 are out!
- Tau – new small, readable terminal coding agent
- Django Tasks and Django 6.1
- Extras
- Joke
About the show
Sponsored by us! Support our work through:
- Our courses at Talk Python
- Consulting from Six Feet Up
Connect with the hosts
- Michael: Mastodon / BlueSky / X / LinkedIn
- Calvin: Mastodon / BlueSky / X / LinkedIn
- Show: Mastodon / BlueSky / X
Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Tuesday at 7am PT. Older video versions available there too.
Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.
Calvin #1: The trusted-publishing debate: how to do it right vs. why you shouldn't trust it
https://snarky.ca/how-to-publish-to-pypi-using-github-actions-securely/ (Brett Cannon) and https://blog.yossarian.net/2026/07/07/You-shouldnt-trust-trusted-publishing (William Woodruff)
- Trusted Publishing (PyPI's OIDC-based auth scheme, also now used by npm, RubyGems, crates.io, NuGet) replaces long-lived API tokens with short-lived, auto-scoped credentials tied to CI/CD machine identity.
- Yossarian's post: it's purely an authentication mechanism between a machine identity and a package — it says nothing about package safety or quality. PyPI deliberately avoids any "verified/trusted" badge for it, unlike its verified-URL checkmarks.
- Same logic applies to PyPI attestations: anyone can sign with any machine identity they control, so an attestation's presence isn't itself a trust signal.
- Bottom line from that post: don't confuse "trusted" (machine-to-machine) with "trustworthy" (human judgment about the package).
- Snarky.ca's companion piece is more practical: given GitHub Actions compromises in the news, the real fix is 3 concrete steps — run zizmor to lock down workflow permissions/checkout credentials and pin actions to commit hashes, adopt Trusted Publishing to eliminate stored PyPI tokens, and require manual approval via a GitHub environment before any publish job runs.
- Takeaway for listeners: Trusted Publishing is good hygiene for how you authenticate to PyPI, but it's not a substitute for securing your CI pipeline itself — or for actually vetting the packages you install.
Michael #2: JupyterLab 4.6 and Notebook 7.6 are out!
Michał Krassowski's rundown - a chunky minor release: 68 features, 97 bug fixes, 95 contributors, one of the biggest ever.
- Scratchpad console (Notebook 7.6 headliner) - a console next to your notebook sharing its kernel, for throwaway experiments. Ctrl+B.
- Jump to last-edited cell - new commands hop through recently edited cells.
- File browser glow-up - Date Created column, editable breadcrumbs with Tab-completion, and Open in Terminal.
- Debugger - sources open in the main area, floating step/continue overlay, live kernel-sources filter.
- Custom layouts (Lab) - activity bar top/bottom, draggable panels, four-way tab splits, per-panel Ctrl+scroll zoom.
- ~5x faster extension builds - webpack → Rspack, and
jupyter-buildermeans no full Lab install needed to build extensions. - Keyboard/a11y - add shortcuts from the UI (no JSON), Find & Replace in Edit menu (Ctrl+H).
Calvin #3: Tau – new small, readable terminal coding agent
- Tau – new small, readable terminal coding agent (Python 3.12+), built as both a working tool and a teaching project for how coding agents work under the hood
- Install via
uv tool install tau-ai,pipx, orpip; ships atauCLI - Three-layer architecture:
tau_ai(provider-neutral model layer) →tau_agent(reusable "brain": messages, tools, events, loop) →tau_coding(CLI/TUI, file & shell tools, sessions) - Supports OpenAI, Anthropic, OpenAI Codex, OpenRouter, Hugging Face, and custom/local OpenAI-compatible endpoints
- Built-in tools (read/write/edit/bash), durable JSONL sessions with resume/branching, project instructions via
AGENTS.md, and context compaction - Core harness is UI-agnostic — same brain can power the TUI, print mode, or a custom frontend — usable as a standalone library too
Michael #4: Django Tasks and Django 6.1
- Django 6.0 finally ships first-party background tasks (
django.tasks) - out of Jake Howard's DEP 14, accepted May 2024, after two decades of everyone bolting on Celery/RQ/Huey. - It's an API, not a worker. Django handles task definition, validation, queuing, and result storage - it does not execute them. You bring the backend.
- The default backend traps people.
ImmediateBackendruns tasks inline on the request thread and blocks until done - so out of the box.enqueue()backgrounds nothing (a 5-second task means a 5-second response). The other built-in,DummyBackend, runs nothing at all. Both are dev/test only. - Nice API otherwise: slap
@taskon a function, call.enqueue(), get back aTaskResultyou look up later by id - with async twins likeaenqueue(). Gotcha: args and return values must survive a JSON round-trip, so a tuple sneakily comes back as a list. - The community local backend to know:
django-tasks-localby Chris Beaven (SmileyChris). AThreadPoolExecutorbackend that gives real background threads with zero infrastructure - no Redis, no Celery, no database - plus aProcessPoolBackendfor CPU-bound work → github.com/lincolnloop/django-tasks-local - Its catch: results live in memory, so pending tasks vanish on restart or deploy. Great for dev and low-traffic production; for persistence, drop to Jake Howard's
django-tasks(DatabaseBackend + worker command).
Extras
Calvin:
- Fixing the dictionary with Python 3.14 — Hugo van Kemenade stumbled on - and got fixed - a markup bug in the OED's own citation of a 1706 use of the pi symbol.
Michael:
Jokes:
- What's the object-oriented way to become wealthy? Inheritance
- To understand what recursion is... You must first understand what recursion is
- 3 SQL statements walk into a NoSQL bar. Soon, they walk out They couldn't find a table.
IN DEZE AFLEVERING
LAAT NOTITIES ZIEN 🔗
TRANSCRIPTIE 🔗
00:00:00.020 --> 00:00:12.900
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
And I'm Calvin Hendryx-Parker. Happy Bastille Day.
00:00:15.500 --> 00:00:27.760
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
I think a Rust course is going to be next out the gate.
00:00:30.720 --> 00:00:33.440
So we'll talk more about that at some point soon.
00:00:33.800 --> 00:00:40.020
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
You can subscribe to our newsletter.
00:00:42.700 --> 00:00:44.240
Got some nice announcements there.
00:00:44.800 --> 00:00:50.460
Follow us on all the socials and watch us live or the replays on YouTube.
00:00:50.640 --> 00:00:53.160
Every episode has a little YouTube thumbnail.
00:00:53.290 --> 00:00:54.520
If you click it, guess what you get?
00:00:54.740 --> 00:00:55.760
YouTube, YouTube version.
00:00:56.320 --> 00:00:59.500
So we appreciate the people who are part of the live show, but definitely not required.
00:00:59.900 --> 00:01:05.239
And with that, Calvin, I would say, I want to talk about the Eno Such blog.
00:01:06.120 --> 00:01:07.760
Yes, who do you trust?
00:01:08.140 --> 00:01:08.520
It's interesting.
00:01:08.680 --> 00:01:13.720
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
One from William Woodruff, that's this blog right here.
00:01:17.450 --> 00:01:20.220
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
But they're both around trusted publishing and who you should trust.
00:01:25.300 --> 00:01:34.500
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
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
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
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
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
mentions Zizmor, how do you pronounce that? Is that the right pronunciation of the tool?
00:02:28.200 --> 00:02:33.060
So William wrote the tool mentioned in here, and he also mentioned in his own post.
00:02:34.000 --> 00:02:45.080
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
We'll go Zizmor. We'll go Zizmor then.
00:02:46.920 --> 00:02:47.520
I believe.
00:02:48.340 --> 00:02:51.000
Mike would know, and Mike will correct me momentarily.
00:02:51.040 --> 00:02:51.340
I'm sure.
00:02:51.340 --> 00:02:53.360
But you've got to trust me.
00:02:53.480 --> 00:02:56.060
I mean, speaking about trust, you've got to trust that I'm remembering this correctly.
00:02:56.060 --> 00:02:57.080
Right, they're remembering correctly.
00:02:57.720 --> 00:03:03.300
But this is a tool that will help you clear, make the CI/CD actions happy.
00:03:03.340 --> 00:03:16.040
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
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
And then you can make sure that things like those remain short-lived.
00:03:27.600 --> 00:03:30.040
And so that those don't persist throughout the rest of that run.
00:03:30.800 --> 00:03:38.060
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
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
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
You can look at the Zismore package.
00:04:10.260 --> 00:04:15.740
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
You'll see this verified details over here on PyPI.
00:04:19.579 --> 00:04:26.300
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
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
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
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
But don't confuse trusted with trustworthy.
00:04:59.280 --> 00:05:05.860
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
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
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
If something does happen, it can help contain the blast radius.
00:05:23.590 --> 00:05:32.740
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
Sounds good to me.
00:05:34.220 --> 00:05:34.320
Yeah.
00:05:35.160 --> 00:05:38.460
William Woodruff is, by the way, from the Astral team.
00:05:38.880 --> 00:05:39.000
Yes.
00:05:39.580 --> 00:05:40.980
And uv and all that.
00:05:41.180 --> 00:05:43.300
So they've thought a little bit about this.
00:05:43.640 --> 00:05:43.820
Yeah.
00:05:43.940 --> 00:05:47.700
So, I mean, table stakes, just use this tool no matter what.
00:05:48.280 --> 00:05:54.220
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
Yeah.
00:05:54.920 --> 00:06:00.820
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
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
Yeah.
00:06:06.820 --> 00:06:11.420
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
I think two out of three people said Sismar.
00:06:14.060 --> 00:06:14.200
Yeah.
00:06:14.430 --> 00:06:14.900
Just use it.
00:06:15.220 --> 00:06:15.340
Yep.
00:06:15.760 --> 00:06:24.720
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
So follow his instructions.
00:06:26.270 --> 00:06:28.820
He knows a lot of this stuff, you know, better than we all do.
00:06:29.220 --> 00:06:34.660
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
Okay.
00:06:35.800 --> 00:06:35.960
Amazing.
00:06:36.340 --> 00:06:36.900
Michael, what you got?
00:06:37.260 --> 00:06:42.140
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
Oh, hey everyone.
00:06:43.360 --> 00:06:46.980
New release, point release, Jupyter Notebooks and JupyterLab.
00:06:47.360 --> 00:06:47.440
Nope.
00:06:47.720 --> 00:06:47.820
Nope.
00:06:47.980 --> 00:06:48.920
It is a lot.
00:06:49.100 --> 00:06:52.220
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
That's fine.
00:06:53.639 --> 00:06:57.480
It says, as large as minor releases get, basically.
00:06:58.860 --> 00:06:59.720
So Jupyter Lab.
00:07:00.000 --> 00:07:01.160
Pumped right up against the ceiling.
00:07:02.000 --> 00:07:02.260
Exactly.
00:07:02.380 --> 00:07:06.380
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
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
Very minor.
00:07:21.080 --> 00:07:25.060
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
So there's a couple of things.
00:07:26.400 --> 00:07:33.920
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
By the way, you can test this out online.
00:07:36.880 --> 00:07:39.980
And there's a test it in JupyterLite.
00:07:40.100 --> 00:07:41.220
Are you familiar with JupyterLite?
00:07:41.540 --> 00:07:41.820
No.
00:07:42.100 --> 00:07:46.180
So if we go to JupyterLite, available in JupyterLite.
00:07:46.180 --> 00:07:47.760
Let me click that and just see what happens.
00:07:48.140 --> 00:07:49.540
I'm glad that that opened a new window.
00:07:50.100 --> 00:07:57.620
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
So like I'm pulling up here and there you have it.
00:08:00.800 --> 00:08:03.240
Like full on JupyterLab, but running JupyterLite.
00:08:03.500 --> 00:08:04.480
Like in a browser, right?
00:08:04.760 --> 00:08:05.160
In the browser.
00:08:05.580 --> 00:08:06.300
That is pretty sweet.
00:08:06.680 --> 00:08:07.020
Yeah, yeah, yeah.
00:08:07.160 --> 00:08:09.620
Like full client side, nothing but just a download there.
00:08:09.900 --> 00:08:10.880
Well, I think that's a smart move.
00:08:11.660 --> 00:08:12.040
Yeah, yeah.
00:08:12.100 --> 00:08:13.020
So you can test this out.
00:08:13.260 --> 00:08:17.000
Bring your Jupyter notebook to your data wherever it lives.
00:08:17.400 --> 00:08:17.780
Exactly.
00:08:18.180 --> 00:08:19.420
It's all powered by Pyodide.
00:08:19.700 --> 00:08:21.200
So you can test these changes out there.
00:08:21.220 --> 00:08:22.280
But let me pull up the little diagram.
00:08:22.740 --> 00:08:28.120
And it says you have a new activity bar options, like files or extensions or whatever.
00:08:28.480 --> 00:08:29.460
There's a breadcrumb.
00:08:29.640 --> 00:08:33.340
So like on the left in JupyterLab, you've got a file browser.
00:08:33.440 --> 00:08:38.219
So you can open Python or IPYNB files.
00:08:38.599 --> 00:08:40.580
And now there's a breadcrumb that you can edit.
00:08:41.180 --> 00:08:47.520
macOS should take this to heart, please, someday, maybe, that you can just type up there.
00:08:48.320 --> 00:08:49.580
And it'll say, you're in this directory.
00:08:49.620 --> 00:08:51.240
and you put your cursor there, and guess what you can do?
00:08:51.510 --> 00:08:54.180
You can go to a subdirectory or another folder.
00:08:55.040 --> 00:08:56.100
Very cool, so that's there.
00:08:57.300 --> 00:08:59.660
I guess it was missing that it didn't show the creation date.
00:08:59.930 --> 00:09:03.440
It only showed modified in Files before, so now you can figure out the creation dates.
00:09:03.760 --> 00:09:09.120
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
You can take stuff out of the sidebar, like widgets out of the sidebar.
00:09:12.900 --> 00:09:17.240
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
Calvin, you can create this like custom layout here.
00:09:21.040 --> 00:09:22.180
Yeah, I do like my tiles.
00:09:22.640 --> 00:09:27.700
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
So that kind of drops in right in the middle.
00:09:29.840 --> 00:09:32.620
So it's easy to understand your debugging and chase that around.
00:09:33.280 --> 00:09:35.800
You can add hotkeys from the editor.
00:09:36.170 --> 00:09:39.500
It has a cell number count in the debugger.
00:09:39.660 --> 00:09:42.600
You can like filter out your different sources and interact with the kernel.
00:09:43.160 --> 00:09:47.240
And you can go forwards and backwards in history of your edits.
00:09:47.640 --> 00:09:56.880
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
Yeah.
00:09:58.920 --> 00:10:02.440
It's mind bendy and will mess most new people up for sure.
00:10:02.540 --> 00:10:03.160
Yes, exactly.
00:10:03.480 --> 00:10:07.180
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
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
So maybe you edited cell seven and then cell 22 and then 20.
00:10:18.760 --> 00:10:20.780
So you can jump around in that through like some UI.
00:10:21.240 --> 00:10:23.280
So it's like a history order of like where you've been.
00:10:23.640 --> 00:10:25.140
Yeah, it's like a back forward button.
00:10:25.540 --> 00:10:29.240
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
That's fair.
00:10:30.420 --> 00:10:31.020
That's totally fair.
00:10:31.700 --> 00:10:33.100
Let me just flip through, see what else there is.
00:10:33.180 --> 00:10:34.060
There's a bunch of other things.
00:10:34.070 --> 00:10:35.300
Like there's only some of them, right?
00:10:35.420 --> 00:10:37.020
That's just the stuff they had annotated.
00:10:37.200 --> 00:10:41.400
The terminal is a little more, how shall we say, coding agent friendly.
00:10:41.800 --> 00:10:43.700
So you can open stuff in the terminal.
00:10:44.740 --> 00:10:46.380
Oh, we should get nerd fonts.
00:10:46.450 --> 00:10:48.300
I don't know if you can put nerd fonts in there or not.
00:10:48.960 --> 00:10:51.560
But there's a way they say it.
00:10:51.700 --> 00:10:52.480
That's not it.
00:10:52.960 --> 00:10:53.020
Yeah.
00:10:53.370 --> 00:10:57.100
So the terminal no longer traps keyboard focus, which is interesting.
00:10:57.420 --> 00:10:58.200
And here we go.
00:10:58.340 --> 00:10:59.120
This is the one.
00:10:59.440 --> 00:11:04.300
Pressing shift enter in the terminal now inserts a new line without executing the current line.
00:11:04.620 --> 00:11:08.880
This matches the behavior expected by certain terminal applications.
00:11:09.260 --> 00:11:10.540
I wonder which ones those are.
00:11:11.340 --> 00:11:11.960
It's a...
00:11:12.040 --> 00:11:15.200
Pi, Claude Code, et cetera, et cetera, right?
00:11:15.440 --> 00:11:27.100
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
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
That's fair.
00:11:34.440 --> 00:11:34.560
Yeah.
00:11:35.220 --> 00:11:36.800
So I think I'm going to leave it there.
00:11:36.880 --> 00:11:40.100
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
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
People can.
00:11:46.040 --> 00:11:49.900
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
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
But let's talk about another AI agent that got released very, very recently.
00:12:01.300 --> 00:12:02.800
This is probably within the last two weeks.
00:12:03.200 --> 00:12:08.760
The fine folks at Hugging Face have released Tau, which is two times pi.
00:12:09.480 --> 00:12:14.040
and it is a agent built mimicking a lot of pies.
00:12:15.699 --> 00:12:22.280
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
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
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
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
But it kind of hides what's going on under the covers.
00:12:54.400 --> 00:12:55.800
But here, this is actually the opposite.
00:12:56.000 --> 00:12:57.500
They're trying to know hidden machinery.
00:12:57.840 --> 00:12:59.660
Every moving part is put on the page.
00:13:00.200 --> 00:13:02.740
I think it's kind of, it's pretty, I tried it out yesterday.
00:13:03.520 --> 00:13:04.880
The models become streams.
00:13:04.920 --> 00:13:17.340
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
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
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
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
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
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
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
what provider you're currently running, what level of thinking, number of tools, number of skills.
00:14:27.480 --> 00:14:40.840
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
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
You can see what skills are currently loaded.
00:14:52.900 --> 00:14:55.260
Actually, that skill I wrote as part of this session.
00:14:55.640 --> 00:15:02.240
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
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
And you can see it.
00:15:09.200 --> 00:15:15.600
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
So it really gives you full examples.
00:15:17.620 --> 00:15:20.220
I'm getting a little bit of notebook vibes.
00:15:20.320 --> 00:15:25.780
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Yeah, and it's already got like 1500 GitHub stars.
00:18:17.060 --> 00:18:18.020
I think I like it.
00:18:18.120 --> 00:18:18.460
It's beautiful.
00:18:18.820 --> 00:18:19.740
It does look nice.
00:18:19.800 --> 00:18:21.400
It shows me all the information I want to see.
00:18:21.880 --> 00:18:22.380
That's important.
00:18:22.560 --> 00:18:25.060
I'm about the experience of my workstation.
00:18:25.360 --> 00:18:26.700
So this definitely falls into that.
00:18:27.180 --> 00:18:36.560
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
But on the other side, it can be an incredible learning thing.
00:18:39.800 --> 00:18:40.420
You're like, what?
00:18:40.980 --> 00:18:42.880
Okay, I don't make, that is actually new to me.
00:18:43.000 --> 00:18:43.880
Tell me what that does.
00:18:43.960 --> 00:18:44.740
Why are you doing this?
00:18:44.810 --> 00:18:45.320
You know what I mean?
00:18:45.420 --> 00:18:47.980
If you don't know what's happening, how do you know to ask that?
00:18:48.200 --> 00:18:49.820
Well, it's funny because I asked about memories.
00:18:50.380 --> 00:18:54.060
And so it actually looked into its memories and obviously says user prefers uv.
00:18:54.480 --> 00:18:58.680
And then I love to execute Python from uv and I created a simple memory system.
00:18:59.060 --> 00:19:01.440
So it's already using its own memory system they built.
00:19:01.720 --> 00:19:07.320
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
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
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
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
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
They don't need to wait on this.
00:19:58.840 --> 00:20:00.840
Like I'm going to send you a reset email.
00:20:01.500 --> 00:20:04.660
Email already is oddly asynchronous and non-verifiable.
00:20:04.850 --> 00:20:09.080
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
Like you can't do that, right?
00:20:10.000 --> 00:20:11.940
You just got to just send it and let it go.
00:20:12.110 --> 00:20:18.080
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
Which is heavy, yeah, very heavy.
00:20:19.480 --> 00:20:19.940
Yeah, exactly.
00:20:20.220 --> 00:20:28.980
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
It's like a huge jump, right?
00:20:31.740 --> 00:20:35.960
So this task framework kind of attempts to solve that in a framework-y way.
00:20:36.260 --> 00:20:41.380
What you can do is it's not exactly a task execution story.
00:20:41.540 --> 00:20:49.180
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
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
I don't know.
00:20:56.400 --> 00:20:57.040
We'll figure that out.
00:20:57.100 --> 00:20:58.960
You configure the thing in different ways.
00:20:59.240 --> 00:20:59.480
All right.
00:20:59.680 --> 00:21:01.220
So basically that's how it works.
00:21:01.540 --> 00:21:02.620
You set up your tasks.
00:21:02.840 --> 00:21:04.080
You define the backend.
00:21:04.180 --> 00:21:07.500
There's only one that comes with it and it's oddly unsatisfying to me.
00:21:07.860 --> 00:21:13.220
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
It goes, okay, it's enqueued when it's done.
00:21:15.980 --> 00:21:20.440
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
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
There's also the dummy backend.
00:21:29.880 --> 00:21:34.060
They missed a chance at like the null backend, like the null pattern.
00:21:34.220 --> 00:21:38.060
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
So this is for like testing.
00:21:40.000 --> 00:21:42.580
So you can enqueue things and so on and like, you know what?
00:21:42.900 --> 00:21:43.920
No, nothing happened.
00:21:44.980 --> 00:21:50.700
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
Anyway, so there's third-party backends, and there's an ecosystem here.
00:21:55.160 --> 00:21:56.320
It also has async support.
00:21:56.680 --> 00:21:58.060
Yeah, that's what I was going to say.
00:21:58.360 --> 00:21:59.340
Yeah, that's pretty neat.
00:21:59.800 --> 00:22:01.280
So a lot of cool stuff here.
00:22:02.180 --> 00:22:06.700
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
This is so nice compared to what it used to be.
00:22:08.960 --> 00:22:20.240
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
Like it wasn't very well published.
00:22:22.240 --> 00:22:23.860
It wasn't, it was hard to use.
00:22:23.860 --> 00:22:28.760
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
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
And it was some gymnastics to make it work.
00:22:38.700 --> 00:22:39.940
This looks so much nicer.
00:22:40.840 --> 00:22:49.200
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
Yeah, it looks really, really nice.
00:22:50.670 --> 00:22:52.880
And then the community stuff is good.
00:22:53.180 --> 00:22:59.740
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
Definitely.
00:23:02.080 --> 00:23:10.580
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
And the idea here is it uses either threading or processing backends.
00:23:17.840 --> 00:23:22.860
No Celery, no Redis, no database, no configuration necessary, right?
00:23:23.060 --> 00:23:23.860
So this is really cool.
00:23:23.860 --> 00:23:27.760
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
And so it really does immediately return, and it really does do these things.
00:23:31.540 --> 00:23:39.820
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
But most of these background tasks are not heavily computational.
00:23:44.960 --> 00:23:45.900
They're talking to a database.
00:23:46.320 --> 00:23:47.800
They're talking to a SMTP.
00:23:47.960 --> 00:23:48.620
There's some kind of weight.
00:23:49.080 --> 00:23:50.260
Yeah, it's not a lot of CPU.
00:23:50.480 --> 00:23:56.780
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
Or you have startup tasks.
00:23:59.720 --> 00:24:00.900
That was the thing we needed it for.
00:24:01.060 --> 00:24:02.460
We needed something to happen at Django startup.
00:24:03.120 --> 00:24:03.600
Oh, interesting.
00:24:03.890 --> 00:24:04.000
Okay.
00:24:04.540 --> 00:24:05.380
So you just fire that off.
00:24:05.620 --> 00:24:08.560
Yes, you could choose process backend if you really want like true separation.
00:24:08.790 --> 00:24:11.040
The one thing that you're giving up here is durability, right?
00:24:11.220 --> 00:24:17.800
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
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
Yeah, sure.
00:24:28.780 --> 00:24:33.580
And how most projects, how much back end traffic do they really have?
00:24:33.860 --> 00:24:33.920
Right.
00:24:34.020 --> 00:24:36.440
They're sending an email because you said reset my email or something.
00:24:36.640 --> 00:24:41.680
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
And that would be a big deal, you know, or something like that.
00:24:44.300 --> 00:24:44.400
Right.
00:24:45.260 --> 00:24:47.300
It's not it's not Netflix scale or.
00:24:47.840 --> 00:24:47.960
No.
00:24:48.040 --> 00:24:50.020
But when you need celery, you know, you need celery.
00:24:50.400 --> 00:24:54.840
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
Right.
00:24:55.480 --> 00:24:56.920
Or temporal or something like that.
00:24:56.920 --> 00:24:57.060
Yeah.
00:24:57.440 --> 00:24:57.600
Absolutely.
00:24:57.940 --> 00:24:58.020
Yep.
00:24:58.400 --> 00:24:59.120
That's awesome.
00:24:59.450 --> 00:25:00.020
Yeah, cool.
00:25:00.150 --> 00:25:03.360
So check out Django Task and Django Task Local.
00:25:03.740 --> 00:25:04.060
All right, Calvin.
00:25:04.580 --> 00:25:06.440
I got one extra for you.
00:25:07.920 --> 00:25:18.500
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
But actually, it ended up becoming a fix in the dictionary.
00:25:22.640 --> 00:25:24.820
And Michael, it's not the dictionary you're thinking of.
00:25:25.040 --> 00:25:27.840
It is actually the Oxford Dictionary.
00:25:28.200 --> 00:25:36.580
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
So they have upstreamed the fix.
00:25:39.420 --> 00:25:40.860
It's got approved and published.
00:25:41.180 --> 00:25:53.680
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
So thanks to Hugo for doing that for us.
00:25:57.300 --> 00:25:58.420
It is not the dict.
00:25:58.630 --> 00:26:00.320
It is the actual dictionary.
00:26:00.700 --> 00:26:01.280
Oh, okay.
00:26:01.470 --> 00:26:02.400
I didn't see that coming.
00:26:02.720 --> 00:26:02.940
Yeah.
00:26:03.220 --> 00:26:04.060
Oxford English Dictionary.
00:26:04.720 --> 00:26:06.260
Not quite a joke, but almost.
00:26:06.680 --> 00:26:06.880
Almost.
00:26:07.220 --> 00:26:07.280
Very cool.
00:26:07.860 --> 00:26:13.820
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
Well, I sure hope they use Oxford commas when they...
00:26:19.280 --> 00:26:21.240
You're inciting some flames, Michael.
00:26:21.660 --> 00:26:22.020
Exactly.
00:26:22.050 --> 00:26:24.400
Like, rejected, improper use of comma.
00:26:24.860 --> 00:26:26.600
So I want to talk about for my one extra.
00:26:27.060 --> 00:26:28.000
Yeah, I think that's the only thing.
00:26:28.640 --> 00:26:30.220
I have other stuff, but I'm going to leave it with this.
00:26:30.520 --> 00:26:32.100
So I'm a big fan of Bunny.net.
00:26:32.320 --> 00:26:34.620
I mean, Cloudflare is all the rage, right?
00:26:34.800 --> 00:26:35.540
I've never used this.
00:26:36.080 --> 00:26:37.220
Bunny.net is awesome.
00:26:37.420 --> 00:26:38.380
The pricing is great.
00:26:38.600 --> 00:26:39.260
It's so easy to use.
00:26:39.580 --> 00:26:40.580
I use it for CDN.
00:26:40.680 --> 00:26:51.720
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
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
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
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
So that's super cool, right?
00:27:13.180 --> 00:27:17.060
So for kind of like an S3 URL, you can sign it temporarily.
00:27:17.660 --> 00:27:21.400
Like this URL is good with this special link for 20 minutes.
00:27:21.860 --> 00:27:22.160
Play it.
00:27:22.420 --> 00:27:23.080
Something like that, right?
00:27:23.420 --> 00:27:23.500
Yeah.
00:27:23.860 --> 00:27:26.700
And so you can do that here, which is really, really great.
00:27:26.800 --> 00:27:29.420
So that's kind of how it just pays you go, which is cool.
00:27:29.660 --> 00:27:32.200
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
They announced that this is another thing I use is BunnyDNS.
00:27:36.560 --> 00:27:44.280
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
But I'm not logged in on this machine.
00:27:45.860 --> 00:27:46.380
It would take too long.
00:27:46.860 --> 00:27:56.700
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
You just change what your, gosh, what's it called?
00:28:00.520 --> 00:28:00.960
Name servers.
00:28:01.380 --> 00:28:02.240
You just change your name server.
00:28:02.420 --> 00:28:02.800
There's two.
00:28:03.120 --> 00:28:05.220
Usually you got to enter for redundancy.
00:28:05.740 --> 00:28:05.820
Yeah.
00:28:06.000 --> 00:28:06.960
And then that's it.
00:28:07.140 --> 00:28:16.040
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
Like, why is this so hard?
00:28:18.500 --> 00:28:19.720
So you just like make one change.
00:28:19.770 --> 00:28:20.620
You don't change your provider.
00:28:20.670 --> 00:28:21.540
You don't move your domains.
00:28:21.590 --> 00:28:23.840
You just flip the name server and you're over here.
00:28:23.840 --> 00:28:30.220
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
Whatever you manage in DNS.
00:28:31.500 --> 00:28:35.760
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
So it's really cool.
00:28:37.260 --> 00:28:38.560
That's packed into their API platform.
00:28:38.940 --> 00:28:39.480
That's pretty cool.
00:28:39.840 --> 00:28:40.200
Yeah, yeah.
00:28:40.300 --> 00:28:43.340
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
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
You're like, oh no, I set it up wrong.
00:28:52.300 --> 00:28:53.220
Well, I'm going to go to lunch.
00:28:53.380 --> 00:28:53.900
We'll try it again.
00:28:54.080 --> 00:28:55.160
Hope I get it right next time.
00:28:55.540 --> 00:29:00.040
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
And it's really, really sweet.
00:29:02.180 --> 00:29:04.840
Gives you a bunch of cool graphs and stats and analytics.
00:29:05.260 --> 00:29:06.060
So all this is free.
00:29:06.580 --> 00:29:07.240
So play with it.
00:29:07.300 --> 00:29:07.520
It's cool.
00:29:07.620 --> 00:29:08.780
I'm a fan of bunny.net.
00:29:08.980 --> 00:29:09.380
Very cool.
00:29:09.680 --> 00:29:12.640
Do you know if they have a Terraform or a Tofu provider?
00:29:12.980 --> 00:29:13.520
Fine question.
00:29:13.660 --> 00:29:14.180
I have no idea.
00:29:15.160 --> 00:29:15.640
For next time.
00:29:15.940 --> 00:29:21.840
I do know that they do a Google Fonts alternative.
00:29:21.840 --> 00:29:22.820
Oh, that's nice too, yeah.
00:29:23.120 --> 00:29:29.140
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
No tracking, yeah.
00:29:30.540 --> 00:29:31.440
Exactly, no tracking.
00:29:31.800 --> 00:29:38.280
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
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
I like that.
00:29:45.860 --> 00:29:50.540
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
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
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
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
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
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
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
It was great.
00:30:46.160 --> 00:30:48.820
I mean, think of how rich Java and.NET people are.
00:30:49.540 --> 00:30:50.160
Tons of inheritance.
00:30:50.740 --> 00:30:51.060
Tons.
00:30:51.280 --> 00:30:52.240
I mean, so much more.
00:30:52.880 --> 00:30:53.540
It's so corporate.
00:30:53.720 --> 00:30:54.900
It's just money flows through that.
00:30:54.910 --> 00:30:57.580
But is it inheritance if it's tech debt?
00:30:57.920 --> 00:30:58.540
I don't think so.
00:30:58.600 --> 00:30:59.380
And you spread it out.
00:30:59.480 --> 00:31:00.540
Everyone's getting inheritance.
00:31:00.980 --> 00:31:02.000
That's the difference, right?
00:31:02.140 --> 00:31:02.700
It's diluted.
00:31:04.940 --> 00:31:05.720
All right, next one.
00:31:06.140 --> 00:31:13.080
this is very confucius or neo to understand what recursion is you must first understand what
00:31:13.200 --> 00:31:18.440
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
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
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
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
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
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
I love it.
00:32:08.680 --> 00:32:08.960
That's right.
00:32:09.540 --> 00:32:09.960
That's awesome.
00:32:10.180 --> 00:32:13.380
All right, Calvin. Awesome to spend some time talking Python with you.
00:32:13.620 --> 00:32:14.560
Yeah. See you later. Thanks everyone.
00:32:14.920 --> 00:32:15.020
Yeah.