Transcript #168: Race your donkey car with Python
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 168, recorded February 5th, 2020. I'm Brian Okken.
00:11 I'm Michael Kennedy.
00:12 And I'm Kojo Adresa.
00:13 Yay, we have Kojo here as a special guest.
00:15 Hey, Kojo, welcome to the show. Happy you're here.
00:17 Hello. Thank you, thank you.
00:18 This episode is brought to you by DigitalOcean. Thank you, DigitalOcean.
00:22 Michael, I'm actually confused about this.
00:25 It's a little bit of a funny name, right? So let me tell you about Donkey Car.
00:29 Have either of you participated in or at least watched a proper RC remote control car race?
00:36 Not really. Just sort of like the random ones. Like, random people have random remote control
00:40 cars and running them around the neighborhood, but not an actual official proper one. No, I have not.
00:44 Brian?
00:44 Yeah, I just watched a little video that you sent me and it was quite exciting.
00:49 These are really weird things. If you've never seen one of these, I put a link to like a three-minute
00:54 video from GoPro where they put a GoPro on one of these little RC race cars.
00:58 I used to have one of these when I was a kid, like high school, maybe late middle school. And
01:03 they're insane. They're these little cars and your remote control and they go like 35 miles
01:06 an hour. They're super quick and responsive. Really interesting. But what would be even cooler
01:11 is if I could use Python to like win an RC car race. Don't you think?
01:16 Ah, yeah, that would be cool.
01:17 Yeah.
01:18 You're right.
01:19 I mean, you've already got the GoPro on there. It's already got a camera that's high quality.
01:24 So, the thing that I want to talk about is this thing called Donkey Car. And it's a minimalist,
01:29 modular, self-driving library, self-driving car library for Python.
01:35 So, people are always looking for ways to get kids into programming or themselves to get into
01:40 programming if they don't have some like formal project. Like, I want to build this website or I've
01:45 got the data science thing I want to do. Something like a self-driving car I think could be really
01:49 interesting. They have some much tamer vehicles that they have pictures of on the Donkey Car repo where
01:56 it's more like little Lego cars and stuff. But you basically have these little tiny cars and you can
02:01 put cameras on them and then you put a Raspberry Pi and then you teach it how to drive. And I think
02:06 that's pretty awesome.
02:07 Yeah. That looks fun.
02:09 Doesn't it? Yeah. So, it says you can use Donkey Car if you want to make an RC car drive itself and
02:15 win an RC car race. That would be awesome. If you want to compete in self-driving races like DIY
02:20 RoboCars are, you know, the great robot race from DARPA way back in the day. I guess that's probably
02:27 a little bit quite enough, but still quite cool. If you want to experiment with like autopilot or
02:32 mapping computer vision and neural networks, if you want to log sensor data while you're driving around,
02:38 if you want to drive a car via an Xbox game controller, that's pretty cool. Because you can
02:46 then communicate, you know, with the controller over to the Raspberry Pi and then just tell it to drive
02:50 however it tells it. Yeah. A lot of cool stuff. And yeah, I think if you have anything to do with
02:57 like you're playing with AI and computer vision, this seems like a really fun way to make it interactive
03:02 or kind of exciting without a lot of code. There's, it's pretty simple actually.
03:07 Do you know if any of these RoboCars are going, or the self-driving are going like 35 miles an hour?
03:14 I don't see, well, when I watched the video that I included, like on one hand, like I don't see why
03:18 it would be hard because they have these little rails and it's kind of clear where the edge of the track is.
03:22 You could even put up markers, like little things that you could like shine, you know, have detected
03:27 with the computer vision, but they're so bouncy and incredibly jiggly. And it's really hard.
03:35 I think, I think it would be a little bit hard. So maybe slow, but I don't know. I, my joke about winning
03:39 the race, it seems a little far fetched. You'd have to have a really stable camera, which I guess you could get.
03:43 Yeah.
03:43 But anyway, I think this is a fun one. So if people are out there looking to play with a little AI
03:48 computer vision, this seems cool. Check it out.
03:50 It's very interesting.
03:51 Yeah, for sure. Brian, there's a bit of a sad one coming up, right?
03:54 What's going on?
03:55 Yeah. Rest in peace. I ran across an interesting article by Nick Timkovic, I think, called,
04:02 RIP Pipenv. Try too hard. Do what you need with pip-tools. So I didn't realize that that
04:11 Pipenv was kind of stagnating. There's not been a release in 2019. I didn't check to see if maybe
04:17 they slipped one in in 2020 yet. But apparently there's some problems with the subdependencies
04:24 and complicated release process or something. But...
04:28 Well, I want to add one really bit of a small bit of detail here because I think it's interesting.
04:33 There's not been a release of Pipenv in 2019. And that makes it sound like all people have walked
04:39 away, haven't done anything. There are 650 commits to that project and there's still not a release in
04:44 the year, which is kind of rough, right? Like the people who worked on it, if that stuff's not
04:48 getting released, that can't be great.
04:50 Yeah. So I'm not sure what's going on. But the main emphasis of the article really isn't that
04:55 whether, I mean, whether or not Pipenv survives or it's really dead. I don't think it's dead.
05:00 I don't know what the state of it is. But one of the benefits that we saw with Pipenv was this idea
05:07 of pinning everything and using, like having a pip file and a pip lock file or a lock file that says,
05:14 these are the packages that I really depend on. And then all of those, plus all of the subpackages,
05:20 I put those in another file, a lock file with their hashes so that I can know that I can reproduce
05:27 that environment. And that's a, it's a really cool idea. I like the concept. Most of the bulk of the
05:33 article is just basically saying, you can do that yourself without Pipenv. You can use pip compile
05:38 that comes from pip-tools and there's a generate hashes function. But basically you do that yourself.
05:44 You just have a smaller requirements file that just has what you really need, your direct
05:49 dependencies. And then you can generate a hash file that is directly readable by pip. You can pip install
05:56 from this, this other generated hash requirements file. The other part of Pipenv that people are using
06:04 is virtual environment support. But I guess I'm on board with Nick to say, I don't understand why these
06:09 were bundled into one tool and I'm using virtual VENV, the built-in just fine. I don't really need
06:16 Pipenv for that. So I think I'm going to try to incorporate this possibly in my workflow, at least
06:22 on one project to see how it goes.
06:24 Yeah, that's pretty cool. I didn't realize you could output the requirements.txt with the hashes
06:29 using pip compile either. That definitely was one of the selling points of pip enf was like,
06:34 everything is locked, not just by pinning the version, but by the hash as well to make sure
06:39 that it couldn't get messed up. Pipenv uses pip compile anyway. So I see. And it uses pip file
06:45 and pip file.lock. You know more about this than I do, Brian. Isn't pyproject.toml the new hotness
06:51 instead of pip file?
06:53 The pyproject.toml doesn't have, I don't think that it supports doing hashes and stuff like that. So
06:58 they still kind of support different ideas. I think the pyproject.toml is, I'm not sure where
07:06 they cross over, but there still is this difference between a library that you can use for lots of
07:14 stuff with lots of different versions of things in an application. With an application, you definitely
07:19 want to lock things down to know what you're doing.
07:22 For sure. Kojo, did you use pip enf any? What's your virtual environment preference?
07:28 So I used it a small amount. I never used it a huge amount. I think my virtual environment
07:33 preference has been virtual. Well, I had been virtual env wrapper, but I've recently started using
07:38 pyenv. Well, actually, I started using pyenv, but that's more for managing different versions of Python.
07:46 Right, right. I want this virtual environment to be Python 3.7 and that one to 3.8 and gasp that one too.
07:51 Yeah. And so I've been using pyenv to manage different versions of Python, but then there's a pyenv-virtualenv
07:58 module. And so that makes it a little easier to create virtual environments as you switch between
08:04 Python versions. But for me, so pipenv, again, I'd never really gotten into using it, but having looked
08:10 at it a little bit and I saw some of the early talks about it, it introduced me to that idea of a lock
08:14 file. And then my personal blog is Jekyll, which is in Ruby. And Ruby uses a similar thing, that sort
08:20 of gem lock file. And so just the familiarity with it there from pipenv was helpful to me as far as
08:26 having to try to sort out stuff with Jekyll because I don't, Jekyll is the only thing, the only Ruby
08:31 project I use. It's the only time I ever really use Ruby. So it was helpful at least to be familiar
08:36 with that set of concepts there. Yeah. Yeah. Cool. And Brian, I'm very excited about Python 3.9 having the
08:43 --prompt dot. So you get the folder name without the extra bits that you have to put in
08:49 there to make that happen in the shell. Yeah. That's going to be cool. I love using prompt. Yeah,
08:53 for sure. Kojo, what you got next? I'm going to talk about string, a string method called case fold.
08:57 And this is something that's interesting. It actually just came up this morning. I was working on something
09:02 this morning and you can use case fold in places where you're trying to do comparisons without
09:10 having to look at the case of a string. And so they call it caseless matching. And so the standard thing
09:15 in Python or the more common thing that you would do in Python is maybe you use like the string method,
09:20 like string dot lower. And so you're not worried about whether someone types something in with,
09:24 you know, uppercase or lowercase. And that works in a lot of situations.
09:27 Wait a minute. Wait a minute. You're telling me that I've been doing it wrong for all these years?
09:30 Completely wrong? Shame on you.
09:31 Yes. I didn't. I knew the function case fold was here, but until you brought it up, I'm like,
09:37 oh, whatever, like lowers. I've been doing it wrong. Carry on. This is awesome. I'm ready to hear about it.
09:42 Well, and so the interesting thing about this is that, you know, lower works in a lot of,
09:46 it works. It covers a lot of, a lot of use cases, especially if you're, you're using English or
09:52 a similar language. It's interesting in the, the docs that case folding is similar to lower casing,
09:56 but more aggressive, which is just a little funny to hear when my coworkers got a kick out of that.
10:00 And I think where case fold becomes especially useful is if you're using a lot of Unicode characters.
10:07 And I think, Michael, you had an example here, but so it stood out to me partially because I was
10:12 working on a thing where I wanted to make sure cases, things were being compared and I didn't have
10:16 to worry about the case of what was entered versus what was expected.
10:18 Right, right, right. And until like today I would have written dot lower dot strip and been happy
10:22 with that.
10:23 Exactly. And so, and I started looking for some other ways. I, in addition to other things,
10:28 I lived in China for two and a half years, so I can read and write Mandarin, a functional ability to
10:32 read and write Japanese. I taught myself to read and write Hangul. And so I tend to use Unicode characters
10:39 maybe a little more, a little more frequently than, than the average American. And so for me,
10:43 I was like, and if I'm trying to build something and I'm concerned about handling text or case
10:48 matching, I'm always interested in things that will support Unicode because the Unicode characters,
10:53 because, you know, of course, like emoji, probably the most popular Unicode characters among English
10:58 speakers, but you also have a number of other languages where the entire language is represented
11:03 in Unicode characters. So something like this that will work in these, in these situations
11:07 where you get Unicode characters is important. So like I said, I just discovered that this morning
11:12 and ended up using it in a test I was writing and I'm like, okay, I can see how I can use this
11:16 going forward. And I think, Michael, I think you've got like a, a slightly more flushed out example.
11:20 Yeah. Yeah. So let me just give people an example because aggressively lower casing,
11:24 that doesn't mean anything to me. When I read this, I'm like, I still have no, I read what the,
11:28 the docs said about it. I'm like, I still have no idea what this means. Like if I had like
11:33 Michael dash Kennedy with the dash be down, like underscore now, like, I mean, I just,
11:38 I don't even know. Right. And so I found this example and it has two strings,
11:42 the river in German, and there's sort of the formal German way to spell it where you have an,
11:48 what's called an S set. It's like a, looks like a beta symbol, which is like two sharp,
11:53 two S's together, like a super S. And then you could just, if you were on like an American or English
11:58 keyboard, you're like, I can't find that character. I'm just type two S's as common in German.
12:02 And if you case fold those, it will actually convert their flus with the S set that like the
12:08 beta thing down to lowercase F L U S S and compare it, which I had no idea. That's pretty cool. So it,
12:14 it'll take these letters that are, I guess, considered uppercase, but you know, not quite the same.
12:20 And it'll sort of normalize the string more than just lower is the way I see it. It's like the
12:24 canonical lowercase version of it. Yeah. And, and, I've, I've seen the, the example like that and I have no knowledge of German at all. And so, but it was useful to see
12:35 that example. It's like, okay, here's, you know, here's another concrete reason, you know,
12:39 why you might want to use this. but, but I think also with a lot of applications,
12:43 be they web applications or standalone apps, when people are dealing with internationalization and
12:47 localization, that kind of thing, having some sort of a method for caseless matching that,
12:53 that, you know, will work across the Unicode characters, then, you know,
12:56 it's not going to break once you get outside of, you know, the 26 letters of the, you know,
13:00 the English alphabet is helpful. So yeah. Yeah. Brian, did you know about this? I I'm like blown
13:05 away. I've always been doing lowercase. And so you've been doing it wrong. Yeah. I think it's
13:11 pretty new from like, I think it's a, it got added in Python 3.3. So it's not, you know, it's not
13:15 like, you know, it's not like a thing that you haven't been using for a very long time. Cause it
13:19 hasn't been around that long, but as a, I think one, another thing that drew me to it
13:23 was that the idea that in Python 3 and going forward, everything is, you know,
13:27 everything is Unicode, the default sort of text handling mode is Unicode. And so it's not brand
13:33 new, but it's also not like super old. So if you haven't been using it, you haven't been, you know,
13:37 missing out in, and again, bring that lower still works unless you run into a situation where you
13:42 were actively having to deal with Unicode characters, which, which a lot of us, you know,
13:46 honestly, a lot of folks here in the U S don't. So.
13:48 Yeah. Yeah. Pretty interesting. Thank you. That's awesome.
13:50 This episode of Python bytes is sponsored by digital ocean. They have awesome infrastructure
13:55 and awesome product. And we use them in our services. Do you have a memory intensive workload,
14:01 maybe something like a high performance SQL or no SQL database or an in-memory cache,
14:06 like maybe Redis or some indexes or some kind of large data analysis runtime? Well, check out
14:12 digital oceans, new memory optimized droplets. They're optimized, especially for these high
14:18 memory workloads. So check them out at pythonbytes.fm/digital ocean, and you can get a hundred
14:24 dollar credit. Awesome. Yeah. Thanks to digital ocean for sponsoring the show, Brian. I feel like
14:29 we're kind of in the same groove this week. You pick this rest in peace, pip enf, which to be clear,
14:34 the pip enf people didn't say rest in peace, our project. Someone from the outside looked at it and
14:39 made this declaration, but it's still an interesting article, right? Yes. Something that I have often
14:44 wondered about is like, you see a lot of times people talking about virtual enf, and this was like
14:50 the way to create virtual environments prior to VE and V being built in in Python, right? Yeah. Yeah.
14:55 There's a new release of it. And my first thought was, why? Why is there a new release of it? Because
15:01 Python 3-M, VNV, whatever I'm going to type after that, seems like it's solving my problem for me.
15:07 And so why would you continue to work on this? You know, like it's, we're technically in the post
15:11 Python 2 era officially, right? I mean, not in practice, there's a lot of Python 2 still out there,
15:17 but it is now no longer supported being past January 1st, 2020. So why work on this thing,
15:23 right? Well, Brian Skin sent in this and I'm like, all right, I'll take a look. Brian usually recommends
15:28 good stuff. And it's this announcement by Bernat Gabor, who is working on the project and said,
15:34 hey, we just did a major release of virtual enf. I'm like, okay, I got to figure out why this is
15:40 still a thing. And he said, look, there's a couple of pain points that exist with current,
15:44 you know, the dash MV and V style that creating a virtual environment is slow. It takes around three
15:49 seconds, even in offline mode. Unless you're on Windows, then it takes longer. I don't know how
15:54 much longer, but it seems to be that it copies more into the virtual environment rather than sim
15:59 linking it on Windows. So it seems like it's a little slower. The other thing is that the API
16:03 used around PEP 405 is great if you just want to create virtual environments, but it doesn't allow
16:10 you to target very much around that or describe the target environment without actually creating the
16:16 environment. And then the duality of virtual ENV versus VNV. So Python 3.4 has VNV added, as I said.
16:25 So in theory, you could just switch away. But there's some other benefits that he talks about as well.
16:30 So over specifically over VNV, which is the ability to discover and use alternate pythons, right? I can say
16:37 dash P2 to create a virtual Python 2 virtual environment or kind of like you were saying, Kojo, I could say
16:43 dash P3.8 or 3.7 or even dash P pypi 3 and get one of those environments created. So I can select from the
16:51 different installed pythons as I create these, which is pretty cool. It also packages out of the box,
16:57 out of the box, it packages the wheel package as part of the seed package, or caches part of the seed,
17:02 the wheels as part of the seed packages, which after it's been created and cached, it speeds up the install
17:09 time, especially for things like micro whiskey or whatever, like that thing takes 15 seconds to pip install
17:14 at least. So making that faster seems awesome. And it's also guaranteed to work in places where VNV is
17:22 not included with Python by default. For example, if you get the Debian or certain versions of Ubuntu,
17:28 and you say Python 3 dash MVNV, it'll say VNV is not installed on this computer, and you've got to
17:35 apt install it, right? Which is kind of funky. And then around that as well, you can also,
17:41 because it's pip installed, not apt installed, it will, you know, you can upgrade it right away with
17:47 pip whenever there's new changes and version it separately than what the OS is versioning VNV. So
17:53 I don't know, what do you guys think? Does that, that sounds like a pretty good reason for it to be
17:56 around actually, all those reasons. Yeah. The downside of it's confusing to have two.
18:03 It is confusing to have two. Well, and I was confused about as well. And I'm not saying I'm switching to
18:07 it necessarily, but I can see why that it's pretty interesting. I guess I'm sort of between the two
18:12 of you from the standpoint of, I like that there is a lot of activity in this space as far as both,
18:17 like we just, we just talked about PipBend with, you know, virtual environments and with, you know,
18:22 installing and package management, that sort of thing. It's sort of a tricky issue. And so the fact
18:27 that people are trying to improve, you know, people are looking at pain points and trying to build tools
18:32 to improve on those is fantastic. I think sort of the confusing part is, and again, as someone who
18:37 just started a new job and I've just been going through the process of setting up a new machine.
18:40 You've been installing all the things, right?
18:42 Yeah. Well, either installing all the things, or unfortunately there's, you run into sort of like
18:47 a namespace pollution thing where like almost everything is called like Pi ENV something or,
18:54 or pip Venve, or, you know, like a lot of the names are very similar. It's one of those things where
19:00 it's, you know, sort of the good side of the bad side of the coin. Again, like it's great that these
19:06 things are being worked on because, you know, especially with Python, you want to have, you know,
19:10 some sort of separation, some sort of dependency management. And so wanting to make sure that
19:15 you're developing the right version of Python and that you're not overriding things or creating
19:18 conflicts. But I guess it's a situation where one or two dominant solutions show up. We'll sort of
19:25 standardize on those, but now there's, you know, a little bit of confusion as we get to that point.
19:29 Yeah. Yeah. It's good to see a thousand flowers blooming, but it is tricky to know which one's
19:34 going to be around. All right. Which flower do you pick? You know, there are literally a thousand
19:39 of them blooming, Seth. Exactly. Exactly. Brian, what you got next for us?
19:42 Well, a little bit of testing. I don't know if we've talked much about hypothesis, but people
19:47 probably know about hypothesis, property-based testing. Hypothesis is kind of mind-blowing a little
19:52 bit, to be honest. It isn't a silver bullet, but it's kind of a cool thing. So I am highlighting a
19:57 project, which is relatively new by Zach Hatfield, Dodds, and Paul Gansel are two people working on it so far.
20:04 This is the idea of adding property-based tests for the Python standard library and for the built-ins.
20:11 And their comments are that the CPython's existing test suite is actually very good, but bugs do still
20:18 slip through occasionally. And maybe throwing some property-based testing tools at some parts of it
20:24 could help. It's not a magic bullet, but computer-assisted testing techniques routinely try inputs that humans
20:30 wouldn't. And hypothesis is what we got for Python. So why not? There's not very much covered yet in this
20:37 project, so I'm highlighting it to try to get other people that are interested on board. But they want
20:42 to try to have a compelling proof of concept by PyCon US this year to be running as a, and to see if it'd be
20:49 worthwhile to have it running as part of the Python continuous integration suite to see how that goes.
20:56 I think it's really, my view on the hypothesis really is that it's especially geared towards helpful for
21:03 algorithmic pure functions. And in a lot of cases where you have like two functions that work kind of
21:09 in opposite directions, so you can do round trip, it's easier to set up a test for hypothesis to see,
21:15 like for instance, encode or decode. You can take some sort of string or something and encode it,
21:20 and then use the decode to make sure that you've got the final output is the same as your input.
21:26 These are easier tests. Functions that have, that are not pure, that have state, that depend on state,
21:32 those are harder things to test with hypothesis. So I think there's actually quite, and that kind of
21:38 applies to a whole bunch of the standard library. So I think there's a whole bunch of stuff that could
21:42 be tested more thoroughly with hypothesis. So this is pretty cool.
21:46 Yeah, it's a really interesting way of testing, and I'm glad to see the project. It looks cool.
21:49 One of the things I like about it is these are some people that I respect,
21:53 and having some people do these focused examples of how to use hypothesis in this way,
22:00 I think will actually help as a teaching tool to help other people learn how to use it.
22:04 Yeah. I would love to see like a big set of the standard unit tests for CPython moved over
22:13 and maybe condensed and brought down into like this hypothesis style to see what the two sets of test
22:18 suites look like. That would be interesting. Feels like a lot of work. That would be interesting.
22:22 Oh, but even like a specific case of taking like one, what are the functional tests in that exist in
22:29 CPython already? What do those look like compared to the property-based test? They're testing different
22:34 things. So I think it'd be cool to see them side by side too. That's neat.
22:38 Yeah. So property-based testing is a thing that I saw in my prior job, I did mostly QA.
22:43 And so I started to look into property-based testing. It's one of those things that it sounds very
22:47 interesting and that something that I'd like to know more about and just have another time to dig into.
22:51 But this project looks interesting. And it also kind of flows right into my topic. So the people
22:58 that you were just talking about, Zach Hatfield-Dowd and Paul, they are doing a tutorial on
23:04 property-based testing. And so what I wanted to talk about was just about, what time is it now?
23:08 Three of my time. So about two hours ago, I got an email from PyCon saying that the PyCon tutorials,
23:13 the schedule for the PyCon US tutorials, PyCon US 2020, the schedule for those tutorials is up and
23:19 available and you can register for them now. And so if you are thinking about going to PyCon,
23:24 depending on what you do, different people, you know, some people work in places where their
23:30 companies would just send them PyCon and it's not a big deal. Other people have to make a business case
23:34 to try to sort of convince their organizations to let them go. If you are in a situation where you need
23:38 to make a business case, the tutorials are often an excellent tool for that because you can get
23:43 a lot of high quality training from people who are very knowledgeable in their fields. And so one of
23:49 the sets of people, one of the tutorials is actually an introduction to property-based testing by the same
23:55 people that Brian was just talking about. So there's a link here, you know, to PyCon.org. So
24:00 there's a full schedule of the different tutorials that are available and you can register for them
24:05 now if you'd like. They do tend to sell out pretty quickly though. The PyCon tutorials tend to be
24:09 pretty popular. They tend to sell out pretty quickly. The good news is that the videos of the tutorials are
24:15 all available. So even if you haven't, if you weren't able to make it to a prior PyCon, the videos for
24:21 those tutorials are available. And so you can look at past tutorials. The big advantage of actually going to
24:26 PyCon and going to a tutorial is again, just the fact that you have a chance to interact with the
24:31 people who are giving the tutorial and to be able to ask specific questions that meet your specific
24:35 use case. Yeah. And make connections, right? Yeah, exactly. I mean, make it, make connections with
24:39 people. Again, like if you are trying to say, for instance, you know, just to say with the hypothesis,
24:44 with the properties-based testing, if you're trying to implement that where you are, not only now is
24:48 there this effort to bring some property-based testing into CPython, but you take a tutorial,
24:55 you can actually interact with the people who are sort of leading this effort. And then if you have
24:59 specific questions, you've made a connection where you can reach out to those folks and try to get some
25:04 help as far as implementing, you know, trying to figure out, you know, what to do to implement that kind of
25:07 thing where you are to get a better understanding of the use cases, that sort of thing. So I went through,
25:12 like I said, I think the schedule just went up an hour or so ago. So I went through and sort of looked at ones
25:18 that were interesting to me. A couple of standouts to me were one, there's a tutorial on migration from
25:22 Python 2 to Python 3. And as Michael was just talking about, you know, Python 2 is now end of
25:27 life. And so, you know, if you have not moved to Python 3, now, you know, now is the time, you know,
25:33 earlier was really a better time, but you know, there's no time better than now if you haven't
25:38 done it before. So a tutorial on that, that'll be really helpful. Another one called Welcome to
25:42 Circuit Python by Katni Rembor. We were talking before with Michael's point about the remote control
25:48 cars. If you're looking at ways to get started with programming or to get other people into
25:51 programming, actually programming hardware is a good way to do that. You know, few things get
25:57 people's attention, like writing some code and making it, making the light turn on and making the light
26:00 change color or making it flash in a certain pattern. And so the Circuit Python, I remember, I think at
26:05 PyCon last year, everybody got like a Circuit Python playground board, like a small little mini circular
26:11 board that had lights and various sensors on it. And so I've been to one of Katni's tutorials,
26:16 like a PyOhio in 2018, maybe. And so it's the Circuit Python boards are really interesting.
26:23 You've got lights and sensors and you can, you know, you can build all sorts of things with them.
26:26 And it's a great gateway into programming, great, great way to get started. Or if you're an experienced
26:31 developer, a great way to start get started with hardware programming. And then the intro to
26:34 property based testing. And then there's another tutorial called Minimum Viable Documentation by a
26:39 woman named Heidi Waterhouse. And I've met Heidi, we spoke at PyCaribbean together, I think a couple of
26:43 years ago. But it's this idea about how do you set up a proper technical, you know, a proper
26:50 documentation structure for your projects, and focusing on the technical writing aspect. I think
26:54 it's one of those things, especially as a project gets larger, but even in a smaller project that gets
26:58 overlooked, sometimes there's so much focus on, let's write code that does this thing. And that's
27:02 fantastic. But what if you want to add a second person, add a third person to that project,
27:07 and your options then become either the first person sits down and just spends four hours talking
27:13 to the new person, you know, or if you have good documentation, a good documentation, a good
27:18 documentation structure, you can just point them to the documentation and let them get up to speed on
27:23 their own. I mean, there are multiple other tutorials, but those are ones that just sort of stood out to me.
27:27 But if you haven't been to a PyCon US, the tutorials are, I think, one of the strong reasons
27:33 to want to go, among other things, you know, meeting people and making connections and that sort of
27:36 stuff. And the open, you know, the open spaces in the hallway track, but the tutorials, especially
27:41 also if you're in a situation where you need to make a business case to your company to get support to
27:46 go, the tutorials are really good, a really good option for that.
27:49 I love that angle. And I also approached it the same way that you do is like, oh, these are out,
27:53 let me see which are interesting to me. So I came up with three as well, maps and machine learning,
27:59 spatial analysis with TensorFlow, scikit-learn and PyTorch. And I think it's really cool,
28:03 kind of like you're talking about the hardware is like, you take geospatial data and real world
28:08 things and do awesome stuff with it with Python. So here's kind of the map version of that. I think
28:13 that one's a fun one. And then hands-on web app test automation by Andrew Knight. Brian,
28:22 that'd be a good one for you as well, right? Like that sounds pretty interesting.
28:25 Yeah, it does look good.
28:26 Yeah. And finally, bigger, better, faster, more building applications in Python. That also looks
28:31 pretty cool to me. So there's a bunch of other great, and this is not like the best of list or
28:36 whatever. This is just like stuff that stood out to me like, oh, I'd go to these. Sounds pretty cool.
28:40 And these tutorials are priced way lower than any sort of corporate training is going to be
28:44 priced. Yeah. Yeah. Very cool. You guys are both going to be at PyCon, right? Brian,
28:49 you're speaking. Is that true? I am speaking. Yes. On what topic do you speak? I am talking about
28:54 parameterized testing. Awesome. And Kojo, I'm guessing that you're going to be there. You're at a lot of
28:58 the conferences. Yeah. And actually, so this year, I just started a new job. I'm working with a company
29:03 called RevSys now. They're sponsoring it, so I will be there. But yeah, Ian, I would have been there either way,
29:07 probably so. Yeah. Awesome. I'm glad you're going to be there as well. All right, Brian,
29:12 I guess that's it for our main items, huh? Yeah, it is. You got anything to share with folks?
29:15 I was going to share with folks that I'm speaking at PyCon, but we already covered that.
29:19 We snuck it in the previous one. How about you, Kojo? Anything extra you want to throw out there for
29:24 the world? No, I don't think I have any new, exciting Python-related stuff.
29:28 Well, I've got a couple to share. One, Eric Cho, just released the third edition of his
29:34 Mastering Python Networking, which is a cool little use Python to control all the network
29:39 things and set up network topologies and whatnot book, which is quite interesting. And I got a chance
29:43 to write the foreword for that. So thank you, Eric, and I'll link to the book. Also, speaking of network
29:49 things, both Pyramid, through the Waitress web server thing, and Django have issued vulnerability
29:57 CVEs. So yeah, if you have either of those in production and they're on the internet,
30:02 or even not, you might want to do a little upgrade, a Pippin's all upgrade, all the things on it.
30:07 Because yeah, there's like a SQL injection vulnerability, like a little Bobby Tables
30:12 vulnerability in Django, and some other similar type of thing for Waitress, and those are not
30:17 good to have. And why is Pyramid and Waitress together? Is Waitress bundled with Pyramid?
30:22 It comes with Pyramid. And I think the guys who work on Pyramid may also work on Waitress. I'm not
30:28 sure I could be wrong about that. So sorry, people who work on Waitress, if I got that wrong. But
30:32 certainly when you install Pyramid, you get Waitress, and you want that to be up to date.
30:36 Waitress server, you know, things like that.
30:38 Okay, and then the last thing, kind of like your item here, Kojo, even shorter time, like 45 minutes
30:46 ago, the Stack Overflow 2020 survey is open. So everyone should go fill that out. There's a ton
30:52 of information about where the broader ecosystem is at here. So it takes about 10 minutes. It's a
30:59 little bit long, but it's totally worth it, I think.
31:01 Yeah, and if there's anywhere in there where you can plug our podcasts, go for it.
31:05 I don't know if there is.
31:06 There totally should be.
31:06 Like, where do you get your news or something like that?
31:08 Yes, exactly. Other. All right, Brian, I picked a joke for us that's graphical, so we have to do a
31:14 little work describing it. But I think it's going to come out pretty well, because I think it's right
31:20 up your alley, actually, here. So this is a comic, which is Richard's Guide to Software Development.
31:27 And I'll kick it off. There's like a cat with little like super bionic legs. And underneath the
31:34 caption is, how the software is designed. You want to take it from here?
31:38 Okay, well then the next one is, how much time has to be spent on each part? And there's like 4%
31:46 for the head, and then 2% for the middle of it, 80% for the tail. Oh yeah, that's totally true.
31:52 Nice. The next one is, how the software looks before the beta test. It's a cat, but it has no back
31:59 legs at all, but it's still like suspended somehow.
32:01 Yeah, and then how the software looks after the beta test, there's no front legs, but there are back
32:06 legs. I'm just trying to imagine what happened here. Like, no, no, we wanted legs on the back of
32:10 the cat. Like, oh, you want the legs on the back? Sure, we'll put them on the back. Okay, we'll just
32:13 move them. Yeah.
32:14 And then how the software is advertised is like a tiger springing out of a picture with like action.
32:21 Yeah. What the customer really wanted, there's just a question mark, because nobody asked.
32:26 Exactly. And then how the software looks two versions later, it has a nose like an anteater or an elephant.
32:33 It's just a random human arm coming out the back of it.
32:36 Oh man. And the last scene has like a dude petting this cat that has the arm sticking out with the
32:43 elephant nose saying, I still like you anyway.
32:46 The cat says toots. Yeah.
32:49 Anyway, there's a nice little testing one. Actually for you as well, Kojo, right? You were in QA.
32:53 Yeah, it used to be. Yeah, the developers love their software.
32:56 That's great. All right. Well, this is a lot of fun. Kojo, thanks for being here. And Brian,
33:03 thanks as always. Glad to have you back this week.
33:04 Yeah, yeah. Thanks.
33:06 Thanks for having me, you guys.
33:07 Yep. Bye, everyone.
33:08 Bye.
33:09 Bye.