Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #181: It's time to interrogate your Python code

Return to episode page view on github
Recorded on Wednesday, May 6, 2020.

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:03 your earbuds. This is episode 181, recorded May 6, 2020. I'm Michael Kennedy.

00:09 And I am Brian Okken.

00:10 And this episode is brought to you by Datadog. Tell you more about them later.

00:13 Brian, this first item that you picked here, I saw this going around the Twitterverse and I was

00:18 like, oh, that looks really cool. Tell us about it.

00:20 Yes, Interrogate. So it's a new little tool. I think it's kind of new, new to me at least.

00:26 It checks your code base for missing doc strings or the presence of doc strings.

00:31 So it's written and maintained by Linroot. And we were notified by Herbert Beamster,

00:36 suggested it to us. I like doc strings. I don't like them. I don't have a policy of having them

00:42 everywhere, but doc strings can help you understand the code quite a bit. I really love how like a

00:47 function doc string is utilized by VS Code and PyCharm and other editors to do things like if you hover

00:54 over a function, it just pops up a little window with like, you know, what parameters you can send

00:59 to it. But it also sends the doc string, shows the doc string if there is one. There's also other tools

01:04 like Sphinx or PyDoc or DocUtils that can use that amongst other things to generate documentation.

01:10 I don't really use those. I know a lot of people do though. So it's a problem if you've got some

01:16 missing, if you really need to have doc strings someplace and they're missing.

01:19 So interrogate is a command line tool that you can use to check your code to make sure

01:23 everything has a doc string that needs to.

01:26 I think this is great. Yeah, it's super cool. And well done, Lin. Nice work on this one. I think

01:30 this is really nice because if you have a public library, that should be documented, right? That

01:37 should be covered with nice doc strings that give you all sorts of help in your editor, like you

01:43 mentioned. But also if you generate the documentation, you don't want to have just some random empty,

01:49 either completely missing or just the, you know, like the function name and just an empty body or

01:54 whatever it gets generated there. So this is really cool. And I could see if you were doing a package

01:59 that was public, having this part of your CI CD process that if somebody introduces something into,

02:06 like a PR that here's a new function we wrote, like, great. It failed the CI because it doesn't

02:13 have a doc string. That'd be awesome. Yeah. And then there's also some common, there's some common

02:17 like caveats, like, yes, all public functions should have doc strings. But what about like private

02:23 functions and stuff? There's options to be able to tell to turn off things where you, you know,

02:28 might not need a doc string for just an internal helper function or something.

02:32 Yeah, I totally agree. Like if it's not really meant to be included, you know, in the public API,

02:38 then it shouldn't have a doc, it shouldn't necessarily have a doc string.

02:40 Yeah, it can if it helps to understand it, but you don't, maybe you don't need it. So this is nice.

02:45 Yeah, yeah, this is super cool. Well done, Len.

02:48 Yeah, I wanted to mention also there is information on the readme about how to use the tool within talks

02:54 and within CI workflows. So that's helpful.

02:57 Yeah, this one seems like a super easy thing to adopt. If you already have a CI process in place,

03:03 and you're working on something that's public, whether that's public to your people within your

03:09 company, or you know, it's a package that is used by other projects, right? Or it's public as in

03:14 on pypi.org. I still think it makes sense to just document it for whoever's consuming it,

03:19 who's not writing it.

03:20 Yep.

03:20 Very cool. Now, this next one, I've been holding off on talking about for a long time,

03:25 because it's really interesting, but I didn't feel like I was able to do it justice. So the thing I

03:32 want to talk about is Streamlit. With Streamlit, the idea is it allows you to build much simpler

03:39 data science applications and web apps, I guess you would say. So many people come to Python

03:47 from I've got a little bit of computation that I got to do. And so I'm going to write a script that

03:55 does like 10 things, maybe it doesn't even have a function, it just does do x, you know, load data,

04:00 transform data, pivot data, show graph, or something like that, right? Really, really simple. They're not

04:06 like, pro web developers that are like busting out view or react or something like that to build cool

04:11 apps. But they've got this really cool outcome with Python, and they're happy. But at the same time,

04:17 they would like to have this publicly shareable, they maybe want to put it on the internet,

04:21 they want to make a web app out of it. And the gap from I've got 10 lines of code that outputs a graph

04:27 to I have a fully interactive, dynamic, server backed JavaScript front end type of visual website,

04:35 that's a big gap, right?

04:36 Yeah.

04:37 So Streamlit...

04:38 Even for me.

04:39 Yeah, yeah, well, yeah, for me as well. Now for Streamlit, the idea is that you write the code in the

04:46 simple, straightforward style that I talked about, but then it turns it into an interactive

04:51 web application.

04:52 That's neat.

04:53 That sounds neat, right?

04:54 And it does a whole bunch of really interesting tricks to let you continue to write code in this

05:01 simple, straightforward way, and yet interact with like callbacks and stuff. So you might have a

05:06 function that comes along and says, okay, what I need to do is I want to show, I don't know,

05:11 a drop down list in a web app, or a slider bar or something like that. And then you write your code

05:16 that says, get the value from the slider bar. And you might think, okay, well, normally that's wait

05:23 for the user to click on the slider bar. And when there's a change or some kind of callback, and then

05:27 you have some function that runs on the callback and it updates the DOM, right? But this is like

05:31 straightforward procedural code or imperative code that doesn't have any of those ideas in it.

05:37 So what it does is it uses interesting caching on your functions so that if it were to rerun it with

05:43 the same inputs, it gives you the same answer instantly, like LRU cache type of stuff. And then

05:48 if any of those controls on the web page change, it just reruns the whole script. And when you say,

05:53 get me the value from the slider, it says, well, currently the slider is set at this. And if it

05:58 happens to change, it just reruns the entire thing from beginning to end. But because everything's

06:03 cached, it only recomputes the parts that are needed. So you don't have to think about callbacks.

06:09 You don't have to think about user interaction. You just write top to bottom code.

06:12 And here you've got multiple parts of your application that can be changed dynamically

06:16 that just continue to refresh. And it refreshes it by using JavaScript. So it doesn't even reload

06:22 the page. It just looks like parts of the page are dynamic and coming alive.

06:26 Oh, wow. This is neat.

06:27 Yeah. So it's super cool. Basically, if you can write like straightforward, top to bottom

06:32 code that works with like graphing or pandas or something like that, you now can create a single

06:39 page, a spa app. And I don't remember what JavaScript framework it uses. It's like react or view or

06:45 something like that. I think it might be react. Anyway, it's not super relevant, but it does all

06:50 of that work with like hosting it and creating the server callbacks and setting up the JavaScript

06:56 and the UI widgets and all that kind of stuff. And all you do is write basically procedural code.

07:01 One thing that I think is a danger of these types of applications is it's easy to say if you use our

07:07 magic graphing library and our magic UI widgets and our magic, you know, data processing library,

07:14 not a real database, but our magic server database that we create, then it works, right?

07:19 Yeah.

07:19 What I like about this is it doesn't do any of those things. It just says you want to use pandas

07:23 and numpy and plotly or something like that. Use those and then use them in your script. And then

07:31 we just make it this single page app, which is pretty awesome.

07:33 Yeah. That was my question. Is this a hosted thing or can I do it like behind a firewall or

07:38 local thing or do you know?

07:39 Yes. So with Streamlit, you have a couple of options. I haven't done anything myself,

07:46 but you can self host it or they'll host it for you, I believe. And if you, they have this thing

07:52 called four teams, which is like they automatically deploy and manage the apps and you just create them

07:59 and say, here's the code and run it. It's like kind of a platform as a service for Streamlit apps type

08:04 of thing. That's a paid part of what they're doing. But the stuff I described up until then,

08:08 that is free and open source. So it's still pretty, pretty usable. Yeah. So you have to

08:14 basically deploy them yourself, but they talk about how to do it. You know, it's not super hard.

08:19 Okay. Nice.

08:19 Yeah. So I had the, one of the guys Adrian on who is behind this and has also done some other

08:24 interesting technical programming stuff and with self-driving cars and folding at home,

08:30 those types of things on Talk Python just a couple of episodes ago. I don't remember exactly what

08:34 number it was, but I guess 260 ish, something like that. So just check out that episode if people want

08:42 to go much deeper, but this is really cool. If you're writing these imperative, simple little

08:46 scripting apps and you're like, I would really like to share this or make it better. Streamlit's cool.

08:51 Yeah. Nice. Okay.

08:52 I feel like we both have themes for ours. Your theme is continuing with documenting and whatnot. And

08:57 you'll see my theme develop as well.

08:59 This is interesting because I ran across this interrogate second, but after I ran across this,

09:06 an article by Hienic that says why you should document your tests. He makes a lot of good points.

09:14 So I believe, and we have this policy where I work of tests should have doc strings on them to tell you

09:21 kind of what the test is doing and why it's there. There's a lot of reasons that I have never really

09:28 been able to describe clearly because you're, I mean, ideally your test name should be descriptive and

09:33 the code should be clear. So why do you need a doc string? It's not, that's not something that you're

09:38 going to call from an API or anything.

09:40 You probably won't type help function, you know, test function, right?

09:43 Right.

09:44 Probably not.

09:45 And you also don't call it. I mean, like test methods that you run pytest with, pytest calls

09:50 it. You don't call those tests, but you can get confused in the future. And one of the explanations

09:55 is Hienic has a good example where he shows some simple code with a simple test name, but the thing

10:02 he's asserting on doesn't really make sense. And the reason, if you don't know what's going on under

10:07 the hood. And the reason is because tests often are testing for a side effect of an action.

10:13 If you're testing the output of a function, that's obvious. It's kind of obvious of the,

10:19 if I pass in functional tests, if you pass in a certain parameters and you get a certain expected

10:25 output, you can assert against that. But what about actions that have side effects and you need

10:30 to test for those? That might need some more explanation. And he writes, this is quite common

10:36 in testing. Very often you can't ask questions directly. Instead, you verify certain properties

10:42 that prove that your code is achieving its goals by checking side effects and stuff like that.

10:48 It's a short little article and I was just happy to have some of that expressed of why you should

10:54 document. And it might be you that's confused in the future. And then it ties back into the

11:00 interrogate because, so I was just thinking when I was reading about interrogate, I'm like,

11:04 oh, awesome. I really want to put something in place to just make sure all my tests have doc

11:09 strings. And he lists in the article, the exact command line that you need to make sure that all

11:16 just text, make sure that your tests have doc strings and nothing else. So this is cool.

11:22 Yeah. It looks really nice. And I can see how this would lead you down to finding a library that

11:28 searches for or evaluates these. Yeah. So the test example he has here is testing that the hash,

11:34 like creating the same object, the instance of a class twice and taking the hash and making sure

11:40 that those are not the same because he's trying to test that adders is not implementing false on the

11:46 class or something to that effect. Right. So you're like, what the heck is going on with this? Like,

11:51 why would you check the hash of a thing is not equal to the hash of a thing,

11:53 but it's looking like you said, for this sort of like hidden layer that's operating below it. Right.

12:00 Yeah. And then also my reasoning, and I think he brings it up is that, that, often when you're

12:06 looking at a test, it's because you really got to get a release out and one of the tests is failing.

12:12 So you got to go look at the test and figure out what it's testing for and why it's failing.

12:16 And if you don't have it clear why the test is important, you run the risk of, the person at the

12:23 time going, well, I don't even understand what this test does. Maybe it's not important.

12:27 Comment it out.

12:28 Comment it out.

12:29 Passes.

12:30 You don't want that.

12:30 CI is good. We're going home.

12:32 I don't do that, but I've heard it done before. Of course.

12:37 I would never do anything like that, but I can imagine that it has been done.

12:40 Now I actually have, I have some experiences in the past where like there was some project

12:45 and it had like a beautiful set of tests and then, and CI and stuff. And I wasn't working

12:49 on it anymore. And whoever took it over is like, Oh, those tests were really annoying. So I turned

12:54 them off. You're like, Oh my gosh, those were there for a reason. What just happened? So at least

13:00 like if, if this gives you some description about what's up, that would be good. Is there anything

13:04 where like pie tests will show the doc string as part of the error report?

13:08 I think there was a, somebody that wrote a tool that would do, I don't remember the

13:12 name of it. I remember running across the plugin that would pop out the doc string for

13:17 failed tests, which would be pretty cool.

13:19 Yeah. That would be pretty cool.

13:20 Hopefully the person evaluating the test failures has access to the code. They can go look.

13:25 Yeah. I'm thinking more of like a CI CD. Like you're not really, you don't have it like

13:30 loaded up right there. Right. You're just like, Oh, I'm cruising on GitHub, checking a PR.

13:34 What the heck is this? Yeah. I actually wrote a, it was an internal thing, but a quick

13:38 plugin for pytest that would just before every test function, print out the test name and print

13:44 out the, the doc string. If we can look at the logs, it's there.

13:49 Yeah. That's cool. Very nice. Also cool. Data dog. So this episode is brought to you by data dog.

13:55 And let me ask you a question. Do you have an app in production that's slower than you like

13:59 it's performance all over the place? Maybe sometimes fast, sometimes slow. Here's the

14:04 important question. Do you know why it does that with data dog? You will, you can troubleshoot

14:08 your app's performance with their end to end tracing. Check out their detailed flame graphs to find

14:13 bottlenecks and latency in that finicky app of yours. Be the hero that got your app back on track at your

14:19 company. Get started with a free trial at pythonbytes.fm/data dog and get a cool little,

14:25 t-shirt as well. All right. So your theme is so far has been pretty clear. Next one of mine,

14:29 I want to talk about a project called hollow viz. Have you heard of hollow viz? I have not. I'm sure

14:35 you've heard of scipy and those types of things. There's kind of a grouping of other projects,

14:41 right? Under that general banner with like numpy, matplotlib and whatnot. Well, hollow viz is kind of

14:47 like that for data processing and visualization. And one of its features acts very much like

14:55 streamlet, but in a more general, probably a little more work to set up and like, right,

15:00 you got to work more in its framework, but in a very similar way to what streamlet is doing as well.

15:05 So it's a coordinated hollow viz is a coordinated effort to make browser based data visualization

15:11 in Python easier to use, easier to learn and more powerful. So it's, yeah. So what does it do?

15:16 So it has a bunch of tools that make it easier to apply Python plotting libraries to your data,

15:22 a bunch of tutorials, conda, like meta package that when you, you know, in conda install hollow viz,

15:29 it actually installs a whole bunch of things. I'll tell you about a second, even has some sample

15:33 data sets. So you can like go through the tutorials and actually get the outcome. Right.

15:38 So it's made up of a bunch of different things. One called panel, and that one makes creating apps

15:43 and dashboards for your plots using any of the supported plotting libraries, which is pretty

15:48 awesome. It has HV plot to quickly generate interactive plots as hollow views to make your

15:55 data instantly visualizable. Geo views for visualizing geographic data, data shader for rendering

16:02 huge data sets, param for creating a user configurable objects, like config stuff, and then color set or like

16:12 color maps. So yeah, you want to have like nice colors that flow together for your plots. And panel

16:18 is the main thing that I was thinking of that lets you create these single page apps around interactive

16:24 sliders and dropdowns around your graphs and other, other kinds of stuff. And, yeah, very cool project

16:30 as well. Yeah. I was looking at the data shader and they have like some really pretty pictures

16:35 because of the, the examples of, overlaying data plots over the map of the U S things like that.

16:43 It's cool. Yeah. Or, you know, you can plot attractors with 10 million points each. Oh, is that all?

16:49 And these graphs, I mean, these, the resulting pictures are, I don't know what they're like 400

16:54 by 400 pixels or smaller. It's like, yeah, that came from 10 million points or here's the United

16:59 States plotting each person in the United States where they're physically located from the 2010 census.

17:07 So 300 million points of data overlaid onto the United States map. Yeah. It's like, like a sun,

17:15 really is pretty interesting. Actually. I think I can see you over there, Brian, you're on the left.

17:20 You are too. That's right. Awesome. Anyway. Yeah. So this is a cool project. There's a whole bunch,

17:25 a bunch of different little libraries that are pretty neat. So if you want to try to visualize

17:30 your data and we'll come back and talk some more about both of these projects towards the end of

17:34 the show as well, but a bunch of cool libraries, like all brought together under this hollow of his

17:38 project to make them work together. Yeah. Nice. Nice. What'd you got next? I have another command line tool.

17:44 So this was by, oh gosh, Rosario. And he wrote a little blog post about it, but it's a, there's a

17:51 project called a live progress and it's a progress bar for Python and it's really cool. So it is pretty

17:58 cool. Command line interface, a progress bar. So often, I mean, like even like pytest has added,

18:05 progress bars for, you know, watching your test finish and things like that. And it's,

18:09 it's nice to have progress bars and it gives you good feedback and whatnot, but there there's limits

18:14 to what you can do, except for this seems unlimited. It's, got a whole bunch of different animations

18:20 and spinners and things you can combine to make a more entertaining progress bar. So it's fun.

18:25 Yeah. These are really nice. And you know, these little touches, they, they probably don't seem like

18:30 much, but they can definitely make your app feel more professional and more polished rather than just,

18:35 you know, the answer is seven or like whatever we're done.

18:37 Yeah. Some of the, like, what was it? pipenv. I don't use it, but I appreciated some of the fun

18:43 command line interface stuff that they've added to it. And I think adding some fun to a tool

18:48 is nice. One of the things I wanted to comment on also was just the, about the, the repo itself.

18:54 So the code is, up on GitHub and, the readme has some nice thing features I wanted to call out.

19:01 So the, the animated pictures of what it does is a nice touch. We've said this before. We love things

19:07 like this. I liked that there was a to-do list. so it encourages having a short to-do list

19:13 encourages contributions. And I think even listing things that I've gotten that I've gotten done

19:18 recently so that people that might not know about those features don't try to go work on them.

19:22 And then just a short list of things you'd like to have done. And then it has an interesting fact

19:27 section, which is kind of cool. The code is in a functional style. It uses closures and generators.

19:32 So, I mean, actually a lot of times I'll look at, code, not as an example of, of how to do

19:38 something. So if somebody is proud of like their use of generators, maybe it's worth code checking out

19:43 if you're trying to learn generators. And then another feature that I'm definitely going to pick

19:47 up for things that I work on is change log highlights. So not the entire change log in the

19:53 read me, but just one or two lines of semicolon separated features per version of change. So

20:01 this is kind of a nice thing to add. Oh yeah, that is really nice. Cool. I think it's a great project.

20:06 If I need a progress bar, I'm definitely going to consider this one. Like I said, like I do think

20:11 they're neat and I do use them sometimes. So, yeah, that's cool. Very nice. All right. Last one's a

20:15 quick one. So we talked about hollow viz, talked about streamlet and panel and how those are kind

20:21 of similar. So there's this other project called awesome panel, which is kind of like an awesome

20:27 list for panel that way to build interactive data science, single page apps, or not even single page

20:35 apps. This is run by Mark Skalv Madsen. I got that closely, right? Mark. And yeah, it's a cool

20:42 project to just show a bunch of examples and a curated list of these. So yeah, if you just open

20:47 that up, you can go see, there's an app that comes up. It takes just a second come to life. And then on

20:53 the left, there's like a gallery. There's all sorts of cool pictures. There's also a nice talk. I can't

20:57 remember who gave the talk, but yeah, it's a, there's like a talk from one of the conferences,

21:01 but if you go to the gallery, you'll see like, as you navigate around, it's kind of like this

21:06 single page app. So if you click gallery, you'll see like the main part of the app sort of spin for a

21:11 second and then come up and then you can go and say, Oh, there's like one of the things that's

21:14 really cool that I'll point you guys at is this thing called the image classifier in there. So I

21:18 went in there and it's lets you, if you just scroll down, it says upload an image and you can grab some

21:25 JPEG and upload it. I grabbed some like random microphone picture that I had laying around and

21:30 threw it in there. And then it ran, you can pick different neural networks to run against it.

21:34 Do you want to run NAS net mobile, NAS net large, mobile net V2? Like, I don't know what these are,

21:39 these glass fires, but you can pick from them and then it'll tell you in a cool little graph at the

21:43 bottom, like what it thinks that is. And it thought the microphone was most likely a microphone, but it

21:49 could have been a shield because it had like a big metal guard on the front of it. And it's just really

21:53 cool. And so this whole website is built, if I got it right, in panel to show you how you can build a

22:00 cool panel app. But then as you dive into the gallery, each one of these pieces is like an interactive

22:05 sub panel or something like that. So it's kind of, it's a little bit meta in that regard, but it's

22:09 pretty cool actually.

22:10 Yeah. It's really, it's really cool.

22:12 Yeah. And yeah, it's apparently super easy to work with. Again, I haven't built anything with it, but

22:17 it seems like a much simpler way to get your interactive data science stuff on the internet

22:24 than learning Vue.js, JavaScript, Flask, SQLAlchemy, et cetera, et cetera.

22:30 Yeah.

22:30 Yeah. So anyway, pretty cool. I recommend if you want to check this out, just go browse the gallery. That's

22:36 the best way to see what this thing can do.

22:37 I love pretty pictures.

22:39 I know. Yeah. This one definitely passes our, our tests for you must have pretty pictures

22:44 in order to talk about graphical stuff. Yeah. So Brian, really quick on this next one, click on the

22:52 app for it because it's take just a second to load up. So that's it for our main items. I want to tell

22:57 you about a couple of things, then we'll get to yours as well. First, one of the features that I really

23:03 like about Visual Studio Code, I haven't really used because I don't use Visual Studio Code in like a

23:08 meaningful way. I use it all the time for like little bits of editing, but not if I'm like doing real

23:13 projects, I probably use PryCharm, but it has, it has live share, which is a pretty killer feature.

23:19 So you can say, I would like to share my coding environment with someone else who's going to like

23:25 look over my shoulder, do paired programming, just code review, whatever. And they can actually debug

23:30 and step through and like see your code in their editor. And it could even be like a different editor.

23:36 I think there's other stuff support, like proper Visual Studio versus VS Code and whatnot. So that's

23:41 really cool. And I've always thought like, well, that would be awesome for PyCharm. But no. So

23:47 someone on Twitter, sorry, I don't remember who sent this to me, but thank you. I sent up this link to

23:53 this project called CodeTogether. So CodeTogether is a freemium product. So this is a, not an open source

24:01 thing. It's like a paid project. You can go sign up, pay dollars a month for certain features, or you can

24:07 just use the free version. But it has that type of experience that I just talked about, but for many

24:12 different editors, right? So it comes for all the IntelliJ stuff. So like WebStorm, PyCharm, and so on.

24:17 Also works with VS Code. It works with other things. I don't know exactly all the things that it covers,

24:23 but certainly Eclipse, IntelliJ, and VS Code, which covers quite a bit. So if you're looking for that,

24:29 and you weren't using LiveShare, because it didn't exist for what you're doing, you could check

24:33 this out. I have not used it. I'm not endorsing it. I'm just saying it looks interesting and it might

24:38 help people.

24:38 Oh, neat. Cool.

24:39 Yeah. Yeah. Cool. And then the other one that I want to just quickly mention is related to the first

24:46 thing. These are totally different things. But Kevin VanderVeen sent over a message a week ago and said,

24:52 hey, I built a cool data explorer to help you understand the whole COVID pandemic stuff in a

25:00 local way. And he built it using Streamlit. So I thought, hey, here's an app that someone just sent

25:05 over that's like a cool running on Heroku Streamlit app. That would be a nice example of what I talked

25:11 about at the beginning. And it also has the GitHub repo there as well. So if you go and check out that

25:16 app, like for example, Brian, you scroll down to the second, to the third graph, below the third graph,

25:20 there's like a dropdown that lets you pick Oregon and you can go pick that. And wow, it looks like

25:24 we're flattening the curve really well. That's pretty awesome. Although the last two days have

25:29 been rough, I guess. Or you can go down a little farther and compare it against different states.

25:32 You could go in there and type like it's Colorado. You could type Oregon or New York or whatever you

25:37 want. And then it'll like autocomplete that out of the list and then regenerate. And this is exactly

25:42 like what I was saying. Like there's some line in the Streamlit code that's just saying,

25:46 get the tags from the tag selector. And then if you type in there, it just reruns the whole thing.

25:52 But most of the stuff's cached and then it'll redraw the graph. It's super cool. So this is both

25:57 useful, I think, for if you want to try to like understand that it's a cool data science project.

26:02 The source is on GitHub. But also it's just a cool example of Streamlit if people want to see that

26:07 going.

26:07 And the graphs are fun too because you can do like box select and zooming and stuff like that.

26:12 Yeah, these are just Plotly. So they do all the standard Plotly stuff, which is pretty cool.

26:16 That's kind of what I like about the Streamlit thing, not forcing you to use their random graphing

26:21 thing, but just other graphs that you might like.

26:23 Yeah.

26:23 Yeah. All right. Well, that's it for my extras. What else do you got?

26:26 Well, I wanted to remind people that PyCon 2020 online is available and new content is still

26:32 being posted through the first few weeks of May. I think that's when they're wrapping things up.

26:37 Yeah, that's cool. I just saw some new videos go up there. Yeah.

26:39 Yeah. One of the new videos that just came up was my talk. So multiply your testing effectiveness

26:45 with parameterized testing.

26:47 Oh, yeah. There it is right at the bottom with a couple of new tags on it.

26:50 Yeah. So I'm excited to have people get feedback from people to see what they thought.

26:54 So that looks good. I like it. Yeah. Well done.

26:56 While I was there, I was looking around. There's tons of great talks. There's a bunch of tutorials

27:01 there. There's charlas. Is that new this year?

27:04 They did it last year, maybe the last two years, but it's the Spanish language track.

27:09 Yeah. It's neat. I'm glad they're doing it. Sponsor workshops. That's kind of nice to have.

27:14 And then even an online poster hall. So that's there. So it's cool.

27:18 The other thing I wanted to bring up, a quick extra, if anybody's following the drama in pytest,

27:24 the drama is over and I'm happy with the resolution. So hopefully there will be peace in the family.

27:31 I hope so. A link to the Twitter announcement from pytest.

27:33 Yeah. They got the whole public statement there. So the folks who had dropped out,

27:39 are they dropping back in or what's, or is there just permanent out fallout from that?

27:43 I don't know that any more details. I know at least one person is back in,

27:49 but all the people I was worried about are signers of this message. So.

27:54 Yeah. So probably.

27:55 Kind of seems like maybe they're back in.

27:56 Yeah. All right. Well, that's awesome. I'm really glad to hear that got resolved. And it sounds like

28:00 exactly the outcome that I would have voted for as well. Okay. So you ready for some jokes? I don't

28:08 know. These jokes. How about you? Are you ready for humor?

28:10 Yes. Humor is good.

28:11 Humor is definitely good. And so I found a couple of funny pictures and I'm going to put the pictures

28:19 in the show notes. I don't know if they'll come up in your podcast players. Some of them do,

28:23 some of them don't. Some of you guys say allow pictures in this podcast feed, just like in the

28:28 player as you're looking at the show notes, but certainly on the website, they'll be there.

28:32 And these are Oh really book covers.

28:35 I love these.

28:36 They're like O'Reilly and just if you've forgotten the O'Reilly books always have the title and then

28:43 they have an animal that goes with it. Right? So if you wrote a book for O'Reilly,

28:48 the thing is like, what's your animal on your book and whatnot. Yeah. So these are like,

28:53 take those ideas, put an animal on it, but make it silly. Right? There's also usually like some

29:00 sort of saying at the top of the book. So for these, you definitely have to read the top also.

29:04 Yeah. It's right. Like sort of the subtitle. Okay. So how about this? I'll read the first one. You do

29:09 the second one and so on. So this one has like a badger or something on it, on the front of it. And it's

29:15 kind of like sneaky head down. And, the title is pointless meetings, the survival guide,

29:21 how to survive all pointless meetings. I feel like many, many things that used to be meetings

29:28 these days are now an email and people are like, Oh my gosh, they really can just be emails. Like,

29:33 why have we been going to all these meetings? Right? So, all right. You want to get the next one?

29:37 The next one is overriding your teammates code. My code is better than yours anyway.

29:45 It's got a horse on the front. I don't know either. I really love this one. This one is the essential

29:51 semicolon parenthesis. Sorry. Quote semicolon parenthesis drop table animals, semicolon dash,

29:58 dash. And there's no animal because, well, this is a SQL injection that has deleted it. And it says

30:05 now with user generated content. That one's that may be the best. Yes. Now with the security hole.

30:13 Exactly. Related. What's next? Okay. This one has a fish on the cover. Expert hoping nobody hacks you

30:19 security by optimism and prayer. I don't know what the fish has to do with it. I must be missing it.

30:25 But, no, but that's good. That's most people's security solution, right? That's true. So the next one

30:32 is an octopus. Obviously many legs. It can type many things. And the title is the entire book is exiting

30:40 vim eventually. Just memorize the 14 contextual dependent instructions.

30:45 Exiting vim eventually. Oh, I love it. I love it. Yeah. So you'll have to visit the website and

30:53 check out these because they're pretty sweet. Yeah. Awesome. Speaking of sweet, it's been great to be

30:58 here with you, Brian. Thanks. It has been great. Thanks. Yep. Bye. Bye.

Back to show page