WEBVTT

00:00:00.020 --> 00:00:04.200
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly

00:00:04.760 --> 00:00:11.240
to your earbuds. This is episode 490, recorded July 28th. I'm Michael Kennedy.

00:00:11.700 --> 00:00:12.740
And I'm Calvin Hendryx-Parker.

00:00:13.020 --> 00:00:17.920
This episode is brought to you by XWeather. XWeather combines enterprise-grade weather

00:00:18.140 --> 00:00:23.860
intelligence with agent-ready APIs, natural language capabilities, and an MCP server so

00:00:23.940 --> 00:00:28.359
your agents can adapt workflows, automate responses, and make better decisions based

00:00:28.380 --> 00:00:29.300
on real-world conditions.

00:00:29.800 --> 00:00:31.400
I'll tell you more about them later in the show.

00:00:31.760 --> 00:00:34.980
Get started for free at pythonbytes.fm/xweather.

00:00:35.300 --> 00:00:38.820
If you want to follow us on social, then feel free to do so.

00:00:39.070 --> 00:00:39.920
We got a link.

00:00:40.240 --> 00:00:43.000
I have a little bit more to say about that at the end of the show.

00:00:44.480 --> 00:00:48.280
Got links in the show notes and sign up for the newsletter, all those things.

00:00:48.700 --> 00:00:56.100
Before we get into the first topic, Calvin, I'd like to just rep a little bit of the KTM.

00:00:56.860 --> 00:00:58.120
See, I got my KTM shirt on.

00:00:58.280 --> 00:00:58.900
Team Orange.

00:00:59.520 --> 00:00:59.920
Team Orange.

00:00:59.940 --> 00:01:01.420
And I know you're a fan of motorcycles as well.

00:01:01.840 --> 00:01:02.060
I am.

00:01:02.220 --> 00:01:06.900
This week, this weekend, we had Pro AMA Motocross at Washougal.

00:01:07.320 --> 00:01:07.760
Oh, fun.

00:01:07.860 --> 00:01:12.520
And I was there all day with some of my friends, and it was quite the epic event.

00:01:12.760 --> 00:01:15.320
So if you're around, they travel all over the US.

00:01:15.900 --> 00:01:17.660
If you're around one of them, go to them.

00:01:17.740 --> 00:01:19.360
They're really an interesting experience.

00:01:19.840 --> 00:01:23.340
Even if you're not super into motorcycles, just being in that atmosphere is really wild.

00:01:23.640 --> 00:01:25.000
So it's cool.

00:01:25.240 --> 00:01:25.340
Yeah.

00:01:25.520 --> 00:01:27.900
I'm hoping they bring World Superbike someday back to Indianapolis.

00:01:28.420 --> 00:01:34.240
yes that would be awesome because i'm team ducati yeah well don't let uh daytona and their their

00:01:34.420 --> 00:01:39.320
bike week have all the fun you know yeah exactly exactly well you know what is fun i know it's fun

00:01:39.400 --> 00:01:45.400
jango's fun Django is a lot of fun yeah and in thinking about some of the core features of Django

00:01:46.020 --> 00:01:51.459
julia evans brings us great posts from last week about some of the things that she's been enjoying

00:01:51.460 --> 00:01:58.480
about Django, but from a 2010 style website perspective. I thought this was a great post

00:01:58.780 --> 00:02:04.900
because it reinforces some of the joy of Django and some of the cool bits and pieces that maybe

00:02:05.140 --> 00:02:10.679
people have not forgotten about or just aren't using or haven't chosen Django because they

00:02:10.740 --> 00:02:15.979
thought maybe it was just too complicated or too big for their project and they went Flask or Fast

00:02:16.000 --> 00:02:22.000
API instead. But this is a good one that kind of goes over what it's like, you know, again,

00:02:22.310 --> 00:02:30.420
the retro feel or nostalgia for a 2010 website was very backend. And with server side rendered pages,

00:02:31.080 --> 00:02:35.640
this is kind of giving you that feel for that. But then it gets into things like query builders,

00:02:36.680 --> 00:02:42.300
defining custom query sets, making them chainable, which if you take a look, this is very readable.

00:02:42.700 --> 00:02:50.560
Like if you were to read this code as English, you read like, you know, events for tab with festivals is free and is outdoors.

00:02:51.210 --> 00:02:54.040
That just almost makes sense to the human brain.

00:02:54.190 --> 00:03:03.640
But then it translates into the Django ORM really, really cleanly because you can set up your own custom query sets and have their own custom methods on it.

00:03:03.990 --> 00:03:09.520
So you can build a site that's a joy to maintain and to query behind the scenes.

00:03:09.980 --> 00:03:14.700
Another thing that she highlights in the post is actually template filters and template filters are awesome.

00:03:14.950 --> 00:03:24.720
I think a lot of people will neglect to take this into account when they are building web pages is if you can use these quick little filters that you can apply inside your template.

00:03:25.150 --> 00:03:30.400
And it gives you a ton of like the batteries included experience that you've come to love about Python.

00:03:30.920 --> 00:03:32.000
You get that in Django.

00:03:32.340 --> 00:03:39.100
And I think if you go and look at the reference for the template filters, you'll see there's just tons of cool little things that save you a ton of time.

00:03:39.180 --> 00:03:40.740
And you don't have to reinvent these wheels.

00:03:41.200 --> 00:03:42.380
They're all ready for you to go.

00:03:42.820 --> 00:03:50.600
And then there's also, for example, the JSON script, which takes a Python dictionary and automatically converts it to JSON and inserts into the HTML script tag in a safe way.

00:03:50.940 --> 00:04:05.780
So it also helps you with things like cross-site scripting and template injection and all those kind of security problems that normally you'd have to consider can go mostly to the wayside because Django just takes care of it for you when you use some of those built-ins.

00:04:06.560 --> 00:04:10.480
Other kind of things that we mentioned here, I believe, is like migrations.

00:04:11.530 --> 00:04:16.140
So if you are building websites, don't forget, if you change your database, you've got to migrate the code.

00:04:16.579 --> 00:04:20.940
And if you change the code, you got to migrate your database to match for those various models.

00:04:21.480 --> 00:04:25.240
Again, something that a lot of Django nuts don't think too much about because it just happens out

00:04:25.260 --> 00:04:32.620
of the box. But this is a good one that just kind of reinforces that. Another nicety that some folks

00:04:32.760 --> 00:04:38.280
like is skipping inheritance for class-based views. You can prefer function-based views for sharing

00:04:38.500 --> 00:04:44.399
code and then using Django's own mixins and interfaces to simplify that building of static

00:04:44.420 --> 00:04:49.380
sites. What's also nice, if you basically combine this with something like HTMX, you now get a

00:04:49.600 --> 00:04:52.700
superpower, which is you don't have to build your site twice. I think I mentioned this last week

00:04:53.000 --> 00:04:58.580
on the show, is that you build once and you've got a beautiful feel of a single page web app

00:04:58.920 --> 00:05:04.860
or a reactive style design, but without having to build your models twice. There's also some

00:05:05.540 --> 00:05:09.659
performance surprises. I think if you check out the latest version of Django, you'll notice that

00:05:09.680 --> 00:05:11.980
there's been some considerable performance improvements.

00:05:12.680 --> 00:05:16.360
If you're considering, say, FastAPI over Django with Ninja,

00:05:16.910 --> 00:05:18.680
you should, and that's not mentioned in this article necessarily,

00:05:18.890 --> 00:05:20.740
but I would mention that you could check that out

00:05:20.860 --> 00:05:23.980
and get fairly similar performance in certain use cases

00:05:24.550 --> 00:05:26.000
without having to go the FastAPI route

00:05:26.000 --> 00:05:29.000
and still getting all the batteries included of Django itself.

00:05:29.460 --> 00:05:31.720
So that was the kind of wrap up of the post.

00:05:32.060 --> 00:05:34.360
I'm going to mention it because I think sometimes people just need to be,

00:05:34.630 --> 00:05:38.119
have their memory jogged for some of the nice bits

00:05:38.140 --> 00:05:41.280
that are still baked into the default experience of Django.

00:05:41.660 --> 00:05:42.380
Yeah, that's super cool.

00:05:42.560 --> 00:05:44.120
You think admin backend.

00:05:44.360 --> 00:05:44.880
Oh, yeah.

00:05:45.240 --> 00:05:45.800
You know.

00:05:46.260 --> 00:05:47.100
But it's way more.

00:05:47.380 --> 00:05:48.000
It's so much more.

00:05:48.000 --> 00:05:48.260
Yeah, exactly.

00:05:48.420 --> 00:05:48.800
That's my point.

00:05:48.920 --> 00:05:51.300
There's a lot of these sort of like one bit lower,

00:05:51.860 --> 00:05:53.040
but still really helpful things.

00:05:53.500 --> 00:05:56.160
I feel like Julia needs to put a blog roll on this.

00:05:56.360 --> 00:05:56.820
I mean, come on.

00:05:56.920 --> 00:05:59.280
It's got no credibility with me until there's a blog roll.

00:06:01.260 --> 00:06:02.700
And if you don't know what a blog roll is,

00:06:03.080 --> 00:06:05.560
probably good, but it's certainly in the vibe.

00:06:05.560 --> 00:06:06.280
For going old school.

00:06:06.520 --> 00:06:09.500
It's just funny that word nostalgia for 2010s.

00:06:10.900 --> 00:06:11.200
Exactly.

00:06:11.500 --> 00:06:14.040
Can you believe how it was back then?

00:06:14.110 --> 00:06:16.480
That doesn't sound old to me, unfortunately.

00:06:16.980 --> 00:06:17.480
I know.

00:06:17.880 --> 00:06:19.300
So, yeah, yeah.

00:06:19.360 --> 00:06:20.940
I got a little bit of real-time follow-up.

00:06:20.990 --> 00:06:24.160
I just, the latest Talk Python episode that just came out yesterday.

00:06:24.160 --> 00:06:24.400
Oh, yeah.

00:06:24.720 --> 00:06:24.820
Yes?

00:06:25.040 --> 00:06:25.260
Yeah, yeah.

00:06:25.560 --> 00:06:26.660
Was with Carlton Gibson.

00:06:27.340 --> 00:06:32.499
And it's a really fun episode about updates on Django's async story

00:06:32.520 --> 00:06:37.480
and rewriting all the documentation and positioning of async for Django,

00:06:37.760 --> 00:06:40.220
plus talking some Django 6, 6.1 things.

00:06:40.440 --> 00:06:43.460
So if you liked Calvin's bit, there's a whole hour of it right there.

00:06:43.860 --> 00:06:44.600
That was really fun.

00:06:44.740 --> 00:06:46.460
I have a little more on Django in the extras too.

00:06:46.720 --> 00:06:47.420
Awesome. Awesome.

00:06:47.680 --> 00:06:48.120
Well, okay.

00:06:48.500 --> 00:06:52.220
Well, you know, it's all fun when there's a vibe coding party

00:06:52.840 --> 00:06:54.140
until you got to clean up the mess.

00:06:54.490 --> 00:06:55.760
So this got sent in.

00:06:57.100 --> 00:07:00.240
It got sent in to us by Sam Lerner saying,

00:07:00.840 --> 00:07:04.620
hey, there's this really interesting article on the Financial Times.

00:07:04.880 --> 00:07:06.580
So thank you, Sam, for sending that in.

00:07:07.000 --> 00:07:08.320
And it's paywalled.

00:07:08.700 --> 00:07:10.380
So I'm going to give you the rundown.

00:07:10.610 --> 00:07:13.920
But it's not so much that you need to read it, which is what's interesting.

00:07:14.280 --> 00:07:15.920
It's that it is here at all.

00:07:16.400 --> 00:07:19.300
So Financial Times is for business people.

00:07:19.680 --> 00:07:21.740
Yeah, I was curious where this was going, Michael.

00:07:22.100 --> 00:07:22.480
Exactly.

00:07:22.620 --> 00:07:23.400
Why is this here?

00:07:23.610 --> 00:07:26.220
So what is this story about?

00:07:26.360 --> 00:07:30.120
Who cleans up after the Vibe Coding Party is the title of the article.

00:07:30.580 --> 00:07:34.160
And the byline is hidden behind a paywall even, which is interesting.

00:07:34.560 --> 00:07:35.440
I was writing this article.

00:07:35.640 --> 00:07:37.540
I'd be like, could you just put my byline under it?

00:07:37.800 --> 00:07:38.020
Anyway.

00:07:38.420 --> 00:07:39.160
So it goes through.

00:07:39.160 --> 00:07:40.840
I'm not speaking to journalists in these days anyway.

00:07:41.440 --> 00:07:41.940
I know.

00:07:41.940 --> 00:07:44.160
You're like, I've already got it hard enough.

00:07:44.180 --> 00:07:44.700
Are you serious?

00:07:46.160 --> 00:07:49.100
So let me give you a little bit of the rundown for this one.

00:07:50.060 --> 00:07:51.980
Because there's one, because you don't have access to it.

00:07:51.980 --> 00:07:56.860
But I think the reason Sam sent this in and the reason I think it's interesting as well

00:07:57.240 --> 00:07:58.780
is actually, no, sorry.

00:07:58.920 --> 00:08:02.380
The piece is by Sam Lerner and Dylan McConnell sent it in.

00:08:02.680 --> 00:08:05.280
I wrote those down, but I had crisscrossed them in my mind.

00:08:05.450 --> 00:08:06.420
So thanks for sending that in, Dylan.

00:08:06.800 --> 00:08:10.780
So the reason I think this is interesting is it tells the story,

00:08:11.300 --> 00:08:17.000
but to a much broader audience who is not able to discern the details that I'm about to give you.

00:08:17.110 --> 00:08:17.220
Okay.

00:08:17.860 --> 00:08:22.200
So it starts out by going through this, the experience that Daniel Stenberg,

00:08:22.330 --> 00:08:27.740
the creator, maintainer of Curl went through as the primary positioning of this article.

00:08:27.980 --> 00:08:32.440
says, hey, look, Daniel, it talks about, oh my God, there's such an interesting term.

00:08:33.360 --> 00:08:38.560
The invisible load, the load bearing people of the internet is what it's referred to all

00:08:38.680 --> 00:08:38.840
the time.

00:08:38.880 --> 00:08:39.659
Are you familiar with this term?

00:08:40.240 --> 00:08:40.320
Yeah.

00:08:40.640 --> 00:08:40.740
Yeah.

00:08:40.800 --> 00:08:44.900
So the load bearing people of the internet are the folks like who are not Daniel, but

00:08:45.140 --> 00:08:49.300
the anonymous folks who even just might do a PR and like, nobody knows who they are, but

00:08:49.360 --> 00:08:50.900
they are like keeping open source.

00:08:51.040 --> 00:08:53.060
And by way of that, like a lot of these companies run it.

00:08:54.200 --> 00:08:59.520
So Daniel has been famous, notable, I guess, for mentioning a couple of things about Curl, right?

00:08:59.570 --> 00:09:01.300
So Curl's, I guess, popular.

00:09:01.840 --> 00:09:03.920
It's been installed about 20 billion times.

00:09:04.900 --> 00:09:10.280
Yeah, it's been installed by 20 billion times and it has 33,000 plus contributors.

00:09:10.630 --> 00:09:17.140
So notable because they killed the bug bounty program for Curl because there was an explosion of AI slop, right?

00:09:17.340 --> 00:09:31.920
So it's like step one of this article is like, look, this really important thing that is the load-bearing piece of the internet, supported by the load-bearing people of the internet, had to actually shut down their security story because of AI slop.

00:09:32.840 --> 00:09:42.040
Then Guido was also making an appearance, talking about Python, and said a lot of projects are holding emergency meetings over AI contributions.

00:09:42.560 --> 00:09:46.640
Should we accept LLM patches or should we not?

00:09:46.780 --> 00:09:47.440
And I think that's fair.

00:09:48.520 --> 00:09:50.700
There's Vibe Coding Kills Open Source,

00:09:50.790 --> 00:09:52.840
which is a paper from Miklos Korn

00:09:53.230 --> 00:09:56.940
about how packages frequently recommended by coding

00:09:56.990 --> 00:09:58.080
saw a huge jump,

00:09:58.520 --> 00:10:02.520
but it actually breaks some of the supporting pieces.

00:10:02.800 --> 00:10:05.880
I think Tailscale is probably the biggest one here.

00:10:06.300 --> 00:10:09.880
Tailscale saw a 6x jump in actual usage.

00:10:10.340 --> 00:10:13.680
At the same time, it saw a 60% drop in its traffic

00:10:13.940 --> 00:10:15.040
to its site,

00:10:15.220 --> 00:10:17.040
and thus it's paid offerings and so on.

00:10:17.440 --> 00:10:18.040
Stack Overflow.

00:10:18.500 --> 00:10:22.500
I think Stack Overflow is actually the most extreme example

00:10:22.880 --> 00:10:24.760
of stuff getting kind of wrecked.

00:10:24.880 --> 00:10:26.140
Like, are you familiar with the numbers?

00:10:26.360 --> 00:10:29.820
So the peak Stack Overflow is getting 1,000 questions a month.

00:10:30.120 --> 00:10:32.080
On the month that Stack Overflow opened,

00:10:32.080 --> 00:10:33.700
it got 1,500 questions,

00:10:34.120 --> 00:10:37.780
and it got 1,500 the month that this article was written as well,

00:10:37.840 --> 00:10:38.420
which is insane.

00:10:39.060 --> 00:10:40.740
And it's a super, super hard arc there.

00:10:40.960 --> 00:10:43.100
But, you know, Stack Overflow was kind of a main place,

00:10:43.400 --> 00:10:43.980
and I don't know.

00:10:44.000 --> 00:10:45.000
It was super valuable, though.

00:10:45.160 --> 00:10:47.180
I'm sort of a little bit sad about Stack Overflow.

00:10:47.220 --> 00:10:47.540
How about you?

00:10:47.900 --> 00:10:49.240
Maybe a victim of its own success.

00:10:50.020 --> 00:10:53.340
The fact that it attracted a lot of that negative energy.

00:10:54.480 --> 00:10:55.060
So I don't know.

00:10:55.440 --> 00:10:56.440
I don't know if it would have saved it,

00:10:56.500 --> 00:10:58.600
if it would have handled that moderation better or not.

00:10:58.800 --> 00:10:59.700
It's hard to say.

00:11:00.000 --> 00:11:00.100
Yeah.

00:11:00.280 --> 00:11:01.900
We can armchair quarterback that one all day long.

00:11:02.720 --> 00:11:03.260
Yeah, we can.

00:11:03.440 --> 00:11:05.900
It's like, it is a bit of a victim of its own success.

00:11:06.140 --> 00:11:06.320
Yeah.

00:11:06.560 --> 00:11:09.420
And then the thing that closed out with content creators,

00:11:09.680 --> 00:11:10.920
like, hey, that's gotten closer to home.

00:11:11.400 --> 00:11:24.040
Like Josh Kamau's new web dev course launched on Udemy of all places and got one third of the enrollment that it did previously, which that tracks.

00:11:24.310 --> 00:11:25.600
I think it's a pretty tough time.

00:11:26.040 --> 00:11:26.120
Yeah.

00:11:26.240 --> 00:11:35.820
You'd be selling deep, deep knowledge to people who just want a surface level knowledge, you know, and are in a hurry because the button you can press or just do it, Claude, is a thing you can say.

00:11:36.160 --> 00:11:36.260
Yep.

00:11:36.520 --> 00:11:37.680
We're seeing that in our community, too.

00:11:38.000 --> 00:11:42.820
I mean, the real Python folks and like the Matt Harrison's of the world, like you and you.

00:11:43.380 --> 00:11:43.600
Yeah.

00:11:43.920 --> 00:11:44.020
Yeah.

00:11:44.400 --> 00:11:45.100
It's true.

00:11:45.460 --> 00:11:45.720
It's true.

00:11:45.900 --> 00:11:49.320
I mean, courses are still selling, but they're not as gangbusters.

00:11:49.320 --> 00:11:50.660
I think there's a lot in that though.

00:11:50.700 --> 00:11:54.520
It used to be a lot easier to communicate directly with people and like all the social

00:11:54.620 --> 00:11:59.240
stuff is all scramble and there's just, there's a lot of factors in it, but AI is not a supporting

00:11:59.640 --> 00:12:00.280
factor, let's say.

00:12:00.820 --> 00:12:02.460
But the reason I brought this up.

00:12:02.520 --> 00:12:02.640
Okay.

00:12:02.880 --> 00:12:05.900
So that tells the story and then I'll close it out with this.

00:12:06.220 --> 00:12:10.320
What's really interesting about this is what was omitted from this.

00:12:10.840 --> 00:12:13.980
So the key, the cornerstone of this article is curl.

00:12:14.400 --> 00:12:17.900
They had to shut down their bug bounty because vibe coding is killing open source.

00:12:18.400 --> 00:12:18.520
Yeah.

00:12:19.000 --> 00:12:20.460
Well, that's true.

00:12:21.020 --> 00:12:23.140
There was this article that said the end of the curl bug bounty.

00:12:23.640 --> 00:12:27.240
But in April, Daniel also wrote high quality chaos.

00:12:27.720 --> 00:12:28.680
No more AI slop.

00:12:29.080 --> 00:12:29.580
What?

00:12:29.980 --> 00:12:30.300
Go on.

00:12:31.880 --> 00:12:32.980
Pray do tell, my friend.

00:12:33.680 --> 00:12:44.360
So they shut down the bug bounty program, and now they just accept unpaid security work, as a lot of projects do, right?

00:12:44.410 --> 00:12:48.760
Or they probably are on the receiving end, even if they don't want to accept it, but they get a bunch of it.

00:12:49.060 --> 00:12:55.660
And by shutting it down, they've removed an incentive to just generate junk and hope it gets accepted, right?

00:12:55.960 --> 00:13:00.060
Like there was a monetary value if your prior AI slot got accepted.

00:13:00.340 --> 00:13:01.980
Now it's just you have to do it because you care.

00:13:02.210 --> 00:13:02.740
Well, guess what?

00:13:02.860 --> 00:13:05.160
It says, I haven't read this article enough.

00:13:05.460 --> 00:13:06.880
I'll recently know exactly, but it says,

00:13:06.920 --> 00:13:10.140
I complained and complained about the high-frequency junk submissions

00:13:10.360 --> 00:13:13.060
to the Crow bug bounty program that grew really intense.

00:13:13.960 --> 00:13:17.620
And it said, look, somewhere in here, it says, basically, yeah, here,

00:13:18.020 --> 00:13:21.640
now the quality is higher, the rate of confirmed vulnerabilities is back,

00:13:21.700 --> 00:13:27.480
and even surpassing the number of CVEs and issues are surpassing pre-AI level.

00:13:27.860 --> 00:13:28.840
Confirmed, right?

00:13:29.240 --> 00:13:34.400
So that's really like the percentage of them, which are actual problems is higher than they

00:13:34.540 --> 00:13:34.900
used to be.

00:13:35.080 --> 00:13:36.900
So that's beyond human level.

00:13:37.000 --> 00:13:37.840
That's a good thing, right?

00:13:38.160 --> 00:13:44.540
So is he saying that the finding of security vulnerabilities, using AI as an augmented tool

00:13:44.600 --> 00:13:47.320
to detect where there's vulnerabilities is what he's talking about here?

00:13:47.600 --> 00:13:48.300
Yes, I believe so.

00:13:48.400 --> 00:13:48.540
Yeah.

00:13:48.840 --> 00:13:48.920
Yeah.

00:13:49.260 --> 00:13:50.740
And so that's still a problem.

00:13:50.820 --> 00:13:51.860
They're getting tons of them.

00:13:52.120 --> 00:13:57.099
But it's like, we kind of hinted at this last time, like the first time you run a linter

00:13:57.100 --> 00:13:59.280
on a program, you're like, what?

00:13:59.620 --> 00:14:00.660
There's a thousand errors?

00:14:00.820 --> 00:14:02.100
It's not even that big of a program.

00:14:03.020 --> 00:14:06.860
But it's not going to be, if you took out a hundred of them a week, there's not going

00:14:06.860 --> 00:14:10.520
to be a thousand the next week and the thousand, it's going to go down, right?

00:14:10.640 --> 00:14:13.260
There's only so many that could possibly be there, right?

00:14:13.540 --> 00:14:18.000
And so it is a rough time, but I think it's really, so that brings me back to the article.

00:14:18.140 --> 00:14:23.919
So I think it's just really interesting that they chose to tell the story of, look how bad

00:14:23.940 --> 00:14:30.080
this stuff is using curl as the cornerstone when two months after the original thing came out it's

00:14:30.080 --> 00:14:35.120
it actually no that's this is not even the problem that you think it is it's a it is a problem but

00:14:35.180 --> 00:14:39.820
not in the way that you think it is and this article was written in june or july the ai swap

00:14:39.830 --> 00:14:45.240
is gone articles from april it's like here's the story you wanted to tell without those pesky details

00:14:45.740 --> 00:14:50.100
of it's a different problem anyway i thought that was just a super interesting arc and you know

00:14:49.980 --> 00:14:51.140
Thank you, Dylan, for sending it in.

00:14:51.500 --> 00:14:52.060
And that's that.

00:14:52.200 --> 00:14:54.140
There always will be bugs in software,

00:14:54.360 --> 00:14:57.580
but we're going through probably a great time of discovery,

00:14:58.080 --> 00:15:01.540
finding bad bugs that have been present for sometimes decades.

00:15:02.200 --> 00:15:05.020
So everyone's going to win in the fact that we use these

00:15:05.080 --> 00:15:07.640
as augmented capabilities for developers to detect,

00:15:08.020 --> 00:15:10.620
sometimes very hard to detect bugs inside the code.

00:15:10.780 --> 00:15:14.000
I mean, that's how Fable broke out of the sandbox

00:15:14.120 --> 00:15:16.020
or Mythos broke out of the sandbox and attacked.

00:15:16.440 --> 00:15:19.760
Hugging Face was chaining multiple zero days that didn't exist.

00:15:19.840 --> 00:15:20.820
to make this all happen.

00:15:20.980 --> 00:15:21.620
Well, you know what?

00:15:21.900 --> 00:15:22.880
Those have been closed this week

00:15:23.200 --> 00:15:25.020
because they were deemed important enough.

00:15:25.480 --> 00:15:26.580
And now we all benefit from that.

00:15:27.020 --> 00:15:27.460
We do.

00:15:27.520 --> 00:15:30.560
I think it's just not black and white.

00:15:30.820 --> 00:15:32.800
You know, it's a weird time.

00:15:32.900 --> 00:15:33.080
Yeah.

00:15:33.340 --> 00:15:34.420
It's a weird time for sure.

00:15:36.240 --> 00:15:38.260
This episode is brought to you by Xweather.

00:15:38.680 --> 00:15:40.640
You're using agents that can write code,

00:15:41.060 --> 00:15:42.780
summarize documents, and automate workflows,

00:15:43.440 --> 00:15:44.520
but they're missing one thing,

00:15:44.920 --> 00:15:46.380
awareness of the world around them.

00:15:46.840 --> 00:15:49.160
That's where today's sponsor, Xweather, comes in.

00:15:49.660 --> 00:16:00.820
Xweather combines enterprise-grade weather intelligence with agent-ready APIs, natural language capabilities, and an MCP server built for tools like CLAUDE, Codex, Copilot, and modern IDEs.

00:16:01.320 --> 00:16:07.820
So your agents can adapt workflows, automate responses, and make better decisions based on real-world conditions.

00:16:08.500 --> 00:16:12.400
Backed by Vaisala, whose instruments fly on NASA missions to Mars,

00:16:12.900 --> 00:16:18.020
XWeather delivers trusted data and unique insights that go beyond conditions to actual impact,

00:16:18.420 --> 00:16:21.420
from real-time lightning strikes to road surface forecasts.

00:16:22.340 --> 00:16:27.240
Start with 15,000 free API calls each month and pay only for what you use as you grow.

00:16:27.720 --> 00:16:30.780
XWeather is your full weather stack for developers by developers.

00:16:31.360 --> 00:16:35.540
Start building for free today at pythonbytes.fm/xweather.

00:16:35.920 --> 00:16:38.780
The link is in your podcast player's show notes and on the episode page.

00:16:39.300 --> 00:16:41.700
Thanks so much to Xweather for supporting Python Bytes.

00:16:42.660 --> 00:16:48.900
Well, Michael, would you love to understand your use of agents and LLMs a little deeper?

00:16:49.160 --> 00:16:54.700
I will go as far as saying I have begun to understand it because of this.

00:16:55.800 --> 00:16:57.720
It is amazing to tell people about it.

00:16:58.160 --> 00:16:59.280
And it's thanks to you that I know about it.

00:16:59.290 --> 00:16:59.620
So go ahead.

00:16:59.740 --> 00:16:59.860
Yeah.

00:17:00.980 --> 00:17:04.160
This got mentioned to us last week in one of my meetings I was in.

00:17:04.230 --> 00:17:05.620
And I was like, that is really cool.

00:17:06.120 --> 00:17:14.459
So AgentsView is a Python app that can basically look through all your coding agent history and sessions across a couple different providers.

00:17:14.699 --> 00:17:19.120
So it works with OpenAI, Anthropic, and a couple others along the way.

00:17:19.540 --> 00:17:25.839
And give you, you can see here in the screenshot, a GitHub-like tracker of your activity.

00:17:26.520 --> 00:17:27.980
You can talk about top sessions.

00:17:29.280 --> 00:17:31.440
And this came up because we were talking about AI cost.

00:17:31.740 --> 00:17:40.940
And so if we're thinking about how much it costs to use the AI tooling right now, it's a lot of subscription based subsidization of these tools.

00:17:41.420 --> 00:17:49.620
But the time may come where you're paying per token and being able to visualize and analyze your usage may actually help you change your usage because you can't change what you don't measure.

00:17:50.100 --> 00:17:59.140
So once you start measuring things, you can actually make behavior changes to potentially actually make your AI workflow even more optimal.

00:17:59.400 --> 00:18:00.120
So it's kind of cool.

00:18:00.300 --> 00:18:03.300
It auto discovers those sessions on your session files on your machine.

00:18:04.100 --> 00:18:05.100
No configuration needed.

00:18:05.800 --> 00:18:08.100
Everything gets stored locally in a SQLite database.

00:18:08.380 --> 00:18:09.840
There's no cloud accounts.

00:18:10.260 --> 00:18:15.600
It does have an option to mirror into DuckDB or Postgres if you want to do more fancy things

00:18:15.820 --> 00:18:16.860
with your session data.

00:18:17.460 --> 00:18:23.360
It has this usage drop-in, which basically gets all the data, runs the reports, throws

00:18:23.410 --> 00:18:23.960
it up here.

00:18:24.300 --> 00:18:25.460
It works in a terminal as well.

00:18:25.580 --> 00:18:32.840
So this is just a web view of it, but you can actually see that, you know, actually here's a list of all the various coding agents that it's currently supporting.

00:18:33.060 --> 00:18:37.060
So if you're on AIDR or PI or you name it, there's a whole bunch in there.

00:18:37.360 --> 00:18:39.000
There's so many there that I literally.

00:18:39.640 --> 00:18:40.780
I'm like, what is this one?

00:18:41.220 --> 00:18:43.300
Yeah, there's some things I don't even know, which is kind of cool.

00:18:43.660 --> 00:18:46.120
But you can use, I used uvx.

00:18:46.340 --> 00:18:48.800
So uvx agents view and you're on your way.

00:18:49.310 --> 00:18:51.460
It will literally download and install in a matter of seconds.

00:18:52.200 --> 00:18:56.100
You can have it give you preset reports out to the terminal, or you can say serve.

00:18:56.590 --> 00:19:00.140
And if you do the serve option, you can get a view like this.

00:19:00.190 --> 00:19:00.840
So this is mine.

00:19:01.920 --> 00:19:07.600
You can see here, I've gotten more and more intense on my AI agent usage.

00:19:08.080 --> 00:19:10.380
Now, this is just the coding agents, the local ones that I'm using.

00:19:10.920 --> 00:19:12.620
It does offer an interesting feature.

00:19:13.010 --> 00:19:18.460
I didn't show this off, but if you are looking at this, there's an MCP server.

00:19:18.900 --> 00:19:22.140
Have you ever wanted to query across all of your coding agent sessions?

00:19:22.440 --> 00:19:25.380
Say you're working on 10 projects and you want to ask a question like,

00:19:25.680 --> 00:19:28.540
have I ever solved this error before? Here is your answer.

00:19:29.340 --> 00:19:33.220
This is actually a more interesting use case than the token spend calculation

00:19:33.980 --> 00:19:36.540
is an aggregate view across many of your sessions.

00:19:36.700 --> 00:19:41.100
So you can actually leverage the knowledge you use to solve a problem in one place.

00:19:41.180 --> 00:19:42.980
You can now bring it in and solve it in another

00:19:43.420 --> 00:19:45.280
without having to reprompt or reinvent the wheel.

00:19:46.440 --> 00:19:48.540
You can also bring in your chat history.

00:19:48.840 --> 00:19:51.340
So if we go back over here to the chat import,

00:19:51.750 --> 00:19:54.900
you can import your Claude and your ChatGPT chat sessions.

00:19:55.510 --> 00:19:57.620
And so those may overlap or intertwine

00:19:57.710 --> 00:19:59.380
with the work you're doing on your agent.

00:19:59.510 --> 00:20:00.420
So now you can correlate

00:20:00.590 --> 00:20:02.600
and have those chat sessions alongside it.

00:20:03.100 --> 00:20:04.360
This is something I've wanted for ages

00:20:04.860 --> 00:20:07.040
is a multi-chat meta search

00:20:07.390 --> 00:20:08.860
because that's now kind of my brain

00:20:09.040 --> 00:20:11.660
is the history log on like perplexity

00:20:11.740 --> 00:20:12.980
and Claude and ChatGPT.

00:20:13.420 --> 00:20:14.840
And where did I discuss that last?

00:20:15.120 --> 00:20:16.320
Oh, it was over on ChatGPT.

00:20:16.320 --> 00:20:16.980
Yeah, that's super cool.

00:20:17.140 --> 00:20:18.040
Now I can pull that in.

00:20:18.500 --> 00:20:23.640
I don't think it supports perplexity just yet, which is kind of a need in my mind, because

00:20:23.700 --> 00:20:26.260
the perplexity sessions, as I found out, will expire.

00:20:26.760 --> 00:20:31.080
If you go back to some of that history far enough, you will find that it won't have your

00:20:31.580 --> 00:20:32.500
history actually there.

00:20:32.620 --> 00:20:33.580
It'll list it in the history.

00:20:33.980 --> 00:20:38.600
And but it's not so it's not the external brain that I thought it was.

00:20:39.000 --> 00:20:42.920
So a tool like this, actually, if you set up some tooling to import those chat histories

00:20:43.080 --> 00:20:46.999
in here might actually be a better solution because now you can search across multiple

00:20:47.020 --> 00:20:52.080
providers and keep all your own history local instead of relying on the cloud providers. So I

00:20:52.100 --> 00:20:57.280
really like that. It has the full text. You can optionally do semantic search. So again, if I come

00:20:57.280 --> 00:21:02.540
back in here to the pieces, I believe semantic search. Yeah, here we go. Semantic search. You

00:21:02.800 --> 00:21:09.740
basically can use a local like Olama or Olama CPP hosted embeddings models or OpenAI compatible

00:21:09.940 --> 00:21:15.559
endpoints and have a vector based search against all this too. So again, this is not out of the box

00:21:15.560 --> 00:21:21.700
on, but if you turn it on, you now kind of get super powered document semantic level search

00:21:22.000 --> 00:21:26.600
against those. So super fun, cool project. I think I'm going to double down a little more on this.

00:21:26.740 --> 00:21:29.780
There's some other projects in the community that are doing things like this, but this is one that

00:21:29.780 --> 00:21:34.400
was Python. So I thought it'd be very relevant to our audience. And I think it's actually a great

00:21:34.410 --> 00:21:39.820
way to kind of externalize your search history and how you're using the coding agents and how

00:21:39.830 --> 00:21:44.620
you're solving problems. I think this is super neat. I'm glad you covered it. I'll tell you what,

00:21:44.680 --> 00:21:51.900
a couple things one why search so bad in the ai things it's like searching searching and then it'll

00:21:52.000 --> 00:21:55.900
pull up stuff you put two like you can't because they're not spending the tokens on embeddings this

00:21:55.920 --> 00:21:59.800
this allows you to spend your own tokens to get the embeddings that are missing from that that

00:21:59.980 --> 00:22:06.060
equation right there michael interesting but even just like a Pagefind level sort of indexing

00:22:06.400 --> 00:22:12.299
by the apps it's it's so bad so having a really nice search here and two i like to point out if

00:22:12.320 --> 00:22:18.340
you do try this out in the top it says um agents view then you can pick by project it identifies

00:22:18.760 --> 00:22:23.880
which projects that you're working on so you can drill down into just the python bytes website for

00:22:24.060 --> 00:22:28.380
example whatever work i've done there i want to see the spend and the usage over time yeah the

00:22:28.560 --> 00:22:33.480
history yep but it also has a drop down that initially says sessions and that's pretty

00:22:33.720 --> 00:22:38.739
interesting that's the one you showed me but if you pick like usage you get some really interesting

00:22:38.760 --> 00:22:44.400
things. For example, I have been setting up Hermes. I spoke about Hermes. It tells me how much I spent

00:22:44.560 --> 00:22:51.140
last month. I spent 13.2 million output tokens and 4.4 million input tokens. That's on average,

00:22:51.440 --> 00:22:58.860
$300. No, that's peak at $300 a day on average, 71. On setting up Hermes, I spent $577. I spent

00:22:59.040 --> 00:23:05.959
507 on DocPython training doing some mega projects. I did this project that ran for five hours without

00:23:06.020 --> 00:23:13.380
interruption. Wow. Which is crazy, but it came out really good. I spent 169 on Python bytes,

00:23:13.450 --> 00:23:17.000
and I'll tell you what that is later. But that kind of stuff, there's just a whole bunch of

00:23:17.010 --> 00:23:22.040
those different kinds of reports and trends and other things. And you can turn on this embedding

00:23:22.070 --> 00:23:26.280
stuff that you talked about. So you can like AI search of your own content. Yeah, I came for the

00:23:26.420 --> 00:23:32.400
token cost, but I stayed for all the search and semanticness of it. Exactly. Exactly. All right.

00:23:32.460 --> 00:23:37.220
I have another story to tell, and this one comes to us from AJ.

00:23:37.670 --> 00:23:39.420
So let me get down to it.

00:23:40.320 --> 00:23:41.320
Careful with the phishing, y'all.

00:23:41.760 --> 00:23:47.780
So I thought I would retell his story because this is also pretty interesting

00:23:48.160 --> 00:23:51.320
and give you all a little bit of a tip as well.

00:23:51.660 --> 00:23:57.760
So AJ says, hey, I'm passing this along because it was a pretty sneaky bit of targeted phishing.

00:23:58.080 --> 00:24:05.680
and sidebar, I think that the, all this AI stuff has absolutely exploded the amount of scammy,

00:24:06.160 --> 00:24:11.540
crummy email out there. I get, I mean, I'll tell you, there's like four people a day that want to

00:24:11.560 --> 00:24:15.780
buy Talk Python and they just, or they're going to help me raise a hundred million dollars. I'm like,

00:24:15.960 --> 00:24:19.260
just get away from me. You wouldn't believe how many times Gabrielle wants gift cards from me.

00:24:20.680 --> 00:24:27.800
And it's an urgent, she's in an urgent meeting and she needs it now. Can't wait an hour. That

00:24:27.820 --> 00:24:33.060
talk to me in person we gotta get going so anyway i think this is part of that obviously so it says

00:24:33.240 --> 00:24:38.680
a targeted bit of sneaky phishing to do with GitHub and happened to play off an old interaction i had

00:24:38.680 --> 00:24:44.080
with bandits repo so bandit is a ironically a security vulnerability scanning tool for python

00:24:45.320 --> 00:24:52.680
and he had done some kind of pr or something like that and this person probably this ai found that

00:24:52.640 --> 00:24:58.740
interaction and said, hey, we're going to like talk about that and leverage it and make it feel like

00:24:58.870 --> 00:25:03.180
a real person who's really talking to you, right? So it says traditionally relative newbies like me

00:25:03.320 --> 00:25:06.860
haven't been historically worth the effort, but you know what? When everything's automatic,

00:25:07.420 --> 00:25:14.400
now it is. So I put the actual email in here and the subject is your bandit issue 3150.

00:25:15.440 --> 00:25:19.620
Next token false positive just fixed that exact case, right? It's okay.

00:25:19.900 --> 00:25:26.480
great yeah hey so and hey aj i saw your bandit issue such and such and da da da i built a

00:25:26.600 --> 00:25:31.500
deterministic gate and it goes on and on about it or so you know could you just check out here's the

00:25:31.600 --> 00:25:37.700
here's the code that fixes it and you want to put that up on the screen michael oh have i oh i'm i do

00:25:39.380 --> 00:25:44.540
yes you know what hold on it's it's not worth it the trouble to get over it's like kind of locked

00:25:44.560 --> 00:25:50.820
away so sorry but it's basically it just says here's a link to yeah to the code right and i put

00:25:50.940 --> 00:25:54.600
this is in the show notes curious whether this clears your problem or if it trips you up let me

00:25:54.700 --> 00:26:01.680
know and it's that seems totally reasonable right but there's a few issues how long the code was

00:26:01.820 --> 00:26:09.440
at backtrace don't go there blacktrace don't click on these links some rando alphanumeric thing how

00:26:09.460 --> 00:26:12.000
How long has backtrace.co been around?

00:26:13.140 --> 00:26:13.940
Not very long.

00:26:14.540 --> 00:26:15.400
Not very long at all.

00:26:16.320 --> 00:26:18.000
So I actually threw this into Claude.

00:26:18.000 --> 00:26:22.200
I said, Claude, I use Spark email, which is kind of a crappy email,

00:26:22.980 --> 00:26:23.940
but it's the least crappy.

00:26:24.540 --> 00:26:25.400
So you know what I mean?

00:26:26.320 --> 00:26:26.760
Client.

00:26:27.140 --> 00:26:30.420
But it has a really cool feature that for any email you get

00:26:30.430 --> 00:26:33.040
or any email thread, you can say copy as markdown,

00:26:33.310 --> 00:26:35.560
which is so perfect for just dropping.

00:26:36.020 --> 00:26:38.360
Yeah, because you can just paste that into any AI thing.

00:26:38.540 --> 00:26:41.960
go tell me about this or process this or whatever, you know?

00:26:42.300 --> 00:26:45.120
And you could do like the whole thread or just the top level as a checkbox.

00:26:45.210 --> 00:26:45.660
It's pretty sweet.

00:26:45.930 --> 00:26:47.260
So I did that and I gave it a clod.

00:26:47.540 --> 00:26:51.340
And it says, this message name drops enough real detail to feel legit,

00:26:51.500 --> 00:26:53.000
but the structure is pure phishing.

00:26:53.520 --> 00:26:54.720
And there's a couple of reasons.

00:26:55.100 --> 00:26:59.760
So first of all, if you didn't look, it's actually a Gmail address being sent from.

00:27:00.040 --> 00:27:03.200
Companies generally don't reach out from their Gmail, you know?

00:27:03.820 --> 00:27:04.820
As gmail.com.

00:27:05.040 --> 00:27:05.120
It's very sus.

00:27:05.420 --> 00:27:05.800
Very sus.

00:27:06.240 --> 00:27:06.960
That's very sus.

00:27:07.360 --> 00:27:08.500
Over-specific targeting.

00:27:08.800 --> 00:27:11.480
It mirrors AJ's exact public activity,

00:27:11.960 --> 00:27:13.360
so it's just enough plausibility.

00:27:13.680 --> 00:27:15.580
The entire payload is two links.

00:27:15.800 --> 00:27:17.640
It stripped the technical flattery,

00:27:17.680 --> 00:27:20.360
and it's just the paste is here, plus the results are here.

00:27:21.140 --> 00:27:22.380
30 seconds, low friction.

00:27:22.820 --> 00:27:25.480
A brand-new domain, blacktrace.co,

00:27:25.560 --> 00:27:28.760
has no track record of existing, so that's also a sus.

00:27:29.560 --> 00:27:32.040
Precise jargon that's vague, disalarmingly close.

00:27:32.200 --> 00:27:34.280
Like, if this trip's on something of yours,

00:27:34.500 --> 00:27:36.780
that'd be most useful reply, right?

00:27:36.880 --> 00:27:37.940
like, hey, just check it out for me.

00:27:37.980 --> 00:27:39.440
It's a very legitimate looking email,

00:27:39.860 --> 00:27:42.400
especially given the cleanness of the domain name

00:27:42.640 --> 00:27:45.300
and the links are very clean and not messy.

00:27:45.620 --> 00:27:47.900
A lot of times these seem pretty obvious,

00:27:48.120 --> 00:27:49.380
but this one's really, really clean.

00:27:50.100 --> 00:27:52.340
Yeah, so just be careful out there, folks.

00:27:53.040 --> 00:27:54.480
AJ was safe, but ugh.

00:27:54.840 --> 00:27:55.900
One we've been seeing,

00:27:56.390 --> 00:27:57.900
and we've not seen actively,

00:27:58.040 --> 00:27:59.460
but some people in the community have been seeing,

00:27:59.530 --> 00:28:02.360
is bogus people applying for jobs

00:28:02.620 --> 00:28:04.840
attempting to get you to click on their GitHub repositories

00:28:05.220 --> 00:28:07.260
to clone a repository.

00:28:07.490 --> 00:28:09.240
And it has obviously the hooks in it

00:28:09.380 --> 00:28:11.260
to do things on, you know,

00:28:11.600 --> 00:28:12.420
when things happen.

00:28:13.100 --> 00:28:14.560
So be careful if you're an employer

00:28:14.840 --> 00:28:16.140
and people are asking you

00:28:16.160 --> 00:28:17.340
to really download their work

00:28:17.720 --> 00:28:18.300
and check it out.

00:28:19.520 --> 00:28:19.860
And reverse.

00:28:20.180 --> 00:28:21.720
I've heard really bad stuff

00:28:22.000 --> 00:28:23.960
from people who got lured

00:28:24.130 --> 00:28:25.540
into applying for a fake job

00:28:25.690 --> 00:28:27.060
and all the job was about

00:28:27.300 --> 00:28:28.120
is like, just do this

00:28:28.600 --> 00:28:30.240
take-home test coding example.

00:28:30.880 --> 00:28:32.180
And here's the GitHub to get started.

00:28:32.960 --> 00:28:33.140
Yep.

00:28:33.660 --> 00:28:35.860
Just pay with all your Bitcoin and all your credentials.

00:28:36.080 --> 00:28:36.440
It'll be fine.

00:28:36.840 --> 00:28:41.620
And they're preying on people who are looking for a job, maybe in a situation, any opportunity

00:28:41.800 --> 00:28:43.140
they're going to jump at.

00:28:43.320 --> 00:28:44.500
So just be careful.

00:28:44.920 --> 00:28:45.700
It's a good warning, Michael.

00:28:45.980 --> 00:28:46.460
So shady.

00:28:46.820 --> 00:28:46.900
Thanks.

00:28:47.080 --> 00:28:47.480
Thanks, AJ.

00:28:47.860 --> 00:28:48.220
All right.

00:28:48.620 --> 00:28:49.040
Very good.

00:28:49.440 --> 00:28:49.660
Extra?

00:28:50.080 --> 00:28:50.280
Yep.

00:28:50.420 --> 00:28:50.800
Feeling extra?

00:28:50.800 --> 00:28:50.940
I do.

00:28:51.280 --> 00:28:55.860
So related to the Django post from earlier, DjangoCon US is coming right up.

00:28:56.060 --> 00:28:58.520
It's August 24th through the 28th in Chicago.

00:28:59.260 --> 00:29:02.880
I assume there are still tickets available because the registration is still up.

00:29:02.960 --> 00:29:06.780
but I think the hotel block closes the end of this week.

00:29:06.810 --> 00:29:08.540
So if you want to stay in the conference hotel

00:29:08.670 --> 00:29:09.440
at the discounted rate,

00:29:09.620 --> 00:29:10.740
which is a considerable discount

00:29:11.340 --> 00:29:12.660
for a downtown Chicago hotel,

00:29:13.340 --> 00:29:14.120
come check it out.

00:29:14.350 --> 00:29:15.660
It is a great conference.

00:29:15.880 --> 00:29:17.460
Tons of great content, great community.

00:29:18.360 --> 00:29:20.280
Actually last weekend I was at the Pi Ohio community

00:29:20.330 --> 00:29:21.700
and people were already talking and excited

00:29:21.940 --> 00:29:23.740
about going to DjangoCon as well.

00:29:23.980 --> 00:29:26.080
So the conferences like this

00:29:26.300 --> 00:29:27.860
are where you make great friends

00:29:28.100 --> 00:29:30.420
and you get to experience that community

00:29:30.620 --> 00:29:31.460
that everyone stayed for.

00:29:31.900 --> 00:29:33.740
Yeah, and good connections too, right?

00:29:33.780 --> 00:29:34.400
Yeah, yeah.

00:29:34.620 --> 00:29:35.800
Next time you run across somebody,

00:29:36.300 --> 00:29:37.740
you're like, oh, actually met that person.

00:29:38.060 --> 00:29:39.380
And yeah, it's good.

00:29:39.380 --> 00:29:41.800
Yeah, actually the other one I wanted to mention here

00:29:42.120 --> 00:29:44.040
is Ruff has made a new release.

00:29:44.600 --> 00:29:46.140
And it may not seem like an exciting release

00:29:46.340 --> 00:29:48.580
since it's 0.16.0, but watch out.

00:29:48.580 --> 00:29:49.720
I'm still riding the zero for her.

00:29:50.460 --> 00:29:51.280
Still on the zero.

00:29:52.000 --> 00:29:55.560
The default rules went from 59 enabled

00:29:56.120 --> 00:29:59.040
to 413 rules enabled.

00:29:59.900 --> 00:30:01.160
So when you run this,

00:30:01.360 --> 00:30:02.720
you will see a lot of things,

00:30:03.260 --> 00:30:07.140
but it's all in the attempt to get us into a better spot.

00:30:07.580 --> 00:30:10.800
So much like the vibe coded security, vulnerability,

00:30:11.680 --> 00:30:12.360
searching and finding,

00:30:13.040 --> 00:30:15.060
this is going to help with keeping things clean

00:30:15.440 --> 00:30:18.860
and in order and readable and best practices

00:30:19.400 --> 00:30:21.140
and making sure you aren't doing something

00:30:21.280 --> 00:30:22.560
that's kind of on the edge case of even,

00:30:22.720 --> 00:30:24.420
this can be considered almost like a security,

00:30:24.550 --> 00:30:25.320
pre-security tool.

00:30:25.680 --> 00:30:26.360
So check that out,

00:30:26.410 --> 00:30:27.740
but be careful because it's going to give you,

00:30:27.780 --> 00:30:29.160
it's going to yell at you a lot.

00:30:29.380 --> 00:30:30.960
It is absolutely going to.

00:30:31.300 --> 00:30:31.380
Yes.

00:30:31.680 --> 00:30:31.740
Yeah.

00:30:32.800 --> 00:30:35.480
Eva out there says, I wonder what will make them break 1.0.

00:30:35.640 --> 00:30:35.740
Yes.

00:30:36.240 --> 00:30:37.820
That's a good question.

00:30:37.870 --> 00:30:38.480
I don't know, but yeah.

00:30:41.520 --> 00:30:45.620
I have been running, one of the core rules of all my agents and just before is I just,

00:30:45.700 --> 00:30:50.400
I've been running Ruff format and ruff check on everything before I committed.

00:30:50.580 --> 00:30:50.920
Every tool.

00:30:51.080 --> 00:30:51.480
100%.

00:30:51.680 --> 00:30:51.740
Yep.

00:30:52.080 --> 00:30:52.200
Yep.

00:30:52.530 --> 00:30:52.620
Yep.

00:30:52.840 --> 00:30:57.900
And it's, once you get it, it's a pain at first, but once you spend a few hours, it's,

00:30:58.160 --> 00:30:59.660
it's dialed in and it's, it's good.

00:30:59.840 --> 00:31:05.500
The other one that I've been doing, keeping it in the astral OpenAI family, is ty.

00:31:06.070 --> 00:31:12.700
So the biggest project, like the thing that ran for five hours was so much of Talk Python

00:31:12.940 --> 00:31:17.160
training is built from, it's a 10-year project with 190,000 lines of Python, right?

00:31:17.180 --> 00:31:17.780
It's a big project.

00:31:18.220 --> 00:31:19.980
So at least for Michael, that's a big project.

00:31:20.720 --> 00:31:26.020
So it was built under the PyCharm type checker, and I hadn't been running ty on.

00:31:26.020 --> 00:31:27.740
I'd just been doing whatever the editor says.

00:31:27.750 --> 00:31:29.020
And I'm like, well, let me run ty on.

00:31:29.080 --> 00:31:31.760
It's like, oh my, 800 errors.

00:31:32.430 --> 00:31:36.180
And you open it any other editor besides PyCharm and it's just full of red marks.

00:31:36.460 --> 00:31:40.020
It's like, oh man, I cannot deal.

00:31:40.030 --> 00:31:46.420
I can't even look at the editor and tell if there's something wrong because it's so full of red marks because they apply different rules and different checks.

00:31:46.700 --> 00:31:52.220
So I spent a long time with Fable just planning out of like, how are we going to resolve this?

00:31:52.330 --> 00:31:54.260
Because it's not just change the types.

00:31:54.380 --> 00:31:56.760
it's like, well, you have an optional thing coming in

00:31:56.790 --> 00:32:00.320
and you didn't check if it's none before you operated on it.

00:32:00.420 --> 00:32:02.280
So that's a attribute error, right?

00:32:02.640 --> 00:32:03.920
So what do you do when it is none?

00:32:04.000 --> 00:32:05.980
You've got to rewrite the code and have a different response.

00:32:06.100 --> 00:32:07.300
So it's pretty complicated, right?

00:32:07.560 --> 00:32:11.140
So I spent probably a couple of hours

00:32:11.570 --> 00:32:12.880
building out a plan to solve this.

00:32:13.250 --> 00:32:15.500
Then I just said, Opus, have at it.

00:32:16.320 --> 00:32:18.900
Five hours later, it ran out of credits.

00:32:19.150 --> 00:32:21.820
I had to come back in the middle of the day and go,

00:32:22.280 --> 00:32:23.900
keep going, you have more credits now.

00:32:24.280 --> 00:32:26.000
And then after dinner, it was done.

00:32:26.000 --> 00:32:28.360
I'm like, oh my God, but zero, zero errors.

00:32:28.670 --> 00:32:29.640
I mean, it's really nice.

00:32:29.780 --> 00:32:33.100
Now I look at the page and if there's a squiggly, it means something, you know?

00:32:33.240 --> 00:32:33.360
Yeah.

00:32:33.700 --> 00:32:37.320
Well, and one of the things that Ruff did in that new release is that when it encounters

00:32:37.650 --> 00:32:45.180
those errors or the rule breaking moments, it gives a in context description that is very

00:32:45.560 --> 00:32:46.720
AI LLM friendly.

00:32:47.060 --> 00:32:51.699
So these tools are designed to go back and forth with the LLMs in a very, very friendly

00:32:51.720 --> 00:32:56.780
way to be very productive as opposed to them having to do a lot of reasoning and token burn

00:32:57.060 --> 00:33:02.080
just to think about what's wrong it's it's trying to eliminate some of that token usage by giving

00:33:02.100 --> 00:33:06.740
the right pointers to the right tooling that's a super point a good point because otherwise it has

00:33:06.820 --> 00:33:11.420
to try to infer what the what's going on x means yeah it's got to trace it back through the whole

00:33:11.560 --> 00:33:17.659
program yeah i mean basically this is the compiler of yeah in a sense right this is like the compile

00:33:17.680 --> 00:33:19.760
the build failed equivalent.

00:33:20.400 --> 00:33:20.480
Yep.

00:33:20.720 --> 00:33:21.560
And that's super cool.

00:33:21.700 --> 00:33:23.420
One more real-time follow-up piece while we're here.

00:33:23.920 --> 00:33:24.500
Brian Weber says,

00:33:24.760 --> 00:33:26.820
wow, I had a similar experience about the phishing.

00:33:26.860 --> 00:33:28.440
I just realized someone sent me an email

00:33:28.720 --> 00:33:31.200
about an app they did replicating a repo I had,

00:33:31.340 --> 00:33:32.480
and now the site is gone.

00:33:32.920 --> 00:33:33.280
Hmm.

00:33:34.100 --> 00:33:34.320
Hmm.

00:33:35.320 --> 00:33:37.500
So I got, yeah, not great.

00:33:37.500 --> 00:33:38.500
I got one more thing to say.

00:33:38.640 --> 00:33:40.700
Here's like, not mega,

00:33:40.880 --> 00:33:43.040
but I redesigned the whole homepage

00:33:43.600 --> 00:33:47.640
and some other experiences on Python Pyce

00:33:47.660 --> 00:33:53.600
the i like it and yeah it's got some really neat things here for people but most notably it has

00:33:53.740 --> 00:33:59.560
like a little um technology parade so you want to learn about htmx or hnckai or fast api or django

00:33:59.950 --> 00:34:03.120
click on that and that'll take you over to talk python training with just the course that we have

00:34:03.220 --> 00:34:09.580
there so that's pretty fun and it has a find us on social with all of our links yeah really good

00:34:09.740 --> 00:34:16.100
there as well as somewhere it has a subscribe dedicated subscribe page so if you want to get

00:34:16.120 --> 00:34:22.700
in CastBox or Overcast or Radio Public or whatever. It's even YouTube and Spotify. So a couple extra

00:34:22.730 --> 00:34:27.440
nice things there. That's really cool. You need to add in a music assistant. Yes. Music assistant.

00:34:27.810 --> 00:34:34.820
Okay. Will do. For those home assistant geeks out there. Music. Okay. Not only, not only do I think

00:34:35.020 --> 00:34:39.820
I agree with you, that should be good. I'm now very interested and I'm, I'm, I'm here for it.

00:34:39.940 --> 00:34:44.220
Let's do it. Yeah. There's been a lot of it. Well, maybe next week I'll do some, some home assistant

00:34:44.220 --> 00:34:48.899
news because I feel like we have a lack of home assistant news here. We absolutely do. We absolutely

00:34:49.220 --> 00:34:54.460
do have a lack of it. So for our joke, let's close it out here. All right. And I want to put you in

00:34:54.540 --> 00:34:59.720
the right mood, the right state of mind here. So think about the Bobs in office space.

00:35:01.480 --> 00:35:06.780
What would you say you do here, Michael? What exactly would you say we do here? Well,

00:35:07.300 --> 00:35:11.640
remember when they're interviewing the project manager, Bob? So there's three Bobs. He goes,

00:35:11.740 --> 00:35:14.780
what exactly would you say you do here, Bob?

00:35:15.040 --> 00:35:17.980
I take the requirements from the people to the programmers.

00:35:18.460 --> 00:35:19.400
I'm good with people.

00:35:20.120 --> 00:35:21.060
I'm a people person.

00:35:21.520 --> 00:35:22.600
I'm a people person.

00:35:22.710 --> 00:35:25.620
That is really one of the best movies of all time.

00:35:25.840 --> 00:35:26.020
It is.

00:35:26.020 --> 00:35:29.320
If you haven't seen, not the series, the show, Office Space.

00:35:29.620 --> 00:35:29.760
Yeah.

00:35:30.040 --> 00:35:30.400
The movie.

00:35:30.700 --> 00:35:31.060
The movie.

00:35:31.420 --> 00:35:32.000
Yes, the movie.

00:35:32.140 --> 00:35:36.640
Okay, so here's the tweet or the X post or whatever you call it.

00:35:36.640 --> 00:35:38.840
It says, to replace programmers with AI,

00:35:39.400 --> 00:35:43.360
clients will need to accurately describe what they want. We're safe. Very true.

00:35:44.820 --> 00:35:46.620
That probably hits closer home for you than,

00:35:46.960 --> 00:35:49.300
so one point. Yeah. I'm not worried.

00:35:49.660 --> 00:35:52.640
All this stuff is actually just making people do the thing we should have been

00:35:52.760 --> 00:35:53.700
doing in the beginning.

00:35:54.660 --> 00:35:55.760
There's so much more planning.

00:35:56.180 --> 00:36:00.760
There's so much more planning in documenting and writing down and history.

00:36:01.160 --> 00:36:03.000
It's going to be a wonderfully well-documented world now.

00:36:03.500 --> 00:36:05.380
Exactly. That way when Skynet takes over,

00:36:05.480 --> 00:36:08.540
it'll know that we were on its side so it won't put us into the worst prison.

00:36:10.940 --> 00:36:15.700
no no i'm just kidding sky net a little more optimistic michael come on no i i really don't

00:36:15.760 --> 00:36:20.480
think that oh oh i have i had a second joke from from the really quick before we run this out okay

00:36:20.640 --> 00:36:25.660
so um for this i mean this could have been the joke it's probably should have been the joke check

00:36:25.720 --> 00:36:32.100
this out check this out so this is no joke inside the financial times article there was a little

00:36:32.120 --> 00:36:39.760
call out like recommended you might also like vibe coding is the new dyi who wrote it who wrote it

00:36:39.860 --> 00:36:47.040
oh my god sarah o'connor wrote it sarah o'connor oh my god and she was the woman who was

00:36:47.260 --> 00:36:52.820
the the star of the terminator series now i know it's sarah connor but she's trying to hide from

00:36:52.820 --> 00:36:56.560
the ai's going by this byline like isn't that hilarious oh my gosh getting it

00:36:59.660 --> 00:37:05.700
that's an unfortunate name for that article or the author yeah it's yeah it's kind of amazing

00:37:06.120 --> 00:37:09.840
yep well done all right well thank you calvin always great to be here with us

00:37:10.120 --> 00:37:13.820
as always and thanks everyone for listening thanks michael talk to you next week yep bye