« Return to show page
Transcript for Episode #200:
No dog-piling please (it's episode 200!)
00:00 Hello, and welcome to Python bytes where we deliver Python news and headlines directly to your earbuds. This is Episode 200. I can't believe it recorded September 16 2020. I'm Brian knockin and i Michael Kennedy 200. Can you believe it? I actually cannot believe it. That is a ton of podcasting. And everyone's been super supportive. And it's been great to do 200 episodes with you. I don't think we've actually done 200 episodes, because there's a few times you couldn't make it or I couldn't make it or we did some live thing to probably like 195 together. But that's still a ton of podcasting together. Yeah, yeah. This is pretty exciting. I've had a blast. Absolutely. I hope people are finding this helpful.
00:40 Oh, I think they will find it help.
00:43 We're really good at transitions, because we've been doing it so long. Yeah, did transition into the next topic, actually, the first, that shelter wrote a cool article, this is great on how to be helpful online. And this is the advice that for that he's giving is targeted towards people that are trying to help other people online. So if you answering a question on Stack Overflow, or just even an email question, somebody sends your Twitter or whatever. These are good advice. Actually, it's a pretty long article. There's a lot of ice there. So I want to highlight a handful of them. One of them is answer the question first, there may be other problems with their code that they're not asking about, and you want to get to the point of just helping them with their answer all the rest of the problems on their code. Actually, I think that's a really good, I've seen that people violate that all the time. The second point that he brings up is no third rails. And I don't even know where that term came from. I don't, that doesn't make any sense to me. But going off the rails, I've heard of that. He gives an example of it should be okay for someone to ask for help with a program using sockets, for example, and not have to defend their use of sockets, especially if this specific question has nothing to do with sockets. And he says things like, it's not sockets, it might be pickle, or threads, or Global's or a singleton or something, you might have really strong opinions about some design pattern or some some code that they're using or different libraries. That's not really what they're asking about, you know, don't attack them for their design choices. Just maybe answer the questions to know dogpiling. I think that self explanatory. Once somebody already answered your question, you don't have to answer it slightly different. If you're very different. And you think you're adding to the conversation, of course, speak up, meet their level, this is a difficult one, try to determine what they know and give them a reasonable next step, not the ultimate solution, a sub optimal solution they understand is better than a gold standard. They can't make use of that makes a lot of sense. Because you know, I think also leads to one of the other ones is your gold standard is encased in your context, and your use case and so on. It's like the you're not Facebook, you're not Google, you're not LinkedIn, probably Yeah, you might not need their gold plated solution that's perfect for that situation. Yeah. And also, odds are if you're answering questions, you're more advanced developer than the person asking, at least in that field. So be gentle. The last one I want to highlight is use more words. IRC and Twitter and other online mediums encourage short responses. But short responses are the exactly the kind of thing that can be easily, easily misinterpreted. So use more words, especially encouraging optimistic words. I think this and, you know, also just, there's a lot of stuff people leave out, but they would say in person, they would say, Oh, it's cool that you're trying this problem. Let's look at it this other way. And let me know if you have any other questions, but they don't put that stuff in text. And so I think it is important to use more words and and be more encouraging online. And there's a whole bunch of other stuff like humility and understanding your motivations and their motivations and trying to, you know, build a community. So great advice from Ned, I encourage the next time that you read a question and your mouth drops open in your eyes. Stare in shock. Maybe read this article before it's right. Yeah, it's a nice article and good advice. Thanks, dad.
04:26 I don't know how to transition to Magic Man. Magic is awesome. You know what else is awesome. Black is pretty awesome, right? Yeah, definitely. You know, what is not awesome. crappy code is written in a Jupiter notebook that has no like proper editor support, like I don't need black that much because I use PI charm and I can hit command alt L and it formats it basically like Blackwood, or in VS code. I hit Command Shift P and type format document and it formats it basically like Blackwood. But in notebooks, it's just stuck there and it's like permanent icky.
05:00 form. And it's like, well how I want to make this nicer. But I don't want to take the effort of like, developing it nicely. I want the tool to just fix it for me, right. And black is really great for that black super popular. But Jupiter doesn't have black. But magic can add black to Jupiter notebook. So there's a cool package called Black cell magic. And so with black cell magic, you can load this is an extension for Jupiter notebooks. And you just say percent load extension black magic once. And on any cell that you want to reformat, you just say percent black and reran the cell. And then it formats it. Hmm. Nice. Nice. Yeah. And so actually, you type that command at the top of the cell, you rerun it, and then it takes that away, so it doesn't stay there, basically. Yeah, so anyway, you run it once. And you can even give like little command line arguments to the format or when you put that special magic command, the percent percent, I think those are called Magic commands and Jupiter. So percent percent black dash l 79. For like changing the line with the 79 characters instead of 80. By default, or there's you can pass stuff off to black that way. This is cool. Like, yeah, yeah. And if you want to know if you like it, it's for you. You go to the website, go to the link I provided and it has a cool animated GIF, and you can see right away Oh, that's cool. I want that or no, that's looks weird. I don't want that. Yeah, I was watching that while you were talking. Yeah, it's cool, right? So it just, it solves a problem like I need to format my Jupiter notebook. Why? Why is this not built in? Well, now it's kind of a sort of plugin and both not part of the story. But can we go back to the whole command alltel thing? Yeah, that's in PI charm. It reformats your code. So it does. Yeah. Okay. Let's check that out. It's pretty sweet. That only works on Mac and it depends on which bindings You know, there's like multiple keyboard bindings and maybe in the Vemma there's like a different one. But if you go and you go find the menu command for like reformat document, it'll show you what the hotkey is, as you can do better than that. You can actually right click on the project and say reformat the project and it'll like traverse down into all the files in a reformat like everything. So I don't know of a hotkey for that. But you can like right click and say, reformat this tree of stuff. Yeah. But if I'm doing a tree stuff, I'll probably use black. Yeah, exactly. Yeah, I never used that. But generally a Command or Ctrl, Alt L, probably on Windows or Linux will do it. But by Excel magic will add it to Jupiter. Now what's super annoying, is you got to type that command every time on a cell. And it does it one cell at a time. So if you had 100 cells, you got a lot of percent percent black, you're typing. There is a guy named Tobin Jones, who wrote NPM Pat package that will use this overtop of it and reformat all of them. And I linked to the repo. But then when I go to it, it looks like it's archived. So I have no idea whether it even works still or anything. I haven't tried that one. So people can check that out. But it would be nice if this was like leveled up to apply at least to a notebook, even if you run it on demand. Yeah, definitely. It would be cool to be able to black phi a notebook. Yeah. But nonetheless, this is better than what it was before. So it's pretty good to me also is really good. What's that learning? Awesome. Python from talk Python training. That is pretty awesome. Yeah. So this episode is brought to you by us again. And if you're in the market to learn Python, we've got a ton of courses, we're coming up on 200 hours of highly edited courses. So that's a ton of content. And we have a special enterprise plan. So if you're looking for team training and team events that are online, digital, yeah, just shoot me a message. And I'll get you up on that. info about that. And pi test. Yeah, definitely. If you are considering a test, or considering testing your code, please do test that. And I would like to actually highlight I brought up somebody made a nice comment today and wanted to bring it up. Kenyans Clark, this came out a couple days ago, says he picked up my book by Python testing with PI test and start reading it was excited. In just one hour later, he posted another comment and said, I've just finished the first chapter and I can see I've barely scratched the surface. So I was already learning something new and in one chapter. So that's Yeah, that's really cool. Maybe help people test smarter, not harder.
09:34 Yeah, well, actually, you know, that is the goal of the book. But I also wanted to highlight an article by Luke plant called test smarter, not harder. And this is not like a huge article. It's a it's some nice opinionated, like opinionated testing articles, good opinions there. There's a lot of great advice, but I wanted to pull out a couple of his suggestions, because I don't think that they're they're talked about much
10:00 So the first suggestion that Luke has, or the first one I'm highlighting is, write your test code with the functions or methods or classes that you wish existed, not the ones you've been given. So if an API you want to use doesn't exist yet, you just use it anyway. But then you have to make it exist. So this is actually huge advice, I think, and people don't really, I think they think about it while they're coding that you try to write the code you want the API you want, and then make it if you if it isn't there, but forget to do it while testing and while testing is even more beneficial, I think because you've got to be able to read your test code really fast if and understand it quickly. The other thing I want to highlight with that is, if you are responsible for the API, or the API that you're testing against is something you control, then pay attention to those tendencies to say, I really wish I had an easier API, because that might tell you that maybe that new API should exist. And maybe you should add it to your, your interface. Yeah, I think this is the one of the really big values of testing is that it lets you step back from the code you're writing and look at the API or the classes or library or whatever you're building, look at that from the outside and go Does that make sense? Is that the best way I want to use it, it's sort of your first chance to put it into practice, as a consumer rather than a creator of it. So if you're if you don't, if you're not the person in control the API, and you're just using a different API, you can write a wrapper around that to make it make, you know, just highlight the thing that's important for the test, and not have to, you know, pass it a bunch of stuff that doesn't matter to the test, but you have to pass it anyway, I think those are great suggestions. The next suggestion is only write necessary tests, specifically test tests whose estimated value is greater than their estimated cost. This is a judgment call, of course, but it does mean that at least some of the time you should be saying this test isn't worth it. Now, this is a controversial sort of opinion. But I go by this. And if you have trouble convincing the people that you have to convince the to skip a test, you can just say, I'm prioritizing my tests, and that one's lower on the priority. Maybe we can get to it later. The flip side of this, this is good advice. The flip side is that I think is not initially thought of by a lot of folks is you have to maintain your tests as your code changes. If you're, you've got a static API, and it's just fixed and it's on pi pi, it's fine. But if this is an application you're building, you might dramatically change the way things work. And when you do that, you might have to rewrite your test to correspond with that to recreate objects in some new way or whatever. And the more maintenance burden that your tests carry, the less you're going to like writing tests, and the less you're going to keep them running. And so it's not just Is it the worth the value of creating the test, it's worth the value of creating and like living with that test. Yeah, test code has a maintenance cost or more maintenance cost, then production code, also different parts of your different parts of your workflow. So early on in a project, you're really learning how to do the problem, and you're learning about the code. So write tests that help you with that learning. Don't write tests that solidify the API's. It's hard to change. Right? Yeah, right. The ones that help you learn about your code, while you're putting it together. Very nice. So this podcast is pretty awesome. And for Episode 200, I wanted to get something good. A package that's good to talk about, it might be the greatest package of all time, really? Well, it's self proclaimed. So bit of a grain of salt. It's, it sounds really simple. It has a crazy name. And it actually is really quite useful. So this next one is called us as in the United States, the greatest package in the world. That's literally the name of it.
13:53 So this guy, yeah, so Jerry Carvalho reached out to us said, Hey, I created this package, I don't know you think it's useful or not? Like, okay, it's kind of interesting. It's a Python package on bi bi, for working with states, states, zip codes, those types of things in the United States. Right. Okay. It seems like this could be motivation for things like the EU, or, you know, some other place where you want to understand the geography of it, but this is really quite involved. So I envision like, Okay, well, maybe it's got like a list of the states and it's got the abbreviation or something. It's got that it's got all the territories, it has the postal abbreviations. It has a Associated Press style abbreviations, which I don't really know it has FIPS codes. I've no idea what FIPS codes are, but they're like lookup codes, different kinds of lookups. You can do the capitals, the years statehood, the time zones. You can even do phonetic name lookup to like if you can't spell Mississippi but you can make Mississippi sounds with letters, you could put that in there, and it'll go and find it. So like it basically do like lookups on misspellings.
15:00 But if you get it like sounding right, you can still find it to maybe you accept typed input or some text field that says the state, but then you can do a look up on that to get a more canonical representation. Whether the state is contiguous, like Oregon, or one thing stuck together, or very nice place like Hawaii that's broken into a bunch of islands, where there's continental or not similar difference there. That's pretty cool. If you want the geographic boundaries of them for like geospatial work, it comes with URLs, a shape files that come out of the US Census, at least they're accurate up to 2010. Okay. Well, so one of the flags is is obsolete, I was wondering if there's obsolete states, there are obsolete states. Yeah. So I think more territories are obsolete. I don't think they're states that are obsolete. But there's territories that are, for example, like the Philippines, I think used to be a US territory, but it's no longer something like that. There's a few examples in the docs. Okay. Cool. Yeah, it's, and they also have an environment variable to indicate whether washington dc becomes a state, you can set a flag that will like trigger that to show up. So it's like future proof a little bit. Okay. It has a c li. So you can type states space MD, for Maryland. And you'll get a big long description of information about it well, with the prefix of the great state of yesterday. That's interesting. So is this more than you expected? out of it? Like when I thought I thought it would just be like a list of states and stuff. But like, all this lookup all this information? This is pretty awesome. Actually. It's pretty in depth. Well, no, it's pretty cool. I just didn't I don't know if I'd say it's the greatest package in the room. Oh, all right. Well, there's always a PR, you could always a pretty good package with respect to state management in the world. Yeah. Okay. Now, actually, if you work with states, this seems super useful, regardless of whether you agree with the name.
16:54 Yeah, I've got kids that are at home right now. One that started school, but started school, like, online. So it's a it's sort of a anticlimactic, big beginning to school. Yeah. And we still have like some, a lot of time that they're devoting that I'm glad they're doing this. They're allowing teachers sometime during the during the week to prepare for all of this, which means they've got kids have more free time than they had before. So one of the things I was looking for was good learning, software coding related learning activities for kids that are have some spare time, especially early on in the school year. I can't remember who suggested this, somebody on Twitter suggest this, but there's a video series, that's part of Ted Ed, that's called think like a coder. The title says it's a 10 episode series that will challenge viewers with programming puzzles. As the main character, a girl and her robot companion attempted to save the world that has been plunged into turmoil. So I was trying to evaluate whether or not to highlight this on the show. And I got like four episodes in just this morning. Although it says it's a 10 episode series, but I only count nine it's it's you start counting is zero based. So it's off by 100 off, but it doesn't really teach like, I haven't got at least the first four episodes. It doesn't teach, like actual coding, but it talks about the concepts. And that's what I really like about it. It's an interesting story, the animation is pretty good. But eluned introduced words in terms like loops, for loops, until loops, while loops, conditionals variables, pathologic permutations that had to do searches, tables, and recursion, and even some big O notation, and some other things. But these are like terms that in software, and in programming, we use all the time and just assume everybody knows what we're talking about. One of the things I really like about this is just defining and using those terms and an entertaining story, so that when you really do start learning how to code, it's not going to be surprised.
19:02 Highlight with that, I'm also reading to my daughter, a book that I picked up called Girls Who Code, learn to code and change the world. And it's a lot of inspiration. There's actually a Girls Who Code project that does teaching and stuff, but I don't know what they're doing right now during COVID. But the book is great. And it's not, it's not even language specific stuff. I think there is some Python in there. But that's not really the focus of it. The focus really is a teaching a lot of the concepts and just getting people excited about it. So I wanted to highlight these two, that's one of the biggest challenges. It's getting people feeling like this is interesting. And this is for me, and I should pay attention to it. So yeah, that's cool. I also want to throw a shout out to code combat.com. That's another really nice place that sort of has some these ideas go through and do like a little dungeon exploration. It's all solve problems. I think it would be a good follow on to this series. Like you've got that
20:00 ideas from the series and then you can go right, like super editor supported Python code to like in a little game world. So that'd be fun. Yeah. Yeah. We'll link to all that in the show lately. So this next one is interesting. I ran across this just a few days ago. And I definitely want to talk about this. Because how many programmers out there have this idea of, I've been building this software for other people, for other companies, and I just want to I have this idea. And it doesn't exist, I don't want to build it and put it out there into the world. Like, surely almost every programmers had this this idea, some in some form or other, right? Yeah, yeah. So there's this project that is a pretty new project that goes along its path, and it, it's called keep the score. So keep the scores like online software for scorekeeping. Basically, if you've got like a soccer tournament, or rock climbing, competition, whatever, like those things probably don't exist anymore. But when we could be around other humans, and when we can, again, this is gonna make a lot of sense. You could have like, a little online scoreboard that the parents could pull up and keep track of, or whatever, something like this, right. That's basically what this app is. It's a Python flask app. And they wrote a blog post called the cost of running a Python web app with 55,000 monthly users. Okay, so this explores like, the infrastructure and how much did it cost to actually put it together, how they're doing it, and so on. So I thought it might be fun to just kind of talk through that a little bit, and then do maybe a little comparison over to some of the talk Python stuff. All right. Yeah. So we can over the thing there sites pretty cool. It's hosted on digitalocean. As is all of our stuff, Python bytes, talk Python, whatnot. So that's a really fair comparison, I'll make and using digitalocean and Firebase, currently have around 55,000 unique visitors. And they have their servers and database over on Digital Ocean. And I think they might be using Postgres as a service on digitalocean rather than hosting their own database server, from what I can tell. They also have Amazon Web Services. Yeah. So for the numbers digitalocean is cost them about $95 a month. There's some AWS metabase stuff running over there. It's $60 a month for like reporting and whatnot. They have Google Cloud for a whopping dollar 32 at Firebase,
22:19 DNS hosting and $5. Discuss $10. They said, of course, you have a free one, but they put ads there and they don't like that. So $10 they're paying for that? And they said, Well, okay, that's $171 a month.
22:35 Is this worthwhile? Obviously, if you were running shorts, or you're taught Python training, like it would be obviously $171. Like no big deal, right? But this guy points out like, they're this. I'm an indie developer. I have no revenue yet. And I'm just trying to get this thing off the ground, and I'm paying $171 a month. But that's a lot of money for just trying to do something nice for everybody. Yeah, I agree. And it's mostly free. And they're trying to figure out the monetization. And yeah, I think is a cool project actually hope they're successful. And it's cool. They're building with Python. But I don't know, it's an interesting trade off. I feel like so many people, I don't want this to sound at all critical of this guy, like what he's doing is to work with him. And that's, that's great. But I feel like a lot of people just in general, not necessarily this example. they envision a world where like, things are so much bigger and more powerful and more awesome. Or more like there's more users and it's like, more awesome. And they got to be ready for that. Because when they get when they land on like Hacker News, and all the people come, they've got to be ready for like a 50 x traffic and stuff like that. And I don't necessarily think that that's how it goes. Or, you know, if you're in the cloud, or something like that happens, push the make it bigger button, and then it goes like, you'll have to do that beforehand. And actually, one of the things they said they they ran into is they started out with a smaller server and they said oh, we want to make sure we have a bigger server, just in case and they upscaled it and part of the upscaling like changes the I think it was probably the file system got larger, the disk got larger. And once that happens, you can't downscale it again, you're not stuck without unless you recreate it from scratch. You can't downscale it again. And so they have two servers. They're like deploying to one and while they're deploying to one, they take the floating the elastic IP and they switch it over to another one that keeps it running. And then they deploy to the other one, and it switches it over to the like there's like this back and forth swap going on. And that's actually how I do it. I talk Python on trading site and stuff like that as well. Having like two servers. That said, This feels really high to me. I'll give you some stats on top Python, just talk python.fm. The website for the podcast, not the training site is not paid on bytes. The reason I chose talk Python is it's very similar to the numbers that this guy is using on the same infrastructure. So talk Python gets about
22:35 40,000 monthly visitors. And it's super hard to talk about unique monthly visitors. Because so many developer, especially the developer space, because so many people have ad blocking turned on, which is how you, you know, like, third party cookies from apps like clicky, or whatever, say you get this many visitors and like 50% of that's blocked or something, right? So anyway, you got to kind of estimate like, well, how much is blocked? Is it 30%? Or who knows? So anyway, it's around similar numbers a little bit smaller, in terms of visitors, but the podcast clients, Oh, my goodness.
22:35 The podcast, clients are crazy. They're just pounding the server like all the time asking for the RSS feed. So we get about 3 million requests for the RSS feed monthly, that goes through, it goes through Python, it talks, it does some database stuff, it talks over the database, and it gets back an answer. I could cache that as a file. But then there would be like latency and inconsistent. I just, there's no need did not have that happen. Right. But that that does, right. So that comes through, and that's about 120 k requests. So that's 320 gigs of traffic and 3 million requests. Just to answer the question, can I go download the file, which is much bigger? month, weekly, you know what I mean? So that's a ton of traffic, and the server's back in that I have two servers because I do this flip as well. So there's zero downtime most of the time. One of them is a $5. server. And because I wanted to splurge, the main one is $10. Because Hey, this is my whole business. Like it's worth five extra dollars a month, but it can easily handle it on five on five bucks. So for example, I have it pulled up right now. And it's running at like 8% CPU usage. 6%. You know, it kind of varies, right? Right now, if it was on the the $5. One, it would be like 12%, it would still be fine. And then there's also a dedicated MongoDB server that handles everything, but that's like $10 total cost 25 bucks. Okay. Well, 25 is like it. Okay, devil's advocate here. $25 is way better than 171. But even $25. Yeah, I could do to 20. If I wanted if I if I just went down to the $5 server, which I could, but anything that's 20 a month. That's what $240 a month, a year. Yeah, we're trying to do something nice and free for everybody. Yeah, no, I was really lucky that I don't have to pay for the bandwidth for the stuff going through digitalocean because that would be like another thousand dollars a month at least. But that's included. So it's fine. I feel like you could turn stuff down a lot. Like, for example, I think he's using Postgres as a service, which is probably I don't know, sir, there's probably 50 bucks a month, you could probably put that on a $5 server and just manage Postgres yourself. Okay. Is that worthwhile? I don't know, like, how much of a pain is that to manage yourself? versus like, how do you do backups and all that kind of stuff. But in the really early stages, I think you if you're worried that extra hundred dollars a month is a big deal.
22:35 Maybe you do it that way. So though, by the way, my AWS bill is over $1,000 last month, so but that's just video delivery.
22:35 That's a different story. That's just bandwidth. That's, and that's because of the training. Yeah, yeah. So I could do it cheaper. I could do it a lot cheaper, but it would be less good for people. And for that, I'm trying to pick the best possible option. So that's how that goes. But anyway, I think it's interesting to sort of think about, like, what does it cost and your point about if I'm doing something nice for everyone? Right? It should cost less? Yeah. Well, I mean, you know, motivation doesn't really get into it. But it's a very real thing. It's a barrier to entry for, for people that maybe the mean, they had to scrape together just to get the laptop in the first place to start out coding. And yeah, if you're not in like a Western democratic place where currency is pretty valuable, or the pay rate is pretty high. All of a sudden, $175 could be 25% of your monthly income, which that's a huge number, right? Yeah. Yeah. So it could definitely vary depending on where you're located. Yeah, anyway, pretty, pretty cool. I think it's worth looking at and digging into, and I wish them the best of luck with this project, because it seems cool. And it's built Python. Finally, if you want to hear like a deep dive into all this stuff that I was talking about, Dan Bader, and I had a long chat about the infrastructure behind talk Python, and some behind real Python over on top python 215. All linked to that as well. That's pretty serious, man. We should do something funny. Yes. Tell me a joke. Okay, so somebody shared this with us on Twitter. It originally netlify posted it. It's a conversation between two people. Oh, no, we lost the hackers. Where did they go? I don't know. They just ran somewhere. Ah, they just ran somewhere. That's so awesome. Because I didn't get that joke reading it. But when you say it like oh, yeah, perfect.
22:35 Well, I'm very concerned about making sure that everybody has a happy work environment and that they're safe. And I've had to fill out some contracts and stuff. It's so ridiculous, man. I've had to fill out like vendor stuff for podcasts.
22:35 advertising. And they make me go through their stupid vendor onboarding thing at some of these big companies. And I've got to answer like the general vendor information. So what is your information? Like? What is your location? What is your bank account information so we can pay you? What is your OSHA health policy? And is there a chance that somebody is like, Are there dangerous ladders that people could climb? Will it be forklifts? I'm like, Dude, this is podcast advertising. There's no ladders. And there's definitely no forklifts. Why are you sending me this huge 50 page form? I got to fill out like two pages of flattery. Anyway, let's take this and turn it into the programming joke. So you know, you've seen those, like, number of days since serious injury at factory seven are doing great. Nobody hurt this week. So how about this fire programming sign? number of days since I've encountered an array index error, and negative one.
22:35 I love this. It's like a joke, right? Yeah.
22:35 Negative one.
22:35 That's so that's really big. Because you probably well, you don't know how big though, is it a short and unsigned is like a visit short is like negative 32,000. But if it's a long, there's a really huge number. It's like 4.2 billion, 9 billion or whatever the overflow rap is there. They probably just allocated a byte for it. So Oh, yeah. So it's, yeah, it's like 55 or whatever. Yeah. Less than a year.
22:35 Awesome. All right. Well, thanks, Brian. Congratulations on 200. Man, thank you. Oh, we overflowed into we're into the 200.
22:35 Congratulations, away. Let's just celebrate on 256 Yes, we will. That's gonna be the full cycle. Yeah. Awesome. All right. Well, thanks again. Thank you. Thank you for listening to Python bytes. Follow the show on twitter at Python bytes. That's Python bytes as in be yts and get the full show notes at Python byte set FM. If you have a news item, you want features just visit by thumb bytes.fm and send it our way. We're always on the lookout for sharing something cool. This is Brian Aachen and on behalf of myself and Michael Kennedy, thank you for listening and sharing this podcast with your friends and colleagues.