WEBVTT

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

00:00:04.940 --> 00:00:11.460
to your earbuds. This is episode 440, recorded July 15th, 2025. I am Michael Kennedy.

00:00:11.730 --> 00:00:12.620
And I am Brian Okken.

00:00:12.880 --> 00:00:18.940
And this episode is brought to you by Propel Auth. I'm going to tell you more about them later, but

00:00:19.120 --> 00:00:23.940
make Auth easy for your app and don't spend time on things that are not your core

00:00:24.510 --> 00:00:29.540
value proposition. Get Auth by your apps with them. Links to the top of your podcast player show notes.

00:00:29.900 --> 00:00:33.780
if you want to connect with us brian i don't even know where people should connect with us anymore

00:00:34.280 --> 00:00:41.260
we're on mastodon we're on blue sky we're here on youtube people can comment on the youtube channel

00:00:41.620 --> 00:00:45.660
on the youtube video that actually is a place that a lot of the feedback happens so any of those

00:00:45.860 --> 00:00:52.519
places and if you want to be part of the live show pythonbytes.fm live usually mondays at 10 a.m

00:00:52.800 --> 00:00:56.860
Today, we're 25 hours later, I guess.

00:00:56.890 --> 00:00:57.320
I don't know.

00:00:57.840 --> 00:01:01.880
Tuesday, because sometimes life intervenes, but generally Monday at 10 a.m.

00:01:02.180 --> 00:01:07.700
And if you want a really nice summary and a little bit of extra information around the

00:01:07.850 --> 00:01:12.700
episode, not just a rehash of the show notes, but something different, be sure to sign up

00:01:13.180 --> 00:01:14.360
for the Friends of the Show.

00:01:14.520 --> 00:01:17.540
Just visit pythonbytes.fm, newsletter button right in the front.

00:01:17.940 --> 00:01:18.420
Enter your email.

00:01:18.780 --> 00:01:19.460
We'll treat it kindly.

00:01:19.950 --> 00:01:21.280
We won't share it or sell it.

00:01:21.360 --> 00:01:23.540
But we will send you cool stuff.

00:01:24.220 --> 00:01:25.180
Brian puts together for you.

00:01:25.940 --> 00:01:27.040
Speaking of cool things, Brian,

00:01:27.600 --> 00:01:29.440
let's switch over to you and see what we're talking about.

00:01:29.860 --> 00:01:30.020
Okay.

00:01:30.270 --> 00:01:32.660
Well, I want to, let's see.

00:01:32.840 --> 00:01:34.720
First, I want to add something to the screen.

00:01:34.880 --> 00:01:35.220
How do I do?

00:01:36.180 --> 00:01:36.580
There we go.

00:01:37.840 --> 00:01:40.120
I want to bring up a rehash an old episode.

00:01:40.840 --> 00:01:44.320
So in episode 438, so just a couple episodes ago,

00:01:44.860 --> 00:01:49.320
one of the things we talked about was I talked about Durinv.

00:01:50.180 --> 00:01:50.780
Where was that at?

00:01:51.020 --> 00:01:57.000
there's a lot of stuff on the show notes. Anyway, my CLI world from Frank Wiles. And one of the

00:01:57.080 --> 00:02:01.720
things was during and, and so I've been thinking about it also while we're here, I'll

00:02:01.720 --> 00:02:07.340
just go ahead and show people that, you can see the stuff, cool stuff like my book, your course

00:02:07.720 --> 00:02:12.680
and, where do people subscribe again? people subscribe right at the top. Oh,

00:02:13.060 --> 00:02:17.380
be part of the live show and scroll down and there's, newsletter right there.

00:02:17.420 --> 00:02:27.340
Anyway, so I wanted to talk about the dir env a little bit again, and I think I may have said what it's not before.

00:02:27.850 --> 00:02:31.140
So dir env is just a tool.

00:02:31.290 --> 00:02:33.140
It says unclutter your.profile.

00:02:33.500 --> 00:02:46.920
And the main thing people use it for is these.envrc files or optionally.env files that basically use that to load up environmental variables when you go into a directory.

00:02:47.340 --> 00:02:48.920
That's really mostly it.

00:02:49.580 --> 00:02:54.000
But in Python world, we use that also to do other work.

00:02:54.380 --> 00:02:56.920
I guess everybody else uses it to do other work as well.

00:02:57.400 --> 00:03:01.440
But one of the things we do is invoke virtual environments when you go in.

00:03:01.720 --> 00:03:04.940
And that's really what I'll be using it for.

00:03:05.460 --> 00:03:09.140
So I really want to talk about, where is this?

00:03:09.740 --> 00:03:10.300
Trey Hunters.

00:03:11.880 --> 00:03:12.620
There it is.

00:03:13.400 --> 00:03:18.000
Trey Hunter's blog post called, and this is an older one from, oh, not too old, last year,

00:03:18.600 --> 00:03:24.180
switching from virtual inv wrapper to Durinv, Starship, and uv. Well, I don't really care about

00:03:24.280 --> 00:03:30.160
the from virtual inv wrapper because I didn't use it before. So I'm thinking this is just switching

00:03:30.360 --> 00:03:39.279
to Durinv and uv. And when reading this, and I can't remember who brought this up, but when

00:03:39.300 --> 00:03:44.480
reading this, it brings up a lot of the things that I didn't like about DuraEnv the first time I

00:03:44.620 --> 00:03:49.480
tried it. And Trey fixes all of those things. So let's look at a few of the things that he fixes.

00:03:50.040 --> 00:03:56.740
So he does talk about making it work with ZShell. I've made it work with Bash as well. So it works

00:03:56.940 --> 00:04:02.880
fine with most of the, at least all the Linux type shells that I've used. So the first off,

00:04:03.270 --> 00:04:08.239
the default doesn't show you the virtual environment prompt because DuraEnv doesn't

00:04:08.260 --> 00:04:10.400
allow you to modify the shell prompt.

00:04:10.960 --> 00:04:12.800
So how do you get around that?

00:04:13.640 --> 00:04:21.840
And there's just a short script that Trey wrote to put in your zshellrc or in your bashrc

00:04:21.910 --> 00:04:22.100
file.

00:04:22.460 --> 00:04:25.640
And then now your prompt is back where it shows your virtual environment.

00:04:25.710 --> 00:04:26.240
So that's cool.

00:04:26.520 --> 00:04:32.220
Also, apparently the default is to put the virtual environments replaced in a different

00:04:32.480 --> 00:04:35.080
directory, like a.durinv Python 312.

00:04:35.700 --> 00:04:38.800
And that's not, I mean, I don't know about most people,

00:04:39.100 --> 00:04:41.900
but at least me, I've always just stuck my virtual environment

00:04:42.120 --> 00:04:44.040
right in the project directory that I'm working on.

00:04:44.280 --> 00:04:47.540
So he has some switches for that.

00:04:47.860 --> 00:04:50.240
Also, Durinv, when you enter and exit,

00:04:50.640 --> 00:04:53.700
it is very verbose about telling you that it's loading stuff.

00:04:53.960 --> 00:04:56.320
You can turn that off, shows you how to turn that off.

00:04:56.680 --> 00:05:00.400
And then that's just the Durinv setup.

00:05:01.740 --> 00:05:03.940
And he's with virtual environments,

00:05:04.480 --> 00:05:08.460
but he's set it up with uv next.

00:05:08.690 --> 00:05:13.160
So after that, it's uv and showing how to use all of this with uv.

00:05:13.690 --> 00:05:16.440
The thing that I think is kind of one of the things I wanted to point out

00:05:16.620 --> 00:05:18.820
that's pretty cool that I don't know if we've talked about

00:05:19.220 --> 00:05:21.340
is when you're creating a virtual environment with uv,

00:05:21.790 --> 00:05:25.200
you don't get pip with it because you're going to use

00:05:26.740 --> 00:05:28.880
UV pip install instead of pip install.

00:05:29.210 --> 00:05:33.680
However, some tools, some extra tools need it to be there for some reason.

00:05:34.200 --> 00:05:39.360
And so you can say --seed, which it probably does other stuff too, but it adds

00:05:39.540 --> 00:05:40.560
pip to your virtual environment.

00:05:41.020 --> 00:05:43.980
So it'd be kind of cool if it just said --pip or something.

00:05:44.140 --> 00:05:44.780
Seed works.

00:05:45.350 --> 00:05:46.140
You just have to know that.

00:05:46.300 --> 00:05:49.680
Anyway, that's as far as I'm going to get so far.

00:05:50.140 --> 00:05:51.680
He's also talking about Starship.

00:05:51.960 --> 00:05:57.440
And I guess I think I will follow the Starship tutorial too, because one of the things I like

00:05:57.580 --> 00:06:00.620
is he is, he likes, he teaches people a lot.

00:06:00.800 --> 00:06:05.900
So he doesn't want his shell prompt to be too crazy.

00:06:07.400 --> 00:06:12.280
And so he's going to have a fairly boring Starship configuration.

00:06:13.020 --> 00:06:16.160
And I'm glad because I'd like to see how to do it boring first

00:06:16.580 --> 00:06:18.580
and then look at his other stuff.

00:06:18.720 --> 00:06:19.940
Yeah, those things can be overwhelming.

00:06:20.440 --> 00:06:23.240
But I really like having some of these things,

00:06:23.390 --> 00:06:25.940
like a prompt that shows you which virtual environment is active,

00:06:26.460 --> 00:06:28.060
which version of Python you're using.

00:06:28.940 --> 00:06:29.760
It's really neat.

00:06:29.980 --> 00:06:30.120
Yeah.

00:06:30.500 --> 00:06:34.120
Yeah, anyway, so if you've tried Durinvib before and it sort of annoyed you,

00:06:34.870 --> 00:06:36.660
maybe this tutorial might be for you.

00:06:37.180 --> 00:06:38.640
It might be for me as well.

00:06:38.650 --> 00:06:40.280
I haven't, I'm not entirely sure.

00:06:40.480 --> 00:06:44.900
I recently updated, I used all my zshell plus warp,

00:06:45.560 --> 00:06:48.040
which warp is a super cool terminal thing.

00:06:48.220 --> 00:06:52.340
And for some reason, things weren't working quite the way that I was expecting.

00:06:52.980 --> 00:06:58.000
And with some of my Python virtual environment stuff installed versus system Python,

00:06:58.300 --> 00:06:59.400
That was really, it was odd.

00:06:59.400 --> 00:07:01.620
I think I was running pytest from the wrong place

00:07:01.690 --> 00:07:02.440
or something like that.

00:07:02.450 --> 00:07:03.360
And it was driving me nuts.

00:07:03.390 --> 00:07:04.640
And I didn't realize, I don't know,

00:07:04.700 --> 00:07:08.040
I think I had pytest extensions installed into,

00:07:08.320 --> 00:07:10.800
plugins installed into a different place

00:07:10.910 --> 00:07:11.880
than I was trying to run it from.

00:07:12.160 --> 00:07:13.080
And that was the challenge.

00:07:13.640 --> 00:07:16.080
But I recently added to my profile,

00:07:16.340 --> 00:07:17.920
this thing will automatically activate

00:07:18.730 --> 00:07:20.480
virtual environments if you go into a place

00:07:20.620 --> 00:07:22.080
that's got somewhere in the directory tree

00:07:22.080 --> 00:07:22.760
of virtual environment.

00:07:23.240 --> 00:07:25.040
And if you CD out of it,

00:07:25.080 --> 00:07:26.460
it'll automatically deactivate it,

00:07:26.580 --> 00:07:27.980
which is pretty dirty and V,

00:07:28.140 --> 00:07:31.400
But I ended up doing that just with like a simple bash function.

00:07:31.680 --> 00:07:31.880
Cool.

00:07:32.220 --> 00:07:36.840
So anyway, I, however you go about it, I totally, totally recommend it because I

00:07:36.920 --> 00:07:41.200
can see here exactly all the git status, all the, you know, the branch, everything.

00:07:41.340 --> 00:07:41.780
It's great.

00:07:42.460 --> 00:07:43.380
That's not what I want to talk about.

00:07:43.460 --> 00:07:44.700
That was just a fun little follow up.

00:07:44.940 --> 00:07:49.780
what I want to talk about something from them Lou and they say, Hey there,

00:07:50.280 --> 00:07:52.180
here's a cool topic for Python.

00:07:52.700 --> 00:07:56.759
So we've all heard of SQLite and almost all of us have SQLite

00:07:56.780 --> 00:08:01.860
installed knowingly or unknowingly because Python itself ships with SQLite.

00:08:02.340 --> 00:08:05.120
It builds itself as the world's most popular database.

00:08:05.720 --> 00:08:08.640
I think Excel might be the world's most popular database, but you know,

00:08:08.900 --> 00:08:09.500
pretty close, right?

00:08:09.820 --> 00:08:09.940
Yeah.

00:08:10.260 --> 00:08:15.500
They can, they're definitely Titans, but the story you're told is I'm

00:08:15.620 --> 00:08:20.980
using SQLite for development or like a local storage, like a local settings

00:08:21.300 --> 00:08:23.820
file for an app, but it's not appropriate for production.

00:08:24.180 --> 00:08:31.060
This thing I'm about to talk about called RQL Lite instead of SQL Lite is pretty neat.

00:08:31.420 --> 00:08:34.900
And that's what Demi recommended, distributed SQL Lite.

00:08:35.320 --> 00:08:36.479
Written and go, but who cares?

00:08:36.539 --> 00:08:38.120
You can use it however you want, right?

00:08:38.999 --> 00:08:42.719
So come down here and let me open up their main website here.

00:08:44.919 --> 00:08:46.280
So rqlite.io.

00:08:46.660 --> 00:08:48.640
And if you go over here, you can see that it's got a couple of things.

00:08:49.000 --> 00:08:52.160
Vault tolerance, high availability, SQL Lite.

00:08:52.400 --> 00:08:53.380
How crazy is that?

00:08:53.900 --> 00:09:00.240
So basically what it is, is it's a data access layer on top of SQLite, but it also sets up

00:09:00.900 --> 00:09:04.440
distributed, a distributed version of SQLite with replication.

00:09:05.000 --> 00:09:05.660
Oh, wow.

00:09:06.540 --> 00:09:07.520
Isn't that crazy?

00:09:07.880 --> 00:09:08.700
Yeah, that's awesome.

00:09:09.360 --> 00:09:10.580
Yeah, I think it's super cool.

00:09:11.030 --> 00:09:17.120
So yeah, replacing Postgres with RQLite has simplified the software we ship to customers,

00:09:17.680 --> 00:09:18.520
says Mark Campbell.

00:09:18.900 --> 00:09:20.680
Yeah, so you come in there and see some of the things it does.

00:09:20.840 --> 00:09:27.440
deploy in seconds, nothing complex to run. And then it gives you basically an HTTP API to talk

00:09:27.560 --> 00:09:31.940
to the database because it might live somewhere else in a cluster, right? But that really routes

00:09:32.030 --> 00:09:37.080
just internally to SQLite and it integrates with Docker Kubernetes super easily. Full text search,

00:09:37.620 --> 00:09:43.640
vector search, JSON documents, lots of different things. So if you up here to, I think getting

00:09:44.060 --> 00:09:49.660
started, you got quick start. Yeah. It talks about you just, there's different ways you can install it.

00:09:49.720 --> 00:09:54.940
You could brew install the thing, or this is the way I've been doing all of my database servers

00:09:55.220 --> 00:10:03.020
lately, all my server type things, you know, Nginx, MongoDB, et cetera, Postgres is to just run a

00:10:03.230 --> 00:10:07.860
local version using Docker. So I don't have to install it or have it mess with my machine. So

00:10:07.930 --> 00:10:12.420
instead of brew install, I would just Docker run this thing and give it a volume and it's good to

00:10:12.500 --> 00:10:16.859
go, right? Persistent volume. So you don't lose the data. And then you just talk to it a lot like

00:10:16.920 --> 00:10:23.080
SQLite, but you can create a cluster of them, which is what's wild. And in the example they show,

00:10:23.220 --> 00:10:27.160
it's like, look, this is all local hosts, but you probably would set them up to be running

00:10:27.670 --> 00:10:34.520
in different places, which is, it's pretty wild. So you also have got like all the rules around

00:10:35.220 --> 00:10:39.300
eventual versus strong consistency and everything you do with clusters. So they've got a nice little

00:10:39.410 --> 00:10:43.980
write-up on trade-offs you can make for like reliability, performance, staleness, et cetera,

00:10:44.440 --> 00:10:46.460
client libraries, Python ones,

00:10:47.460 --> 00:10:50.100
IRQL, RQ Lite, and so on.

00:10:50.480 --> 00:10:51.280
One for SQLAlchemy.

00:10:51.860 --> 00:10:52.800
Yeah, a lot of neat stuff here.

00:10:52.800 --> 00:10:55.900
If you're looking for a distributed database

00:10:56.700 --> 00:10:57.720
and you're using SQL Lite,

00:10:57.850 --> 00:10:58.940
I think people should look at this.

00:10:59.300 --> 00:11:01.880
And thanks to them, Lou, for sending this in.

00:11:02.100 --> 00:11:04.600
Actually, a hook into the SQLAlchemy

00:11:05.040 --> 00:11:06.620
to RQ Lite is pretty cool.

00:11:07.260 --> 00:11:08.680
Yeah, it's pretty neat.

00:11:09.280 --> 00:11:10.780
Yeah, you got read-only nodes

00:11:10.850 --> 00:11:12.160
and all sorts of different things

00:11:12.270 --> 00:11:13.700
about how you can set up the clusters.

00:11:13.920 --> 00:11:15.420
You don't have to do clusters, by the way,

00:11:15.490 --> 00:11:17.580
if you want to just run a single instance of it,

00:11:17.590 --> 00:11:18.760
it says plenty of people do that.

00:11:19.210 --> 00:11:21.060
But if you want to have like the fault tolerance,

00:11:21.360 --> 00:11:23.200
high availability, then, you know, set up a cluster.

00:11:23.520 --> 00:11:24.200
Cool. Neat.

00:11:25.240 --> 00:11:26.000
Do you know what else is awesome?

00:11:26.400 --> 00:11:27.840
I would guess that it's our sponsor.

00:11:28.380 --> 00:11:29.760
Yes. PropelAuth.

00:11:29.990 --> 00:11:31.860
This episode is sponsored by PropelAuth.

00:11:32.420 --> 00:11:34.760
PropelAuth is the easiest way to turn authentication

00:11:35.380 --> 00:11:36.020
into your advantage.

00:11:36.560 --> 00:11:37.760
For B2B SaaS companies,

00:11:38.160 --> 00:11:39.980
great authentication is non-negotiable,

00:11:40.250 --> 00:11:41.300
but it can often be a hassle.

00:11:41.640 --> 00:11:43.600
With PropelAuth, it's more than just functional.

00:11:43.680 --> 00:11:50.000
it's powerful. PropelAuth comes with tools like managed UIs, enterprise SSO, robust user management

00:11:50.280 --> 00:11:56.120
features, and actionable insights. As your product grows, PropelAuth adapts with it, supporting more

00:11:56.300 --> 00:12:01.800
advanced authentication features. And the best part, PropelAuth has native support for major

00:12:02.000 --> 00:12:06.860
Python libraries like FastAPI, Flask, and Django. You can easily integrate them into your product.

00:12:07.300 --> 00:12:12.699
When auth is effortless, your team can focus on scaling, not troubleshooting. That means more

00:12:12.720 --> 00:12:17.560
releases, happier customers, and more growth for your business. Check them out to get started today.

00:12:17.790 --> 00:12:23.180
The link is in your podcast player show notes. It's a clickable chapter URL as you're hearing

00:12:23.210 --> 00:12:28.820
this segment, and it's at the top of the episode page at pythonbytes.fm. Thank you to PropelAuth

00:12:28.850 --> 00:12:34.120
for supporting Python Bytes. Yes, definitely. Thank you. Thank you. Now, Brian, I feel like I've

00:12:34.860 --> 00:12:40.719
snuck this one out from under you, this next one I want to talk about. Okay. We have a Python

00:12:40.720 --> 00:12:45.200
dictionary that can report which keys you used and which ones you did not use.

00:12:45.840 --> 00:12:47.240
Why do I feel like I got this from you?

00:12:47.260 --> 00:12:49.280
This is like perfect for testing.

00:12:50.060 --> 00:12:50.420
Okay.

00:12:51.000 --> 00:12:58.400
So imagine I'm working with an API or some kind of data reporting library and you send it some

00:12:58.580 --> 00:12:59.740
kind of dictionary, right?

00:13:00.060 --> 00:13:04.480
And you want to make sure, like, I want to make sure that it uses these three important pieces

00:13:04.560 --> 00:13:07.000
of information that are contained in the dictionary.

00:13:07.520 --> 00:13:12.620
and if you run your code run either through a test or however you want to but probably through a test

00:13:12.980 --> 00:13:17.620
then you could ask which keys were used and which ones were not used and if one you're like nope

00:13:17.900 --> 00:13:21.700
it's really important that they take this piece of information into account and you see that it's not

00:13:21.780 --> 00:13:27.440
used well that's a pretty big hint that something's going on and you might say like we'll just mock it

00:13:27.600 --> 00:13:33.139
out and we can check but it's not that the function is called it's that the function is called with a

00:13:33.140 --> 00:13:38.860
certain combination of different parameters over time, which I think is where it gets tricky,

00:13:39.040 --> 00:13:43.920
right? It's not like get item was called or get is called. It's that get was called with these

00:13:44.100 --> 00:13:47.880
seven values, but not this eighth value, right? And that's kind of like where I think this has,

00:13:48.260 --> 00:13:54.180
at least as far as I know, kind of a unique idea. Yeah, that's pretty neat. Now, what I'm pointing

00:13:54.400 --> 00:14:02.079
at is this blog post by Peter Bankson, and it's very nice, but it's also very short. And it's not

00:14:02.120 --> 00:14:08.480
like exactly a python package you just uv pip install and then run with it instead it's more of

00:14:08.640 --> 00:14:14.900
just a simple little dictionary that people wrote and then you can just access like what keys were

00:14:14.960 --> 00:14:21.460
accessed which keys were not accessed and it's got some sweet uh step operations for that right like

00:14:21.620 --> 00:14:25.600
the difference of a set and so on yeah so you might want to you might want to extend this a

00:14:25.600 --> 00:14:30.319
little bit right like copy this in for example one of the things they note um and there's some nice

00:14:30.340 --> 00:14:34.800
comment the comment conversation at the bottom one of the things missing is this works for square

00:14:34.940 --> 00:14:41.100
bracket access which calls dunder get item but not dot get access but you know what if you look at

00:14:41.180 --> 00:14:46.500
the way that get item is implemented and you rewrite the one that does get i'll tell you what

00:14:46.740 --> 00:14:51.300
it's like three lines of code and it's super easy right like there's it basically just captures a key

00:14:51.480 --> 00:14:57.599
that was used into a set and then delegates to the underlying dictionary implementation so there's

00:14:57.620 --> 00:14:58.560
not a lot going on there.

00:14:58.900 --> 00:14:59.020
Right.

00:14:59.580 --> 00:15:00.540
So you can add that out.

00:15:00.780 --> 00:15:03.920
Another thing that's nice is, there was a conversation about what would this

00:15:03.950 --> 00:15:06.660
look like if it was a typed tracking dictionary?

00:15:07.780 --> 00:15:12.240
And so, someone in the comments provided a, a typed version with

00:15:12.680 --> 00:15:13.400
multiple generics.

00:15:13.540 --> 00:15:13.900
How about that?

00:15:14.200 --> 00:15:14.460
Okay.

00:15:14.900 --> 00:15:15.400
Yeah, sure.

00:15:15.520 --> 00:15:15.620
Yeah.

00:15:16.190 --> 00:15:16.320
Yeah.

00:15:16.460 --> 00:15:21.020
So I think, you would definitely want to add the dot get function to this, but

00:15:21.100 --> 00:15:24.040
like I said, just, it's like three lines of Python and it's not hard.

00:15:24.760 --> 00:15:25.800
So check that out.

00:15:25.900 --> 00:15:28.000
But yeah, I think this is a neat idea.

00:15:28.560 --> 00:15:33.120
If you're looking to test how a dictionary is being used on a key by key basis.

00:15:33.620 --> 00:15:38.040
Yeah, it seems like it's ripe for a small tracking dictionary package.

00:15:38.540 --> 00:15:39.060
Yeah, exactly.

00:15:39.320 --> 00:15:44.760
I think this is going to be like a sweet kernel of an idea for somebody who wants to put something on PyPI.

00:15:44.860 --> 00:15:45.980
And I put this in the show notes.

00:15:46.380 --> 00:15:48.400
Maybe someone wants to polish it up and put it on PyPI.

00:15:48.720 --> 00:15:49.560
That person is not me.

00:15:52.880 --> 00:15:53.460
Yeah, yeah.

00:15:53.720 --> 00:15:54.920
Or me, that person is Brian.

00:15:55.500 --> 00:15:58.100
Exactly. I don't, but maybe someone else does.

00:15:58.300 --> 00:15:59.180
Yeah. Okay.

00:15:59.800 --> 00:16:02.640
Well, we are streaming this episode,

00:16:03.220 --> 00:16:06.640
and I would also like to talk about streaming Markdown.

00:16:08.040 --> 00:16:09.220
It's a transition there. Yeah.

00:16:10.000 --> 00:16:15.440
Anyway, so Will McGugan reported a few days ago

00:16:15.860 --> 00:16:19.720
that the textual that he and his team are working.

00:16:19.780 --> 00:16:21.520
I guess I'm not sure if there's a team there anymore.

00:16:21.700 --> 00:16:25.240
But anyway, textual has a new version out.

00:16:25.380 --> 00:16:31.520
4.0.0. So what's the, what's the big change? The big change is a markdown append. So this is kind

00:16:31.520 --> 00:16:36.840
of a neat thing. I thought it was cool to have, to be able to see if we can get this to run.

00:16:37.200 --> 00:16:43.480
The gist of it is that you've got a markdown. You can report to a markdown widget that as you append

00:16:43.620 --> 00:16:49.659
to it, it just keeps going. So you can in real time, add stuff to it and it just sort of scrolls

00:16:49.680 --> 00:16:57.220
down. Anyway, that's the big thing. Maybe you don't care about this, but I brought this up.

00:16:58.160 --> 00:17:03.340
That's like all of our topics, but I brought this up because I really like the thing that he did

00:17:03.700 --> 00:17:10.000
in bumping the major version. So he says why, the reason for the major version bump is because

00:17:10.380 --> 00:17:14.380
while he was implementing this, there was a different, another part of the interface,

00:17:14.780 --> 00:17:19.560
widget anchor that already existed and that has changed semantics.

00:17:19.900 --> 00:17:24.060
So he, and it works better also, but the semantics changed,

00:17:24.660 --> 00:17:26.579
changed, caused the major version bump.

00:17:26.900 --> 00:17:28.459
I wish more people did this.

00:17:28.640 --> 00:17:33.420
I think that a lot of people only change the major version if they change the

00:17:33.940 --> 00:17:37.420
actual signature, the API signature.

00:17:38.360 --> 00:17:41.820
And I think that behavior changes are completely,

00:17:42.480 --> 00:17:44.160
They're even more important to change the version

00:17:44.500 --> 00:17:46.980
because it's going to sort of run fine.

00:17:47.160 --> 00:17:48.540
It's just going to do something different.

00:17:48.800 --> 00:17:51.840
And that's something you really want to point out to users.

00:17:52.040 --> 00:17:53.520
So applaud him for doing that.

00:17:54.520 --> 00:17:57.100
Yeah, Brian, I remember when I first learned C++

00:17:57.400 --> 00:18:00.020
and I had some, for me at the time, complicated program.

00:18:00.160 --> 00:18:03.000
I was so proud of myself when I got it to compile.

00:18:03.320 --> 00:18:03.420
Yeah.

00:18:03.720 --> 00:18:04.420
Then its behavior.

00:18:05.200 --> 00:18:06.440
I had to figure out all the bugs.

00:18:06.520 --> 00:18:07.660
And this is kind of like that, right?

00:18:07.700 --> 00:18:11.780
It's like it technically still has the same API signature,

00:18:12.120 --> 00:18:16.060
But it's down to the harder things to detect that are breaking changes, right?

00:18:16.220 --> 00:18:17.400
Which is semantics and behavior.

00:18:18.000 --> 00:18:18.400
Yeah.

00:18:18.840 --> 00:18:24.480
And that's the real one that gets you is if it seems like it runs fine right away,

00:18:24.600 --> 00:18:28.180
but there's a major version bump, you got to check a look at your test to make sure that.

00:18:28.440 --> 00:18:31.440
And probably it's just that you're not using WidgetHanker.

00:18:31.820 --> 00:18:33.860
And if you're not using it, you don't have to worry about it.

00:18:34.020 --> 00:18:35.520
But anyway, so there's that.

00:18:35.660 --> 00:18:38.280
And I was like, what can we stream with this?

00:18:38.320 --> 00:18:40.200
What would I want to stream into Markdown?

00:18:40.260 --> 00:18:46.820
Well, I've got another project that I wanted to highlight called HTML to Markdown.

00:18:47.260 --> 00:18:53.060
So this is a HTML converter that apparently there was another tool, which I think I ran

00:18:53.160 --> 00:19:00.540
across before called Markdownify that converts webpages or HTML stuff to Markdown.

00:19:01.560 --> 00:19:07.240
And to be able to, so I thought, and one of the features of it, okay, so they completely

00:19:07.540 --> 00:19:09.080
rewrote the fork.

00:19:09.440 --> 00:19:10.120
But why?

00:19:10.200 --> 00:19:16.640
There's a bunch of extra features like HTML5 support, type safety, metadata extraction.

00:19:17.160 --> 00:19:23.460
And look at this, streaming support, memory efficient processing for large documents with progress callbacks.

00:19:23.820 --> 00:19:31.600
I'm curious if you could take a web scraper or something or somehow take something that's streaming HTML

00:19:31.940 --> 00:19:38.820
or use this to grab something large and have it reported to a textual widget.

00:19:39.200 --> 00:19:40.060
That'd be kind of fun.

00:19:40.300 --> 00:19:48.340
so that's very fun yeah nice i can also see if you are doing some kind of chat chat bot or llm type

00:19:48.370 --> 00:19:54.700
of thing on the textual side yeah and you wanted to output the responses in markdown like that's a

00:19:54.740 --> 00:20:00.400
real common yeah even exchange for even brings that up uh like the efficiently stream markdown

00:20:00.610 --> 00:20:07.339
content like you might get from an llm like you might yeah okay yeah makes a lot of sense so cool

00:20:07.640 --> 00:20:12.500
all right hey i want to jump back to your first item real quick okay did you give this article a

00:20:12.620 --> 00:20:16.900
shout out as well because i know that you were thinking about it oh yeah i just didn't highlight

00:20:17.100 --> 00:20:22.020
it so i didn't bring it up yet so yeah there's yeah you want to talk about it yeah sure i don't

00:20:22.020 --> 00:20:26.760
know a whole lot about but it's very neat so um mario python by night also did uh it's the terminal

00:20:26.880 --> 00:20:32.740
bootstrapping starship just during v and uv and talks about how you can sort of get things set up

00:20:32.740 --> 00:20:37.320
with that as well so just it's already in the show notes just one more thing to throw out there

00:20:37.340 --> 00:20:41.280
Yeah, and so that's what's causing me to say,

00:20:41.360 --> 00:20:44.540
maybe I should take another look at Durinv and Starship

00:20:44.880 --> 00:20:47.800
because other people that I admire are using it.

00:20:47.940 --> 00:20:49.700
So yeah, maybe it's worth looking at.

00:20:51.620 --> 00:20:55.260
Not like me, who just vibed my way to a turn it on,

00:20:55.420 --> 00:20:58.120
turn it off automatically sort of bash function.

00:20:58.540 --> 00:20:58.720
Yeah.

00:20:59.000 --> 00:20:59.300
You ready?

00:20:59.820 --> 00:21:03.260
Yeah, actually, you got any extras before we jump to the vibe?

00:21:03.560 --> 00:21:11.740
Well, the only extra I wanted to bring up is the reason why I'm wearing an annoyingly bright T-shirt today.

00:21:12.010 --> 00:21:15.680
Usually I do a darker color because it shows up better on the better.

00:21:16.020 --> 00:21:19.300
But this is my Oregon Country Fair shirt that I got last Friday.

00:21:19.520 --> 00:21:21.440
So I'm going to stand up so that you guys can see it.

00:21:22.100 --> 00:21:24.340
And it's a lovely Oregon Country Fair shirt.

00:21:24.580 --> 00:21:25.360
It was a blast.

00:21:26.250 --> 00:21:28.620
But I'm definitely feeling my age a little bit.

00:21:28.680 --> 00:21:35.540
But we got there, it's 11 to 7, and we got there right before 11 to get a decent parking spot.

00:21:36.760 --> 00:21:39.900
But usually we get there earlier to get a decent parking spot.

00:21:40.200 --> 00:21:44.340
A lot of people, it was pretty hot this weekend.

00:21:44.720 --> 00:21:51.520
So it's till 7 o'clock, but like, I don't know, like 3 or 4 o'clock, we were like, I think we're fried enough.

00:21:51.740 --> 00:21:52.160
Let's go home.

00:21:53.880 --> 00:21:56.940
It has been very warm and very sunny in the Pacific Northwest.

00:21:57.760 --> 00:22:00.440
Contrary to what people think about the rain and the clouds.

00:22:00.960 --> 00:22:05.040
Yeah, no, I think there's other parts of the country getting more rain than us right now.

00:22:05.320 --> 00:22:05.720
Oh, indeed.

00:22:06.760 --> 00:22:07.060
All right.

00:22:07.460 --> 00:22:08.060
You ready for the joke?

00:22:08.480 --> 00:22:08.720
Yes.

00:22:09.260 --> 00:22:09.440
Okay.

00:22:09.880 --> 00:22:10.860
So let me set the stage.

00:22:11.280 --> 00:22:13.340
I know many of you out there already know this.

00:22:13.580 --> 00:22:14.600
We've had several jokes.

00:22:14.720 --> 00:22:20.280
So if you've been progressing along the joke timeline with us, you will know what vibe coding

00:22:20.520 --> 00:22:20.640
is.

00:22:20.760 --> 00:22:25.880
Just for the folks who don't though, vibe coding is when you go to an agentic programming model

00:22:25.880 --> 00:22:33.780
like cursor windsurf juni for the jetbrains idees that kind of thing and you just just tell it what

00:22:33.780 --> 00:22:38.540
to do you don't need to touch the keyboard you use text to speech you just like build me this app

00:22:38.880 --> 00:22:43.600
now i do it this way now make it that and the joke is that it comes up with a bunch of mistakes

00:22:44.140 --> 00:22:50.020
or it works on your machine but you're not enough of a programmer to actually know okay that like

00:22:50.320 --> 00:22:55.060
this might work here, but it's not really going to work. So that's the joke. And the joke is,

00:22:55.600 --> 00:22:59.160
switch back, there's an announcement for this new conference. Very exciting.

00:22:59.700 --> 00:23:04.980
VibeCon. Introducing VibeCon, the world's largest vibe coding conference. Make sure you register

00:23:05.240 --> 00:23:13.740
today. HTTP 127.0.0.1 colon 8080 slash register. It says VibeCoding is hard to attend. VibeCon

00:23:13.920 --> 00:23:19.500
is hard to attend. That's already funny. This is on Reddit, but if you scroll down into the comments,

00:23:19.720 --> 00:23:20.540
So good.

00:23:20.880 --> 00:23:23.460
Someone's just a sequel and backslash and vibe.html.

00:23:23.660 --> 00:23:24.600
Someone's no, no, that's wrong.

00:23:24.980 --> 00:23:28.680
File colon triple slash C colon forward slash and vibe.html.

00:23:29.060 --> 00:23:30.380
What boomer posted this?

00:23:30.800 --> 00:23:34.960
Modern vibe coders gather up at HEP bracket colon colon one.

00:23:35.160 --> 00:23:36.880
You know, the IPv6.

00:23:38.400 --> 00:23:38.780
That's funny.

00:23:38.860 --> 00:23:39.500
Oh my goodness.

00:23:39.760 --> 00:23:41.000
This is sweet, isn't it?

00:23:41.320 --> 00:23:45.840
Can someone give me the prompt to generate the registration form so I can sign up?

00:23:48.560 --> 00:23:49.020
That's funny.

00:23:49.340 --> 00:23:55.360
Yeah, somebody said tried to register and they took a screenshot that local, the page, you know, connection refuses.

00:23:55.560 --> 00:23:56.000
Oh my God.

00:23:56.760 --> 00:23:58.000
Tried to register for ViveCon.

00:23:58.000 --> 00:23:59.540
I guess my vibes weren't local enough.

00:24:00.560 --> 00:24:01.540
Yeah, that's funny.

00:24:01.860 --> 00:24:02.060
Yeah.

00:24:02.380 --> 00:24:04.020
Okay, so let's say I'm dense.

00:24:04.280 --> 00:24:08.000
Why is, what is that URL, that 127.001?

00:24:08.320 --> 00:24:12.640
If you're doing web development locally, that's where it will run.

00:24:12.940 --> 00:24:13.100
Okay.

00:24:13.180 --> 00:24:16.180
I don't know what server typically picks 8080.

00:24:16.400 --> 00:24:17.480
Maybe this is Node.js.

00:24:17.680 --> 00:24:24.660
probably it is because like flask is 5 000 um some of them are 8 000 yeah so but it's definitely like

00:24:24.800 --> 00:24:30.020
if you ran it locally you said build me this thing it would work perfectly locally because this is

00:24:30.100 --> 00:24:34.400
like the dev address but obviously it's listening on the local loopback not it's not a real server

00:24:34.820 --> 00:24:43.020
i love it yeah yeah i haven't done a lot of vibe vibing lately but yeah no definitely uh vibe con

00:24:43.040 --> 00:24:49.120
is definitely hard hard to uh to attend and pat on the honest says they run a lot of local apis on

00:24:49.340 --> 00:24:56.200
8080 like internal all right well fun as always yes thanks for being here brian thanks everyone's

00:24:56.320 --> 00:25:02.580
listening and if you're not subscribed to the podcast please click follow or the subscribe for

00:25:02.650 --> 00:25:07.780
free whatever your podcast app button says to you know keep getting automatic downloads to our free

00:25:07.860 --> 00:25:13.000
podcast and if you're not subscribed on youtube you want to get notified you want to catch the

00:25:13.000 --> 00:25:18.620
things and all the stuff we're doing here go over there and subscribe as well thanks and bye all

