BU BÖLÜM HAKKINDA
- Web UIs for your reverse proxy
- Wagtail 8.0 is hot off the presses
- RISC-V is now officially supported by CPython
- Django’s annual releases make every version an LTS
- Extras
- Joke
About the show
Sponsored by Logfire from Pydantic: pythonbytes.fm/logfire
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.
Michael #1: Web UIs for your reverse proxy
Traefik, nginx, and Caddy all sit in front of a lot of self-hosted infrastructure, and all three are configured by hand-editing files. Three active projects put a control plane on top: Traefik Manager (Python + Flask), Nginx UI (Go + Vue), and caddy/ui (React + Node). All three are additive rather than replacements - none of them take ownership of your config away from you - which is the part that matters when the thing has write access to production routing.
- Traefik Manager is the Python one: Flask 3.1 and Gunicorn for the control plane, a lightweight Go agent for remote instances, currently v1.10.0 with an Android companion app.
- Nginx UI is a single Go binary at 11.3k stars, with a block-style config editor, an Ace editor doing LLM completion on nginx syntax, and an MCP server so agents can drive it.
- caddy/ui runs as two containers next to your existing Caddy, reads and writes your Caddyfile directly, and uses Caddy's
/adaptAPI to validate before reload - no Docker socket required. - Each one edits the config the underlying server already reads, so your files stay the source of truth and you can drop the UI without unwinding anything.
- Undo is a first-class feature across all three - timestamped backups with optional Git history, config version compare and restore, Caddyfile snapshots with one-click rollback.
- Observability is where they diverge: Traefik Manager does CrowdSec and a visual route map, Nginx UI does server metrics, caddy/ui streams access logs over SSE and pulls p50/p95/p99 off Caddy's Prometheus endpoint.
- Maturity spread is wide - Nginx UI has 11.3k stars, caddy/ui has 4 and was built in a single Claude session - and caddy/ui ships with auth off by default, so set
CADDY_UI_USERandJWT_SECRETbefore it goes anywhere near a public interface.
Calvin #2: Wagtail 8.0 is hot off the presses
Link: https://github.com/wagtail/wagtail/releases/tag/v8.0
- Custom base page models are now supported, so projects aren't locked into subclassing Wagtail's Page as shipped (Matt Westcott).
- New v3 REST API handles both read and write CMS operations, a first for Wagtail's API.
- A global registry for permission policies, plus full customizability for the remaining page views via PageViewSet.
- AVIF and WebP images are no longer auto-converted to PNG by default, a real behavior change to watch on upgrade.
- Five security fixes: page admin API restrictions, document identification by SHA1 hash, descendant collections in the Documents/Images API, snippet copy permissions, and the page translation endpoint.
- Formalized Django 6.1 support, and CI now runs on uv with a lockfile.
Sponsor: Logfire from Pydantic
Your AI agent failed at 2am. Was it the model? A tool call? The database? Most observability tools can't tell you, because they only see part of your stack. Pydantic Logfire sees all of it. One trace across your agents, LLMs, APIs, and database. Down to the infrastructure: services, Kubernetes, and hosts. It's built on OpenTelemetry, with SDKs for Python, TypeScript, and Rust, and it works with any OTel-compatible language. Every prompt, token count, and cost, right next to your vector searches and API calls. You query everything with Postgres-compatible SQL. And so can your coding agent, through the Logfire MCP server. Stop guessing. Read the trace. Pydantic Logfire. AI, it's still just engineering. Visit pythonbytes.fm/logfire today and sign up today. Get 10M records free every month, no card required. You can even click “Onboard with your coding agent” to copy a prompt to have claude or codex integrate Logfire into your app. Thanks to Pydantic for supporting the show.
Calvin #3: RISC-V is now officially supported by CPython
Link: https://blog.python.org/2026/08/riscv-now-officially-supported/
- CPython added RISC-V as a tier 3 platform under PEP 11, specifically the 64-bit Linux target riscv64-unknown-linux-gnu.
- RISC-V is an open ISA anyone can implement, unlike x86 and ARM, and its market is projected to quadruple by 2032.
- The RISE Project donated real RISC-V machines for buildbots; the author's work was funded by a Sovereign Tech Agency fellowship.
- What changes: the port is now a maintained compatibility target, so CPython changes are less likely to quietly break it. What doesn't: no python.org installers, no binary wheel parity for native extensions.
- Next up: RISC-V runners in CPython CI for pre-merge feedback, then a push toward tier 2, plus architecture-specific optimizations.
- The ask is testing. If you have RISC-V hardware, build CPython, run your test suite, file what breaks. Tier 3 is the weakest support tier. PEP 11 tier 3 requires a core developer contact and a buildbot, but failures on tier 3 platforms explicitly do not block a release. Saying "ongoing CI/testing expectations" oversells it. The honest bit is "someone is now on the hook for it, and breakage gets noticed," not "it's guaranteed working." Worth the caveat that this is Linux SBCs, not microcontrollers. A VisionFive 2 counts, an ESP32-C6 or Pico 2 does not. Those are 32-bit non-Linux parts where MicroPython is still the answer.
Michael #4: Django’s annual releases make every version an LTS
Starting with Django 2028, Django will move to one January feature release per year, adopt calendar-based version numbers, and support every release for three years. The old distinction between standard and LTS releases disappears, giving teams a predictable annual upgrade path that aligns more closely with Python’s own release and support cadence.
- Every Django release becomes the safe, long-supported choice, so teams no longer need to wait for a specially designated LTS version or absorb two years of changes at once.
- Each release gets one year of mainstream bug fixes followed by two years of security and data-loss fixes.
- New releases support the three latest Python versions and add the next Python release during their first year.
- Calendar versioning begins with Django 2028, followed by Django 2029 and so on.
- Three Django versions will be supported at any time, giving third-party packages a clearer rolling target.
- Nothing changes before 2028, and existing commitments for Django 5.2 LTS and 6.2 LTS remain in place.
Extras
Calvin:
- The Python docs now document the time complexity of built-in types https://docs.python.org/3.16/library/time-complexity.html
- Thinking in Python - Bruce Eckel's free book https://thinkinginpython.com/ Michael:
- prune_uv_pythons.py - Prune uv-managed Python installs, keeping only the newest patch per minor version
- Runs automatically in my system “upgrade” script: upgrade-output-2026.png
- Started using Ollama cloud models for my Hermes assistant. Thanks to Jeff Triplett I learned they are not just local models.
Joke: The Tao of Programming - Book Seven: Corporate Wisdom
BU BÖLÜMDE
NOTLARI GÖSTER 🔗
TRANSKRİPT 🔗
00:00:00.080 --> 00:00:11.080
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 493, recorded on Tuesday, August 25th, 2026. I'm Calvin Hendricks
00:00:11.120 --> 00:00:21.720
Parker. And I'm Michael Kennedy. Hey, Michael. Glad for you to be here. We are sponsored this episode by Logfire from Pydantic, so make sure you check them out. There are links in the show notes.
00:00:22.100 --> 00:00:33.300
If you want to connect with Michael and I on the socials and the show itself, you can catch us on Mastodon, Bluesky, X, and LinkedIn. And join us for the live stream. Each week we record this live,
00:00:33.400 --> 00:00:46.460
you can join in, comment, be a part of the audience at pythonbytes.fm/live. It's usually Tuesday at 7 a.m. Pacific. It's a little different, but because of DjangoCon. And finally, if you want an
00:00:46.680 --> 00:01:01.060
artisanal handcrafted digest of every week's show notes in your email form, add your name to our friends of the show list and we'll never share it to anyone else michael let's dig in uh i think we got a web heavy episode except for one item in here and you're going to kick off with one right
00:01:01.120 --> 00:01:12.340
now yeah i'm going to put it in reverse or race mode if you know the british radio joke yeah well first of all hello Django con thank you for the greetings and uh calvin you're reporting live from
00:01:12.520 --> 00:01:27.500
jango con yeah i am live from jigger i am in the hotel of Django con here in downtown chicago we are in the loop. So those of you who know Chicago area, right on the river, it has been a great conference. This is day two. We've had some excellent keynotes. Don Wages, Sarah from the
00:01:27.600 --> 00:01:39.360
Django community gave some excellent keynotes each day. And there's been some lightning talks are also one of my favorite things. So a couple rounds of lightning talks have already happened, one of which you're going to cover as part of one of your news items. So there's a lot of Django news
00:01:40.100 --> 00:01:45.720
actually in this episode included. So it's very timely that DjangoCon is happening right now and and lots that's happening in the community.
00:01:46.020 --> 00:01:48.980
Yeah, we've got a couple of Django topics actually.
00:01:49.100 --> 00:01:50.600
You did say it's a web heavy episode, right?
00:01:50.820 --> 00:01:52.400
It is, except for my one outlier.
00:01:52.740 --> 00:01:53.400
We'll get to that.
00:01:53.500 --> 00:01:54.620
We'll get to that one.
00:01:54.940 --> 00:01:56.700
Right, well, let's talk about the first one.
00:01:56.880 --> 00:02:00.000
So this is, I ran across this for something called Traefik.
00:02:00.160 --> 00:02:00.900
Are you familiar with Traefik?
00:02:01.240 --> 00:02:02.220
I am familiar with Traefik.
00:02:02.560 --> 00:02:16.760
Yeah, so Traefik is, it's a reverse proxy like Nginx or Caddy, but it's a little more focused on microservices and like I've got a Kubernetes cluster and stuff is coming and going, and maybe it's recycled and now it's in a different location
00:02:16.910 --> 00:02:18.520
in terms of an internal URL.
00:02:18.810 --> 00:02:21.400
And so it's gonna like find those pieces and put it together.
00:02:21.610 --> 00:02:24.940
So I ran across this thing called Traefik Manager.
00:02:25.560 --> 00:02:26.680
Are you familiar with Traefik Manager?
00:02:27.100 --> 00:02:28.260
I'm not familiar with Traefik Manager.
00:02:28.340 --> 00:02:29.360
So I don't know about you.
00:02:29.680 --> 00:02:32.500
Yeah, anyone who's ever used Kubernetes is using some kind of reverse proxy.
00:02:32.960 --> 00:02:34.300
Yeah, this would be, yeah, exactly.
00:02:34.390 --> 00:02:36.420
I think Traefik might be the most popular for that.
00:02:37.220 --> 00:02:39.080
It's not the one we're using for Python Bytes.
00:02:39.400 --> 00:02:41.400
I'll say a bit more about that in a second, but yeah.
00:02:41.580 --> 00:02:46.820
So this Traefik manager is a visualization dashboard for your Traefik server.
00:02:47.040 --> 00:02:54.880
And if Traefik is your front end server, your reverse proxy, whatever you call it, it is the one choke point that all Traefik is going through.
00:02:54.880 --> 00:02:57.540
So it's a really good place to report on how things are going.
00:02:57.580 --> 00:03:00.200
Of course, besides CDNs, which are, you know, their own deal.
00:03:00.480 --> 00:03:06.540
But this is a really nice looking UI that you can, it gives you all sorts of information.
00:03:07.180 --> 00:03:09.820
How many requests, how many routes do you got?
00:03:09.900 --> 00:03:11.140
How many services is it serving?
00:03:11.860 --> 00:03:13.280
What's the Traefik?
00:03:13.660 --> 00:03:14.980
What media are you hosting?
00:03:15.980 --> 00:03:16.780
What else we got?
00:03:17.140 --> 00:03:21.260
Route map, logs, CrowdSec for security, I presume,
00:03:21.400 --> 00:03:22.600
TLS options, certificates.
00:03:23.319 --> 00:03:23.940
All of that.
00:03:24.040 --> 00:03:28.080
You can just see this live as a web dashboard over top of your infrastructure.
00:03:28.230 --> 00:03:28.840
It's really slick.
00:03:29.120 --> 00:03:30.140
I think that's pretty slick, right?
00:03:30.170 --> 00:03:30.520
What do you think?
00:03:30.780 --> 00:03:44.600
I think having that available just at your fingertips to be able to diagnose, triage, understand patterns, especially when something goes wrong, having more bandwidth of data coming in as the human making some decisions is better and this
00:03:44.670 --> 00:03:56.200
looks wonderful for that yeah it looks great and it shows you how to run it just as an installer but also on docker podman and like on bare metal Linux and so on yeah it's you can even edit like static
00:03:56.380 --> 00:04:05.499
files and a few other things so i think this is pretty cool so i saw that i thought oh let me cover this i'm like well and i looked into Traefik a little bit and Traefik is great for a certain
00:04:05.520 --> 00:04:11.780
class of problems, the ones I described at the opening, but it's not a true just front end thing.
00:04:12.660 --> 00:04:27.100
Like for example, it doesn't serve static files at all, right? Or certain things. So it's like a little bit, you can, a lot of people could use it, but not everybody. Well, what are the other options? Well, the other options are Nginx, right? Which is what we use for Python bytes. I have an
00:04:27.440 --> 00:04:40.060
insane amount of Nginx config files. There are 2,200 lines of Nginx config powering 33 containers on my server oh my goodness i'm a little committed to nginx at this point and unlike many other
00:04:40.300 --> 00:04:50.000
things you can't run another server like Traefik or caddy which i'm going to talk about next to it because they all need port 80 like you can't even set up tls until you can get to you know what i
00:04:50.100 --> 00:04:55.800
mean like it's uh so it's a really hard cut over basically is what i'm saying so right now i'm
00:04:55.940 --> 00:05:01.940
sticking with nginx and like well is there something like this for nginx because that is a full on front end story, right?
00:05:02.360 --> 00:05:04.920
So I will introduce you to Nginx UI.
00:05:05.580 --> 00:05:06.820
Guess is how you would pronounce it?
00:05:07.220 --> 00:05:08.720
Yet another Nginx web UI.
00:05:09.200 --> 00:05:09.620
There's others.
00:05:10.120 --> 00:05:10.760
It's not the only one.
00:05:10.920 --> 00:05:12.320
Yes, it's not the only one, no.
00:05:12.600 --> 00:05:16.360
But you can go to the demo, which is very confusing 'cause it just takes you here and says, you gotta log in.
00:05:16.380 --> 00:05:17.760
I'm like, huh, what do you think that's about?
00:05:18.040 --> 00:05:19.400
Go back to the page that took you the demo.
00:05:19.540 --> 00:05:20.500
Where's the username and password?
00:05:20.840 --> 00:05:21.900
Nah, but I'm a hacker.
00:05:22.300 --> 00:05:24.280
I didn't know if that told you in my spare time.
00:05:25.180 --> 00:05:26.040
Admin, admin, admin.
00:05:26.500 --> 00:05:29.760
You may be a hacker too because let's see if that gets us in.
00:05:29.880 --> 00:05:30.400
Sure enough.
00:05:30.900 --> 00:05:32.160
Sure enough, login successful.
00:05:32.870 --> 00:05:33.280
There we go.
00:05:33.460 --> 00:05:36.260
So this is actually even better than the Traefik one, I think.
00:05:36.360 --> 00:05:37.780
So it shows you stuff about your server.
00:05:38.100 --> 00:05:42.100
This is your Linux machine running, or Docker machine, running Nginx.
00:05:42.520 --> 00:05:47.400
The CPU stats, network stats, disc IO, all that kind of, which is really cool, right?
00:05:47.700 --> 00:05:58.640
Then you get over to Nginx and it shows you the max number of requests per second you can handle, the max concurrent connections, the request per connection, which is like these are just like kind of stats.
00:05:58.910 --> 00:06:01.540
And it shows you where the process is working.
00:06:01.650 --> 00:06:06.400
Is it cache processes, worker process, et cetera, alive connections, all this stuff.
00:06:06.520 --> 00:06:07.020
That's really cool.
00:06:07.270 --> 00:06:08.280
It lets you manage your sites.
00:06:08.330 --> 00:06:14.840
Now, at least the Nginx one, I think actually the Traefik one as well, but the Nginx one lets you edit your config.
00:06:15.440 --> 00:06:23.260
You can go over your manage sites here and you can say, I could even add a site, but I could go over here and edit the prime sponsor, whatever that is.
00:06:23.780 --> 00:06:27.880
But you can go and put in, just start typing away in your Nginx config here.
00:06:28.300 --> 00:06:29.660
Set your upstream, set your server.
00:06:30.040 --> 00:06:33.960
You can view the logs, which is pretty sweet, and all kinds of stuff.
00:06:34.140 --> 00:06:36.880
Look at the certificates, configs, upstreams.
00:06:37.100 --> 00:06:37.800
This one makes me nervous.
00:06:38.200 --> 00:06:39.540
A little terminology just goes to your server.
00:06:39.680 --> 00:06:40.360
I'm not a fan of that.
00:06:40.540 --> 00:06:41.600
Like, that should be turned off.
00:06:41.900 --> 00:06:42.620
Just, there's no need.
00:06:42.680 --> 00:06:43.320
There's no need for that.
00:06:43.420 --> 00:06:44.700
A little bit of security risk there.
00:06:45.060 --> 00:06:45.520
You know what?
00:06:45.540 --> 00:06:46.100
I'm sure it's fine.
00:06:46.440 --> 00:06:48.600
Everyone was just looking like, yeah, it would be mean to mess with this.
00:06:48.800 --> 00:06:53.560
It kind of reminds me of the old days of Webman, which was riddled with security problems.
00:06:53.660 --> 00:06:55.040
like a C panel or something.
00:06:55.380 --> 00:06:55.840
Yeah, right.
00:06:56.060 --> 00:06:56.160
Exactly.
00:06:57.020 --> 00:06:57.100
Yeah.
00:06:57.280 --> 00:07:00.040
So anyway, what's cool though is I believe this as well.
00:07:00.280 --> 00:07:04.920
Certainly the prior one, you can run it in Docker just as a sidecar Docker container.
00:07:05.000 --> 00:07:08.180
So it's just in your Docker cluster set up there, which I think is pretty cool.
00:07:08.500 --> 00:07:10.020
So this is one that looks pretty interesting.
00:07:10.080 --> 00:07:11.980
And finally, I'm a fan of Caddy.
00:07:12.400 --> 00:07:15.440
If I didn't have 2,000 lines of config, I'd have to migrate.
00:07:15.780 --> 00:07:16.240
I'm starting over.
00:07:16.300 --> 00:07:17.320
I'm pretty sure I would do Caddy.
00:07:17.460 --> 00:07:18.060
Caddy looks great.
00:07:18.180 --> 00:07:19.180
I've never used Caddy.
00:07:19.340 --> 00:07:19.900
No, I've never used.
00:07:19.960 --> 00:07:20.580
I mean, I've heard of it.
00:07:20.640 --> 00:07:21.180
I've never used it.
00:07:21.320 --> 00:07:22.120
I've been more on.
00:07:22.220 --> 00:07:25.960
We've been using Traefik quite a bit, and we historically use a lot of Nginx.
00:07:26.280 --> 00:07:27.180
Yeah, same.
00:07:27.470 --> 00:07:29.680
I mean, Nginx and then like, no bad Traefik.
00:07:29.900 --> 00:07:35.080
But, so this is really cool because it's config file is supposed to be like, just what you need.
00:07:35.200 --> 00:07:36.460
It's got kind of a Python vibe.
00:07:36.660 --> 00:07:40.640
Like, yeah, you don't need a namespace, a static class, and a static main void.
00:07:40.710 --> 00:07:43.840
Like you could just, could we just put the thing that does the thing in there?
00:07:44.130 --> 00:07:44.800
Which is really cool.
00:07:44.930 --> 00:07:54.700
And it also does auto, automatically does, it's in order to get SSL, All you got to do is turn it on and have the IP address pointing there and you make a request to it.
00:07:54.700 --> 00:07:56.820
And it just does that, manages it like that.
00:07:56.980 --> 00:07:59.560
So certainly a very neat setup.
00:07:59.620 --> 00:08:01.760
I feel like this is a pretty modern server.
00:08:02.280 --> 00:08:06.540
So with that said, there's also CATI UI, which is another one of these.
00:08:06.780 --> 00:08:07.500
Of course there is, right?
00:08:07.740 --> 00:08:08.500
Because why wouldn't there be?
00:08:08.780 --> 00:08:13.540
Let's say you look at like a dashboard and then logs and like metrics for your server and so on.
00:08:13.600 --> 00:08:17.280
It's like so dark mode that even the text on a black background is mostly dark.
00:08:17.520 --> 00:08:30.180
So I wonder if there's not a limited audience for these UIs though, because if you're at a certain level, you're gonna have Prometheus, Grafana, and all these kinds of metrics streaming into a centralized observability platform
00:08:30.540 --> 00:08:35.400
where you can now correlate and trace, but you're still only getting a view from the web server.
00:08:35.700 --> 00:08:40.360
I didn't know, did you see if they include any kind of web request tracing in there?
00:08:40.360 --> 00:08:41.460
It could only go so far.
00:08:41.700 --> 00:08:43.240
I didn't see any.
00:08:43.580 --> 00:08:44.640
Yeah. - No, I didn't see any.
00:08:44.900 --> 00:08:52.960
I think that this is targeted at the Home Assistant crew, The one website, small project crew.
00:08:53.430 --> 00:09:02.320
Although the Traefik one talks about a lot of auto discovery of services and that kind of stuff, which speaks not to it.
00:09:02.680 --> 00:09:06.520
So the Traefik one seems maybe to be the most pro of them all.
00:09:06.720 --> 00:09:07.220
Very cool.
00:09:07.660 --> 00:09:08.660
Anyway, there you go.
00:09:09.350 --> 00:09:12.020
If you want a UI for your front-end web server, why not?
00:09:12.420 --> 00:09:13.000
You can get it.
00:09:13.140 --> 00:09:13.460
You can get it.
00:09:13.480 --> 00:09:16.420
All right, well, let's head back into Django world.
00:09:17.000 --> 00:09:28.360
in the Django world, there's a brand new release that released, I think it's like literally, I'll dive in, we're at Wagtail land now. Wagtail did an 8.0 release today. So this is very, very
00:09:28.760 --> 00:09:40.040
hot news. If we go into the Wagtail repository, take a look at the releases, you'll see here eight, six hours ago, 8.0 release for Wagtail. So the Wagtail team has been very busy. They have not
00:09:40.090 --> 00:09:49.620
even completed the release blog for this yet, which will come out tomorrow, depending on when this comes out, you should see that news tomorrow. But if you're a Wagtail user, you can rejoice that
00:09:49.620 --> 00:10:01.860
there is the 8.0 version out right now. Some new stuff that is inside of Wagtail. We've got custom base page models are now supported. So projects aren't locked into subclassing Wagtail's page as
00:10:02.060 --> 00:10:15.460
shipped. So you get a little more flexibility to having your own custom base page models. I think that's going to be a big win for folks who want to do more customized things and not feel so constrained. The V3 REST API handles both read and write operations for the CMS,
00:10:16.300 --> 00:10:28.360
so that gives a lot more flexibility to the API and be able to have a fully headless wag tail if you wanted. There's a global registry for permission policies plus full customizability for the remaining page views via the
00:10:28.520 --> 00:10:39.420
page view set. Another big one to watch out for if you're migrating from prior to eight, so in the seven or the six range, AVIF and WebP images are no longer are going to be auto-converted to PNG by default.
00:10:40.030 --> 00:10:43.420
So that's something to watch out for on Upgrade if you're depending on that specific behavior.
00:10:43.900 --> 00:10:49.820
They're going to be treated more natively by the platform, but you may have some special behaviors because you were depending on the auto-conversion.
00:10:50.340 --> 00:10:52.940
I don't know how to feel about WebP images.
00:10:53.130 --> 00:10:57.080
You know, I like to be on the cut edge of these things, but I just feel like, I don't know, I feel like they're everywhere though.
00:10:57.500 --> 00:11:00.140
I more and more see them all the major sites.
00:11:00.520 --> 00:11:03.720
Yeah, almost all the ones on Python by Set.fm are WebP.
00:11:04.060 --> 00:11:16.020
I went through the Google page optimization stuff and you know like lighthouse is that what it's called yeah all those things right yeah all those things it's like you need to upgrade to webp you need to upgrade i'm like fine i will upgrade to
00:11:16.140 --> 00:11:29.360
webp and i went through it and yeah they i do think it's actually a slightly a little bit better like is it as big of a deal as they make uh probably not but sometimes it's really nice and and so on it does seem to work pretty seamlessly except for if i go to youtube like for example if
00:11:29.360 --> 00:11:38.520
i want to change the thumbnail for this live version of our recording yeah on a google property it will not allow me to upload a web P file because it says it's not an image.
00:11:38.600 --> 00:11:39.640
I'm like, I'm not surprised.
00:11:39.940 --> 00:11:40.280
It's Google.
00:11:42.880 --> 00:11:52.320
So there's places like that, like, or if you try to set it as the poster for your podcast, a lot of the podcast apps can't display web P even though the platform can't, like, there's just like a little hang up.
00:11:52.580 --> 00:11:56.520
I imagine though it's like, there are people like, I want web P stop turning it back into something else.
00:11:56.630 --> 00:11:57.600
I put it there on purpose.
00:11:58.140 --> 00:11:58.960
Cause Google told me to.
00:11:59.140 --> 00:11:59.720
Cause you did it.
00:11:59.720 --> 00:12:00.320
Cause this is optimized.
00:12:00.510 --> 00:12:13.920
It was funny because a lot of platforms are just a little behind the times on what image because obviously they're trying to protect their platforms and not allow random images or random not images to be uploaded as images so i think a little uh thumbnail.exe for example right
00:12:14.110 --> 00:12:23.880
right it's a little peer pressure to get folks to do the right thing would probably go a long way so google google if you're listening go update your uh application to support webp for that exactly
00:12:24.320 --> 00:12:29.620
youtube team just yeah add a star.webp in there come on let's do it so and more importantly in
00:12:29.400 --> 00:12:40.980
in this release, there are some five major security fixes. The page admin API restrictions, document identification by a SHA-1 hash, the descendant collections and documents and images
00:12:41.240 --> 00:12:50.500
API, and the snippet copy permissions, and the page translation endpoint have all had fixes. I highlighted them here on the screen, but you can go see those in the release notes. They're called
00:12:50.640 --> 00:13:04.800
out with the big security fix prefix there. Also of note is formalized. They now have formalized django 6.1 support and the ci now runs with uh uv and a lock file so the uv is takeover is it's
00:13:04.800 --> 00:13:15.620
been successful in the wagtail community very cool yeah wagtail is neat i'm glad it's getting the love and april that's a big release yeah and i think this will tie in with your later segment the
00:13:16.180 --> 00:13:27.020
the intentionality and the sophistication by which they tie themselves to specific releases so that you know you are well supported by the community, by the bug fixes, by the maintainers.
00:13:27.180 --> 00:13:29.660
All that lines up really, really well in the Wagtail community.
00:13:29.960 --> 00:13:33.040
And we'll talk about it a little more when you get into the Django stuff as well.
00:13:33.160 --> 00:13:33.420
Absolutely.
00:13:33.920 --> 00:13:37.880
Well, before we get to that, though, maybe a quick thanks to our sponsor.
00:13:38.120 --> 00:13:38.700
That sounds awesome.
00:13:39.140 --> 00:13:39.300
Yeah.
00:13:39.390 --> 00:13:45.320
So thank you, Pydantic and thank you, Logfire, their observability platform from Pydantic.
00:13:45.640 --> 00:13:46.420
So here's the situation.
00:13:46.760 --> 00:13:49.080
Your AI agent failed at 2 a.m.
00:13:49.380 --> 00:13:51.760
Was it the model, a tool call, the database?
00:13:52.240 --> 00:13:55.520
Most observability tools can't tell you because they only see part of the stack.
00:13:55.860 --> 00:13:57.560
Pydantic Logfire sees all of it.
00:13:57.700 --> 00:14:00.820
One trace across all your agents, LLMs, APIs, and databases.
00:14:01.320 --> 00:14:04.880
Down to the infrastructure, services, Kubernetes, as well as hosts.
00:14:05.200 --> 00:14:09.060
It's built on open telemetry with SDKs for Python, TypeScript, and Rust.
00:14:09.330 --> 00:14:11.760
And it works with any hotel compatible language.
00:14:12.180 --> 00:14:16.680
Every prompt, token count, cost right in your vector searches and API calls.
00:14:16.960 --> 00:14:20.800
You query everything with a Postgres compatible SQL language.
00:14:21.320 --> 00:14:22.980
So super easy to do.
00:14:23.390 --> 00:14:24.880
You get reports and slice and dice them.
00:14:25.280 --> 00:14:29.800
And your coding agent can get there through the Logfire MCP server.
00:14:30.060 --> 00:14:30.900
So stop guessing.
00:14:31.300 --> 00:14:31.820
Read the trace.
00:14:32.280 --> 00:14:33.960
Once you have it installed, you'll have the trace, right?
00:14:34.500 --> 00:14:35.120
Logfire AI.
00:14:35.380 --> 00:14:37.560
AI, it's still just engineering.
00:14:37.920 --> 00:14:40.920
I'm actually going to close out the show with a little sidebar on that.
00:14:41.060 --> 00:14:43.980
But visit pythonbytes.fm/logfire today and sign up.
00:14:44.060 --> 00:14:45.760
You'll get 10 million records for free every month.
00:14:45.960 --> 00:15:00.360
no card acquired. And we talked about last time, you can even click the onboard your project with your coding agent, which instantly copies a markdown block. You just paste into cloud or codex and it will go on it. I'm on it. You're going to have a log fire in your app. So give me 10
00:15:00.470 --> 00:15:03.180
minutes. So thank you to Pydantic for supporting the show.
00:15:03.320 --> 00:15:06.580
And count feature. I think they're downplaying that. They need to put that front and center.
00:15:06.940 --> 00:15:07.700
That's going to be a big deal.
00:15:07.980 --> 00:15:10.200
Yeah. That's the one that you all are chasing, right?
00:15:10.640 --> 00:15:18.940
Yeah, totally right now. So I don't want to turn this into a full segment, but I think that There's a lot to be said for having that just right out of the box with their tools.
00:15:19.440 --> 00:15:19.880
So very cool.
00:15:19.990 --> 00:15:23.120
Well, thanks Pydantic Logfire for being a sponsor.
00:15:23.520 --> 00:15:27.780
This is the one non-webby thing on here, but could have a web implication.
00:15:28.340 --> 00:15:34.860
So the Python Software Foundation has announced RISC-V support is now officially supported by CPython.
00:15:35.000 --> 00:15:36.840
Why would anyone care?
00:15:37.780 --> 00:15:38.600
So I'll get into that.
00:15:38.900 --> 00:15:45.320
So RISC-V is a CPU architecture, and it's technically so important fits here.
00:15:45.400 --> 00:15:48.000
It's now a tier three platform under PEP 11.
00:15:48.260 --> 00:15:57.720
So the rules for when they build, what they build, how they support, fast-summing gets prioritized for fixes, all comes into play when saying it's a tier three platform.
00:15:57.840 --> 00:16:00.100
But it does mean someone's watching and someone does care.
00:16:00.700 --> 00:16:03.080
So this is specifically for 64-bit Linux.
00:16:03.780 --> 00:16:16.660
So that means that if you've got single board computers, kind of like Raspberry Pis, but they're running alternate architectures like RISC-V, which there's quite a few of those out there on the market right now, you can now depend on there being a Python
00:16:16.980 --> 00:16:28.600
build that will run on your architecture and not having it be kind of a maybe it'll work. So this opens up a lot of things in like maybe the IoT space, the home automation space. There's a lot of
00:16:28.780 --> 00:16:41.360
at-edge computing applications here where now Python can be a number one potentially choice for the coding, application building, deploying at edge, and you're not relying on just maybe lower
00:16:41.470 --> 00:16:53.520
level languages. So hopefully this opens up some of that IRT space to other folks. So yeah, like the RISC-V is an open architecture that anyone can implement, unlike the x86 and ARM, which are like
00:16:53.820 --> 00:17:05.819
closed. But its market is projected to quadruple by 2032. So we expect to see more news about RISC-V of architectures and processors, especially given all the hype around GPUs and things like that
00:17:05.839 --> 00:17:16.199
right now. So what changes? The push now maintained with a compatibility target. CPython changes are going to be less likely to quietly break it. That means that they got to take care of it. Someone's
00:17:16.280 --> 00:17:27.639
basically watching. What you don't get, there are no Python.org installers yet and no binary wheel parity for native extensions. So if you've got an extension that depends on a C compiled or a
00:17:27.660 --> 00:17:38.080
Rust compiled binary piece that's still on you to compile and enroll your own. But at least this is a step in the right direction. And if their market share is going to quadruple, it's nice to see
00:17:38.220 --> 00:17:43.300
Python taking proactive measures to ensure we have compatibility there. See what else we got in here.
00:17:43.660 --> 00:17:53.959
Yeah. The one thing that folks may also think would be happening is, for example, you're familiar with SP32 boards. If you do any kind of home automation or any kind of like hacking on hardware
00:17:54.060 --> 00:18:07.560
or IoT. You've probably heard of the SP32 platform or the Raspberry pypyco, Pico2 platform. Those are RISC-V processors, but they are not 64-bit Linux RISC processors. So there's not necessarily support
00:18:07.780 --> 00:18:19.060
yet for those embedded processors. You're still going to want to use MicroPython or CircuitPython for those kinds of applications. But if you're using something like the Vision 5 board, there's
00:18:19.060 --> 00:18:27.580
a couple other boards out there on the market that are more like Raspberry Pis. You'll now have support. You can embed those, put them at the edge. There's reasons why you may do that. For example,
00:18:27.840 --> 00:18:40.060
costs, supply, demand, power, efficiency, energy usage, a lot of special cases here. But again, I think it's kind of exciting news. I'm a nerd when it comes to like hardware and architectures,
00:18:40.210 --> 00:18:50.439
and I know not everyone cares, but it does mean you could run Django on a RISC-V processor now reliably and have releases out there that will guarantee to work. So that's what the news is
00:18:50.460 --> 00:19:01.240
the risk five i love it yeah that's really cool it's easy to think okay mac Linux windows arm x86 that's what we got to support right but there's a bunch of little little tiny devices exactly
00:19:01.710 --> 00:19:13.680
we all run on like here's my 25 esp32 if it were 64 then i'd be even more excited i run circuit python on it but yeah the ability to reach all these little so many little niche things
00:19:14.000 --> 00:19:22.880
well and there's been recently there's been shortage of raspberry pi vives for example So I think that helps with the supply chain issues potentially.
00:19:23.540 --> 00:19:27.540
And again, from power and efficiency, we see this thing quadrupling.
00:19:27.810 --> 00:19:29.040
We better make sure Python's there.
00:19:29.320 --> 00:19:31.400
So I'm excited to see the Python community making that happen.
00:19:31.480 --> 00:19:31.760
As well.
00:19:32.340 --> 00:19:32.700
I'm as well.
00:19:33.080 --> 00:19:37.120
My experience working with effectively MicroPython, it's super cool in the language.
00:19:37.320 --> 00:19:39.960
It's Python, but there's a lot of stuff like, you want this library?
00:19:40.280 --> 00:19:41.180
No, no, no, no, no.
00:19:41.230 --> 00:19:41.700
You don't get that.
00:19:41.910 --> 00:19:45.920
You get something that looks a little bit like it and it sort of works like it, but it's really tricky.
00:19:46.690 --> 00:19:48.580
So the more it can just be the same, the better.
00:19:48.920 --> 00:19:58.760
Yeah. So I assume this will eventually trickle down into, who knows, maybe MicroPython will kind of just disintegrate, fade into the background, just genuine support for the architecture now that this is here.
00:19:58.920 --> 00:20:06.020
Maybe it becomes a little bit like an anaconda. It is the same Python, but it's more ready for you to actually do stuff with. Who knows?
00:20:06.240 --> 00:20:11.440
Yeah. Yeah. Well, speaking of supporting languages, I think you've got a little mixed up here.
00:20:12.880 --> 00:20:16.040
Let's talk about Django. I mean, how do I get this? I'm not even at the conference.
00:20:16.380 --> 00:20:18.180
I know, but I saw it on there.
00:20:18.260 --> 00:20:22.280
Like, honestly, I'm glad you're covering this because it's, I think truly, again, important news.
00:20:22.640 --> 00:20:30.680
It speaks to the volumes of how the communities are supporting the software that we're putting out and the vibrancy and viability of open source.
00:20:31.180 --> 00:20:33.700
Yeah, I always feel like with web frameworks, I'm just a flyer.
00:20:33.770 --> 00:20:35.080
I'm like, well, let's try this.
00:20:35.380 --> 00:20:38.280
Maybe it'll go unsupported in six months or maybe it'll be still going strong.
00:20:38.430 --> 00:20:40.780
I don't know, but it's But not with Django.
00:20:40.780 --> 00:20:42.420
But exactly, not with Django.
00:20:42.420 --> 00:20:44.440
And that has been true for a while.
00:20:44.740 --> 00:20:52.920
However, Django's had this sort of multi-stage release where it's like, well, some of the things are just feature releases and they won't last that long.
00:20:53.080 --> 00:20:56.080
And others, these are the LTS or long-term versions.
00:20:56.560 --> 00:21:02.080
And those, if you install and run on those, then you're going to get guaranteed 12 years at least, right?
00:21:02.360 --> 00:21:08.800
Well, the news is, folks, Django is moving to an annual release cycle, part one, by our friend of the show, Carlton Gibson.
00:21:09.200 --> 00:21:14.540
and every release is going to be an LTS, three years of supported version.
00:21:14.900 --> 00:21:15.480
Super cool, right?
00:21:15.820 --> 00:21:17.540
So I think that's really good.
00:21:17.740 --> 00:21:19.000
So let me give you all the details.
00:21:20.320 --> 00:21:22.000
2028, January, 2028.
00:21:22.220 --> 00:21:26.000
It sounds so far away, but probably it'll be here just like, oh, is it 2028?
00:21:26.020 --> 00:21:27.040
I guess, here we go.
00:21:27.520 --> 00:21:28.400
I'm sure we'll cover it then.
00:21:28.700 --> 00:21:38.820
But in 2028 in January, there will be a new version of Django and it won't be called 6.1, 7.0 or whatever the heck it would have otherwise been called.
00:21:38.870 --> 00:21:40.640
It's going to be called Django 2028.
00:21:41.060 --> 00:21:43.180
So they're moving to calendar versioning
00:21:43.480 --> 00:21:44.580
instead of semantic versioning.
00:21:44.720 --> 00:21:45.720
Big fan of calendar versioning.
00:21:45.860 --> 00:21:46.680
Yeah, I am too.
00:21:46.940 --> 00:21:48.700
I'm generally a fan of calendar versioning as well.
00:21:49.020 --> 00:21:52.380
So we're going to have Django 2028, Django 2029.
00:21:52.820 --> 00:21:57.780
And you won't be able to play the game like, hey, what year was Django 3 released?
00:21:58.120 --> 00:21:59.540
I'm really a Django fan like, yeah.
00:21:59.880 --> 00:22:02.660
What year was Django 2028 released?
00:22:02.780 --> 00:22:04.660
Like, I'll tell you what, I bet it was 2028.
00:22:04.980 --> 00:22:05.340
Pretty amazing.
00:22:05.470 --> 00:22:06.360
So that's also helpful.
00:22:06.560 --> 00:22:10.400
Kind of give you a sense of like, oh, we're running on 2026 and it's 2031.
00:22:10.660 --> 00:22:12.140
This is probably not good, folks.
00:22:12.800 --> 00:22:13.740
It's probably not good.
00:22:13.950 --> 00:22:15.880
So it can also kind of be a little bit of a marker.
00:22:16.060 --> 00:22:16.220
All right.
00:22:16.290 --> 00:22:21.040
So every release gets one-year mainstream bug fixes, followed by two years of security and data loss fixes.
00:22:21.420 --> 00:22:25.520
The new release to support the last three years of Python versions.
00:22:25.820 --> 00:22:30.880
So there's this interchange of support guarantees with Python and the next Python release during its first year.
00:22:31.160 --> 00:22:32.940
Calendar version begins in 2028.
00:22:33.780 --> 00:22:40.440
And then from there, three Django versions will be supported anytime because years are a year long and it's three years of support.
00:22:40.920 --> 00:22:41.500
So there we go.
00:22:41.600 --> 00:22:44.780
And most importantly, maybe nothing changes for a year and a half.
00:22:45.160 --> 00:22:49.300
So existing commitments like 6.2 LTS still there as they were before.
00:22:49.660 --> 00:22:50.620
Anything else you want to add to that?
00:22:51.480 --> 00:22:59.180
I think these are the kind of promises that the community needs to make so that business understands that this community is serious.
00:22:59.740 --> 00:23:05.540
If you've got software projects where you are just wishy-washy around what versions you're going to support, what versions it runs on.
00:23:06.360 --> 00:23:10.020
You see this a little bit in the WordPress community, a lot of it in the WordPress community.
00:23:10.380 --> 00:23:13.100
There's not hard and fast, like this should run on this version.
00:23:13.600 --> 00:23:16.680
There's a long-term support that's going to give you bug fixes till this version.
00:23:17.179 --> 00:23:20.760
It's a little more Wild West, I feel like, over there compared to the Django community.
00:23:21.140 --> 00:23:22.620
I think I can make that as a fair statement.
00:23:22.920 --> 00:23:27.220
The Django community is already committed to two long-term supports at any point in time.
00:23:27.440 --> 00:23:29.860
So like right now we've got 5.2 and 6.2 will be coming up.
00:23:30.320 --> 00:23:34.620
Now we're saying there's basically gonna be three versions that will be stable, supported, updated.
00:23:34.980 --> 00:23:48.420
And you have now time in your enterprise planning to make sure you get your software updated to follow the schedule on your schedule and not the emergency schedule because stuff happened and now you gotta deal with it.
00:23:48.600 --> 00:23:57.720
So I feel like that gives a big boost again to the peace of mind of running Django, running Python and doing this all in production and knowing when things are going to happen.
00:23:57.900 --> 00:23:58.800
I'm a huge fan.
00:23:59.100 --> 00:24:00.120
And the calendar version in the boot.
00:24:00.240 --> 00:24:10.220
I, again, love that because, you know, immediately at a glance, if you're three years out of date and just about ready to run out of end of life on LTS, it's right in the name.
00:24:10.360 --> 00:24:10.860
That's right there.
00:24:11.140 --> 00:24:18.200
If I were running an organization based on Django, I would probably just be flipping to the new version pretty much mid-January or something like that.
00:24:18.560 --> 00:24:19.500
I think most do.
00:24:19.980 --> 00:24:23.420
Yeah, most do, but I think there's a class of org that can't.
00:24:23.660 --> 00:24:23.980
Exactly.
00:24:24.210 --> 00:24:24.820
Or just won't.
00:24:24.920 --> 00:24:26.180
They just have a don't touch it principle.
00:24:26.320 --> 00:24:26.620
Is it working?
00:24:26.840 --> 00:24:27.620
Just don't touch it.
00:24:27.660 --> 00:24:27.920
It's working.
00:24:28.240 --> 00:24:31.820
I think this opens up just every February.
00:24:32.520 --> 00:24:33.080
Just have a look.
00:24:33.380 --> 00:24:35.440
What does it cost to upgrade to the next version of Django?
00:24:35.800 --> 00:24:36.540
Do a little automation.
00:24:37.040 --> 00:24:37.660
Give it a go.
00:24:38.010 --> 00:24:38.500
See how it works.
00:24:38.830 --> 00:24:42.960
And that gives you a really solid cadence of just staying to date.
00:24:43.270 --> 00:24:46.180
And even though there's three-year support, I wouldn't have three-year gaps.
00:24:46.190 --> 00:24:51.640
I would have one-year gaps because the number of issues you might run into are, on average, one-third as many.
00:24:51.750 --> 00:24:53.900
So it just makes that little staying on top of it easier.
00:24:54.100 --> 00:25:04.440
Because if you're five years out and you hear something is something catastrophic happens and you need to update for whatever reason, well, you're all of a sudden like juggling a really big migration project, you know, the house on fire.
00:25:04.790 --> 00:25:05.860
So get ahead of it.
00:25:06.270 --> 00:25:18.760
At this point, you can go three years and reliably have your CID pipeline build, you know, once a week, a seven day back off and know you're going to get the security fixes and the peace of mind of always having a patch piece of software that can be automated.
00:25:19.000 --> 00:25:23.640
Like it should be no hands on to make this now a very secure process.
00:25:23.940 --> 00:25:28.640
And if you're doing CI, CD, maybe throw in some knocks and just get different versions or something like that, right?
00:25:28.800 --> 00:25:30.300
Like, hey, might as well automate.
00:25:30.940 --> 00:25:32.040
Yeah, know when they're coming.
00:25:33.140 --> 00:25:34.320
Get ahead of that curve.
00:25:34.760 --> 00:25:41.000
Yeah, we've been doing unit tests in CI against the next version of Django for two months, so probably okay.
00:25:41.000 --> 00:25:47.820
And that, unless you're doing something really kind of off the wall, Django releases are pretty non-events these days in general, which is awesome.
00:25:48.320 --> 00:25:49.920
Well, do you have any extra events?
00:25:50.300 --> 00:25:52.940
Do you have some extra events in here, Michael?
00:25:53.040 --> 00:25:55.260
So a couple quick item here.
00:25:56.000 --> 00:26:02.220
This one was interesting because the Python docs now document the time of built-in types.
00:26:02.640 --> 00:26:08.860
This is not new per se because it's been buried in a wiki that's been aging for years and years and years.
00:26:09.140 --> 00:26:10.220
But it was never front and center.
00:26:10.360 --> 00:26:11.400
And so people had to go look it up.
00:26:11.460 --> 00:26:14.740
It was never associated with the documentation directly.
00:26:14.760 --> 00:26:18.800
So this is just a migration from wiki to official docs.
00:26:18.940 --> 00:26:24.620
And so you can see over here on the list operation, a list copy has an O the N complexity.
00:26:25.080 --> 00:26:36.520
And so if you are evaluating how you might implement specific algorithms, this may matter if you're in a very performance based environment or you're just trying to be more efficient about your coding.
00:26:36.960 --> 00:26:41.100
These will give you all the hints around complexity and gives it for all the various default types.
00:26:41.480 --> 00:26:44.520
So you want to know the complexity of a set compared to a dictionary.
00:26:44.940 --> 00:26:46.460
You can see those things in here.
00:26:46.720 --> 00:26:48.920
The strings and byte arrays and memories.
00:26:49.090 --> 00:26:50.580
So all those are basically baked in.
00:26:50.880 --> 00:26:55.540
You can see in the big O quotation if you're into that kind of thing.
00:26:55.760 --> 00:26:58.380
I was never a computer science major in college.
00:26:58.770 --> 00:27:01.020
So I never learned about this until later in life.
00:27:01.680 --> 00:27:05.180
But that's very helpful because again, kind of next level thinking on that.
00:27:05.960 --> 00:27:07.100
Let me add one thing really quick.
00:27:07.100 --> 00:27:08.500
I saw this as well and this is interesting.
00:27:08.980 --> 00:27:11.780
I wish the list would have like find item as well.
00:27:12.200 --> 00:27:12.940
I don't think it does though.
00:27:13.040 --> 00:27:15.300
because then you could have put that against, or does it?
00:27:15.520 --> 00:27:17.240
Because then you can put it against like dictionary or set.
00:27:17.280 --> 00:27:19.560
You're like, oh, it's a million times faster in set.
00:27:19.680 --> 00:27:19.900
That's weird.
00:27:20.000 --> 00:27:20.680
Maybe we should use that.
00:27:21.420 --> 00:27:22.440
So these are like...
00:27:22.820 --> 00:27:24.020
Especially for performance optimization.
00:27:24.600 --> 00:27:25.280
Yeah, yeah, yeah.
00:27:25.320 --> 00:27:33.220
So it could give people a little bit of an idea, but also I think having this listed here might encourage some new contributions to CPython.
00:27:33.600 --> 00:27:36.320
For example, find range on there if you can.
00:27:36.540 --> 00:27:36.860
There it is.
00:27:37.000 --> 00:27:40.180
So what's the length or the min or the max?
00:27:40.740 --> 00:27:42.840
Like len or min and max, all those.
00:27:43.040 --> 00:27:43.780
is O of N.
00:27:44.680 --> 00:27:46.140
Oh, Gitlin is one.
00:27:46.340 --> 00:27:47.000
Okay, that's pretty good.
00:27:47.300 --> 00:27:48.060
So it does know.
00:27:48.900 --> 00:27:49.840
I guess it's not the...
00:27:49.860 --> 00:27:50.520
It's been around a while.
00:27:50.800 --> 00:27:52.320
No, no, but I still think min and max.
00:27:52.460 --> 00:27:56.080
So for example, when you create a range, you say, what is the starting value?
00:27:56.260 --> 00:27:57.080
What is the N in value?
00:27:57.200 --> 00:27:58.080
And what is the step, right?
00:27:58.380 --> 00:27:58.580
Yeah.
00:27:58.860 --> 00:28:02.760
It should be able to answer O of one what the min and max are, right?
00:28:03.000 --> 00:28:04.540
Because it knows where it starts.
00:28:04.640 --> 00:28:05.920
It knows whether it's positive or negative.
00:28:06.520 --> 00:28:07.280
It was in the arcs.
00:28:07.400 --> 00:28:09.540
It's like a field of the object.
00:28:10.020 --> 00:28:21.100
So for example, somebody might go, why the heck is that determined by the, like, if I have a million items in my range, why is it a million computations when it could just be just like Len looks up the length? Well, one. Yeah,
00:28:21.260 --> 00:28:30.320
it should be oh one. Right. And so I think there might be some like some interesting interplay of performance in the next version of Python for these kinds of things. The other thing I wanted to let
00:28:30.440 --> 00:28:41.960
everyone know about a friend of Python and the language, Bruce Eccle has released his thinking in Python book. So you can go to, I believe the address is thinkinginpython.com. And the whole
00:28:42.060 --> 00:28:53.320
book's here. And he's a great author. I mean, he's been famous for doing this kind of work for decades now in multiple communities. And it's Creative Commons, freely readable online. And
00:28:53.420 --> 00:29:03.120
there's a GitHub with all the examples and solutions in it. But if you're learning Python and you want to know about the insights, idioms, and patterns, this is, I haven't read the book yet because it just released.
00:29:03.710 --> 00:29:08.780
But I got to imagine knowing the author and everything that's going into this, this must be a great place to start.
00:29:08.980 --> 00:29:10.220
Yeah, Bruce does excellent work.
00:29:10.340 --> 00:29:13.460
I've read some of his books and he's been on Talk Python before as well
00:29:13.540 --> 00:29:14.160
and some other panels.
00:29:14.420 --> 00:29:15.080
So yeah, very cool.
00:29:15.430 --> 00:29:15.620
Good job.
00:29:15.760 --> 00:29:16.780
Been around the community, long time.
00:29:17.540 --> 00:29:18.480
Michael, you got any extras?
00:29:19.500 --> 00:29:20.160
I'm feeling a little extra.
00:29:20.620 --> 00:29:22.420
So Are you feeling a little extra?
00:29:22.420 --> 00:29:31.060
Remember last time we talked about uv and it was those older security builds that were source only, but then I'm like, hey, uv is building them.
00:29:31.060 --> 00:29:31.520
That's kind of cool.
00:29:31.880 --> 00:29:32.760
Do you want to upgrade them?
00:29:33.270 --> 00:29:35.180
But then I did a listing of all of the stuff I had.
00:29:35.180 --> 00:29:40.380
I'm like, oh, I've got like a 3.9.3, a 3.94, 3.9.5.
00:29:40.450 --> 00:29:40.820
Like, no.
00:29:41.520 --> 00:29:43.140
I'm kind of scared to see how many I have now.
00:29:43.300 --> 00:29:43.840
Yes, exactly.
00:29:44.200 --> 00:29:48.540
There's like, there's no scenario where I want like seven versions of 3.9.
00:29:48.610 --> 00:29:50.760
I mean, one is enough, certainly of that one.
00:29:50.860 --> 00:29:50.960
Right?
00:29:51.120 --> 00:29:57.780
So I created this little program, little shell utility you can run using, you can uv run it if you like.
00:29:57.950 --> 00:29:58.260
Pretty cool.
00:29:58.420 --> 00:30:06.360
And what it does basically is it goes through and it says, find me all of the uv installed pythons and show me which ones are duplicates.
00:30:06.480 --> 00:30:09.380
So a duplicate might be 3.9.3 and a 3.9.4.
00:30:09.580 --> 00:30:11.080
Like I have two 3.9s, right?
00:30:11.320 --> 00:30:13.880
And you can even say, I want to just print them down.
00:30:13.920 --> 00:30:15.260
So I only have the latest of each major.
00:30:15.720 --> 00:30:22.320
I mean, it's not really a major version, but there's never going to be a three, the four O so I'm going to call 3.8, the eight parts of the major version.
00:30:23.600 --> 00:30:26.060
Anyway, cause we can't have a four.
00:30:26.180 --> 00:30:27.080
It's too, too traumatic.
00:30:27.500 --> 00:30:29.680
So you can just say keep that, or you can say actually keep two.
00:30:29.940 --> 00:30:35.020
You could say I want 3.9.3 and 3.9.2, but no more than that as the older ones, right?
00:30:35.400 --> 00:30:37.120
Anyway, so you can run that, and I ran that here.
00:30:37.120 --> 00:30:45.500
I actually have a little upgrade script that I've run on my computer periodically to upgrade homebrew and that stuff, and then upgrade uv, and then anything that's uv tool installed.
00:30:45.740 --> 00:30:49.340
And so now I've added this thing into the mix, and it says pruning UVs pythons.
00:30:49.820 --> 00:30:56.940
It says, look, you've got 3.14.5 free threaded version, and you've got 3.14.7 free threaded.
00:30:57.320 --> 00:30:58.220
Why don't we drop the last one?
00:30:58.260 --> 00:30:59.600
It says you should remove that, for example.
00:30:59.760 --> 00:31:01.000
So you just say yes, and it takes away.
00:31:01.300 --> 00:31:02.960
So anyway, put that out there for everyone to play with.
00:31:03.040 --> 00:31:03.400
That's awesome.
00:31:03.500 --> 00:31:05.760
If you go back to the script, I want to call out something.
00:31:06.220 --> 00:31:09.600
I absolutely, the very top of your script, you're using the inline dependencies.
00:31:09.700 --> 00:31:09.840
Yeah, yeah.
00:31:10.220 --> 00:31:11.460
The uv run magic.
00:31:11.700 --> 00:31:12.720
I absolutely love.
00:31:12.880 --> 00:31:20.140
I think if you think about, if you could have gone into Claude Code and said, hey, Claude Code, prune my old versions and given it like your kind of rule set.
00:31:20.580 --> 00:31:24.220
And it would have run through and used tokens and found all the ones and use more tokens.
00:31:24.620 --> 00:31:26.140
But here you're giving it a deterministic.
00:31:26.300 --> 00:31:27.020
This is the way to write.
00:31:27.140 --> 00:31:37.280
tools for your own agents and use that that inline script i love that i think there's a good example i think of using exactly that that's good now yeah uv run works it just works i love it yeah yeah it
00:31:37.280 --> 00:31:47.380
does and if i had dependencies that's where it really shines yeah automatically manage that for me yeah yeah it's wonderful yeah and on my older installs of my uv tool projects it did like lose
00:31:47.580 --> 00:31:59.620
track of the virtual environment but apparently in the newer uv installs it will like remap to the like across major versions to like 3.14.3 and 3.14.7, it'll figure out, oh, we can just go to the seven, I believe.
00:32:00.500 --> 00:32:00.720
Nice.
00:32:00.920 --> 00:32:08.720
Anyway, yeah, so it might be a little bit of a pain after you might have to reinstall a few things on the older virtual environments, but I think it's in the future going to be less painful.
00:32:09.100 --> 00:32:11.380
All right, also, very quick AI thing.
00:32:11.800 --> 00:32:13.340
We've not done any AI, so I would like that.
00:32:13.360 --> 00:32:14.860
It's been an AI-free episode so far.
00:32:15.180 --> 00:32:16.140
It has, and this is super quick.
00:32:16.800 --> 00:32:20.640
You know, when you think about Olama, I always thought about Olama as for running local models.
00:32:21.060 --> 00:32:21.160
Yeah?
00:32:21.400 --> 00:32:21.480
Yeah.
00:32:21.560 --> 00:32:23.580
Did you know that they have a cloud version?
00:32:23.610 --> 00:32:24.340
I did know that.
00:32:24.710 --> 00:32:24.820
Yes.
00:32:24.900 --> 00:32:25.900
Yeah, of course you do.
00:32:26.840 --> 00:32:27.660
I knew you would.
00:32:28.050 --> 00:32:31.880
But you can sign up for like $20 a month to get DeepSea, Kimi 3.
00:32:32.030 --> 00:32:33.040
It's very, very inexpensive.
00:32:33.460 --> 00:32:38.660
Yeah, GLM, 5.1, 5.2, all that kind of stuff as a thing you could just add.
00:32:38.660 --> 00:32:46.500
So I'm using this to power my Hermes agent, which is really nice, as an alternative to ChatGPT, which also can be in the mix.
00:32:46.660 --> 00:32:48.300
So I thought that was pretty interesting.
00:32:48.440 --> 00:32:48.600
Yeah.
00:32:48.830 --> 00:32:51.040
Yeah, especially with your ability to run like Kimi K3.
00:32:51.540 --> 00:33:02.060
uh the glm five two the big ones uh yeah yeah these things you couldn't run them yourself so i've been doing like generally yeah i mean if you have if you're if your room is loud you might
00:33:02.080 --> 00:33:12.900
be able to run it but if it's quiet you'll get away with them on the nvidia the spark boxes like if you not not just one but you if you if you daisy chain those things together it will spread
00:33:13.100 --> 00:33:20.680
the memory across two of them you might be able to get one of these running yeah okay if you have an over $10,000 dedicated local AI machine,
00:33:22.360 --> 00:33:24.660
then I consider you a special category.
00:33:24.920 --> 00:33:26.400
Anyway, yeah, so people can check that.
00:33:27.020 --> 00:33:28.260
Thanks to Jeff Triplett for showing me that.
00:33:28.940 --> 00:33:30.960
That's a far more cost-effective way of doing it.
00:33:31.720 --> 00:33:33.860
Couldn't be able to do this for a while until I break $10,000.
00:33:34.240 --> 00:33:36.760
Although I still, I wouldn't hate having a couple of those Spark machines.
00:33:36.820 --> 00:33:37.180
Those are cool.
00:33:37.500 --> 00:33:40.200
All right, I would like to just go back and just have a little comment here.
00:33:40.260 --> 00:33:43.640
And feel free to jump in or not put your hand on the stove.
00:33:43.980 --> 00:33:51.880
So we published this to YouTube and got some comments there, some in favor of our position.
00:33:52.040 --> 00:33:54.020
Others like, what do you mean CodeWork's not doing?
00:33:54.060 --> 00:33:54.840
Like CodeWork is great.
00:33:55.100 --> 00:34:03.220
But more like, more of the comments were like, well, I think you're not taking the negative side of AI seriously enough.
00:34:03.540 --> 00:34:04.020
And it's fair.
00:34:04.440 --> 00:34:06.480
I do, we periodically say it.
00:34:06.660 --> 00:34:08.940
I feel like it's a little bit of a drag to just every week.
00:34:09.060 --> 00:34:10.659
Like, yes, I realize this.
00:34:11.100 --> 00:34:19.419
Anytime we mentioned LLMs, yes, I realize that this, A lot of this information was trained, taken to train with, and it was copyright theft.
00:34:19.879 --> 00:34:21.940
Yes, I realized it's a data center that uses a lot of energy.
00:34:22.159 --> 00:34:23.780
Out there, like we've said that before plenty of times.
00:34:24.080 --> 00:34:28.139
But I think also it's the reason I named it this, Codeberg puts head in sand.
00:34:28.520 --> 00:34:30.480
Not just to like dunk on Codeberg.
00:34:30.659 --> 00:34:31.580
I mean, it's fun and all.
00:34:31.639 --> 00:34:37.520
But the reason is over 90% of software these days, software development is done with AI.
00:34:38.060 --> 00:34:44.000
Not exclusively, not like, no, just, hey, agent, go make me, go make Google or whatever.
00:34:44.260 --> 00:34:45.500
Just keep making software.
00:34:45.720 --> 00:34:48.879
Just pump out software until I tell you to stop, I guess.
00:34:48.940 --> 00:34:49.080
Exactly.
00:34:50.000 --> 00:34:51.780
Until my energy bill is too high.
00:34:52.179 --> 00:34:57.200
But almost all of software these days is at least AI-assisted in a significant way.
00:34:57.600 --> 00:34:58.520
90% and above.
00:34:58.760 --> 00:35:00.120
And it's only going up.
00:35:00.380 --> 00:35:08.220
So when I say things like this, I'm trying to put this on people's radar, especially people who are like, I'm not willing to, I just don't even want to look at it.
00:35:08.420 --> 00:35:09.100
That is a choice.
00:35:09.460 --> 00:35:17.420
But if you want a job as a professional software developer in five years, if you're like, I'm not going to touch AI, I will bet you it's going to be very hard to find a job.
00:35:17.640 --> 00:35:28.900
I already know companies are saying, we're not hiring unless you at least are willing to use AI somewhat, or this is a skill that needs to be learned. And it is an important part, even if
00:35:28.930 --> 00:35:41.160
you don't like it. It's like saying, I don't like object-oriented programming, but all of a sudden everything is Java and C-sharp. You're like, well, they only have objects. So you're going to have to just do a little bit of it. You know what I mean? Anyway, I just wanted to put that as a comment.
00:35:41.240 --> 00:35:50.180
is like i'm not trying to dunk on people who don't believe in it but i do think if if you put your head in the sand it's it's gonna have a negative consequence on your career i don't know how do you
00:35:50.180 --> 00:35:59.520
feel about this calvin if you want to say yeah i think to be eyes wide open and pragmatic pragmatic about our position on this in this trip i can't i don't want to imagine going back and not having an
00:35:59.680 --> 00:36:11.840
ai assisted environment because it is very enjoyable to get so much done um because i can guide these tools that that way if you like creating software it's incredible and i hate saying like oh now
00:36:11.980 --> 00:36:26.740
we're being complacent in our usage of say like copyright infringed material that has gone into the trainings models but i don't know how we can i don't know i don't know what you can do about that i don't it's not going back in the box right it's not going back in the box um and was what maybe
00:36:26.840 --> 00:36:38.300
there was an issue with the copyright law to begin with and maybe there's a way people need to we can compensate people so that this is fair uh well at least more equitable and i would like to put out
00:36:38.400 --> 00:36:48.840
there that some ai companies are doing that but the most haven't i would imagine yeah but i just think this it's like around the dot-com boom saying ah we don't want to talk about the web could do that
00:36:49.080 --> 00:37:00.560
but a lot of the stuff is happening on the web right now like and i think this is bigger in terms of the sort of transformational wave like 90 right 90 of software development wasn't the web in the
00:37:00.440 --> 00:37:04.320
the year 2000. I don't think so. No, no, we're going to, we're going to be the pets.com for
00:37:04.640 --> 00:37:08.980
human knowledge. Exactly. We have dancing monkeys spending a million dollars every 30 seconds.
00:37:09.380 --> 00:37:14.300
That was a, that was a Superbowl ad around the dot com days. For those of you who are of an age.
00:37:14.680 --> 00:37:19.200
Yeah, exactly. It was my favorite one, I think. But look, I mean, I understand the drawbacks.
00:37:19.260 --> 00:37:28.200
I understand what it's doing to software teams. I understand what it, the effects on like copyright right information and the effects on people's jobs.
00:37:28.360 --> 00:37:33.900
But at the same time, it's 90%, it's really a challenge to ignore 90% of the industry.
00:37:35.040 --> 00:37:39.060
And some of the comments are like, well, the people who can actually think and who aren't idiots.
00:37:39.280 --> 00:37:39.840
It's like, you know what?
00:37:40.040 --> 00:37:42.260
Not everyone who chooses to use these tools is a need.
00:37:42.320 --> 00:37:44.140
That's a little bit harsh perspective.
00:37:44.220 --> 00:37:51.020
So I think it's worth, I don't know, I just want to put that out there 'cause I feel like people are just like, oh, you're just flippant about it.
00:37:51.020 --> 00:38:02.160
I'm like, no, it's just really transformational significant and we're going to have to deal with it like it or not because it's not going back in the box agree okay now there we go after all that are we actually ready for a joke i think
00:38:03.819 --> 00:38:07.520
i'm ready for i'm ready for i think we need a joke we need a joke and this that was a little
00:38:07.680 --> 00:38:18.080
philosophical wouldn't you say i would okay okay what do you offer me well did you ever read the tau to ten sort of the tau like the traditional chinese one no have you read the
00:38:18.240 --> 00:38:25.340
tau of programming oh i would like to i would like to do a guided reading of the tau programming We haven't done this for a while.
00:38:25.390 --> 00:38:26.660
So let's go over to the corporate wisdom.
00:38:27.480 --> 00:38:33.540
I can't link to it because it's like a weird, God, this is like the oldest website that could be made in 1995.
00:38:34.240 --> 00:38:35.740
Is this hosted on GeoCities?
00:38:35.900 --> 00:38:36.600
What is going on here?
00:38:36.660 --> 00:38:39.260
It might be, and oh my gosh, it even has a gradient background.
00:38:39.779 --> 00:38:40.140
Yes.
00:38:40.440 --> 00:38:41.500
All right, let's see.
00:38:42.300 --> 00:38:44.160
I don't think I can get it to do like a reader view.
00:38:44.390 --> 00:38:50.740
Oh, well, let's do a couple of sections from book seven, corporate wisdom from the Tao of programming, okay?
00:38:51.020 --> 00:38:51.300
Okay.
00:38:52.080 --> 00:38:58.520
7.1 The Novice Asks the Master: In the East, there is a great tree, structure that men call "corporate headquarters."
00:38:58.560 --> 00:39:01.420
It is bloated out of shape with vice presidents and accountants.
00:39:01.680 --> 00:39:06.700
Its issues, it issues a multitude of memos, each saying "go hence" or "go hither."
00:39:06.960 --> 00:39:08.420
Nah, nobody knows what is meant.
00:39:08.720 --> 00:39:12.500
Every year new names are put onto the branches, but all to no avail.
00:39:12.960 --> 00:39:15.080
How can such an unnatural entity exist?
00:39:15.540 --> 00:39:21.240
The Master calmly replies: You perceive this immense structure and are disturbed that it has no rational purpose.
00:39:21.840 --> 00:39:28.320
you not take amusement from its endless gyrations? Do you not enjoy the untroubled ease of programming
00:39:28.490 --> 00:39:34.240
beneath its sheltered branches? Why are you bothered by its uselessness? Where did you find this gem?
00:39:34.350 --> 00:39:45.520
Oh, it's so good, isn't it? Oh my gosh. I'll do a little bit of, I think, I think 7.3. I'll do a little 7.3, then we'll call it. The magician of the ivory tower brought his latest invention to
00:39:45.520 --> 00:39:51.700
the master programmer to examine. The magician wheeled a large black box into the master's office while the master waited in silence.
00:39:52.020 --> 00:39:56.080
This is an integrated, distributed, general-purpose workstation, began the magician.
00:39:56.640 --> 00:40:03.360
Ergonomically designed with a proprietary operating system, sixth-generation languages, and multiple state-of-the-art user interfaces.
00:40:03.780 --> 00:40:07.200
It took my assistants several hundred man years to construct it.
00:40:07.380 --> 00:40:08.020
Is it not amazing?
00:40:08.330 --> 00:40:09.940
The master raised an eyebrow slightly.
00:40:10.320 --> 00:40:11.760
It is indeed amazing, he said.
00:40:12.060 --> 00:40:16.220
Corporate Headquarters has commanded, continued the magician, that everyone use this workstation.
00:40:16.520 --> 00:40:18.980
As a new platform for their programs, do you agree to this?
00:40:19.240 --> 00:40:20.420
Certainly, replied the master.
00:40:20.620 --> 00:40:23.320
I will have it transported to the data center immediately.
00:40:24.200 --> 00:40:26.220
And the magician returned to his tower, well pleased.
00:40:26.600 --> 00:40:32.020
Several days later, a novice wandered into the office of the master program and said, I cannot find the listing for my new program.
00:40:32.320 --> 00:40:33.300
Do you know where it might be?
00:40:33.660 --> 00:40:34.420
Yes, replied the master.
00:40:34.620 --> 00:40:37.040
The listings are stacked on the platform in the data center.
00:40:37.820 --> 00:40:38.140
There you go.
00:40:39.260 --> 00:40:41.480
So this is a fun read.
00:40:41.660 --> 00:40:43.060
You can't do too much of it.
00:40:43.140 --> 00:40:48.580
It's a thick, long joke, but we'll maybe come back to maintenance in a couple months or something.
00:40:48.600 --> 00:40:58.120
books we can go through here let's fake the master programmer though a program be three lines long someday it will have to be maintained all right yeah that's a good that's a good one right there
00:40:58.660 --> 00:41:10.640
great one great one great one to end on indeed all right well very fun michael and uh i'm gonna go back to Django con we'll talk to you all next week yeah have a great time at Django con and yeah see you next week sounds good bye