Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book

#457: Tapping into HTTP

Published Tue, Nov 11, 2025, recorded Tue, Nov 11, 2025
Watch this episode on YouTube
Play on YouTube
Watch the live stream replay

About the show

Sponsored by us! Support our work through:

Connect with the hosts

Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too.

Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it.

Michael #1: httptap

  • Rich-powered CLI that breaks each HTTP request into DNS, connect, TLS, wait, and transfer phases with waterfall timelines, compact summaries, or metrics-only output.
  • Features
    • Phase-by-phase timing – precise measurements built from httpcore trace hooks (with sane fallbacks when metal-level data is unavailable).
    • All HTTP methods – GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS with request body support.
    • Request body support – send JSON, XML, or any data inline or from file with automatic Content-Type detection.
    • IPv4/IPv6 aware – the resolver and TLS inspector report both the address and its family.
    • TLS insights – certificate CN, expiry countdown, cipher suite, and protocol version are captured automatically.
    • Multiple output modes – rich waterfall view, compact single-line summaries, or -metrics-only for scripting.
    • JSON export – persist full step data (including redirect chains) for later processing.
    • Extensible – clean Protocol interfaces for DNS, TLS, timing, visualization, and export so you can plug in custom behavior.
  • Example:

img

Brian #2: 10 Smart Performance Hacks For Faster Python Code

  • Dido Grigorov
  • A few from the list
    • Use math functions instead of operators
    • Avoid exception handling in hot loops
    • Use itertools for combinatorial operations - huge speedup
    • Use bisect for sorted list operations - huge speedup

Michael #3: FastRTC

  • The Real-Time Communication Library for Python: Turn any python function into a real-time audio and video stream over WebRTC or WebSockets.
  • Features
    • 🗣️ Automatic Voice Detection and Turn Taking built-in, only worry about the logic for responding to the user.
    • 💻 Automatic UI - Use the .ui.launch() method to launch the webRTC-enabled built-in Gradio UI.
    • 🔌 Automatic WebRTC Support - Use the .mount(app) method to mount the stream on a FastAPI app and get a webRTC endpoint for your own frontend!
    • ⚡️ Websocket Support - Use the .mount(app) method to mount the stream on a FastAPI app and get a websocket endpoint for your own frontend!
    • 📞 Automatic Telephone Support - Use the fastphone() method of the stream to launch the application and get a free temporary phone number!
    • 🤖 Completely customizable backend - A Stream can easily be mounted on a FastAPI app so you can easily extend it to fit your production application. See the Talk To Claude demo for an example of how to serve a custom JS frontend.

Brian #4: Explore Python dependencies with <code>pipdeptree</code> and <code>uv pip tree</code>

  • Suggested by Nicholas Carsner
  • pipdeptree
    • Use pipdeptree --python auto to allow it to read your venv
  • uv pip tree
    • Also check out uv pip tree and some useful flags
      • --show-version-specifiers to show the rules
      • --outdated notes packages that need updated

Extras

Brian:

Joke: Sure Grandma

Episode Transcript

Collapse transcript

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:05 This is episode 457, and it's being recorded on November 11th, 2025.

00:11 And I'm Brian Okken.

00:12 And I'm Michael Kennedy.

00:14 Wow, nowhere. Oh, it's 11-11. It's corduroy day. I totally forgot to wear corduroy today.

00:20 I love it. Is that because the vertical stripes?

00:22 Yeah, yeah.

00:23 Vertical grooves.

00:23 Yeah, yeah. I love it. I have no corduroy on either. We missed the opportunity.

00:28 some stripes on your, it's not corduroy, but your sweater.

00:32 Yeah, almost a sweater, almost pulled it off.

00:34 Anyway, we'd like to thank everybody that supports us through going to

00:40 doing Talk Python training or the pytest course, Patreon supporters or people that have bought our books.

00:47 We really, really appreciate all of the support and it keeps us going.

00:51 Also love to hear from people on Bluesky, on Mastodon and through email.

00:57 So you can go to the contact us on pythonbytes.fm.

01:02 And there's the links to all the Bluesky Mastermind, all those things to get all of us.

01:07 We actually have a couple items today from listeners.

01:10 So feel free to send us things.

01:13 If you'd like to join the show live, and even if it's on a weird time like this week,

01:19 you can find out when it's going to happen next by going to pythonbytes.fm/live.

01:24 And, you know, jump on and talk with us while we're recording.

01:28 It's fun.

01:29 Also, you don't need to take notes because we're going to send you all the links.

01:34 Well, they're in the show notes, but we'll also send them directly to your inbox if you

01:38 sign up to be a friend of the show and go to pythonbytes.fm and sign up for the newsletter.

01:45 I think that's all of the stuff.

01:47 So let's jump into the first item, Michael.

01:50 Let's talk about it now.

01:52 I want to talk about something called HTTP tap at HTTP tap.dev. Now this one, it's a little bit

02:01 like HTTP pi, HTTP pi, I don't know how you really pronounce that correctly, which is my go to

02:08 anytime I need to test something on the terminal or that sort of thing. HTTP pi is because, you know,

02:15 it's like curl or whatever, but it gives you lots more stats, gives you more information. And this,

02:20 This is a little bit like that.

02:21 If you wanted to go into, say, your Chrome DevTools or something

02:25 and say, "Hey, I'm requesting this page or this URL or this API endpoint.

02:30 It's a little bit slow.

02:31 It's a little bit funky.

02:32 What's going on?

02:33 Where's the problem?" - Yeah. - If it's getting hung up,

02:35 is it connecting to the server or is it the backend app server, like Grinny

02:41 and whoever is not responding?

02:42 So that's what this is all about.

02:45 And it's built, I believe it's built with rich or textual.

02:48 I can't remember how far down the Will McGugan train it goes,

02:52 but it definitely is built on some of those.

02:54 Built with Python, although that's not necessarily that important, right?

02:58 It's just I guess it's easier to make improvements to,

03:00 but it's more just a tool that anyone doing web stuff

03:03 with Python might be interested in.

03:06 And I pulled up a little example of just asking Talk Python,

03:10 acptptap, then talkpython.fm, and it says, here's the analysis.

03:13 And apparently there's only one step, maybe if there were redirects or something,

03:16 It would show multi-stage flows, but there's no redirects, so there's not.

03:22 It shows you the IP address, the TLS version, the cipher,

03:25 when the certificate expires, the status, the size, the server.

03:30 It gets all of that stuff right, which is pretty cool.

03:33 Then it has this waterfall-tiered sort of diagram.

03:36 It says the request timeline.

03:38 It took 29 milliseconds for DNS to figure out where the heck that was.

03:42 I've been on vacation. I haven't been going to the website.

03:45 So I had to go get it from the internet.

03:47 And then it took 80 milliseconds to connect to the server.

03:50 By the way, it's about 80 milliseconds ping time.

03:53 So you got to keep that in mind when all these numbers, right?

03:55 Like that's East Coast, West Coast, US, 2,500 miles.

03:59 So connect 80 milliseconds.

04:02 TLS took 130 milliseconds.

04:05 So if you ever see your browser doing like keep alive type of stuff,

04:09 that's a big savings right there.

04:10 That's almost 200 milliseconds savings if it doesn't have to keep doing that over and over, right?

04:15 So that's pretty nice.

04:15 And then you can see it's actually sending the request and waiting for the response.

04:21 So it goes out, comes back, takes 170 milliseconds.

04:25 Again, ping time in there as well.

04:27 And then the transfer is a whopping 4.3 milliseconds.

04:31 So this is pretty cool.

04:32 A really quick view of just seeing what's going on, right, Brian?

04:34 Yeah, actually, I love that.

04:37 Very useful, especially if you've got some lag issues or some part of your website that's a little slow.

04:44 you can look at what's going on.

04:46 Is it DNS?

04:48 Is it the transfer?

04:50 Where's this delay coming from?

04:51 I mean, it's not super fine-grained, but this is pretty good.

04:54 Yeah, well, there's just, yeah, for sure.

04:56 And there's a lot of stuff involved, right?

04:57 There's, like you said, the DNS might be taking forever,

05:00 which could be part of the problem, or who knows, right?

05:02 There's just a lot of things.

05:04 So really neat to see this little UI built in Python.

05:09 Yeah, and I guess we have to say it.

05:12 It's always DNS.

05:13 It's always DNS.

05:14 I mean, that's...

05:16 It's not always DNS, but yeah.

05:18 Anyway.

05:19 Yeah, but often.

05:20 Often.

05:21 No, I think this is great.

05:23 This is cool.

05:24 I've got actually some side projects that I've got some weird speed issues,

05:30 and I don't know why.

05:31 And even just looking at some of this stuff, help out to figure out where to start debugging.

05:36 Yeah, you can get some of these types of things in the dev tools and browsers,

05:41 but this is really nice.

05:42 It's visual, it's colorful, it's graphical.

05:44 I love it.

05:44 I like it.

05:44 And it's command line.

05:46 Yay, we love command line.

05:47 Yay.

05:48 Okay.

05:50 I'm not usually, I have to admit, I click on listicles all the time.

05:55 But we don't cover very many listicles on the show, but I'm going to cover one today.

06:01 I actually, oh, my aspect ratio is off.

06:04 There we go.

06:05 Here we go.

06:07 This is from PyCharm.

06:08 It's actually from Evgenia Verbena.

06:12 That's a cool name.

06:13 10 smart performance hacks for faster Python code.

06:19 And there's some that, well, actually, I think stuff like this is really good to talk to people about

06:26 because we don't really think about performance too much.

06:28 I mean, when you're starting Python, you don't think about it too much.

06:32 It's hopefully, you know, hopefully you don't.

06:34 There's, we don't want people to prematurely optimize.

06:37 But there's just some habits that maybe are decent to get into that avoid problems later on.

06:44 And so that's one of the reasons why I like going through this.

06:48 Oh, nice menu on the right side, also with all the hacks on the right.

06:53 Anyway, the first one, not too surprising if you've done through any leak code stuff or whatever,

07:00 is leverage set for membership testing.

07:04 So if you've got a big list, you can throw the list into a set,

07:08 and then you can find out easily if something's in the list by putting it in a set.

07:14 And oddly, that speeds things up quite a bit, like drastically.

07:20 List lookup versus set lookup is super fast.

07:24 Same predictionaries, too.

07:26 If you're looking up by some kind of key, either one, it's ridiculous.

07:30 Yeah.

07:32 Like I said, some not too surprising.

07:34 Slots are great if you're going to use classes or data classes even.

07:39 If it's not going to grow over time, you can define slots and stuff.

07:44 And then the lookup for each element within a data class is a lot faster with slots.

07:52 I want to jump around because there were some that I didn't really realize

07:56 or I just didn't think about before.

07:59 And one of them is use math functions instead of operators.

08:01 and I guess I wouldn't some of these are weird

08:06 so math.square sqrt for square root is faster and more accurate

08:12 than raising a number to the power of 0.5 using

08:16 exponentation operator I wouldn't do that anyway because that's weird

08:20 it just looks weird I don't know, bad code style

08:24 but there's a whole bunch of others similarly the sine function exponent

08:28 log, those are really fast operators in math so go ahead and utilize math and uh so that's a good pointer pre-allocate memory

08:36 with known sizes now this is some like an old trick that i think that i didn't really think

08:41 that it was a huge difference and it looks like one of the things that's it's cool in this article

08:45 it does the pre-allocated time versus or the uh before and after times so there's a bit of

08:51 you know uh 0.01 second speed up um but so the trick is just to uh i guess have an array with

08:59 If you're going to fill an array anyway, may as well just fill it with some zeros or something initially.

09:05 And then it seems like a waste of time to fill it with zeros

09:09 because you're going to fill everything up.

09:11 But it isn't because it's the allocation that takes a little bit longer

09:14 than the filling it with zeros.

09:16 Yeah, and Brian, it's worth thinking through how that goes a little bit

09:20 because if you just go append, append, append, and this is something I don't do and it's inspiring me to consider,

09:25 well, maybe I should.

09:26 But the array doesn't know if you're going to put a million items in there.

09:30 Every time you do like a array.append or list.append, it doesn't go, guess what?

09:35 We're going to add a million, right?

09:35 It's like, well, what about 16?

09:37 What about 32 of them?

09:39 Oh, now we need more.

09:40 Okay, what about 64 of them?

09:41 You know, it just, it has to keep reallocating and copying as you build this up.

09:45 So, yeah.

09:46 And I don't remember how, I mean, it's a little smarter than that.

09:49 So I think it like does, like doubles it in size or takes a chunk.

09:53 I can't remember what it does.

09:54 Yeah, it's not allocating every one, right?

09:56 It's got an awkward.

09:56 Right.

09:57 Or heuristic.

09:57 But if you already know how big it's going to be, you can just tell it to do it once, which is cool.

10:03 But I don't really think about that too much.

10:06 A couple of the ones down below I really wanted to cover.

10:09 This was avoid exception handling and hot loops.

10:13 And I am guilty of this too, because I try to have my exception handling

10:17 as close to the place where it can go wrong as possible.

10:21 Just as it's a visual thing and a code readability thing to have this tight.

10:26 have the try right around it.

10:28 Like the example has a zero division error, has the try and accept right there.

10:34 However, that might slow down a little bit.

10:38 And it did, in this case, was the try and accept on this one.

10:42 It's just not there.

10:43 I think the top one versus the bottom one.

10:44 Yeah, but there's no try and accept at the top.

10:46 That's the baseline.

10:48 Oh, okay.

10:48 The conditional check versus.

10:51 It's like checking for the condition that would cause the exception to avoid the exception.

10:55 Oh, OK.

10:57 I guess I would just put the try and accept at the top or around the larger one as a better comparison.

11:03 Anyway.

11:04 Yeah, I agree.

11:05 But this is a big one.

11:06 But that's a big one.

11:08 Then we get into some really, except there's exception handling,

11:13 using iter tools for combinatorial operations.

11:16 And this is huge.

11:18 If you're working with chunks of lists or chunks of stuff,

11:23 using iter tools and knowing what's in there, it speeds up a huge amount.

11:29 So using iter tools versus loops for, I forget what the example is here,

11:34 but the speed up is using product and the speed up is massive from, you know,

11:40 like what, 440 times bigger or something?

11:44 Or 4 divided by, oh, 5 divided by 20.

11:47 That's 4.

11:47 So it's 4 times speed up.

11:49 Math is hard.

11:51 BISect is also a great thing to look at.

11:54 And yeah, anyway, just some cool, wow, that's a massive speedup, 100 times speedup for using

12:01 BISect in the right places.

12:03 So finding out places where you can use BISect or iter tools and just knowing that those

12:08 are there to look them up, those are good speedups.

12:10 Anyway, occasionally it's good to think about how fast is my code going?

12:14 You know, I think we could summarize up that article by basically saying, know the standard

12:21 know your data structures, mostly.

12:24 Yeah.

12:24 Use DICT, use Zitter Tools, et cetera.

12:27 And the standard library is still pretty big.

12:30 I would probably limit that to the standard library that manipulates data structures.

12:35 Yeah, it kind of intersects with data structures.

12:37 Yeah, I guess that's kind of what I was getting at.

12:39 And by the way, this was written by Dito Grigorov and posted by Uvigena.

12:44 Oh, okay.

12:45 Just want to make sure Dito gets a little credit for writing it.

12:48 Thanks for that clarification.

12:50 Yeah, no worries.

12:51 - It's tricky, I think it's 'cause the way the JetBrains CMS works.

12:55 Yeah, so cool, cool.

12:57 Well, maybe we should, Brian, maybe we should talk to him about it.

13:00 Put him up on a little video call, you know what I mean?

13:03 What do you think?

13:03 Do a little WebRTC?

13:05 - I've kind of forgot about RTC.

13:07 - I know, but you and I are sitting here, people don't necessarily know how we're doing this.

13:12 It's magic, we basically, you and I, we speak through magic,

13:15 but some of that magic is WebRTC because all of this is recording, streaming, et cetera,

13:23 video and voice, multiple channels, multiple screens,

13:26 and so on over WebRTC in the browser, which is ridiculous.

13:30 It's just ridiculous that this works.

13:33 So I want to talk about a library from Freddie Bolton,

13:36 who is behind the Gradio project, Gradio, Gradio, Gradio project, and I had him on Talk Python

13:43 a couple of years ago, and this is called FastRTC.

13:46 So kind of like, hey, I'm a fan of integrating with FastAPI,

13:50 and I want to do WebRTC.

13:52 It's kind of ridiculous how simple some of these things are.

13:55 So it's pretty popular.

13:56 It's got 4,000 GitHub stars, 400 forks.

13:59 It's been around for a while.

14:01 Freddie pointed this out to me a decent while ago, and I finally ain't getting around to talking about it.

14:05 But it's quite neat.

14:07 There's a little video you can watch about how to do it,

14:08 but it's got some examples for you.

14:10 Like if you want to do an Echo Audio, which is kind of a sadistic example, you know what I mean?

14:17 Because that's usually the worst thing about a video meeting,

14:20 is the echo.

14:21 But if you want to listen to yourself echo back just to prove that it's going round and round,

14:26 then how many lines is that?

14:28 I mean, there's a huge comma in there, but if you take out the comma

14:33 and you format it a little bit wider, it's probably five lines of code to set up a server,

14:38 connect to it, and echo back.

14:39 Like, that's insane.

14:41 Insane.

14:42 And there's also ways to set up LLM voice chat if you care about that.

14:46 You know, that's obviously the thing du jour is I want to talk to my LLM.

14:52 But, you know, you could do that pretty easily, pretty quickly here.

14:55 But also just stream your webcam back or object detection.

14:59 It's just like a handful of lines of code.

15:00 It's insane.

15:01 But this stuff seems so complicated, doesn't it, Brian?

15:04 It's cool.

15:05 It's cool.

15:05 You're wrapping stuff up in a library.

15:08 Yeah.

15:08 So it comes with automatic voice detection, turn-taking built-in, which is interesting.

15:14 It's got a UI to launch it in built-in Gradio UI, if you want to do that.

15:20 I believe that's probably JavaScript.

15:22 Automatic Web RTC support.

15:25 So mount it onto a FastAPI app and get a Web RTC endpoint for your own front end.

15:31 So you can kind of go Gradio or you can go this way.

15:33 It's got WebSocket support.

15:35 Listen to this.

15:36 Automatic telephone support.

15:37 use FastPhone on the string and get your own temporary phone number.

15:42 Actually, that's pretty cool.

15:44 Yeah.

15:45 So, yeah, there's a lot of stuff going on here.

15:48 It says you can easily be mounted on your own FastAPI app

15:50 and customize it entirely, extend it to fit within your production app,

15:55 I guess, assuming that's a FastAPI app.

15:57 Although you could certainly squeeze it in using, like,

16:00 Nginx routes to make it look like one app, but it's not exactly the same back end and so on.

16:05 So there's examples for that.

16:06 Wow.

16:06 Yeah, so I thought it was pretty cool.

16:09 That's pretty neat.

16:10 I interviewed somebody in like three years ago, 2012, about WebRTC.

16:15 They wrote a book on it.

16:17 Nice.

16:19 I thought, like, I don't think I'd ever use that.

16:21 But of course I use tools that use WebRTC all the time.

16:24 So like you said, we're using it for.

16:26 We're using it right now.

16:27 We're using it right now.

16:29 And yeah, it's one of those things where it's like, I don't think I'll ever build one of those.

16:33 And then you're like, oh, but what if I could do it for this project

16:36 or something comes up or, you know, just knowing about it as a...

16:39 I think it's...

16:40 Yeah, and right now, like you said, with things like hooking up LLMs to, you know, some vibe coding.

16:48 Yeah, exactly.

16:49 I mean, no comment.

16:51 No comment.

16:54 Okay, so this is a listener suggestion, actually.

16:57 Comes to us as a request from Nicholas Kersner.

17:01 He said, hey, I'm using PipDepTree a lot lately.

17:06 And it's pretty cool if you covered that.

17:07 And I'm like, yeah, we covered it.

17:09 But I looked it up.

17:11 It was, I should have had the episode up.

17:13 But we covered it in episode 17.

17:17 That was what?

17:20 2017.

17:21 So yeah, it was a minute ago that we've covered it.

17:23 So it's totally fine to cover it again because there's been changes.

17:27 So I did want to talk about both pip Deptree, but also I have been, I used pip Deptree for a long time,

17:34 But now usually I use uv pip tree.

17:36 And so I just decided to write an article on it just to, because I wanted to show some code examples.

17:42 One of the cool things I did not know that pip dep tree did.

17:46 One of the things that I would always do is I'd have a project install pip dep tree.

17:51 And what it does is when you run it, it looks at all the stuff you have installed and then shows, shows them.

17:56 It's kind of like pip list, but it shows all the, it's like a tree structure and it shows them we're like in a tree structure with

18:04 versions that are installed and it kind of it's extra information like the uh like if i'm using

18:10 it from pyproject.toml i have an example of the cards project why it chose the particular version

18:16 that's installed um so it's pretty handy but the i would always install it in the project and it

18:23 would also tell me that pip dep tree is installed but the uh the trick is to install it somewhere

18:29 globally like either uh using uh uvx pip dep tree or uv tool install pip dep tree and then you've

18:36 got it just available to you always and and then you can use python auto and it the python auto flag

18:44 will tell you um it will look in the current environment that you're in so um so then you can

18:49 have it in global uh and then yeah and just look at whatever project you're in which is cool i didn't

18:56 know it could do the auto thing too so i'm glad i looked that up the um but what i'm using usually

19:03 is uv pip tree because it's already installed with uv and i have uv everywhere now by default i wanted

19:08 to go through a couple flags that i um actually i just learned about this i i when i was i was

19:13 comparing this beauty if you do uv pip tree it'll show you a tree structure but it only shows you

19:18 the versions that are installed and it does do like for instance i'm showing cards and rich is showing

19:24 up and it looks like it's in a couple places. Package tree already displayed. Oh yeah,

19:30 because the cards project depends on rich, but it also depends on typer, which also depends on rich.

19:37 So rich is duplicated and there's a little note that says that. There's a flag where you can turn

19:41 it off, but I kind of like seeing the duplication. It's just to see who all is using something.

19:47 Now, to get a similar look as pip dep tree, you can add show version specifiers and then it shows

19:55 that it used to figure out what to install.

19:58 But the new flag that I just learned about, which I'm super excited about,

20:02 is --outdated.

20:04 And this tells you, it tells you, it throws the latest up.

20:08 It looks at all the things you got installed and tells you if there's newer ones.

20:11 So you can go into your project and you can run UVPIP tree outdated

20:15 and it'll tell you which ones you should maybe update.

20:18 So it's pretty fun, both of those.

20:21 So I like both tools.

20:22 That's nice.

20:23 I do as well.

20:24 I've used pip dep tree for a long time.

20:26 It's nice to just go, why is this here?

20:28 Why is click installed?

20:31 I don't remember installing click.

20:32 It's fine, but I just don't remember installing it.

20:35 But oh, it's Icy because I installed Typer, and I forgot that Typer is a wrapper on click.

20:39 Yeah, and one of the things, for instance, I'm thinking about update like a hypothetical scenario.

20:46 I've got Rich, or I've got on my cards application, I'm using rich, but maybe I'll try to tighten the dependencies by not using rich.

20:56 But if I'm using typer, it's going to come in anyway.

20:59 So I like to see the duplication because I'm not going to save anything if I don't depend on rich directly.

21:05 It's already there because of typer.

21:08 Yes, exactly.

21:08 You're like, can I just get rid of this thing?

21:10 You're like, nope.

21:11 No.

21:11 Not easily.

21:12 Not directly anyway.

21:14 Yeah.

21:14 But if I got rid of typer also somehow and then I could get rid of rich.

21:19 And maybe I'll redo the TinyDB too.

21:21 Yeah.

21:22 Anyway, tighten it up.

21:24 All right.

21:25 Those are, that's my items to talk about.

21:28 Oh, I do have links to both PipTrapTree and uv treeRich.

21:33 UV PipTreeRich also.

21:36 Those are all different words.

21:37 Nice.

21:38 All right.

21:38 Well, just keep going.

21:39 You're the only one with extras today.

21:41 Okay.

21:41 I got a couple extras.

21:43 I've got one of the benefits of working at the office, like the back to office thing is I was walking by one of my colleagues and he's got a bunch of

21:51 colors up on his screen. And I'm like, what are those colors? And, and I use, use

21:58 VS Code at work and the, and I've often got different projects up the same thing he's using.

22:04 And I started using this just like last week, a thing called peacock. and what it does is it

22:10 shows different colors around the outside of your, terminal and it only it's, or outside of your

22:16 VS Code window, but the colors are picked and stored in the project or like the workspace.

22:23 Yeah, the workspace.

22:25 So that if you've got different projects open, they all have different colors.

22:29 So when you're like, I want to go back to that window, you just have to remember which

22:33 color goes to which project.

22:34 And that's kind of up to you.

22:36 But Brian, I'm often still this.

22:39 I in even if you one of the cool things is I'm like, well, I chose green and it's a little

22:45 too bright for me.

22:46 I kind of wanted a darker green.

22:48 It has built-in buttons to just go a little darker, a little darker, a little darker, or a little lighter.

22:54 You can do custom, like pick your own color, but you can also say, this is close,

22:59 but I'd like it a little darker.

23:00 And I'm loving that.

23:02 Yeah, and it's not incredibly popular, but it looks like it's from John Papa,

23:05 who's been around in the tech space for a long time.

23:07 So it seems trustworthy.

23:09 Where do you see the popularity?

23:10 Is it in here?

23:11 It's the downloads.

23:13 Oh, I take it back.

23:14 I thought it was, it may have more than I initially, said it has three point basically four million downloads okay so actually there's a few downloads

23:21 people like this idea oh i was looking at the um the open vsx marketplace which is like a similar

23:28 but not the same uh the other update so one of the things i mentioned last week is that i'm writing

23:33 a book again and um i just updated uh this last night i think last night there's um a chapter

23:41 another chapter written so i gotta clean this up both versions are here but i did essential

23:46 for successful software projects.

23:48 I got that one up and I completely rewrote the introduction

23:52 and I should stop doing that.

23:54 An editor a long time ago told me, do a quick introduction

23:58 and then leave it alone until you finish the book

24:00 and then you can update it to be what the book actually is.

24:03 And so I got to do that.

24:04 A hundred percent.

24:05 I think that's a great idea about the introduction.

24:08 I do it with my courses.

24:09 Sometimes I'll record the whole course and then I'll record the introduction

24:12 because I'm like, I want to be able to say,

24:13 and we're going to cover this in this section

24:15 and then actually have that match.

24:17 Yeah, but my brain won't let me go on if I don't write an introduction to start with.

24:22 It's like, but I haven't done an introduction, man.

24:25 And the essential components chapter, this was tough, man,

24:29 because there's like, I needed it to be tight

24:31 or I wanted it to be a tight chapter, but I rewrote it like five times

24:36 because I had so many stories and stuff I wanted to throw in

24:38 and I decided to take the stories out and leave those stories as blog posts later.

24:43 But, oh, I guess the third extra, I don't have anything to show for this, but when I'm writing and I've got all this great stuff that I want to save, but I know it shouldn't be in this chapter or it shouldn't be in this blog post.

24:54 I've decided for my editor, I've got a file called cut bucket, like CUT bucket.

25:00 And I just put a divider line, put another title and paste the stuff I want to save there.

25:06 And then I don't.

25:07 And then my brain, it's a brain trick is I haven't thrown it away.

25:10 It's there.

25:11 You don't have to remember it and move on with writing.

25:14 Yeah.

25:15 Yeah, awesome.

25:16 What's your editor that you're writing in?

25:18 Like, do you have a markdown?

25:19 What is the story?

25:20 Oh, yeah, it's markdown in VS Code.

25:23 And so the pytest book had tons of code snippets and everything.

25:27 I think this is going to be a code snippet-free book.

25:31 So that I can, the goal is to do an audio version later.

25:35 And, you know, I might have some code snippets, but probably not.

25:39 Actually, it's one of the things of reading the Tester of Development book

25:43 from the old, the OG one from Kent Beck.

25:47 It's all in Java, I think.

25:50 And it's like too much.

25:51 You're lucky it's not Smalltalk.

25:52 Well, right.

25:54 Maybe it is Smalltalk.

25:55 I don't know.

25:55 I think it's, I don't remember.

25:57 But I just sort of scammed by the code snippets because I'm like, I don't care.

26:03 I'm just like here for the concepts.

26:05 So I'm trying to keep this book, the concepts and not the code

26:08 because the code is different for everybody, man.

26:11 Absolutely.

26:12 Anyway.

26:12 Love it.

26:13 That's all I got.

26:14 All right.

26:14 Well, let's tell a joke then and close it out.

26:18 Okay.

26:19 I've done a few AI ones.

26:20 It's not an AI joke, folks.

26:22 So if you're tired of the AI jokes, well, then don't worry.

26:25 This isn't a AI.

26:25 This one is a joke about the future of Python and people being stuck in their ways or having

26:32 assumptions about Python not being as fast as it could be or having limitations that it

26:37 doesn't have anymore, theoretically, or semi-theoretically, whatever.

26:41 And it's a woman in a walker, probably 70 or so, with the granddaughter helping her back to sit down or something.

26:53 So I think I named, what did I name the project, the joke here?

26:58 I think I called it, okay, Grandma, it's the joke.

27:01 So, honey, do you know that the gil prevents multiple Python threads from executing parallel?

27:08 Sure, Grandma, let's get you back to bed.

27:13 a bit of a testament to python 314 and python t and free thread python and all that that'd be

27:19 that's funny i can just like fast forward i can imagine like me 10 years from now telling the kids

27:24 you know was that when i was a kid we had a GIL we had a one thread at a time

27:30 your little whippersnappers don't know how good you got it my python used to just run

27:35 interpreted and it was so slow we would debate whether it was fast enough

27:41 uh yeah anyway that's what i got for a joke for us i like it

27:46 yeah all right it worked for me i liked it so nice all right well uh thanks everybody for joining

27:54 and listening and we love you all and um we'll talk to you next week yeah thanks brian thanks


Want to go deeper? Check our projects