#113: Python Lands on the Windows 10 App Store
Sponsored by https://pythonbytes.fm/digitalocean
Brian #1: Advent of Code 2018 Solutions
- Michael Fogleman
- Even if you didn’t have time or energy to do the 2018 AoC, you can learn from other peoples solutions. Here’s one set written up in a nice blog post.
Michael #2: Python Lands on the Windows 10 App Store
- Python Software Foundation recently released Python 3.7 as an app on the official Windows 10 app store.
- Python 3.7 is now available to install from the Microsoft Store, meaning you no longer need to manually download and install the app from the official Python website.
- there is one limitation. “Because of restrictions on Microsoft Store apps, Python scripts may not have full write access to shared locations such as TEMP and the registry.
- Discussed with Steve Dower over on Talk Python 191
Brian #3: How I Built A Python Web Framework And Became An Open Source Maintainer
- Florimond Manca
- Bocadillo - “A modern Python web framework filled with asynchronous salsa”
- ”maintaining an open source project is a marathon, not a sprint.”
- Tips at the end of the article include tips for the following topics, including recommendations and tool choices:
- Project definition
- Marketing & Communication
- Community
- Project management
- Code quality
- Documentation
- Versioning and releasing
 
Michael #4: Python maintainability score via Wily
- via Anthony Shaw
- A Python application for tracking, reporting on timing and complexity in tests
- Easiest way to calculate it is with wily https://github.com/tonybaloney/wily … the metrics are ‘maintainability.mi’ and ‘maintainability.rank’ for a numeric and the A-F scale.
- Build an index: wily build src
- Inspect report: wily report file
- Graph: wily graph file metric
 
Brian #5: A couple fun awesome lists
- Awesome Python Security resources
- Tools
- web framework hardening, ex: secure.py
- multi tools
- static code analysis, ex: bandit
- vulnerabilities and security advisories
- cryptography
- app templates
 
- Education
- lots of resources for learning
 
- Companies
 
- Tools
- Awesome Flake8 Extensions
- clean code
- testing, including 
- flake8-pytest - Enforces to use pytest-style assertions
- flake8-mock - Provides checking mock non-existent methods
 
- flake8-pytest - Enforces to use 
- security
- documentation
- enhancements
- copyrights
 
Michael #6: fastlogging
- via Robert Young
- A faster replacement of the standard logging module with a mostly compatible API.
- For a single log file it is ~5x faster and for rotating log file ~13x faster.
- It comes with the following features:
- (colored, if coloramais installed) logging to console
- logging to file (maximum file size with rotating/history feature can be configured)
- old log files can be compressed (the compression algorithm can be configured)
- count same successive messages within a 30s time frame and log only once the message with the counted value.
- log domains
- log to different files
- writing to log files is done in (per file) background threads, if configured
- configure callback function for custom detection of same successive log messages
- configure callback function for custom message formatter
- configure callback function for custom log writer
 
- (colored, if 
- Michael: My webcast on async, Jan 24, 11am PT
- Michael: Watch your YAML!
Joke: >>> import antigravity
Episode Transcript
Collapse transcript
00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
00:04 your earbuds. This is episode 113, recorded January 16th, 2019. I'm Michael Kennedy.
00:10 And I'm Brian Okken.
00:11 And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm
00:16 slash DigitalOcean. Get $100 free credit for new users. Brian, how you been?
00:20 I am great.
00:21 Nice. Me too.
00:21 Cold though.
00:22 Yeah. I don't know what happened. It's like winter, mid-January. I guess it's supposed to
00:26 be cold. But yeah, it's cold. Maybe. My daughter said this morning, like, when are we going to get snow? And I said, well, I hope never because I don't have snow tires
00:34 yet. I just bought snow tires for my car so I can drive up to the mountains and go skiing real easy.
00:38 So I'm ready. It can snow whenever. But yeah, if it's not going to snow, let it be a little warm.
00:43 So speaking of wintry type things, advent calendars, those are a type of things that folks use a lot
00:50 in December, right?
00:51 Yeah. And actually, this last December, I totally meant to do the advent of code thing,
00:56 but I didn't. And also one of the things I'm doing this upcoming year is I'm trying to,
01:01 I read a great article about practicing programming. I want to try to do, incorporate more practice
01:07 outside of just doing my own work at work, but practicing extra things. And there's challenges
01:14 and code things and little snippets and everything. But sometimes I just want like 20 minutes of reading
01:19 reading something. And this is great. So I ran across this. It's from Michael Fogelman. It's the
01:26 advent of code 2018 solutions. And it's pretty much he just talks through all the different,
01:33 he went through all of the advent of code for 2018, and then he solved them in Python. And a lot of people
01:39 have posted their solutions on GitHub. This is a nice write up that he has to describe how he solved
01:44 them. And there's some nice code comments. It's really put together well.
01:48 Yeah, I like it. You just sort of cruise through and see the problem, see the solution,
01:51 see what you think. I find looking at other people's solutions of fairly simple programs,
01:58 especially compared to your own. It's a pretty interesting experience. Like, oh yeah,
02:02 I totally solved this. And then you look like, oh wait, they did that in two lines and mine took 10.
02:07 Or why did they do it that way versus this? It's pretty cool.
02:10 Yeah. Looking over, reading code is one of the ways to get better. So it's a good way to practice
02:15 is reading other people's code.
02:16 Yeah. And it's not like read the Django source code or read the request source code. And it's like a huge
02:22 undertaking, right? These are 10, 2025 lines of code.
02:25 Yeah. Yep. Definitely. So I dropped this in because I think I'm going to start
02:30 trying to incorporate, sprinkle in some reading, reading of these in with my daily practice.
02:35 Yeah. I think that's a good idea. Do you know what the most popular platform that Python runs on
02:39 is, Brian?
02:40 Probably Macs. Mac laptops.
02:42 A lot of Mac, a lot of Mac laptops, a lot of stickers on them. That's what you'd believe if you
02:47 were at a conference like PyCon or something, everyone's running around with their Apple logos glowing or
02:52 sadly no longer glowing on the new Macs. But nonetheless, it feels like when you're in
02:57 those environments, it's mostly Mac and some Linux and obviously server side Linux. But really,
03:03 a lot of the surveys say most of the users, you know, by a pretty wide margin are actually on
03:10 Windows. So we're talking students, we're talking corporate environments, a lot of folks who don't
03:16 show up necessarily carrying those around at conferences, but that's where it is, right?
03:21 Yeah.
03:21 So the big news is that the PSF broadly and specifically Steve Dower, one of the core devs,
03:28 whose works at Microsoft, has released Python 3.7 as an official app on the Windows 10 store.
03:36 Nice.
03:37 So there's all sorts of stuff that is really awesome from that. So that means you can just
03:42 go to your Windows store and search for Python and say, yeah, I want that. You can actually already
03:48 do that for like Ubuntu subsystems and stuff. So you can do that for Linux distribution, surprisingly,
03:52 and run those as like subsystems in Windows, but not Python. And some of the stuff that's really cool is
03:58 it automatically takes care of a couple of problems that were incompatibilities between Windows and the
04:06 other operating systems. So for example, Python 3 is a command in the Windows 10 app store version,
04:13 but not the one you actually install separately. So now if you see instructions like type Python 3,
04:17 this, that, like that now works on Windows 2 also.
04:20 That's nice.
04:21 Yeah. So it's a little more similar. It automatically puts that stuff in the path. I believe the place
04:27 where you pip install stuff no longer requires admin access to do it because it's under your user
04:33 profile as part of the store stuff. So a whole bunch of good things.
04:35 Have you talked to anybody to find out when we're going to get to the point where
04:38 the default Python is going to be Python 3 anyway?
04:41 That would be sweet, wouldn't it? You know, all the stuff I've seen about it is like,
04:46 it would be great, but it also caused a lot of problems.
04:48 Yeah.
04:49 We saw that Red Hat Enterprise Linux is actually moving away from having a Python command at all.
04:55 So now it's either Python 3 or Python 2 and you have to be super explicit everywhere.
04:59 So I would love to see that, but I don't see it. On my systems, Python means Python 3 because I've
05:06 changed the path around. So that works that way, but not everywhere, you know?
05:10 Yeah. You recently talked about this and a lot of other things on Talk Python, right?
05:15 Yeah. I had Steve Dower come over onto Talk Python and talk about his retrospective of Python's
05:22 journey at Microsoft, which is actually really interesting. It sort of matches the open source
05:28 journey from a very closed source company to way more open source. And there's a lot of cool stuff
05:32 going on there. They have a ton of core developers working at Microsoft, actually. It's pretty neat.
05:37 Yeah. That was a really interesting conversation. I like that.
05:39 Yeah. Thanks. So there is one limitation on the Windows Store version of Python that maybe is
05:44 worth throwing out there while we're talking about it is they don't have full write access to shared
05:49 locations, like for example, the registry or SQL and backslash program files or stuff like that.
05:55 Right. So it's kind of only has access to your user profile stuff, you know, whatever you can do
06:00 without raising your permissions at UAC stuff. So that's a limitation that you may run into
06:06 because the Windows Store apps are more locked down than regular apps. But still, I think this is
06:11 super cool. You can go and just say, hey, you don't need to be an admin. You just go to your
06:14 Windows Store, you click this little button and you also have Python 3 as a command. It's quite nice.
06:19 Can you write stuff that's outside of your little environment? Not write stuff, but read it.
06:23 Yeah. I'm pretty sure you can. Like you could read the registry. I would think things like that,
06:27 whatever you would be able to do without that little, this program would like to use admin rights.
06:32 Yes, no dialogue pop-up. I suspect you'd be able to do. Yeah.
06:35 I think that's a good idea anyway. So it's going to be in the App Store.
06:38 Yeah, exactly. So, you know, I would actually love to see that on macOS, right? If Python 3 was an
06:44 option on macOS, because the auto-updating feature is pretty cool. Like you just wake up one day and
06:48 boom, you have the next version of Python. Of course, that could cause its own problems,
06:52 but it wouldn't be bad.
06:53 Python 5? What's that?
06:55 Oh my goodness. It's amazing and nothing works anymore. What happened?
06:59 No, that's pretty cool though. I'm happy to see it getting some serious attention over there.
07:04 Yeah. Definitely. All right. Well, when's next?
07:06 There's a project so new that it like came in in November this last year. It's a project called
07:11 Bocadio.
07:12 Yeah, that's how I would say it as well. Yeah. Bocadio.
07:15 Yeah.
07:16 Yeah, I think so.
07:16 Tagline is a modern Python web framework filled with asynchronous salsa. But the,
07:21 I'm not really going to talk about that. I'm going to talk about article that the,
07:24 the maintainer, it's a four month banca wrote an article called how I built a Python web framework
07:30 and became an open source maintainer. And it's this really fascinating article talking about pretty
07:37 much what he went through. He knew that there were a lot of other web frameworks already,
07:41 but he, he built this to try to learn the internals of how to build a web framework and then just did it in
07:46 the open. But there's some really great advice. One of the things he credits from somebody else
07:51 called Funky Bob is reinventing the wheel is an awesome way to learn. And sometimes what you learn
07:57 is just how much are your existing frameworks are doing for you. I thought that was cool.
08:02 That was very cool.
08:03 This thing went from like just inception to building it, to putting up docs and getting
08:09 extra maintainers in like the course of a month in November. And now it's, it's still going,
08:15 but there's like one of the discussions in the article is talking about how he tried to put as
08:20 much in the read me as possible right off the bat, like a change log and contributing guidelines and,
08:26 and how to work it and everything. But the read me got huge. So he, that migrated to
08:32 a GitHub pages, static site generator doc site. And then also one of the things is,
08:40 he had all of his to do items of what he wanted to work on next in a Trello doc in Trello,
08:45 but nobody else can see that. So he moved, Trello issues to GitHub issues.
08:50 And this process of trying to make, do a new project in a way that is open and encouraging other
08:57 people to help out. And then at the end of the article, it goes through, I'm not going to go through
09:01 all of these, but there's a whole bunch of tips on what to do with the project to make it encourage
09:07 other people to get involved. And this is like a goldmine of information for people wanting to start
09:12 an open source project.
09:13 Yeah. If you're thinking about an open source project or how to make it grow, there's, you're
09:18 right. There is an incredible amount of tips. I mean, there's probably 45 specific things like
09:23 this helps, this helps, this helps, right? So that's, that's really awesome.
09:27 Yeah. If all this information at the bottom, he could have written, written a book on this.
09:32 and maybe he will, but yeah, maybe he will.
09:33 But thanks, Floremund for putting this together.
09:36 Yeah, it looks great. And the framework looks pretty nice as well. I like it. I feel like a lot
09:41 of these web frameworks are like slight derivatives of the Flask API. They seem to all be centering
09:48 around Flask for some reason, but you know, Flask is pretty good. So that's cool.
09:52 Yeah.
09:52 Speaking of cool, I heard Kubernetes is cool. Kelsey Hightower told us it was,
09:56 and definitely showed us a cool demo at a PyCon.
09:59 Yeah. I believe anything Kelsey says.
10:00 Yeah, for sure. So Kubernetes is a way to basically orchestrate containers, right? Often you don't want
10:07 to run one container. You want to run multiple ones, one with a database, a couple of web front ends,
10:12 things like that. And it's really nice way to like do zero downtime deployment on top of that and so on.
10:18 So DigitalOcean, who's sponsoring the show, of course, has just officially publicly released,
10:25 no longer preview status, their DigitalOcean Kubernetes service. So it's like a managed service
10:31 and you can basically sign up for it and configure a Kubernetes cluster in a couple of seconds and
10:39 provision it and log in within a couple of minutes. So it's super easy to scale. You take inbound traffic
10:45 and just access your data over block storage, pass it through your load balancers. It's all great.
10:51 So they also say they saw a 2.4 times, not percent, times better price to performance compared to other
10:59 providers. So I can definitely believe that DigitalOcean is awesome. So anyway, if you're thinking about this,
11:05 check them out at pythonbytes.fm/DigitalOcean, get $100 free credit for new users and try your hand at some
11:12 Kubernetes clusters. Nice. Yeah, indeed. You could even probably, you know, serve up Bocadio on Kubernetes.
11:19 That'd be fun. Yeah. Cool. Well, one thing that we talked about recently, and so this is a little bit of a
11:26 follow-up is the maintainability score. Do you remember what we were talking about with the
11:30 maintainability score? It was like a sub idea of something that we were covering recently.
11:34 I totally remember, but I don't remember the main topic.
11:37 I don't. It's always so many things we cover every week. But yeah, it's one of the projects and it was
11:41 like, hey, this has a maintainability score of A. And we're like, wait, where did you get that score?
11:45 So a friend of the show, Anthony Shaw sent over, you know, he's done this project called Wiley.
11:51 Did you guys talk about it on your show?
11:52 We talked about it briefly, yeah.
11:54 Yeah. So Wiley is a Python app for tracking and reporting on timing and complexity and tests and
12:02 things like that. So what you can do is you can point this at your project and tell it to analyze it
12:07 and then generate a bunch of reports. And it has two types of reports that are relevant to this
12:13 maintainability index. It has just a number, like a percentage, and I think higher is better there.
12:17 And also it has a rank from like A to F, like a grade score on it. So you can run this against
12:24 your code and ask it. And then you can even graph that kind of stuff over time. So it's getting,
12:29 on the reports, it'll say, ah, it's lost some maintainability or it's gained some maintainability,
12:34 which I thought was pretty cool.
12:35 Yeah, that is cool.
12:36 Yeah.
12:37 So check out Anthony's project. I'll link to it, of course, in the show notes. And if
12:42 you can see how well or not well Wiley thinks your app is doing. Even has a GitHub pre-commit hook,
12:49 as all the cool things do these days.
12:51 Yeah. That's a fairly new project too. Wiley's only been around for a couple,
12:55 two, three months or something.
12:56 Yeah, absolutely. It's pretty new. Would you say it's awesome?
12:59 I would say it's awesome. I think so. Yeah.
13:02 What else is awesome?
13:03 I kind of like the awesome lists. So awesome lists, if you're not familiar with them,
13:07 are, they're usually on GitHub, but they're basically, the readme is filled with links to
13:12 a whole bunch of other, other projects of a particular type. There's two awesome lists that
13:17 I came across recently. One of them is awesome Python security resources. And the other one is
13:23 awesome Flake 8 extensions. So as far as security resources, it covers tools and education resources.
13:32 And then a couple of companies also.
13:34 The very first one that it has listed here is secure.py, which we talked about just I think last week or just recently.
13:39 Yeah. And we've also, I think we've talked about Bandit also for static analysis.
13:43 Yeah.
13:44 Some of these we've talked about. And, and then I also, I really liked that it also included some education resources.
13:49 If you want to learn more about security.
13:52 For sure.
13:52 For your software. So this is a nice place to go for security stuff.
13:56 And then I like Flake 8 anyway, as just as a tool by itself for static code analysis. But I like that it has a plugin system with it. And so there's lots of different extensions to Flake 8.
14:09 So Brian, for the couple of folks out there who don't know what Flake is, Flake 8 is, give them a quick, the elevator pitch.
14:15 I don't know the elevator pitch. It's not PEP 8 anymore. It's like PyCode style or something like that.
14:21 Yeah. It's a format, basically the formatting conventions of the language, right?
14:26 Yeah. Flake 8 itself runs the checks for those, but it, and I think the 8 is because it checks a whole bunch of other things.
14:33 What it does cyclical, some complexity algorithm and gosh, you're putting me on the spot here, man.
14:40 No, no, that's close enough though. But so basically it analyzes the quality of your code, right? But it only does so much.
14:45 But it's definitely a static analysis. It's just looking at, looking at it just without running it.
14:51 So you found a couple of plugins for it?
14:53 Yeah. The extensions, there's a whole bunch of them. There's some security ones that actually overlap.
14:59 The other, the security resources in the previous list, if you can run them from Flake 8.
15:06 So like the static analysis that's available for security, like Bandit, I think there's a Flake 8 Bandit.
15:11 There's also a couple of my favorites are, this is interesting. There's a Flake 8 pytest extension that I want to try this.
15:19 It doesn't actually run your pytest. What it does is it, it checks to make sure that you've got pytest style assertions.
15:25 So one of the benefits of pytest is just regular assertions and not like the unit test stuff.
15:31 If you've converted from unit test to pytest, you might still have some of those other assertions laying around in this one.
15:38 I'll try to get rid of those.
15:39 Yeah. One that pops out to me is like Flake 8 dash docstrings, which actually checks the docstring code for you, which is pretty awesome.
15:50 Validates this restructured text of your documentation. That's sweet.
15:55 Oh, that's nice. Yeah.
15:56 Yeah.
15:56 So there's just so many in here.
15:58 Yeah. And there was, I didn't write this one down. There was one that like checks for, it checks to make sure that you're not mocking things that didn't exist.
16:05 So the point of mock is to fake out existing functionality so that you do something different.
16:12 One of the things that you can muck up with is you can be mocking the wrong function name and it'll work just fine in your tests.
16:21 Your code won't run.
16:23 This plugin will check to make sure that you're mocking real existing methods and not made up methods.
16:28 Yeah. Cool. Well, these are great. These are awesome finds, right?
16:31 Yeah.
16:31 Another thing that's awesome is logging. So remember a couple of weeks ago, we talked about Log Guru?
16:38 Yeah.
16:38 Log Guru? Log Guru? We don't know.
16:40 Log Guru.
16:40 We'll just try all the variations until one of them hits, I'm guessing.
16:44 And of course, just kind of-
16:46 I think it rhymes with kangaroo.
16:47 It does. And so just like when we talked about GUI frameworks, we're like, oh,
16:52 here's like a couple of them. And just people are like, oh, and did you know? Did you know?
16:55 So here's another really cool logging framework that Robert Young sent over to us to say, oh,
17:00 you talked about Log Guru. You should definitely check this out.
17:03 So this is called Fast Logging.
17:05 So Fast Logging is a replacement for the standard logging module, and it's mostly compatible,
17:11 which is pretty cool. But would you guess from the name that it's faster?
17:15 I should hope so.
17:16 So basically the point is logging can be kind of slow, it turns out, in the standard logging module.
17:22 But this one is faster. And not just like 20% faster, it's like five times faster for a regular
17:28 file. And if you're doing rotating log files, it's actually about 13 times faster.
17:32 So if you're doing a lot of logging and it's turning, basically the logging is slowing down
17:36 your app, think about fast logging.
17:38 Yeah. Nice.
17:39 Yeah. And it has a bunch of cool features. So like if you install Colorama, which is a great
17:45 color way to do output on the console, it'll actually do colored logging when it's logging
17:51 to print, you know, standard out. You can set the maximum file size and rotating a lot of
17:57 options on the rotating stuff. It'll also like Log Guru compress the older file, older log
18:03 files, which can be 10x or more savings. Like those log files compress really, really well.
18:08 You can do like only log every so often based on domains, different files, like all sorts of
18:13 stuff. You get callbacks. One thing that's kind of cool is it'll do logging on background threads
18:19 per file, which is pretty cool if you configure it. So if you're like, I want to log this stuff,
18:24 but I know that might slow down my app and I don't want any slowdown. So this will basically
18:29 push it off to a background thread, which will eventually pick it up and write it. So you can
18:34 get, keep stuff flowing right along, maybe in a web request or something like that. It's pretty cool.
18:39 Yeah. Yeah. Very nice.
18:40 Yeah. So thanks Robert for sending that in. That's a good one.
18:42 Brian, that's it for our official items. Got anything else?
18:46 I actually don't.
18:46 Nope. All right. Right on.
18:48 How about you?
18:49 Well, I have two things that I'd like to just throw out there really quick. First of all,
18:53 I'm doing a live webcast, but also be recorded over on January 24th at 11 AM Pacific time,
19:00 basically working and showing async and await in Python and building a little app that uses that.
19:07 So if you got a free hour and you want to drop in, check that out, put the links in the show notes
19:11 there. And we already talked about Anthony Shaw and his Wiley, but he also sent over a heads up,
19:19 which I also got from GitHub to watch your YAML. YAML apparently had some pretty decent security
19:27 vulnerability. Like, I don't know how many people know, but you can actually just straight up execute
19:31 arbitrary Python code in a YAML file. That's bad, right? So like, yeah. So, Hey, upload your
19:38 configuration file and we'll just run it for you. And like the configuration file is like,
19:42 username is this password is that database format is this bang Python format, the system or do other
19:50 bad things. Right? Like it was really crazy that the YAML format just lets you embed code into what
19:56 is otherwise supposed to be a static file. All right. So the warning is that you're supposed to use,
20:01 what's it called? Safe underscore load instead of load, but they've fixed some stuff to make that
20:07 basically make that more obvious. And with a new version of PyYAML. So if you're using PyYAML,
20:11 GitHub will give you a warning about this. Anyway, it seems like it could actually have a lot of
20:17 consequences if you don't update that. So check that out. Yeah. But also if you're using PyYAML,
20:21 updating to the newest version should fix that, right? Yes, you should. But what's weird is we talked
20:27 about zero for the way you fix the PyYAML problem is you take a, an official, like, I'm just messing with it,
20:33 like 1.3 release and you upgrade it to a beta release. So it's like, so you have to install
20:39 the beta version to not have the security problem, which I don't know, take that for what it is.
20:44 Yeah. Okay. Come on, PyYAML people. That's right. All right. Do you have a joke for us this week?
20:49 I don't. All right. I have a joke. This is an oldie, but a goodie. It's about Python,
20:55 which is pretty sweet. So if you're out there and you type Python on your terminal command prompt,
21:00 and then you just import anti-gravity, like the command, right? Import anti-gravity.
21:05 It turns out, have you done this, Brian, before? Yeah, but it's good to bring it up because some
21:10 people don't know about it. Yeah, exactly. This is one of the better things built into the Python
21:14 repo, honestly. And so what it does is it actually opens up an XKCD comic, which is a great joke
21:21 about Python's packages and libraries. So there's a picture, there's a stick figure flying up in the air
21:27 and the stick figure on the ground, obviously amazement on his blank face, stick face says,
21:34 how are you flying? Python. I just learned it last night. Everything's so simple. Hello world is
21:40 just print. Hello world. The guy on the ground says, I don't know. Dynamic typing, white space.
21:45 Guy in the air says, come on, join us. Programming is fun again. It's a whole new world up here,
21:49 but how are you flying? I just typed import anti-gravity. That's it. I also sampled everything
21:55 in the medicine cabinet for comparison, but I think it's the Python. It's a good, it's a little bit
22:01 of goody, right? Yeah. Yeah. And while you're playing on the command line, it's not a joke,
22:05 but import this. It's another hidden Easter egg, not very hidden, but that it'll show you the Zen of
22:12 Python. Yep. That's awesome. I'm going to save another import joke that you can do on the terminal
22:16 or in the REPL for next time or time after. Okay. But yeah, it's, I really love it that
22:22 these kinds of jokes and humorous things are built in there. It's not like Python has been sterilized of
22:27 all humanity. Yeah. And anti-gravity connects Python with XKCD, which is kind of neat. And one of the
22:34 things I like, I can't remember where to get these, but one of the things I like about XKCD is they often
22:40 talk about things that you might not know about. There's another place that I can't remember where
22:45 it discusses like why it's funny. So you can read about things you don't know about. Yeah, absolutely.
22:51 Absolutely. Well, thanks for recording this week. You bet. It's always fun and I always learn something.
22:56 So thanks a bunch. Bye. Thank you for listening to Python Bytes. Follow the show on Twitter via
23:00 at Python Bytes. That's Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm.
23:08 If you have a news item you want featured, just visit pythonbytes.fm and send it our way. We're
23:12 always on the lookout for sharing something cool. On behalf of myself and Brian Okken,
23:17 this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.
 Overcast
        Overcast
     Apple
        Apple
     Castbox
        Castbox
     PocketCasts
        PocketCasts
     RSS
        RSS
     RadioPublic
        RadioPublic
     Spotify
        Spotify
     YouTube
        YouTube
    



 
        