Python Bytes - #368 That episode where we just ship open source
Episode Date: January 23, 2024Topics covered in this episode: Syntax Error #11: Debugging Python umami and umami-analytics pytest-suite-timeout Listmonk and (py) listmonk Extras Joke See the full show notes for this episode ...on the website at pythonbytes.fm/368
Transcript
Discussion (0)
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.
I'm Michael Kennedy.
And I'm Brian Ocken.
This episode is sponsored by us.
Support us by checking out our work.
We do lots of things.
We have many, many courses over at TalkPython Training.
We have the Complete PyTest course. We have Patreon supporters
that 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 Fossadon.org. And if you want to be part of the live episode,
it's PythonBytes.fm slash live, usually Tuesdays at
10 a.m. We've've changed it we have a new time
brian new time yes new time so that's the plan for now until it's not the plan but we love it
when people show up for the show and now let's let's dive right in go for it brian what you got
uh well i wanted to talk about debugging a little bit because um we've got um a blog post actually it's a blog
post and a really a newsletter episode um from unis it's a site called syntax error and it looks
like it's um a uh a collection of it's a newsletter about debugging which is kind of nice and and
somehow i missed it um in the past year, it started,
it looks like February of 2023. But we're on episode 11, or issue 11. And it's kind of a
summary. So it's pretty neat. It's talking about debugging Python. I really love just the concept,
the concept of this of the newsletter, but also just it's really good content in a small thing.
So what is he talking about?
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.
So I'm glad that he starts that with the mindset.
He's talking about mindset.
Take a break, stop, breathe, and then come back to it.
And this breaking away from you're frustrated with your code
to clearing your head is really important.
Don't skip that.
I think it's essential.
Go grab a cup of coffee or something.
And then using a step-by-step process.
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.
Okay, after you did that and it didn't work, then come back to this and then do a step-by-step methodical process and i think
it's very helpful um um there's a little comic here which is great of uh of grew from uh oh i
forget the name of the movie um but uh he says uh need to debug an issue, set a breakpoint to get started.
The breakpoint never hits.
The breakpoint never hits.
It's pretty funny.
Anyway, so being methodical about it will help.
And then I'm glad he brought this up, talking about rubber ducking or talking to ducks.
And this is an age old, and I don't know if it ever actually happened in my computer science classes.
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 to 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.
It's incredible, incredible tool.
And one of the things that was interesting is he talks about brain dump as an alternative solution is writing on paper.
If you're not the kind of person that verbalizing helps,
writing it on paper might help.
Okay.
Now let's get into the tip,
the tools,
the tools that help with debugging.
And I used to feel guilty about this all the time,
but I reached for print all the time.
So,
or,
or some sort of,
they said,
don't you don't do print.
Come on.
So his technique is to start with print because it's low friction. They said don't do print. Come on. So his technique is to start with print
because it's low friction.
Everybody knows how to do it.
Plus we have F strings now.
And with the equal sign,
if you do like curly braces
and then their variable name with the equal,
it just says it's great.
So anyway, it's really easy to debug print,
which is good.
And it's low friction. It really easy to debug print, which is good. And it's a little friction.
It's easy to add.
Snoop is an interesting, cool toolkit that he talks about
for helping to see what's going on within your code at each step.
It's a pretty cool tool as well.
Let's just quickly go through some of the other two.
Those are the two printing, logging sort of things.
There's also Ice Cream that he mentions.
And there's debuggers.
So talking about debuggers, this is not,
interestingly, he doesn't mention like IDEs,
which that's what I usually reach for is like either a PyCharm or VS Code debugger.
But sometimes you don't have access to those if you've like,
if you're SSH into something or
whatever. So invoking, uh, being able to use PDB, I think he talks about PDB, which is the Python
debugger. I, I learned how to actually had 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.
So PDB, IPDB, which is an interactive REPL sort of thing.
PUDB, which is kind of like got panels and stuff.
It's a nice terminal UI.
Web PDB, which the same thing within a browser.
It's kind of nice.
Birdseye is something i hadn't seen before
which is kind of cool talking about bird's eye it has these kind of neat diagrams with like boxes
around stuff as things change it's a interesting interface um it's pretty yeah yeah i don't know
if it's for me but if it resonates with you yeah it's great. It might be worth trying on a project. Kind of neat.
Anyway, and then a quick shout out to some Django tools. So if you're debugging Django,
there's the Django debug toolbar and an extension for VS Code called Colo. So anyway,
some great advice about debugging specifically Python python but really kind of a lot of
this advice applies to everything so nice and uh kind of nice that there's a newsletter around that
so it's yeah it is a nice newsletter there's something kind of good about permanency of
written stuff rather than i mean what we do is great and i think it connects with a lot of people
but it's it's harder to go back to it and like search.
So, yeah.
And I kind of like the idea of, I know that a lot of newsletter, uh, newsletter software,
like a sub stack 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, um, for people to reach out to.
So I might have more to say about that later.
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.
I have some things that I've been working on.
I already talked about the leave in the cloud and the interview with Mark Percentovich and
how that inspired me to kind of rethink how
our infrastructure goes. And it is just paying so many dividends. I'm going to talk about it
in some interesting ways. And as part of that, I've had to write a little bit of new software
and I need some logging. I'm going to try Log Guru. Log Guru? I don't know. The G is combined.
And wow, is this a nice piece of logging software. So what I would suggest, Brian,
if you're feeling the print coming on, if you're like, Oh, I'm going to print this, I'm going to
print my way to this bug, solving this problem, maybe consider log guruing your way. You just
create the log guru thing and you can specify, you can say use color and all of that. And it will
also do print statements just to sys out right but you can see like right here on their
home page it says like how to do like color and stuff like that and then if you just logger dot
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 like say print e print the exception you could just say logger dot
exception and it will create the traceback
showing the local variables at every step.
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.
I super, super recommend it.
I've been using logbook.
I'm a log guru fan.
I'm resisting the urge to go and rewrite
all my logging for all of my things.
Because it's not that productive. but boy, my logging look cool.
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. So first I want to talk about Umami and this has a Python loop back
really, really quickly here, but let's start from the, um, the outside in. Okay. Okay. So Brian, I set up Umami at
umami.is, which is like Google analytics, but not evil. That's awesome. Right? So the idea is it's
privacy preserving. It is GDPR and CCPA compliant. It's open source and you can buy it as a service right i go over here say pricing for nine
bucks um some period i will get some number of websites and it'll give me you know analytics
like google analytics for my site right that's pretty cool but what's 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, even if 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?
And that's not a criticism.
I'm like on the high end of blocking, right?
Like, no, no, we're not doing this.
No, you don't need this kind of stuff, right?
But if you run it on your own infrastructure,
under your own domain,
the app is doing nothing nefarious. It's talking to itself for some things, and it's going back
and talking to itself for other forward tracking. 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. 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. That's cool. Awesome, right? 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, let's take me to the docs. And cool, look, there's an API section at the end down here.
Okay, and oh, look, there's an API client client i don't want to write code that's great npm install api client oh crap the only
api client for umami is javascript or typescript i don't know it doesn't matter it runs in
javascript it's not python right actuallyScript. This whole app is basically TypeScript, right? That was until this week.
So some guy down here named Michael
released this thing called Umami-Analytics.
Put it on PyPI.
Go over to the homepage.
And you can see it talks about how it works, 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.
So for example, suppose somebody signs up for an account and then opts into your newsletter,
you just talked about newsletters, and then that's a double opt-in. So they get an email, which then goes back to some
other place where they actually say, yes, I really, really do want us to get this. It'd be cool if
you could know, okay, that happened, right? 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 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.
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.
All of these things that have no straight HTML JavaScript experience, you can just pump
those in right alongside all of your other analytics.
Still all privacy preserving,
not sharing data with anybody,
no retargeting, no cookies, none of that crap.
Just I want to view into what's happening in my app.
So this thing lets you add a custom event
and also you can like register multiple sites.
You can list them out.
It has both synchronous and asynchronous programming models
based on Pydantic and HCPX. And yeah, easy to use very cool that name yeah so recommend umami but one of
the problems with umami is there's not really a great client to like round that out so check out
the one that i created nice this is gonna be a theme this week so uh apparently we didn't plan this like no yeah if if we did we
would have both worn blue shirts oh wait we're both wearing blue shirts we are wearing blue
shirts oh my tent is off though all right over to you i had an extra from the last one because
there was a link from unis that about um f strings dot help which i think I've seen before, but I kind of forgot about. But just looks like a Jupyter notebook about fstrings, which is okay.
Well, I'll have a link to that in the show notes.
I wanted to mention that.
So I did an open source thing also.
So I released a thing called.
Oh, you did.
Okay.
PyTest suite timeout.
And there's a little, I i guess a story around it so
what happened was i recorded an episode of python test about repeating tests and i noted that pytest
repeat uh doesn't have a timeout but pytest flake finder does have a timeout and it'd be kind of
neat if repeat had a timeout also and by timeoutout, I mean, there's like the entire suite.
So if I want to say like, hey, I want to run like,
I have an example.
I want to run my suite like a thousand times
or a test thousand times
because I'm looking for flaky behavior or something.
But I want to make sure that it only runs like 10 minutes.
Then that's the behavior I wanted.
Like the entire suite, not individual tests, but the entire suite to only be like 10 minutes, then I want, that's the behavior I wanted. Like the entire suite,
not individual tests, but the entire suite to only be like 10 minutes or an hour or whatever.
That's the behavior I want. And I couldn't figure it out. And so I wrote this. 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. Um, uh, and sometimes I don't really know how long those are
going to take. 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, um, so I made it its own plugin. So here it is, uh, Python suite timeout. You just pass it a flag.
It's still, I just sort of did this a couple of days ago and, um, I think there might be
bugs in it.
So, um, I guess don't put it in production yet.
Um, that's why I never did.
Yeah.
It's a little lower, uh, lower bar for test production rather than I took down the website.
I just took down the website.
I just took down CICD is possibly what you might take down, which is still a problem.
Yeah. Well, I think I
just ran across this morning
I was playing with it. At least one use
case where it doesn't actually time out.
So that's the behavior
when it fails is it won't time
out, but we'll work
with it and fix it. That's super cool.
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.
It's just that the PyTest timeout is per test. It just to make sure
that individual tests themselves don't run longer than a certain amount. And this is kind of like,
you should know this, right? Probably about how long your tests run. But there's, there's,
it's Python and software. So sometimes infinite loops happen or some use case that you never break out
of. And also like just the fact that it's taking way longer than it should might be something you
want to trigger as an error, right? Like if for some reason you'd 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. And and you might want to say if this ever takes more than five seconds
something's wrong and just kill it you know what i mean right like i think that would even be
reasonable yeah so that's that's the idea around pytest timeout is if it takes longer than a
certain amount attempts to kill it and it does it does like sig events and stuff to try to kill the process that's going taking too
long so excellent whereas the the new one sweet timeout is nice it don't it won't kill anything
um but it also it won't stop something like that but it'll uh it'll just between tests say hey this
is taking kind of too long let's stop now so that's okay well you might not want to you know 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 the yeah um the the other
part of this though is i think it's too nice so far it doesn't throw any exceptions or errors or
anything it just stops the counting. So if you
normally, like in this example, if I had a thousand and I only get through like 150, it just stops,
passes everything, but it only ran 150 instead of a thousand. I'm trying to figure out a way to like
alert the user a little bit more that there's something wrong. So we'll see. It'll grow a little bit after this.
Cool. Oh, excellent. Excellent. This is a crazy episode of where it's just,
we all created a bunch of things. So let's go back to things we created, huh?
Okay.
This one is also a thing I didn't create, but outside in again. 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 TalkPython people,
I can send that message.
If I only want to talk to the Python Bytes people,
I can send that message, right?
And the price has just been going up and up and up,
like hundreds of, $100 this month,
the next one, then another $100.
And like, what is going on with these people?
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.
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.
So I went on, I think I talked about this before.
Remember, I talked about the 10 different
options that people had sent out of possible newsletter places yeah i wish i remember who's
hold me on mastodon but somebody said well there's these five open source ones like wait a minute
okay that's interesting and so after a bunch of research i decided to turn on list monk and list
monk is written in go and it's an open source. There's not even a SaaS version. It's
just self-hosted version of basically MailChimp, right? 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? So I, again, because 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?
Just like you, mom, you're like, okay, how do I talk to it? There's not even an official API
client. The ones you find are like, well, here's one for PHP. There's actually several for Python,
but they're really bad and they don't work. I mean, really bad. 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. But somehow it's like stuck in time, auto-generated on an old version that
doesn't work anymore. I don't know. It's like even the auto-generating one doesn't work. I'm like,
ah, man, I really need this even more than the Umami thing. I need code to be written. So like
someone creates an account where they buy a course and they say, yes, I want to be, you know,
ask them, do you want to be in the middle of this?
Yes, I want to be there.
How do I make that happen?
Right.
Well, Python, of course.
So over the next project, ListMonk email app API client for Python or just pip install ListMonk.
Okay.
So over here, this is the next one.
Super nice.
You can add a subscriber, get details about them.
One of the things that's cool in ListMonk is there's a arbitrary JSON Python dictionary type thing
associated with each user.
So whatever data you want to put in there, you can.
And with this thing, you can manage it.
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.
So you can manage it with that.
You can search them,
check the health of your self-hosted thing,
segment your list.
Obviously you got to unsubscribe and delete users.
You can even send transactional emails.
So super, super cool stuff.
Again, one more nice open source thing
that's not some big, super expensive,
privacy questionable SaaS service,
and instead running good over here.
It does take a little bit of work.
Umami is perfect.
This is a little clunky in some little edge cases,
but it's still quite nice.
So that's the next project.
Also available on PyPI today.
MARK MANDELMANN, JR.: Nice.
MARK MIRCHANDANI, Well, that's it for our items.
Cool.
Between all these things, we can help people write one, a little bit better test.
And two, 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.
Yeah.
Yeah.
And save some money while you're at it.
All right.
Well, normally we would jump into some extras,
and I don't have any extras this week.
So do you have any extras?
I do have extras.
Well, let's see what have I got here.
Yeah, okay, so the first one is,
if I'm running, self-hosting these things, right, I'm running them in a Docker cluster,
so it's really easy to basically just do a Docker pull,
restart, you know, relaunch the app, off it goes, right. So it's really easy to basically just do a Docker pull, restart,
you know, relaunch the app, off it goes, right? So that's awesome. That's one of the reasons I'm willing to run like you, mommy, rather than like I have a server and all these database things,
I get a patch and whatever, right? Just literally one command to manage like 15 multi-tier apps.
It's awesome. But how do you know when there's a new one, right? Obviously you could just set it up to just do it continuously. But what I realized is every
GitHub repository, this has nothing to do with Umami, it's just an example. Every GitHub repository,
if they use releases, right? 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.
If you have that for any project, you can just go to the GitHub URL for the web,
not the.get thing, and just do slash releases.atom.
And that's an RSS feed for the releases
for any GitHub project, even if they don't have a blog.
Wow.
That's cool, right?
Yeah.
I can put this in Feedly then.
Yes, I put it in Reader for me.
And now I have ListMonk and Umami and a few other things.
And I'm like, if this gets changed, I probably want to just go take a little action on that real quick.
And now it's in my RSS feed.
That's pretty cool.
Yeah, so very simple.
Anyone can just watch whatever they want.
Brian, we both tried to do this one.
Yeah.
Colo.
You mentioned it 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 like her profile, like came by in my app and
I saw that she works on this thing called Colo debugging for Django apps. I'm like, Oh, that's
interesting. What is this? So this is a thing that's in beta.
It says, see everything happening in your running Django app.
And they have a really nice design
of their webpage here.
So probably best to see visually.
It says, debug your Django app 10 times faster,
get instant access, et cetera, et cetera.
So this is a plugin or extension for VS Code.
And it just has tons
of information all available to you. So it has a tab or whatever the thing on the left is,
you expand like extensions and files and it plugs into that thing, a little pane, I guess.
And it shows you the request response, like kind of like dev tools in a web browser. 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 that's cool right
yeah 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 it has local, and then it has even like this tree thing for visualizing code execution paths.
So, 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.
It's pretty neat.
Yeah.
I don't know that the tree, the visual thing is super pretty, but I don't know how helpful it is, but I haven't played with it yet.
I agree with you.
It's awesome. wouldn't use it um yeah you can do uh what is it inspect all the outbound
http requests made that's kind of neat and sql queries you can it'll track all the sql queries
that were made really good for understanding what's happening what's up right good 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.
Exactly.
Especially in the ORM space
because it's so easy to do lazy loading
and say, give me all the customers.
For each customer, get me this thing about them.
And that's a relationship.
So every time through the loop,
it's another database query,
the so-called N plus one performance problem problem right and you would just see like whoa the sql
thing is full i thought there were like two or three requests and now it's just full what is
happening here right so that's great um yeah anyway oh background jobs yeah even contract
your celery background tasks so right now it's in beta i'm pretty sure this is a thing that costs
money at some point um yeah so if you vs code check right now it's in beta. I'm pretty sure this is a thing that costs money at some point.
Yeah.
So if you VS Code,
check this out.
It's kind of interesting.
Yeah, definitely.
Neat.
Neat.
All right.
Another thing that's cool
is I've talked about
Warp before
and I've been using Warp
at the terminal a lot.
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.
Not for me.
For other people.
Yeah, not for me, but for a good chunk.
Now I say it's only somewhat of a limitation.
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.
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 because it's a Mac app
until pretty much now, right?
So coming soon is Warp on Linux.
So people want to sign up for that.
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, with your terminals,
more like an editor. It's got AI built in, which most AI built in things I hate. 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
and then go here's the command that you type you know like that kind of it's because it's that kind
of stuff that i'm like what's the parameter to this how do i grep that again i have no idea
so anyway it's pretty cool i wonder if it's set up i'm just curious if it's since they're doing
different used platforms if they've got a a UI layer and then a warp core.
Oh my God, they probably do have a warp core.
And if they didn't name it that,
they've really lost a chance here, right?
Yeah, hopefully.
So I talked about this before I realized through search
about two and a half years ago,
something called bPyTop.
So bPyTop is an awesome,
if it gets too small, it thinks it's going to hide
all of its graphics way to look at how your server is going and it is so neat the way that
this app works i definitely let me just i'll put it up here's the the live running version of
the one that i've been messing with lately and b Brian, you can see you've got your memory.
There's not a whole lot of action going on right now,
so it's kind of blank graphs.
But if the memory jumped up, you would see it go up.
It shows you how much memory is free,
how much is being used,
how much of that is being cached.
Disk activity, 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. And I'm not going to show the processes cause they might
show a command arguments that I don't know. I just don't want to share, 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.
But isn't that an amazing way to just, that's, this is over an SSH session.
Oh, that's pretty cool.
That's amazing.
Yeah.
And watch this.
So if I just hit escape, you get even, it's like an old video game options with mouse
support and everything.
Oh, that's pretty cool.
Yeah.
So another thing to sort of announce here is there's BPytop top which you can pip x install but they've also as part of this
released a btop rewritten and i think it must be c++ so anyway that's that's cool right uh 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 anyway really cool if you've been using like top or something like this, you know, there's a really much better way.
And glances is good, but B top is the new, the new winner in my world here.
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.
Everybody in your life will think you do something cooler than you actually do.
Whoa.
You're a hacker, aren't you?
That's a terminal.
Yeah, I am. Okay. Yeah. Don't cross me. Don't cross me. All do. Whoa. You're a hacker, aren't you? That's a terminal. Yeah, I am.
Okay.
Yeah.
Don't cross me.
Don't you cross me.
All right.
Nice.
Right.
I think that's our extras.
It is.
Chris Tyler, just real quick,
has a recommendation,
switch to bottom BTM,
which is similar,
but written in Rust
and a little more performant.
Also cross-platform like BITOP.
Okay. Well, well, maybe,
maybe that needs to be checked out as well.
Maybe my time with BITOP was short
and I'll be over to bottom before I know it.
Top and bottom, that's just terrible.
Yeah, these are funny.
Thanks, Christopher.
All right, I think I'm ready for a joke.
Yeah, I got something, you know,
I've been talking about consolidating all these servers
and running different things.
We just talked about the monitoring your server and Docker.
So I thought it might be fun to share this post on InfoSecExchange Mastodon from Jeff Hall.
And he's got this.
Describe this for us, Brian.
It's just a mess of cables coming out of the back of what?
A bunch of, I don't know.
Network equipment.
Yeah.
It's just like the world.
You couldn't imagine a worse set of tangled wires and they're dirty too.
Right.
It's not just like they're covered in all these routers and others.
They're white, but they're most, they're significantly Brown as well.
With like a whole bunch of hubs hanging in between and stuff.
Yeah.
Yeah.
A lot of these pieces are just suspended by the wires and it just says the cloud.
Yeah.
Yeah.
It's very nice.
I love it.
Yeah.
That's very cool.
So.
Indeed.
Funny.
All right.
Well, that's it for the show, I suppose.
And, you know, we don't normally have a final call to action, but go check out your pipe,
your new pie testing,
uh,
your timeout and check out some of these other self-hosted things.
Yeah.
It's really cool.
Um,
a lot,
a lot of stuff people can adopt in.
Yeah.
Well,
thanks for being here and chat with you all.