WEBVTT

00:00:00.001 --> 00:00:04.480
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:00:04.480 --> 00:00:11.920
your earbuds. This is episode 198, recorded August 31st, 2020. I am Brian Okken.

00:00:11.920 --> 00:00:12.760
I'm Michael Kennedy.

00:00:12.760 --> 00:00:15.600
And we're joined by a guest. We have Annalena Popkus.

00:00:15.600 --> 00:00:17.700
Yes, that's very correct.

00:00:17.700 --> 00:00:22.140
Wonderful. She's been on Michael's Talk Python podcast a couple of times.

00:00:22.140 --> 00:00:22.740
Absolutely.

00:00:22.740 --> 00:00:23.640
Or at least once.

00:00:23.640 --> 00:00:28.420
It depends how far out in the future. I think in the future twice. We've already recorded a

00:00:28.420 --> 00:00:32.400
couple shows together, but we've got quite a buffer there. So this one will be out before.

00:00:32.400 --> 00:00:36.200
So one and two times. And welcome to this show. Nice to see you.

00:00:36.200 --> 00:00:37.380
Yeah, thanks for having me.

00:00:37.380 --> 00:00:39.460
I'll kick it off with the first topic.

00:00:39.460 --> 00:00:41.980
Give us something easy. Don't make it hard, Brian. Come on.

00:00:41.980 --> 00:00:47.960
Yeah, actually. So when I remember, it's been a while since I shifted of thinking about Python

00:00:47.960 --> 00:00:54.420
as a scripting language to as a full-blown language to do everything, big applications and stuff.

00:00:54.420 --> 00:01:00.400
Of course, I still do both. I use it for a quick scripting language, but also more meaty

00:01:00.400 --> 00:01:06.820
things. But back in the day when I was using Bash, if I wanted to have a little script to do with

00:01:06.820 --> 00:01:13.200
arguments, I'd have like an example Bash file that I would just keep copying from. And I was thinking

00:01:13.200 --> 00:01:17.820
about that because I would never remember how to do arguments and stuff and parameter passing through

00:01:17.820 --> 00:01:24.760
into a little script. And the same is true for Python with arg parse. But we have Google now to find that

00:01:24.760 --> 00:01:31.000
information out. But I was thinking about that when I saw this comment on Twitter. It's from Joshua

00:01:31.000 --> 00:01:33.180
Schreiber. And he said,

00:01:33.180 --> 00:01:38.880
every time I write a Python script, I have to go back to an old script of mine to remember how to set

00:01:38.880 --> 00:01:44.760
up arg parse. For some reason, it just doesn't stick in my mind at all. And then Ken Yewans Clark,

00:01:44.760 --> 00:01:48.020
and I think he's been on your show, hasn't he, Michael?

00:01:48.020 --> 00:01:49.080
No, I don't think so.

00:01:49.080 --> 00:01:49.480
Okay.

00:01:49.480 --> 00:01:50.740
Probably should be, but hasn't.

00:01:50.740 --> 00:01:53.100
He commented and he said,

00:01:53.240 --> 00:01:59.720
I've got this little utility called the new.py. So I went and checked it out and I'm pretty happy

00:01:59.720 --> 00:02:03.880
with it. It's not something you can pip install and we're going to link to it in the show notes. It's

00:02:03.880 --> 00:02:10.000
just part of, he's got a repo for it. And I think he uses it in a book that he wrote, but basically what

00:02:10.000 --> 00:02:16.300
it does is you, you run it and give it a file name and it gives you a little starter script with all

00:02:16.300 --> 00:02:21.300
arg parse stuff with examples. You've got an example, positional argument, a string argument,

00:02:21.440 --> 00:02:26.120
integer argument, file argument, and a Boolean flag. So you don't have to look that stuff up.

00:02:26.120 --> 00:02:31.360
They're already there as dummy ones. And then you can, you know, add to it and whatever,

00:02:31.360 --> 00:02:36.740
delete the stuff you don't want. So just in, if you've got this around, you can use it to

00:02:36.740 --> 00:02:43.960
spin up a new script really easily. And he also just recently added test code for it. So if you

00:02:43.960 --> 00:02:50.780
pass it a dash T, it'll generate a little stub test file so you can test your script with it too.

00:02:50.780 --> 00:02:55.220
So anyway, if you're using Python for scripting, I think this is a good thing to look at.

00:02:55.220 --> 00:03:00.380
I love that. I have the same problem every time. I always copy it from an old script every time.

00:03:00.380 --> 00:03:06.020
I was thinking the same thing. Like what is one of the big difference between beginners and experts?

00:03:06.020 --> 00:03:08.900
Experts have a whole bunch of these old things they can go copy from.

00:03:09.760 --> 00:03:14.940
Well, I often use, so I'm usually using click or what's the other one that's...

00:03:14.940 --> 00:03:15.860
Typer. Typer.

00:03:15.860 --> 00:03:16.400
Typer's the business.

00:03:16.400 --> 00:03:22.140
Yeah. So I'm usually using those for larger applications, but there's a lot of times where

00:03:22.140 --> 00:03:27.060
you're passing, you have a shared script that you don't really want to have install anything extra.

00:03:27.580 --> 00:03:30.960
So ArgParse is still something to use for a lot of stuff.

00:03:30.960 --> 00:03:31.600
Yeah. Very cool.

00:03:31.600 --> 00:03:36.460
Yeah. If you don't want arguments, I'm sorry, dependencies, this is a great example there.

00:03:36.460 --> 00:03:40.480
Because if your script could literally run without a pip install or without a virtual environment,

00:03:40.480 --> 00:03:45.200
except for that, you know, I probably would just have a slightly more cumbersome bit of code

00:03:45.200 --> 00:03:47.520
and have it easy, easy to run, you know?

00:03:47.520 --> 00:03:47.720
Yeah.

00:03:47.720 --> 00:03:52.980
I've been thinking about how I should really be building more CLI-based applications.

00:03:52.980 --> 00:03:58.420
And I have an insane number of these little, what I would really call scripts.

00:03:58.420 --> 00:03:59.200
They're not applications.

00:03:59.200 --> 00:04:04.700
They're like little tools that I just use to run all the stuff around my company.

00:04:04.700 --> 00:04:11.340
So for example, one that I wrote last week was I had a company that did transcripts for the video

00:04:11.340 --> 00:04:13.320
courses and then they stopped doing that.

00:04:13.900 --> 00:04:17.440
You know, it's fine. They moved on to doing other things, but all of a sudden I had to figure out,

00:04:17.440 --> 00:04:18.860
well, how do I get transcripts again?

00:04:18.860 --> 00:04:23.860
So I wrote a little script that would go find all of the videos in a course,

00:04:23.860 --> 00:04:31.400
see if it was missing transcripts, go and use AWS transcribe and just say the videos in AWS S3,

00:04:31.400 --> 00:04:35.460
do this and then download it and turn it into sentences and subtitles and video.

00:04:35.460 --> 00:04:37.620
So there's like 50 of these.

00:04:37.620 --> 00:04:42.520
And I'm at the point where I almost think I might just make one command line option to run

00:04:42.520 --> 00:04:44.340
every one of those scripts, right?

00:04:44.340 --> 00:04:50.800
Like kind of like Git with sub commands, like TP space transcripts, TP space video and code,

00:04:50.800 --> 00:04:50.980
right?

00:04:50.980 --> 00:04:53.840
Like I'm almost ready to build this huge CLI thing.

00:04:53.840 --> 00:04:55.500
And I probably won't use arg parse though.

00:04:55.500 --> 00:04:56.280
I'll probably use typer.

00:04:56.280 --> 00:04:56.580
Yeah.

00:04:56.580 --> 00:04:57.680
Sounds like a good idea.

00:04:57.680 --> 00:04:58.460
Yeah, exactly.

00:04:58.460 --> 00:04:59.300
Cause I always forget.

00:04:59.300 --> 00:05:00.160
I'm like, did I write that?

00:05:00.160 --> 00:05:00.680
What's it called?

00:05:00.680 --> 00:05:01.660
How do I run it again?

00:05:01.660 --> 00:05:02.980
To track it down.

00:05:03.240 --> 00:05:06.300
So this next one comes to us from a listener.

00:05:06.300 --> 00:05:08.840
Exuma is the username.

00:05:08.840 --> 00:05:10.220
I didn't get a first last name.

00:05:10.220 --> 00:05:11.920
So thanks for sending that over.

00:05:12.400 --> 00:05:18.680
And it's called D beaver, D beaver, something like that.

00:05:18.680 --> 00:05:21.360
So it's for databases and has to do with beavers.

00:05:21.360 --> 00:05:24.120
So D beaver database UI tool.

00:05:24.120 --> 00:05:31.200
And something about working with databases inspires people to use animal names or creature names.

00:05:31.920 --> 00:05:34.280
So this is D beaver.

00:05:34.280 --> 00:05:44.940
And the one that I mentioned that started got Exuma saying, Hey, this is cool, but you should also check this other one out is I mentioned beekeeper at beekeeper.io, which is really, really cool.

00:05:44.940 --> 00:05:50.860
So here's another cool free open source database GUI tool.

00:05:50.860 --> 00:05:53.680
So if you got to work with databases, this looks like a really nice one.

00:05:53.680 --> 00:05:54.520
Yeah, it looks pretty cool.

00:05:54.520 --> 00:05:54.820
Yeah.

00:05:54.820 --> 00:05:59.620
You know, it doesn't have the full on marketing, beautiful page.

00:05:59.620 --> 00:06:07.580
Like if you go to beekeeper studio, sorry, beekeeper studio.io, man, that thing looks like it could be a VC funded startup like landing page, right?

00:06:07.580 --> 00:06:16.540
Whereas D beaver is nice, but it doesn't have, it doesn't look like ultra polish, but it's based on a clips and it supports 80 different database types.

00:06:16.540 --> 00:06:25.760
So obviously the popular ones like my SQL, Postgres, SQL lights, Microsoft SQL server, and so on, but a whole bunch of other ones as well.

00:06:26.500 --> 00:06:32.280
So yeah, if you got to work with databases and you want some kind of UI tool, this looks like a pretty good option.

00:06:32.280 --> 00:06:34.120
Do you have an idea why they called it beaver?

00:06:34.120 --> 00:06:36.340
I have no idea why they called it beaver.

00:06:36.340 --> 00:06:42.560
It's funny sometimes since in machine learning, they had a trend that they named the models like Sesame Street.

00:06:42.560 --> 00:06:43.880
Do you say Sesame Street?

00:06:43.880 --> 00:06:44.800
Yeah, yeah, yeah, yeah.

00:06:44.800 --> 00:06:46.840
And they started calling them bird.

00:06:46.840 --> 00:06:49.820
Like Grover and Big Bird and all this kind of stuff.

00:06:49.900 --> 00:06:56.940
Yeah, and someone started it and then the others just continued naming the models like that.

00:06:56.940 --> 00:06:58.280
It was a lot of fun.

00:06:58.280 --> 00:06:59.500
Yeah, it's really fun.

00:06:59.500 --> 00:07:07.400
Last episode, which isn't out yet, so there's no way you would have heard this, but we were talking about something on Debian.

00:07:07.400 --> 00:07:14.880
It was going through the Python Docker script and understanding what it means to create a bare-bones Python system.

00:07:14.880 --> 00:07:21.200
And you found out that Debian names their releases after Toy Story characters.

00:07:21.200 --> 00:07:23.200
I like that.

00:07:23.200 --> 00:07:24.660
Yeah, that's nice.

00:07:24.660 --> 00:07:29.700
And of course, you were doing all of your stuff with 100 Days of Code and Harry Potter, right?

00:07:29.700 --> 00:07:30.800
Which is also pretty awesome.

00:07:30.800 --> 00:07:33.040
But there's not really releases for that, is there?

00:07:33.040 --> 00:07:33.300
No.

00:07:34.680 --> 00:07:35.560
So let's see.

00:07:35.560 --> 00:07:40.940
So a couple more things that are interesting about DBeaver is it's got a nice GUI interface.

00:07:40.940 --> 00:07:42.760
It has dark mode, light mode, and whatnot.

00:07:42.760 --> 00:07:45.240
It has support for cloud data sources.

00:07:45.240 --> 00:07:51.040
So if you're going to connect to, I'm presuming things like hosted databases like SQL Azure or something like that.

00:07:51.040 --> 00:07:59.560
But it also has extensions that allow you to work directly between databases and Excel or databases and Git, which I think is pretty cool.

00:07:59.560 --> 00:08:10.120
And it also will build UML entity diagrams, like show me the relationships of this table, you know, where the foreign keys go and all of the things like that visually, which is pretty nice.

00:08:10.120 --> 00:08:12.540
If you're just like given a project, here's the database.

00:08:12.540 --> 00:08:14.420
You're like, oh, what the heck did I just get?

00:08:14.420 --> 00:08:14.960
Right.

00:08:14.960 --> 00:08:16.680
You could open it up in something like this.

00:08:16.680 --> 00:08:19.820
You know, PyCharm Pro has something along those lines as well.

00:08:19.900 --> 00:08:21.200
But this is really an open source.

00:08:21.200 --> 00:08:22.000
So that's pretty cool.

00:08:22.000 --> 00:08:29.520
Yeah, I use the one for PyCharm Pro for and the diagramming helps a lot to be able to visualize what your data is doing.

00:08:29.520 --> 00:08:30.080
Totally agree.

00:08:30.080 --> 00:08:31.000
I use it all the time.

00:08:31.000 --> 00:08:31.140
Yeah.

00:08:31.140 --> 00:08:31.820
All right.

00:08:31.820 --> 00:08:33.340
Well, that's it for DBeaver.

00:08:33.340 --> 00:08:33.960
I think it's cool.

00:08:33.960 --> 00:08:36.460
People can check it out and compare it with Beekeeper Studio.

00:08:36.460 --> 00:08:36.920
Great.

00:08:37.080 --> 00:08:39.620
So I want to talk about PDB++.

00:08:39.620 --> 00:08:49.440
So I was always using the IPython debugger when debugging, but I recently switched from using IPDB to PDB++.

00:08:49.440 --> 00:08:55.840
So PDB is the Python debugger, like the normal one that's part of the standard library.

00:08:55.840 --> 00:08:59.520
And PDB++ is an extension of that.

00:08:59.520 --> 00:09:04.260
So it's fully compatible with PDB, but it has some pretty nice features.

00:09:04.680 --> 00:09:08.740
And I think they improved the debugging experience quite a bit.

00:09:08.740 --> 00:09:10.760
It's very easy to install.

00:09:10.760 --> 00:09:18.400
So you just type pip install PDBPP, since PDB++ is not a valid package name.

00:09:18.400 --> 00:09:20.520
And I have two favorites.

00:09:20.520 --> 00:09:31.780
Like it has quite a few additional commands and features compared to PDB, but it has all the usual commands that are also part of IPDB.

00:09:31.780 --> 00:09:33.340
So it's very easy to switch.

00:09:33.340 --> 00:09:36.220
But there is the sticky mode, which I like a lot.

00:09:36.220 --> 00:09:46.260
So the official description is that when you're in the sticky mode, every time you change the current position, the screen is repainted and then the whole function is shown.

00:09:46.260 --> 00:09:52.200
So when doing step-by-step debugging, it's very easy to follow the flow of execution.

00:09:52.560 --> 00:10:00.040
And I find it very annoying to always type L or double L to see the code.

00:10:00.040 --> 00:10:07.280
And with the sticky mode, you can just always follow along with the code and the flow of execution.

00:10:07.480 --> 00:10:11.640
And then there is smart command parsing, which I also like.

00:10:11.960 --> 00:10:24.160
So if you have or if you're using PDB, it always tries to interpret the commands you enter as one of the built-in commands, which can be quite inconvenient in some situations.

00:10:24.640 --> 00:10:33.500
For example, if you want to print the value of local variable and that one happens to have the same name as one of the commands, for example.

00:10:33.500 --> 00:10:34.200
Oh, no.

00:10:34.200 --> 00:10:35.300
Yeah, that could.

00:10:35.300 --> 00:10:37.100
And I had that quite a few times.

00:10:37.460 --> 00:10:51.120
So, for example, if you call something P or C and then you want to print the value of that variable, but it is interpreted as the command continue, which is C is short for continue.

00:10:51.120 --> 00:10:55.440
And I think PDB++ has quite a nice solution for that.

00:10:55.440 --> 00:11:04.640
So when there is ambiguity, so if you have a variable with the same name in the current scope, then that variable is preferred.

00:11:05.360 --> 00:11:10.960
And if you still want to run the command, you can just prefix it with two exclamation marks.

00:11:10.960 --> 00:11:15.580
But if you don't have any ambiguity and you type C, then it will always be continue.

00:11:15.580 --> 00:11:17.860
And I find that very convenient.

00:11:17.860 --> 00:11:18.560
Oh, yeah.

00:11:18.560 --> 00:11:19.920
That seems like a great little feature.

00:11:19.920 --> 00:11:23.140
And it just runs in the terminal, right?

00:11:23.140 --> 00:11:27.560
So you can run it anywhere that you have SSH access to or something to that effect.

00:11:27.560 --> 00:11:30.240
Yeah, I think it's a very nice package.

00:11:30.240 --> 00:11:35.220
Maybe this is a dense question, but why use this over like an ID?

00:11:35.220 --> 00:11:37.200
Oh, I just always use Vim.

00:11:37.200 --> 00:11:48.280
And that's why I got so used to using Vim that I find it very convenient to use PDB or IPDB or now PDB++.

00:11:48.280 --> 00:12:01.440
I guess I would have to start using an IDE properly to really be able to appreciate it.

00:12:01.440 --> 00:12:08.060
And yeah, I don't think I can switch back to an IDE for a while.

00:12:08.060 --> 00:12:11.080
Yeah, it has some cool features as well down here.

00:12:11.080 --> 00:12:24.020
Like one of the things is if there's an exception, you can ask it for a postmortem report and it'll give you like extra details in there.

00:12:24.140 --> 00:12:27.960
You can also do stuff like break on set attribute.

00:12:27.960 --> 00:12:34.980
So if some kind of attribute is set, which is, I guess, a little bit like a conditional breakpoint and say an IDE or whatever.

00:12:34.980 --> 00:12:36.520
But yeah, it looks pretty cool.

00:12:36.520 --> 00:12:40.100
I like the fact that it has syntax highlighting and color and all that.

00:12:40.100 --> 00:12:40.820
Yeah.

00:12:40.820 --> 00:12:41.440
And autocomplete.

00:12:41.600 --> 00:12:44.240
I know that it can be quite nice in an IDE too.

00:12:44.240 --> 00:12:49.320
I think on the last Talk Python episode, it was on the Python.

00:12:49.320 --> 00:12:50.840
How was that episode called?

00:12:50.840 --> 00:12:55.680
It was called the Modern Python Developers Toolkit by Sebastian Witwaski.

00:12:55.680 --> 00:12:55.900
Yeah.

00:12:55.900 --> 00:12:58.380
And you talked about Visual Studio.

00:12:58.380 --> 00:13:03.780
And yeah, I know that it has quite a few features as well.

00:13:03.780 --> 00:13:07.340
But when you're used to something like IPDB, this is a very nice addition.

00:13:07.340 --> 00:13:07.660
Yeah.

00:13:07.660 --> 00:13:08.500
Yeah, absolutely.

00:13:09.260 --> 00:13:12.880
And you can also, what's the double exclamation point thing?

00:13:12.880 --> 00:13:16.100
So you mean what I just mentioned with the command?

00:13:16.100 --> 00:13:16.900
Yeah, yeah, yeah.

00:13:16.900 --> 00:13:17.900
Like when would I run that?

00:13:17.900 --> 00:13:26.140
So if you have like a variable C and that has some value, so it's a local variable, but you want to run continue in this case.

00:13:26.140 --> 00:13:26.440
Oh, I see.

00:13:26.440 --> 00:13:29.980
Then you would have two exclamation marks and the C.

00:13:29.980 --> 00:13:31.840
Yeah, so that's why it skips it.

00:13:31.840 --> 00:13:32.420
Okay, got it.

00:13:32.420 --> 00:13:33.120
I understand now.

00:13:33.120 --> 00:13:33.940
Cool, cool.

00:13:33.940 --> 00:13:34.440
All right.

00:13:34.440 --> 00:13:38.160
Yeah, this, you know, I live largely in the IDE world.

00:13:38.360 --> 00:13:43.840
But if I needed to do some debugging outside of it, this is a really nice option, I think.

00:13:43.840 --> 00:13:46.620
Like maybe in a Docker container.

00:13:46.620 --> 00:13:49.520
And I don't want to set up like remote debugging and all that kind of stuff.

00:13:49.520 --> 00:13:50.900
I just want to run it.

00:13:50.900 --> 00:13:51.480
What's it doing?

00:13:51.480 --> 00:13:52.020
Yeah, that's cool.

00:13:52.020 --> 00:13:52.340
Nice.

00:13:52.340 --> 00:13:53.260
Oh, yes.

00:13:53.260 --> 00:13:55.580
Today's sponsor is us.

00:13:55.580 --> 00:13:57.480
So thank you, us.

00:13:57.480 --> 00:14:00.180
Thanks, us.

00:14:00.580 --> 00:14:02.320
We'll probably have to edit that section.

00:14:02.320 --> 00:14:08.980
Today's sponsor is both Talk Python training and Test and Code podcast as well.

00:14:08.980 --> 00:14:10.040
I wanted to highlight.

00:14:10.040 --> 00:14:17.520
I had some, I think last episode I mentioned that Adam Johnson, which hadn't actually, he

00:14:17.520 --> 00:14:18.940
hadn't actually been on our show yet.

00:14:18.940 --> 00:14:23.000
But the last episode of Test and Code 128, I did have Adam Johnson on.

00:14:23.000 --> 00:14:25.340
He is the maintainer of pytest randomly.

00:14:26.080 --> 00:14:30.400
And so we talk about what the importance of randomizing your tests to make sure that you

00:14:30.400 --> 00:14:33.640
have order dependent, order independent tests.

00:14:33.640 --> 00:14:35.500
So that's a good episode.

00:14:35.720 --> 00:14:40.840
But we talk about all sorts of stuff on Test and Code, including things like tips for working

00:14:40.840 --> 00:14:41.320
from home.

00:14:41.320 --> 00:14:42.660
That was on episode 127.

00:14:42.660 --> 00:14:43.940
So check it out.

00:14:43.940 --> 00:14:46.300
I think people are doing that more than they used to for some reason.

00:14:46.300 --> 00:14:47.200
I'm not really sure why.

00:14:47.200 --> 00:14:48.080
Working from home?

00:14:48.080 --> 00:14:48.360
Yeah.

00:14:48.360 --> 00:14:49.320
Yeah, definitely.

00:14:49.320 --> 00:14:51.280
Yeah, no, that sounds great.

00:14:51.280 --> 00:14:52.880
And Talk Python Training.

00:14:52.880 --> 00:14:57.180
Yeah, we just released a brand new course, Move from Excel to Python and Pandas.

00:14:57.180 --> 00:15:03.160
So if you have been trying to overdo all the stuff that you do around data with Excel

00:15:03.160 --> 00:15:08.580
or people you work with are, we created a course written by Chris Moffitt from Practical

00:15:08.580 --> 00:15:14.120
Business Python to basically go through all the main use cases of Excel and show how much

00:15:14.120 --> 00:15:16.140
easier it is to do that in Jupyter and Pandas.

00:15:16.140 --> 00:15:20.000
And I think it'll help a lot of people get their foot in the door in the Python world.

00:15:20.000 --> 00:15:21.300
I think that's really cool.

00:15:21.300 --> 00:15:27.400
I always wanted to learn Excel, but it's so much nicer with Python that I never got around

00:15:27.400 --> 00:15:28.000
doing it.

00:15:28.000 --> 00:15:28.720
Yeah, that's perfect.

00:15:28.720 --> 00:15:31.700
That's the good side to be on, not the other side.

00:15:31.700 --> 00:15:32.280
Yes.

00:15:32.800 --> 00:15:36.520
So Brian, tell us about Markdown.

00:15:36.520 --> 00:15:37.680
I really like Markdown.

00:15:37.680 --> 00:15:40.260
I use it for a whole bunch of stuff.

00:15:40.260 --> 00:15:45.540
And when I mean, I so much so that I just kind of assume everybody's using Markdown now.

00:15:45.540 --> 00:15:50.700
But sometimes people have trouble getting up to speed or you want to share something.

00:15:50.700 --> 00:15:56.160
Anyway, I came across, I was actually having a Twitter discussion with somebody and they

00:15:56.160 --> 00:15:59.000
brought up this HackMD.io tool.

00:15:59.000 --> 00:16:01.900
And HackMD, I've never heard of that.

00:16:01.900 --> 00:16:05.320
So I went to check it out and I'm pretty impressed with it.

00:16:05.320 --> 00:16:06.120
It's pretty cool.

00:16:06.120 --> 00:16:08.820
It is a paid service, but there's a free option too.

00:16:08.820 --> 00:16:10.320
So of course I'm on the free option.

00:16:10.320 --> 00:16:16.540
But the idea is just sort of, I've got the similar, there's a lot of tools that do this.

00:16:16.540 --> 00:16:20.920
So you've got a two panel system where you, on the left, you, you're Markdown and on the

00:16:20.920 --> 00:16:23.500
right, it shows up and you can hide one or the other.

00:16:23.660 --> 00:16:28.920
But the, what I really like is some of the stuff that I always forget, like how to do,

00:16:28.920 --> 00:16:35.220
how to insert a picture or do a table of contents or put reference links in or, or footnotes.

00:16:35.220 --> 00:16:38.400
Those things are just sort of in there with menu items.

00:16:38.400 --> 00:16:41.400
So I don't have to remember what all those Markdown codes are.

00:16:41.400 --> 00:16:45.820
They just added, apparently you can collaborate and have multiple people editing a document

00:16:45.820 --> 00:16:46.340
with this.

00:16:46.340 --> 00:16:47.380
So that's pretty cool.

00:16:47.380 --> 00:16:52.880
There's some fancy extra things like a UML diagrams that you can add in.

00:16:52.880 --> 00:16:57.860
And I'm not sure if you're exporting it, you'll have to try to figure out what sort of extra

00:16:57.860 --> 00:17:00.100
tools you need to actually generate those.

00:17:00.100 --> 00:17:01.180
But it's pretty fun.

00:17:01.180 --> 00:17:06.940
The thing that I like that they just added recently, apparently is you can sync with GitHub.

00:17:06.940 --> 00:17:12.900
So you can keep all your Markdown documents in GitHub and edit them with, with HackMD.

00:17:12.900 --> 00:17:14.260
And that's pretty, pretty fun.

00:17:14.260 --> 00:17:15.000
That's awesome.

00:17:15.000 --> 00:17:18.640
The other thing I found was this thing called Markdown Guide.

00:17:19.160 --> 00:17:23.140
And it is just a, just a really good, clean reference for Markdown.

00:17:23.140 --> 00:17:26.940
So I'm going to, there's, I had, you know, a handful of different references that I was

00:17:26.940 --> 00:17:31.140
using, but I think I'm going to switch to this one because there's tabs that have like a getting

00:17:31.140 --> 00:17:33.280
started page that I can send people to.

00:17:33.840 --> 00:17:35.500
And a couple of cheat sheets.

00:17:35.500 --> 00:17:37.680
One of them was, is the most common things.

00:17:37.680 --> 00:17:41.260
And I think it's pretty, pretty indicative of common things you'll use.

00:17:41.260 --> 00:17:45.780
And then an extended syntax page with, and then a bunch of tools you can use.

00:17:45.780 --> 00:17:48.740
So a couple of Markdown references for people.

00:17:48.740 --> 00:17:50.180
Have you ever used Pandoc?

00:17:50.180 --> 00:17:50.680
Oh yeah.

00:17:50.680 --> 00:17:51.420
I love Pandoc.

00:17:51.560 --> 00:17:51.960
Yes.

00:17:51.960 --> 00:17:58.020
Since I recently started using it and I'm preparing my presentations now with Pandoc every

00:17:58.020 --> 00:17:58.320
time.

00:17:58.320 --> 00:17:58.880
And I love it.

00:17:58.880 --> 00:18:00.740
It's just great, great tool.

00:18:00.740 --> 00:18:07.160
I love about Pandoc is it's not just from Markdown to HTML, but you can convert to Media

00:18:07.160 --> 00:18:16.020
Wiki or lots of, or I use it a lot of times to format my emails correctly in the Microsoft

00:18:16.020 --> 00:18:16.500
Office.

00:18:16.500 --> 00:18:24.080
I will write them in Markdown and then use Pandoc to generate the WordDoc version and then

00:18:24.080 --> 00:18:25.700
copy and paste into an email.

00:18:25.700 --> 00:18:29.880
I know it's backwards, lots of steps, but it works for me.

00:18:29.880 --> 00:18:30.160
Yeah.

00:18:30.160 --> 00:18:35.160
You know, it'd be nice to have just an email editor that just takes straight Markdown.

00:18:35.160 --> 00:18:35.820
Wouldn't that be cool?

00:18:35.820 --> 00:18:36.980
Yeah, that would be cool.

00:18:36.980 --> 00:18:37.400
Yeah.

00:18:37.400 --> 00:18:43.880
And I'd really like an extension to Microsoft Outlook that had Vim key bindings.

00:18:43.880 --> 00:18:45.620
That would be awesome.

00:18:45.620 --> 00:18:48.060
So the programmers are invading Outlook.

00:18:48.060 --> 00:18:48.860
Yeah.

00:18:48.860 --> 00:18:55.340
Some other cool stuff about Markdown or hack Markdown, hacked MD is it has a VS Code extension.

00:18:55.340 --> 00:18:57.860
And like you said, the GitHub integration is cool.

00:18:57.860 --> 00:18:58.900
It has a browser extension.

00:18:58.900 --> 00:19:01.280
You could turn your notes into a slide deck.

00:19:01.280 --> 00:19:05.120
You can turn it into like a research project into like what they call book mode.

00:19:05.120 --> 00:19:05.640
Yeah.

00:19:05.640 --> 00:19:06.320
It looks pretty interesting.

00:19:06.320 --> 00:19:10.660
And the collaboration is definitely needed around Markdown these days.

00:19:10.660 --> 00:19:14.660
Like there's not really a great collaborative place that I know of.

00:19:14.800 --> 00:19:18.680
Although I'm sure listeners are going to send us five examples, which is awesome because they always do.

00:19:18.680 --> 00:19:21.840
But for example, like we use paper.

00:19:21.840 --> 00:19:22.700
You can do slides with this?

00:19:22.700 --> 00:19:23.520
Yes.

00:19:23.520 --> 00:19:30.220
You can export paper from Dropbox paper, paper.dropbox.com as Markdown.

00:19:30.300 --> 00:19:31.980
But it's not full fidelity.

00:19:31.980 --> 00:19:35.360
It's like 85% that you can edit what you get.

00:19:35.360 --> 00:19:37.400
But it's still, it's better than nothing.

00:19:37.400 --> 00:19:38.220
But yeah, this looks cool.

00:19:38.220 --> 00:19:38.520
Nice.

00:19:38.520 --> 00:19:39.380
You know what's not cool?

00:19:39.380 --> 00:19:40.260
Python malware.

00:19:40.260 --> 00:19:42.020
That's not a thing, is it?

00:19:42.660 --> 00:19:43.840
Apparently it is now a thing.

00:19:43.840 --> 00:19:51.960
So, Connor Fester, Fester, sorry, sent in this interesting article, which was done.

00:19:51.960 --> 00:19:53.540
Who was this done by?

00:19:53.540 --> 00:19:55.320
It was, one second.

00:19:55.320 --> 00:19:57.120
Cyborg Security.

00:19:57.320 --> 00:20:03.360
So, these guys wrote a pretty cool article about how Python malware is starting to show up.

00:20:03.360 --> 00:20:10.820
Now, you may have heard articles or mentions of certain package management stores getting infected with malware.

00:20:10.980 --> 00:20:14.520
Like we talked about some researchers putting some kind of malware onto PyPI.

00:20:14.520 --> 00:20:16.600
JavaScript had this atnpm.

00:20:16.600 --> 00:20:18.640
Ruby had this with their gem store.

00:20:18.640 --> 00:20:21.660
So, that's not what I'm talking about here.

00:20:21.660 --> 00:20:23.780
That's an issue, but that is not this.

00:20:23.780 --> 00:20:32.580
This is about what are people doing to create the runtime environment, just the viruses basically, with Python.

00:20:32.580 --> 00:20:36.660
So, traditionally, this has been like a C, C++ type of thing.

00:20:36.660 --> 00:20:40.200
But there's some interesting parallels just to go through here.

00:20:40.240 --> 00:20:46.380
I don't want to encourage anyone to do this, but I want to put it on people's radar to be aware that it could be being done, you know?

00:20:46.380 --> 00:20:52.680
So, for example, one of the challenges, if you build a C++ app, you can just send a binary around and run it.

00:20:52.680 --> 00:20:54.100
Not so easy with Python.

00:20:54.100 --> 00:20:57.320
The standard library has to be there, or CPython has to be there.

00:20:57.320 --> 00:21:05.740
But they talk about, well, people are using Py2exe and Py2app to package up their Python viruses and send them around.

00:21:05.740 --> 00:21:06.780
Isn't that weird?

00:21:06.780 --> 00:21:10.800
I mean, I guess people will do weird things.

00:21:10.800 --> 00:21:11.100
Yeah.

00:21:11.100 --> 00:21:19.100
So, there's an example of Python malware called C-Duke that was used against the Democratic National Committee back in 2015 and 16.

00:21:19.100 --> 00:21:25.700
There's other tools that might be just generally useful to people, regardless of whether it's in this context or not.

00:21:25.820 --> 00:21:27.680
Like, un-compile 6.

00:21:27.680 --> 00:21:33.060
This is the successor to decompile, un-compile, and un-compile 2.

00:21:33.060 --> 00:21:35.920
I don't know where 3, 4, 5 went.

00:21:35.920 --> 00:21:44.420
But un-compile 6 is a native Python cross version, a Python version, I guess, decompiler and fragment decompiler.

00:21:44.520 --> 00:21:48.120
So, what it'll let you do is it'll take Python bytecode and turn it back into source code.

00:21:48.120 --> 00:21:53.620
So, instead of taking a Python file and turning it into PYC, you take a PYC and turn it into a Python file.

00:21:53.620 --> 00:21:54.060
Interesting.

00:21:54.060 --> 00:21:54.400
Yeah.

00:21:54.400 --> 00:21:57.900
Some people have been shipping PYC files alone, right?

00:21:57.980 --> 00:22:06.000
And just knowing that those can literally be turned back into source code in, like, one line of commands should be something on your radar, right?

00:22:06.000 --> 00:22:08.740
Because it looks safe, but it's not that safe.

00:22:08.740 --> 00:22:13.120
There's also a PY installer extractor.

00:22:13.120 --> 00:22:24.400
So, if you were to ship a library or application as a PY installer thing, here you can turn it back into a bunch of source files you can open up and stuff.

00:22:25.020 --> 00:22:34.060
And then they also talk about, if you're given an executable, how to understand whether or not it was built with PY installer or if it was built to PY2XE or any of those tools.

00:22:34.060 --> 00:22:39.820
Like, given an arbitrary executable, is this a Python packaged up thing, yes or no?

00:22:39.820 --> 00:22:40.360
That's cool.

00:22:40.360 --> 00:22:41.260
These are great tools.

00:22:41.260 --> 00:22:43.340
The article looks really interesting.

00:22:43.340 --> 00:22:46.500
I never thought about malware in Python before.

00:22:46.500 --> 00:22:52.340
Yeah, there's a lot of interesting details and concrete examples of, here's how they did this with this one thing or that.

00:22:52.340 --> 00:22:54.200
And I think it's an interesting read.

00:22:54.360 --> 00:23:03.920
Again, not trying to encourage people to do these things, but just raise awareness, like, what the role of Python is in this, you know, less popularized space, right?

00:23:03.920 --> 00:23:05.880
People always want to hide what they're doing in this world.

00:23:05.880 --> 00:23:08.080
There's another application for some of these.

00:23:08.080 --> 00:23:20.180
Sometimes businesses have, they'll be afraid or, like, not want to pass around Python files because of the problems with, you know, knowing what the interpreter is or something.

00:23:20.500 --> 00:23:26.020
So they use PY2XE or something to make an executable for a tool for the company.

00:23:26.020 --> 00:23:34.260
And then somebody, and then that gets passed around and somebody loses the source or you don't know who has it or something.

00:23:34.420 --> 00:23:42.220
So using some of these reverse engineering techniques to get some source back, that'd be kind of cool to use for that purpose as well.

00:23:42.220 --> 00:23:43.560
I have an example of that.

00:23:43.560 --> 00:23:46.560
So one time there was this program we built.

00:23:47.460 --> 00:23:49.920
And this was early in my career.

00:23:49.920 --> 00:23:52.660
I must have been, like, not so good about checking in stuff.

00:23:52.660 --> 00:24:01.360
And somehow the thing that I was working on had a file that somehow didn't get added to, it was SVN at the time.

00:24:01.360 --> 00:24:05.620
So I had pushed all the changes, but I forgot to add this one file.

00:24:05.620 --> 00:24:07.060
And then my computer died.

00:24:07.260 --> 00:24:10.200
And the problem was, it was like my hard drive died.

00:24:10.200 --> 00:24:15.720
And so, like, there was some part of the application that in the middle of the app used this library.

00:24:15.720 --> 00:24:18.760
And then there was the rest of the app that was kind of below that.

00:24:18.760 --> 00:24:26.640
And so it was really hard to figure out how to rewrite just that middle piece because it was like a weird jigsaw puzzle that had to fit together.

00:24:26.640 --> 00:24:31.700
So I just went and disassembled the application, found the few files I needed.

00:24:31.700 --> 00:24:35.580
They were named weirdly, but I just renamed them in a way that worked.

00:24:35.580 --> 00:24:36.760
And then off it was.

00:24:36.840 --> 00:24:38.200
I checked it into Git and we were good to go.

00:24:38.200 --> 00:24:39.640
Or it was SVN and we were good to go.

00:24:39.640 --> 00:24:42.200
And you probably never forgot to check in your files again.

00:24:42.200 --> 00:24:44.820
No, I'm very obsessive about it now.

00:24:44.820 --> 00:24:45.260
That's right.

00:24:45.260 --> 00:24:46.480
Yeah.

00:24:46.480 --> 00:24:47.260
Yeah, absolutely.

00:24:47.260 --> 00:24:48.860
Anyway, that's all I got for this one.

00:24:48.860 --> 00:24:50.260
It's an interesting article, though.

00:24:50.260 --> 00:24:51.760
It's well done with some nice examples.

00:24:51.760 --> 00:24:52.160
Yeah.

00:24:52.160 --> 00:24:54.520
So I'm going to go on with, do you call it adders?

00:24:54.520 --> 00:24:55.580
I call it adders.

00:24:55.580 --> 00:24:56.120
Brian, what do you call it?

00:24:56.120 --> 00:24:56.940
Adders.

00:24:56.940 --> 00:24:57.480
Adders.

00:24:57.480 --> 00:24:57.520
Adders.

00:24:57.520 --> 00:24:59.640
That's really like American English.

00:24:59.640 --> 00:25:04.380
I would probably say adders, like often and not often.

00:25:04.380 --> 00:25:05.720
Okay.

00:25:05.900 --> 00:25:07.640
Anyway, so what is adders?

00:25:07.640 --> 00:25:13.740
It's so I only, I think I saw it a few times before, but I never actually looked into the

00:25:13.740 --> 00:25:14.220
package.

00:25:14.220 --> 00:25:19.560
But now a few weeks back, I've started using it for the first time.

00:25:19.560 --> 00:25:20.820
So what is adders?

00:25:20.820 --> 00:25:23.740
It's a Python package that simplifies writing classes.

00:25:23.740 --> 00:25:27.560
So it creates a lot of the dunder methods automatically.

00:25:27.560 --> 00:25:28.280
Yeah, that's cool.

00:25:28.360 --> 00:25:28.480
Yeah.

00:25:28.480 --> 00:25:32.340
And when I first saw it, I thought we have data classes.

00:25:32.340 --> 00:25:33.800
So why do we need adders?

00:25:33.800 --> 00:25:38.940
And only then I realized that adders is much older than data classes.

00:25:39.840 --> 00:25:45.620
So PEP 557 added data classes to Python 3.7.

00:25:45.620 --> 00:25:49.260
And they do resemble adders in many ways.

00:25:49.260 --> 00:25:56.760
So when I started reading a bit on the documentation page of adders, I found out that the PEP was actually

00:25:56.760 --> 00:25:58.120
inspired by adders.

00:25:58.120 --> 00:26:06.280
And it was the result of the wish of the community to have a simplified way to write classes without

00:26:06.280 --> 00:26:09.440
having to deal with the problems that name tuples have.

00:26:10.320 --> 00:26:17.240
And I think the main difference between adders and data classes is that data classes are strictly

00:26:17.240 --> 00:26:22.700
less powerful, and that certain features were sacrificed for the sake of simplicity.

00:26:22.700 --> 00:26:24.940
So it's very easy to use data classes.

00:26:24.940 --> 00:26:28.280
They are part of, I think, 3.7.

00:26:28.280 --> 00:26:30.400
With 3.7, they come automatically.

00:26:30.400 --> 00:26:32.920
But if you have 3.6, you have to pip install them.

00:26:32.920 --> 00:26:36.140
But you don't have to get a new package for them.

00:26:36.140 --> 00:26:40.180
And it's very easy to use them, especially if you have classes with many attributes.

00:26:40.840 --> 00:26:44.220
But with adders, you have quite a few additional features.

00:26:44.220 --> 00:26:50.800
For example, you have validators that you can use when you have your initializer in the class

00:26:50.800 --> 00:26:57.140
and you want to perform some kind of validation of the input arguments, like checking that they

00:26:57.140 --> 00:27:00.860
are an integer or some other type or more fancy stuff.

00:27:00.860 --> 00:27:04.460
Then you can do that very easily with adders.

00:27:04.460 --> 00:27:06.820
And it's a very powerful library.

00:27:07.080 --> 00:27:13.800
So I think I need a lot more weeks to really get into the details and all its possibilities.

00:27:13.800 --> 00:27:14.820
Yeah, this is a good one.

00:27:14.820 --> 00:27:19.960
There's a lot of subtleties around creating classes that can be a little bit annoying.

00:27:19.960 --> 00:27:25.480
Like, wouldn't it be great if you could have it print out something other than just the name of the class

00:27:25.480 --> 00:27:26.560
at some memory address?

00:27:26.560 --> 00:27:28.480
Automatically, that would be nice.

00:27:28.920 --> 00:27:35.160
If you create a dunder equal, dunder EQ method, well, you got to remember to create the not equals.

00:27:35.160 --> 00:27:37.180
That is the opposite of that.

00:27:37.180 --> 00:27:42.220
And oh, if you create equals, maybe you also have to implement hash as well.

00:27:42.220 --> 00:27:47.300
Because all of a sudden, if two things are equal, you put them in the dictionary, but then they're not the same thing.

00:27:47.300 --> 00:27:48.660
That's going to be all sorts of crazy.

00:27:48.660 --> 00:27:50.400
It just starts to cascade.

00:27:50.400 --> 00:27:53.120
You're like, wait a minute, doing this right, it's not so easy.

00:27:53.260 --> 00:27:55.440
And so I think that's kind of the zen of the adders.

00:27:55.440 --> 00:27:55.820
Yeah.

00:27:55.820 --> 00:28:02.400
I found it a bit confusing in the beginning with the syntax, how it looks like if you declare an attribute,

00:28:02.400 --> 00:28:11.760
like it's a decorator adders, but then for the attributes of the class, you have this, is it adders.s or something?

00:28:11.760 --> 00:28:20.120
And I found that a bit confusing in the beginning, since data classes are, I think, more beautiful when you write them

00:28:20.120 --> 00:28:22.280
and you don't need this extra bit.

00:28:22.280 --> 00:28:27.100
But once you get used to the syntax, it's very nice and easy to use.

00:28:27.100 --> 00:28:28.160
I have to agree.

00:28:28.160 --> 00:28:30.180
I like the data class syntax better.

00:28:30.180 --> 00:28:36.820
The dotness of the adders syntax is cute, but bugs me a little bit.

00:28:36.820 --> 00:28:42.260
Like attrib, the attributes are attr.ib.

00:28:42.260 --> 00:28:47.660
And it's not something I really enjoy, but it's not difficult either.

00:28:47.800 --> 00:28:53.140
The main switch for me, I think, is now that data classes are here, I use data classes all the time.

00:28:53.140 --> 00:29:00.540
But when I need a validator, the validation mechanism in adders is pretty darn cool.

00:29:00.860 --> 00:29:04.900
So if you want data validation, adders is still a great thing to pull up.

00:29:04.900 --> 00:29:05.380
I agree.

00:29:05.740 --> 00:29:17.660
I really wish that validators were in, or at least maybe we could have an extra package that we could pip install or something that would make data classes have validators, hopefully.

00:29:17.660 --> 00:29:22.640
I know there's other things that you can do to validate schemas and stuff like that.

00:29:22.640 --> 00:29:24.840
Yeah, I feel like there's a little bit of a paradox of choice.

00:29:24.840 --> 00:29:31.700
Like you look at all these things and you want all of the features that like kind of in this impossible combined way.

00:29:31.700 --> 00:29:33.060
So adders is cool.

00:29:33.060 --> 00:29:40.180
They've got things like you can say that these attributes can only be set as keyword arguments in the initializer and not as positional arguments.

00:29:40.180 --> 00:29:44.360
And just KW only equals true, stuff like that, which is pretty cool.

00:29:44.360 --> 00:29:51.740
And then you've got the Pydantic models, which have like built-in validation for all sorts of types, which is cool.

00:29:51.740 --> 00:29:52.780
You've got data classes.

00:29:52.780 --> 00:29:55.200
Those can be frozen, which is kind of nice.

00:29:55.200 --> 00:29:59.360
There's a lot of stuff going around here, and I feel like I'm underutilizing all of it.

00:29:59.360 --> 00:30:01.240
Well, grab what you need.

00:30:01.240 --> 00:30:01.740
It's good.

00:30:01.740 --> 00:30:02.080
Yeah.

00:30:02.080 --> 00:30:04.100
Throw some tests around it and switch later.

00:30:04.100 --> 00:30:09.440
For me, it's sometimes just easy to forget what's out there since there are so many nice packages.

00:30:09.440 --> 00:30:18.800
And I sometimes hear like I listen to a podcast and then I think, oh, that package sounds cool, but I don't have an application for it right away.

00:30:18.800 --> 00:30:20.780
So I forget about it again.

00:30:20.780 --> 00:30:23.320
And then in some context, I hear about it again.

00:30:23.320 --> 00:30:25.840
And I think, oh, yes, you always wanted to try that.

00:30:25.840 --> 00:30:30.060
But I think at least with adders now, like I will use it again quite a few times.

00:30:30.060 --> 00:30:31.240
Yeah, I have that same problem.

00:30:31.240 --> 00:30:34.740
I get excited about all these things, but I don't have a chance to use them.

00:30:34.740 --> 00:30:35.700
And then I forget.

00:30:35.700 --> 00:30:36.640
Then I'll rediscover.

00:30:36.640 --> 00:30:39.040
I'm like, oh, yes, that's why I thought it was cool in the first time.

00:30:39.040 --> 00:30:45.480
You should create a Harry Potter style project yourself for trying out all these things.

00:30:45.480 --> 00:30:45.960
That's right.

00:30:45.960 --> 00:30:49.380
Like awesome Harry Python, Harry Potter Python.

00:30:49.380 --> 00:30:52.440
I'm going to work on the naming.

00:30:52.440 --> 00:30:53.680
I like Harry Python.

00:30:53.680 --> 00:30:58.640
Well, it might invoke images that are not exactly the same what you're thinking.

00:30:58.640 --> 00:30:59.800
Oh, yeah.

00:30:59.800 --> 00:31:00.080
Okay.

00:31:00.080 --> 00:31:00.800
Never mind.

00:31:00.800 --> 00:31:01.080
Yeah.

00:31:01.080 --> 00:31:02.060
All right.

00:31:02.060 --> 00:31:03.540
Well, you guys got anything extra?

00:31:03.540 --> 00:31:04.080
I don't.

00:31:04.080 --> 00:31:04.360
Brian?

00:31:04.360 --> 00:31:05.520
No extras?

00:31:05.520 --> 00:31:06.060
No.

00:31:06.060 --> 00:31:06.420
No?

00:31:06.420 --> 00:31:06.960
How about you?

00:31:06.960 --> 00:31:10.660
Anna Lena, maybe take a moment and just tell folks like what you're up to.

00:31:10.660 --> 00:31:14.220
We didn't give you a really introduction on the kind of work and stuff you're doing.

00:31:14.220 --> 00:31:14.640
Yes.

00:31:14.640 --> 00:31:20.220
So I think the first time Michael and I talked on Talk Python To Me, I was still an AI resident

00:31:20.220 --> 00:31:22.240
at Microsoft Research in Cambridge.

00:31:22.240 --> 00:31:25.460
So I was doing a lot of machine learning research.

00:31:25.460 --> 00:31:25.460
So I was doing a lot of machine learning research.

00:31:25.460 --> 00:31:29.920
So working in the middle between a full researcher and a full software engineer.

00:31:29.920 --> 00:31:36.500
And now I'm a machine learning engineer here in Germany in a company called InnoVex, where

00:31:36.500 --> 00:31:42.880
I do like I apply machine learning to projects, proper real world problems, which is also very

00:31:42.880 --> 00:31:43.340
interesting.

00:31:43.340 --> 00:31:46.860
And I do all kinds of stuff now, data engineering.

00:31:46.860 --> 00:31:50.980
So yeah, I'm always learning new things every day, which is really nice.

00:31:50.980 --> 00:31:51.880
Yeah, that's very cool.

00:31:51.880 --> 00:31:52.480
All right.

00:31:52.480 --> 00:31:54.220
So I've got a couple of things really quick to share.

00:31:54.380 --> 00:32:01.720
I was on a cool podcast TV-like show called TechNado, which was a cool experience.

00:32:01.720 --> 00:32:05.040
It's a little bit like Python Bytes, but for the IT space.

00:32:05.040 --> 00:32:07.080
So that was a lot of fun to be on there.

00:32:07.080 --> 00:32:10.800
And on YouTube, you can check it out.

00:32:10.800 --> 00:32:16.840
And we played the game Python, Python, Python, where we would get partial words out of a headline.

00:32:16.840 --> 00:32:21.360
And we'd have to decide, is it Python the snake, Monty Python, or Python the programming

00:32:21.360 --> 00:32:22.740
language that the article is about?

00:32:22.800 --> 00:32:23.340
That was pretty fun.

00:32:23.340 --> 00:32:25.620
So you could check that out over there if you're interested.

00:32:25.620 --> 00:32:26.760
Sorry.

00:32:26.760 --> 00:32:27.980
So did you win?

00:32:27.980 --> 00:32:29.460
I completely got crushed.

00:32:29.460 --> 00:32:32.820
I think I got last because I wanted everything to be about Monty Python.

00:32:32.820 --> 00:32:34.400
And they're like, no, that's about a snake.

00:32:34.400 --> 00:32:35.140
I'm like, oh, come on.

00:32:35.140 --> 00:32:37.960
That would have been so funny if that was about Monty Python.

00:32:37.960 --> 00:32:38.580
But no.

00:32:38.580 --> 00:32:39.960
Yeah.

00:32:39.960 --> 00:32:43.020
I let my hopes and dreams get ahead of me.

00:32:43.020 --> 00:32:44.300
Maybe next time.

00:32:44.300 --> 00:32:45.360
Exactly.

00:32:45.360 --> 00:32:47.740
I'll come back for the championship later.

00:32:47.740 --> 00:32:49.740
Brian, what do you think about this joke?

00:32:49.740 --> 00:32:51.080
I haven't looked at it.

00:32:51.080 --> 00:32:51.760
Oh, perfect.

00:32:51.760 --> 00:32:52.760
Then you got to open it up.

00:32:52.760 --> 00:32:58.020
Anna Lena is, well, this one is, as per usual for us, a visual joke in an audio format.

00:32:58.020 --> 00:32:59.140
But I think it's going to work great.

00:32:59.140 --> 00:33:03.820
So this one is called the only valid measurement of code quality.

00:33:04.380 --> 00:33:09.340
And I know, Brian, you're very passionate about high quality code and testing and stuff like that.

00:33:09.340 --> 00:33:12.500
Have you seen this metric built into any of the software you used?

00:33:12.500 --> 00:33:14.500
Well, you can't.

00:33:17.220 --> 00:33:19.440
Maybe with some voice recognition and some AI.

00:33:19.440 --> 00:33:22.800
Anna Lena could put something together for us, like starting the code review now.

00:33:22.800 --> 00:33:23.140
Yeah.

00:33:24.100 --> 00:33:24.720
It looks so funny.

00:33:24.720 --> 00:33:25.160
It looks so funny.

00:33:25.160 --> 00:33:25.780
I love that.

00:33:25.780 --> 00:33:26.140
Yeah.

00:33:26.140 --> 00:33:30.820
So this is the only valid measurement of code quality is WTFs per minute.

00:33:30.820 --> 00:33:35.020
I'll try to keep this without the explicit tag, but WTF.

00:33:35.020 --> 00:33:37.260
So there's a comparison here.

00:33:37.520 --> 00:33:43.440
On one hand, we've got the good code review, which is still, it's like a door that's closed.

00:33:43.440 --> 00:33:46.380
And you can just see like statements of what people's going on.

00:33:46.380 --> 00:33:47.020
It's going on the side.

00:33:47.020 --> 00:33:49.160
You hear this, WTF, WTF.

00:33:49.160 --> 00:33:50.360
What is this?

00:33:50.360 --> 00:33:51.420
That's the good code.

00:33:51.420 --> 00:33:53.900
The bad code is just full of them.

00:33:53.900 --> 00:33:54.640
It's like WTF.

00:33:54.640 --> 00:33:56.920
What the WTF is this?

00:33:56.920 --> 00:33:58.260
A dude, WTF.

00:33:58.260 --> 00:33:59.480
WTF.

00:34:00.040 --> 00:34:02.780
I think this really captures code review pretty well.

00:34:02.780 --> 00:34:03.320
It does.

00:34:03.320 --> 00:34:08.780
Anyway, the only valid of measurement of code quality, WTFs per minute.

00:34:08.780 --> 00:34:09.640
WTFs per minute.

00:34:09.640 --> 00:34:09.980
Definitely.

00:34:09.980 --> 00:34:10.700
All right.

00:34:10.700 --> 00:34:13.240
Well, that wraps it up for this week.

00:34:13.240 --> 00:34:13.660
All right.

00:34:13.660 --> 00:34:14.040
Thanks, Brian.

00:34:14.040 --> 00:34:15.360
Thanks, Elena, for being here.

00:34:15.360 --> 00:34:15.640
Thanks.

00:34:15.640 --> 00:34:16.600
It was a lot of fun.

00:34:16.600 --> 00:34:16.960
Yeah.

00:34:16.960 --> 00:34:17.300
You bet.

00:34:17.300 --> 00:34:17.600
Bye-bye.

00:34:17.600 --> 00:34:17.880
Bye.

00:34:17.880 --> 00:34:19.800
Thank you for listening to Python Bytes.

00:34:19.800 --> 00:34:22.260
Follow the show on Twitter at Python Bytes.

00:34:22.260 --> 00:34:25.300
That's Python Bytes, as in B-Y-T-E-S.

00:34:25.300 --> 00:34:28.200
And get the full show notes at Pythonbytes.fm.

00:34:28.440 --> 00:34:33.260
If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.

00:34:33.260 --> 00:34:35.300
We're always on the lookout for sharing something cool.

00:34:35.300 --> 00:34:39.500
This is Brian Okken, and on behalf of myself and Michael Kennedy, thank you for listening

00:34:39.500 --> 00:34:41.740
and sharing this podcast with your friends and colleagues.

