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