WEBVTT
00:00:00.001 -->
00:00:05.100Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.100 -->
00:00:11.180This is episode 385, recorded May 27th, 2024. Did I get that right?
00:00:11.180 -->
00:00:11.620Yeah.
00:00:11.620 -->
00:00:12.840I am Brian Okken.
00:00:12.840 -->
00:00:14.500And I am Michael Kennedy.
00:00:14.500 -->
00:00:17.980This week's episode is sponsored by Mailtrap. More about them later.
00:00:17.980 -->
00:00:23.000If you want to connect with us, we're all on Fosstodon, the show, and Michael and I.
00:00:23.000 -->
00:00:24.300We're Fosstodonians.
00:00:24.300 -->
00:00:25.760Fosstodonians, yeah.
00:00:25.760 -->
00:00:28.160So those links are on the show notes.
00:00:28.760 -->
00:00:34.760Also, in the show notes or at pythonbytes.fm, you can go to live if you want to join us.
00:00:34.760 -->
00:00:35.600Join the audience.
00:00:35.600 -->
00:00:39.460Usually, it's Tuesdays at 10 a.m. Pacific time.
00:00:39.460 -->
00:00:45.620You can also use that link to get older videos, too, if you want to watch what happens live.
00:00:45.620 -->
00:00:57.660And finally, if you'd like to receive an email a day or two after the show to find out all of the links and to have a link to the show.
00:00:57.660 -->
00:01:05.880But make sure if you listen to this and you want to make sure that you don't miss any links and be able to go check those out later, you can become a friend of our show.
00:01:06.280 -->
00:01:07.940And we'll send you those emails.
00:01:07.940 -->
00:01:10.800So you had an announcement before we get started.
00:01:10.800 -->
00:01:11.260I do.
00:01:11.260 -->
00:01:16.280Well, I just wanted to say, Brian, the reason that we're not just doing this at a normal time, we're just kind of late.
00:01:16.280 -->
00:01:18.520And I got some messages from folks in places like New Zealand.
00:01:18.520 -->
00:01:19.140Like, awesome.
00:01:19.140 -->
00:01:20.620This is the perfect time.
00:01:20.760 -->
00:01:22.480So there's always a perfect time somewhere in the world.
00:01:22.480 -->
00:01:24.640But you've got this thing going on tomorrow.
00:01:24.640 -->
00:01:30.320And then for the rest of the week, I'm going to this thing called the Giant Loop Ride.
00:01:30.320 -->
00:01:37.840This off-road rally that's at a hot springs and maybe 300 other off-road riders out in the southeast desert of Oregon.
00:01:37.840 -->
00:01:44.620And riding the mountains and the desert and open bar, live music, all sorts of shenanigans going on.
00:01:44.620 -->
00:01:45.840Anyway, if somebody...
00:01:45.840 -->
00:01:45.840Like a swimming pool?
00:01:45.840 -->
00:01:48.140Yeah, that swimming pool is a hot springs, by the way.
00:01:48.140 -->
00:01:48.960How crazy is that?
00:01:48.960 -->
00:01:51.960If anyone is listening out there and is also going, just come say hi.
00:01:51.960 -->
00:01:52.720That's all I'm saying.
00:01:52.720 -->
00:01:57.200But also why we're doing this in the middle of the night for some places.
00:01:58.380 -->
00:02:03.800So I would say if you have a podcast that kind of runs late, sometimes it'll make you tired, wouldn't you think?
00:02:03.800 -->
00:02:04.860Would you have to rest a little?
00:02:04.860 -->
00:02:06.700Yeah, yeah.
00:02:06.700 -->
00:02:13.320Let's talk about Postgres, PostG, rest, as in Postgres, rest API.
00:02:13.320 -->
00:02:15.780So this one comes to us from Mark Little.
00:02:15.780 -->
00:02:17.440So thanks, Mark, for sending us over.
00:02:17.440 -->
00:02:17.940It's a good one.
00:02:17.940 -->
00:02:23.640This is basically a web server, web front end for your database.
00:02:23.640 -->
00:02:24.780So you've got Postgres.
00:02:25.280 -->
00:02:34.980And you might think, all right, well, I would just like to expose the tables as endpoints with, you know, ability to do queries over HTTP endpoints.
00:02:34.980 -->
00:02:36.540You somehow pass the query over.
00:02:36.540 -->
00:02:39.740You want to have security, things like that.
00:02:39.740 -->
00:02:52.400So this is an app that you can run and it automatically, with zero API work for you, turns your Postgres instance into a somewhat restricted API, basically.
00:02:52.400 -->
00:02:52.960Cool, right?
00:02:52.960 -->
00:02:53.480Yeah.
00:02:53.480 -->
00:02:54.020Yeah.
00:02:54.020 -->
00:02:58.420Now, obviously, these things, I don't know, I always have mixed feelings when I talk about these things.
00:02:58.420 -->
00:03:11.820On one hand, if you just say, I would like, say, my view front end or something, or even my Python code to just have access to the database as an API, just read, you know, the crud things of all the tables, you're good to go.
00:03:11.820 -->
00:03:12.900This is what you want, right?
00:03:12.900 -->
00:03:16.660On the other hand, sometimes I want to have more specific things.
00:03:16.660 -->
00:03:29.180Instead of just, I want to go through the user, the create new user API endpoint that uses, I don't know, argon2 for memory hard, password hashing and other checks.
00:03:29.180 -->
00:03:33.120And maybe, you know, like every time I come up against these things, I'm like, oh, they're really cool.
00:03:33.220 -->
00:03:38.880But at the same time, I kind of want a little more specific control over how it works.
00:03:39.000 -->
00:03:42.940So if you're just like, I just have a database, I just want to be able to expose it real quick, let's go.
00:03:42.940 -->
00:03:44.680Postgres rest sort of thing.
00:03:44.680 -->
00:03:45.200Cool, right?
00:03:46.200 -->
00:03:53.120So the way it works is it's written in Haskell, which you may, and it's 4% Python, so I guess there's a little Python in there.
00:03:53.120 -->
00:03:55.680But, you know, it doesn't really matter what it's written in.
00:03:55.680 -->
00:04:02.260It's just a thing you run, and then you talk to it from your Python or from your JavaScript or whatever it is, okay?
00:04:02.260 -->
00:04:05.120So there's a couple of things you care about.
00:04:05.120 -->
00:04:06.860One, you probably care about performance.
00:04:06.860 -->
00:04:11.920I'm not super familiar with the performance of Haskell, but I believe it runs on top of the JVM.
00:04:11.920 -->
00:04:14.520Sorry if I get that wrong, but I think so, which makes it pretty quick.
00:04:14.980 -->
00:04:21.000It says it'll do 2,000 requests per second on the Heroku free tier, which is pretty fast, actually, right?
00:04:21.000 -->
00:04:22.440That's a pretty wimpy server.
00:04:22.440 -->
00:04:25.020And 2,000 requests per second is pretty high end.
00:04:25.020 -->
00:04:26.640Three reasons for that.
00:04:26.640 -->
00:04:32.880Haskell, and it's written used in the Warp HTTP server, a compiled language with lightweight threads.
00:04:32.880 -->
00:04:35.460I also learned about Warp, so I'm learning about all sorts of things.
00:04:35.460 -->
00:04:41.300It delegates as much as it can to the database, so it's like a really thin layer over the database, as I was describing.
00:04:41.300 -->
00:04:45.860So serializing JSON responds directly in SQL.
00:04:45.860 -->
00:04:53.560It does the data validation, the authorization, combining row count and retrieval, data post in a single command.
00:04:53.560 -->
00:04:57.020All those different things are happening in the database, not in this thing, right?
00:04:57.300 -->
00:05:14.460And finally, it uses the Haskell, instead of SQL, it's the Haskell library, which manages database connections, a binary protocol for talking to it, and is stateless for horizontal scaling.
00:05:14.980 -->
00:05:20.780Also, very important for security, you don't want to just go, and the whole thing is read-write on the internet.
00:05:20.780 -->
00:05:23.780How could you get, you know, a little Bobby Tables doesn't find it?
00:05:23.780 -->
00:05:34.220So it uses JSON web tokens, and basically what you do is you create a user in the database, and then you set authentication, like, this user can only read, and they can only read these tables.
00:05:34.540 -->
00:05:35.940But they can write to that table, I don't know.
00:05:35.940 -->
00:05:40.220And then that's what you can do when you authenticate over this, right?
00:05:40.220 -->
00:05:46.100So it basically leverages database users and their implicit permissions to control what you can do with the API.
00:05:46.100 -->
00:05:49.780There's ways to version the API, which is kind of interesting.
00:05:49.780 -->
00:05:55.980As the database changes, you could keep it stable, it seems like, and it documents itself through OpenAPI.
00:05:55.980 -->
00:05:57.640Well, this thing's pretty neat.
00:05:57.640 -->
00:06:08.380So if you have a Postgres database, and you're like, look, we really just need read, write, update, you know, maybe even an internal app, and you just want to have it real simple, check this out.
00:06:08.380 -->
00:06:08.840It's kind of cool.
00:06:08.840 -->
00:06:09.380Cool.
00:06:09.380 -->
00:06:12.200I didn't know that Heroku had a free tier anymore.
00:06:12.200 -->
00:06:13.680But it is.
00:06:13.680 -->
00:06:15.460Let's check out.
00:06:15.460 -->
00:06:16.400Let's go back here and do a little.
00:06:16.400 -->
00:06:19.320It may have been from previous times.
00:06:19.320 -->
00:06:25.620Yeah, that statement, it must be from previous times, because this was updated a month ago, but it didn't.
00:06:25.620 -->
00:06:31.440Yeah, I think that's just whatever the wimpy free tier was, that's giving you a sense of what you can do.
00:06:31.440 -->
00:06:32.300Okay, cool.
00:06:32.300 -->
00:06:33.380Neat.
00:06:33.380 -->
00:06:36.920I want to talk about AsyncIO a little bit.
00:06:37.540 -->
00:06:48.480So there's an article called from Jacob Padilla, how Python AsyncIO works, recreating it from scratch.
00:06:48.480 -->
00:06:56.600And I kind of like this idea, because I mean, I love AsyncIO, but sometimes it just feels magical.
00:06:56.820 -->
00:07:03.760And to sort of walk through some of the, how it might be working in the background is kind of cool.
00:07:03.760 -->
00:07:13.520So it goes through generators review, talks about the event loop, talks about sleeping, then yielding to await and await with AsyncIO.
00:07:13.780 -->
00:07:21.600And I just kind of like the format that this is written in to just sort of get your, get a good mental model of how AsyncIO works.
00:07:21.600 -->
00:07:25.260So this is, I guess I highly recommend this article.
00:07:25.720 -->
00:07:27.320Looked really fun.
00:07:27.320 -->
00:07:29.200The colors are nice too.
00:07:29.200 -->
00:07:34.480I, you know, I got a sucker for a good webpage that's easy to read, but, but this is good.
00:07:34.480 -->
00:07:37.660I skimmed it briefly already.
00:07:37.660 -->
00:07:42.320And like, yeah, this kind of goes through how awake Async works.
00:07:42.320 -->
00:07:45.340Async just sort of feels mad too magical sometimes, but.
00:07:45.660 -->
00:07:46.420It is pretty magical.
00:07:46.420 -->
00:07:49.420And at the heart of it is generators, right?
00:07:49.420 -->
00:07:52.180So generators themselves feel super magical.
00:07:52.180 -->
00:07:58.280And once you kind of understand how those work, you understand, well, okay, well, that's how you kind of partition the work.
00:07:58.280 -->
00:08:03.140And then you just run it in, in steps, each, each fragment of the generator and off you go.
00:08:03.140 -->
00:08:04.280But yeah, it seems pretty wild.
00:08:04.280 -->
00:08:04.700Yeah.
00:08:04.700 -->
00:08:09.600So it kind of walks through all the little steps and then it shows what the, so it has like the final bit.
00:08:09.600 -->
00:08:14.540And then it rewrites the whole thing in actual AsyncIO so that we can see what it looks like.
00:08:14.800 -->
00:08:15.680so that's great.
00:08:15.680 -->
00:08:27.000along with that, when I noticed the link that some, there was, camera where I got it from, but there was a comment also about if you want to like learn AsyncIO from trying to recreate it from scratch.
00:08:27.000 -->
00:08:32.260There was also a, David Beasley talk from the, from, I think it's from PyCon.
00:08:32.260 -->
00:08:32.660Yeah.
00:08:32.660 -->
00:08:34.980PyCon India from 2019.
00:08:34.980 -->
00:08:36.800I hadn't watched this.
00:08:36.800 -->
00:08:38.940I still haven't watched this, but it's on my list now.
00:08:38.940 -->
00:08:42.980build your own Async, from David Beasley.
00:08:42.980 -->
00:08:44.100Awesome instructor.
00:08:44.260 -->
00:08:45.740So I'm sure this is a good video as well.
00:08:45.740 -->
00:08:47.180So we'll link, we'll link to that.
00:08:47.180 -->
00:08:49.980so some, some learning AsyncIO.
00:08:49.980 -->
00:08:50.640Awesome.
00:08:50.640 -->
00:08:51.480Good stuff.
00:08:51.480 -->
00:08:52.120Indeed.
00:08:52.120 -->
00:08:56.080What, what else is good is our sponsor Mailtrap.
00:08:56.080 -->
00:08:56.880All right.
00:08:56.880 -->
00:08:57.900Let's talk about them.
00:08:58.060 -->
00:09:02.160This episode is sponsored by Mailtrap, an email delivery platform that developers love.
00:09:02.160 -->
00:09:14.180An email sending solution with industry best analytics, SMTP and email API, as well as SDKs for major programming languages and 24 seven human support.
00:09:14.180 -->
00:09:16.940Try for free at Mailtrap.io.
00:09:17.320 -->
00:09:17.540Thank you.
00:09:17.540 -->
00:09:17.540Thank you.
00:09:17.540 -->
00:09:17.740Thank you.
00:09:17.740 -->
00:09:18.060Thank you.
00:09:18.060 -->
00:09:18.060Thank you.
00:09:18.060 -->
00:09:18.060Thank you.
00:09:18.060 -->
00:09:18.120Thank you.
00:09:18.120 -->
00:09:18.200Thank you.
00:09:18.200 -->
00:09:18.600Thank you.
00:09:18.600 -->
00:09:19.060Mailtrap.
00:09:19.060 -->
00:09:21.040Let's move on to something in a little higher order.
00:09:21.040 -->
00:09:21.640Shall we, Brian?
00:09:21.640 -->
00:09:22.160Sure.
00:09:22.160 -->
00:09:23.380Perfect.
00:09:23.380 -->
00:09:25.060Follow on from what you were talking about.
00:09:25.060 -->
00:09:26.800AsyncIO, parallel programming.
00:09:27.140 -->
00:09:29.180It's basically scales the weighting.
00:09:29.180 -->
00:09:38.360Now this, this is going to be a dated statement, I believe, but at the moment, Python is not super good at doing computational parallelism.
00:09:38.360 -->
00:09:38.800Right.
00:09:38.800 -->
00:09:41.260But you know what is GPUs.
00:09:41.260 -->
00:09:45.860GPUs are awesome at doing parallel programming.
00:09:45.860 -->
00:09:52.260So, you know, your typical Python program has one thread, or if you don't do anything in most languages, they have one thread.
00:09:52.260 -->
00:09:54.580If you scale out your CPUs, maybe you got 16.
00:09:54.740 -->
00:09:56.840My Alienware gaming PC has that.
00:09:56.840 -->
00:10:01.700My M2 MacBook Pro, I think, has 10 threads, you know, but there's way more.
00:10:01.700 -->
00:10:04.320It's get a lot more work done if you scale those out, right?
00:10:04.320 -->
00:10:08.780But if you scale their GPUs, they have 16,384 threads, things like that, right?
00:10:08.780 -->
00:10:09.620Incredible.
00:10:09.620 -->
00:10:21.660So I ran across this thing called Bend, B-E-N-D, and it comes from a higher order company, which has a couple of, it's like a runtime for Bend and then has Bend the language.
00:10:21.920 -->
00:10:27.420And it's all about taking things and running them in parallel and making them basically be Python.
00:10:27.420 -->
00:10:37.520So it says, with Bend, you can write parallel code for multi-core CPUs and GPUs without being a C or CUDA, respectively, expert with 10 years experience.
00:10:37.520 -->
00:10:39.200And it feels just like Python.
00:10:39.200 -->
00:10:40.620So they give us this example.
00:10:40.620 -->
00:10:42.000Here's a function called sum.
00:10:42.000 -->
00:10:45.220Not the best example because it shadows a built-in, but whatever.
00:10:45.940 -->
00:10:47.000Let's get rolling with it, right?
00:10:47.000 -->
00:10:49.880And so it says, def sum, take a depth.
00:10:49.880 -->
00:10:54.500And there's some value that it starts with and then adds them all up, right?
00:10:54.500 -->
00:11:00.000So it says sum all the numbers from 0 till 2 to the end and 2 to the depth, right?
00:11:00.000 -->
00:11:07.040It has a switch statement that once it gets to the end, it stops and then sort of recurses down as it would.
00:11:07.360 -->
00:11:10.160And there's nothing that looks parallel about this whatsoever.
00:11:10.160 -->
00:11:16.980But what happens is this code actually runs in parallel potentially on those thousands of GPU cores.
00:11:16.980 -->
00:11:17.720Oh, wow.
00:11:17.720 -->
00:11:18.600Wild, right?
00:11:18.600 -->
00:11:19.080Yeah.
00:11:19.300 -->
00:11:31.160So the way it does that is, there's a picture here, is it breaks these things up into what are called computational graphs instead of work.
00:11:31.160 -->
00:11:39.440And then it just, it goes and processes them to see if that part of the graph can be parallelized, which is kind of nuts.
00:11:39.440 -->
00:11:42.360So you don't even write the parallel code.
00:11:42.360 -->
00:11:48.980It just looks at your code and goes, oh, that loop that we just saw or that recursion type of thing we just saw, that actually could be done.
00:11:48.980 -->
00:11:52.220Recursively by just changing the parameters or something, right?
00:11:52.220 -->
00:11:54.460So pretty wild.
00:11:54.460 -->
00:12:02.980And so, yeah, they have this HVM, highly massively parallel runtime that achieves near ideal speedups as a function across the available cores.
00:12:02.980 -->
00:12:06.660And then Ben is the programming language that runs in parallel, powered by this thing.
00:12:06.660 -->
00:12:08.440Looks like Python.
00:12:08.440 -->
00:12:13.320I don't know how compatible, say, its standard library is or things like that.
00:12:13.320 -->
00:12:13.700Yeah.
00:12:13.700 -->
00:12:16.920And then they have this thing called Kind, which is a parallel proof checker.
00:12:16.920 -->
00:12:18.240Have no idea about that.
00:12:18.240 -->
00:12:19.100I just said it's coming soon.
00:12:19.100 -->
00:12:21.040So this is available on GitHub.
00:12:21.040 -->
00:12:24.280And you come over and you can find their language.
00:12:24.280 -->
00:12:25.200And guess what?
00:12:25.200 -->
00:12:26.240It has 15,000 stars.
00:12:26.240 -->
00:12:27.800I'd never even heard of it until recently.
00:12:27.800 -->
00:12:28.340Yeah.
00:12:28.340 -->
00:12:29.120It's pretty popular.
00:12:29.120 -->
00:12:34.660Written in Rust, not that that's super relevant, but it's like powers a language that looks like Python.
00:12:34.660 -->
00:12:35.720That's pretty cool.
00:12:35.720 -->
00:12:39.920I'm cautiously optimistic about that.
00:12:39.920 -->
00:12:41.360It could be good.
00:12:41.580 -->
00:12:47.620So it looks like the real implementation for it is here, although it looks pretty short.
00:12:47.620 -->
00:12:48.000I don't know.
00:12:48.000 -->
00:12:49.240Updated a couple of days ago.
00:12:49.240 -->
00:12:51.200But here it says, yeah.
00:12:51.200 -->
00:12:52.040I don't know.
00:12:52.040 -->
00:12:55.180We'll have to see how large of a thing is it.
00:12:55.180 -->
00:12:57.200I guess that's just some pretty big scroll bars.
00:12:57.200 -->
00:12:59.340So maybe the whole runtime is here.
00:12:59.340 -->
00:12:59.860We'll see.
00:12:59.940 -->
00:13:03.960Maybe the number of files might be lower, but could have tons of stuff in there.
00:13:03.960 -->
00:13:04.740Yeah, that's true.
00:13:04.740 -->
00:13:07.140Anyway, is it going to be a thing?
00:13:07.140 -->
00:13:07.940I'm not sure.
00:13:07.940 -->
00:13:08.680Maybe.
00:13:08.680 -->
00:13:09.400Maybe not.
00:13:09.400 -->
00:13:12.440But it's cool to see people being creative for this kind of stuff.
00:13:12.440 -->
00:13:12.680You know?
00:13:12.680 -->
00:13:13.200Yeah.
00:13:13.200 -->
00:13:14.620Actually, it sounds pretty cool.
00:13:14.620 -->
00:13:15.260Yeah, it does.
00:13:16.380 -->
00:13:22.140To, I guess, simplify the way you get your code ready for massive parallel running.
00:13:22.140 -->
00:13:25.260If it can just look at your code and go, yeah, I got it.
00:13:25.260 -->
00:13:30.340Yeah, if it can look and say, this is what's often referred to as embarrassingly parallel,
00:13:30.340 -->
00:13:30.680right?
00:13:30.680 -->
00:13:33.040There's like no state shared.
00:13:33.040 -->
00:13:35.640You could just take the pieces and break them up and run them on cores.
00:13:35.640 -->
00:13:36.280Yeah.
00:13:36.280 -->
00:13:40.080If it just finds those automatically and does that, which is what it claims to do.
00:13:40.080 -->
00:13:41.220Yeah, that's great.
00:13:41.220 -->
00:13:42.140That's really great.
00:13:42.140 -->
00:13:42.400Yeah.
00:13:42.400 -->
00:13:43.080That's really great.
00:13:43.080 -->
00:13:44.380All right.
00:13:45.100 -->
00:13:47.820Next up, I've got regular expressions.
00:13:47.820 -->
00:13:51.400So we're getting all sorts of deep topics today.
00:13:51.400 -->
00:13:51.940We are.
00:13:51.940 -->
00:13:52.740We sure are.
00:13:52.740 -->
00:13:56.260So I ran across, I was looking at Reddit.
00:13:56.260 -->
00:14:01.860And so this book is an older book, about a year, I think it's a year old.
00:14:01.860 -->
00:14:06.280It's called The Smartest Way to Learn Python Regular Expressions.
00:14:06.280 -->
00:14:12.240And I don't normally pitch other people's books or anything on the show, but I thought it was
00:14:12.240 -->
00:14:14.420kind of nice that it's a LeanPub thing.
00:14:14.420 -->
00:14:15.920So they're doing their own thing.
00:14:15.920 -->
00:14:18.580And I guess I'll get into why I think this is kind of neat.
00:14:18.580 -->
00:14:20.520But the minimum price is free.
00:14:20.520 -->
00:14:26.960So if, and since they're allowing that, I encourage everybody to throw a few bucks their way if they
00:14:26.960 -->
00:14:28.860can, because why not?
00:14:28.860 -->
00:14:31.000It's good to have people teaching things.
00:14:31.880 -->
00:14:33.440Anyway, ran across it on Reddit.
00:14:33.440 -->
00:14:36.320And the topics sound neat.
00:14:36.320 -->
00:14:40.020So they go through an introduction of regular expressions.
00:14:40.020 -->
00:14:41.060They do an application.
00:14:41.060 -->
00:14:43.300I talk about puzzle learning and stuff.
00:14:43.300 -->
00:14:44.720And then I skimmed the rest.
00:14:44.720 -->
00:14:46.300But it looks like great stuff.
00:14:46.300 -->
00:14:51.980And some Python related thing to teach regular expressions would be good.
00:14:51.980 -->
00:14:53.760And then I went and watched their video.
00:14:53.760 -->
00:14:55.200And now I am even more intrigued.
00:14:55.200 -->
00:15:01.500So the idea around this book is that modern ways to learn are different than possibly people
00:15:01.500 -->
00:15:04.320my age might be used to, just reading a book and trying things out.
00:15:04.320 -->
00:15:06.400But this is set up.
00:15:06.400 -->
00:15:08.140There's a little video introduction to the book.
00:15:08.140 -->
00:15:13.540They're using the book itself as a long form teaching people.
00:15:13.900 -->
00:15:17.940But it's also, there's a video, there's a video course attached to it.
00:15:17.940 -->
00:15:22.960So if you, like, you get the book and you're reading through it, there's links to the different
00:15:22.960 -->
00:15:26.060course chapters within the book, which is kind of a neat idea.
00:15:26.060 -->
00:15:31.500And then there's puzzle solvers for each thing you're learning.
00:15:31.500 -->
00:15:34.300So you can go apply it in a puzzle environment.
00:15:34.300 -->
00:15:39.140And they're using a thing called Finfinkster.
00:15:39.620 -->
00:15:44.680It's an awful name, actually, I think, but F-I-N-X-T-E-R.
00:15:44.680 -->
00:15:48.040But it looks like there's a whole bunch of other people using it, too.
00:15:48.040 -->
00:15:49.360And I've never tried it.
00:15:49.360 -->
00:15:53.380But it's this kind of an online trying out some code platform, I think.
00:15:53.380 -->
00:15:57.500So I'm going to try this out.
00:15:57.500 -->
00:16:03.640I'm curious about the whole idea of reading a book and clicking on it and doing that as
00:16:03.640 -->
00:16:03.860well.
00:16:03.860 -->
00:16:09.100Mileage vary for me because I'm probably going to download this onto a Kindle.
00:16:09.100 -->
00:16:13.400And I can't click on anything with the Kindle, but at least the one I'm using.
00:16:13.400 -->
00:16:15.820But anyway, it might be fun to go through.
00:16:15.820 -->
00:16:16.860Yeah.
00:16:16.860 -->
00:16:17.740Looks excellent.
00:16:17.740 -->
00:16:20.940Give us a report when you get back.
00:16:20.940 -->
00:16:21.580Sure.
00:16:21.580 -->
00:16:22.160Yeah.
00:16:22.160 -->
00:16:23.160See how it went.
00:16:23.160 -->
00:16:23.920Yeah.
00:16:23.920 -->
00:16:29.220And, you know, not enough regular expression material out there for just deep, diving deep
00:16:29.220 -->
00:16:31.740and really getting your head around it.
00:16:31.740 -->
00:16:32.380Yeah.
00:16:32.380 -->
00:16:33.640They're very powerful if you're good at them.
00:16:33.640 -->
00:16:34.300Yeah.
00:16:34.300 -->
00:16:34.860Big if.
00:16:34.860 -->
00:16:38.020Those are our items.
00:16:38.020 -->
00:16:39.500Do we have any extras?
00:16:39.500 -->
00:16:40.480I have one.
00:16:40.480 -->
00:16:41.560That's quite interesting.
00:16:41.560 -->
00:16:43.500And I don't.
00:16:43.500 -->
00:16:46.000Somebody gave me a bit of a tip towards this.
00:16:46.000 -->
00:16:47.940I don't remember who it was.
00:16:47.940 -->
00:16:49.420So I think it was on Mastodon.
00:16:49.420 -->
00:16:50.700But thank you.
00:16:50.840 -->
00:16:53.400And sorry about forgetting who to credit here.
00:16:53.400 -->
00:16:57.260On Wikipedia, we have the Python Conference, aka PyCon.
00:16:57.260 -->
00:16:58.960And what does it say about it?
00:16:58.960 -->
00:17:04.820It says, the Python Conference, also called PyCon, is the largest annual convention for the discussion
00:17:04.820 -->
00:17:06.320and promotion of the Python language.
00:17:06.320 -->
00:17:07.740Scroll down a little bit, Brian.
00:17:07.740 -->
00:17:09.140You see things like, where was it?
00:17:09.220 -->
00:17:10.980In 2003, it was in D.C.
00:17:10.980 -->
00:17:12.360It had 200 attendees.
00:17:12.360 -->
00:17:14.4402012 was in Santa Clara.
00:17:14.440 -->
00:17:15.7802,300.
00:17:15.780 -->
00:17:17.680Oh, 2016.
00:17:17.680 -->
00:17:18.920Yeah, baby.
00:17:18.920 -->
00:17:19.260Portland.
00:17:19.260 -->
00:17:22.2403,391.
00:17:22.240 -->
00:17:23.200Almost.
00:17:23.200 -->
00:17:24.640Almost.
00:17:24.640 -->
00:17:25.980The record.
00:17:25.980 -->
00:17:27.420Almost.
00:17:27.420 -->
00:17:30.3403,393.
00:17:30.900 -->
00:17:37.320Two more people beat that number, came over that number from Cleveland, Ohio in the before
00:17:37.320 -->
00:17:37.700days.
00:17:37.700 -->
00:17:43.220And then COVID hit, knocked it down, and it's slowly building back.
00:17:43.220 -->
00:17:46.500Like in Pittsburgh, it was up to 2,500 again.
00:17:46.500 -->
00:17:47.720So what is that?
00:17:47.720 -->
00:17:53.540It's still got about 50% more to add or a third looking backwards.
00:17:53.540 -->
00:17:54.620It's down.
00:17:54.620 -->
00:17:55.960That's not what I want to talk about.
00:17:55.960 -->
00:17:59.580I want to show you what is in this Wikipedia table right below it.
00:17:59.580 -->
00:18:00.780Where we're going next.
00:18:01.100 -->
00:18:02.000The Long Beach, baby.
00:18:02.000 -->
00:18:03.020Going to California.
00:18:03.020 -->
00:18:03.980Let's go.
00:18:03.980 -->
00:18:05.080Going to the beach.
00:18:05.080 -->
00:18:06.100Going to some warm weather.
00:18:06.100 -->
00:18:07.760Going to a vacation spot.
00:18:07.760 -->
00:18:14.400I will bet you that this significantly beats those numbers because it's just a destination,
00:18:14.400 -->
00:18:14.680right?
00:18:14.680 -->
00:18:17.020People want to just go there to be there, right?
00:18:17.020 -->
00:18:19.460Well, it's kind of nice to see it on the West Coast.
00:18:19.460 -->
00:18:24.080I mean, nothing against Pittsburgh, but it's only two hours away from, where was it?
00:18:24.080 -->
00:18:24.560Cleveland.
00:18:24.560 -->
00:18:25.520Yeah.
00:18:25.520 -->
00:18:26.520Yeah.
00:18:26.520 -->
00:18:26.580Yeah.
00:18:26.580 -->
00:18:32.260So we did have Salt Lake City in the intermission times, but Salt Lake City was still under a
00:18:32.260 -->
00:18:33.200lot of funk.
00:18:33.200 -->
00:18:38.040It was the first one that came back in person after COVID.
00:18:38.040 -->
00:18:39.380So it was kind of funky.
00:18:39.380 -->
00:18:40.860I went to the 2023 one.
00:18:41.220 -->
00:18:46.520I know that, and I guess I'm going to go on the record of saying, I think that there's
00:18:46.520 -->
00:18:51.540a lot more cool destination things, destination places on the coasts.
00:18:51.540 -->
00:18:51.720Yeah.
00:18:51.960 -->
00:18:54.080And Midwest, obviously.
00:18:54.080 -->
00:18:59.740But I think doing it kind of in the middle of the country makes sense so that people can
00:18:59.740 -->
00:19:01.980get easy flights from anywhere in the country.
00:19:01.980 -->
00:19:02.920Just saying.
00:19:02.920 -->
00:19:04.120Yeah.
00:19:04.120 -->
00:19:06.120And what are you optimizing for, right?
00:19:06.120 -->
00:19:07.980Are you trying to move it around?
00:19:07.980 -->
00:19:10.020Are you trying to make it as centrally located?
00:19:10.020 -->
00:19:12.000Are you trying to make it as cheap as possible?
00:19:12.000 -->
00:19:13.660Are you trying to make it a destination?
00:19:14.520 -->
00:19:16.980All these different things play into this.
00:19:16.980 -->
00:19:18.820And this is the biggest funding for the PSF.
00:19:18.820 -->
00:19:21.360So it's not just like a curiosity, right?
00:19:21.360 -->
00:19:24.800This is the funding for the PSF to a significant degree.
00:19:24.800 -->
00:19:27.800It's interesting, though, that Portland was way back in 2017.
00:19:27.800 -->
00:19:33.520And this in 2026 is going to be the next time that it's going to be on the West Coast.
00:19:33.520 -->
00:19:37.640I don't think that I know that everybody on the East Coast thinks that Salt Lake is in
00:19:37.640 -->
00:19:39.240the West, but it's not really.
00:19:39.240 -->
00:19:41.880Not even the same time zone, Brian.
00:19:41.880 -->
00:19:43.540Not even the same time zone.
00:19:44.140 -->
00:19:45.700Mountain time, Pacific time.
00:19:45.700 -->
00:19:46.100Let's go.
00:19:46.100 -->
00:19:47.640Anyway, this is my extra.
00:19:47.640 -->
00:19:52.680Planned tentatively, the PyCon after Pittsburgh.
00:19:52.680 -->
00:19:54.240So next year is still Pittsburgh.
00:19:54.240 -->
00:19:55.240It's round two.
00:19:55.240 -->
00:19:56.660But then Long Beach, California.
00:19:56.660 -->
00:19:58.380And I'm here for it, Brian.
00:19:58.380 -->
00:20:00.580Also, I've always been curious about it.
00:20:00.580 -->
00:20:04.220Sometimes I'm curious about the numbers of how many people showed up in Montreal.
00:20:04.220 -->
00:20:06.780And it's cool to see.
00:20:06.780 -->
00:20:07.940You can just look it up on Wikipedia.
00:20:07.940 -->
00:20:08.540Yeah, yeah.
00:20:08.540 -->
00:20:09.200It's all right here.
00:20:09.200 -->
00:20:13.080I've got something completely random.
00:20:13.760 -->
00:20:18.340Prince of Persia was a video game from 89.
00:20:18.340 -->
00:20:19.520I remember it.
00:20:19.520 -->
00:20:22.120Oh, not only was it a video game.
00:20:22.120 -->
00:20:23.840It was one of the best video games.
00:20:23.840 -->
00:20:24.820It was so good.
00:20:24.820 -->
00:20:25.480Yeah.
00:20:25.480 -->
00:20:26.400Well, it was like this.
00:20:26.400 -->
00:20:30.660One of these cool, like, you know, racer through all sorts of stuff.
00:20:30.660 -->
00:20:33.920We had like the little runner thing and had to jump over all sorts of stuff.
00:20:33.920 -->
00:20:34.840It was a fun game.
00:20:35.420 -->
00:20:39.680And then there was a bunch of different permutations of it.
00:20:39.680 -->
00:20:41.360And it's still going strong.
00:20:41.360 -->
00:20:43.540I think still stuff going on.
00:20:43.540 -->
00:20:44.420There's a anyway.
00:20:44.420 -->
00:20:46.200Cool game.
00:20:46.200 -->
00:20:48.700But I ran across this.
00:20:48.700 -->
00:20:49.840There's a book about it.
00:20:50.160 -->
00:20:57.840So Jordan Mechner is a person that wrote it and originally wrote the Prince of Persia game.
00:20:58.240 -->
00:21:02.080And he wrote a book called Replay.
00:21:02.080 -->
00:21:04.420It's a memoir of an uprooted family.
00:21:05.200 -->
00:21:17.180And apparently it goes back to 1938 when somebody in his family, his parents fled Austria to escape the Nazi persecution.
00:21:17.180 -->
00:21:21.200And then, you know, they traveled to the U.S.
00:21:21.200 -->
00:21:22.860Eventually they went to France.
00:21:22.860 -->
00:21:26.880Then they went to eventually, I think, actually, I'm just making this up.
00:21:26.880 -->
00:21:29.040I don't know if we ever made it to the U.S.
00:21:29.040 -->
00:21:30.040I think so.
00:21:30.040 -->
00:21:34.700But then he goes back eventually.
00:21:34.700 -->
00:21:39.820Yeah, because he goes back eventually and works in France for a little while.
00:21:39.820 -->
00:21:47.040But then did this book about his life, his family and his life story and about the Prince of Persia.
00:21:47.040 -->
00:21:49.580So I'm kind of excited to read this.
00:21:49.580 -->
00:21:56.700I really like these looks inside the storytelling of the history of some of these famous games and famous platforms.
00:21:56.700 -->
00:21:58.740Yeah, they're very interesting.
00:21:58.740 -->
00:21:59.380Yeah.
00:21:59.380 -->
00:22:04.200And apparently his dad wrote the music for the original video game.
00:22:04.200 -->
00:22:04.540Okay.
00:22:04.540 -->
00:22:05.480It's kind of cool.
00:22:05.480 -->
00:22:11.260On a, I think, anyway, one of the older computers in the 80s.
00:22:11.260 -->
00:22:12.340So that's it.
00:22:12.340 -->
00:22:13.240That's my extra.
00:22:13.240 -->
00:22:14.380Awesome.
00:22:14.380 -->
00:22:18.460Let's close it out with a work hack joke.
00:22:18.460 -->
00:22:19.460I don't know what you call this, Brian.
00:22:19.720 -->
00:22:23.220So we have this woman developer sitting here, pretty happy.
00:22:23.220 -->
00:22:29.000And this boss comes in, manager says, I don't like this bash script you created.
00:22:29.000 -->
00:22:32.040Write it in Python instead, commands the boss.
00:22:32.040 -->
00:22:33.380Import subprocess.
00:22:33.380 -->
00:22:35.680Subprocess call work.sh.
00:22:36.220 -->
00:22:37.940Well, that's a day's work done.
00:22:37.940 -->
00:22:39.720Nice.
00:22:39.720 -->
00:22:41.820How about that?
00:22:41.820 -->
00:22:44.560Just if you want me to write in Python, I'll just call the script from Python.
00:22:44.560 -->
00:22:45.000Let's go.
00:22:45.360 -->
00:22:45.640Yeah.
00:22:45.640 -->
00:22:51.040Well, one of the times where I'm like, where early on, I guess not early on.
00:22:51.040 -->
00:22:56.000Anyway, 20 years ago or so, I find myself in a new job.
00:22:56.320 -->
00:23:00.200And they've got all these builds, make scripts for C++ code.
00:23:00.200 -->
00:23:01.460And I can't remember.
00:23:01.460 -->
00:23:05.720They were in batch files and bash and all sorts of stuff.
00:23:05.720 -->
00:23:08.620And I said, can you rewrite this?
00:23:08.620 -->
00:23:09.600Because it's kind of a mess.
00:23:09.600 -->
00:23:17.140So I rewrote it in a combination of, I had a combination of bash, Perl, Python, said, a whole
00:23:17.140 -->
00:23:21.200bunch of things, whatever I wanted to, to what I thought was an elegant solution.
00:23:21.200 -->
00:23:23.360And the team was horrified.
00:23:23.360 -->
00:23:25.640They're like, we're not learning that many languages.
00:23:26.160 -->
00:23:27.100I'm like, okay.
00:23:27.100 -->
00:23:29.440So I rewrote it all in Python.
00:23:29.440 -->
00:23:36.040And that was the first time I really grabbed Python for do whatever I want as a shell script
00:23:36.040 -->
00:23:36.740language.
00:23:36.740 -->
00:23:38.160Yeah, that's very cool.
00:23:38.160 -->
00:23:38.400Yeah.
00:23:38.400 -->
00:23:39.060I love it.
00:23:39.060 -->
00:23:40.340It's a subprocess call.
00:23:40.340 -->
00:23:40.860Yeah.
00:23:40.860 -->
00:23:42.120Subprocess.call.
00:23:42.120 -->
00:23:42.560That's right.
00:23:42.560 -->
00:23:43.040Yeah.
00:23:43.040 -->
00:23:43.760Nice.
00:23:43.760 -->
00:23:44.660Yeah.
00:23:44.660 -->
00:23:45.640Don't wait for it to complete.
00:23:45.640 -->
00:23:46.480Just let it go.
00:23:46.480 -->
00:23:49.340Well, yeah.
00:23:49.340 -->
00:23:49.660Works.
00:23:49.660 -->
00:23:51.160No error handling needed.
00:23:51.160 -->
00:23:52.400Let's just let it run.
00:23:52.400 -->
00:23:53.340No, it's a good joke.
00:23:53.340 -->
00:23:54.840And that comes from your credit where credit's due.
00:23:54.920 -->
00:23:56.180That comes from Linux handbook.
00:23:56.180 -->
00:23:57.240Linux handbook.
00:23:57.240 -->
00:23:57.560Nice.
00:23:57.560 -->
00:23:58.040Cool.
00:23:58.040 -->
00:24:00.660Well, thanks, Michael, for another wonderful episode.
00:24:00.660 -->
00:24:03.900As always, thanks for everyone for listening.