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
00:03 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/live,
00:32 crushing the bell, saying get notified.
00:35 They got notified when this comes on, when it's scheduled.
00:37 And here they are.
00:39 For those of you who are just listening, we super appreciate that anyway.
00:42 So, however you're listening, thank you, thank you.
00:44 Connect with us over on Mastodon, we're on Fossodon, @brianocken, @mkennedy,
00:49 and @pythonbytes.
00:51 Brian, before we jump into the news, and before I forget, I just wanna make a quick announcement.
00:56 I will be at PyCon Philippines starting, I leave tomorrow at, I fly from Portland to San Francisco
01:04 at 8 p.m., and then I leave San Francisco at midnight.
01:07 So who knows what state I'm gonna be in, but I'm pretty sure with the time zone change
01:12 and the travels and all this, there's not gonna be a Python Bytes next week.
01:15 So we're gonna be probably skipping next week, which is a good chance for people to catch up
01:19 if they fell behind.
01:21 - Yeah, and also I'm jealous, and I hope you have a great time.
01:24 - Thank you very much.
01:25 I'm gonna have a great time.
01:26 I worked, was writing the keynote speech yesterday, and it's gonna 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:39 Like I wanna be prepared, and I'm the kind of person that would get prepared
01:42 a month or two months early, but then if I write the stuff and then put it away
01:46 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 wanna write it too soon, but I also don't wanna wait 'til the last minute.
01:53 So there's this weird trade-off, I feel.
01:56 I, mostly I try, I usually try to cover too much stuff in talks, so I try to narrow it down.
02:02 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,
02:10 and that goes terribly.
02:11 So I, yeah, I like to do it early in practice.
02:15 - All right, well, over to you.
02:17 I know you have a big announcement.
02:19 - Yeah. - I heard you're coming in first.
02:21 Yeah, you are, okay.
02:22 - Am I first?
02:23 Yeah.
02:24 I'm pretty excited.
02:25 The folks at Astral, including Charlie Marsh and others, have released UV, a Python packaging,
02:34 it's Python packaging in Rust, and it's not another packaging tool.
02:40 It is the Python end.
02:42 So like replacing, this is actually incredible.
02:46 It's replacing Pip, 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,
03:01 comprehensive Python project and package manager that's fast, reliable, and easy to use.
03:07 They're also kind of, it's interesting, combined in this announcement is that they're taking,
03:13 Astral is taking stewardship of Armin Roenicker'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, it's interesting.
03:22 But have you given this a try yet?
03:26 - Oh, yes.
03:27 I am so psyched about this.
03:29 Charlie and team, congratulations, 'cause this is setting the world on fire
03:33 in a lot of interesting ways.
03:35 So I, you know, Charlie aimed this right at like my style of programming and working with Python dependencies
03:44 and projects.
03:45 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
03:56 that kind of manages everything.
03:58 And I want some of the benefits of that, but I want it to be just a simple requirement.txt
04:03 or something like that in the end, right?
04:05 - Yeah.
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, but you know, the command pip compile, like for mine, I don't know how long it takes,
04:19 probably 15 seconds to pip compile, update the list of things for Talk Python Training.
04:25 I think there's 250 dependencies in the dev version.
04:29 It's out of control.
04:30 And it just takes a real, real long time with this instant.
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, right?
04:46 Those are different types.
04:47 It's, it just happens versus you, like, okay, hold on, 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,
04:58 it's not necessarily that it's just because it's written in rough, rough, rust,
05:04 reading rough as I'm saying that, not just that it's written in rust, which it happens to be,
05:08 'cause that's the vibe of Astral, right?
05:11 Starting with the rough stuff, but that they've maybe unlocked some different algorithms
05:17 or techniques or something like that, where even if it were in Python, it would be faster,
05:21 which is pretty interesting.
05:22 - Yeah, there's some caching that they've done and of like site-wide caching and keeping,
05:28 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 gonna want it in each virtual environment, so having it installed outside is kind of interesting.
05:43 So yeah, I'm pretty, it's super fast.
05:47 The hope is to be API compatible or at least interface compatible.
05:54 It's in the, they just don't have all of the features yet.
05:58 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,
06:19 or two things that didn't work.
06:21 So I did, tried to use the --prompt to have virtualenv just create my virtual environment
06:28 with the same name and prompt isn't supported yet, but it is, I went to file a defect and it was already fixed.
06:34 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:40 - They're doing a lot of releases, aren't they?
06:41 - Yeah, there's been seven releases in four days.
06:44 It's incredible 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 'cause there's a bunch of issues people are working on.
06:54 It's really fun to watch.
06:55 The other thing was, oh, oh, so virtual environments work really fast.
07:01 It's like so fast.
07:03 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,
07:12 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 the rules are such
07:22 that you have to pick the right dependency so that it matches both tools.
07:26 That's all done and it's super fast.
07:28 I'm really impressed with how this thing is.
07:31 And apparently everybody else is too because almost immediately after the announcement.
07:39 So look at all these contributors.
07:40 We'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:48 So TOX has already announced that there is a TOX-UV plugin so that you can have TOX act faster too
07:58 and use UV for virtual and for pip also.
08:02 That makes it faster.
08:04 I think that's, and I'm sure there's more tools to come that support, will support UV out of the box.
08:10 - Yeah, awesome.
08:11 I'm super excited, but I have a bunch of aliases for my shell that I almost never type pip,
08:17 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
08:24 what the heck's going on.
08:25 So I'll just type VNV and that will do the magic or when activated environments AE
08:30 or, you know, I want to install the requirements, I'll say PR, right.
08:33 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, one of the things that I do a lot is to just see what's in my virtual environment
08:45 is do a pip list.
08:48 And that's not supported yet either.
08:49 But freeze is, and list is coming.
08:53 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
09:01 that use generally pip freeze over lists.
09:04 What are you a freeze person or a list person?
09:06 - I'm a list person these days, but that's because, yeah, because I don't use pip freeze to generate
09:12 like the requirements.txt, I use pip compile.
09:15 - Right, but pip freeze will just like list out which, what things you have installed and what versions.
09:21 - Yeah, yeah.
09:21 - And that's what I want list for.
09:23 So I don't know why I use list, but anyway.
09:26 - Yeah, that's true.
09:27 - Pretty fun.
09:27 - Yeah, okay, a couple of pieces of real-time follow-up.
09:31 First of all, Ofek Lev from Hatch says, "The next minor release of Hatch will have an option
09:36 "to use UV under the hood instead of pip and virtual ENV." Hooray!
09:40 - Yeah.
09:41 - I love Hatch, I've been doing like, doing a lot of stuff with Hatch lately
09:44 and it's really, really nice.
09:45 So Ofek, you're killing it, keep it up, very nice.
09:48 And you mentioned talks, Henry Schreiner, who I see some comments from him out there as well,
09:54 says, "With the Knox back-in, using UV in the Knox back-in, "it drops the time taken to build the docs
10:02 "from 22 seconds to four seconds." So, you know, that's, you know, it's not like 22 seconds is gonna change the world at all
10:10 if they just didn't take 22 seconds to build the docs.
10:13 But the faster these things get, the more willing you're just like, to do them more iteratively and, you know,
10:18 get tight in that feedback loop and stuff like that.
10:20 So, like for example, with Ruff, you know, and PyCharm, now you can just check the box, like,
10:26 run Ruff onto this project when I hit save.
10:30 You know, if it took five seconds to do that, you would never check that.
10:33 That would not even be a box you could check, right?
10:35 - Yeah.
10:35 - But, because it's so fast.
10:37 So, hopefully I'm not missing anything else from folks out there, but this stuff is,
10:41 this stuff's really neat 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,
10:49 just to make standard pip faster too, that would still be cool.
10:51 - Yeah, and this, I guess that brings up a side question, is really how much energy there's gonna be around
10:59 supporting the other tools that are getting replaced by things that Astral's building.
11:04 But there's, yeah, anyway, we'll have that conversation later maybe.
11:08 (laughs)
11:10 - Yeah, Opec agrees with you that much of the speed up comes from 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, so.
11:21 - Yeah. - Very, very exciting.
11:22 Let's go on to the next topic.
11:25 All right, Brian, Jupyter Notebooks have definitely taken over as a really interesting way
11:31 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
11:42 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
11:49 that you put together that goes together well?
11:51 - So David-- - Peanut butter and chocolate, man.
11:52 - Yes, okay, sorry, Reese's Pieces, 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." - Yeah, baby. - How cool is that?
12:09 - That's great. - Yeah, that's.
12:11 There's a bunch of terminal fun stuff that's based on this, 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, and it says, well, basically David says, "Look, the terminal is the new browser
12:26 "in the sense that we all have a terminal, "and if we write to this, it's kind of a simple,
12:32 "cool UI that everybody already has, "so you can just plug stuff into it,
12:36 "largely because of all the work "that they've done over at Textualize "with Textual and Rich and so on."
12:42 All right, so he said, "Look at all these widgets we already have." So there's a select widget,
12:47 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:56 Oh, it's downloading, hold on, because of course it is.
12:58 Open this up.
13:01 It's JupyterLab side-by-side with jpterm.
13:05 And check it out.
13:06 It's like you've got your cells, you've got your in-unit bracket, and quite similar, huh?
13:10 What do you think about this?
13:11 - That's incredible.
13:13 That's pretty cool.
13:13 - Yeah, so it's got, let me go back to the article here.
13:18 If you go down, it's got graphing.
13:20 It's got charts for it.
13:22 And he says basically one of the real similar things to compare it to might be JupyterLite,
13:27 because JupyterLite is a WebAssembly-based all front-end Jupyter, and this is client,
13:33 doesn't even need a server, right, because it just runs.
13:35 Although he does point out with Textual Web, realized, is a way to put this on the internet
13:42 and share it as well.
13:42 But here, look, here's a bunch of cool graphs over time in the terminal.
13:47 So this is a super early, almost a proof of concept, even has images, which is interesting.
13:52 (David laughs)
13:53 - That's terrible, though, don't do that.
13:55 - They're bad, yeah.
13:56 Like, if you long for like Commodore 64 days, you got something in store for you.
14:03 But you can see it's quite new.
14:06 It's just been created like four months ago and just announced, I think, pretty recently.
14:11 So people go check this out.
14:14 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, let's see, cool.
14:24 You know what else is cool?
14:25 - Our sponsor.
14:26 - Yes.
14:27 - Indeed, indeed they are.
14:29 So let me tell you real quick about Doubt APM.
14:33 They're big supporters of Python Bytes, so we appreciate that very much.
14:36 So if you are tired of spending hours trying to find the root cause of issues
14:41 impacting your 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 and solve
14:52 performance abnormalities faster and easier.
14:54 Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs,
14:59 and the dreaded N+1 queries that you can end up if you do lazy loading in your ORM,
15:05 and then you say, "Oh no, why is it so slow?
15:07 "Why are you doing 200 database queries "for what should be one?" 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
15:15 and healing logs and just finding the problems and moving on.
15:19 And you'll love it because it's built for developers by developers.
15:22 It makes it easy to get set up.
15:23 Seriously, you can do it in less than four minutes, so that's awesome.
15:27 And the best part is the pricing is straightforward.
15:30 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, they also have, they provide the pro version for free
15:41 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 pythonbytes.fm/scout.
15:57 The link is in your podcast player show notes as well.
15:59 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:06 So please use our link, pythonbytes.fm/scout.
16:08 Check them out.
16:09 It really supports the show.
16:11 - Awesome.
16:12 - Yeah.
16:13 All right, over to you.
16:14 What's next?
16:15 - I've got a little topic.
16:16 Martin Hines wrote a blog post called Everything You Can Do with the Python's Text Wrap 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 - Yeah, Brian, do you have that feeling where like you've spent half a day
16:33 implementing some algorithm, then you're like, oh, that was a function I could have just called?
16:36 - Yeah, exactly.
16:38 Text Wrap is that.
16:39 Yeah.
16:39 And every time I come back to it, I'm like, oh, I'm still using stuff that I shouldn't.
16:45 So it's a pretty short article.
16:49 Go through a few of the features of Text Wrap.
16:51 First off, it's shortened.
16:52 So if you wanna 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 to say,
17:08 there's more text there.
17:10 It's just, we've cut it off.
17:11 And it looks really nice.
17:14 Easy to use.
17:15 You just call it.
17:16 It's just a function.
17:17 But 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, but you can also do it.
17:29 One of the things I like here is this is, said, well, yes, of course you can use it
17:35 for splitting long lines into different multiple lines, but also even if you're not gonna print it like that,
17:41 it's very useful if you're gonna batch work on text, you can split a big chunk of text into small
17:50 or even size 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 whitespace keyword for that.
18:01 That's pretty cool.
18:02 I didn't know about that.
18:03 Neat.
18:04 There's a class also.
18:06 So a lot of the stuff you can do with TextWrap, you can do within an object.
18:12 So there's a TextWrapper class that you can create a TextWrapper object and do a whole bunch of work with that multiple times
18:19 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 TextWrap is ddent.
18:28 So ddent will take, like, if you've got a multi-line string and it's in your code,
18:35 so it's all like off, you know, it's indented with the rest of your code,
18:40 that multi-line will have a whole bunch of extra, like, extra whitespace on the left,
18:44 and you don't really want that when you're actually using it.
18:47 And ddent will take out those extra left whitespace.
18:52 And that, I love that.
18:53 And this seems like a weird thing to have built in, but I use it a whole bunch of times,
19:00 often in writing tests, because I've got a multi-line string that I wanna compare to some output,
19:06 and I don't want it at the global level, I want it, you know, in my test function.
19:11 So I can just do that and use ddent to get it back to.
19:15 - Right, 'cause it would look weird, left-aligned inside of an indented function, right?
19:19 - Yeah.
19:20 So, I mean, you can, it just looks ugly, so.
19:23 - Yeah, you just, you lose the flow of where it belongs.
19:26 Yeah. - Yeah.
19:27 So TextWrap, it's there, it's fun, use it.
19:31 - You already have it.
19:32 It's in Python.
19:33 - Yeah. - Yeah, very nice.
19:34 All right, 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:45 And it's this place I ran across called html-burst.com, right?
19:50 And the idea is, there seems to be some fatigue, like, you know how in JavaScript, it used to be so easy,
19:55 you would include a script, or if you were doing something super small, you maybe would just say script tag,
20:01 and you would write a bit of JavaScript right in the page, and then you'd carry on,
20:04 you're like, oh, that was easy, look, that just worked.
20:05 And then it said, oh, well, now we're gonna put it over on this other place, no, we wanna like minify it,
20:11 and also we're gonna 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, and then we're gonna compile it from TypeScript
20:20 to JavaScript, and then shake it down to not include this, like, what?
20:24 And then you're gonna, you know, include it with import, export it with node, you're just like, what is,
20:29 why is this so hard?
20:31 Why are there so many steps to this thing that used to be so easy, right?
20:34 And so this is kind of like, can we just not have that as like the default way of working already?
20:40 So HTML, we'll get to HTML, HTML first is a set of guidelines for making it easier, faster,
20:47 and more maintainable to 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
20:55 that I will never do again if I don't have to, so awesome.
20:59 And then the extreme simplicity of HTML's attribute syntax and, you know, keeping the view source alive, right?
21:05 Used to be able to go to the website, like, how did they do that?
21:07 That's cool, view source.
21:08 Now it's just like one tiny line of like a bunch of stuff that triggers JavaScript stuff, you know, like, oh, well.
21:13 - Or how did they do that?
21:15 Oh, it's a bunch of divs.
21:17 - Yes, exactly.
21:18 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:30 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, prefer vanilla approaches.
21:43 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:53 I didn't either.
21:53 - No JavaScript?
21:54 Wow.
21:55 - Yeah, how about that?
21:56 And then, so they have a encouraged versus discouraged.
22:00 And here's like import React, user state from React, create a details component, which is an arrow function,
22:06 which returns a constant of things and toggling the content.
22:11 And then you on click, you like, then you export the detail.
22:15 This is the import export I was railing against, right?
22:18 So that's one.
22:19 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 two.
22:26 Where possible, define, default to defining styles and behaviors with inline attributes,
22:31 with things like Tailwind or Tacheons.
22:34 And you can use libraries like Hyperscript and Alpine.
22:36 And it says you're, yes, it does mean your HTML gets a little bit busier,
22:40 but you don't have to go to three places to figure out what's happening.
22:44 So for example, it says encouraged, button on click, this.classlist.add background green.
22:50 Discouraged, 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,
22:57 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: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 Gores has a nice essay on this.
23:24 Like, yes, you might repeat yourself sometimes, but right there, you see everything that's happening
23:28 instead of having it so spread out, right?
23:30 - Yeah.
23:31 - All right, next, 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 frequently learning like new web frameworks.
23:41 Like I'm working on learning Django and, you know, FastAPI and others.
23:48 And a lot of times it's templating that I'm working on and to understand how it's gonna get output,
23:54 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
24:09 really helps the learning process.
24:11 - Yeah, oh, absolutely.
24:12 And you also have to learn fewer things, right?
24:14 - Yeah.
24:15 - You have to learn three other frameworks and build tools and so on.
24:17 - All right, another one is about try to use libraries.
24:21 If you gotta use libraries, try to use ones that leverage HTML attributes
24:24 over JavaScript and custom attributes.
24:26 Like HTMX is a real nice example of that.
24:30 To say disfavor build steps.
24:32 So encourage the ability to say stylesheet/styles.css.
24:37 Discourage, distribute, output, NPX, CSS, compile with a watch 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,
24:53 but also this one, their example is Ruby, but it just as well could be any,
24:58 the WTF forms, 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:05 It says prefer naked HTML to obfuscation layers that compile down to HTML.
25:09 So you know, just, you got a form, just write the form, put the values in it.
25:13 Instead of, you know, form with, and then form like label for this, form text field for that part of the model and so on.
25:20 Right?
25:21 So anyway, and finally preserve some, 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, how it used to be completely like,
25:38 oh, you're such a noob if you want to skip having like a bunch of build tools along the way,
25:42 but references for different articles and places where people are writing about like,
25:46 you know what, 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, pretty well backed up some of these ideas.
25:55 - 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, 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:05 - Sure, let's do it.
26:06 All right.
26:06 So first of all, Vincent Warmerdum says, hey, a new PI data location, Pittsburgh.
26:13 So there's a call for proposals at PI data, Pittsburgh.
26:17 Let's see, when is it?
26:18 Hopefully it's not over.
26:20 So yeah, so if you want to speak, if you're in the general Pittsburgh area,
26:24 or you want to be, then check out PI data, Pittsburgh and go submit some talks there.
26:29 It, let's see when this is going to be, shortly, April.
26:32 - Okay.
26:33 - April 11th, I guess.
26:34 Anyway, check it out and you can submit a talk there.
26:37 That's pretty cool.
26:38 Just want to bring out one more example.
26:40 You know, Ryan, I riff on, or I rip on the ad space and I say, look, we should run ad blockers.
26:49 We should not support these people.
26:52 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, I just, I think the trade-off 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 is starting an investigation because a data broker
27:14 who gets data from, you know, all these different sources like ad retargeting stuff,
27:20 used abortion clinic visitor location data because their endpoints were not blocked
27:26 by some sort of DNS block or something.
27:29 - Wow.
27:30 - To help send targeted misinformation to vulnerable women.
27:33 How terrible, right?
27:34 - Yeah, awful.
27:36 - So I think we all should just stand up to, stand up to the, like the retargeting, remarketing,
27:42 like we don't have to.
27:44 - That has nothing to do with trying to make money for content creators.
27:48 - Yeah, I know.
27:49 Except for that the data flows into these shady places, right?
27:53 And then they, you know, they already have it.
27:55 So instead of trying to sell them shoes, like let's do something terrible like that.
27:59 So, yeah.
28:00 All right, anyway, next DNS.io folks.
28:03 Okay.
28:04 So for proposals is also open for a very close nearby SciPy 2024, which is awesome.
28:12 This will be in Tacoma, Brian, just a short hop and a skip up I-5 North from us.
28:19 - That'd be fun.
28:19 - Yeah, so July 8th to 14th.
28:22 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 and somebody has to stay with the dog and the kid.
28:33 So I'm not going to this.
28:34 - I have a feeling that's the same timeframe as Oregon Country Fair.
28:37 So I probably can't either.
28:39 - Yeah, but anyway, there's a lot of people out there who can and a call for proposals are out,
28:44 but you must act.
28:46 You must act.
28:47 Soon you have exactly seven days to get this ish, 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 do that.
28:56 - All right, February 27th is that end time.
28:59 Okay.
29:00 A handful of topics.
29:02 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 and it has the bug that bugged me.
29:15 So there was a regression where if you parameterization would go backwards for some reason.
29:23 - Yeah, we talked about that before.
29:25 That's cool.
29:25 - So that's fixed.
29:27 So I've got it updated to 8.01 everywhere I'm using pytest.
29:32 Okay, next, if you'd like to understand dependency injection, Hinnick has a new video out,
29:41 loose coupling and dependency injection, the easy way.
29:44 And I really like the dude 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 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 dependency injection."
30:02 I'm like, "I don't know what you're talking about." - They are kind of like dependency injection, indeed.
30:06 - Yeah, I had a guest, Nicole, on Python Test recently.
30:11 This hasn't been aired yet, but when we were talking about something completely different and I mentioned all of the Rust
30:19 that's coming into Python community.
30:21 And I said, "But I mean, I wanna try to learn Rust, but I don't have a lot of time."
30:27 And she said, "Oh, we had the same problem at work." So I wrote a tutorial.
30:31 So there's a yar.fyi, yar is yet another Rust resource, but the idea-- - Pirate friendly.
30:39 - Yeah, pirate friendly. - Yar.
30:41 - It's a Rust tutorial, but intended for people that already know how to program, they just don't know Rust.
30:49 And so I'm kind of excited to jump into that.
30:53 Okay, what else?
30:54 Oh, yeah, I'm looking for trying to ramp up interviews for Python people.
30:59 So if there's just some interesting stuff around the Python community that you'd like me to talk to,
31:05 or if you'd like me to talk to you, reach out.
31:08 And the first episode was Michael Kennedy.
31:10 It was a good episode, but there's only been 12 episodes so far, but I wanna get more out.
31:15 And then 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, I've seen them.
31:29 There are many of them over there, actually.
31:31 - I am officially following zero people just to like as a protest.
31:38 I don't really, I show up there about once a month to check my direct messages.
31:43 So if you wanna contact me, I will probably reply to you eventually, but just warning, I'm not there very often.
31:50 - Indeed, indeed.
31:52 Awesome, 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 You ready?
32:02 Have you seen this joke?
32:03 Did you look ahead?
32:04 - I have not looked ahead.
32:05 I don't know what you're talking about.
32:05 - Beautiful, all right.
32:06 You ready?
32:07 - Yeah. - Do the joke.
32:08 So here we are.
32:09 I got this over on Reddit, 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:24 So there's an angry team lead or something.
32:26 Why did we end up with a solution?
32:28 A couple of people are like, "Cool savings, time savings maybe." And then someone like a hipster looking dude in the back
32:34 is like, "The vendor sent me a Yeti Tumbler." (both laughing)
32:37 So they grab him and throw him out the window.
32:39 Why are we stuck with this crappy system?
32:43 It's like whatever.
32:44 Well, it's conference swag basically.
32:47 - Yeah.
32:49 I think the real answer is usually the best options were all free and we needed to have to pay somebody.
32:57 - Yeah, that's true.
32:58 That's true.
33:00 None of them had an SLA, but it's like, but--
33:02 - Do you have a Yeti Tumbler?
33:04 - I have one of these like soft Yeti coolers that we'll take when we go out camping
33:10 or boating or something, but I don't have a Tumbler now, I don't believe so.
33:13 You?
33:14 - I had to look it up.
33:15 I didn't even know what this was, but--
33:16 - Oh yeah.
33:17 This is like the Roll, Yeti is like the Rolls Royce of like hillbilly land, I guess.
33:24 They're like super, super nice coolers.
33:29 - If you want a thermos for your coffee, but you don't wanna spend $10, you wanna spend $40, get a Yeti.
33:36 - Yeah, yeah.
33:37 We have a lot of Yeti stuff actually.
33:39 It's really nice.
33:39 I'm just joking.
33:40 - Bougie.
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 and your mountains and your cores,
33:49 they weren't blue anymore.
33:50 They turned whatever color they're not when they're not blue, whatever color they are when they're not blue.
33:55 You know what I'm talking about?
33:56 Like the world of Coors beer cans has a can that when it's like a certain temperature,
33:59 the mountains on the can turn blue.
34:02 And if it's like too warm, they like turn white or something.
34:05 I don't know what other color.
34:06 - Okay, so--
34:06 - This is a very serious problem.
34:07 - We had a couple options.
34:08 We could have made better beer or a better can.
34:11 We chose a better can.
34:12 - What do you see when you're shopping?
34:13 Come on now.
34:14 (laughing)
34:16 - Awesome.
34:17 - Yeah.
34:17 - Okay.
34:18 - Yeah.
34:19 - Fun as always.
34:20 Thank you for being here and thank you everyone for listening.