Transcript #395: pythont compatible packages
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:04 This is episode 395, recorded August 6th.
00:08 And I am Brian Hawken.
00:09 And I'm Michael Kennedy.
00:11 And it is way too hot still.
00:13 I thought we were going to be done with the heat by now, but it's crazy.
00:16 It is August.
00:17 This week's episode is sponsored by us, so please check out the offerings we have.
00:22 We've got courses at both Talk Python and at PythonTest.
00:25 And we've got Patreon supporters.
00:29 We don't shout out to them much, but we do appreciate Patreon supporters.
00:32 So thank you.
00:33 If you'd like to connect with us, we're all on Fostadon, at mkennedy, at Brian Hawken, and at Python Bytes.
00:40 But, of course, those links are in the show notes.
00:42 And if you were listening to us later than Tuesday at Pacific Time, 10 o'clock, you can catch us either on podcast, of course,
00:52 but also you can watch live if you ever want to do that.
00:55 Usually Tuesdays at 10 a.m. Pacific Time.
00:59 And we appreciate that.
01:01 And also, really appreciate everybody signing up for the show notes email.
01:07 That's been going really well, and it grows every week.
01:10 And we are going to do a giveaway.
01:12 We haven't met our milestone that we're looking for yet, but we would love to give out some free stuff to people.
01:18 So sign up for that newsletter.
01:20 Brian, let me motivate some folks.
01:22 13.
01:23 That's how many we need.
01:24 13 more, and we're doing our giveaway.
01:26 All right.
01:26 Okay.
01:27 We just need 13 more people.
01:28 So get on that.
01:31 What do you have for us first, Michael?
01:34 Well, you know what I really like about that giveaway is that it's totally free, as in free threaded Python.
01:40 Let's go.
01:40 So last time we talked about some of the member we talked about, I think it was Simon Willison, hopefully that attribution is correct, about installing how there's a binary installer for free threaded Python.
01:54 Yeah.
01:54 Right.
01:55 Well, in there, I think he was linking to, but certainly I talked to Stan Siebert from Anaconda and that's coming out and I would talk Python shortly.
02:04 And he pointed out, pi dash free dash threading dot github dot IO, which is a website that tracks, gives you some advice on how to create your package or update your package so that it works.
02:19 And free threaded Python, but also most importantly, it has a status tracker for popular packages.
02:25 So you can look and see, are there wheels for free threaded Python?
02:29 Because apparently did you know that there's special wheels?
02:32 Like you could have wheels for Linux, wheels for macOS, Intel version wheels for macOS, arm version, but there's also specific wheels for free threaded Python.
02:42 So that's interesting.
02:44 Maybe you have different compiler flags with, you know, threading primitives built in versus skipped, you know, in that version or something along those lines.
02:53 Anyway, so it has a compatibility tracker for that.
02:56 Talks about installing it, which really means installing it on Linux.
02:59 It's really, I think all it covers.
03:00 But yeah, it gives you some, some more examples, how to verify that you're running free threaded Python and so on.
03:06 Yeah.
03:06 What I'm really excited about here is the last two bullets at the top talking about setting up CI and finding testing and debugging currency issues.
03:15 Yeah.
03:15 Yeah, for sure.
03:16 That didn't really occur to me, Dale.
03:18 You just brought it up that if you have a popular package or even a semi-popular package or one you rely on, you probably want to start testing it to make sure that it's not going to break in free threaded Python.
03:31 Indeed.
03:31 All right.
03:32 So let's look at the compatibility real quick here.
03:34 Compatibility.
03:35 It says this page and you can see it's got a big grid of, of statuses.
03:40 Basically it's not that long.
03:42 So if you have a package and you expect it to work with free threaded Python and stuff submitted here so we can see its status.
03:50 Anyway, the page says this page tracks the status of packages for which we're aware of active work on free threaded Python support.
03:58 It contains pages with extension modules as well as build tools and packages that need code specifically to support free threaded.
04:06 Now it also says note that pure Python code works without changes by design.
04:12 So it does not track pure Python packages.
04:15 Oh, okay.
04:16 Two things one.
04:17 So if you have a pure Python package, don't try to submit it.
04:20 Hey, here's our status.
04:21 It's like, well, you already got that.
04:22 So you can just probably do any for your platform and your wheel and you're good to go.
04:27 But there's, there's a difference between executes and works in my mind.
04:34 It says pure Python code works without changes.
04:37 Pure Python code will run in free threaded mode without any changes by design.
04:43 It's kind of like saying it compiles in a static language.
04:47 So it's fine.
04:50 It may be built to have a bunch of race conditions, but that, but it doesn't need a special wheel.
04:56 You know what I mean?
04:57 So don't take too much confidence that it's just pure Python, right?
05:01 Your pure Python code can have five steps, four of which have invalid state.
05:08 And if those things run in parallel and one of them observes that state while the other
05:12 one is halfway through its steps, you're going to have a bad time, even if it's pure Python,
05:16 even though it executes.
05:17 So just a bit of a statement from the reading there in general, right?
05:22 But like, if you look through here is there's some interesting things, Brian.
05:24 So for example, CI build will is tested in CI has a PI PI release.
05:29 So you can pip install it.
05:31 It talks about which version first supports it, but it does not have nightly wheels or
05:35 a nightly wheel link.
05:37 On the other hand, CMake only has PI PI releases.
05:40 Contour.py only is tested in CI, but is not available on PI PI.
05:44 And it talks about which platforms have nightly wheels and then their links and so on.
05:49 So you can go through this list.
05:50 For example, NumPy is tested, but there's no release of NumPy at the moment.
05:55 But there are nightly wheels.
05:57 I theoretically, I guess you could use if you want.
06:00 pip install from there.
06:01 We got pandas, same status.
06:03 A lot of them are, that's the most common.
06:05 They're tested in CI, but they're not yet pushed to PI PI, which is fair.
06:09 You know, it's, there is no release of Python that has free threading officially.
06:15 There's only betas, right?
06:16 So the fact that they're not just pushing this stuff out to PI PI is, I think.
06:20 Also interesting notice here, Brian, there's pip, even though it's pip pure Python.
06:25 I don't know.
06:26 I thought so, but check this out.
06:28 So if you go over to the installing section, it says, okay, basically you can get some binary
06:32 installers off of pipi.org.
06:34 Or here's a bunch of talk about how to set it up on Linux, how to set it up on Docker for
06:40 Linux and build it from source.
06:42 If you run it, it says, here's how you run with the guild disabled.
06:46 So if you run with Python dash, capital V, capital V, you'll see, it'll start and say, Python, such and such experimental free threading build.
06:57 Right?
06:58 Sounds lovely.
06:59 And, you know.
07:00 Yes, it does.
07:02 You're living so far in the future, aren't you?
07:03 And then here you can, there's a little one-liner you can execute to see that it's working.
07:08 Yep.
07:08 Talks about porting extensions modules to free threading.
07:12 And here you go, Brian.
07:13 GitHub actions.
07:14 Let's go.
07:15 It talks about how to set the GitHub actions.
07:17 And a bunch of code on how to actually test and debug all the things.
07:23 I love that.
07:24 How to set up CI.
07:25 And by that, we mean how to set up GitHub actions.
07:28 It's fair enough at this point.
07:31 It is consolidating a bit, isn't it?
07:34 It is, yes.
07:35 All right.
07:36 So if you are interested in free-threaded Python, a.k.a. the one that has had the Gilectomy done to it by Sam Gross and crew, this is a good resource to have around.
07:47 And if you have a package that you think might need some special treatment to work in that space and you have intentions to potentially support that,
07:55 let these folks know about it.
07:56 You can see the GitHub in the top right.
07:58 I'm sure you can submit an issue or something there.
08:00 Yep.
08:00 Nice.
08:01 Nice.
08:01 Well, if you need support, change your transition here.
08:07 Supporting.
08:08 If you want to support free threading, great.
08:11 But also, we want to be a supportive Python community.
08:15 So I did it.
08:17 A nice transition there.
08:18 To Python's supportive and welcoming environment is tightly coupled to its progress.
08:24 This is a post on the Python Software Foundation blog.
08:29 And it is very nice.
08:31 I think that everybody should go read this.
08:34 And one of the reasons that indicate that maybe this is kind of important is this is signed by a whole bunch of people.
08:43 Deb Nicholson, Don Wages, Tanya, Quan Han, Kushal, Georgie, Janice, Christian, Christopher, Denny, and Chuk, and Simon Wilson.
08:55 Lots of signers of this.
08:57 So what is this?
08:58 I want to highlight a couple statements here.
09:03 Python is as popular as it is today because we have gone above and beyond to make this a welcoming community.
09:11 Being a friendly and supportive community is part of how we are perceived by a wider world and is integral to the wide popularity of Python.
09:20 I totally believe this.
09:21 I totally believe this.
09:23 We even won, apparently, won a wonderfully welcoming award at last year's GitHub Universe.
09:28 And it's often referred to as like come for the language, stay for the community sort of a thing.
09:33 However, with the recent bylaws changes, there was a lot of drama on the mailing list.
09:40 So much drama that we had, even though there were only a thousand people approximately subscribed to a PSF vote mailing list, 45 of those people dropped out.
09:54 I think probably because of the toxicity that was going on on that mailing list.
10:00 So this is a good reminder that we are a welcoming community and we want it that way.
10:04 I like another, I'm going to hop down.
10:07 There's a lot of information and history if you're curious.
10:10 I like this statement here.
10:12 We have a moral imperative as one of the very best places to bring new people into tech and into open source to keep being good at welcoming new people.
10:22 If we do not rise and continue to rise every day to this task, then we are not fulfilling our own mission of our own mission to support and facilitate the growth of a diverse and international community of Python programmers.
10:35 Goes on to talk about how technical skills are a game changer for people that are trying to better their position, try to get a better job.
10:45 Python's a great way to get into tech and into programming.
10:48 And we need to make sure that that stays a great pathway.
10:52 So kind of a serious topic, but it's serious to me that the future of programming stays with this nice on-ramp of Python.
11:02 And we maintain this to be a good place to be.
11:05 So further continuing, some of the consequences of some of the bad actions that happened is that the forum and the mailing list and some of the other avenues of discussion will be, will be, or they've turned on moderation.
11:19 And they're going to continue with moderating it to make sure that there is not toxic behavior going on.
11:26 And I applaud that.
11:27 I think that's the right thing to do with something as important as communication from the PSF and Python.
11:33 So box over.
11:35 Cool.
11:37 Thanks for sharing.
11:38 I do think making it welcoming to new people.
11:41 I think what a Python's powers, superpowers, is really that people come and they don't feel intimidated.
11:47 Right?
11:48 They don't consider themselves programmers.
11:50 And they kind of accidentally slip into like, wait, I think I just published a package.
11:54 Does that make me a programmer?
11:55 You know, like six months later.
11:56 And having the community being welcoming, not just the syntax and the tooling.
12:03 Yes.
12:04 It counts, yeah?
12:05 Yeah.
12:05 Yeah.
12:05 I see a lot of times people will, like a lot of PyCon goers, for example, will bring along one of their kids, even though they've been going for a while, bring one of their kids.
12:18 And having the kids be able to go off and learn also and realize that, hey, this is kind of a neat place.
12:24 We're probably getting software engineers from the community just because of this that maybe would have not considered it.
12:31 All right.
12:32 Planting the seed there.
12:33 All right.
12:34 You've got some good news for us, don't you?
12:37 I do.
12:37 Well, I have last week, I have planted a seed.
12:40 And this week it has grown.
12:42 So I was going to cover a new topic, but I want to have more time to digest it than I've had.
12:50 So let's, I want to do a follow-up instead, Brian.
12:53 So remember last week I talked about Uptime Kuma, which is a fancy self-hosted monitoring tool.
12:59 And a lot of folks chimed in over on Mastodon saying, you've been using this for years.
13:05 It's super awesome.
13:05 And so on.
13:07 I said, hey, maybe I'll, maybe I'll play with this.
13:08 That would be cool, right?
13:09 Yeah.
13:10 Well, guess what?
13:12 If you go to Python Bytes and you scroll to the bottom, server status right there, and you click on it, it shows you the Python Bytes operational status.
13:20 What is the status of the website?
13:22 And all these little green dots, each one of these are a sample of either up, down, partially up, partially down.
13:28 I guess those are the same thing.
13:30 But so you could see those sort of like over time.
13:33 I wish I could control how much time this is, but this is basically just the samples, some number of recent samples.
13:39 And I think I've got it set to every minute or two minute it checks.
13:43 And if it goes wrong, it'll send me an email or something like that.
13:46 But you can also see this 100% of time.
13:49 It's basically since I set it up.
13:50 But I think that's 30 days or something.
13:53 I'm not sure exactly the window of that, but that is more, that tracks more of it.
13:58 But anyway, we've got the Python Bytes web.
14:00 You can see its certificate expires in 82 days.
14:03 So that's good.
14:03 Plenty of time.
14:04 It's 90 days by default.
14:06 So quite new.
14:07 The RSS feed, what is it?
14:08 Status.
14:09 The CDN status that actually delivers the MP3s, which is a whole separate bit of infrastructure at bunny.net.
14:17 And the MongoDB database that powers the website.
14:20 So you could see, well, maybe the website's down because the database is down.
14:24 Or, you know, there's just a problem with the website.
14:26 Isn't that cool?
14:27 It is pretty cool.
14:28 Yeah.
14:28 And even more involved because of all the course stuff is if you go to the one for the bottom of Talk Python, you can see you've got all those things I described.
14:37 But also like the mobile APIs, the video CDN, the podcast CDN, the courses website, all those things.
14:44 And all are making me smile with almost 100% of time.
14:47 I think I broke when I set it up.
14:49 I didn't configure the setup right for RSS.
14:53 So it's got a little lingering broken bit.
14:56 But I don't think it's actually had any downtime.
14:57 Okay.
14:58 I was good.
14:59 Actually, I'm pleased to see that because I was just wondering if you're rounding up to the nearest hundred.
15:03 No, no.
15:04 This is like to the it's to the hundredth.
15:06 So it's like 99.86% up.
15:09 But I think it's just I broke it when I was trying to set this thing up.
15:12 So, yeah, incredibly easy.
15:14 Just.
15:14 This is cool.
15:16 Yeah.
15:16 Where's there's.
15:17 So if you go here, basically just Docker run.
15:20 And I've talked about this whole Docker cluster.
15:22 I've had.
15:23 I've migrated everything to all the infrastructure, too.
15:26 And adding this as a thing that runs over there.
15:29 Incredibly easy.
15:30 It took probably 20 minutes to get it set up running as its own bit of infrastructure.
15:36 And now it just chills in its own Docker container watching all the other things around the world.
15:40 So very cool.
15:41 Neat.
15:41 Yeah.
15:42 So if you want to play with that, you can check that out at the bottom of both of the podcast websites in their footers.
15:49 Same for talk by the training as well.
15:50 It's in there as well.
15:51 But basically, you know, just it's just an example of someone putting up uptime Kuma, which so far I'm pretty happy with.
15:59 And if what you see on the status page is a public thing.
16:01 But if you log in, you get a lot more detail of like responses, response time, overtime, and all this.
16:08 So you can kind of use it as a performance monitoring thing as well.
16:11 Oh, cool.
16:11 Yeah.
16:12 I should check that out.
16:13 Indeed.
16:14 Neat.
16:15 All right.
16:16 Well, something else to check out is something upcoming possibly in Python.
16:22 There is a new PEP.
16:23 Well, there's often new PEPs.
16:24 But here's PEP 751.
16:27 This is authored by Brett Cannon and started at the created at the end of July the 24th.
16:35 What is this?
16:36 This is PEP 751, a file format to list Python dependencies for installation reproducibility, which is a bit of a mouthful.
16:45 But to be honest, some of the details in here are a little detail oriented.
16:53 But I like to look the abstract and the motivation make total sense.
16:58 So the idea is, well, I'll just read it.
17:02 For the abstract, this PEP proposes a new file format for dependency specification to enable reproducible installation in a Python environment.
17:14 The format is designed to be human readable and machine generated.
17:17 Installers consuming the file should be able to evaluate each package in question in isolation with no need for dependency resolution at install time, which is interesting.
17:27 So what's the idea?
17:30 I thought we had this already, don't we?
17:32 We have dependency, but we don't have like this whole like lock file stuff is not is not is not a standard.
17:41 It's just implemented several places.
17:43 So there's no under motivation.
17:46 Currently, no standard exists to specify what top level dependencies should be installed into a Python environment.
17:52 And no standard exists to create an immutable record such as a lock file of which dependencies are installed.
18:00 There are at least five well known solutions to the problem.
18:04 We've got pip freeze.
18:06 We have pip-tools.
18:07 UV has a solution.
18:08 Poetry and PDM all have a way to deal with lock files in general, but we don't have a standard for this.
18:15 So I am, I guess, welcoming the idea that that that this will be a standard or something similar to it.
18:22 This is early in the PEP lifecycle.
18:24 But yeah, anyway, since it's a packaging topic, these don't necessarily have to come out at the same rate as Python because pip is not pip and other packaging tools are not on the same year timeframe as as as Python.
18:41 So not sure if if it were when this comes about.
18:45 So yeah, definitely.
18:46 This is cool.
18:47 I actually had this open in another tab.
18:50 I can so I can go close that now.
18:51 Thanks.
18:51 Because I wanted to read about this.
18:54 This is exciting.
18:54 I always love what Brett Cannon's working on.
18:56 Yeah, I think I like the idea of having a lock file that we can use because you every tool you pick, it's got a solution, but it's incompatible with all other tools.
19:09 So some project uses poetry, for example, to manage its dependencies.
19:14 And you just you don't want to use that.
19:15 Yeah.
19:16 When you you want to use something else, like I'm a big fan of UV's implementation of pip-tools.
19:21 Well, that doesn't work with it.
19:23 Or maybe it does.
19:24 But, you know, like you've got to you've got to get it depends on how you're using it.
19:28 Right.
19:28 But having something interoperable between these would be nice to allow you to choose your workflow.
19:33 Yeah.
19:34 Regardless.
19:34 One of the one of the aspects in here under rationale talked.
19:39 about, which I think is pretty cool, is that the file format, the the the tool that creates the file doesn't necessarily have to be the tool that reads and parses it.
19:49 The important thing around that is that there might be like, yeah, anybody you can anybody can create the lock file with whatever tool you want.
19:57 But but a service like like, you know, something like Anaconda or some other service or a packager that pulls everything in.
20:05 Well, you might have their own standard way to do all of that.
20:07 And it doesn't have to be they don't have to support flit and PDM and all sorts of other tools.
20:13 I guess flit isn't one of the on the list, but you know what I mean?
20:16 Yeah.
20:17 Lots of different things.
20:18 So yeah, it'll be interesting to watch this and see where this goes.
20:22 And as always, I appreciate how much Brett thinks about packaging and packaging was.
20:30 I know that there's that that XKCD comic about packaging being horrible in Python, but it's a hard problem.
20:36 And I'm glad that we have bright people like Brett and other folks he knows to work on the hard problem.
20:42 So anyway.
20:43 Indeed.
20:44 I just one thing I hope is that whatever file gets generated out of this, that it's not so noisy that diffs of them over time become hard to read.
20:55 For example, using the tools version, if you flip on hashing, like the hashes take up so much of the of the text that I feel like it's just super hard to read all of a sudden to just like diff a thing and go, OK, what's the what's new?
21:11 What's what's changed?
21:12 What's the same?
21:12 But it's just, you know, yeah, maybe I should turn word wrap off or something on my editor.
21:18 But it's like you're trying to read, OK, this thing is installed because these three things depend on it.
21:22 But there's just blocks of hashes like all over the screen.
21:25 You know what I mean?
21:25 So I did notice that that was actually called out in the rationale around it.
21:32 It said the format is designed so that viewing a diff of the file is easy by centralizing relevant details.
21:38 Oh, awesome.
21:39 Yeah.
21:39 Like maybe it could have all the things and why they're installed there.
21:42 And then it could have the hashes in a separate place.
21:44 Yeah.
21:45 You don't have to look at, you know, that don't mix in.
21:47 Yeah.
21:48 Cool.
21:48 Yeah.
21:49 Yeah, this is great.
21:50 I'm glad that that was a that was that's part of the concern is to make sure because, yeah, that's I might not read it maybe theoretically human readable like XML.
22:00 But the only time I'm actually reading XML is in a diff.
22:03 So, yeah.
22:04 Anyway.
22:05 Cool.
22:06 Well, that's our items.
22:07 Do you have any extras for us?
22:08 I do feel a little extra today and I hinted at this some of the stuff I'm going to cover here.
22:14 So, first of all, mypy has a new release and there's some interesting things to call out, Brian.
22:18 mypy 1.11.
22:21 So, if you don't know, mypy is a faux compiler for Python, I will say.
22:26 It's a type checker, but what it does is basically go through your code as if it was a compiler and make sure that everything would hang together.
22:32 Like here, you say this thing is an integer and you're passing it into a function that can take an optional integer.
22:37 Right.
22:38 Not an optional string.
22:39 And it would be an error and it would tell you that it's not okay if it weren't.
22:43 Right.
22:43 Just like, I guess, like a compiler kind of would.
22:46 So, you can get that.
22:47 That's very cool.
22:47 It has support for the new 312 simpler generics, right?
22:55 Like class C of T, just a bracket of T, and then you have T goes to et cetera, et cetera.
23:00 Very nice there.
23:01 The one I wanted to call out, though, is functools.partial.
23:05 You talked about functools, no, iter tools last week.
23:08 Now, how about functools?
23:09 Have you heard of functools.partial?
23:10 Yeah, I've used them.
23:12 Partials are fun.
23:15 I've never used them.
23:16 So, in Python, we can have default values like f of a and b, f of a comma b, right?
23:22 You could say b equals one, so you don't have to specify the value.
23:26 But it could be another value, right?
23:28 It could be if somebody wanted to, they could override that, right?
23:33 You can't say here's a thing with a default value but never set it.
23:36 So, you can say partial of that function and specify the second parameter.
23:41 Yeah.
23:42 Or whichever parameter you want, right?
23:44 And it'll pass that in.
23:46 But now, mypy checks those.
23:48 We also get better type inference, better type hinting and expressions, and a bunch of other stuff.
23:57 So, it's a pretty big release.
23:58 People can check that out if they want.
24:00 The thing that I hinted at the beginning is fast HTML.
24:05 I know there's been a lot of talk about this, right?
24:07 Yeah.
24:07 So, fast HTML is a, they describe themselves as a modern web application, building a framework for modern web applications in pure Python.
24:16 Think kind of view components a little bit, but a flash style programming model for the server side with a lot of those components actually written in Python, which is pretty interesting.
24:28 You can create them, make reusable things.
24:30 And it's, it's interaction and its dynamic aspects are based on HTMX, which is one of my very favorite JavaScript frameworks as well.
24:40 So, if you were thinking of doing stuff like Streamlit or Gradio or some of these dashboard types of interactions, and you're like, I need to go beyond what is capable of this and not just put dashboards, but more interactive elements and sort of more of a web app, but not a ton more.
24:56 Then, this is a framework that it's upper bound is much higher where you can keep going and going.
25:01 So, you can definitely create some, some cool apps real quickly with not very much code.
25:06 So, I'm going to play with this a little bit more and I think I'll talk more about it next week.
25:10 I'm looking forward to that.
25:11 I was going to bring this up as well.
25:13 Yeah.
25:14 Looks interesting.
25:15 We could share it next week if we want.
25:17 All right.
25:18 And then also, we're coming up on last chance to go be part of the Python and web and database course in Castle in Italy, the Python Zero to Hero 2024 event that I'm doing in a luxurious Tuscan villa.
25:36 And hopefully, you can be there.
25:38 But if you've been on the fence and thinking, maybe I want to go, but not sure, I'll find, you know, on your to-do list to think more about it.
25:47 Well, you got to think soon because we're going to close enrollment pretty shortly.
25:51 So, please, if you want to go, jump on that.
25:54 If not, that's totally good too.
25:55 And that's it for my extras.
25:57 All right.
25:58 I've got one extra of pretty much what I've been doing in my free time a lot is working on the new course, Hello pytest.
26:06 And I really want it to be accessible to everybody.
26:10 So, I do have a landing page now.
26:12 If you go to courses.pythontest.com, you'll see a link to it.
26:18 There is, I don't know.
26:21 I haven't decided what the final cost pricing structure is going to be.
26:25 But I'd like to start it at $10 because I'd really like it to be something that people can take a look at.
26:30 So, the idea around it is not to teach you all of pytest.
26:34 It is to get people started with it.
26:36 So, to cover some of the basics like parameterization and fixtures and stuff.
26:41 And the idea being, I would love to have something to hand out to teammates so that everybody can get up to speed.
26:47 So, the one pytest expert on the team doesn't get questions all day long.
26:52 That's where I'm trying to fill this in.
26:54 So, that's still up.
26:56 In order to do a pricing page, I had to pick a date where I was going to deliver it by.
27:03 I picked the 19th, which is, what, 12 days from now?
27:07 I think it's going to be done before then, but that's my deadline.
27:11 So, working on that.
27:12 Awesome. Congrats.
27:13 You know, people, if you look around online courses, like especially Udemy, it's an arms race to have the most content.
27:22 We have the super mega course that's 36 hours of content.
27:26 You know, and it's like, and it's only 50 bucks.
27:29 That one over there, that's 50 bucks.
27:31 It's only five hours.
27:32 That is nothing compared to this.
27:34 That's an additional 31 hours of your time you've got to put into it, right?
27:40 And not everybody has 36 hours of interest in learning pytest.
27:44 They just need enough to get going and get started.
27:46 And so, I think there's real value in having a concise thing.
27:48 Yeah.
27:49 Well, I was surprised.
27:51 I was talking to a team that was considering my larger course, and they decided not to because it was because of them.
28:00 They were like, oh, I really want somebody to be able to do this in half a day or less.
28:05 And I'm like, oh, okay.
28:06 So, there's real value in half a day or less courses.
28:09 So, I think.
28:10 I agree.
28:11 I don't want to spend 36 hours learning anything.
28:13 I mean, over the course of the history of working with a tool, sure.
28:17 But over, like, right away?
28:19 No.
28:19 I'm not going to do that.
28:20 Yeah.
28:21 Cool.
28:21 Exactly.
28:22 All right.
28:23 Let's want to joke about open source a little bit.
28:25 Yes.
28:26 All right.
28:27 So, this joke is called open, exclamation mark, AI, exclamation mark.
28:32 So, it has this sort of meme of two people talking to each other.
28:35 It says, hi, my name is open AI.
28:38 So, you're open source, right?
28:41 Right?
28:44 No.
28:44 Yeah.
28:46 Not really.
28:46 Hmm.
28:46 It should be closed AI.
28:48 Yeah.
28:49 At the bottom, it does say, okay, open AI is not open source.
28:54 The open means that AI is open to receive our data.
28:57 Okay.
28:58 Very well.
28:58 Oh.
28:59 Very well.
28:59 Yeah.
29:00 Okay.
29:00 Yeah.
29:00 Bart agrees with us.
29:03 Ain't nobody got time for that.
29:05 For long courses, not open AI.
29:08 Yeah.
29:08 All right.
29:09 Cool.
29:09 Well, good, again, to talk with you, as always, this week.
29:14 Thank you, everybody, for joining in on the live stream and everybody else for listening.
29:18 And I hope you have a wonderful rest of your summer or next week.
29:22 So, talk to you next week.