Transcript #127: That Python code is on fire!
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 your earbuds. This is episode 127, recorded April 24th, 2019. I'm Michael Kennedy.
00:11 And I'm Brian Okken.
00:12 And we have a special guest this week as well, Kenneth Reitz. Welcome to the show, man.
00:17 Hi, thanks for having me.
00:18 It's great to have you here. I wonder if requests will come up as a topic during the show. What do
00:23 you think?
00:23 Request three might.
00:25 The future of requests. How exciting. Awesome. Well, thanks for being here. It's great to have
00:29 you here. Before we get any further, I want to say thank you to Datadog for sponsoring this show.
00:33 Check them out at pythonbytes.fm/Datadog. More on why they're cool later. Brian, I feel like
00:39 WebAssembly, Rust, all these things are just, there's so many cool things going on around it.
00:44 And that's something you found for us to start off with, right?
00:47 Yeah, I saw this from a cool, actually a Twitter post from Mara Boss. I think it's Boss, B-O-S.
00:52 And it's an extension to Rust that's an inline Python. So if you're a Rust person and you need a
00:59 Python in there, you can just inline it as a, I think it's as a macro or something. I'm not a Rust
01:05 person, so I'm not sure how this works. But you can inline Python code, including things like
01:11 embedding a map potlib call to pop up a window. So it's pretty neat. I don't really have much more
01:18 to say about it other than neat. You can run Python within Rust.
01:21 I think that's pretty awesome. Yeah, quite cool.
01:23 I wrote something like this week, actually, for Bash in Python. So you can do inline Bash in Python.
01:28 So it seems to be a trend. People want to embed other languages in other languages.
01:32 That's cool. Can people get to your Bash thing? Is that a public thing?
01:36 Yeah, it's just import Bash or pip install Bash.
01:38 That's pretty cool. There's a lot of interesting interplays here. Brian, have I talked about
01:43 WASMR, as in WebAssembly-mer, before on the show?
01:48 I'm not sure.
01:49 I think that's going to have to be a topic. So there's all sorts of cool interplays between
01:53 Rust and Python these days. And like Rust, obviously, is big for generating WebAssembly.
01:58 So there's now a project called WASMR, which lets you... I think I talked about it last week.
02:03 I did, yeah. So lets you basically run WebAssembly in Python. And this is kind of like
02:08 the opposite.
02:09 Oh, really?
02:09 It's an interesting way. Yeah, yeah. So kind of like Node.js is the platform for running JavaScript
02:14 outside of the browser. Like WASMR kind of does similar stuff. It lets you take any WebAssembly
02:19 thing and run it in your Python code. You basically import the functions from it,
02:22 and then you call them in straight Python.
02:24 So do you have to do reflecting, where you know what the structure of the code looks like
02:29 when you import it?
02:30 I don't know. I doubt it gives you any help. But the way you interact with it looks like
02:35 Python. You don't have to do anything special beyond an import statement.
02:38 Okay, so you don't have to write C or anything?
02:40 Like a load statement. No, nothing like that. It's pretty much straight Python.
02:43 This is really cool, Brian. Yeah, I like this. Very nice find. Cool. All right, Kenneth,
02:48 what's your next one? You want to tell us about the future with your back from the past
02:51 microphone? Yeah, sure. I wanted to announce that request three is underway right now. We're doing
02:57 a development cycle at the moment. And I wanted to announce just some information about that,
03:01 basically. So request two, which is the thing that you know and love, is going to go into CVE
03:07 only mode, which is basically been for a long time. That's kind of the way things have been for
03:12 a couple years now. Does that mean like security fixes only or security fixes and bug fixes?
03:17 It means that if there's a CVE, like if there's a true security vulnerability, we'll fix that as soon
03:25 as possible. And if there's a, you know, any security conscious bugs that will will address those as
03:29 well. But you know, things like people suggest UI changes a lot. And it's just not going to happen
03:35 at this point. It's going to happen in request three, if you're going to awesome. So what's the story
03:39 of the request three? What do you guys what are the major features? Yeah, so the major features are
03:43 there's going to have async and await keywords. So you're going to be able to do asynchronous calls,
03:47 we're ripping out URL of three, which is unfortunate, because there's different approaches on how the
03:53 future of the project could unfold. And it's this needs to start happening now. So we're just taking
03:59 action and making our own library for making these low level requests. And we'll see how far along we
04:05 get with that. But there's we don't see any blockers that we can foresee at this point. So we'll have a new
04:10 core, if you will. And it'll be as a new namespace request three. So everything that you know,
04:16 that depends on requests, this is going to have backwards incompatible changes. But it'll be under
04:21 a new namespace. So you won't have to worry about that. You can have both installed at the same time.
04:25 Nice. And it's modern Python only, right?
04:27 Yeah, it's only Python three, six. And it has type annotations and all the public functions. So your
04:32 IDEs can get some nice code completion and stuff like that. I'm pretty excited about it. So that I
04:37 don't want to take up too much time now. So I guess we got to keep moving.
04:39 Well, we do. But I'm pretty excited. So I have one more question. So why three, six and not three,
04:44 five? Like three, five is fine for async and await. Did you do like different type annotations? Or
04:48 what was the three, six? Maybe f-strings?
04:51 Okay, F, yes. Right on. Brian, I still owe you a sticker.
04:54 They're really useful when you're writing a low level library or something that deals with a lot of
04:58 URLs. It's really nice to have f-strings.
05:00 Yeah, that's pretty cool.
05:01 I don't find it acceptable to use three, five. Like if you have three, six, even three, six doesn't seem to
05:07 be acceptable. I'd like to, it's going to be documented as three, seven only because like,
05:11 if you're going to be on latest Python, you might as well be on latest, latest Python.
05:15 Yeah. Yeah.
05:16 Right on. And by the time that that comes out, three, seven will definitely be easy, easy.
05:21 What's the timeframe?
05:22 Yeah. I think it'll secretly work at three, six and secretly work at three, seven, but I'll just say it works at three, eight.
05:27 I love it. Brian, you excited?
05:30 Yeah. I actually, I think, I think that'll be fun.
05:33 Yeah. I'm thinking of also ripping out the, the dot get keyword. That's the thing I'm torn about at the moment. Like the request dot get that everyone uses.
05:42 What would it, what it's going to force everyone to use session.
05:44 Oh, interesting. Okay. So you create a session and then you call get on the session, right?
05:48 Yeah. So it would be, it's called HTTP session now. So it'd be HTTP dot request is what I want people to do, but I'm still playing with the idea. So I'm, it might be not changed. We'll see.
05:59 Yeah. You could face some backlash, but yeah, it sounds good.
06:03 I'm willing to take it.
06:03 You got some tough skin. You've been on the internet for a while, right?
06:07 Yeah. Let's not go down that path. All right. So maybe you could even say that you've been in some flame wars.
06:13 So the next item I have is called PyFlame and PyFlame is pretty cool. Like if you want to know how the performance of your program or a certain library is going, you can generate what's called a flame graph for Python.
06:28 And what's really nice about this is it's super low overhead enough that you can even run it in production without like hurting your program.
06:37 So you could say, Oh, there's something going wrong with the website. Let me log in and attach, you know, PyFlame to it and see what's happening.
06:44 And then just break loose and go analyze that rather than, you know, try to simulate what's happening. So I think that's pretty cool.
06:51 We actually use this on the PIPAM team at one point to determine what, where our slow points were in, like how fast our boot up time is.
06:58 Yeah. And was it useful?
06:59 It was very useful. It shows you every single call in your stack and just shows you a graph over time of how much time was spent on each call and all the sub calls. So it's, it's great. I really like it.
07:11 Yeah. And the graphs are nice as well. They're pretty obvious, not just like a grid of numbers, like a spreadsheet, but you know, graphs.
07:17 Yeah. Usually when you hear someone talk about graphs that are generated from Python, it's like, you have to work with them all to make them useful. But this, these ones are useful out of the box, which I really like.
07:27 Yeah. Cool. Another thing that it said that it does, which is nice, has nothing to do with PIPAM in this feature, but it's capable of profiling embedded Python interpreters. So like, for example, in micro whiskey or G unicorn or some of these, you know, backend worker processes for web servers. So you can get in there and get that in multi-threaded stuff. So I think it's pretty awesome.
07:47 Brian, do you guys care about performance where you are? I mean, you're doing testing hardware, so it's not like users are directly interacting with it. Is it, is it, I guess not, do you care about it, but is it something you have to like worry about?
07:59 In my production stuff, the Python is not the bottleneck. It's the communication. So yeah.
08:06 That's a great response.
08:07 It's on the wire. It's not our fault.
08:11 Well, it usually is our fault, but it's usually an optimization of doing too many calls and reducing the communication latencies.
08:19 Right. Having a chatty API versus trying to bulk up the thing you want to ask it or whatever, right?
08:24 Are you working with a lot of microservices?
08:26 Working with test equipment. So communicating commands and retrieving data.
08:32 Yeah. That would take a lot of time.
08:34 Yeah. Brian tests actual devices with Python.
08:38 That's awesome. Oh, that's right. I knew about this.
08:40 Yeah. You test like, like phones and stuff, don't you?
08:43 Yep. That's awesome.
08:45 Yeah. Pretty cool. All right. Before we get onto the next one, which looks pretty interesting.
08:49 Let me just tell you about data dogs. So they've been sponsoring Python bytes for quite a while and we definitely appreciate them.
08:55 So there are monitoring and analytics service that lets you take all of your metrics and logs and tracing and whatnot across your services,
09:02 like microservices, like it's just said, and put them all in one place.
09:05 And it automatically instruments async libraries like asyncio and Django and tornado and helps you visualize all that stuff across the boundaries to find your bottlenecks.
09:14 Super cool. So check them out to get a free 14 day trial and a cool data dog t-shirt over at pythonbytes.fm/data dog.
09:22 All right. Thanks data dog. Brian, what do you got next?
09:24 This was going to be one of my extras, but I thought I'd just discuss it because I was curious what you guys thought.
09:29 So flit is, I really like it. It's a little package that allows you to quickly build a pipe project.tomo file and a license file.
09:38 And basically, you know, if you've got a module that you want to share with somebody or a package that's just a source package,
09:45 it's just a few commands to try to get it into a wheel form to so you can share it.
09:50 And it even does publishing within it.
09:52 The one thing I didn't like about it is it didn't support source directories.
09:57 And I like source directories in my packages.
09:59 So I did what you can do with open source projects is I submitted a pull request.
10:05 So just submitted this last night.
10:08 I've been playing with the corner cases today and there's still some I'm listing it as a work in progress because there's some corner cases that still need tested and probably ironed out.
10:18 But I don't know. We'll see. We'll see where this goes.
10:21 Did you make it so it's configurable to any directory or specifically SRC?
10:25 Specifically SRC.
10:28 Okay, cool.
10:29 It doesn't break any of the other.
10:31 So really right now it used to have two kinds of projects, just a module or a package with a name.
10:38 And now I'm just adding those two within a source directory.
10:42 The old mechanism all works. It's just extending it.
10:45 Yeah, Flet is a little bit like a combination between Twine and Cookie Cutter a little bit.
10:50 Like it's far reduced in scope from Cookie Cutter.
10:53 And in Twine, all it does is publish things, publish wheels for you.
10:58 And that's the tool I typically use in my workflow.
11:01 But Flit is a great alternative if you don't already have your setup stuff built out.
11:05 I think Flit is like a great first tool to go for, especially if you don't have those files already written.
11:12 Yeah, that's awesome.
11:12 Yeah.
11:13 Well, hopefully people like it.
11:14 I mean, it's out there, the PR, right?
11:16 They could merge it.
11:16 That's pretty cool.
11:17 Yeah, so hopefully.
11:18 Hopefully they'll put it in.
11:19 Otherwise, you can't use it on your project.
11:21 You'll have to succumb to our side where you don't use source.
11:25 Well, I could fork it.
11:27 Yeah, you could.
11:29 But I don't really want to support it.
11:31 So I'm hoping that...
11:32 Call it Slit.
11:32 Yeah, you don't want that puppy.
11:37 You don't need another thing to take care of, right?
11:39 Yeah, that's a good name though.
11:41 She's going to do it.
11:43 Awesome.
11:46 All right.
11:46 So speaking of packaging and things that we've talked about and things we're like, I'm a huge fan of PipX.
11:52 I think PipX is really killer.
11:53 Yeah.
11:54 The way it works.
11:54 I've run into some issues with Homebrew in it, but I'm going to put those aside for a minute.
11:58 Also, PipInf, tell us the story here.
12:00 My endorsement is also with this flag, which is I've run into some issues and I'm not sure what they are yet.
12:06 So it appears as though PipX is great.
12:09 And what it does is it just creates a virtual environment and installs binaries for you.
12:14 So it's like a Pipsy replacement or a virtual amp wrapper.
12:18 If you have like...
12:19 Sometimes people will have like a system virtual amp where they install their system utilities or they'll just...
12:24 They'll keep their system utilities in the system installation of Python and then they'll isolate their different projects into virtual amps.
12:31 This makes it so every single tool has its own virtual amp, which is really best practice.
12:37 So if you're using PipAmp, if you're using HTTP IE, if you're using anything pip itself, anything that's pip installable from the command line, you can install it easily with PipX.
12:48 And it does appear as though it has shims, so I'm not sure that it's fantastic, but it appears as though it works pretty well so far.
12:57 And I really like that it supports multiple binaries.
12:59 Yeah, I do too.
13:00 It's quite nice.
13:01 And to me, it feels like homebrew, but for Python executables.
13:05 Like it's not necessarily for managing stuff for your project, but for stuff that is Python based that you just want to run, right?
13:12 Like I want to, I don't know, run Glances or Cookie Cutter or something like that, right?
13:17 Or PipInf.
13:17 Exactly.
13:18 And it gives you a nice isolated environment in which to install that.
13:21 And some of these, like PipInf has like some 50 dependencies or something crazy.
13:26 So it's really good to have an isolated virtual environment for that.
13:30 Because in Python, you can't install multiple versions of a dependency like you can in Ruby.
13:35 So that's why we need to do this, basically.
13:38 Yeah, cool.
13:39 Well, I definitely like it.
13:40 Yeah, that's the end of my endorsement with the asterisk afterwards.
13:44 Yeah, I love it.
13:45 The problem that I ran into, the only problem I ran into was when I installed Python 3 through Homebrew and then Python 3 got upgraded by Homebrew.
13:55 It had lost like the symlink to where Python was in all of the virtual environments that it had created.
14:00 Oh, interesting.
14:01 Yeah, yeah.
14:02 So when I basically, when I upgraded Python, it like lost track of what it was up to.
14:06 So I just had to like re-PipX install everything.
14:09 There's maybe another way to fix it.
14:11 But that was what I did.
14:12 Because all the virtual environments it manages seem to have gotten whacked.
14:16 Yeah, Pip-Am does that too, where it'll break.
14:18 All your virtual environments just break if you upgrade your Python underneath it.
14:21 So.
14:21 Yeah.
14:22 What do you do to fix it?
14:23 You know better than I do.
14:24 I just delete them all.
14:25 Okay.
14:26 So even you have the same fix as I do.
14:28 Did you try turning it off and on?
14:31 How many times?
14:32 Three times.
14:33 I always do it three times.
14:34 I would like to automate that so it does it for you.
14:36 Like, you know, it has a message like, oh, you appear to have upgraded your Python.
14:39 We're going to clean it up for you.
14:41 But, you know, there's limited time.
14:44 Exactly.
14:44 Quite cool.
14:45 All right.
14:45 The last one.
14:46 Kenneth, I think you'll like this one because it has to do with requesting things on the internet.
14:50 And I don't know how to say this.
14:52 I'm guessing cheat sheet.
14:54 Cheat.sh as a domain.
14:57 Okay.
14:58 So this is a, an interesting like cheat sheet for getting started with Python or bash or whatever.
15:08 And the way it works is you send it curl requests or send it HTTP py requests on the command line to ask it questions.
15:17 Okay.
15:17 So you can go over there and say, like if you have HTTP py installed, you could say HTTP space CHT.sh slash Python.
15:27 That tells you you're talking about Python.
15:28 Then you could say slash sort plus list.
15:30 And if you run that, it will tell you, oh, here's a Python example of how you sort a list.
15:37 You create the list.
15:38 You say my list dot sort.
15:40 You set the key to like string dot lower or, you know, whatever you want to sort.
15:43 If you like say you want to sort alphabetically, but without concern of casing, things like that.
15:47 So you can ask it arbitrary questions like cheat sheet dot slash Python slash connect to database or something like that with a pluses in there.
15:57 And it'll like tell you, oh, here's some ways you can do it.
15:59 Like with SQLite.
16:00 Let's see what it says for this one.
16:01 Oh yeah.
16:02 Here's a little example of how I use PeeWee to open up a pretty little class and do ORM stuff to it.
16:07 And just, it's pretty, pretty funky, pretty interesting.
16:11 And then you can ask it questions like how to get started with a colon learn on any project.
16:16 Like how do I get started with Python?
16:17 And it'll tell you in its little way.
16:20 It's pretty sweet.
16:21 I think funky is the right word for this.
16:22 It's different, right?
16:24 So it's like Google, but harder.
16:26 Yeah, basically.
16:27 It's slightly more deterministic.
16:30 Yes, but it has integration into Visual Studio Code and Vim.
16:34 Oh, nice.
16:34 Which is interesting.
16:36 And then you can also, like you can install a client and put it into stealth mode.
16:41 So like if you're doing an interview, anything that you select in a text box, it will start like on the side printing out its response to that.
16:51 Okay.
16:51 So if like you're in a chat window.
16:53 I'm looking at the readme and he really takes this very seriously.
16:57 It is.
16:58 He says ultra fast returns answers within 100 milliseconds as a rule.
17:01 So like he's definitely making scalability concern.
17:05 So I think this is like a really fun production project.
17:07 I think so too.
17:08 And it doesn't use its own data sources.
17:11 It uses other community driven repos for different topics.
17:15 And it tries to pull those in.
17:16 So it's not like it tries to be the answer.
17:18 It tries to be like a facade front end API to the answers.
17:22 So it has sources that it gets them from.
17:24 I'm interested in seeing that part.
17:26 Yeah.
17:27 Yeah.
17:27 It's pretty interesting.
17:28 So I just want to give a shout out to John Boltmeier.
17:31 He sent this in a while ago and, you know, I thought it was fun.
17:33 So I thought I'd throw it out there.
17:34 And he also has clipboard integration and tab completion support for Bash, Fish and ZSH.
17:39 I know.
17:39 I mean, this is in depth, right?
17:41 Like you can really go all out with this.
17:43 Yes, you can.
17:45 All right.
17:46 Well, that's it for our full major topics.
17:49 But I'm sure we'll have a couple of extra things to throw out here real quick.
17:52 Brian, you want to start us off?
17:53 So you guys were giving me a bad time about being a VI person last week.
17:56 So I thought I'd throw in an article about VI is good for beginners.
18:01 It's just a fun read for anybody that thinks that VI is terrible.
18:05 Do you use Vim, not VI?
18:07 I actually use PyCharm right now with IdeaVim.
18:10 Yeah, this is an interesting contrarian sort of take on the simplicity is good for you.
18:15 Yeah.
18:15 Yeah.
18:15 Myself.
18:16 I think it's a good thing to learn.
18:19 I did a presentation last week with a Jupyter notebook.
18:21 And one of the things I needed to do was to quickly make sure I cleaned out all the output of a bunch of notebooks.
18:28 And I found this tool called the NB strip out.
18:31 And so I wanted to drop a link to that.
18:33 It's pretty helpful.
18:34 Yeah.
18:35 It's just a command line thing.
18:37 And then we had a bunch of people, a couple of people, including Cecil, mentioned Pyodide.
18:43 But we did cover that in episode 93.
18:45 But there was a recent article written up about Pyodide that's kind of neat.
18:49 So I'll drop a link to that in the show notes as well.
18:51 I'm super excited about Pyodide.
18:53 I actually just yesterday interviewed Michael Drotboom, who wrote that article you're referencing here and worked on the project on Talk Python, going deep into WebAssembly and what Mozilla is doing with Pyodide stuff.
19:07 So it's, yeah, it's super cool.
19:08 Kenneth, have you seen this, Pyodide?
19:10 I'm looking at it now.
19:11 So it's like all of the scientific Python stack in WebAssembly?
19:15 Yes.
19:15 Including the libraries like NumPy and Matplotlib and stuff like that.
19:19 That's awesome.
19:20 Not just like CPython.
19:22 That is not unimpressive.
19:24 No, it's not.
19:26 It's quite something.
19:27 That's awesome.
19:28 Let's see.
19:28 I guess I'll start mine really quick.
19:30 I got some quick conference announcements.
19:32 Kenneth, I see you do as well.
19:33 So PyCon Australia just opened their call for proposals.
19:37 So Australia is a beautiful place to be.
19:39 Either maybe you're already there and you just want to go to the conference or you want an excuse to go to Australia.
19:43 Submit a talk.
19:45 That's awesome.
19:45 And then last time I had used about whether the gravitational waves of black holes colliding.
19:53 That research was also done with Python.
19:56 So remember we talked about the black hole picture and all that stuff, Brian?
20:00 Yeah.
20:00 Well, our listeners are awesome because they're like, oh, Michael, did you wonder about this?
20:04 Yes.
20:04 Here's the package they use to discover gravitational waves and do all this amazing science.
20:09 So actually, there's some really cool projects out there.
20:12 And I'll link to a video of someone talking about it.
20:15 So thanks to Dave Kirby and Matthew Feikert both for that.
20:19 And I think it's GWPy.
20:21 Yeah.
20:21 GWPy.github.io is a Python package for gravitational wave astrophysics.
20:27 So detecting when black holes collide and the ripple in space time they make with Python is pretty awesome.
20:32 Yeah.
20:33 I was really surprised to find out that when that code was made available that a request was used for it.
20:38 That's so awesome.
20:39 I have no idea how.
20:40 It doesn't matter.
20:43 It's awesome.
20:43 But it's in there.
20:44 So I was like, yes.
20:45 That is super cool.
20:47 Congrats, man.
20:47 And then finally, another thing that's awesome about our listeners is anytime we mention something, we think it's unique.
20:53 They're like, there's four other ones.
20:54 Here's another one.
20:55 So Bullet, we talked about.
20:57 Cooked input.
20:57 We talked about.
20:58 It's awesome.
20:58 Bullet is super cool for like drop downs inside terminal windows and like nice selections.
21:03 But it doesn't work on windows.
21:05 So someone else, Sander Tunison, sent over questionnaire, which is one that is also compatible for windows, for our windows folks.
21:12 Thanks for putting that in because I need that.
21:14 See?
21:15 You were like the first, one of the very first people to benefit from this podcast.
21:19 I feel the same way.
21:20 Like people are like, oh, you finally, like I benefit from this just like you guys do.
21:24 It's just I have to get there first before we publish it.
21:26 Awesome.
21:27 Awesome.
21:28 Okay.
21:28 Kenneth, what do you got?
21:29 Honestly, I have a few CFPs I wanted to announce.
21:31 One of them is for Pi Colorado.
21:32 It's a great conference.
21:34 It's going to be their first year.
21:35 It's run by a great team, at least.
21:37 It should be a great conference.
21:38 If they are actively looking for people to submit to their CFP, they have not had as many submissions as they would like to so far.
21:44 Bad timing with the conference here.
21:45 They have a great team of people to submit, so if anyone has any talks that they think could be applicable to that event, please submit.
21:54 Pi Ohio also has their CFP open at the moment, and they're looking for people to submit, but they never have a problem with getting too many submissions.
22:01 So I wouldn't rush to that one if you're feeling iffy about it.
22:07 And then the last one is a PiCon remote, which is something that I'm going to be putting on if all goes according to plan with Calvin Spellingman, I believe is how you say his last name, who is from the Pi Tennessee organizers group.
22:20 Him and I are co-chairing.
22:21 That's cool.
22:22 What's that about?
22:22 It's basically a PiCon, but it'll be accessible to people who can't attend PiCon or who can't normally speak at PiCon.
22:29 Is it also virtual or only virtual?
22:31 Only virtual.
22:32 Okay, sweet.
22:33 That's awesome.
22:34 Yeah.
22:34 We're still figuring out what the feasibility of different approaches are, but it'll most likely be live streamed and people will send in videos ahead of time of their talks.
22:43 Okay.
22:44 Unless they're like a keynote speaker or something like that.
22:47 So we're still figuring out the details, but it'll be, it should be good.
22:50 We have a mailing list with like 700 people who have signed up so far.
22:53 So it should be, it should be something we can pull off.
22:57 So if you're interested and want to learn more, you can go to do slash co slash pi con dash remote.
23:03 I know it's not the best URL, but that's the best I can give you right now.
23:07 Awesome.
23:07 Yeah.
23:07 We'll put the link in the show notes.
23:08 People can just click it in there.
23:10 Their player.
23:10 That's awesome.
23:11 All right.
23:12 Well, let's round it out with some, some jokes here.
23:15 Brian, you want to go first?
23:18 We're not doing all the jokes.
23:20 All right.
23:20 We got to go fast.
23:21 We got to go fast.
23:22 Okay.
23:22 So yeah, I'll just pick one.
23:25 I don't know how tasteful this is.
23:27 We'll let it land anyway.
23:28 So Python used to be directed by the BDFL Guido.
23:32 Now it's directed by steering council.
23:34 Guids zero through four.
23:36 Love it.
23:39 Kenneth, you want to do one?
23:40 You got any, what's the difference between a musician and a pizza?
23:43 I don't know.
23:43 You can eat a pizza.
23:44 Pizza can feed a family of four.
23:45 Oh, that hurts.
23:47 I can say that because I've made $25 off of my music so far.
23:50 Beautiful.
23:51 All right.
23:52 I got two, but they're related.
23:53 So I'm going to put them together real quick.
23:54 I think first to kick it off that Ubuntu users are apt to get this joke that I'm about to tell.
24:00 Okay.
24:01 And then the second one, the second one, this is fun.
24:07 I actually, I know Kenneth, you switched over to windows recently, and I'm also kind of a fan of it, even though I spend a lot of time on Mac.
24:13 Still, I like the joke.
24:14 How many programmers does it take to kill a cockroach?
24:17 Two.
24:18 One holds, the other installs windows on it.
24:20 All right.
24:24 Beautiful.
24:24 Well, I think that's probably about it for our show today.
24:27 Kenneth, thank you for coming.
24:28 Brian, thank you as always for being here.
24:30 Yeah, thank you.
24:30 Thank you for listening to Python Bytes.
24:32 Follow the show on Twitter via at Python Bytes.
24:35 That's Python Bytes as in B-Y-T-E-S.
24:37 And get the full show notes at pythonbytes.fm.
24:41 If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
24:45 We're always on the lookout for sharing something cool.
24:48 On behalf of myself and Brian Okken, this is Michael Kennedy.
24:51 Thank you for listening and sharing this podcast with your friends and colleagues.