WEBVTT 00:00:00.020 --> 00:00:04.800 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. 00:00:05.380 --> 00:00:11.680 This is episode 458, recorded November 17th, 2025. 00:00:12.120 --> 00:00:12.620 I'm Michael Kennedy. 00:00:13.040 --> 00:00:13.780 And I'm Brian Okken. 00:00:14.140 --> 00:00:16.020 And this episode is brought to you by us. 00:00:16.480 --> 00:00:17.300 All the things that we're doing. 00:00:17.320 --> 00:00:20.000 We have many fun and useful things to offer you. 00:00:20.560 --> 00:00:24.040 pytest books, pytest courses, Python training courses, 00:00:24.540 --> 00:00:28.320 the agentic AI programming course about how you take agentic AI 00:00:28.320 --> 00:00:32.020 and turn it from like weird wizardry smushiness into engineering. 00:00:32.279 --> 00:00:33.500 It's going incredibly well. 00:00:34.120 --> 00:00:35.320 So check that course out. 00:00:35.720 --> 00:00:36.860 Follow us on the socials. 00:00:37.180 --> 00:00:41.240 Put them by set up slash live if you want to see this live 00:00:41.360 --> 00:00:43.180 or streaming live or see the old shows. 00:00:43.700 --> 00:00:45.620 And be sure to sign up to our newsletter. 00:00:45.840 --> 00:00:48.220 We have tons of people really getting a lot of value with that. 00:00:48.440 --> 00:00:49.340 Brian's putting that out. 00:00:49.959 --> 00:00:51.880 And yeah, it's truly nice. 00:00:52.060 --> 00:00:53.600 It's not just the links of the show notes, 00:00:53.820 --> 00:00:57.280 but it's extra deep information, background information, 00:00:57.340 --> 00:00:57.960 that kind of stuff. 00:00:58.180 --> 00:00:59.520 And the joke, always the joke, Brian. 00:00:59.820 --> 00:01:00.720 Always the joke. 00:01:00.920 --> 00:01:05.760 And we put a link to the joke, if we can find a link to the joke, in the newsletter as well. 00:01:06.060 --> 00:01:06.220 Exactly. 00:01:07.000 --> 00:01:12.360 Sometimes the joke has a link, and sometimes it's just like a dad programming joke, and it just has words. 00:01:13.280 --> 00:01:14.280 What do you want to talk about first? 00:01:14.940 --> 00:01:16.520 I actually want to talk about Django. 00:01:17.960 --> 00:01:18.600 Oh, really? Okay. 00:01:19.460 --> 00:01:22.920 And actually, kind of lightweight, I want to talk about the Django website. 00:01:23.980 --> 00:01:29.140 I guess I heard about this, but there was a discussion about maybe redesigning the Django 00:01:29.280 --> 00:01:29.420 website. 00:01:29.560 --> 00:01:31.400 It's been the same for a while. 00:01:32.280 --> 00:01:32.900 And it works. 00:01:33.680 --> 00:01:34.060 It's good. 00:01:34.280 --> 00:01:43.840 But I noticed Adam Hill put out a mock-up for what the Django website might look like. 00:01:43.900 --> 00:01:46.320 So here's his new one. 00:01:46.500 --> 00:01:47.920 And I'm kind of liking it. 00:01:47.920 --> 00:01:51.280 I like the animated thing at the top. 00:01:51.540 --> 00:01:52.580 It's the task framework. 00:01:52.920 --> 00:01:53.680 It's the web framework. 00:01:55.280 --> 00:01:58.360 Did Django just jump like 20 years into the future? 00:01:59.160 --> 00:01:59.640 Yeah, it looks... 00:01:59.680 --> 00:02:01.720 From where it was to the current day, it was. 00:02:01.900 --> 00:02:03.120 It looks pretty good. 00:02:03.300 --> 00:02:05.380 It's got like search documentation at the top 00:02:05.560 --> 00:02:06.600 that's really easy to find. 00:02:06.780 --> 00:02:08.520 I mean, I guess there was... 00:02:08.520 --> 00:02:09.340 Yeah, there's no... 00:02:09.340 --> 00:02:10.940 I don't know where you have to... 00:02:10.940 --> 00:02:13.300 The search documentation isn't at the top here. 00:02:13.300 --> 00:02:14.160 I like the search there. 00:02:15.720 --> 00:02:16.640 I'm liking it. 00:02:16.740 --> 00:02:19.440 I like just the life of it. 00:02:20.440 --> 00:02:21.240 Feels good. 00:02:21.600 --> 00:02:23.060 I think that maybe we should go with it. 00:02:23.160 --> 00:02:29.660 but you know it's just my vote but that you can you can join the discussion too if you'd like to 00:02:29.760 --> 00:02:37.080 help out and and there is some assistance that that adam hill is okay with so there's and 00:02:37.140 --> 00:02:42.880 it's not just him if you i'm putting a link to a discussion uh where he announced what his little 00:02:43.140 --> 00:02:50.779 his demo um he said i'd love help with in the form of prs to the repo explicitly not looking for 00:02:50.800 --> 00:02:56.880 drive-by critical feedback without PRs. It's fine. I guess here's my drive-by feedback. I like it. 00:02:57.200 --> 00:03:03.100 I know that's not really, but I do like it. And, but you can read, it looks like he kind of picked 00:03:03.220 --> 00:03:09.600 this up off of other, there was other work. Just a reminder that this doc informed my approach. So 00:03:09.660 --> 00:03:16.420 there's another document about things. I didn't look at it actually, but the discussion's been 00:03:16.340 --> 00:03:21.480 going on for a while, if I scroll to the top, there's been a discussion on, let me do this, 00:03:22.280 --> 00:03:28.140 up to September 21st. Oh, it looks like he started it, that maybe we ought to redesign the website. 00:03:28.540 --> 00:03:35.780 It's not too long, man, September 21st to now. But I think that it'd be cool to give. Why not? 00:03:35.980 --> 00:03:36.820 Let's go for it. 00:03:36.820 --> 00:03:42.920 You know what? I think, look, Django's a web framework. It should not look like it's, you know, 00:03:42.960 --> 00:03:47.700 15 years old and outdated and rusty. I mean, it's a project that's getting tons of love and 00:03:47.900 --> 00:03:53.100 attention. And I think it's a really good idea to make it feel like it belongs at the cutting edge 00:03:53.120 --> 00:04:01.240 of web development these days. And, you know, just that website is aged. Yeah, it's like a long time, 00:04:01.520 --> 00:04:07.980 right? Yeah, it is a long time. But also, even if the it should be a the to make it feel alive, 00:04:08.080 --> 00:04:10.140 also the website could be in progress. 00:04:10.260 --> 00:04:11.560 It could change also. 00:04:11.840 --> 00:04:14.180 Not that, I mean, even if this one doesn't, 00:04:14.400 --> 00:04:15.360 I mean, maybe this is great 00:04:15.380 --> 00:04:16.220 and this will be great for, 00:04:16.420 --> 00:04:17.859 the new one will be great for a long time. 00:04:18.320 --> 00:04:20.519 But I think that we should be tweaking it 00:04:20.820 --> 00:04:21.600 on a regular basis 00:04:21.940 --> 00:04:23.880 just to make sure people understand 00:04:24.120 --> 00:04:25.440 that it's still moving. 00:04:25.780 --> 00:04:26.480 Yeah, absolutely. 00:04:26.780 --> 00:04:28.060 And hat tip to Adam Hill. 00:04:28.160 --> 00:04:29.580 That is a very nice looking website. 00:04:30.000 --> 00:04:31.680 Yeah, I think it's neat. 00:04:31.920 --> 00:04:32.720 Plus, I love that. 00:04:33.260 --> 00:04:34.320 I got to say, 00:04:34.360 --> 00:04:35.780 I love the documentation at the top, 00:04:35.960 --> 00:04:36.520 the search docs, 00:04:36.840 --> 00:04:38.640 because I often just go there, 00:04:38.730 --> 00:04:40.520 because I'm used to going to a project homepage 00:04:40.750 --> 00:04:41.680 to search the docs. 00:04:41.890 --> 00:04:42.500 So, yeah. 00:04:42.760 --> 00:04:42.860 Yeah. 00:04:44.280 --> 00:04:45.580 All right, what you got? 00:04:46.820 --> 00:04:51.620 I want to dive into some concurrent database stuff. 00:04:52.210 --> 00:04:55.620 So I want to talk about aiosqlitepool. 00:04:55.890 --> 00:04:57.120 So there's three concepts here. 00:04:57.840 --> 00:04:59.500 Async IO, SQLite, 00:04:59.860 --> 00:05:02.640 and then a connection pool type of thing. 00:05:02.860 --> 00:05:04.899 So normally you just work with SQLite 00:05:04.920 --> 00:05:10.380 And it just says, hey, let's go open up all the infrastructure to talk to the SQLite database and do your work. 00:05:10.380 --> 00:05:11.300 And then it closes it. 00:05:11.400 --> 00:05:11.980 Then it opens it. 00:05:12.060 --> 00:05:12.820 Then it closes it. 00:05:12.840 --> 00:05:13.480 Then it opens it. 00:05:13.620 --> 00:05:16.600 And that's not necessarily the fastest way to do that. 00:05:16.760 --> 00:05:18.060 Maybe you could just leave it open. 00:05:18.720 --> 00:05:23.940 But you don't want to leak these connections or have a whole insane ton of them open. 00:05:24.100 --> 00:05:26.360 So instead, the idea is to use this connection pool. 00:05:26.620 --> 00:05:30.020 So you say, instead of giving me a connection, you say, give me a connection from the pool. 00:05:30.600 --> 00:05:30.700 Right. 00:05:30.920 --> 00:05:35.560 And it'll keep a certain number of them open and hand them over to you when it needs or wait. 00:05:35.620 --> 00:05:41.440 If there's already 10 connections running queries, you probably can just better off to wait and try to hit it with another. 00:05:42.300 --> 00:05:44.080 So that's what this is. 00:05:44.600 --> 00:05:46.380 And it's not a replacement. 00:05:46.680 --> 00:05:49.060 Maybe people have heard of AIO SQLite. 00:05:49.460 --> 00:05:54.680 AIO SQLite is a way to talk async and await, but to SQLite. 00:05:54.680 --> 00:06:00.180 And all this is a little bit funky and interesting because SQLite is a file that runs in process. 00:06:00.480 --> 00:06:03.720 It's stored as a file and it's a thing that runs in your Python process. 00:06:04.340 --> 00:06:06.940 So you're not going out to the network and waiting and that kind of thing. 00:06:07.700 --> 00:06:11.720 But this AIO SQLite gives you an async programming model. 00:06:12.080 --> 00:06:14.680 But the way it works is you create a connection, do a query, 00:06:14.880 --> 00:06:17.680 and then when you do async with, when that with block, 00:06:17.760 --> 00:06:20.220 that context manager closes, the connection's gone. 00:06:20.600 --> 00:06:22.400 So over and over, it's kind of up and down. 00:06:22.920 --> 00:06:29.899 And so the idea is this aiosqlitepool wraps this SQLite library 00:06:30.260 --> 00:06:32.620 for basically three core problems. 00:06:32.760 --> 00:06:34.420 One, it tries to eliminate connection overhead 00:06:34.740 --> 00:06:37.700 by avoiding repeatedly opening and closing 00:06:38.480 --> 00:06:40.580 syscalls, mem allocation, teardowns, 00:06:40.820 --> 00:06:41.640 all that kind of stuff, right? 00:06:41.760 --> 00:06:42.260 Which I already described. 00:06:43.060 --> 00:06:45.960 It also has the advantage of potentially faster queries 00:06:46.160 --> 00:06:47.220 via hot cache. 00:06:47.360 --> 00:06:50.020 So long-lived connections keep SQLite's 00:06:50.100 --> 00:06:52.040 in-memory page cache hot, right? 00:06:52.580 --> 00:06:54.920 So once a database has seen a query, 00:06:55.040 --> 00:06:56.300 it has to look at the query and say, 00:06:56.380 --> 00:06:58.320 okay, we're going to come up with a query plan. 00:06:58.340 --> 00:06:59.300 Do we use this index? 00:06:59.560 --> 00:07:00.500 Are there any indexes? 00:07:00.540 --> 00:07:01.340 How are we going to sort it? 00:07:01.600 --> 00:07:02.380 Is it a table scan? 00:07:02.520 --> 00:07:03.560 There's all these things, right? 00:07:03.900 --> 00:07:05.540 And that has to be determined for a query. 00:07:05.620 --> 00:07:09.300 So it could be kept around and reused better, potentially. 00:07:10.320 --> 00:07:11.900 And maximize the connection throughput. 00:07:12.260 --> 00:07:16.100 So there's a bunch of stuff in here and some examples and so on. 00:07:16.160 --> 00:07:19.820 Again, similar programming model with connection with async width, 00:07:19.980 --> 00:07:21.360 but you get a connection from the pool. 00:07:21.780 --> 00:07:25.400 Somewhere down here, though, there are some stats, I do believe. 00:07:26.100 --> 00:07:27.300 Yes, the very, very bottom. 00:07:28.160 --> 00:07:28.600 Let's see. 00:07:29.180 --> 00:07:42.240 It says just doing 100,000 complex read operations across 20 workers with a reasonable-ish database setup, 5 million comments, 10 million likes, 100,000 posts. 00:07:42.260 --> 00:07:47.620 And so like real data, not just like there's three items, query them, which one is, you know, which one's bigger than one. 00:07:47.920 --> 00:07:51.420 Anyway, with all that, it says what's your throughput without the pool? 00:07:51.740 --> 00:07:54.080 You get 3,000 operations a second with it. 00:07:54.340 --> 00:07:55.340 You get 6,000. 00:07:55.380 --> 00:08:00.400 basically for all the metrics you care about it's like a 2x improvement almost not quite but almost 00:08:00.700 --> 00:08:07.700 so like throughput's almost double the latency's almost half more than half um better than that um 00:08:08.120 --> 00:08:13.140 so on right so instead of 60 milliseconds it's 20 milliseconds response time that kind of thing so 00:08:13.600 --> 00:08:20.319 why not you know if this is easy to use so you're gonna like maybe i'm dense but the i can use this 00:08:20.360 --> 00:08:23.360 and I can have multiple async 00:08:23.720 --> 00:08:25.860 or multiple parts of my process 00:08:26.720 --> 00:08:28.460 accessing the same file at the same time? 00:08:28.940 --> 00:08:29.040 Yeah. 00:08:29.380 --> 00:08:29.580 Okay. 00:08:30.160 --> 00:08:32.599 Yeah, SQLite supports concurrent access. 00:08:33.680 --> 00:08:34.820 And especially if you're reading, 00:08:35.120 --> 00:08:37.219 there's no problem reading the file in parallel. 00:08:37.640 --> 00:08:37.840 Yeah. 00:08:37.979 --> 00:08:38.099 Right? 00:08:38.599 --> 00:08:39.120 So, yeah. 00:08:39.360 --> 00:08:41.200 Anyway, if you're doing SQLite stuff 00:08:41.840 --> 00:08:42.919 and you're doing async stuff, 00:08:43.200 --> 00:08:43.520 check this out. 00:08:43.599 --> 00:08:45.760 There may also be a SQLite pool that is not async. 00:08:45.860 --> 00:08:46.220 I have no idea. 00:08:46.380 --> 00:08:47.060 I haven't looked at that. 00:08:47.200 --> 00:08:49.140 But once you get to the point where you're like, 00:08:49.300 --> 00:08:51.740 I'm worried about concurrent speed access to my database, 00:08:51.960 --> 00:08:54.660 you know what, you're probably already in async land anyway. 00:08:54.830 --> 00:08:55.920 So here you are. 00:08:56.280 --> 00:08:56.460 Yeah. 00:08:57.820 --> 00:08:59.740 So the answer is, yes, you're dense. 00:08:59.960 --> 00:09:01.100 And I'm going to answer you anyway. 00:09:02.020 --> 00:09:02.780 But no, thanks. 00:09:03.400 --> 00:09:03.940 Yeah, yeah. 00:09:04.880 --> 00:09:05.600 All right, over to you. 00:09:06.080 --> 00:09:06.440 OK. 00:09:07.280 --> 00:09:08.900 I am going to-- 00:09:09.420 --> 00:09:11.400 I'd like to talk about dependencies a little bit. 00:09:11.820 --> 00:09:13.219 Last week-- I think it was last week-- 00:09:13.240 --> 00:09:20.300 We talked about pipdeptree and uv pip tree. 00:09:21.640 --> 00:09:22.740 And those are great things. 00:09:24.740 --> 00:09:26.680 This sounds similar, but it's not. 00:09:27.600 --> 00:09:31.280 I'm going to talk about DEPTRY, D-E-P-T-R-Y. 00:09:31.740 --> 00:09:34.120 And I'm pretty sure this was recommended by somebody, 00:09:34.220 --> 00:09:36.120 but I couldn't find the reference. 00:09:36.480 --> 00:09:39.060 So I'm sorry for losing your name, 00:09:39.200 --> 00:09:42.640 but thanks to everybody for suggesting topics. 00:09:43.160 --> 00:09:46.140 So Deptree is D-E-P-T-R-Y. 00:09:46.780 --> 00:09:53.380 And what it does is it's a command line tool to check for issues with dependencies in a Python project, 00:09:53.960 --> 00:09:56.160 such as unused or missing dependencies. 00:09:56.860 --> 00:10:02.220 So the idea is like, so I appreciate the unused part. 00:10:02.690 --> 00:10:05.880 The missing dependencies I'm probably going to catch and test, but hopefully, 00:10:06.310 --> 00:10:08.100 but maybe you don't have thorough tests. 00:10:08.620 --> 00:10:13.520 So if you're importing something and it doesn't show up in your requirements file or your 00:10:13.960 --> 00:10:16.140 Python project.toml, it'll flag that. 00:10:16.540 --> 00:10:17.560 And the reverse is true too. 00:10:17.680 --> 00:10:23.160 So if you have a dependency listed, but maybe you refactored your code and you're not using 00:10:23.680 --> 00:10:27.520 that dependency anymore, it'd be nice to find out that you don't need it. 00:10:28.240 --> 00:10:29.660 So that's pretty much what it does. 00:10:29.920 --> 00:10:31.280 But I really wanted one. 00:10:31.720 --> 00:10:33.400 And it's pretty easy. 00:10:33.700 --> 00:10:37.780 You install it in your project and then you run it. 00:10:37.920 --> 00:10:41.360 and it scans everything and lets you know if, 00:10:41.580 --> 00:10:44.920 hey, you've got, for instance, NumPy is imported, 00:10:45.020 --> 00:10:47.080 but you didn't declare it as a dependency. 00:10:47.880 --> 00:10:51.460 And it does have this idea of development in dependencies 00:10:53.120 --> 00:10:54.320 versus project dependencies, 00:10:54.760 --> 00:10:56.900 and that's the part that tripped me up a little bit. 00:10:57.500 --> 00:10:58.620 That's the switch. 00:10:58.720 --> 00:11:03.840 It's either development dependency or a project dependency. 00:11:04.460 --> 00:11:10.620 And it's unfortunately super easy to get started and really easy to get tripped up by it. 00:11:10.810 --> 00:11:18.840 And I got tripped up because I use optional dependencies for tests often. 00:11:19.150 --> 00:11:22.580 So I'll do something like list test. 00:11:24.030 --> 00:11:26.800 In my project, I'll say project optional dependency. 00:11:27.110 --> 00:11:29.920 For test, I've got pytest and all my pytest plugins. 00:11:31.160 --> 00:11:37.920 And then maybe doc for docs for all of my make docs or something to build the documentation. 00:11:38.360 --> 00:11:38.860 Pretty standard. 00:11:39.300 --> 00:11:51.260 But what Deptree does is it finds these optional dependencies and just includes them in your normal dependencies because it might be your CLI or your GUI, which is interesting. 00:11:52.280 --> 00:11:57.740 I guess I don't get why your GUI or your CLI would be optional, but maybe two choices. 00:11:58.100 --> 00:12:04.900 I don't like it either, but I think I've seen it like I want to install this and only have the CLI or I want to install this. 00:12:05.320 --> 00:12:09.240 And I do also want to have the GUI and the GUI install might be super heavyweight. 00:12:09.500 --> 00:12:09.900 You know what I mean? 00:12:10.020 --> 00:12:15.180 It's just a way to say I want less instead of like the union of all possible use cases. 00:12:15.790 --> 00:12:16.180 Actually, I. 00:12:16.590 --> 00:12:17.020 Oh, cool. 00:12:17.120 --> 00:12:17.540 I've got a. 00:12:17.880 --> 00:12:22.020 I wonder if I can work this as a test in test suites because there's times where I want some. 00:12:22.280 --> 00:12:25.820 Anyway, I'm getting off on a tangent, but I think this would be fun to play with with test suites. 00:12:26.960 --> 00:12:34.080 Why I'm going down this rabbit hole is because the most common thing in the usage and configuration, 00:12:34.320 --> 00:12:36.100 it's like buried in here. 00:12:36.260 --> 00:12:40.520 But if I look for a pytest, I'm going to have to look for it a couple of times, I guess. 00:12:40.820 --> 00:12:41.280 Here we go. 00:12:41.720 --> 00:12:48.260 So optional dependencies test of pytest, you have to list it out as you have to add this 00:12:49.120 --> 00:12:55.980 big pip dep tree or tool dot dep tree and then pep621 dev dependency groups. 00:12:56.560 --> 00:12:59.880 this is kind of verbose guys, but that's what you got to do. 00:12:59.960 --> 00:13:03.900 And if you do that, it all works fine because I just like tried this out on a 00:13:03.990 --> 00:13:07.100 simple project and it said, you're in, you've included pytest, 00:13:07.220 --> 00:13:10.140 but you don't import it anywhere. No, I don't import it anywhere. 00:13:10.380 --> 00:13:11.580 I'm using it for my test. 00:13:13.080 --> 00:13:14.660 Do you understand what this is for? 00:13:16.160 --> 00:13:19.620 So I'm a little thrown that I think, 00:13:19.920 --> 00:13:22.920 I think maybe I'll suggest that this, that the, 00:13:23.140 --> 00:13:28.200 their example of using your depend that the dev dependency groups are at the 00:13:28.200 --> 00:13:29.720 very least test and docs. 00:13:30.200 --> 00:13:31.860 And I think that that should be the default. 00:13:31.930 --> 00:13:33.780 I don't think you should have to declare that. 00:13:34.600 --> 00:13:34.900 You know, 00:13:35.180 --> 00:13:35.280 if, 00:13:35.580 --> 00:13:35.640 if, 00:13:35.770 --> 00:13:37.700 if you've got a tests or docs, 00:13:38.160 --> 00:13:38.380 it's, 00:13:38.620 --> 00:13:40.540 it's probably a development dependency, 00:13:40.900 --> 00:13:41.120 not. 00:13:42.180 --> 00:13:42.740 But anyway, 00:13:42.880 --> 00:13:43.720 I had fun with it. 00:13:44.200 --> 00:13:45.040 I tried it out. 00:13:45.900 --> 00:13:46.720 I do like the, 00:13:46.900 --> 00:13:48.120 it's not a whole bunch of rules. 00:13:48.490 --> 00:13:52.420 The rules are like projects should not contain missing dependencies, 00:13:52.960 --> 00:13:54.400 should not contain unused dependencies, 00:13:55.840 --> 00:13:57.740 should not use transitive dependencies. 00:13:58.100 --> 00:13:58.720 That's interesting. 00:13:59.140 --> 00:14:00.400 Yeah, I kind of agree. 00:14:00.580 --> 00:14:02.880 You don't depend on-- if something's 00:14:03.320 --> 00:14:06.700 depend getting imported or installed because you 00:14:06.960 --> 00:14:09.720 installed something else, that third party package 00:14:09.980 --> 00:14:12.620 might refactor and not include that. 00:14:12.700 --> 00:14:13.520 So yeah, you should-- 00:14:13.560 --> 00:14:13.660 Yeah. 00:14:14.180 --> 00:14:14.300 Yeah. 00:14:14.940 --> 00:14:15.420 --transitive. 00:14:15.700 --> 00:14:17.480 Anyway, I think a fun project. 00:14:17.800 --> 00:14:19.560 And yeah, I'm going to check it out a little bit more. 00:14:19.800 --> 00:14:20.140 Very cool. 00:14:20.540 --> 00:14:25.520 Henry out there says those tests and doc dependencies should be dependency groups nowadays. 00:14:26.720 --> 00:14:26.960 Okay. 00:14:28.660 --> 00:14:29.740 I appreciate that. 00:14:29.980 --> 00:14:32.860 I don't do nuanced stuff enough to know. 00:14:33.040 --> 00:14:33.900 So yes, thanks, Henry. 00:14:34.180 --> 00:14:35.140 Thanks for that homework, Henry. 00:14:35.860 --> 00:14:36.380 Yes, exactly. 00:14:36.540 --> 00:14:37.340 Thanks for the homework, man. 00:14:37.860 --> 00:14:38.720 So you know what? 00:14:39.220 --> 00:14:46.540 I could find myself on a server or just the terminal, and I'm trying to figure out why are some of my dependencies missing? 00:14:46.620 --> 00:14:47.480 Where are my files even? 00:14:47.560 --> 00:14:48.360 What's going on, Brian? 00:14:48.820 --> 00:14:52.540 And I came across this thing called Juftin Browser. 00:14:53.080 --> 00:14:53.700 Drop the E. 00:14:54.280 --> 00:14:57.760 So it's a little bit too Web 2.0y, but it still has the O, 00:14:57.850 --> 00:14:58.800 so I don't really know what that means. 00:14:59.200 --> 00:15:02.900 Anyway, what it is, is this is a really neat tool 00:15:03.440 --> 00:15:07.300 that is basically an interactive keyboard-driven 00:15:07.600 --> 00:15:11.520 and mouse-driven experience, like a Finder or Windows Explorer, 00:15:12.120 --> 00:15:15.020 but for your terminal and works over SSH. 00:15:15.400 --> 00:15:18.039 So if I SSH into a server, I can say Browser 00:15:18.580 --> 00:15:22.600 in a folder and it gives me a tree of all the folders i can arrow through them i can click 00:15:22.610 --> 00:15:27.960 through them and then expand and when you click on them it will show on the right the file and on the 00:15:28.080 --> 00:15:33.640 left the tree of the area starting from where you ran it and down isn't that cool that is pretty cool 00:15:33.980 --> 00:15:40.460 yeah and it has yeah it has um basically the viewing for the files it has context highlighting 00:15:40.570 --> 00:15:46.240 you can even show images and a couple other things like that so really neat and i think if you're 00:15:46.200 --> 00:15:51.460 doing anything super terminal based i know you can run on your local machine but i don't know here's 00:15:51.500 --> 00:15:58.620 a little tip for people who don't know if you're in a folder on mac os you can type open space dot 00:15:58.900 --> 00:16:03.620 and that will just bring a binder there in windows you can say start space dot and it will open up 00:16:03.760 --> 00:16:08.460 windows explorer focused in that folder so if you're in the terminal you want like a brow like a 00:16:09.060 --> 00:16:13.519 gooey like thing you're pretty close you're pretty close to having it you got to type browser anyway 00:16:13.540 --> 00:16:14.820 if you want to get this thing to start. 00:16:15.420 --> 00:16:17.840 But if you're on an SSH connection to a server, 00:16:18.640 --> 00:16:21.740 well, there is no alternative but to just LS your way through. 00:16:22.280 --> 00:16:24.480 And this is a really nice way to just kind of flip through 00:16:24.580 --> 00:16:25.560 and exploit what is in here. 00:16:25.600 --> 00:16:26.820 And as you move through the files, 00:16:26.910 --> 00:16:28.580 it displays them with syntax highlighting. 00:16:29.020 --> 00:16:29.400 I like it. 00:16:29.460 --> 00:16:30.620 I think it's super, super useful. 00:16:30.840 --> 00:16:34.160 It's going to be part of my server maintenance toolkit, 00:16:34.420 --> 00:16:35.260 I think is what I'll say. 00:16:35.580 --> 00:16:36.340 Yeah, it's fun. 00:16:37.780 --> 00:16:42.320 I, you know, I'm also one to possibly just use open. 00:16:43.000 --> 00:16:44.980 for that, but also 00:16:45.680 --> 00:16:47.040 or just cheat and 00:16:47.040 --> 00:16:48.960 just say code space dot and 00:16:49.160 --> 00:16:49.260 open 00:16:50.600 --> 00:16:52.140 and have the tree directory. 00:16:53.160 --> 00:16:54.840 I think the O is necessary 00:16:55.300 --> 00:16:57.100 in the name so that it's 00:16:57.280 --> 00:16:58.920 bro. So bros or 00:16:59.140 --> 00:17:00.100 maybe. Bro. 00:17:02.880 --> 00:17:03.180 Yeah. 00:17:03.300 --> 00:17:04.959 If you don't, it's not on the 00:17:05.079 --> 00:17:06.880 GitHub, I don't think, but if you click their 00:17:07.560 --> 00:17:08.880 domain, which is 00:17:09.040 --> 00:17:10.740 effectively like a read the docs type of thing, 00:17:11.000 --> 00:17:12.560 you can actually see it in action. 00:17:12.680 --> 00:17:15.040 with a little animated screen recording. 00:17:15.740 --> 00:17:17.459 We love animated screen recordings. 00:17:17.900 --> 00:17:18.199 Yes. 00:17:18.900 --> 00:17:19.620 So, so nice. 00:17:20.220 --> 00:17:20.300 So. 00:17:20.760 --> 00:17:20.880 Cool. 00:17:21.260 --> 00:17:21.439 All right. 00:17:22.180 --> 00:17:22.819 What you got extras? 00:17:23.900 --> 00:17:25.079 I just have a show and tell extra 00:17:25.180 --> 00:17:28.280 because I went to an estate sale a couple weeks ago 00:17:28.700 --> 00:17:30.260 and I got a fun gift that, 00:17:30.480 --> 00:17:33.400 or a fun little thing that I just picked up. 00:17:33.740 --> 00:17:35.360 And so I was going to show it off, show and tell. 00:17:36.340 --> 00:17:39.220 I got this book called Micro, 00:17:40.280 --> 00:17:41.240 Understanding the Micro. 00:17:42.360 --> 00:17:47.780 And it's microcomputers, how they work and what they can do. 00:17:48.240 --> 00:17:48.860 And I flipped. 00:17:49.160 --> 00:17:50.160 It's sort of fun. 00:17:50.260 --> 00:17:52.420 It's got like, you know, it's for kids and stuff. 00:17:53.420 --> 00:17:56.980 But in the back, there's a buyer's guide. 00:17:57.380 --> 00:17:58.880 And I flipped back. 00:17:58.940 --> 00:18:00.300 I'm like, well, does it have mine? 00:18:00.660 --> 00:18:05.220 And yeah, sure enough, the TRS-80 color computer. 00:18:05.500 --> 00:18:06.600 That was when I started. 00:18:07.360 --> 00:18:07.660 Okay. 00:18:08.480 --> 00:18:09.120 Fun little book. 00:18:09.760 --> 00:18:11.640 And I haven't read much of it yet, though. 00:18:11.880 --> 00:18:13.220 but it should be fun. 00:18:13.460 --> 00:18:14.900 It even talks about basic programming 00:18:15.200 --> 00:18:16.340 and stuff like that. 00:18:16.560 --> 00:18:16.760 It's fun. 00:18:17.040 --> 00:18:17.180 Nice. 00:18:17.920 --> 00:18:18.460 You see, Brian, 00:18:18.560 --> 00:18:19.820 I was definitely later 00:18:20.100 --> 00:18:21.980 in the computer hardware game. 00:18:22.420 --> 00:18:24.800 My brother had a Commodore 64, 00:18:25.440 --> 00:18:27.700 but I saved up when I was in high school 00:18:28.020 --> 00:18:30.420 and I got myself a 486 DX, 00:18:30.920 --> 00:18:31.540 not the SX, 00:18:31.640 --> 00:18:33.380 but the one with the floating point processor 00:18:33.800 --> 00:18:34.960 and 33 megahertz. 00:18:35.380 --> 00:18:36.940 That's where I started off. 00:18:37.240 --> 00:18:39.200 I think that's close to what I had. 00:18:39.200 --> 00:18:41.540 I think I must've been ahead of you a little bit. 00:18:41.840 --> 00:18:48.480 I bought a 486 IBM 46 when I was in college so that I could do homework on it. 00:18:48.710 --> 00:18:52.540 And I think the first thing I bought was Turbo Pascal for it. 00:18:52.800 --> 00:18:52.960 Nice. 00:18:53.090 --> 00:18:54.840 I think the first thing I got was MechWarriors. 00:18:57.180 --> 00:18:57.420 Yeah. 00:18:57.840 --> 00:18:57.920 Yeah. 00:18:58.320 --> 00:18:58.560 All right. 00:18:58.980 --> 00:18:59.180 Awesome. 00:18:59.360 --> 00:19:03.020 Well, there's a whole bunch of stories from that era, but let's go back to this era. 00:19:03.580 --> 00:19:09.320 And I just want to say, since you gave the recommendation of John Papa's Peacock, I've 00:19:09.380 --> 00:19:09.980 been playing with it. 00:19:10.070 --> 00:19:11.440 It is so good. 00:19:11.800 --> 00:19:18.160 that's fun right it is really really useful and what i didn't realize the way it works is if you 00:19:18.220 --> 00:19:24.660 are in something like cursor or vs code or whatever and it has you have to create a workspace not just 00:19:24.820 --> 00:19:31.240 open a directory but once you create the workspace it embeds your like styling for that project into 00:19:31.240 --> 00:19:38.760 the workspace file so it syncs across machines naturally by just doing get push get pull oh and 00:19:38.760 --> 00:19:42.220 So yeah, it's a little bit extra like that. 00:19:42.420 --> 00:19:43.100 So that's pretty cool. 00:19:43.280 --> 00:19:44.220 Anyway, I just want to give a shout out 00:19:44.340 --> 00:19:45.480 to a follow up to that, I suppose. 00:19:45.820 --> 00:19:47.360 Like, yeah, that was awesome. 00:19:47.700 --> 00:19:48.040 Still is. 00:19:48.420 --> 00:19:48.480 Cool. 00:19:49.220 --> 00:19:50.800 I guess I have, do you have more extras? 00:19:51.320 --> 00:19:52.820 No, without further extras. 00:19:53.280 --> 00:19:55.840 I had one that I kind of forgot to say. 00:19:55.960 --> 00:19:57.980 I am still working on the Lean TDD book 00:19:58.280 --> 00:20:01.460 and I'm almost done with the building 00:20:01.700 --> 00:20:02.920 on test-driven development chapter. 00:20:04.519 --> 00:20:07.560 So finally, with a book like TDD in the name, 00:20:07.680 --> 00:20:09.260 I finally talk about TDD in it. 00:20:10.340 --> 00:20:11.700 I haven't released that yet, 00:20:11.790 --> 00:20:13.520 but I'm hoping to release that later today 00:20:13.670 --> 00:20:14.200 or maybe tomorrow. 00:20:14.540 --> 00:20:15.480 Oh, very cool. 00:20:15.870 --> 00:20:15.960 Awesome. 00:20:16.390 --> 00:20:16.740 I love it. 00:20:17.380 --> 00:20:17.600 Anyway. 00:20:17.900 --> 00:20:18.320 That's great. 00:20:18.570 --> 00:20:19.160 I love the idea. 00:20:19.620 --> 00:20:21.200 And Brutus out there says, 00:20:21.280 --> 00:20:21.920 Peacock is awesome. 00:20:22.110 --> 00:20:23.180 I used it since last week 00:20:23.250 --> 00:20:24.120 when you talked about it, Brian. 00:20:24.340 --> 00:20:24.400 Thanks. 00:20:24.780 --> 00:20:24.940 Cool. 00:20:25.360 --> 00:20:25.740 Yeah, I love it. 00:20:26.060 --> 00:20:26.680 Yeah, I do too. 00:20:26.940 --> 00:20:27.220 All right. 00:20:27.660 --> 00:20:28.660 Let's do our joke. 00:20:29.320 --> 00:20:30.840 So, you know, people have threats. 00:20:30.970 --> 00:20:32.840 They can be empty threats 00:20:33.590 --> 00:20:34.540 or scary threats. 00:20:35.260 --> 00:20:35.880 You know, like, 00:20:36.380 --> 00:20:38.500 I'm going to tell the world about this thing that you did weird. 00:20:38.680 --> 00:20:39.980 Or I'm going to find you. 00:20:40.080 --> 00:20:42.080 I'm going to punch you in the gut or whatever. 00:20:43.159 --> 00:20:45.600 But that's not a very common thing that programmers do. 00:20:46.120 --> 00:20:48.020 Now, programmers have a different version. 00:20:48.600 --> 00:20:51.780 I will find you and I will install Linux on your computer. 00:20:55.660 --> 00:20:56.660 Yeah, that's extreme. 00:20:56.960 --> 00:21:00.640 Yeah, you know you've messed up when someone gets over and you're like, 00:21:01.000 --> 00:21:08.820 Aurora? All right. Who did this? What is this? Reminds me of the, I'm having the bios flavor 00:21:09.220 --> 00:21:17.700 of the slushies or the frozen yogurt or whatever. Yeah. I will downvote your Hacker News article. 00:21:18.130 --> 00:21:23.800 No. Oh yeah, exactly. I will definitely downvote your Hacker News article. 00:21:25.160 --> 00:21:30.280 Or, you know, this also reminds me of like some of the jokes people used to play. Oh my goodness. 00:21:30.860 --> 00:21:36.140 especially with Windows, if you could change the background image. 00:21:36.220 --> 00:21:37.900 Oh, yeah. To the blue screen of death. 00:21:38.440 --> 00:21:40.520 Change the background image to the blue screen of death. 00:21:41.380 --> 00:21:44.420 Or I know when Vista came out, people were super like, 00:21:44.740 --> 00:21:46.120 do not put this on my computer. 00:21:46.600 --> 00:21:48.160 And the IT people were installing it. 00:21:48.240 --> 00:21:50.280 I know someone who took a screenshot of Vista, 00:21:50.680 --> 00:21:52.260 put it onto someone else's computer, 00:21:52.940 --> 00:21:56.220 and then tasked their Explorer or something like that. 00:21:56.300 --> 00:21:57.520 And so they didn't have any. 00:21:58.540 --> 00:21:59.180 Oh, that's funny. 00:21:59.440 --> 00:22:02.680 They had no thing overlaying it, so it just, like, no, they didn't. 00:22:03.520 --> 00:22:04.260 And they, like, click around. 00:22:04.290 --> 00:22:05.220 Like, I told you it wouldn't work. 00:22:05.360 --> 00:22:06.200 Nothing even clicks here. 00:22:07.640 --> 00:22:07.820 Yeah. 00:22:08.520 --> 00:22:10.220 I will find you and do stuff your computer is pretty fun. 00:22:10.580 --> 00:22:13.060 But this one is I will find you and install Linux in your computer. 00:22:13.360 --> 00:22:13.700 That's funny. 00:22:14.860 --> 00:22:15.040 Yeah. 00:22:15.280 --> 00:22:17.680 Be careful whose child you had booked. 00:22:18.040 --> 00:22:18.280 Exactly. 00:22:18.490 --> 00:22:19.400 Well, I'll tell you what. 00:22:19.400 --> 00:22:22.180 I'm not actually going to go install Linux on anyone's computers, 00:22:22.330 --> 00:22:23.180 other than particularly mine. 00:22:23.350 --> 00:22:24.160 So no threats here. 00:22:24.440 --> 00:22:24.660 Yeah. 00:22:25.840 --> 00:22:29.920 Although, Henry does point out that these days, maybe the opposite is more threatening. 00:22:30.160 --> 00:22:32.740 I'll find you and I'll steal Windows 11 on your computer. 00:22:35.880 --> 00:22:36.020 Yeah. 00:22:36.220 --> 00:22:38.220 Oh, there's a lot of bad ideas shown in the chat. 00:22:38.260 --> 00:22:38.820 We're not going to share. 00:22:41.640 --> 00:22:42.360 They're great, though. 00:22:42.460 --> 00:22:42.840 Made me laugh. 00:22:42.840 --> 00:22:43.400 No, they're good. 00:22:43.960 --> 00:22:44.420 Thank you, everyone. 00:22:45.040 --> 00:22:45.560 See you all later. 00:22:45.940 --> 00:22:46.120 Bye. 00:22:46.420 --> 00:22:46.540 Bye.