Transcript #115: Dataclass CSV reader and Nina drops by
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 115, recorded January 29th, 2019. I'm Michael Kennedy.
00:12 And I'm Brian Okken.
00:13 And Brian, we got a special guest, don't we?
00:14 Yeah.
00:15 Nina Zankarinko. Say hello, Nina. How you doing?
00:18 Hey, everyone. I'm very proud of you for pronouncing my last name correctly.
00:22 Thank you. Brian and I, we specialize in mangling people's last names on this show, but we try.
00:29 - Well, this time you nailed it.
00:31 - Thank you.
00:32 - For those who don't know me, I'm a senior cloud developer advocate at Microsoft and my focus is on Python.
00:38 You can find me on Twitter @nnja.
00:40 That's like ninja, but without the I.
00:42 - Yeah, that's a pretty cool Twitter handle.
00:44 Awesome, and also this episode is brought to you by Datadog.
00:47 Check them out at pythonbytes.fm/datadog.
00:49 Tell you more about that.
00:50 You know, Brian, I expect quite a bit of stuff out of Datadog.
00:55 I would say I have great expectations when I go use their stuff.
00:58 What do you think?
00:59 How about you?
00:59 - Yeah, yeah, I do too, yes.
01:01 For our first item, we have great expectations.
01:05 And it is a package that was shared by a listener, and I don't know the listener 'cause they shared it with you, Michael, and you didn't tell me who it was.
01:12 - I just sent you over the link and I forgot, but thank you for sending it in.
01:15 Next time we'll do a better job.
01:17 - Well, we're just also trying to make it so that sharing information with everybody else is not an ego-boosting exercise because we won't remember your name.
01:26 - Or we'll mispronounce it.
01:27 Unless it's important to you, then let us know.
01:29 Yeah.
01:30 Now, great expectations.
01:31 It's kind of cool.
01:32 It's this idea that we have a lot of tools out, for instance, pytest, to test your code, but there's in a lot of stuff, the data that you're running your code through, like data science or a lot of data pipelines, the data is important too, and being able to check to make sure your data fits what you expect it to fit, what it looks like is important.
01:56 So these are some really cool expect calls.
02:00 They're a bunch of functions that start with expect.
02:03 They aren't assertions, so they aren't going to throw an exception.
02:07 But what happens is you--
02:09 like, maybe on some of them, you pass them a data frame.
02:12 Like, I'll just give one as an example.
02:14 You expect a column to exist.
02:16 So you give it a data frame, and you give it a specific column, and you want that column to actually be there.
02:22 And if it's not, you get--
02:23 actually, regardless of whether the answer, It comes back in the form of a JSON object, and it has a valid--
02:31 and you can say whether or not--
02:33 if it failed or passed the test.
02:35 But it also shows you the parts where it didn't.
02:37 So this is-- there's a little video, actually, demo video that they have, where you can see it in action using a Jupyter Notebook.
02:44 And it's kind of cool.
02:45 It shows you exactly where it's failing.
02:48 So I imagine doing this interactively to look at your data would be helpful.
02:53 But also, you could probably put this in place in some data cleaning steps to make sure things are around, like making sure there aren't any nulls in a column.
03:01 There's a whole bunch of different things you can assert on or expect on your data.
03:05 It's pretty fun.
03:06 - Yeah, it's pretty cool.
03:07 Some of them are totally straightforward, like expect these values to be in the set.
03:11 Others, a little more data science, mathematical focused, like expect the chi-squared test P value to be greater than such and such, right?
03:20 (both laughing)
03:22 I honestly haven't done a lot of chi-squared lately, but I don't do that much data science on the web.
03:26 It's more we use addition and stuff like that.
03:30 - Yeah, but some of the fun things, like it was in the video example, he expected some data to be in, or data from a column to be in a particular set, and it was either male or female.
03:44 And first off, like how binary of this?
03:47 But anyway, the males, a lot of them came back with spaces in them.
03:51 So doing some of this exploratory thing might tell you where you need to add some cleaning steps or dealing with nulls or things like that.
03:59 The follow-up, I'd like to hear how people might be able to use this, how it's used exploratory-wise, but how I'd like to see somebody using it in their pipeline stages and how that works.
04:12 I guess I imagine if you had it in production, you'd have some code that would, if it failed an expectation, you'd write a log entry or something, or I don't know what you'd do.
04:22 - Yeah, or maybe return, if you were accepting data over a web method, right?
04:26 Somebody's doing ETL and they're like, "Here, we're submitting this new set of data." You could return like 400 bad requests to indicate, "No, no, something's wrong with the data you sent me." Things like that, possible.
04:36 - Yeah.
04:37 - Nina, what do you think about this?
04:38 - I think it's very cool and is probably gonna be pretty helpful.
04:42 - I like it as well.
04:43 What I like about it is it lets you take what would be a little algorithm you'd have to write to say go through and test all, say the chi-square values and then compare them and then assert on that.
04:52 Now you just do one line and it does it on the whole data set, the whole data frame.
04:56 That's pretty sweet.
04:57 - Yeah, I'm gonna be watching the video demo after the show.
04:59 - Yeah, right on.
05:00 So the thing that you are gonna cover next, the timing is incredible, Nina.
05:04 I literally got a notification that I had ordered one of these and it shipped today and it's on its way to my house.
05:11 So I'm very excited.
05:12 Tell people what is on its way.
05:15 - Would that be the Circuit Playground Express?
05:18 - It would be, yeah.
05:19 - Awesome.
05:20 Yeah, so I wanted to chat a little bit about using CircuitPython and MicroPython to write Python for wearable electronics and embedded platforms.
05:29 I've been playing with electronics projects as a hobby for probably about the past two years now.
05:34 In the past few months, I've been focusing my attention on Python for microcontrollers.
05:39 - Right on, what kind of little things are you making with your projects?
05:42 My last one was Python-powered LED earrings, and I dropped a link to the repo for the code as well as the photo, so you can see that.
05:50 Awesome.
05:51 Okay, so what I know, I've heard of MicroPython, and I think I've heard of CircuitPython.
05:55 Are they the same?
05:56 Are they different?
05:57 Tell everyone about it.
05:58 Yeah, there's definitely a little bit of confusion about that.
06:00 So MicroPython is the original.
06:03 It's a lean and efficient implementation of Python 3 that can run on these tiny little microcontrollers.
06:09 And all it needs is 256 kilobytes of code space and 16 kilobytes of RAM.
06:15 It's incredible.
06:16 - It's truly awesome.
06:17 Yeah, it's so super low level too, yeah?
06:20 - And CircuitPython is a port of MicroPython and it's optimized for Adafruit devices.
06:26 - Cool.
06:27 So I guess that's the one I'm gonna be learning about, yeah.
06:30 - Yeah.
06:30 And some of these, the devices that Adafruit sells, they're as small as a quarter.
06:35 That would be the Trinket.
06:36 But of course, my favorite Python hardware platform for beginners is that the Adafruit Circuit Playground Express.
06:43 It has everything you need to get started with programming hardware without even needing to learn how to solder.
06:49 All you need is some alligator clips for the conductive pads, and the board has a ring of NeoPixel LEDs.
06:56 It has buttons, switches, temperature sensors, motion detectors, sound sensors, a tiny little speaker, and a lot more stuff.
07:05 You can even use it to control servos, which are those tiny little motor arms.
07:09 - Wow, that's really awesome.
07:11 - Yeah, it's a tiny little thing.
07:13 - Yeah, what I really like about this, and the reason that I ordered it was, I can go to Adafruit and look around, and I'm just like, this is too low level for me.
07:20 I don't really know what I need, and I don't even know if I have a power supply, if I get this little chip or that, like how to put together.
07:27 I'm like, okay, give me like one thing that has all the stuff to do little projects like you're describing, and I think it's awesome.
07:33 And doing it in Python is super cool.
07:35 - It only costs $25.
07:37 - Yeah, it's not too expensive.
07:38 - No.
07:39 And then if you don't wanna use Python to program this, there's a tool that you can use called Microsoft MakeCode, and it lets you program these little devices with a drag and drop style kind of scratch-like interface.
07:53 So that's perfect for kids, and you'll find a lot of examples on their site.
07:57 - Oh, that's awesome that you point that out because I might get my daughter to do some kind of little game, you know, like a Simon Says or something with the LEDs.
08:04 Who knows, that'd be fun.
08:05 - Yeah.
08:06 - The Mew editor has some tutorials on using these as well.
08:09 - Right.
08:10 - That's awesome.
08:11 - Super cool.
08:11 All right, and I like you threw in the link, yeah, to your code so people can do the earrings as well.
08:16 - Yeah, and like you said earlier, there are tons of guides for Python projects on the Adafruit website.
08:22 Stuff from making your own synthesizers to jewelry to silly little robots.
08:27 So definitely make sure to check that out.
08:28 - Cool, yeah, well, I can almost recommend it.
08:31 It looks really, really good.
08:32 And when I get it, I'm going to play with it and let everyone know what I think.
08:35 But yeah, it seems like a great little package that you can get at $25.
08:39 It's like, as software developers, you could just try it, right?
08:42 It's not that big of a risk.
08:43 It's not like you're getting a new MacBook or something.
08:46 [LAUGHTER]
08:47 And Adafruit has a Python for microcontrollers mailing list.
08:51 And they always drop kind of hot news and interesting new things.
08:54 So there's a link to sign up for that in the show notes.
08:57 Awesome.
08:57 That's a great one.
08:58 So this next one, I think, is a really interesting use of Python 3.7.
09:04 So when you think of the main features of Python 3.7, certainly data classes has to be one of them.
09:11 Have either of you found any use for data classes yet?
09:13 Yeah, I just love them.
09:14 I use them like named tuples.
09:15 Yeah.
09:16 Yeah, they're awesome.
09:17 Trey Hunter has a great talk on data classes.
09:20 Definitely.
09:21 So this is a library that's derived from data classes, and it's a CSV file reader.
09:27 Now Python comes with pretty good support for CSV readers.
09:29 You import CSV and then you create a dict reader based on a file stream and it'll read the header and figure out the columns and then it gives you a little dictionaries based on the column names and that's pretty sweet.
09:39 But what you get back is a whole bunch of strings corresponding to those values, right?
09:45 And with this, what you can do is you can actually define a data class that maps the schema of your CSV file.
09:53 So I can define a data class that maybe has an ID and a name and a value or price, right?
09:59 Maybe it's like products.
10:00 So like the ID could be an integer defined in the data class.
10:04 The name could be a string and the value, the price could be say a float.
10:07 And it'll actually do all those conversions for you and give you meaningful errors if like it's a non-parsable float or something like that.
10:15 Ain't that nice?
10:16 - That's incredible.
10:17 Working with CSV is the bane of my existence.
10:19 - Yeah, so you can just define these things.
10:21 You get auto-complete in, you know, PyCharm or Visual Studio Code for your types, for your rows because they come back as these data classes.
10:29 And you get validation.
10:31 And on top of that, you can actually do cool stuff.
10:33 You can say, with data classes, you can specify either just the type or the type and a value.
10:40 And that value becomes the default value.
10:42 So if only sometimes the price is there, you could put 0 or minus 1.
10:46 And it'll just go through and substitute that value.
10:48 So a lot of cool little nice touches here.
10:50 Nice.
10:50 Yeah.
10:50 I'm definitely going to check this out the next time that I have to do some sort of CSV parsing, because it's way better to let this thing do the validation and the type conversion and all that and just not worry.
11:00 I don't think I've been this excited about CSV files in a long time.
11:03 I know.
11:04 [LAUGHTER]
11:06 They are pretty amazing.
11:08 No, this really makes working with them nice, and I'm excited too.
11:11 All right, speaking of excited, I do want to tell you about Datadog.
11:14 They're helping make this show possible.
11:16 So before we get to our next item, let me tell you about them.
11:18 This show is brought to you by Datadog.
11:21 They're a cloud scale monitoring platform that brings like metrics and logs, distributed traces all together.
11:27 You can do auto instrumenting of frameworks like Django and Flask and PostgreSQL, which means you can track requests across service boundaries, across machines, things like that, which is awesome.
11:38 It makes it really easy to troubleshoot your slow Python apps and figure out overall where the time is being spent.
11:44 So you can get started for free at pythonbytes.fm/datadog and they'll also give you a cool t-shirt with a Datadog character on it, which is nice and cute.
11:54 So check them out, it helps keep the show going.
11:56 Now, Brian, I wanna come to a topic that we haven't really covered very much on the show, but maybe, I think a while ago, we did talk about packaging once, right?
12:05 (Brian laughs)
12:06 - Yeah.
12:07 - You wanna catch us up on it?
12:08 - I think it's only second to GUI's so far.
12:11 - Let's try.
12:12 - There's a fun article called "How to Rock Python Packaging with Poetry and Briefcase." Plus it has like the phrase how to rock something, and I'm a sucker for that.
12:22 It's actually kind of a nice tutorial on packaging.
12:25 So for those of you that just joined us and haven't learned all of our discussions on packaging, this is a nice introduction to packaging and how it fits in Python, and also kind of how the changing of things, it's changing of packaging, like where flit, pipenv, and poetry sort of fit in with all of this.
12:45 It's kind of a nice run through of that.
12:47 Poetry is one of those things for packaging, and it uses the pyproject.toml file.
12:54 And of course, we talked about Poetry in episode 100.
12:57 And the nitty gritty details of pyproject.toml was in testing code 52 with Brett Cannon.
13:05 But one of the neat things, why I picked this, is it also talks about Briefcase.
13:10 And we haven't talked about Briefcase yet.
13:13 And Briefcase is one of those tools from the Beware project, and it's something that you can, it packages your, a Python application as a standalone native application for lots of stuff.
13:27 It claims Mac, Windows, Linux, even iOS and Android, which is interesting.
13:32 Haven't tried any of this.
13:33 The tutorial talks about desktop distribution of code through briefcase, and it's kind of cool, and how to get that done with Poetry.
13:42 - I think Poetry's definitely nice.
13:44 It's sort of an alternative philosophy to pip-inf, which is, we talked about that as well.
13:50 And Briefcase is part of that whole set of small independent tools from B-Ware, which also is pretty cool.
13:57 And it's nice to see them working together.
13:58 Also, we got Cookie Cutter doing some magic in here as well.
14:02 - Definitely, and then one of the things that I like at the end of this, there's several tutorials on publishing, like how to push your new package to PyPI.
14:12 But this one I really like because instead of telling you exactly how to push it to PyPI, they tell you how to push it to the test server.
14:20 And I think that's an important step for people to do before you subject the world to your code, try it out at the test server first.
14:28 So it's nice.
14:29 - Of course.
14:30 - Yeah, of course.
14:31 Why don't more of them do that?
14:33 - I don't know, but please everybody, like save the world and push it here first.
14:39 - Yeah, the packages on PyPI cannot be changed are uploaded, you can only add newer ones.
14:44 So, although you gotta admire the rate at which you'll increase your version of your package if you screw it up a few times trying to publish it.
14:53 (laughing)
14:55 - Yeah.
14:56 - That's productivity, right?
14:57 - That's right.
14:58 So Nina, this next one that you found for us is one of these awesome lists.
15:04 And I think these awesome lists are coming along really faster and faster these days, right?
15:08 We got awesome Python, awesome Python applications.
15:11 What's the next one that's in that category?
15:13 - And this is a new one I came across called Awesome Python Security.
15:18 It's a collection of tools, techniques, and resources to make your Python more secure.
15:22 - Oh, that's cool.
15:23 Yeah, and it's got a lot of stuff for web apps like the secure.py, which is awesome.
15:27 We've covered that in the Flask, Flask-Tailsman, Django, Sessions, all kinds of stuff, right?
15:32 But not just the web, there's a whole bunch of other ones.
15:35 - I think, and hopefully all of you agree, that all of your production and client-facing code should be written with security in mind.
15:42 And this list features a few resources that I'd come across before, like Anthony Shaw's excellent 10 common security gotchas article that highlights problems like input ejection and depending on assert statements in production.
15:56 And I also came across a few that were new to me.
15:58 So the OWASP Python resources, OWASP stands for Open Web Application Security Project.
16:05 And there's tons of OWASP resources out there.
16:08 I didn't know that there was a Python specific one.
16:11 You can find that one at pythonsecurity.org.
16:14 I came across Bandit, which is a tool to find common security issues in Python.
16:18 Now Bandit has a lot of really useful plugins that test for some issues like hard-coded password strings in production, leaving Flask debug on in production, using exec in your code, and a lot more.
16:31 I linked to the full list in the show notes.
16:34 And then a few other cool ones like Detect Secrets, which is a tool to detect secrets that were accidentally left in your Python code base.
16:42 - That's cool. - Yeah.
16:43 - Let's open source that.
16:44 Oh wait, was our full access AWS or Azure key in there?
16:48 Whoopsie.
16:49 (laughing)
16:50 - Oops, oops.
16:51 Oopsie doops.
16:52 - We'll just check it in again without that in there.
16:54 I'm sure it'll be fine.
16:55 There's no history.
16:56 - And something I really like about this list in particular is it also includes resources for learning about security concepts like cryptography.
17:03 - Yeah, you know, out of that cryptography section, they listed one of my all time favorite packages, which is passlib.
17:10 So if you're gonna store user secrets and you want to hash them, like passwords are probably the most common, but there could be other things as well that you don't wanna store directly, but you wanna accept from user and see if you have it.
17:23 All right, like you can hash it and that's a good idea, but what you really should do is like take that result, add some salt, then hash it again, take that, do it again, maybe a hundred thousand times.
17:33 Right, passlib, that's like a one function, like dot encrypt rounds equal 150,000, 200,000, whatever.
17:39 It's really nice.
17:40 - That's awesome.
17:41 To make sure your password doesn't end up on have I been pwned.
17:44 - Exactly, exactly.
17:45 So basically you can say I want it to take .2 seconds to determine, to brute force or to check each version of the password.
17:54 And it automatically, because of that, will slow down dictionary attacks against your site.
17:58 'Cause you can only do them, you know, it'd take only five per second, right?
18:01 So, and then there's another one called let's be bad guys, that's interesting.
18:04 So yeah, a lot of cool stuff here.
18:06 (laughing)
18:07 - That's a great project name.
18:08 - I know, it's like a hacker playground.
18:10 - Yeah, so check out the full list on GitHub and then if there's something missing that you think should be there, maybe open a pull request.
18:17 - Yeah, absolutely.
18:18 That's a cool one, I'm glad you found it.
18:20 All right, the last official item I wanna cover is PyDBG, which is the implementation of a Rust macro called DBG.
18:29 So just put the pi on the front.
18:32 Now, I haven't done that much Rust.
18:34 I've actually been wanting to learn Rust.
18:35 It looks pretty interesting to me.
18:37 But the basic idea of this dbg macro is instead of just printing out like, I'm here, I'm here, the value, printing X as the value, it'll actually give you a higher level statement without doing more work.
18:51 So if you're trying to debug something through print statements and that kind of thing, this makes it a lot easier.
18:56 So you can go and say, like I have A equals two, B equals three.
19:00 If I could say dbg of A plus B, The output is the file of the line, A plus B equals five.
19:07 Things like that.
19:08 Really, really nice.
19:09 It sort of shows you in your message where you are in the file, what thing is you're actually printing without having to come up with elaborate print statements.
19:18 So pretty cool.
19:19 - Oh man, I'm gonna use this like every day.
19:21 (laughing)
19:23 - Do you still use print statements to debug, Brian?
19:25 - Yes, I do.
19:26 I love print statements.
19:28 (laughing)
19:29 - I use the debugger a lot, but every now and then I'm just like, I just want to print this out and just see what is happening.
19:36 I don't primarily use print statements for debugging, but sometimes I do when I'm kind of exploring.
19:42 And I want it to run, but I kind of want to see what's happening.
19:45 I'm like, oh, what am I getting back from that API?
19:47 What is this value?
19:48 Things like that.
19:49 Have either of you used watch statements?
19:51 No, tell us about it.
19:52 You can just set up a variable or an expression to watch, and every time you hit a breakpoint, you're like, oh, I see what's in there.
19:59 I don't have to type it again.
20:01 With VS Code or PyCharm?
20:02 I believe you can set up watches with PDB2, but I don't know.
20:06 I usually do those in a graphical debugger.
20:08 Yeah, me too.
20:09 Yeah, I definitely have used those.
20:10 I was thinking something different.
20:12 But so where I'm going to use this DBG, PyDBG thing, is a lot of times I've got, we've got test code that generates huge amounts of data, like trace data.
20:24 And these are stored and the test runs are really long.
20:29 throwing a couple of these extra ones for intermediate values so that failing tests or failing test runs, we can take a look at those post-mortem, things like that.
20:40 Just save-- it's an elegant way to have that be done.
20:44 Yeah.
20:44 It's pretty cool.
20:45 What I like about it is it's so simple, right?
20:47 You place the word print with DBG, and you've kind of got something going on here.
20:50 I also kind of like that it's more explicit.
20:52 You're like, this is not really supposed to be a print statement.
20:55 This is just here till I figure out what's going on.
20:57 And then we're going to stop this.
20:59 But cool, people can check it out.
21:01 Thanks for sending that in.
21:03 To our listeners, all right, so I guess that's it for all of our main topics, but looking at our show notes here, Brian, we all kind of had a second round in the extras, so maybe we'll do a lightning round one more time.
21:14 What do you got for us?
21:15 - This is just a cookie that pytest has temporary directories and temperature factory fixtures for dealing with temporary files, but they've added, as of pytest 3.9, there's a path versions that return pathlib path objects.
21:33 And those are just quite fun and I'll drop a link in the show notes.
21:37 - Okay, that's great.
21:38 So I want to bring your attention to something, let's say non-standard in terms of conference presentations.
21:44 So this is something at PyCon US.
21:46 So in May, Cleveland, 2019, there's a project called the Art of Python, which is a miniature arts festival focusing on narrative performance and visual art around programming and Python, and basically showcase novel art that helps us share our emotionally charged programming experiences, particularly to do with Python.
22:08 So it's like five to 20 minute presentations in a separate little track, and the call for papers are open.
22:13 So if you've always been a theater fan and you program, here you go.
22:18 - Oh, this looks very cool.
22:19 - Yeah, yeah, that's pretty interesting.
22:21 So people can check that out if that connects with them.
22:23 The other one is one of my favorite surveys and sort of put your finger on the pulse of the community items is the Stack Overflow Survey.
22:31 Well, the 2019 one is open.
22:34 So everyone should go out there and represent for Python and fill out the 2019 Stack Overflow Survey.
22:39 So that's good.
22:40 And then finally, this gets a little bit back to your pick, Nina.
22:44 NumPy is awaiting a fix for a critical remote, remote code execution bug.
22:51 That's bad.
22:53 That doesn't sound super good.
22:55 So yeah, I don't know if it has been entirely fixed yet.
22:59 I don't, you know, this is a couple days ago, it was not.
23:03 So the idea is basically there's a problem with the pickle module.
23:06 Have you ever, could you imagine there'd be a problem with accepting user input straight in pickle form?
23:12 I can't imagine.
23:13 So the idea is there's some part of NumPy that you can load pickle data.
23:19 And you know, for those of you who don't know, like part of the pickle statement is here's some Python code as a module and here's arbitrary code to run as part of deserializing that.
23:29 So good luck.
23:30 - Oh boy.
23:31 - Yeah, yeah, that's not so good.
23:33 So this goes up to at least version 1.10 through 1.16, which at least is January 14th, this hadn't been fixed.
23:40 So hopefully it's been fixed, but more importantly, if you're using NumPy and you're accepting user input through the load function, you wanna upgrade and you wanna be a little careful around that.
23:51 All right, then last one, I just wanna throw out there really quick.
23:53 I ran across this and I've known about it for a long time, but it turns out to be more useful than I thought.
23:59 So I use Google Docs a lot, and I have like sheets in there, and I've got Word, like documents and stuff.
24:07 But the problem is if you use like Google Drive, what ends up on your hard drive is like a hyperlink back to the actual sheet, right?
24:13 So how do you back that stuff up?
24:14 It turns out if you go to takeout.google.com/studying/takeout, that's a lot of repetition.
24:20 Anyway, you go there, you can say, give me all my document format, all my documents, and it'll give them to you in Microsoft Office format.
24:26 Like it'll convert the sheets to Excel, it'll convert the docs to Word docs, and then let you download them so you have like a sort of permanent version.
24:33 Anyway, I thought that was cool and people might find that useful too.
24:36 - Cool. - Yeah.
24:37 All right, Nina, you got some as well.
24:38 You're teaching a class that looks really interesting.
24:40 - That's right, yeah, I'm teaching a two-day introduction to an intermediate Python course on March 19th and 20th.
24:47 And that class is gonna live stream for free at Front End Masters on each day.
24:53 And all the course materials, I'm gonna release for free as well.
24:55 - That's really excellent.
24:56 And it has a in-person component if you happen to be, where is it, in Minneapolis?
25:00 - In Minneapolis, that's right.
25:01 You can come to the class.
25:02 - Will Minneapolis be thawed out by then?
25:04 - The class size is about 20 people.
25:06 (laughs)
25:07 That I cannot promise.
25:08 Hopefully in March, it's a little warmer.
25:10 - Yeah, so up to 20 people could drop in in person.
25:12 That'd be really cool.
25:13 - The next thing, I recently recorded a series of videos with Carlton Gibson.
25:17 He's a Django maintainer, maintains a lot of other projects on developing Django web apps with VS Code, deploying them to Azure with just a few clicks, setting up continuous integration and continuous delivery, as well as creating serverless applications.
25:33 You can watch that video series at aka.ms/python-videos.
25:38 Yeah, that sounds cool.
25:39 I definitely want to check that out, too.
25:40 Yeah, it's great.
25:41 We got to film in the Microsoft Channel 9 studio, and it's a very well done series.
25:47 - All the bright lights and everything, huh?
25:49 Not just screencasts.
25:50 That's cool.
25:51 - Yeah, we feel like newscasters.
25:53 I'm also, I'm planning on being a mentor at a brand new hatchery event at PyCon US 2019.
25:59 That's gonna be mentored sprints for diverse beginners organized by Tanya Allard.
26:05 The goal is to help underrepresented folks at PyCon contribute to open source in a supportive environment.
26:11 The details aren't out yet, but I dropped a link to where they'll be when they're finalized.
26:15 - Oh, that's super cool.
26:16 And there's also things like scholarships or something like that to help folks get actually physically to the event if they need some help as well, right?
26:25 They can apply for that at the PyCon site.
26:27 - Yeah, PyCon US offers a lot of financial aid.
26:30 Lastly, if you're interested in Python for hardware, like we talked about earlier, you can catch my talk about electronics projects in Python with LEDs at PyCascades in Seattle on February 24th.
26:42 Currently, tickets for that are still on sale.
26:44 - Excellent, yeah, and Brian and I are definitely gonna be there.
26:47 We're all going to PyCascade, so we're gonna catch it.
26:50 Hopefully everyone else does as well.
26:51 - Great, I'm excited to see you there.
26:53 And I do have one last thing to sneak in, and that is if you haven't tried the Python extension for VS Code yet, now is a really good time.
27:02 The December release included some really killer features like remote Jupyter support and exporting Python files as Jupyter notebooks.
27:11 And if you're interested in keeping up with future releases, I dropped in a link to the Python at Microsoft blog.
27:16 - Nice, and didn't you as a group, speaking to you as a Microsoft, as VS Code, didn't you guys just release like an AI-powered autocomplete backend for Python as well?
27:28 - That's been around for a few months.
27:30 I believe it's still in preview mode, but it works really well.
27:34 The dataset was trained on a bunch of open source projects.
27:37 - Yeah, it looks super cool, so I definitely want to check that out.
27:40 I think I installed it just the other day, So it should be fun.
27:43 - Yeah, try it.
27:44 Let me know what you think.
27:45 - Absolutely.
27:46 Brian, we've come to our joke section, right?
27:47 - Yeah.
27:48 (laughing)
27:49 - Nina, you wanna kick us off?
27:50 - Yeah, I found a bunch of really cheesy snake jokes, so here they go.
27:55 What do you call a snake that only eats dessert?
27:58 - I don't know.
27:59 - It's a pie-thon.
28:01 (laughing)
28:02 - Nice, I'll do the next one.
28:04 How do you measure a python?
28:06 In inches, they don't have any feet.
28:07 (laughing)
28:09 Brian, what's the last one?
28:11 - What is Python's favorite subject?
28:13 - I don't know, what is it?
28:14 - History, that's bad.
28:16 These are all bad.
28:16 (laughing)
28:17 - Lovely.
28:18 - And I will not apologize.
28:21 - No, those are great.
28:22 Thank you for finding those, Nina.
28:23 Or coming up with them, either way, they're great.
28:25 All right, folks, well, thank you for listening.
28:28 And Nina and Brian, thank you for being here today, of course.
28:31 - Thank you.
28:31 - Thanks for having me.
28:32 - You bet, bye.
28:33 - Bye. - Bye.
28:34 - Thank you for listening to Python Bytes.
28:35 Follow the show on Twitter via @pythonbytes.
28:37 That's Python Bytes as in B-Y-T-E-S.
28:40 get the full show notes at pythonbytes.fm. If you have a news item you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout for sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.