WEBVTT

00:00:00.001 --> 00:00:04.820
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:04.820 --> 00:00:11.060
This is episode 317, recorded January 3rd, 2023, and I am Brian Okken.

00:00:11.060 --> 00:00:12.200
Hello, I'm Michael Kennedy.

00:00:12.200 --> 00:00:14.760
Welcome to 2023. How exciting.

00:00:14.760 --> 00:00:20.040
It is very exciting. It's a lot like 2022, but I think maybe a little more optimism. We'll see.

00:00:20.040 --> 00:00:26.880
Yeah, but I've had one extra shower since 2022. Do you remember 2022? It just feels like a few days ago.

00:00:26.880 --> 00:00:29.700
It honestly, it really flew by. Yeah.

00:00:30.100 --> 00:00:33.720
I mean, we stayed inside for like two years and they're like, hey, look, we're going to go outside.

00:00:33.720 --> 00:00:36.400
Oh, time flies when you're not just stuck inside.

00:00:36.400 --> 00:00:38.920
I even actually rode a bicycle the other day.

00:00:38.920 --> 00:00:39.600
Nice.

00:00:39.600 --> 00:00:41.760
And then Oregon said we're going to rain for two weeks.

00:00:41.760 --> 00:00:43.300
Of course. Of course it did.

00:00:43.300 --> 00:00:46.260
Yeah. Well, let's kick it off. What do you got for us first?

00:00:46.260 --> 00:00:52.500
All right. Let's talk about the Stack Overflow 2022 developer survey.

00:00:52.500 --> 00:00:58.760
Now, this is one of the better surveys that gives you a pulse on the developer community.

00:00:59.380 --> 00:01:03.140
It's, you know, we do the PSF survey every year and that one I think is really well done.

00:01:03.140 --> 00:01:06.240
This one's interesting because it's not just Python, obviously.

00:01:06.240 --> 00:01:08.800
It's all of Stack Overflow people.

00:01:08.800 --> 00:01:09.340
Yeah.

00:01:09.340 --> 00:01:11.580
And it's really, really long.

00:01:11.580 --> 00:01:12.920
Notice the scroll bar.

00:01:13.040 --> 00:01:19.480
So I'm going to try to go through these and just hit on some of the high points for us.

00:01:19.480 --> 00:01:20.080
All right.

00:01:20.080 --> 00:01:22.820
So they did that as well for us at the top here.

00:01:22.820 --> 00:01:26.160
They kind of summarized some little things you can call out in the jump to other sections saying,

00:01:26.520 --> 00:01:30.380
learning to code online increased by 10% year over year.

00:01:30.380 --> 00:01:35.540
However, respondents older than 45 years are most likely to have learned from books,

00:01:35.540 --> 00:01:45.520
whereas the youngins are more likely to use some kind of online course or, you know, YouTube video or something along those lines.

00:01:45.520 --> 00:01:46.760
Does that surprise you?

00:01:46.760 --> 00:01:47.460
No.

00:01:47.860 --> 00:01:48.380
Yeah, me either.

00:01:49.200 --> 00:01:55.380
So last year they said we saw Git rise as a fundamental tool of software development.

00:01:55.380 --> 00:01:59.080
So like if you are a software developer, you basically just need to know Git.

00:01:59.080 --> 00:02:06.560
Surprisingly, this year they said that's Docker this year, increasing from 55% usage to 69% usage.

00:02:06.960 --> 00:02:12.700
And I kind of feel like the hype and the heyday of Docker was actually a couple of years ago.

00:02:12.700 --> 00:02:17.540
And I hear a little bit less, maybe it's just less hype, but it's just more like, yeah, we're just using it.

00:02:17.540 --> 00:02:21.200
But I don't know that that was surprising and interesting to me.

00:02:21.200 --> 00:02:24.540
I'm using it more in places where I didn't used to.

00:02:24.540 --> 00:02:25.620
Like what?

00:02:25.620 --> 00:02:29.060
Build chains for just to keep them consistent.

00:02:29.060 --> 00:02:31.980
We're just, and it isn't even a cloud thing.

00:02:31.980 --> 00:02:38.320
It's just having, being able to have a consistent build system no matter what machine you're on.

00:02:38.320 --> 00:02:39.980
Yeah, that makes a lot of sense.

00:02:39.980 --> 00:02:43.040
CI systems are utilizing Docker more.

00:02:43.040 --> 00:02:43.560
Sure.

00:02:43.560 --> 00:02:48.360
I've heard of even people using Docker to manage and employ.

00:02:48.360 --> 00:02:49.960
Is that how you would phrase it?

00:02:49.960 --> 00:02:54.320
Little apps to Raspberry Pis for like home automation and stuff.

00:02:54.320 --> 00:02:54.780
Really?

00:02:54.780 --> 00:03:00.020
I'm sure there would be more of that if you could actually get a Raspberry Pi, but you know, this is more of a theoretical.

00:03:00.300 --> 00:03:02.220
Those who already have the Raspberry Pi.

00:03:02.220 --> 00:03:09.060
The most, one of my favorite sections of this is the most loved, most dreaded and most wanted.

00:03:09.060 --> 00:03:09.840
Yeah.

00:03:09.840 --> 00:03:17.040
Because it really tells you, you know, how do people feel about how things are now and how do they feel about where they're going?

00:03:17.040 --> 00:03:17.540
Right.

00:03:17.540 --> 00:03:26.360
What, what would they do if they were unencumbered by, you know, their boss saying, nope, we're using this particular database or nope, it's all Angular.

00:03:26.600 --> 00:03:30.360
And you're on the team that does Angular, so I don't care what you want, you're doing Angular, you know?

00:03:30.360 --> 00:03:35.300
And so Rust is on its seventh year as the most loved language.

00:03:35.300 --> 00:03:36.880
Seven years?

00:03:36.880 --> 00:03:38.340
Is it even seven years old?

00:03:38.340 --> 00:03:39.220
I know.

00:03:39.220 --> 00:03:39.880
I know.

00:03:39.880 --> 00:03:40.740
That's my thought as well.

00:03:40.740 --> 00:03:41.280
Okay.

00:03:41.700 --> 00:03:45.200
Seven percent of developers saying they want to continue using it.

00:03:45.200 --> 00:03:45.740
Wow.

00:03:45.740 --> 00:03:48.260
I mean, yeah, anyway, that's pretty interesting.

00:03:48.260 --> 00:03:56.540
But it also, Python and Rust are basically exactly tied as the most wanted programming language.

00:03:56.540 --> 00:03:57.240
That's cool.

00:03:57.240 --> 00:03:58.220
I can see that.

00:03:58.480 --> 00:03:59.260
Yeah, absolutely.

00:03:59.260 --> 00:04:00.780
Phoenix.

00:04:00.780 --> 00:04:05.300
Phoenix is some web framework I've never heard of that is apparently the most popular.

00:04:05.300 --> 00:04:09.800
AngularJS, it continues into its third year of being the most dreaded.

00:04:09.800 --> 00:04:10.800
All right.

00:04:10.800 --> 00:04:11.200
What else?

00:04:11.200 --> 00:04:11.900
Go ahead.

00:04:11.900 --> 00:04:13.280
Oh, just React.

00:04:13.280 --> 00:04:14.760
Yeah.

00:04:14.760 --> 00:04:16.520
It's most wanted, but who knows?

00:04:16.520 --> 00:04:17.460
Yeah, exactly.

00:04:17.460 --> 00:04:23.040
So some of these questions and some of these phrasings and analyses are super, super good,

00:04:23.040 --> 00:04:24.920
and others are really bad.

00:04:24.920 --> 00:04:26.960
So I'll try to highlight some of these.

00:04:26.960 --> 00:04:28.700
So let me jump down here.

00:04:28.700 --> 00:04:31.160
Well, I don't really care about the education stuff.

00:04:31.160 --> 00:04:32.540
Education.

00:04:32.540 --> 00:04:34.340
Education profile.

00:04:34.340 --> 00:04:39.800
It tells you things like, yeah, there's an insane number of guys versus women.

00:04:39.800 --> 00:04:40.860
No, that's fine.

00:04:40.860 --> 00:04:43.700
I just thought it was funny that you said I don't care about education.

00:04:43.700 --> 00:04:44.880
No, I don't.

00:04:47.100 --> 00:04:49.420
Teacher, you know, leave the kids alone.

00:04:49.420 --> 00:04:49.800
All right.

00:04:49.800 --> 00:04:54.720
So no, like it's fine, but it's, you know, people can check it out if they care about it,

00:04:54.720 --> 00:04:54.940
right?

00:04:54.940 --> 00:04:58.260
Like there's stuff about the demographics, like age and gender.

00:04:58.260 --> 00:04:59.280
That is pretty interesting.

00:04:59.280 --> 00:05:01.260
I wish some of these numbers were better.

00:05:01.260 --> 00:05:04.840
Like, yeah, it totally is.

00:05:04.840 --> 00:05:05.160
Right.

00:05:05.160 --> 00:05:07.220
But, you know, that's also not news.

00:05:07.220 --> 00:05:11.500
So, yeah, some of the most popular technologies here.

00:05:11.500 --> 00:05:16.140
Now, I know, Brian, I might just be getting older and grumpy, but when I look at this,

00:05:16.180 --> 00:05:20.760
there's like, it's almost all these responses are broken into two segments, professional

00:05:20.760 --> 00:05:22.940
developers and learning to code people.

00:05:22.940 --> 00:05:26.380
And the default is to take all those together.

00:05:26.380 --> 00:05:28.180
And I guess that's the biggest picture.

00:05:28.180 --> 00:05:29.220
But I don't know.

00:05:29.220 --> 00:05:32.500
I just, when I look at this, I'm just like professional developers tell me about this.

00:05:32.500 --> 00:05:38.440
Like, you know, if some, if you're on your third week of a coding tutorial and that tutorial

00:05:38.440 --> 00:05:43.600
says use this, like how, how much does that really speak to the state of the community?

00:05:43.600 --> 00:05:44.740
I don't think it, you know.

00:05:44.740 --> 00:05:45.060
Agreed.

00:05:45.540 --> 00:05:49.200
So I'm checking, like when I think about these, I'm just going to check professional

00:05:49.200 --> 00:05:49.620
developer.

00:05:49.620 --> 00:05:51.680
And if you want the same numbers, you can do so as well.

00:05:51.680 --> 00:05:52.700
So where are we?

00:05:52.700 --> 00:05:56.440
We are on programming languages, scripting and markup.

00:05:56.440 --> 00:05:59.680
JavaScript is definitely the most popular here.

00:05:59.680 --> 00:06:03.920
This is one of those areas where I don't, I think you need to phrase it a little bit different.

00:06:04.020 --> 00:06:05.900
Let's see what the question exactly is.

00:06:05.900 --> 00:06:12.400
Which programming languages have you done extensive development work in over the year, over the

00:06:12.400 --> 00:06:12.820
last year?

00:06:12.820 --> 00:06:13.140
Okay.

00:06:13.140 --> 00:06:17.760
I, I don't know how quite how to solve this problem, but there's a ton of Python people

00:06:17.760 --> 00:06:18.880
who did JavaScript work.

00:06:18.880 --> 00:06:19.360
Yeah.

00:06:19.360 --> 00:06:24.020
There is a ton of C++ people who did SQL, right?

00:06:24.020 --> 00:06:25.600
There's also Python people who did SQL.

00:06:25.600 --> 00:06:32.880
So SQL ranks above Python, but there's very few people whose job it is as a developer to

00:06:32.880 --> 00:06:36.100
write SQL and not use something else.

00:06:36.100 --> 00:06:36.660
Right.

00:06:36.660 --> 00:06:40.160
So that's, it's weird to have SQL even in there.

00:06:40.160 --> 00:06:40.900
Yeah, I know.

00:06:40.900 --> 00:06:43.300
Well, HTML and CSS, right.

00:06:43.300 --> 00:06:45.700
Is, is like a little bit weirder as well.

00:06:45.700 --> 00:06:50.820
And so I feel like it should say like, what is your primary programming language or something

00:06:50.820 --> 00:06:52.580
like, you know, something like that.

00:06:52.580 --> 00:06:52.760
Right.

00:06:52.760 --> 00:06:55.600
I feel like it's, it's, it's kind of like favorite movie.

00:06:55.600 --> 00:06:58.380
Like what's your favorite movie, but not princess bride.

00:06:58.380 --> 00:07:00.040
Other than that, what's your favorite movie?

00:07:00.040 --> 00:07:01.000
Yes, exactly.

00:07:01.000 --> 00:07:01.740
Exactly.

00:07:01.740 --> 00:07:07.240
So like there's people who do Node.js and JavaScript, and that is what I think this top bar where

00:07:07.240 --> 00:07:08.520
JavaScript is should represent.

00:07:08.520 --> 00:07:08.920
Yeah.

00:07:08.920 --> 00:07:11.220
But it's that plus everyone else, right?

00:07:11.220 --> 00:07:11.860
Aggregated.

00:07:11.860 --> 00:07:12.980
so I don't know.

00:07:12.980 --> 00:07:15.260
It's, these are a little bit weird, but I'll just go to the top.

00:07:15.260 --> 00:07:15.420
Yeah, back end.

00:07:15.420 --> 00:07:20.400
So like, unless you're primarily just a front end developer, what back end languages?

00:07:20.400 --> 00:07:21.260
Right, right.

00:07:21.300 --> 00:07:24.040
Or maybe you're using Node on the back end, but then other than that.

00:07:24.040 --> 00:07:28.420
So, JavaScript, number one, HTML, top programming language.

00:07:28.420 --> 00:07:28.880
Okay.

00:07:28.880 --> 00:07:31.840
SQL, third most, and then Python and then TypeScript.

00:07:31.840 --> 00:07:34.420
So, you know, like a bunch of interesting ones.

00:07:34.420 --> 00:07:42.540
And then you've got your, your, your, VM, garbage collected JavaScript, Java and C# back there.

00:07:42.540 --> 00:07:45.340
And then it starts to fall, fall off pretty quick after that.

00:07:45.340 --> 00:07:48.700
Down at the very bottom, let's see the very bottom one is Crystal.

00:07:48.700 --> 00:07:49.280
Okay.

00:07:49.280 --> 00:07:50.220
And APL.

00:07:50.220 --> 00:07:50.940
Oh my gosh.

00:07:50.940 --> 00:07:51.740
APL.

00:07:51.740 --> 00:07:53.860
APL is, is, something.

00:07:53.860 --> 00:07:54.280
All right.

00:07:54.280 --> 00:07:57.780
another one that's worth, talking about is databases.

00:07:57.780 --> 00:08:04.640
So we've got Postgres, MySQL, SQLite, SQL Server, MongoDB as the top five.

00:08:04.640 --> 00:08:08.740
So, it's pretty clear that Postgres has the momentum.

00:08:08.740 --> 00:08:12.400
Like MySQL was higher and now Postgres is passing it.

00:08:12.440 --> 00:08:15.180
But, you know, that's kind of, going up, here.

00:08:15.180 --> 00:08:18.600
So this is which environments have you done extensive work in?

00:08:18.600 --> 00:08:22.560
We'll also see that in like the loved versus dreaded section.

00:08:22.560 --> 00:08:23.100
Yeah.

00:08:23.100 --> 00:08:28.220
And by the way, on the audience, Marco says, I've already aged myself with that Pink Floyd reference.

00:08:28.220 --> 00:08:28.540
Indeed.

00:08:28.540 --> 00:08:29.060
Yeah.

00:08:29.060 --> 00:08:30.840
All right.

00:08:30.840 --> 00:08:37.260
So cloud platforms, you know, AWS, I'm going to surprise you that AWS has over half of the entire market.

00:08:37.260 --> 00:08:37.860
No.

00:08:37.860 --> 00:08:38.480
No.

00:08:38.480 --> 00:08:41.140
But only, it's only a smidge over half, it's 55.

00:08:41.140 --> 00:08:41.580
So.

00:08:41.840 --> 00:08:42.500
Yeah, exactly.

00:08:42.500 --> 00:08:44.160
web technologies.

00:08:44.160 --> 00:08:45.560
Here's another one.

00:08:45.560 --> 00:08:47.020
no, not this.

00:08:47.020 --> 00:08:48.520
This one's kind of, kind of okay.

00:08:48.520 --> 00:08:54.020
But like, for example, they've got Node.js, but they don't have Python, right?

00:08:54.120 --> 00:08:55.460
So, I don't know.

00:08:55.460 --> 00:08:56.740
It's a little bit funky.

00:08:56.740 --> 00:09:06.500
Like they've Node and Express and Express runs on Node, whereas they have Flask and Django, but they don't have the thing that Django and Flask run on.

00:09:06.500 --> 00:09:07.540
Which is, I don't know.

00:09:07.580 --> 00:09:09.920
Anyway, it's a little bit of a challenging one.

00:09:09.920 --> 00:09:12.500
But Node and React are quite high up there.

00:09:12.500 --> 00:09:17.960
Look at this artifact, this living fossil right here, Brian.

00:09:17.960 --> 00:09:18.920
What's number three?

00:09:18.920 --> 00:09:19.620
jQuery.

00:09:19.620 --> 00:09:20.480
jQuery.

00:09:20.480 --> 00:09:21.240
You know it.

00:09:21.240 --> 00:09:23.400
Dollar document ready.

00:09:23.400 --> 00:09:23.940
Let's go.

00:09:23.940 --> 00:09:24.860
All right.

00:09:25.140 --> 00:09:26.740
I learned jQuery a long time ago.

00:09:26.740 --> 00:09:30.420
Yeah, I still use a little bit of jQuery if there's some site that's already using it.

00:09:30.420 --> 00:09:31.160
I'm like, yeah, whatever.

00:09:31.160 --> 00:09:34.360
It's gonna, I'm just gonna put one handler in here and not worry about it.

00:09:34.360 --> 00:09:35.580
FastAPIs on the list.

00:09:35.580 --> 00:09:37.580
Yeah, FastAPIs on the list.

00:09:37.580 --> 00:09:40.600
Django and Flask are 14.6%.

00:09:40.600 --> 00:09:41.020
Both.

00:09:41.020 --> 00:09:44.180
FastAPIs, 6% and going up.

00:09:44.180 --> 00:09:47.900
FastAPIs just actually had a Ruby on Rails, which is pretty interesting.

00:09:48.320 --> 00:09:53.820
Wait, so Phoenix is down at 2%, 2.13%, but I thought it was like.

00:09:53.820 --> 00:09:55.780
It's the most loved.

00:09:55.780 --> 00:09:56.520
Okay.

00:09:56.520 --> 00:09:57.380
It's the most wanted.

00:09:57.380 --> 00:10:04.280
I'm not, I looked at it, I'm not sure I agree with that, but it's a web framework built on

00:10:04.280 --> 00:10:05.820
the Elixir language.

00:10:05.820 --> 00:10:07.400
So, there you have it.

00:10:07.400 --> 00:10:07.920
And we'll see.

00:10:07.920 --> 00:10:14.280
So, yeah, another one here that's worth pointing out, I'm not gonna go over too many more.

00:10:14.280 --> 00:10:15.660
Other frameworks and libraries.

00:10:15.960 --> 00:10:20.360
This one is pretty weird in terms of like the partition.

00:10:20.360 --> 00:10:23.420
This is what I had in mind when I'm like, there's something really weird about this.

00:10:23.420 --> 00:10:23.880
So.

00:10:23.880 --> 00:10:26.080
.NET and NumPy in the same bucket.

00:10:26.080 --> 00:10:26.760
Exactly.

00:10:26.760 --> 00:10:30.080
So, .NET is the equivalent of Python.

00:10:30.080 --> 00:10:32.340
It's the equivalent of C++.

00:10:32.340 --> 00:10:35.040
It's the equivalent of Ruby, right?

00:10:35.040 --> 00:10:36.700
It's like a huge and broad.

00:10:36.700 --> 00:10:41.380
And it's the thing that all the other stuff in that ecosystem runs on, right?

00:10:41.380 --> 00:10:43.140
ASP.NET or whatever.

00:10:43.140 --> 00:10:45.620
And so, they say, what other language do you work with?

00:10:45.680 --> 00:10:47.180
Do you work with other libraries?

00:10:47.180 --> 00:10:49.260
Do you work with .NET or do you work with NumPy?

00:10:49.260 --> 00:10:50.740
Or do you work with Pandas?

00:10:50.740 --> 00:10:52.080
There's no Python here, right?

00:10:52.080 --> 00:10:54.540
And there's no Go and there's no, no.

00:10:54.540 --> 00:10:55.460
I don't know.

00:10:55.460 --> 00:11:00.200
Like, it's just, it's, I feel like this just fully is like out of place here.

00:11:00.280 --> 00:11:06.020
So, if you just go past that, the top two are NumPy and Pandas, which by quite a good margin.

00:11:06.020 --> 00:11:11.780
And then Spring for Java, React Native for mobile with JavaScript, Flutter.

00:11:11.780 --> 00:11:15.800
And, but then back to a bunch of Python libraries.

00:11:15.800 --> 00:11:15.860
Yeah.

00:11:15.860 --> 00:11:17.360
Like you learn PyTorch.

00:11:17.360 --> 00:11:18.020
Yeah.

00:11:18.020 --> 00:11:22.520
So, Python actually ranks pretty high in the other frameworks and libraries you might be using.

00:11:22.880 --> 00:11:22.980
All right.

00:11:22.980 --> 00:11:27.180
Let's just, let's jump to the loved, dreaded, wanted section.

00:11:27.180 --> 00:11:28.560
And then that's probably enough.

00:11:28.560 --> 00:11:29.620
People can check out the rest.

00:11:29.620 --> 00:11:30.220
All right.

00:11:30.220 --> 00:11:34.920
So, they've got this sort of, you know, like what is driving the market?

00:11:35.260 --> 00:11:38.660
Greed versus fear type of thing.

00:11:38.660 --> 00:11:47.620
And so, they put each technology up and it's got a how much love versus how much hate does this technology get in a single bar, which is, the graphics here are pretty nice.

00:11:47.620 --> 00:11:51.220
So, Rust, 86% love.

00:11:51.220 --> 00:11:55.940
So, people who use Rust really like Rust and they don't strongly dislike it.

00:11:55.940 --> 00:11:57.880
It's probably a self-selecting group, right?

00:11:57.880 --> 00:12:02.580
If you made, if you took, I don't know, JavaScript people and told them they had to do Rust, they might not like it.

00:12:02.580 --> 00:12:04.340
But Rust people seem to really like Rust.

00:12:04.840 --> 00:12:05.240
Elixir.

00:12:05.240 --> 00:12:09.600
I've never done anything with Elixir, but it's also really high.

00:12:09.600 --> 00:12:16.820
Clojure TypeScript and Python is there at about two-thirds loved, one-third dreaded, I suppose, or not loved.

00:12:16.820 --> 00:12:18.540
And you can see it goes down from there.

00:12:18.540 --> 00:12:23.400
Yeah, I kind of want to talk to those 32% of the people and say, what is it that you don't like?

00:12:23.400 --> 00:12:24.800
Well, I agree.

00:12:24.800 --> 00:12:31.360
I feel like there's a lot of people who end up, so, for example, if you look at just the third that says they don't like it,

00:12:31.360 --> 00:12:34.200
that's 11 times as many people using Elixir.

00:12:34.420 --> 00:12:37.640
And that's two times all the people using Rust.

00:12:37.640 --> 00:12:40.960
So I think it's a little bit, you know, a scale thing, right?

00:12:40.960 --> 00:12:45.840
Like, there's a bunch of people who were working in one technology and then they were told, you're going to do Python.

00:12:45.840 --> 00:12:51.900
And some of them wanted that change and some of them probably like, but I like C++ or I like whatever I'm doing.

00:12:51.980 --> 00:12:54.320
And, you know, they're unhappy to be in that situation.

00:12:54.320 --> 00:12:56.660
So I imagine there's some of that going on here.

00:12:56.900 --> 00:13:02.540
There's less people like being moved into Elixir projects unless they really, you know, want to because it's a pretty small group.

00:13:02.540 --> 00:13:04.080
Anyway, there's that.

00:13:04.360 --> 00:13:12.320
And then if you switch to the wanted, though, Python and Rust tie for number one in most wanted, along with TypeScript is showing very notable there.

00:13:12.320 --> 00:13:12.660
Yeah.

00:13:12.660 --> 00:13:13.300
Nice.

00:13:13.660 --> 00:13:13.860
Yeah.

00:13:13.860 --> 00:13:16.900
Last one, we'll say databases, I suppose.

00:13:16.900 --> 00:13:20.340
Postgres, most loved, least dreaded.

00:13:20.340 --> 00:13:25.220
Redis, again, one of the things like, does this really belong on this list?

00:13:25.220 --> 00:13:26.340
Redis is cool.

00:13:26.340 --> 00:13:31.040
It's mostly for caching and message queues, not really as a standalone independent database.

00:13:31.300 --> 00:13:33.720
So can it really be the most wanted database?

00:13:33.720 --> 00:13:37.960
You technically, I know, can make it work that way, but it's not really built for it.

00:13:37.960 --> 00:13:38.920
So I don't know.

00:13:38.920 --> 00:13:41.180
Anyway, Redis is number two, whether it belongs there or not.

00:13:41.180 --> 00:13:43.840
And then MongoDB and SQLite and so on.

00:13:43.840 --> 00:13:46.000
In terms of wanted, Postgres and Mongo.

00:13:46.000 --> 00:13:46.620
Nice.

00:13:46.620 --> 00:13:48.020
No, not too much of a change.

00:13:48.020 --> 00:13:48.540
All right.

00:13:48.540 --> 00:13:50.360
I think that's pretty much it.

00:13:50.360 --> 00:13:54.380
I'll give just a quick shout out to some graphics that are down here that people can play with.

00:13:54.380 --> 00:13:57.800
If you really want to go explore, Brian, check this out.

00:13:57.800 --> 00:13:59.500
Like, which one is this?

00:14:00.020 --> 00:14:01.640
This database one's probably fair.

00:14:01.640 --> 00:14:05.280
So there's this giant, I don't know what section is this.

00:14:05.280 --> 00:14:09.120
It is work with versus want to work with.

00:14:09.120 --> 00:14:09.820
Okay.

00:14:09.820 --> 00:14:12.980
So it has this wheel.

00:14:12.980 --> 00:14:18.940
And as you move around the wheel, it'll show you, for example, 5,000 people who worked with

00:14:18.940 --> 00:14:20.920
Postgres want to work with SQLite.

00:14:20.920 --> 00:14:24.720
8,000 people who work with MongoDB want to stay with it.

00:14:24.720 --> 00:14:29.260
Whereas 7,000 people who work with MySQL want to move to MongoDB.

00:14:29.800 --> 00:14:35.320
And similarly, there's like, it shows you all these interesting trends and flows from this

00:14:35.320 --> 00:14:36.740
technology to that technology.

00:14:36.740 --> 00:14:42.060
Like if you go up here to the language one and you go to pros and you click on C#, it's

00:14:42.060 --> 00:14:46.520
pretty interesting because like the C# people, they want to go to TypeScript or Python

00:14:46.520 --> 00:14:49.420
or JavaScript or HTML, but they don't want to go to Java.

00:14:49.420 --> 00:14:51.540
Like there's no arc over to Java, right?

00:14:51.540 --> 00:14:54.780
Because these are basically the same technology with slight different trade-offs.

00:14:54.900 --> 00:14:57.320
So if you wanted to be in Java, you would just be in Java, I feel like.

00:14:57.320 --> 00:14:58.000
Yeah.

00:14:58.000 --> 00:15:00.420
You can sort of check out these flows and stuff.

00:15:00.620 --> 00:15:04.140
Anyway, I think that's more than enough on this survey, but people should go check it out.

00:15:04.140 --> 00:15:07.620
There's a lot of data here and a lot of things to learn.

00:15:07.940 --> 00:15:09.060
So does that say HypeScript?

00:15:09.060 --> 00:15:10.520
HypeScript?

00:15:10.520 --> 00:15:11.820
It doesn't fit on the screen.

00:15:11.820 --> 00:15:12.200
That's all.

00:15:12.200 --> 00:15:12.500
Oh, okay.

00:15:12.500 --> 00:15:13.600
It's HypeScript.

00:15:13.600 --> 00:15:14.460
Hype.

00:15:14.460 --> 00:15:15.040
Yeah.

00:15:15.040 --> 00:15:16.720
There's just YPE script.

00:15:16.720 --> 00:15:19.480
HypeScript with, yeah, it's just a scaling.

00:15:19.480 --> 00:15:20.120
Nice.

00:15:20.120 --> 00:15:20.400
Yeah.

00:15:20.400 --> 00:15:21.000
Okay.

00:15:21.240 --> 00:15:24.440
Before we move on real quick, John out in the audience says,

00:15:24.440 --> 00:15:27.560
it's interesting that MySQL and MariaDB are perceived so differently.

00:15:27.560 --> 00:15:28.160
Yeah.

00:15:28.160 --> 00:15:29.080
That is true.

00:15:29.080 --> 00:15:29.680
Yeah.

00:15:29.680 --> 00:15:30.340
I don't know much.

00:15:30.340 --> 00:15:36.380
I think that MySQL has a problem that people used it a long time ago,

00:15:36.380 --> 00:15:39.440
and maybe it's different now, but I mean, that's what I'm basing it.

00:15:39.440 --> 00:15:43.580
My experience with MySQL is like all over 10 years ago.

00:15:43.580 --> 00:15:44.260
Yeah.

00:15:44.260 --> 00:15:44.720
Same.

00:15:44.720 --> 00:15:45.340
All right.

00:15:45.340 --> 00:15:46.260
What you got for us next?

00:15:46.700 --> 00:15:51.100
Well, I wanted to talk about Peppy, or I don't know.

00:15:51.100 --> 00:15:53.100
It's P-E-P-Y.tech.

00:15:53.100 --> 00:15:59.360
So I found out about this from the person that wrote it, Petru Reres.

00:15:59.360 --> 00:16:03.780
So we've talked about something similar.

00:16:03.780 --> 00:16:10.400
What we've talked about before is PyPI download stats or pypistats.org.

00:16:10.400 --> 00:16:12.480
And so I was like, well, what's different?

00:16:12.480 --> 00:16:16.280
So Peppy does download stats for packages.

00:16:16.280 --> 00:16:20.320
So what we're showing here is the stats for pytest.

00:16:20.320 --> 00:16:27.360
And what the PyPI stats does is it shows you a breakdown of like you've got the overall packages,

00:16:27.360 --> 00:16:32.800
but then you can also look at downloads per Python 2 versus 3,

00:16:32.800 --> 00:16:36.760
and then major and minor versions of Python.

00:16:37.400 --> 00:16:39.180
And so that's kind of interesting.

00:16:39.180 --> 00:16:40.160
Okay.

00:16:40.160 --> 00:16:48.720
But actually now, after we're like so much far past the 2 versus 3 split, like I'm not even supporting 2 anymore.

00:16:49.380 --> 00:16:53.060
So what I like is Peppy doesn't do that.

00:16:53.060 --> 00:16:55.980
So Peppy's same stats are same for pytest.

00:16:55.980 --> 00:16:59.180
What it's looking at is it grabs like the top handful.

00:16:59.180 --> 00:17:00.920
So let's do the default.

00:17:00.920 --> 00:17:03.180
I have it all customized right now.

00:17:03.460 --> 00:17:05.960
So let's drop those off.

00:17:05.960 --> 00:17:17.260
By default, it shows us the last few versions of pytest plus all of the downloads for the last major one.

00:17:17.260 --> 00:17:19.260
So all the 7x downloads.

00:17:19.260 --> 00:17:23.540
And so the numbers are a little different because we're not showing everything.

00:17:23.540 --> 00:17:28.500
So right off the bat, I kind of like that I'm just caring about the last few versions.

00:17:28.500 --> 00:17:29.340
That's kind of nice.

00:17:29.340 --> 00:17:37.900
And it also has a daily, weekly, monthly chart so that you can kind of see trends going on, which is nice.

00:17:37.900 --> 00:17:46.380
What I didn't realize at first is that you can select different statistics.

00:17:46.380 --> 00:17:51.440
So if I wanted to see everything on all versions, I can just go ahead and type a star there.

00:17:51.440 --> 00:17:53.420
I think that works.

00:17:53.420 --> 00:17:53.860
Yeah.

00:17:53.860 --> 00:17:54.480
There you go.

00:17:54.480 --> 00:17:56.680
And then it does all of the downloads.

00:17:56.680 --> 00:18:04.020
And then also when I just dropped that, I don't know if you noticed, but it shows all the different download stats already.

00:18:04.020 --> 00:18:08.400
So you can kind of get a glimpse of what you're going to find right off the bat.

00:18:08.400 --> 00:18:15.940
Now going down through the chart, we've got both a chart and a table for when they grab the data.

00:18:15.940 --> 00:18:20.660
And this split up of, I'm not looking at Python version.

00:18:20.660 --> 00:18:25.880
I'm looking at version for the package that I care about or possibly my package.

00:18:26.040 --> 00:18:28.840
So I did this recently for pytest-check.

00:18:28.840 --> 00:18:33.420
And I was thinking about it for pytest of like, which version should I support?

00:18:33.420 --> 00:18:40.240
And clearly, like most, like tons of people have switched up to, most people have switched to 7x already.

00:18:40.520 --> 00:18:46.020
So yeah, I think it's perfectly fair game to not support 6x pytest anymore.

00:18:46.020 --> 00:18:47.140
So why not?

00:18:47.140 --> 00:18:51.420
Anyway, so just a different take on download stats.

00:18:51.420 --> 00:19:00.000
Plus, it includes some cool badges that if you want to grab your, like add this to your repo to say how many downloads per week or per month.

00:19:00.240 --> 00:19:00.960
Kind of neat.

00:19:00.960 --> 00:19:03.140
Yeah, that's really cool.

00:19:03.140 --> 00:19:14.340
If you, you know, if you're open, if you're maintaining some open source package and you're like, and it depends on something like this, like pytest, you just, you can quickly look at that and make a call.

00:19:14.340 --> 00:19:18.800
Like, well, how, how important is it for me to support this old version?

00:19:18.800 --> 00:19:21.980
Or how ready am I to move to the new thing?

00:19:21.980 --> 00:19:28.140
Adopt this feature that won't allow older versions of, you know, Python or whatever it is you're looking at, right?

00:19:28.140 --> 00:19:29.220
Like, should we add types?

00:19:29.220 --> 00:19:31.920
Well, that might not work on like, where is that?

00:19:31.920 --> 00:19:33.020
3.3 and before.

00:19:33.020 --> 00:19:33.680
Yeah.

00:19:33.680 --> 00:19:38.000
Well, like on pytest-check, I've got a feature that I'm going to deprecate.

00:19:38.000 --> 00:19:40.940
And it's only been in since like the last version.

00:19:40.940 --> 00:19:44.500
I just didn't think through the API enough, I think.

00:19:44.500 --> 00:19:48.520
But so I wanted to take a look how many people are using the most recent version.

00:19:48.740 --> 00:19:53.620
And actually, so most of the people are, or quite a few people are using the most recent version.

00:19:53.620 --> 00:19:55.120
But it isn't most.

00:19:55.120 --> 00:20:02.640
It's, if I do like a total of every version, it's definitely not most people using the most recent one.

00:20:02.640 --> 00:20:03.960
But I don't know.

00:20:03.960 --> 00:20:06.900
And of those, I have no idea what, if they're using the feature or not.

00:20:06.900 --> 00:20:08.680
Anyway, interesting.

00:20:08.680 --> 00:20:09.820
Take a look on it.

00:20:09.820 --> 00:20:10.920
And I appreciate it.

00:20:10.920 --> 00:20:12.860
And it's an open source project as well.

00:20:12.860 --> 00:20:17.740
And some of these graphs have been updated by a contributor.

00:20:17.960 --> 00:20:21.460
So it's kind of nice to have it alive and well on open source.

00:20:21.460 --> 00:20:22.180
Peppy.

00:20:22.180 --> 00:20:22.700
Peppy.

00:20:22.700 --> 00:20:23.140
Tech.

00:20:23.140 --> 00:20:23.680
Yeah.

00:20:23.680 --> 00:20:24.080
Very nice.

00:20:24.080 --> 00:20:24.840
Good find.

00:20:24.840 --> 00:20:25.240
I like it.

00:20:25.240 --> 00:20:25.760
All right.

00:20:25.760 --> 00:20:27.900
Off to our sponsor for the week.

00:20:27.900 --> 00:20:28.840
Yes.

00:20:28.840 --> 00:20:32.900
Thank you, Microsoft, for sponsoring this episode.

00:20:32.900 --> 00:20:36.720
This episode is brought to you by Microsoft for Startups Founders Hub.

00:20:37.060 --> 00:20:38.200
Starting a business is hard.

00:20:38.200 --> 00:20:42.980
But by some estimates, over 90% of startups will go out of business in the first year.

00:20:42.980 --> 00:20:43.400
Ouch.

00:20:43.400 --> 00:20:51.820
With this in mind, Microsoft for Startups set out to understand what startups need to be successful and create a digital platform to help overcome those challenges.

00:20:52.620 --> 00:20:55.160
Microsoft for Startups Founders Hub was born.

00:20:55.160 --> 00:21:02.240
Microsoft for Startups Founders Hub provides all founders at any stage with free resources to help solve startup challenges.

00:21:02.240 --> 00:21:11.060
The platform provides technology benefits, access to expert guidance and skilling resources, mentorship and network connections, and much more.

00:21:11.420 --> 00:21:20.040
Unlike others in the industry, Microsoft for Startups Founders Hub does not require startups to be investor-backed or third-party validated to participate.

00:21:20.040 --> 00:21:21.840
It is truly open to all.

00:21:21.840 --> 00:21:22.720
So what do you get?

00:21:22.720 --> 00:21:30.120
You can speed up development with free access to GitHub and the Microsoft Cloud with the ability to unlock credits over time.

00:21:30.460 --> 00:21:41.540
To help with your startup and to help innovate, Founders Hub is partnering with innovative companies like OpenAI, a global leader in AI research and development, to provide exclusive benefits and discounts.

00:21:41.540 --> 00:21:45.500
Through Founders Hub, becoming a founder is no longer about who you know.

00:21:45.500 --> 00:22:00.420
You'll have access to their mentorship network, giving you access to a pool of hundreds of mentors across a range of disciplines, across areas like idea validation, fundraising, management, and coaching, sales and marketing, as well as specific technical stress points.

00:22:00.420 --> 00:22:07.660
You'll be able to book a one-on-one meeting with the mentors, many of whom are former founders themselves.

00:22:07.660 --> 00:22:13.820
Make your ideas a reality today with the critical support you'll get from Microsoft for Startups Founders Hub.

00:22:13.820 --> 00:22:21.220
To join the program, visit pythonbytes.fm/foundershub 2022 or click the link in your show notes.

00:22:21.220 --> 00:22:21.920
Indeed.

00:22:21.920 --> 00:22:23.360
Thank you, Microsoft for Startups.

00:22:23.360 --> 00:22:26.320
Let's move over here.

00:22:26.320 --> 00:22:31.800
So this next one comes to us from several folks recommending it.

00:22:31.800 --> 00:22:36.420
And to be honest, I'm not sure if I would cover it if there wasn't a bunch of people said, hey, you should cover this.

00:22:36.420 --> 00:22:36.980
This is really interesting.

00:22:36.980 --> 00:22:40.700
So I'll sort of take their lead and say, this does look pretty interesting.

00:22:40.700 --> 00:22:46.560
So Jeff Hutchins and Abdulaziz Al-Skwasim sent this in.

00:22:46.560 --> 00:22:47.820
Thank you both for sending.

00:22:47.820 --> 00:22:50.380
And this is the CodeOn Python compiler.

00:22:50.380 --> 00:22:51.420
Have you heard about this, Brian?

00:22:51.420 --> 00:22:54.540
Just from people submitting it.

00:22:54.540 --> 00:22:55.400
Yeah.

00:22:55.400 --> 00:22:59.360
And people talk about Python performance all the time.

00:22:59.360 --> 00:23:03.280
Sometimes, I would say most of the time, it doesn't really matter to you.

00:23:03.380 --> 00:23:08.760
Most of the time, you're spending way more time waiting on a network, waiting on an API call, waiting on a database.

00:23:08.760 --> 00:23:11.300
But sometimes, it really does matter.

00:23:11.300 --> 00:23:13.200
And you need your code to go faster, right?

00:23:13.440 --> 00:23:25.500
So traditional options have included things like Numba or Cython or even PyPy, P-Y, P-Y for the JIT compiled version of Python.

00:23:25.500 --> 00:23:31.440
So here's one more thing to put into that category of options called CodeOn from ExaLoop.

00:23:31.440 --> 00:23:37.840
And it's a high-performance, zero-overhead, extensible Python compiler using LLVM.

00:23:37.840 --> 00:23:45.320
And LLVM is one of the compilers that gets used all the time, of course, for a bunch of different things.

00:23:45.560 --> 00:23:53.740
And they claim that it is on the order of 10 to 100 times or more faster than regular Python for single-core performance.

00:23:53.740 --> 00:23:57.420
And because it really compiles to some native code.

00:23:57.420 --> 00:24:01.680
They say also, by the way, sometimes better than C++ in terms of performance.

00:24:01.680 --> 00:24:09.400
But it also, because it compiles to some native representation, it doesn't involve the GIL, so you also get better scaling.

00:24:09.620 --> 00:24:18.300
And it comes out of this, I think, genetics project called SEC, bioinformatics, rather, which is this language for bioinformatics.

00:24:18.300 --> 00:24:24.100
And I think what they've decided is like, you know, let's just go and just do straight Python, right?

00:24:24.100 --> 00:24:30.300
And if you go to exaLoop.io, they've got a couple of sort of selling points here.

00:24:30.300 --> 00:24:32.380
Performance, I see, is a Python.

00:24:32.380 --> 00:24:36.380
It adopts Python syntax and is fully interoperable with Python.

00:24:36.820 --> 00:24:40.480
And they've got this little flow graphic type thing.

00:24:40.480 --> 00:24:41.740
Shows your Python code.

00:24:41.740 --> 00:24:45.000
And if you look, it's not even type annotated, which kind of surprised me, Brian.

00:24:45.000 --> 00:24:48.500
I figured they would at least require you add, you know, Python type ints.

00:24:48.500 --> 00:24:48.940
Yeah.

00:24:48.940 --> 00:24:49.560
But no.

00:24:49.560 --> 00:24:53.440
It says you take Python syntax and semantics and you feed it in.

00:24:53.440 --> 00:24:56.040
It builds up an abstract syntax tree.

00:24:56.040 --> 00:25:01.360
It does some kind of type inference to figure out what the types are, like ints.

00:25:01.360 --> 00:25:06.640
Comes up with an intermediate representation and then applies a bunch of JIT style optimization.

00:25:06.640 --> 00:25:10.120
And domain specific optimizations and outcomes.

00:25:10.120 --> 00:25:11.100
Pretty interesting.

00:25:11.100 --> 00:25:14.120
Native code, as I said, but also, where does this show?

00:25:14.120 --> 00:25:16.440
I guess it doesn't have a better picture because it's cut off here.

00:25:16.440 --> 00:25:21.380
Outcomes, native code, but also WebAssembly and GPU targeted code.

00:25:21.380 --> 00:25:21.980
That's cool.

00:25:21.980 --> 00:25:22.280
Think about that.

00:25:22.280 --> 00:25:23.620
You want to write some code?

00:25:23.620 --> 00:25:26.360
This Python code does matrix stuff.

00:25:26.360 --> 00:25:32.700
I want it to run on my NVIDIA GPU, you know, --GPU or whatever the thing you do to make it come out with that.

00:25:32.700 --> 00:25:34.160
It's pretty, pretty wild.

00:25:34.160 --> 00:25:36.080
Or put it on the web with WebAssembly.

00:25:36.080 --> 00:25:38.240
It sounds great.

00:25:38.240 --> 00:25:39.180
It does sound great.

00:25:39.560 --> 00:25:41.180
So they've got some examples.

00:25:41.180 --> 00:25:47.520
It says we're going to have a list of fruits, just three strings, banana, apple, and lime, and some prices.

00:25:47.520 --> 00:25:50.500
In the dictionary, banana has a price, apple has a price.

00:25:50.500 --> 00:25:53.880
And it says we're going to write standard for fruit in fruits.

00:25:53.880 --> 00:25:56.160
F string, print out the price of the fruit.

00:25:56.160 --> 00:26:02.500
And then it's going to put a bunch of stuff in the cart by doing list, multiplication, and addition, like you would expect.

00:26:02.660 --> 00:26:05.060
Call the sum with a comprehension and print it out.

00:26:05.060 --> 00:26:06.420
And then, boom, no problem.

00:26:06.420 --> 00:26:08.580
Compile that to native code if you want.

00:26:08.580 --> 00:26:09.140
Okay.

00:26:09.140 --> 00:26:11.520
It says if you know Python, there's nothing to learn.

00:26:11.520 --> 00:26:13.860
Yeah, it's a bunch of...

00:26:13.860 --> 00:26:14.100
Yeah, go ahead.

00:26:14.100 --> 00:26:16.260
The question is, which Python?

00:26:16.260 --> 00:26:19.340
It says Python syntax, but which Python syntax?

00:26:19.340 --> 00:26:22.340
Is it 3.10, 3.9, 3.11?

00:26:22.340 --> 00:26:27.300
It's not clear other than 3.6 or above because of the f-strings.

00:26:27.300 --> 00:26:29.560
The only giveaway I see here.

00:26:30.740 --> 00:26:36.260
And possibly lots of people are fine with not exactly knowing which version of the syntax.

00:26:36.260 --> 00:26:38.000
Yeah, it didn't say.

00:26:38.000 --> 00:26:41.780
I mean, maybe if you go into the docs, it'll exactly say right, but not on the little landing page.

00:26:41.780 --> 00:26:47.720
It was initially dissolved to solve computing challenges in genomics, which it's so focused on.

00:26:47.720 --> 00:26:56.760
Also, it's got a bunch of stuff focused on finance and GPUs for CUDA programming, as well as WebAssembly, which is pretty dope.

00:26:56.760 --> 00:26:57.220
Yeah.

00:26:57.220 --> 00:26:59.760
Also, if you scroll down a little bit, there's a little video.

00:27:00.120 --> 00:27:01.200
Let me, I'll hit, tell it to go.

00:27:01.200 --> 00:27:02.020
There's a video.

00:27:02.020 --> 00:27:02.820
I'll tell it to stop.

00:27:02.820 --> 00:27:03.140
I don't know.

00:27:03.140 --> 00:27:09.240
Where they show it running as a kernel in Jupyter Notebooks.

00:27:09.240 --> 00:27:10.020
Oh, wow.

00:27:10.020 --> 00:27:19.760
Just doing standard Python stuff with kind of mass intensive things and then pulling in matplotlib and showing the various things you get with matplotlib.

00:27:20.140 --> 00:27:21.620
So, yeah, it looks pretty good.

00:27:21.620 --> 00:27:22.640
So, what do you think?

00:27:23.300 --> 00:27:28.800
I think even if it, I'd like to know what version of Python it's compatible with, but other than that, it looks fun.

00:27:28.800 --> 00:27:30.700
It looks really good.

00:27:30.700 --> 00:27:31.740
It's on GitHub.

00:27:32.260 --> 00:27:36.140
And so, it is technically at least source open.

00:27:36.140 --> 00:27:37.140
What is the license here?

00:27:37.140 --> 00:27:40.040
The license is a business source license.

00:27:40.040 --> 00:27:41.440
What the heck is a business source license?

00:27:41.440 --> 00:27:42.200
Okay.

00:27:42.200 --> 00:27:43.900
From MariaDB Corp.

00:27:43.900 --> 00:27:45.020
Yeah.

00:27:45.160 --> 00:27:47.320
I'm going to have to figure out what the business source license is.

00:27:47.320 --> 00:27:47.960
I don't know.

00:27:47.960 --> 00:27:51.520
You can read the source, but it's hard.

00:27:51.520 --> 00:27:52.000
I don't know.

00:27:52.000 --> 00:27:52.400
That's what I said.

00:27:52.400 --> 00:27:54.220
Is it source open or is it not?

00:27:54.220 --> 00:27:54.760
Yeah.

00:27:54.760 --> 00:27:56.920
And so, all this stuff is good.

00:27:56.920 --> 00:28:04.560
And the reason I'm hesitant to recommend it, but I think these benefits are really big and, you know, people can use it, then great.

00:28:04.560 --> 00:28:07.220
You go a little further, it says ExalupinU.

00:28:07.220 --> 00:28:09.240
This is free for non-production use.

00:28:09.240 --> 00:28:13.520
If you want to use it for things that are commercial, then do you know what it costs?

00:28:13.520 --> 00:28:14.340
Don't know.

00:28:14.340 --> 00:28:15.100
Contact us.

00:28:15.100 --> 00:28:16.120
I don't know either.

00:28:16.120 --> 00:28:18.640
If you got to ask, it's too much for you.

00:28:18.640 --> 00:28:20.860
Let's just put it there.

00:28:20.860 --> 00:28:22.440
That's what my dad always said.

00:28:22.440 --> 00:28:24.160
If you got to ask, you can't afford it.

00:28:24.160 --> 00:28:25.400
Exactly.

00:28:25.400 --> 00:28:27.560
Which, I don't know.

00:28:27.560 --> 00:28:29.940
I'm not against them charging for it.

00:28:29.940 --> 00:28:32.960
I understand that this is probably an insane amount of work to put together.

00:28:32.960 --> 00:28:36.480
If that's their model, that's their prerogative and it's fine.

00:28:36.760 --> 00:28:39.080
I don't think everything has to be given away free.

00:28:39.080 --> 00:28:41.000
There's tons of work that goes into a lot of stuff.

00:28:41.000 --> 00:28:43.700
And sometimes charging for it is the right answer.

00:28:43.700 --> 00:28:45.800
But just tell people what it costs.

00:28:45.800 --> 00:28:47.760
You know, don't make them email you.

00:28:47.760 --> 00:28:49.220
That is really not good.

00:28:49.220 --> 00:28:54.280
So, Robert mentioned, Robert Robinson, maybe it's a sliding scale.

00:28:54.280 --> 00:28:56.580
And it's like, it depends on who's asking.

00:28:56.580 --> 00:28:59.880
You know, Microsoft calls up and asks.

00:28:59.880 --> 00:29:00.900
It's a different price.

00:29:00.900 --> 00:29:03.120
I'm sure it is a different price.

00:29:03.120 --> 00:29:06.680
And I'm sure that's, oh, do you want to run it on all of Azure?

00:29:06.880 --> 00:29:07.920
Well, here's the price.

00:29:07.920 --> 00:29:10.560
But, you know, put some common cases in there.

00:29:10.560 --> 00:29:13.840
Are you a data scientist and you want to use it for an API?

00:29:13.840 --> 00:29:14.900
Here's what it costs.

00:29:14.900 --> 00:29:17.220
Are you trying to host it as a server?

00:29:17.220 --> 00:29:21.220
Well, here, like, then maybe you need to, like, there should be at least a little bit of a,

00:29:21.220 --> 00:29:24.780
here's the realm of where you start, right?

00:29:24.780 --> 00:29:27.460
A lot of things have, you know, here's the base price.

00:29:27.460 --> 00:29:28.620
Here's the pro price.

00:29:28.620 --> 00:29:30.140
Here's the enterprise price.

00:29:30.140 --> 00:29:33.040
And here's the contact us if that doesn't fit you, right?

00:29:33.140 --> 00:29:36.360
But to say it costs money and we won't tell you what it costs.

00:29:36.360 --> 00:29:37.020
I don't know.

00:29:37.020 --> 00:29:39.040
It just sounds not great.

00:29:39.040 --> 00:29:46.320
And I hope people, so the free non-production, non-commercial versus commercial, that's still a fuzzy line.

00:29:46.320 --> 00:29:48.460
And I wish there was, like, more detail.

00:29:48.460 --> 00:29:49.820
Whenever anybody does that.

00:29:49.880 --> 00:29:55.500
Because I've been in situations a lot where I'm just some dude writing a script in a company.

00:29:55.500 --> 00:29:56.520
And the company's big.

00:29:56.520 --> 00:29:58.760
But I just want to get this thing to work.

00:29:58.760 --> 00:30:01.660
And it's just a small piece of my build chain or something.

00:30:01.660 --> 00:30:08.180
I'm not going to get okay to do a corporate license for something just to save me five minutes a day.

00:30:08.180 --> 00:30:09.100
Yeah.

00:30:09.100 --> 00:30:10.820
Maybe you're not selling it, right?

00:30:10.820 --> 00:30:11.420
Yeah.

00:30:11.420 --> 00:30:11.920
For example.

00:30:11.920 --> 00:30:12.760
Yeah.

00:30:12.760 --> 00:30:13.840
That's another thing.

00:30:13.840 --> 00:30:15.620
Is it part of the thing I'm selling?

00:30:15.620 --> 00:30:18.640
Or is it just part of my work to get something else done?

00:30:19.500 --> 00:30:19.980
Yep.

00:30:19.980 --> 00:30:20.900
Indeed.

00:30:20.900 --> 00:30:23.300
So anyway, pluses and minuses.

00:30:23.300 --> 00:30:25.620
But it's an interesting contribution.

00:30:25.620 --> 00:30:27.580
And thanks, folks, for sending that in.

00:30:27.580 --> 00:30:28.100
Definitely.

00:30:28.100 --> 00:30:28.680
Indeed.

00:30:28.680 --> 00:30:31.620
Well, so I want to talk about type hints a little bit.

00:30:31.620 --> 00:30:33.140
I've been thinking about type hints a lot.

00:30:33.140 --> 00:30:39.360
And ran across this article called Eight Levels of Using Type Hints in Python.

00:30:39.360 --> 00:30:42.160
And it's from Yong Cho.

00:30:42.160 --> 00:30:44.700
And first off, I love the graphic.

00:30:44.700 --> 00:30:46.640
This is an Unsplash graphic.

00:30:46.640 --> 00:30:49.420
But I'm kind of a fan of it.

00:30:49.420 --> 00:30:56.740
It looks like posters, like band posters or something like that on something.

00:30:56.740 --> 00:30:58.520
And half of them are peeled off.

00:30:58.520 --> 00:31:01.160
So cool image.

00:31:01.160 --> 00:31:01.460
Anyway.

00:31:01.460 --> 00:31:01.860
Yeah.

00:31:01.860 --> 00:31:03.020
Complete side note.

00:31:04.360 --> 00:31:08.280
So I was attracted to this because this eight stage.

00:31:08.280 --> 00:31:11.920
I kind of thought of it as like eight stages of using type hints.

00:31:11.920 --> 00:31:15.020
Because that's kind of how I started using type hints.

00:31:15.020 --> 00:31:17.500
And it almost got the order the same.

00:31:17.500 --> 00:31:19.380
So let's go through these orders.

00:31:19.380 --> 00:31:22.440
So the first one is, did I skip over it?

00:31:23.060 --> 00:31:26.800
The first was type hints for basic data types.

00:31:26.800 --> 00:31:31.580
So basically, you kind of do this if you're using data classes at all.

00:31:31.580 --> 00:31:35.320
You just say, well, I've got my age as an int.

00:31:35.320 --> 00:31:37.380
And it defaults to 29.

00:31:37.380 --> 00:31:40.820
Just to kind of tell people what you're thinking about.

00:31:40.820 --> 00:31:45.260
And while you're, you know, my hosts are a tuple.

00:31:45.260 --> 00:31:48.060
And they default to an empty tuple or something.

00:31:48.060 --> 00:31:51.640
So this is pretty much how I started as well.

00:31:51.640 --> 00:31:55.120
And I started mostly because I started using type data classes.

00:31:55.120 --> 00:32:00.720
And this is what they look like when you're declaring the contents of a data class.

00:32:02.180 --> 00:32:03.840
And then, so where do you go from there?

00:32:03.840 --> 00:32:09.920
The next stage is defining a constant using final type.

00:32:09.920 --> 00:32:11.600
Actually, I've never used this.

00:32:11.600 --> 00:32:12.780
Have you ever used final?

00:32:12.780 --> 00:32:15.000
I've wanted to use it.

00:32:15.000 --> 00:32:20.160
But it's so not exactly enforced type of thing.

00:32:20.160 --> 00:32:26.260
It's like, I would love to have a constant in Python.

00:32:26.260 --> 00:32:30.580
But doing it through typing means the only time it's going to be validated or checked

00:32:30.580 --> 00:32:32.260
is if I run mypy or something.

00:32:32.260 --> 00:32:33.920
And most of the time, I'm not.

00:32:33.920 --> 00:32:36.540
So it's like, well, okay, whatever.

00:32:36.540 --> 00:32:36.980
I'm not saying.

00:32:36.980 --> 00:32:37.340
Yeah.

00:32:37.340 --> 00:32:43.960
I'm actually increasing the amount of times I'm using mypy or other type checking things.

00:32:43.960 --> 00:32:46.460
But yeah, I wouldn't have put this number two.

00:32:46.460 --> 00:32:47.520
But minor gripe.

00:32:47.520 --> 00:32:48.420
It's kind of a cool feature.

00:32:48.420 --> 00:32:49.620
It is a cool feature, though.

00:32:49.620 --> 00:32:49.780
Yeah.

00:32:49.780 --> 00:32:52.020
I don't knock its existence.

00:32:52.020 --> 00:32:54.880
I just wish it was more supported in the language.

00:32:54.880 --> 00:32:55.480
Yeah.

00:32:55.480 --> 00:33:00.380
The third is adding multiple type hints to one variable.

00:33:00.380 --> 00:33:03.860
Like it shows here a couple different ways.

00:33:03.860 --> 00:33:08.580
The union of an int and a float or the bar of int and float.

00:33:08.580 --> 00:33:14.880
And the number one way I use this, I mean, I use things like this also.

00:33:14.880 --> 00:33:16.180
Like it could be an int or a float.

00:33:16.180 --> 00:33:23.820
But I mostly use it for like int or none or something or none because I've got a default

00:33:23.820 --> 00:33:24.780
value of none.

00:33:24.780 --> 00:33:28.000
And I kind of wish there was another way to do it.

00:33:28.000 --> 00:33:31.380
Because when you have a, I don't know, it's kind of convenient anyway.

00:33:31.380 --> 00:33:36.980
But like let's say I've got a parameter to a function and it defaults when I internally

00:33:36.980 --> 00:33:40.460
I assign it, it defaults to none if nobody passes anything in.

00:33:40.660 --> 00:33:44.140
But I also don't really want somebody to pass none in, you know?

00:33:44.140 --> 00:33:50.820
So I wish there was a like the default is none, but users can't pass in none or something

00:33:50.820 --> 00:33:51.420
like that.

00:33:51.420 --> 00:33:52.720
Yeah.

00:33:52.720 --> 00:33:54.100
But anyway, it works.

00:33:54.100 --> 00:33:59.600
And in the end, it helps with testing anyway to be able to pass in all the types.

00:33:59.600 --> 00:34:03.880
But so yeah, and I've totally switched to the bar thing.

00:34:04.020 --> 00:34:06.140
I think it was 310 that added that.

00:34:06.140 --> 00:34:06.720
Do you remember?

00:34:06.720 --> 00:34:07.900
I think it was 310.

00:34:07.900 --> 00:34:08.780
I think it was 310.

00:34:08.780 --> 00:34:09.040
Yeah.

00:34:09.040 --> 00:34:09.520
It says right here.

00:34:09.520 --> 00:34:10.380
It even says there.

00:34:10.380 --> 00:34:10.600
Yeah.

00:34:10.600 --> 00:34:10.900
Uh-huh.

00:34:10.900 --> 00:34:11.180
Yeah.

00:34:11.180 --> 00:34:16.480
So anything I'm writing, I support 310 and above because I like the bar.

00:34:16.480 --> 00:34:23.900
The next thing is using general type hints, which also this is, yeah, I think now we're starting

00:34:23.900 --> 00:34:28.260
to increase the stage of understanding of how type hints can help you.

00:34:28.260 --> 00:34:35.560
And the notion, like in the example, they use iterable as, you know, from typing import

00:34:35.560 --> 00:34:35.980
iterable.

00:34:35.980 --> 00:34:41.060
So you say that, you know, I'm accepting something like numbers and it takes an iterable.

00:34:41.060 --> 00:34:43.100
I love this use.

00:34:43.100 --> 00:34:46.760
And I, you know, it takes a little bit more of advanced use.

00:34:46.760 --> 00:34:48.680
You get a little more comfortable with type hints.

00:34:48.680 --> 00:34:54.780
And to be able to say, I'm going to do iteration like 4in and nums, it doesn't really matter what

00:34:54.780 --> 00:35:00.640
it is, if it's a list or a tuple or something else, as long as I can iterate over it, it's

00:35:00.640 --> 00:35:00.940
good.

00:35:00.940 --> 00:35:07.500
So, and the other thing is probably, and I'm not sure why they didn't put, is optional, but

00:35:07.500 --> 00:35:13.400
along the same as iterable, I like, I'm going to often say it's iterable, but the type inside

00:35:13.400 --> 00:35:16.560
is an int or something like that.

00:35:16.560 --> 00:35:17.760
But anyway.

00:35:17.760 --> 00:35:18.340
Right.

00:35:18.340 --> 00:35:22.880
The fifth one is a little bracket int or something like a whole bracket string so you know what

00:35:22.880 --> 00:35:23.280
you get out.

00:35:23.280 --> 00:35:23.480
Yeah.

00:35:23.860 --> 00:35:26.340
The fifth is a type hints for functions.

00:35:26.340 --> 00:35:30.340
And I probably would have put this as like number two because I started using this right

00:35:30.340 --> 00:35:38.100
away of, yeah, to say, because it's, that's one of the things that's hard with when I came

00:35:38.100 --> 00:35:43.760
to Python from C++ is knowing like, where do I put the return value?

00:35:43.760 --> 00:35:49.500
Like the return type is, is, you know, maybe, maybe it's multiple return types, which I don't

00:35:49.500 --> 00:35:50.400
really want it to be.

00:35:50.720 --> 00:35:54.900
But, but it's nice to be able to see what the return type is and type hints add that

00:35:54.900 --> 00:35:56.700
with, with type hints for functions.

00:35:56.700 --> 00:35:56.900
Right.

00:35:56.900 --> 00:36:00.940
Or you read a function, you know, like I want to call that, but what do I do?

00:36:00.940 --> 00:36:01.500
Yeah.

00:36:01.500 --> 00:36:04.440
Do I have to read the function and try to understand it?

00:36:04.440 --> 00:36:05.800
Or can I just read the definition?

00:36:05.800 --> 00:36:06.300
Right.

00:36:06.360 --> 00:36:08.360
I think this is one of the main uses, right?

00:36:08.360 --> 00:36:08.500
Yeah.

00:36:08.500 --> 00:36:08.560
Yeah.

00:36:08.560 --> 00:36:08.760
Yeah.

00:36:08.760 --> 00:36:15.260
And it's also nice to be able to see right there with a union type is, is not a possibility.

00:36:15.260 --> 00:36:19.880
Do I have to deal with nothing coming back as something is possible?

00:36:20.240 --> 00:36:22.340
Number six is alias for type hints.

00:36:22.340 --> 00:36:24.400
And I kind of love this.

00:36:24.400 --> 00:36:28.120
I haven't been using this much, but I'm going to start using it more.

00:36:28.120 --> 00:36:31.720
Especially it says with in Python 310.

00:36:31.720 --> 00:36:37.220
So before Python 310, you had to do like from typing import type alias and have this weird

00:36:37.220 --> 00:36:38.900
syntax thing around it.

00:36:39.460 --> 00:36:41.380
But it's not really that weird.

00:36:41.380 --> 00:36:45.620
It's a, but the, after 310, you just sort of declare a thing.

00:36:45.620 --> 00:36:50.120
It says like post type posts type is a dict that goes from it to string.

00:36:50.120 --> 00:36:50.960
That's great.

00:36:50.960 --> 00:36:54.080
And then you can use that as a type hint or other places.

00:36:54.080 --> 00:36:55.540
So that's interesting.

00:36:55.540 --> 00:36:56.300
That's news to me.

00:36:56.300 --> 00:36:56.560
Yeah.

00:36:56.560 --> 00:36:57.200
That's really interesting.

00:36:57.200 --> 00:36:59.920
So definitely, I'll definitely start using that.

00:36:59.920 --> 00:37:01.500
So I'm glad I read the article for that.

00:37:01.500 --> 00:37:07.780
Type hints for class for a class itself, which I'm not sure why it was titled this, but basically

00:37:07.780 --> 00:37:08.940
it's the self type.

00:37:08.940 --> 00:37:15.280
And this is very helpful if you have a class, a class that has objects that refer to other

00:37:15.280 --> 00:37:16.560
objects of the same type.

00:37:16.560 --> 00:37:19.180
I don't know how you did that before then.

00:37:19.180 --> 00:37:21.300
I guess I wasn't caring about it, but.

00:37:21.300 --> 00:37:24.880
You had to do as a hack or you put it into quotes.

00:37:24.880 --> 00:37:29.980
So the example from this article is a class called list node, and it's going to be past the

00:37:29.980 --> 00:37:30.840
previous node, right?

00:37:30.840 --> 00:37:32.160
So what is the type of that?

00:37:32.160 --> 00:37:33.380
Well, it should be a list node.

00:37:33.380 --> 00:37:33.920
Yeah.

00:37:33.920 --> 00:37:37.320
Python is in the process of building up the list node class.

00:37:37.320 --> 00:37:38.680
So it doesn't yet know what it is.

00:37:38.680 --> 00:37:41.380
But you're trying to define a function that has that.

00:37:41.380 --> 00:37:43.340
So there's this weird patch 22 thing.

00:37:43.340 --> 00:37:43.780
Yeah.

00:37:43.780 --> 00:37:44.660
Chicken and egg thing.

00:37:44.660 --> 00:37:47.300
So what you put is you would put list node in quotes.

00:37:47.300 --> 00:37:48.460
That's the old version.

00:37:48.460 --> 00:37:50.320
And of course, it was just a string.

00:37:50.320 --> 00:37:52.940
But then it's like, well, but it's a string that says that.

00:37:53.140 --> 00:37:55.640
So we're going to just guess that that's what you want.

00:37:55.640 --> 00:37:56.580
It was weird.

00:37:56.580 --> 00:37:57.140
Okay.

00:37:57.140 --> 00:38:01.580
Well, the eighth and final one is to provide literals for variables.

00:38:01.580 --> 00:38:04.440
And I haven't done this, but it's kind of nice also.

00:38:04.440 --> 00:38:05.720
And I didn't know you could do this.

00:38:06.180 --> 00:38:10.660
Just to say, and in the example, it's from typing import literal.

00:38:10.660 --> 00:38:17.800
And then you define like a weekend that's a literal that can only be the strings Saturday

00:38:17.800 --> 00:38:18.620
or Sunday.

00:38:18.940 --> 00:38:21.200
And so this isn't an enumeration.

00:38:21.200 --> 00:38:25.920
It's a it's just saying that it can only have these particular values.

00:38:26.120 --> 00:38:27.600
So I think I got that right.

00:38:27.600 --> 00:38:30.780
I don't think it has to be an enumeration, but no, no.

00:38:30.780 --> 00:38:32.760
So this is in the end.

00:38:32.760 --> 00:38:38.280
So like the example says, well, if you assign that variable to Monday, it's going to your

00:38:38.280 --> 00:38:42.120
your type checkers are going to complain because you didn't assign the one of the known ones.

00:38:42.120 --> 00:38:48.440
And I probably would use this in conjunction with enums or maybe I don't have to with enums.

00:38:48.440 --> 00:38:49.160
I don't know.

00:38:49.160 --> 00:38:54.100
But but there's a lot of stuff that is passed around that it's kind of like an enum, but it's

00:38:54.100 --> 00:38:54.600
passed around.

00:38:54.600 --> 00:38:56.100
It's just a handful of strings that.

00:38:56.100 --> 00:38:57.420
It can only be one of these strings.

00:38:57.420 --> 00:38:59.660
So yeah, be nice for this to support it.

00:38:59.660 --> 00:39:04.940
Henry on the audience points out that X colon final equals true also maps to one of these

00:39:04.940 --> 00:39:06.400
literal checks.

00:39:06.400 --> 00:39:09.060
So is literal of true rather than just a bool.

00:39:09.060 --> 00:39:12.680
So the type checker can make sure it's always true, not true or false.

00:39:12.680 --> 00:39:15.480
So there's an interesting tie together of those as well.

00:39:15.480 --> 00:39:18.620
And Robert points out that it sounds like a case of the Mondays.

00:39:18.620 --> 00:39:20.040
Oh, dear.

00:39:20.040 --> 00:39:24.920
And Henry mentions that last time I checked self was not supported by my pie.

00:39:24.920 --> 00:39:26.640
But so we'll have to check on that.

00:39:26.640 --> 00:39:27.100
Yeah.

00:39:27.100 --> 00:39:28.740
Anybody from my pie listening?

00:39:28.740 --> 00:39:30.040
Let us know.

00:39:30.040 --> 00:39:30.740
Let us know.

00:39:30.740 --> 00:39:33.380
Well, that's it for for this.

00:39:33.380 --> 00:39:39.580
I just thought it was a good I and I do think this is a good idea is to to not try to jump

00:39:39.580 --> 00:39:41.360
in the deep end of type hints.

00:39:42.800 --> 00:39:47.520
Try some of the simple stuff first and then you get to caring about it.

00:39:47.520 --> 00:39:48.340
Yeah.

00:39:48.340 --> 00:39:50.920
That was a good little discussion around it.

00:39:50.920 --> 00:39:51.360
That was fun.

00:39:51.360 --> 00:39:51.780
Yeah.

00:39:51.780 --> 00:39:52.440
All right.

00:39:52.440 --> 00:39:54.080
Got any extras for us you want to throw out there?

00:39:54.080 --> 00:39:59.720
The only extra I wanted to bring up is the testing code hasn't had an episode since like

00:39:59.720 --> 00:40:00.820
October or something.

00:40:00.820 --> 00:40:02.460
And it's not dead.

00:40:02.460 --> 00:40:06.980
I just kind of wanted to take the holiday off without telling anybody.

00:40:07.980 --> 00:40:09.420
And it's coming back.

00:40:09.420 --> 00:40:11.860
So sometime in January, there will be a testing code episode.

00:40:11.860 --> 00:40:12.720
Oh, excellent.

00:40:12.720 --> 00:40:13.600
Looking forward to it.

00:40:13.600 --> 00:40:13.900
All right.

00:40:13.900 --> 00:40:18.840
I have a few extras and one leads to another, which leads to another as is the nature of

00:40:18.840 --> 00:40:19.460
all these things.

00:40:19.460 --> 00:40:22.460
So I wrote I ran across a couple of articles.

00:40:22.460 --> 00:40:23.320
Let me start that way.

00:40:23.540 --> 00:40:28.640
that sort of talked about RSS and how RSS is actually kind of important as a foundation

00:40:28.640 --> 00:40:32.780
of the independent web and in ways maybe bigger than like I really realized.

00:40:32.780 --> 00:40:34.820
So there's this one called Back to RSS.

00:40:34.820 --> 00:40:36.580
I'll just read a little excerpt from each of them.

00:40:36.580 --> 00:40:39.920
It says it's 2023 or 1999 or whatever.

00:40:39.920 --> 00:40:41.020
Personal sites are back.

00:40:41.020 --> 00:40:41.720
Blogs are back.

00:40:41.720 --> 00:40:42.560
RSS is back.

00:40:42.560 --> 00:40:46.100
And owning your data is becoming real, which kind of a cool thing.

00:40:46.100 --> 00:40:51.340
And then also there's this one the same day on The Verge called Bring Back Personal

00:40:51.340 --> 00:40:51.860
Blogging.

00:40:52.540 --> 00:40:57.900
And yeah, anyway, so I ended up writing a welcome back RSS article that kind of riffed

00:40:57.900 --> 00:41:02.340
on those ideas and talked about some more, talked about Reader, which I talked about before

00:41:02.340 --> 00:41:03.020
and stuff.

00:41:03.020 --> 00:41:06.580
So yeah, anyway, people can go check out that article.

00:41:06.580 --> 00:41:07.540
And it's interesting.

00:41:07.540 --> 00:41:14.340
And as part of the conversation, I learned about Reader, as in reader.readthedocs.io, which

00:41:14.340 --> 00:41:17.300
is a reader is a Python feed reader library.

00:41:17.300 --> 00:41:22.520
So it does things like let you subscribe with Python to RSS and Adam and JSON feed.

00:41:22.520 --> 00:41:24.760
Mark articles as read and important.

00:41:24.760 --> 00:41:25.860
Filter them.

00:41:25.860 --> 00:41:26.800
Get stats.

00:41:26.800 --> 00:41:27.960
Do all of it.

00:41:27.960 --> 00:41:33.480
Like basically, if you wanted the logical internals of an RSS reader, here's a Python

00:41:33.480 --> 00:41:34.820
library to do that, which is cool.

00:41:34.820 --> 00:41:40.240
Now what we need to do is have a listener like take Reader and put a textual front end on it.

00:41:40.240 --> 00:41:41.320
So we have like...

00:41:41.320 --> 00:41:43.780
Yes, actually, that's a pretty interesting idea.

00:41:43.780 --> 00:41:44.440
That'd be cool.

00:41:44.440 --> 00:41:53.680
This guy over here built this thing called Kustos, which is basically like Instapaper, a self-hosted

00:41:53.680 --> 00:41:55.640
Python web app built on Reader.

00:41:55.640 --> 00:41:57.220
So people can check that out.

00:41:57.220 --> 00:41:59.500
And then Readwise looks really interesting.

00:41:59.500 --> 00:42:00.700
Are you familiar with Readwise?

00:42:00.700 --> 00:42:01.560
No.

00:42:01.560 --> 00:42:09.200
So it's like an RSS reader, but it also lets you take notes, mark stuff as read for later,

00:42:09.200 --> 00:42:14.060
even if it doesn't have an RSS feed and highlight like your research as you're going through it

00:42:14.060 --> 00:42:14.780
and save it.

00:42:14.780 --> 00:42:18.800
So think how good that would be for people that say, dude, Hogcaster, you got to remember a

00:42:18.800 --> 00:42:19.700
bunch of stuff about an article.

00:42:19.700 --> 00:42:23.020
Pull that thing back up and it's got your highlights and your notes on it.

00:42:23.020 --> 00:42:23.600
So...

00:42:23.600 --> 00:42:24.880
Oh, I'm liking this.

00:42:24.880 --> 00:42:25.880
I'm going to have to check it out.

00:42:25.880 --> 00:42:27.180
Yeah, that's looking pretty good.

00:42:27.180 --> 00:42:30.320
So anyway, all that stuff came from this little article that I wrote.

00:42:30.400 --> 00:42:31.320
People can check that out.

00:42:31.320 --> 00:42:31.600
Nice.

00:42:31.600 --> 00:42:33.120
Another very important thing.

00:42:33.120 --> 00:42:39.900
There's this Mastodon account called Year Progress, and it just goes along.

00:42:39.900 --> 00:42:45.940
And every day, it just hosts a progress bar for how far we are in the daily progress.

00:42:45.940 --> 00:42:53.440
So it's like a little ASCII, you know, TQDM style progress bar of the year.

00:42:53.440 --> 00:42:58.220
And it's just notable that we just had 100% progress for the year.

00:42:58.760 --> 00:43:02.580
Now that we're done, it's reset to zero, but it was 100%.

00:43:02.580 --> 00:43:06.240
Actually, it looks like it doesn't actually do it every day, but it does it when it goes

00:43:06.240 --> 00:43:07.040
to a new percentage.

00:43:07.040 --> 00:43:09.480
So it's every few days or two or three days, right?

00:43:09.480 --> 00:43:09.960
Yeah.

00:43:09.960 --> 00:43:10.240
Yeah.

00:43:10.240 --> 00:43:12.300
It looks like it, which I guess is probably good.

00:43:12.300 --> 00:43:14.300
I mean, thank you for not doing it.

00:43:14.300 --> 00:43:18.660
It's like saving 3.6, 2.6 posts, something like that.

00:43:18.660 --> 00:43:18.920
Yeah.

00:43:18.920 --> 00:43:19.900
All right.

00:43:19.900 --> 00:43:21.480
And don't just watch it.

00:43:21.480 --> 00:43:22.220
Wait for it.

00:43:23.400 --> 00:43:24.680
It's not that exciting.

00:43:24.680 --> 00:43:25.920
It doesn't actually that often.

00:43:25.920 --> 00:43:28.420
It has no decimal point.

00:43:28.420 --> 00:43:31.780
So it's got to work in big ASCII blocks.

00:43:31.780 --> 00:43:32.720
So it does what it does.

00:43:32.720 --> 00:43:33.140
All right.

00:43:33.140 --> 00:43:39.180
This is something that people might want to keep an eye out who had automated builds running

00:43:39.180 --> 00:43:42.500
over the winter break and also used PyTorch.

00:43:42.700 --> 00:43:47.400
So one of the thoughts I had was I was just kind of kicking back.

00:43:47.400 --> 00:43:47.920
We were hanging around.

00:43:47.920 --> 00:43:50.980
I'm like, you know, I'm going to work on some of these little weird projects.

00:43:50.980 --> 00:43:55.380
I'd like the login page on Talk Python training to just be a little smoother and cleaner.

00:43:55.380 --> 00:43:56.700
Maybe I'll just go play with that.

00:43:56.700 --> 00:44:00.440
I'm not really going to do real work, but it'd be kind of fun to do some web design and just

00:44:00.440 --> 00:44:02.860
sort of like no pressure, redesign that a little bit.

00:44:02.860 --> 00:44:07.900
And I thought, but I'm going to be careful about adding new libraries, updating existing

00:44:07.900 --> 00:44:13.040
ones like pip-tools style, update them because is anybody watching?

00:44:13.040 --> 00:44:15.760
And if something bad got in there, would anybody know?

00:44:15.760 --> 00:44:16.680
Are they all on break?

00:44:16.680 --> 00:44:17.080
Right.

00:44:17.080 --> 00:44:20.920
Well, it turns out my paranoid side was on to something.

00:44:20.920 --> 00:44:25.980
Luckily, not anything I was using, but PyTorch discloses malicious dependency chain compromise

00:44:25.980 --> 00:44:26.940
over the holidays.

00:44:26.940 --> 00:44:28.900
This is bad.

00:44:28.900 --> 00:44:35.600
If you pip installed somehow the PyTorch stuff, I don't know the exact how it links together,

00:44:35.600 --> 00:44:40.700
but it says PyTorch has identified a malicious dependency with the same name as the frameworks

00:44:40.700 --> 00:44:42.320
Torch Triton library.

00:44:42.320 --> 00:44:49.420
So that was like somehow shipped or directly linked in PyTorch in a way that I don't fully

00:44:49.420 --> 00:44:50.620
understand because I don't use it.

00:44:50.620 --> 00:44:59.060
But what happened is on Merry, Merry Christmas, on December 25th, users who installed PyTorch

00:44:59.060 --> 00:45:03.480
nightly should ensure their systems are not compromised because of this Triton torch.

00:45:03.480 --> 00:45:07.260
What they did is somebody put a malicious version on PyPI.

00:45:07.260 --> 00:45:12.620
And when PyTorch was getting set up, instead of picking its own version, it preferred the

00:45:12.620 --> 00:45:14.800
PyPI version, which was a virus.

00:45:14.800 --> 00:45:17.540
So anyway, people can check that out.

00:45:17.540 --> 00:45:19.220
It's sub-ideal.

00:45:19.220 --> 00:45:24.460
Since the PyPI index takes precedence, this malicious package was being installed instead

00:45:24.460 --> 00:45:26.260
of the version from the official repository.

00:45:26.520 --> 00:45:30.060
This enables somebody to register a package to do bad things.

00:45:30.060 --> 00:45:31.700
Anyway, people can read all about that.

00:45:31.700 --> 00:45:36.160
But if you have PyTorch and you pip installed it over the point of break, read that.

00:45:36.160 --> 00:45:36.700
Yeah.

00:45:36.700 --> 00:45:41.500
Plus, you know, kudos for them for coming up with a great domain name, bleepingcomputer.com.

00:45:41.500 --> 00:45:42.560
Yes, I know, bleepingcomputer.

00:45:42.560 --> 00:45:44.900
There's a lot of good articles on bleepingcomputer.

00:45:44.900 --> 00:45:46.380
It's in my RSS feed.

00:45:47.700 --> 00:45:48.260
All right.

00:45:48.260 --> 00:45:49.560
Well, that's all I got for extras.

00:45:49.560 --> 00:45:50.460
How about a joke?

00:45:50.460 --> 00:45:51.580
Yeah, it sounds great.

00:45:51.580 --> 00:45:56.620
So first of all, let me, I don't want to kill the punchline before we set the stage.

00:45:56.620 --> 00:45:56.900
Okay.

00:45:56.900 --> 00:45:58.300
So I pulled up just the picture.

00:45:58.300 --> 00:46:00.960
Can you tell people what this is on the screen, Brian?

00:46:00.960 --> 00:46:01.920
You remember these things?

00:46:01.920 --> 00:46:04.340
Well, remember, they're still there.

00:46:04.340 --> 00:46:06.180
Not on my laptop.

00:46:06.180 --> 00:46:07.680
Not on my Mac mini.

00:46:08.020 --> 00:46:10.680
It's on the back of like a computer or something.

00:46:10.680 --> 00:46:12.720
A desktop computer.

00:46:12.720 --> 00:46:17.080
Next to the power cord, there's a toggle switch with a on and off.

00:46:17.080 --> 00:46:18.440
It's on and off toggle switch.

00:46:18.440 --> 00:46:18.960
Right.

00:46:18.960 --> 00:46:24.340
It's like a physical power button directly on the power supply on a desktop computer, right?

00:46:24.340 --> 00:46:24.840
Yep.

00:46:24.840 --> 00:46:25.400
Yeah.

00:46:25.400 --> 00:46:27.380
And Robert got it exactly right.

00:46:27.380 --> 00:46:28.440
So here is the joke.

00:46:28.440 --> 00:46:30.540
They finally made a switch to exit Vim.

00:46:30.540 --> 00:46:37.660
And they've highlighted that physical power button on the back of the power supply.

00:46:38.620 --> 00:46:39.100
Nice.

00:46:39.100 --> 00:46:41.200
You're a Vim lover.

00:46:41.200 --> 00:46:44.100
So I won't rub it in too much.

00:46:44.100 --> 00:46:45.700
But that's a pretty effective way to exit Vim.

00:46:45.700 --> 00:46:47.620
Vim runs in a window.

00:46:47.620 --> 00:46:48.980
So just close the window.

00:46:48.980 --> 00:46:50.240
You know, whatever.

00:46:50.240 --> 00:46:55.460
The funny thing about power switches.

00:46:55.460 --> 00:47:00.300
So I used to work with a lot of embedded systems.

00:47:00.300 --> 00:47:02.520
And some of them run Windows embedded.

00:47:03.420 --> 00:47:10.020
And embedded systems are supposed to be able to toggle the power off, just like from the power supply.

00:47:10.020 --> 00:47:10.140
Yeah.

00:47:10.140 --> 00:47:10.460
Yeah.

00:47:10.460 --> 00:47:17.380
And now normal Windows, you're not supposed to do that because, you know, you want to let it shut down gracefully.

00:47:17.580 --> 00:47:24.460
And if the disk is moving at the time, and there's even with Windows embedded, there's some issues or any embedded operating system.

00:47:24.460 --> 00:47:31.000
There are a possibility you could do some damage to the disk if you power off at exactly the right time.

00:47:31.100 --> 00:47:34.220
But there's supposed to be safeguards in place to take care of it.

00:47:34.220 --> 00:47:38.980
So I'm just in the habit of using these things all the time of, like, toggle off and on.

00:47:39.840 --> 00:47:48.060
And if we get, like, a new batch of people in that are mostly from DevOps or from non-embedded worlds, they're like, what are you doing?

00:47:48.060 --> 00:47:49.100
You're going to break it?

00:47:49.100 --> 00:47:50.240
Yeah, you're going to break it.

00:47:50.240 --> 00:47:51.920
Like, no, these are good.

00:47:51.920 --> 00:47:52.820
Yeah.

00:47:52.820 --> 00:47:54.320
That's awesome.

00:47:54.320 --> 00:47:56.720
Yeah, my little circuit Python thing.

00:47:56.720 --> 00:47:57.880
It doesn't have a power switch.

00:47:58.080 --> 00:48:00.660
You just disconnect it from power if you want it off.

00:48:00.660 --> 00:48:02.380
That's how it works.

00:48:02.380 --> 00:48:11.700
Well, and one of the reasons, now I'm going in the weeds, but one of the reasons for the need for the ability to just power off is because a lot of times instruments are in a huge rack.

00:48:11.700 --> 00:48:14.880
And you don't go through and power off each individual instrument.

00:48:14.880 --> 00:48:16.220
You just turn the rack off.

00:48:16.220 --> 00:48:18.240
Wow, interesting.

00:48:18.240 --> 00:48:18.840
Cool.

00:48:18.840 --> 00:48:21.540
Well, it's good to be back in 2023.

00:48:21.540 --> 00:48:23.820
Yeah, it is good to be back.

00:48:23.820 --> 00:48:24.960
So welcome back.

00:48:25.400 --> 00:48:28.520
And thanks, everybody, for tuning in.

00:48:28.520 --> 00:48:29.480
Yeah, you bet.

00:48:29.480 --> 00:48:30.160
Bye, all.

