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
00:05 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:15 Yeah.
00:15 Nina Zagarenko. 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,
00:27 but we try.
00:29 This time you nailed it.
00:30 Thank you.
00:31 For those who don't know me, I'm a senior cloud developer advocate at Microsoft,
00:35 and my focus is on Python. You can find me on Twitter at NNJA. That's like ninja, but without
00:42 the I.
00:42 Yeah, that's a pretty cool Twitter handle. Awesome. And also, this episode is brought to you by
00:46 Datadog. Check them out at pythonbytes.fm/Datadog. Tell you more about that. You know,
00:51 Brian, I expect quite a bit of stuff out of Datadog. I would say I have great expectations
00:56 when I go use their stuff. What do you think? How about you?
00:59 Yeah, yeah. I do too. Yes. For our first item, we have great expectations. And it is a package
01:06 that was shared by a listener. And I don't know the listener because they shared it with you,
01:11 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. Next time,
01:16 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
01:22 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:28 Yeah.
01:29 Yeah.
01:29 No, great expectations. It's kind of cool. It's this idea that we have a lot of tools out,
01:35 for instance, pytest, to test your code. But there's in a lot of stuff, the data that you're
01:42 running your code through, like in data science or a lot of data pipelines, the data is important too.
01:50 And being able to check to make sure your data fits what you expect it to fit, what look 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:02 They aren't assertions, so they aren't going to throw an exception.
02:07 But what happens is you, like maybe on some of them, you pass them a data frame.
02:11 Like I'll just give one as an example. 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:21 And if it's not, you get, actually, regardless of whether the answer, it comes back in the form of a JSON object.
02:28 And it has like a valid, and you can say whether or not, you know, 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. 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:52 But also you could probably put this in place in some data cleaning steps to make sure things are around.
02:58 Like making sure there aren't any nulls in a column.
03:00 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.
03:08 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 I honestly haven't done a lot of chi-squared lately, but I don't do that much data science, you know, on the web.
03:26 It's more we use addition and like stuff like that.
03:30 Yeah, but some of the fun things, like it was in the video example, he expected some data from a column to be in a particular set.
03:42 And it was either male or female.
03:45 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.
04:06 But how, I'd like to see somebody using it in their pipeline stages and how that works.
04:12 Whether you, 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?
04:21 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.
04:30 You could return like 400 bad requests to indicate, no, no, something's wrong with the data you sent me.
04:35 Things like that, possible.
04:36 Yeah.
04:37 You know, what do you think about this?
04:38 I think it's very cool and is probably going to 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:56 Yeah, I'm going to be watching the video demo after the show.
04:59 Yeah, right on.
04:59 So the thing that you are going to 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:14 Would that be the Circuit Playground Express?
05:17 It would be.
05:18 Yeah.
05:19 Awesome.
05:19 Yeah.
05:20 So I wanted to chat a little bit about using CircuitPython and MicroPython to write Python for wearable electronics and embedded platforms.
05:28 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.
05:39 And what kind of little things are you making with your projects?
05:42 My last one was Python powered LED earrings.
05:45 And I dropped a link to the repo for the code as well as a photo.
05:49 So you can see that.
05:50 Okay.
05:51 So what I know I've heard of MicroPython.
05:53 And I think I've heard of CircuitPython.
05:55 Are they the same?
05:56 Are they different?
05:56 Tell everyone about it.
05:57 Yeah, there's definitely a little bit of confusion about that.
06:00 So MicroPython is the original.
06:02 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.
06:17 It's so super low level too.
06:19 Yeah.
06:19 And CircuitPython is a port of MicroPython.
06:23 And it's optimized for Adafruit devices.
06:26 Cool.
06:26 So I guess that's the one I'm going to be learning about.
06:29 Yeah.
06:29 Yeah.
06:30 And some of these, the devices that Adafruit sells, they're as small as a quarter.
06:34 That would be the trinket.
06:36 But of course, my favorite Python hardware platform for beginners is that the Adafruit Circuit Playground
06:42 Express.
06:42 It has everything you need to get started with programming hardware without even needing to
06:47 learn how to solder.
06:48 All you need is some alligator clips for the conductive pads.
06:52 And the board has a ring of neopixel LEDs.
06:56 It has buttons, switches, temperature sensors, motion detectors, sound sensors, a tiny little
07:02 speaker, and a lot more stuff.
07:04 Like you can even use it to control servos, which are those tiny little motor arms.
07:09 Wow.
07:10 That's really awesome.
07:11 Yeah.
07:11 It's a tiny little thing.
07:13 Yeah.
07:13 What I really like about this and the reason that I ordered it was I can go to Adafruit and
07:17 look around and I'm just like, this is too low level for me.
07:20 I don't really know what I need.
07:22 I don't even know if I have a power supply, if I get this little chip or that.
07:25 Like how to put together.
07:26 I'm like, okay, give me like one thing that has all the stuff to do little projects like
07:31 you're describing.
07:31 And I think it's awesome.
07:33 And doing it in Python is super cool.
07:35 It only costs $25.
07:36 Yeah.
07:37 It's not too expensive.
07:38 No.
07:38 And then if you don't want to use Python to program this, there's a tool that you can use
07:44 called Microsoft MakeCode.
07:46 And it lets you program these little devices with a drag and drop style kind of scratch
07:51 like interface.
07:52 So that's perfect for kids.
07:54 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
08:01 of little game, you know, like a Simon Says or something with the LEDs.
08:04 Who knows?
08:05 That'd be fun.
08:05 Yeah.
08:06 The Mu editor has some tutorials on using these as well.
08:09 Right.
08:09 That's awesome.
08:10 Super cool.
08:10 All right.
08:11 And I like you threw in the link.
08:12 Yeah.
08:13 To your code.
08:14 So people can do the earrings as well.
08:16 Yeah.
08:16 And like you said earlier, there are tons of guides for Python projects on the Adafruit
08:20 website.
08:21 Stuff from making your own synthesizers to jewelry to silly little robots.
08:26 So definitely make sure to check that out.
08:28 Cool.
08:28 Yeah.
08:28 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.
08:38 25 bucks.
08:39 You know, it's like, you know, 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:45 Mm-hmm.
08:45 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
09:10 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.
09:16 They're awesome.
09:17 Trey Hunter has a great talk on data classes.
09:20 Definitely.
09:20 So this is a library that's derived from data classes.
09:24 And it's a CSV file reader.
09:26 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.
09:33 And it'll read the header and figure out the columns.
09:36 And then it gives you little dictionaries based on the column names.
09:38 And that's pretty sweet.
09:39 But what you get back is a whole bunch of strings corresponding to those values.
09:44 Right?
09:45 And with this, what you can do is you can actually define a data class that maps the schema of
09:51 your CSV file.
09:53 Right?
09:54 So I could define a data class that maybe has an ID and a name and a value or price.
09:59 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.
10:05 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
10:13 it's a non-parsable float or something like that.
10:15 Isn't that nice?
10:15 That's incredible.
10:16 Working with CSV is the bane of my existence.
10:19 Yeah.
10:20 So you can just define these things.
10:21 You get autocomplete in, you know, PyCharm or Visual Studio Code for your types, for your
10:26 rows, because they come back as these data classes.
10:28 And you get validation.
10:31 And on top of that, you can actually do cool stuff.
10:33 Like you can say, with data classes, you can specify either just the type or the type and
10:39 a value.
10:40 And that value becomes the default value.
10:42 So if like only sometimes the price is there, you could put zero or minus one.
10:45 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
10:54 because it's way better to let this thing do the validation and the type conversion and
10:59 all that and just, you know, 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 They are.
11:05 They are pretty amazing.
11:07 No, this really makes working with them nice.
11:09 And I'm excited, too.
11:11 All right.
11:12 Speaking of excited, I do want to tell you about Datadog.
11:14 They're helping make this show possible.
11:15 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
11:25 all together.
11:26 You can do auto instrumenting of frameworks like Django and Flask and PostgreSQL, which
11:32 means you can track requests across service boundaries, across machines, things like that, which is
11:37 awesome.
11:38 It makes it really easy to troubleshoot your slow Python apps and figure out overall where
11:43 the time is being spent.
11:44 So you can get started for free at pythonbytes.fm/Datadog.
11:48 And they'll also give you a cool t-shirt with a Datadog character on it, which is nice and
11:53 cute.
11:53 So check them out.
11:54 It helps keep the show going.
11:56 Now, Brian, I want to come to a topic that we haven't really covered very much on the show,
12:01 but maybe I think a while ago we did talk about packaging ones, right?
12:05 Yeah.
12:06 You want to catch us up on it?
12:08 I think it's only second to GUIs so far.
12:11 That's right.
12:12 There's a fun article called How to Rock Python Packaging with Poetry in Briefcase.
12:17 Plus, it has 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,
12:30 this is a nice introduction to packaging and how it fits in Python and also kind of how
12:36 the changing of things, changing of packaging, like where Flit, Pipenv, and Poetry sort of fit in
12:43 with all of this.
12:44 It's kind of a nice run through of that.
12:46 Poetry is one of those things for packaging, and it uses the pyproject.toml file.
12:53 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:04 But the neat thing, one of the neat things why I picked this is it also talks about Briefcase.
13:09 And we haven't talked about Briefcase yet.
13:12 And Briefcase is one of those tools from Py, the Beware project.
13:17 And it's something that you can, it packages your, a Python application as a standalone native
13:24 application for lots of stuff.
13:27 It claims Mac, Windows, Linux, even iOS and Android, which is interesting.
13:31 I haven't tried any of this.
13:33 The tutorial talks about desktop distribution of code through Briefcase.
13:38 And it's kind of cool.
13:40 And how to get that done with poetry.
13:42 I think poetry is definitely nice.
13:43 It's, you know, sort of an alternative philosophy to PipInv, which is, we talked about that as well.
13:49 And Briefcase is part of that whole set of small independent tools from Beware, which also is
13:56 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.
14:03 And then one of the things that I like at the end of this, there's several tutorials on publishing,
14:08 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,
14:17 they tell you how to push it to the test server.
14:19 And I think that's an important step for people to do.
14:23 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:29 Yeah, of course.
14:31 Why don't more of them do that?
14:32 I don't know.
14:34 But please, everybody, like save the world and push it here first.
14:39 Yeah.
14:39 The packages on PyPI cannot be changed when they're uploaded.
14:42 You can only add newer ones.
14:44 So although you've got to admire the rate at which you'll increase your version of your package
14:50 if you screw it up a few times trying to publish it.
14:52 Yeah.
14:56 That's productivity, right?
14:57 That's right.
14:57 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've got awesome Python, awesome Python applications.
15:10 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:17 It's a collection of tools, techniques, and resources to make your Python more secure.
15:22 Oh, that's cool.
15:23 Yeah.
15:23 And it's got a lot of stuff for web apps like the secure.py, which is awesome.
15:27 We've covered that.
15:28 And the Flask, Flask Talesman, Django sessions, all kinds of stuff, right?
15:32 But not just the web.
15:34 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
15:39 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
15:47 10 common security gotchas article that highlights problems like input ejection and depending on
15:54 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.
16:01 OWASP stands for Open Web Application Security Project.
16:04 And there's tons of OWASP resources out there.
16:08 I didn't know that there was a Python-specific one.
16:10 You can find that one at pythonsecurity.org.
16:13 I came across Bandit, which is a tool to find common security issues in Python.
16:17 And now Bandit has a lot of really useful plugins that test for some issues like hard-coded password
16:24 strings in production, leaving Flask debug on in production, using exec in your code, and
16:31 a lot more.
16:31 I linked to the full list in the show notes.
16:33 And then a few other cool ones like Detect Secrets, which is a tool to detect secrets that
16:40 were accidentally left in your Python code base.
16:42 That's cool.
16:42 Yeah.
16:42 Yeah.
16:43 Let's open source that.
16:44 Oh, wait.
16:44 Was our full access AWS or Azure key in there?
16:48 Whoopsie.
16:48 Oops.
16:50 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
17:00 for learning about security concepts like cryptography.
17:03 Yeah.
17:04 You know, out of that cryptography section, they listed one of my all-time favorite packages,
17:09 which is PassLib.
17:10 So if you're going to store user secrets and you want to hash them, like passwords are
17:16 probably the most common, but there could be other things as well that you don't want
17:19 to store directly, but you want to accept from user and see if you have it.
17:23 All right.
17:23 Like you can hash it and that's a good idea.
17:26 But what you really should do is like take that result, add some salt, then hash it again,
17:30 take that, do it again, maybe a hundred thousand times, right?
17:33 PassLib, that's like 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 Yep.
17:41 To make sure your password doesn't end up on have I been pwned.
17:44 Exactly.
17:44 Exactly.
17:45 So basically you can say, I want it to take, you know, 0.2 seconds to determine, to brute
17:51 force or to check each version of the password.
17:53 And it automatically, because of that, will slow down dictionary attacks against your site
17:57 because you can only do them point, you know, it'd take only five per second, right?
18:00 So, and then there's another one called let's be bad guys.
18:03 That's interesting.
18:04 So yeah, a lot of cool stuff here.
18:07 It's a great project name.
18:08 I know.
18:08 It's like a hacker playground.
18:10 Yeah.
18:10 So check out the full list on GitHub.
18:12 And then if there's something missing that you think should be there, maybe open a pull
18:16 request.
18:17 Yeah, absolutely.
18:17 That's a cool one.
18:18 I'm glad you found it.
18:19 All right.
18:20 The last official item I want to cover is PyDBG, which is the implementation of a, of a
18:27 Rust macro called DBG.
18:29 So just put the pie on the front.
18:31 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, but the basic idea of this DBG macro is instead of
18:41 just printing out, like I'm here, I'm here, the value is, you know, printing X as the value,
18:47 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
18:54 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:06 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
19:14 printing without having to like come up with elaborate print statements.
19:18 So pretty cool.
19:19 Oh man, I'm going to use this like every day.
19:20 Do you still use print statements to debug brain?
19:25 Yes, I do.
19:26 I love print statements.
19:29 I use the debugger a lot, but every now and then I'm just like, you know, I just want
19:32 to print this out and just see what is happening.
19:35 Like I, I don't primarily use print statements for debugging, but sometimes I do when I'm kind
19:41 of exploring that 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:46 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.
19:55 And, you know, every time you hit a break point, you're like, Oh, I see what's in there.
19:59 I don't have to type it again.
20:00 With VS Code or PyCharm?
20:02 Yeah.
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, I was thinking something different, but so what, where, where I'm going to use this
20:14 DBG, PyDBG thing is a lot of times I've got, we've got test code that generates
20:20 huge amounts of data, like trace data.
20:23 And, these are stored and the, the test runs are really long and throwing a couple
20:30 of these extra ones for intermediate values.
20:33 So the failing tests or failing test runs, we can take a look at those postmortem, things
20:39 like that.
20:40 It'd be just save.
20:41 It's an elegant way to, to have that be done.
20:44 Yeah.
20:44 Yeah.
20:44 It's pretty cool.
20:45 What I like about it is this like so simple, right?
20:47 Like you place the word print with DBG and you, you kind of got something going on here.
20:50 It also kind of like that.
20:51 It's more explicit.
20:52 You're like, this is not really supposed to be a print statement.
20:54 This is just here till I figure out what's going on.
20:57 And then we're going to stop this.
20:59 Yeah.
20:59 But cool.
21:00 People can check it out.
21:01 Thanks for sending that in to our listeners.
21:04 All right.
21:05 So I guess that's it for all of our main topics, but looking at our show notes here, Brian,
21:09 we all like kind of had a second round in the extra.
21:12 So maybe we'll do like a lightning round one more time.
21:14 What do you got for us?
21:14 This is just a quickie that pytest has temporary directories and temperature factory fixtures for dealing with temporary files.
21:24 But they've added, as of pytest 3.9, there's path versions that return pathlib path objects.
21:33 And those are just quite fun.
21:35 And I'll drop a link in the show notes.
21:37 Okay.
21:37 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.
22:01 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.
22:12 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:17 Oh, this looks very cool.
22:19 Yeah.
22:20 Yeah.
22:20 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:33 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:50 That's bad.
22:52 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.
23:01 It was not.
23:02 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:11 I can't imagine.
23:13 So the idea is there's some part of NumPy that you can load pickled data.
23:19 And, you know, for those 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:28 So good luck.
23:30 Oh, boy.
23:31 Yeah, yeah, that's not so, that's not so good.
23:33 So this goes up to at least version 110 through 116, which at least is January 14th.
23:39 This hadn't been fixed.
23:40 So hopefully it's been fixed.
23:42 But more importantly, if you're using NumPy and you're accepting user input through the load function, you want to upgrade and you want to be a little careful around that.
23:50 All right.
23:51 Then last one I just want to 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:58 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 slash settings slash 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.
24:36 Yeah.
24:36 All right, Nina, you got some as well.
24:38 You're teaching a class that looks really interesting.
24:40 That's right.
24:41 Yeah, I'm teaching a two-day introduction to an intermediate Python course on March 19th and 20th.
24:47 And that class is going to live stream for free at Front End Masters on each day.
24:52 And all the course materials I'm going to release for free as well.
24:55 That's really excellent.
24:56 And it has an in-person component if you happen to be, where is it, Minneapolis?
25:00 In Minneapolis, that's right.
25:01 You can come to the class.
25:02 Will Minneapolis be thought out by then?
25:04 The class size is about 20 people.
25:06 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.com.au.
25:36 Python-virus.com.au.
25:40 Check that out, too.
25:40 Yeah, it's great.
25:41 We got to film in the Microsoft Channel 9 studio.
25:44 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 planning on being a mentor at a brand new hatchery event at PyCon US 2019.
25:59 That's going to be mentored sprints for diverse beginners organized by Tanya Allard.
26:04 The goal is to help underrepresented folks at PyCon contribute to open source in a supportive environment.
26:10 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.
26:44 Yeah, and Brian and I are definitely going to be there.
26:46 We're all going to PyCascades, so we're going to catch it.
26:50 Hopefully, everyone else does as well.
26:51 Great.
26:51 I'm excited to see you there.
26:52 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,
27:00 now is a really good time.
27:01 The December release included some really killer features like remote Jupyter support and exporting Python files as Jupyter notebooks.
27:10 And if you're interested in keeping up with future releases, I dropped a link to the Python at Microsoft blog.
27:15 Nice.
27:16 And didn't you as a group, I'm speaking to you as a Microsoft, as VS Code,
27:21 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.
27:38 So I definitely want to check that.
27:40 I think I installed it just the other day, so it should be fun.
27:42 Yeah.
27:43 Try it.
27:44 Let me know what you think.
27:45 Absolutely.
27:45 Brian, we've come to our joke section, right?
27:47 Yeah.
27:47 Nina, you want to kick us off?
27:50 Yeah.
27:51 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:58 It's a pie-thon.
28:00 Nice.
28:02 I'll do the next one.
28:03 How do you measure a Python?
28:05 In inches.
28:06 They don't have any feet.
28:07 Brian, what's the last one?
28:10 What is a Python's favorite subject?
28:13 I don't know.
28:13 What is it?
28:14 History?
28:14 That's bad.
28:15 These are all bad.
28:16 History.
28:17 Lovely.
28:19 And I will not apologize.
28:21 No, those are great.
28:22 Thank you for finding those, Nina.
28:23 We're coming up with them.
28:24 Either way, they're great.
28:25 All right, folks.
28:26 Well, thank you for listening.
28:27 And Nina and Brian, thank you for being here today, of course.
28:30 Thank you.
28:30 Thanks for having me.
28:31 You bet.
28:32 Bye.
28:32 Bye.
28:32 Bye.
28:33 Thank you for listening to Python Bytes.
28:35 Follow the show on Twitter via at Python Bytes.
28:37 That's Python Bytes as in B-Y-T-E-S.
28:40 And get the full show notes at pythonbytes.fm.
28:43 If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
28:48 We're always on the lookout for sharing something cool.
28:51 On behalf of myself and Brian Okken, this is Michael Kennedy.
28:54 Thank you for listening and sharing this podcast with your friends and colleagues.