WEBVTT
00:00:00.020 -->
00:00:04.500Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:04.920 -->
00:00:08.960This is episode 443, recorded August 4th, 2025.
00:00:09.700 -->
00:00:10.540And I'm Brian Okken.
00:00:10.760 -->
00:00:11.420And I'm Michael Kennedy.
00:00:11.860 -->
00:00:17.280And you can reach us on the socials on Bluesky or Mastodon.
00:00:17.740 -->
00:00:23.040Check out the show notes or the website, pythonbytes.fm, to find all those links.
00:00:23.460 -->
00:00:29.680And if you'd like to watch us live, you can check out pythonbytes.fm/live.
00:00:30.060 -->
00:00:32.920and it's usually Mondays at 10 a.m. Pacific time.
00:00:33.360 -->
00:00:38.720But 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.040And this episode is sponsored by you guys, by the offerings that both Michael and I have.
00:00:48.420 -->
00:00:53.920And you're supporting us through that really helps us going to getting courses, buying books.
00:00:54.520 -->
00:00:55.180That's pretty much it.
00:00:55.440 -->
00:00:56.140Also Patreon.
00:00:56.480 -->
00:00:57.400So thanks Patreon people.
00:00:57.700 -->
00:00:58.280Let's kick it off.
00:00:58.540 -->
00:00:58.960What you got, Michael?
00:00:59.040 -->
00:01:04.199I have something sent in from Owen Lamont.
00:01:04.280 -->
00:01:06.020And so, Owen, thank you for sending this in.
00:01:06.880 -->
00:01:15.520I 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.580R-U-F-F, not R-O-U-G-H.
00:01:19.580 -->
00:01:25.300Rough vibes in that it's a formatter written in Rust, seems insanely fast.
00:01:25.780 -->
00:01:33.480And 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.540So there's a PyPI wrapper, basically a wheel that wraps up the commands going to it.
00:01:39.760 -->
00:01:45.260So you can pip install it, uv pip install it, more importantly, uv tool install.
00:01:45.600 -->
00:01:49.740It also has a pre-commit hook and pyproject.toml support.
00:01:50.020 -->
00:01:50.520Pretty neat, right?
00:01:50.520 -->
00:01:51.000Very cool, yeah.
00:01:51.380 -->
00:01:53.420I just ran it on a project I'm working on.
00:01:53.580 -->
00:01:55.240And apparently, what did it say?
00:01:55.310 -->
00:01:55.900How many errors?
00:01:56.420 -->
00:02:03.14014, 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.480So that's pretty cool.
00:02:04.640 -->
00:02:07.380High performance markdown formatter.
00:02:07.780 -->
00:02:12.520So you can install it in lots of ways, but I would just uv tool install it.
00:02:12.780 -->
00:02:16.960It has 54 linting rules, which are apparently common markdown issues.
00:02:18.100 -->
00:02:23.140Like 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.480You can fix most of them with --fix, like I said, which is beautiful.
00:02:27.060 -->
00:02:28.380No dependencies, single binary.
00:02:29.140 -->
00:02:37.580Highly 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.540I 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.820I have a 4K monitor, 32 inch 4K monitor.
00:02:47.900 -->
00:02:54.720If 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.420Like, okay, is that where most of our markdown is done?
00:02:57.800 -->
00:02:59.640Probably not, but I don't know.
00:03:00.760 -->
00:03:02.320I'd say make it long and let it wrap.
00:03:02.520 -->
00:03:07.400The 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.640But type-ora, it keeps a little more of the formatting visually there.
00:03:13.700 -->
00:03:22.020So 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.860Like a blank line.
00:03:23.100 -->
00:03:25.140But in Typora, while you're editing it, you see them.
00:03:25.580 -->
00:03:27.180And so you would see like chunks.
00:03:27.560 -->
00:03:30.820So if I make my editor wider, it like stops going.
00:03:31.540 -->
00:03:39.120If 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.620And like, it's just, I hate that rule.
00:03:42.020 -->
00:03:43.660So why am I ranting so much?
00:03:44.020 -->
00:03:45.220Well, because I rant apparently.
00:03:45.780 -->
00:03:47.520But it's also super configurable.
00:03:47.620 -->
00:03:50.460So you can go to a Tommel file down here.
00:03:51.100 -->
00:03:54.860And once you find it in here, it has a bunch of examples.
00:03:55.310 -->
00:03:56.900I think up at the top here, there.
00:03:57.800 -->
00:03:59.780And you can go in here and it gives you examples.
00:04:00.040 -->
00:04:02.900Like I can say disable rule MD013.
00:04:03.110 -->
00:04:05.060Or in my case, yes, that's the one.
00:04:06.060 -->
00:04:06.780Of course it's 13.
00:04:07.030 -->
00:04:07.500It's unlucky.
00:04:07.750 -->
00:04:09.120But you can also configure the rules.
00:04:09.300 -->
00:04:11.700Like say rule seven is about indentation.
00:04:12.090 -->
00:04:15.040How many characters, how many spaces do you want to indent by?
00:04:15.520 -->
00:04:16.859Or different things, right?
00:04:17.060 -->
00:04:24.060Don'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.240Again, I'm turning that off.
00:04:25.360 -->
00:04:27.980But still, I guess I could set it to infinity.
00:04:29.200 -->
00:04:29.940That would be fine.
00:04:30.580 -->
00:04:31.420But isn't this cool?
00:04:31.700 -->
00:04:32.600Yeah, it is really cool.
00:04:33.220 -->
00:04:36.200I want to jump on the line length bandwagon a little bit here, though.
00:04:36.320 -->
00:04:36.700Let's do it.
00:04:38.020 -->
00:04:38.820I agree.
00:04:39.040 -->
00:04:40.200I'm glad this is configurable.
00:04:40.540 -->
00:04:46.340Because in writing a book or something or a tutorial, I'm going to have long paragraphs.
00:04:46.860 -->
00:04:51.200And I'd rather have those just wrap, and I don't want to limit my line length.
00:04:51.240 -->
00:04:54.160So I would turn that off if I'm writing long form stuff.
00:04:54.480 -->
00:04:57.300Yeah, I'm thinking my blog posts and things like that, right?
00:04:57.360 -->
00:04:58.020Which are all marked down.
00:04:58.180 -->
00:05:10.580But 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.780You do have to be aware of the diffs.
00:05:14.960 -->
00:05:18.320But I think diff tools deal with word wrap fine now.
00:05:18.660 -->
00:05:19.900So anyway, I don't know.
00:05:20.020 -->
00:05:20.980Yeah, that's a fair issue.
00:05:21.260 -->
00:05:21.520Fair point.
00:05:22.300 -->
00:05:25.200But if you got long form writing, it doesn't make sense.
00:05:25.540 -->
00:05:26.580Yeah, it doesn't make sense at all.
00:05:26.860 -->
00:05:27.680Yeah, that's weird.
00:05:27.760 -->
00:05:30.040It's not like in Word or Google Docs.
00:05:30.160 -->
00:05:31.460Like, where do you want to break your lines?
00:05:31.560 -->
00:05:33.420Like, no, I want it to just go across the page.
00:05:33.520 -->
00:05:34.480Can we just let me write?
00:05:35.180 -->
00:05:35.380Yeah.
00:05:36.280 -->
00:05:36.400All right.
00:05:36.780 -->
00:05:37.620But it's super cool.
00:05:37.880 -->
00:05:40.260You can, like I said, uv tool install it.
00:05:40.420 -->
00:05:42.000It even has instructions for uv.
00:05:42.480 -->
00:05:44.600Or you can use uvtool run.
00:05:45.040 -->
00:05:48.640And 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.120Yeah.
00:05:49.450 -->
00:05:53.700So what's the big, do you know what the biggest mistake is you usually make for Markdown?
00:05:54.140 -->
00:05:56.200I haven't done enough messing with it yet,
00:05:56.400 -->
00:05:58.000but I can report back to you.
00:05:58.260 -->
00:05:58.400Okay.
00:05:59.080 -->
00:06:08.320Mine, 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.760So 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.080Some 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.360So, yeah, I need something to fix that for me.
00:06:30.520 -->
00:06:30.800Definitely.
00:06:32.200 -->
00:06:32.520All right.
00:06:33.420 -->
00:06:34.520On to the next topic.
00:06:35.560 -->
00:06:44.920We 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.960Coverage 7.10.0 with patch.
00:06:48.360 -->
00:06:54.220So 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.920And I just read about this, and I am like really excited about it.
00:07:00.360 -->
00:07:03.460So one of the things, it adds three things.
00:07:03.640 -->
00:07:14.280So 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.480And I'll do the weird ones first.
00:07:17.770 -->
00:07:19.900I don't really see execv around.
00:07:20.460 -->
00:07:32.480But 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.100It just like processes stop.
00:07:34.940 -->
00:07:36.580And that's not cool.
00:07:36.660 -->
00:07:39.220But with this, you can fix that.
00:07:39.600 -->
00:07:41.620And there have been workarounds for these other things.
00:07:42.540 -->
00:07:44.460And so that's not really the big news.
00:07:44.560 -->
00:07:45.900The big news, I think, is subprocess.
00:07:46.440 -->
00:07:57.340Because 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.180And there were ways to deal with it, but it was a little clunky.
00:08:00.640 -->
00:08:04.520Now, we've got a way to do it built in.
00:08:04.680 -->
00:08:08.220You just say patch equals subprocess and coverage does it for you.
00:08:09.000 -->
00:08:09.680How cool is that?
00:08:09.940 -->
00:08:10.940And multiprocessing.
00:08:11.120 -->
00:08:13.640It'll count multiprocessing execution for coverage.
00:08:14.780 -->
00:08:15.520That's, yes.
00:08:15.860 -->
00:08:16.940Thank you, thank you, thank you, Ned.
00:08:17.840 -->
00:08:19.380So I'm really excited about this.
00:08:19.550 -->
00:08:20.020It's pretty cool.
00:08:20.540 -->
00:08:21.600Anyway, that's it, really.
00:08:22.220 -->
00:08:22.380Awesome.
00:08:22.530 -->
00:08:23.880Yeah, it's a really good one.
00:08:24.140 -->
00:08:24.620Short and sweet.
00:08:25.540 -->
00:08:28.400This one comes to us from Pat Decker, I believe.
00:08:28.780 -->
00:08:31.460I hope I'm remembering that right because I forgot to write it down.
00:08:31.680 -->
00:08:32.820So someone else sent it in.
00:08:33.000 -->
00:08:33.360I apologize.
00:08:33.620 -->
00:08:37.820I'm pretty sure it's Pat sent this over and it's AIO boto3.
00:08:38.479 -->
00:08:47.100So boto3 is the Python package to talk to things like S3 and other stuff in Amazon.
00:08:47.580 -->
00:08:47.760Okay.
00:08:47.760 -->
00:08:48.120And AWS.
00:08:48.720 -->
00:08:49.660Don't get me started on boto3.
00:08:50.040 -->
00:08:52.840It's a bit of a insane package the way it's created.
00:08:53.340 -->
00:09:04.220But 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.080So what's going on from here?
00:09:06.260 -->
00:09:20.140It'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.460us. 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.660What's Kinesis? What is Kinesis? Good question. Is that an AWS thing? Yeah, looking that up.
00:10:13.760 -->
00:10:15.540this. That's not how you spell it, but
00:10:15.860 -->
00:10:17.540luckily. I just thought it was keyboard.
00:10:17.600 -->
00:10:23.700It'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.300I'm glad you asked, because this is what I've been working for a long time around.
00:10:27.800 -->
00:10:28.880Okay. Sorry. No.
00:10:29.700 -->
00:10:33.360Apparently, like, data streaming, data lake, data processing, analytics.
00:10:33.570 -->
00:10:35.500Okay. Got it. Cool. That's it.
00:10:35.520 -->
00:10:40.860That'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.680Alright. Well, I Sorry for the distraction, but I wanted to...
00:10:46.680 -->
00:10:48.280Anyway, I have a Kinesis keyboard.
00:10:48.580 -->
00:10:49.260That's why I'm like, what?
00:10:49.780 -->
00:10:50.620Yes, you do, don't you?
00:10:51.920 -->
00:10:52.800Tell people what it like.
00:10:52.960 -->
00:10:54.880Here, put one up on the screen.
00:10:56.040 -->
00:10:57.480Yeah, I was trying to look for one.
00:10:57.780 -->
00:10:59.100Kinesis keyboard images.
00:10:59.660 -->
00:11:00.180Oh, here we go.
00:11:00.720 -->
00:11:02.080Did you find one?
00:11:02.440 -->
00:11:02.520No.
00:11:02.640 -->
00:11:02.780No.
00:11:03.940 -->
00:11:04.220There we go.
00:11:04.260 -->
00:11:04.680They are wild.
00:11:04.800 -->
00:11:05.600I had one for a while.
00:11:05.660 -->
00:11:07.080I'm like, I'm not sure I can do this.
00:11:07.680 -->
00:11:08.360Oh, I love it.
00:11:08.560 -->
00:11:10.800So I just did the image search.
00:11:11.320 -->
00:11:17.840um 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.240little 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.640say 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.440uh 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.740you 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.180um 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.240I wasn't going to talk about keyboards, but what am I talking about?
00:12:11.460 -->
00:12:14.600I'm going to talk about You Might Not Need a Python Class by Adam Grant.
00:12:15.120 -->
00:12:30.060So 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.640So I'm just going to run through some of the options.
00:12:32.920 -->
00:12:38.820One is for simple data containers, think about named tuples, which are great, or data classes.
00:12:39.700 -->
00:12:43.620Actually, probably data class first, and then if it's not quite right, named tuple.
00:12:44.020 -->
00:12:48.280But here's an example of somebody doing a custom class with point.
00:12:48.350 -->
00:12:52.420And also, the intending is wrong here, Adam, but oh well.
00:12:53.339 -->
00:12:58.060Anyway, examples of how to use that with a named tuple or just a data class.
00:12:58.350 -->
00:13:00.220So it works pretty good.
00:13:00.220 -->
00:13:01.840You 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.400Like modules themselves often can behave in the same way that people do classes.
00:13:17.420 -->
00:13:20.120Like 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.460I mean, I came from C-sharp, which had a lot of class, very much.
00:14:29.530 -->
00:14:31.800Like, everything had to be in a class at the time when I was doing it.
00:14:31.850 -->
00:14:32.900Like, literally everything.
00:14:33.300 -->
00:14:36.000So I was very much in that space, but I've moved on.
00:14:36.120 -->
00:14:38.860Also, on the constants, I agree.
00:14:39.360 -->
00:14:42.400But maybe throw in a typing final of type.
00:14:42.550 -->
00:14:44.080So they've got, like, a host and a port.
00:14:44.220 -->
00:14:48.080You could have a typing.final bracket str and a typing.final bracket int.
00:14:48.320 -->
00:14:48.840Oh, yeah.
00:14:49.220 -->
00:14:52.460Yeah, so then at least the editors and stuff go, yeah, like, don't edit this.
00:14:52.760 -->
00:14:53.560Don't edit it, yeah.
00:14:53.760 -->
00:14:57.540unless 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.220changing yeah but also having it in a class and it stopped people from changing it either
00:15:02.770 -->
00:15:08.320no 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.420uh 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.860is 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.500he 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.240I'm thinking the middle one.
00:17:09.339 -->
00:17:18.760If 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.680I mean, that's when you need it, right?
00:17:20.800 -->
00:17:23.680Not for all the other jumps and hoops people used to use it for.
00:17:23.920 -->
00:17:34.160And 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.120I don't think I have any that were legitimate reasons to use a class hierarchy.
00:17:40.980 -->
00:17:56.280But 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.360So anyway.
00:17:57.640 -->
00:18:00.020Yeah, composition over inheritance indeed.
00:18:00.580 -->
00:18:00.940That's it.
00:18:01.020 -->
00:18:01.700It's a long way.
00:18:02.000 -->
00:18:02.280All right.
00:18:02.640 -->
00:18:03.440Those are our topics.
00:18:03.980 -->
00:18:05.400Do you have any extras?
00:18:06.600 -->
00:18:08.020I have at least one extra.
00:18:08.320 -->
00:18:09.380Let's see what I can do about that.
00:18:10.120 -->
00:18:18.540So 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.280with Will Vincent from PyCharm.
00:18:21.600 -->
00:18:26.820Yeah, 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.260Should be a lot of fun.
00:18:28.520 -->
00:18:29.620I'm really looking forward to it.
00:18:29.930 -->
00:18:31.440I wasn't entirely sure what we were going to cover.
00:18:31.880 -->
00:18:33.000Will and I talked about it today.
00:18:33.220 -->
00:18:34.100I have a bunch of great ideas.
00:18:34.400 -->
00:18:34.600Cool.
00:18:34.900 -->
00:18:40.720So 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.520Why are you not using UV?
00:18:43.120 -->
00:18:44.100If you're not, why?
00:18:44.440 -->
00:18:45.320A lot of people are like, what's UV?
00:18:45.620 -->
00:18:47.780Or it's too hard to move from, or it doesn't, whatever.
00:18:48.180 -->
00:18:50.240We'll kind of address all that kind of stuff.
00:18:50.500 -->
00:18:54.760Plus, maybe some fun Docker things, some performance things, all over the place.
00:18:55.180 -->
00:18:55.380Awesome.
00:18:56.040 -->
00:18:56.100Yep.
00:18:56.360 -->
00:18:58.120I have a couple extras.
00:18:58.980 -->
00:18:59.440All right.
00:18:59.920 -->
00:19:04.940So first off, this was sent to us by listener John Hagan.
00:19:06.230 -->
00:19:10.400The PyPI blog has an incident report about a phishing attack.
00:19:10.840 -->
00:19:14.840So apparently there was some targeted phishing emails.
00:19:16.360 -->
00:19:29.940There 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.080So 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.220That's really creepy.
00:19:42.100 -->
00:19:42.460What was it?
00:19:42.460 -->
00:19:48.120It involved, and it involved like the fact that in some fonts, INJ look identical.
00:19:49.260 -->
00:19:52.840So it was a pypj.org domain.
00:19:54.120 -->
00:19:54.440Yikes.
00:19:54.840 -->
00:19:57.440Anyway, I just wanted to have people aware of that.
00:19:57.660 -->
00:20:01.160It was apparently found and fixed relatively quickly.
00:20:01.580 -->
00:20:06.200There were, I guess, four user accounts successfully phished.
00:20:07.160 -->
00:20:08.620They're either disabled.
00:20:08.940 -->
00:20:12.820So there's some recommendations, takeaways, calls to action.
00:20:13.420 -->
00:20:18.660If 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.780You can always create another one if you need to later.
00:20:22.140 -->
00:20:28.060If 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.060Even if you only pop in once a year, make it more secure.
00:20:31.390 -->
00:20:31.720Be good.
00:20:33.000 -->
00:20:38.280And use web often via browser hardware security or hardware security keys.
00:20:38.760 -->
00:20:39.020Wow.
00:20:39.330 -->
00:20:39.860I don't even know.
00:20:40.280 -->
00:20:41.600Is that just web authentication?
00:20:41.950 -->
00:20:42.320I don't know.
00:20:42.540 -->
00:20:43.220I don't know what this is.
00:20:43.280 -->
00:20:45.540I think it's like YubiKey type stuff.
00:20:45.900 -->
00:20:46.100Okay.
00:20:46.400 -->
00:20:46.940I don't do it though.
00:20:47.060 -->
00:20:47.820So I don't know that well.
00:20:48.400 -->
00:20:49.700I'm all about the 2FA.
00:20:50.220 -->
00:20:55.120And I'm all about the 45 character password, but I'm not doing web often.
00:20:55.320 -->
00:20:56.24045 characters?
00:20:56.660 -->
00:20:56.800Wow.
00:20:57.400 -->
00:20:57.840Or whatever.
00:20:58.140 -->
00:20:59.780Like, I'm so frustrated.
00:20:59.980 -->
00:21:02.440There's so many websites out there that you'll set.
00:21:02.620 -->
00:21:03.640Like, I used to have a default.
00:21:03.700 -->
00:21:08.140I think it maybe was 36 and one password for randomly generating a password.
00:21:08.140 -->
00:21:10.160I'm like, that should pretty much stop it.
00:21:10.540 -->
00:21:11.140You know what I mean?
00:21:11.680 -->
00:21:11.740Yeah.
00:21:11.840 -->
00:21:12.080Right?
00:21:13.000 -->
00:21:16.020And God forbid there's like a moment or two where you've got to type it in.
00:21:16.840 -->
00:21:25.200Like, 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.220Like, oh, God, I got to type it.
00:21:27.990 -->
00:21:30.780So you don't want it to be like, you know, paragraph.
00:21:31.060 -->
00:21:39.100But 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.940I think my bank would limit it to like less than 10.
00:21:42.010 -->
00:21:44.000I'm like, my bank, what is wrong with you people?
00:21:44.280 -->
00:21:49.500if anybody should accept that, you know, a big password, but it's a tech support.
00:21:49.610 -->
00:21:54.320They'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.960there's all these crappy reasons.
00:21:56.840 -->
00:22:10.360What 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.920That's just like insane.
00:22:12.340 -->
00:22:13.100Anyway, or so.
00:22:13.100 -->
00:22:13.460Yeah, I agree.
00:22:14.080 -->
00:22:14.660Yeah, I agree.
00:22:15.040 -->
00:22:16.040But anyway, okay.
00:22:16.420 -->
00:22:19.820So phishing attack, I've got a couple other quick extras.
00:22:20.420 -->
00:22:26.360I 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.540So testing code, I got a couple, had an interview with Adam Johnson that was two topics.
00:22:31.730 -->
00:22:33.000We split it into two episodes.
00:22:33.420 -->
00:22:34.220Both are now available.
00:22:34.310 -->
00:22:36.240We had pytest Django that we talked about.
00:22:36.920 -->
00:22:39.180And then we talked about get tips for testing.
00:22:40.560 -->
00:22:49.140And 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.140So some good stuff there.
00:22:51.340 -->
00:22:51.800Yeah, very nice.
00:22:52.180 -->
00:22:53.100And those are my extras.
00:22:54.120 -->
00:22:54.500All right.
00:22:54.740 -->
00:22:55.220Do you have a joke?
00:22:55.560 -->
00:22:55.980I do.
00:22:56.300 -->
00:22:59.460But 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.520I'm going to explain this anyway.
00:23:01.320 -->
00:23:02.760But not the joke itself.
00:23:03.080 -->
00:23:07.280I'm going to explain the foundational information people need to know.
00:23:07.640 -->
00:23:12.920So 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.800Oh, I use Visual Studio.
00:23:14.280 -->
00:23:15.440They're not using Visual Studio.
00:23:15.560 -->
00:23:18.500They're using something called Visual Studio Code or VS Code, right?
00:23:18.800 -->
00:23:18.880Yeah.
00:23:19.140 -->
00:23:23.400There is, there has been, since the 90s, an editor called Visual Studio.
00:23:24.060 -->
00:23:25.500It is not Visual Studio Code.
00:23:25.560 -->
00:23:27.220It is a beast of a beast.
00:23:27.320 -->
00:23:29.940Like, it's like a five gig download.
00:23:30.700 -->
00:23:32.100It manages Azure.
00:23:33.820 -->
00:23:34.760It does database.
00:23:34.820 -->
00:23:37.460It does team foundation server.
00:23:37.560 -->
00:23:38.760It does like all this stuff.
00:23:38.860 -->
00:23:40.760It's like a really heavyweight editor.
00:23:41.220 -->
00:23:47.660And 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.100Yeah.
00:23:48.480 -->
00:23:53.780All 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.640But now are you ready for the joke?
00:23:56.040 -->
00:23:56.180Yeah.
00:23:56.480 -->
00:23:57.080All right, let's do it.
00:23:57.340 -->
00:23:59.620So there's a nurse talking to a guy.
00:24:00.380 -->
00:24:03.680Do you have any history of mental illness in your family?
00:24:04.040 -->
00:24:05.480The guy looks over as well.
00:24:06.120 -->
00:24:10.100My brother uses Visual Studio 2022 as a default text editor.
00:24:17.380 -->
00:24:17.980Yeah, that's good.
00:24:18.290 -->
00:24:18.380Yeah.
00:24:18.450 -->
00:24:19.080It's pretty good, right?
00:24:19.480 -->
00:24:19.820Pretty good.
00:24:20.060 -->
00:24:22.660Because that thing is big and it's slow to start and it's like ridiculous.
00:24:25.080 -->
00:24:26.180Default text file editor.
00:24:26.700 -->
00:24:26.760Yeah.
00:24:27.120 -->
00:24:27.460That's the joke.
00:24:27.640 -->
00:24:28.220That's what I got you.
00:24:29.440 -->
00:25:02.780So 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.900It 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.200This is what it is.
00:25:22.820 -->
00:25:23.920This is a good one. I like it.
00:25:24.980 -->
00:25:28.480I 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.120as a default text editor for just simple files.
00:25:31.190 -->
00:25:32.500It is not what it was for.
00:25:32.880 -->
00:25:37.240Yeah, I had people like composing their email in Visual Studio.
00:25:37.960 -->
00:25:38.580Oh my gosh.
00:25:38.880 -->
00:25:40.440Really? This is what you know?
00:25:40.730 -->
00:25:40.840Okay.
00:25:41.540 -->
00:25:42.620All right. Fair.
00:25:43.080 -->
00:25:45.780Well, I mean, they probably do have a history of mental illness then.
00:25:46.560 -->
00:25:47.120I think so.
00:25:47.880 -->
00:25:50.860Then 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.100Outlook.
00:25:54.640 -->
00:25:54.820Exactly.
00:25:54.960 -->
00:26:01.400The only thing on my desktop that if I hit Control-F, it doesn't find stuff.
00:26:01.450 -->
00:26:02.520It forwards an email.
00:26:03.620 -->
00:26:04.100Yeah, exactly.
00:26:06.220 -->
00:26:08.900So, well, excellent episode again.
00:26:09.380 -->
00:26:09.740Thanks, Michael.
00:26:10.180 -->
00:26:11.100Thanks, everybody, for listening.
00:26:11.390 -->
00:26:11.720You bet.
00:26:11.950 -->
00:26:12.300See you later.
00:26:12.510 -->
00:26:12.840Bye, everyone.
00:26:12.850 -->
00:26:13.000Bye.