Transcript #372: uv - an impressive pip alternative
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:05 This is episode 372, recorded February 20th, 2024.
00:10 And I'm Michael Kennedy.
00:12 And I'm Brian Okken.
00:13 This episode is brought to you by Scout APM.
00:17 Super psyched to have them supporting the show.
00:19 So we'll tell you more about them later, but please check them out.
00:22 The link is in the podcast player show notes or on the website.
00:25 If you are one of the lucky ones, Brian, who is attending this live, they got here by going to pythonbytes.fm.com slash live, crushing the bell, saying get notified.
00:34 They got notified when this comes on, when it's scheduled.
00:37 And here they are.
00:38 For those of you who are just listening, we super appreciate that anyway.
00:41 So how are we listening?
00:43 Thank you.
00:43 Thank you.
00:44 Connect with us over on Mastodon.
00:46 We're all on Facedon, at Brian Okken, at M. Kennedy, and at Python Bytes.
00:51 Brian, before we jump into the news, and before I forget, I just want to make a quick announcement.
00:56 I will be at PyCon Philippines starting.
01:00 I leave tomorrow at, I fly from Portland to San Francisco at 8 p.m.
01:05 And then I leave San Francisco at midnight.
01:07 So who knows what state I'm going to be in, but I'm pretty sure with the time zone change and the travels and all this, there's not going to be a Python Bytes next week.
01:15 So we're going to be probably skipping next week, which is a good chance for people to catch up if they fail behind.
01:21 Yeah.
01:21 And also, I'm jealous, and I hope you have a great time.
01:24 Thank you very much.
01:25 I'm going to have a great time.
01:26 I worked, was writing the keynote speech yesterday, and it's going to be good.
01:31 It's coming together nicely.
01:32 So it's always nerve-wracking.
01:34 I don't know how, what is your way of working on talks and stuff?
01:38 Like, I want to be prepared, and I'm the kind of person that would get prepared a month or two months early.
01:44 But then if I write the stuff and then put it away and then come back to it, I've kind of lost the inspiration and the nuances and the details.
01:50 So I don't want to write it too soon, but I also don't want to wait until the last minute.
01:53 So there's this weird, weird trade-off, I feel.
01:56 Mostly, I usually try to cover too much stuff in talks, so I try to pare it down.
02:01 And then, yeah, I practice the heck out of it.
02:04 The ones where some talks I like am fiddling with the slides too much until like five minutes beforehand, and that goes terribly.
02:11 So, yeah, I like to do it early in practice.
02:14 All right, well, over to you.
02:17 I know you have a big announcement.
02:19 Yeah.
02:20 I heard you're coming in first.
02:20 Yeah, you are.
02:21 Okay.
02:21 Am I first?
02:22 Yeah.
02:23 So I'm pretty excited.
02:25 The folks at Astral, including Charlie Marsh and others, have released UV, a Python packaging.
02:33 It's Python packaging in Rust, and it's not another packaging tool.
02:39 It is the Python end.
02:42 So like replacing, this is actually incredible.
02:46 It's replacing pip-tools and VirtualAMP all in one new Rust-driven tool.
02:53 Their announcement said maybe UV represents a milestone in our pursuit of Cargo for Python, a comprehensive Python project and package manager that's fast, reliable, and easy to use.
03:08 It's interesting combined in this announcement is that they're taking, Astral is taking stewardship of Armin Roenker's Rai tool.
03:17 That's an experimental tool.
03:18 So I'm not sure what that has to do with this, but I don't know.
03:21 It's interesting.
03:22 But have you given this a try yet?
03:25 Oh, yes.
03:26 I am so psyched about this.
03:28 Charlie and team, congratulations, because this is setting the world on fire in a lot of interesting ways.
03:36 Well, I, you know, Charlie aimed this right at like my style of programming and working with Python dependencies and projects.
03:44 So on one hand, we have just the PIP, PIP-free side, right?
03:48 And then on the other, you've got the poetry and other PIP-inf where you've got like some other API that kind of manages everything.
03:57 And I want some of the benefits of that, but I want it to be just a simple requirement.txt or something like that in the end, right?
04:05 And so I use pip-tools and pip-tools will go and say, okay, what do you say you actually need?
04:10 And then let's build out what would be into the virtual environment after that.
04:14 And it's great.
04:15 But, you know, the command pip compile, like for mine, I don't know how long it takes, probably 15 seconds to pip compile, update the list of things for Tuck Python training.
04:25 I think there's 250 dependencies in the dev version.
04:29 It's out of control.
04:30 Yeah.
04:31 It just takes a real, real long time with this instant.
04:33 Yeah.
04:34 And it's just so good.
04:36 They have some benchmarks up there and it's like pip sync versus UV.
04:41 pip sync is like 60 milliseconds versus almost five seconds.
04:46 Right.
04:46 Those are different types.
04:47 It's, it just happens versus you like, okay, hold on.
04:50 It's working.
04:51 You know what I mean?
04:52 Yeah.
04:53 And what's really pretty interesting is that it looks like it's gotten a lot of, it's not necessarily that it's just because it's written in rough, rough, rust, reading rough as I'm saying that.
05:06 Not just that it's written in rust, which it happens to be because that's the vibe of astral, right?
05:11 Starting with the rough stuff.
05:12 But that they've maybe unlocked some different algorithms or techniques or something like that, where even if it were in Python, it would be faster, which is pretty interesting.
05:22 Yeah, there's, there's some caching that they've done and, of like site-wide caching and keeping also keeping PIP, actually makes sense to have some of this stuff, virtualenv and pip outside of the Python tool chain system.
05:36 So that, because you're going to want it in each virtual environment.
05:39 So having it, installed outside is kind of interesting.
05:43 So, yeah, I'm pretty, it's super fast.
05:47 the, the hope is to be, API compatible or at least, interface compatible.
05:53 It's, in the, they're, they just don't have all of the features yet.
05:57 So, but like, I don't mean to say that it's not worth trying already.
06:03 It is production ready right now.
06:04 And that's what they're, they've tested the heck out of it.
06:07 It's just that, you have to like work with your workflow to make sure that you work with it.
06:12 So, I was amusingly trying it out yesterday and ran into like three things right away that, or two things that didn't work.
06:20 So I did, tried to use the --prompt to have a virtual.
06:25 I am just to create my virtual environment with the same name.
06:28 and prompt isn't supported yet, but it is, I went to file a defect and it was already fixed.
06:33 It just hasn't been released yet.
06:35 So, you know, probably by the time you listen to this, it's probably been released and it'll work.
06:39 They're doing a lot of releases, aren't they?
06:41 Yeah.
06:41 There's been seven releases in four days.
06:43 It's incredible.
06:44 And a really responsive team.
06:46 A lot of people are trying it out though.
06:48 So, yeah, I'm glad they're responsive because there's a bunch of issues people are working on.
06:53 it's really fun to watch.
06:55 The other thing, was, oh, oh, so virtual environments work, work really fast.
07:01 It's like so fast.
07:02 and the resolver actually is something we don't really talk about too much.
07:07 but the resolver, like you said, when you're pip installing something, if you have like a requirements file, you got a bunch of projects in it or a bunch of things you're pulling in dependencies.
07:16 They might have conflicting dependencies or not really conflicting, but they're, the rules are such that you have to pick the right dependency so that it matches both tools.
07:25 that's all done and it's super fast.
07:28 I'm really impressed with how this thing is.
07:30 and, and apparently everybody else is too.
07:33 because almost, almost immediately after the announcement.
07:38 So look at all these contributors, you've got 32 contributors already.
07:42 these are not just people at astral.
07:45 Like I know that Brett is not there.
07:47 So, talks has already announced that there is a talks dash UV, plugin so that you can have talks act faster too and use UV for virtual and for pip.
08:01 And also that makes it faster.
08:03 I think that's, there's a, and I'm sure there's more tools to come that support will support UV out of the box.
08:09 So.
08:10 Yeah.
08:10 Awesome.
08:11 I'm super excited, but I have a bunch of, aliases for my shell that I almost never type pip, you know, Python dash MV.
08:19 Like I, unless I'm doing like some presentation where I'm not sure that people would know what the X going on.
08:25 So I'll just type V in V and that will do the magic or want to activate environments, AE, or, you know, I want to install the requirements.
08:32 I'll say PR, right.
08:33 And I rewrote all of those to move from using pip to using UV.
08:37 And it's basically like the same workflow for me, just better.
08:40 Well, the, one of the things that I do a lot is to just see what's in my virtual environment is do a pip list.
08:47 and that's not supported yet either, but freezes and list is coming.
08:53 I, you know, but so just use free.
08:56 I didn't actually just, for some reason, I think there's like a 50, 50 split of people that use generally pip freeze over lists.
09:03 What are you a freeze person or a list person?
09:05 I'm a list person these days.
09:07 but, but that's because, yeah, because I don't use pip freeze to generate like the requirements.txt.
09:13 I use pip compile.
09:15 Right.
09:15 Right.
09:16 Right.
09:16 But pip freeze will just like list out which, what things you have installed in what versions.
09:20 Yeah.
09:21 Yeah.
09:21 And that's what I want list for.
09:23 So I don't know why I use list.
09:24 But anyway.
09:25 Yeah, that's true.
09:26 Pretty fun.
09:27 Yeah.
09:27 Okay.
09:28 A couple of pieces of real time follow up.
09:31 First of all, Ofec Lev from Hatch says, the next minor release of Hatch will have an option to use UV under the hood instead of pip and virtual ENV.
09:39 Hooray.
09:40 Yeah.
09:41 I love Hatch.
09:41 I've been doing like doing a lot of stuff with Hatch lately and it's really, really nice.
09:45 So Ofec, you're killing it.
09:46 Keep it up.
09:47 Very nice.
09:47 And you, you mentioned talks.
09:50 Henry Schreiner, who I see some comments from him out there as well, says with the NOX back in, using UV and the NOX back in, it drops the time taken to build the docks from 22 seconds to four seconds.
10:04 So, you know, that's, you know, it's not like 22 seconds is going to change the world.
10:09 Like, oh, if they just didn't take 22 seconds to build the docks.
10:12 But the faster these things get, the more willing you're just like to do them more iteratively and, you know, get tight in that feedback loop and stuff like that.
10:20 So like, for example, with rough, you know, and PyCharm, now you can just check the box, like run, run rough onto the end of this project.
10:29 When I hit save, you know, if it took five seconds to do that, you would never check that.
10:32 That would not even be a box you could check, right?
10:34 Yeah.
10:35 Because it's so fast.
10:37 So hopefully I'm not missing anything else from folks out there.
10:40 But this stuff is really neat.
10:42 And I am super excited.
10:43 I would love if some of the things they learned from this could be brought back into standard pip just to make standard pip faster, too.
10:50 That would still be cool.
10:51 Yeah.
10:51 And I guess that brings up a side question is really how much energy there's going to be around supporting the other tools that are getting replaced by things that Astral's building.
11:04 But there's a, yeah.
11:06 Anyway, we'll have that conversation later, maybe.
11:10 Yeah.
11:10 OPEC agrees with you that much of the speed up comes to the way they're doing caching.
11:14 Very, very nice.
11:15 So, you know, people check this out.
11:17 It's been a few days and it's, things are going fast in this space.
11:20 So.
11:20 Yeah.
11:21 Very, very exciting.
11:23 Let's go on to the next topic.
11:24 All right.
11:25 Brian, Jupyter Notebooks have definitely taken over as a really interesting way for creating, writing Python code, visualizing Python code, sharing it, communicating with it.
11:36 And obviously, Will McGugan's work with Rich and then on from there, Textual is doing amazing stuff, too, right?
11:44 Yeah.
11:45 What if those came together, like peanut butter and jelly or whatever it is that you put together that goes together well?
11:50 Peanut butter and chocolate, man.
11:52 Yes.
11:53 Okay.
11:53 Sorry.
11:53 Reese's Pieces.
11:54 I got it.
11:54 Okay.
11:55 David Brochart says, I just published my first blog post, which is, we go over here, JP Term.
12:04 Jupyter in the Terminal built on textual and rich.
12:08 How cool is that?
12:08 That's great.
12:09 Yeah.
12:09 There's a bunch of terminal fun stuff that's based on textual and other things that we could cover.
12:17 But this is what I'm covering today.
12:18 I'll save the other for next time.
12:20 So Jupyter in the Terminal.
12:21 And it says, well, you know, basically, David says, look, the Terminal is the new browser in the sense that we all have a terminal.
12:29 And if we write to this, it's kind of a simple, cool UI that everybody already has.
12:34 You can just plug stuff into it largely because of all the work that they've done over at Textualize with textual and rich and so on.
12:42 All right.
12:42 So he said, look, look at all these widgets we already have.
12:45 So there's a select widget and there's a whole bunch of others.
12:49 But if we view this, I'll open a new tab.
12:52 Maybe open image in a new tab.
12:55 Oh, it's downloading.
12:57 Hold on.
12:57 Because of course it is.
12:58 Open this up.
13:01 It's Jupyter Lab side by side with JP Term.
13:05 And check it out.
13:06 It's like you've got your cells, you've got your in your bracket and quite similar, huh?
13:10 What do you think about this?
13:11 That's incredible.
13:12 That's pretty cool.
13:13 Yeah.
13:14 So it's got, let me go back to the article here.
13:18 You go down, it's got graphing.
13:19 It's got like charts for it.
13:22 And he says basically one of the real similar things to compare it to might be Jupyter Lite.
13:27 Because Jupyter Lite is a WebAssembly based all front end Jupyter.
13:31 And this is like client doesn't even need a server, right?
13:34 Because it just runs.
13:35 Although he does point out with textual web is a way to put this on the internet and share it as well.
13:42 But like here, look, here's a bunch of cool graphs over time in the terminal.
13:46 Yeah.
13:47 So this is a super early, almost a proof of concept.
13:50 It even has images, which is interesting.
13:53 So I think people should do that.
13:54 They're bad.
13:55 Yeah.
13:55 Like you want, if you long for like Commodore 64 days, you got something in store for you.
14:02 But you can see it's quite new.
14:05 It's been created like four months ago and just announced, I think, pretty recently.
14:10 So people go check this out.
14:13 David is, I think, a Jupyter Core Dev or at least a contributor over there.
14:19 So yeah, interesting to see where this goes.
14:22 Yeah.
14:22 Yeah.
14:22 Let's see.
14:23 Cool.
14:23 You know what else is cool?
14:24 Our sponsor?
14:25 Yes.
14:26 Indeed.
14:27 Indeed, they are.
14:28 So let me tell you real quick about Doubt APM.
14:32 They're big supporters of Python Bytes.
14:34 So we appreciate that very much.
14:36 So if you are tired of spending hours trying to find the root cause of issues impacting your
14:42 performance, then you owe it to yourself to check out Scout APM.
14:45 They're a leading Python application performance monitoring tool, APM, that helps you identify
14:51 and solve performance abnormalities faster and easier.
14:54 Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and
14:59 the dreaded N plus one queries that you can end up if you do lazy loading in your ORM.
15:05 And then you say, oh, no.
15:06 Why is it so slow?
15:07 Why are you doing 200 database queries for what should be one?
15:09 So you can find out things like that.
15:11 And it links it back directly to source code so you can spend less time in the debugger and
15:15 healing logs and just finding the problems and moving on.
15:18 And you'll love it because it's built for developers by developers.
15:21 It makes it easy to get set up.
15:23 Seriously, you can do it in less than four minutes.
15:25 So that's awesome.
15:26 And the best part is the pricing is straightforward.
15:29 You only pay for the data that you use with no hidden overage fees or per seat pricing.
15:35 And I just learned this, Brian.
15:37 They also have, they provide the pro version for free to all open source projects.
15:42 So if you're an open source maintainer and you want to have Scout APM for that project,
15:47 just shoot them a message or something on their pricing page about that.
15:50 So you can start your free trial and get instant insights today.
15:54 Visit by thembytes.fm slash Scout.
15:56 The link is in your podcast player show notes as well.
15:58 And please use that link.
16:00 Don't just search for them because otherwise they don't think you came from us.
16:04 And then they'd stop supporting the show.
16:05 So please use our link, Python by set.fm slash Scout.
16:08 Check them out.
16:09 It really supports the show.
16:11 Awesome.
16:11 Yeah.
16:12 All right.
16:12 Over to you.
16:13 What's next?
16:14 I've got a little, little topic.
16:16 Martin Hines wrote a blog post called everything, everything you can do with the Python's text wrap
16:23 module.
16:24 And I love the text wrap module.
16:26 And I think that more people, I think a lot of people just forget about it.
16:29 But it's very useful.
16:30 Brian, do you have that feeling where like you spent half a day implementing some algorithm
16:34 then you're like, oh, that was a function I could have just called?
16:36 Yeah, exactly.
16:37 Text wrap is that.
16:39 Yeah.
16:40 There's an, you know, every time I come back to it, I'm like, oh, I'm still using stuff
16:44 that I shouldn't.
16:45 So it's a pretty short article.
16:48 Go through a few of the features of text wrap.
16:50 First off, it's shorten.
16:52 So if you've got it, if you want to make a piece of text shorter, you can use shorten.
16:59 And it's cool because it also does a placeholder thing.
17:01 So it'll put like dot, dot, dots and brackets or something or whatever placeholder you want
17:07 to say there's more text there.
17:09 It's just we've cut it off.
17:11 And it looks really nice.
17:13 Easy to use.
17:15 You just call it.
17:16 It's just a function.
17:17 Then there's wrap, which seems obvious, but can do word wrapping.
17:23 So you can split a long chunk of text into multiple lines.
17:27 But you can also do it.
17:28 One of the things I like here is this is said, well, yes, of course, you can use it for splitting
17:35 long lines into different multiple lines.
17:38 But also, even if you're not going to print it like that, it's very useful if you're going
17:43 to batch that batch work on text, you can split a big chunk of text into small or even
17:51 sized batches to work on those.
17:53 That's a pretty cool use case for that.
17:55 I like it.
17:56 There is there's even you can specify drop white white space keyword for that.
18:01 That's pretty cool.
18:02 I didn't know about that.
18:03 Neat.
18:03 The there is a there's a class also.
18:06 So a lot of the stuff you can do with text wrap, you can do within a an object.
18:12 So there's a text wrapper class that you can create a text wrapper object and do a whole
18:16 bunch of work with that multiple times and only specify it once in the constructor.
18:21 Very cool.
18:22 And then at the bottom, last but not least, is my favorite use of text wrap is T dent.
18:27 So T dent will take like if you've got a multiline string and it's in your code.
18:35 So it's all like off it, you know, it's indented with the rest of your code.
18:39 That multiline will have a whole bunch of extra like extra white space on the left.
18:43 And you don't really want that when you're actually using it.
18:47 And D dent will take out those extra extra left white space.
18:52 And that I love that.
18:53 And this seems like it's a weird thing to have built in.
18:57 But I use it a whole bunch of times, often in writing tests because I've got a multiline
19:03 string that I want to compare to some output.
19:05 And I don't want it at the global level.
19:07 I want it, you know, in my in my test function.
19:11 So I can just do that and use D dent to get it back to.
19:14 Right.
19:15 Because it would look weird.
19:16 Left aligned inside of an indented function.
19:18 Right.
19:19 Yeah.
19:19 So, I mean, you can.
19:21 It just looks ugly.
19:23 So, yeah, you just you lose the flow of where where it belongs.
19:26 Yeah.
19:27 Yeah.
19:27 So text wrap.
19:29 It's there.
19:30 It's fun.
19:30 Use it.
19:31 You already have it.
19:32 It's in Python.
19:32 Yeah.
19:33 Yeah.
19:33 Very nice.
19:34 All right.
19:34 Let's.
19:35 Let's talk about some design principles for the web here.
19:39 This is not exactly Python, but it certainly links back to some cool things in Python.
19:44 And it's this place I ran across called HTML dash burst dot com.
19:49 Right.
19:49 And the idea is there seems to be some fatigue.
19:53 Like, you know, JavaScript, it used to be so easy.
19:55 You would include a script or if you were doing something super small, you maybe just say script
20:00 tag and you would write a bit of JavaScript right in the page and then you carry on.
20:04 You're like, oh, that was easy.
20:05 Look, that just worked.
20:05 And then it said, oh, well, now we're going to put it over on this other place.
20:10 No, we want to like minify it.
20:11 Also, we're going to shake it down to only include the parts that we use.
20:14 And we'll do the same for the CSS.
20:16 And then you need this build step.
20:18 And then we're going to compile it from TypeScript to JavaScript and then shake it down to not include
20:23 this.
20:23 And then you're going to include it with import, export it with node.
20:28 You're just like, what is why is this so hard?
20:30 Why are there so many steps to this thing that used to be so easy?
20:34 Right.
20:34 And so this is kind of like, can we just not have that as like the default way of working
20:39 already?
20:40 So HTML, we'll get to HTML.
20:43 HTML first is a set of guidelines for making it easier, faster, and more maintainable to
20:49 build web software by leveraging the default capabilities of modern browsers.
20:53 I learned something I didn't know from here that I used to do with JavaScript that I will
20:56 never do again if I don't have to.
20:58 So awesome.
20:58 And then the extreme simplicity of HTML's attribute syntax and keeping your Vue source alive.
21:05 Right.
21:05 You used to be able to go to the website.
21:06 How did they do that?
21:07 That's cool.
21:07 Vue source.
21:08 Now it's just like one tiny line of like a bunch of stuff that triggers JavaScript stuff.
21:12 You're like, oh, well, all right.
21:13 Or how did they do that?
21:15 Oh, it's a bunch of divs.
21:16 Yes, exactly.
21:17 And so the goal is, you know, try to widen the pool of people who enjoy web development.
21:24 Also, you can make it less expensive for your company because it's just less complex.
21:29 So it's not just, you know, dev yells at the cloud because people are making it hard, right?
21:36 Screams it into the sky, but some practices, right?
21:39 So there's some examples.
21:40 Prefer vanilla approaches.
21:42 And so, for example, did you know, you could say details, summary, and then stuff below it.
21:48 And if you click the summary, it'll expand the thing below it.
21:51 No JavaScript.
21:52 I didn't either.
21:53 No JavaScript?
21:54 Yeah.
21:54 Wow.
21:55 Yeah.
21:55 How about that?
21:56 And then, so they have encouraged versus discouraged.
22:00 And here's like import React, user state from React, create a details component, which is an arrow function, which returns a const of things and toggling the content.
22:11 And then you on click, you like link, like what?
22:13 Then you export the detail.
22:15 This is the import export I was railing against, right?
22:17 So that's one.
22:18 Prefer just, if you can do it as basic HTML or even basic JavaScript, like don't go over the top.
22:24 And where possible, practice too.
22:26 Where possible, define, default to defining styles and behaviors with inline attributes with things like tailwind or tachyons.
22:34 And you can use libraries like Hyperscript and Alpine.
22:36 And it says your, yes, it does mean your HTML gets a little bit busier, but you don't have to go to three places to figure out what's happening.
22:43 Okay.
22:44 So, for example, it says encouraged button on click, this.classlist.add background green.
22:49 Okay.
22:50 Discouraged.
22:51 You have a results pane that says click me.
22:53 And then you have a CSS section that actually what happens when you do that changes the color to green.
22:58 Then you have some JavaScript that gets it.
22:59 And then when it's done, you set the class, which then goes back to CSS.
23:04 And these are usually mushed all over the place.
23:06 And you're like, what is happening, right?
23:07 Yeah.
23:08 And it says, you'll notice the separation of concerns is kind of not so much awesome here.
23:14 However, you should maybe consider the locality of behavior more than you should worry about separation concerns.
23:20 And HTMX, Carson Gross has a nice essay on this.
23:24 Like, yes, you might repeat yourself sometimes, but right there, you see everything that's happening instead of having it so spread out, right?
23:30 Yeah.
23:30 All right.
23:32 Next.
23:32 Go ahead, Brian.
23:33 I just wanted to comment.
23:34 One of the things that I like about this sort of model is that I'm learning.
23:39 I'm frequently learning like new web frameworks.
23:42 I'm working on learning Django and, you know, FastAPI and others.
23:47 And a lot of times it's templating that I'm working on.
23:50 And to understand how it's going to get output, keeping the templates simple in like mostly HTML helps with discoverability and learning something new.
24:02 So even if it isn't like a production thing later, but it might be, starting out simple really helps the learning process.
24:11 Yeah.
24:11 Oh, absolutely.
24:12 And you also have to learn fewer things, right?
24:14 Yeah.
24:14 You have to learn three other frameworks and build tools and so on.
24:17 All right.
24:17 Another one is about try to use libraries.
24:21 If you've got these libraries, trying to use ones that leverage HTML attributes over JavaScript and custom attributes like HTMX is a real nice example of that.
24:29 To say disfavor build steps.
24:31 So encourage the ability to just say stylesheet slash styles slash, you know, it's slash styles.css.
24:39 Discourage, distribute, output, NPX, CSS, compile with a watch.
24:43 And then don't forget to run that.
24:45 And then why is this not updating?
24:46 You know, all these different things.
24:47 And then finally, this one, I think the HTMX is really relevant to Python folks, but also this one.
24:54 Their example is Ruby, but it just as well could be any, the WTF forms.
25:00 Is that what it is?
25:00 I think it is.
25:01 The form builder type stuff.
25:03 You see a lot of that actually in Django.
25:04 It says prefer naked HTML to obfuscation layers that compile down to HTML.
25:09 So, you know, just, you got a form.
25:11 Just write the form.
25:12 Put the values in it.
25:13 Instead of, you know, form with and then form like label for this.
25:17 Form text field for that part of the model and so on, right?
25:21 So, anyway.
25:22 And finally, preserve some view source for us all because it'll help everyone.
25:26 But, anyway, I like this and I, you know, it's interesting to think of as a philosophy.
25:32 Yeah.
25:32 The build steps, they also reference like a whole bunch of people.
25:35 How it used to be completely like, oh, you're such a noob if you want to skip having like
25:40 a bunch of build tools along the way.
25:42 But references four different articles and places where people are writing about like,
25:46 you know what?
25:47 We're done with this build stuff.
25:48 We're just writing CSS.
25:49 We're just writing JavaScript.
25:50 We're going to go with that.
25:51 So, anyway, pretty well backed up some of these ideas.
25:54 Nice.
25:55 And that's all of our main items.
25:57 You can see there are tabs left for me.
25:59 So, that means I must have extras.
26:00 But what about you?
26:01 I do have extras.
26:02 Do you want to go through yours since they're up?
26:04 Or do you want to?
26:04 Sure.
26:05 Let's do it.
26:05 All right.
26:06 So, first of all, Vincent Warmerdom says, hey, a new PyData location, Pittsburgh.
26:12 So, there's a call for proposals at PyData Pittsburgh.
26:17 Let's see.
26:18 When is it?
26:18 Hopefully, it's not over.
26:19 So, yeah.
26:20 So, if you want to speak.
26:22 If you're in the general Pittsburgh area or you want to be, then check out PyData Pittsburgh and go submit some talks there.
26:29 Let's see when this is going to be.
26:31 Surely.
26:31 April.
26:32 Okay.
26:33 April 11th, I guess.
26:33 Anyway.
26:34 Check it out.
26:35 And you can submit a talk there.
26:37 That's pretty cool.
26:37 I just want to bring out one more example.
26:40 You know, I, Brian, I riff on, or I rip on the ad space.
26:47 And I say, look, we should run ad blockers.
26:49 We should not support these people.
26:51 And I know some folks are out there like, well, but then you're not supporting creators.
26:55 You're not supporting the small folks who have Google ads on their site or whatever.
27:00 And I don't know.
27:01 I just, I think the tradeoff is not really worth it.
27:04 So, I just want to point out one more example of, like, terrible stuff that's happening.
27:07 So, our own Oregon Senator Ron Wyden started an investigation because a data broker who gets data from, you know, all these different sources, like ad retargeting stuff, used abortion clinic visitor location data because their endpoints were not blocked by some sort of DNS block or something.
27:29 Wow.
27:29 To help send targeted misinformation to vulnerable women.
27:33 How terrible, right?
27:34 Yeah.
27:34 Awful.
27:36 I think we all should just stand up to, stand up to the, like, the retargeting remark.
27:42 Like, we don't have to.
27:43 That has nothing to do with trying to make money for content creators.
27:47 Yeah, I know.
27:49 Except for that, the data flows into these shady places, right?
27:52 And then they, then, you know, they already have it.
27:55 So, instead of trying to sell them shoes, like, let's, let's do something terrible like that.
27:59 So, yeah.
28:00 All right.
28:00 Anyway, next DNS.io, folks.
28:03 Okay.
28:03 Call for Proposals is also open for a very close nearby, SciPy 2024, which is awesome.
28:12 This will be in Tacoma, Brian.
28:14 Just a short hop and a skip up I-5 north from us.
28:18 That'd be fun.
28:19 Yeah.
28:19 So, July 8th to 14th.
28:21 I wish I could make it, but I am already tied up hanging around the house.
28:27 My wife is traveling for work at that time.
28:30 And somebody has to stay with the dog and the kid.
28:32 So, I'm not going to this.
28:34 I have a feeling that's the same time frame as Oregon Country Fair.
28:37 So, I probably can't either.
28:38 Yeah.
28:39 But anyway, there's a lot of people out there who can.
28:41 And a call for proposals are out.
28:44 But you must act.
28:45 You must act.
28:46 Soon, you have exactly seven days to get this, depending on when you listen.
28:51 But as I speak, you have about seven days to get your talk proposal in.
28:54 So, please go and do that.
28:56 So, over to you for your-
28:57 February 27th.
28:58 Is that end of time?
28:59 Okay.
28:59 Yes, thanks.
28:59 A handful of topics.
29:01 pytest 8.01, 8.0.1 is out.
29:07 And why is this important?
29:09 One, it's the first bug fix since 8.0 came out.
29:12 And it has the bug that bugged me.
29:15 So, there was a regression where parameterization would go backwards for some reason.
29:22 Yeah, we talked about that before.
29:24 That's cool.
29:25 So, that's fixed.
29:26 So, I've got it updated to 8.01 everywhere I'm using pytest.
29:31 Okay.
29:32 Next, if you'd like to understand dependency injection, Hinnick has a new video out.
29:40 Loose coupling and dependency injection, the easy way.
29:44 And I really like the dude.
29:47 And I like what he's doing up on YouTube.
29:48 So, that's fun.
29:50 Plus, dependency injection is not as complicated as it sounds.
29:54 And he'll show you.
29:56 But I freaked out the first time that people were like, oh, fixtures, they're kind of like
30:01 dependency injection.
30:02 I'm like, I don't know what you're talking about.
30:03 They are kind of like dependency injection, indeed.
30:05 Yeah.
30:07 I had a guest, Nicole, on Python test recently.
30:12 This hasn't been aired yet.
30:13 But when we were talking about something completely different, and I mentioned all of the Rust that's
30:19 coming into the Python community.
30:21 And I said, but I mean, I want to try to learn Rust.
30:25 But I don't have a lot of time.
30:27 And she said, oh, we had the same problem at work.
30:30 So, I wrote a tutorial.
30:31 So, there's yar.fyi.
30:33 Yar is yet another Rust resource.
30:36 But the idea...
30:38 Pirate-friendly.
30:39 Yeah.
30:39 Pirate-friendly.
30:40 It's a Rust tutorial.
30:44 But intended for people that already know how to program.
30:48 They just don't know Rust.
30:49 And so, I'm excited to jump into that.
30:52 Okay.
30:53 What else?
30:54 Oh, yeah.
30:55 I'm looking for trying to ramp up interviews for Python people.
30:58 So, if there's just some interesting stuff around the Python community that you'd like me to talk to,
31:04 or if you'd like me to talk to you, reach out.
31:07 And the first episode was Michael Kennedy.
31:10 It was a good episode.
31:11 There's only been 12 episodes so far, but I want to get more out.
31:16 And the last thing I wanted to know, there's an interesting thing, phenomenon out there.
31:23 Did you know that there's people still using X?
31:26 Yes.
31:27 I've seen them.
31:29 There are many of them over there, actually.
31:30 I am officially following zero people just as a protest.
31:37 I don't really...
31:39 I show up there about once a month to check my direct messages.
31:43 So, if you want to contact me, I will probably reply to you eventually.
31:48 But just warning, I'm not there very often.
31:50 Indeed.
31:51 Indeed.
31:51 Awesome.
31:52 Well, a bunch of great items.
31:54 How about we talk about some unfortunate architectural or vendor-based decisions as part of our joke here.
32:01 Are you ready?
32:02 Have you seen this joke?
32:02 Did you look ahead?
32:03 I have not looked ahead.
32:04 I don't know what you're talking about.
32:05 Beautiful.
32:06 All right.
32:06 You ready?
32:07 Yeah.
32:07 Do the joke.
32:08 So, here we are.
32:09 I got this over on Reddit.
32:12 And, of course, I zoomed it in.
32:14 So, why are we using SAP again when there's this open source thing that is so much simpler?
32:20 Or why are we using Oracle again for this?
32:22 Because whatever.
32:23 So, there's an angry team lead or something.
32:26 Why did we end up with a solution?
32:28 A couple people are like, cool savings?
32:29 Time savings, maybe.
32:31 And then someone, like a hipster-looking dude in the back is like, the vendor sent me a Yeti Tumblr.
32:36 So, they grab him and throw him out the window.
32:39 Why are we stuck with this crappy system that is like whatever?
32:43 Well, it's conference swag, basically.
32:46 Yeah.
32:47 I think the real answer is usually the best options were all free.
32:53 And we needed to have to pay somebody.
32:56 Yeah, that's true.
32:58 That's true.
32:59 Well, none of them had an SLA.
33:01 Do you have a Yeti Tumblr?
33:03 I have one of these, like, soft Yeti hoolers that we'll take when we go out camping or boating or something.
33:11 But I don't have a Tumblr.
33:12 No, I don't believe so.
33:13 You?
33:13 I had to look it up.
33:14 I didn't even know what this was.
33:16 Oh, yeah.
33:17 Yeti is like the Rolls Royce of, like, hillbilly land, I guess.
33:25 They're like super, super nice coolers.
33:29 If you want a thermos for your coffee, but you don't want to spend $10, you want to spend $40, get a Yeti.
33:35 Yeah.
33:36 Yeah.
33:36 I'm like, we have a lot of Yeti stuff, actually.
33:38 It's really nice.
33:39 I'm just joking.
33:40 Fouji.
33:41 What if stuff got warm, Brian?
33:44 What if it got warm?
33:45 What if your beer got a little bit warm?
33:47 And your mountains and your cores, they weren't blue anymore.
33:50 They turned whatever color they're not when they're not blue.
33:52 Whatever color they are when they're not blue.
33:54 You know what I'm talking about?
33:56 Like, one of the cores of beer cans has a can that when it's like a certain temperature, the mountains on the can turn blue.
34:02 And if it's like too warm, they like turn white or something.
34:04 I don't know what other color.
34:05 Okay.
34:06 So we had a couple options.
34:08 We could have made better beer or a better can.
34:10 We chose a better can.
34:12 What do you see when you're shopping?
34:13 Come on now.
34:14 Awesome.
34:16 Yeah.
34:17 Okay.
34:18 Yeah.
34:18 Fun as always.
34:19 Thank you for being here.
34:20 And thank you, everyone, for listening.