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 Okken.
00:10 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.
00:19 So please check out the offerings we have.
00:22 We got courses at both Talk Python and at Python Test.
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 FostedOn, @mkennedy, @brianocken, and @pythonbytes.
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,
00:47 you can catch us either on podcast, of course, but also you can watch live if you ever want to do that.
00:55 Usually Tuesdays at 10 AM Pacific Time.
01:00 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, we just need 13 more people.
01:30 So get on that.
01:33 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.
01:38 As in free threaded Python.
01:40 Let's go.
01:41 So last time we talked about some of the--
01:45 remember we talked about, I think it was Simon Willison, hopefully that attribution is correct, about installing how there's a binary installer
01:52 for free threaded Python?
01:54 >> Yeah.
01:54 >> Right?
01:55 Well, in there, I think he was linking to--
01:59 but certainly I talked to Stan Siebert from Anaconda, and that's coming out in a talk Python shortly.
02:04 And he pointed out pi-free-threading.github.io, which is a website that tracks-- gives you some advice on how to create your package
02:16 or update your package so that it works in free threaded Python.
02:20 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?
02:31 There's special wheels, like you could have wheels for Linux, wheels for macOS Intel version, wheels for macOS ARM version.
02:39 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,
02:51 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 That's really, I think, all it covers.
03:00 But yeah, it gives you some more examples how to verify that you're running free threaded Python and so on.
03:06 >> Yeah, what I'm really excited about here is the last two bullets at the top,
03:09 talking about setting up CI and finding, testing, and debugging concurrency issues.
03:15 >> Yeah, yeah, for sure.
03:16 >> That didn't really occur to me, Dale, you just brought it up, that if you have a popular package or even a semi-popular package or one you rely on,
03:24 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:32 All right, so let's look at the compatibility real quick here.
03:34 Compatibility, it says this page, and you can see it's got a big grid of statuses, basically.
03:41 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,
03:47 submit it 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, so it does not track pure Python packages.
04:15 >> Oh, okay.
04:16 >> Two things.
04:17 One, so if you have a pure Python package, don't try to submit it, hey, here's our status.
04:21 It's like, well, you already got that, so you can just probably do any for your platform and your wheel and you're good to go.
04:27 But there's a difference between executes and works.
04:33 In my mind, it says pure Python code works without changes.
04:36 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, so it's fine.
04:48 It may be built to have a bunch of race conditions, 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, and if those things run in parallel and one of them observes that state while the other one is halfway through its steps, you're going to have a bad time, even if it's pure Python, even though it executes.
05:17 So just a bit of a statement if I'm threading there in general, right?
05:22 But if you look through here, there's some interesting things, Brian.
05:24 So, for example, CI Build Wheel is tested in CI, has a PyPI release, so you can pip install it.
05:30 It talks about which version first supports it, but it does not have nightly wheels or a nightly wheel link.
05:37 On the other hand, CMake only has PyPI releases.
05:40 Contour.py only is tested in CI, but is not available on PyPI, 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:56 But there are nightly wheels, theoretically, I guess you could use if you want.
05:59 pip install from there.
06:01 We got Pandas, same status.
06:03 A lot of them are, that's the most common, they're tested in CI, but they're not yet pushed to PyPI, 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 PyPI, 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, I thought so.
06:27 But check this out.
06:27 So if you go over to the installing section, it says, okay, basically you can get some binary installers off of pypi.org.
06:35 Or here's a bunch of talk about how to set it up on Linux, how to set it up on Docker for 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 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 is working.
07:08 Yeah.
07:08 Talks about porting extensions modules to free threading.
07:12 And here you go, Brian, GitHub Actions.
07:15 Let's go.
07:15 Talks about how to set the GitHub Actions 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:29 It's fair enough at this point.
07:32 >> It is consolidating a bit, isn't it?
07:34 >> It is, yes.
07:35 >> All right.
07:35 So if you are interested in free-threaded Python, aka 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, let these folks know about it.
07:56 You can see the GitHub in the top right, I'm sure, and submit an issue or something there.
08:00 >> Yeah.
08:00 Nice.
08:01 Well, if you need support, change of transition here, supporting, if you want to support freethreading, great.
08:11 But also we want to be a supportive Python community.
08:15 So I did it, a nice transition there.
08:19 To Python 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 Quanhan, Kushal, Georgie Janis, Christian, Christopher Denny, and Chuck and Simon Wilson.
08:56 Lots of signers of this.
08:57 So what is this?
08:59 I want to highlight a couple statements here.
09:03 Python is 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:22 We even won, apparently, 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:55 I think probably because of the toxicity that was going on on that mailing list.
09:59 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 in 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:21 If we do not rise and continue to rise every day to this task, then we are not fulfilling our own mission to support and facilitate the growth of a diverse and international community of Python programmers.
10:35 It 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 is a great way to get into tech and into programming, 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 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:25 And I applaud that. I think that's the right thing to do with something as important as communication from the PSF and Python.
11:33 So, so box over.
11:36 Cool. Thanks for sharing. 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, right?
11:48 They don't consider themselves programmers and they kind of accidentally slip into like, wait, I think I just published a package.
11:54 Does that make me a programmer? You know, like six months later and having the community being welcome, welcoming, not just the syntax and the tooling.
12:03 Yes. Counts, you know?
12:05 Yeah. 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,
12:16 bring one of their kids 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 So, all right. Planting the seed there.
12:33 So, all right. You've got some good news for us, don't you?
12:37 I do. Well, I have last week I have planted a seed 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 Masset on saying, you've been using this for years.
13:04 It's super awesome. And so on.
13:07 So, hey, maybe I'll play with this. That would be cool, right?
13:09 Yeah.
13:10 Well, guess what? If you go to Python Bytes and you scroll to the bottom, server status right there, and you click on it,
13:18 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:29 I guess those are the same thing.
13:31 But 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:45 But you can also see this 100% of time is 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 attracts more of it.
13:58 But anyway, we've got the Python Bytes web.
14:00 You see its certificate expires in 82 days.
14:02 So that's good. Plenty of time.
14:04 It's 90 days by default.
14:06 So quite new.
14:07 The RSS feed, what is its 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:23 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, but I don't think it's actually had any downtime.
14:58 >> Okay.
14:58 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, 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:15 >> This is cool.
15:16 >> Yeah.
15:16 Where's there's 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 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:35 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:42 >> 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:48 The same for TalkBait on training as well.
15:50 It's in there as well.
15:52 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:58 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 >> All right.
16:16 Well, something else to check out is something upcoming a possibly in 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 of file format to list Python dependencies for installation reproducibility, which is a bit of a mouthful.
16:45 But and I actually, to be honest, some of the details in here is are a little detail oriented.
16:54 But I like to look the abstract and the motivation to make total sense.
16:58 So the idea is, well, I'll just read it for the abstract.
17:03 This PEP proposes a new file format for dependency specification to enable reproducible install.
17:10 I 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:28 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 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. We have pip tools.
18:07 UV has a solution 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,
18:33 because pip is not pip and other packaging tools are not on the same year time frame as as as Python.
18:41 So not sure if if or when this comes about.
18:45 So yeah, definitely.
18:47 This is cool.
18:47 I actually had this open in another tab.
18:50 I can so I'd go close that now.
18:51 Thanks for that.
18:52 Because I wanted to read about this.
18:53 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.
19:03 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 do something else, like I'm a big fan of UV implementation of pip tools.
19:21 Well, that doesn't work with it.
19:23 Or maybe it does.
19:23 But you know, like you've got to you've got to get it depends on how you're using it.
19:27 Right.
19:28 But having something interoperable between these would be nice to allow you to choose your workflow.
19:33 Yeah, one of the one of the aspects in here under rationale talked about, which I think is pretty cool, is that the file format of 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:58 But a service like like, you know, something like Anaconda or some other service or a packager that pulls everything in, they 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 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, indeed, 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 pip-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? 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:26 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, like maybe it could have all the things and why they're installed there and then it could have the hashes in a separate place.
21:44 Yeah, you don't have to look at, you know, they don't mix in.
21:47 Yeah, cool.
21:48 Yeah, this is great.
21:50 I'm glad that that was 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, anyway, cool.
22:06 Well, that's our items.
22:07 Do you have any extras for us?
22:09 I do feel a little extra today and I hinted at this some of the stuff I'm a cover here.
22:14 So first of all, my pie has a new release and there's some interesting things to call out brain my pie one point one one.
22:21 So if you don't know my pie is a a faux compiler for Python, I will say it's a type checker.
22:27 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 into a function that can take an optional integer.
22:38 Right, not an optional string.
22:39 And it would be an error and it would tell you that it's not OK if it weren't right.
22:43 Just like I guess like a compiler kind of would.
22:45 So you can get that. That's very cool.
22:48 It has support for the the new 312 simpler generics, right?
22:55 Like class C of T's bracket T and then you have T goes to cetera, cetera.
23:00 Very nice there. The one I wanted to call out, though, is functools up partial.
23:05 You talked about functools, no iter tools last week.
23:08 Now, how about functools? Have you heard of functools up partial?
23:11 Yeah, I've used them. I heard it.
23:13 Partials are fun. I've never used them.
23:16 So in Python, we can have default values like F of A and B, F of A, B.
23:21 Right. You could say B equals one.
23:24 So you don't have to specify the value, but it could be another value.
23:28 Right. It could be if somebody wanted to, they could override that.
23:32 Right. You can't say here's a thing with a default value, but never set it.
23:37 So you can say partial of that function and specify the second parameter.
23:41 Yeah. Or whichever parameter you want.
23:43 Right. And it'll pass that in.
23:46 But now mypy checks those. We also get better type inference, better type hinting in expressions and a bunch of other stuff.
23:57 So it's a pretty big release. We can check that out if they want.
24:00 The thing that I hinted at at the beginning is FastHTML.
24:04 I know there's been a lot of talk about this, right?
24:07 Yeah. So FastHTML is a, they describe themselves as a modern web application,
24:13 building a framework for modern web applications in pure Python.
24:16 Think kind of view components a little bit, but a Flask style programming model for the server side
24:25 with a lot of those components actually written in Python, which is pretty interesting. You can create them, make reusable things.
24:30 And 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,
24:47 and you're like, I need to go beyond what is capable of this and not just put dashboards, but more interactive elements
24:53 and sort of more of a web app, but not a ton more, then this is a framework that its upper bound is much higher
24:59 where you can keep going and going.
25:01 So you can definitely create 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. I was going to bring this up as well.
25:13 Yeah. Looks interesting.
25:15 We could share it next week if you want.
25:18 All right. And then also we're coming up on last chance to go be part of the Python and web and database course in a castle in Italy,
25:30 the Python Zero to Hero 2024 event that I'm doing in a luxurious Tuscan Villa.
25:37 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.
25:43 I'll find, you know, on your to-do list to think more about it.
25:46 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, if not, that's totally good too.
25:56 And that's it for my extras.
25:58 All right. I've got one extra pretty much what I've been doing in my free time a lot
26:03 is working on the new course, Hello pytest, and I really want it to be accessible to everybody.
26:10 So I do have a landing page now.
26:12 It's if you go to courses.pythontest.com, you'll see a link to it.
26:18 There is, I don't know, I haven't decided what the final cost pricing structure is going to be,
26:25 but I'd like to start at 10 bucks 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:40 And the idea being, I would love to have something to hand out to teammates
26:46 so that everybody can get up to speed so that 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:14 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, you know, and it's like, and it's only 50 bucks.
27:30 That one over there, that's 50 bucks.
27:31 It's only five hours.
27:32 That is nothing compared to this.
27:35 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.
27:49 Yeah, well, I was surprised.
27:51 I was like talking to a team that was considering my larger course and they decided not to because it was because of them.
28:00 Like, they were like, oh, I really want somebody to be able to do this in a half a day.
28:04 Yeah, exactly.
28:04 Or less.
28:05 And I'm like, oh, okay.
28:06 So there's there's real value in half a day or less courses.
28:09 So I think I agree.
28:11 I don't want to spend 36 hours learning anything.
28:13 I mean, I mean over the course of the history of working with a tool.
28:17 Sure, but over like right away.
28:19 No, I'm not going to do that.
28:21 Yep.
28:22 Exactly.
28:22 All right.
28:23 Let's look one joke about open source a little bit.
28:25 Yes.
28:26 All right.
28:27 So this this joke is called open exclamation mark AI exclamation mark.
28:33 So it has this sort of meme of two people talking to each other.
28:36 Does hi, my name is open AI.
28:39 So you're open source, right?
28:42 Right?
28:44 No, not really.
28:46 Hmm.
28:47 Cool.
28:47 It should be closed AI.
28:48 Yeah.
28:50 At the bottom.
28:51 It does say, okay, open AI is not open source.
28:54 The open means that their AI is open to receive our data.
28:57 Okay, very well.
28:58 Oh, yeah.
29:00 Okay.
29:01 Bart Bart agrees with us.
29:03 Ain't nobody got time for that.
29:06 For long courses, not open AI.
29:08 Yeah.
29:08 All right, cool.
29:10 Well, good again to talk with you as always this week.
29:13 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.