Transcript #381: Python Packages in the Oven
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
00:04 our earbuds. This is episode 381, recorded April 30th, 2024. And I am Brian Okken.
00:11 And I'm Michael Kennedy.
00:12 And this episode is brought to you by Scout APM. Listen to their spot later in the show
00:17 and connect with your hosts if you'd like to. We're at mkennedy, at Brian Okken,
00:22 and at Python Bytes, all at fos.org. Connect with us on mass.org.
00:27 And if you are listening and would like to join us live sometime to be part of the audience,
00:32 you can go to pythonbytes.fm/live and check that out. And while you're there,
00:38 while you're at pythonbytes.fm, go ahead and sign up for the friends of the show list. And that way,
00:43 you will get an email announcement after we have everything all polished up and put up online.
00:49 So what you got for us first, Michael?
00:51 Well, first, I have a new audio setup because I'm traveling this week. And I had a much nicer
00:56 setup, Brian, until these guys, these construction guys dropped in and started causing a ruckus.
01:02 Can you describe the ruckus? I don't hear any ruckus.
01:05 A little breakfast club. Yeah, I'm on the East Coast this week visiting my dad. And there's a
01:12 ruckus. So I'm in a slightly different setup. It's a little echoey. So forgive me, folks,
01:16 for the echo. I'll be back to the studio next week.
01:19 Connecting with Michael in the field.
01:21 That's right. Reporting from the field. I did see a wild turkey over there and there have been a
01:25 couple of squirrels, baby squirrels were playing. So it's a very exciting, but not as exciting as
01:29 Py2 Wasm, a Python to Wasm WebAssembly compiler. Now, Brian, it would be entirely reasonable to ask
01:37 or to point out that there is already a Wasm version of CPython. So why would it be exciting?
01:44 More exciting than baby squirrels? Well, let's see. So really it's about performance. This comes from
01:49 a company called Wasmr. They make Wasmr Edge. Don't fully understand Wasmr Edge. I'll talk about it for
01:56 a second in a minute, but they basically have like cloud computing, but what you deliver are WebAssembly
02:03 things to run rather than full native code to run. So they can do them closer to the edge,
02:08 like CDN endpoints and things like that. But regardless of how you run it, they've come up
02:15 with this thing called Py2 Wasm. And so you can take your code and compile it to this. And it's not
02:21 quite as fast as true native CPython. But what I didn't realize that CPython Wasm is like one fifth as
02:29 fast as native Python. Okay. So this is three times faster than the alternatives if you're going to do
02:36 anything WebAssembly. So that's pretty cool. And that makes it maybe two thirds the speed of
02:40 truly native Python rather than compiling C to WebAssembly and interpret it in a JavaScript runtime,
02:46 which I guess I understand why that's slower. Yeah. Right. So pretty interesting. You just pip install
02:51 Py2 Wasm and then you just Py2 Wasm your program and you output your .wasm. And actually that,
02:58 I mean, you can run it in Wasmr, but it also kind of just opens up the possibility to run
03:02 interesting things on the web and web-based platforms in general. Right?
03:07 That's pretty, pretty easy workflow. Yeah. It doesn't look too bad. And the pip install one is one
03:12 time, right? Like you get that set up. Good to go. Now, this is actually based on Nutka.
03:17 Am I spelling it? Say that right? Nutka. I believe is the way the Python compiler. And so that's both
03:25 awesome, but also has an effect. And the effect is that Nutka, oh, I'm saying this close, right?
03:32 Only supports 3.11 so far. And so your code will only work on Python 3.11. But honestly, these days,
03:39 3.11, 3.12, they're real similar, right? There's not a lot of features that we go, like,
03:43 can't use it. Can't use 3.11 these days, right? That's kind of as mainstream as you get. Most
03:48 most people that have a lot of really hard requirements for stability are a step behind
03:53 anyway, right? Yeah. Yeah. And yeah, not to diss anybody that worked on 3.12. 3.12 is awesome.
03:59 But yeah. Oh, no. I mean, when we have 3.13, 3.12 will be kind of like the mainstream one,
04:04 right? Not saying nothing's wrong. Nothing's wrong with that. It's just a lot of people stick one version
04:08 behind that song. Yeah. That's pretty neat. Absolutely. Excited to try that for something.
04:13 Yeah. There's a bunch of, exactly. So it's awesome. I so want a front end framework to be based on
04:21 PyScript and the MicroPython runtime and all of that, but we don't have that yet. And so until we do,
04:26 I don't have a huge use case. I mean, in the data science world, there's a lot of, there's a lot of
04:30 reasons for like, hey, can we push the compute for this computationally expensive thing to the browsers
04:36 so that we don't have, we don't have to pay all the cloud computing costs, just like let them download
04:42 Pioxide, Pioxide rather, and run it locally, right? That would be awesome. But if you're not doing that,
04:48 now, if we can have front end framework in Python, I'd be all about it. Well, just one thing to wrap
04:53 up this article here that announces this. They also talk about like, well, how could you get Python into
04:58 WebAssembly? There are ways to do it. There's ways to make it faster. You could use a subset of Python. You
05:03 could use a JIT. You could use static analysis, et cetera, et cetera. So they talk about using
05:07 Cython, R Python. Have you heard of R Python? Transforms typed code into C and then compiles
05:13 it with a normal C compiler. Okay. I didn't know. I didn't know that, but you just say R Python,
05:18 hello world.py and boom, there's a binary executable. That's actually kind of interesting. Okay.
05:23 And then some other options you could do Python JIT. Pypy, PYPY is probably the most
05:30 common one of those. And then you can do static analysis with mypyc. And finally,
05:35 the one that they chose was Noitka. Noitka. Oh, well, right. And then they talk about how they
05:40 use it here. So if people want to dig deeper, there's a lot more to go here, but I think that's
05:44 enough for introducing the idea. Yeah. And I do appreciate that they talked about their trade-offs
05:49 and why they picked one over the other and stuff. Yeah, exactly. Pretty neat. Pretty neat as well.
05:55 All right. Over to you. Well, I want to talk a little bit about where you get packages from.
05:59 So normally I take a look at pypi.org to look for stuff and that's kind of where stuff's coming from.
06:06 And unless you have a local repo, if you do pip install, it's coming from PyPI.
06:13 Or local or your company or something like that. But in the end, this is the place that we shove all
06:19 the stuff that people share. And you can browse things. Like I picked one of mine, pytest-check.
06:25 And you get pretty quick. You can see a bunch of stuff about it. Well, the maintainers, some of the meta.
06:32 And the reason why I'm covering this is because that's kind of what you get with PyPI, this browse
06:38 feature. But there's a couple other options that I wasn't aware of. And I'm pretty excited about Oven.
06:44 So both Oven and what's the other one? PyPI browser. So let's take a look at Oven. So I just learned
06:52 about this recently. It's from Frostming and a really slick interface. And when you search for
07:00 something here, you get something similar to what you see on PyPI. But there's some meta information
07:07 on the left and you've got the readme documentation on the right, the description. But there's also,
07:13 this is kind of fun. It's got, the author's blank. I wonder what I'm doing wrong here. But anyway,
07:20 it says how to install it in case you didn't know, like pip install, PDM, Rai and poetry
07:26 instructions for how to install something. Kind of fun. The thing that I really enjoy is some of the
07:32 extra stuff that it's adding. Some of the extra stuff is a really great browser for what,
07:37 great look at what the versions. So this is a really clean, old version interface and how old they are.
07:43 And then the file browser is kind of amazing. So you've got both wheels. So I'm just
07:50 distributing both a wheel and a tarball. And within the wheel, you can check to see,
07:54 you can just see all the files in here. Oh, you can even look inside individual files. This is pretty
08:01 amazing to be able to inspect, inspect what, what you're getting with your wheel before you even try
08:07 to install it. So that is cool. It's really for people who are not pulling this up while they're
08:12 listening. It looks very much like the source view, the code view and GitHub actually, but based directly
08:18 on the wheel. Yeah, it's pretty great. And then even, so even the, the tarball pulls things apart and you
08:26 can see, see what's in there through, through the tarball. This is pretty amazing. All the meta,
08:31 all the meta data, and then just everything. You can just completely view it without even installing
08:35 it or downloading it or anything. So pretty awesome to look at different, different things here.
08:41 Yeah. It is open source. It is based on, I think it's JavaScript. I think JS, JavaScript and something
08:51 called Remix, which I'm not familiar with, but pretty new project, but pretty exciting. I think this is
08:57 gorgeous and helpful to the community. And then the, I think I saw this on the announcement for Oven,
09:05 was comparing it to also PyPI browser. And I'm like, I didn't know about that. So let's take a look at
09:11 PyPI browser. So pypi browser, pypi.browser.org. Also as you can search for packages. And this is not
09:20 trying to replace the PyPI interface too much. It's just so you can take a look at wheels. So
09:25 being able to look at the metadata and the package content within, oh, wow. You can just like see all
09:32 the stuff. So yeah, PyPI browser allows you to go in and look at all the code, but there's a little more
09:37 clicking around to, to be able to, to see everything. So that's why I think that's one of the, the, the
09:45 reasons for the oven is to try to maybe clean up this interface a little bit, but still this is
09:50 pretty cool. And then one of the neat things about PyPI browser is that it is based, it's written in
09:57 Python, it's open source, both are open source, but this one's written in Python on Starlet. So it's a
10:02 Starlette app. And, and it even says that one of the benefits of this is you can use it as, as a browser
10:09 for a private PyPI registry at your company or an internal registry. So that's pretty cool. So I
10:17 don't know what the difference is with try to, between trying to install this versus other things,
10:22 but anyway, a couple of neat ways to browse Python packages. Yeah. Both are new to me and very
10:28 interesting. I like oven a lot. It looks real good. Yeah. The, the, the interface is just gorgeous.
10:33 Of course, of course, this is mostly the images neat, but it looks nice. It says oven to bake pies.
10:39 No, not to bake pies to explore Python packages. And, and for a while I was like, what's going on?
10:45 What? I don't get the, the joke. I honestly, I didn't get the joke for a few minutes and then it's
10:51 the pie is in the oven. I get it now. Yeah. Yeah. Very nice. I'm a little slow sometimes. So do
10:59 you know what's not slow scout APM. Let me tell you real quick about scout APM. They're big supporters
11:05 of Python bytes. So we appreciate that very much. So if you are tired of spending hours trying to find
11:12 the root cause of issues impacting your performance, then you owe it to yourself to check out scout APM.
11:17 They're a leading Python application performance monitoring tool, APM, that helps you identify and
11:23 solve performance abnormalities faster and easier. Scout APM ties bottlenecks such as memory leaks,
11:29 slow database queries, background jobs, and the dreaded N plus one queries that you can end up if
11:35 you do lazy loading in your ORM. And then you say, oh no, why is it so slow? Why are you doing 200
11:40 database queries for what should be one? So you can find out things like that. And it links it back
11:44 directly to the source code. So you can spend less time in the debugger and healing logs and just
11:49 finding the problems and moving on. And you'll love it because it's built for developers by
11:53 developers. It makes it easy to get set up. Seriously, you can do it in less than four
11:57 minutes. So that's awesome. And the best part is the pricing is straightforward. You only pay for the
12:03 data that you use with no hidden overage fees or per seat pricing. And I just learned this, Brian.
12:09 They also have, they provide the pro version for free to all open source projects. So if you're an
12:15 open source maintainer and you want to have scout APM for that project, just shoot them a message or
12:21 something on their pricing page about that. So you can start your free trial and get instant
12:25 insights today. Visit by them by side of him slash scout. The link is in your podcast player show notes
12:30 as well. And please use that link. Don't just search for them because otherwise they don't think you came
12:36 from us and then they'd stop supporting the show. So please use our link by them by side of him slash
12:40 scout. Check them out. It really supports the show. Right. Thank you, scout. Now on to the next thing,
12:47 which is a freeze frame of Paul Everett and YouTube here doing an announcement. So I want to just give a
12:54 quick shout out to this new auto complete code intelligence engine that's in PyCharm. People know I'm a big fan of
13:02 PyCharm, right? I talk about it all the time. But if you have any of the pro tools, including PyCharm Pro, there's
13:09 something that you've noticed. But if you haven't used it lately, you wouldn't notice, obviously. And they've added, you know, how people have, you know,
13:18 have copilot and some of these other things that they can plug into their development tools, right?
13:24 Yeah. Well, the way that works is it takes a section of your code or your code comment that you asked,
13:30 instructed to do a thing and then a section of your code and it sends it off to the cloud and stuff happens.
13:34 That send it off to the cloud. Some companies may frown upon it. I believe your company says,
13:39 nine, do can sneak. You can't do it. You're not doing that. So being a German company, they say it that way.
13:46 That's why I said that. So this is awesome because it's sort of like that, but that's probably the wrong
13:52 mental model. But nonetheless, it's like totally local. So it comes as a plugin for PyCharm and others
13:58 if you have the pro version. And it just lets you do like awesome code completion locally with no round
14:04 tripping. Just pretty neat. And I think it was on by default on the new PyCharm, because why not? I want
14:10 to give you an example to give you a sense so people otherwise it's just like, hey, this thing, it's neat. It
14:15 helps you write code. What does that mean? So here's a little bit of code I wrote. It's a flask
14:20 view endpoint and it's using blueprint. So it says at blueprint dot get slash listing. It says a function
14:27 depth listing. And then it wants to show some videos in some, some view, right? So this is all code
14:32 existing. I'm trying to help people get it. This is where it starts videos equals, you know, some
14:36 database query to get a list of video objects. Right? Yeah. Now, if you type the word R E T,
14:42 an attempt to begin to write return, do you know what tab will write for you with this LLM?
14:47 Return flask dot render template, parentheses slash home slash listing dot HTML, because there's a
14:55 hierarchy of the templates and that is the correct one. And videos equals videos, close parentheses,
15:01 tab to write that. Yeah, that's a that's amazing. You just do that all day. Just that a tab that
15:06 added a tab that had a tab. Sometimes it gets it wrong. And sometimes it's close enough. You tab it
15:12 and correct it. And sometimes it gets it. Actually, this is exactly what should be written, which is
15:16 insane. And some pretty long, like you're showing some pretty long stuff that I'm surprised by some
15:21 short stuff. I'm like, Oh, yeah, that's probably that's right. Yeah, that's right. Yeah. Yeah. Like,
15:25 oh, we're going to sort the functions by like, most used rather than alphabetical only and like
15:31 something silly like that. Right? It's not that it's way more than that. But there's been times
15:35 now I'm so I'm so loving this because there's times where I'm calling some API function. And
15:40 I'm just about to think, I don't use this very often, I have to look it up. And it just like pops
15:46 it in. And it's correct. I'm like, Oh, yeah, that's exactly what I wanted. Thank you.
15:50 Yeah, I'm already getting used to it to the point where I can't live without it. Now. This is
15:57 yeah, incredible extra feature. It is. And where it frustrates me is where I'll type a little too much
16:02 and it'll go away. I'm like, No, I should have just accepted it. I didn't read. How do I get this back?
16:06 Yeah, I've actually like started over. I'm like, okay, delete the line and start over because that's
16:11 easier. It's going to be quicker than writing the rest of it. Absolutely. Yeah.
16:15 So anyway, like I know PyTron's pro is a paid thing, but it's also one of the very
16:20 most common tools. And this is not paid, but I think it's awesome. And so I just wanted to give
16:24 a shout out for it because so many of these coding assistants do all this magic by sending all of your
16:29 code to the cloud, and they've got the cloud latency and all that. And this is just nice and local and
16:33 sweet. Yeah, that's the part that I really. So yeah, I like that it's just easier fits in my workflow.
16:39 But also, like you said at work, we have we have local like GPT kind of things that we can use that
16:46 are company internal, which is a neat thing for people to do. But but this is just local and it
16:52 doesn't even go anywhere. So it's super fast. I can even have my laptop unplugged and work.
16:56 This works. So it's pretty cool. Yeah, good job. Cool. Next up. So that's the good that's good news.
17:03 We've got some bad news. And I got this from like lots of people. So a lot of people were talking about
17:10 this on Mastodon. The news is that Google seems to be shedding Python developers, at least in the US.
17:16 And there's there's a bunch of articles around it. So we've got registry talked about it. This is this
17:26 the registry kind of said Python and Flutter teams latest on the Google chopping block. Never mind,
17:34 the record revenues cost must be cut. And I this I kind of like this article in that it highlighted that
17:43 in this time where they're like laying off a lot of great people, they last week, they announced a
17:50 one year jump on net profits to twenty three point six six billion over for cap for Q1. So record profits.
17:59 It's I don't know if that's record profits, but really great profits. And yet that's not enough.
18:03 And they're cutting people. And I saw it all over all over Mastodon. TechCrunch has some highlights of
18:12 different people posting, including from Thomas Wooders, who's one of the Python core people.
18:18 He's on the steering council, too, as well. Oh, yeah. And also Dart. So Google lays off staff from
18:24 Flutter, Dart and Python teams. And I and there's no official announcement as far as I can tell from
18:30 Google yet. It's just since it was under 100 people, they not announcing it basically leaked
18:37 messages from team leaders to the teams and stuff like that is what we're seeing.
18:42 Yeah. And the I don't I don't I don't remember what article I saw this in and I it'd be oh, it's from the the register.
18:51 I think some of the some of the teams have been reduced in favor of a new team based in Munich.
18:58 So taking people in and then I thought I don't know if this is true or not. I heard somebody mentioned that
19:05 some of the laid off people are getting or having to retrain having to train their replacements, which is
19:11 tacky and yicky. So hopefully that's not true. Anyway, my my I guess hope everything goes well for
19:19 everybody that is part of this and hopefully lay land land on their feet. Well, so good luck.
19:25 Yeah. Sorry, folks. Brian, it's like they want to try to take out my entire tech stack
19:28 Python and then the mobile apps are Flutter and Dart. And I was like, oh, come on.
19:33 I'm actually more worried about Flutter and Dart because Google is such a density to like just kill stuff.
19:39 You know, there's the Google graveyard and all that sort of things that you hear about. And they're the
19:44 lead of Flutter and Dart, whereas they're not in charge of Python. It's just unfortunate.
19:49 Yeah. Yeah. So yeah, you've used Flutter and Dart before for projects, right?
19:56 Yeah, it's great. Yeah. So it's the talk Python courses mobile app is built in.
20:00 Yeah, I wouldn't build it in Python if we had solid options there. But sadly, we're not there yet. Someday.
20:06 All right. Before I hold it on that, that all of them, I have a quick follow up to this. It's part of this.
20:12 Okay. This is not as timely, although it's an article from seven days ago. It talks about the
20:18 history last couple of years. And it it's quite a long article. Let me look. It's sorry. The
20:26 original. There we go. That's what I'm like. The original one on where's your ed at, which is an
20:32 awesome domain. But it's a really long write up and it's entitled The Man Who Killed Google Search.
20:39 And basically it documents the struggle between the search team whose job is to build features
20:45 that are better for you, better for me, better for everyone. And the ad team whose job is to make you
20:51 do more queries. So more ads show up so that you might click them. Oh, so they called for a code yellow,
20:57 which in Google parlance actually means a really bad thing. Like code red would probably be the way
21:01 people would think of it. It says people are finding what they look for too quickly and leaving.
21:06 So what can we do to like make them see more ads basically? And there was a big struggle for a
21:12 couple of years. This all started in 2019, but it's basically the, the in crapification,
21:18 if you will, the slightly nicer Cory Doctorow term of Google search. And if you've felt like over
21:25 the last couple of years, Google search has gotten worse, it's on purpose so that you will spend more
21:30 time seeing ads and maybe clicking them. How about that? Well, yeah. So one of the things that people
21:35 look at is your bounce rate. So, I may get this wrong cause I'm not really a, like a stats wonk, but,
21:41 bounce rate, I think is, I don't know what it is. It measures how, how many, how long people stay
21:47 in on your site and look at different, what is it? how many pages they see, look at what, before they
21:53 leave? I think bounce rates, you, you get to one page and you leave, you don't subsequently explore
21:57 the page. Okay. So a lot of people don't want that. And I, I personally, I think for my like
22:04 blog and stuff, anything I'm doing, I love a low bounce rate. That means that my, my analytics and
22:10 whatever, or my Google search terms and all that are correct. And people can find exactly what they're
22:15 looking for right away and they don't need to click around and find something else, but I'm not, I'm not
22:19 like pushing ads. So yeah. Anyway, I'm off to read this. This is very interesting. Yeah. I read it yesterday.
22:28 It's really interesting and it's not inspiring, but it is interesting. And the reason I even brought it up,
22:34 not just cause the word Google appears in both, but the, the like, Hey, we don't care so much about the
22:40 tech. We're not doing this to support the community. We need our cut. And what can we do to make that
22:44 happen? It feels very much like the same vibe of motivating a lot of these layoffs and like,
22:49 yeah, we don't really like, how do we make money on ads from flutter? I don't think we do. Can we
22:53 get that out of here? Like these people are just dead weight, like that kind of thing. Right. And
22:56 these a little less so for Python, but still also, but this is the, this isn't a struggling company.
23:02 This is one of the most profitable companies in the world. I think they just became a $2
23:07 trillion stock market valuation. So try like, it's not just, we need to make money,
23:12 but we need to make more and always more and always more. Never enough.
23:15 So anyway, it's too bad. Ah, well, those are our topics. do you, do you have anything extra since you're, I am feeling not very extra. I have one extra,
23:25 one extra. This is good. Cool. So previously I've spoken about L M studio, and this is like right in
23:34 line with, what I was talking about earlier, local L L M so download discover and run local L L M
23:40 is the way it works is you'd run this app. Then you tell it, you basically search hugging face
23:45 models and they get rankings and all that kind of stuff. And then it just downloads a whole bunch of
23:50 them. It gives you a chat interface. You can say, no way to run mistral. Now I want to run fine. Now I
23:55 want to run, whatever, right. You pick the ones you downloaded different sizes, all sorts of things.
24:01 Well, the big deal is llama three, which is a very powerful, but not too big open source. L L M from
24:08 meta is now available locally on L M studio. And boy, oh boy, is it good. It's really good. So like,
24:16 for example, I gave it, a segment of a Docker compose file with concrete settings. I said,
24:22 tell me what this does and, tell me not just what do these mean, but exactly what does each command
24:29 do? Like when it says restart, does it just, and it says restart five times until you consider it failed.
24:36 They just try as fast as it can. does it use, is there some kind of way to set a timeout? It's like,
24:41 oh no, no, it uses an exponential back off and it works like this. And here's the formula to compute.
24:45 Like pretty good running locally. I highly recommend. That's pretty cool. Nice.
24:50 So that's my only extra. My one extra is just a public service announcement because I run into this
24:56 all the time. I don't know. It's a basic Python thing, but, this article, oh, who's it from?
25:02 I should give us anyway, somebody, sorry. it's Python gotchas strip L strip and our strip can
25:09 remove more than expected. And I do this all the time. I forget about it. So what else strip L strip and our strip
25:15 do is they take a string and they strip characters out of it. And if you give it like a word,
25:20 it doesn't take the word out. It takes it's a, that's a set of characters that it removes. And
25:26 that's not usually what I mean, but Python has, what do they have? We have removed prefix
25:32 and remove suffix that you want to use instead. So, if you, if that's what you want to do,
25:37 if you just want to remove something off the beginning of the, of a string, use remove suffix,
25:41 remove prefix. And I bring this up because I always run into it. And, and then in, in my little test
25:47 example, it works. And then I put it in a bigger project and it doesn't work. What's going on. So
25:53 that's it. That's it. PSA. Yeah. Yeah. That's it. So anyway, if you could start over, I think it would be awesome that L strip and our strip and all those things
26:01 could take two keyword arguments that were required as keyword. One is characters and another is,
26:08 sub strings or something. You just say characters equal this or sub string equals that or something.
26:12 But you know, even changing keyword names, primary names is breaking because you can explicitly state
26:18 them. So, well, yeah. And it's, it's a different interesting thing because strings are iterable.
26:23 so like, because sometimes I really do want what it does. Like sometimes I want to take out the,
26:29 like the, the dashes out of a string or something like, yeah. Anyway. All right. Oh,
26:35 let's see who's this from. This is Andrew Wagner, Andrew. So thanks Andrew. all right. Something
26:40 funny. Oh, I got some funny today. I had a couple of funny. So let's start with the traditional style
26:45 of funny. So this comes to us from dev humor and both you and I work on courses, put a ton of energy
26:52 into them. We don't charge that much money for them. but here's kind of a, a paradox or, or
26:58 something. So this is the post that says developers will spend $150,000 on a computer science degree.
27:05 And then they go and they go and learn JavaScript on YouTube for free and won't pay 20 bucks for it.
27:10 Basically. Yeah. Yeah. Like, of course you get that too. Right. The people saying like,
27:17 can I get it for cheaper? Yeah. And then I've been playing with PI joke, the actual Python API,
27:22 not the CLI of it. And did you know that in PI joke, you can specify a category. And one of the
27:28 categories is Chuck Norris. So let me read you. I'm just going to get like five, five Chuck Norris
27:33 programming jokes for you. Are you ready for this? This one is right, right down your alley. The first.
27:37 Okay. Chuck Norris is unit tests. Don't run. They die. Okay. Let me have a little bit of a good. Okay.
27:45 This one's pretty good. Chuck Norris doesn't need to use Ajax for JavaScript prospects. Chuck Norris
27:50 doesn't need to use Ajax because pages are too afraid to post back. Anyway, Chuck Norris can dereference
27:55 null. Okay. That's, that's my favorite so far. Hold on. Hold on. Okay. Last one. Chuck Norris's
28:06 programs never exit. They are terminated. Yeah. Okay. That's pretty good. Yeah. So anyway,
28:12 if you pass the Chuck category to PI jokes, plural, not PI joke, singular, pretty awesome.
28:17 Oh, those are, those two different things. I joke. Well, oh yeah. One is like an expired version
28:23 from 2014. Jokes has at least been updated in 2019. Okay. Yeah. All right. Looking for contributors
28:30 there, man. Exactly. Sure. We can get a few more of these. No one has ever paired program with Chuck
28:36 Norris and lived to tell the tale. We can tell the tale of the podcast, Brian. Yeah. Well,
28:42 next week, are you back in town or I am back in town? Okay. Everything is back to normal. So we'll talk to
28:50 everybody next week. Yeah. I'm glad we're able to do the show anyway. So yeah. Yeah. Good to see you.
28:54 All right. Bye. Bye.