WEBVTT

00:00:00.001 --> 00:00:04.240
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:00:04.240 --> 00:00:10.880
your earbuds. This is episode 356, recorded October 10th, 2023. I'm Michael Kennedy.

00:00:10.880 --> 00:00:11.800
And I'm Brian Okken.

00:00:11.800 --> 00:00:16.180
And this episode is brought to you by us. Courses over at Talk Python Training,

00:00:16.180 --> 00:00:20.900
the complete pytest course from Brian, Patreon supporters, and find us over on Fosstodon.

00:00:20.900 --> 00:00:25.980
That's probably the best way to chat with us these days. And also be part of the live show,

00:00:25.980 --> 00:00:31.360
pythonbytes.fm/live, usually Tuesdays at 11 Pacific time. And you can also see all the old

00:00:31.360 --> 00:00:35.200
versions there as well. So Brian, what are you going to start us with today?

00:00:35.200 --> 00:00:41.960
Well, I thought I would start with a, it's kind of going to have a theme of getting information from

00:00:41.960 --> 00:00:51.260
from Fosstodon, people letting us know. So I saw today a post by the PsychoPG group. So

00:00:52.700 --> 00:00:59.200
PsychoPostgres and the post says it feels weird, but it's time to stop considering PsychoPG2,

00:00:59.200 --> 00:01:06.200
the present and PsychoPG3, the future. We've entered the time where PsychoPG3 is the present

00:01:06.200 --> 00:01:11.920
and two is the respectable past. Update, updated the feature page and a few other resources on the

00:01:11.920 --> 00:01:15.800
website to reflect this. So I thought I would check it out. So

00:01:15.800 --> 00:01:21.340
Awesome. That's big news. You know, Postgres is clearly the biggest database that people use in

00:01:21.340 --> 00:01:25.540
the Python space, according to the survey we talked about recently. So yeah, this is relevant, right?

00:01:25.540 --> 00:01:30.380
Yeah. And this is a great library. I've been using the version two for a long time. And I guess

00:01:30.380 --> 00:01:34.340
kind of like haven't been paying attention to the three, but it's been out for a while.

00:01:34.480 --> 00:01:42.420
So the three page talks about, basically talks about the, it's a new implementation of the most used,

00:01:42.420 --> 00:01:49.220
reliable and feature rich Postgres adapter for Python. And there is some differences though. So

00:01:49.220 --> 00:01:58.080
the apparently most of two was written in C, but three is written in a combination. So a lot of it's

00:01:58.080 --> 00:02:05.400
in Python and some of the speed ups are in C. And so the big announcement really is that there are no,

00:02:05.400 --> 00:02:11.080
so we're going to link to both the three page and the features page. And the features page has a nice

00:02:11.080 --> 00:02:18.280
comparison of the, of two versus three. So the really, the recommendation is they're still going to

00:02:18.280 --> 00:02:24.560
maintain two, but you should maybe think about mostly think about three for new projects. So if you

00:02:24.560 --> 00:02:30.100
already have an existing project that's running to go ahead and leave it running with that, I couldn't

00:02:30.100 --> 00:02:36.100
find where they're doing it when, or if, or where they're doing announced an end of life. So I don't

00:02:36.100 --> 00:02:41.660
think that's even planned at this point for end of life for two eventually probably, but so two has been

00:02:41.660 --> 00:02:48.640
around since 2006, three started in first release in 2021, but they've got a whole bunch of cool things

00:02:48.640 --> 00:02:56.200
in here. So some of the things I thought were pretty cool was we've got a native asyncio support.

00:02:56.200 --> 00:03:03.060
That looks pretty nice. Native support for more Python types, such as enums and Postgres types.

00:03:03.060 --> 00:03:08.700
So Postgres, one of the cool Postgres types was a multi-range. So that's supported now. That's pretty

00:03:08.700 --> 00:03:16.180
nice. And then I don't know what parameter bindings are actually, but apparently two has a client side

00:03:16.180 --> 00:03:23.580
parameter bindings and three defaults to server side parameter bindings. But you can still do client

00:03:23.580 --> 00:03:31.720
side if you want to. So lots of fun stuff in here. Advanced connection pool, static typing support.

00:03:31.720 --> 00:03:39.220
Yeah. So I say, why not try three and only go back to two if you really need to.

00:03:39.720 --> 00:03:44.880
Yeah. This is super exciting. Those are a lot of great features. I think the async support was previously done

00:03:44.880 --> 00:03:50.320
through a separate library and now it's just part of it. That's pretty cool.

00:03:50.320 --> 00:03:56.060
The what is the present? What is the past? What is the future? We'll come back to that in our extras.

00:03:56.060 --> 00:03:57.000
We'll have some fun there.

00:03:57.280 --> 00:04:16.180
Okay. And then also our audience is awesome. Mike says, Hey, I migrated PyPI from psycopg two to three in June. It was not too hard, but took some time to do safely. So, Hey, when you pip install things or IPI look up things, it's already using this. Awesome.

00:04:16.180 --> 00:04:23.080
Yeah. Oh, that's cool. Nice. Indeed. Indeed. All right. Shall we convert some data? That's what I got next.

00:04:23.080 --> 00:04:44.840
Sure. Let's talk about it. So we all know about Pydantic, right? And Pydantic is cool. So Pydantic lets us like create classes that derive from some Pydantic base type, base model, and it will do conversions and parsing of JSON and so on. But maybe, maybe you know about data classes, right? These are built in. They're not anything separate.

00:04:44.840 --> 00:05:07.460
They're part of Python itself. And so being able to use them is pretty cool. And Raymond Peck commented on one of our YouTube videos and said, Hey, I use this thing called Daysite. Hopefully that's the right pronunciation. Daysite. And the idea is it allows you to create Python data classes in a similar way. All right. So simple creation of data classes from dictionaries.

00:05:07.460 --> 00:05:24.440
So APIs and other things. And you just create a data classes as you normally would. Data classes, just sort of classes with, you know, global or static, static level field type, right? Like class user name, colon string, age, colon, and so on.

00:05:24.480 --> 00:05:32.480
So if you just put the data class wrapper on it, right? And it gives it a bunch of nice things like hash ability, comparability, et cetera, right? Constructors.

00:05:32.480 --> 00:05:48.480
But if you've got a dictionary that has sub objects that themselves should be data classes and maybe a list of other things that should be data classes, actually turning that JSON into one of these more complicated versions is a hassle, right?

00:05:48.480 --> 00:06:07.480
You also might need to do data conversion, as well, right, to make sure that the types match. So that's what you can use this for. And it's pretty neat. You can just say from dict, a site dot from dict, and you say what data class it's going to go to, and what the dictionary is and like a little factory method out pops one of these objects. Cool, right?

00:06:07.480 --> 00:06:37.460
Yeah, that's pretty cool. Yeah. And let's see, features include nested structures, like I described, basic type checking, optional fields, union. So if you say it can be an enter a string, it'll check that it's one of those two, but not a float or something, forward references, collections, and interestingly, custom type hooks. So for example, you can say anytime that you're going to take a string, actually call string a lot dot lower dot strip on it, if it's not null, right, if it's not none, things like that, right?

00:06:37.460 --> 00:07:07.440
So you can actually get into the parsing side a little bit if you need to. So that's pretty neat. What else have we got here? Let me scroll down and talks, of course, about all the things I said. Yeah, I think that's, that's probably it. I guess one thing it's worth pointing out, it says, right in the docs, they say, it's important to mention that it's not a data validation library. Now, when I first read that, I'm like, but there's all these types, right? Is it like, is it supposed to find out when I say the thing takes a string and an int and a bool for it?

00:07:07.440 --> 00:07:29.780
It's three fields, like it will actually do that. It does that, but you can't say like the string must be this regular expression and this many characters and the int has to be positive and like those types of things it doesn't do, right? So it's just dictionary to object, possibly complex data class object, but with type validation and that's about it. But still, I think that's super, super useful.

00:07:29.780 --> 00:07:31.780
So kind of partway validator things.

00:07:31.780 --> 00:07:42.420
Yeah. Yeah. More like a proper parser without the validation itself. Yeah. Yeah. Indeed. So anyway, that's what I got for people. It's, it was news to me. So check it out.

00:07:42.420 --> 00:08:04.540
I think that's pretty neat. So I am going to continue on with a topic of guests, the ever rustification of, of Python projects. And this one is one that we use every day pip. So this was, this came to us from Owen, Owen Lamont, I think.

00:08:04.540 --> 00:08:12.560
Owen Lamont. Thanks, Owen. So I said, said, Hey, you guys might be interested in this. It's a, a pro under the project group.

00:08:12.560 --> 00:08:40.240
And I was ready to go try it. It's not ready to try yet, but it's still pretty exciting. So the kind of the headline fast bareboins pip implementation and rust, and it's not just an installer though. So it has, it's got, what does it have so far? It's got, you can download an aggressively cache,

00:08:40.240 --> 00:08:47.860
a pipe PI PI metadata, resolve PI packages using a pack project called resolvo, which is a kind of a rust thing.

00:08:47.860 --> 00:08:53.540
And then still on the planned list is actually installing the files.

00:08:53.540 --> 00:09:01.440
So doesn't, I I'm just chuckling because yeah, I just jumped the gun, but this is new.

00:09:01.440 --> 00:09:04.260
So it's, it's fine that it's published early.

00:09:04.260 --> 00:09:12.380
So first commits look like about two weeks ago. So I'm pretty excited about, about this. I think it'd be fun to try it out.

00:09:12.380 --> 00:09:20.580
And, and look at different, possibly different resolvers and how they handled it versus normal pip. So kind of neat.

00:09:20.580 --> 00:09:29.500
Yeah. When I saw this too, I was pretty excited. So thanks Owen for sending this in. Yeah, it's, it's cool. And Mike says, let her rip. I love it.

00:09:30.460 --> 00:09:39.460
Yeah. So it looks like maybe we should swap the, these last two topics, but I don't know. Let's go with the, with your next topic.

00:09:39.460 --> 00:09:45.660
Well, I do think that this one would have been pretty good for you to cover, but too bad. I'm already on it. So here we go.

00:09:45.660 --> 00:10:00.980
I guess the only like stronger tie to me is it's in response to a talk Python episode. So this one comes to us from Marwin and thank you Marwin for sending it in and writing this article called how not to foot gun yourself when writing tests, a showcase of flaky tests.

00:10:00.980 --> 00:10:15.580
And it says, I was writing an article. I was writing this article after listening to talk Python with Gregory Kempfhammer and Owen Perry talking about flaky tests. So that was the subject to that basically talked about all of their experience here, which is cool.

00:10:15.580 --> 00:10:22.500
like a definition and really a lot of examples of flaky tests. I thought, I mean, you know, Brian, did you get to check any of these out?

00:10:22.500 --> 00:10:24.060
I haven't looked at this yet. No.

00:10:24.060 --> 00:10:26.220
Well, we'll do it live. Okay.

00:10:26.220 --> 00:10:26.500
Okay.

00:10:26.680 --> 00:10:35.900
So the first one is, really about concurrency and said, well, look, I've got a bunch of tests. Maybe I could speed them up by using threading and run a bunch of them.

00:10:35.900 --> 00:10:36.460
Oh yeah.

00:10:36.460 --> 00:10:50.960
That'd be fun. However, there's a real simple example of like, Hey, I've got an account and I can transfer money from one account to the other. So first account that withdraw this amount and then second account deposit that amount. Right. And how could that go wrong?

00:10:51.200 --> 00:11:01.920
So do a bunch of those in a, Hey, if we want to make those faster, let's run them in some threads, right? Rather than using say one of the pie test plugins, like more properly. Right. This is more to highlight, like what might go wrong.

00:11:01.920 --> 00:11:18.140
You know? and it turns out that we have the GIL and I think, I think Marlon's right. I think people do think that, the GIL will just kind of save you from concurrency. Right. Because only one thing can run at a time. So how are you going to have a problem? Well, well, it's one thing.

00:11:18.140 --> 00:11:21.660
It's one kind of byte code at a time.

00:11:21.660 --> 00:11:43.700
Exactly. One Python byte code. But here's the thing. If your program ever enters into a temporarily invalid state ever, you may, you may need, some kind of concurrency locks or something. And I think my reading of Python stuff, I don't see this very often. And I think actually a lot of people should be doing more locks, honestly.

00:11:43.700 --> 00:12:10.900
So even in this example, I withdraw some money and now for just a moment, the program is in a temporarily, temporarily invalid state until it's deposited into the other account. Right. So that's this moment. Like if the GIL says, okay, you read enough, we're going to switch to the other one. Then somebody tries to, the other one reads that state. That's going to be trouble. Right. So they were talking about, well, how do you actually, you know, how do you actually check this? And here's something I actually didn't even know.

00:12:10.900 --> 00:12:28.360
There's look, you can actually make that switching back and forth more aggressive. You can control that switching that the GIL does on the, how much Python on one thread it'll do before it switches to another by getting the switch interval. And here they set it to one 10th of a millisecond.

00:12:28.360 --> 00:12:29.180
Oh, wow.

00:12:29.180 --> 00:12:33.880
And then they do a bunch of work and then they put it back. And that's pretty interesting. Did you know you could do that?

00:12:33.880 --> 00:12:36.200
I didn't. This is pretty cool to,

00:12:36.200 --> 00:12:39.520
I know this might be worth covering the article right here. Just that.

00:12:39.520 --> 00:12:43.720
Yeah. Good for testing these race conditions.

00:12:43.720 --> 00:12:50.020
Yes, exactly. Like make it, make it worse. And also running on more cores potentially. I don't know. Probably that doesn't too much matter.

00:12:50.020 --> 00:12:57.540
Okay. So to avoid boilerplate, you can reach out to the high test repeat plugin. Weren't you just talking about this? I know you're doing some stuff with it.

00:12:57.600 --> 00:13:00.800
Yeah. I'm one of the maintainers on it now. There's my picture.

00:13:00.800 --> 00:13:09.720
Yeah. I feel like you, yeah, I feel like you had actually just mentioned it. Maybe it was the get, the get article or something. But anyway, recently I thought you were just talking about this.

00:13:09.720 --> 00:13:09.840
Yeah, that's sweet.

00:13:10.320 --> 00:13:20.340
Yeah, exactly. Also worth pointing out a similar and more straightforward plugin possibly for this job is pytest FlakeFinder, which is meant to find flaky tests.

00:13:20.340 --> 00:13:21.120
Oh, yeah.

00:13:21.680 --> 00:13:33.240
Okay. So let's just hang out for here. One of the differences they're saying is that you can repeat your test multiple times with repeat or FlakeFinder, you can repeat your whole suite.

00:13:33.240 --> 00:13:39.660
That's one of the things I need to change for repeat because you can do the same thing with repeat. You can run the whole suite.

00:13:39.660 --> 00:13:47.620
It's just kind of hidden in two lines of the readme and it needs to be more bolded that you can change the scope and repeat the whole thing.

00:13:47.620 --> 00:14:01.780
Oh, nice. Nice. All right. Randomness. For example, algorithms that are non-deterministic, like heuristic ones. So that's pretty interesting. So they do, what is this, like a distance algorithm or something that's heuristic.

00:14:01.780 --> 00:14:16.720
So they say like, you know, NP close, which they're testing on NP close, whereas NumPy, like are these vectors close, says basically fix this by actually, you know, computing the tolerance and they use a little statistics.

00:14:17.180 --> 00:14:29.040
Yeah. Probably more statistics than I know, but let's say three standard deviations away or something like that. It's interesting. Obviously floating point arithmetic is always trouble. Lost precision is always trouble.

00:14:29.040 --> 00:14:45.680
But one they talk about here that's interesting is using integers, like integers in Python are arbitrarily large, which I think probably complicates C interoperability every now and then. But otherwise is like a good thing generally.

00:14:46.040 --> 00:14:47.960
However, if you're doing NumPy,

00:14:47.960 --> 00:14:52.960
NumPy has C backing for a lot of its types, right?

00:14:52.960 --> 00:14:55.280
Like int32 and so on.

00:14:55.280 --> 00:14:57.280
So you could end up with,

00:14:57.280 --> 00:15:01.300
if you specify a particular data type in there,

00:15:01.300 --> 00:15:03.020
when you create your array, right?

00:15:03.020 --> 00:15:04.420
Data type is np int32.

00:15:04.420 --> 00:15:10.100
Then you do have to care about the 2.14 billion limit, right?

00:15:10.100 --> 00:15:10.660
Yeah.

00:15:10.660 --> 00:15:13.160
I mean, you probably know that all the time from C, right?

00:15:13.760 --> 00:15:18.940
You've got to worry about variable sizes and unsigned shorts and whatever.

00:15:18.940 --> 00:15:19.300
Yeah.

00:15:19.300 --> 00:15:20.980
And be careful about the order of operations

00:15:20.980 --> 00:15:24.220
so you don't overflow in the middle of a set of operations.

00:15:24.220 --> 00:15:24.580
Yeah.

00:15:24.580 --> 00:15:25.600
Let's see.

00:15:25.600 --> 00:15:28.360
There are some interesting things about fuzzing your data,

00:15:28.360 --> 00:15:30.100
like sending a bunch of crazy data

00:15:30.100 --> 00:15:33.760
or even using hypothesis to try to find edge cases.

00:15:33.760 --> 00:15:35.960
Timeouts for external systems.

00:15:35.960 --> 00:15:37.800
Be like super explicit about those.

00:15:37.800 --> 00:15:40.000
So there's just, you know, there are a bunch of cool examples.

00:15:40.000 --> 00:15:42.680
And you're like, this is a really properly long article here.

00:15:42.680 --> 00:15:43.620
Nice.

00:15:43.940 --> 00:15:46.600
So I think it really highlights a lot of good examples.

00:15:46.600 --> 00:15:49.620
Follow up to that podcast episode, but just good for testing as well.

00:15:49.620 --> 00:15:50.040
Yeah.

00:15:50.040 --> 00:15:53.220
I can't wait to read that more in closely and listen to that episode.

00:15:53.220 --> 00:15:55.120
I have to admit, I haven't listened to it yet.

00:15:55.120 --> 00:15:55.800
Yeah.

00:15:55.800 --> 00:15:56.520
It's a good one.

00:15:56.520 --> 00:16:01.680
Blaze out in the audience wonders if we have to reinvent these corner cases for Rust.

00:16:01.680 --> 00:16:03.480
I imagine we probably do, Blaze.

00:16:03.480 --> 00:16:04.000
Good point.

00:16:04.000 --> 00:16:04.500
Yeah.

00:16:04.500 --> 00:16:05.240
Possibly.

00:16:05.240 --> 00:16:07.220
How extra are you feeling, Brian?

00:16:07.640 --> 00:16:08.840
I'm feeling pretty extra.

00:16:08.840 --> 00:16:11.300
Actually, myself, not too much.

00:16:11.300 --> 00:16:15.780
I've just, I've been, I've been actually doing a lot of personal projects.

00:16:15.780 --> 00:16:19.600
So I haven't been doing a lot of work projects to announce.

00:16:19.600 --> 00:16:21.480
However, those are wrapping up.

00:16:21.480 --> 00:16:22.600
The personal stuff's wrapping up.

00:16:22.700 --> 00:16:28.340
So I hope to get more Python people and Python test episodes out soon and more course chapters

00:16:28.340 --> 00:16:28.720
coming.

00:16:28.720 --> 00:16:30.420
So everything in due time.

00:16:30.420 --> 00:16:30.900
Nice.

00:16:30.900 --> 00:16:31.600
How about you?

00:16:31.940 --> 00:16:33.820
I have some extras as well.

00:16:33.820 --> 00:16:36.740
First, I just got back from Pi Bay last night.

00:16:36.740 --> 00:16:38.380
So that was a lot of fun.

00:16:38.380 --> 00:16:42.280
Pi Bay is always a good time if I zoom out and get the video to play even.

00:16:42.280 --> 00:16:43.980
So really cool environment.

00:16:43.980 --> 00:16:46.580
And it's all, you know, nice to meet a lot of people there.

00:16:46.580 --> 00:16:49.140
So for those of you I met, great to meet you.

00:16:49.140 --> 00:16:52.660
Also, I just want to give a shout out to Sparkmail.

00:16:52.660 --> 00:16:55.600
I just started using Sparkmail to try to kind of like unify some stuff.

00:16:55.600 --> 00:16:59.920
What a cool, what a cool app for macOS email.

00:16:59.920 --> 00:17:05.720
So people, if you're like fed up, was using different web front-ins for different things.

00:17:05.720 --> 00:17:07.500
And it was like, ah, they're all a little bit different.

00:17:07.500 --> 00:17:09.380
One has E for archive.

00:17:09.380 --> 00:17:10.720
One has A for archive.

00:17:10.720 --> 00:17:14.980
But like ProtonMail, like the A for archive only periodically works.

00:17:14.980 --> 00:17:16.060
Sometimes it works.

00:17:16.060 --> 00:17:17.640
And then you're like, why is it so frustrating?

00:17:17.640 --> 00:17:19.360
I'm like, maybe I could just use one thing.

00:17:19.360 --> 00:17:21.440
And all in that was really fun.

00:17:21.440 --> 00:17:24.800
So also, I think a big part of the development team is in Ukraine.

00:17:24.800 --> 00:17:28.020
So happy to be supporting those folks as well.

00:17:28.020 --> 00:17:28.500
Nice.

00:17:28.920 --> 00:17:35.200
Somewhere it says like made from, you know, made from like hello from Ukraine or something

00:17:35.200 --> 00:17:36.060
like that, which is cool.

00:17:36.060 --> 00:17:41.580
However, one of the challenges is one of my personal email domains is actually backed by ProtonMail.

00:17:41.580 --> 00:17:42.960
I think I talked about that before.

00:17:42.960 --> 00:17:45.760
But ProtonMail has end-to-end encryption.

00:17:45.760 --> 00:17:49.300
And so you can't talk to it with a third-party email client, right?

00:17:49.300 --> 00:17:49.780
Okay.

00:17:49.900 --> 00:17:51.620
Because it can't decrypt it.

00:17:51.620 --> 00:17:52.700
It doesn't use IMAP.

00:17:52.700 --> 00:17:54.120
At least not directly.

00:17:54.120 --> 00:17:59.860
So if you use ProtonMail and you want to have something that is not, you know, there's a

00:17:59.860 --> 00:18:01.500
proper, like a standard email client.

00:18:01.500 --> 00:18:05.060
You can install this thing called Proton, what's it called?

00:18:05.060 --> 00:18:05.840
It's Bridge.

00:18:05.840 --> 00:18:07.540
ProtonMail Bridge is its name.

00:18:07.760 --> 00:18:10.160
And what it is it runs locally on your computer.

00:18:10.160 --> 00:18:16.300
It does all the end-to-end encryption and then puts it like it has a password protected but

00:18:16.300 --> 00:18:19.840
not end-to-end encrypted IMAP thing that just runs on localhost.

00:18:19.840 --> 00:18:22.500
So you just attach to localhost for your IMAP.

00:18:22.580 --> 00:18:26.920
And then you have ProtonMail plugged into, you know, their examples are Outlook, which

00:18:26.920 --> 00:18:29.660
just made me get a little wheezy just thinking about it.

00:18:29.660 --> 00:18:33.040
But, you know, it also works on SparkMail and other nice things.

00:18:33.040 --> 00:18:38.440
So I had been using SuperHuman, which was really nice, but that's only Gmail, which is such

00:18:38.440 --> 00:18:38.780
a hassle.

00:18:38.780 --> 00:18:41.820
So this works for anything, which makes me super happy.

00:18:41.820 --> 00:18:42.900
Yeah, I don't think I'm using...

00:18:42.900 --> 00:18:43.440
What do you do for email?

00:18:43.440 --> 00:18:47.760
I just use the web clients, but mostly it's FastMail.

00:18:47.760 --> 00:18:49.000
Yeah, nice.

00:18:49.000 --> 00:18:51.400
That's what I had been doing for 10 years.

00:18:51.500 --> 00:18:54.580
But I just kind of like, there were just too many and they were, I don't know, weird.

00:18:54.580 --> 00:18:55.420
And I'm like, let me try this.

00:18:55.420 --> 00:18:56.060
I really like it.

00:18:56.060 --> 00:18:57.680
I think I will check it out.

00:18:57.680 --> 00:19:00.980
One of the things that you brought up Outlook, I thought it was...

00:19:00.980 --> 00:19:08.180
I have to use Outlook for work and it still drives me crazy that Control-F is not find.

00:19:08.180 --> 00:19:09.120
It's forward.

00:19:09.120 --> 00:19:10.400
Oh my gosh.

00:19:10.400 --> 00:19:11.380
Yes.

00:19:11.380 --> 00:19:12.360
It's terrible.

00:19:12.360 --> 00:19:13.520
Yeah, this thing is nice.

00:19:13.520 --> 00:19:17.400
It has sort of digital well-being stuff where it will only show you...

00:19:17.400 --> 00:19:18.520
You can have it timeout.

00:19:18.520 --> 00:19:21.160
So it brings you to this thing like, hey, check your email.

00:19:21.360 --> 00:19:22.560
It's like two or three times a day.

00:19:22.560 --> 00:19:26.700
Show me on this little list here that'll just show, say, people that are important to me,

00:19:26.700 --> 00:19:27.500
but nobody else.

00:19:27.500 --> 00:19:28.880
You can block senders.

00:19:28.880 --> 00:19:30.320
It's pretty sweet.

00:19:30.320 --> 00:19:30.900
Nice.

00:19:30.900 --> 00:19:31.340
Cool.

00:19:31.340 --> 00:19:31.820
Yeah.

00:19:31.820 --> 00:19:32.320
Yeah.

00:19:32.320 --> 00:19:32.900
Okay.

00:19:34.180 --> 00:19:40.480
Next, one I hinted at before is I ran across this YouTube channel called Dust.

00:19:40.480 --> 00:19:41.140
Okay.

00:19:41.140 --> 00:19:44.380
Man, are they making amazing science fiction.

00:19:44.380 --> 00:19:45.100
Have you seen this?

00:19:45.100 --> 00:19:47.140
Just, you shared it with me last week.

00:19:47.140 --> 00:19:47.840
It was pretty cool.

00:19:48.120 --> 00:19:48.360
Yeah.

00:19:48.360 --> 00:19:50.640
It's just this independent channel.

00:19:50.640 --> 00:19:57.740
And they are posting like new, if you like short sci-fi, like 10, 20 minutes sci-fi stories.

00:19:57.740 --> 00:20:00.480
The production quality is just off the chart.

00:20:00.480 --> 00:20:05.240
So I recommend to people actually interested in this, FTL, Faster Than Light, which is about

00:20:05.240 --> 00:20:06.320
faster than light travel.

00:20:06.540 --> 00:20:07.760
And it's pretty neat.

00:20:07.760 --> 00:20:13.180
Like the graphics and stuff is, it's surprisingly good for what it is.

00:20:13.180 --> 00:20:14.300
So people can check that out.

00:20:14.300 --> 00:20:22.020
And also one called Oceanus, which is like about this sort of underwater world.

00:20:22.020 --> 00:20:24.120
And yeah, it's like this one's 30 minutes.

00:20:24.120 --> 00:20:24.580
It's long.

00:20:25.140 --> 00:20:30.060
But anyway, if people want, you know, short form science fiction, this is pretty awesome.

00:20:30.060 --> 00:20:31.040
I'll link to it in the show notes.

00:20:31.040 --> 00:20:31.960
Oh, that's pretty cool.

00:20:31.960 --> 00:20:32.420
Yeah.

00:20:32.420 --> 00:20:35.160
Blaze out there says FTL is a great short.

00:20:35.160 --> 00:20:36.220
I totally agree.

00:20:36.220 --> 00:20:37.520
It's very, very well done.

00:20:37.520 --> 00:20:38.420
Neat.

00:20:38.420 --> 00:20:38.860
Yeah.

00:20:38.860 --> 00:20:42.980
And it's not always the Hollywood, like, of course the good person has to, you know, the

00:20:42.980 --> 00:20:44.400
hero has to triumph at the end.

00:20:44.400 --> 00:20:46.000
Of course, it's just a matter of how.

00:20:46.000 --> 00:20:46.520
Yeah.

00:20:46.520 --> 00:20:47.060
You never know.

00:20:47.060 --> 00:20:50.980
Some of these are pretty open-ended as you might expect a 10 minute show to be.

00:20:50.980 --> 00:20:55.100
Well, you know, I think, you know, there's some half hour shows on TV.

00:20:55.300 --> 00:20:57.840
That really are only like 15 minutes if you take the commercials.

00:20:57.840 --> 00:20:58.300
I know.

00:20:58.300 --> 00:21:02.700
A lot of the comments on, if you look at like the FTL one, for example, the comments are

00:21:02.700 --> 00:21:08.180
like, this is a better show than Hollywood studios make with millions of dollars and large

00:21:08.180 --> 00:21:08.480
teams.

00:21:08.480 --> 00:21:09.480
Like, how are you all doing this?

00:21:09.480 --> 00:21:13.740
So anyway, I thought people might appreciate this given our audience is probably a little

00:21:13.740 --> 00:21:14.480
bit techie.

00:21:14.480 --> 00:21:14.720
Yeah.

00:21:14.720 --> 00:21:15.140
Cool.

00:21:15.140 --> 00:21:15.540
Right.

00:21:15.540 --> 00:21:20.880
Have you ever wanted to just like rewrite your software, like some old junkie thing,

00:21:20.880 --> 00:21:23.480
wrote it in some old code and you're going to rewrite the new awesomeness?

00:21:24.560 --> 00:21:25.440
frequently.

00:21:25.440 --> 00:21:25.820
Yes.

00:21:25.820 --> 00:21:28.960
There's an amazing, so this is the joke.

00:21:28.960 --> 00:21:34.620
So there's an amazing video, a music video, which is a parody on American pie.

00:21:34.620 --> 00:21:38.000
And for those of you who are not familiar with American pie, it's one, it's a really great

00:21:38.000 --> 00:21:38.240
song.

00:21:38.240 --> 00:21:38.780
Oh, you're just singing.

00:21:38.780 --> 00:21:39.440
But it's eight.

00:21:39.440 --> 00:21:40.300
No, I'm not singing.

00:21:40.300 --> 00:21:42.100
Okay.

00:21:42.100 --> 00:21:44.320
It's eight and a half minutes long.

00:21:44.320 --> 00:21:50.840
And so this guy, Dylan Beattie, he's really talented and he redid one that basically is

00:21:50.840 --> 00:21:56.460
like a journey through all the follies of his different perspectives through his programming

00:21:56.460 --> 00:21:56.920
career.

00:21:56.920 --> 00:21:59.080
And it starts out in like assembly.

00:21:59.080 --> 00:22:01.680
And then it goes, I don't know what it's the next one.

00:22:01.720 --> 00:22:03.140
Is it VB6 or something?

00:22:03.140 --> 00:22:06.480
And then, oh, it's just, it's an amazing, amazing thing.

00:22:06.480 --> 00:22:08.100
But eight and a half minutes, I'm not going to play it.

00:22:08.100 --> 00:22:10.220
So I'm just going to say, go watch the video.

00:22:10.220 --> 00:22:10.720
Yeah.

00:22:10.780 --> 00:22:12.560
It's, I'm sure it will connect with you.

00:22:12.560 --> 00:22:13.100
What do you think, Ray?

00:22:13.100 --> 00:22:14.000
It's very good.

00:22:14.000 --> 00:22:18.560
And then check out his channel because there's a bunch of great nerdy videos on his channel.

00:22:18.560 --> 00:22:19.480
So it's good.

00:22:19.480 --> 00:22:19.720
Yeah.

00:22:19.720 --> 00:22:21.900
If we scroll down here, what will we find in the recommended?

00:22:21.900 --> 00:22:24.420
You give rest a bad name.

00:22:24.420 --> 00:22:25.020
That's funny.

00:22:25.020 --> 00:22:25.880
That was a good one.

00:22:25.880 --> 00:22:26.320
Yeah.

00:22:26.320 --> 00:22:32.700
The bug in the JavaScript, I think we featured before, but it's like starting to think I might

00:22:32.700 --> 00:22:35.500
need a drink because the bug is in the JavaScript.

00:22:35.500 --> 00:22:36.940
That's pretty good.

00:22:36.940 --> 00:22:37.380
Yeah.

00:22:37.380 --> 00:22:38.280
Fun.

00:22:38.280 --> 00:22:38.780
Yeah.

00:22:38.780 --> 00:22:39.220
Fun.

00:22:39.220 --> 00:22:46.400
Anyway, so this is an entry point into quite a bit of time of programmer fun ideas.

00:22:46.400 --> 00:22:46.840
Okay.

00:22:46.840 --> 00:22:48.680
So that, and that's a programmer one.

00:22:48.680 --> 00:22:53.940
I've had like a dad joke, science joke that I wanted to share because I just, I ran across

00:22:53.940 --> 00:22:56.880
it recently and I just thought it was so funny.

00:22:56.880 --> 00:22:59.420
So it's just a comment.

00:22:59.420 --> 00:23:05.060
There are more hydrogen atoms in a single molecule of water than there are stars in the entire solar

00:23:05.060 --> 00:23:05.440
system.

00:23:05.440 --> 00:23:10.040
And I talked to several people about it and they just looked at me blankly and said, that

00:23:10.040 --> 00:23:10.940
can't be true.

00:23:10.940 --> 00:23:11.960
I'm like, sure.

00:23:11.960 --> 00:23:18.520
There's two hydrogen atoms in a molecule of water and there's one star in our solar system.

00:23:18.520 --> 00:23:20.500
That's awesome.

00:23:20.500 --> 00:23:23.700
And those two hydrogen atoms.

00:23:23.700 --> 00:23:25.760
Do the hydrogen atoms come from stars?

00:23:25.760 --> 00:23:26.280
I don't know.

00:23:26.280 --> 00:23:27.260
Were they just the stars?

00:23:27.260 --> 00:23:29.380
Anything larger than that should have come from stars.

00:23:29.560 --> 00:23:29.840
Yeah.

00:23:29.840 --> 00:23:30.320
That's awesome.

00:23:30.320 --> 00:23:31.020
I love it.

00:23:31.020 --> 00:23:35.920
It doesn't make you think, cause like if you think galaxy universe, whatever, right?

00:23:35.920 --> 00:23:36.320
Yeah.

00:23:36.320 --> 00:23:39.220
But solar system, I mean, solar singular.

00:23:39.220 --> 00:23:39.820
Yeah.

00:23:39.820 --> 00:23:45.700
And I had, it was funny that some of the comments were like, like trying to calculate the volume

00:23:45.700 --> 00:23:48.340
of the water and how many atoms might be there.

00:23:48.340 --> 00:23:49.580
And I'm like, no, it's not an atom.

00:23:49.780 --> 00:23:51.680
It's single molecule of water.

00:23:51.680 --> 00:23:54.120
I'm not, not a glass of it.

00:23:54.120 --> 00:23:55.280
So pretty fun.

00:23:55.280 --> 00:23:55.460
Yeah.

00:23:55.460 --> 00:23:56.160
That's how I first started.

00:23:56.160 --> 00:23:57.780
Like, well, how large is the glass?

00:23:57.780 --> 00:23:58.120
How many?

00:23:58.120 --> 00:23:58.440
Okay.

00:23:58.440 --> 00:23:59.220
How many more is that?

00:23:59.220 --> 00:23:59.560
And how many?

00:23:59.560 --> 00:24:00.180
No, wait.

00:24:00.180 --> 00:24:01.860
That's not what it says at all.

00:24:01.860 --> 00:24:02.480
That's irrelevant.

00:24:02.480 --> 00:24:03.140
Yeah.

00:24:03.140 --> 00:24:03.920
I love it.

00:24:03.920 --> 00:24:04.220
Anyway.

00:24:04.220 --> 00:24:04.780
All right.

00:24:04.780 --> 00:24:05.700
Well, cool.

00:24:05.700 --> 00:24:08.300
Well, once again, great chatting with you weekly.

00:24:08.300 --> 00:24:08.920
Yep.

00:24:08.920 --> 00:24:09.780
You as well.

00:24:09.780 --> 00:24:11.780
And thanks to everyone for listening.

00:24:11.780 --> 00:24:12.400
See y'all later.

