WEBVTT

00:00:00.020 --> 00:00:04.500
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:04.920 --> 00:00:08.960
This is episode 443, recorded August 4th, 2025.

00:00:09.700 --> 00:00:10.540
And I'm Brian Okken.

00:00:10.760 --> 00:00:11.420
And I'm Michael Kennedy.

00:00:11.860 --> 00:00:17.280
And you can reach us on the socials on Bluesky or Mastodon.

00:00:17.740 --> 00:00:23.040
Check out the show notes or the website, pythonbytes.fm, to find all those links.

00:00:23.460 --> 00:00:29.680
And if you'd like to watch us live, you can check out pythonbytes.fm/live.

00:00:30.060 --> 00:00:32.920
and it's usually Mondays at 10 a.m. Pacific time.

00:00:33.360 --> 00:00:38.720
But you can go there for all the older, to link to the YouTube channel to get all the older episodes as well.

00:00:39.719 --> 00:00:48.040
And this episode is sponsored by you guys, by the offerings that both Michael and I have.

00:00:48.420 --> 00:00:53.920
And you're supporting us through that really helps us going to getting courses, buying books.

00:00:54.520 --> 00:00:55.180
That's pretty much it.

00:00:55.440 --> 00:00:56.140
Also Patreon.

00:00:56.480 --> 00:00:57.400
So thanks Patreon people.

00:00:57.700 --> 00:00:58.280
Let's kick it off.

00:00:58.540 --> 00:00:58.960
What you got, Michael?

00:00:59.040 --> 00:01:04.199
I have something sent in from Owen Lamont.

00:01:04.280 --> 00:01:06.020
And so, Owen, thank you for sending this in.

00:01:06.880 --> 00:01:15.520
I believe we've talked about Markdown formatting stuff before, but I want to look at this one because it's got some rough vibes.

00:01:15.960 --> 00:01:18.580
R-U-F-F, not R-O-U-G-H.

00:01:19.580 --> 00:01:25.300
Rough vibes in that it's a formatter written in Rust, seems insanely fast.

00:01:25.780 --> 00:01:33.480
And even though it's a general purpose thing and it's written in Rust, it has special love for the Python people.

00:01:33.820 --> 00:01:39.540
So there's a PyPI wrapper, basically a wheel that wraps up the commands going to it.

00:01:39.760 --> 00:01:45.260
So you can pip install it, uv pip install it, more importantly, uv tool install.

00:01:45.600 --> 00:01:49.740
It also has a pre-commit hook and pyproject.toml support.

00:01:50.020 --> 00:01:50.520
Pretty neat, right?

00:01:50.520 --> 00:01:51.000
Very cool, yeah.

00:01:51.380 --> 00:01:53.420
I just ran it on a project I'm working on.

00:01:53.580 --> 00:01:55.240
And apparently, what did it say?

00:01:55.310 --> 00:01:55.900
How many errors?

00:01:56.420 --> 00:02:03.140
14, 14 errors I found in my, and it will fix them in the similar way if you do a --fix, I believe.

00:02:03.600 --> 00:02:04.480
So that's pretty cool.

00:02:04.640 --> 00:02:07.380
High performance markdown formatter.

00:02:07.780 --> 00:02:12.520
So you can install it in lots of ways, but I would just uv tool install it.

00:02:12.780 --> 00:02:16.960
It has 54 linting rules, which are apparently common markdown issues.

00:02:18.100 --> 00:02:23.140
Like if I have a heading, there should be a line break between the heading and the content of that section.

00:02:23.500 --> 00:02:26.480
You can fix most of them with --fix, like I said, which is beautiful.

00:02:27.060 --> 00:02:28.380
No dependencies, single binary.

00:02:29.140 --> 00:02:37.580
Highly configurable, which is great because a lot of the warnings I get when I run it are this line length of 102 exceeds the 80 character limit.

00:02:37.910 --> 00:02:44.540
I don't know, like when do people, when do we move on from the 80 character limit in like things, Python and other?

00:02:45.180 --> 00:02:47.820
I have a 4K monitor, 32 inch 4K monitor.

00:02:47.900 --> 00:02:54.720
If I put stuff in 32 or 80 columns, it's like on the left and the 80 columns is like, well, that's the default size of a terminal.

00:02:54.860 --> 00:02:57.420
Like, okay, is that where most of our markdown is done?

00:02:57.800 --> 00:02:59.640
Probably not, but I don't know.

00:03:00.760 --> 00:03:02.320
I'd say make it long and let it wrap.

00:03:02.520 --> 00:03:07.400
The reason I don't like that rule, particularly for markdown is I use type-ora, which I love.

00:03:07.720 --> 00:03:13.640
But type-ora, it keeps a little more of the formatting visually there.

00:03:13.700 --> 00:03:22.020
So even if I was to like do the markdown and render it to a webpage or to a PDF, the line breaks would disappear 'cause you have to have two line breaks, right?

00:03:22.020 --> 00:03:22.860
Like a blank line.

00:03:23.100 --> 00:03:25.140
But in Typeora, while you're editing it, you see them.

00:03:25.580 --> 00:03:27.180
And so you would see like chunks.

00:03:27.560 --> 00:03:30.820
So if I make my editor wider, it like stops going.

00:03:31.540 --> 00:03:39.120
If I make it skinnier though, then it like has like weird half line breaks because it's wrapping the 80 lines to like 60 and then there's 20 more.

00:03:39.340 --> 00:03:41.620
And like, it's just, I hate that rule.

00:03:42.020 --> 00:03:43.660
So why am I ranting so much?

00:03:44.020 --> 00:03:45.220
Well, because I rant apparently.

00:03:45.780 --> 00:03:47.520
But it's also super configurable.

00:03:47.620 --> 00:03:50.460
So you can go to a Tommel file down here.

00:03:51.100 --> 00:03:54.860
And once you find it in here, it has a bunch of examples.

00:03:55.310 --> 00:03:56.900
I think up at the top here, there.

00:03:57.800 --> 00:03:59.780
And you can go in here and it gives you examples.

00:04:00.040 --> 00:04:02.900
Like I can say disable rule MD013.

00:04:03.110 --> 00:04:05.060
Or in my case, yes, that's the one.

00:04:06.060 --> 00:04:06.780
Of course it's 13.

00:04:07.030 --> 00:04:07.500
It's unlucky.

00:04:07.750 --> 00:04:09.120
But you can also configure the rules.

00:04:09.300 --> 00:04:11.700
Like say rule seven is about indentation.

00:04:12.090 --> 00:04:15.040
How many characters, how many spaces do you want to indent by?

00:04:15.520 --> 00:04:16.859
Or different things, right?

00:04:17.060 --> 00:04:24.060
Don't apply the line length considerations to code blocks or tables, but override the line length to be 100.

00:04:24.460 --> 00:04:25.240
Again, I'm turning that off.

00:04:25.360 --> 00:04:27.980
But still, I guess I could set it to infinity.

00:04:29.200 --> 00:04:29.940
That would be fine.

00:04:30.580 --> 00:04:31.420
But isn't this cool?

00:04:31.700 --> 00:04:32.600
Yeah, it is really cool.

00:04:33.220 --> 00:04:36.200
I want to jump on the line length bandwagon a little bit here, though.

00:04:36.320 --> 00:04:36.700
Let's do it.

00:04:38.020 --> 00:04:38.820
I agree.

00:04:39.040 --> 00:04:40.200
I'm glad this is configurable.

00:04:40.540 --> 00:04:46.340
Because in writing a book or something or a tutorial, I'm going to have long paragraphs.

00:04:46.860 --> 00:04:51.200
And I'd rather have those just wrap, and I don't want to limit my line length.

00:04:51.240 --> 00:04:54.160
So I would turn that off if I'm writing long form stuff.

00:04:54.480 --> 00:04:57.300
Yeah, I'm thinking my blog posts and things like that, right?

00:04:57.360 --> 00:04:58.020
Which are all marked down.

00:04:58.180 --> 00:05:10.580
But for the markdown in a project, even if it's a documentation project in maybe, I guess, I can see it for readmes or something or things that are changing a lot because you're doing diffs more.

00:05:11.040 --> 00:05:14.780
You do have to be aware of the diffs.

00:05:14.960 --> 00:05:18.320
But I think diff tools deal with word wrap fine now.

00:05:18.660 --> 00:05:19.900
So anyway, I don't know.

00:05:20.020 --> 00:05:20.980
Yeah, that's a fair issue.

00:05:21.260 --> 00:05:21.520
Fair point.

00:05:22.300 --> 00:05:25.200
But if you got long form writing, it doesn't make sense.

00:05:25.540 --> 00:05:26.580
Yeah, it doesn't make sense at all.

00:05:26.860 --> 00:05:27.680
Yeah, that's weird.

00:05:27.760 --> 00:05:30.040
It's not like in Word or Google Docs.

00:05:30.160 --> 00:05:31.460
Like, where do you want to break your lines?

00:05:31.560 --> 00:05:33.420
Like, no, I want it to just go across the page.

00:05:33.520 --> 00:05:34.480
Can we just let me write?

00:05:35.180 --> 00:05:35.380
Yeah.

00:05:36.280 --> 00:05:36.400
All right.

00:05:36.780 --> 00:05:37.620
But it's super cool.

00:05:37.880 --> 00:05:40.260
You can, like I said, uv tool install it.

00:05:40.420 --> 00:05:42.000
It even has instructions for uv.

00:05:42.480 --> 00:05:44.600
Or you can use uvtool run.

00:05:45.040 --> 00:05:48.640
And so you could run it without even actually installing it just to test out how it might go.

00:05:48.920 --> 00:05:49.120
Yeah.

00:05:49.450 --> 00:05:53.700
So what's the big, do you know what the biggest mistake is you usually make for Markdown?

00:05:54.140 --> 00:05:56.200
I haven't done enough messing with it yet,

00:05:56.400 --> 00:05:58.000
but I can report back to you.

00:05:58.260 --> 00:05:58.400
Okay.

00:05:59.080 --> 00:06:08.320
Mine, I haven't even used the tool yet, but I'm looking forward to trying it because the thing that always trips me up is a space before unordered list.

00:06:08.740 --> 00:06:16.760
So if you write a sentence with a colon and then you do a new line, and then you start like, you know, do the asterisks or dash or something like that and start a list.

00:06:17.740 --> 00:06:27.080
Some tools will automatically understand that you intended it to be a list, and some of them don't, and you just get a bunch of asterisks in a paragraph.

00:06:27.780 --> 00:06:30.360
So, yeah, I need something to fix that for me.

00:06:30.520 --> 00:06:30.800
Definitely.

00:06:32.200 --> 00:06:32.520
All right.

00:06:33.420 --> 00:06:34.520
On to the next topic.

00:06:35.560 --> 00:06:44.920
We are, I want to talk about coverage because Ned Batchelder released, This is a blog post from the end of July, July 24th.

00:06:45.160 --> 00:06:47.960
Coverage 7.10.0 with patch.

00:06:48.360 --> 00:06:54.220
So we're actually up to 7.10.2 now, but it's the patch that's like the super cool news.

00:06:55.240 --> 00:06:59.920
And I just read about this, and I am like really excited about it.

00:07:00.360 --> 00:07:03.460
So one of the things, it adds three things.

00:07:03.640 --> 00:07:14.280
So if we go to the changelog, It's adding patch subprocess, patch execv, and patch exit or underscore exit or something.

00:07:14.780 --> 00:07:17.480
And I'll do the weird ones first.

00:07:17.770 --> 00:07:19.900
I don't really see execv around.

00:07:20.460 --> 00:07:32.480
But the issue with execv and exit is that that's a way, like something happens and your stuff gets torn down before coverage has a chance to write its stuff.

00:07:32.570 --> 00:07:34.100
It just like processes stop.

00:07:34.940 --> 00:07:36.580
And that's not cool.

00:07:36.660 --> 00:07:39.220
But with this, you can fix that.

00:07:39.600 --> 00:07:41.620
And there have been workarounds for these other things.

00:07:42.540 --> 00:07:44.460
And so that's not really the big news.

00:07:44.560 --> 00:07:45.900
The big news, I think, is subprocess.

00:07:46.440 --> 00:07:57.340
Because there were ways to, if you're trying to run coverage on a project that has subprocesses, you have to have some way to cover all of those processes and then combine them later.

00:07:57.780 --> 00:08:00.180
And there were ways to deal with it, but it was a little clunky.

00:08:00.640 --> 00:08:04.520
Now, we've got a way to do it built in.

00:08:04.680 --> 00:08:08.220
You just say patch equals subprocess and coverage does it for you.

00:08:09.000 --> 00:08:09.680
How cool is that?

00:08:09.940 --> 00:08:10.940
And multiprocessing.

00:08:11.120 --> 00:08:13.640
It'll count multiprocessing execution for coverage.

00:08:14.780 --> 00:08:15.520
That's, yes.

00:08:15.860 --> 00:08:16.940
Thank you, thank you, thank you, Ned.

00:08:17.840 --> 00:08:19.380
So I'm really excited about this.

00:08:19.550 --> 00:08:20.020
It's pretty cool.

00:08:20.540 --> 00:08:21.600
Anyway, that's it, really.

00:08:22.220 --> 00:08:22.380
Awesome.

00:08:22.530 --> 00:08:23.880
Yeah, it's a really good one.

00:08:24.140 --> 00:08:24.620
Short and sweet.

00:08:25.540 --> 00:08:28.400
This one comes to us from Pat Decker, I believe.

00:08:28.780 --> 00:08:31.460
I hope I'm remembering that right because I forgot to write it down.

00:08:31.680 --> 00:08:32.820
So someone else sent it in.

00:08:33.000 --> 00:08:33.360
I apologize.

00:08:33.620 --> 00:08:37.820
I'm pretty sure it's Pat sent this over and it's AIO Bodo 3.

00:08:38.479 --> 00:08:47.100
So Bodo 3 is the Python package to talk to things like S3 and other stuff in Amazon.

00:08:47.580 --> 00:08:47.760
Okay.

00:08:47.760 --> 00:08:48.120
And AWS.

00:08:48.720 --> 00:08:49.660
Don't get me started on Bodo 3.

00:08:50.040 --> 00:08:52.840
It's a bit of a insane package the way it's created.

00:08:53.340 --> 00:09:04.220
But what I want to talk about is AIO Boto3, which is a wrapper on top of Boto3 resources that leverages the AIO Boto core async backend.

00:09:04.500 --> 00:09:06.080
So what's going on from here?

00:09:06.260 --> 00:09:20.140
It's a package by Terry Kane, and she created, I think, to basically make higher level operations, which you would use from the Boto3 level instead of the Boto core, which is more low level detailed interaction with AWS.

00:09:20.200 --> 00:10:06.460
us. But there was an async low-level one, but not an async high-level one. And so now there's an async high-level one. So for example, do you want to work with S3 contents asynchronously? Well, here you go. So you can do things like create a session and then say async with, go to a resource for S3, then await getting a bucket, and then loop over asynchronously with an async for across all the items in that bucket. So if you want to do a bunch of S3 type of work or DynamoDB or Kinesis, whatever, then you want to do that asynchronously. Well, here you go. Also, she has an example of working with a DynamoDB table and reading and writing objects into it, which is pretty sweet.

00:10:07.080 --> 00:10:13.660
What's Kinesis? What is Kinesis? Good question. Is that an AWS thing? Yeah, looking that up.

00:10:13.760 --> 00:10:15.540
this. That's not how you spell it, but

00:10:15.860 --> 00:10:17.540
luckily. I just thought it was keyboard.

00:10:17.600 --> 00:10:23.700
It's a family of services provided by AWS for processing and analyzing real-time streaming data at a large scale.

00:10:23.760 --> 00:10:26.300
I'm glad you asked, because this is what I've been working for a long time around.

00:10:27.800 --> 00:10:28.880
Okay. Sorry. No.

00:10:29.700 --> 00:10:33.360
Apparently, like, data streaming, data lake, data processing, analytics.

00:10:33.570 --> 00:10:35.500
Okay. Got it. Cool. That's it.

00:10:35.520 --> 00:10:40.860
That's all I got to say about it, but if you're basically if you're using Boto3 and you want to do async, AIO Boto3.

00:10:41.520 --> 00:10:46.680
Alright. Well, I Sorry for the distraction, but I wanted to...

00:10:46.680 --> 00:10:48.280
Anyway, I have a Kinesis keyboard.

00:10:48.580 --> 00:10:49.260
That's why I'm like, what?

00:10:49.780 --> 00:10:50.620
Yes, you do, don't you?

00:10:51.920 --> 00:10:52.800
Tell people what it like.

00:10:52.960 --> 00:10:54.880
Here, put one up on the screen.

00:10:56.040 --> 00:10:57.480
Yeah, I was trying to look for one.

00:10:57.780 --> 00:10:59.100
Kinesis keyboard images.

00:10:59.660 --> 00:11:00.180
Oh, here we go.

00:11:00.720 --> 00:11:02.080
Did you find one?

00:11:02.440 --> 00:11:02.520
No.

00:11:02.640 --> 00:11:02.780
No.

00:11:03.940 --> 00:11:04.220
There we go.

00:11:04.260 --> 00:11:04.680
They are wild.

00:11:04.800 --> 00:11:05.600
I had one for a while.

00:11:05.660 --> 00:11:07.080
I'm like, I'm not sure I can do this.

00:11:07.680 --> 00:11:08.360
Oh, I love it.

00:11:08.560 --> 00:11:10.800
So I just did the image search.

00:11:11.320 --> 00:11:17.840
um yeah they're split like this uh and it's in there and also your your keys are in little

00:11:18.240 --> 00:11:37.240
little divots yeah like maybe if i could describe it for people ryan like imagine you took an orange you cut the orange in half you took out the orange fleshy bit and you lined the inside of the orange peel with keys that's what typing on is like you type into like these round holes okay but i would

00:11:37.220 --> 00:11:47.640
say like coconuts maybe because it's bigger but we're like a coconut where you just work with like the lower third and the top third yeah but one of the things that's cool about these is they're in

00:11:47.720 --> 00:11:52.440
uh do you remember the men in black movie oh yeah yeah they're well i did till they flashed me but

00:11:52.520 --> 00:11:59.740
you know well the men in black movie had um if you the office scene in the first first uh one

00:12:00.140 --> 00:12:07.180
um everybody's weren't using kinesis it's pretty cool were they okay how awesome all right um i i'm

00:12:07.200 --> 00:12:11.240
I wasn't going to talk about keyboards, but what am I talking about?

00:12:11.460 --> 00:12:14.600
I'm going to talk about You Might Not Need a Python Class by Adam Grant.

00:12:15.120 --> 00:12:30.060
So I think we've probably talked about this before, but it's worth reminding people because there's a lot of people that come in to Python from other languages and classes are used a lot in other languages and you don't really have to use them here so much.

00:12:30.300 --> 00:12:32.640
So I'm just going to run through some of the options.

00:12:32.920 --> 00:12:38.820
One is for simple data containers, think about named tuples, which are great, or data classes.

00:12:39.700 --> 00:12:43.620
Actually, probably data class first, and then if it's not quite right, named tuple.

00:12:44.020 --> 00:12:48.280
But here's an example of somebody doing a custom class with point.

00:12:48.350 --> 00:12:52.420
And also, the intending is wrong here, Adam, but oh well.

00:12:53.339 --> 00:12:58.060
Anyway, examples of how to use that with a named tuple or just a data class.

00:12:58.350 --> 00:13:00.220
So it works pretty good.

00:13:00.220 --> 00:13:01.840
You don't usually have to create your own classes.

00:13:02.360 --> 00:13:04.080
- All right, I don't really see that.

00:13:04.360 --> 00:13:12.140
- Also, if you're creating a class with a static variable, there's a really good chance that should just be a module level variable.

00:13:12.360 --> 00:13:17.400
Like modules themselves often can behave in the same way that people do classes.

00:13:17.420 --> 00:13:20.120
Like I wanna group the functions together and have some shared data.

00:13:20.660 --> 00:13:21.240
- That's a module.

00:13:21.660 --> 00:13:22.880
- Exactly, exactly.

00:13:23.440 --> 00:14:25.500
- Yeah, so that's one thing that's not in this, but one of the things I've taught people for a long time is if you think you need a singleton pattern in python it's just a module just do a module 100 and there isn't any really and if you're afraid of global data in python it's not really global it's just global to the yes it's accessible to anything but it's just module global it's not a big not a big deal anyway uh examples with points uh but there's some surprising stuff in here uh stateless utility functions just use functions and here's a yeah this is somebody that must have came from if you if you if everything's just that like you said if everything's a static method then it doesn't need to be there just make it a function um grouping constants also use modules um well there's also enums that you can do but uh but anyway um yeah if you're just having some constants and you're trying to group them together just put them in a module um for some reason this freaks people out sometimes and i think it's just the people that are new to python but yeah i think

00:14:25.620 --> 00:14:29.460
I mean, I came from C-sharp, which had a lot of class, very much.

00:14:29.530 --> 00:14:31.800
Like, everything had to be in a class at the time when I was doing it.

00:14:31.850 --> 00:14:32.900
Like, literally everything.

00:14:33.300 --> 00:14:36.000
So I was very much in that space, but I've moved on.

00:14:36.120 --> 00:14:38.860
Also, on the constants, I agree.

00:14:39.360 --> 00:14:42.400
But maybe throw in a typing final of type.

00:14:42.550 --> 00:14:44.080
So they've got, like, a host and a port.

00:14:44.220 --> 00:14:48.080
You could have a typing.final bracket str and a typing.final bracket int.

00:14:48.320 --> 00:14:48.840
Oh, yeah.

00:14:49.220 --> 00:14:52.460
Yeah, so then at least the editors and stuff go, yeah, like, don't edit this.

00:14:52.760 --> 00:14:53.560
Don't edit it, yeah.

00:14:53.760 --> 00:14:57.540
unless you're meant to but the way they say the word constant that probably means not so much

00:14:57.720 --> 00:15:02.220
changing yeah but also having it in a class and it stopped people from changing it either

00:15:02.770 --> 00:15:08.320
no at least you get a warning yeah tells you you're bad if you want to be bad uh managing state with

00:15:08.490 --> 00:16:37.420
uh simple structures use dictionaries or lists definitely um what the a lot of this the gist is python is a lot of built-in stuff that you can just you know learn how to use dictionaries and lists well. It'll take care of a lot of stuff. This one is surprising to me. Simple one-off operations. Use lambdas or comprehensions. I mean, sure, the example works for a lambda and comprehension, but also you could just use a function. If you're going to grab a lambda, you could just write a function. Yeah, lambdas are great. Avoiding complexity. Use built-in libraries. Don't reinvent the wheel. There's probably something that is an example with config parser or json they usually they they can do a lot um yeah uh and then this is this is i'm glad we tie into your first uh first topic when you actually need a class well there's a bulleted list but they didn't do a new line so it i'm pretty sure it was a markdown that didn't get converted correctly so um yeah anyway uh and i'd like to add what are my additions if you think you need a class, you probably don't. If you really do think you do ask a friend because friends don't let friends create extraneous classes in Python. And then if you think you're the exception, it probably isn't an exception. But, and then finally, I'd like to say, if you, if you think you need data classes, but data classes aren't quite cutting it for you, check out attrs. Adders

00:16:37.420 --> 00:16:47.860
is still around and attrs is awesome. So yeah. Or pydantic. Yeah. Or pydantic. Yeah. When the when you actually need a class yeah i'm i agree with this i like it yeah well so what did

00:16:47.860 --> 00:17:08.500
he say he said um uh you if you need to encapsulate state or behavior yes but also uh you can use a data class or a module yeah um you if your objects have clear behavior method behavior slash methods associated with their data and you're modeling complex hierarchical stretch structures yeah i'm

00:17:08.520 --> 00:17:09.240
I'm thinking the middle one.

00:17:09.339 --> 00:17:18.760
If you have data that is tied to an instance of the class, you need to have multiple ones of those and the methods operate on that particular data.

00:17:19.240 --> 00:17:20.680
I mean, that's when you need it, right?

00:17:20.800 --> 00:17:23.680
Not for all the other jumps and hoops people used to use it for.

00:17:23.920 --> 00:17:34.160
And as far as inheritance hierarchies go, since I've been using Python, I have multiple times created class hierarchies and then regretted it.

00:17:34.480 --> 00:17:40.120
I don't think I have any that were legitimate reasons to use a class hierarchy.

00:17:40.980 --> 00:17:56.280
But also, after using Python so much, I don't create class hierarchies in C++ much anymore either because I like using containment instead of inheritance, I think is a cleaner model.

00:17:56.580 --> 00:17:57.360
So anyway.

00:17:57.640 --> 00:18:00.020
Yeah, composition over inheritance indeed.

00:18:00.580 --> 00:18:00.940
That's it.

00:18:01.020 --> 00:18:01.700
It's a long way.

00:18:02.000 --> 00:18:02.280
All right.

00:18:02.640 --> 00:18:03.440
Those are our topics.

00:18:03.980 --> 00:18:05.400
Do you have any extras?

00:18:06.600 --> 00:18:08.020
I have at least one extra.

00:18:08.320 --> 00:18:09.380
Let's see what I can do about that.

00:18:10.120 --> 00:18:18.540
So this Thursday, as in three days from now, eight o'clock Pacific time, I will be doing a live webcast

00:18:19.200 --> 00:18:21.280
with Will Vincent from PyCharm.

00:18:21.600 --> 00:18:26.820
Yeah, so we're talking about basically uv, what is uv, all the way that you can apply to your projects.

00:18:27.300 --> 00:18:28.260
Should be a lot of fun.

00:18:28.520 --> 00:18:29.620
I'm really looking forward to it.

00:18:29.930 --> 00:18:31.440
I wasn't entirely sure what we were going to cover.

00:18:31.880 --> 00:18:33.000
Will and I talked about it today.

00:18:33.220 --> 00:18:34.100
I have a bunch of great ideas.

00:18:34.400 --> 00:18:34.600
Cool.

00:18:34.900 --> 00:18:40.720
So if you want to see uv in action, we talked about that post from Armin Roeneker, I don't know, a few months ago or whatever.

00:18:41.240 --> 00:18:42.520
Why are you not using UV?

00:18:43.120 --> 00:18:44.100
If you're not, why?

00:18:44.440 --> 00:18:45.320
A lot of people are like, what's UV?

00:18:45.620 --> 00:18:47.780
Or it's too hard to move from, or it doesn't, whatever.

00:18:48.180 --> 00:18:50.240
We'll kind of address all that kind of stuff.

00:18:50.500 --> 00:18:54.760
Plus, maybe some fun Docker things, some performance things, all over the place.

00:18:55.180 --> 00:18:55.380
Awesome.

00:18:56.040 --> 00:18:56.100
Yep.

00:18:56.360 --> 00:18:58.120
I have a couple extras.

00:18:58.980 --> 00:18:59.440
All right.

00:18:59.920 --> 00:19:04.940
So first off, this was sent to us by listener John Hagan.

00:19:06.230 --> 00:19:10.400
The PyPI blog has an incident report about a phishing attack.

00:19:10.840 --> 00:19:14.840
So apparently there was some targeted phishing emails.

00:19:16.360 --> 00:19:29.940
There were some, and I didn't read this that closely, but it's creepy because it was a phishing attack that involved a fake PyPI that had like a phishing domain that was in the middle.

00:19:30.280 --> 00:19:39.080
So if somebody clicked on the link, it all behaved just like PyPI, but there was somebody in the middle capturing stuff.

00:19:40.160 --> 00:19:41.220
That's really creepy.

00:19:42.100 --> 00:19:42.460
What was it?

00:19:42.460 --> 00:19:48.120
It involved, and it involved like the fact that in some fonts, INJ look identical.

00:19:49.260 --> 00:19:52.840
So it was a pypj.org domain.

00:19:54.120 --> 00:19:54.440
Yikes.

00:19:54.840 --> 00:19:57.440
Anyway, I just wanted to have people aware of that.

00:19:57.660 --> 00:20:01.160
It was apparently found and fixed relatively quickly.

00:20:01.580 --> 00:20:06.200
There were, I guess, four user accounts successfully phished.

00:20:07.160 --> 00:20:08.620
They're either disabled.

00:20:08.940 --> 00:20:12.820
So there's some recommendations, takeaways, calls to action.

00:20:13.420 --> 00:20:18.660
If you have a dormant PyPI account, so if you have a PyPI account you're not really using, consider removing it.

00:20:19.160 --> 00:20:21.780
You can always create another one if you need to later.

00:20:22.140 --> 00:20:28.060
If you have an older PyPI account and you're not using 2FA yet, please sign up for that.

00:20:28.290 --> 00:20:31.060
Even if you only pop in once a year, make it more secure.

00:20:31.390 --> 00:20:31.720
Be good.

00:20:33.000 --> 00:20:38.280
And use web often via browser hardware security or hardware security keys.

00:20:38.760 --> 00:20:39.020
Wow.

00:20:39.330 --> 00:20:39.860
I don't even know.

00:20:40.280 --> 00:20:41.600
Is that just web authentication?

00:20:41.950 --> 00:20:42.320
I don't know.

00:20:42.540 --> 00:20:43.220
I don't know what this is.

00:20:43.280 --> 00:20:45.540
I think it's like YubiKey type stuff.

00:20:45.900 --> 00:20:46.100
Okay.

00:20:46.400 --> 00:20:46.940
I don't do it though.

00:20:47.060 --> 00:20:47.820
So I don't know that well.

00:20:48.400 --> 00:20:49.700
I'm all about the 2FA.

00:20:50.220 --> 00:20:55.120
And I'm all about the 45 character password, but I'm not doing web often.

00:20:55.320 --> 00:20:56.240
45 characters?

00:20:56.660 --> 00:20:56.800
Wow.

00:20:57.400 --> 00:20:57.840
Or whatever.

00:20:58.140 --> 00:20:59.780
Like, I'm so frustrated.

00:20:59.980 --> 00:21:02.440
There's so many websites out there that you'll set.

00:21:02.620 --> 00:21:03.640
Like, I used to have a default.

00:21:03.700 --> 00:21:08.140
I think it maybe was 36 and one password for randomly generating a password.

00:21:08.140 --> 00:21:10.160
I'm like, that should pretty much stop it.

00:21:10.540 --> 00:21:11.140
You know what I mean?

00:21:11.680 --> 00:21:11.740
Yeah.

00:21:11.840 --> 00:21:12.080
Right?

00:21:13.000 --> 00:21:16.020
And God forbid there's like a moment or two where you've got to type it in.

00:21:16.840 --> 00:21:25.200
Like, for example, on Windows, If you get a new system, you got to log into your Microsoft account before you get into the system, the first boot or something.

00:21:25.640 --> 00:21:27.220
Like, oh, God, I got to type it.

00:21:27.990 --> 00:21:30.780
So you don't want it to be like, you know, paragraph.

00:21:31.060 --> 00:21:39.100
But so many websites go, no, your characters have to be, your passwords have to be less than 16 characters or less than 12 characters.

00:21:39.410 --> 00:21:41.940
I think my bank would limit it to like less than 10.

00:21:42.010 --> 00:21:44.000
I'm like, my bank, what is wrong with you people?

00:21:44.280 --> 00:21:49.500
if anybody should accept that, you know, a big password, but it's a tech support.

00:21:49.610 --> 00:21:54.320
They're like, well, somebody is going to say they're locked out of their account because somebody put a long password and they can't type it in or, you know,

00:21:54.780 --> 00:21:55.960
there's all these crappy reasons.

00:21:56.840 --> 00:22:10.360
What gets me is when people like passwords get, when they exclude common characters like colon or quote mark or like really your system is not able to handle colons and a password.

00:22:10.660 --> 00:22:11.920
That's just like insane.

00:22:12.340 --> 00:22:13.100
Anyway, or so.

00:22:13.100 --> 00:22:13.460
Yeah, I agree.

00:22:14.080 --> 00:22:14.660
Yeah, I agree.

00:22:15.040 --> 00:22:16.040
But anyway, okay.

00:22:16.420 --> 00:22:19.820
So phishing attack, I've got a couple other quick extras.

00:22:20.420 --> 00:22:26.360
I do have some, I'm not dedicated to the weekly testing code, but lately it's been weekly.

00:22:26.620 --> 00:22:31.540
So testing code, I got a couple, had an interview with Adam Johnson that was two topics.

00:22:31.730 --> 00:22:33.000
We split it into two episodes.

00:22:33.420 --> 00:22:34.220
Both are now available.

00:22:34.310 --> 00:22:36.240
We had pytest Django that we talked about.

00:22:36.920 --> 00:22:39.180
And then we talked about get tips for testing.

00:22:40.560 --> 00:22:49.140
And the top, especially some of the stuff on the get diff, get stash, and get bisect sections are pretty interesting.

00:22:49.520 --> 00:22:51.140
So some good stuff there.

00:22:51.340 --> 00:22:51.800
Yeah, very nice.

00:22:52.180 --> 00:22:53.100
And those are my extras.

00:22:54.120 --> 00:22:54.500
All right.

00:22:54.740 --> 00:22:55.220
Do you have a joke?

00:22:55.560 --> 00:22:55.980
I do.

00:22:56.300 --> 00:22:59.460
But this joke, you know how they say jokes are not funny if you've got to explain them.

00:22:59.720 --> 00:23:00.520
I'm going to explain this anyway.

00:23:01.320 --> 00:23:02.760
But not the joke itself.

00:23:03.080 --> 00:23:07.280
I'm going to explain the foundational information people need to know.

00:23:07.640 --> 00:23:12.920
So a lot of times people say these days, Brian, they say, Visual Studio, I'm using, like, what editor do you use?

00:23:12.920 --> 00:23:13.800
Oh, I use Visual Studio.

00:23:14.280 --> 00:23:15.440
They're not using Visual Studio.

00:23:15.560 --> 00:23:18.500
They're using something called Visual Studio Code or VS Code, right?

00:23:18.800 --> 00:23:18.880
Yeah.

00:23:19.140 --> 00:23:23.400
There is, there has been, since the 90s, an editor called Visual Studio.

00:23:24.060 --> 00:23:25.500
It is not Visual Studio Code.

00:23:25.560 --> 00:23:27.220
It is a beast of a beast.

00:23:27.320 --> 00:23:29.940
Like, it's like a five gig download.

00:23:30.700 --> 00:23:32.100
It manages Azure.

00:23:33.820 --> 00:23:34.760
It does database.

00:23:34.820 --> 00:23:37.460
It does team foundation server.

00:23:37.560 --> 00:23:38.760
It does like all this stuff.

00:23:38.860 --> 00:23:40.760
It's like a really heavyweight editor.

00:23:41.220 --> 00:23:47.660
And VS Code was basically created to make a lightweight little editor that is not Visual Studio proper, right?

00:23:48.000 --> 00:23:48.100
Yeah.

00:23:48.480 --> 00:23:53.780
All right, so I got to just set that because I know a lot of people, especially younger folks, Visual Studio is Visual Studio Code.

00:23:54.080 --> 00:23:55.640
But now are you ready for the joke?

00:23:56.040 --> 00:23:56.180
Yeah.

00:23:56.480 --> 00:23:57.080
All right, let's do it.

00:23:57.340 --> 00:23:59.620
So there's a nurse talking to a guy.

00:24:00.380 --> 00:24:03.680
Do you have any history of mental illness in your family?

00:24:04.040 --> 00:24:05.480
The guy looks over as well.

00:24:06.120 --> 00:24:10.100
My brother uses Visual Studio 2022 as a default text editor.

00:24:17.380 --> 00:24:17.980
Yeah, that's good.

00:24:18.290 --> 00:24:18.380
Yeah.

00:24:18.450 --> 00:24:19.080
It's pretty good, right?

00:24:19.480 --> 00:24:19.820
Pretty good.

00:24:20.060 --> 00:24:22.660
Because that thing is big and it's slow to start and it's like ridiculous.

00:24:25.080 --> 00:24:26.180
Default text file editor.

00:24:26.700 --> 00:24:26.760
Yeah.

00:24:27.120 --> 00:24:27.460
That's the joke.

00:24:27.640 --> 00:24:28.220
That's what I got you.

00:24:29.440 --> 00:25:02.780
So I haven't had to use Visual Studio for a while, but we did used to i was using it for compiling stuff and i i can't remember what the short code was for compiling it was like f7 or f11 or f2 one of the f keys was just to compile and so whenever anybody asked me or do you use visual studio i'm like just as a really big uh thing to hit f7 with um or whatever yeah yeah yeah yeah um so yeah and that it's true i would i would edit in way back in the day.

00:25:02.800 --> 00:25:18.900
It was before Visual Studio or VS Code. So I was probably editing it in Vim or Sublime or something like that. And then I'd have Visual Studio off to the side and I would just go over to it and hit the key to compile and then go back to my day.

00:25:21.240 --> 00:25:22.200
This is what it is.

00:25:22.820 --> 00:25:23.920
This is a good one. I like it.

00:25:24.980 --> 00:25:28.480
I do too. I used to use Visual Studio and I enjoyed it. I thought it did cool stuff.

00:25:28.680 --> 00:25:31.120
as a default text editor for just simple files.

00:25:31.190 --> 00:25:32.500
It is not what it was for.

00:25:32.880 --> 00:25:37.240
Yeah, I had people like composing their email in Visual Studio.

00:25:37.960 --> 00:25:38.580
Oh my gosh.

00:25:38.880 --> 00:25:40.440
Really? This is what you know?

00:25:40.730 --> 00:25:40.840
Okay.

00:25:41.540 --> 00:25:42.620
All right. Fair.

00:25:43.080 --> 00:25:45.780
Well, I mean, they probably do have a history of mental illness then.

00:25:46.560 --> 00:25:47.120
I think so.

00:25:47.880 --> 00:25:50.860
Then they open up Outlook and send it and you know for sure there's something going on there.

00:25:52.660 --> 00:25:53.100
Outlook.

00:25:54.640 --> 00:25:54.820
Exactly.

00:25:54.960 --> 00:26:01.400
The only thing on my desktop that if I hit Control-F, it doesn't find stuff.

00:26:01.450 --> 00:26:02.520
It forwards an email.

00:26:03.620 --> 00:26:04.100
Yeah, exactly.

00:26:06.220 --> 00:26:08.900
So, well, excellent episode again.

00:26:09.380 --> 00:26:09.740
Thanks, Michael.

00:26:10.180 --> 00:26:11.100
Thanks, everybody, for listening.

00:26:11.390 --> 00:26:11.720
You bet.

00:26:11.950 --> 00:26:12.300
See you later.

00:26:12.510 --> 00:26:12.840
Bye, everyone.

00:26:12.850 --> 00:26:13.000
Bye.

