WEBVTT

00:00:00.080 --> 00:00:04.040
<v Michael Kennedy>Hello and welcome to Python Bytes, where we deliver Python news and headlines directly

00:00:04.500 --> 00:00:05.060
<v Michael Kennedy>to your earbuds.

00:00:05.400 --> 00:00:06.980
<v Michael Kennedy>This is episode 502,

00:00:07.240 --> 00:00:08.080
<v Michael Kennedy>recorded Tuesday,

00:00:08.560 --> 00:00:09.940
<v Michael Kennedy>October 27th,

00:00:10.240 --> 00:00:10.540
<v Michael Kennedy>2026.

00:00:10.760 --> 00:00:11.500
<v Michael Kennedy>I'm Michael Kennedy.

00:00:11.740 --> 00:00:12.760
<v Calvin Hendryx-Parker>And I'm Calvin Hendrix-Parker.

00:00:13.280 --> 00:00:15.260
<v Michael Kennedy>And this episode is brought to you by us.

00:00:15.600 --> 00:00:18.480
<v Michael Kennedy>If you have hard problems and you want a team you can

00:00:18.720 --> 00:00:18.880
<v Michael Kennedy>trust,

00:00:19.140 --> 00:00:23.640
<v Michael Kennedy>six feet up, just get in touch with Calvin and his team. They're doing amazing work, have

00:00:23.720 --> 00:00:24.540
<v Michael Kennedy>been for 20 years.

00:00:25.320 --> 00:00:28.840
<v Michael Kennedy>And if you want to learn some Python things, check out Talk Python Training,

00:00:28.860 --> 00:00:31.900
<v Michael Kennedy>or you want to support the show over there at Talk Python,

00:00:31.980 --> 00:00:32.780
<v Michael Kennedy>you can join membership.

00:00:32.960 --> 00:00:35.180
<v Michael Kennedy>I have a few announcements from that as well.

00:00:35.480 --> 00:00:37.100
<v Michael Kennedy>Connect with us on the socials,

00:00:37.520 --> 00:00:38.100
<v Michael Kennedy>join the newsletter.

00:00:38.300 --> 00:00:39.860
<v Michael Kennedy>All those things are on the website.

00:00:40.280 --> 00:00:40.680
<v Michael Kennedy>Now,

00:00:41.280 --> 00:00:41.580
<v Michael Kennedy>Calvin,

00:00:42.080 --> 00:00:43.080
<v Michael Kennedy>it's been a week.

00:00:43.560 --> 00:00:44.240
<v Calvin Hendryx-Parker>It's been a week.

00:00:44.500 --> 00:00:45.640
<v Calvin Hendryx-Parker>It's been a crazy week.

00:00:45.700 --> 00:00:47.580
<v Calvin Hendryx-Parker>I was traveling last week and all this hit

00:00:47.640 --> 00:00:49.400
<v Calvin Hendryx-Parker>while I was like either in the air

00:00:49.540 --> 00:00:51.680
<v Calvin Hendryx-Parker>or someplace exotic and strange.

00:00:52.680 --> 00:00:54.280
<v Calvin Hendryx-Parker>And PHP wasn't the only problem.

00:00:54.400 --> 00:00:55.200
<v Calvin Hendryx-Parker>So if you haven't heard,

00:00:55.960 --> 00:00:57.000
<v Calvin Hendryx-Parker>there was a PHP vulnerability,

00:00:57.160 --> 00:00:58.660
<v Calvin Hendryx-Parker>a major one last week.

00:00:58.780 --> 00:00:59.980
<v Calvin Hendryx-Parker>but that's not what I'm gonna talk about.

00:01:00.820 --> 00:01:04.040
<v Calvin Hendryx-Parker>There were three different incidents also

00:01:04.280 --> 00:01:05.760
<v Calvin Hendryx-Parker>that affected the Python ecosystems

00:01:06.160 --> 00:01:07.240
<v Calvin Hendryx-Parker>that you all need to be aware of,

00:01:07.800 --> 00:01:08.700
<v Calvin Hendryx-Parker>and each of them in a different layer.

00:01:09.420 --> 00:01:11.000
<v Calvin Hendryx-Parker>So if you're not familiar with certificates

00:01:11.480 --> 00:01:13.500
<v Calvin Hendryx-Parker>and trust authorities and certificate authorities,

00:01:13.820 --> 00:01:18.060
<v Calvin Hendryx-Parker>there was a major vulnerability there in the trust layer.

00:01:18.320 --> 00:01:19.400
<v Calvin Hendryx-Parker>There was also a vulnerability

00:01:19.630 --> 00:01:22.260
<v Calvin Hendryx-Parker>in the release pipeline again with LightLM.

00:01:22.640 --> 00:01:24.800
<v Calvin Hendryx-Parker>And then we had a C decoder issue

00:01:24.910 --> 00:01:28.019
<v Calvin Hendryx-Parker>that also led to an RCE with the Bratley library

00:01:28.040 --> 00:01:30.100
<v Calvin Hendryx-Parker>from I think what defined folks at Google.

00:01:30.540 --> 00:01:31.940
<v Calvin Hendryx-Parker>But let's dive in.

00:01:32.100 --> 00:01:34.820
<v Calvin Hendryx-Parker>So the eMadura CA,

00:01:35.240 --> 00:01:36.140
<v Calvin Hendryx-Parker>the keys got compromised.

00:01:36.820 --> 00:01:40.200
<v Calvin Hendryx-Parker>And so if you are using a Python older than the ones

00:01:40.220 --> 00:01:42.220
<v Calvin Hendryx-Parker>that are listed in the release right here,

00:01:42.300 --> 00:01:45.800
<v Calvin Hendryx-Parker>so I think it's like the.2, the.10, the.18, et cetera.

00:01:45.880 --> 00:01:49.140
<v Calvin Hendryx-Parker>So basically 3.15 through 3.11 have all been patched,

00:01:49.200 --> 00:01:50.700
<v Calvin Hendryx-Parker>all been fixed and corrected.

00:01:51.480 --> 00:01:53.760
<v Calvin Hendryx-Parker>uv also has been fixed and updated,

00:01:54.680 --> 00:01:57.480
<v Calvin Hendryx-Parker>but you'll notice 3.10 not in the list.

00:01:57.840 --> 00:01:59.960
<v Calvin Hendryx-Parker>This is probably the first very large thing

00:02:00.000 --> 00:02:02.140
<v Calvin Hendryx-Parker>you need to watch out for for 3.9 and 3.10.

00:02:02.500 --> 00:02:03.400
<v Calvin Hendryx-Parker>You're not out of luck though,

00:02:03.680 --> 00:02:07.560
<v Calvin Hendryx-Parker>'cause as long as you upgrade pip, I believe in certify,

00:02:07.940 --> 00:02:09.380
<v Calvin Hendryx-Parker>you'll get the latest bundles

00:02:09.740 --> 00:02:11.240
<v Calvin Hendryx-Parker>into your older versions of Python,

00:02:11.580 --> 00:02:12.800
<v Calvin Hendryx-Parker>but you gotta go do that yourself.

00:02:14.020 --> 00:02:16.400
<v Calvin Hendryx-Parker>The other folks have done all the patching for you

00:02:16.420 --> 00:02:17.140
<v Calvin Hendryx-Parker>and made all the releases,

00:02:17.500 --> 00:02:19.740
<v Calvin Hendryx-Parker>so make sure you grab the latest versions of that.

00:02:20.000 --> 00:02:20.840
<v Calvin Hendryx-Parker>So why does this matter?

00:02:21.320 --> 00:02:23.660
<v Calvin Hendryx-Parker>When a certificate authority gets compromised like this,

00:02:23.940 --> 00:02:26.199
<v Calvin Hendryx-Parker>anyone who has these intermediate keys

00:02:26.220 --> 00:02:28.460
<v Calvin Hendryx-Parker>can basically mint certificates for any domain

00:02:28.720 --> 00:02:32.180
<v Calvin Hendryx-Parker>and any unpatched client who has these certificates

00:02:32.370 --> 00:02:34.180
<v Calvin Hendryx-Parker>in their CA will accept them as valid.

00:02:34.500 --> 00:02:35.800
<v Calvin Hendryx-Parker>That means you are now susceptible

00:02:36.020 --> 00:02:37.080
<v Calvin Hendryx-Parker>to man in the middle attacks,

00:02:37.660 --> 00:02:40.180
<v Calvin Hendryx-Parker>basically reading and altering HTTPS traffic

00:02:40.770 --> 00:02:41.780
<v Calvin Hendryx-Parker>without a certificate warning,

00:02:42.000 --> 00:02:43.180
<v Calvin Hendryx-Parker>pretty bad stuff.

00:02:43.480 --> 00:02:46.060
<v Calvin Hendryx-Parker>If you consider like the world of Python

00:02:46.500 --> 00:02:49.240
<v Calvin Hendryx-Parker>and any version of Python before this,

00:02:49.240 --> 00:02:50.740
<v Calvin Hendryx-Parker>I had those intermediates in there,

00:02:51.040 --> 00:02:52.820
<v Calvin Hendryx-Parker>is now susceptible to reading in data

00:02:53.110 --> 00:02:55.400
<v Calvin Hendryx-Parker>from an untrusted source who will think it's trusted.

00:02:56.200 --> 00:03:01.420
<v Calvin Hendryx-Parker>That's something everyone needs to be obviously on the hook for is making sure we all stay safe out there.

00:03:01.740 --> 00:03:03.640
<v Calvin Hendryx-Parker>So specifically like for Python,

00:03:04.370 --> 00:03:13.180
<v Calvin Hendryx-Parker>you could be downloading a susceptible package from PyPI and get something malicious because the credentials will,

00:03:13.340 --> 00:03:15.380
<v Calvin Hendryx-Parker>it looks real, but it's not.

00:03:15.620 --> 00:03:16.980
<v Calvin Hendryx-Parker>It's not real under the covers.

00:03:17.290 --> 00:03:20.100
<v Calvin Hendryx-Parker>So that one, make sure you grab that latest release.

00:03:20.660 --> 00:03:25.760
<v Calvin Hendryx-Parker>Any existing virtual environments, you're going to need to make sure you upgrade those as well because they don't pick it up automatically.

00:03:26.120 --> 00:03:30.840
<v Calvin Hendryx-Parker>So if you did uv and upgraded your uv and did uv reinstall the Python version,

00:03:31.100 --> 00:03:34.140
<v Calvin Hendryx-Parker>any virtual environments created by that Python version still need to be updated.

00:03:34.280 --> 00:03:36.980
<v Calvin Hendryx-Parker>So grab those, grab the latest and make sure you're safe.

00:03:37.560 --> 00:03:39.540
<v Michael Kennedy>I actually noticed this.

00:03:39.560 --> 00:03:45.200
<v Michael Kennedy>I didn't realize what it was for, but I noticed this because I have a script that just updates my homebrew, my NPM,

00:03:45.520 --> 00:03:47.020
<v Michael Kennedy>my uv installed tools.

00:03:47.220 --> 00:03:48.960
<v Michael Kennedy>And one of the things I've recently added,

00:03:49.140 --> 00:03:50.360
<v Michael Kennedy>I've actually added two things,

00:03:50.940 --> 00:03:51.840
<v Michael Kennedy>is one,

00:03:52.360 --> 00:03:52.440
<v Michael Kennedy>just

00:03:52.760 --> 00:03:58.640
<v Michael Kennedy>uv Python upgrade will do a build level upgrade of all of your installed Pythons without changing

00:03:58.820 --> 00:03:58.960
<v Michael Kennedy>anything.

00:03:59.340 --> 00:04:01.300
<v Michael Kennedy>And I think without breaking your virtual environments.

00:04:01.780 --> 00:04:01.960
<v Calvin Hendryx-Parker>Nice.

00:04:02.240 --> 00:04:02.360
<v Calvin Hendryx-Parker>Yeah.

00:04:02.500 --> 00:04:07.100
<v Calvin Hendryx-Parker>And there's actually another fix in here too around some tar file stuff too.

00:04:08.160 --> 00:04:08.240
<v Calvin Hendryx-Parker>Yeah.

00:04:08.320 --> 00:04:09.820
<v Calvin Hendryx-Parker>Reject cookies in a negative assertion.

00:04:10.460 --> 00:04:10.640
<v Calvin Hendryx-Parker>Oh yeah.

00:04:10.740 --> 00:04:11.320
<v Calvin Hendryx-Parker>The tar file,

00:04:11.600 --> 00:04:11.980
<v Calvin Hendryx-Parker>tar filter.

00:04:12.080 --> 00:04:14.120
<v Calvin Hendryx-Parker>So there was more than just the CAs in this release,

00:04:14.520 --> 00:04:17.079
<v Calvin Hendryx-Parker>two other CVEs, but none as important

00:04:17.100 --> 00:04:18.739
<v Calvin Hendryx-Parker>the CA one that's bundled in here.

00:04:18.950 --> 00:04:21.340
<v Calvin Hendryx-Parker>The next one was on the build side.

00:04:21.530 --> 00:04:23.380
<v Calvin Hendryx-Parker>The build side of this,

00:04:23.670 --> 00:04:24.800
<v Calvin Hendryx-Parker>which is Lite LLM again,

00:04:25.220 --> 00:04:27.600
<v Calvin Hendryx-Parker>is in the news. They got compromised back in March.

00:04:27.840 --> 00:04:28.960
<v Calvin Hendryx-Parker>They also have just

00:04:29.120 --> 00:04:29.220
<v Calvin Hendryx-Parker>gotten,

00:04:29.830 --> 00:04:34.260
<v Calvin Hendryx-Parker>the build got compromised. There was a version of Lite LLM that hit PyPI.

00:04:34.730 --> 00:04:35.680
<v Calvin Hendryx-Parker>It was up for

00:04:35.920 --> 00:04:36.660
<v Calvin Hendryx-Parker>about two hours,

00:04:37.440 --> 00:04:38.580
<v Calvin Hendryx-Parker>roughly 49,000 downloads.

00:04:39.390 --> 00:04:39.520
<v Calvin Hendryx-Parker>So,

00:04:40.080 --> 00:04:40.800
<v Calvin Hendryx-Parker>which is kind of sad.

00:04:41.220 --> 00:04:42.280
<v Calvin Hendryx-Parker>Folks should make sure that

00:04:42.300 --> 00:04:48.620
<v Calvin Hendryx-Parker>they are using the back off in their pipelines to install not the absolute latest and greatest.

00:04:48.830 --> 00:04:48.940
<v Calvin Hendryx-Parker>You

00:04:48.940 --> 00:04:49.640
<v Calvin Hendryx-Parker>may want to wait,

00:04:49.830 --> 00:04:53.560
<v Calvin Hendryx-Parker>have it back off a few days and only grab versions that have been released for,

00:04:53.880 --> 00:04:58.760
<v Calvin Hendryx-Parker>well, at this point, if you had at least three hours in there, you had been fine and gotten the

00:04:58.880 --> 00:04:59.660
<v Calvin Hendryx-Parker>patched version of it.

00:05:00.260 --> 00:05:01.480
<v Calvin Hendryx-Parker>Docker images were also infected.

00:05:01.650 --> 00:05:02.280
<v Calvin Hendryx-Parker>They basically,

00:05:02.780 --> 00:05:03.660
<v Calvin Hendryx-Parker>and I think the big

00:05:03.820 --> 00:05:07.440
<v Calvin Hendryx-Parker>question here is why does this keep happening to LLM? I mean, it's twice this year.

00:05:08.050 --> 00:05:08.539
<v Calvin Hendryx-Parker>The attackers

00:05:08.560 --> 00:05:09.000
<v Calvin Hendryx-Parker>are relentless.

00:05:09.680 --> 00:05:12.860
<v Calvin Hendryx-Parker>They are looking for exposed credentials and that's how they got in this time.

00:05:13.340 --> 00:05:18.640
<v Calvin Hendryx-Parker>They were able to find a key that didn't get revoked. There was a force push that included

00:05:19.300 --> 00:05:23.980
<v Calvin Hendryx-Parker>trying to fix for a key that got published accidentally but they never revoked that key.

00:05:24.360 --> 00:05:30.700
<v Calvin Hendryx-Parker>They were able to use that then to have the pipeline push keys like tokens from actual

00:05:31.320 --> 00:05:35.580
<v Calvin Hendryx-Parker>maintainers to a third-party source where they were able to collect them and then they were able

00:05:35.580 --> 00:05:36.800
<v Calvin Hendryx-Parker>to trigger the build pipeline,

00:05:37.060 --> 00:05:38.820
<v Calvin Hendryx-Parker>removing branch protections,

00:05:39.060 --> 00:05:39.420
<v Calvin Hendryx-Parker>et cetera,

00:05:39.580 --> 00:05:40.360
<v Calvin Hendryx-Parker>because it had admin

00:05:40.640 --> 00:05:40.800
<v Calvin Hendryx-Parker>privileges.

00:05:41.140 --> 00:05:45.240
<v Calvin Hendryx-Parker>So again, make sure your build tokens have least privilege so they can't do things like

00:05:45.360 --> 00:05:47.680
<v Calvin Hendryx-Parker>remove branch protections in your GitHub repository.

00:05:48.020 --> 00:05:50.180
<v Calvin Hendryx-Parker>There's a lot of layers that go into this,

00:05:50.400 --> 00:05:50.480
<v Calvin Hendryx-Parker>but

00:05:50.760 --> 00:05:55.520
<v Calvin Hendryx-Parker>obviously now the LightLLM folks have hardened the pipeline once again to protect against this.

00:05:55.840 --> 00:06:03.140
<v Calvin Hendryx-Parker>But yeah, this was another one that the exploit was using the path hooks for Python start.

00:06:04.980 --> 00:06:05.540
<v Calvin Hendryx-Parker>So

00:06:05.560 --> 00:06:07.100
<v Calvin Hendryx-Parker>for this to be exploited,

00:06:07.540 --> 00:06:08.800
<v Calvin Hendryx-Parker>but it was still SSH keys,

00:06:09.320 --> 00:06:10.280
<v Calvin Hendryx-Parker>cloud browser tokens,

00:06:10.880 --> 00:06:11.020
<v Calvin Hendryx-Parker>CI,

00:06:11.300 --> 00:06:12.320
<v Calvin Hendryx-Parker>AI tool credentials.

00:06:12.860 --> 00:06:13.740
<v Calvin Hendryx-Parker>They're all after your credentials

00:06:13.920 --> 00:06:17.520
<v Calvin Hendryx-Parker>so they can continue propagating these attacks

00:06:17.900 --> 00:06:18.660
<v Calvin Hendryx-Parker>into other places.

00:06:18.960 --> 00:06:20.980
<v Calvin Hendryx-Parker>So if you happen to have downloaded it

00:06:21.040 --> 00:06:21.740
<v Calvin Hendryx-Parker>within those two hours,

00:06:22.840 --> 00:06:23.640
<v Calvin Hendryx-Parker>that's unfortunate.

00:06:24.040 --> 00:06:25.940
<v Calvin Hendryx-Parker>Hopefully you've already patched and are on the way.

00:06:26.380 --> 00:06:28.240
<v Calvin Hendryx-Parker>But I think the important bit here is to learn

00:06:28.480 --> 00:06:30.620
<v Calvin Hendryx-Parker>from how they're hardening their CI pipeline.

00:06:31.400 --> 00:06:33.620
<v Calvin Hendryx-Parker>If anyone is gonna be a good example

00:06:33.800 --> 00:06:34.520
<v Calvin Hendryx-Parker>for the best way to do it,

00:06:34.660 --> 00:06:39.200
<v Calvin Hendryx-Parker>going to be these folks now because they are they've gone through two rounds of this and and

00:06:39.230 --> 00:06:45.580
<v Calvin Hendryx-Parker>some pretty sophisticated versions of the attacks yikes yeah yikes is right uh the last one is even

00:06:45.800 --> 00:06:51.100
<v Michael Kennedy>more a bit of a yikes i have a comment really quick oh go back let's go back really quick i just want

00:06:51.100 --> 00:06:57.760
<v Michael Kennedy>a second uv exclude newer yes give it it's it feels a little like oh it's just security through

00:06:57.980 --> 00:07:03.439
<v Michael Kennedy>obscurity but we're just gonna say well we're just not going and install stuff for like oh a day and

00:07:03.460 --> 00:07:05.320
<v Michael Kennedy>How is that going to make any, it's a good practice.

00:07:05.480 --> 00:07:09.480
<v Michael Kennedy>Almost all of these major ones we've reported on are like, it was out for three hours.

00:07:09.600 --> 00:07:10.620
<v Michael Kennedy>It was out for two hours.

00:07:10.760 --> 00:07:11.980
<v Michael Kennedy>It was out for half a day.

00:07:12.460 --> 00:07:15.400
<v Michael Kennedy>Just let other people go first and find out.

00:07:15.400 --> 00:07:16.000
<v Michael Kennedy>You know what I mean?

00:07:16.100 --> 00:07:16.480
<v Michael Kennedy>Like you,

00:07:17.000 --> 00:07:19.740
<v Michael Kennedy>you rarely need that much cutting edge.

00:07:19.860 --> 00:07:19.940
<v Michael Kennedy>Yeah.

00:07:20.080 --> 00:07:21.840
<v Michael Kennedy>And so just add that.

00:07:22.120 --> 00:07:22.800
<v Michael Kennedy>If you use an uv,

00:07:23.240 --> 00:07:25.680
<v Michael Kennedy>it's, you almost never need it.

00:07:26.260 --> 00:07:29.260
<v Michael Kennedy>And the one thing that where you do maybe sometimes need it is if you're working on a

00:07:29.380 --> 00:07:33.200
<v Michael Kennedy>project and you're pulling in something that you're publishing a PI PI and you're like,

00:07:33.260 --> 00:07:34.620
<v Michael Kennedy>I want to actually just get,

00:07:34.820 --> 00:07:36.540
<v Michael Kennedy>I want to publish it to PyPI and ship it

00:07:36.700 --> 00:07:38.540
<v Michael Kennedy>so I can put the fix in now and test it.

00:07:38.820 --> 00:07:39.660
<v Michael Kennedy>That's really frustrating

00:07:39.680 --> 00:07:40.980
<v Michael Kennedy>because you don't want to wait a week

00:07:41.100 --> 00:07:42.060
<v Michael Kennedy>to test out what you're doing.

00:07:42.340 --> 00:07:43.880
<v Michael Kennedy>So you can just do exclude this package

00:07:44.380 --> 00:07:45.460
<v Michael Kennedy>and just have an exclude list.

00:07:45.720 --> 00:07:47.540
<v Michael Kennedy>They get instant and your stuff gets,

00:07:48.140 --> 00:07:49.160
<v Michael Kennedy>everything else gets delayed

00:07:49.340 --> 00:07:50.380
<v Michael Kennedy>and it's usually perfect.

00:07:50.480 --> 00:07:50.800
<v Michael Kennedy>Yeah, so.

00:07:51.020 --> 00:07:52.040
<v Calvin Hendryx-Parker>Follow these good practices

00:07:52.500 --> 00:07:54.280
<v Calvin Hendryx-Parker>and you will avoid a lot of heartache.

00:07:54.520 --> 00:07:56.400
<v Calvin Hendryx-Parker>I think is the moral of the story here

00:07:56.420 --> 00:07:57.780
<v Calvin Hendryx-Parker>for this one specifically.

00:07:58.600 --> 00:07:59.620
<v Michael Kennedy>It's the tools are here.

00:07:59.680 --> 00:08:00.040
<v Michael Kennedy>So just,

00:08:00.440 --> 00:08:00.540
<v Michael Kennedy>you know,

00:08:00.900 --> 00:08:01.100
<v Michael Kennedy>uv,

00:08:01.160 --> 00:08:02.660
<v Michael Kennedy>I believe pip added this as well.

00:08:02.820 --> 00:08:08.240
<v Michael Kennedy>it's like the cli is really different but it's the effect is the same yep and then the last one

00:08:08.480 --> 00:08:14.580
<v Calvin Hendryx-Parker>major one from last week was the broccoli to shell uh so there's a bug in the broccoli decoder

00:08:14.860 --> 00:08:20.640
<v Calvin Hendryx-Parker>that lets crafted compressed data right past the end of a buffer which gets you a fun rce so

00:08:21.640 --> 00:08:26.460
<v Calvin Hendryx-Parker>if you want a remote shell in a box if you find one of these ones that's been installed with an

00:08:26.460 --> 00:08:31.759
<v Calvin Hendryx-Parker>old version of the brockley c decoder you will be on your way um so if you upgrade to the latest

00:08:31.780 --> 00:08:34.380
<v Calvin Hendryx-Parker>version of Brotley and Brotley CFFI, you'll be fine.

00:08:34.560 --> 00:08:35.360
<v Calvin Hendryx-Parker>Everything's been patched,

00:08:36.010 --> 00:08:36.680
<v Calvin Hendryx-Parker>but you may not

00:08:36.780 --> 00:08:37.520
<v Calvin Hendryx-Parker>know you have this.

00:08:38.110 --> 00:08:39.880
<v Calvin Hendryx-Parker>A lot of web stacks, for example,

00:08:40.120 --> 00:08:41.820
<v Calvin Hendryx-Parker>may be bringing this in because they're

00:08:42.240 --> 00:08:45.620
<v Calvin Hendryx-Parker>using this to get a greater performance out of compression,

00:08:45.930 --> 00:08:46.380
<v Calvin Hendryx-Parker>for example.

00:08:46.960 --> 00:08:47.800
<v Calvin Hendryx-Parker>This is one of the main,

00:08:48.100 --> 00:08:51.400
<v Calvin Hendryx-Parker>one of the use cases for this specific library in there.

00:08:52.270 --> 00:08:54.100
<v Calvin Hendryx-Parker>So you may have gotten a transitive

00:08:54.600 --> 00:08:57.020
<v Calvin Hendryx-Parker>dependency brought in that brought this in.

00:08:57.190 --> 00:08:59.079
<v Calvin Hendryx-Parker>One nice thing is that if you just uninstall

00:08:59.100 --> 00:09:02.700
<v Calvin Hendryx-Parker>the Bratley package and I believe liburl3,

00:09:03.180 --> 00:09:05.700
<v Calvin Hendryx-Parker>other things will just fall back on like HTTPX

00:09:05.740 --> 00:09:07.720
<v Calvin Hendryx-Parker>will fall back automatically to like gzip

00:09:08.120 --> 00:09:10.020
<v Calvin Hendryx-Parker>and deflate for compression.

00:09:10.500 --> 00:09:12.860
<v Calvin Hendryx-Parker>So you can fix it quickly if you can't upgrade.

00:09:13.500 --> 00:09:15.280
<v Calvin Hendryx-Parker>I don't know any reason why you wouldn't be able to upgrade

00:09:15.480 --> 00:09:17.700
<v Calvin Hendryx-Parker>but there are a couple ways to mitigate this

00:09:18.140 --> 00:09:20.140
<v Calvin Hendryx-Parker>which basically involve taking care of

00:09:20.460 --> 00:09:21.420
<v Calvin Hendryx-Parker>getting Bratley out of the loop

00:09:21.580 --> 00:09:25.400
<v Calvin Hendryx-Parker>and then taking care of getting this out of your system.

00:09:26.440 --> 00:09:26.700
<v Calvin Hendryx-Parker>Again,

00:09:27.100 --> 00:09:27.880
<v Calvin Hendryx-Parker>staying on top of it,

00:09:28.400 --> 00:09:30.900
<v Calvin Hendryx-Parker>How long was this one even like out for?

00:09:31.300 --> 00:09:33.220
<v Calvin Hendryx-Parker>I don't even remember if it noticed in there.

00:09:33.440 --> 00:09:36.840
<v Calvin Hendryx-Parker>Yeah, so the Bratley decoder from 1.0.3 through 1.2

00:09:37.340 --> 00:09:38.920
<v Calvin Hendryx-Parker>had this in there.

00:09:39.260 --> 00:09:40.320
<v Calvin Hendryx-Parker>And so by default,

00:09:40.660 --> 00:09:41.400
<v Calvin Hendryx-Parker>you don't get a Python

00:09:41.560 --> 00:09:43.880
<v Calvin Hendryx-Parker>that's been compiled with the Bratley C decoder,

00:09:44.140 --> 00:09:45.940
<v Calvin Hendryx-Parker>but you may be bringing in dependencies that do.

00:09:46.180 --> 00:09:47.180
<v Calvin Hendryx-Parker>So just to be aware,

00:09:47.400 --> 00:09:48.340
<v Calvin Hendryx-Parker>if you may want to,

00:09:48.460 --> 00:09:51.380
<v Calvin Hendryx-Parker>you run like uv or pip looking for this specific dependency

00:09:51.720 --> 00:09:53.500
<v Calvin Hendryx-Parker>in your projects and make sure,

00:09:53.680 --> 00:09:53.800
<v Calvin Hendryx-Parker>again,

00:09:54.080 --> 00:09:55.460
<v Calvin Hendryx-Parker>you update those dependencies.

00:09:56.220 --> 00:09:58.620
<v Calvin Hendryx-Parker>The show notes have links to all these various things.

00:09:58.870 --> 00:10:01.200
<v Calvin Hendryx-Parker>I just thought I'd kind of give a security roundup

00:10:01.470 --> 00:10:04.700
<v Calvin Hendryx-Parker>in my one segment for all the Python folks

00:10:04.790 --> 00:10:05.560
<v Calvin Hendryx-Parker>out there to stay safe.

00:10:05.820 --> 00:10:07.120
<v Michael Kennedy>Calvin, I thought broccoli was good for you.

00:10:07.600 --> 00:10:09.120
<v Calvin Hendryx-Parker>Broccoli is normally good for you.

00:10:09.760 --> 00:10:10.720
<v Michael Kennedy>It's a bad broccoli.

00:10:11.040 --> 00:10:11.800
<v Calvin Hendryx-Parker>It's a bad broccoli.

00:10:12.940 --> 00:10:14.980
<v Michael Kennedy>All right, I am so excited about this project

00:10:15.140 --> 00:10:15.940
<v Michael Kennedy>that I'm going to introduce.

00:10:16.220 --> 00:10:17.340
<v Michael Kennedy>This is my project,

00:10:17.520 --> 00:10:19.220
<v Michael Kennedy>something I've been working on all of last week.

00:10:19.430 --> 00:10:21.680
<v Michael Kennedy>And I think it's going to be really interesting.

00:10:21.790 --> 00:10:22.940
<v Michael Kennedy>And I'm going to show you some numbers.

00:10:23.640 --> 00:10:23.760
<v Michael Kennedy>Why?

00:10:23.920 --> 00:10:24.040
<v Michael Kennedy>Okay.

00:10:24.540 --> 00:10:27.240
<v Michael Kennedy>So I'm sure you're familiar with the Chameleon template language,

00:10:27.440 --> 00:10:27.560
<v Michael Kennedy>yes?

00:10:27.820 --> 00:10:28.200
<v Calvin Hendryx-Parker>Oh, yeah.

00:10:28.460 --> 00:10:31.000
<v Calvin Hendryx-Parker>I'm a long time like Zoplon pyramid.

00:10:31.820 --> 00:10:32.700
<v Michael Kennedy>I'm a big fan.

00:10:32.840 --> 00:10:33.560
<v Michael Kennedy>I'm a big fan of it.

00:10:33.700 --> 00:10:34.660
<v Michael Kennedy>I like it over Jinja.

00:10:34.680 --> 00:10:35.760
<v Michael Kennedy>I like it over Django templates.

00:10:36.200 --> 00:10:40.000
<v Michael Kennedy>We don't need to go into why, but let's just say it's a really minimal,

00:10:40.440 --> 00:10:40.780
<v Michael Kennedy>nice,

00:10:41.180 --> 00:10:41.300
<v Michael Kennedy>clean.

00:10:41.780 --> 00:10:41.840
<v Michael Kennedy>Well,

00:10:42.380 --> 00:10:46.300
<v Michael Kennedy>the TLDR is with Chameleon, the stuff you write is still valid HTML.

00:10:46.820 --> 00:10:48.260
<v Michael Kennedy>With Jinja and Django,

00:10:48.460 --> 00:10:49.800
<v Michael Kennedy>you have all this junk in there.

00:10:50.080 --> 00:10:53.100
<v Michael Kennedy>Plus, it allows you to write arbitrary Python in those other frameworks,

00:10:53.360 --> 00:10:56.400
<v Michael Kennedy>which encourages you to have bad architectural practices,

00:10:56.680 --> 00:10:57.760
<v Michael Kennedy>whereas Chameleon is more strict.

00:10:58.100 --> 00:10:59.680
<v Michael Kennedy>So now that's why I like it.

00:11:00.100 --> 00:11:02.700
<v Michael Kennedy>But it hasn't got a ton of love.

00:11:03.260 --> 00:11:04.560
<v Michael Kennedy>If you go back and look at the project,

00:11:04.960 --> 00:11:05.880
<v Michael Kennedy>I don't have it pulled up here.

00:11:05.940 --> 00:11:09.100
<v Michael Kennedy>Go to pack, look at the Chameleon project to go to the, not the homepage.

00:11:09.620 --> 00:11:12.360
<v Michael Kennedy>Go to the repo run by a bunch of people I really like.

00:11:13.360 --> 00:11:14.360
<v Michael Kennedy>But if we go over here and look,

00:11:14.620 --> 00:11:15.620
<v Michael Kennedy>you can see that like,

00:11:15.800 --> 00:11:19.520
<v Michael Kennedy>well, the build is failing and it's only technically built for 3.13.

00:11:20.200 --> 00:11:25.340
<v Michael Kennedy>it's still on to you know if you go look at the releases i think in the last i remember

00:11:25.880 --> 00:11:30.420
<v Michael Kennedy>summon this up but if you look at the last releases they're all like minor minor bug fix

00:11:30.820 --> 00:11:35.280
<v Michael Kennedy>security fix minor minor bug fix like for the last four years right it's just not a whole lot is going

00:11:35.420 --> 00:11:40.800
<v Michael Kennedy>on there but could we do a better job and still support that so i introduced to the world chameleon

00:11:42.420 --> 00:11:48.179
<v Michael Kennedy>rs like the sportier version of chameleon this is like yeah like if you had a honda accord and

00:11:48.200 --> 00:11:51.940
<v Michael Kennedy>And then you're like, well, what if we had the sport edition and we got a new suspension

00:11:52.260 --> 00:11:53.860
<v Michael Kennedy>and oh yeah, we also put a turbo on it.

00:11:53.940 --> 00:11:54.460
<v Michael Kennedy>You know what I'm like?

00:11:54.460 --> 00:11:55.180
<v Calvin Hendryx-Parker>Get the RS badge on the back.

00:11:55.340 --> 00:11:55.760
<v Calvin Hendryx-Parker>That's all you needed.

00:11:56.080 --> 00:11:56.320
<v Michael Kennedy>Exactly.

00:11:56.800 --> 00:11:57.620
<v Michael Kennedy>It's the RS edition.

00:11:58.080 --> 00:11:58.920
<v Michael Kennedy>So Chameleon RS,

00:11:59.280 --> 00:12:00.460
<v Michael Kennedy>Chameleon templates modernized.

00:12:00.540 --> 00:12:01.580
<v Michael Kennedy>And it's not just faster.

00:12:01.840 --> 00:12:02.700
<v Michael Kennedy>If it were just faster,

00:12:03.020 --> 00:12:03.640
<v Michael Kennedy>that would be interesting.

00:12:04.020 --> 00:12:05.160
<v Michael Kennedy>But let me ask you this.

00:12:05.580 --> 00:12:09.660
<v Michael Kennedy>Is Chameleon Python 315T safe?

00:12:09.940 --> 00:12:11.980
<v Michael Kennedy>Can I run free threaded Python on Chameleon?

00:12:12.399 --> 00:12:13.360
<v Calvin Hendryx-Parker>I'm guessing not.

00:12:13.920 --> 00:12:18.080
<v Michael Kennedy>I don't know, but I would guess strongly no if it hasn't even been touched.

00:12:18.160 --> 00:12:19.440
<v Calvin Hendryx-Parker>It probably wouldn't work very well.

00:12:20.050 --> 00:12:20.180
<v Michael Kennedy>Exactly.

00:12:20.510 --> 00:12:26.900
<v Michael Kennedy>I will bet you good odds that there will be some kind of race condition corruption issue.

00:12:27.480 --> 00:12:29.340
<v Michael Kennedy>So that's the modernized part, right?

00:12:29.780 --> 00:12:30.480
<v Michael Kennedy>Chameleon template is modernized.

00:12:31.060 --> 00:12:36.120
<v Michael Kennedy>I want to be able to run regular new Python and expect that my project will work and not

00:12:36.240 --> 00:12:39.720
<v Michael Kennedy>just race condition corrupt itself out of existence,

00:12:40.300 --> 00:12:41.260
<v Michael Kennedy>especially on a web app that runs

00:12:41.340 --> 00:12:41.720
<v Michael Kennedy>for a long time,

00:12:41.880 --> 00:12:41.960
<v Michael Kennedy>right?

00:12:42.220 --> 00:12:50.460
<v Michael Kennedy>So I rewrote it in Rust and I took every single unit test that Chameleon has and it passes perfectly.

00:12:50.910 --> 00:12:54.900
<v Michael Kennedy>I took all of the template tests where it renders them.

00:12:55.300 --> 00:12:57.580
<v Michael Kennedy>It's byte for byte HTML identical.

00:12:58.060 --> 00:13:05.380
<v Michael Kennedy>I then converted Talk Python and Python bytes to it and requested every single page on old Chameleon and Chameleon RS.

00:13:05.860 --> 00:13:08.620
<v Michael Kennedy>They are byte for byte HTML identical.

00:13:08.980 --> 00:13:10.700
<v Michael Kennedy>Not just like the same parsable structure,

00:13:11.140 --> 00:13:11.380
<v Michael Kennedy>AST.

00:13:11.920 --> 00:13:13.880
<v Michael Kennedy>Like every byte comparison,

00:13:14.060 --> 00:13:14.680
<v Michael Kennedy>they're the same.

00:13:14.890 --> 00:13:15.460
<v Michael Kennedy>How cool is that?

00:13:15.760 --> 00:13:17.060
<v Calvin Hendryx-Parker>That's really cool, actually.

00:13:17.550 --> 00:13:18.180
<v Calvin Hendryx-Parker>Great test, too.

00:13:18.540 --> 00:13:20.800
<v Michael Kennedy>And then I started doing a bunch of multi-threaded tests,

00:13:20.980 --> 00:13:21.720
<v Michael Kennedy>scaling tests,

00:13:22.100 --> 00:13:25.100
<v Michael Kennedy>and I'm still running over on my Mac studio.

00:13:25.760 --> 00:13:29.060
<v Michael Kennedy>It's running for an hour over there doing some performance testing

00:13:29.230 --> 00:13:32.760
<v Michael Kennedy>and looking for any possible issues on the free-threaded stuff.

00:13:33.140 --> 00:13:34.560
<v Michael Kennedy>But not just that, more modernized.

00:13:34.840 --> 00:13:35.100
<v Michael Kennedy>What if,

00:13:35.260 --> 00:13:38.280
<v Michael Kennedy>what if, check this out, in your, let's see, I'll go over here.

00:13:39.620 --> 00:13:41.060
<v Michael Kennedy>What if I had markdown content?

00:13:41.320 --> 00:13:42.560
<v Michael Kennedy>What do I do with that, Calvin?

00:13:42.980 --> 00:13:43.560
<v Michael Kennedy>I don't know.

00:13:43.590 --> 00:13:44.980
<v Michael Kennedy>I can't do anything with it in the templates.

00:13:45.390 --> 00:13:47.300
<v Michael Kennedy>But Markdown is so insanely common.

00:13:47.460 --> 00:13:48.380
<v Michael Kennedy>It's almost HTML,

00:13:48.680 --> 00:13:48.780
<v Michael Kennedy>right?

00:13:49.040 --> 00:13:49.160
<v Calvin Hendryx-Parker>Yeah.

00:13:49.400 --> 00:13:51.180
<v Michael Kennedy>Shouldn't your thing support it?

00:13:51.480 --> 00:13:53.080
<v Michael Kennedy>Well, now you just have Markdown colon,

00:13:53.250 --> 00:13:53.940
<v Michael Kennedy>some kind of content.

00:13:54.220 --> 00:13:55.420
<v Michael Kennedy>And this happens in Rust,

00:13:55.710 --> 00:14:00.160
<v Michael Kennedy>which is like 60 times faster than the Python ones.

00:14:00.520 --> 00:14:02.060
<v Michael Kennedy>So it's insanely fast.

00:14:02.430 --> 00:14:02.540
<v Michael Kennedy>Oh,

00:14:02.760 --> 00:14:05.660
<v Michael Kennedy>and one of the really nice benefits of this, I don't know if you've ever,

00:14:06.020 --> 00:14:06.680
<v Michael Kennedy>I'm sure

00:14:06.800 --> 00:14:08.600
<v Michael Kennedy>you've seen this, how much work you've done with these languages.

00:14:08.960 --> 00:14:14.300
<v Michael Kennedy>But when you first deploy your web app and you request a page and it takes like one second for that page to load.

00:14:14.550 --> 00:14:15.820
<v Michael Kennedy>And then after that, it's fast.

00:14:16.160 --> 00:14:16.680
<v Michael Kennedy>That one second,

00:14:16.840 --> 00:14:19.880
<v Michael Kennedy>a lot of it is actually the Chameleon template compiling,

00:14:20.140 --> 00:14:23.960
<v Michael Kennedy>Chameleon compiling the template into its actual form.

00:14:24.340 --> 00:14:26.940
<v Michael Kennedy>This is 70 times faster compiling the template.

00:14:27.300 --> 00:14:33.220
<v Michael Kennedy>So when you deploy it, the first time you touch a page is basically as fast as if it's up and running.

00:14:33.360 --> 00:14:36.700
<v Calvin Hendryx-Parker>Wow. And I see you've got HTMX support too.

00:14:37.160 --> 00:14:39.280
<v Calvin Hendryx-Parker>than the perfect world combination.

00:14:39.580 --> 00:14:40.880
<v Michael Kennedy>You see, there's more of the modernization.

00:14:40.960 --> 00:14:43.140
<v Michael Kennedy>It's not totally HTMX dedicated,

00:14:43.220 --> 00:14:45.940
<v Michael Kennedy>but I have three things that I've kind of gone around

00:14:45.940 --> 00:14:46.440
<v Michael Kennedy>and I've just,

00:14:46.600 --> 00:14:48.280
<v Michael Kennedy>I like poking at trying

00:14:48.280 --> 00:14:49.420
<v Michael Kennedy>to make these web frameworks better.

00:14:49.420 --> 00:14:50.980
<v Michael Kennedy>So I created Chameleon Flask,

00:14:51.020 --> 00:14:54.220
<v Michael Kennedy>which lets me run Chameleon on Flask in a super easy way.

00:14:54.220 --> 00:14:55.520
<v Michael Kennedy>You just do like a little template

00:14:55.560 --> 00:14:57.540
<v Michael Kennedy>and you put it as a decorator on your Flask thing.

00:14:57.860 --> 00:15:02.240
<v Michael Kennedy>Flask will not adopt Chameleon for reasonable reasons,

00:15:02.420 --> 00:15:04.900
<v Michael Kennedy>but it's not a crazy good reason.

00:15:05.020 --> 00:15:08.220
<v Michael Kennedy>It's like the plugins in Flask expect Jinja,

00:15:08.560 --> 00:15:09.640
<v Michael Kennedy>so we can't have any other template.

00:15:09.740 --> 00:15:10.160
<v Michael Kennedy>Like, well,

00:15:10.380 --> 00:15:11.560
<v Michael Kennedy>it would be nice if we could have other templates

00:15:11.740 --> 00:15:12.140
<v Michael Kennedy>on Flask.

00:15:13.059 --> 00:15:16.460
<v Michael Kennedy>Also, if you want to do HTMX, having some kind of partial library

00:15:16.660 --> 00:15:17.660
<v Michael Kennedy>support is super neat.

00:15:18.120 --> 00:15:20.360
<v Michael Kennedy>But Chameleon is not going to add any concept of partials,

00:15:20.520 --> 00:15:20.580
<v Michael Kennedy>right?

00:15:20.580 --> 00:15:22.600
<v Michael Kennedy>So I took all of these libraries and more,

00:15:23.000 --> 00:15:24.880
<v Michael Kennedy>and I built them in Rust,

00:15:25.080 --> 00:15:26.000
<v Michael Kennedy>rebuilt them,

00:15:26.120 --> 00:15:28.240
<v Michael Kennedy>re-implemented in Rust, and put them inside of Chameleon Artist.

00:15:28.480 --> 00:15:29.860
<v Michael Kennedy>So it has native partial support.

00:15:30.300 --> 00:15:33.540
<v Michael Kennedy>It has native support for a few frameworks,

00:15:34.220 --> 00:15:36.560
<v Michael Kennedy>such as Flask, Quart, FastAPI, Starlette,

00:15:36.780 --> 00:15:36.960
<v Michael Kennedy>Robyn,

00:15:37.500 --> 00:15:38.880
<v Michael Kennedy>and Litestar and Pyramid.

00:15:39.340 --> 00:15:40.140
<v Michael Kennedy>Just out of the box.

00:15:40.500 --> 00:15:41.860
<v Calvin Hendryx-Parker>All right, we need to add this to Plone now.

00:15:42.260 --> 00:15:43.440
<v Calvin Hendryx-Parker>We'll get the Plone folks on it.

00:15:43.480 --> 00:15:43.800
<v Michael Kennedy>Yeah, yeah,

00:15:43.960 --> 00:15:44.540
<v Michael Kennedy>yeah, yeah, absolutely.

00:15:45.100 --> 00:15:46.060
<v Michael Kennedy>Plone people wanna work with me.

00:15:46.240 --> 00:15:47.800
<v Michael Kennedy>I don't have enough stuff to be able to test it.

00:15:48.600 --> 00:15:49.640
<v Calvin Hendryx-Parker>They've got a lot of employment.

00:15:50.200 --> 00:15:51.460
<v Michael Kennedy>So here we go, check this out.

00:15:52.520 --> 00:15:52.840
<v Michael Kennedy>Compatibility,

00:15:53.100 --> 00:15:54.920
<v Michael Kennedy>like you want to switch over.

00:15:55.340 --> 00:15:55.640
<v Michael Kennedy>It has,

00:15:55.880 --> 00:15:56.200
<v Michael Kennedy>like I said,

00:15:56.460 --> 00:15:57.060
<v Michael Kennedy>tons of compatibility,

00:15:57.380 --> 00:15:57.740
<v Michael Kennedy>but,

00:15:58.300 --> 00:15:59.720
<v Michael Kennedy>oh yeah, it also has an AI skill.

00:15:59.960 --> 00:16:00.940
<v Michael Kennedy>So if you go to the docs,

00:16:01.360 --> 00:16:02.560
<v Michael Kennedy>it has lm.txt,

00:16:02.700 --> 00:16:04.220
<v Michael Kennedy>but also an installable skill.

00:16:04.350 --> 00:16:05.960
<v Michael Kennedy>So you can teach your agent just like,

00:16:05.960 --> 00:16:06.040
<v Michael Kennedy>hey,

00:16:06.250 --> 00:16:07.080
<v Michael Kennedy>you should make this happen.

00:16:07.640 --> 00:16:08.820
<v Michael Kennedy>And what was the other?

00:16:08.870 --> 00:16:09.200
<v Michael Kennedy>Oh, yes,

00:16:09.380 --> 00:16:10.120
<v Michael Kennedy>getting started.

00:16:10.320 --> 00:16:13.780
<v Michael Kennedy>So if I want to switch from regular Chameleon,

00:16:14.080 --> 00:16:16.480
<v Michael Kennedy>this is like Chameleon, Chameleon partials,

00:16:16.760 --> 00:16:17.980
<v Michael Kennedy>all these different pieces.

00:16:18.420 --> 00:16:20.840
<v Michael Kennedy>You just import ChameleonRS.compat,

00:16:21.060 --> 00:16:22.140
<v Michael Kennedy>compat.install.

00:16:22.550 --> 00:16:22.640
<v Michael Kennedy>Boom.

00:16:23.120 --> 00:16:24.040
<v Michael Kennedy>That's all you do in your app

00:16:24.050 --> 00:16:25.780
<v Michael Kennedy>and everything else is now running the Rust version.

00:16:26.080 --> 00:16:26.520
<v Calvin Hendryx-Parker>That's amazing.

00:16:26.900 --> 00:16:28.060
<v Calvin Hendryx-Parker>I'd recommend rewriting it.

00:16:28.220 --> 00:16:29.980
<v Calvin Hendryx-Parker>You have this live now on Talk Python?

00:16:30.360 --> 00:16:31.000
<v Michael Kennedy>Yeah, yeah, yeah.

00:16:31.340 --> 00:16:31.460
<v Calvin Hendryx-Parker>Nice.

00:16:31.820 --> 00:16:34.060
<v Michael Kennedy>And now not only do I have it live, this is the last thing I'm going to say.

00:16:34.140 --> 00:16:35.820
<v Michael Kennedy>I'll chill out because I'm really excited about it.

00:16:35.820 --> 00:16:38.820
<v Michael Kennedy>This is such a neat thing to be doing.

00:16:39.060 --> 00:16:40.260
<v Michael Kennedy>So I switched it.

00:16:40.680 --> 00:16:42.340
<v Michael Kennedy>These numbers are off of Talk Python training, okay?

00:16:42.680 --> 00:16:45.940
<v Michael Kennedy>So I literally effectively wrote those two lines.

00:16:45.980 --> 00:16:48.960
<v Michael Kennedy>I did completely rewrite it to natively take advantage of those things

00:16:49.500 --> 00:16:50.420
<v Michael Kennedy>because I have plans.

00:16:50.720 --> 00:16:52.840
<v Michael Kennedy>But you could just do the compat thing and basically get this.

00:16:53.120 --> 00:16:57.460
<v Michael Kennedy>So the median page response time is 17.6 seconds.

00:16:58.500 --> 00:16:58.740
<v Michael Kennedy>sorry,

00:16:58.920 --> 00:17:02.380
<v Michael Kennedy>17.6% faster by just doing that.

00:17:02.840 --> 00:17:06.000
<v Michael Kennedy>And pages that are large are 19% faster.

00:17:06.360 --> 00:17:07.020
<v Michael Kennedy>Here's a nice graph.

00:17:07.240 --> 00:17:08.880
<v Michael Kennedy>Look at this graph before and after.

00:17:09.660 --> 00:17:10.780
<v Calvin Hendryx-Parker>Huh, you can see where the change was.

00:17:11.199 --> 00:17:11.380
<v Calvin Hendryx-Parker>Yeah,

00:17:11.560 --> 00:17:13.800
<v Michael Kennedy>it's like the thing I'm linking to,

00:17:13.800 --> 00:17:15.319
<v Michael Kennedy>you can see the picture, it just drops.

00:17:15.400 --> 00:17:16.680
<v Michael Kennedy>And then you go, you can actually see

00:17:16.959 --> 00:17:17.880
<v Michael Kennedy>as the pages get bigger,

00:17:17.880 --> 00:17:19.839
<v Michael Kennedy>it only gets to be like more useful.

00:17:20.020 --> 00:17:22.319
<v Michael Kennedy>And then you can see like the faster and slower.

00:17:22.459 --> 00:17:25.160
<v Michael Kennedy>Like in almost every way, this is just more awesome.

00:17:25.500 --> 00:17:27.420
<v Michael Kennedy>Even if you don't take advantage of any of the things.

00:17:27.839 --> 00:17:28.600
<v Michael Kennedy>Now, I want to point out,

00:17:29.000 --> 00:17:33.680
<v Michael Kennedy>this is not, I went and I made some very specific benchmark,

00:17:34.360 --> 00:17:34.480
<v Michael Kennedy>like

00:17:34.860 --> 00:17:39.900
<v Michael Kennedy>I'm going to return a JSON document that's in memory and then test how fast that goes.

00:17:40.380 --> 00:17:40.460
<v Michael Kennedy>Oh,

00:17:40.680 --> 00:17:41.800
<v Michael Kennedy>look, it's 20% faster.

00:17:42.260 --> 00:17:43.920
<v Michael Kennedy>This is the entire application running.

00:17:44.120 --> 00:17:45.360
<v Michael Kennedy>This is all the data access,

00:17:45.680 --> 00:17:46.180
<v Michael Kennedy>all the validation,

00:17:46.560 --> 00:17:47.880
<v Michael Kennedy>all the e-commerce junk,

00:17:48.070 --> 00:17:48.760
<v Michael Kennedy>all the logging,

00:17:49.400 --> 00:17:49.600
<v Michael Kennedy>everything,

00:17:49.880 --> 00:17:50.940
<v Michael Kennedy>like all the database calls,

00:17:51.160 --> 00:17:52.160
<v Michael Kennedy>all of it.

00:17:52.290 --> 00:17:56.560
<v Michael Kennedy>And even when you consider the entire app running, it's still 19% faster just by switching

00:17:56.610 --> 00:17:56.860
<v Michael Kennedy>that out.

00:17:57.080 --> 00:17:57.640
<v Calvin Hendryx-Parker>Speed is a feature.

00:17:58.090 --> 00:17:58.840
<v Calvin Hendryx-Parker>Speed is the feature.

00:17:59.280 --> 00:17:59.520
<v Michael Kennedy>All right.

00:17:59.720 --> 00:17:59.860
<v Michael Kennedy>Okay.

00:18:00.500 --> 00:18:00.700
<v Michael Kennedy>People,

00:18:01.140 --> 00:18:03.140
<v Michael Kennedy>if you like Chameleon, check out Chameleon RS.

00:18:03.440 --> 00:18:04.120
<v Michael Kennedy>It's pretty awesome.

00:18:04.500 --> 00:18:04.620
<v Calvin Hendryx-Parker>Yeah.

00:18:04.910 --> 00:18:05.000
<v Calvin Hendryx-Parker>Well,

00:18:05.260 --> 00:18:09.940
<v Calvin Hendryx-Parker>speaking of speed is a feature, the astral folks have come up with some new fun stuff.

00:18:10.500 --> 00:18:11.500
<v Calvin Hendryx-Parker>That's what I got up next here.

00:18:11.780 --> 00:18:11.960
<v Michael Kennedy>Yeah.

00:18:12.280 --> 00:18:12.720
<v Michael Kennedy>Let's hear it.

00:18:12.900 --> 00:18:13.660
<v Calvin Hendryx-Parker>So it's interesting.

00:18:13.770 --> 00:18:17.720
<v Calvin Hendryx-Parker>So they're experimenting with bringing together some of the astral tools,

00:18:18.110 --> 00:18:18.800
<v Calvin Hendryx-Parker>which I've always

00:18:19.060 --> 00:18:23.260
<v Calvin Hendryx-Parker>loved the fact that astrals kept them kind of like a little bit of the Unix philosophy,

00:18:23.440 --> 00:18:25.380
<v Calvin Hendryx-Parker>like one tool to do one thing and does it really well,

00:18:25.630 --> 00:18:27.040
<v Calvin Hendryx-Parker>where you can kind of pipe them together

00:18:27.060 --> 00:18:27.340
<v Calvin Hendryx-Parker>needed to,

00:18:27.520 --> 00:18:29.980
<v Calvin Hendryx-Parker>but now there's an ability to take them

00:18:29.980 --> 00:18:32.980
<v Calvin Hendryx-Parker>and pull them together to gain another multiplier.

00:18:33.530 --> 00:18:38.020
<v Calvin Hendryx-Parker>So the latest release here is bringing uv and TIE together.

00:18:38.600 --> 00:18:40.900
<v Calvin Hendryx-Parker>So this blog post from October 13th,

00:18:41.200 --> 00:18:43.660
<v Calvin Hendryx-Parker>as an experimental integration between uv and TIE

00:18:43.880 --> 00:18:44.500
<v Calvin Hendryx-Parker>available in preview.

00:18:45.080 --> 00:18:46.560
<v Calvin Hendryx-Parker>Now they're asking for feedback on this.

00:18:47.070 --> 00:18:48.700
<v Calvin Hendryx-Parker>And in parallel, they're continuing towards

00:18:49.030 --> 00:18:50.680
<v Calvin Hendryx-Parker>a stable release for TIE itself.

00:18:50.870 --> 00:18:51.620
<v Calvin Hendryx-Parker>So this is all,

00:18:51.930 --> 00:18:52.060
<v Calvin Hendryx-Parker>again,

00:18:52.320 --> 00:18:53.860
<v Calvin Hendryx-Parker>kind of on the maybe bleeding edge,

00:18:54.020 --> 00:18:56.940
<v Calvin Hendryx-Parker>leading edge of the actual tool chain stuff.

00:18:57.330 --> 00:18:58.420
<v Calvin Hendryx-Parker>But why does this matter to you?

00:18:58.600 --> 00:18:59.700
<v Calvin Hendryx-Parker>Why should you even care?

00:19:00.020 --> 00:19:00.960
<v Calvin Hendryx-Parker>And one of the things I love,

00:19:00.960 --> 00:19:02.640
<v Calvin Hendryx-Parker>and I didn't really piece this together

00:19:02.790 --> 00:19:03.760
<v Calvin Hendryx-Parker>until I read the blog post,

00:19:03.770 --> 00:19:05.500
<v Calvin Hendryx-Parker>is with PEP 7.23,

00:19:05.940 --> 00:19:07.880
<v Calvin Hendryx-Parker>it allows for the inline scripts,

00:19:08.660 --> 00:19:10.600
<v Calvin Hendryx-Parker>the inline dependencies at the top of the script.

00:19:10.650 --> 00:19:11.680
<v Calvin Hendryx-Parker>So you can see here on the screen,

00:19:12.460 --> 00:19:14.180
<v Calvin Hendryx-Parker>there's an example where they've got the inline

00:19:14.340 --> 00:19:15.500
<v Calvin Hendryx-Parker>where it says what Python it requires

00:19:15.670 --> 00:19:17.380
<v Calvin Hendryx-Parker>and what versions of what dependencies it requires.

00:19:17.740 --> 00:19:19.560
<v Calvin Hendryx-Parker>You can have in your library,

00:19:20.230 --> 00:19:21.360
<v Calvin Hendryx-Parker>I didn't think about this,

00:19:21.540 --> 00:19:22.380
<v Calvin Hendryx-Parker>but you can have inside your,

00:19:23.020 --> 00:19:24.020
<v Calvin Hendryx-Parker>if you've got a repository

00:19:24.260 --> 00:19:25.340
<v Calvin Hendryx-Parker>where you're storing a bunch of different scripts,

00:19:25.840 --> 00:19:27.760
<v Calvin Hendryx-Parker>different scripts can actually have different dependencies.

00:19:28.220 --> 00:19:30.180
<v Calvin Hendryx-Parker>And uv handles this very, very cleanly

00:19:30.320 --> 00:19:33.040
<v Calvin Hendryx-Parker>by creating environments for each script individually.

00:19:33.700 --> 00:19:36.160
<v Calvin Hendryx-Parker>And now it can take those various environments

00:19:36.380 --> 00:19:37.940
<v Calvin Hendryx-Parker>and use Ty as a language server

00:19:38.400 --> 00:19:40.440
<v Calvin Hendryx-Parker>to do all the validation of your type checking

00:19:40.770 --> 00:19:42.280
<v Calvin Hendryx-Parker>inside of each script individually

00:19:42.650 --> 00:19:44.080
<v Calvin Hendryx-Parker>without kind of running over each other

00:19:44.770 --> 00:19:46.560
<v Calvin Hendryx-Parker>or getting the wrong version of this dependency

00:19:46.860 --> 00:19:47.840
<v Calvin Hendryx-Parker>for that one that's over there.

00:19:48.320 --> 00:19:49.660
<v Calvin Hendryx-Parker>So it's kind of bringing together

00:19:49.660 --> 00:19:50.780
<v Calvin Hendryx-Parker>the best of both worlds here

00:19:50.840 --> 00:19:52.220
<v Calvin Hendryx-Parker>is where you can actually enable this.

00:19:52.380 --> 00:19:57.400
<v Calvin Hendryx-Parker>You have to turn it on and then your editor now can be aware of the various versions of the

00:19:57.600 --> 00:20:02.640
<v Calvin Hendryx-Parker>dependencies to make sure that Ty is using the right dependency versions as it builds out the

00:20:03.050 --> 00:20:04.940
<v Calvin Hendryx-Parker>type checking for you in the backside.

00:20:05.150 --> 00:20:06.900
<v Calvin Hendryx-Parker>So it's all opt-in right now.

00:20:07.400 --> 00:20:08.580
<v Calvin Hendryx-Parker>You should definitely check it

00:20:08.630 --> 00:20:08.780
<v Calvin Hendryx-Parker>out.

00:20:08.940 --> 00:20:11.720
<v Calvin Hendryx-Parker>It's powered by the uv workspace metadata.

00:20:12.250 --> 00:20:14.140
<v Calvin Hendryx-Parker>So again, another part I didn't really recognize

00:20:14.250 --> 00:20:17.560
<v Calvin Hendryx-Parker>is that uv is maintaining a really rich set of metadata under the covers.

00:20:18.120 --> 00:20:18.620
<v Calvin Hendryx-Parker>And wouldn't it be

00:20:18.540 --> 00:20:22.840
<v Calvin Hendryx-Parker>great if your type checker had access to that same set of metadata so it's bringing together

00:20:23.450 --> 00:20:28.960
<v Calvin Hendryx-Parker>kind of more data to build a better experience for the editors the ide's well ultimately the

00:20:29.180 --> 00:20:34.200
<v Calvin Hendryx-Parker>developer experience benefits from from doing all this so it's working on it's work on this there's

00:20:34.260 --> 00:20:38.340
<v Calvin Hendryx-Parker>some i think there's some more stuff coming soon from them you may see rough getting some

00:20:38.520 --> 00:20:43.020
<v Calvin Hendryx-Parker>integrations as well the tools obviously stay still independent but now they can work more

00:20:43.280 --> 00:20:47.540
<v Calvin Hendryx-Parker>closely together to superpower the developer experience which is really cool that's very cool

00:20:47.780 --> 00:20:53.320
<v Michael Kennedy>and it just makes sense to bring you know ty i can see rough coming as well as just a sub command

00:20:53.780 --> 00:20:58.940
<v Michael Kennedy>like uv format you know what i mean like why do i need three different commands well and you

00:20:59.160 --> 00:21:03.920
<v Calvin Hendryx-Parker>accomplish what the tool suite does right this is this is compatible with uv check so the uv check

00:21:04.100 --> 00:21:09.280
<v Calvin Hendryx-Parker>command and uv pre-commit hooks will also grab the right versions of things and do the right type

00:21:09.400 --> 00:21:15.120
<v Calvin Hendryx-Parker>checking of the bits uh all on the fly for you automatically so it gives you even more reason to

00:21:15.140 --> 00:21:19.720
<v Calvin Hendryx-Parker>use the PEP 723 especially for writing lots of little utility scripts are kind of one-off commands

00:21:19.900 --> 00:21:24.880
<v Calvin Hendryx-Parker>that are meant for consumption by other folks this makes it really easy to to develop those and use

00:21:25.040 --> 00:21:30.240
<v Michael Kennedy>type checking uh just seamlessly yeah which is super cool it is super cool uh two things also

00:21:30.880 --> 00:21:35.280
<v Michael Kennedy>astral being part of open ai looks like there's still i know people were concerned but it looks

00:21:35.290 --> 00:21:39.740
<v Michael Kennedy>like still innovating still innovating still coming on strong and this was independently sent

00:21:39.760 --> 00:21:45.900
<v Michael Kennedy>to us by sky casco so thank you for that thanks i think you indic you i think you found it separately

00:21:46.140 --> 00:21:50.760
<v Michael Kennedy>but still very very cool they sent that in yeah now my first my first one was kind of intense

00:21:50.940 --> 00:21:54.520
<v Michael Kennedy>because i was so excited about it let's do something light i am very excited i am not

00:21:54.620 --> 00:22:00.500
<v Michael Kennedy>i will be back i will be back with more to the story but i want to talk about streamlit light

00:22:00.800 --> 00:22:06.120
<v Michael Kennedy>so you know what streamlit is yeah you've seen streamlit yeah so streamlit i had adrian on way

00:22:06.140 --> 00:22:08.100
<v Michael Kennedy>back before Streamlit was acquired by,

00:22:08.400 --> 00:22:09.940
<v Michael Kennedy>I'm sorry, who acquired Streamlit?

00:22:10.140 --> 00:22:10.400
<v Michael Kennedy>Snowflake.

00:22:12.700 --> 00:22:20.220
<v Michael Kennedy>And the idea is you write basically procedural code and your procedural code is understood by

00:22:20.540 --> 00:22:25.080
<v Michael Kennedy>Streamlit and then turned into an interactive dashboard with controls that then change the

00:22:25.240 --> 00:22:27.020
<v Michael Kennedy>parameters to your procedural functions you write.

00:22:27.200 --> 00:22:30.060
<v Michael Kennedy>It's like if you don't really want to be or are

00:22:30.120 --> 00:22:34.880
<v Michael Kennedy>not a visual front-end designer, but you want data science like it has a cool front-end with lots

00:22:34.900 --> 00:22:36.500
<v Michael Kennedy>interactivity. I really, really think it's cool.

00:22:36.840 --> 00:22:36.960
<v Michael Kennedy>Well,

00:22:37.340 --> 00:22:37.860
<v Michael Kennedy>like Jupyter,

00:22:38.100 --> 00:22:39.020
<v Michael Kennedy>it requires a server.

00:22:39.410 --> 00:22:39.540
<v Michael Kennedy>So

00:22:40.000 --> 00:22:42.580
<v Michael Kennedy>this STLite by witphx,

00:22:42.980 --> 00:22:43.800
<v Michael Kennedy>I don't know,

00:22:43.980 --> 00:22:47.720
<v Michael Kennedy>is basically streamlit in the browser,

00:22:48.200 --> 00:22:49.100
<v Michael Kennedy>which is pretty sweet.

00:22:49.520 --> 00:22:52.660
<v Michael Kennedy>So similar to what you might get with JupyterLite.

00:22:53.200 --> 00:22:55.320
<v Michael Kennedy>And it's really interesting because it's not just,

00:22:55.350 --> 00:22:55.500
<v Michael Kennedy>oh,

00:22:55.680 --> 00:22:59.060
<v Michael Kennedy>look, you can run it. It's obviously based on Pyodide, which is solid.

00:22:59.280 --> 00:23:00.800
<v Michael Kennedy>I just did a Talk

00:23:00.820 --> 00:23:02.020
<v Michael Kennedy>Python episode recorded,

00:23:02.240 --> 00:23:05.960
<v Michael Kennedy>not yet published with the Cloudflare team about Python Cloudflare

00:23:06.220 --> 00:23:06.540
<v Michael Kennedy>edge workers.

00:23:07.180 --> 00:23:11.360
<v Michael Kennedy>And a couple of the folks who are building that and who built that are Pyodide core

00:23:11.560 --> 00:23:12.040
<v Michael Kennedy>developers.

00:23:12.260 --> 00:23:13.600
<v Michael Kennedy>So Pyodide is going strong,

00:23:14.030 --> 00:23:14.680
<v Michael Kennedy>which is really cool.

00:23:14.850 --> 00:23:16.300
<v Michael Kennedy>So what I can do is I can come up

00:23:16.300 --> 00:23:19.540
<v Michael Kennedy>and just create a Streamlit app that you can share.

00:23:19.880 --> 00:23:20.380
<v Michael Kennedy>But look at this,

00:23:20.740 --> 00:23:20.920
<v Michael Kennedy>Calvin,

00:23:21.250 --> 00:23:21.980
<v Michael Kennedy>a desktop app.

00:23:22.180 --> 00:23:22.460
<v Calvin Hendryx-Parker>Nice.

00:23:22.830 --> 00:23:27.180
<v Michael Kennedy>So the desktop app basically creates an Electron.js version.

00:23:27.180 --> 00:23:27.660
<v Calvin Hendryx-Parker>Oh, that's cool.

00:23:27.960 --> 00:23:33.180
<v Michael Kennedy>then host your WASM streamlet app in PyDyde running locally with, I believe,

00:23:33.340 --> 00:23:34.040
<v Michael Kennedy>local data access,

00:23:34.270 --> 00:23:35.400
<v Michael Kennedy>which is why it would be interesting.

00:23:35.680 --> 00:23:35.780
<v Calvin Hendryx-Parker>Yeah.

00:23:36.110 --> 00:23:36.200
<v Calvin Hendryx-Parker>Yeah.

00:23:36.230 --> 00:23:37.220
<v Calvin Hendryx-Parker>I wonder what the speed's like.

00:23:37.250 --> 00:23:38.720
<v Calvin Hendryx-Parker>I don't know if you've demoed any of this.

00:23:39.080 --> 00:23:39.260
<v Michael Kennedy>Yeah.

00:23:39.490 --> 00:23:40.120
<v Michael Kennedy>I don't know, actually.

00:23:41.020 --> 00:23:41.140
<v Michael Kennedy>Yeah.

00:23:41.330 --> 00:23:41.680
<v Michael Kennedy>I don't know.

00:23:42.220 --> 00:23:44.200
<v Michael Kennedy>WebAssembly is pretty quick these days, but who knows?

00:23:44.440 --> 00:23:45.540
<v Michael Kennedy>It integrates with React,

00:23:45.840 --> 00:23:46.300
<v Michael Kennedy>which is cool.

00:23:46.840 --> 00:23:48.340
<v Michael Kennedy>You can drop it into your own page.

00:23:48.490 --> 00:23:54.399
<v Michael Kennedy>And so you just have to do things like add a style sheet and then just include the JavaScript

00:23:54.420 --> 00:23:54.780
<v Michael Kennedy>module,

00:23:55.160 --> 00:24:00.420
<v Michael Kennedy>which then pulls in the WASM, and then you just have a streamlet-app inline your Python,

00:24:00.680 --> 00:24:01.340
<v Michael Kennedy>and you're good to go.

00:24:01.820 --> 00:24:02.140
<v Michael Kennedy>Anyway,

00:24:02.300 --> 00:24:03.600
<v Michael Kennedy>I think this is really cool.

00:24:03.780 --> 00:24:05.260
<v Michael Kennedy>I'm a fan of these in the browser

00:24:05.460 --> 00:24:05.600
<v Michael Kennedy>things.

00:24:05.940 --> 00:24:08.820
<v Michael Kennedy>So often it's like, well, how do I share this thing I built with somebody? It's like,

00:24:08.960 --> 00:24:11.100
<v Michael Kennedy>what if I could put it on a static file server?

00:24:12.580 --> 00:24:13.600
<v Michael Kennedy>Netlify or something like that.

00:24:13.720 --> 00:24:17.280
<v Calvin Hendryx-Parker>Yeah, I like the offline desktop executable mode as well.

00:24:17.580 --> 00:24:19.500
<v Calvin Hendryx-Parker>You can build an app, you can just

00:24:19.520 --> 00:24:24.320
<v Calvin Hendryx-Parker>So app bundle you can hand someone or an exe that someone can just run without any other dependencies.

00:24:24.960 --> 00:24:25.060
<v Michael Kennedy>Yep.

00:24:25.320 --> 00:24:25.420
<v Michael Kennedy>Yep.

00:24:25.800 --> 00:24:26.780
<v Michael Kennedy>It's pretty straightforward.

00:24:26.960 --> 00:24:29.180
<v Michael Kennedy>It just gives you all the little bits that you need and off it goes.

00:24:29.540 --> 00:24:33.960
<v Michael Kennedy>I would like to point out one thing for people out there working on projects or if they're listening.

00:24:34.360 --> 00:24:35.700
<v Michael Kennedy>Here's an app out of visual,

00:24:36.080 --> 00:24:39.840
<v Michael Kennedy>a visual thing like a data dashboard in a desktop app.

00:24:40.000 --> 00:24:41.040
<v Michael Kennedy>There's not one picture here.

00:24:41.360 --> 00:24:41.500
<v Calvin Hendryx-Parker>Goodness.

00:24:42.100 --> 00:24:42.500
<v Calvin Hendryx-Parker>Yeah.

00:24:43.100 --> 00:24:43.500
<v Michael Kennedy>Screenshots,

00:24:43.700 --> 00:24:43.780
<v Michael Kennedy>people.

00:24:44.220 --> 00:24:44.620
<v Michael Kennedy>Screenshots.

00:24:44.840 --> 00:24:45.580
<v Michael Kennedy>Get us excited.

00:24:45.680 --> 00:24:47.060
<v Michael Kennedy>I mean, just you already got the thing.

00:24:47.160 --> 00:24:47.800
<v Michael Kennedy>Just screenshot it.

00:24:48.020 --> 00:24:48.100
<v Michael Kennedy>Anyway,

00:24:48.720 --> 00:24:49.100
<v Michael Kennedy>that's it.

00:24:49.160 --> 00:24:51.760
<v Michael Kennedy>that's it for my items. How extra are you feeling?

00:24:51.960 --> 00:24:53.120
<v Calvin Hendryx-Parker>I'm feeling like I've got a couple extras.

00:24:53.550 --> 00:24:55.800
<v Calvin Hendryx-Parker>One of them is a shout out to another podcast.

00:24:56.170 --> 00:25:00.060
<v Calvin Hendryx-Parker>Given the security elements I talked about at the beginning of this episode,

00:25:00.360 --> 00:25:01.200
<v Calvin Hendryx-Parker>if you wanted to hear

00:25:01.360 --> 00:25:03.400
<v Calvin Hendryx-Parker>more, you should definitely check out the Real Python podcast.

00:25:03.930 --> 00:25:05.500
<v Calvin Hendryx-Parker>They had Seth Larson on talking

00:25:05.530 --> 00:25:06.960
<v Calvin Hendryx-Parker>about the future of Python security.

00:25:07.210 --> 00:25:10.960
<v Calvin Hendryx-Parker>So definitely check that out. I think security is obviously

00:25:11.400 --> 00:25:14.760
<v Calvin Hendryx-Parker>becoming more and more and more prevalent in our day-to-day lives as developers.

00:25:15.290 --> 00:25:15.860
<v Calvin Hendryx-Parker>So there's another

00:25:15.860 --> 00:25:17.240
<v Calvin Hendryx-Parker>good reason to go talk about it.

00:25:17.440 --> 00:25:20.180
<v Calvin Hendryx-Parker>And then another little just announcement is that the Python

00:25:20.360 --> 00:25:23.820
<v Calvin Hendryx-Parker>Software Foundation wikis have moved to GitHub pages,

00:25:24.540 --> 00:25:25.720
<v Calvin Hendryx-Parker>which I think is probably a great move.

00:25:26.240 --> 00:25:27.200
<v Calvin Hendryx-Parker>So PSF wiki,

00:25:27.420 --> 00:25:31.020
<v Calvin Hendryx-Parker>the Python wiki, and the Jthon wiki are now over on GitHub itself.

00:25:31.240 --> 00:25:31.860
<v Calvin Hendryx-Parker>So if you click on

00:25:31.980 --> 00:25:35.380
<v Calvin Hendryx-Parker>that, you are now in a GitHub powered wiki,

00:25:35.800 --> 00:25:37.040
<v Calvin Hendryx-Parker>which is pretty cool. They look good.

00:25:37.420 --> 00:25:38.380
<v Michael Kennedy>And I'm pretty

00:25:38.540 --> 00:25:41.140
<v Michael Kennedy>psyched to see that on a subdomain of python.org where it belongs.

00:25:41.460 --> 00:25:41.680
<v Calvin Hendryx-Parker>Yeah,

00:25:42.040 --> 00:25:42.779
<v Calvin Hendryx-Parker>yeah, for sure. I think

00:25:42.800 --> 00:25:47.660
<v Calvin Hendryx-Parker>you saw that the links they were to psf.github.io but then it looks like they've got a redirect in

00:25:47.700 --> 00:25:51.880
<v Michael Kennedy>place to get the nice canonical name yeah probably that was already on the just the GitHub pages and

00:25:51.940 --> 00:25:56.060
<v Michael Kennedy>they're like let's get our own domains or put out just not even get the domain just set up the dns

00:25:56.220 --> 00:26:01.020
<v Calvin Hendryx-Parker>for a subdomain yep so i'm glad they're taking care of things keeping the project running very

00:26:01.160 --> 00:26:06.380
<v Michael Kennedy>strong awesome awesome is that it yep that's it for me cool so i just want to i was going to just

00:26:06.540 --> 00:26:11.120
<v Michael Kennedy>talk about this php to shell thing one more time this could just be some schadenfreude like

00:26:11.140 --> 00:26:12.220
<v Michael Kennedy>not Python.

00:26:12.990 --> 00:26:13.560
<v Michael Kennedy>It could be,

00:26:13.950 --> 00:26:15.640
<v Michael Kennedy>actually, this could be a good reason

00:26:15.770 --> 00:26:17.940
<v Michael Kennedy>to help convince your boss or decision makers

00:26:18.120 --> 00:26:19.620
<v Michael Kennedy>that you should migrate from PHP to Python.

00:26:20.080 --> 00:26:20.420
<v Michael Kennedy>Also good.

00:26:20.710 --> 00:26:23.180
<v Michael Kennedy>But this is going to have some serious effects on all of us

00:26:23.490 --> 00:26:25.940
<v Michael Kennedy>because it's taking over so many systems

00:26:26.540 --> 00:26:27.720
<v Michael Kennedy>that have our personal data,

00:26:28.160 --> 00:26:28.960
<v Michael Kennedy>which is not ideal.

00:26:30.580 --> 00:26:31.460
<v Michael Kennedy>So OpenAI,

00:26:31.650 --> 00:26:32.180
<v Michael Kennedy>of all places,

00:26:32.380 --> 00:26:33.600
<v Michael Kennedy>actually released a checker

00:26:33.610 --> 00:26:36.540
<v Michael Kennedy>for people who happen to be in the PHP land

00:26:36.720 --> 00:26:37.780
<v Michael Kennedy>or maybe Python people,

00:26:37.980 --> 00:26:38.320
<v Michael Kennedy>but you're like,

00:26:38.320 --> 00:26:39.880
<v Michael Kennedy>oh yeah, we also maintain these PHP things.

00:26:40.040 --> 00:26:40.800
<v Michael Kennedy>You're self-hosting something.

00:26:40.860 --> 00:26:46.360
<v Michael Kennedy>you can run OpenAI's PHP2 shell dash checker and figure that out.

00:26:46.820 --> 00:26:46.920
<v Michael Kennedy>Okay,

00:26:47.240 --> 00:26:48.240
<v Michael Kennedy>enough of...

00:26:48.240 --> 00:26:50.700
<v Calvin Hendryx-Parker>It's a rough week for PHP folks.

00:26:51.680 --> 00:26:52.400
<v Calvin Hendryx-Parker>That one was brutal.

00:26:52.720 --> 00:26:53.000
<v Michael Kennedy>Yes.

00:26:53.420 --> 00:26:56.100
<v Michael Kennedy>So the next thing is I want to talk about Talk Python membership.

00:26:56.560 --> 00:26:57.400
<v Michael Kennedy>A bunch of people signed up.

00:26:57.580 --> 00:26:58.020
<v Michael Kennedy>Thank you so much.

00:26:58.260 --> 00:26:59.480
<v Michael Kennedy>Please consider signing up.

00:26:59.540 --> 00:27:02.220
<v Michael Kennedy>You can do so for as little as five bucks a month.

00:27:02.560 --> 00:27:04.000
<v Michael Kennedy>And it's not just free ad-free stuff.

00:27:04.460 --> 00:27:05.820
<v Michael Kennedy>The next meetup,

00:27:06.220 --> 00:27:08.780
<v Michael Kennedy>the Talk Python tech talk coming up,

00:27:09.060 --> 00:27:10.720
<v Michael Kennedy>is going to be by me, Talk Python in production.

00:27:10.820 --> 00:27:13.440
<v Michael Kennedy>building your own Python infrastructure and running it.

00:27:13.770 --> 00:27:13.860
<v Michael Kennedy>This,

00:27:14.330 --> 00:27:15.480
<v Michael Kennedy>if you've heard me talk about this before,

00:27:15.700 --> 00:27:17.060
<v Michael Kennedy>this is not going to be the same thing.

00:27:17.320 --> 00:27:20.120
<v Michael Kennedy>I have some crazy new things like Chameleon RS,

00:27:20.420 --> 00:27:23.420
<v Michael Kennedy>but some other stuff as well that will surprise people.

00:27:23.840 --> 00:27:24.860
<v Michael Kennedy>So I'm just going to leave it there.

00:27:25.480 --> 00:27:26.120
<v Michael Kennedy>Come check it out.

00:27:26.330 --> 00:27:29.340
<v Michael Kennedy>And I also want to announce that it was going to be this Wednesday,

00:27:29.390 --> 00:27:31.120
<v Michael Kennedy>but it's going to be a week later.

00:27:31.230 --> 00:27:33.320
<v Michael Kennedy>I reschedule it because I want to coordinate a few more things

00:27:33.410 --> 00:27:34.480
<v Michael Kennedy>and get some of these ideas,

00:27:34.880 --> 00:27:35.360
<v Michael Kennedy>these new ideas,

00:27:35.520 --> 00:27:37.020
<v Michael Kennedy>and you're making it a little more useful for people.

00:27:37.500 --> 00:27:38.620
<v Michael Kennedy>So talk with a membership,

00:27:39.020 --> 00:27:39.480
<v Michael Kennedy>be part of it.

00:27:39.700 --> 00:27:39.940
<v Michael Kennedy>See you there.

00:27:40.200 --> 00:27:40.480
<v Calvin Hendryx-Parker>Very cool.

00:27:40.700 --> 00:27:41.420
<v Calvin Hendryx-Parker>I've seen all the people joining.

00:27:41.820 --> 00:27:41.920
<v Michael Kennedy>Yeah,

00:27:42.220 --> 00:27:42.360
<v Michael Kennedy>thanks.

00:27:42.460 --> 00:27:42.720
<v Michael Kennedy>They are.

00:27:43.340 --> 00:27:43.540
<v Michael Kennedy>Now,

00:27:43.760 --> 00:27:48.920
<v Michael Kennedy>I also want to give a quick shout out to who sent this in.

00:27:49.440 --> 00:27:52.680
<v Michael Kennedy>This comes to us from Vincent Paolo.

00:27:53.780 --> 00:28:01.360
<v Michael Kennedy>And we talked about ZeroVerb projects before on the show at the numeralzerover.org.

00:28:01.620 --> 00:28:02.440
<v Michael Kennedy>Are you familiar with this, Calvin?

00:28:02.740 --> 00:28:03.300
<v Calvin Hendryx-Parker>No, I'm not,

00:28:03.660 --> 00:28:03.740
<v Calvin Hendryx-Parker>actually.

00:28:03.920 --> 00:28:04.300
<v Michael Kennedy>Oh, my gosh.

00:28:04.380 --> 00:28:05.720
<v Michael Kennedy>Let's go to the top real quick.

00:28:06.380 --> 00:28:07.660
<v Michael Kennedy>So this is like,

00:28:07.880 --> 00:28:10.000
<v Michael Kennedy>it's just sort of calls out

00:28:10.120 --> 00:28:11.340
<v Michael Kennedy>this open source trend.

00:28:12.539 --> 00:28:15.160
<v Calvin Hendryx-Parker>It's a board that outs people with zero version.

00:28:15.600 --> 00:28:16.000
<v Michael Kennedy>Yes,

00:28:16.160 --> 00:28:16.380
<v Michael Kennedy>yes.

00:28:16.760 --> 00:28:17.700
<v Michael Kennedy>Okay, so we talked about it before,

00:28:17.920 --> 00:28:19.460
<v Michael Kennedy>but probably a lot of people aren't familiar with it.

00:28:20.559 --> 00:28:22.420
<v Michael Kennedy>So the idea is like...

00:28:22.440 --> 00:28:23.200
<v Calvin Hendryx-Parker>Oh my goodness.

00:28:23.760 --> 00:28:25.340
<v Calvin Hendryx-Parker>Like some of the ones that are listed here,

00:28:25.460 --> 00:28:27.100
<v Calvin Hendryx-Parker>you're like, wait a minute, these should be released.

00:28:27.740 --> 00:28:27.940
<v Michael Kennedy>Exactly.

00:28:28.560 --> 00:28:30.120
<v Michael Kennedy>And the reason I think people really started

00:28:31.180 --> 00:28:32.880
<v Michael Kennedy>going off on this, I think Mahmoud Hashemi

00:28:32.960 --> 00:28:33.940
<v Michael Kennedy>went off on it for a while,

00:28:34.000 --> 00:28:35.660
<v Michael Kennedy>is for people in open source,

00:28:35.860 --> 00:28:42.820
<v Michael Kennedy>like yeah whatever okay it's 0.2 that's pretty you know it must be be good for a while but as a i just

00:28:42.880 --> 00:28:47.360
<v Michael Kennedy>told people like hey you get move off of php to python if you can that would be nice well maybe

00:28:47.680 --> 00:28:52.200
<v Michael Kennedy>a tech lead who is like more from i don't know the microsoft space or something where where

00:28:52.500 --> 00:28:56.340
<v Michael Kennedy>everything you know like you don't use a microsoft product until it's version 3.0 or later because

00:28:56.420 --> 00:29:01.100
<v Michael Kennedy>it's not tested yet you know what i mean you're like it's 0.2 kill it with fire get it away from

00:29:01.140 --> 00:29:08.120
<v Michael Kennedy>you know and so there may be some actual friction to adoption of these projects because they are zero

00:29:08.220 --> 00:29:13.780
<v Calvin Hendryx-Parker>over okay that's not in every case because i just i just sorted the table by first released

00:29:14.000 --> 00:29:20.120
<v Calvin Hendryx-Parker>something released in 1987 that everyone uses get text is still a zero over project unreal

00:29:20.680 --> 00:29:28.780
<v Calvin Hendryx-Parker>so i think the thing that um 39.8 years zero the thing that vincent pointed out to me is like

00:29:28.840 --> 00:29:30.780
<v Michael Kennedy>There's a notable zero for projects.

00:29:31.020 --> 00:29:31.660
<v Michael Kennedy>Like, you know what?

00:29:32.050 --> 00:29:33.220
<v Michael Kennedy>These are the ones that are really well known.

00:29:33.270 --> 00:29:34.720
<v Michael Kennedy>Like, I love Excalibur.

00:29:35.120 --> 00:29:35.880
<v Michael Kennedy>It's five years old.

00:29:36.000 --> 00:29:37.340
<v Michael Kennedy>It's 0.18.

00:29:38.160 --> 00:29:39.040
<v Michael Kennedy>Stuff you may have heard of.

00:29:39.340 --> 00:29:39.860
<v Michael Kennedy>FastAPI,

00:29:40.160 --> 00:29:40.700
<v Michael Kennedy>brand new.

00:29:41.820 --> 00:29:42.540
<v Michael Kennedy>0.162.

00:29:43.200 --> 00:29:43.800
<v Michael Kennedy>Eight years old.

00:29:44.480 --> 00:29:46.760
<v Michael Kennedy>NeoVim, that old thing's only 11 years old.

00:29:46.860 --> 00:29:47.800
<v Michael Kennedy>It's only 0.12.

00:29:48.100 --> 00:29:48.340
<v Michael Kennedy>Hugo,

00:29:50.260 --> 00:29:50.480
<v Michael Kennedy>Ruff,

00:29:50.740 --> 00:29:51.060
<v Michael Kennedy>for example.

00:29:51.210 --> 00:29:53.020
<v Michael Kennedy>Is Ruff only 0.17?

00:29:53.300 --> 00:29:53.560
<v Michael Kennedy>Come on,

00:29:53.880 --> 00:29:54.140
<v Michael Kennedy>you know?

00:29:54.660 --> 00:29:54.940
<v Michael Kennedy>Zig,

00:29:55.100 --> 00:29:56.100
<v Michael Kennedy>I mean, okay, Zig's kind of new.

00:29:56.360 --> 00:29:57.520
<v Michael Kennedy>But there are a lot of projects.

00:29:57.980 --> 00:29:59.480
<v Calvin Hendryx-Parker>One on the list from 1978.

00:30:01.000 --> 00:30:01.240
<v Michael Kennedy>You know what?

00:30:01.340 --> 00:30:02.880
<v Michael Kennedy>It's okay to just go 1-0 at some point.

00:30:02.880 --> 00:30:03.640
<v Calvin Hendryx-Parker>You should just 1-0.

00:30:04.140 --> 00:30:06.040
<v Calvin Hendryx-Parker>And it's 0.9.8.

00:30:06.440 --> 00:30:07.200
<v Michael Kennedy>It's so close.

00:30:07.360 --> 00:30:08.280
<v Calvin Hendryx-Parker>It's so close to 1.

00:30:09.120 --> 00:30:09.400
<v Michael Kennedy>Anyway,

00:30:09.580 --> 00:30:12.200
<v Michael Kennedy>I just thought it was the notable ones.

00:30:12.260 --> 00:30:14.180
<v Michael Kennedy>I thought, okay, it's time to revisit the notable.

00:30:14.580 --> 00:30:16.560
<v Michael Kennedy>And if you have a project that's been out there for a few,

00:30:17.020 --> 00:30:18.680
<v Michael Kennedy>look, if your project has been out for 11 years,

00:30:18.980 --> 00:30:22.000
<v Michael Kennedy>I don't care if it's 0.8 or it's 1.0.

00:30:22.240 --> 00:30:25.560
<v Michael Kennedy>You have a commitment to a stable API,

00:30:25.880 --> 00:30:26.760
<v Michael Kennedy>whether you like it or not.

00:30:26.780 --> 00:30:27.260
<v Michael Kennedy>You know what I mean?

00:30:27.520 --> 00:30:28.180
<v Calvin Hendryx-Parker>Come on, NeoVim.

00:30:28.480 --> 00:30:29.140
<v Calvin Hendryx-Parker>Come on, NeoVim.

00:30:29.520 --> 00:30:30.580
<v Michael Kennedy>Just do it.

00:30:30.880 --> 00:30:31.380
<v Michael Kennedy>Get off the list.

00:30:31.410 --> 00:30:31.580
<v Calvin Hendryx-Parker>It's been 11 years.

00:30:31.840 --> 00:30:32.300
<v Calvin Hendryx-Parker>It's been 11 years.

00:30:32.500 --> 00:30:33.060
<v Calvin Hendryx-Parker>We can do this.

00:30:33.240 --> 00:30:33.900
<v Michael Kennedy>The list of shame.

00:30:34.060 --> 00:30:34.280
<v Michael Kennedy>All right.

00:30:34.940 --> 00:30:35.220
<v Michael Kennedy>Also,

00:30:35.770 --> 00:30:39.680
<v Michael Kennedy>I want to give a quick shout out to Python 3.15.2.

00:30:39.920 --> 00:30:43.700
<v Michael Kennedy>You called it out for security, but I'm just going to do a quick scroll and point out two

00:30:43.920 --> 00:30:44.040
<v Michael Kennedy>things.

00:30:44.580 --> 00:30:46.520
<v Michael Kennedy>Just watch how long the scroll bar goes here, Calvin.

00:30:46.900 --> 00:30:47.380
<v Calvin Hendryx-Parker>God, goodness.

00:30:47.920 --> 00:30:48.220
<v Calvin Hendryx-Parker>They're busy.

00:30:48.330 --> 00:30:51.700
<v Michael Kennedy>These are pages and pages and pages of fixes.

00:30:52.220 --> 00:30:53.360
<v Michael Kennedy>And then we get to 3.15.1,

00:30:53.510 --> 00:30:55.140
<v Michael Kennedy>which I don't think anyone talked about.

00:30:55.280 --> 00:30:56.080
<v Michael Kennedy>This was six days ago.

00:30:56.480 --> 00:30:59.760
<v Michael Kennedy>and you scroll and it's pages and pages and pages and pages.

00:31:00.330 --> 00:31:01.160
<v Michael Kennedy>I don't know, 20,

00:31:01.380 --> 00:31:04.120
<v Michael Kennedy>30 pages of one sentence fixes,

00:31:04.280 --> 00:31:04.920
<v Michael Kennedy>one sentence fixes.

00:31:05.350 --> 00:31:06.560
<v Michael Kennedy>Like insane amount of it.

00:31:06.590 --> 00:31:10.000
<v Michael Kennedy>So if you're using 315 and you've been waiting for some stuff to get polished,

00:31:10.180 --> 00:31:11.100
<v Michael Kennedy>well, it's pretty polished.

00:31:11.300 --> 00:31:14.100
<v Michael Kennedy>And also if you're not on.2,

00:31:14.630 --> 00:31:16.460
<v Michael Kennedy>you want to update not just because of the security stuff,

00:31:16.510 --> 00:31:18.020
<v Michael Kennedy>but because of all these other changes as well.

00:31:18.020 --> 00:31:18.480
<v Calvin Hendryx-Parker>I'll go out on a limb.

00:31:18.700 --> 00:31:19.080
<v Calvin Hendryx-Parker>It's safe.

00:31:19.370 --> 00:31:20.320
<v Calvin Hendryx-Parker>I think you're good to go there.

00:31:20.780 --> 00:31:20.980
<v Michael Kennedy>Yes,

00:31:21.170 --> 00:31:22.000
<v Michael Kennedy>I think you're probably good to go.

00:31:22.000 --> 00:31:22.360
<v Michael Kennedy>It's good stuff.

00:31:22.360 --> 00:31:25.800
<v Michael Kennedy>Unless you have some very rare wheels are not ready or something, but generally safe.

00:31:26.200 --> 00:31:26.420
<v Michael Kennedy>All right,

00:31:27.040 --> 00:31:27.740
<v Michael Kennedy>it's time for a joke.

00:31:28.230 --> 00:31:29.100
<v Michael Kennedy>How do you feel about captchas?

00:31:30.460 --> 00:31:31.320
<v Calvin Hendryx-Parker>No, don't like them.

00:31:31.900 --> 00:31:33.080
<v Michael Kennedy>I hate captchas so much.

00:31:33.420 --> 00:31:36.080
<v Michael Kennedy>I got banned from discord.

00:31:36.540 --> 00:31:37.780
<v Michael Kennedy>I tried to create a second account.

00:31:38.050 --> 00:31:39.340
<v Michael Kennedy>I didn't get my regular account banned.

00:31:39.340 --> 00:31:42.820
<v Michael Kennedy>I got my second account banned because what I wanted to do is as part of the

00:31:42.920 --> 00:31:43.500
<v Michael Kennedy>talk Python membership,

00:31:43.730 --> 00:31:45.760
<v Michael Kennedy>I wanted to on another computer,

00:31:46.380 --> 00:31:47.840
<v Michael Kennedy>log in and watch the

00:31:48.290 --> 00:31:52.260
<v Michael Kennedy>video channel so I could screen record it and then make it available as a recording.

00:31:52.480 --> 00:31:54.100
<v Michael Kennedy>And discord doesn't do that on its own.

00:31:54.400 --> 00:31:54.460
<v Michael Kennedy>Right?

00:31:54.800 --> 00:31:54.920
<v Michael Kennedy>Well,

00:31:55.460 --> 00:31:56.160
<v Michael Kennedy>I tried to do that.

00:31:56.260 --> 00:31:57.380
<v Michael Kennedy>Just log in and twice in my account.

00:31:57.480 --> 00:32:00.220
<v Michael Kennedy>So I went to one that would pull me out of the other videos.

00:32:00.310 --> 00:32:01.620
<v Michael Kennedy>Like, oh, you're going to be in two places at once.

00:32:01.760 --> 00:32:02.220
<v Michael Kennedy>That's not going to work.

00:32:02.320 --> 00:32:02.880
<v Michael Kennedy>We're going to take you out.

00:32:03.020 --> 00:32:04.020
<v Michael Kennedy>Like, no, like this is exact.

00:32:04.440 --> 00:32:05.480
<v Michael Kennedy>So I tried to make a new account.

00:32:05.820 --> 00:32:08.540
<v Michael Kennedy>It made me do the capture 17 times.

00:32:09.040 --> 00:32:09.960
<v Michael Kennedy>I'm pretty sure I got it right.

00:32:10.140 --> 00:32:10.780
<v Michael Kennedy>At least 16,

00:32:11.060 --> 00:32:13.940
<v Michael Kennedy>not just once, you know, you go through three stages of show,

00:32:14.180 --> 00:32:14.580
<v Michael Kennedy>find the bridges,

00:32:15.080 --> 00:32:15.900
<v Michael Kennedy>find the,

00:32:16.330 --> 00:32:16.400
<v Michael Kennedy>um,

00:32:16.880 --> 00:32:19.180
<v Michael Kennedy>find all the things that can walk on four legs or

00:32:19.270 --> 00:32:19.340
<v Michael Kennedy>whatever,

00:32:19.560 --> 00:32:21.420
<v Michael Kennedy>and I went through all of them over and over and over.

00:32:21.820 --> 00:32:22.980
<v Michael Kennedy>And then I got it.

00:32:23.060 --> 00:32:25.720
<v Michael Kennedy>I finally got logged in and I tried to join the room.

00:32:25.840 --> 00:32:27.800
<v Michael Kennedy>And the next thing I got is an email from Discord saying,

00:32:28.220 --> 00:32:29.780
<v Michael Kennedy>you're banned for suspicious behavior,

00:32:30.060 --> 00:32:31.600
<v Michael Kennedy>probably for trying to hack the captcha.

00:32:31.600 --> 00:32:32.960
<v Michael Kennedy>But it just kept coming up and up.

00:32:33.100 --> 00:32:35.160
<v Michael Kennedy>I'm like, I'm just please let me by.

00:32:35.160 --> 00:32:35.860
<v Michael Kennedy>I don't understand.

00:32:36.160 --> 00:32:38.240
<v Michael Kennedy>It's like 10 minutes of captcha loops.

00:32:38.500 --> 00:32:39.700
<v Calvin Hendryx-Parker>Anyway, at that point, they should be paying you.

00:32:39.980 --> 00:32:40.400
<v Michael Kennedy>I know.

00:32:40.560 --> 00:32:40.900
<v Michael Kennedy>I know.

00:32:41.180 --> 00:32:43.020
<v Michael Kennedy>So the joke is captcha.

00:32:43.160 --> 00:32:43.600
<v Michael Kennedy>It's too real.

00:32:43.900 --> 00:32:45.620
<v Michael Kennedy>So this one is a slightly different captcha.

00:32:46.420 --> 00:32:51.720
<v Michael Kennedy>It's a captcha with a disassembled sort of really gnarly thing.

00:32:51.980 --> 00:32:56.300
<v Michael Kennedy>i don't even know what language this is but a bunch of code doing like some crazy stuff

00:32:56.720 --> 00:33:01.240
<v Michael Kennedy>and the captcha is select all the squares with bugs if there are none click skip

00:33:03.020 --> 00:33:10.440
<v Michael Kennedy>what do you think about this genius it's diabolical is what it is yeah just what does this print 27

00:33:10.860 --> 00:33:16.439
<v Michael Kennedy>three times okay you can you can access the website too real too real find all the bugs

00:33:17.320 --> 00:33:23.300
<v Michael Kennedy>well played well played well played well played recapture people well played well calvin well

00:33:23.520 --> 00:33:28.140
<v Michael Kennedy>played for been real fun episode yeah and yeah always good to be here with you thanks for

00:33:28.260 --> 00:33:31.000
<v Michael Kennedy>everything thank you everyone for listening and we'll talk to you next week bye