WEBVTT

00:00:00.040 --> 00:00:12.320
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to earbuds. This is episode 450, recorded September 22nd, 2025. I'm Michael Kennedy.

00:00:12.680 --> 00:00:13.580
And I'm Brian Okken.

00:00:13.900 --> 00:00:57.140
And you can support our show by supporting our work. Take a course over at the Complete pytest course with Brian or a bunch of the courses, including one from Brian over at Talk Python. And thank you to our Patreon supporters. I really appreciate that. Connect with us on socials, whether you just want to have a chat, comment on the episode we released. We usually announce it there and you can talk on that thread or just follow us and see what's going on. Some links to various places are in the show notes. If you want to join us live, then PythonWyZ.fm live is where you go. If we're live streaming, the website will say so and you'll see the live stream playing right there. Otherwise, just click on the YouTube banner and it'll let you subscribe to the YouTube feed.

00:00:57.460 --> 00:01:00.780
It'll let you get notified and you can see all the old shows there if you like.

00:01:01.030 --> 00:01:16.520
And finally, if you would like an artisan handcrafted digest put together by Brian about what we've talked about on the show, a bit of a deeper dive into the background and some of the topics and more resources, not just a rehash or email version of the show notes.

00:01:16.770 --> 00:01:19.920
Go to pythonbytes.fm, click on newsletter, enter your email.

00:01:20.340 --> 00:01:21.660
We'll be gentle to it, we promise.

00:01:22.200 --> 00:01:26.980
Now, Brian, I would hope that you would also be gentle to pandas other zoo animals.

00:01:27.440 --> 00:01:32.340
So I'm going to talk about PD call, which is columns in pandas.

00:01:32.780 --> 00:01:33.880
These are not here yet.

00:01:34.200 --> 00:01:40.280
So these PD call expressions are coming to pandas in the next version-- I think the next version.

00:01:40.560 --> 00:01:41.860
Well, more about that later.

00:01:42.140 --> 00:01:44.660
Anyway, this comes to us from Marco Garelli.

00:01:45.540 --> 00:01:46.220
He wrote the article.

00:01:46.860 --> 00:01:54.620
And what he's talking about is a new call expression within pandas and with PD data frames.

00:01:55.800 --> 00:02:00.500
So taking a look at, he also linked to the merge request.

00:02:00.580 --> 00:02:01.480
So let's take a look at that.

00:02:01.820 --> 00:02:04.660
There's an enhancement, introduce pandas.call.

00:02:05.160 --> 00:02:07.980
That went in and was merged on August 22nd.

00:02:08.000 --> 00:02:10.520
So why I'm saying it's coming in the next version.

00:02:10.920 --> 00:02:13.100
So it came in August 22nd.

00:02:13.260 --> 00:02:18.080
The most recent version of pandas looks like it was released on August 21st.

00:02:18.340 --> 00:02:19.120
So it's not there now.

00:02:19.780 --> 00:02:23.400
So whatever the next one is, maybe 233, maybe 24.

00:02:23.940 --> 00:02:27.400
I don't know what they're going to bump, but it'll be there soon.

00:02:27.620 --> 00:02:28.760
So what are these things?

00:02:29.300 --> 00:02:42.600
So in the past, there's pandas, but then there's other things that pandas has inspired, like I'm blanking on all the names, but there's a bunch of other type pandas-like things that do similar stuff.

00:02:43.840 --> 00:02:48.700
So they have the call syntax already, so that's just coming back into pandas.

00:02:48.800 --> 00:02:49.560
So what is this?

00:02:50.060 --> 00:02:58.840
So when you want to talk about pandas columns, in the past, a lot of times you had to come up with these, use these lambda expressions.

00:02:59.140 --> 00:03:04.460
So like lambda x for x temp, specifying a column.

00:03:04.660 --> 00:03:13.000
So you kind of select it with a lambda expression because you want the expression to happen not outside of the data frame, but in the context of the data frame.

00:03:13.260 --> 00:03:16.380
So it's, you know, there's some trickiness in doing that.

00:03:17.140 --> 00:03:19.000
So really, that's what's going on.

00:03:19.140 --> 00:03:27.360
And the article we're going to link to talks about using lambdas and then kind of times where that doesn't work right.

00:03:28.060 --> 00:03:30.380
There's some flakiness that happens with lambdas.

00:03:30.940 --> 00:03:32.700
It doesn't always do what you might think.

00:03:34.240 --> 00:03:36.720
And then introduces using columns instead.

00:03:37.300 --> 00:03:45.580
So the syntax of using instead of the lambda, just doing pd.call and passing in a column name.

00:03:46.320 --> 00:03:49.080
That's really all I wanted to talk about was really, this is pretty cool.

00:03:49.600 --> 00:03:52.260
And I'm looking forward to being able to use this column.

00:03:52.620 --> 00:03:56.000
There are new things coming also along these lines.

00:03:56.280 --> 00:04:04.880
So some of the other things that some of the other tools use is things like PD all to select multiple columns.

00:04:05.600 --> 00:04:07.520
That's not in this one yet.

00:04:08.300 --> 00:04:16.500
But there's other multiple expressions in PDL selectors and other things that they want to bring into Pandas.

00:04:17.359 --> 00:04:19.100
But this is a good starting point.

00:04:19.459 --> 00:04:19.940
This is great.

00:04:20.120 --> 00:04:20.500
I love it.

00:04:20.690 --> 00:04:22.280
I love to see it getting better.

00:04:22.430 --> 00:04:26.840
You know, Pandas is definitely the primary way people do data frames.

00:04:27.120 --> 00:04:31.500
And there's some young whippersnappers nipping at the heels like Polars and others.

00:04:31.680 --> 00:04:34.080
So great to see some of these ideas being brought back.

00:04:34.280 --> 00:04:34.460
Yeah.

00:04:34.720 --> 00:04:35.060
Absolutely.

00:04:35.380 --> 00:04:38.440
Now, let's talk about whippersnappers for sure.

00:04:38.700 --> 00:04:40.280
The young vibe coder type.

00:04:40.480 --> 00:04:44.480
No, I want to talk about agentic code, certainly not just for vibe coding.

00:04:44.620 --> 00:04:48.580
So I actually have been doing a lot of cursor lately, and I really like it.

00:04:48.700 --> 00:04:55.660
I think it's, at some point I have more to say, but I think it's pretty stunning what you can do these days with agentic AI coding.

00:04:56.060 --> 00:05:07.380
I talked to Matt Makai a few weeks ago on Talk Python about, he was using ColladeCode and NeoVim, But these agentic tool using coding AIs are just unbelievable what they can do.

00:05:07.590 --> 00:05:10.240
They all have their own little variation, which is kind of funky.

00:05:10.720 --> 00:05:12.660
You know, cursor is like a VS Code fork.

00:05:12.850 --> 00:05:20.980
But then Microsoft said, hey, maybe we shouldn't just let everybody just take our stuff and redo our business model against us, which is absolutely fair.

00:05:21.440 --> 00:05:22.500
So they cancel a bunch of stuff.

00:05:22.550 --> 00:05:24.980
So it's not quite VS Code, but it's kind of VS Code.

00:05:25.600 --> 00:05:27.740
There's Claude Code, which is terminal based.

00:05:28.240 --> 00:05:31.200
But what I want to mention today is something called Klein.

00:05:31.810 --> 00:05:36.140
And I think the idea of it, if you're at all inclined to care about the AI coding thing.

00:05:36.720 --> 00:05:37.160
Inclined.

00:05:37.740 --> 00:05:38.180
Inclined.

00:05:38.480 --> 00:05:38.860
Pretty good.

00:05:39.380 --> 00:05:44.860
If you're at all inclined to care about the inline coding thing, then Klein should be pretty interesting to you.

00:05:45.120 --> 00:05:45.440
Why is that?

00:05:45.640 --> 00:05:50.500
First of all, it works in pretty much all the places that you would care about.

00:05:50.770 --> 00:05:53.480
It works in VS Code, VS Code Insider, Cursors.

00:05:53.860 --> 00:05:54.680
Cursor, which is interesting.

00:05:55.440 --> 00:06:06.400
So this and OpenAI's codecs both install into Cursor, which is a separate product with its own AI coding thing, but it's like just use a different pane if you don't like it or you run out of credits or whatever, you know.

00:06:06.780 --> 00:06:14.460
But it also installs, and this is one of the main reasons I'm bringing this up, is JetBrains IDEs, in particular PyCharm, but many others as well.

00:06:15.360 --> 00:06:22.800
So if you want to bring whatever model you want to PyCharm or to VS Code or whatever, then you can do that.

00:06:22.880 --> 00:06:28.180
The other thing is places like Cursor charge a percentage on top of inference.

00:06:28.510 --> 00:06:37.840
So if you pay, let's say you do $10 worth of work, that would basically be what Claude or the OpenAI API charges Cursor.

00:06:37.910 --> 00:06:40.460
They're like, all right, well, $12 is what you pay, right?

00:06:40.800 --> 00:06:42.460
With Klein, this is open source.

00:06:42.570 --> 00:06:44.560
You can see 51,000 GitHub stars.

00:06:45.010 --> 00:06:48.380
So it's open source and it doesn't charge for inference.

00:06:48.780 --> 00:07:01.580
What it does is you can either give them a credit and they'll pay it along to whoever you pick in your dropdown, or you could just put in an anthropic API key or an open AI API key, and then that's your model.

00:07:02.040 --> 00:07:05.260
And they're not involved in that transaction, which I think is pretty interesting.

00:07:05.640 --> 00:07:10.240
The other thing that's kind of cool is they have a very distinct plan versus act mode.

00:07:10.250 --> 00:07:13.380
You can see in the screenshot at the bottom, it has a plan and an act.

00:07:13.660 --> 00:07:25.520
And one of the things you can do to be way more successful on complicated AI jobs is to say, please plan this out, write it down in a markdown file, and then come back and say, now you can act.

00:07:25.780 --> 00:07:27.600
Let's do step one and work through that.

00:07:27.860 --> 00:07:28.820
Now let's do step two.

00:07:29.020 --> 00:07:30.180
It'll keep the context smaller.

00:07:30.560 --> 00:07:32.820
It'll keep the thing a little more focused and so on.

00:07:32.820 --> 00:07:33.520
So that's pretty nice.

00:07:33.920 --> 00:07:33.980
Yeah.

00:07:35.020 --> 00:07:39.120
You can do that with other ones in the prompt, but it doesn't always behave.

00:07:39.500 --> 00:07:40.680
You say, let's plan this out.

00:07:40.720 --> 00:07:40.940
It's okay.

00:07:41.060 --> 00:07:41.680
We planned it out.

00:07:41.740 --> 00:07:42.640
Now I'm doing it like, no, no, no.

00:07:42.940 --> 00:07:44.440
I just told you to plan it out, right?

00:07:44.840 --> 00:07:52.700
The other thing, if you look at the UI on the client homepage, it actually has a price that updates as it's working.

00:07:53.180 --> 00:07:54.940
Like how much is this costing you?

00:07:54.940 --> 00:07:57.860
It goes zero cents, three cents, five cents.

00:07:58.100 --> 00:08:05.140
Not when it's done working, but like as it's working, the dollars are like click, click, click, click, click, which is really a lot of other tools.

00:08:05.280 --> 00:08:06.920
It's very like, I have no idea what this costs.

00:08:07.060 --> 00:08:10.380
Oh, no, I'm out of credits or I spent a bunch of money, but this one you can just watch.

00:08:10.460 --> 00:08:10.800
So that's cool.

00:08:11.960 --> 00:08:13.400
Yeah, I like it a lot.

00:08:13.760 --> 00:08:21.240
It's got open source for sure, so complete transparency that they're not profiting on inference, universal model access.

00:08:21.500 --> 00:08:27.800
So if OpenAI or Anthropic come out with a brand new model, it'll show up right away because you're just passing through to their API, right?

00:08:28.140 --> 00:08:28.280
Yeah.

00:08:28.580 --> 00:08:37.320
And it says client-side architecture means your code never touches our servers, essential for security, mandatory for many enterprises, and ensures data sovereignty.

00:08:37.719 --> 00:08:40.919
I played with this a little bit in PyCharm, and it's quite nice.

00:08:40.979 --> 00:08:46.680
I think I will still be using cursor, but I'm keeping my eye on this because I think this is pretty neat.

00:08:46.960 --> 00:08:47.040
Cool.

00:08:47.340 --> 00:08:47.400
Yeah.

00:08:47.700 --> 00:08:51.580
Anyway, believe it or not, AI has still not disappeared as a fad.

00:08:53.580 --> 00:08:53.900
Yeah.

00:08:55.240 --> 00:08:56.640
It may still, but probably not.

00:08:56.920 --> 00:08:57.020
All right.

00:08:57.120 --> 00:08:57.360
Over to you.

00:08:57.660 --> 00:08:57.880
Okay.

00:08:58.860 --> 00:09:02.100
I was just going to talk about uv a little bit.

00:09:02.640 --> 00:09:03.200
Are you going to cheat?

00:09:03.740 --> 00:09:04.540
You're not going to cheat, are you?

00:09:04.860 --> 00:09:05.080
Yeah.

00:09:05.260 --> 00:09:05.820
Yeah, I am.

00:09:07.000 --> 00:09:12.740
This is thanks to Rodrigo at MathsPP, MathsPP.

00:09:13.100 --> 00:09:13.560
I'm not sure.

00:09:13.940 --> 00:09:17.880
Anyway, he's got a great blog about software and Python and stuff.

00:09:18.970 --> 00:09:24.180
So uv Cheat Sheet, I really kind of, I mean, uv at first was, oh, great.

00:09:24.320 --> 00:09:26.740
Can you use it instead of like pip?

00:09:27.140 --> 00:09:29.700
And now it does a lot of stuff.

00:09:29.830 --> 00:09:30.920
So what all does it do?

00:09:31.080 --> 00:09:31.480
It's a lot.

00:09:31.650 --> 00:09:36.040
Now, the documentation over at for uv is pretty good already.

00:09:36.580 --> 00:09:37.700
But I kind of like this.

00:09:38.120 --> 00:09:39.340
So what does he's got?

00:09:39.480 --> 00:09:47.040
He's got like just all of the commands that you probably want to remember around creating projects, like all the inets and how to do inet stuff.

00:09:47.280 --> 00:09:49.120
Like if you're going to do an app or a library.

00:09:49.820 --> 00:09:53.920
And I kind of forgot that they added these app and lib flags.

00:09:54.360 --> 00:09:54.860
That's pretty cool.

00:09:55.140 --> 00:09:55.900
I did too.

00:09:56.000 --> 00:09:59.240
And I made a lib and I forgot and ran it in app mode.

00:09:59.280 --> 00:09:59.820
And I'm like, darn it.

00:10:00.040 --> 00:10:00.720
I messed it up.

00:10:01.320 --> 00:10:02.040
But yeah, it's really great.

00:10:03.040 --> 00:10:13.080
And then project management dependencies, of course, being able to modify your pyproject.toml and stuff using UVAD and uv lock.

00:10:13.220 --> 00:10:15.920
And I guess I didn't notice also there's a uv tree.

00:10:16.160 --> 00:10:16.520
That's neat.

00:10:16.760 --> 00:10:19.160
Didn't know that was there or forgot about it.

00:10:20.440 --> 00:10:21.320
Lifecycle management.

00:10:22.160 --> 00:10:22.780
What does that mean?

00:10:23.180 --> 00:10:26.480
Things like build, publish, bumping the version.

00:10:27.120 --> 00:10:28.520
And I haven't played with these either.

00:10:28.560 --> 00:10:30.580
All the different ways you can bump a project version.

00:10:30.980 --> 00:10:31.440
That's pretty cool.

00:10:31.560 --> 00:10:32.240
I'll have to play with those.

00:10:33.380 --> 00:10:40.620
things like managing tools like all the tools like uv tool run uv tool install these are these

00:10:40.760 --> 00:11:03.800
were uvx kind of isn't uvx and uv tool the same thing i think yeah no almost uvx will run a tool but then it's like ephemeral it doesn't last where uv tool you install it so you might say uv tool install, I don't know, pytest. And then you permanently have pytest as a thing that you can run.

00:11:04.060 --> 00:11:05.720
But if you just say uvx pytest,

00:11:05.900 --> 00:11:09.680
it'll download, run pytest, and then it'll kind of disappear from your system.

00:11:10.040 --> 00:11:11.280
You know what I mean? Oh, yeah.

00:11:12.240 --> 00:11:13.680
They're similar, but not exactly

00:11:13.690 --> 00:11:15.080
the same. Oh, here it is right here.

00:11:15.920 --> 00:11:19.460
uvx is an alias for uv tool run. There you go. Nice.

00:11:20.220 --> 00:11:23.400
Yeah, it's the uv tool run, but not uv tool install and then run the tool.

00:11:23.710 --> 00:11:25.440
Yeah, that's what it is. Working

00:11:25.530 --> 00:11:44.060
with scripts. UVNet for scripts. And I haven't done this. I guess initialize the script and run it, things like that. Neat. Even, oh, wow, I didn't know you could do this. You can add and remove dependencies within a script. Oh, that's pretty neat. Yeah. And I think it writes the little header,

00:11:44.550 --> 00:11:49.720
the PEP compliant header at the top for you. That's cool. Yeah, I totally, okay. I'm learning

00:11:49.750 --> 00:11:54.140
a lot. I thought it was just a cheat sheet for me, but I'm learning a lot. So this is great.

00:11:54.620 --> 00:12:06.520
And then, of course, if you control which Python versions are installed on your computer using uv, cheat sheet on that list, install, uninstall, things like that.

00:12:07.240 --> 00:12:07.780
So nice.

00:12:08.840 --> 00:12:11.520
I've been using, I didn't think I would.

00:12:11.520 --> 00:12:15.760
I really didn't think I'd be switching to something else to install Python.

00:12:15.880 --> 00:12:23.140
But yeah, I'm especially trying to keep up on new versions with 3.14 and stuff.

00:12:23.800 --> 00:12:24.940
Definitely using uv for that.

00:12:25.760 --> 00:12:31.700
And then a handful of old time stuff, like actually old timers, like uv, VNV, and UVPIP.

00:12:31.920 --> 00:12:33.000
That's where we started.

00:12:33.980 --> 00:12:35.320
And then I love it.

00:12:35.580 --> 00:12:37.220
UV format to run ruff update.

00:12:37.620 --> 00:12:40.040
This is one of the things that I always forget about.

00:12:40.640 --> 00:12:48.400
Well, I remember that it's there, but I forget to do sometimes is if I'm on a different machine I know it has uv, but I haven't updated it for a while.

00:12:48.400 --> 00:12:53.760
And I try something new, like installing a new version of Python, and it doesn't see it.

00:12:53.840 --> 00:12:54.320
What's going on?

00:12:55.360 --> 00:12:58.580
If things don't work, try a uv self-update and work.

00:12:58.820 --> 00:12:59.960
So good cheat sheet.

00:13:00.420 --> 00:13:02.180
Who said cheating will never get you anywhere?

00:13:02.640 --> 00:13:03.460
We learned stuff here.

00:13:03.740 --> 00:13:03.980
Yeah.

00:13:05.040 --> 00:13:05.560
We did.

00:13:05.820 --> 00:13:09.820
Well, speaking of sneaky things, I want to talk about Ducky.

00:13:10.460 --> 00:13:14.480
So Ducky is an open source, all-in-one desktop app built in Python.

00:13:15.020 --> 00:13:20.660
It's designed as the perfect companion for network engineers, students, tech enthusiasts, and others.

00:13:21.120 --> 00:13:23.980
And it combines a bunch of essential networking tools for you.

00:13:24.380 --> 00:13:28.720
Okay, so I have a thing itself and then a bit of a stealth take on this, okay?

00:13:29.120 --> 00:13:32.360
So it has a UI down here, and it does a bunch of different things.

00:13:32.500 --> 00:13:37.860
You can say, I would like to, it actually has a nice SSH client that you can use to connect to things.

00:13:38.000 --> 00:13:43.320
It does Telnet, oh man, bringing back the mud days, serial communication, all different things.

00:13:43.540 --> 00:13:56.740
So if you look at some of the tools, it's got a terminal, kind of like we talked about, but also network queries, subnet calculators, port scanners, topology mappers, like how is my whole enterprise network put together?

00:13:57.200 --> 00:14:02.460
And here's the sneaky bits, vulnerability scanner, password checker, hash calculator, and so on.

00:14:02.760 --> 00:14:05.880
So a lot of cool things you can do in this UI.

00:14:06.460 --> 00:14:07.580
It's Windows only.

00:14:08.180 --> 00:14:17.400
So I think that's turned about as fair play a little bit, Brian, because we talk a lot about Mac tools on here, and I'm going to talk about macOS specifically before the show is over.

00:14:17.660 --> 00:14:21.060
So we don't usually cover some Windows-only tooling, but here we are.

00:14:21.340 --> 00:14:21.580
Yeah.

00:14:21.860 --> 00:14:21.960
Yeah.

00:14:22.500 --> 00:14:23.620
So still pretty good.

00:14:23.740 --> 00:14:26.800
I think this is kind of the thing you might run in like a big company enterprise.

00:14:27.780 --> 00:14:33.440
You know, you want to understand your network topology or search vulnerabilities and things like that, or you just run it in a VM.

00:14:34.100 --> 00:14:34.500
Pretty neat.

00:14:34.800 --> 00:14:35.680
Like I said, open source.

00:14:36.840 --> 00:14:36.960
Yeah.

00:14:37.660 --> 00:14:41.300
So here's the sneaky, not the sneaky, the stealth bonus.

00:14:41.770 --> 00:14:43.720
This is a pretty cool looking desktop app.

00:14:44.040 --> 00:14:45.160
I can go over and download it.

00:14:45.560 --> 00:14:48.620
Let me see if I can zoom back a little bit to get to the releases.

00:14:49.260 --> 00:14:50.120
It's pretty new by the way.

00:14:50.860 --> 00:14:57.860
I can come over here and I can download this and presumably inside there's going to be a.exe that I can run or whatever, right?

00:14:58.220 --> 00:14:59.820
Oh no, it has to install it this way.

00:15:00.000 --> 00:15:01.360
Interesting, it doesn't compile it.

00:15:01.580 --> 00:15:03.060
Oh, it does contain an.exe.

00:15:03.330 --> 00:15:09.940
Yeah, okay, so it does contain.exe or you can install, run it as an entry point script thing in the pipeproject.toml.

00:15:10.100 --> 00:15:12.000
Anyway, so here's part of the stealth thing.

00:15:12.440 --> 00:15:18.060
Ducky.exe application, keep that in mind, as we compare it against an all-in-one desktop app built in Python.

00:15:18.420 --> 00:15:25.080
You don't see too many fully compiled, built, executable desktop apps of any variety these days in Python.

00:15:25.140 --> 00:15:27.300
I know there are some, but not too many, so this is cool.

00:15:27.520 --> 00:15:27.820
Yeah.

00:15:28.420 --> 00:15:32.420
Actually, I don't even remember the last desktop app I installed at all.

00:15:35.080 --> 00:15:35.940
We live in a weird world.

00:15:36.740 --> 00:15:37.720
We do, yeah.

00:15:39.640 --> 00:15:39.980
Yeah.

00:15:40.300 --> 00:15:41.040
Anyway, that's it.

00:15:41.100 --> 00:15:41.980
That's a Ducky.

00:15:42.020 --> 00:15:46.980
I think it's super new, not super popular, but I think a little shining light on something cool.

00:15:47.260 --> 00:15:47.480
Yeah.

00:15:47.760 --> 00:15:47.900
Nice.

00:15:48.260 --> 00:15:48.400
Cool.

00:15:49.500 --> 00:15:50.020
All right.

00:15:50.200 --> 00:15:52.260
Is that it for our things?

00:15:52.860 --> 00:15:53.400
Over to the extras.

00:15:54.480 --> 00:15:54.860
I just have.

00:15:54.860 --> 00:15:55.120
What do you got?

00:15:56.120 --> 00:16:01.820
Normally on extras, we will share something extra that I want to point out and share with people.

00:16:02.180 --> 00:16:05.900
But this time, I guess I'll share one article, but mostly it's a question.

00:16:06.380 --> 00:16:08.780
I'm curious what everyone is using for.

00:16:09.200 --> 00:16:17.260
So I've got I've got a my blog is static site Hugo and I'm currently on Netlify, but I'm like, should I be on Netlify?

00:16:17.640 --> 00:16:20.480
And I I ran across this article from Will Vincent.

00:16:20.840 --> 00:16:24.060
This is moving from Netlify to Cloudflare pages.

00:16:25.100 --> 00:16:28.740
And but that was published in February of last year of 2024.

00:16:29.380 --> 00:16:36.240
So curious if if it's still valid and that totally doesn't look like well, from what I remember well looking like.

00:16:36.260 --> 00:16:37.680
But it's a cool picture anyway.

00:16:38.220 --> 00:16:44.000
Anyway, so he's got an article on converting, and so I might consider Cloudflare.

00:16:44.400 --> 00:16:48.780
But why I'm bringing this up is because Netlify changed their plans a little bit recently.

00:16:49.380 --> 00:16:54.920
And right now, now if you've already there, you're grandfathered in to whatever you had before.

00:16:55.440 --> 00:16:59.020
But if you want to change around, they're doing this credit thing.

00:17:00.350 --> 00:17:08.240
So the free plan, like if I was going to recommend somebody new to blogging, any of these would probably be fine because there's no traffic yet.

00:17:08.270 --> 00:17:17.860
But as traffic grows, and traffic grows weird now because of AI bots and everything, even if there's not that many people reading your site, there might be a ton of bots reading it.

00:17:18.850 --> 00:17:23.640
So that 300 credits turns into like 30 gigabytes per month,

00:17:23.920 --> 00:17:27.439
which you can hit that not too hard.

00:17:28.199 --> 00:17:30.920
If you have a big hero image or something like that.

00:17:31.120 --> 00:17:33.700
Yeah, probably do the images down.

00:17:34.210 --> 00:17:36.240
But stuff gets pulled a lot.

00:17:36.440 --> 00:17:38.300
Anyway, so there's that on Netlify.

00:17:39.800 --> 00:17:43.620
And if you, to go up, it's, you know, nine bucks or 20 bucks.

00:17:43.800 --> 00:17:46.100
None of this is expensive, but it adds up over the year.

00:17:46.760 --> 00:17:47.660
So Netlify's here.

00:17:48.040 --> 00:17:54.480
I did look up, I knew people were, some people were using GitHub Pages, but GitHub Pages has a usage limit as well.

00:17:54.980 --> 00:17:56.800
And I didn't realize this.

00:17:57.500 --> 00:18:58.180
It says it's not intended or allowed to be used as a free web hosting service to run your online business e-commerce site or other website that's primarily directed at either facility and commercial transactions blah blah blah anyway i've got ads on my site so i was like i don't think it would be bad i think that'd be sort of not in line with the terms but also there's 100 gigabyte um soft bandwidth so um that doesn't seem right cloud cloud flagit cloud flare pages um looks like they don't have a band i don't know how they don't but they don't have an a bandwidth limit on the free plan uh which is interesting um and unlimited sites so i might check that out also um also not just because of the cost um even 20 bucks isn't something terrible but the i'm not thrilled with netlify's uh analytics that they present so um and i was just curious if anybody has any other ideas for for what um what you're hosting your static sites on let me know um but you've got

00:18:58.180 --> 00:19:53.280
sites but i'm assuming you're self-hosting those yeah exactly i they were on netlify for a while and i know i had monitoring for all my different sites for a downtime and i started i think i said this before but i noticed that they started having like weird one minute downtimes i'm like that's weird how can a static site reasonably have downtime but no it was quite a bit and so i'm like well how much work would it be to just put it on the same infrastructure that runs python bytes and all the rest right turns out not so much like if you can just git clone your hugo site somewhere and you point nginx at it with the right configuration you now have a it's exactly the same as if it's hosted at one of these places and then update you just run a remote ssh get pull command and then boom you got it's instantly updated so if people want to know how to host hugo or whatever in static sites shoot me a message i'm happy to help i don't necessarily recommend it to everyone because it's you're now, you have a server you got to deal with, right?

00:19:53.470 --> 00:20:00.720
But if you already have a server and already have Nginx doing all the stuff, like it's trivial to just add a config to point at a folder.

00:20:00.960 --> 00:20:01.260
Yeah.

00:20:01.700 --> 00:20:08.140
Yes, that's kind of why I was sort of leaning towards like, you know, what's a hosted thing that's cheap,

00:20:08.480 --> 00:20:09.260
either free or cheap.

00:20:10.160 --> 00:20:16.600
And I hadn't, before I ran across Will's article, I hadn't heard of Cloudflare late.

00:20:16.980 --> 00:20:17.740
I can't say that.

00:20:18.260 --> 00:20:19.140
Cloudflare pages.

00:20:19.860 --> 00:20:20.280
I hadn't either.

00:20:20.600 --> 00:20:23.560
But I wonder if there's others out there that I'm not even noticing.

00:20:23.830 --> 00:20:24.800
So yeah, let me know.

00:20:24.890 --> 00:20:25.100
Very cool.

00:20:25.730 --> 00:20:25.940
Love it.

00:20:26.260 --> 00:20:26.620
All right.

00:20:27.050 --> 00:20:28.440
I have a few extras.

00:20:29.000 --> 00:20:29.180
Okay.

00:20:29.400 --> 00:20:30.980
Of which Ducky is not one.

00:20:31.380 --> 00:20:33.180
So I apologize.

00:20:33.270 --> 00:20:34.880
I can't remember the guy who sent this in.

00:20:35.020 --> 00:20:42.200
But Python Brazil has sort of reached out and said, hey, we could use a little help with funding.

00:20:42.600 --> 00:20:46.380
The PSF had a bunch of funding and grants for different things.

00:20:46.660 --> 00:20:52.660
And there was like a huge spike in how many grants were requested, how many people asked for funding.

00:20:53.160 --> 00:20:58.180
And it burned through the available funds quicker than expected, I think is the short version.

00:20:58.380 --> 00:20:59.660
There's been a bunch written about it.

00:20:59.660 --> 00:21:01.440
And that's probably roughly right.

00:21:02.040 --> 00:21:03.820
Anyway, they said, hey, we could use some help.

00:21:03.860 --> 00:21:05.500
We don't have as much funding as we expected.

00:21:05.980 --> 00:21:13.760
So give us a shout out, if you don't mind, about Python Brazil coming on the 21st to 27th, I believe, in October.

00:21:14.340 --> 00:21:26.440
And if you go to check out and you actually pull up the buy me a ticket, like check out pop up or modal dialogue, whatever it is in there, there's a way to donate a ticket for a student to attend.

00:21:26.840 --> 00:21:30.740
So you can just go there and say, I would like to basically fund a student's attendance.

00:21:31.260 --> 00:21:32.420
So anyway, that's kind of cool.

00:21:32.500 --> 00:21:32.980
Check that out.

00:21:33.260 --> 00:21:35.280
Hopefully the conference goes well for them.

00:21:35.660 --> 00:21:41.940
Next up, Brian, to atone for my sins, I've mentioned a Windows only application, I will speak of macOS.

00:21:43.100 --> 00:21:45.000
So I don't know.

00:21:45.060 --> 00:21:50.600
Have you installed macOS Tahoe or iOS 26, one of these new shiny liquid glass things?

00:21:51.400 --> 00:21:53.200
They're doing it on the desktop also?

00:21:53.520 --> 00:21:54.180
No, I have not.

00:21:54.360 --> 00:21:59.700
My daughter has updated her phone and has been cursing it since she's updated.

00:22:01.360 --> 00:22:01.640
Funny.

00:22:02.100 --> 00:22:03.200
Yeah, so I updated my phone.

00:22:03.220 --> 00:22:13.400
I updated my work computers, but not my streaming computer because the UI stuff with screen recording and all that kind of stuff.

00:22:13.670 --> 00:22:15.120
It can get a little weird.

00:22:15.280 --> 00:22:19.540
So I decided this, the one that you and I are talking on right now is going to stay stable for a little while.

00:22:19.680 --> 00:22:21.740
But the other ones I upgraded, I think it's delightful.

00:22:22.540 --> 00:22:26.160
I know a lot of people like hate change and they're like, it's changed and I don't like it.

00:22:27.000 --> 00:22:30.680
And that may be valid or not valid or whatever, but I think it's great.

00:22:30.860 --> 00:22:31.440
I've been enjoying it.

00:22:32.440 --> 00:22:35.140
So the clear isn't bothering you anymore yet?

00:22:35.620 --> 00:22:36.680
No, nothing is unreadable.

00:22:37.200 --> 00:22:39.100
I don't have it like the full tinted mode.

00:22:39.190 --> 00:22:41.320
I just took the default because it still has color.

00:22:41.560 --> 00:22:46.180
I hate that they drew the color out of it like a vampire sucked the joy out of it or whatever.

00:22:46.560 --> 00:22:49.980
So can you get colors back in your icons if you could get those back?

00:22:50.800 --> 00:22:52.200
They don't even change by default.

00:22:52.290 --> 00:22:55.840
You have to go and select the super clear view if you want that.

00:22:55.970 --> 00:22:56.420
Oh, okay.

00:22:57.100 --> 00:22:58.360
It looks almost exactly the same.

00:22:58.500 --> 00:23:00.600
It's just a little more transparent.

00:23:00.880 --> 00:23:05.100
Like the menu bar across the top, the background is transparent.

00:23:05.480 --> 00:23:08.640
But depending on what your background looks like, it's either fine or not fine.

00:23:08.690 --> 00:23:09.040
I don't know.

00:23:09.070 --> 00:23:10.140
But for mine, it's fine.

00:23:10.430 --> 00:23:11.380
So, yeah, it's okay.

00:23:11.760 --> 00:23:15.100
anyway so i give a i know a lot of people are saying they hate it and i'm like i actually kind

00:23:15.100 --> 00:23:37.580
of i like it i don't mind at all that's great i'm glad that you're happy with your computer thanks i mean there's there's things that i would like to have transparent like for instance um uh if i'm actually usually using a computer or phone not while i'm moving so i don't really need to see what's behind it uh if we could have books be transparent then i could walk around and read it

00:23:37.520 --> 00:23:38.060
Just read.

00:23:38.350 --> 00:23:38.780
That would be cool.

00:23:38.980 --> 00:23:43.740
I remember when the iPhone first came out, there was an app that was basically a messaging app.

00:23:43.790 --> 00:23:45.360
It wasn't iMessage.

00:23:45.780 --> 00:23:47.400
It was some other kind of messaging app.

00:23:47.780 --> 00:23:53.100
But literally the background was the camera view out the front, the back, what is it?

00:23:53.600 --> 00:23:55.040
The camera that looks away from you.

00:23:55.090 --> 00:23:59.040
And so you could hold it and like, you could read your messages and it would show you what you're walking towards.

00:23:59.340 --> 00:24:00.260
Like how messed up is that?

00:24:00.880 --> 00:24:02.020
Well, I think that's great.

00:24:02.190 --> 00:24:11.080
I mean, like actually, if you could do like a panorama side view too, because I'm always weirded out with people crossing a crosswalk while,

00:24:11.460 --> 00:24:13.260
while looking at their phone. And I'm like,

00:24:13.340 --> 00:24:17.180
there's cars and bikes and stuff. You're going to get hit, man. But I know.

00:24:17.180 --> 00:24:18.820
Yeah. Whatever. Kids these days.

00:24:20.640 --> 00:24:24.120
Speaking of a software thing. Also, I'm a hundred percent back to Vivaldi.

00:24:24.180 --> 00:24:27.660
I'm not using Zen anymore. I just, I'm embracing the Vivaldi lifestyle.

00:24:28.200 --> 00:24:28.520
Really?

00:24:28.840 --> 00:24:32.540
Cause this surprises me because Vivaldi has taken a stand against AI.

00:24:33.120 --> 00:24:35.560
So I don't need my browser to do AI.

00:24:36.080 --> 00:24:39.780
I think I actually, you know, you're going to take us down a red hole.

00:24:40.100 --> 00:24:43.400
I hate the AI that is in almost every application.

00:24:43.860 --> 00:24:46.920
You know, my email client has a rewrite this email with AI.

00:24:47.580 --> 00:24:51.140
Gmail has a, would you like to like shorten this or tighten it with AI?

00:24:51.420 --> 00:24:53.040
And I almost always hate what it does.

00:24:53.060 --> 00:24:55.720
It almost always destroys the formatting or something.

00:24:55.960 --> 00:24:57.500
I'm like, Oh my, what is this?

00:24:58.039 --> 00:25:05.700
So I don't, I'm not a huge proponent of everything having AI in it, but going like, I'm going to go to ChatGPT or I'm going to go to, I'm going to go to, I'm

00:25:05.720 --> 00:25:09.360
some AI coding thing, and now I'm using it as a choice.

00:25:09.900 --> 00:25:14.400
That is good, but just having it jammed in really poor implementations everywhere, don't love it.

00:25:14.740 --> 00:25:17.780
Yeah, so they did make a big stand against AI, which is interesting.

00:25:18.120 --> 00:25:18.280
Yeah.

00:25:18.900 --> 00:25:22.220
Okay, I have one more thing left, a quick follow-up here.

00:25:22.740 --> 00:25:25.040
The one thing that didn't work was Alt-Tab.

00:25:25.480 --> 00:25:27.220
Have I given a shout-out to Alt-Tab, Brian?

00:25:27.680 --> 00:25:28.360
Alt-Tab is awesome.

00:25:28.760 --> 00:25:36.940
One of the things that really is a bummer about macOS is you can Command-Tab instead of Alt-Tab, which seems like the same thing, but no, it's not.

00:25:36.980 --> 00:25:45.600
Because if you have, let's say, three browser windows or three editors, and you want to go between editor window one and editor window three, no.

00:25:46.580 --> 00:25:48.060
There's not really a hotkey for that, right?

00:25:48.360 --> 00:25:55.220
Other than like switch to the app and then do like expose all windows and then use your mouse to, you know, it's like really janky.

00:25:55.500 --> 00:25:58.940
So alt tab cycles through windows, not apps, which is really nice.

00:25:59.420 --> 00:26:04.280
So like if I'm already in Vivaldi and we got three windows up, you can cycle through the...

00:26:04.300 --> 00:26:10.820
Yeah, alt tab, you just map it to alt tab, and then alt tab will cycle between the different Vivaldi windows and all the other windows.

00:26:11.200 --> 00:26:12.660
It's like Windows style, not Mac style.

00:26:13.200 --> 00:26:14.440
And it's open source and free.

00:26:14.520 --> 00:26:14.840
It's pretty nice.

00:26:15.200 --> 00:26:15.360
Okay.

00:26:15.580 --> 00:26:19.320
Okay, before we hit our joke, I just want to, why will this not go?

00:26:19.460 --> 00:26:19.720
There we go.

00:26:20.800 --> 00:26:24.360
James C on the audience asks, what about GitHub Pages as an option for your static site?

00:26:24.500 --> 00:26:26.940
You pointed out that there's some limitations you don't like, right?

00:26:27.120 --> 00:26:29.100
I sort of flew by it, and I already did.

00:26:29.420 --> 00:26:31.640
I can't go to my screen because I already deleted it.

00:26:32.000 --> 00:26:37.520
But the gist of it is I'm actually doing decent traffic, so I'm already hit.

00:26:37.700 --> 00:26:39.560
I'm close to the 100 gigabyte.

00:26:40.540 --> 00:26:43.280
And they said that GitHub page is as close to 100.

00:26:43.580 --> 00:26:45.740
They have a soft 100 gigabyte limit.

00:26:46.080 --> 00:26:49.260
And I've already taken all the big stuff off.

00:26:49.400 --> 00:26:52.220
It's just a lot of, I think it's a lot of AI bots.

00:26:53.000 --> 00:26:55.000
And I decided to not turn that off.

00:26:55.540 --> 00:27:06.860
But the other thing is it says they really don't want it to be for free web hosting for anything commercial or even like pseudo related to commercial.

00:27:07.300 --> 00:27:12.760
And so I, in the spirit of that, I don't want, I'm not afraid of getting in trouble.

00:27:12.870 --> 00:27:15.640
I just don't think it's right for me to take advantage of it.

00:27:15.690 --> 00:27:24.260
If I'm promoting my courses, promoting my book and stuff and on there, it just doesn't seem like in the spirit of what Gahead Pages was for.

00:27:24.420 --> 00:27:25.560
So there's that.

00:27:26.240 --> 00:27:38.080
However, you're right that when I started the story of recommending other people start a blog, totally GitHub Pages is going to be one of those because you're just writing a blog like in college or something.

00:27:38.520 --> 00:27:39.700
Probably not a commercial entity.

00:27:40.900 --> 00:27:42.040
And that's totally valid.

00:27:42.840 --> 00:27:46.920
Just remember the admonishment we gave a few weeks ago.

00:27:47.340 --> 00:27:48.240
Use your own domain.

00:27:49.140 --> 00:27:53.220
If you want to move, you need to be able to move by remapping your DNS.

00:27:53.500 --> 00:27:57.220
If you're at, you know, Michael at githubpages.com or whatever, right?

00:27:57.300 --> 00:28:00.000
Or github.io, like you're stuck forever.

00:28:00.560 --> 00:28:00.740
Yeah.

00:28:01.040 --> 00:28:01.880
But then you'll, yes.

00:28:02.140 --> 00:28:06.580
And you'll get to the joy of now you have to get to learn how DNS settings.

00:28:07.600 --> 00:28:08.920
But, you know, you shouldn't anyway.

00:28:08.960 --> 00:28:09.420
You'll figure it out.

00:28:10.960 --> 00:28:11.040
Yeah.

00:28:11.140 --> 00:28:14.520
By the way, my self-hosting comes with free four terabytes of traffic.

00:28:15.020 --> 00:28:20.080
And like if you're a DigitalOcean or Hetzner, usually even the cheapest server comes with a terabyte of free traffic.

00:28:20.260 --> 00:28:21.160
I think the $4 version.

00:28:21.600 --> 00:28:22.440
Well, maybe.

00:28:22.660 --> 00:28:25.260
Maybe I'll set up a $4 Hetzner box or something.

00:28:25.750 --> 00:28:26.300
Yeah, exactly.

00:28:26.440 --> 00:28:26.700
You could.

00:28:26.980 --> 00:28:27.960
I'm happy to help if you want.

00:28:28.080 --> 00:28:28.280
All right.

00:28:28.680 --> 00:28:30.940
Are you ready for a joke to wrap this thing up?

00:28:31.120 --> 00:28:31.320
Okay.

00:28:31.910 --> 00:28:33.460
So I'm going to recommend a YouTube video.

00:28:33.560 --> 00:28:38.640
I know a lot of times I tell straight jokes, but I feel like this one is catching the zeitgeist a little bit.

00:28:39.960 --> 00:28:43.060
I think with a certain group of people, this is really going to resonate.

00:28:43.420 --> 00:28:44.540
Are you looking for a job?

00:28:44.920 --> 00:28:46.840
Have you looked for a job five years ago?

00:28:47.040 --> 00:28:50.920
And then now, well, check out Kai Lintitz.

00:28:52.040 --> 00:28:54.560
hiring in 2025 versus 2021.

00:28:54.860 --> 00:28:56.740
This is the programmers are human guy.

00:28:57.680 --> 00:29:10.420
The interview with the Emacs expert guy, the job at senior JavaScript developer, and perhaps his best video is the senior engineer tries AI coding.

00:29:10.860 --> 00:29:12.400
But this is really, really funny.

00:29:12.600 --> 00:29:20.240
It's sort of like contrast, like the position that we all used to be in, whereas you could just dictate whatever terms you want in 2021.

00:29:20.680 --> 00:29:25.380
people are desperate to hire anyone, you know, and then what it's like now.

00:29:27.540 --> 00:29:32.500
They make the guy create like a foundational LLM model blindfolded.

00:29:33.940 --> 00:29:35.060
But here, I'll give you some of the quotes.

00:29:35.080 --> 00:29:36.540
In 2021, these are some of the quotes.

00:29:37.360 --> 00:29:39.860
Do you have an in-house kombucha sommelier?

00:29:41.960 --> 00:29:43.760
What country did he study in?

00:29:45.400 --> 00:29:46.260
Oh, yes, we actually have two.

00:29:47.160 --> 00:29:51.060
And then it's like, let's talk about, this is the guy being hired, right?

00:29:51.120 --> 00:29:52.080
Let's talk about pets.

00:29:52.340 --> 00:29:53.460
Are you donkey friendly?

00:29:53.620 --> 00:29:55.380
And the guy starts to laugh like, oh yeah, whatever.

00:29:55.540 --> 00:29:56.980
He's like, oh no, you think this is a joke?

00:29:57.140 --> 00:29:59.220
He's like, oh, well, we can work on donkeys.

00:29:59.400 --> 00:29:59.720
Yeah, it's okay.

00:30:01.980 --> 00:30:06.380
And then 2025 is like round eight of seven for the interviews, right?

00:30:07.620 --> 00:30:15.340
And he's like, the guy starts screaming at the guy being interviewed, out of 12,000 resumes, the AI picked yours, prove that you're worthy.

00:30:17.820 --> 00:30:20.560
you solve it with the binary tree, build me a foundational model.

00:30:20.690 --> 00:30:23.060
And then eventually he asked about healthcare. He goes, healthcare,

00:30:23.340 --> 00:30:27.700
what do you want to live forever? So good. Oh, that's bad. Yeah.

00:30:28.130 --> 00:30:31.760
So if you want to just live, live in the moment a little bit, I think,

00:30:32.010 --> 00:30:37.580
here we go. So yeah, in, in 20, so pre 2019, I guess.

00:30:38.000 --> 00:30:57.460
So pre pandemic are we, it's been since there's not enough people always in the office to, to support it now but before the pandemic we had uh two flavors of kombucha on tap uh chilled um it was like a like a mini keg thing but it's kombucha it was it was a thing um incredible

00:30:58.080 --> 00:31:04.660
and uh where did your sommelier study no we just like it's portland there's like it's just

00:31:05.360 --> 00:31:06.640
I know, I know, I know.

00:31:08.940 --> 00:31:12.520
The one, this is a related AI in 2025.

00:31:14.620 --> 00:31:17.620
My daughter, she's a junior in high school.

00:31:17.790 --> 00:31:22.840
And she had to, for one of her classes, she had to interview me, interview one of her parents.

00:31:23.180 --> 00:31:23.820
So she interviewed me.

00:31:24.750 --> 00:31:26.980
And she was starting to type it in on her phone.

00:31:27.050 --> 00:31:28.460
And I'm like, don't do that.

00:31:28.640 --> 00:31:29.900
Just email me the questions.

00:31:30.420 --> 00:31:31.600
So she emailed me the questions.

00:31:31.980 --> 00:31:37.640
And I just sat there and talked with her about what I was saying, but I typed it back because I type way faster than she does.

00:31:37.970 --> 00:31:43.000
Although it's bizarre that she can type with her thumbs faster than she can or on a keyboard.

00:31:43.300 --> 00:31:46.140
But yeah, send it back, turned it in.

00:31:46.520 --> 00:31:57.960
But she had to convince her teacher that it was OK that she pasted it in because apparently there were so many kids that actually didn't want to actually interview their parents that they just had chat.

00:31:58.020 --> 00:32:08.020
They like told ChatGPT what their parents were like and had the, the, or whatever the AI system, AI bots, they interviewed a bot instead of their parents.

00:32:08.500 --> 00:32:13.400
And, and so the teacher turned off paste in the, in the homework assignment.

00:32:13.560 --> 00:32:15.660
So they can't, you can't paste in the answer anymore.

00:32:16.900 --> 00:32:17.780
Oh, how bad.

00:32:17.880 --> 00:32:31.300
I mean, I do not envy the education world, educational world with regard to AI, because, you know, it's so easy to say, And here, let me just paste the homework question and requirements in.

00:32:31.380 --> 00:32:31.800
I'll do that.

00:32:31.960 --> 00:32:32.700
You know, it's crazy.

00:32:33.220 --> 00:32:34.980
But this was like, there's no wrong answer.

00:32:35.080 --> 00:32:39.220
It was like, it was easier, just easier than talking to your family.

00:32:40.300 --> 00:32:40.800
But yeah.

00:32:41.280 --> 00:32:41.380
Yeah.

00:32:41.520 --> 00:32:41.840
That's crazy.

00:32:43.820 --> 00:32:44.020
Anyway.

00:32:44.240 --> 00:32:44.500
All right.

00:32:44.740 --> 00:32:45.300
Yeah, that's cool.

00:32:46.120 --> 00:32:47.200
Well, good one again.

00:32:47.680 --> 00:32:47.780
Thanks.

00:32:48.180 --> 00:32:50.340
I'll have to watch that hiring video.

00:32:50.660 --> 00:32:51.340
Oh, it's really good.

00:32:51.620 --> 00:32:52.060
It's really good.

00:32:52.220 --> 00:32:52.720
People check it out.

00:32:52.820 --> 00:32:53.560
I'll put it in the show notes.

00:32:53.880 --> 00:32:54.180
Bye, everyone.

