WEBVTT

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

00:00:04.720 --> 00:00:12.380
This is episode 256, or as Anthony Shaw likes to put it, 2 to the 8th, recorded October 27th, 2021.

00:00:12.380 --> 00:00:16.400
Again, unless you're Anthony, which is probably like a totally different day in the future because he's in Australia.

00:00:16.400 --> 00:00:17.500
I'm Michael Kennedy.

00:00:17.500 --> 00:00:18.740
And I'm Brian Okken.

00:00:18.740 --> 00:00:19.940
And I'm Anthony Shaw.

00:00:19.940 --> 00:00:20.480
Hello.

00:00:20.480 --> 00:00:21.800
Hey, Anthony.

00:00:21.800 --> 00:00:23.760
How is the 28th?

00:00:23.760 --> 00:00:26.440
Is the next day going to be good or things are okay?

00:00:26.440 --> 00:00:27.900
Yeah, it's pretty sunny today.

00:00:27.900 --> 00:00:28.560
It's nice.

00:00:28.560 --> 00:00:29.720
Yeah, right on.

00:00:29.820 --> 00:00:32.380
Okay, so the world hangs together for one more day.

00:00:32.380 --> 00:00:32.800
Fantastic.

00:00:32.800 --> 00:00:34.160
You've been here before.

00:00:34.160 --> 00:00:36.140
You've been on Talk Python a bunch of times.

00:00:36.140 --> 00:00:37.940
It's a friend of the show, all sorts of stuff.

00:00:37.940 --> 00:00:41.640
So I'm sure many people know you, but, you know, just tell people a bit about yourself.

00:00:41.640 --> 00:00:44.420
You're doing more techie things these days.

00:00:44.420 --> 00:00:46.740
You're a little closer to the code, maybe.

00:00:46.740 --> 00:00:55.120
Yeah, so earlier this year, I started working at Microsoft and work with Nina Zakarenko on Python inside Microsoft.

00:00:55.120 --> 00:01:01.640
And, yeah, a lot of what I'm doing at the moment is just running around, breaking things, sometimes on purpose.

00:01:03.580 --> 00:01:08.440
Yeah, just seeing how we can improve our experience and working with VS Code and Azure and a whole bunch of other stuff.

00:01:08.440 --> 00:01:09.200
So, yeah.

00:01:09.200 --> 00:01:13.100
Yeah, it's been a while since the last episode was episode 100, I think.

00:01:13.100 --> 00:01:13.900
Wow.

00:01:13.900 --> 00:01:14.980
You're hitting the big numbers.

00:01:14.980 --> 00:01:15.740
So, yeah.

00:01:15.740 --> 00:01:19.880
This two to the eighth is a significant milestone, I think.

00:01:20.220 --> 00:01:20.620
It is.

00:01:20.620 --> 00:01:21.200
It's pretty cool.

00:01:21.200 --> 00:01:22.020
Yeah, awesome.

00:01:22.020 --> 00:01:23.020
Well, we're happy to have you here.

00:01:23.020 --> 00:01:23.720
Thanks for being here.

00:01:23.720 --> 00:01:26.560
Also, something to do with a puppy I've seen on Twitter.

00:01:26.560 --> 00:01:28.280
Oh, yeah, I got a puppy as well.

00:01:28.280 --> 00:01:29.600
Oh, how cute.

00:01:29.600 --> 00:01:30.840
I like to go to Golden something.

00:01:30.840 --> 00:01:36.540
He's a Border Collie, but he's kind of golden colored.

00:01:36.540 --> 00:01:38.400
And he's not in the room at the moment.

00:01:38.400 --> 00:01:40.500
He's not allowed in here while I'm recording.

00:01:40.500 --> 00:01:42.720
I thought it would be a bit chaotic.

00:01:43.800 --> 00:01:50.280
Yeah, my puppy sometimes is here, but it's very bizarre the way that puppies socialize around COVID.

00:01:50.280 --> 00:01:56.960
Instead of us being gone and then we come home, she now knows and understands the expressions I make to end a Zoom call.

00:01:56.960 --> 00:01:58.160
So, she'll sit quietly for an hour.

00:01:58.160 --> 00:02:00.100
And as soon as I say goodbye in Zoom, she's like, we're ready to go.

00:02:00.100 --> 00:02:00.480
Let's go.

00:02:00.480 --> 00:02:02.340
It's super bizarre.

00:02:02.340 --> 00:02:03.960
But, yeah, that's the world we live in.

00:02:03.960 --> 00:02:04.940
So, enjoy the new puppy.

00:02:04.940 --> 00:02:09.000
Brian, you want to kick us off with our first topic here?

00:02:09.000 --> 00:02:11.440
Lucas Lenga, he's, what is he again?

00:02:11.440 --> 00:02:12.540
The developer in residence?

00:02:12.540 --> 00:02:13.240
Yes.

00:02:13.500 --> 00:02:13.900
For Python?

00:02:13.900 --> 00:02:17.520
Anyway, he wrote an article called, Where Does All the Effort Go?

00:02:17.520 --> 00:02:20.940
Looking at Python Core Developer Activity.

00:02:20.940 --> 00:02:23.480
And I kind of really like this article.

00:02:23.480 --> 00:02:29.740
He not only talks about really what's going on with developers and who's doing what.

00:02:29.740 --> 00:02:34.280
To start off with, he talked about how he got this data.

00:02:34.280 --> 00:02:41.580
So, this is also sort of a data processing sort of information scraping sort of article.

00:02:42.400 --> 00:02:48.780
He's looking at the GitHub repository data for CPython, of course.

00:02:48.780 --> 00:02:56.160
And specifically, he's going to be able to do that.

00:02:56.160 --> 00:02:57.160
We've covered that on the show.

00:02:58.160 --> 00:03:05.540
And even lists the SQL queries that he's got.

00:03:05.540 --> 00:03:11.900
Oh, also, since the data is from the time when CPython moved to GitHub.

00:03:11.900 --> 00:03:14.480
So, that's February 10, 2017.

00:03:14.540 --> 00:03:20.620
And he mentions that it's up through October 9th is when he pulled the data.

00:03:20.620 --> 00:03:23.400
So, but all the information is there.

00:03:23.400 --> 00:03:24.920
So, you could grab it yourself if you want.

00:03:24.920 --> 00:03:29.060
Even the little scripts he's got for modifying some of the data.

00:03:29.520 --> 00:03:31.320
So, some of the interesting things.

00:03:31.320 --> 00:03:36.020
The top parts of CPython that are modified.

00:03:36.020 --> 00:03:42.740
It's probably not that surprising that coval.c is involved in 259 merge requests.

00:03:42.740 --> 00:03:45.260
It's the top merged file.

00:03:45.260 --> 00:03:47.480
Coval.c.

00:03:47.540 --> 00:03:50.780
Yeah, that's where the bytecode processor is.

00:03:50.780 --> 00:03:54.140
So, yeah, that's where all, that's the center point or the tunnel.

00:03:54.140 --> 00:03:55.020
Everything flows through.

00:03:55.020 --> 00:03:55.580
So, that makes sense.

00:03:55.580 --> 00:03:56.180
Yeah.

00:03:56.180 --> 00:04:01.700
And then goes on and looks at which contributors merged, have merged.

00:04:01.920 --> 00:04:06.940
And this is an interesting thing, or had been involved in PRs.

00:04:06.940 --> 00:04:13.940
And it lists the top, he lists the top 50 people, but it includes some bots, which is interesting.

00:04:13.940 --> 00:04:15.420
I was going to ask that.

00:04:15.420 --> 00:04:18.480
I thought Bedivere is probably going to be up there or Mrs. LinkedIn.

00:04:18.480 --> 00:04:19.200
Yeah.

00:04:19.200 --> 00:04:20.240
Both bots, by the way.

00:04:20.240 --> 00:04:31.560
So, this is a, I'd actually love to talk to, or either me or Michael or somebody talked to one of the, or Python people to talk about the different bots that are used and why they're used.

00:04:31.560 --> 00:04:37.340
Because that's an interesting thing of large projects using bots to help out with some of the work.

00:04:37.340 --> 00:04:43.880
And anyway, the non-bots, there's a couple of people that stand out.

00:04:43.880 --> 00:04:48.460
Victor Stinner and Serhi Storkaka.

00:04:48.460 --> 00:04:51.400
So, I apologize for messing up your name.

00:04:51.400 --> 00:04:54.140
But that's, they're really up there.

00:04:54.140 --> 00:04:56.620
So, that's pretty interesting that they're involved a lot.

00:04:56.620 --> 00:05:08.000
And then there's a description here, a nice note that Lucas writes, clearly it pays to be a bot or a release manager since that's naturally causes you to make a lot of commits.

00:05:08.000 --> 00:05:13.340
Victor and Serhi are neither of these things and still generate an amazing activity.

00:05:13.340 --> 00:05:13.760
Kudos.

00:05:14.340 --> 00:05:19.500
And also, it's not a competition, but it's still interesting to see who makes all these recent changes.

00:05:19.500 --> 00:05:25.160
By the way, this, that top PR thing was only since the beginning of January 2020.

00:05:25.160 --> 00:05:27.420
So, taking a look at the more recent stuff.

00:05:27.760 --> 00:05:34.520
And then, one of the things that's interesting looking at who contributed where, I didn't know this.

00:05:34.520 --> 00:05:36.120
There's an experts index.

00:05:36.120 --> 00:05:39.580
So, that was linked.

00:05:39.580 --> 00:05:40.760
Oh, it's asleep.

00:05:40.760 --> 00:05:45.140
An experts index that is part of the Python Developers Guide.

00:05:45.140 --> 00:05:46.120
I didn't know this was here.

00:05:46.520 --> 00:05:50.940
It kind of lists some parts of the system, but there's blanks.

00:05:50.940 --> 00:06:11.440
And so, there's, so Lucas also listed, did a script and pulled out the top five contributors to each file, which is kind of an amazing list of all of the different, of, you know, the top five people for every file within CPython.

00:06:11.640 --> 00:06:21.020
So, if, this is kind of neat, because if you're going to do a PR, or you're working on a fix or something, and you're a little confused by some of the code, one of these people might be able to help you out.

00:06:21.020 --> 00:06:22.160
So, this is kind of a neat list.

00:06:22.160 --> 00:06:30.500
So, there's a, at the bottom of the article also, it talks about some of the, some of the takeaways from this.

00:06:30.500 --> 00:06:33.600
I don't have this right off the top of my head.

00:06:33.600 --> 00:06:37.120
Merging, how long it takes to merge a PR.

00:06:37.340 --> 00:06:43.180
So, it's hard to draw information from this data, because it's all over the map.

00:06:43.180 --> 00:06:45.160
The standard deviations are pretty large.

00:06:45.160 --> 00:06:52.960
But, if a core developer merges their own PR, it takes, on average, about seven days to get through the process, give or take 42 days.

00:06:52.960 --> 00:07:01.220
And, and then core developer authoring a PR, which is merged by somebody else, takes longer, about 20 days, give or take 78.

00:07:01.980 --> 00:07:05.980
And then community authors, up to 20 days, give or take 80.

00:07:05.980 --> 00:07:11.000
But, I mean, I work on commercial projects that are not really that much faster than this.

00:07:11.000 --> 00:07:13.540
So, it's not too bad.

00:07:13.540 --> 00:07:15.140
What do you think of this article?

00:07:15.140 --> 00:07:16.720
Yeah, Anthony, what do you think of this?

00:07:16.720 --> 00:07:19.020
You spend a lot of time inside the CPython code.

00:07:19.020 --> 00:07:22.840
I mean, you did write a book, CPython Internals, which people can check out, right?

00:07:22.840 --> 00:07:23.520
Yeah.

00:07:23.520 --> 00:07:26.480
Yeah, I did write a book about CPython source code.

00:07:26.700 --> 00:07:28.040
It's interesting.

00:07:28.040 --> 00:07:32.280
I'm, first of all, I'm super excited about Lukash being the new developer in residence.

00:07:32.280 --> 00:07:34.860
I think he's got the right approach.

00:07:34.860 --> 00:07:45.400
And he's already made, you know, really promising progress, I think, in terms of how, trying to make the community contribution process a bit slicker.

00:07:46.040 --> 00:07:48.000
Yeah, that's that at the bottom.

00:07:48.000 --> 00:07:58.440
Like, just watching the GitHub repository, core developers working on the repository and making changes and stuff, from the outside, looks fairly seamless.

00:07:59.540 --> 00:08:09.000
My own personal experience has been, sometimes it's quite, like, if your PR gets responded to within the first week, then it'll probably get merged pretty quickly.

00:08:09.000 --> 00:08:12.940
And then, if it doesn't, then it just kind of ends up in the pile.

00:08:12.940 --> 00:08:16.840
And I've had ones in there for, like, three years.

00:08:16.840 --> 00:08:18.620
Well, right, the average was seven.

00:08:18.620 --> 00:08:21.480
But it could go out at, like, another 40 days.

00:08:21.480 --> 00:08:23.860
And it's probably, like, really quick or really far.

00:08:23.860 --> 00:08:30.340
Well, that metric is how long they take to get merged, which I guess requires that they are merged.

00:08:30.340 --> 00:08:32.400
Oh, yeah.

00:08:32.400 --> 00:08:33.540
So that's not their fault.

00:08:33.540 --> 00:08:37.020
I mean, there's basically just, like, loads of people contributing stuff.

00:08:37.420 --> 00:08:41.840
And there aren't enough people with enough time to sift through it all.

00:08:41.840 --> 00:08:43.760
And it just makes it really tricky.

00:08:43.760 --> 00:08:46.660
And the project needs to continue marching forward.

00:08:46.660 --> 00:08:49.860
And there's people who are dedicated to working on the core developers.

00:08:49.860 --> 00:08:53.880
But, you know, some of the community contributions are really valuable.

00:08:53.880 --> 00:09:04.380
I think that's what's promising to me is that Lukash is kind of looking at that and not just taking this role on as I'm going to be 100% core developer.

00:09:04.380 --> 00:09:05.660
Yeah.

00:09:05.960 --> 00:09:11.680
Because, yeah, there's already lots of other people on the team who are making some amazing contributions.

00:09:11.680 --> 00:09:15.920
You know, Pablo has been working on the new parser.

00:09:15.920 --> 00:09:20.380
And now he's working on this, like, stack list changes in 3.11.

00:09:20.380 --> 00:09:24.120
Yeah, there's so many things going on at the moment in CPython.

00:09:24.120 --> 00:09:25.940
So it's really encouraging to see.

00:09:25.940 --> 00:09:27.160
Yeah, it's super encouraging.

00:09:27.160 --> 00:09:35.380
I think Lukash is doing a good job sort of smoothing out the edges to just make it easier for everyone to go faster, which I think a lot of times in teams,

00:09:35.500 --> 00:09:43.340
you know, not specifically here, but in general, there's these people who are kind of, oh, that's the person you can ask to make the CI work again when you break it.

00:09:43.340 --> 00:09:46.640
This is the person you asked, like, to set up a new machine and remembers how to do that.

00:09:46.640 --> 00:09:50.000
And like, you don't necessarily get direct credit for doing that work.

00:09:50.000 --> 00:09:52.040
But without them, it's just way harder.

00:09:52.040 --> 00:09:54.840
And I feel like he's doing that for CPython behind the scenes.

00:09:54.840 --> 00:09:59.020
Yeah, the experts index is really helpful if you want to get involved in bug triaging.

00:09:59.740 --> 00:10:02.780
So that's something that people are open to help with.

00:10:02.780 --> 00:10:13.640
If you go on bugs.python.org and you want to help to triage bugs, often what you have to do is kind of look at it, make sure that the person who's reported it has filled in all enough information,

00:10:13.640 --> 00:10:22.740
and then basically add people on the experts index to something called the nosy list, which is like a CC list, basically, on the bug.

00:10:22.740 --> 00:10:25.500
And then, yeah, it's just kind of directing it to the right people.

00:10:25.900 --> 00:10:31.120
Once you've done that for a while, then you kind of get given like a triage flag in your user.

00:10:31.120 --> 00:10:35.660
And then if you've been doing that for even longer, then you could be promoted up to a core developer.

00:10:35.660 --> 00:10:39.560
And there's a few people who've gone through that route over the last couple of years.

00:10:39.560 --> 00:10:43.020
All right, Anthony, while you're talking, I got two things to share out of the audience.

00:10:43.020 --> 00:10:44.100
Dimitri Figgel.

00:10:44.100 --> 00:10:44.680
Hey, Dimitri.

00:10:44.680 --> 00:10:45.520
Great to see you here.

00:10:45.520 --> 00:10:47.500
Dimitri says, thanks for inviting Anthony.

00:10:47.500 --> 00:10:48.920
He's someone I look up to.

00:10:48.920 --> 00:10:49.640
Very nice.

00:10:49.640 --> 00:10:50.320
Thanks, Dimitri.

00:10:50.320 --> 00:10:50.960
Good to see you.

00:10:50.960 --> 00:10:51.480
Yeah.

00:10:51.480 --> 00:10:53.420
And Waylon, who was recently on Talk Python.

00:10:53.420 --> 00:10:53.880
Hey, Waylon.

00:10:53.880 --> 00:10:55.260
Says, what a great lineup here.

00:10:55.560 --> 00:10:56.780
Also kind of for you.

00:10:56.780 --> 00:10:58.480
And also, Henry Schreiner.

00:10:58.480 --> 00:10:58.960
Hey, Henry.

00:10:58.960 --> 00:11:00.420
Also recently on Talk Python.

00:11:00.420 --> 00:11:05.960
Says, both PRs I've been involved with to CPython got in in about a day, I believe.

00:11:05.960 --> 00:11:07.440
Which that's pretty amazing.

00:11:07.440 --> 00:11:08.260
That's pretty good.

00:11:08.260 --> 00:11:08.480
Yeah.

00:11:08.480 --> 00:11:09.340
That's great.

00:11:09.340 --> 00:11:09.800
Yeah.

00:11:09.800 --> 00:11:12.660
So before we move off from this one, Brian, this is a good pick.

00:11:12.660 --> 00:11:20.100
One thing I just want to point out as well is all these cool stats and these graphs and everything we're seeing here apply to CPython because it's on GitHub, right?

00:11:20.100 --> 00:11:20.660
Yes.

00:11:20.660 --> 00:11:25.180
But you can run the same code and run data set from Simon Willison against it.

00:11:25.220 --> 00:11:27.300
But against a different repo, I would imagine.

00:11:27.300 --> 00:11:27.760
Right?

00:11:27.760 --> 00:11:28.440
Oh, yeah.

00:11:28.440 --> 00:11:28.900
Yeah.

00:11:28.900 --> 00:11:33.080
So if you run a project, you could probably do a similar analysis for your project.

00:11:33.080 --> 00:11:33.940
That's a good idea.

00:11:33.940 --> 00:11:34.440
Yeah.

00:11:34.440 --> 00:11:35.060
All right.

00:11:35.060 --> 00:11:36.520
Speaking of good ideas.

00:11:36.820 --> 00:11:42.380
And it's interesting that Henry is out in the audience because I feel like we might have been responsible for this article.

00:11:42.380 --> 00:11:44.340
Clearly, we did not write it.

00:11:44.340 --> 00:11:45.960
We may have triggered is what I'm saying.

00:11:45.960 --> 00:11:46.920
Mostly me.

00:11:46.920 --> 00:11:48.620
In not the positive way.

00:11:48.620 --> 00:11:49.020
Right?

00:11:50.020 --> 00:11:57.060
So this is a cool article by Paul Gansel, who was also over on Talk Python talking about the mysteries of date, time and stuff.

00:11:57.060 --> 00:11:58.660
There's all sorts of cool things.

00:11:58.660 --> 00:12:03.440
He maintains the date, utility package and set up tools, projects and so on.

00:12:03.440 --> 00:12:05.500
Over on episode 271.

00:12:05.960 --> 00:12:10.040
So he wrote an article said why you shouldn't invoke setup.py directly.

00:12:10.040 --> 00:12:17.960
And the reason I think I might have somehow had something to do with this is Henry was on talking about CI build wheel and all the proper ways to build packages.

00:12:17.960 --> 00:12:23.540
I said, oh, you can run setup Python, setup py space, you know, wheel or bdisk or something.

00:12:23.540 --> 00:12:24.440
And they're like, no, no, no.

00:12:24.440 --> 00:12:24.840
You could.

00:12:24.840 --> 00:12:25.920
But please don't do that.

00:12:25.920 --> 00:12:27.580
And then here we have this article like two days later.

00:12:27.580 --> 00:12:35.540
So I don't know if that was part of that conversation, but it's a really good article talking about the state of building Python packages.

00:12:35.540 --> 00:12:43.500
And it says, you know, look for a long time, setup tools and distutils were the only game in town when it came to creating Python packages.

00:12:43.500 --> 00:12:44.100
Right?

00:12:44.100 --> 00:12:49.320
So you could do something like invoke Python setup, bdisk, sdisk, wheel and so on.

00:12:49.320 --> 00:12:50.680
Wait, I see.

00:12:50.680 --> 00:12:52.220
So Paul is actually in the audience.

00:12:52.220 --> 00:12:52.680
Real time.

00:12:52.680 --> 00:12:53.540
Fantastic.

00:12:53.540 --> 00:12:54.020
Hey, Paul.

00:12:54.020 --> 00:12:58.420
Paul says, I think I did it because Matthew Fikert asked for it on Twitter and I got sniped.

00:12:58.420 --> 00:12:58.880
Yeah, perfect.

00:12:58.880 --> 00:12:59.440
Okay, good.

00:12:59.440 --> 00:13:00.760
So I'm just a coincidence.

00:13:00.760 --> 00:13:01.220
Fantastic.

00:13:01.220 --> 00:13:10.880
But yeah, so my, the reason this is extra interesting to me and thank you, Paul, for writing it is I was still doing this, you know, Python setup UI various commands.

00:13:10.880 --> 00:13:12.580
And I was talking to Henry.

00:13:12.580 --> 00:13:14.160
He's like, no, you shouldn't do that.

00:13:14.160 --> 00:13:15.060
You should do it this other way.

00:13:15.060 --> 00:13:17.740
I'm like, he said, well, okay, well, how should I do so?

00:13:17.740 --> 00:13:19.700
You should use build the build package.

00:13:19.700 --> 00:13:22.000
What is this build package you speak of?

00:13:22.000 --> 00:13:22.760
You know?

00:13:22.880 --> 00:13:26.920
So we've talked about pyproject.toml a bunch of times.

00:13:26.920 --> 00:13:30.900
We've talked about things like flit and stuff that will use it, right?

00:13:30.900 --> 00:13:32.640
This all comes from PEP 517.

00:13:32.640 --> 00:13:35.480
And there is a package called build.

00:13:35.480 --> 00:13:36.700
You can pip install build.

00:13:36.700 --> 00:13:40.780
And then you do things like Python-m for module, run build.

00:13:40.780 --> 00:13:42.680
And you can say, I want an sdisk.

00:13:42.680 --> 00:13:45.160
I want a wheel and things like that.

00:13:45.160 --> 00:13:54.000
And this acts as a front end to things like setup tools to the various backends that do building for Python.

00:13:54.000 --> 00:13:54.960
Yeah.

00:13:54.960 --> 00:13:55.540
Yeah.

00:13:55.540 --> 00:13:57.560
All these different things that understand it, right?

00:13:57.920 --> 00:14:01.140
So it says, all direct invocations.

00:14:01.140 --> 00:14:10.320
Paul says, all direct invocations of setup.py are effectively deprecated in favor of purpose-built, standard-based CLI tools like pip, build, and tox.

00:14:10.520 --> 00:14:12.500
So this is quite a long article.

00:14:12.500 --> 00:14:13.680
There's a lot to go through.

00:14:13.680 --> 00:14:15.620
It has some interesting history.

00:14:15.620 --> 00:14:18.480
So in the early days, there wasn't even distutils.

00:14:18.480 --> 00:14:21.660
And then in Python 2, distutils got added.

00:14:21.660 --> 00:14:23.300
And then setup tools came along.

00:14:23.300 --> 00:14:26.240
And then while they work, there's still problems.

00:14:26.400 --> 00:14:33.220
Like, for example, you might have dependencies that you have to install to run the setup.

00:14:33.220 --> 00:14:37.620
But the way you install stuff and figure out what you depend upon is by running the setup.

00:14:37.620 --> 00:14:38.680
So what do you do?

00:14:38.680 --> 00:14:40.920
So an example of that would be Cython, right?

00:14:40.920 --> 00:14:43.640
So you might have to import Cython.

00:14:43.640 --> 00:14:49.840
And in the invocation of calling setup, you tell it how to Cythonize the pyx files, right?

00:14:49.840 --> 00:14:54.380
But that's obviously not going to work because you're going to have to have Cython installed.

00:14:54.800 --> 00:14:55.840
But how do you express that?

00:14:55.840 --> 00:14:58.140
You know, it's like this chicken and egg problem, right?

00:14:58.140 --> 00:15:00.700
So let me pull up my notes here.

00:15:00.700 --> 00:15:01.180
Yeah.

00:15:01.180 --> 00:15:06.300
So basically, one of the big questions was, why am I not seeing deprecation warnings?

00:15:06.300 --> 00:15:07.280
Let me go down a little further.

00:15:07.280 --> 00:15:07.840
Yeah.

00:15:07.840 --> 00:15:12.980
So if I'm not supposed to do this, why isn't screaming from the top of its terminal?

00:15:12.980 --> 00:15:14.240
Stop, stop, stop.

00:15:14.240 --> 00:15:15.780
Why are you doing this, right?

00:15:15.780 --> 00:15:21.520
So there's a lot of commands that still have indirect uses of the distutils and stuff.

00:15:21.520 --> 00:15:24.080
So it's a little tricky to deprecate it.

00:15:24.080 --> 00:15:27.040
But basically, you should consider it deprecated.

00:15:27.040 --> 00:15:30.200
You know, at the end of the day, it's better to replace your setup commands with tools like

00:15:30.200 --> 00:15:38.180
build instead of setup PY sdist or bdist wheel or talks and knocks instead of setup PY test

00:15:38.180 --> 00:15:41.820
and other commands backed by projects intended to support that.

00:15:41.820 --> 00:15:42.200
Yeah.

00:15:42.200 --> 00:15:43.900
That sound good to you guys?

00:15:43.900 --> 00:15:45.620
Where are you on this?

00:15:46.620 --> 00:15:47.340
Brian, you go?

00:15:47.340 --> 00:15:49.200
Well, I don't use...

00:15:49.200 --> 00:15:49.680
Have opinions.

00:15:49.680 --> 00:15:53.740
I mean, I kind of indirectly use build, but I basically just use flit.

00:15:53.740 --> 00:15:56.940
So I'm not writing things with C extensions.

00:15:56.940 --> 00:16:01.280
So pure Python stuff, I just do a flit build or whatever.

00:16:01.280 --> 00:16:02.100
It works fine.

00:16:02.100 --> 00:16:02.580
Yeah.

00:16:02.700 --> 00:16:03.900
So that's kind of...

00:16:03.900 --> 00:16:06.080
I mean, that's using the pyproject.toml stuff, right?

00:16:06.080 --> 00:16:06.580
Yeah.

00:16:06.580 --> 00:16:07.080
Yeah.

00:16:07.080 --> 00:16:07.680
Anthony?

00:16:07.680 --> 00:16:08.680
I kind of...

00:16:08.680 --> 00:16:13.920
If I'm starting a project now, then I use pyproject.toml and the project doesn't have a setup.py.

00:16:14.180 --> 00:16:19.400
There were some reasons why I had to add one in the past, but that's mostly fixed now.

00:16:19.400 --> 00:16:23.140
So I'm either using flit or something similar like poetry.

00:16:23.140 --> 00:16:24.720
Yeah.

00:16:24.720 --> 00:16:30.880
And I've worked on projects years and years ago where the setup.py was like, just ended up just

00:16:30.880 --> 00:16:32.740
being a script to run ad hoc commands.

00:16:32.740 --> 00:16:35.240
Like there was a test, setup.py test.

00:16:35.240 --> 00:16:36.800
And then there's like, and lint.

00:16:36.800 --> 00:16:39.000
And just run them like odd jobs.

00:16:39.000 --> 00:16:39.000
Yeah.

00:16:39.000 --> 00:16:41.460
And what does that have to do with installing software, right?

00:16:41.460 --> 00:16:42.060
Why is that?

00:16:42.060 --> 00:16:42.360
Yeah, nothing.

00:16:42.360 --> 00:16:43.920
It was just like...

00:16:43.920 --> 00:16:47.300
Yeah, it just ended up being an entry point to do things.

00:16:47.300 --> 00:16:51.360
And one happens to be installed, but there's a bunch of other stuff you might randomly do.

00:16:51.360 --> 00:16:51.720
Yeah.

00:16:51.720 --> 00:16:56.380
And it's fine that it's being deprecated, but it just, you know, cpython still does that.

00:16:56.380 --> 00:17:04.000
Like the setup.py and cpython is still used in that way and invoked directly in the source

00:17:04.000 --> 00:17:04.540
code this is.

00:17:04.540 --> 00:17:10.080
So yeah, it's good that it'll be deprecated, but I don't think the tooling is quite ready yet.

00:17:10.080 --> 00:17:13.000
He's not really saying to get rid of setup.py.

00:17:13.200 --> 00:17:14.200
Just don't use it.

00:17:14.200 --> 00:17:14.520
Yeah.

00:17:14.520 --> 00:17:15.300
Don't run it directly.

00:17:15.300 --> 00:17:15.560
Yeah.

00:17:15.560 --> 00:17:17.100
Find something better.

00:17:17.100 --> 00:17:18.300
Pip should do that.

00:17:18.300 --> 00:17:21.520
Pip should do the discovery for you, the PEP 5.17.

00:17:21.520 --> 00:17:22.200
Yeah.

00:17:22.200 --> 00:17:26.680
And run the correct steps for you.

00:17:26.680 --> 00:17:28.020
So yeah, absolutely.

00:17:28.020 --> 00:17:33.300
So a couple of comments out in the live stream is that while recommending build, it's nearly

00:17:33.300 --> 00:17:35.080
impossible to Google to find it.

00:17:35.860 --> 00:17:37.180
And racist.

00:17:37.180 --> 00:17:38.160
I love and hate the name.

00:17:38.160 --> 00:17:38.800
So authoritative.

00:17:38.800 --> 00:17:43.720
So un-Google-able and a bit hard to use in conversation, but yeah, yeah, for sure.

00:17:43.720 --> 00:17:48.080
So I think if you want to take away from this conversation, right at the top, there's a TLDR

00:17:48.080 --> 00:17:49.580
section that Paul put in.

00:17:49.580 --> 00:17:50.280
Click on the summary.

00:17:50.680 --> 00:17:54.560
Picks you down to a summary and you can go to a table and it says, I was about to type

00:17:54.560 --> 00:17:55.000
this.

00:17:55.000 --> 00:17:56.620
What should I do instead?

00:17:56.620 --> 00:17:59.740
I was about to type setup.py sdist.

00:17:59.740 --> 00:18:01.040
What should you type?

00:18:01.040 --> 00:18:02.980
Python-m build.

00:18:02.980 --> 00:18:04.280
Having build installed.

00:18:04.640 --> 00:18:10.160
Or if I was going to type setup.py bdist wheel, I should type python-m build --wheel

00:18:10.160 --> 00:18:10.760
or something like that.

00:18:10.760 --> 00:18:12.060
Setup.py test.

00:18:12.060 --> 00:18:14.280
Oh, maybe py test or talks or knocks.

00:18:14.280 --> 00:18:17.700
We covered knocks recently with Preycin, which was really fun, I believe.

00:18:17.700 --> 00:18:19.960
So setup.py install.

00:18:19.960 --> 00:18:21.060
No, that's pip install.

00:18:21.060 --> 00:18:23.240
Python setup.py develop.

00:18:23.240 --> 00:18:25.300
No, that's pip install dash E.

00:18:25.300 --> 00:18:28.360
And then as well as upload, it goes back to twine.

00:18:28.360 --> 00:18:29.100
So yeah.

00:18:29.100 --> 00:18:31.880
Anyway, I think this is the most actionable bit here.

00:18:31.880 --> 00:18:33.000
Yeah, it's good.

00:18:33.000 --> 00:18:33.920
Yeah, indeed.

00:18:34.300 --> 00:18:34.620
All right.

00:18:34.620 --> 00:18:38.460
Well, Anthony, let's talk about keeping an eye on things.

00:18:38.460 --> 00:18:39.020
Yeah.

00:18:39.020 --> 00:18:44.480
So I wanted to highlight a project which has been in the works for a while, but they've

00:18:44.480 --> 00:18:47.140
just recently finalized the specification.

00:18:47.140 --> 00:18:49.020
So this is called OpenTelemetry.

00:18:49.020 --> 00:18:54.180
It's a part of the Cloud Native Computing Foundation, the CNCF.

00:18:54.180 --> 00:19:04.180
And it's a cross-language event tracing, performance tracing, logging, sampling framework for

00:19:04.180 --> 00:19:07.420
applications, in particular for distributed applications.

00:19:07.420 --> 00:19:12.340
So if you've got an application which is spread across multiple microservices and you want to

00:19:12.340 --> 00:19:17.240
trace things or monitor performance or whatever across all of the stack.

00:19:17.700 --> 00:19:19.700
It's a super hard problem, right?

00:19:19.700 --> 00:19:21.900
Maybe you've got a Docker container running this thing.

00:19:21.900 --> 00:19:25.240
That Docker container calls some other service on a different Docker container.

00:19:25.240 --> 00:19:27.180
And maybe the logs are even transient.

00:19:27.180 --> 00:19:29.700
What are you going to do to know if something went wrong?

00:19:29.700 --> 00:19:30.760
Yeah, exactly.

00:19:31.260 --> 00:19:35.860
And if you've got an application that's spread across, well, if it's built into multiple

00:19:35.860 --> 00:19:40.840
microservices and one of those services has a fault, it's really hard to know where that

00:19:40.840 --> 00:19:41.600
fault came from.

00:19:41.600 --> 00:19:46.320
So if it just says error, blah, blah, blah, blah, you're like, okay, so what triggered that

00:19:46.320 --> 00:19:46.600
error?

00:19:46.600 --> 00:19:50.680
Which request from a user at the front end?

00:19:50.680 --> 00:19:53.120
Or how did that error happen in the first place?

00:19:53.120 --> 00:19:54.140
And how can I fix it?

00:19:55.100 --> 00:19:59.940
And also like identifying, I guess, tracking performance across your application and looking

00:19:59.940 --> 00:20:00.280
at that.

00:20:00.280 --> 00:20:03.740
So there's been attempts at doing this in the past.

00:20:03.740 --> 00:20:08.500
Open tracing and open sensors were the two kind of projects beforehand.

00:20:08.500 --> 00:20:13.960
So this new project, Open Telemetry, is a merger of open tracing and open sensors.

00:20:13.960 --> 00:20:20.460
There's engineers from some big companies working on this, including Microsoft, Amazon, Splunk,

00:20:20.460 --> 00:20:24.440
Google, Elastic, New Relic, and a whole bunch of others as well.

00:20:24.940 --> 00:20:28.880
Including actually full-time engineers from some of those companies working on this.

00:20:28.880 --> 00:20:35.860
So yeah, I've been working with an engineer at Microsoft who works full-time on this project.

00:20:35.860 --> 00:20:39.920
He works on, actually, there's a few people who work full-time on this, but the person who

00:20:39.920 --> 00:20:42.760
works full-time just on the Python components to this.

00:20:42.760 --> 00:20:48.380
So the Python SDK basically allows you to instrument lots of different frameworks.

00:20:48.380 --> 00:20:53.940
So you can basically drop it into Flask or Django or Starlet.

00:20:54.300 --> 00:21:01.340
So if you're using FastAPI and you can sort of instantly get capture of what requests are

00:21:01.340 --> 00:21:05.760
going into the application, when there's been a crash, like where that exception's gone,

00:21:05.760 --> 00:21:07.000
all the logging information.

00:21:07.000 --> 00:21:09.820
You can look at performance records and stuff.

00:21:09.820 --> 00:21:14.520
I've been sharing some examples of where I've wrapped it around a FastAPI app.

00:21:14.620 --> 00:21:21.200
And then I can see like performance of what's the average request time for each of these parts of the application.

00:21:21.200 --> 00:21:22.720
And where is that time spent?

00:21:22.720 --> 00:21:24.160
Even down to like...

00:21:24.160 --> 00:21:30.100
Can you say like this is the data layer section and this is the business logic and here's the civilization or whatever?

00:21:30.100 --> 00:21:30.800
Exactly.

00:21:31.020 --> 00:21:36.260
So I can kind of see like almost like a cool stack, but across the actual components of the app.

00:21:36.260 --> 00:21:38.060
So here's where it came into FastAPI.

00:21:38.060 --> 00:21:40.360
Here's where it went into database.

00:21:40.360 --> 00:21:42.660
Like here's how long the query took.

00:21:42.660 --> 00:21:45.780
Here's how long the ORM took to remodel it.

00:21:45.780 --> 00:21:48.380
Here's how long Jinja2k to build the template.

00:21:48.380 --> 00:21:54.320
Like so you can kind of see a breakdown of all the different components and how things are being pulled together.

00:21:54.700 --> 00:21:58.680
So there's two parts of OpenTelemetry, but there's actually more than two parts.

00:21:58.680 --> 00:22:08.460
I am actually really appreciative of even though there are lots of engineers from big companies, this hasn't been over-engineered yet.

00:22:08.460 --> 00:22:10.620
And I'm really hoping it doesn't.

00:22:10.620 --> 00:22:12.520
Is there a factory factory method in here?

00:22:12.520 --> 00:22:13.500
Yeah, exactly.

00:22:13.500 --> 00:22:15.400
Especially because it's like so generic.

00:22:15.400 --> 00:22:19.120
There's a real danger of it being just over-engineered.

00:22:19.120 --> 00:22:26.740
So if you go on the website and go to registry and then pick Python on the right-hand side, you'll see the kind of different extensions you can get.

00:22:26.740 --> 00:22:30.480
So instrumentation is basically like this is the thing I want to monitor.

00:22:30.480 --> 00:22:41.060
And it could be like ASCII or Async Postgres, for example, Database, Celery, Django, Elasticsearch, Flask.

00:22:41.060 --> 00:22:46.940
Like there's a stack of app stacks that you can just drop it into and it will give you all the tracing information.

00:22:46.940 --> 00:23:01.960
And then there's these things called exporters, which is basically like once it's got the information, it can send it to somewhere like Datadog or New Relic or Azure and AWS, obviously, and Google monitoring as well.

00:23:01.960 --> 00:23:12.800
And yeah, actually, I just worked on recently, if you just want to hack around with it, there's an exporter for rich that just basically prints it on the console.

00:23:12.800 --> 00:23:14.400
So you can see everything that's happening.

00:23:14.400 --> 00:23:16.220
In Keller, probably, yeah.

00:23:16.500 --> 00:23:17.380
Yeah, yeah, yeah.

00:23:17.380 --> 00:23:18.480
So it's all kind of color-coded.

00:23:18.480 --> 00:23:19.340
It's really nice, actually.

00:23:19.340 --> 00:23:21.440
So yeah, I'm really excited about this.

00:23:21.440 --> 00:23:32.100
I've been mostly trying it with FastAPI as there aren't really many frameworks for setting up like decent monitoring and tracing in FastAPI applications.

00:23:32.100 --> 00:23:34.600
And yeah, I think it's really promising.

00:23:34.600 --> 00:23:36.480
So I suggest you check it out.

00:23:36.480 --> 00:23:45.680
And if you see a framework that needs support or something, then this is all open source and they're all accepting contributions as well.

00:23:45.680 --> 00:23:48.260
And it's fairly straightforward to add support.

00:23:48.780 --> 00:23:54.580
Yeah, it's got Postgres, MySQL, MongoDB, Pyramid, Redis, all sorts of good stuff in here.

00:23:54.580 --> 00:24:00.080
Another thing maybe worth pointing out here is because this crosses languages, right?

00:24:00.080 --> 00:24:02.700
There's a Python one, but there's also a .NET one.

00:24:02.700 --> 00:24:09.940
There's a Swift one and so on, which means there might be scenarios where I've got like, say, a mobile app written in Swift.

00:24:10.160 --> 00:24:14.020
And then I've got the backend written in Python and FastAPI or something.

00:24:14.020 --> 00:24:15.580
And you want to put those together.

00:24:15.580 --> 00:24:19.440
Because it goes across those languages, theoretically, that's a thing that could happen.

00:24:19.440 --> 00:24:20.380
Absolutely, yeah.

00:24:20.380 --> 00:24:21.620
And you can pull that all together.

00:24:21.620 --> 00:24:25.360
And it would give a request a trace ID.

00:24:25.360 --> 00:24:32.820
So when a request comes into the front end, a trace ID could carry across the different stacks as well, which is pretty cool.

00:24:32.820 --> 00:24:34.120
Yeah, very cool.

00:24:34.120 --> 00:24:34.600
This is neat.

00:24:34.600 --> 00:24:35.140
Awesome.

00:24:35.140 --> 00:24:36.780
Thanks for covering it.

00:24:36.780 --> 00:24:40.100
Now, before we move on, Brian, we have a sponsor for this episode.

00:24:40.280 --> 00:24:40.600
That's cool.

00:24:40.600 --> 00:24:40.960
Yay.

00:24:40.960 --> 00:24:43.100
Thanks to Shortcut.

00:24:43.100 --> 00:24:45.720
Shortcut, formerly known as Clubhouse.

00:24:45.720 --> 00:24:48.780
So they're a really cool project management tool.

00:24:48.780 --> 00:24:52.600
And they ask the question, have you ever really been happy with project management?

00:24:52.600 --> 00:24:57.220
You know, how's your Jira or whatever, right?

00:24:57.220 --> 00:24:58.580
How much are you loving it?

00:24:58.580 --> 00:25:07.760
So they basically say most are either way too simple for growing engineering teams to manage everything or too complex and just throw in the kitchen sink.

00:25:07.760 --> 00:25:09.480
And you don't want to work with it.

00:25:09.480 --> 00:25:11.340
You've got to constantly tweak it to make it work for you.

00:25:11.340 --> 00:25:14.080
So Shortcut, who used to be known as Clubhouse, is different.

00:25:14.080 --> 00:25:14.820
They try to be simple.

00:25:14.820 --> 00:25:18.340
It's project management built specifically for software teams.

00:25:18.340 --> 00:25:21.760
It's fast, intuitive, flexible, many other nice positive adjectives.

00:25:22.180 --> 00:25:24.400
So some of the highlights are team-based workflows.

00:25:24.400 --> 00:25:30.740
Individual teams can use shortcuts, default workflows, or customize them to match the way they work.

00:25:30.740 --> 00:25:33.920
Also, organizational-wide goals and roadmaps.

00:25:33.920 --> 00:25:39.640
So these workflows automatically get tied into larger goals and feed into like a bigger system outside the team.

00:25:39.640 --> 00:25:44.080
Good source control integration, GitHub, GitLab, Bitbucket, all those types of things.

00:25:44.460 --> 00:25:48.620
One thing that I really love is the web app has hotkeys.

00:25:48.620 --> 00:25:52.280
So it's keyboard-friendly, just like HR and VS Code, whatever, right?

00:25:52.280 --> 00:25:55.080
I don't know why more web apps don't have hotkeys.

00:25:55.080 --> 00:25:57.380
It's not particularly hard, but they do, which is great.

00:25:57.380 --> 00:26:01.020
Iteration planning, so you can set your priorities and let Shortcut run the schedule.

00:26:01.020 --> 00:26:02.940
You get nice little burndown charts and so on.

00:26:02.980 --> 00:26:10.780
So check them out at shortcut.com slash pythonbytes, shortcut.com slash pythonbytes, because you shouldn't have to project manage your project management.

00:26:10.780 --> 00:26:12.020
That does not sound fun.

00:26:12.020 --> 00:26:12.820
So let them do it.

00:26:12.820 --> 00:26:13.400
It's their job.

00:26:13.400 --> 00:26:18.380
Now, before we move off to the next topic, Robert Robinson on the audience.

00:26:18.380 --> 00:26:20.800
Hey, Robert, this open telemetry sounds interesting.

00:26:20.800 --> 00:26:21.820
He wants to try it out.

00:26:21.820 --> 00:26:23.080
I do as well.

00:26:23.080 --> 00:26:27.740
I feel like this is the kind of stuff that you just keep putting off, integrating into your system.

00:26:27.740 --> 00:26:30.560
And then once you finally do, you're like, oh, look how awesome this is.

00:26:30.560 --> 00:26:31.540
We can see what's going on.

00:26:31.600 --> 00:26:33.840
And it's actually, did you know this part was crashing?

00:26:33.840 --> 00:26:34.680
No, I didn't know that.

00:26:34.680 --> 00:26:38.000
Nobody looked at the log and it was just eating the exception, right?

00:26:38.000 --> 00:26:38.500
Yeah.

00:26:38.500 --> 00:26:38.980
Tricky, tricky.

00:26:38.980 --> 00:26:39.420
All right.

00:26:39.420 --> 00:26:40.840
Brian, you got the next one.

00:26:40.840 --> 00:26:44.620
So Python's got a few built-ins.

00:26:44.620 --> 00:26:48.100
Not a ton, but quite a few.

00:26:48.100 --> 00:26:57.500
So there's an article from Tushar Sadwani called Understanding All of Python Through Its Built-Ins.

00:26:57.980 --> 00:27:03.100
And it's a pretty, like, he's got a pretty ambitious goal here to understand everything.

00:27:03.100 --> 00:27:07.560
But I actually kind of really enjoyed even the first part of it.

00:27:07.560 --> 00:27:08.880
So I started reading it.

00:27:08.880 --> 00:27:12.220
I've been especially giving it a shot.

00:27:12.220 --> 00:27:13.860
I got a shout out to him.

00:27:13.860 --> 00:27:19.360
He's been fairly involved on Twitter, answering questions and being involved in conversations.

00:27:19.360 --> 00:27:20.940
So that's a good way to get noticed.

00:27:22.040 --> 00:27:26.020
But there's a, there's, there's a, starts off talking about scope.

00:27:26.020 --> 00:27:31.460
So what is built-ins are not just things that Python has built in, but there's also, it has

00:27:31.460 --> 00:27:34.580
a relevance to the scoping rules.

00:27:34.580 --> 00:27:37.460
And he called it the LEGB scoping rules.

00:27:37.460 --> 00:27:43.940
So it's when Python, if Python sees a symbol, first it looks in the local scope, then the

00:27:43.940 --> 00:27:50.700
enclosing scope and global scope, and then the built-in and built-ins really are just anything

00:27:50.700 --> 00:27:51.920
that's in the built-in package.

00:27:51.920 --> 00:27:57.140
So, and that actually that discussion, it's a really pretty good discussion and it helps

00:27:57.140 --> 00:28:02.420
it kind of, it's good for especially newbies to, to understand, but even advanced beginners

00:28:02.420 --> 00:28:04.860
sometimes don't quite understand what's going on here.

00:28:04.860 --> 00:28:05.300
Yeah.

00:28:05.300 --> 00:28:10.500
Brian and Anthony, you both come from C style languages historically, right?

00:28:10.500 --> 00:28:12.200
Or at least I've spent a lot of time there, right?

00:28:12.200 --> 00:28:13.280
Brian, do a lot of C++.

00:28:13.280 --> 00:28:15.300
Anthony, I know you've done some C# and stuff.

00:28:15.300 --> 00:28:20.360
Did the scoping story of Python confuse you and kind of leave you a little uncertain in

00:28:20.360 --> 00:28:20.660
the beginning?

00:28:20.660 --> 00:28:22.040
Yes, definitely.

00:28:22.040 --> 00:28:27.440
Especially coming from C++ where it's, it's very well-defined and different.

00:28:27.440 --> 00:28:29.060
If it's in the curly braces, it's alive afterwards.

00:28:29.060 --> 00:28:29.820
It's gone, right?

00:28:29.820 --> 00:28:30.700
Like, wait a minute.

00:28:30.700 --> 00:28:31.980
That's not the story at all.

00:28:31.980 --> 00:28:32.500
Right.

00:28:32.500 --> 00:28:35.100
And also you've got so many nested curly braces.

00:28:35.100 --> 00:28:39.980
It could be anywhere and it's not really, there's, it seems like, actually we just

00:28:39.980 --> 00:28:43.480
don't do that too much in Python, but Anthony probably know better than me.

00:28:43.480 --> 00:28:49.720
If I've gotten like multiple nested, name or curly braces, we don't have curly braces,

00:28:49.720 --> 00:28:51.680
but multiple nested indentations.

00:28:52.020 --> 00:28:56.460
does the scope sort of look in outer and outer and outer ones?

00:28:56.460 --> 00:28:57.820
Is that what non-local means?

00:28:57.820 --> 00:29:03.340
I, non-local, there's a non-local keyword, which is like a whole other thing.

00:29:03.340 --> 00:29:05.760
That's a completely different thing.

00:29:05.760 --> 00:29:06.020
Okay.

00:29:06.020 --> 00:29:07.780
I think I've every, I don't know.

00:29:07.780 --> 00:29:09.740
Closure, variable capture, basically.

00:29:09.740 --> 00:29:10.080
Yeah.

00:29:10.080 --> 00:29:10.640
Yeah.

00:29:10.640 --> 00:29:10.860
Yeah.

00:29:10.940 --> 00:29:14.960
But the difference in global really freaked me out because really we were

00:29:14.960 --> 00:29:20.840
pounded into our heads everywhere is to never use global variables, but global is different.

00:29:20.840 --> 00:29:23.740
The global namespace is not a global variable.

00:29:23.740 --> 00:29:26.900
It's more like a module level.

00:29:26.900 --> 00:29:27.620
Yeah.

00:29:27.620 --> 00:29:27.780
Yeah.

00:29:27.780 --> 00:29:27.920
Yeah.

00:29:27.920 --> 00:29:32.600
Or like, like a static variable in a class maybe would be what, what other people might

00:29:32.600 --> 00:29:33.020
call it.

00:29:33.020 --> 00:29:33.460
Yeah.

00:29:33.460 --> 00:29:33.620
Yeah.

00:29:33.620 --> 00:29:35.740
It's not a dangerous thing in Python.

00:29:35.740 --> 00:29:36.440
So, yeah.

00:29:36.440 --> 00:29:39.480
So I didn't mean to derail you that much, but I think it's interesting to think about the

00:29:39.480 --> 00:29:43.120
built-in scope, the global scope, these different scopes, because it's such a different world

00:29:43.120 --> 00:29:45.800
from the intuition you get coming from all the C languages.

00:29:45.800 --> 00:29:46.340
Yeah.

00:29:46.340 --> 00:29:50.860
also just sort of just really enjoyed looking at the language through the scope of built-ins.

00:29:50.860 --> 00:29:52.220
It's an interesting take on it.

00:29:52.220 --> 00:29:56.800
one of the, I will pull out a few things that, that he, he mentions.

00:29:56.800 --> 00:29:58.660
And one is all the constants.

00:29:58.660 --> 00:30:02.780
I guess I'd never counted them before, but there's five, there's five constants in

00:30:02.780 --> 00:30:07.100
Python, true, false, none, ellipsis and not implemented.

00:30:07.100 --> 00:30:09.080
I do like ellipsis.

00:30:09.080 --> 00:30:13.960
we talked about that the other day, or I guess, one or two weeks ago using dot,

00:30:13.960 --> 00:30:15.400
dot, dot, instead of pass.

00:30:15.400 --> 00:30:16.800
Are you going to start doing that?

00:30:16.800 --> 00:30:18.220
I've already started doing that.

00:30:18.220 --> 00:30:18.460
Have you?

00:30:18.460 --> 00:30:20.560
I'm all about, I think I'm, I'm up for it as well.

00:30:20.560 --> 00:30:26.100
I, I don't, I guess I don't think I've ever used not implemented or even looked for

00:30:26.100 --> 00:30:26.700
it, but.

00:30:26.980 --> 00:30:27.840
Interesting discussion.

00:30:27.840 --> 00:30:30.600
also just like, I like looking around.

00:30:30.600 --> 00:30:33.460
So here's a section on compile exec and eval.

00:30:33.460 --> 00:30:35.900
It's not an alphabetical listing of everything.

00:30:35.900 --> 00:30:37.560
It's a more grouping them together.

00:30:37.560 --> 00:30:44.040
it's quite an, a big article, but I would suggest people just like skim through

00:30:44.040 --> 00:30:44.460
the list.

00:30:44.460 --> 00:30:48.300
Cause it's got a good table of contents at the top and you can just sort of, skim

00:30:48.300 --> 00:30:52.060
through what, what he's talking about and pick a couple and go read about it.

00:30:52.060 --> 00:30:52.900
You'll probably learn something.

00:30:52.900 --> 00:30:57.040
So, anyway, good shout out to Tushar for writing this.

00:30:57.440 --> 00:30:57.740
Yeah.

00:30:57.740 --> 00:30:58.380
This looks super handy.

00:30:58.380 --> 00:30:58.840
Yeah.

00:30:58.840 --> 00:31:00.320
Some of the built-ins are super handy.

00:31:00.320 --> 00:31:06.840
I often have a Python repo open just to do, things that would otherwise be annoying

00:31:06.840 --> 00:31:11.580
to do on a calculator, like converting hex, integers and vice versa.

00:31:11.580 --> 00:31:15.300
There's a hex built in, which is really helpful actually, doing this stuff.

00:31:15.300 --> 00:31:15.340
Yeah.

00:31:15.340 --> 00:31:22.280
I use hex a lot because I'm often, looking at, looking at data elements in a, in a,

00:31:22.280 --> 00:31:25.880
uh, a packet or something like that and trying to convert those.

00:31:25.880 --> 00:31:26.660
So, yeah.

00:31:26.660 --> 00:31:27.300
Very nice.

00:31:27.300 --> 00:31:27.800
Nice one.

00:31:27.800 --> 00:31:30.740
Before we move on, Anthony, how do you feel about dot, dot, dot?

00:31:30.740 --> 00:31:33.080
They should have called it yada, yada, yada.

00:31:33.080 --> 00:31:38.040
yeah, I think that would be, it's way better than ellipses.

00:31:38.040 --> 00:31:38.440
Come on.

00:31:38.440 --> 00:31:38.980
Yeah.

00:31:38.980 --> 00:31:41.160
I use it for type stubs, and that's it.

00:31:41.160 --> 00:31:42.460
So, yeah.

00:31:42.460 --> 00:31:44.880
There's times we use pass, right?

00:31:44.880 --> 00:31:45.840
And I feel like, you know what?

00:31:45.840 --> 00:31:49.300
Dot, dot, dot kind of says, I kind of know what I'm not ready for stuff here yet.

00:31:49.300 --> 00:31:53.660
I think we should start calling instead of ellipses, we should call it dun, dun, dun.

00:31:53.660 --> 00:31:56.880
Exactly.

00:31:56.880 --> 00:31:57.760
All right.

00:31:57.760 --> 00:31:59.200
How about we hand out some awards?

00:31:59.200 --> 00:32:00.240
Okay.

00:32:00.240 --> 00:32:02.960
Best open source software of 2021.

00:32:02.960 --> 00:32:05.060
Now who gets to vote on this?

00:32:05.060 --> 00:32:07.000
Who gets to say, well, info world in this example.

00:32:07.000 --> 00:32:10.600
So this is according to info world, but there may be other rules, but I've, I've found this

00:32:10.740 --> 00:32:11.660
pretty interesting.

00:32:11.660 --> 00:32:12.140
Actually.

00:32:12.140 --> 00:32:17.400
I heard about it, learned about it because Sebastian Ramirez from FastAPI said, yay, we've

00:32:17.400 --> 00:32:19.180
been voted one of the best open source projects.

00:32:19.180 --> 00:32:23.340
So this is called the info world bossy 2021 awards.

00:32:23.440 --> 00:32:27.680
But what I thought was interesting is going through here, there was 30 different projects

00:32:27.680 --> 00:32:28.380
that won awards.

00:32:28.380 --> 00:32:29.280
I'm like, oh, that's interesting.

00:32:29.280 --> 00:32:30.320
Oh, I didn't know about that.

00:32:30.320 --> 00:32:31.120
Oh, check this out.

00:32:31.120 --> 00:32:31.320
Yeah.

00:32:31.320 --> 00:32:33.120
So I wanted to touch on a couple.

00:32:33.120 --> 00:32:38.760
So there's some things that may or may not be interesting to you like Svelte, which is a

00:32:38.760 --> 00:32:41.340
JavaScript front end like viewer react.

00:32:41.340 --> 00:32:42.420
That's not interesting to me.

00:32:42.500 --> 00:32:45.060
But Minikube, Minikube is pretty interesting.

00:32:45.060 --> 00:32:50.020
Minikube is a way to run like a baby Kubernetes cluster right on your computer.

00:32:50.020 --> 00:32:52.040
Just say Minikube start.

00:32:52.040 --> 00:32:52.880
And guess what?

00:32:52.880 --> 00:32:54.740
You've got a cool little cluster running.

00:32:54.740 --> 00:32:56.720
So that might be really helpful for Python people.

00:32:56.720 --> 00:32:57.800
Let's see.

00:32:57.800 --> 00:32:58.540
Pixie.

00:32:58.540 --> 00:33:00.040
Zoom back a little here.

00:33:00.040 --> 00:33:02.060
Number five is FastAPI.

00:33:02.060 --> 00:33:04.960
Now we're all fans of FastAPI.

00:33:05.160 --> 00:33:06.960
I think it's really awesome that it won.

00:33:06.960 --> 00:33:11.400
And we're maybe giving a quick shout out to how they described it as Django and Flask have

00:33:11.400 --> 00:33:13.160
been leading the Python web frameworks for years.

00:33:13.160 --> 00:33:16.260
FastAPI now deserves to be mentioned in the same breath.

00:33:16.260 --> 00:33:16.960
I agree.

00:33:16.960 --> 00:33:22.360
Calls out the main features, which are it's truly modern, truly modern Python web framework

00:33:22.360 --> 00:33:26.540
written from the ground up using type hinting, async and high speed components by default.

00:33:26.540 --> 00:33:27.160
That's true.

00:33:27.160 --> 00:33:32.380
And I also really like that they pointed out that while its name indicates it's primarily

00:33:32.380 --> 00:33:37.380
for APIs, it's also really good at writing more conventional websites with like Jinja

00:33:37.380 --> 00:33:38.820
templates or even chameleon templates.

00:33:38.820 --> 00:33:39.820
So way to go.

00:33:39.820 --> 00:33:41.940
Anthony, you want to add it or Brian want to add anything?

00:33:41.940 --> 00:33:47.840
Well, I just think that I think you're partly to thank for people considering FastAPI for

00:33:47.840 --> 00:33:51.460
not just APIs, because you've been beating that drum a little bit as well.

00:33:51.460 --> 00:33:52.480
Yeah, thanks a bunch.

00:33:52.480 --> 00:33:56.640
I even created some decorators that make it really easy to like render templates as response

00:33:56.640 --> 00:33:57.320
values and stuff.

00:33:57.320 --> 00:33:57.820
Yeah, that's fun.

00:33:57.820 --> 00:34:00.560
I tried out the chameleon thing.

00:34:01.460 --> 00:34:02.660
The one you wrote, actually.

00:34:02.660 --> 00:34:06.200
Yeah, because I'm working on this FastAPI course with you at the moment.

00:34:06.200 --> 00:34:07.440
Yeah, that's going to be fun.

00:34:07.440 --> 00:34:10.760
So yeah, I'm a big fan of FastAPI.

00:34:10.760 --> 00:34:11.480
I think it's brilliant.

00:34:11.480 --> 00:34:17.200
And testament to Sebastian, really, because he really kind of builds on something which is

00:34:17.200 --> 00:34:19.740
quite complicated, but he makes it seem so effortless.

00:34:20.460 --> 00:34:25.120
And just working with FastAPI, like the documentation is excellent.

00:34:25.120 --> 00:34:27.840
The framework itself is just is really logical.

00:34:27.840 --> 00:34:34.220
And, you know, it's really easy to use that in terms of like the I've been keeping an eye

00:34:34.220 --> 00:34:37.900
on the popularity of the different frameworks and stuff over the last few years.

00:34:38.900 --> 00:34:42.460
And Django and Flask are kind of neck and neck and have been for a while.

00:34:42.460 --> 00:34:48.700
And FastAPI now is the third most popular, according to the metrics that I've seen.

00:34:48.700 --> 00:34:48.800
Yeah.

00:34:48.800 --> 00:34:50.620
Out of nowhere to third most popular.

00:34:50.620 --> 00:34:50.860
Yeah.

00:34:50.860 --> 00:34:51.480
Yeah.

00:34:51.580 --> 00:34:57.580
And I know JetBrains are doing the latest PSF developer survey.

00:34:57.580 --> 00:35:01.100
So yeah, we'll see kind of what happens in this year's number.

00:35:01.100 --> 00:35:05.200
But I'd imagine FastAPI would still be the third most popular.

00:35:05.200 --> 00:35:06.780
So yeah, it's brilliant.

00:35:06.780 --> 00:35:09.800
So yeah, I think it's a good solid pick.

00:35:09.800 --> 00:35:15.840
In terms of writing like full apps with it at the moment, like there's still a lot you have

00:35:15.840 --> 00:35:16.720
to do for templating.

00:35:16.720 --> 00:35:22.120
Like you pretty much have to like build in a whole bunch of other templating stuff and

00:35:22.120 --> 00:35:27.240
picking an ORM at the moment isn't easy, but there are some brilliant ones to have a play

00:35:27.240 --> 00:35:27.560
with.

00:35:27.560 --> 00:35:27.980
Yeah.

00:35:27.980 --> 00:35:29.300
There's a couple interesting ones.

00:35:29.300 --> 00:35:30.000
I want to give a shout out to.

00:35:30.000 --> 00:35:30.580
Yeah.

00:35:30.580 --> 00:35:35.420
That give like some are even integrating with Pydantic, which is sort of the natural exchange

00:35:35.420 --> 00:35:36.180
of FastAPI.

00:35:36.180 --> 00:35:37.760
So you want to give a shout out to Tortoise, you say?

00:35:37.760 --> 00:35:38.680
Yeah.

00:35:38.680 --> 00:35:39.780
That's my favorite so far.

00:35:39.780 --> 00:35:42.740
I've used, tried out six different ones so far.

00:35:42.740 --> 00:35:43.520
Yeah.

00:35:43.520 --> 00:35:46.520
And Tortoise, I think it's my favorite at the moment.

00:35:46.520 --> 00:35:47.700
So right on.

00:35:47.700 --> 00:35:53.000
Well, maybe next year we'll be talking about the award for SQL model, which is built on

00:35:53.000 --> 00:35:56.080
top of Pydantic plus SQLAlchemy by Sebastian as well.

00:35:56.080 --> 00:35:56.620
So who knows?

00:35:56.620 --> 00:35:57.820
A lot of good ones out there.

00:35:57.820 --> 00:35:58.220
A lot.

00:35:58.220 --> 00:36:01.460
It's good to see a lot of the excitement and new ideas coming along there.

00:36:01.460 --> 00:36:01.900
All right.

00:36:01.900 --> 00:36:02.460
What else we got?

00:36:02.460 --> 00:36:02.980
Crystal.

00:36:02.980 --> 00:36:03.780
Don't care.

00:36:03.780 --> 00:36:04.740
Windows terminal.

00:36:04.740 --> 00:36:06.020
I think is actually pretty interesting.

00:36:06.020 --> 00:36:10.880
Windows has traditionally been not on par with its terminal experience.

00:36:10.880 --> 00:36:15.940
And I think, you know, the windows terminal, PowerShell seven, all my posh, all these things

00:36:15.940 --> 00:36:19.300
come together, nerd fonts to make it like quite an amazing place to be.

00:36:19.300 --> 00:36:19.620
Actually.

00:36:19.620 --> 00:36:21.760
Windows terminal is an open source project.

00:36:21.760 --> 00:36:23.840
It didn't start out that way, but now it is.

00:36:23.840 --> 00:36:24.460
Yeah.

00:36:24.460 --> 00:36:24.680
Okay.

00:36:25.020 --> 00:36:25.200
Yeah.

00:36:25.200 --> 00:36:25.680
Yeah.

00:36:25.680 --> 00:36:26.700
So that's a good one.

00:36:26.700 --> 00:36:27.700
OBS studio.

00:36:27.700 --> 00:36:29.360
If you're doing video stuff, that's amazing.

00:36:29.360 --> 00:36:33.860
There's a bunch of stuff in here that may apply to people that you can all check out that

00:36:33.860 --> 00:36:36.280
are interesting, but I don't want to cover them.

00:36:36.280 --> 00:36:37.240
BASC though.

00:36:37.240 --> 00:36:39.440
BASC is a big data science one.

00:36:39.440 --> 00:36:45.160
Scale computation, like pandas operations and whatnot.

00:36:45.160 --> 00:36:50.220
Across cores, across clusters, across compute that's larger than the RAM you have by streaming

00:36:50.220 --> 00:36:52.040
it off disk and all sorts of interesting stuff.

00:36:52.380 --> 00:36:54.940
I have no idea why my browser is jumping up and down.

00:36:54.940 --> 00:36:55.900
We'll have to ignore that.

00:36:55.900 --> 00:36:57.060
I'm not in control of it.

00:36:57.060 --> 00:36:57.460
I'm sorry.

00:36:57.460 --> 00:36:58.460
It seems like.

00:36:58.460 --> 00:37:01.600
I, you know, I'll tell you why this is happening.

00:37:01.600 --> 00:37:05.600
I'm, I'm looking up and I see I'm not running my VPN, which would block ads.

00:37:05.600 --> 00:37:09.160
And so there's some kind of ad off, off the screen that's just running.

00:37:09.160 --> 00:37:10.980
And if I turn on my VPN, we'd be good.

00:37:10.980 --> 00:37:11.300
All right.

00:37:11.300 --> 00:37:13.440
Blazing SQL is another great one.

00:37:13.440 --> 00:37:14.880
Rapids from NVIDIA.

00:37:14.880 --> 00:37:17.120
And I feel like there's one more I want to give a shout out to.

00:37:17.120 --> 00:37:17.840
Hugging face.

00:37:17.840 --> 00:37:18.560
I don't know anything about that.

00:37:18.560 --> 00:37:19.120
Now that was it.

00:37:19.120 --> 00:37:20.660
So I just going through that list.

00:37:20.740 --> 00:37:23.940
I thought it called out a lot of neat projects in addition to just FastAPI.

00:37:23.940 --> 00:37:24.560
Yeah.

00:37:24.560 --> 00:37:24.980
Cool.

00:37:24.980 --> 00:37:25.480
Yeah.

00:37:25.480 --> 00:37:28.800
Any, any of those jump out at you guys either that I've just screened by?

00:37:28.800 --> 00:37:31.820
Lots of, lots of stacks that I don't use.

00:37:31.820 --> 00:37:33.140
So same.

00:37:33.140 --> 00:37:33.700
Yeah.

00:37:34.700 --> 00:37:38.420
There was a bunch of ML stuff though, which I don't use, but I think would be relevant

00:37:38.420 --> 00:37:39.400
to people who are listening.

00:37:39.400 --> 00:37:39.720
Maybe.

00:37:39.720 --> 00:37:41.340
Well, we're not to extras yet, Michael.

00:37:41.340 --> 00:37:42.280
No, no, I know.

00:37:42.280 --> 00:37:44.380
I just closed it because the jumping was driving me insane.

00:37:44.380 --> 00:37:45.100
Okay.

00:37:45.100 --> 00:37:46.400
All right.

00:37:46.400 --> 00:37:49.380
Anthony, you've got the last main one, right?

00:37:49.380 --> 00:37:50.080
All right.

00:37:50.080 --> 00:37:50.280
Yeah.

00:37:50.280 --> 00:37:53.200
So I think Lukash is taking up like half of this episode.

00:37:54.980 --> 00:38:00.540
So we're going to get back to Lukash's blog and evolve the discussion that was started

00:38:00.540 --> 00:38:03.000
last week on this discussion.

00:38:03.000 --> 00:38:03.200
Yeah.

00:38:03.200 --> 00:38:03.800
Yeah.

00:38:03.800 --> 00:38:05.760
I'm, let's put it mildly.

00:38:05.760 --> 00:38:06.620
I'm excited about this.

00:38:06.660 --> 00:38:10.920
I think if, if this happens, it's probably going to be the biggest thing to happen in

00:38:10.920 --> 00:38:13.680
CPyton in the last five years, in my opinion.

00:38:13.680 --> 00:38:15.640
And this being the GIL removal.

00:38:15.640 --> 00:38:17.500
This be the GIL removal.

00:38:17.500 --> 00:38:18.860
But not the gillectomy.

00:38:18.860 --> 00:38:19.780
Not the gillectomy.

00:38:19.780 --> 00:38:20.360
Not exactly.

00:38:20.360 --> 00:38:21.840
Yeah.

00:38:21.840 --> 00:38:24.960
So no GIL or let's just go with no GIL.

00:38:24.960 --> 00:38:25.800
Yeah.

00:38:25.800 --> 00:38:26.540
No GIL.

00:38:26.540 --> 00:38:36.560
So almost seemingly out of nowhere, Sam Gross, who works at Facebook, basically likes

00:38:36.560 --> 00:38:44.080
submitted to the core developers, this research paper and a working branch of a gill-less

00:38:44.080 --> 00:38:44.540
Python.

00:38:44.540 --> 00:38:48.760
And just quickly recap, I guess, on what that means.

00:38:48.760 --> 00:38:55.000
This article is pretty heavy in technical detail and the stuff that's, yeah, the stuff that's

00:38:55.000 --> 00:38:57.820
being discussed in the article, again, is pretty complicated.

00:38:57.820 --> 00:38:59.380
And I actually didn't understand a lot of it.

00:38:59.380 --> 00:39:02.400
And I've written a book on the Python compiler.

00:39:02.400 --> 00:39:05.500
So if you read this and it's confusing, don't worry.

00:39:06.460 --> 00:39:10.080
So the GIL is basically the global interpreter lock.

00:39:10.080 --> 00:39:17.640
And it exists as a way of making Python thread safe when it comes to keeping reference counts

00:39:17.640 --> 00:39:19.280
of specific objects.

00:39:19.480 --> 00:39:26.860
So if you create a Python object, for example, there's a counter of how many things are referencing it.

00:39:27.460 --> 00:39:28.460
Because you don't want to just destroy an object.

00:39:28.460 --> 00:39:30.380
Because you don't want to just destroy an object.

00:39:30.380 --> 00:39:34.060
And then you're working through a list of objects, for example.

00:39:34.060 --> 00:39:39.480
But then one of the items in the list just disappears, has been deallocated.

00:39:39.480 --> 00:39:41.740
Because everything is a pointer in Python.

00:39:41.740 --> 00:39:43.860
That pointer just goes nowhere.

00:39:43.860 --> 00:39:53.020
Or actually, there's a magic pointer that Python uses when it deallocates objects, which I know from a very painful experience.

00:39:53.360 --> 00:39:54.560
So you don't want that to happen.

00:39:54.560 --> 00:39:59.380
And if you've got multiple threads kind of working with the same objects all at once, you don't want them to...

00:39:59.380 --> 00:40:02.420
It's incredibly hard to keep track of what's happening.

00:40:02.420 --> 00:40:09.480
Threading is great because you can have multiple threads working on a computer.

00:40:09.880 --> 00:40:15.600
And the operating system can do the scheduling of which threads run on which cores and which CPUs, etc.

00:40:15.600 --> 00:40:22.580
So in theory, it's a way of making your Python applications a lot faster if you write them to be multi-threaded.

00:40:22.580 --> 00:40:29.500
But Python is basically built in this lock, which says, okay, in the evaluation loop in C eval,

00:40:29.500 --> 00:40:35.780
don't let anyone else run an instruction whilst this thread is running the instruction.

00:40:35.980 --> 00:40:38.760
With the exception of IO-bound tasks.

00:40:38.760 --> 00:40:39.000
Yeah.

00:40:39.000 --> 00:40:42.060
And it seems like this is a thing to control threading.

00:40:42.060 --> 00:40:44.820
And really, it's just a thing to protect memory management.

00:40:44.820 --> 00:40:47.760
But it has this huge blocking effect for threading, right?

00:40:47.760 --> 00:40:48.380
Yeah.

00:40:48.380 --> 00:40:52.140
So it's a thing to basically make the reference counter thread safe.

00:40:52.140 --> 00:40:54.180
Without locking.

00:40:54.180 --> 00:40:55.020
So it's fast.

00:40:55.020 --> 00:40:55.980
Without locking.

00:40:55.980 --> 00:40:56.340
Yeah.

00:40:56.440 --> 00:40:59.020
So you don't have to wait to add an income.

00:40:59.020 --> 00:41:06.700
So to give you an idea, like if you run the GC by hand, you'll just see how many tens of thousands of objects are just created,

00:41:06.700 --> 00:41:09.180
like all the time in Python applications.

00:41:09.180 --> 00:41:17.920
So what Sam had put together, I say seemingly out of nowhere, but if you go through the article and what he proposed,

00:41:18.040 --> 00:41:23.680
he's actually been working on this almost full time for two years, which is astonishing.

00:41:23.680 --> 00:41:27.100
And it's a real feat of engineering, to be honest.

00:41:27.100 --> 00:41:39.600
So kind of what he's proposed is a way of removing the GIL so that there's essentially like almost two ways of keeping references into objects.

00:41:39.600 --> 00:41:43.420
And one of them is specific to the local thread.

00:41:43.420 --> 00:41:48.160
And then there's also another reference count, which is for other threads.

00:41:48.160 --> 00:41:50.100
So why is that important?

00:41:50.100 --> 00:41:58.520
Well, let's say, for example, you've got a Python dictionary with values in it, and then you have multiple threads or working on the same dictionary.

00:41:58.520 --> 00:42:01.600
Like that's a complicated problem to solve.

00:42:01.880 --> 00:42:07.620
How do you make sure that the references to the keys or the values don't disappear?

00:42:07.620 --> 00:42:11.860
And he does actually go into detail about how that's been handled.

00:42:11.860 --> 00:42:17.400
And also objects like Python dictionaries are not thread safe at the moment either.

00:42:17.400 --> 00:42:26.340
So if you have two threads working on a dictionary, adding values, for example, to a dictionary, do you have to lock the hash table?

00:42:28.340 --> 00:42:35.000
Anyone who's worked with multi-threading in low-level languages knows that the complexities of doing this.

00:42:35.000 --> 00:42:44.640
So what he's proposing is that in his prototype, he basically replaced the Python memory allocator with another one called Mimalloc,

00:42:44.640 --> 00:42:51.120
which is a sort of thread-safe memory allocator.

00:42:51.120 --> 00:42:52.900
It's actually a Microsoft project.

00:42:53.480 --> 00:42:58.060
But I think it could have been any other thread-safe memory allocator.

00:42:58.060 --> 00:43:05.340
Writing memory allocators is very involved for them to be performant and efficient.

00:43:05.340 --> 00:43:10.500
And then basically objects get tied to the thread that created them.

00:43:10.500 --> 00:43:14.420
And then there's a non-atomic local reference count with the owner thread.

00:43:14.920 --> 00:43:21.120
And then there's basically a separate mechanism for what would be slower, basically, reference counting from other threads.

00:43:21.120 --> 00:43:26.560
So single-threaded performance is equivalent with this proposal.

00:43:26.560 --> 00:43:33.820
But there's still a performance impact of multiple threads working on the same object, which is to be expected.

00:43:34.320 --> 00:43:36.220
There's always a little overhead for that.

00:43:36.220 --> 00:43:36.740
Yeah.

00:43:36.740 --> 00:43:45.000
But to give you an idea, in his note, he implemented a few common problems as a multi-threaded implementation.

00:43:45.000 --> 00:43:53.900
And he said, if you give it 20 threads, it runs 19.84 times faster than it would in just regular CPython.

00:43:54.360 --> 00:44:00.520
So for certain types of problems, this can have enormous impact in performance.

00:44:00.520 --> 00:44:03.180
But it is really complicated.

00:44:03.180 --> 00:44:16.000
And that's why I think it's an interesting discussion to see, okay, how do we get from this is a cool idea to this actually being released and being used by millions of people?

00:44:16.560 --> 00:44:21.180
And I don't know, Python's like running on satellites in space and stuff.

00:44:21.180 --> 00:44:27.740
Like, how do we go from a fork that someone's been hacking around with to something that's like production ready?

00:44:27.740 --> 00:44:30.060
And this is kind of what the article goes into.

00:44:30.060 --> 00:44:33.560
So like, you know, how would this work?

00:44:33.560 --> 00:44:34.940
Would it be a feature flag?

00:44:34.940 --> 00:44:37.460
Which version would we target?

00:44:37.460 --> 00:44:42.340
And so at the moment, it's targeting 3.9 alpha 3, actually.

00:44:42.340 --> 00:44:44.960
So it wasn't even the release of 3.9.

00:44:45.320 --> 00:44:50.500
So he needs to do some work to update that to the latest version of 3.9, which is 3.9.7.

00:44:50.500 --> 00:44:59.560
And then I think the target release, if the core developers agreed to kind of like explore this, if that was 3.11.

00:44:59.560 --> 00:45:04.700
Or I don't think anyone wants to touch the Python 4 topic.

00:45:04.700 --> 00:45:08.120
But 11 is like a year away.

00:45:08.120 --> 00:45:09.580
Is that even possible?

00:45:09.580 --> 00:45:11.940
Or would it most likely be a couple years out?

00:45:11.940 --> 00:45:13.440
Yeah, it seems pretty soon to me.

00:45:13.440 --> 00:45:17.820
And I like sub-interpreters, for example, is like an experimental feature.

00:45:17.820 --> 00:45:27.220
I think the issue with this is that it's that the volume of changes is so broad that it's quite hard to kind of like have it in as a feature toggle.

00:45:27.400 --> 00:45:33.260
So like sub-interpreters was in as like a hidden package that you can use and it's experimental.

00:45:33.260 --> 00:45:35.260
Whereas this is like changing...

00:45:35.260 --> 00:45:36.400
Everything.

00:45:36.400 --> 00:45:37.280
Yeah.

00:45:37.280 --> 00:45:38.400
Well, not everything.

00:45:38.400 --> 00:45:41.260
But like it's a pretty wide sweeping change.

00:45:41.260 --> 00:45:45.160
And changing the memory allocator is a massive change.

00:45:45.780 --> 00:45:53.120
So the question is more, how can we introduce this softly, I think, and have it either as a feature flag?

00:45:53.120 --> 00:45:54.920
And what would this break?

00:45:54.920 --> 00:46:02.880
And the main thing is that C extensions haven't really had to worry about thread safety because the GIL kind of handles that for them.

00:46:03.240 --> 00:46:06.420
So C extensions essentially would need to...

00:46:06.420 --> 00:46:08.620
If they use the mechanisms that are here, that's fine.

00:46:08.620 --> 00:46:15.200
But C extensions often have other objects which they haven't used the reference counter for.

00:46:16.440 --> 00:46:23.540
So they've basically kind of like allocated their own objects and variables and stuff like that that would not be thread safe.

00:46:23.540 --> 00:46:26.200
And they had just not ever had these kind of collision issues in the past.

00:46:26.200 --> 00:46:31.060
So introducing this would potentially break some C extensions.

00:46:31.060 --> 00:46:34.640
So, you know, how could that be introduced gently?

00:46:34.640 --> 00:46:40.060
I think what was interesting in the article is there's a mention of NumPy.

00:46:40.060 --> 00:46:47.680
And NumPy has actually done a lot of its own work already on basically kind of making it thread safe and more scalable.

00:46:47.680 --> 00:47:02.420
But one of the tricky ones is PyBind 11 is called out in here as being anyone who's using PyBind 11 potentially might have to do some refactoring to support this if it was supported.

00:47:02.880 --> 00:47:15.380
And then in closing, Lukash, who wrote this review of posts, sort of said, you know, the team have been really impressed with Sam's work and invited him to join CPython Project as a core developer.

00:47:15.380 --> 00:47:18.660
And he's interested and Lukash is going to mentor him.

00:47:18.660 --> 00:47:20.080
So I think that's brilliant.

00:47:20.080 --> 00:47:21.320
Like, oh, yeah, that's brilliant.

00:47:21.320 --> 00:47:30.240
Just to come up with this over like even two years is like a really short amount of time for a problem that people have been trying to solve for well over a decade.

00:47:31.780 --> 00:47:33.140
So, yeah, very exciting.

00:47:33.140 --> 00:47:34.640
Yeah, this is great.

00:47:34.640 --> 00:47:38.760
I think we have a record number of core developers in the audience right now.

00:47:38.760 --> 00:47:39.600
Yeah.

00:47:39.600 --> 00:47:42.840
So some great comments from Steve Dower.

00:47:42.840 --> 00:47:43.280
Hey, Steve.

00:47:43.280 --> 00:47:46.280
The big thing needed here is a path forward for native extensions.

00:47:46.280 --> 00:47:50.680
They could all need rewriting or else importing them could re-enable the GIL.

00:47:50.680 --> 00:47:52.440
That discussion is happening now.

00:47:52.440 --> 00:47:53.020
It's very early.

00:47:53.020 --> 00:47:57.740
And Henry Schreiner also has similar comments that they're considering that.

00:47:57.740 --> 00:47:58.460
But yeah.

00:47:58.880 --> 00:48:04.260
And Henry also says we would be up for refactoring Pybind 11 if needed, I believe.

00:48:04.260 --> 00:48:05.260
This is also interesting.

00:48:05.260 --> 00:48:06.600
But this is exciting.

00:48:06.600 --> 00:48:08.820
There's a lot of stuff coming here.

00:48:08.820 --> 00:48:18.580
I think another thing in addition to the no GIL is I got the sense that Sam had added several other optimizations that were independently worth adding to Python.

00:48:18.580 --> 00:48:19.200
Yeah.

00:48:19.200 --> 00:48:26.180
One of the things I know that there's a lot of tension around whether or not to do 4.0.

00:48:26.680 --> 00:48:35.300
But if it ends up being that all of the extensions need possibly tweaked, then that might be, then it's an API change.

00:48:35.300 --> 00:48:38.720
And I think a shift to 4.0 might not be terrible.

00:48:38.720 --> 00:48:38.960
It would be the right number.

00:48:38.960 --> 00:48:39.360
Yeah.

00:48:39.360 --> 00:48:43.480
Well, we should just go to Python 5.0 so no one's worried about 4.0 and we'll skip the whole conversation.

00:48:43.480 --> 00:48:43.980
It'll be fine.

00:48:44.740 --> 00:48:46.120
We'll do an AngularJS.

00:48:46.120 --> 00:48:52.380
We'll just make a big fuss about going from 1 to 2 and then just all of a sudden they're on version 10 or something.

00:48:52.380 --> 00:48:52.920
Yeah.

00:48:52.920 --> 00:48:54.160
We'll just go crazy.

00:48:54.160 --> 00:48:54.700
Yeah.

00:48:54.700 --> 00:48:55.160
Yeah.

00:48:55.160 --> 00:48:55.800
That's fantastic.

00:48:55.940 --> 00:49:05.320
I'm actually having Guido Van Rossum and Mark Shannon, I believe, on Monday on Talk Python to talk about performance in the future and stuff.

00:49:05.320 --> 00:49:07.200
And I'm sure we'll talk about this stuff a little bit.

00:49:07.200 --> 00:49:07.360
Yeah.

00:49:07.360 --> 00:49:08.180
So it should be a lot of fun.

00:49:08.180 --> 00:49:12.480
This was Guido's suggestion when I asked internally if anyone wanted to share anything.

00:49:12.480 --> 00:49:13.800
This is what he sent over.

00:49:13.800 --> 00:49:14.600
Okay.

00:49:14.600 --> 00:49:15.100
Fantastic.

00:49:15.100 --> 00:49:15.380
Yeah.

00:49:15.380 --> 00:49:16.980
So I'll try to take that up with him again.

00:49:16.980 --> 00:49:17.680
All right.

00:49:17.680 --> 00:49:19.800
Well, Brian, does that bring us to our extras?

00:49:19.800 --> 00:49:21.240
We are at extras.

00:49:21.240 --> 00:49:21.960
Do you have any extras?

00:49:21.960 --> 00:49:22.640
Yeah.

00:49:22.640 --> 00:49:23.380
No, you go first.

00:49:23.380 --> 00:49:24.360
Tell us about PyCon.

00:49:24.360 --> 00:49:25.580
It's a conference, right?

00:49:25.780 --> 00:49:28.560
Call for Proposals is open for US PyCon.

00:49:28.560 --> 00:49:29.840
I'm pretty excited about that.

00:49:29.840 --> 00:49:33.500
I already wrote down like six ideas of things I might want to talk about.

00:49:33.500 --> 00:49:37.120
So and of course, there's no guarantee.

00:49:37.120 --> 00:49:39.500
No matter who you are, there's no guarantee that you're going to get in.

00:49:39.500 --> 00:49:40.320
But it's fun.

00:49:40.320 --> 00:49:42.400
It's fun to come up with proposals anyway.

00:49:42.400 --> 00:49:43.820
And it's fun.

00:49:43.820 --> 00:49:44.960
I'm definitely going.

00:49:44.960 --> 00:49:46.360
So I'm pretty excited about that.

00:49:46.360 --> 00:49:49.640
And anybody else going to propose?

00:49:49.640 --> 00:49:51.080
Anthony, you going to try to talk there?

00:49:51.080 --> 00:49:53.980
Yeah, I've been thinking about that, what I'm going to put forward.

00:49:54.620 --> 00:49:58.120
I want to put together a talk on performance anti-patterns.

00:49:58.120 --> 00:49:59.880
Oh, that'd be fun.

00:49:59.880 --> 00:50:02.020
Propose that for next year.

00:50:02.020 --> 00:50:02.360
Yeah.

00:50:02.360 --> 00:50:03.440
Because of your name?

00:50:03.440 --> 00:50:05.060
Like anti-patterns?

00:50:05.060 --> 00:50:07.740
Also.

00:50:07.740 --> 00:50:09.260
We're not on the direct section yet, Brian.

00:50:11.160 --> 00:50:15.520
If anybody doesn't know, I wrote a book and then I rewrote it.

00:50:15.520 --> 00:50:19.320
And I'm finished with it, actually.

00:50:19.320 --> 00:50:22.720
So it's not out yet, but I'm pretty excited that I'm finished.

00:50:22.720 --> 00:50:26.900
All the betas, there's beta seven out, has all chapters in it.

00:50:26.900 --> 00:50:29.760
So if you're waiting for it to be done, it's done.

00:50:29.760 --> 00:50:31.220
It's not in print form yet.

00:50:31.220 --> 00:50:32.780
That's going to happen in January or February.

00:50:33.060 --> 00:50:35.080
So I'm pretty excited to get that done.

00:50:35.080 --> 00:50:37.060
I'm hoping for my copy at PyCon, Brian.

00:50:37.060 --> 00:50:40.140
I'm pretty sure I paid for the last one as well.

00:50:40.140 --> 00:50:41.860
I actually, I paid you in cash.

00:50:41.860 --> 00:50:43.840
So I'm going to give you a copy of my book.

00:50:43.840 --> 00:50:45.780
I'll bring, I'll bring at least.

00:50:45.780 --> 00:50:46.700
Maybe we can do a swap.

00:50:46.700 --> 00:50:47.180
Swap.

00:50:47.180 --> 00:50:47.660
Yeah.

00:50:47.660 --> 00:50:48.460
That'd be great.

00:50:48.460 --> 00:50:48.960
Yeah.

00:50:48.960 --> 00:50:50.240
Anthony, I got your book over there.

00:50:50.240 --> 00:50:51.860
I'm not sure what I can trade it for though.

00:50:51.860 --> 00:50:54.440
That's awesome.

00:50:54.440 --> 00:50:55.280
Congratulations, Brian.

00:50:55.280 --> 00:50:55.820
Thanks.

00:50:56.300 --> 00:50:57.560
Anthony, you got any extras you want to share?

00:50:57.560 --> 00:51:01.340
Yeah, I'll be shipping fairly soon.

00:51:01.340 --> 00:51:04.640
The JIT compiler that I've been working called Pigeon.

00:51:04.640 --> 00:51:09.040
I'll be going version one in two weeks.

00:51:09.040 --> 00:51:13.860
So it's a Python 3.10 JIT compiler.

00:51:13.860 --> 00:51:19.380
It's a, you basically just drop it into CPython and turn it on and then run your code and it

00:51:19.380 --> 00:51:20.860
just JIT compiles it in the background.

00:51:20.860 --> 00:51:23.820
And in some cases makes it a lot faster.

00:51:24.120 --> 00:51:26.640
In other cases makes no difference.

00:51:26.640 --> 00:51:35.700
But yeah, some of the benchmarks I've been doing, like floating point math and integer

00:51:35.700 --> 00:51:37.440
math, like makes a massive difference.

00:51:37.440 --> 00:51:39.600
So yeah, like 60%.

00:51:39.600 --> 00:51:40.640
Like the scientific side of thing, right?

00:51:40.640 --> 00:51:41.280
Yeah.

00:51:41.280 --> 00:51:46.200
So stuff that you would otherwise think, oh, I'm going to redo this in Cython or something

00:51:46.200 --> 00:51:47.700
like that.

00:51:47.700 --> 00:51:50.040
You don't have to add all the extra stuff.

00:51:50.040 --> 00:51:51.080
You just kind of turn it on.

00:51:51.400 --> 00:51:52.420
Yeah.

00:51:52.420 --> 00:51:52.480
Yeah.

00:51:52.480 --> 00:51:56.920
And body benchmarks now 60% faster than standard CPython.

00:51:56.920 --> 00:51:58.060
That's great.

00:51:58.060 --> 00:52:00.840
And yeah, some of the other benchmarks I've got are 60% upwards.

00:52:00.840 --> 00:52:02.480
That's super cool.

00:52:02.480 --> 00:52:09.100
So this work with Sam and the NoGill, does that throw a spinner in the works or a spinner in

00:52:09.100 --> 00:52:09.300
the works?

00:52:09.780 --> 00:52:14.000
It would make my life quite hard for a few weeks if it gets merged.

00:52:14.000 --> 00:52:17.400
Yeah.

00:52:17.400 --> 00:52:18.840
So yeah, that could be interesting.

00:52:18.840 --> 00:52:22.800
And I'm also working on another secret project, but I'll share that in a few weeks.

00:52:22.800 --> 00:52:23.520
Yeah.

00:52:23.520 --> 00:52:25.320
Pigeon does, there's a comment in the chat.

00:52:25.320 --> 00:52:30.900
Pigeon does use scikit build, which I did want to call that out when we were talking about

00:52:30.900 --> 00:52:41.040
setup.py earlier because, yeah, so Pigeon uses, is all C++ and it uses CMake, which generates

00:52:41.040 --> 00:52:41.680
make files.

00:52:41.680 --> 00:52:49.760
So yeah, and it uses scikit build, which is a CMake extension, I guess, around Python extension

00:52:49.760 --> 00:52:50.180
modules.

00:52:50.760 --> 00:52:52.320
So that's how it kind of compiles.

00:52:52.320 --> 00:52:52.840
It's really cool.

00:52:52.840 --> 00:52:54.160
Big fan of scikit build.

00:52:54.160 --> 00:52:54.800
Yeah.

00:52:54.800 --> 00:52:56.620
And I recommended using build earlier.

00:52:56.620 --> 00:53:02.400
Henry, on our episode together, mentioned that if you have external non-Python code like

00:53:02.400 --> 00:53:06.500
C code or Fortran or whatever, then instead of build, scikit build would be a good option

00:53:06.500 --> 00:53:08.560
to build the binary bits for that.

00:53:08.560 --> 00:53:12.920
This is the other question I wanted to ask, and Steve Dower beat me to it.

00:53:12.920 --> 00:53:15.500
He states it as an assertion.

00:53:15.500 --> 00:53:16.240
I was going to ask you the question.

00:53:16.240 --> 00:53:20.160
I bet once Pigeon ships, you'll get people interested in helping add optimization.

00:53:20.400 --> 00:53:22.260
Yeah, so it's one thing to JIT compile.

00:53:22.260 --> 00:53:26.160
It's another to just then straight up run it versus go, oh, we can inline this method.

00:53:26.160 --> 00:53:27.280
Oh, and I see we can do this.

00:53:27.280 --> 00:53:32.420
And then we could actually reuse this field because it's not used below and early free,

00:53:32.420 --> 00:53:33.320
all that kind of stuff.

00:53:33.320 --> 00:53:34.800
Where's the optimization of that look?

00:53:34.800 --> 00:53:39.580
Yeah, I've got it on the documentation page as an optimization section, and I've kind of

00:53:39.580 --> 00:53:44.340
written up a lot of the optimizations and how they work, assertions that they make

00:53:44.340 --> 00:53:46.240
and compromises and stuff like that.

00:53:46.240 --> 00:53:49.880
So yeah, if you're interested, there's some info on there.

00:53:50.040 --> 00:53:52.980
But yeah, I'd love more help on this.

00:53:52.980 --> 00:53:57.420
The learning curve on the project is quite steep, but I'm trying to make it easier.

00:53:57.420 --> 00:53:59.660
I mean, it is a compiler, so like, yeah.

00:53:59.660 --> 00:54:03.540
And I just added ARM support as well.

00:54:03.540 --> 00:54:06.480
So M1, Apple M1.

00:54:06.480 --> 00:54:12.140
And I tested Linux ARM 64 and, in theory, Windows ARM.

00:54:12.260 --> 00:54:15.380
But I don't have access to any machines to test the Windows one.

00:54:15.380 --> 00:54:18.180
And I could only test the Apple one remotely.

00:54:18.180 --> 00:54:20.680
If you need a periodic test, you can reach out.

00:54:20.680 --> 00:54:22.620
I got Windows 11 running on ARM.

00:54:22.620 --> 00:54:23.460
Oh, really?

00:54:23.460 --> 00:54:23.720
Okay.

00:54:23.720 --> 00:54:24.020
Yeah.

00:54:24.060 --> 00:54:25.180
Yeah, maybe I'll take you up on that.

00:54:25.180 --> 00:54:25.740
Right on.

00:54:25.740 --> 00:54:26.320
Very cool.

00:54:26.320 --> 00:54:26.820
All right.

00:54:26.820 --> 00:54:28.280
I have a couple throughout there as well.

00:54:28.280 --> 00:54:32.960
Python Software Foundation on Twitter, the PSF analysis.

00:54:32.960 --> 00:54:35.860
We're happy to announce the Python Developer Survey 2021.

00:54:35.860 --> 00:54:37.180
Take part in it.

00:54:37.400 --> 00:54:42.300
This is the one that is then hosted, and then the data analysis is done by JetBrains, but

00:54:42.300 --> 00:54:43.480
not influenced by JetBrains.

00:54:43.480 --> 00:54:45.120
So I'll link to that in the show notes.

00:54:45.120 --> 00:54:46.680
Be sure to get out there and take that.

00:54:46.680 --> 00:54:52.060
Henry, out in the audience, I have something as well, the feature for what you said the other

00:54:52.060 --> 00:54:52.560
day on Twitter.

00:54:52.560 --> 00:54:58.180
I said, after Python's bytes mentioned on yesterday's show, I asked for a new feature, and it's

00:54:58.180 --> 00:54:59.640
already in pip.

00:54:59.640 --> 00:55:00.720
PipX.

00:55:00.720 --> 00:55:04.180
PipX run PyPI command line wheels.

00:55:04.680 --> 00:55:10.000
Basically, this is added to PyPI command line, and it'll tell you all sorts of cool stuff,

00:55:10.000 --> 00:55:11.740
like the details of the wheel.

00:55:11.740 --> 00:55:18.520
So you could run pipX, basically run pyPI-command-line wheels numpy, however you run that.

00:55:18.520 --> 00:55:24.460
And it'll tell you, like, for numpy on macOS 10 universal, does it have a signature?

00:55:24.460 --> 00:55:25.540
Is there a binary distribution?

00:55:25.540 --> 00:55:26.540
What versions are updated?

00:55:26.540 --> 00:55:27.460
Supported?

00:55:27.460 --> 00:55:28.460
How old is it?

00:55:28.460 --> 00:55:29.100
How big is it?

00:55:29.100 --> 00:55:34.140
Same thing for Linux architecture, ARM on Windows, and so on, so on.

00:55:34.140 --> 00:55:39.200
So you get, like, just this cool graph using rich of, like, tables of tables telling you

00:55:39.200 --> 00:55:44.020
about the status of wheels on different platforms straight out of PyPI, which I thought was cool.

00:55:44.020 --> 00:55:44.600
Nice.

00:55:44.600 --> 00:55:45.100
Yeah.

00:55:45.100 --> 00:55:45.800
So that's pretty good.

00:55:45.800 --> 00:55:47.840
So, Henry, thanks for making that happen.

00:55:47.840 --> 00:55:54.340
Also, on the last episode, out on the YouTube not live comments, we got a message from, I want

00:55:54.340 --> 00:56:00.240
to make sure I give it the attribution, from Bahram, and said, we talked about, what is it?

00:56:00.240 --> 00:56:00.940
T-Bump.

00:56:00.940 --> 00:56:01.680
T-Bump.

00:56:01.680 --> 00:56:02.140
That was it.

00:56:02.140 --> 00:56:03.480
T-Bump for bumping the versions.

00:56:03.480 --> 00:56:04.200
He said, oh, that's cool.

00:56:04.200 --> 00:56:08.840
I use bump to version, which is another option to do some similar types of things.

00:56:08.840 --> 00:56:13.300
I could work with or without source control, all kinds of stuff.

00:56:13.400 --> 00:56:14.620
So, fun one to check out.

00:56:14.620 --> 00:56:18.560
And, Brian, you sound really good this time.

00:56:18.560 --> 00:56:20.980
Like, last time I thought maybe a bee had gotten into your microphone.

00:56:20.980 --> 00:56:22.240
What was the story of that?

00:56:23.240 --> 00:56:24.180
It's a long story.

00:56:24.180 --> 00:56:26.260
Basically, I had to throw a mic.

00:56:26.260 --> 00:56:29.560
So, I had a bad mic and a bad cable.

00:56:29.560 --> 00:56:30.760
But I have a new XLR cable.

00:56:30.760 --> 00:56:34.720
It's tough when the two things that are connected together are both broken at the same time.

00:56:34.720 --> 00:56:36.880
The buzzing, I think, was definitely my cable.

00:56:36.880 --> 00:56:38.720
I think there was a feedback thing going on.

00:56:38.720 --> 00:56:39.740
Were you getting an SMS?

00:56:39.740 --> 00:56:49.860
And then I was examining everything in my audio chain and just got rid of the stuff that wasn't

00:56:49.860 --> 00:56:50.120
working.

00:56:50.120 --> 00:56:50.920
Yeah.

00:56:50.920 --> 00:56:51.720
You sound great.

00:56:51.720 --> 00:56:53.180
New mics, even better than before.

00:56:53.180 --> 00:56:54.880
So, like a phoenix, you're back.

00:56:54.880 --> 00:56:57.380
Nice image, too.

00:56:57.380 --> 00:56:57.920
Yeah.

00:56:57.920 --> 00:57:00.020
And then, have you got your Mac Pro yet?

00:57:00.020 --> 00:57:02.500
No, I just bought a Mac a couple years ago.

00:57:02.500 --> 00:57:04.120
I'm not going to buy another one right now.

00:57:04.120 --> 00:57:06.680
Anthony, are you using one of these to test your own version?

00:57:06.680 --> 00:57:07.020
No.

00:57:07.020 --> 00:57:12.000
I don't have a spare $4,000 for another laptop.

00:57:12.000 --> 00:57:15.820
And also, I was like, I don't really need a laptop because I never leave the house.

00:57:15.820 --> 00:57:16.440
So, like.

00:57:16.440 --> 00:57:18.720
Yeah, that is a big problem.

00:57:18.720 --> 00:57:23.760
I mean, I am so loving my Mac Mini and my 4K monitor that I'm just like, I don't want

00:57:23.760 --> 00:57:24.000
to leave.

00:57:24.000 --> 00:57:24.460
I don't want to leave.

00:57:24.460 --> 00:57:24.760
All right.

00:57:24.760 --> 00:57:26.020
Well, that's it for the extras.

00:57:26.020 --> 00:57:27.420
I think it's time for a joke.

00:57:27.420 --> 00:57:28.000
Yeah.

00:57:28.000 --> 00:57:29.640
Maybe Robert's got the first one out there.

00:57:29.640 --> 00:57:31.520
Can't complain about Brian.

00:57:31.520 --> 00:57:32.380
It's all about the hair.

00:57:32.380 --> 00:57:33.900
You got to see the live stream for that one.

00:57:33.900 --> 00:57:35.100
But yeah, I agree with that.

00:57:35.100 --> 00:57:37.980
Next Halloween, I want to go as cousin it.

00:57:38.100 --> 00:57:39.240
So, I got a ways to go.

00:57:39.240 --> 00:57:41.340
Anthony, are you up for doing this joke?

00:57:41.340 --> 00:57:41.980
Yeah.

00:57:41.980 --> 00:57:42.640
Yeah.

00:57:42.640 --> 00:57:45.140
I got it on the, it's got it on my screen.

00:57:45.140 --> 00:57:45.880
Oh, you got it on yours?

00:57:45.880 --> 00:57:46.280
Yeah.

00:57:46.280 --> 00:57:47.360
I'll put yours.

00:57:47.360 --> 00:57:47.960
All right.

00:57:47.960 --> 00:57:48.560
Okay.

00:57:48.560 --> 00:57:48.800
Okay.

00:57:48.800 --> 00:57:50.280
So, I got it.

00:57:50.280 --> 00:57:51.160
It's a picture.

00:57:51.160 --> 00:57:52.240
So, I'll have to describe it.

00:57:52.240 --> 00:57:54.140
I couldn't stop laughing at this when I saw it.

00:57:54.140 --> 00:57:56.940
So, this is Frodo explaining to Gollum.

00:57:56.940 --> 00:58:02.820
And there's Gollum sitting at a computer looking quite confused, looking at a picture of the

00:58:02.820 --> 00:58:03.040
ring.

00:58:03.480 --> 00:58:05.240
And it says, buy now one ETH.

00:58:05.240 --> 00:58:07.760
As in Ethereum, right?

00:58:07.760 --> 00:58:08.320
Yeah.

00:58:08.320 --> 00:58:08.580
Yeah.

00:58:08.580 --> 00:58:09.120
As in Ethereum.

00:58:09.120 --> 00:58:14.820
And Frodo is basically trying to convince Gollum to buy an NFT of the ring instead of actually

00:58:14.820 --> 00:58:15.480
having the ring.

00:58:15.480 --> 00:58:16.460
And underneath.

00:58:16.460 --> 00:58:18.420
My digital precious.

00:58:18.420 --> 00:58:25.380
So, underneath it says, so you can't own the precious physically, but you can pay to have

00:58:25.380 --> 00:58:29.520
your name listed as its owner in an online distributed database.

00:58:31.280 --> 00:58:36.580
It's only, what is that, like 400 US dollars, 500 Australian, something like that.

00:58:36.580 --> 00:58:36.860
I don't know.

00:58:36.860 --> 00:58:38.520
That's a lot for a listing.

00:58:38.520 --> 00:58:42.340
I don't own any NFTs yet, nor have I sold any.

00:58:42.340 --> 00:58:43.600
I don't plan to either.

00:58:43.600 --> 00:58:51.140
Man, I feel like we're missing an opportunity to brand some of our former episodes.

00:58:51.140 --> 00:58:56.140
Maybe like, I could just take screenshots of Brian laughing at different times out of the

00:58:56.140 --> 00:59:00.420
live stream and then like turn it into a stream of NFTs that we'll retire upon.

00:59:00.420 --> 00:59:01.240
Oh yeah.

00:59:01.240 --> 00:59:02.400
Let's, let's do that.

00:59:02.400 --> 00:59:04.020
Yeah.

00:59:04.020 --> 00:59:06.220
Oh, fantastic.

00:59:06.220 --> 00:59:06.780
All right.

00:59:06.780 --> 00:59:07.760
Oh, that was a good one.

00:59:07.760 --> 00:59:08.300
Thanks, Anthony.

00:59:08.300 --> 00:59:12.500
And thanks for being here on this big episode 256.

00:59:12.500 --> 00:59:13.640
Yeah.

00:59:13.640 --> 00:59:15.460
I feel like we've maybe gone slightly over to this.

00:59:15.460 --> 00:59:17.480
This is not really a Python bite this week.

00:59:17.480 --> 00:59:19.160
It's more of a Python lunch.

00:59:19.160 --> 00:59:20.080
Sandwich.

00:59:20.080 --> 00:59:21.280
Yeah.

00:59:21.960 --> 00:59:22.240
Yeah.

00:59:22.240 --> 00:59:24.660
It's a proper meal, a Python dinner, but it was a good one.

00:59:24.660 --> 00:59:27.920
We talked about a lot of stuff and a bunch of great people in the audience gave us like

00:59:27.920 --> 00:59:30.540
really good inside information on where things are going.

00:59:30.540 --> 00:59:30.820
So.

00:59:30.820 --> 00:59:31.380
Yeah.

00:59:31.380 --> 00:59:32.080
So thanks everyone.

00:59:32.080 --> 00:59:32.620
It's everyone.

00:59:32.620 --> 00:59:32.760
Yeah.

00:59:32.760 --> 00:59:33.100
Thanks Brian.

00:59:33.100 --> 00:59:33.880
Yeah.

00:59:33.880 --> 00:59:34.360
All right.

00:59:34.360 --> 00:59:34.980
Bye y'all.

