Transcript #148: The ASGI revolution is upon us!
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:04 This is episode 148, recorded September 11th, 2019.
00:10 I'm Michael Kennedy.
00:11 And I'm Brian Okken.
00:12 And this episode is brought to you by DigitalOcean.
00:14 Check them out at pythonbytes.fm/digitalocean.
00:17 More on what they have to offer later.
00:19 Brian, I feel like Python doesn't ship often enough.
00:24 You know, it's like an 18-month release cycle.
00:27 That's a really long time to wait for these features to come out, you know, especially in the world of Agile and Scrum and two-week sprints.
00:34 Like, a year and a half is a long time to see an idea and have it happen.
00:39 What do you think?
00:39 It's like eons in Internet time, right?
00:41 Right, for sure.
00:43 I'm actually excited about this.
00:44 There's an announcement.
00:46 It's not been announced or decided yet, but there's a PEP, PEP 602, which is under discussion.
00:52 We've got links to both the discussion and the PEP.
00:55 But it's to bring an annual release cadence.
00:59 So, every year, every 12 months instead of every 18 months.
01:03 And there's some specifics around it, which are kind of neat.
01:07 It does not mean that people will develop each feature, each release in 12 months.
01:12 It's actually a 17th month cycle, which is weird.
01:16 It's interesting.
01:17 It totally makes sense when you read it.
01:19 My first thought was, how do they fit 17 months into 12 months?
01:22 You go really, really fast, and then you change a little bit of space time.
01:25 There's five months of unversioned overlap time where some of the new features can get worked on, and they're not doing releases.
01:31 Yeah, that's really interesting because they have a cool graph in here that shows them overlaid.
01:37 And actually, all the releases laid out.
01:39 I don't know.
01:39 It's about a third, a little more than that down the page that we're linking to.
01:44 And it shows, okay, we're going to work on the alpha features, which is creating the feature.
01:48 And then beta is kind of where it stabilizes and gets cleaned up.
01:50 But as it switches to beta for one, it kicks off for development, maybe more a little bit later.
01:56 But there's like this overlap, right, where you stop working on one, and you also concurrently start adding new features.
02:01 That's what happens in software projects anyway.
02:04 Like in a commercial world, you're wrapping up one release while people are starting to work on features for the next release anyway.
02:12 It's just this reality anyway.
02:15 I think it's good.
02:16 There's some rationale and goals, smaller releases, less stuff within each release.
02:22 One of the big ones is there's often a rush to get stuff into the first beta because if it didn't get in, it's not going in this one, and it has to wait 18 months.
02:31 And waiting a year, it's only six months difference, but that's a big difference.
02:37 There was also some weirdness with how, I mean, there's annual sprints and PyCon, which is about the same time every year.
02:45 But having the release cycle be sometimes offset by six months every time just was weird.
02:53 Yeah, it means like the sprints can more carefully align with, say, the alpha stage or something of the next version, right?
03:00 They time it right.
03:01 There's also a mention in the non-goals section about switching to an annual release calendar allows for a more natural calendar version.
03:09 So, for example, Python 3.20 might be the one released in October 2020.
03:18 The one, Python 3.23 would be the one in October 2023 and things like that.
03:25 That might be nice.
03:26 Yeah, but we're only up to like 3.8 now.
03:28 How did we get from 3.8 to 3.20?
03:30 Yeah, switching.
03:31 Well, it goes 3.9 and then 3.20.
03:33 That's how you count.
03:34 Yeah.
03:35 It's pretty good.
03:36 Yeah, so this is proposed by Lucas Lenga, and he's currently the release manager for Python.
03:41 So, he's the one with all the skin in the game.
03:43 And yeah, I think this is nice.
03:46 I've always thought it was weird to have such a long release cycle.
03:49 So, I'm happy to see this.
03:50 I mean, there's risks and downsides, of course, that would be on the other side.
03:54 Also, with that same graph, you notice that there's five versions supported at a time instead of four.
04:02 So, there's the test matrix of people doing distributions.
04:05 They got to test five versions instead of four if they're testing everything.
04:09 It is what it is.
04:11 Yeah.
04:12 It's interesting.
04:13 There's some rejected ideas as well.
04:15 Keep the current 18-month release cadence.
04:17 This is rejected.
04:19 We don't like it.
04:20 And double the release cadence to achieve nine months between major versions.
04:24 But it's too irregular and too short.
04:26 And just slow down releases and don't freeze them at beta one.
04:30 Yeah.
04:30 I like it.
04:30 It's pretty good.
04:31 I mean, it wasn't even considered to have weekly release cycles.
04:35 I'm not sure why.
04:36 Yeah.
04:36 We just ship whatever is on the master branch.
04:39 Yeah.
04:40 Daily.
04:40 Nightly builds.
04:41 Nightly builds.
04:42 Might hold off on that.
04:43 So, this next thing I want to talk about, it's pretty awesome, Brian.
04:47 Is it?
04:47 Yeah.
04:48 It's called Awesome ASGI or ASGI.
04:52 I don't know.
04:52 I'm not sure what the phonetics of ASGI.
04:56 But we have WSGI, which are the WSGI servers.
05:00 This is like the traditional web service gateway interface where basically all the different web frameworks like Django, Flask, Pyramid, and so on implement that.
05:10 And then all the servers like MicroWSGI and G Unicorn and whatnot support that.
05:15 And that's like how they click together.
05:17 Right?
05:17 That's their docking mechanism.
05:20 And WSGI is broken.
05:22 Fundamentally irreparable.
05:25 Broken for building asynchronous web apps.
05:29 That's unfortunate because async and await and async.io is most important on the web server.
05:34 Right?
05:35 Like what do web servers do?
05:36 They wait on databases.
05:37 They wait on the network.
05:38 They wait on third-party APIs like Stripe.
05:41 They just wait.
05:42 It's mostly what they do.
05:43 Yeah.
05:44 And so, if you could let your server do other stuff while that's waiting, you could massively amplify the concurrent number of users for the same amount of hardware and things like this.
05:53 So, enter ASGI.
05:55 I'm going to go with ASGI for now until somebody shows me the right way to say it.
05:58 So, ASGI is a new interface for this successor to WSGI.
06:04 And it came out of Django Channels, which is a way to add some asynchronous behavior to Django.
06:12 And it's also got boosted by things like Starlit and UVicorn and so on.
06:18 So, what this is it's an awesome list for all sorts of things around asynchronous web Python things.
06:25 So, we have async web apps, async web frameworks, async web servers like UVicorn and so on.
06:34 So, if you are wanting to build some sort of high-load, highly scalable website and you want to figure out what should I be using, it's super confusing right now because things come and go so fast.
06:47 Like, Jepronto was really this big thing until it wasn't.
06:51 Stopped getting worked on it, right?
06:53 Like, the shelf life is no longer 10 years.
06:56 It's maybe, you know, a couple months.
06:57 So, knowing what's happening in this space is pretty hard.
07:01 There's some good frameworks talked about here.
07:03 Bocadillo, Channels, FastAPI here is really good.
07:07 Core is a solid one for converting Flask to async.
07:10 Responder, Starlit.
07:12 Starlit seems to be the foundation of almost everything these days.
07:15 So, it's really probably the most important here.
07:18 But a nice grouping of all these various things that you might want to work with.
07:22 Yeah, and they also want to try to do more than just applications but also libraries and middleware items as well.
07:28 Yeah, so this is not as popular as, say, like, just a straight awesome Python list or Mamu Tashemi's awesome apps list or something like that.
07:37 But I do think it's important and, you know, hopefully people go out there.
07:40 If they have some ideas, they can contribute some projects to the list.
07:43 It's not too hard.
07:44 Yeah, definitely.
07:45 All right, what's next?
07:46 Well, there's another awesome – a couple other awesome projects, but they're not awesome lists.
07:51 Two awesome projects I want to talk about, sort of, are Jupyter and Pangio.
07:56 This comes up because there was an announcement titled that Jupyter meets the Earth, which is kind of fun.
08:05 Plus, they're both circular logos.
08:07 The Earth has a logo.
08:09 It looks like the Earth.
08:09 Yeah.
08:10 This is a write-up about a really cool announcement that the National Science Foundation is giving $2 million of funding over three years
08:21 as part of an EarthCube grant program to go towards Jupyter infrastructure and Jupyter and Pangio.
08:29 And it's – hopefully it will be pretty cool.
08:31 It's actually a really neat write-up talking about how the adoption of open languages like Python and, on top of that, Jupyter and others,
08:40 have really been taken up by a lot of different science backgrounds.
08:44 And we really need some more Earth-based science to utilize this.
08:50 And so this will help it out quite a bit.
08:52 It's kind of neat.
08:52 This is super cool.
08:53 And it's really great to see them getting so much funding.
08:55 You know, Jupyter is definitely doing well in the funding space.
08:59 And I didn't know where Pangio was before, but it sounds like this puts them really solidly in the stable and growing, getting lots of support space.
09:07 One of the things I love about Jupyter and Python being the center of around and some of the data science is the openness.
09:15 So people are really pushing for open data as well so that anything that gets published can be seen by other people.
09:22 I think that pushes science forward really far because just even people in their bedroom might have a –
09:29 a cool idea with the data and find some things that other people can't and help contribute.
09:34 It's really kind of incredible to be part of this.
09:36 Yeah, absolutely.
09:37 And one of the use cases is for climate data, climate change studies, and things like that.
09:43 So, you know, definitely need some attention on that.
09:47 I'm sure there's plenty already, but more is good here.
09:51 So this write-up is by Lindsay Hagee and Fernando Perez.
09:55 And just want to mention, Lindsay was on Talk Python quite a while ago talking about Pangio and her earth science research she's doing.
10:04 So geoscience, things like that.
10:06 So if you want to dive deeper, check that out.
10:07 Yeah, very cool.
10:08 Yeah, for sure.
10:10 Now, before I spring some pretty big news on people, let me tell you real quick about DigitalOcean.
10:15 So all of our infrastructure runs on DigitalOcean.
10:18 They've been big supporters of the show.
10:19 Their newest thing is that they just launched two new things as a service.
10:24 So you can, instead of have servers to manage, you just check a box and now you have services at your disposal.
10:30 Those are MySQL and Redis.
10:33 So if you want to use MySQL or Redis, you can now start doing that over at DigitalOcean.
10:38 Previously, they had Postgres as a service, and Postgres is very popular in the Python space.
10:44 But, you know, MySQL and Redis also are as well.
10:46 And Redis kind of plays an alternate role anyway.
10:49 It's, you know, a traditional relational database caching and things like that.
10:53 So check that out, along with a bunch of other good things.
10:57 Pythonbytes.fm slash DigitalOcean.
10:59 Now, I told you about the cool, awesome list, right, Brian?
11:02 The awesome ASGI, I'm saying?
11:05 Yes, asynchronous is here to stay.
11:07 It is here to stay.
11:08 Now, there is a very notable absent framework in there.
11:13 Talked about Quart.
11:14 That's kind of the async version of Flask, if you will.
11:17 There is some talk that maybe those two projects will work together, just make Flask itself asynchronous.
11:22 But that's a different story.
11:24 But there was nothing in there really for Django.
11:26 I mean, there's channels, but that's a separate project, right?
11:28 Yeah.
11:29 Until now.
11:30 Yeah.
11:30 So tell me.
11:31 I'm excited.
11:32 What's going on?
11:33 Yeah.
11:34 So I don't know exactly how recently this was announced because there's no dates on the announcement, which makes it tough to know.
11:42 But Django 3.0, all the details for its roadmap are now out.
11:47 So the release notes for Django 3.0 are here.
11:50 It's expected that Django 3.0 is going to be released December 2019.
11:55 So that's like a Django Christmas present or whatever, something for the holidays, right?
12:00 Coming soon.
12:01 And there's tons of changes, right?
12:03 About, for example, Django 3.0 only supports Python 3.6 and above.
12:08 They are dropping support even for 3.5.
12:11 And if you want 3.5 support, you have to go back to 2.2.
12:14 And of course, 2.2 or 2.0 already dropped support for legacy Python.
12:18 So you've got to even go farther back to get way back there.
12:21 You don't want to go back there.
12:22 No.
12:22 But that's all good.
12:23 There's a bunch of other changes, Marriott and DB support and various things.
12:28 You can check that out.
12:29 But the big news, I think, here is ASGI support for Django 3.0.
12:35 They say Django 3.0 begins our journey to making Django a fully async capable, to making it fully async capable by providing support for running it as an ASGI app.
12:47 And that doesn't mean they're dropping WSGI support.
12:50 They're expecting for these to sort of pair together, as you might expect, right?
12:54 A lot of these can be run in either way.
12:56 But you have to run it on an ASGI server to get the async features, as we kind of hinted at before.
13:01 Pretty cool, huh?
13:02 Yeah, that's very cool.
13:03 Yeah, so you don't need to change anything about your code, but you'll be able to start writing asynchronous methods.
13:08 So when you're waiting on that database or that web service, you can now wait on 1,000 of them instead of one in the same process with about the same amount of work,
13:15 which sounds like a pretty awesome change for almost no effort.
13:18 Well, you said you don't have to change anything.
13:20 Does Django have an upgrade migration path for people to upgrade?
13:24 Well, I think you just have to start rewriting your view methods.
13:27 You've got to add the async keyword, async def instead of def, and you've got to start using async libraries.
13:32 Okay.
13:33 It's going to be interesting, the database story.
13:35 Like, Django has a built-in ORM, and it says things like there are some side effects to be aware of.
13:40 Like, Django is now aware of the asynchronous event loops and will block you calling code marked as async unsafe, such as ORM operations.
13:50 So maybe, I don't know what the story is around the ORM and async.
13:54 Maybe it's not totally clear, but it seems like a really good place to actually have async, because the thing you wait on most is databases, so you should probably be able to wait on them.
14:02 Yeah, and I actually am also interested in the MariaDB.
14:05 I hadn't really got into that before, so that's kind of an interesting side story as well.
14:09 Yeah, absolutely.
14:11 Anyway.
14:12 So there's all sorts of stuff we're linking to in Django 3.0, but I think the big news is front and center async support right in the main project.
14:21 And I wonder if the drop of 3.5 is because people like F-strings.
14:25 Yeah.
14:25 Yeah, I think so.
14:27 Yeah, it's like, we can't not use F-strings.
14:30 I want to run Flint on this project, but I can't because it might run in 3.5.
14:34 Let's make that a possible.
14:35 Yeah, yeah, okay.
14:36 I've heard about this possibility of different software engineers having different levels of effectiveness.
14:43 And oftentimes, this is referred to as the 10x engineer, right?
14:46 This special person that makes all this money and actually makes the startup do its thing or whatever.
14:51 John Carmack and Doom.
14:53 So you found another kind of engineer?
14:57 Yeah, I really like this list.
14:59 I found the 1x engineer.
15:01 The 1x engineer, awesome.
15:02 What constitutes a 1x engineer?
15:04 Well, there's a whole list and you can contribute it because it's based on a GitHub repo.
15:09 I think it's definitely a fun take on the 10x thing.
15:13 But if you look at these lists, I think some of these are really good.
15:17 And I think actually should have been like something like maybe 3x or 4x or 8x or something.
15:22 I'm not sure how high this scale goes anyway.
15:24 But here's a few of them.
15:26 1x engineer has a life outside of engineering.
15:29 Writes code that others can read.
15:32 Doesn't act surprised when someone doesn't know something.
15:35 Asks for help when they need it.
15:37 Is able to say things like, I don't know.
15:39 Constructively participates in code reviews.
15:42 Shares knowledge.
15:44 Never stops learning.
15:45 So I like that because obviously they listen to Python Bytes, talk Python, and test in code.
15:50 Absolutely.
15:50 Yeah.
15:51 Has unproductive and productive days.
15:53 Fails from time to time.
15:55 Doesn't hate on framework Y when working with framework X.
15:59 Anyway, we pulled out a handful of these to put in the show notes.
16:01 But the list is pretty long.
16:03 And I like it.
16:04 It's kind of a neat, fun take on just basically, this is what we expect from everybody.
16:09 Very nice.
16:10 It says, I've never heard of that in lieu of nodding and pretending.
16:13 And also, is willing to have a brightly colored desktop background.
16:18 Very nice.
16:19 Yeah, I think the new 10X engineer has pink, not black.
16:22 That's right.
16:23 Now, this is actually, this is really great.
16:25 I like it.
16:25 It's fun.
16:25 And it's written in very fun fonts and style, right?
16:29 There's a button there that says you can go away from the fancy style.
16:33 Nice.
16:35 What is that font?
16:35 It's like, I don't know.
16:37 I think it's Atari 2600 font or something like that.
16:40 Maybe Commodore 64 font.
16:42 It's beautiful.
16:43 Yeah.
16:43 At least it's not Comic Sans.
16:45 Nice.
16:45 Yeah, for sure.
16:46 Thank goodness.
16:47 Or Blinky.
16:48 Okay, now, there's a topic that I think is important, Brian, that we should touch on.
16:53 Will you just tell me if we've spoken about this before?
16:55 It has to do with Python 2 going out of the world here.
17:00 Sunsetting Python 2.
17:01 Oh, yeah.
17:02 Have we spoken about Python and legacy Python?
17:04 Maybe we haven't.
17:05 So if we haven't, people should get onto the Python 3 thing.
17:08 That's right.
17:08 Now, what we're linking to is an official document that formalizes the sunsetting of Python 2.
17:16 So this is over on python.org slash doc.
17:18 Just sunset Python 2 with dashes.
17:20 I'll link to it.
17:22 And it's sort of a Q&A.
17:24 Like, what if I didn't know Python 2 was going away?
17:27 What should I do?
17:28 And so on.
17:28 So let me just talk to you real quick about this.
17:31 This is something good you can share with people who are like, wait, why is our Python old?
17:35 What are you telling me?
17:36 So it says, officially, January 1st, 2020 will be the last day or the day that Python 2 is sunsetted.
17:43 I thought it would be really great.
17:45 New Year's resolution, write no more Python 2 code, I guess, is the way to interpret this.
17:50 And it says, you know, Q&A, like, why are we doing this?
17:54 We need to sunset Python 2 so that we can help Python users.
17:59 We want to add new features to Python 3 and stop supporting Python 2, even though we're not adding features to it.
18:05 And it says, you know what?
18:06 Back in 2006, like, long ago, we started working on Python 3.
18:12 And in 2008, we said 2015 was the end of Python 2.
18:16 That didn't work out so well.
18:17 So now we're really meaning it 2020.
18:20 Yeah.
18:20 And then it says, how long is it until the sunset date?
18:23 The Python clock will tell you, it says, which is three months, 20 days, 10 hours, 31 minutes, and 37 seconds.
18:29 That's less than four months.
18:31 That's coming up.
18:32 This is for real.
18:33 Yeah.
18:33 It's even faster if we hold off releasing this episode.
18:37 That's right.
18:37 It's already going to be out of date.
18:38 It says, what will happen if I do not upgrade by January 1st?
18:44 Oh, I'm going to come to your house and ridicule you.
18:47 No.
18:47 That's right.
18:48 Yeah.
18:48 You'll be mocked by all your peers.
18:49 No.
18:49 It says, look, if people find catastrophic security fixes in Python 2 or software written in Python 2, most volunteers will not help you.
18:57 You know, over time, you'll find it harder to hire people.
19:00 You'll find it harder to use modern libraries and so on.
19:02 So probably not the world is going to end straight away, obviously.
19:06 But, you know, you're going to be in quicksand at some point, right, to some degree.
19:11 It says, okay, fine.
19:13 I wrote some code in Python 2.
19:15 How should I port it to Python 3?
19:16 It says, please.
19:17 Please read the official porting guide here.
19:20 And finally, I didn't hear anything about this until just now.
19:24 Where was it announced?
19:25 Well, we talked about our software conferences, the Python announcement mailing list, Python blogs, textbooks, technical articles, social medias, and companies that sell Python support.
19:35 Oh, and podcasts.
19:37 Does it say podcast?
19:38 No, I've amended it.
19:40 Yeah.
19:40 Yeah.
19:41 I believe we have talked about it.
19:42 Now that I've gone through it, I do remember speaking about legacy Python before.
19:45 Yeah, we have.
19:46 And then the last question of how can I make sure that I don't miss stuff like this again?
19:50 Listen to Python Bytes.
19:52 That's how.
19:52 That's right.
19:53 That's the official recommendation from the PSF, I'm sure.
19:56 No, it's a...
19:57 Or mailing list, I guess.
19:58 But no, I do think, I mean, we cover, we try to cover this kind of stuff for sure.
20:02 Yeah.
20:02 Duh.
20:04 Yeah.
20:04 So there is the official sunsetting details from the PSF and the core developers.
20:09 It looks good to me.
20:10 Yeah.
20:11 Cool.
20:11 All right.
20:11 Well, that's it for our main items.
20:12 What else you got you want to throw out there?
20:14 Well, there's two big newses and yours is definitely going to happen and mine is hopefully going to happen.
20:19 Mine is in the past, so it is more likely to have happened.
20:23 Okay.
20:23 So tell me about yours.
20:24 All right.
20:24 We have been working, we, me, and a bunch of other folks have been working with the Humble Bundle folks
20:31 to release another Python Humble Bundle.
20:33 Not just a bunch of books like an O'Reilly bundle thing, but a bunch of cool tools and library courses,
20:39 everything.
20:41 Right.
20:41 So we just launched the Humble Level Up Your Python Bundle.
20:45 Bundle.
20:46 And yeah, there's tons of good stuff, right?
20:49 There's three courses from Talk Python Training.
20:51 There's the Code Challenges from Python Bytes.
20:54 There's some PyCharm stuff.
20:55 There's books from Dan Bader, from Matt Harrison.
20:59 There's stuff from Trey Hunter.
21:01 All sorts of good things in there.
21:03 So be sure to check that out.
21:04 You can get it much, much cheaper for a very short time.
21:10 So probably, I guess a week, a week to two left from, if you listen to this, the moment that we released it.
21:15 So there'll be some time, but not a lot.
21:18 And there's like $1,000 worth of stuff for $15 or something like that.
21:22 Seems like a good deal.
21:23 Yeah.
21:23 Yeah.
21:24 It seems great.
21:24 I see this next thing that you're talking about.
21:26 You're trying to work on my social life, aren't you?
21:28 Get me out of the house.
21:28 Yes.
21:29 But I want to make it really easy on me.
21:32 This next one is all about me.
21:34 Well, it's about you too and everybody else in Portland, but mostly about me.
21:39 I thought it'd be cool.
21:40 There's a Python meetup every month downtown Portland.
21:43 And I don't live downtown Portland.
21:45 I don't work in downtown Portland.
21:47 So wah me.
21:48 But I'm going to put my, I guess, effort where my mouth is and start a west side Portland Python meetup.
21:57 Yay.
21:57 That's awesome.
21:58 Yeah.
21:58 Because to get down to the east side of Portland, if you're out somewhere by Intel or Nike or one of these, a lot of the tech companies here in town, it's like an hour.
22:08 Just one way.
22:09 It's a tremendous amount of traffic you've got to go through.
22:11 So this will definitely open up a whole other angle for meetups.
22:15 Yeah.
22:15 And I'm not trying to like, you know, steal their thunder or something.
22:18 I've talked with the Python meetup dude from Portland and working together to make sure we don't overlap it.
22:25 So I think we're shooting for like the second week in the month because they have things on the third and fourth.
22:32 There's nothing there yet.
22:33 But if by the time this comes out, there will be.
22:36 I registered pythonpdx.com.
22:38 That's where we're going to announce stuff.
22:40 Hopefully for October.
22:42 But if not, then we'll get it done for November.
22:46 But I'm really shooting for October.
22:48 This is made possible because Roden Schwartz, the company I work for, has this awesome room that would work great for the meetup.
22:55 And they've agreed to let us use it.
22:57 So that's all.
22:58 That's great.
22:58 Yeah.
22:59 Sounds great.
22:59 Yeah.
23:00 Sounds great.
23:00 That's all I got.
23:01 But I don't have any jokes.
23:02 We don't have any jokes.
23:04 Hold on.
23:04 I mean, we could just stare at each other for a few minutes.
23:07 But it's not fun.
23:08 Ooh, neat.
23:10 Why did the angry function exceed its call stack size?
23:12 I don't know.
23:13 Why?
23:13 It got into an argument with itself.
23:15 What's the object-oriented way of becoming wealthy?
23:20 I'm not sure.
23:21 Inheritance.
23:22 Oh, yeah.
23:22 Definitely.
23:23 Of course.
23:24 All right.
23:25 Well, not terribly funny, but these are some good programming dad jokes.
23:29 Yeah.
23:30 Yeah.
23:30 Yeah.
23:30 So.
23:31 Nice.
23:32 All right.
23:34 Well, thanks for being here as always, Brian.
23:36 All right.
23:36 Thank you.
23:37 Bye.
23:37 Yeah.
23:37 Good to chat with you.
23:38 Bye.
23:38 Thank you for listening to Python Bytes.
23:40 Follow the show on Twitter via at Python Bytes.
23:43 That's Python Bytes as in B-Y-T-E-S.
23:45 And get the full show notes at Pythonbytes.fm.
23:49 If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.
23:53 We're always on the lookout for sharing something cool.
23:56 On behalf of myself and Brian Okken, this is Michael Kennedy.
23:59 Thank you for listening and sharing this podcast with your friends and colleagues.