WEBVTT
00:00:00.001 -->
00:00:05.020Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.020 -->
00:00:11.380This is episode 409, recorded November 13th, 2024.
00:00:11.380 -->
00:00:12.680And I'm Brian Okken.
00:00:12.680 -->
00:00:13.680And I'm Michael Kennedy.
00:00:13.680 -->
00:00:18.220And this episode, we've got a couple sponsors, Scout APM and Codeium.
00:00:18.220 -->
00:00:22.200Thank you both of them and listen to their spots later in the show.
00:00:22.200 -->
00:00:26.480If you'd like to connect with us, connect on fosstodon.org.
00:00:26.480 -->
00:00:29.480We're M. Kennedy, Brian Okken, and Python Bytes.
00:00:29.780 -->
00:00:32.860But any Mastodon client gets to us.
00:00:32.860 -->
00:00:35.460And now also Bluesky.
00:00:35.460 -->
00:00:37.540So I'm trying out Bluesky.
00:00:37.540 -->
00:00:40.080So we'll drop a link to that as well.
00:00:40.080 -->
00:00:50.360And if you're listening to this in a podcast player, you can join us live sometime on YouTube at pythonbytes.fm/live.
00:00:50.360 -->
00:00:59.160And no need to jot down notes while you're listening, because you can just sign up to be a friend of the show and sign up for our newsletter.
00:00:59.560 -->
00:01:02.800And we will send all the links to you into your inbox every week.
00:01:02.800 -->
00:01:03.400That's right.
00:01:03.400 -->
00:01:04.720The Bytes come to you.
00:01:04.720 -->
00:01:05.800You don't have to come to them.
00:01:05.800 -->
00:01:06.880Yeah, exactly.
00:01:08.180 -->
00:01:13.200So I think we should jump into the terminal this week a little bit.
00:01:13.200 -->
00:01:13.680Yeah.
00:01:13.680 -->
00:01:14.120What do you think?
00:01:14.800 -->
00:01:16.940We absolutely should jump into the terminal.
00:01:16.940 -->
00:01:19.020And I just want to point out, I got a lot of stuff to cover.
00:01:19.020 -->
00:01:22.240I'm on my third cup of coffee, and it's 730 in the morning.
00:01:22.240 -->
00:01:22.880Let's go.
00:01:22.880 -->
00:01:25.520We'll start with something from Will McGugan.
00:01:25.520 -->
00:01:30.080It's been a while since we've spoken about rich and textual, but the drought is over.
00:01:30.080 -->
00:01:31.720Folks, the drought is over.
00:01:31.980 -->
00:01:36.040This is something I saw Will throw out as a proof of concept.
00:01:36.040 -->
00:01:36.640Okay.
00:01:36.640 -->
00:01:37.520Have you seen this, Brian?
00:01:37.520 -->
00:01:38.820No.
00:01:38.820 -->
00:01:40.020So it's pretty cool.
00:01:40.020 -->
00:01:43.840Imagine, if you will, as I have actually been.
00:01:43.840 -->
00:01:44.620If you will.
00:01:46.660 -->
00:01:53.460Imagine, if you will, that you are SSH'd into your server for a lot of the recent days,
00:01:53.460 -->
00:01:54.800working on something.
00:01:54.800 -->
00:02:00.960And, you know, you've got tree, which is a command that will show sort of a hierarchical view of
00:02:00.960 -->
00:02:01.440things.
00:02:01.440 -->
00:02:06.380But wouldn't it be nice if there was something kind of graphical that you could use to explore
00:02:06.380 -->
00:02:08.740and interact with the file system?
00:02:08.740 -->
00:02:12.520A little bit like Mac Finder or something like Windows Explorer?
00:02:12.520 -->
00:02:14.580Well, that is what this terminal tree is.
00:02:14.580 -->
00:02:17.520So the idea here is, well, I didn't like that.
00:02:17.520 -->
00:02:26.960So the idea is that you run this in the shell and it gives you a tree-like view of, here we
00:02:26.960 -->
00:02:27.620go, that's a better one.
00:02:27.620 -->
00:02:31.420It gives you a tree-like view that you can explore with your keyboard.
00:02:31.420 -->
00:02:32.740It also says mouse.
00:02:32.740 -->
00:02:35.380I don't think that works on Linux, but it works.
00:02:35.380 -->
00:02:36.600It seems to work on macOS.
00:02:36.600 -->
00:02:41.880Anyway, maybe with your mouse, certainly with your keyboard, that you can sort of open up the
00:02:41.880 -->
00:02:42.660tree and go around.
00:02:42.660 -->
00:02:49.060And you find a file, you can hit P to preview it in a little side tab thing, like side by
00:02:49.060 -->
00:02:49.900side with the tree.
00:02:49.900 -->
00:02:55.040You can jump from different roots of this tree by just hitting G and then typing directory
00:02:55.040 -->
00:03:00.040slash apps, enter, and then you're just exploring whatever your apps folder is or whatever.
00:03:00.040 -->
00:03:00.680What do you think?
00:03:00.680 -->
00:03:02.600I think this looks pretty nice, actually.
00:03:02.600 -->
00:03:03.980Pretty great.
00:03:03.980 -->
00:03:06.800Yeah, I was using it over SSH and it's pretty nice.
00:03:06.800 -->
00:03:10.260Now, to be clear, it is a, where does it say this?
00:03:10.260 -->
00:03:10.960I don't know.
00:03:10.960 -->
00:03:14.940Will says, I don't know if this will become a standalone tool or folded back into textual
00:03:14.940 -->
00:03:18.080or nothing, but here, if you're interested, fork it, play with it.
00:03:18.080 -->
00:03:18.640Let me know.
00:03:18.640 -->
00:03:23.320The one thing I was talking to Will about when I saw this was, wow, wouldn't it be cool to
00:03:23.320 -->
00:03:26.160be able to specify a starting directory?
00:03:26.160 -->
00:03:28.060Like, create me a tree of this place.
00:03:28.060 -->
00:03:31.460Right now, it just jumps into your home directory, then you got to navigate from there.
00:03:31.720 -->
00:03:38.680Also, hat tip to, hey, let's run this using uv with a zero install, zero download.
00:03:38.680 -->
00:03:42.220You don't even download textual or this file or anything.
00:03:42.220 -->
00:03:47.220You just run uvx from the get repo and you specify a Python version.
00:03:47.220 -->
00:03:49.580I suppose you could probably drop that, actually.
00:03:49.580 -->
00:03:53.520And then the dash Q so it doesn't output all the, hey, we're creating a rich environment,
00:03:53.520 -->
00:03:53.900all that.
00:03:53.900 -->
00:03:54.500Oh, nice.
00:03:54.500 -->
00:03:55.000Right?
00:03:55.000 -->
00:03:58.080That's the terminal tree as an entry point to this package.
00:03:58.140 -->
00:04:03.820So, yeah, I think if you're looking for a quick way to explore your file system over
00:04:03.820 -->
00:04:05.440SSH, this is pretty nice.
00:04:05.440 -->
00:04:08.980Or even in the terminal on your own machine, although I find that, you know, some people
00:04:08.980 -->
00:04:09.640I'm sure would love that.
00:04:09.640 -->
00:04:10.980It's not how I roll.
00:04:10.980 -->
00:04:15.600I just use binder or an IDE or whatever it is that I'm working with there.
00:04:15.600 -->
00:04:17.480But over SSH, this is handy.
00:04:17.480 -->
00:04:18.040Nice.
00:04:18.040 -->
00:04:18.420Cool.
00:04:18.420 -->
00:04:19.260Mm-hmm.
00:04:19.260 -->
00:04:20.120All right.
00:04:20.120 -->
00:04:23.820I actually love all the terminal apps or the textual apps.
00:04:23.820 -->
00:04:25.320Yeah, there's a lot of good ones.
00:04:25.320 -->
00:04:25.780Yeah.
00:04:25.780 -->
00:04:29.420I feel like we might be heading in that direction again.
00:04:29.420 -->
00:04:30.000Yeah.
00:04:30.000 -->
00:04:40.740So another recent find around textual is this beautiful API client called Posting.
00:04:40.740 -->
00:04:42.740And I got this from Darren Burns.
00:04:42.740 -->
00:04:45.440And actually, it's his project, Darren Burns.
00:04:45.440 -->
00:04:47.700And isn't he part of the textual team?
00:04:47.700 -->
00:04:48.820I think so.
00:04:48.820 -->
00:04:51.420If not, my memory is serving me incorrectly.
00:04:51.420 -->
00:04:56.440But OK, so this is a gorgeous client.
00:04:56.440 -->
00:05:00.140And it's an open source terminal app.
00:05:00.140 -->
00:05:02.020And it's all color coded.
00:05:02.020 -->
00:05:04.840And you've got colorization for the output.
00:05:04.840 -->
00:05:08.580On the left-hand side, you've got collections, which is cool.
00:05:08.580 -->
00:05:10.160You can hide that as well.
00:05:10.160 -->
00:05:14.580But different ways, like if you're jumping to different APIs, like if you're trying different
00:05:14.580 -->
00:05:17.460APIs out, you can have them up in different collections.
00:05:17.960 -->
00:05:19.820But I started this quickly.
00:05:19.820 -->
00:05:23.080I'm like, right before this morning, I'm like, I should try this.
00:05:23.080 -->
00:05:24.200So I'll give it a shot.
00:05:24.200 -->
00:05:26.380And I went down and said, get started.
00:05:26.380 -->
00:05:33.640And similar to like you said, the top installation instructions were to use uv tool.
00:05:34.640 -->
00:05:39.940So that's a uv tool is, and I'm using it now on lots of things.
00:05:39.940 -->
00:05:42.280I think it's a little easier than PIPX.
00:05:42.280 -->
00:05:44.200So that's what I'm using.
00:05:44.200 -->
00:05:48.000So uv tool install, Python 312, posting.
00:05:48.000 -->
00:05:51.520And posting will get you started with this.
00:05:51.520 -->
00:05:55.440And I really loved, I'm just going to go back to the main homepage because it has a lot of
00:05:55.440 -->
00:05:56.640the stuff I wanted to talk about.
00:05:56.640 -->
00:05:59.180It's a beautiful interface.
00:06:00.380 -->
00:06:02.520I was trying it out with the mouse, actually.
00:06:02.520 -->
00:06:03.320I'm on a Mac.
00:06:03.320 -->
00:06:05.460And using the mouse worked great.
00:06:05.460 -->
00:06:07.420I tried some of the keyboard shortcuts, too.
00:06:07.420 -->
00:06:08.940There's keyboard shortcuts at the bottom.
00:06:08.940 -->
00:06:12.780And then the documentation has more that you can just show you how to jump around.
00:06:13.420 -->
00:06:22.420So it is designed to have some quick workflows to work around, like testing an API.
00:06:22.420 -->
00:06:28.380And it works over, since it's termed textual, works over SSH.
00:06:28.380 -->
00:06:29.660It saves stuff.
00:06:29.660 -->
00:06:33.020So when you interact with it, it saves all of your interactions.
00:06:33.020 -->
00:06:35.940And you can save it to a file.
00:06:35.940 -->
00:06:38.040And it's a version control friendly file.
00:06:38.500 -->
00:06:42.700So it's something you can diff and stuff if you want to do it a couple times and see how
00:06:42.700 -->
00:06:43.300things are different.
00:06:43.300 -->
00:06:48.620One of the things I loved about this is when I've tested APIs before, sometimes I've got
00:06:48.620 -->
00:06:54.820a whole bunch of header stuff that I need to stuff into an API to just get it working.
00:06:54.820 -->
00:07:01.240So manual things like, oh, I forget that other one, that manual stuff that you can jump around
00:07:01.240 -->
00:07:04.340and manually fill things out is a little difficult.
00:07:04.340 -->
00:07:07.460But this one has, has the ability in postman.
00:07:07.460 -->
00:07:08.880Yeah, stuff like that.
00:07:08.880 -->
00:07:13.180Where, and it's great for things that don't have, you don't have to fill in a bunch of header
00:07:13.180 -->
00:07:15.140stuff for a post or for a query.
00:07:15.140 -->
00:07:20.740But if you do, this will work great because it's got scripting capabilities where you can
00:07:20.740 -->
00:07:26.780run a Python, some Python code before and after or, and or after a request to prepare the
00:07:26.780 -->
00:07:30.920headers, set variables and stuff to get your, your post ready.
00:07:30.920 -->
00:07:33.120And this is, this is just excellent.
00:07:33.120 -->
00:07:35.320I'm going to be using this all the time.
00:07:35.320 -->
00:07:37.380The colors are gorgeous.
00:07:37.380 -->
00:07:38.960Love the syntax highlighting.
00:07:38.960 -->
00:07:40.640It's configurable.
00:07:40.640 -->
00:07:45.940The key maps, customize, you can even customize the key binding if the ones that they've chosen
00:07:45.940 -->
00:07:47.100for you don't work that way.
00:07:47.100 -->
00:07:47.860That's pretty cool.
00:07:47.860 -->
00:07:55.120But just an excellent little command thing for, or a terminal application for testing your
00:07:55.120 -->
00:07:55.460APIs.
00:07:55.460 -->
00:08:00.900Yeah, this is one of the more full featured textual apps I've seen.
00:08:00.900 -->
00:08:01.420This is great.
00:08:01.420 -->
00:08:01.920Yeah.
00:08:01.920 -->
00:08:04.980So we get from, from Liz in the audience.
00:08:04.980 -->
00:08:06.700I love this thing.
00:08:06.700 -->
00:08:09.140I've been wanting to replace postman for a while.
00:08:09.140 -->
00:08:09.620Nice.
00:08:09.620 -->
00:08:14.720So yeah, I was just in postman today, but I don't want to tell you about postman, Brian.
00:08:14.720 -->
00:08:17.000I want to talk about scout.
00:08:17.000 -->
00:08:20.880Let me tell you real quick about scout APM.
00:08:21.080 -->
00:08:24.500They're big supporters of Python bytes, so we appreciate that very much.
00:08:24.500 -->
00:08:30.180So if you are tired of spending hours trying to find the root cause of issues impacting your
00:08:30.180 -->
00:08:33.440performance, then you owe it to yourself to check out scout APM.
00:08:33.440 -->
00:08:39.560They're a leading Python application performance monitoring tool, APM, that helps you identify
00:08:39.560 -->
00:08:42.560and solve performance abnormalities faster and easier.
00:08:42.560 -->
00:08:48.220Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and the
00:08:48.220 -->
00:08:53.340dreaded N plus one queries that you can end up if you do lazy loading in your ORM.
00:08:53.340 -->
00:08:55.740And then you say, oh no, why is it so slow?
00:08:55.740 -->
00:08:58.060Why are you doing 200 database queries for what should be one?
00:08:58.060 -->
00:08:59.440So you can find out things like that.
00:08:59.440 -->
00:09:01.220And it links it back directly to source code.
00:09:01.220 -->
00:09:06.160So you can spend less time in the debugger and healing logs and just finding the problems
00:09:06.160 -->
00:09:06.700and moving on.
00:09:06.700 -->
00:09:09.740And you'll love it because it's built for developers by developers.
00:09:09.740 -->
00:09:11.400It makes it easy to get set up.
00:09:11.400 -->
00:09:13.920Seriously, you can do it in less than four minutes.
00:09:13.920 -->
00:09:14.740So that's awesome.
00:09:14.740 -->
00:09:17.920And the best part is the pricing is straightforward.
00:09:17.920 -->
00:09:23.200You only pay for the data that you use with no hidden overage fees or per seat pricing.
00:09:23.200 -->
00:09:25.540And I just learned this, Brian.
00:09:25.540 -->
00:09:30.660They also have, they provide the pro version for free to all open source projects.
00:09:30.660 -->
00:09:35.140So if you're an open source maintainer and you want to have scout APM for that project,
00:09:35.140 -->
00:09:38.000just shoot them a message or something on their pricing page about that.
00:09:38.240 -->
00:09:41.840So you can start your free trial and get instant insights today.
00:09:41.840 -->
00:09:44.440Visit pythonbytes.fm/scout.
00:09:44.440 -->
00:09:46.720The link is in your podcast player show notes as well.
00:09:46.720 -->
00:09:48.120And please use that link.
00:09:48.120 -->
00:09:52.000Don't just search for them because otherwise they don't think you came from us.
00:09:52.000 -->
00:09:53.580And then they'd stop supporting the show.
00:09:53.580 -->
00:09:56.160So please use our link pythonbytes.fm/scout.
00:09:56.160 -->
00:09:57.080Check them out.
00:09:57.080 -->
00:09:59.020It really supports the show.
00:09:59.020 -->
00:10:00.680All right.
00:10:01.320 -->
00:10:07.700Next up, Brian, it's good I had a lot of coffee because this, there was almost a first after
00:10:07.700 -->
00:10:11.460eight years, nine years, eight years of the show.
00:10:11.460 -->
00:10:12.700How long has it been going on?
00:10:12.700 -->
00:10:14.880We just had our birthday last week, by the way.
00:10:14.880 -->
00:10:20.340After that, we've never had a straight run of extra, extra, extra as all of the topics.
00:10:20.340 -->
00:10:24.860I almost have too many topics, but I had to have two extra, extra, extras, but they're quick.
00:10:24.860 -->
00:10:26.180So you ready?
00:10:26.180 -->
00:10:26.760All right.
00:10:26.760 -->
00:10:27.260Here we go.
00:10:27.260 -->
00:10:31.780First of all, we have our getting started with NLP and spaCy in Jupyter Notebooks course.
00:10:31.780 -->
00:10:34.220This one is awesome.
00:10:34.220 -->
00:10:41.300If you do anything with spaCy or anything with text and you want to parse it with Python,
00:10:41.300 -->
00:10:42.780spaCy is a great option.
00:10:42.780 -->
00:10:47.660Vincent Orberdam, who used to work at Explosion, actually wrote this course.
00:10:47.660 -->
00:10:49.040So why am I telling you about that?
00:10:49.040 -->
00:10:55.100Because over at Google Forms here, we're doing a spaCy swag giveaway.
00:10:55.100 -->
00:11:00.560So they have a spaCy course with illustrated how-to books and all sorts of other cool things
00:11:00.560 -->
00:11:01.900that you can get around spaCy.
00:11:01.900 -->
00:11:07.640So Ines Montani gave us some codes to give away for people who are interested in that.
00:11:07.640 -->
00:11:08.680So I put a link.
00:11:08.680 -->
00:11:13.580All you got to do is give us your name and email so that we can find you and give you the
00:11:13.580 -->
00:11:14.260code if you want.
00:11:14.260 -->
00:11:15.500So check that out.
00:11:15.500 -->
00:11:17.280Links in the show notes, obviously.
00:11:17.280 -->
00:11:20.600A couple of articles I wrote, Brian, maybe three.
00:11:20.600 -->
00:11:22.480I've been writing a lot last week.
00:11:22.480 -->
00:11:25.440One is I wrote something opposite of cloud native is.
00:11:25.440 -->
00:11:31.320Trying a little bit of a pushback against how many managed services can you have?
00:11:31.320 -->
00:11:32.560Well, let's use Kubernetes.
00:11:32.560 -->
00:11:35.220Oh, and with Kubernetes, it's hard to see the logs.
00:11:35.220 -->
00:11:36.700So we're going to need log aggregation.
00:11:36.700 -->
00:11:38.880And then with log aggregation, we need some log monitoring.
00:11:38.880 -->
00:11:43.440And then on and on, it just builds until you've got this super complicated thing.
00:11:43.940 -->
00:11:48.000And so this article is kind of an homage to like, can we just go back to something simple
00:11:48.000 -->
00:11:50.120that will work for like tons of people?
00:11:50.120 -->
00:11:50.760I think.
00:11:50.760 -->
00:11:56.640So I'm proposing the idea of stack native, like just enough technology to make what you need
00:11:56.640 -->
00:12:02.000your web app or your API or whatever to run, not something that'll tie you so deeply into
00:12:02.000 -->
00:12:06.260all the hyperscale clouds that you end up with a hundred thousand dollar bill, but no idea
00:12:06.260 -->
00:12:07.620how to move away from it.
00:12:08.060 -->
00:12:10.180I almost covered this as one of my topics.
00:12:10.180 -->
00:12:11.060This is a great article.
00:12:11.060 -->
00:12:11.560Did you?
00:12:11.560 -->
00:12:12.400Oh, thank you so much.
00:12:12.400 -->
00:12:12.840That's awesome.
00:12:12.840 -->
00:12:13.200Yeah.
00:12:13.200 -->
00:12:14.920This is a really, really fun one.
00:12:14.920 -->
00:12:15.660Related.
00:12:15.660 -->
00:12:21.440I also wrote, and I talked about it last time, but I wrote this up that we, Python Bytes,
00:12:21.440 -->
00:12:25.420Talk Python, Talk Python Training, all the APIs, et cetera, et cetera, in like a broad sense,
00:12:25.420 -->
00:12:26.660have moved to Hetzner.
00:12:27.080 -->
00:12:31.620Remember I talked about how Hetzner was really interesting and appealing and hey, I took
00:12:31.620 -->
00:12:34.300the plunge, bought us a, I splurged, Brian.
00:12:34.300 -->
00:12:36.500I went for the big VM, the big machine.
00:12:36.500 -->
00:12:37.080Okay.
00:12:37.080 -->
00:12:41.820Eight virtual CPUs, 16 gigs for a whopping $25 a month.
00:12:41.820 -->
00:12:49.240That is $112 at DigitalOcean, $205 at AWS and $320 a month on Azure.
00:12:49.240 -->
00:12:50.160Same machine.
00:12:50.160 -->
00:12:50.680Okay.
00:12:50.680 -->
00:12:53.720And if you look, the performance, people are saying, well, it was probably cheaper because
00:12:53.720 -->
00:12:59.500it's like from 20 years ago or something, CPU performance, 1.2 times faster than DigitalOcean's
00:12:59.500 -->
00:13:00.520$112 version.
00:13:00.520 -->
00:13:07.040And the bandwidth is eight times more, one gigabit bandwidth versus two for $25.
00:13:07.040 -->
00:13:10.580So anyway, this is really, really excellent.
00:13:10.580 -->
00:13:12.620And talked a lot about that.
00:13:12.620 -->
00:13:18.880So another thing I did is I created, I was on, I was on vacation for four days, long weekend.
00:13:18.880 -->
00:13:23.440So I decided to create a package for Chameleon and Flask.
00:13:23.540 -->
00:13:25.180Chameleon, the web templating language.
00:13:25.180 -->
00:13:26.680Flask, you know what Flask is.
00:13:26.680 -->
00:13:27.040Yeah.
00:13:27.040 -->
00:13:28.500Usually it uses Jinja.
00:13:28.500 -->
00:13:29.860I don't like Jinja very much.
00:13:29.860 -->
00:13:34.540I think it's too much Python and not enough pure web, not like view or other things where
00:13:34.540 -->
00:13:35.440you just have little attributes.
00:13:35.440 -->
00:13:36.540Chameleon is like that.
00:13:36.540 -->
00:13:37.160I like it a lot.
00:13:37.160 -->
00:13:41.100Plus I have a whole ton of Chameleon templates I don't want to mess with, but I want to do
00:13:41.100 -->
00:13:42.800some Flask things with some of that base.
00:13:42.800 -->
00:13:50.140So I created a package that if you just put a decorator onto either a async or a regular
00:13:50.140 -->
00:13:55.480non-synchronous view method in Flask, it will, when you return a dictionary, it'll use that
00:13:55.480 -->
00:13:57.640dictionary to render the Chameleon template.
00:13:57.640 -->
00:13:58.380It's pretty awesome.
00:13:58.380 -->
00:13:59.080That's neat.
00:13:59.260 -->
00:14:03.460And if anyone wants a really cool example, there's some of these that have existed before,
00:14:03.460 -->
00:14:07.880but they were super simplistic.
00:14:07.880 -->
00:14:12.680Like, okay, so technically the Chameleon engine is set up, but then you have to do every view,
00:14:12.780 -->
00:14:17.540you've got to do all the manual steps to actually render it, or it only works with synchronous
00:14:17.540 -->
00:14:18.660functions and not async.
00:14:18.660 -->
00:14:23.600So here's a decorator that looks and sees if it's decorating an asynchronous or asynchronous
00:14:23.600 -->
00:14:26.640function and creates a different wrapper behavior.
00:14:26.640 -->
00:14:30.760So the wrapper itself is async or not async, depending on which it covers here.
00:14:30.760 -->
00:14:34.880So if people are trying to write something regardless of whether it's web or not, that can
00:14:34.880 -->
00:14:37.380handle both sync and async, here's a little example for them.
00:14:37.380 -->
00:14:37.760Okay.
00:14:38.020 -->
00:14:38.300All right.
00:14:38.300 -->
00:14:47.200Next, also released a new version of Lismunk, the email API client for Python.
00:14:47.200 -->
00:14:50.340I think, I have, what's the guy's name?
00:14:50.340 -->
00:14:50.660Ron.
00:14:50.660 -->
00:14:50.980Thank you.
00:14:50.980 -->
00:14:53.920Ron Hudson did a bunch of work adding new features to that.
00:14:53.920 -->
00:14:54.800So that is out.
00:14:54.800 -->
00:14:55.800Also-
00:14:55.800 -->
00:14:57.080You're still on the go-over.
00:14:57.080 -->
00:14:57.880What's up with that?
00:14:57.880 -->
00:15:00.240Well, it's only been out a couple of days.
00:15:00.240 -->
00:15:00.760Okay.
00:15:00.760 -->
00:15:02.240I feel like I should give it a week.
00:15:02.240 -->
00:15:04.560I'm just now rewriting.
00:15:04.560 -->
00:15:09.560I've been doing a bunch of work the last day to use that to convert something into Flask.
00:15:09.560 -->
00:15:10.640I'll talk more about that later.
00:15:10.640 -->
00:15:12.580And there's been like little tiny issues.
00:15:12.580 -->
00:15:14.180I want to get it a little bit more.
00:15:14.180 -->
00:15:16.600I want to test it for a week before I give it a non-dover.
00:15:16.600 -->
00:15:17.060Come on.
00:15:17.060 -->
00:15:17.480Okay.
00:15:17.480 -->
00:15:17.780Okay.
00:15:17.780 -->
00:15:18.360That's fine.
00:15:18.360 -->
00:15:18.680Okay.
00:15:18.680 -->
00:15:19.100Yeah.
00:15:19.100 -->
00:15:21.500Oh, and Ron is out in the audience.
00:15:21.500 -->
00:15:21.980Hey, Ron.
00:15:21.980 -->
00:15:22.620Awesome.
00:15:22.620 -->
00:15:23.160Thank you, man.
00:15:23.160 -->
00:15:23.800Thanks for the help.
00:15:24.180 -->
00:15:24.540Okay.
00:15:24.540 -->
00:15:27.680So on here to TOB.
00:15:27.680 -->
00:15:29.260We all know TOB, TOB index.
00:15:29.260 -->
00:15:29.900There was big news.
00:15:29.900 -->
00:15:30.520Hey, guys, what?
00:15:30.520 -->
00:15:31.420Python's number one.
00:15:31.420 -->
00:15:31.960Hooray.
00:15:31.960 -->
00:15:33.000In this other way, right?
00:15:33.000 -->
00:15:35.140We just talked about GitHub last week and TOB.
00:15:35.140 -->
00:15:40.280This is not news that Python is number one, but it was updated for year over year in November.
00:15:40.280 -->
00:15:43.220And I just noticed, look at the numbers here.
00:15:43.220 -->
00:15:47.900Python is not just number one over C++, then over Java, over C.
00:15:48.060 -->
00:15:54.300It's over two times as popular and has a almost 9% year over year growth.
00:15:54.300 -->
00:16:01.200Whereas number two, C++ has 0.3% and Java's 1% and C is negative 3%.
00:16:01.200 -->
00:16:02.560C# has negative 3%.
00:16:02.560 -->
00:16:07.680So not only is it number one, it's double and is growing many times faster than anything else
00:16:07.680 -->
00:16:09.000on the list, including Rust.
00:16:09.000 -->
00:16:09.840That's amazing.
00:16:09.840 -->
00:16:14.440So I'm not sure if we should really bet our careers on these toy languages yet, but you
00:16:14.440 -->
00:16:15.440know, you guys do you.
00:16:15.440 -->
00:16:15.940Okay.
00:16:17.680 -->
00:16:19.480I'm betting my career on it, baby.
00:16:19.480 -->
00:16:20.760A little late.
00:16:20.760 -->
00:16:27.840So update on PEP 750 being spearheaded by Paul Everitt and others.
00:16:27.840 -->
00:16:31.000I just talked about Jinja versus Chameleon.
00:16:31.000 -->
00:16:31.480Yeah.
00:16:31.480 -->
00:16:35.880But these are all external packages that have their own parsers, their own behaviors.
00:16:35.880 -->
00:16:40.140And wouldn't it be nice if Python itself had a type of a template language?
00:16:40.140 -->
00:16:41.620Maybe.
00:16:41.620 -->
00:16:42.220Sure.
00:16:42.220 -->
00:16:42.520Maybe.
00:16:42.520 -->
00:16:43.880Well, I mean, we have f-strings.
00:16:44.720 -->
00:16:50.700We do have f-strings, but when you're doing things in, say, I want to create the content
00:16:50.700 -->
00:16:55.220of an HTML page in memory as part of some action, right?
00:16:55.220 -->
00:16:58.560A lot of people say, well, I guess we could run, like set up the Jinja engine or whatever.
00:16:58.560 -->
00:17:07.000So this PEP 750, which is in draft mode currently targeting 314, is trying to bring some modern
00:17:07.000 -->
00:17:09.900version that's like f-strings into Python.
00:17:10.100 -->
00:17:12.020So this is interesting coming along.
00:17:12.020 -->
00:17:13.080Progress is happening there.
00:17:13.080 -->
00:17:13.500Cool.
00:17:13.500 -->
00:17:17.500Switched over to Canary email, Brian.
00:17:17.500 -->
00:17:23.760I got so sick of Spark and all of their, hey, we're only focused on building AI features.
00:17:23.760 -->
00:17:30.800Even though Canary says it's your AI email copilot, they actually seem to be working on features
00:17:30.800 -->
00:17:34.060that are not just AI, even though that's what their landing page seems to say.
00:17:34.220 -->
00:17:40.040So that's an interesting experiment I'm running, but not as interesting as a couple others that
00:17:40.040 -->
00:17:40.520are coming up.
00:17:40.520 -->
00:17:41.920Omnivore.
00:17:41.920 -->
00:17:45.040Remember I told you they're shutting down and deleting everybody's account?
00:17:45.040 -->
00:17:45.460Yeah.
00:17:45.460 -->
00:17:45.940All right.
00:17:45.940 -->
00:17:48.480So I thought, well, let me go back to Pocket.
00:17:48.480 -->
00:17:52.000Pocket supports Firefox because it's owned by Mozilla.
00:17:52.000 -->
00:17:52.800That's kind of cool.
00:17:52.800 -->
00:17:54.480And I had a paid account to them.
00:17:54.480 -->
00:17:55.160So that's great.
00:17:55.160 -->
00:18:00.460And then I realized that Pocket kind of represents everything that's wrong with Mozilla on a broader
00:18:00.460 -->
00:18:00.800scale.
00:18:00.800 -->
00:18:01.900And it made me sad.
00:18:01.900 -->
00:18:04.740So for example, I told you I just took this four day trip.
00:18:04.740 -->
00:18:10.120I'd like to take some things and take it with me and maybe read it on the plane or at the
00:18:10.120 -->
00:18:11.180beach or wherever.
00:18:11.180 -->
00:18:11.740Yeah.
00:18:11.740 -->
00:18:14.080Pocket has been around for 10 years.
00:18:14.080 -->
00:18:18.360They were acquired by Mozilla in 2017, I believe it was.
00:18:18.360 -->
00:18:20.700They don't even support offline mode.
00:18:20.700 -->
00:18:24.200You can't even read the text offline like an ebook.
00:18:24.980 -->
00:18:30.900It's like acquired in 2017, put on the shelf, worked on other random things that have nothing
00:18:30.900 -->
00:18:33.360to do with Firefox or other things they're selling.
00:18:33.360 -->
00:18:33.600Right.
00:18:33.600 -->
00:18:34.940Anyway, made me sad.
00:18:34.940 -->
00:18:37.260Went through a whole bunch of different other things.
00:18:37.260 -->
00:18:38.360I'm back at Instapaper.
00:18:38.360 -->
00:18:39.580Instapaper is actually really great.
00:18:39.580 -->
00:18:43.820The only thing it's not great at is read it to me, which is what Omnivore was so perfect
00:18:43.820 -->
00:18:44.080at.
00:18:44.080 -->
00:18:45.280But you know what?
00:18:45.280 -->
00:18:45.780They're dead.
00:18:45.780 -->
00:18:47.620So I will not speak of them ever again.
00:18:47.620 -->
00:18:50.060Anyway, Instapaper is actually pretty awesome these days.
00:18:50.060 -->
00:18:53.540So I know a lot of people are talking to me on Mastodon and other places.
00:18:53.540 -->
00:18:54.520That's where it's at.
00:18:54.520 -->
00:18:58.920So other people are saying they like it or don't like it?
00:18:58.920 -->
00:19:03.940Well, no one really mentioned Instapaper one way or the other, but there's good links.
00:19:03.940 -->
00:19:05.780There's Readwise.
00:19:05.780 -->
00:19:10.620There's like a bunch of other premium paid ones that are just, they're not that great,
00:19:10.620 -->
00:19:13.340but they're expensive, like $100 a year expensive.
00:19:13.340 -->
00:19:14.680So I don't know.
00:19:14.680 -->
00:19:15.400I tried them.
00:19:15.400 -->
00:19:16.560Instapaper is more.
00:19:16.560 -->
00:19:21.080So I started, I used Instapaper a long time ago and I don't remember why I stopped.
00:19:21.080 -->
00:19:23.060I don't remember why I stopped either.
00:19:23.060 -->
00:19:26.700But, well, I know I would switch to Omnivore because it was awesome, but it's gone.
00:19:26.700 -->
00:19:27.580So say lovey.
00:19:27.580 -->
00:19:30.260Anyway, onward and upward.
00:19:30.260 -->
00:19:33.840If you are feeling the open source self-hosted world, there's Hoarder.
00:19:33.840 -->
00:19:35.660I mean, who doesn't want to be a Hoarder, Brian?
00:19:35.660 -->
00:19:37.340But this is really awesome.
00:19:37.340 -->
00:19:43.620It's kind of a save your links and notes and articles and then let locally running AI tag them
00:19:43.620 -->
00:19:47.840and group them and this thing just, it's a Docker run, open source.
00:19:47.840 -->
00:19:48.520It's pretty awesome.
00:19:48.520 -->
00:19:52.480But I do not need more self-hosted things to babysit and backup.
00:19:52.480 -->
00:19:53.840So not messing with it.
00:19:53.840 -->
00:19:56.360But people, they really want, this looks pretty neat.
00:19:56.360 -->
00:19:57.380All right.
00:19:57.380 -->
00:19:58.260We're getting close to the end.
00:19:58.260 -->
00:19:58.880I promise.
00:19:58.880 -->
00:19:59.960Yeah, this is the last one.
00:19:59.960 -->
00:20:02.860So have you heard about the Arc browser?
00:20:02.860 -->
00:20:03.600No.
00:20:03.600 -->
00:20:07.080Super minimalist wrapper around Chrome like Vivaldi.
00:20:07.080 -->
00:20:12.620But it's all about like reimagining the web and it's, you don't even see the address bar.
00:20:12.620 -->
00:20:16.840You just hit a command palette and then you type the, type the address you want.
00:20:16.840 -->
00:20:18.540And it's just, it's magic.
00:20:18.540 -->
00:20:25.800And well, if you wanted to, I don't know, take the most extreme caricature of a Silicon
00:20:25.800 -->
00:20:28.800Valley bro, the person running Arc is that.
00:20:28.980 -->
00:20:29.160Okay.
00:20:29.160 -->
00:20:35.420There's some amazing, there's some amazing videos in like a cringy way of, so they made
00:20:35.420 -->
00:20:39.100Arc and it became incredibly popular amongst the people who liked it.
00:20:39.100 -->
00:20:42.800Like it was going really, really, you know, the adoption was going very fast and they decided
00:20:42.800 -->
00:20:43.840we want to build a browser.
00:20:43.840 -->
00:20:47.380It's really based in AI and you don't even need to tell it what you want to do.
00:20:47.380 -->
00:20:48.840It just browses the web for you.
00:20:48.840 -->
00:20:49.960You're just with it.
00:20:49.960 -->
00:20:51.680Like seriously, that's their new project.
00:20:51.680 -->
00:20:53.420And they're kind of like, oh, we're done with this Arc thing.
00:20:53.420 -->
00:20:56.040We're going to go build something that browses the web for you.
00:20:56.320 -->
00:20:58.100So a bunch of people are like, ah, what is there?
00:20:58.100 -->
00:21:02.760Well, it turns out that someone, some group was working on this thing called the Zen browser.
00:21:02.760 -->
00:21:07.980Now I knocked on Mozilla before this is based on Firefox and it's awesome.
00:21:07.980 -->
00:21:08.600Okay.
00:21:08.600 -->
00:21:09.380Okay.
00:21:09.380 -->
00:21:14.960So this is a super minimalist wrapper that gives you a really clean, nice, just let me
00:21:14.960 -->
00:21:15.440see the web.
00:21:15.440 -->
00:21:19.100You know, Chrome was called Chrome because it literally maybe should be anti-Chrome.
00:21:19.100 -->
00:21:23.740It took away the window Chrome, all the junk that used to be around all the toolbars and
00:21:23.740 -->
00:21:24.540buttons and everything.
00:21:24.540 -->
00:21:26.340And it minimalized it.
00:21:26.340 -->
00:21:29.760But this is, you know, the next version of that.
00:21:29.760 -->
00:21:31.460And it's, it's super neat.
00:21:31.460 -->
00:21:34.160So in fact, that's what I'm running right here.
00:21:34.300 -->
00:21:38.460And you can see all the, all the things you can see the little tab bar on the side, but
00:21:38.460 -->
00:21:39.680you don't even have to have that there.
00:21:39.680 -->
00:21:40.760And isn't this nice?
00:21:40.760 -->
00:21:41.580Sure.
00:21:41.580 -->
00:21:42.120It's cool.
00:21:42.120 -->
00:21:42.340Yeah.
00:21:42.340 -->
00:21:43.700So anyway, I'm giving this a try.
00:21:43.700 -->
00:21:45.920It's, it's quite promising.
00:21:45.920 -->
00:21:49.820The people working on it are releasing versions a couple of times a week.
00:21:49.820 -->
00:21:51.780So it says alpha, but it's working pretty well.
00:21:51.780 -->
00:21:55.980So anyway, I do want to shout out like one of the features of the Arc browser is that whenever
00:21:55.980 -->
00:21:58.100you look at a picture of an animal, you see two.
00:21:59.260 -->
00:21:59.960Yeah, exactly.
00:21:59.960 -->
00:22:03.780Of course, because how, how else are they going to go on the Arc?
00:22:03.780 -->
00:22:04.580Yeah.
00:22:04.580 -->
00:22:06.700They're not allowed in if there's just one picture of them.
00:22:06.700 -->
00:22:08.100No, that's pretty good.
00:22:08.100 -->
00:22:08.340Okay.
00:22:08.340 -->
00:22:10.760So I recommend Zen dash browser dot app.
00:22:10.760 -->
00:22:11.760It's, it's pretty awesome.
00:22:11.760 -->
00:22:14.800Right now it doesn't have a built-in ad blocker.
00:22:14.800 -->
00:22:19.520And if you go to a site that's got a bunch of ads and you somehow block them with say DNS
00:22:19.520 -->
00:22:22.540or whatever, they'll leave big gaping holes as did Arc.
00:22:22.540 -->
00:22:24.220Unlike Vivaldi, which takes them away.
00:22:24.220 -->
00:22:28.480But I talked to the Zen browser people and they said that they are very soon releasing
00:22:28.480 -->
00:22:30.300a feature that cleans up this page.
00:22:30.300 -->
00:22:33.540So it's not just pages with holes where there used to be ads, but a clean page.
00:22:33.540 -->
00:22:36.100So anyway, if you're wondering about that, that is coming.
00:22:36.100 -->
00:22:38.720I'm still pretty happy with Vivaldi, but I know.
00:22:38.720 -->
00:22:39.900Go for it.
00:22:39.900 -->
00:22:43.960I'm experimenting, but I'm also still a big fan of Vivaldi.
00:22:43.960 -->
00:22:49.240So this does have the drawbacks that Firefox itself has in the sense that certain pages don't
00:22:49.240 -->
00:22:51.180behave as well based on Firefox, right?
00:22:51.180 -->
00:22:54.440Because it's really Firefox at the core or Gecko or whatever they call the rendering
00:22:54.440 -->
00:22:55.260engine these days.
00:22:55.260 -->
00:22:56.060Okay.
00:22:56.060 -->
00:22:56.580All right.
00:22:56.580 -->
00:22:59.780Over to you for your final item.
00:22:59.780 -->
00:23:01.220Yeah.
00:23:01.220 -->
00:23:05.060So for my final item, I wanted to talk about uv.
00:23:05.060 -->
00:23:11.640So we actually talked about uv twice at the beginning of the show, talking about how uv install
00:23:11.640 -->
00:23:14.260or uv tool install works like Pipex.
00:23:15.120 -->
00:23:21.720But there's an article about from Jeff Triplett saying uv does everything or enough that I'm
00:23:21.720 -->
00:23:23.480not sure what else it needs to do.
00:23:23.480 -->
00:23:25.960This is a great title because that's how I feel.
00:23:25.960 -->
00:23:32.780I mean, uv is I it's kind of refreshing that I need to forget about a lot of things.
00:23:32.780 -->
00:23:37.420And I these other projects are still great, but it solves so many problems.
00:23:37.420 -->
00:23:38.900I'm just going to read here.
00:23:39.260 -->
00:23:43.380UV feels like one of those old infomercials where it solves everything, which is where
00:23:43.380 -->
00:23:48.180we have landed in the Python world, like it slices, dices at Julian's.
00:23:48.180 -->
00:23:52.340So I've had several discussions with friends about uv.
00:23:52.340 -->
00:23:58.400And even when we talk about it during my weekly ish office hours, the list has grown.
00:23:58.940 -->
00:24:04.280And it starts to sound like not just what can it do, but when it's a shorter list to say
00:24:04.280 -->
00:24:05.220what it cannot do.
00:24:05.220 -->
00:24:06.860So let's just come up with some.
00:24:06.860 -->
00:24:10.840He has a list of things that I think are great of how it's replaced things.
00:24:10.840 -->
00:24:13.420So uv pip install replaces pip install.
00:24:13.420 -->
00:24:15.680Not completely, but yes.
00:24:15.680 -->
00:24:16.640Yeah.
00:24:17.600 -->
00:24:19.980I am now using that almost exclusively.
00:24:19.980 -->
00:24:24.600UV V ENV replaces the Python dash M V ENV.
00:24:24.600 -->
00:24:28.000And I'm using that wherever I can.
00:24:28.000 -->
00:24:28.660So, yep.
00:24:28.660 -->
00:24:32.620Using that uv pip compile replaces pip-tools compile.
00:24:32.620 -->
00:24:35.520Pips uv pip sync replaces pip tool sync.
00:24:35.520 -->
00:24:37.620UV run replaces pip X.
00:24:37.620 -->
00:24:40.260UV tool run replaces pip X.
00:24:40.260 -->
00:24:46.020And like we talked before, uv tool install does the installation of tools as well.
00:24:46.700 -->
00:24:52.280UV Python, actually, we covered that on the show, but I haven't really been using that
00:24:52.280 -->
00:24:55.040very much because I use virtual environments.
00:24:55.040 -->
00:24:59.260And a virtual environment just installs Python for me if it's not there.
00:24:59.260 -->
00:25:01.420So that's what I've been doing.
00:25:01.420 -->
00:25:02.320Yeah, it's super awesome.
00:25:02.320 -->
00:25:07.840I don't find I use it very much locally, but I do use it in Docker when I got to get Python
00:25:07.840 -->
00:25:08.720into a Docker image.
00:25:08.720 -->
00:25:09.880It's a nice way to do that.
00:25:09.880 -->
00:25:10.780Cool.
00:25:10.780 -->
00:25:16.080UV build, which was new to me, or I forgot about it.
00:25:16.520 -->
00:25:22.120We'll build your package for PyPI and uv publish publishes it.
00:25:22.120 -->
00:25:26.900I just, you know, I told you I published those two packages, the chameleon dash flask and then
00:25:26.900 -->
00:25:27.920the list monk one.
00:25:27.920 -->
00:25:28.260Yeah.
00:25:28.260 -->
00:25:30.880Both of those uv build, uv publish.
00:25:30.880 -->
00:25:31.380Perfect.
00:25:31.820 -->
00:25:35.280And what I find is I'm using these like on new packages.
00:25:35.280 -->
00:25:36.200I'll do uv.
00:25:36.200 -->
00:25:43.580I'll do build and publish until I get the workflows going because after a package is, you know,
00:25:43.580 -->
00:25:49.000around for a little bit, then I do a GitHub workflow that will just do a build and publish
00:25:49.000 -->
00:25:50.420on with a version.
00:25:50.420 -->
00:25:52.760When I push a version, it does that for me.
00:25:52.760 -->
00:25:54.240Nice.
00:25:54.480 -->
00:25:55.040So there's that.
00:25:55.040 -->
00:26:01.260And then we talked about this GitHub actions with setup uv.
00:26:01.260 -->
00:26:07.240Is there Astral has a setup uv for bringing uv into GitHub actions to make that faster?
00:26:08.040 -->
00:26:13.160And then there's a Docker thing bringing uv and Python to Docker.
00:26:13.160 -->
00:26:13.840I haven't.
00:26:13.840 -->
00:26:14.740Have you used this?
00:26:14.740 -->
00:26:15.600Have we talked about this?
00:26:15.600 -->
00:26:22.600No, I believe it uses multi-layer Docker builds where you have a build image and then you have
00:26:22.600 -->
00:26:26.600the destination image and it gets that one and it copies it into the actual running image.
00:26:26.860 -->
00:26:32.540But I have a base image that just does the curl install and it barely ever updates.
00:26:32.540 -->
00:26:35.100So it's fine for me to just do it that way.
00:26:35.100 -->
00:26:35.980I haven't messed with this.
00:26:35.980 -->
00:26:44.580And so I liked the idea where poetry was going a while ago with trying to have like kind of
00:26:44.580 -->
00:26:48.940a unified project feel for, you know, to have these project files.
00:26:48.940 -->
00:26:51.500But I wasn't ready for it then.
00:26:51.500 -->
00:26:58.020But now that I've converted everything to pyproject.toml, having that as my project file makes sense.
00:26:58.020 -->
00:27:04.740And uv has add, remove, sync, and lock that do things that are project related.
00:27:04.740 -->
00:27:07.980So adding a dependency to a project, removing.
00:27:07.980 -->
00:27:13.240So it'll add to pyproject.toml, remove, sync.
00:27:13.240 -->
00:27:16.400And I'm actually finding I'm using this a lot.
00:27:16.400 -->
00:27:23.620So I'll create a, so I'll clone a project, create a virtual environment, and do uv sync.
00:27:23.620 -->
00:27:29.400And it installs everything that's in the project.toml or requirements file suite.
00:27:29.400 -->
00:27:31.160So uv sync is awesome.
00:27:31.160 -->
00:27:32.780Yeah.
00:27:32.780 -->
00:27:34.960So then he talks about what does it not do?
00:27:34.960 -->
00:27:40.860And does it run custom scripts defined in your project.toml?
00:27:40.860 -->
00:27:41.760Oh, OK.
00:27:42.380 -->
00:27:43.800There's a few things it doesn't do.
00:27:43.800 -->
00:27:47.180It doesn't manage bumper and bump versions like bumper.
00:27:47.180 -->
00:27:49.900There's so many ways that people do versions of it.
00:27:49.900 -->
00:27:54.740You know, do you have a bumper sort of a thing that you use, Michael?
00:27:54.740 -->
00:27:56.500Because I used to.
00:27:56.500 -->
00:27:57.580I used to use a couple.
00:27:57.580 -->
00:28:00.880But they were more complicated.
00:28:00.880 -->
00:28:02.640I mean, it was just an extra thing.
00:28:02.640 -->
00:28:06.260And I thought all it's doing is changing a number for me.
00:28:06.260 -->
00:28:07.120I can just do that.
00:28:07.120 -->
00:28:07.980Exactly.
00:28:07.980 -->
00:28:09.620No, not really.
00:28:09.620 -->
00:28:15.760I have one that sort of keeps track of how many deploys or pushed to productions I have for certain things.
00:28:15.760 -->
00:28:17.240But it's kind of meaningless.
00:28:17.240 -->
00:28:19.560So short answer, no.
00:28:19.560 -->
00:28:21.460I love the last item.
00:28:21.460 -->
00:28:23.160UV doesn't replace Python.
00:28:23.160 -->
00:28:25.460Nor should it.
00:28:25.460 -->
00:28:27.420But I am.
00:28:27.420 -->
00:28:32.900I'm really, you know, I don't even feel bad that I'm using uv in all the places where I can.
00:28:32.900 -->
00:28:33.940Because why not?
00:28:36.620 -->
00:28:38.720I am your father.
00:28:38.720 -->
00:28:41.760No, I don't feel bad about it either.
00:28:41.760 -->
00:28:42.220I love it.
00:28:42.220 -->
00:28:49.740It's revolutionary in how quick it does things and how comprehensively it does it.
00:28:49.740 -->
00:28:54.780Especially getting Python versions onto your machine and creating virtual environments with different versions of Python.
00:28:54.780 -->
00:28:55.460It's glorious.
00:28:55.460 -->
00:28:55.940Yeah.
00:28:55.940 -->
00:28:57.820All right.
00:28:58.400 -->
00:29:01.840Before we get to our extras, there are any other extras.
00:29:01.840 -->
00:29:08.040No other extras, except for we have an extra sponsor I'd love to tell people about.
00:29:08.040 -->
00:29:14.660This portion of Python Bytes is brought to you by Codeium, the AI tool of choice for professional software developers.
00:29:14.660 -->
00:29:17.640That's C-O-D-E-I-U-M.
00:29:17.640 -->
00:29:26.240Codeium removes tedium from your development through a suite of state-of-the-art AI capabilities available with extensions in all of your favorite IDEs.
00:29:26.240 -->
00:29:35.840Use Codeium in VS Code, the JetBrains IDEs, including PyCharm, Visual Studio Proper, Eclipse, Xcode, NeoVim, Jupyter Notebooks, and more.
00:29:35.840 -->
00:29:47.560Uniquely, Codeium is fully enterprise-ready with over 1,000 paying enterprise customers, including multiple regulated Fortune 500 companies in completely self-hosted air-gap deployments.
00:29:47.560 -->
00:29:50.780Join over a million developers and use Codeium for free forever.
00:29:50.780 -->
00:29:56.380Once you see the value, then it's time to ask your company to consider a free trial of the enterprise plan.
00:29:56.380 -->
00:30:02.260To learn more about Codeium and get started today for free, visit pythonbytes.fm/Codeium.
00:30:02.260 -->
00:30:06.960That is pythonbytes.fm/C-O-D-E-I-U-M.
00:30:06.960 -->
00:30:07.800Don't forget the E.
00:30:07.800 -->
00:30:10.820Or just click the link in your podcast player's show notes.
00:30:10.820 -->
00:30:13.340Thank you to Codeium for supporting Python Bytes.
00:30:13.340 -->
00:30:14.120Absolutely.
00:30:14.120 -->
00:30:15.900So no extras.
00:30:15.900 -->
00:30:16.940I got an extra.
00:30:16.940 -->
00:30:18.000Wait, you got extra.
00:30:18.000 -->
00:30:21.580I have no extras because I am still out of breath from covering all the extra extras.
00:30:21.580 -->
00:30:22.340Yeah, the extras.
00:30:23.340 -->
00:30:30.280So I wanted to just, there's a little article from Ned Batchelder, coverage.py originally.
00:30:30.280 -->
00:30:35.260And it's, what I thought was, I always wondered why it's called coverage.py.
00:30:35.260 -->
00:30:38.300Is it because it's like all the stuff on PyPI is Python.
00:30:38.300 -->
00:30:39.800So why .py?
00:30:39.800 -->
00:30:43.620Well, it used to be one line of code or one file, not one line of code.
00:30:43.620 -->
00:30:46.160But it was originally a single file.
00:30:46.160 -->
00:30:49.240So the coverage.py name was literal.
00:30:49.240 -->
00:30:52.860It was a name of a file and it had only 350 lines of code.
00:30:53.160 -->
00:30:57.440And it was written by Gareth Rees in 2001.
00:30:57.440 -->
00:31:01.360And Ned started maintaining it in 2004.
00:31:01.360 -->
00:31:02.720So a few years later.
00:31:02.720 -->
00:31:06.660And he still will tell you, I didn't invent coverage.py.
00:31:06.660 -->
00:31:07.900I'm just maintaining it.
00:31:07.900 -->
00:31:10.280But he's maintained it for all but three years.
00:31:10.280 -->
00:31:16.300And now it's 20,000 lines of code and about 100 files.
00:31:16.300 -->
00:31:20.660So it's, and it's got twice the amount of C code as it originally had.
00:31:20.660 -->
00:31:22.940And it's almost 20 years later.
00:31:22.940 -->
00:31:25.780Ned's still pushing the ball forward.
00:31:25.780 -->
00:31:27.040So we appreciate that, Ned.
00:31:27.040 -->
00:31:29.480And that's why it's called coverage.py.
00:31:29.480 -->
00:31:30.520So that was it.
00:31:30.520 -->
00:31:31.700Yeah, very cool.
00:31:31.700 -->
00:31:32.700The other extra.
00:31:32.700 -->
00:31:33.46020 years.
00:31:33.460 -->
00:31:33.920Ryan.
00:31:33.920 -->
00:31:35.28020 years on a project.
00:31:35.280 -->
00:31:35.780Yeah.
00:31:35.920 -->
00:31:36.360That's awesome.
00:31:36.360 -->
00:31:39.620And we couldn't ask for a better maintainer for this project.
00:31:39.620 -->
00:31:40.600So Ned's awesome.
00:31:41.540 -->
00:31:51.660The other thing is there's a lot of, there's been some news lately about people wanting to shift from what used to be Twitter and now is X.
00:31:51.660 -->
00:31:54.020And go to, a lot of people are going to Bluesky.
00:31:54.020 -->
00:31:55.180I'm trying it out myself.
00:31:55.180 -->
00:31:58.300So if you're over on Bluesky, connect with me.
00:31:58.300 -->
00:32:00.440And we'll play with it a bit.
00:32:00.440 -->
00:32:04.700See if we want to do something else for the podcast or not.
00:32:04.700 -->
00:32:05.460All right, cool.
00:32:05.460 -->
00:32:06.420You might drag me over there.
00:32:06.420 -->
00:32:07.060I'm not there yet.
00:32:07.060 -->
00:32:10.080But on the Mastodon and the others.
00:32:10.080 -->
00:32:15.440One of the things, I was going to try to find this article, but I can't find it.
00:32:15.440 -->
00:32:23.880There was an article saying that a year ago, or even just a few months ago, there were so many millions of people on Bluesky.
00:32:23.880 -->
00:32:25.700But none of them were very active.
00:32:25.700 -->
00:32:30.260Like me, I had an account, but it wasn't there very much.
00:32:30.260 -->
00:32:32.700And it sort of feeds on itself, right?
00:32:32.700 -->
00:32:33.580It's a network effect.
00:32:33.580 -->
00:32:38.900If you talk and nobody says anything back to you, it's not fun.
00:32:38.900 -->
00:32:41.640But now it's got a huge growth.
00:32:41.640 -->
00:32:44.640Even Taylor Swift said she's switching over to Bluesky.
00:32:44.640 -->
00:32:48.200But there's a lot of Python people there now, too.
00:32:48.200 -->
00:32:50.300And it's not just an echo chamber.
00:32:50.300 -->
00:32:53.220The people are actually hanging out and replying and stuff.
00:32:53.220 -->
00:32:55.100So it's getting fun there.
00:32:55.100 -->
00:32:56.840So just letting you know.
00:32:56.840 -->
00:32:57.740Awesome.
00:32:58.260 -->
00:32:59.980And that was my extra, really.
00:32:59.980 -->
00:33:02.380Go follow Brian in the sky.
00:33:02.380 -->
00:33:02.920Yeah.
00:33:02.920 -->
00:33:04.320All right.
00:33:04.320 -->
00:33:05.000Ready for a joke?
00:33:05.000 -->
00:33:06.180I am very ready.
00:33:06.180 -->
00:33:06.560I am.
00:33:06.560 -->
00:33:13.020Also, a quick shout out to the Momentum extension, which gives you a cool little homepage with all sorts of fun stuff you want.
00:33:13.020 -->
00:33:14.480Oh, that's on your New Zen thing?
00:33:14.480 -->
00:33:16.040Yeah, but you can get that in Vivaldi.
00:33:16.040 -->
00:33:16.720You can get that wherever.
00:33:16.720 -->
00:33:17.200Yeah.
00:33:17.200 -->
00:33:17.380Okay.
00:33:17.380 -->
00:33:18.240Yeah.
00:33:18.240 -->
00:33:18.760Very neat.
00:33:19.840 -->
00:33:21.640And a bunch of cool little hot links.
00:33:21.640 -->
00:33:22.440But that's not funny.
00:33:22.440 -->
00:33:22.900No.
00:33:22.900 -->
00:33:23.720Sleeping is funny.
00:33:23.720 -->
00:33:25.400How about how programmers sleep?
00:33:25.400 -->
00:33:28.040We talked about how they sit in chairs last time.
00:33:28.040 -->
00:33:30.420We're down to the basics here, Brian.
00:33:30.420 -->
00:33:30.980Okay.
00:33:31.220 -->
00:33:33.980But I think many of us will relate to this.
00:33:33.980 -->
00:33:37.080So there's a picture of a programmer, cat, sleeping.
00:33:37.080 -->
00:33:37.840Earthquake.
00:33:37.840 -->
00:33:38.660Still asleep.
00:33:38.660 -->
00:33:39.460Thunderstorm.
00:33:39.460 -->
00:33:40.400Still asleep.
00:33:40.400 -->
00:33:41.260Alien attack.
00:33:41.260 -->
00:33:41.840Pew, pew.
00:33:41.840 -->
00:33:42.760Still asleep.
00:33:42.760 -->
00:33:45.220Remembers how to fix that error on line 56.
00:33:45.220 -->
00:33:45.720Boom.
00:33:45.720 -->
00:33:46.660Shoots out of bed.
00:33:46.660 -->
00:33:48.800God.
00:33:48.800 -->
00:33:51.560It's three in the morning, but I can fix it.
00:33:51.560 -->
00:33:52.160Yes.
00:33:52.160 -->
00:33:53.220Definitely.
00:33:53.220 -->
00:33:58.420Liz says, I'm in that picture, and I don't like it.
00:33:58.420 -->
00:34:00.280Okay.
00:34:00.640 -->
00:34:01.400Sort of related.
00:34:01.400 -->
00:34:02.500I got to tell this story.
00:34:02.500 -->
00:34:07.340Last night, I was writing up an article on, not an article.
00:34:07.340 -->
00:34:14.240I was explaining to some of my sponsors how some requirements cannot be implemented.
00:34:14.240 -->
00:34:18.460And I listed out the reasons why the implementation is not possible.
00:34:18.460 -->
00:34:26.820And then at the end, I'm like, either we don't do this, or we move the database out of one of the objects.
00:34:26.820 -->
00:34:27.740Well, we can move.
00:34:27.740 -->
00:34:28.380That's fine.
00:34:28.380 -->
00:34:29.480I saw it.
00:34:29.480 -->
00:34:30.560It's possible.
00:34:30.980 -->
00:34:31.140Yeah.
00:34:31.140 -->
00:34:31.800Yeah.
00:34:31.800 -->
00:34:36.220So sleep or writing it down helped to figure out.
00:34:36.220 -->
00:34:36.480Yeah.
00:34:36.480 -->
00:34:38.280Or even just going for a walk or something.
00:34:38.280 -->
00:34:39.760I would do that a lot when I get stuck.
00:34:39.760 -->
00:34:43.020When I was earlier in my career, I'm like, it's time for a walk around the building.
00:34:43.020 -->
00:34:44.240I'll be back in 10 minutes.
00:34:44.480 -->
00:34:46.540And also, yeah.
00:34:46.540 -->
00:34:51.540Wait, I'm babysitting a kitten right now, and he's not letting me sleep.
00:34:51.540 -->
00:34:55.440So he might be sleeping through a thunderstorm, but I'm not sleeping through the kitten.
00:34:55.440 -->
00:34:56.580So anyway.
00:34:56.580 -->
00:34:58.260Very meta.
00:34:58.260 -->
00:34:59.580I think we got to leave it there.
00:34:59.580 -->
00:35:00.020What do you think?
00:35:00.020 -->
00:35:01.600Yeah, let's stop talking.
00:35:03.600 -->
00:35:05.460Thanks again, Michael, for a wonderful episode.
00:35:05.460 -->
00:35:05.880Bye.
00:35:05.880 -->
00:35:06.280Yeah.
00:35:06.280 -->
00:35:06.940Thanks as always.