WEBVTT

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

00:00:06.020 --> 00:00:10.900
<v Michael Kennedy>This is episode 468, recorded February 2nd, 2026.

00:00:11.960 --> 00:00:12.580
<v Michael Kennedy>I'm Michael Kennedy.

00:00:12.950 --> 00:00:13.640
<v Michael Kennedy>And I'm Brian Ecken.

00:00:13.980 --> 00:00:15.600
<v Michael Kennedy>This episode is brought to you by us.

00:00:16.260 --> 00:00:23.000
<v Michael Kennedy>Brian's books, his new Lean TDD book, which you can get right now and is in development, but almost done.

00:00:23.320 --> 00:00:23.440
<v Michael Kennedy>Yes.

00:00:24.600 --> 00:00:26.080
<v Michael Kennedy>He's going to be done this week, folks.

00:00:26.240 --> 00:00:26.640
<v Michael Kennedy>Don't worry about it.

00:00:28.020 --> 00:00:30.780
<v Michael Kennedy>My Python and production book has been going strong as well.

00:00:30.900 --> 00:00:31.560
<v Michael Kennedy>That's really fun one.

00:00:31.880 --> 00:00:35.360
<v Michael Kennedy>And of course, our courses, all the links for those things are in the show notes.

00:00:35.940 --> 00:00:38.400
<v Michael Kennedy>Follow us on the socials, sign up for the newsletter.

00:00:38.880 --> 00:00:39.740
<v Michael Kennedy>We don't spam you.

00:00:39.830 --> 00:00:44.240
<v Michael Kennedy>We just send you updates about the, about the episodes, extra information,

00:00:44.480 --> 00:00:48.000
<v Michael Kennedy>more links, that kind of thing, as well as a periodic announcement of like, Hey,

00:00:48.200 --> 00:00:51.240
<v Michael Kennedy>we've got a new course or a new book or whatever it is we're up to, you know,

00:00:51.420 --> 00:00:52.860
<v Michael Kennedy>things like that, but we don't give it away.

00:00:53.290 --> 00:00:54.080
<v Michael Kennedy>We don't sell it.

00:00:54.440 --> 00:00:54.920
<v Michael Kennedy>Things like that.

00:00:55.080 --> 00:01:01.260
<v Michael Kennedy>And with that, like a bolt of lightning striking out of the blue, what do we got?

00:01:01.920 --> 00:01:03.600
<v Brian Okken>Well, we've got Django Bolt.

00:01:04.830 --> 00:01:12.420
<v Brian Okken>So Django Bolt is actually, I learned about Django Bolt because I was looking at the Django

00:01:12.640 --> 00:01:18.700
<v Brian Okken>chat website and or the Django chat and they had a, they had an episode building a Django

00:01:18.980 --> 00:01:23.480
<v Brian Okken>API framework faster than FastAPI, which of course I was interested in.

00:01:24.000 --> 00:01:27.920
<v Brian Okken>And so this episode actually discusses Django Bolt.

00:01:29.519 --> 00:01:35.100
<v Brian Okken>And Django Bolt is a Rust powered behind the scenes,

00:01:35.250 --> 00:01:36.280
<v Brian Okken>but it's inspired.

00:01:36.580 --> 00:01:37.900
<v Brian Okken>It's a, so it's like fast,

00:01:39.120 --> 00:01:40.640
<v Brian Okken>like we already have Django Rust framework

00:01:40.900 --> 00:01:41.760
<v Brian Okken>and there's Django Ninja,

00:01:42.370 --> 00:01:46.200
<v Brian Okken>but this is along those lines of trying to get

00:01:46.970 --> 00:01:48.460
<v Brian Okken>an API framework for Django.

00:01:49.340 --> 00:01:50.760
<v Brian Okken>The inspiration is kind of interesting.

00:01:51.540 --> 00:01:53.780
<v Brian Okken>I think down near the bottom.

00:01:54.520 --> 00:01:58.040
<v Brian Okken>There's inspired by, oh, inspired by Django REST framework,

00:01:58.340 --> 00:02:00.480
<v Brian Okken>FastAPI, Litestar, and Robin.

00:02:00.920 --> 00:02:04.760
<v Brian Okken>Apparently some of the Rust Python,

00:02:05.979 --> 00:02:07.740
<v Brian Okken>the integrating Rust and Python

00:02:08.100 --> 00:02:09.880
<v Brian Okken>was inspired by some of the Robin project.

00:02:10.000 --> 00:02:11.780
<v Brian Okken>I don't know anything about Robin, actually.

00:02:12.140 --> 00:02:19.040
<v Brian Okken>So interesting, different take on APIs for Django.

00:02:19.740 --> 00:02:30.420
<v Brian Okken>And one of the things that was really interesting, especially in the discussion on the podcast, was the timing of it, trying to figure out how fast things are.

00:02:30.500 --> 00:02:33.600
<v Brian Okken>And there's issues with that.

00:02:33.600 --> 00:02:39.040
<v Brian Okken>But apparently he used a ton of graphs, a ton of charts, so you can look at what's going on.

00:02:39.480 --> 00:02:49.620
<v Brian Okken>Also, in the act of doing that, realize that even Django REST framework, if you configure things in a certain way, you can do off-the-shelf things.

00:02:49.640 --> 00:02:51.440
<v Brian Okken>things and get it pretty fast anyway.

00:02:52.220 --> 00:02:54.740
<v Brian Okken>But so this is an interesting take.

00:02:55.210 --> 00:02:57.120
<v Brian Okken>So there's a bunch of leaks we're going to link to.

00:02:57.300 --> 00:03:00.280
<v Brian Okken>There's the Django Bolt repository.

00:03:00.780 --> 00:03:03.460
<v Brian Okken>The documentation is set up and it's pretty good.

00:03:03.630 --> 00:03:05.100
<v Brian Okken>Oh, I should back up.

00:03:05.280 --> 00:03:09.800
<v Brian Okken>There's a little warning in it that it's still in progress.

00:03:10.560 --> 00:03:11.900
<v Brian Okken>It's under active development.

00:03:12.260 --> 00:03:13.320
<v Brian Okken>So be aware of that.

00:03:13.620 --> 00:03:15.900
<v Brian Okken>OK, then there's the podcast episode.

00:03:16.440 --> 00:03:27.660
<v Brian Okken>And then just recently, somebody came out with a video walking through using Django Bolt, which is an interesting discussion.

00:03:28.540 --> 00:03:31.460
<v Brian Okken>And I actually just watched the first part of it.

00:03:31.470 --> 00:03:38.420
<v Brian Okken>The first part of it actually talks about some of the ecosystem around APIs in Django and then walking through a little bit of it.

00:03:38.600 --> 00:03:42.240
<v Brian Okken>So pretty interesting take on APIs.

00:03:42.720 --> 00:03:43.740
<v Michael Kennedy>Yeah, that is super interesting.

00:03:44.640 --> 00:03:46.020
<v Michael Kennedy>I've been looking at Django Bolt as well.

00:03:46.100 --> 00:03:50.900
<v Michael Kennedy>it's not because I plan to use it because my websites are not in Django but just it's got

00:03:50.900 --> 00:03:56.540
<v Michael Kennedy>some really interesting ideas out there and yeah also note on the performance thing do your own

00:03:56.740 --> 00:04:00.840
<v Michael Kennedy>performance testing put stuff I think it's more the more importantly people should think about this

00:04:01.340 --> 00:04:07.060
<v Michael Kennedy>as side by side like three or four weeks ago when I did my Python numbers everyone should know

00:04:07.400 --> 00:04:13.180
<v Michael Kennedy>every Python developer should know people said well you did this on a m4 pro cpu and it's not

00:04:13.200 --> 00:04:17.799
<v Michael Kennedy>going to be the same when you run it on a five dollar crappy server in the cloud i'm like true

00:04:18.260 --> 00:04:22.120
<v Michael Kennedy>but if i run it on a five dollar server the people go well it doesn't run that's not comparable to my

00:04:22.500 --> 00:04:27.780
<v Michael Kennedy>high-end server or whatever right like it's more like okay this one is relative to that this is

00:04:27.860 --> 00:04:32.820
<v Michael Kennedy>like 2x of that other one or something right so just keep that in mind right yeah i mean numbers

00:04:32.980 --> 00:04:38.940
<v Brian Okken>are tested on right but also i mean as long as the numbers are relatively tested you're doing

00:04:39.340 --> 00:04:45.980
<v Brian Okken>you're doing a and b on the same hardware now there there might be differences in the um the

00:04:46.260 --> 00:04:53.220
<v Brian Okken>the behind the c the c python implementation based on different hardware and to the point where one

00:04:53.600 --> 00:04:58.220
<v Brian Okken>technique will work better on some platform than another but i don't think a lot of people are

00:04:58.540 --> 00:05:05.080
<v Michael Kennedy>thinking in the dirt that much but anyway yeah yeah uh one quick bit of real-time follow-up from

00:05:05.020 --> 00:05:05.920
<v Michael Kennedy>and posts in the audience.

00:05:06.220 --> 00:05:07.360
<v Michael Kennedy>My first job was in Django.

00:05:07.520 --> 00:05:09.840
<v Michael Kennedy>I always loved Django ORM plus migrations framework

00:05:10.040 --> 00:05:12.960
<v Michael Kennedy>and Django Bolt connects ORM with fast async stuff,

00:05:13.120 --> 00:05:14.020
<v Michael Kennedy>which is really cool indeed.

00:05:14.220 --> 00:05:15.840
<v Michael Kennedy>Yeah, it seems like a neat project.

00:05:16.360 --> 00:05:17.840
<v Michael Kennedy>Yeah, it'll be something to watch.

00:05:18.180 --> 00:05:20.180
<v Michael Kennedy>Indeed, but did he mention async?

00:05:21.500 --> 00:05:25.260
<v Michael Kennedy>What if you had leaks in your async code?

00:05:25.900 --> 00:05:28.140
<v Michael Kennedy>So I want to talk about this thing called PyLeak.

00:05:28.400 --> 00:05:33.600
<v Michael Kennedy>So PyLeak detects leaked async tasks, threads,

00:05:34.100 --> 00:05:41.560
<v Michael Kennedy>event loop blocking. So that's not exactly a leak, but it's kind of a leak. So it's non-async code

00:05:41.680 --> 00:05:46.300
<v Michael Kennedy>leaking into async sections. When I first saw this, I thought it was a memory diagnosing thing,

00:05:46.430 --> 00:05:52.800
<v Michael Kennedy>but what it's for is diagnosing async tasks that if you've ever seen like this, this task was not

00:05:52.900 --> 00:05:58.520
<v Brian Okken>awaited or something like that. And it's got a really nice programming model, but this is,

00:05:59.000 --> 00:06:00.640
<v Michael Kennedy>This is something that certainly can happen.

00:06:01.060 --> 00:06:09.040
<v Michael Kennedy>I will tell you if you run the ty or the Pyrefly typing integration with your editor and maybe

00:06:09.240 --> 00:06:14.760
<v Michael Kennedy>PyCharm, I don't think PyCharm does this, but those two will put, PyCharm will detect

00:06:14.900 --> 00:06:19.180
<v Michael Kennedy>that the stuff is not being treated right, but the others do inline type overlays.

00:06:19.660 --> 00:06:24.100
<v Michael Kennedy>So you'll have like x equals some function call and you think x is an integer.

00:06:24.660 --> 00:06:28.640
<v Michael Kennedy>If it says x and then in little gray, like it's not really in the code, but it's putting

00:06:28.660 --> 00:06:31.840
<v Michael Kennedy>colon, coroutine of something, something int.

00:06:32.040 --> 00:06:33.860
<v Michael Kennedy>You're like, oh, I forgot to await that.

00:06:34.720 --> 00:06:37.060
<v Michael Kennedy>Because this is coming back as the unexecuted coroutine,

00:06:38.650 --> 00:06:40.860
<v Michael Kennedy>not the number, the integer, right?

00:06:41.120 --> 00:06:43.900
<v Michael Kennedy>That it's easy to do if you're writing regular async code,

00:06:44.020 --> 00:06:46.720
<v Michael Kennedy>but it's really easy to do if what you're doing

00:06:47.260 --> 00:06:50.380
<v Michael Kennedy>is converting a synchronous program to an async program.

00:06:50.900 --> 00:06:53.960
<v Michael Kennedy>Because every call site of every function is synchronous,

00:06:54.150 --> 00:06:56.420
<v Michael Kennedy>and then you go make those functions asynchronous,

00:06:57.070 --> 00:06:58.620
<v Michael Kennedy>and then you try to go back and fix them

00:06:58.640 --> 00:06:59.300
<v Michael Kennedy>everywhere you called them.

00:06:59.699 --> 00:07:02.600
<v Michael Kennedy>It's not a syntax or a runtime error, usually,

00:07:02.840 --> 00:07:05.280
<v Michael Kennedy>a lot of times, to actually not call that.

00:07:05.520 --> 00:07:06.160
<v Michael Kennedy>It'll just run.

00:07:06.600 --> 00:07:07.720
<v Michael Kennedy>So for example, if you have x,

00:07:08.340 --> 00:07:10.840
<v Michael Kennedy>let's say x equals some function call.

00:07:11.200 --> 00:07:12.480
<v Michael Kennedy>It normally gives you back a number,

00:07:12.560 --> 00:07:13.560
<v Michael Kennedy>you wanna make sure it's not zero.

00:07:13.620 --> 00:07:16.320
<v Michael Kennedy>So you'd say if x, if not x or if x,

00:07:16.440 --> 00:07:17.000
<v Michael Kennedy>something like that, right?

00:07:17.240 --> 00:07:20.380
<v Michael Kennedy>Well, when it's a coroutine, your if x still runs,

00:07:20.840 --> 00:07:21.640
<v Michael Kennedy>it's just always true.

00:07:22.120 --> 00:07:22.940
<v Michael Kennedy>And things like that, right?

00:07:23.340 --> 00:07:24.200
<v Michael Kennedy>- Oh, yeah. - It's 'cause it's,

00:07:24.200 --> 00:07:25.620
<v Michael Kennedy>is the coroutine falsy?

00:07:25.820 --> 00:07:27.979
<v Michael Kennedy>No, there's only like five or six things

00:07:28.000 --> 00:07:29.760
<v Michael Kennedy>and Python that are falsing and coroutine is not.

00:07:29.960 --> 00:07:30.860
<v Michael Kennedy>So it's true, keep going.

00:07:31.240 --> 00:07:32.040
<v Michael Kennedy>It's really sketch.

00:07:32.640 --> 00:07:34.500
<v Michael Kennedy>So those are super hard to catch.

00:07:34.740 --> 00:07:35.900
<v Michael Kennedy>And this is the kind of thing

00:07:36.180 --> 00:07:37.540
<v Michael Kennedy>that theoretically will catch it.

00:07:37.860 --> 00:07:38.320
<v Michael Kennedy>So pretty neat.

00:07:38.680 --> 00:07:41.600
<v Michael Kennedy>Anyway, it depends how you start it, I believe.

00:07:42.020 --> 00:07:43.560
<v Michael Kennedy>You've gotta do like a create task

00:07:43.660 --> 00:07:44.580
<v Michael Kennedy>where the task has to be running.

00:07:44.700 --> 00:07:45.940
<v Michael Kennedy>If you just create a coroutine

00:07:46.120 --> 00:07:47.320
<v Michael Kennedy>and don't do anything with it,

00:07:47.360 --> 00:07:49.080
<v Michael Kennedy>it probably still won't catch it, just to be clear.

00:07:49.580 --> 00:07:50.540
<v Michael Kennedy>Anyway, so here's how it works.

00:07:50.800 --> 00:07:53.860
<v Michael Kennedy>You can say, create a context manager

00:07:54.120 --> 00:07:55.360
<v Michael Kennedy>with block and async with block,

00:07:55.460 --> 00:08:03.020
<v Michael Kennedy>you say with no task links leaks and you run some code and here's a function call to create a task

00:08:03.200 --> 00:08:06.940
<v Michael Kennedy>that is never awaited you wait long enough for that to come into existence and you're going to

00:08:06.950 --> 00:08:12.880
<v Michael Kennedy>get an error right or this also works for threads just create a thread and never wait for it to stop

00:08:13.140 --> 00:08:18.240
<v Michael Kennedy>so the context here is within this block of code i might be starting threads but they should all be

00:08:18.360 --> 00:08:23.839
<v Michael Kennedy>done by the time we leave you know so this is pretty interesting and then another one is that's

00:08:23.860 --> 00:08:30.680
<v Michael Kennedy>common is you can do things that have async counterparts, but the older way to do them

00:08:30.720 --> 00:08:32.140
<v Michael Kennedy>would block the asyncio thread.

00:08:32.740 --> 00:08:37.080
<v Michael Kennedy>And that's really bad because you want to spend as little time blocking that as possible

00:08:37.400 --> 00:08:39.800
<v Michael Kennedy>because there's only one thread that does all the async work.

00:08:40.140 --> 00:08:44.219
<v Michael Kennedy>So if you're doing FastAPI or whatever, one thread, don't block it, depending on how you

00:08:44.320 --> 00:08:45.220
<v Michael Kennedy>set up your server, but generally.

00:08:45.760 --> 00:08:51.799
<v Michael Kennedy>So if you had old code that said like time.sleep and then you convert that to async, this should

00:08:51.820 --> 00:08:58.760
<v Michael Kennedy>be an await async io.sleep so that the it just lets the loop go for half a second rather than

00:08:58.960 --> 00:09:03.860
<v Michael Kennedy>block the entire program so you can say with no event loop blocking right so those are the three

00:09:03.980 --> 00:09:08.040
<v Michael Kennedy>types of tests so you can do it with context managers which is pretty cool you can also do it

00:09:08.080 --> 00:09:14.520
<v Michael Kennedy>with decorators put them on a function no thread leaks no task leaks and so on and yeah you get

00:09:14.700 --> 00:09:20.120
<v Michael Kennedy>errors like leaked task 2 or whatever right pretty descriptive shows you where it's called and so on

00:09:20.200 --> 00:09:22.040
<v Michael Kennedy>Another one, though, you'll probably like this, Brian.

00:09:22.420 --> 00:09:23.480
<v Michael Kennedy>A bunch of examples.

00:09:25.119 --> 00:09:26.460
<v Michael Kennedy>But where are you?

00:09:26.980 --> 00:09:30.600
<v Michael Kennedy>They also have a pytest plugin for it.

00:09:30.920 --> 00:09:34.860
<v Michael Kennedy>So you can come and say pytest mark async.io

00:09:35.360 --> 00:09:38.020
<v Michael Kennedy>and then run with no event loop blocking in there,

00:09:38.360 --> 00:09:39.280
<v Michael Kennedy>which is pretty nice.

00:09:40.220 --> 00:09:41.880
<v Michael Kennedy>It's maybe not exactly what I was looking for, is it?

00:09:42.120 --> 00:09:42.440
<v Michael Kennedy>There we go.

00:09:42.480 --> 00:09:43.300
<v Michael Kennedy>No, the pytest plugin.

00:09:43.840 --> 00:09:46.260
<v Michael Kennedy>So then you can set it up as a marker with no leaks

00:09:46.620 --> 00:09:47.280
<v Michael Kennedy>and things like that.

00:09:47.440 --> 00:09:47.640
<v Michael Kennedy>Cool.

00:09:48.020 --> 00:09:48.140
<v Michael Kennedy>Yeah.

00:09:48.440 --> 00:09:48.500
<v Michael Kennedy>Yeah.

00:09:48.820 --> 00:09:49.220
<v Michael Kennedy>No leaks.

00:09:49.240 --> 00:09:52.180
<v Michael Kennedy>Anyway, yeah, if you're doing anything with async programming,

00:09:52.600 --> 00:09:55.240
<v Michael Kennedy>might be worth throwing this on just to see what's going on.

00:09:55.660 --> 00:09:57.320
<v Michael Kennedy>I don't think I would leave this on all the time.

00:09:57.510 --> 00:09:59.620
<v Michael Kennedy>But having the unit test for it, good.

00:10:00.100 --> 00:10:02.260
<v Michael Kennedy>And maybe if you're doing conversions, like I said,

00:10:02.380 --> 00:10:05.960
<v Michael Kennedy>it's especially error prone to go from converting synchronous code to asynchronous code

00:10:06.280 --> 00:10:09.140
<v Michael Kennedy>because it's so easy to overlook converting one bit here or there.

00:10:09.230 --> 00:10:10.720
<v Michael Kennedy>So this would ideally catch it.

00:10:11.240 --> 00:10:11.860
<v Brian Okken>Yeah, I'm not sure.

00:10:12.240 --> 00:10:15.060
<v Brian Okken>It'd be one of those things of like also timing it.

00:10:16.920 --> 00:10:23.080
<v Brian Okken>during development if you had this on to make sure things are like cool in your synchronous part or

00:10:23.280 --> 00:10:29.540
<v Brian Okken>async part um and then you know how much slower is it or how much faster is it if you take that out

00:10:29.920 --> 00:10:35.900
<v Brian Okken>if there's not much of a difference um yeah maybe leave it yeah yeah yeah exactly exactly but well

00:10:36.990 --> 00:10:43.800
<v Brian Okken>yeah more django yeah i've actually been thinking about django a lot lately so i've got a a few

00:10:43.820 --> 00:10:48.800
<v Brian Okken>articles. I just want to kind of run through a few of them that I ran across. I don't have much to

00:10:48.900 --> 00:10:53.480
<v Brian Okken>say about either one of them, so I thought I'd combine them into one topic. So first off, we have

00:10:53.660 --> 00:11:00.100
<v Brian Okken>from Paul Taylor, migrating from Celery to Django Tasks. And I know Django Tasks, I can't remember

00:11:00.160 --> 00:11:06.060
<v Brian Okken>if it was just in this recent release. I think so. But they're a newish thing. So you might have

00:11:06.120 --> 00:11:11.400
<v Brian Okken>some code around that you're a project that's using Celery already, and you want to use Django

00:11:11.460 --> 00:11:18.120
<v Brian Okken>tasks instead so um walking through some of the some of the differences um and uh and and what to

00:11:18.190 --> 00:11:23.360
<v Brian Okken>watch out for the different settings um and i did it made me want to play with it a little bit because

00:11:23.570 --> 00:11:29.540
<v Brian Okken>um apparently django tasks has uh well if you combine it with cron task you can have tasks run

00:11:29.900 --> 00:11:35.440
<v Brian Okken>with at certain intervals which is kind of fun that's neat you probably can do that with celery

00:11:35.490 --> 00:11:41.380
<v Michael Kennedy>too but yeah but how many servers do you want this is like if your web app is running this

00:11:41.380 --> 00:11:43.520
<v Michael Kennedy>happening versus are the servers talking to each other?

00:11:45.980 --> 00:11:50.080
<v Brian Okken>Then next article, this is from Julia Evans,

00:11:50.460 --> 00:11:54.360
<v Brian Okken>and she brought us all those cool zines

00:11:54.660 --> 00:11:57.540
<v Brian Okken>about programming in GitHub and all that stuff.

00:11:58.140 --> 00:12:01.140
<v Brian Okken>She wrote some notes on starting to use Django.

00:12:01.880 --> 00:12:04.380
<v Brian Okken>One of the things I just like about this is she's

00:12:04.580 --> 00:12:05.880
<v Brian Okken>experienced developers,

00:12:06.700 --> 00:12:09.160
<v Brian Okken>you probably are already familiar with Julia Evans.

00:12:09.640 --> 00:12:13.840
<v Brian Okken>But one of her comments about Django is it's less magic than Rails.

00:12:14.820 --> 00:12:18.480
<v Brian Okken>And one of the things about that isn't just a style thing.

00:12:18.880 --> 00:12:26.040
<v Brian Okken>It's when you leave a project and come back a few months later, can you find, can you pick it up and understand where things are?

00:12:26.220 --> 00:12:29.920
<v Brian Okken>And just her commentary is just Django makes it more obvious.

00:12:30.520 --> 00:12:34.880
<v Brian Okken>If you want to look for your views, they're in views.py, things like that.

00:12:35.960 --> 00:12:37.700
<v Brian Okken>The built-in admin, of course, is nice.

00:12:38.140 --> 00:12:41.040
<v Brian Okken>And the ORM, everybody loves the ORM.

00:12:41.260 --> 00:12:44.060
<v Brian Okken>Or if you like the ORM, you love it, probably.

00:12:46.819 --> 00:12:52.920
<v Brian Okken>Automatic migrations, that's a really cool built-in thing of Django.

00:12:53.300 --> 00:12:53.900
<v Brian Okken>Good docs.

00:12:55.120 --> 00:12:57.400
<v Brian Okken>And this is like the third one.

00:12:57.430 --> 00:12:59.020
<v Brian Okken>Oh, built-in email was as neat.

00:12:59.100 --> 00:13:02.780
<v Brian Okken>I haven't tried to use email with Django, but it's on my to-do list.

00:13:03.080 --> 00:13:04.080
<v Brian Okken>Apparently, it's not that difficult.

00:13:04.950 --> 00:13:05.700
<v Brian Okken>So that's cool.

00:13:07.280 --> 00:13:14.560
<v Brian Okken>one of the things is that she's said that she's been using SQLite for Django in production and

00:13:14.900 --> 00:13:20.600
<v Brian Okken>followed these instructions. And these instructions is the last article I want to talk about, which is

00:13:21.440 --> 00:13:28.400
<v Brian Okken>the definitive guide to using Django with SQLite in production. And I just skimmed this, but

00:13:28.960 --> 00:13:35.600
<v Brian Okken>it goes through how to set up databases and cache and all that stuff. I'm going to drop down to the

00:13:35.460 --> 00:13:41.600
<v Brian Okken>conclusion there's quite a bit here and but the conclusion says um that is reduced complexity

00:13:42.200 --> 00:13:48.020
<v Brian Okken>um it still looks kind of complex to convert to me but um but maybe it's less complex than

00:13:48.240 --> 00:13:55.000
<v Brian Okken>keeping a sqlite or a postgres database around or something so yeah maybe backup is copy the file

00:13:55.540 --> 00:14:00.620
<v Brian Okken>that's nice yeah so um anyway um and i can't remember which article was in there was a

00:14:00.580 --> 00:14:09.640
<v Brian Okken>discussion around having in one of these Django articles about having tasks be stored in the

00:14:09.800 --> 00:14:16.040
<v Brian Okken>database itself, which is interesting. I didn't know you could do that. So yeah, fun with Django.

00:14:16.280 --> 00:14:20.620
<v Michael Kennedy>Yeah, very cool. I mean, in a sense, we're using SQLite in production. Python Bytes has a bunch of

00:14:20.980 --> 00:14:30.540
<v Michael Kennedy>caching through disk cache, and disk cache is really just a fancy front end to SQLite. So

00:14:30.560 --> 00:14:38.420
<v Michael Kennedy>So I want to talk about Datastar. So Datastar is a cool framework. This is not quite the exact right

00:14:39.570 --> 00:14:44.620
<v Michael Kennedy>mental model for thinking about it, but it's kind of the spiritual successor to HTMX, I think.

00:14:45.020 --> 00:14:52.720
<v Michael Kennedy>So the folks behind Datastar, they came from being contributors to the HTMX side and being

00:14:53.090 --> 00:14:56.720
<v Michael Kennedy>big fans of it. So for those of you who don't know, HTMX, super cool library,

00:14:57.500 --> 00:15:01.320
<v Michael Kennedy>it kind of extends the HTML markup to do more things.

00:15:01.640 --> 00:15:04.060
<v Michael Kennedy>So instead of just saying, here's a button,

00:15:04.450 --> 00:15:05.600
<v Michael Kennedy>you could say, here's a button,

00:15:06.120 --> 00:15:08.800
<v Michael Kennedy>and on click, I want you to call this thing on the server.

00:15:09.120 --> 00:15:12.120
<v Michael Kennedy>And when it comes back, I want you to replace this part of the page

00:15:12.130 --> 00:15:13.900
<v Michael Kennedy>with what came back from the server and so on.

00:15:14.280 --> 00:15:21.140
<v Michael Kennedy>And HTMX is great, but HTMX only does that sort of local server communication, right?

00:15:21.520 --> 00:15:22.800
<v Michael Kennedy>So it might update some section,

00:15:22.930 --> 00:15:25.880
<v Michael Kennedy>but what if when that part updates, another part of the page updates?

00:15:26.899 --> 00:15:28.800
<v Michael Kennedy>and it gets a little bit more complicated.

00:15:29.280 --> 00:15:34.200
<v Michael Kennedy>So what people have done is they paired HTMX with AlpineJS and other things,

00:15:34.440 --> 00:15:38.320
<v Michael Kennedy>but AlpineJS has its sort of truth for what the data is,

00:15:38.320 --> 00:15:40.820
<v Michael Kennedy>and then HTMX has the DOM and the server,

00:15:40.960 --> 00:15:44.760
<v Michael Kennedy>and it's a little bit your job to juggle the go-between for these libraries,

00:15:44.940 --> 00:15:45.560
<v Michael Kennedy>which is not ideal.

00:15:45.860 --> 00:15:47.540
<v Michael Kennedy>So Datastar takes this idea and says,

00:15:47.720 --> 00:15:49.860
<v Michael Kennedy>what if the server was the source of truth?

00:15:50.300 --> 00:15:53.920
<v Michael Kennedy>What if we could have multiple parts of the page update

00:15:54.260 --> 00:15:56.100
<v Michael Kennedy>in kind of a HTMX way.

00:15:56.190 --> 00:15:57.820
<v Michael Kennedy>You say like, if you interact with this,

00:15:58.060 --> 00:15:59.000
<v Michael Kennedy>you know, like click on this element,

00:15:59.090 --> 00:16:00.500
<v Michael Kennedy>I want you to get this stuff from the server.

00:16:00.810 --> 00:16:02.020
<v Michael Kennedy>And it sends back the page.

00:16:02.100 --> 00:16:03.720
<v Michael Kennedy>And very much like PyView,

00:16:03.900 --> 00:16:04.980
<v Michael Kennedy>which we talked about previously,

00:16:05.700 --> 00:16:08.500
<v Michael Kennedy>it will take what comes back from the server,

00:16:08.960 --> 00:16:09.680
<v Michael Kennedy>diff it and figure out,

00:16:09.690 --> 00:16:11.740
<v Michael Kennedy>well, this section with this ID

00:16:11.770 --> 00:16:12.840
<v Michael Kennedy>is going to be updated over here.

00:16:12.960 --> 00:16:14.900
<v Michael Kennedy>And some other part is going to be updated with this

00:16:15.020 --> 00:16:16.020
<v Michael Kennedy>because that ID part

00:16:16.290 --> 00:16:18.060
<v Michael Kennedy>in the thing that came back matches over there.

00:16:18.460 --> 00:16:20.040
<v Michael Kennedy>And it's got this really nice way

00:16:20.070 --> 00:16:21.640
<v Michael Kennedy>to sort of be a little more holistic,

00:16:21.640 --> 00:16:27.100
<v Michael Kennedy>but still do HTMX-like attributes with server-sent event things going on.

00:16:27.340 --> 00:16:28.900
<v Michael Kennedy>So in a way, it's like PyView.

00:16:29.260 --> 00:16:31.440
<v Michael Kennedy>But what's really different about this, two things.

00:16:31.840 --> 00:16:33.320
<v Michael Kennedy>First is it's not a web framework.

00:16:33.340 --> 00:16:35.020
<v Michael Kennedy>Like PyView is a web framework.

00:16:35.140 --> 00:16:36.200
<v Michael Kennedy>Like Django is a web framework.

00:16:36.320 --> 00:16:37.860
<v Michael Kennedy>Like Flask is a web framework.

00:16:38.180 --> 00:16:42.280
<v Michael Kennedy>This is purely a JavaScript library that talks to the server

00:16:42.700 --> 00:16:44.680
<v Michael Kennedy>and basically handles everything on the front end.

00:16:44.820 --> 00:16:46.440
<v Michael Kennedy>It's only 11K too, by the way.

00:16:46.440 --> 00:16:47.360
<v Michael Kennedy>So it's incredibly small.

00:16:47.680 --> 00:16:49.360
<v Michael Kennedy>And it does what AlpineJS does.

00:16:49.860 --> 00:16:51.520
<v Michael Kennedy>It has sort of a data binding thing.

00:16:51.800 --> 00:16:53.540
<v Michael Kennedy>and the server can say,

00:16:53.800 --> 00:16:56.280
<v Michael Kennedy>I know you have a variable called username.

00:16:56.820 --> 00:16:58.280
<v Michael Kennedy>And if I update username on the server,

00:16:58.420 --> 00:17:00.460
<v Michael Kennedy>it will automatically change the page

00:17:00.660 --> 00:17:02.080
<v Michael Kennedy>everywhere username is used.

00:17:02.140 --> 00:17:03.980
<v Michael Kennedy>So it has these things called signals as well.

00:17:05.060 --> 00:17:06.860
<v Michael Kennedy>Pretty neat library, like this star field here.

00:17:06.939 --> 00:17:08.579
<v Michael Kennedy>See how if you go to the website,

00:17:09.060 --> 00:17:10.300
<v Michael Kennedy>it's following my mouse around.

00:17:10.620 --> 00:17:12.160
<v Michael Kennedy>You can make it go faster or slower.

00:17:12.560 --> 00:17:14.079
<v Michael Kennedy>It feels like you're in Star Wars,

00:17:14.540 --> 00:17:15.160
<v Michael Kennedy>which is pretty cool.

00:17:15.220 --> 00:17:16.600
<v Michael Kennedy>But all of that is being driven

00:17:17.519 --> 00:17:19.439
<v Michael Kennedy>by server set events off of the server,

00:17:19.939 --> 00:17:20.760
<v Michael Kennedy>which is pretty neat.

00:17:20.800 --> 00:17:22.160
<v Michael Kennedy>There's a bunch of cool examples.

00:17:22.310 --> 00:17:25.100
<v Michael Kennedy>So you can go to the examples page if I zoom back a bit.

00:17:26.020 --> 00:17:27.500
<v Michael Kennedy>They also have this really fun video.

00:17:27.829 --> 00:17:29.160
<v Michael Kennedy>So you should definitely watch the video.

00:17:29.980 --> 00:17:31.300
<v Michael Kennedy>But let me show you an example.

00:17:31.480 --> 00:17:33.300
<v Michael Kennedy>So there's a bunch of these examples.

00:17:34.100 --> 00:17:37.740
<v Michael Kennedy>And if I open up two of these and put them side by side,

00:17:37.790 --> 00:17:41.200
<v Michael Kennedy>I can use the new Vivaldi thing or I can tile them together.

00:17:41.620 --> 00:17:44.240
<v Michael Kennedy>And if I get them to zoom the same size.

00:17:44.920 --> 00:17:47.260
<v Michael Kennedy>So if you come over here, you can just type in.

00:17:47.740 --> 00:17:50.420
<v Michael Kennedy>If you put these two side by side, you can say record.

00:17:50.780 --> 00:17:55.280
<v Michael Kennedy>podcast and boom they're both going i don't know this one is going to finish that one i'm going to

00:17:55.390 --> 00:18:00.240
<v Michael Kennedy>finish that let's uh show only the completed ones oh wow and that's cool it happens to be on my

00:18:00.710 --> 00:18:05.100
<v Michael Kennedy>same machine but really they could be anywhere there's a really bunch of a bunch of interesting

00:18:05.360 --> 00:18:11.880
<v Michael Kennedy>performance things around with data star so you kind of like htmx be like ah but it's a little

00:18:12.000 --> 00:18:17.480
<v Michael Kennedy>bit not quite enough for what i need to do check this out it's a really cool thing and this episode

00:18:17.600 --> 00:18:20.780
<v Michael Kennedy>with the Datastar team is coming out on Talk Python this week.

00:18:20.810 --> 00:18:24.380
<v Michael Kennedy>I wanted to feature Datastar on the show sooner,

00:18:24.790 --> 00:18:27.060
<v Michael Kennedy>but then when I knew I was going to have them on Talk Python,

00:18:27.110 --> 00:18:29.720
<v Michael Kennedy>I was like, let me just wait until I get that episode recorded.

00:18:29.920 --> 00:18:32.380
<v Michael Kennedy>People who are more interested can listen to that as well.

00:18:32.940 --> 00:18:33.920
<v Michael Kennedy>So that's coming out.

00:18:34.540 --> 00:18:37.820
<v Brian Okken>Plus a couple bonuses on this,

00:18:38.550 --> 00:18:40.580
<v Brian Okken>that it won the website,

00:18:40.840 --> 00:18:42.720
<v Brian Okken>just the retro look of it looks awesome.

00:18:43.120 --> 00:18:43.860
<v Brian Okken>It's great, isn't it?

00:18:44.320 --> 00:18:47.960
<v Brian Okken>And that they use the term hypermedia.

00:18:48.400 --> 00:18:51.620
<v Brian Okken>Kind of love that back to the origins.

00:18:52.500 --> 00:18:53.240
<v Michael Kennedy>Yeah, yeah, for sure.

00:18:53.820 --> 00:18:57.940
<v Michael Kennedy>And there's also this really nice article by Chris May,

00:18:58.270 --> 00:19:00.440
<v Michael Kennedy>who is a very big fan of HTMX,

00:19:00.490 --> 00:19:04.160
<v Michael Kennedy>gave some Django FlaskCon talk on it,

00:19:05.000 --> 00:19:06.540
<v Michael Kennedy>and basically went through and said,

00:19:06.600 --> 00:19:09.260
<v Michael Kennedy>why do I think I'm using Datastar these days?

00:19:09.460 --> 00:19:13.460
<v Michael Kennedy>So really nice example, but got some Python examples.

00:19:13.540 --> 00:19:16.140
<v Michael Kennedy>There's a Python SDK that you can bring in.

00:19:16.540 --> 00:19:19.120
<v Michael Kennedy>So if you were using Flask, use the SDK.

00:19:19.260 --> 00:19:21.520
<v Michael Kennedy>If you're using FastAPI, use the SDK or whatever.

00:19:21.760 --> 00:19:22.820
<v Michael Kennedy>But yeah, super neat.

00:19:23.400 --> 00:19:24.060
<v Michael Kennedy>Okay, cool.

00:19:24.840 --> 00:19:25.200
<v Michael Kennedy>All right.

00:19:25.540 --> 00:19:26.980
<v Michael Kennedy>That's it for all of our topics, isn't it?

00:19:27.440 --> 00:19:27.660
<v Michael Kennedy>Yeah.

00:19:28.960 --> 00:19:30.380
<v Michael Kennedy>Got anything out there you want to cover?

00:19:30.560 --> 00:19:30.940
<v Michael Kennedy>Any extras?

00:19:32.200 --> 00:19:32.380
<v Brian Okken>Okay.

00:19:32.560 --> 00:19:34.700
<v Brian Okken>So yeah, a couple of extras.

00:19:35.000 --> 00:19:35.320
<v Brian Okken>Let's see.

00:19:35.560 --> 00:19:36.580
<v Brian Okken>I'm all zoomed out.

00:19:36.700 --> 00:19:41.340
<v Brian Okken>So I did bring up Django chat before I, the, the,

00:19:41.700 --> 00:19:44.760
<v Brian Okken>I was lucky enough to be asked to be on the show as well.

00:19:44.960 --> 00:19:48.840
<v Brian Okken>So I was talking about lean TDD and a lot of other stuff on the,

00:19:49.210 --> 00:19:52.460
<v Brian Okken>the Django chat podcast. I, you know,

00:19:52.540 --> 00:19:56.400
<v Brian Okken>one of the things they asked me is, is the, is about the, what,

00:19:56.540 --> 00:20:00.520
<v Brian Okken>the trends in web frameworks for Python. And I'm like, man,

00:20:00.640 --> 00:20:03.420
<v Brian Okken>I'm the wrong guy to ask about that. Yeah, sure. Okay.

00:20:04.980 --> 00:20:08.380
<v Michael Kennedy>You mean the ones that run on the hardware that control the Wi-Fi signals?

00:20:08.960 --> 00:20:09.180
<v Brian Okken>Yeah.

00:20:10.560 --> 00:20:13.640
<v Brian Okken>Anyway, so I am working a little bit at Django lately,

00:20:14.179 --> 00:20:16.680
<v Brian Okken>but I'm by no means a Django expert.

00:20:17.310 --> 00:20:23.660
<v Brian Okken>But we did get into the Lean TDD and inverting the testing pyramid a little bit.

00:20:23.850 --> 00:20:27.000
<v Brian Okken>One of the things I love about this and was really fun because Carlton,

00:20:27.210 --> 00:20:33.480
<v Brian Okken>when I brought up the fact, brought up some reasons to shy away from unit tests as much.

00:20:34.240 --> 00:20:37.120
<v Brian Okken>Carlton kind of got his feathers ruffled,

00:20:37.210 --> 00:20:41.940
<v Brian Okken>and we walked through some of the good aspects of unit tests

00:20:42.200 --> 00:20:44.740
<v Brian Okken>and where you might want to keep them, where you might want to ditch them.

00:20:44.960 --> 00:20:46.120
<v Brian Okken>So that was fun.

00:20:47.280 --> 00:20:53.980
<v Brian Okken>The next extra is that I did notice that the PEP 686,

00:20:54.380 --> 00:20:58.740
<v Brian Okken>making UTF-8 mode the default, is now, or maybe it was.

00:20:59.440 --> 00:21:00.720
<v Brian Okken>Maybe it was a while ago.

00:21:01.140 --> 00:21:03.160
<v Brian Okken>But anyway, I just noticed that it was finals.

00:21:03.660 --> 00:21:06.800
<v Brian Okken>If we haven't covered it already, it's finalized in 3.15.

00:21:07.120 --> 00:21:07.560
<v Brian Okken>It'll be there.

00:21:07.760 --> 00:21:08.420
<v Brian Okken>So that's good.

00:21:09.260 --> 00:21:10.060
<v Brian Okken>I think that's interesting.

00:21:10.240 --> 00:21:14.220
<v Michael Kennedy>This is a really old request, but it didn't get until next year, right?

00:21:14.360 --> 00:21:15.120
<v Michael Kennedy>3.15.

00:21:15.480 --> 00:21:17.760
<v Michael Kennedy>So this was originally started in 2022.

00:21:18.440 --> 00:21:18.780
<v Michael Kennedy>Yeah.

00:21:19.300 --> 00:21:22.300
<v Michael Kennedy>But it's not yet in Python, right?

00:21:22.380 --> 00:21:24.140
<v Michael Kennedy>It's 3.15, as you point out.

00:21:25.640 --> 00:21:28.400
<v Brian Okken>Yeah, I'm looking forward to having the default be just UTF-8.

00:21:29.040 --> 00:21:30.480
<v Michael Kennedy>Yeah, I mean, if you're going to have a default.

00:21:32.740 --> 00:21:37.540
<v Michael Kennedy>Let's pick the one that is mostly used and supports all the different languages and emojis.

00:21:38.120 --> 00:21:39.180
<v Michael Kennedy>It's important to have emojis.

00:21:39.530 --> 00:21:39.720
<v Brian Okken>Yeah.

00:21:40.740 --> 00:21:46.260
<v Brian Okken>Before we move on, I do have, I guess, a way side tangent topic.

00:21:47.370 --> 00:21:54.380
<v Brian Okken>Kind of the sci-fi-ness of Datastar reminded me that recently I remembered the cheesy 80s movie

00:21:54.470 --> 00:21:58.140
<v Brian Okken>that reminded me of Tesla's Cybertrucks.

00:21:58.580 --> 00:22:01.500
<v Brian Okken>And the cheesy movie was called Megaforce.

00:22:01.680 --> 00:22:02.400
<v Brian Okken>And it's from 81.

00:22:02.760 --> 00:22:03.960
<v Brian Okken>did you ever see Megaforce?

00:22:04.180 --> 00:22:06.380
<v Brian Okken>I have somehow missed this cultural phenomenon.

00:22:06.660 --> 00:22:08.580
<v Brian Okken>Well, you're probably well off

00:22:08.800 --> 00:22:11.720
<v Brian Okken>because Rotten Tomatoes gives it a 6%.

00:22:13.580 --> 00:22:15.480
<v Brian Okken>And the reason why I think about it

00:22:15.560 --> 00:22:17.720
<v Brian Okken>when I see Teslas is because of these trucks.

00:22:17.940 --> 00:22:20.700
<v Brian Okken>So these tanks in there, in the Megaforce,

00:22:20.860 --> 00:22:22.460
<v Brian Okken>kind of remind me of, well,

00:22:22.840 --> 00:22:24.320
<v Brian Okken>just sort of the angles and stuff

00:22:24.460 --> 00:22:25.380
<v Brian Okken>kind of remind me of Cyber.

00:22:25.520 --> 00:22:26.580
<v Brian Okken>They do have that, don't they?

00:22:27.520 --> 00:22:27.920
<v Brian Okken>Incredible.

00:22:28.360 --> 00:22:29.120
<v Brian Okken>Those are my extras.

00:22:29.460 --> 00:22:30.480
<v Brian Okken>I love you, but you're hopeless.

00:22:31.200 --> 00:22:31.580
<v Brian Okken>On Blu-ray.

00:22:34.460 --> 00:22:39.440
<v Michael Kennedy>wow that's is that a song i love anyway i don't know it seems like it comes from the movie but i

00:22:39.560 --> 00:22:45.140
<v Michael Kennedy>don't know look at the shots oh my gosh even the clothes are it's so bad cyber truck looking

00:22:46.960 --> 00:22:53.660
<v Brian Okken>i want one of these though uh but yeah so do you have any extras i uh this has completely

00:22:53.860 --> 00:22:59.080
<v Michael Kennedy>escaped me this is incredible yes i have extras so first of all brayson daniel has been on the show

00:22:59.100 --> 00:23:06.460
<v Michael Kennedy>a long time ago when we were having guests, wrote an article about whether, well, wrote a pro, has a

00:23:06.800 --> 00:23:13.460
<v Michael Kennedy>project and a theory about whether LLMs think or if they're just pure statistics. And as a good data

00:23:13.720 --> 00:23:22.160
<v Michael Kennedy>scientist, created this project here. Yes. And it's a literature review about whether machines think

00:23:22.400 --> 00:23:28.220
<v Michael Kennedy>or don't think. And so now he's got an LLM analyzing whether all the papers on whether LLMs

00:23:28.520 --> 00:23:34.040
<v Michael Kennedy>think or don't think. And you can say, so the premise is that they do not, right? So there's

00:23:34.320 --> 00:23:39.100
<v Michael Kennedy>97 papers that support it, but 13 that challenge it. And if you go and look at them, you can actually

00:23:39.230 --> 00:23:43.540
<v Michael Kennedy>hover over these. And it's just a beautiful website. So one, I think it's an interesting,

00:23:44.080 --> 00:23:49.660
<v Michael Kennedy>timely topic, but two, it's just a really neat way to present information. Yeah. Yeah. So well done,

00:23:50.080 --> 00:23:57.020
<v Michael Kennedy>Grayson. Also came across a new Mastodon app called IceCubes, and it's free and open source.

00:23:57.360 --> 00:23:59.440
<v Michael Kennedy>if you're a Mac person at least.

00:23:59.760 --> 00:24:01.440
<v Michael Kennedy>So I don't know, I've been playing with this.

00:24:01.700 --> 00:24:02.300
<v Michael Kennedy>It looks nice.

00:24:02.740 --> 00:24:03.420
<v Michael Kennedy>I really like it.

00:24:03.660 --> 00:24:06.400
<v Michael Kennedy>And having it open source, you know, we just,

00:24:06.720 --> 00:24:07.800
<v Michael Kennedy>I don't know how you feel about this, Brian,

00:24:07.940 --> 00:24:12.280
<v Michael Kennedy>but I just don't usually connect open source in Mac apps,

00:24:12.740 --> 00:24:13.620
<v Michael Kennedy>or sorry, iOS apps.

00:24:14.560 --> 00:24:16.640
<v Michael Kennedy>This is on both, but really I don't think,

00:24:16.780 --> 00:24:18.240
<v Michael Kennedy>like phone apps and open source,

00:24:18.360 --> 00:24:19.640
<v Michael Kennedy>I don't think about those being,

00:24:19.960 --> 00:24:20.860
<v Michael Kennedy>I know there are some out there,

00:24:21.020 --> 00:24:22.240
<v Michael Kennedy>but it's way less common.

00:24:23.160 --> 00:24:24.420
<v Michael Kennedy>Yeah, anyway, I just want to give it a shout out.

00:24:24.720 --> 00:24:25.120
<v Michael Kennedy>I thought it was cool.

00:24:25.120 --> 00:24:26.800
<v Michael Kennedy>I ran across it looking into something else.

00:24:27.280 --> 00:24:29.480
<v Brian Okken>- Yeah, don't you have to like pay to be like,

00:24:29.880 --> 00:24:31.680
<v Michael Kennedy>- Yeah, I pay a hundred dollars a year.

00:24:32.090 --> 00:24:34.740
<v Michael Kennedy>So I get the privilege to publish to Apple.

00:24:35.240 --> 00:24:37.900
<v Michael Kennedy>So I pay a hundred dollars a year for the privilege

00:24:38.280 --> 00:24:41.020
<v Michael Kennedy>to make Apple's products more valuable to them.

00:24:41.820 --> 00:24:42.180
<v Michael Kennedy>It's amazing.

00:24:42.900 --> 00:24:44.920
<v Brian Okken>- Yeah, I was just thinking that that might be

00:24:45.040 --> 00:24:46.620
<v Brian Okken>one of the reasons why we don't see a lot of open source

00:24:46.860 --> 00:24:47.220
<v Brian Okken>because you.

00:24:47.340 --> 00:24:47.860
<v Michael Kennedy>- Yeah, exactly.

00:24:47.990 --> 00:24:50.460
<v Michael Kennedy>And then whose job is it to be in charge of it?

00:24:50.540 --> 00:24:51.700
<v Michael Kennedy>'Cause it's not as easy to release

00:24:52.300 --> 00:24:53.860
<v Michael Kennedy>'cause it's gotta go through somebody's account.

00:24:54.070 --> 00:24:56.120
<v Michael Kennedy>And I don't know, it's just, it's just not that common.

00:24:56.320 --> 00:24:57.880
<v Michael Kennedy>And I ran across this and I thought it was really cool.

00:24:58.420 --> 00:25:00.100
<v Michael Kennedy>So I'm using this for my Mastodoning.

00:25:00.480 --> 00:25:02.660
<v Michael Kennedy>However, Mona, the one I was using before,

00:25:02.960 --> 00:25:05.620
<v Michael Kennedy>has a really nice feature that if you write a thread too long,

00:25:05.760 --> 00:25:08.600
<v Michael Kennedy>it'll split it into a series, like one of two, two of three,

00:25:08.760 --> 00:25:11.600
<v Michael Kennedy>two, one of three, two of three, three of three automatically.

00:25:11.880 --> 00:25:14.040
<v Michael Kennedy>And this one doesn't have that, but we could open a PR.

00:25:14.140 --> 00:25:14.440
<v Michael Kennedy>How's that?

00:25:14.660 --> 00:25:14.880
<v Michael Kennedy>- Yeah.

00:25:15.220 --> 00:25:15.760
<v Michael Kennedy>- All right, carrying on.

00:25:16.120 --> 00:25:19.140
<v Michael Kennedy>Remember we talked about Rundl, R-U-M-D-L,

00:25:19.320 --> 00:25:23.560
<v Michael Kennedy>which is a Rust-based markdown formatter and linter.

00:25:23.980 --> 00:25:24.140
<v Michael Kennedy>- Yeah.

00:25:24.320 --> 00:25:25.040
<v Michael Kennedy>- Which is really nice.

00:25:25.860 --> 00:25:26.700
<v Michael Kennedy>using it for various things.

00:25:27.340 --> 00:25:31.080
<v Michael Kennedy>Well, there's now a Rumdoll IntelliJ plugin.

00:25:31.680 --> 00:25:34.300
<v Michael Kennedy>So most of the people listening will care about that

00:25:34.310 --> 00:25:36.040
<v Michael Kennedy>in terms of PyCharm.

00:25:36.440 --> 00:25:38.980
<v Michael Kennedy>But if you want to have that built right into your editor

00:25:39.380 --> 00:25:41.760
<v Michael Kennedy>and you're using PyCharm, you can install the plugin

00:25:42.280 --> 00:25:42.760
<v Michael Kennedy>and off it goes.

00:25:43.160 --> 00:25:43.360
<v Michael Kennedy>- Yeah.

00:25:43.440 --> 00:25:45.200
<v Michael Kennedy>- Okay, and then really quickly,

00:25:45.660 --> 00:25:48.120
<v Michael Kennedy>the last time I talked about how curl,

00:25:48.390 --> 00:25:50.720
<v Michael Kennedy>like you mentioned something about AI frustration

00:25:52.260 --> 00:25:54.260
<v Michael Kennedy>with some project or whatever.

00:25:54.660 --> 00:25:56.120
<v Michael Kennedy>And I pointed out curl.

00:25:56.600 --> 00:26:07.780
<v Michael Kennedy>So I'm linking to Ars Technica article that says overrun by AI slop curl scraps bug bounties to ensure that they keep their mental health intact.

00:26:08.400 --> 00:26:15.700
<v Michael Kennedy>So there was the PRs, the PRs that were like thousands of lines long and they were just kind of really messy.

00:26:15.920 --> 00:26:17.300
<v Michael Kennedy>And people are like, we're not accepting that.

00:26:17.400 --> 00:26:18.640
<v Michael Kennedy>I don't remember what project that was.

00:26:19.000 --> 00:26:19.680
<v Michael Kennedy>It's been a long time.

00:26:19.700 --> 00:26:20.180
<v Michael Kennedy>It's been a week.

00:26:20.300 --> 00:26:21.940
<v Michael Kennedy>But I said that curl's doing the same thing.

00:26:22.020 --> 00:26:23.320
<v Michael Kennedy>It's not exactly the same thing.

00:26:23.400 --> 00:26:27.360
<v Michael Kennedy>what they're doing is they had a bug bounty program like hey well we'll pay you a thousand

00:26:27.490 --> 00:26:31.420
<v Michael Kennedy>dollars if you find a memory overflow or something like that well a bunch of people were just turning

00:26:32.180 --> 00:26:35.720
<v Michael Kennedy>clod code or something loose on it say find all the bugs and then some you know then they were

00:26:35.880 --> 00:26:40.780
<v Michael Kennedy>submitting whatever clod code told them and apparently a lot of times clod code got the

00:26:41.000 --> 00:26:46.500
<v Michael Kennedy>understanding wrong so it wasn't really a bug security bug and so the person that was just like

00:26:46.500 --> 00:26:53.360
<v Michael Kennedy>i can't i cannot answer more of these no that's not actually a problem here's why and the

00:26:53.380 --> 00:26:55.300
<v Michael Kennedy>The incentives were misaligned, right?

00:26:55.460 --> 00:26:57.800
<v Michael Kennedy>Like with a PR, like what is the incentive?

00:26:57.940 --> 00:26:59.180
<v Michael Kennedy>Maybe like, oh, I'm a contributor.

00:26:59.600 --> 00:27:01.400
<v Michael Kennedy>Well, this they were getting paid for.

00:27:01.730 --> 00:27:03.200
<v Michael Kennedy>So they were getting overwhelmed.

00:27:03.740 --> 00:27:05.760
<v Michael Kennedy>Anyway, link into that for all the people who care.

00:27:06.380 --> 00:27:06.440
<v Michael Kennedy>Yeah.

00:27:06.530 --> 00:27:07.080
<v Michael Kennedy>And finally.

00:27:07.420 --> 00:27:11.260
<v Brian Okken>I think Curl's one of those like maintained by one person apps.

00:27:11.760 --> 00:27:11.880
<v Michael Kennedy>Yeah.

00:27:12.340 --> 00:27:12.700
<v Michael Kennedy>Yeah.

00:27:12.790 --> 00:27:15.280
<v Michael Kennedy>It's got, if not one, it's a very small team.

00:27:15.520 --> 00:27:20.460
<v Michael Kennedy>Finally, the PSF JetBrains survey for 2026 is on.

00:27:21.080 --> 00:27:22.060
<v Michael Kennedy>Have you done this yet?

00:27:22.320 --> 00:27:22.640
<v Michael Kennedy>No.

00:27:23.100 --> 00:27:23.840
<v Michael Kennedy>I have not either, but.

00:27:23.920 --> 00:27:25.020
<v Michael Kennedy>- So that time of the year already.

00:27:25.680 --> 00:27:26.500
<v Brian Okken>- I know, yeah.

00:27:26.670 --> 00:27:29.120
<v Michael Kennedy>So anyway, it takes about 10 to 15 minutes to fill out,

00:27:29.540 --> 00:27:30.020
<v Michael Kennedy>link into it.

00:27:30.180 --> 00:27:31.720
<v Michael Kennedy>Everyone go out there, fill this out,

00:27:32.100 --> 00:27:32.760
<v Michael Kennedy>make your voice heard.

00:27:33.090 --> 00:27:34.760
<v Michael Kennedy>Tell them, please tell them that CSS

00:27:34.890 --> 00:27:35.800
<v Michael Kennedy>is not a programming language.

00:27:36.190 --> 00:27:36.320
<v Michael Kennedy>Okay.

00:27:36.820 --> 00:27:38.140
<v Michael Kennedy>- And you all use Bytest.

00:27:38.740 --> 00:27:40.420
<v Michael Kennedy>Do not click no testing.

00:27:41.290 --> 00:27:41.860
<v Michael Kennedy>Do not test.

00:27:41.900 --> 00:27:42.280
<v Michael Kennedy>- Exactly.

00:27:42.620 --> 00:27:45.000
<v Michael Kennedy>The second most popular testing framework is none.

00:27:45.460 --> 00:27:45.760
<v Brian Okken>- Yeah.

00:27:48.100 --> 00:27:48.900
<v Brian Okken>Yeah, yeah.

00:27:49.260 --> 00:27:51.300
<v Brian Okken>Which is great 'cause it used to be the number one.

00:27:52.520 --> 00:27:57.840
<v Michael Kennedy>progress that's a form of progress all right ready for a joke yeah i don't remember what i picked for

00:27:57.860 --> 00:28:03.000
<v Michael Kennedy>this so it's gonna be news to me as well this is fun okay uh no i don't care about that okay this

00:28:03.120 --> 00:28:09.940
<v Michael Kennedy>is good so we've all heard of these license plates that have um crazy stuff has gone wrong like there

00:28:09.940 --> 00:28:15.240
<v Michael Kennedy>was a license plate uh the person put null for their license plate and instead of because they

00:28:15.400 --> 00:28:19.600
<v Michael Kennedy>thought that there would be a test like if not equal to null then send ticket or whatever yeah

00:28:19.620 --> 00:28:22.340
<v Michael Kennedy>But instead it's like, if value equals null,

00:28:22.900 --> 00:28:24.060
<v Michael Kennedy>and they started getting all the tickets.

00:28:24.960 --> 00:28:28.260
<v Michael Kennedy>So here's a car with a license plate that says example.

00:28:29.140 --> 00:28:31.500
<v Michael Kennedy>And the title is when test values get pushed to production.

00:28:32.890 --> 00:28:33.700
<v Michael Kennedy>What state is that?

00:28:34.120 --> 00:28:34.560
<v Michael Kennedy>That's good.

00:28:35.120 --> 00:28:36.460
<v Michael Kennedy>What state are we looking here?

00:28:37.060 --> 00:28:37.160
<v Michael Kennedy>Maryland.

00:28:38.000 --> 00:28:38.920
<v Michael Kennedy>Yeah, so if you're in Maryland,

00:28:39.600 --> 00:28:40.780
<v Michael Kennedy>there's an example car out there.

00:28:41.000 --> 00:28:41.900
<v Brian Okken>You get slugged for that.

00:28:42.340 --> 00:28:42.420
<v Michael Kennedy>Yeah.

00:28:42.720 --> 00:28:43.680
<v Michael Kennedy>Yeah, that's pretty fun.

00:28:44.040 --> 00:28:47.380
<v Brian Okken>Do your kids do the yellow bug thing or the yellow car?

00:28:47.400 --> 00:28:47.780
<v Brian Okken>Oh, yeah.

00:28:48.240 --> 00:28:53.540
<v Michael Kennedy>yeah the punch bug sort of thing and well because when we were kids it was slug bug or punch bugs

00:28:53.720 --> 00:29:02.240
<v Brian Okken>like but yeah yeah so my kids do if it's a yellow car um or if it's a license plate with the state

00:29:02.520 --> 00:29:09.640
<v Brian Okken>that's not adjacent to your state um or your own state so like uh yeah for us washington wouldn't

00:29:09.760 --> 00:29:16.020
<v Brian Okken>work but like montana would sort of thing um so i'm like that's just you're just randomly picking

00:29:16.040 --> 00:29:26.000
<v Brian Okken>things so i chose um uh it's um any car that's uh what not black um or not a sedan uh which is you

00:29:26.100 --> 00:29:33.140
<v Brian Okken>know actually no i chose black car and and not a sedan which now is most cars so yeah yeah you're

00:29:33.140 --> 00:29:38.120
<v Michael Kennedy>gonna get tired from punching your kids my my kid does that as well and i feel like it's just an

00:29:38.220 --> 00:29:43.880
<v Michael Kennedy>excuse to go around they don't hit you hard but you know just being so just taps because yeah yeah

00:29:43.900 --> 00:29:51.720
<v Brian Okken>Anyway, so also we did this once like two blocks away from a Stanley Steamer, which they're all yellow trucks.

00:29:52.300 --> 00:29:59.120
<v Brian Okken>And we were waiting in line somewhere where there was like, we didn't know why, but every like every five minutes, a Stanley Steamer truck was coming by.

00:29:59.320 --> 00:30:00.340
<v Brian Okken>And we're like, this is ridiculous.

00:30:00.640 --> 00:30:01.940
<v Michael Kennedy>But that's crazy.

00:30:02.700 --> 00:30:12.280
<v Michael Kennedy>Before we wrap it up really quick, Christian, out the honest, gave us some interesting thoughts on the Apple on the iOS, not open source intersection.

00:30:12.900 --> 00:30:16.280
<v Michael Kennedy>Apple apps must be only available through the Apple App Store,

00:30:16.820 --> 00:30:17.900
<v Michael Kennedy>which is interesting, right?

00:30:18.260 --> 00:30:20.040
<v Michael Kennedy>The ones that are for iOS, not for macOS.

00:30:20.420 --> 00:30:21.180
<v Brian Okken>Oh, right.

00:30:21.360 --> 00:30:23.340
<v Brian Okken>Even if you allow, yeah, weird.

00:30:23.740 --> 00:30:24.720
<v Michael Kennedy>Yeah, so that makes it difficult.

00:30:25.140 --> 00:30:27.720
<v Michael Kennedy>And says, GPL licensed software popular in a source

00:30:27.900 --> 00:30:30.220
<v Michael Kennedy>is often incompatible with App Store terms

00:30:30.460 --> 00:30:32.500
<v Michael Kennedy>because Apple requires control over binaries

00:30:32.640 --> 00:30:34.120
<v Michael Kennedy>and does not distribute the source code.

00:30:34.440 --> 00:30:34.980
<v Michael Kennedy>So, interesting.

00:30:35.280 --> 00:30:35.440
<v Michael Kennedy>Yeah.

00:30:36.700 --> 00:30:36.900
<v Michael Kennedy>Okay.

00:30:37.180 --> 00:30:40.260
<v Michael Kennedy>More to say on that in the not too distant future, actually.

00:30:41.040 --> 00:30:42.540
<v Michael Kennedy>Do you have more apps coming now?

00:30:42.720 --> 00:30:45.620
<v Michael Kennedy>I have stuff to share, but I can't share any more than that.

00:30:45.820 --> 00:30:46.040
<v Michael Kennedy>Okay.

00:30:46.500 --> 00:30:46.760
<v Michael Kennedy>Teaser.

00:30:47.380 --> 00:30:48.960
<v Michael Kennedy>I've had a better experience this time.

00:30:49.140 --> 00:30:49.780
<v Michael Kennedy>I'll just leave it at that.

00:30:49.880 --> 00:30:50.880
<v Michael Kennedy>Don't touch that dial.

00:30:51.600 --> 00:30:55.240
<v Michael Kennedy>Anytime you have to interact with these app stores, it's not the best.

00:30:55.800 --> 00:30:55.900
<v Michael Kennedy>Yeah.

00:30:56.280 --> 00:30:56.440
<v Michael Kennedy>All right.

00:30:56.840 --> 00:30:56.920
<v Michael Kennedy>Yeah.

00:30:57.040 --> 00:30:58.240
<v Michael Kennedy>Don't touch that dial for now.

00:30:58.740 --> 00:30:59.380
<v Michael Kennedy>Signing off though.

00:30:59.520 --> 00:31:00.020
<v Michael Kennedy>See you later, Brian.

00:31:00.180 --> 00:31:00.480
<v Michael Kennedy>Bye everyone.

00:31:00.560 --> 00:31:00.680
<v Michael Kennedy>Bye.

