Transcript #181: It's time to interrogate your Python code
Return to episode page view on github00: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.