Transcript #368: That episode where we just ship open source
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 368, recorded January 23rd, 2024.
00:13 I'm Michael Kennedy.
00:14 And I'm Brian Okken.
00:16 This episode is sponsored by us. Support us by checking out our work.
00:21 We do lots of things. We have many, many courses over at Talk Python Training.
00:25 We have the complete pytest course. We have Patreon supporters.
00:28 You can become one in the show page, the episode page, and connect with all of us, all three of us, Brian, me, and the show over on faucet.org.
00:38 And if you want to be part of the live episode, it's pythonbytes.fm/live.
00:42 Usually, Tuesdays at 10 a.m., we've changed it. We have a new time, Brian.
00:47 New time, yes.
00:48 New time. So that's the plan for now until... it's not the plan.
00:53 But we love it when people show up for the show.
00:55 And now let's dive right in. Go for it, Brian. What you got?
00:59 Well, I wanted to talk about debugging a little bit because we've got a blog post.
01:05 Actually, it's a blog post and really a newsletter episode from Unis.
01:12 It's from a site called Syntax Error.
01:15 And it looks like it's a collection of... it's a newsletter about debugging, which is kind of nice, and somehow I missed it in the past year.
01:25 It started, it looks like, February of 2023.
01:29 But we're on episode 11 or issue 11, and it's kind of a summary.
01:33 So it's pretty neat. It's talking about debugging in Python.
01:35 I really love just the concept of this, of the newsletter, but also just it's really good content in a small thing.
01:43 So what is he talking about?
01:45 So if you're debugging some code, the first thing you got to do is you got to get in the right mindset, and then you can use some tools.
01:53 So I'm glad that he starts that with the mindset.
01:56 He's talking about mindset, take a break, stop, breathe, and then come back to it.
02:02 And this breaking away from you're frustrated with your code to clearing your head is really important.
02:08 Don't skip that. I think it's essential.
02:11 Go grab a cup of coffee or something.
02:14 And then using a step-by-step process.
02:16 Don't just, I mean, it's hard to say not to just jump to the thing that you think might be broken and try to fix it.
02:23 Okay, after you did that and it didn't work, then come back to this and then do a step-by-step methodical process.
02:29 And I think it's very helpful.
02:32 There's a little comic here, which is great, of Gru from, oh, I forget the name of the movie.
02:40 But he says, "Need to debug an issue, set a breakpoint to get started.
02:45 The breakpoint never hits. The breakpoint never hits." It's pretty funny.
02:49 Anyway, so being methodical about it will help.
02:52 And then I'm glad he brought this up, talking about rubber ducking or talking to ducks.
02:59 And this is an age-old, and I don't know if it ever actually happened in my computer science classes.
03:07 In our lab, we had a stuffed monkey that if you asked the TAs or the grad students that were hanging out in the lab for help, they would say, "Ask the monkey first." And so this is just essentially getting a description of the bug, the situation, the background information in your mind in a way that you can say it out loud will sometimes completely solve your problem.
03:33 It's an incredible tool.
03:36 And one of the things that was interesting is he talks about brain dump as an alternative solution is writing on paper.
03:44 If you're not the kind of person that verbalizing helps, writing it on paper might help.
03:48 Okay, now let's get into the tools, the tools that help with debugging.
03:53 And I used to feel guilty about this all the time, but I reached for print all the time, or some sort of module.
04:02 They said, "Don't do print. Come on." So his technique is to start with print because it's low friction.
04:08 Everybody knows how to do it.
04:10 Plus we have F-strings now, and with the equal sign, if you do curly braces and then the variable name with an equal, it just says it's great.
04:20 So anyway, it's really easy to debug print, which is good, and it's low friction. It's easy to add.
04:27 Snoop is an interesting, cool toolkit that he talks about for helping to see what's going on within your code at each step.
04:36 It's a pretty cool tool as well.
04:38 Let's just quickly go through some of the other tools.
04:40 Those are the two printing, logging sort of things.
04:43 There's also Ice Cream that he mentions, and there's debuggers.
04:48 So talking about debuggers, this is not--
04:51 interestingly, he doesn't mention IDEs, which that's what I usually reach for is either a PyCharm or VS Code debugger.
05:00 But sometimes you don't have access to those if you're SSH'd into something or whatever.
05:06 So invoking--being able to use PDB, I think he talks about PDB, which is the Python debugger.
05:12 I learned how to--actually learned how to do this mostly just to talk about using PDB with pytest for the book, and now I use it once in a while because sometimes it's even more convenient, especially when using PDB with talks. It's great.
05:28 So PDB, IPDB, which is an interactive REPL sort of thing.
05:32 PUDB, which is kind of like--it's got panels and stuff.
05:37 It's a nice terminal UI.
05:39 WebPDB, which is the same thing within a browser. It's kind of nice.
05:43 Birdseye is something I hadn't seen before, which is kind of cool talking about Birdseye.
05:48 It has these kind of neat diagrams with boxes around stuff as things change.
05:54 It's an interesting interface.
05:57 >> It's pretty, yeah.
05:59 I don't know if it's for me, but if it resonates with you, that's great.
06:04 It might be worth trying on a project. Kind of neat.
06:08 Anyway, and then a quick shout-out to some Django tools.
06:11 So if you're debugging Django, there's the Django debug toolbar and an extension for VS Code called Colo.
06:21 So anyway, some great advice about debugging specifically Python, but really a lot of this advice applies to everything.
06:30 So nice. And kind of nice that there's a newsletter around that.
06:33 >> Yeah, it is a nice newsletter.
06:35 There's something kind of good about the permanency of written stuff.
06:39 What we do is great, and I think it connects with a lot of people, but it's harder to go back to it and search it.
06:46 >> Yeah, and I kind of like the idea of--
06:48 I know that a lot of newsletter software, like Substack and things like that, can keep it around for you in Medium, but I like the idea of somebody doing a newsletter and putting the newsletter things on blog posts at the same time for people to reach out to.
07:05 >> Neat. I might have more to say about that later.
07:08 But I also have something to say about what you just pointed out, what you just talked about, and I have just done a new project.
07:17 I have some things that I've been working on.
07:19 I already talked about the leave in the cloud and the interview with Mark Prusinovich that inspired me to kind of rethink how our infrastructure goes, and it is just paying so many dividends.
07:29 I'm going to talk about it in some interesting ways.
07:32 As part of that, I've had to write a little bit of new software, and I'm like, "I need some logging." I'm going to try Loguru.
07:39 Loguru? I don't know. The G is combined.
07:42 Wow, is this a nice piece of logging software.
07:44 So what I would suggest, Brian, if you're feeling the print coming on, if you're like, "I'm going to print this.
07:49 I'm going to print my way to this bug solving this problem," you should consider Loguru-ing your way.
07:55 You just create the Loguru thing, and you can say use color and all of that, and it will also do print statements just to sys out, right?
08:04 But you can see right here on their homepage, it says how to do color and stuff like that.
08:10 And then if you just logger.info or whatever, it'll print it out, but way more structured and with color, and then if there's an exception, you're going to say print E, the exception, you could just say logger.exception, and it will create the trace back showing the local variables at every step.
08:29 So instead of having to jump into the debugger, you can just print your way to like, "Oh, here's the entire call stack and all the values." That's pretty cool.
08:35 I super, super recommend it.
08:37 I've been using Logbook. I'm a Loguru fan.
08:40 I'm resisting the urge to go and rewrite all my logging for all of my things to Loguru because it's not that productive, but boy, did my logging look cool.
08:49 All right, that's not what I want to talk about, but I want to talk about things that were kind of inspired by that.
08:54 So first I want to talk about Umami, and this has a Python loopback really, really quickly here, but let's start from the outside in, okay?
09:03 - Okay.
09:04 - So Brian, I set up Umami at umami.is, which is like Google Analytics, but not evil.
09:12 That's awesome, right?
09:13 So the idea is it's privacy preserving.
09:16 It is GDPR and CCPA compliant.
09:20 It's open source, and you can buy it as a service, right?
09:24 I can go over here and say pricing for nine bucks.
09:28 Some period I will get some number of websites and it'll give me, you know, analytics, like Google Analytics for my site, right?
09:36 That's pretty cool.
09:37 - Yeah.
09:38 - But what's better, the problem with that is it's still third-party JavaScript, even if it's, they don't use cookies, but it's still third-party JavaScript, and by way of that, it gets blocked a lot, especially by the developer crowd, right?
09:52 And I'm not, that's not a criticism.
09:54 I'm like on the high end of blocking, right?
09:56 Like, no, no, we're not doing this.
09:58 No, you don't need this kind of stuff, right?
10:00 But if you run it on your own infrastructure, under your own domain, the app is doing nothing nefarious.
10:07 It's talking to itself for some things and it's going back and talking to itself for other forward tracking.
10:11 So this is really, really easy to run under Docker as a multi-tier Docker app on your own domain, which is what I'm doing.
10:18 And so now I can have some really nice insights into what are happening on pythonbytes.fm, the courses, all that, without sharing any data with anyone ever and without being blocked because it's just code running on our own server, just like everything else on the website.
10:34 - That's cool.
10:35 - Awesome, right?
10:36 The problem is if you go over here and you're like, awesome, okay, developers, this is me, I'm a developer, let's go.
10:40 Take me to the docs.
10:41 And cool, look, there's an API section at the end down here.
10:45 Okay, and now look, there's an API client.
10:47 I don't wanna write code.
10:48 That's great.
10:49 NPM install API client.
10:51 Oh, crap.
10:54 The only API client for Umami is JavaScript or TypeScript.
10:59 I don't know, it doesn't matter.
11:00 It runs in JavaScript.
11:01 It's not Python, right?
11:02 Actually TypeScript.
11:03 This whole app is basically TypeScript, right?
11:05 That was until this week.
11:07 So some guy down here named Michael released this thing called Umami-Analytics.
11:13 Put it on PyPI, go over to the homepage.
11:16 And you can see it talks about how it works.
11:19 Basically, one of the things that's really nice about Umami over certain other systems, like plausible.io is one that has been thrown around in the same space and it's similar, is that with Umami, you can send custom events that have nothing to do with direct web actions.
11:36 So for example, suppose somebody signs up for an account and then opts into your newsletter.
11:43 You just talked about newsletters.
11:44 And then that's a double opt-in.
11:46 So they get an email, which then goes back to some other place where they actually say, "Yes, I really, really do wanna get this." It'd be cool if you could know, "Okay, that happened," right?
11:55 And so the whole point of this Python library is to add Python-based events to your analytics on top of just what the JavaScript is.
12:04 Like you're on this page and then you went to that page and you came from this place and you're on this browser.
12:08 It'll let you send in things like, somebody bought a course, somebody confirmed their email address, somebody logged in with the mobile app for the first time.
12:18 All of these things that have no straight HTML JavaScript experience, you can just pump those in right alongside all of your other analytics.
12:25 Still all privacy preserving, not sharing data with anybody, no retargeting, no cookies, none of that crap.
12:31 Just, I wanna view into what's happening in my app.
12:34 So this thing lets you add a custom event and also you can like register multiple sites.
12:39 You can list them out.
12:41 It has both synchronous and asynchronous programming models based on Pydantic and HCPX.
12:47 And yeah, super easy to use.
12:49 - Very cool.
12:50 - Isn't that neat? - Yeah.
12:51 - So, recommend Umami, but one of the problems with Umami is there's not really a great client to like round that out.
12:57 So check out the one that I created.
12:59 - Nice.
13:00 - This is gonna be a theme this week.
13:01 So...
13:02 - Apparently.
13:03 We didn't plan this.
13:04 - No.
13:05 - Yeah.
13:06 If we did, we would have both worn blue shirts.
13:09 Oh wait, we're both wearing blue shirts.
13:10 - We are wearing blue shirts.
13:12 Oh, my tent is off though.
13:13 All right, over to you.
13:15 - I had an extra from the last one 'cause there was a link from Eunice about fstrings.help, which I think I've seen before, but I kind of forgot about.
13:24 But just looks like a Jupyter notebook about fstrings, which is...
13:30 Okay, well, I'll have a link of that in the show notes.
13:32 I wanted to mention that...
13:35 So I did an open source thing also.
13:38 So I released a thing called...
13:40 - Oh, you did, okay.
13:42 - pytest suite timeout.
13:44 And there's a little, I guess, a story around it.
13:47 So what happened was I recorded an episode of Python test about repeating tests.
13:53 And I noted that pytest repeat doesn't have a timeout, but pytest flake finder does have a timeout.
13:59 And it'd be kind of neat if repeat had a timeout also.
14:02 And by timeout, I mean, there's the entire suite.
14:07 So if I want to say, "Hey, I want to run..." I have an example.
14:10 I want to run my suite a thousand times or a test a thousand times 'cause I'm looking for flaky behavior or something.
14:18 But I want to make sure that it only runs 10 minutes.
14:21 Then that's the behavior I wanted.
14:24 Like the entire suite, not individual tests, but the entire suite to only be like 10 minutes or an hour or whatever.
14:30 That's the behavior I want.
14:32 And I couldn't figure it out.
14:34 And so I wrote this.
14:36 Now it could have been in pytest repeat, but while I was thinking about it, I thought, "Well, I have other times where I've got parameterized tests that are like big lists, like 20 different waveforms or something that I'm passing through something." And sometimes I don't really know how long those are going to take.
14:54 It'd be kind of nice to be able to say, "Hey, I want to make sure that the whole suite isn't longer than so much." So I made it its own plugin.
15:03 So here it is, pytest suite timeout.
15:05 You just pass it a flag.
15:07 It's still... I just sort of did this a couple days ago, and I think there might be bugs in it.
15:13 So I guess don't put it in production yet.
15:16 That's why I know...
15:17 >> Well, in production.
15:18 >> Yeah.
15:19 >> It's a little lower bar for test production rather than I took down the website.
15:25 I just took down CI/CD is possibly what you might take down, which is still a problem.
15:29 >> Yeah.
15:30 Well, I think I just ran across this morning I was playing with it.
15:34 At least one use case, the word doesn't actually timeout.
15:37 So that's the behavior when it fails is it won't timeout.
15:41 But we'll work with it and fix it.
15:44 >> That's super cool.
15:45 >> One of the... I announced it on Mastodon, and Mike Felder said, "That's pretty cool, but have you tried pytest-timeout?" Which, yeah, there's another one called timeout, and it seems like that should be what I want.
16:01 It's just the timeout is...
16:02 The pytest timeout is per test.
16:05 It just makes sure that individual tests themselves don't run longer than a certain amount.
16:11 >> I see.
16:12 >> And this is kind of like...
16:14 You should know this, right?
16:15 Probably about how long your tests run.
16:18 But it's Python and software, so sometimes infinite loops happen or some use case that you never break out of.
16:26 >> Well, also, just the fact that it's taking way longer than it should might be something you want to trigger as an error, right?
16:35 >> Yeah.
16:36 >> Like if for some reason you want to talk to a database or an API directly and you're not stubbing it out, if those things are down, it could take 20 seconds for them to say, "Nope," every single time.
16:46 And you might want to say, "If this ever takes more than five seconds, something's wrong," and just kill it.
16:51 You know what I mean?
16:52 I think that would even be reasonable.
16:54 >> Yeah, so that's the idea around pytest timeout is if it takes longer than a certain amount, attempt to kill it, and it does.
17:00 It does like SIG events and stuff to try to kill the process that's taking too long.
17:06 >> Excellent.
17:07 >> Whereas the new one, suite timeout, is nice.
17:09 It won't kill anything, but it also won't stop something like that.
17:14 But it'll just, between tests, say, "Hey, this is taking kind of too long.
17:19 Let's stop now." >> Okay.
17:22 Well, you might not want to SIG kill either because what if it's going to put something in a database, do some stuff, and then take it back out or make a file change and then clean up the temporary files or, you know, whatever, right?
17:35 >> Yeah.
17:36 The other part of this, though, is I think it's too nice so far.
17:41 It doesn't throw any exceptions or errors or anything.
17:44 It just stops the counting.
17:46 So if you normally, like in this example, if I had 1,000 and I only get through, like, 150, it just stops, passes everything, but it only ran 150 instead of 1,000.
17:57 I'm trying to figure out a way to, like, alert the user a little bit more that there's something wrong.
18:03 So we'll see.
18:04 It'll grow a little bit after this.
18:07 >> Cool. Oh, excellent. Excellent.
18:09 This is a crazy episode of where it's just we all created a bunch of things.
18:13 So let's go back to things we created, huh?
18:14 >> Okay.
18:15 >> Next one.
18:16 This one is also a thing I didn't create, but outside in again.
18:20 So I've been using MailChimp for years, and when I first started using MailChimp, you know, MailChimp is I want to let you subscribe to my newsletter and put you into groups so that if I only want to talk to the Talk Python people, I can send that message.
18:32 If I only want to talk to the Python Bytes people, I can send that message, right?
18:36 And the price has just been going up and up and up, like hundreds of, $100 this month, the next month another $100.
18:42 You're like, what is going on with these people?
18:44 You know, Intuit bought it, and it used to be like kind of a cute little company, and now it's just a accounting firm grinding its users, and I kind of don't want anything else to do with it.
18:52 And I would much prefer to not share all of the people, customers, people who just want to subscribe their data with a third party either, right?
19:01 So I went on, I think I talked about this before.
19:03 Remember I talked about the 10 different options that people had sent out of possible newsletter places?
19:08 - Yeah.
19:09 - I wish I remember who's hold me on Mastodon, but somebody said, well, there's these five open source ones.
19:13 I'm like, wait a minute.
19:14 Okay, that's interesting.
19:16 And so after a bunch of research, I decided to turn on ListMonk.
19:21 And ListMonk is written in Go, and it's an open source.
19:26 There's not even a SaaS version.
19:27 It's just self-hosted version of basically MailChimp, right?
19:31 You can have different lists, people can subscribe to them, you can put them into groups, you send them emails, all that kind of stuff, right?
19:36 - Yeah.
19:37 - So I, again, 'cause I have all this cool Docker infrastructure stuff set up now, it was super easy to just move that over and run that in Docker, right?
19:45 Just like you, mom, you're like, okay, how do I talk to it?
19:48 There's not even an official API client.
19:50 The ones you find are like, well, here's one for PHP.
19:53 There's actually several for Python, but they're really bad and they don't work.
19:58 I mean, really bad.
19:59 So some of them, for example, are just, they look at the Swagger docs or the open API docs and they just auto-generate it.
20:07 But somehow it's like stuck in time, auto-generated on an old version that doesn't work anymore.
20:12 I don't know, it's like even the auto-generated one doesn't work.
20:15 I'm like, ah, man, I really need this.
20:16 Even more than the umami thing, I need code to be written.
20:20 So like someone creates an account when they buy a course and they say, yes, I wanna be, you know, I asked them, do you wanna be in the middle of this?
20:26 Yes, I wanna be in there.
20:27 How do I make that happen, right?
20:28 Well, Python, of course.
20:30 So over the next project, ListMonk email app API client for Python or just pip install ListMonk.
20:39 - Okay.
20:40 - So over here, this is the next one.
20:41 Super nice, you can add a subscriber, get details about them.
20:44 One of the things that's cool in ListMonk is there's a arbitrary JSON Python dictionary type thing associated with each user.
20:53 So whatever data you wanna put in there, you can.
20:55 And with this thing, you can manage it.
20:56 Like for example, if one thing that's common is you have a rating or things along those lines or actions, you could put that into the user as part of their user record.
21:06 So you can manage it with that.
21:07 You can search them, check the health of your self-hosted thing, segment on your list.
21:11 Obviously you gotta unsubscribe and delete users.
21:14 You can even send transactional emails.
21:16 So super, super cool stuff.
21:18 Again, one more nice open source thing that's not, you know, some big, super expensive, privacy questionable SaaS service.
21:27 And instead running good over here, it does take a little bit of work.
21:31 Umami is like perfect.
21:33 This is a little clunky in some little edge cases, but it's still quite nice.
21:38 So that's the next project.
21:40 Also available on PyPI today.
21:43 - Nice.
21:44 - That's it for our items.
21:46 - Cool.
21:47 - Hopefully between all these things, we can help people write one a little bit better test and to depend a little bit less on just giving up a little bit of privacy to trade it in convenience, like Google Analytics, for example, or to a lesser degree, some of these mail platforms.
22:02 - Yeah.
22:04 And save some money while you're at it.
22:05 All right.
22:06 - Well, normally we would jump into some extras and I don't have any extras this week.
22:11 So do you have any extras?
22:13 - I do have extras.
22:14 Well, let's see what have I got here.
22:16 Yeah.
22:17 Okay.
22:18 So the first one is if I'm running, self-hosting these things, right?
22:20 I'm running them in a Docker cluster.
22:21 So it's really easy to basically just do a Docker pull, restart, you know, relaunch the app, off it goes, right?
22:29 So that's awesome.
22:30 That's one of the reasons I'm willing to run like Umami rather than like FS server and all these database things, I get a patch and whatever, right?
22:37 Just literally one command to manage like 15 multi-tier apps.
22:42 It's awesome.
22:43 But how do you know when there's a new one, right?
22:45 Obviously you could just set it up to just do it continuously.
22:47 But what I realized is every GitHub repository, this has nothing to do with Umami, just an example, every GitHub repository, if they use releases, right?
22:56 If you go over here and you say like the releases, like I have a V01.10 for my Umami thing, and there's actually two of them, right?
23:05 If you have that for any object, you can just go to the GitHub URL for the web, not the dot get thing and just do slash releases dot Adam.
23:15 And that's an RSS feed for the releases for any GitHub project, even if they don't have a blog.
23:20 - Wow.
23:21 - That's cool, right?
23:22 - Yeah.
23:23 I can put this in Feedly then.
23:24 - Yes, I put it in Reader for me and now I have ListMonk and Umami and a few other things that I'm like, if this gets changed, I probably wanna just go take a little action on that real quick.
23:34 And now it's in my RSS feed.
23:36 - That's pretty cool.
23:37 - Yeah, so very simple.
23:38 Anyone can just watch whatever they want.
23:41 Brian, we both tried to do this one.
23:42 - Yeah.
23:43 - Colo, you mentioned that in your article, I ran across this 'cause I, sorry, I don't remember the last name, but I saw one of my Mastodon followers, Lily, she somehow interacted with me and her profile came by in my app.
23:57 And I saw that she works on this thing called Colo, debugging for Django apps.
24:02 I'm like, huh, that's interesting.
24:03 What is this?
24:04 So this is a thing that's in beta.
24:05 It says, see everything happening in your running Django app.
24:10 And they have a really nice design of their webpage here.
24:14 So probably best to see visually.
24:16 It says debug your Django app 10 times faster, get instant access, et cetera, et cetera.
24:20 So this is a plugin or extension for VS Code.
24:23 And it just has tons of information all available to you.
24:27 So it has a tab or whatever the thing on the left is.
24:30 You expand like extensions and files and it plugs into that thing, a little pane, I guess.
24:35 And it shows you the request response, like kind of like a dev tools in a web browser.
24:41 So you can see headers, HTTP requests, responses as kind of a running history of the HTTP exchange your browser is having with your Django app.
24:51 That's cool, right?
24:52 - Yeah.
24:53 - And I think it's showing you, not entirely sure, but I think it might be showing you even Python code, not just web things, right?
25:00 It has local variables, arguments, and then it has even like this tree thing for visualizing code execution paths.
25:07 So yeah.
25:09 - Yeah, so you click on the, sorry, you click on the request, it shows you the code and then it actually shows you the local variables that were passed around as well.
25:15 It's pretty neat.
25:16 - Yeah.
25:17 I don't know that the tree, the visual thing is super pretty, but I don't know how awful it is, but I haven't played with it yet.
25:23 - I agree with you.
25:24 It's awesome.
25:25 Wouldn't use it.
25:26 (laughing)
25:29 Yeah, you can do, what is it?
25:32 Inspect all the outbound HTTP requests made.
25:34 That's kind of neat.
25:35 And SQL queries, you can, it'll track all the SQL queries that were made.
25:41 Really good for understanding what's happening.
25:43 What's up, Brian?
25:44 - That's just really nice because you never know when your queries get out of hand and you're making way more than you need to.
25:50 - Exactly.
25:51 Especially in the ORM space because it's so easy to do lazy loading and say, give me all the customers.
25:57 For each customer, get me this thing about them.
26:00 And that's a relationship.
26:02 So every time through the loop, it's another database query, the so-called N plus one performance problem, right?
26:07 And you would just see like, whoa, the SQL thing is full.
26:10 I thought there were like two or three requests and now it's just full.
26:13 What is happening here, right?
26:15 So that's great.
26:16 Yeah, anyway.
26:17 - Ooh, background jobs.
26:18 - Yeah, even contract your salary background tasks.
26:21 So right now it's in beta.
26:22 I'm pretty sure this is a thing that costs money at some point.
26:25 Yeah, so if you VS Code, check this out.
26:28 It's kind of interesting.
26:29 - Yeah, definitely.
26:30 Neat.
26:31 - Neat, all right.
26:32 Another thing that's cool is I've talked about warp before and I've been using warp at the terminal a lot.
26:38 One of the drawbacks of warp for all of its beauty and cool features is that it doesn't, it only works on Mac for now, which is a limitation, let's call it.
26:48 - Not for me.
26:49 (laughing)
26:50 For other people.
26:51 - Yeah, not for me, but for a good chunk.
26:53 Now I say it's only somewhat of a limitation.
26:55 So like on my Mac, if I SSH into my Docker cluster thing that I've been talking about, warp will like inject the warp behaviors into the Linux shell over there.
27:07 So I get like end to end warp as a Mac user, but if I was actually a Linux user, I couldn't use warp 'cause it's a Mac app until pretty much now, right?
27:17 So coming soon is warp on Linux.
27:20 So people wanna sign up for that.
27:21 I put a link for in the Linux terminal signup page to get on the wait list and warp is just a super neat way to work with.
27:30 With your terminals more like an editor.
27:32 It's got AI built in, which most AI built in things I hate.
27:35 They're really bad, but you can say things like, just say hash and then you'll say something like, you know, search this directory for all files with this pattern, except that directory.
27:45 And then it'll go, here's the command that you type.
27:48 You know, like that kind of, 'cause it's that kind of stuff that I'm like, what's the parameter to this?
27:52 How do I grep that again?
27:53 I have no idea.
27:54 (laughing)
27:55 So anyway, it's pretty cool.
27:56 - I wonder if it's set up.
27:58 I'm just curious if it's, since they're doing different platforms, if they've got a UI layer and then a warp core.
28:06 - Oh my God, they probably do have a warp core.
28:08 And if they didn't name it that, they've really lost a chance here, right?
28:12 - Yeah, hopefully.
28:13 - So I talked about this before I realized through search about two and a half years ago, something called BPyTop.
28:21 So BPyTop is an awesome, if it gets too small, it thinks it's gonna hide all of its graphics, way to look at how your server is going.
28:30 And it is so neat the way that this app works.
28:34 I definitely, let me just, I'll put it up.
28:36 Here's the live running version of the one that I've been messing with lately.
28:43 And Brian, you can see you've got your memory.
28:45 If there's not a whole lot of action going on right now, so it's kind of blank graphs, but like if the memory jumped up, you would see it go up.
28:51 It shows you how much memory is free, how much is being used, how much of that is being cached, disk activity.
28:58 You can see the network traffic, the multiple, it has four CPUs and it shows you graphs for all four CPUs as well as like the combined.
29:08 And I'm not gonna show the processes 'cause they might show command arguments that I just don't wanna share.
29:14 But it seems like it probably somehow could be a bad idea that I'm not aware of, but we'll learn later in a hard way.
29:20 But isn't that an amazing way to just, this is over an SSH session.
29:25 - Oh, that's pretty cool.
29:26 That's amazing.
29:27 - Yeah, and watch this.
29:29 So if I just hit escape, you get even, it's like an old video game options with mouse support and everything.
29:36 - Oh, that's pretty cool.
29:37 - Yeah, so another thing to sort of announce here is there's BPyTOP, which you can pipx install, but they've also, as part of this, released a BTOP rewritten, and I think it must be C++.
29:51 So anyway, that's cool, right?
29:53 People can, I think that's supposed to be a little bit more high performance, although to me, they kind of seem like the same type of thing.
30:00 Anyway, really cool.
30:01 If you've been using like TOP or something like this, there's a really much better way.
30:07 And Glance is good, but BTOP is the new winner in my world here.
30:11 - And you know, those sort of graphs, even if you don't need them, you can have a second monitor and have one of those running.
30:17 Everybody in your life will think you do something cooler than you actually do.
30:20 - Exactly.
30:21 Whoa, you're a hacker, aren't you?
30:22 That's a terminal.
30:23 (laughing)
30:24 Yeah, I am, okay.
30:26 Don't cross me.
30:28 All right.
30:29 - Nice.
30:30 Right, I think that's our extras.
30:33 - It is.
30:34 Chris Tyler, just real quick, has a recommendation, switch to bottom BTM, which is similar, but written in Rust and a little more performant.
30:41 Also cross-platform like BPyTOP.
30:44 Okay, well, maybe, maybe that needs to be checked out as well.
30:48 Maybe my time with BTOP was short and I'll be over to bottom before I know it.
30:52 - Top and bottom, that's just terrible.
30:54 - Yeah, these are funny.
30:56 Yeah, thanks Christopher.
30:57 All right, I think I'm ready for a joke.
30:59 - Yes.
31:00 - I've got something, you know, I've been talking about consolidating all these servers and running different things.
31:05 We just talked about the monitoring your server and Docker.
31:09 So I thought it might be fun to share this post on InfoSec Exchange Mastodon from Jeff Hall.
31:16 - Wow.
31:17 - And it's got this, describe this for us, Brian.
31:19 - It's just a mess of cables coming out of the back of what, a bunch of, I don't know.
31:25 - Network equipment?
31:26 - Yeah.
31:27 - It's just like the world, you couldn't imagine a worse set of tangled wires and they're dirty too, right?
31:33 It's not just like, they're covered in, that's all these routers and they're just, they're white, but they're most, they're significantly brown as well.
31:43 - With like a whole bunch of hubs hanging in between and stuff.
31:45 - Yeah, yeah, and a lot of these pieces are just suspended by the wires and it just says the cloud.
31:51 (laughing)
31:52 - Yeah, yeah.
31:54 - It's very nice, I love it.
31:55 - Yeah, that's very cool.
31:57 - Indeed.
31:58 - Funny.
31:59 - All right, well, that's it for the show, I suppose.
32:01 And we don't normally have a final call to action, but go check out your new pytest thing, your timeout and check out some of these other self-hosted things.
32:11 - Yeah.
32:12 - Yeah, it's really cool.
32:14 A lot of stuff people can adopt in.
32:16 - Yeah.
32:17 - Thanks for being here.