WEBVTT

00:00:00.001 --> 00:00:05.480
Hey everyone, Michael here. Just a quick show note before we get started on this episode.

00:00:05.480 --> 00:00:12.120
I think we have a great set of topics to cover, but unfortunately, something went crazy with my

00:00:12.120 --> 00:00:17.720
computer and just pinned all the cores and basically made the recording of my high quality

00:00:17.720 --> 00:00:22.240
version fall apart. And so when you listen to this, there'll be a little bit of static on my

00:00:22.240 --> 00:00:27.900
end. And I just want to say, sorry about that. We had some backup audio, but it also got messed up.

00:00:27.900 --> 00:00:33.020
So basically this, I've tried to make it as good as possible, but there's a little bit of issue with

00:00:33.020 --> 00:00:38.320
the audio. If you can handle it, there's some great news. And if you want to skip this one and just wait

00:00:38.320 --> 00:00:43.180
for next week, totally understand as well. All right. Without further ado, let's get to the news.

00:00:43.180 --> 00:00:53.560
Thanks. This is Python Bytes, Python news delivered directly to your earbuds. It's Monday, March 13th,

00:00:53.560 --> 00:00:58.720
2017. And this is your host, Michael Kennedy here with my co-host, Brian Okken. Hey, Brian,

00:00:58.720 --> 00:01:00.540
you ready to share the Python news with the world?

00:01:00.540 --> 00:01:02.440
I am very ready. Excited.

00:01:02.440 --> 00:01:04.060
Would you say that you're on fire?

00:01:04.060 --> 00:01:05.760
I am on fire. Yeah.

00:01:05.760 --> 00:01:08.420
Awesome. Yeah. Google's on fire too, right?

00:01:08.420 --> 00:01:12.660
Well, yeah. So I'm, I'm actually a little confused about where this is coming from,

00:01:12.660 --> 00:01:17.480
but there's a, yeah, our first topic is, was suggested by several listeners. We got it through

00:01:17.480 --> 00:01:24.880
email and through Twitter to cover a tool called Python fire from, I don't know where it's from.

00:01:24.880 --> 00:01:32.980
It's, it's on the Google repo on GitHub. But it, at the bottom, it says it's not a Google product. So

00:01:32.980 --> 00:01:33.980
I don't know what that means.

00:01:33.980 --> 00:01:38.300
I think it means it might've been created by somebody at Google, but it's not supported in

00:01:38.300 --> 00:01:42.300
any way. It's just, Hey, this is a cool thing we made. So we should have it.

00:01:42.600 --> 00:01:47.000
Yeah. I downloaded it and gave it a shot. It says, so we haven't even said what it is. It's

00:01:47.000 --> 00:01:53.500
command line interface utility and their tag, the, at the top of the repo says Python fire is a

00:01:53.500 --> 00:01:59.340
library for automatically generating command line interfaces from absolutely any Python object.

00:01:59.340 --> 00:02:06.000
It is pretty cool. Another thing, it says a list of the benefits, a simple way to create a command

00:02:06.000 --> 00:02:11.260
line interface in Python, and you can use it for exploring and debugging existing Python code.

00:02:11.260 --> 00:02:17.480
And it makes transitioning between bash and Python easier. I actually, so I tried it out,

00:02:17.480 --> 00:02:24.940
downloaded it, wrote a couple of little tools and I actually, it was pretty fun. But I don't think

00:02:24.940 --> 00:02:32.180
I would use it for a shippable, a shippable Python like command line interface because it's pretty big.

00:02:32.180 --> 00:02:35.300
Yeah. And by big, you mean it has some heavyweight dependencies, right?

00:02:35.300 --> 00:02:40.220
Yeah. Like it includes all of IPython. That's quite a bit coming with it. I mean, it also includes

00:02:40.220 --> 00:02:42.120
six, but that's really not that big of a deal.

00:02:42.120 --> 00:02:46.860
Yeah. Six is just like a basically one little module or whatever, but yeah.

00:02:46.860 --> 00:02:51.280
IPython, that's, that can be one of those things that's really hard to,

00:02:51.280 --> 00:02:56.060
to even install for some people, right? Like you give that to somebody on a Windows machine,

00:02:56.060 --> 00:02:59.780
they don't have like a compiler set up, right? That can be quite challenging.

00:02:59.780 --> 00:03:05.880
I'll have to see. I'm going to, I'm going to install it on a Windows machine this week to try that out.

00:03:06.220 --> 00:03:09.800
Yeah. Cool. But it does look really great. You basically have a class and you just,

00:03:09.800 --> 00:03:16.900
for your main, you just call fire and you pass it the class and boom, that thing is, is CLI callable,

00:03:16.900 --> 00:03:17.120
right?

00:03:17.120 --> 00:03:20.540
Yeah. But you don't, you don't have to use a class. You can also use just,

00:03:20.600 --> 00:03:26.400
you can have a set of functions you can put together and, and add those as the interface.

00:03:26.400 --> 00:03:33.140
And there can be multiple, multiple entry points as well. Like I tried, I tried throwing in like two or

00:03:33.140 --> 00:03:38.100
three functions and then listing those as all things that you can call from the command line.

00:03:38.100 --> 00:03:42.900
And, and it actually picks up, it picks up doc strings pretty well to show you. So you

00:03:42.900 --> 00:03:48.400
kind of have help built in as well. I'm going to, I'm going to use it for like,

00:03:48.400 --> 00:03:53.820
we've got test instruments we try to communicate with and writing, writing to and from the instrument

00:03:53.820 --> 00:03:59.120
from Python is really easy from the bash. Not so easy. but I'm going to think,

00:03:59.120 --> 00:04:01.680
I think I'm going to use this to try to do that at work.

00:04:01.820 --> 00:04:06.580
Okay. Yeah. And it sounds cool. You have to give us a report on your experience.

00:04:06.580 --> 00:04:13.720
Cool. So the next thing I want to talk about is Simon, like Simon says, but a cool menu bar

00:04:13.720 --> 00:04:20.260
application for macOS. So if you don't care about macOS, maybe you don't care too much about this. But

00:04:20.260 --> 00:04:29.300
one of my pet peeves is I think we need more full on native cross platform GUI things. We've had

00:04:29.300 --> 00:04:35.840
PI cute and PI side and the QT framework. That's one option that we've had. That's pretty good,

00:04:35.840 --> 00:04:41.080
but there's a lot of, a lot of versioning licensing funkiness going on until maybe till the end of this

00:04:41.080 --> 00:04:45.580
year, actually, till they come out with PI side two, then maybe, maybe that becomes a really,

00:04:45.580 --> 00:04:53.440
really great option. But we have things like PI OBJC, similar stuff for windows, similar stuff for

00:04:53.440 --> 00:05:02.260
Linux, where you can basically somebody already has wrapped the truly native OS elements. So with this

00:05:02.260 --> 00:05:09.740
thing called PI OBJC, you can basically create using Python what is indistinguishable from a native app,

00:05:09.740 --> 00:05:14.360
like the controls literally are the same as if you had done it with Xcode and Objective C or Swift.

00:05:14.660 --> 00:05:19.560
That's pretty cool, right? Yeah, it's, I hadn't heard of this. This is neat. Yeah. So the Simon

00:05:19.560 --> 00:05:25.040
thing is not like a framework. It's just an app, right? So some guy is like, hey, I really want to

00:05:25.040 --> 00:05:30.500
have a little thing I can click on. It'll tell me my, my network usage, my CPU usage, battery, or whatever,

00:05:30.500 --> 00:05:34.560
something like this, right? And he did it as one of those little menu bar things, like what runs in the

00:05:34.560 --> 00:05:40.700
top right by the clock on macOS. And you click it and it drops down info about your system. If you

00:05:40.700 --> 00:05:46.860
look at the code, it's like, it depends on PI OBJC. But beyond that, it's like 150 lines for a full

00:05:46.860 --> 00:05:52.440
implementation of that app. That's pretty cool. And so if you're thinking about you need just a little

00:05:52.440 --> 00:05:58.040
simple something to run like as a menu bar app or the notification tray on windows or something like

00:05:58.040 --> 00:06:02.320
this, you know, this is a really cool option. And I've mostly wanted to pull it out as like, hey,

00:06:02.320 --> 00:06:05.880
here's an example. You could probably clone and tweak or just take the ideas of this

00:06:05.880 --> 00:06:11.840
and go. So you just, you create an app, you derive from NS application, which comes from PI OBJC.

00:06:11.840 --> 00:06:15.940
You implement a few methods and boom, you've got a nice native GUI app.

00:06:15.940 --> 00:06:18.360
Okay. I'm going to have to try this one out too. It's neat.

00:06:18.360 --> 00:06:23.000
It's neat, right? The final mix would be to use something like PI to app or something where you

00:06:23.000 --> 00:06:27.740
bundle it in a distributable way. So it's not like, well, make sure you, you know, pip install this

00:06:27.740 --> 00:06:31.760
thing before you can run it, right? Like that's probably not going to fly so well for like end users,

00:06:31.760 --> 00:06:33.360
but still pretty excellent.

00:06:33.360 --> 00:06:37.220
So is this a PI OBJ, what is that other one?

00:06:37.220 --> 00:06:41.120
PI OBJC as objective C, like the Python wrappers for objective C.

00:06:41.120 --> 00:06:43.920
Okay. So that's just a Mac only thing, right?

00:06:43.920 --> 00:06:44.800
Yes, exactly.

00:06:44.800 --> 00:06:45.140
Okay.

00:06:45.140 --> 00:06:49.080
But we can do similar stuff in the other frameworks, I believe, right?

00:06:49.080 --> 00:06:53.620
Like on the window side, you can use WPF, which is kind of way more heavyweight,

00:06:53.620 --> 00:06:58.600
but you can build the Python stuff using Iron Python. And I'm sure there's something with

00:06:58.600 --> 00:07:00.040
GDK and Linux as well.

00:07:00.040 --> 00:07:00.620
Neat.

00:07:00.620 --> 00:07:05.760
Yep. Neat. It's kind of lunchtime. I'm getting hungry. I wish I had some free food. Really,

00:07:05.760 --> 00:07:06.140
I'm hungry.

00:07:06.140 --> 00:07:11.960
Well, I was just amused. I don't know if these are useful or not, but I was amused by, in

00:07:11.960 --> 00:07:17.140
reading Reddit this last week, there were a couple of things that popped up and one of

00:07:17.140 --> 00:07:24.400
them was finding, this was actually useful, finding free food with Python. And it's actually

00:07:24.400 --> 00:07:31.240
an article talking about using web scraping to, apparently there's a couple of places that

00:07:31.240 --> 00:07:37.480
have like food delivery places that sometimes run specials where they're actually deliver

00:07:37.480 --> 00:07:42.920
free food to you. And, but you have to be paying attention to have that work. And so somebody

00:07:42.920 --> 00:07:50.520
wrote an app with web scraping and Twilio to occasionally check on this and then text him

00:07:50.520 --> 00:07:58.680
information about the free specials. And I probably won't do this, but I think it's a nice,

00:07:58.800 --> 00:08:05.100
a nice example of showing, combining Twilio with, with web scraping.

00:08:05.100 --> 00:08:10.480
It's cool. Do you know what I like about it is it's taking these techie digital API type

00:08:10.480 --> 00:08:15.420
things and it's making real stuff happen. Like, yeah, like you're, you're integrating Twilio

00:08:15.420 --> 00:08:18.300
and screen scraping and then you have free food. Like how cool is that? Right.

00:08:18.300 --> 00:08:24.500
Yeah. But I, so I would, yeah, you definitely real world probably have free food. I think it'd

00:08:24.500 --> 00:08:30.720
be cool to run. I was thinking about doing a similar thing like, monitoring. So we have,

00:08:30.720 --> 00:08:36.180
uh, build machines and stuff and I wouldn't mind having a something that sat around and

00:08:36.180 --> 00:08:41.180
monitored that and then, texted me the results cause I don't know how to do that.

00:08:41.180 --> 00:08:44.040
Yeah. That's cool. Definitely some cool Twilio integration there.

00:08:44.380 --> 00:08:48.720
And then the next, the next article just amused the heck out of me. It's called,

00:08:48.720 --> 00:08:56.120
um, notification notification when friends order pizza. so I don't know if this is a great

00:08:56.120 --> 00:09:03.300
thing or not for dominoes to do, but there's, apparently a way that you can plug in phone

00:09:03.300 --> 00:09:10.100
numbers and find out, whether that phone number has ordered pizza recently. And, and so somebody

00:09:10.100 --> 00:09:17.720
wrote a script to put in all of their friends phone numbers and, text them or let them know when

00:09:17.720 --> 00:09:23.080
they're one of their friends is ordering pizza. I guess another way to get free food is to mooch

00:09:23.080 --> 00:09:27.780
off your friends when they order food. Yeah. That's, I'm not sure how I feel about that. Actually.

00:09:27.780 --> 00:09:34.120
That's a little creepy, man. It actually is creepy. I was thinking that like, I was wondering

00:09:34.120 --> 00:09:40.920
whether or not I should include that, but it was, it amused me. So the, the, I don't think that really

00:09:40.920 --> 00:09:44.920
it ought to be that easy to find out whether or not somebody ordered some pizza. Yeah. Well,

00:09:44.920 --> 00:09:48.680
if, if all your friends start showing up every time you have dominoes,

00:09:48.680 --> 00:09:55.700
yeah, I was trying some funky stuff, man. They also have a bot. Like you can order pizza just by

00:09:55.700 --> 00:10:00.720
like chatting with dominoes, which is also kind of funky. I want. Yeah. But, but like you could order

00:10:00.720 --> 00:10:05.640
food for other people then or something. I don't know. It seems, it seems like they're playing with

00:10:05.640 --> 00:10:09.740
scary interfaces, but at least they're playing with interfaces. Yeah, exactly. Exactly. Like it's,

00:10:09.740 --> 00:10:14.480
it is pretty cool. Okay. So speaking of food, I want to talk about pi,

00:10:14.480 --> 00:10:23.960
HTT pi, which is a little utility written in Python that is kind of like w get or curl,

00:10:23.960 --> 00:10:30.700
except for that. It's awesome. And the reason it's awesome is it runs on the command line. So if

00:10:30.700 --> 00:10:38.660
I wanted to like call a JSON API, I could say like HTTP space. And I would, you know, give it the URL,

00:10:38.660 --> 00:10:43.640
whatever the, that is, maybe some additional data. You can even post data from the command line and so

00:10:43.640 --> 00:10:51.140
on. And it comes back formatted, pretty printed, color coded everything. So it is, it's quite glorious.

00:10:51.140 --> 00:10:55.920
You can create sessions and have those like authentic sessions persist across multiple calls.

00:10:56.340 --> 00:11:03.520
You can do XML, you can do JSON, you can do HTTP, all the, or HTML, all these different things that it

00:11:03.520 --> 00:11:08.060
knows about. It will color code and format pretty for you on the command line.

00:11:08.060 --> 00:11:12.680
That's great. And this is, multiple, multiple operating systems.

00:11:12.680 --> 00:11:18.060
Yes, absolutely. Yeah. So this, this works everywhere. This is just a Python three little library.

00:11:18.440 --> 00:11:23.760
And that's the pie part, right? The Python. And so I'd spoke about postman before as being a

00:11:23.760 --> 00:11:28.500
really cool way to test, APIs and just play around with them. But this is kind of like the CLI

00:11:28.500 --> 00:11:33.680
version. Cause if you do that with curler or even with Python and requests and then you spit it out,

00:11:33.680 --> 00:11:38.100
like it shows you it, but it's usually not well formatted. It's usually minified. It's not color

00:11:38.100 --> 00:11:40.540
coded. So this is, this is pretty tricky.

00:11:40.540 --> 00:11:44.860
The color coding actually makes it really readable. That's nice.

00:11:44.860 --> 00:11:51.580
So if you're looking, if you've been using curl or w get a lot, check out HTTP, HTTP,

00:11:51.580 --> 00:11:57.300
uh, the links in the show notes, it's on GitHub and it's got a, it's got a cool, a cool little

00:11:57.300 --> 00:12:01.340
interface. I put the link to the homepage in there. Just click on that and you'll see a screenshot

00:12:01.340 --> 00:12:04.360
comparison of that versus curl and it's night and day. It's great.

00:12:04.360 --> 00:12:11.020
Well, the last thing I've got is, speaking of command lines and hard to pronounce packages,

00:12:11.020 --> 00:12:20.240
um, it's a pip dep tree. there's a, a little utility, that you can do it with, pip install.

00:12:20.240 --> 00:12:27.520
I think it's pip dep tree altogether. as in pip dependency tree, but just P I P D E P T R E E.

00:12:27.520 --> 00:12:33.960
Right. Yes. And, it is a godsend for me. since for like, for this podcast,

00:12:33.960 --> 00:12:39.600
I'm trying out stuff all the time, trying out new packages. And, also for like, right now,

00:12:39.600 --> 00:12:46.220
I'm working on the plugin, chapter in the PI test book and I'm, I'm installing a lot of stuff

00:12:46.220 --> 00:12:52.460
and I am using virtual environments, but I still, I don't really want to throw them away all the time.

00:12:52.460 --> 00:12:59.300
so I want to clean them out. But, if you just do a pip list, often I see a whole bunch of

00:12:59.300 --> 00:13:02.620
stuff that I don't remember installing and it's because of all the dependencies.

00:13:03.560 --> 00:13:10.220
And this pip dep tree just shows all of the things you've installed and what depends on what,

00:13:10.220 --> 00:13:14.360
uh, when I look up and don't know what arrow is or where it came from.

00:13:14.360 --> 00:13:20.300
Pip dep tree shows me that, Oh, I installed cookie cutter and cookie cutter installed Jinja2.

00:13:20.300 --> 00:13:23.200
And Jinja to install there. Now I know.

00:13:23.200 --> 00:13:25.140
Yeah. So yeah, that's very cool. Right.

00:13:25.140 --> 00:13:29.980
Yeah. And it's nice. I like it. it's kind of, I wish that was just,

00:13:29.980 --> 00:13:35.900
it should just be an option and, pip pip list, I think. So yeah, it really should be part of pip,

00:13:35.900 --> 00:13:40.720
shouldn't it? But it's not. And so we have pipped up tree and I think that's cool. You can reverse it as well.

00:13:40.720 --> 00:13:46.700
You can say, okay, this thing, what depends upon this? And it'll say, well, these three packages through some sort of

00:13:46.700 --> 00:13:53.180
transitive closure of their dependency graph. These are the things that you, that, that you need this to be here for,

00:13:53.180 --> 00:13:59.260
or you can do it the other way. And you can say, what is installed this, right? Like, or what does this thing depend upon?

00:13:59.260 --> 00:14:01.800
Which is, it's pretty cool. So you can view it from either direction.

00:14:01.800 --> 00:14:03.680
Oh, cool. I didn't know that.

00:14:04.040 --> 00:14:17.040
Yeah. There's a -r for reverse. So hit it with the -r. Cool. Okay. So final thing we have for today is, a real testament to Python 3, to modern Python, to asynchrony.

00:14:17.040 --> 00:14:35.860
You know, we've been hitting this async away, the power of asynchrony a couple of times. So I want to come back with a few comments from what people have talked about, but I also want to feature an article. And this is a really great article by the folks at Signet by AI, which is an AI platform that uses Python.

00:14:35.860 --> 00:14:42.680
So basically the title that what we're going to talk about is not your father's Python, amazing Python frameworks.

00:14:43.040 --> 00:14:54.780
They sort of went through what they had been thinking about when they created this company and said, look, we all know Python and we like Python, but it's super important that we can do crazy amounts of data processing.

00:14:54.780 --> 00:15:04.560
Their product and investor has to handle hundreds of thousands of events per second. And, you know, they've been hearing the drumbeat that, you know, you can't scale with Python.

00:15:04.560 --> 00:15:11.020
You need to switch to Go, et cetera, et cetera, et cetera. And they said, all right, well, let's, let's have a look and let's see how this is going to work out.

00:15:11.020 --> 00:15:27.820
They evaluated Go and what the good and the bad of it was. They evaluated Python and said, let's look not at traditional Python, like the way, the sort of synchronous style of programming, but there's a number of really powerful async frameworks that we've covered, I think, at least two out of three of them.

00:15:27.820 --> 00:15:34.480
So there's uv loop, which is pretty awesome. There's Sanic and there's Jepronto.

00:15:34.480 --> 00:15:45.980
Okay. So Sanic and Jepronto, these are the web things that we've talked about tons and they're built on asyncio, just like this uv loop is, but uv loop is actually a re-implementation in Cython.

00:15:45.980 --> 00:15:51.560
So the compiled version of Python, that's more than twice as fast as what's built into Python itself. Interesting, right?

00:15:51.640 --> 00:15:58.400
So like maybe, maybe we should just like bring that feature into Python itself in some way to make asyncio twice as fast.

00:15:58.400 --> 00:16:03.920
So they said, let's, let's look at this and evaluate it and decide if this scalability thing's going to work.

00:16:03.920 --> 00:16:08.060
All right. And they said, we all know about the GIL. Is this a real problem?

00:16:08.060 --> 00:16:28.680
So they ran, they ran some comparisons and did some work and it turns out like they've got some graphs of uv loop and the other frameworks, just like blowing away things like Node.js in terms of performance, keeping up with, I think, go on some, some use cases faster, some slower, but really very, very high performance.

00:16:28.680 --> 00:16:36.100
And so after this really detailed write up with like numbers and everything, you know, graphs and analysis, they said, look, the future of Python is here.

00:16:36.100 --> 00:16:39.200
Overall, it looks like fast asynchronous Python might be here to stay.

00:16:39.200 --> 00:16:53.100
Now that asyncio really seems to be the default way that people are willing to work in Python and async and await has really caught on because of the non-blocking network and disk IO is usually the problem.

00:16:53.100 --> 00:16:58.100
It turns out the GIL probably doesn't really get in the way of speed that much for most use cases.

00:16:58.100 --> 00:16:58.580
It's cool.

00:16:58.580 --> 00:16:59.200
Isn't that cool?

00:16:59.200 --> 00:17:04.880
So they said, look, it's, it's working out great for us, Python three, and we've got the scalability we need.

00:17:04.880 --> 00:17:05.600
No problem.

00:17:05.600 --> 00:17:09.500
And we're happy we didn't abandon because traditionally hadn't been fast enough.

00:17:09.500 --> 00:17:15.760
So I missed, somehow I'm missing this, which they looked at Jepranto and Sanic and uv loop.

00:17:15.760 --> 00:17:18.380
Are they deciding on anything?

00:17:18.380 --> 00:17:20.160
I don't know which one they decided upon.

00:17:20.160 --> 00:17:23.380
I think uv loop is a little more established.

00:17:23.380 --> 00:17:26.540
And uv loop is actually the foundation for Jepranto and Sanic.

00:17:27.220 --> 00:17:28.820
So there's a bit of a mixing, right?

00:17:28.820 --> 00:17:31.800
Like Jepranto and Sanic are extending these and certain.

00:17:31.800 --> 00:17:32.360
It's pretty cool.

00:17:32.360 --> 00:17:36.420
There's a nice comment, which I linked in the show notes for this section.

00:17:36.420 --> 00:17:43.180
And there's somebody in there saying, hey, we went through the same basic thinking and here's how it worked out for us.

00:17:43.180 --> 00:17:46.760
And they said, we're also doing this Async Python three thing, which is cool.

00:17:46.760 --> 00:17:50.100
On Twitter, we got a message from Sasha Kurta.

00:17:50.100 --> 00:17:52.460
And he said, basically, hey, Michael, hey, Brian.

00:17:52.860 --> 00:17:58.140
I have this example where I was doing a bunch of HTTP client stuff.

00:17:58.140 --> 00:18:03.660
And remember, we talked about aiohttp, the client side stuff, how much faster that can make it.

00:18:03.660 --> 00:18:05.420
And he said, that's cool.

00:18:05.420 --> 00:18:06.700
I was doing some scraping and whatnot.

00:18:06.700 --> 00:18:18.780
And my particular project went from eight minutes, over eight minutes, doing requests to less than 45 seconds using the Async and await stuff with aiohttp.

00:18:19.260 --> 00:18:20.220
Basically, the same code.

00:18:20.220 --> 00:18:20.900
He was blown away.

00:18:20.900 --> 00:18:22.320
Yeah, that's really cool.

00:18:22.320 --> 00:18:23.660
And I'm glad that he shared that with us.

00:18:23.660 --> 00:18:24.020
Yeah, I am too.

00:18:24.020 --> 00:18:28.680
And of course, you drew the correct conclusion from this conversation.

00:18:28.680 --> 00:18:36.120
That look at the, what is that, like 10-time increase in productivity you get by listening to Python bytes?

00:18:36.120 --> 00:18:37.040
Yeah.

00:18:37.040 --> 00:18:38.140
Yes, definitely.

00:18:38.140 --> 00:18:39.600
All right.

00:18:39.600 --> 00:18:42.820
You can save your company money, too, by listening to us.

00:18:42.820 --> 00:18:43.440
Absolutely.

00:18:43.440 --> 00:18:43.940
All right.

00:18:43.940 --> 00:18:46.160
Well, that's it for this week's news.

00:18:46.160 --> 00:18:48.120
You got anything, finally, you want to share personally?

00:18:48.740 --> 00:18:49.080
Nope.

00:18:49.080 --> 00:18:49.580
Nope.

00:18:49.580 --> 00:18:50.960
Just plugging away at the book.

00:18:50.960 --> 00:18:51.580
Same here.

00:18:51.580 --> 00:18:52.620
Plugging away the courses.

00:18:52.620 --> 00:19:00.380
So thank you, everyone, for supporting all of our work, not just this podcast, but Brian's other podcast, his book, my courses, my other podcasts.

00:19:00.380 --> 00:19:02.060
It's great to be doing this for everyone.

00:19:02.060 --> 00:19:02.760
So thank you.

00:19:02.760 --> 00:19:03.660
And thank you, Michael.

00:19:03.660 --> 00:19:04.180
Yep.

00:19:04.180 --> 00:19:04.600
See you later.

00:19:06.600 --> 00:19:08.320
Thank you for listening to Python bytes.

00:19:08.320 --> 00:19:10.880
Follow the show on Twitter via at Python bytes.

00:19:10.880 --> 00:19:13.800
That's Python bytes as in B-Y-T-E-S.

00:19:13.800 --> 00:19:17.200
And get the full show notes at pythonbytes.fm.

00:19:17.200 --> 00:19:21.560
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:19:21.560 --> 00:19:24.260
We're always on the lookout for sharing something cool.

00:19:24.260 --> 00:19:27.640
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:19:27.640 --> 00:19:31.260
Thank you for listening and sharing this podcast with your friends and colleagues.

