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