WEBVTT

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

00:00:05.240 --> 00:00:10.520
This is episode 215, reported January 6th, one of my favorite dates, 21.

00:00:10.520 --> 00:00:11.640
I'm Brian Okken.

00:00:11.640 --> 00:00:12.660
I'm Michael Kennedy.

00:00:12.660 --> 00:00:13.720
And we have Jason.

00:00:13.720 --> 00:00:14.160
Hello.

00:00:14.160 --> 00:00:16.440
Yeah, hey, Jason, nice to have you here. Jason McDonald.

00:00:16.440 --> 00:00:18.340
Yeah, it's good to be here. Thank you for having me.

00:00:18.340 --> 00:00:19.660
Yeah, thanks for joining us.

00:00:19.660 --> 00:00:24.040
Oh, and Brian, I think he's going to cover something we haven't really covered much on the show, GUIs.

00:00:24.040 --> 00:00:24.880
Oh, good.

00:00:26.320 --> 00:00:32.860
Actually, to be honest, I know this is like a longstanding joke in the show for longtime listeners, but we actually haven't covered GUIs that much recently.

00:00:32.860 --> 00:00:34.960
But there was a long stretch where we did.

00:00:34.960 --> 00:00:37.480
Yeah, yeah. That was probably like a year ago.

00:00:37.480 --> 00:00:38.440
Yeah, yeah.

00:00:38.440 --> 00:00:41.040
I like my programming projects and my brownies to be GUI.

00:00:41.040 --> 00:00:44.380
And fudge. Come on, fudge too.

00:00:44.380 --> 00:00:47.780
And you like bad jokes, so you'll fit in nicely.

00:00:47.780 --> 00:00:52.200
Oh, absolutely. No, if anyone likes puns, follow my Twitter. I post an original every Monday.

00:00:53.580 --> 00:00:57.640
Nice. I heard that there's going to be a lot of exciting news for space in 2021.

00:00:57.640 --> 00:01:00.580
So I kind of want to bring a little space and Python together.

00:01:00.580 --> 00:01:01.740
That's good. Yeah.

00:01:01.740 --> 00:01:02.160
Yeah.

00:01:02.160 --> 00:01:11.120
So the first topic that I want to talk about is this video done by a woman in the UK who is a astrophysicist.

00:01:11.120 --> 00:01:14.860
She goes by the name Dr. Becky, which is cool.

00:01:14.860 --> 00:01:16.460
She has a fantastic YouTube channel.

00:01:16.460 --> 00:01:22.240
She's also a Python developer and she works in cosmology, which is pretty cool.

00:01:22.240 --> 00:01:39.020
And she did this video that I'd just like to highlight for people who maybe are coming into Python, not from the, hey, I'm going to create a microservice set of APIs talking to Docker, but more from the, hey, I do some kind of science or data science or something like that.

00:01:39.020 --> 00:01:44.080
And the video is called the five ways that I use code as an astrophysicist.

00:01:44.080 --> 00:01:44.440
Cool.

00:01:44.440 --> 00:01:44.680
Huh?

00:01:44.680 --> 00:01:45.060
Yeah.

00:01:45.060 --> 00:01:45.460
Yeah.

00:01:45.460 --> 00:01:54.680
So she basically lays out the idea of as a modern day scientist, you can barely do your job if you're not doing some sort of programming.

00:01:54.680 --> 00:02:02.160
And of course, one of the best languages, technologies for programming these days is Python in the data science space, right?

00:02:02.160 --> 00:02:02.560
Right.

00:02:02.560 --> 00:02:02.820
Surprise.

00:02:02.820 --> 00:02:03.580
Yeah.

00:02:03.580 --> 00:02:05.860
No big surprise there since 2012, I would say.

00:02:05.860 --> 00:02:09.820
And so the, she covers five different things with examples of each.

00:02:09.820 --> 00:02:21.320
So I thought that was just a nice way for people who are either getting into Python from a science side, or maybe they're teachers and they want people ask them, why should I not just use MATLAB or some other custom tool?

00:02:21.320 --> 00:02:22.400
Like, let me show you.

00:02:22.620 --> 00:02:32.220
So here's some really cool examples of real astronomy being done with Python, but it's also super accessible to even like middle schoolers, I would say.

00:02:32.220 --> 00:02:36.980
And number one is image processing of galaxies from telescopes.

00:02:36.980 --> 00:02:40.040
So you can do things like noise removal.

00:02:40.220 --> 00:02:55.400
So it turns out that when you're taking pictures of galaxies, even if there's no actual background light or disturbances, just the basic disturbance in the actual sensors themselves will put little marks and imperfections in the images.

00:02:55.580 --> 00:03:00.800
So using Python to go through and clean those up makes it much easier to get started.

00:03:00.800 --> 00:03:07.060
And the size of these pictures and the amount of data coming in from some of these new telescopes is stunningly large.

00:03:07.060 --> 00:03:07.560
It's cool.

00:03:07.560 --> 00:03:07.800
Yeah.

00:03:07.800 --> 00:03:08.300
For sure.

00:03:08.620 --> 00:03:10.660
Another one is data analysis.

00:03:11.180 --> 00:03:18.380
So if you're trying to find the brightness of some part of an image, say, maybe you're looking for a transit of an exoplanet, right?

00:03:18.380 --> 00:03:20.840
You want to constantly monitor the brightness of a star.

00:03:21.060 --> 00:03:23.740
Or in her case, what she's studying, it just blows my mind.

00:03:23.740 --> 00:03:24.700
She's studying galaxies.

00:03:24.700 --> 00:03:28.220
Like when you see pictures of stars and you're zooming in, you're like, oh, that's not a star.

00:03:28.220 --> 00:03:29.080
That's a galaxy.

00:03:29.080 --> 00:03:32.060
It's just like, you know, like I still can't really get my mind around that.

00:03:32.060 --> 00:03:38.200
But she talks about one of her data sets that has 600,000 rows of like brightness of galaxies.

00:03:38.200 --> 00:03:41.880
So 600,000 galaxies, they all have information about that they're comparing.

00:03:41.880 --> 00:03:43.500
So that's pretty awesome, right?

00:03:43.500 --> 00:03:43.900
Yep.

00:03:43.900 --> 00:03:44.960
Model fitting.

00:03:44.960 --> 00:03:50.800
There's an example about theory that most galaxies have a supermassive black hole in the middle.

00:03:51.080 --> 00:03:57.680
There's also this idea that possibly the size of the black hole and the size of the galaxy, these things kind of grow in mass together.

00:03:57.680 --> 00:03:58.780
So she has all this data.

00:03:58.780 --> 00:04:03.040
She's like, well, let's do some statistical fits of black hole size and galaxy size.

00:04:03.040 --> 00:04:09.120
Also, the color of galaxies can indicate the relative speed or rate of star formation.

00:04:09.120 --> 00:04:09.880
And the age.

00:04:09.880 --> 00:04:10.600
And the age.

00:04:10.600 --> 00:04:10.960
Exactly.

00:04:10.960 --> 00:04:11.220
Yeah.

00:04:11.220 --> 00:04:12.460
All tied together.

00:04:12.460 --> 00:04:14.340
And so she's using Python for that.

00:04:14.340 --> 00:04:18.980
Finally, data visualization, you know, pretty straightforward, but in drawing graphs and pictures.

00:04:19.140 --> 00:04:22.220
And the last part that was my favorite part is simulation.

00:04:22.220 --> 00:04:24.000
So there's two really cool examples.

00:04:24.000 --> 00:04:30.220
What happens if a star gets too close to a black hole and gets, she said, spaghetti-ified?

00:04:30.220 --> 00:04:30.900
That's cool.

00:04:31.820 --> 00:04:37.100
And the other one is examples of galaxies colliding, which is just, again, mind-blowing.

00:04:37.100 --> 00:04:40.260
But really cool computational examples of all that.

00:04:40.260 --> 00:04:47.780
So I wanted to highlight this video because it's super accessible, but it's also really neat to show concrete examples of real science being done with Python.

00:04:47.780 --> 00:04:53.900
Yeah, I thought it was cool when she was talking to her colleague about building the simulations of the universe.

00:04:53.900 --> 00:04:55.400
You know, you have a simulation of the universe.

00:04:55.400 --> 00:04:57.460
Where do you start on that?

00:04:57.460 --> 00:05:00.740
It's like, we think we have project blocking.

00:05:00.740 --> 00:05:02.280
You know, it's like you start on a project.

00:05:02.280 --> 00:05:03.720
It's like, yeah, I'm just going to build a tool.

00:05:03.720 --> 00:05:04.620
Where do I begin?

00:05:04.620 --> 00:05:06.900
It's like, I'm going to build a simulation of the entire universe.

00:05:06.900 --> 00:05:07.840
Where do I start?

00:05:08.160 --> 00:05:08.560
Exactly.

00:05:08.560 --> 00:05:12.660
I'm going to simulate gravity at a galactic scale.

00:05:12.660 --> 00:05:13.500
Let's just do that.

00:05:13.500 --> 00:05:14.660
Yeah.

00:05:14.660 --> 00:05:15.100
Awesome.

00:05:15.100 --> 00:05:19.120
So if people are out there and they're interested in this kind of stuff, yeah.

00:05:19.120 --> 00:05:20.540
This is all in one video?

00:05:20.540 --> 00:05:21.020
Yeah.

00:05:21.020 --> 00:05:22.000
This is all in one video.

00:05:22.000 --> 00:05:22.880
Yeah.

00:05:22.880 --> 00:05:24.840
Robert says star or galaxy.

00:05:24.840 --> 00:05:25.360
It's big.

00:05:25.360 --> 00:05:25.540
Yeah.

00:05:25.540 --> 00:05:27.320
They're both huge, but obviously, man.

00:05:27.320 --> 00:05:30.140
It's just like, I can't get my head around like galaxy-sized stuff.

00:05:30.140 --> 00:05:31.660
It's so insane.

00:05:31.660 --> 00:05:35.600
Star is a primitive type in the universe.

00:05:35.600 --> 00:05:37.580
And then a galaxy is a collection.

00:05:38.040 --> 00:05:41.200
That's what I just immediately go to right there.

00:05:41.200 --> 00:05:41.480
Yeah.

00:05:41.480 --> 00:05:41.920
Exactly.

00:05:41.920 --> 00:05:43.620
Yeah.

00:05:43.620 --> 00:05:47.900
So Brian, it's like a 15 minute video that half of it is the stuff that I talked about.

00:05:47.900 --> 00:05:49.360
Then half is what Jason touched on.

00:05:49.360 --> 00:05:54.680
She actually interviews one of her colleagues who basically does the more, the simulation side

00:05:54.680 --> 00:05:55.140
of programming.

00:05:55.140 --> 00:05:56.160
That's pretty cool.

00:05:56.160 --> 00:05:56.580
Yeah.

00:05:56.580 --> 00:05:56.980
Yeah.

00:05:56.980 --> 00:05:57.820
I'll have to check that out.

00:05:57.820 --> 00:05:58.220
Yeah.

00:05:58.220 --> 00:05:58.920
It's definitely worth it.

00:05:58.920 --> 00:05:59.280
Yeah.

00:05:59.280 --> 00:05:59.780
I enjoyed it.

00:05:59.780 --> 00:06:01.900
I don't do very much data science actually at all.

00:06:01.900 --> 00:06:06.400
And so it's like, you know, understanding, seeing data science stuff is always interesting because

00:06:06.400 --> 00:06:09.160
I, but most of my work is in like application development.

00:06:09.160 --> 00:06:10.760
I don't usually work with a lot of data.

00:06:10.760 --> 00:06:14.840
So it's the, that side of it explained in this really cool, relevant way.

00:06:14.840 --> 00:06:17.980
And said, I was like, well, the statistics is a number of people, you know, who, you know,

00:06:17.980 --> 00:06:21.720
buy, you know, cheese every weekend that the supermarket is not interested galaxies.

00:06:22.560 --> 00:06:22.960
Exactly.

00:06:22.960 --> 00:06:27.580
Getting better click through rates on your ads is not, not super compelling, but I think

00:06:27.580 --> 00:06:30.560
it's really valuable to see alternate perspectives, right?

00:06:30.560 --> 00:06:33.640
We all get into our own little world of like, this is what programming is.

00:06:33.640 --> 00:06:34.720
This is what Python is for.

00:06:34.720 --> 00:06:36.700
And then, you know, it's, it's bigger.

00:06:36.700 --> 00:06:39.140
I want to talk about NumPy a little bit.

00:06:39.140 --> 00:06:39.480
All right.

00:06:39.480 --> 00:06:40.240
Tell us about it.

00:06:40.300 --> 00:06:43.480
Well, I've, I've, I actually, I've used NumPy off and on a lot.

00:06:43.480 --> 00:06:48.580
And it's definitely a staple scientific use of machine learning and sorts of stuff, but,

00:06:48.580 --> 00:06:50.480
but I'm starting to use it more.

00:06:50.480 --> 00:06:54.820
And I've realized, I realized that I had the wrong mental model.

00:06:54.820 --> 00:06:58.740
So I like think of arrays kind of just like lists, but different.

00:06:58.740 --> 00:07:01.460
And so I came across this article.

00:07:01.460 --> 00:07:05.480
It's a couple of years old, but it's a visual intro to NumPy and data represent.

00:07:05.720 --> 00:07:10.520
And to me, it really helps a lot, like to, to help me understand what you can do with

00:07:10.520 --> 00:07:15.320
it and just have a good mental picture of what, what the arrays are in NumPy.

00:07:15.320 --> 00:07:20.760
So it talks about arrays, matrices, and, and, and, and D arrays, which are in dimensional,

00:07:20.760 --> 00:07:23.920
but like, for instance, I'm even just creating an array.

00:07:23.920 --> 00:07:25.300
I knew how to create an array.

00:07:25.300 --> 00:07:30.100
I mean, you just kind of initialize it with a list and you get an array, but I didn't know

00:07:30.100 --> 00:07:35.260
you could do like, just say I want a list of ones or a list of zeros.

00:07:35.640 --> 00:07:40.220
Or an array of ones or just a random array pre-filled with random numbers.

00:07:40.220 --> 00:07:40.640
That's pretty.

00:07:40.640 --> 00:07:45.640
And then he talks about, you know, arithmetic you can do with them and slicing and stuff.

00:07:45.640 --> 00:07:49.840
You know, Brian, like when we talk about Pythonic code all the time, like, oh, you could write

00:07:49.840 --> 00:07:54.340
code in this way where you kind of hack a numerical for loop, but you should do this other way.

00:07:54.340 --> 00:07:55.420
And that would be more Pythonic.

00:07:55.420 --> 00:07:57.300
I suspect there's also a.

00:07:57.300 --> 00:07:58.120
A NumPy way.

00:07:58.120 --> 00:08:00.020
A NumPy way, right?

00:08:00.020 --> 00:08:00.180
Yeah.

00:08:00.180 --> 00:08:01.260
Sort of like filling up stuff.

00:08:01.260 --> 00:08:03.080
You're like, oh, you should just do ones on this one.

00:08:03.140 --> 00:08:07.280
And then then, you know, you always like there's a lot of cool other ways of sort of

00:08:07.280 --> 00:08:08.300
conceptualizing things.

00:08:08.300 --> 00:08:08.540
Right.

00:08:08.540 --> 00:08:09.040
Yeah.

00:08:09.040 --> 00:08:11.180
Well, and it's worth remembering.

00:08:11.180 --> 00:08:13.720
You know, I've said this quite a few times.

00:08:13.720 --> 00:08:15.180
Not here, obviously.

00:08:15.180 --> 00:08:21.060
But I regularly like to remind people abstractions are there to save us typing, never to save us

00:08:21.060 --> 00:08:21.360
thinking.

00:08:21.360 --> 00:08:25.880
It's like it helps to have that mental model, as you put it, Brian, you know, straight.

00:08:26.000 --> 00:08:29.820
Because if your mental model is wrong, it can really wind up.

00:08:29.820 --> 00:08:32.280
Well, you're prone to both cargo cult programming.

00:08:32.280 --> 00:08:34.400
Well, I do it this way because it's the way I was taught.

00:08:34.400 --> 00:08:40.380
Or trying to, you know, ill fit a pattern that's familiar to, you know, the wrong sort of problem

00:08:40.380 --> 00:08:42.740
and you don't realize what it is you're really working with.

00:08:42.740 --> 00:08:46.720
So understanding what's happening under the hood, even if, you know, you don't know all

00:08:46.720 --> 00:08:48.200
the technical details of the implementation.

00:08:48.200 --> 00:08:52.840
So understanding how it's doing things is important to, you know, choosing the right job.

00:08:52.840 --> 00:08:54.340
Idiomatic patterns always.

00:08:54.580 --> 00:08:55.040
Yeah, yeah.

00:08:55.040 --> 00:08:56.860
And you'll hear stuff like, oh, well, Python is slow.

00:08:56.860 --> 00:08:58.340
It's like, well, because you're doing it wrong.

00:08:58.340 --> 00:08:59.580
Don't do it that way.

00:08:59.580 --> 00:09:01.420
For example, use something like NumPy, right?

00:09:01.420 --> 00:09:05.380
And like, for instance, one of the things I really loved about this article was the explanation

00:09:05.380 --> 00:09:08.680
of dot product because I've heard this before.

00:09:08.680 --> 00:09:12.980
I've never had to use a dot product, but it like somebody described it to me several times

00:09:12.980 --> 00:09:14.720
and I'm like, yeah, okay, weird.

00:09:14.720 --> 00:09:20.040
But then like the visual representation of it, I like just stared at it and read it for like,

00:09:20.040 --> 00:09:21.100
you know, 30 seconds.

00:09:21.100 --> 00:09:22.380
Oh, that's easy.

00:09:22.380 --> 00:09:23.280
Now I get it.

00:09:23.280 --> 00:09:26.940
And I'll have it forever now because of that sunk in there.

00:09:26.940 --> 00:09:27.500
Pretty good.

00:09:27.500 --> 00:09:28.360
Yeah, that's awesome.

00:09:28.360 --> 00:09:35.560
One of the reasons why I went to it, I have this problem is that I have like large arrays,

00:09:35.560 --> 00:09:36.740
but they're not like huge.

00:09:37.220 --> 00:09:39.880
They're like in the thousands, say, of numbers.

00:09:39.880 --> 00:09:44.100
And I need to make sure that one array is like comparing to another.

00:09:44.100 --> 00:09:50.960
I know equal works, but I wanted to compare item by item to make sure every element is less

00:09:50.960 --> 00:09:54.860
than the other element in the other array, less than or equal.

00:09:54.860 --> 00:09:55.880
I didn't know how to do that.

00:09:55.880 --> 00:09:58.060
And I'm like, I think NumPy would probably do that easy.

00:09:58.060 --> 00:10:00.440
Can you do one NumPy array less than the other?

00:10:00.840 --> 00:10:01.240
Yeah.

00:10:01.240 --> 00:10:01.280
Yeah.

00:10:01.280 --> 00:10:06.240
So if you say less than, it compares it element by element and it gives you a list of true

00:10:06.240 --> 00:10:06.740
or false.

00:10:06.740 --> 00:10:08.260
And then you can do all.

00:10:08.260 --> 00:10:08.600
Yeah.

00:10:08.600 --> 00:10:09.360
Do an all on it.

00:10:09.360 --> 00:10:09.500
Yeah.

00:10:09.500 --> 00:10:13.520
Just say all of these two arrays less than or equal to each other.

00:10:13.520 --> 00:10:14.920
And I get exactly what I want.

00:10:14.920 --> 00:10:17.500
They're very expressive, simple line of code.

00:10:17.800 --> 00:10:17.980
Yeah.

00:10:17.980 --> 00:10:22.700
It's that kind of stuff I was thinking of when I was talking about like the NumPy, NumPy

00:10:22.700 --> 00:10:23.520
way or whatever.

00:10:23.520 --> 00:10:24.520
Idiomatic NumPy.

00:10:24.520 --> 00:10:25.440
Thank you.

00:10:25.440 --> 00:10:28.960
It's like, that's like one or two lines and it's really fast.

00:10:28.960 --> 00:10:33.300
Whereas you could loop over each item individually and it not only is more code, but it's also

00:10:33.300 --> 00:10:33.620
slower.

00:10:33.620 --> 00:10:34.180
Yeah.

00:10:34.180 --> 00:10:38.340
Well, and also I like, I also have to, I like that there's the intermediate step of that.

00:10:38.340 --> 00:10:43.120
There's gives me a list of true and false too, because I also on the debugging side,

00:10:43.380 --> 00:10:48.380
I need to be able to like wrap this in something and pick like, say the first five elements

00:10:48.380 --> 00:10:49.620
that are not matching.

00:10:49.620 --> 00:10:54.020
I mean, I don't want, if I, if, if it, if it's false, the whole statement's false.

00:10:54.020 --> 00:10:59.080
I don't want to like just say, you know, list all the thousands that are wrong, but I want

00:10:59.080 --> 00:11:02.660
to be able to like list a few to say, at least these are not in the right.

00:11:02.660 --> 00:11:03.000
Yeah.

00:11:03.000 --> 00:11:03.500
Yeah.

00:11:03.500 --> 00:11:04.060
It's good.

00:11:04.060 --> 00:11:05.400
I'm going to try out NumPy now.

00:11:05.400 --> 00:11:08.760
Hey, I now have a reason to try it out.

00:11:08.760 --> 00:11:09.480
Exactly.

00:11:09.480 --> 00:11:11.680
Like, why am I not using this in certain situations?

00:11:12.260 --> 00:11:15.440
Magnus, the live stream says, two dimensions is okay.

00:11:15.440 --> 00:11:18.140
Three is hard, but in that, then my mind blows.

00:11:18.140 --> 00:11:18.300
Yeah.

00:11:18.300 --> 00:11:22.220
I actually did a bunch of math research and four dimensional stuff, two dimensional, but

00:11:22.220 --> 00:11:23.160
complex numbers.

00:11:23.160 --> 00:11:26.360
So four dimensional sort of, and yeah, it's just, it's just hard.

00:11:26.360 --> 00:11:30.020
Well, what one, one of my weird nacks as a programmer is I actually can think in six

00:11:30.020 --> 00:11:30.360
dimensions.

00:11:30.360 --> 00:11:33.960
It's it's, I mentioned before the podcast, I had a head injury a few years ago.

00:11:33.960 --> 00:11:35.220
So I'm a minor traumatic savant.

00:11:35.220 --> 00:11:36.540
I can think in six dimension.

00:11:36.540 --> 00:11:40.520
And the best way I can explain it, if you're trying to do it without having a really bizarre brain

00:11:40.520 --> 00:11:45.540
like mine is think of, think of the fourth dimension as a timeline.

00:11:45.540 --> 00:11:51.060
And for each timeline you have, you have space represented as a cube, but then you have this

00:11:51.060 --> 00:11:53.000
row of cubes, which represents the timeline.

00:11:53.000 --> 00:11:57.660
It becomes a lot easier to think of four dimensional race when you think of it in that fashion.

00:11:57.660 --> 00:11:58.040
Yeah.

00:11:58.040 --> 00:12:01.660
And the way that we did it, we actually had animations of that three dimension thing and

00:12:01.660 --> 00:12:03.860
the animations were moving through that, that bit.

00:12:03.860 --> 00:12:04.040
Yeah.

00:12:04.040 --> 00:12:07.200
But still it's, it's, it's no easy, no easy thing.

00:12:07.200 --> 00:12:07.420
Yeah.

00:12:07.420 --> 00:12:11.420
It's easier when you're an animator to wrap your head around 4d than if you're just a, you

00:12:11.420 --> 00:12:14.240
know, an ordinary run of the mill programmer like most of us.

00:12:14.240 --> 00:12:17.220
Brian, would you say that that's a gooey type of solution?

00:12:17.220 --> 00:12:18.600
no.

00:12:18.600 --> 00:12:21.620
Maybe you could do something with cute.

00:12:21.620 --> 00:12:22.380
Yeah.

00:12:22.380 --> 00:12:22.620
Yeah.

00:12:22.620 --> 00:12:22.980
Okay.

00:12:22.980 --> 00:12:23.940
Oh yeah.

00:12:23.940 --> 00:12:24.600
I don't know.

00:12:24.600 --> 00:12:24.840
Yeah.

00:12:24.840 --> 00:12:25.260
Jason.

00:12:25.260 --> 00:12:25.840
Yeah.

00:12:25.840 --> 00:12:26.360
Who knows?

00:12:26.360 --> 00:12:26.920
It's possible.

00:12:27.640 --> 00:12:29.760
So, that's our next topic.

00:12:29.760 --> 00:12:30.280
Take it.

00:12:30.280 --> 00:12:30.940
Grab it, Jason.

00:12:30.940 --> 00:12:31.520
Yeah.

00:12:31.520 --> 00:12:32.100
Well, okay.

00:12:32.100 --> 00:12:36.800
Well, I, I, so I was really excited to discover the cute six just released on December

00:12:36.800 --> 00:12:37.280
8th.

00:12:37.280 --> 00:12:38.380
So, cute.

00:12:38.380 --> 00:12:39.080
Yeah.

00:12:39.080 --> 00:12:40.540
It is officially pronounced cute.

00:12:40.540 --> 00:12:41.920
Although it's much, it's very debatable.

00:12:41.920 --> 00:12:42.940
People like, Oh, it's cutie.

00:12:42.940 --> 00:12:43.360
It's cute.

00:12:43.360 --> 00:12:44.540
Come on.

00:12:44.540 --> 00:12:45.800
Yeah, exactly.

00:12:45.800 --> 00:12:48.040
Anyway, whatever you're going to call it, it just released.

00:12:48.040 --> 00:12:50.480
and this includes the Python binding.

00:12:50.480 --> 00:12:56.880
So, pie side six, Shabokan six, which is the, so pie side two was cutie five,

00:12:56.880 --> 00:12:57.860
as if that made sense.

00:12:57.860 --> 00:12:59.500
Pie side six is, is cute.

00:12:59.500 --> 00:13:00.520
T six, cute sexy.

00:13:00.520 --> 00:13:01.500
Now I'm doing it.

00:13:01.500 --> 00:13:03.340
Anyway, so that just released.

00:13:03.340 --> 00:13:09.960
and you also have the pie cute T six, if you prefer, Riverbanks version, but in

00:13:09.960 --> 00:13:13.720
whatever case, you're going to wind up with, with all the, all the cute six features.

00:13:13.720 --> 00:13:18.340
I think the coolest thing here is if you're doing, if you're doing like,

00:13:18.340 --> 00:13:24.060
you know, really fancy sort of, graphics is that, previously, cute five and prior

00:13:24.060 --> 00:13:28.820
had this hard dependency on open GL and they've actually put in a, what they call the rendering

00:13:28.820 --> 00:13:29.780
hardware interface.

00:13:29.780 --> 00:13:32.060
So it's an abstraction layer into, into cute.

00:13:32.060 --> 00:13:37.440
So now, it can natively support whatever the 3d graphics driver is on that device, whether

00:13:37.440 --> 00:13:42.000
it's direct ax, bulk in metal, whatever, whatever you want it to work with, but uses the native

00:13:42.000 --> 00:13:42.640
by default.

00:13:42.640 --> 00:13:45.440
You could, you could tell it to use whatever, whatever you want.

00:13:45.440 --> 00:13:46.920
that is so cool.

00:13:46.920 --> 00:13:47.480
Yeah.

00:13:47.700 --> 00:13:51.400
and there's a bunch of other optimizations and fixes to have in here.

00:13:51.400 --> 00:13:57.760
I am really excited because I discovered, and this was actually introduced in five 15,

00:13:57.760 --> 00:14:03.060
but they now support snake case for those of us who are like PEP 8 addicts who really

00:14:03.060 --> 00:14:06.860
hate the fact that cute kind of seemed to force you to use the camel case.

00:14:06.860 --> 00:14:08.240
You can use snake case.

00:14:08.240 --> 00:14:11.420
There is a, there is a, a setting for it.

00:14:11.660 --> 00:14:15.240
you can also use properties instead of getters and setters as a cute X.

00:14:15.240 --> 00:14:21.820
So you can just rely on properties and that is, it makes it a lot easier to write, you know,

00:14:21.820 --> 00:14:24.920
idiomatic Python code that is cute, which is fun.

00:14:24.920 --> 00:14:29.540
Well, it just feels wrong to write, you know, get with, set with all those things.

00:14:29.540 --> 00:14:33.080
They also have this cool thing called property binding where you can actually link those together

00:14:33.080 --> 00:14:35.160
now too, is like you can link the width and the height.

00:14:35.160 --> 00:14:37.180
So when you change the width, height automatically changes.

00:14:37.180 --> 00:14:37.620
Nice.

00:14:37.620 --> 00:14:38.060
Yeah.

00:14:38.060 --> 00:14:39.980
I really want to build some stuff with cute.

00:14:40.260 --> 00:14:42.860
I've, I've got a few app ideas in mind.

00:14:42.860 --> 00:14:44.380
What I don't have is time.

00:14:44.380 --> 00:14:45.800
Sadly.

00:14:45.800 --> 00:14:46.560
Can you help me with that?

00:14:46.560 --> 00:14:48.820
Jason, can you tell me to have more time in my life?

00:14:48.820 --> 00:14:53.340
I, I know I have a reputation as a time Lord, but unfortunately I can't control the

00:14:53.340 --> 00:14:55.800
stream of flow of time there.

00:14:55.800 --> 00:15:00.140
If I find my TARDIS, I'll pick you up and, and, and drop you off, you know, 10 years ago

00:15:00.140 --> 00:15:02.660
and you can relive those 10 years and do additional things.

00:15:02.660 --> 00:15:03.120
Okay.

00:15:03.120 --> 00:15:03.480
Yeah.

00:15:03.480 --> 00:15:03.740
Nice.

00:15:03.740 --> 00:15:04.000
Nice.

00:15:04.000 --> 00:15:05.000
That would be, yeah.

00:15:05.000 --> 00:15:05.420
Yep.

00:15:05.420 --> 00:15:09.760
let's see, actually a couple of questions from the live stream.

00:15:09.860 --> 00:15:12.720
Magnus asks, any news about cute going mobile?

00:15:12.720 --> 00:15:15.400
I actually am ashamed to admit.

00:15:15.400 --> 00:15:16.020
I don't know.

00:15:16.020 --> 00:15:23.420
I don't know either, but the, I think the bigger, more interesting question would, could PyQt stuff

00:15:23.420 --> 00:15:27.140
like could, would, could, would you be able to write a Python cute application and make it

00:15:27.140 --> 00:15:27.440
mobile?

00:15:27.440 --> 00:15:27.900
Right.

00:15:27.900 --> 00:15:29.420
I think that's where it gets really interesting.

00:15:29.420 --> 00:15:34.380
cause there's other, if you pick another language like C++, there's other options

00:15:34.380 --> 00:15:35.900
you might be able to choose.

00:15:35.900 --> 00:15:39.840
And then, maybe, you know, this one you're going to ask, are there any well-known Python

00:15:39.840 --> 00:15:40.780
apps built with cute?

00:15:41.060 --> 00:15:41.360
Oh yeah.

00:15:41.360 --> 00:15:41.680
Yeah.

00:15:41.680 --> 00:15:41.720
Yeah.

00:15:41.720 --> 00:15:42.820
They're, I'm on the spot.

00:15:42.820 --> 00:15:43.940
I'm trying to think of what mine.

00:15:43.940 --> 00:15:47.720
It's not well known, but I built time card in cute.

00:15:47.720 --> 00:15:52.380
If you look up, if you look up time card, it's just a time tracking, app that

00:15:52.380 --> 00:15:56.400
I, that I built, but actually there's, there's, there's quite a lot built, built with cute.

00:15:56.640 --> 00:15:58.280
I didn't want to K in front of it.

00:15:58.280 --> 00:16:04.080
If you're, if you're into KDE, the entire, the entire KDE stack is built on top of cute.

00:16:04.080 --> 00:16:05.260
And there's actually quite a bit of it.

00:16:05.260 --> 00:16:10.960
So, names are escaping me off the top of my head here, but, yeah, there's any,

00:16:10.960 --> 00:16:14.440
anything in the KDE universe is, is cute.

00:16:14.440 --> 00:16:16.780
And so you're either going to get C++ or Python.

00:16:16.780 --> 00:16:19.000
Python is certainly a lot faster, right?

00:16:19.000 --> 00:16:21.940
So, oh, filezilla apparently is built.

00:16:21.940 --> 00:16:26.540
You know, one that I know that's written in it, for sure that I, it's like one of my

00:16:26.540 --> 00:16:30.840
favorite apps actually is, Robo Mongo or Robo three T it got renamed to.

00:16:30.840 --> 00:16:36.320
I believe it's just C++ it's not Python cute, but that one's a really nice one

00:16:36.320 --> 00:16:36.800
as well.

00:16:36.800 --> 00:16:38.840
Actually, there's a huge long list.

00:16:38.840 --> 00:16:43.060
I'll put it in the show notes over here, of a bunch of apps written as well.

00:16:43.060 --> 00:16:47.300
So it's definitely a lot easier to write, write, something in KDE.

00:16:47.300 --> 00:16:50.580
I've, I've used a lot of different UI toolkits and KDE's definitely one of the easiest.

00:16:50.580 --> 00:16:51.140
Yeah.

00:16:51.140 --> 00:16:55.740
The thing that I like about it is it looks like it belongs because so many apps you build with

00:16:55.740 --> 00:16:59.480
these sort of cross platform things and it's just like, well, okay, well that's not how

00:16:59.480 --> 00:17:00.820
the file dialogue is supposed to look.

00:17:00.820 --> 00:17:04.340
You just know it's alien, but you're like, no, no, this looks, this looks like it belongs

00:17:04.340 --> 00:17:04.580
here.

00:17:04.580 --> 00:17:07.900
Well, and packaging is the other half of it because like I tried to build something with

00:17:07.900 --> 00:17:11.100
Kivi and I love Kivi from a, from a development standpoint.

00:17:11.100 --> 00:17:11.740
It's really cool.

00:17:11.740 --> 00:17:14.720
From a packaging standpoint, it's like beating yourself to death of the wet trout.

00:17:15.260 --> 00:17:21.360
So, and, and actually if you're going to do cross platform, then, actually,

00:17:21.360 --> 00:17:25.240
GTK is horrible too, because it's really hard to get it to package on windows.

00:17:25.240 --> 00:17:27.060
A lot of times it just works.

00:17:27.060 --> 00:17:28.820
It just packages everywhere, which.

00:17:28.820 --> 00:17:29.520
Yeah, that's great.

00:17:29.520 --> 00:17:29.900
Nice.

00:17:29.900 --> 00:17:30.200
Nice.

00:17:30.200 --> 00:17:30.940
All right.

00:17:30.940 --> 00:17:34.400
Brian, I think this episode is brought to everyone by us.

00:17:34.400 --> 00:17:34.940
Wonderful.

00:17:34.940 --> 00:17:35.460
Yeah.

00:17:35.460 --> 00:17:40.240
So we are, we're doing a lot of work out there and as everyone probably knows, if you're

00:17:40.240 --> 00:17:42.880
into testing, check out Brian's pytest book.

00:17:42.880 --> 00:17:49.940
If you're looking to take a Python course, we are just about to pass 200 hours of Python courses

00:17:49.940 --> 00:17:51.300
over at Talk Python training.

00:17:51.300 --> 00:17:56.780
I'm working on a new course, how to build web apps, not web APIs, but web apps with FastAPI.

00:17:56.780 --> 00:17:57.940
Super neat stuff.

00:17:57.940 --> 00:17:59.620
So that's, that should be out in a week or two.

00:17:59.620 --> 00:18:00.240
So anyway.

00:18:00.240 --> 00:18:00.680
Yeah.

00:18:00.680 --> 00:18:05.380
I'm also, I wanted to bring up that, there was kind of a spike in, pytest books.

00:18:05.380 --> 00:18:11.280
Sales in last, last quarter of 2020 and hoping that like some screws in it, right?

00:18:11.280 --> 00:18:13.260
Testing other teaching.

00:18:13.260 --> 00:18:14.700
So yeah, that'd be super cool.

00:18:14.700 --> 00:18:15.040
Yeah.

00:18:15.040 --> 00:18:18.620
It's nice to see more, more, more, more stuff about stuff other than unit test.

00:18:18.620 --> 00:18:22.180
I mean, unit test has its place, but I, when I wrote the chat, I've got a book coming out

00:18:22.180 --> 00:18:25.640
in May and when I wrote the chapter on testing and one of my editors was like, thank you for

00:18:25.640 --> 00:18:29.360
not forcing me to edit yet one more unit test chapter.

00:18:29.360 --> 00:18:30.640
Nice.

00:18:30.640 --> 00:18:31.300
What's your book on?

00:18:31.300 --> 00:18:33.620
Oh, my book's called a dead simple Python.

00:18:33.820 --> 00:18:39.480
It just, it, it introduces the language of Python, the idiomatic practices of Python

00:18:39.480 --> 00:18:41.940
to people who are coming from another language.

00:18:41.940 --> 00:18:45.760
So if you don't want to have to sit through yet one more explanation of what a variable

00:18:45.760 --> 00:18:50.360
or a function is or a class is, you can pick this up and it dives straight into the, the,

00:18:50.360 --> 00:18:54.580
the fine details of why idiomatic patterns are what they are in Python.

00:18:54.580 --> 00:18:54.920
Nice.

00:18:54.920 --> 00:18:55.700
That's yeah.

00:18:55.700 --> 00:18:56.280
That's a good idea.

00:18:56.280 --> 00:19:00.840
I, I, the courses or books that say, we're going to pretend, you know, nothing about the

00:19:00.840 --> 00:19:04.240
world and we're going to force you to go through everything from scratch every time that drives

00:19:04.240 --> 00:19:04.640
me crazy.

00:19:04.640 --> 00:19:10.440
You know, what else drives me crazy, Brian is, when my Python GC is doing stuff when

00:19:10.440 --> 00:19:12.200
I know that it doesn't need to do stuff.

00:19:12.200 --> 00:19:12.700
Yeah.

00:19:12.700 --> 00:19:14.820
I like to not have to think about the garbage collect.

00:19:14.820 --> 00:19:16.060
And you generally don't, right?

00:19:16.060 --> 00:19:21.300
Like one of the things that genuinely surprises me is the fact that we don't really talk about

00:19:21.300 --> 00:19:22.940
memory very much in Python.

00:19:22.940 --> 00:19:23.520
It's like, Oh, okay.

00:19:23.520 --> 00:19:24.460
I think it cleans itself up.

00:19:24.460 --> 00:19:24.860
That's good.

00:19:24.860 --> 00:19:25.400
Now what?

00:19:25.400 --> 00:19:25.880
Let's go.

00:19:25.960 --> 00:19:26.580
Let's go about stuff.

00:19:26.580 --> 00:19:26.800
Right.

00:19:26.800 --> 00:19:29.540
But if you dig into it, it's pretty interesting.

00:19:29.540 --> 00:19:32.960
There's a lot of stuff around allocation we've covered before, but it's quite unique.

00:19:32.960 --> 00:19:36.980
but Python's also somewhat unique in the sense that it has like two modes.

00:19:36.980 --> 00:19:44.080
So it has reference counting, which I would say 98% of all like memory management cleanup

00:19:44.080 --> 00:19:45.920
stuff is in the reference counting side.

00:19:45.920 --> 00:19:50.520
This is totally made up these numbers, but there's a little, there's, I would say maybe

00:19:50.520 --> 00:19:55.440
even more like 99.5, unless you're building some kind of a certain kind of app, like with

00:19:55.440 --> 00:19:58.960
interesting algorithms, most apps don't create cycles.

00:19:58.960 --> 00:20:03.460
And the only reason we have garbage collection in addition to the reference counting is to

00:20:03.460 --> 00:20:04.940
catch those cycles, right?

00:20:04.940 --> 00:20:07.420
you know, I've got a customer object.

00:20:07.420 --> 00:20:09.300
I've got it out of a SQLAlchemy database.

00:20:09.300 --> 00:20:11.800
It has a relationship over to the orders.

00:20:11.800 --> 00:20:12.560
I go to the orders.

00:20:12.560 --> 00:20:14.340
The orders have a link back to the customer.

00:20:14.340 --> 00:20:19.420
Maybe like traversing that lazy loaded list has created a cycle and now I need the GC to save

00:20:19.420 --> 00:20:19.580
me.

00:20:19.580 --> 00:20:24.560
So the rule for when the garbage collector runs is you can ask it.

00:20:24.560 --> 00:20:28.880
You can say, import the GC module and say GC dot get threshold or thresholds.

00:20:28.880 --> 00:20:31.200
I can't remember a singular or plural on my screen.

00:20:31.200 --> 00:20:35.120
If I would switch to a singular get threshold, it returns three numbers.

00:20:35.120 --> 00:20:38.020
they're not the same units, which makes them really hard to understand.

00:20:38.020 --> 00:20:42.600
The first number is how many allocations of collection objects.

00:20:42.600 --> 00:20:47.300
So classes, dictionaries, lists, tuples, things that could contain other stuff.

00:20:47.300 --> 00:20:51.720
So things that could potentially be participants in a cycle, like numbers and strings are not

00:20:51.720 --> 00:20:52.960
even considered by the GC.

00:20:52.960 --> 00:20:58.780
But how many allocations of collection types are there that exceed the reference counting

00:20:58.780 --> 00:20:59.680
deallocation?

00:20:59.860 --> 00:21:05.120
So if I had a list and I put a thousand classes, class objects in it by allocating and filling

00:21:05.120 --> 00:21:08.600
it up, then I would hold on to a thousand and none of them would have been come become garbage.

00:21:08.600 --> 00:21:12.180
So the first number that comes back is, well, how big is that number before we just run a

00:21:12.180 --> 00:21:13.440
GC no matter what?

00:21:13.440 --> 00:21:14.440
And the default is 700.

00:21:14.440 --> 00:21:19.500
So my example there, if I create a list of a thousand objects, that's a GC that's going

00:21:19.500 --> 00:21:19.780
to run.

00:21:19.920 --> 00:21:22.420
It doesn't matter if there's cycles, there's no cycles.

00:21:22.420 --> 00:21:23.520
It just doesn't matter.

00:21:23.520 --> 00:21:24.680
Like I've made a thousand of them.

00:21:24.680 --> 00:21:25.640
That's over 700.

00:21:25.640 --> 00:21:26.640
So we're going to run a GC.

00:21:26.640 --> 00:21:28.600
And then the rest are like, how much do you run?

00:21:28.600 --> 00:21:32.200
Like a whole memory GC versus a local, a small, like recent object GC.

00:21:32.380 --> 00:21:36.860
And what occurred to me is, you know, my website, there's a lot of pages that pull back thousands

00:21:36.860 --> 00:21:42.560
of items and any website that uses the database and an ORM that pulls stuff back and hangs on

00:21:42.560 --> 00:21:46.740
to it and not just like streams over the items, but puts them maybe in a list or something

00:21:46.740 --> 00:21:47.260
temporarily.

00:21:47.260 --> 00:21:51.300
Anytime you do that more with a thousand, you're going to have the GC run, right?

00:21:51.300 --> 00:21:53.640
They're just looking for anything to throw away, basically.

00:21:53.640 --> 00:21:54.020
Yeah.

00:21:54.020 --> 00:21:57.280
But you know, you're still in the process of building the list of them.

00:21:57.280 --> 00:21:59.400
I got to get 10,000.

00:21:59.400 --> 00:22:00.260
Well, guess what?

00:22:00.500 --> 00:22:04.780
That means you're going to have 14 GCs and you're just in the process of building the

00:22:04.780 --> 00:22:04.960
list.

00:22:04.960 --> 00:22:05.960
I'm like, that's kind of weird.

00:22:05.960 --> 00:22:08.060
That, that, that seems excessive to me.

00:22:08.060 --> 00:22:11.720
And then I went and looked at the site map on Talk Python training where we're pulling

00:22:11.720 --> 00:22:15.260
back like thousands of transcripts and all sorts of stuff to generate all the pages on

00:22:15.260 --> 00:22:15.420
there.

00:22:15.420 --> 00:22:16.240
77.

00:22:16.240 --> 00:22:18.640
There's 77 GCs to render the site map.

00:22:18.640 --> 00:22:19.540
There's no cycles.

00:22:19.540 --> 00:22:20.340
There's not one.

00:22:20.340 --> 00:22:21.200
So I'm like, that's not good.

00:22:21.200 --> 00:22:22.340
Well, let me think about that for a second.

00:22:22.340 --> 00:22:26.460
So what I ended up doing was I said, well, what if I made the threshold 10,000?

00:22:26.460 --> 00:22:28.100
Actually, I ended up on 50,000.

00:22:28.240 --> 00:22:33.020
So only run the GC if you get more than 50,000 allocations without deallocation.

00:22:33.020 --> 00:22:37.960
What was really interesting is doing that made my unit tests, which were including many,

00:22:37.960 --> 00:22:42.420
many integration tests on Talk Python training run 10 to 12% faster.

00:22:42.420 --> 00:22:43.920
Just setting that one line.

00:22:43.920 --> 00:22:46.860
And it basically does not use more memory in my case.

00:22:46.860 --> 00:22:47.560
Is that crazy?

00:22:47.880 --> 00:22:48.940
Well, it makes sense.

00:22:48.940 --> 00:22:56.040
Most issues of performance just come down to memory and how memory allocation is deallocation.

00:22:56.040 --> 00:23:00.200
I spend almost all my time in C++, more time in C++ than I do in Python.

00:23:00.200 --> 00:23:02.180
And we don't have a garbage collector over there.

00:23:02.180 --> 00:23:03.600
So you have to do all this manually.

00:23:03.600 --> 00:23:05.160
And doing it right.

00:23:05.160 --> 00:23:06.100
You know how much work it is, right?

00:23:06.100 --> 00:23:06.360
Yeah.

00:23:06.360 --> 00:23:07.480
Yeah, exactly.

00:23:07.480 --> 00:23:09.860
It's like doing it wrong is why stuff's slow.

00:23:09.860 --> 00:23:11.660
People are like, well, Python's slower than C++.

00:23:11.900 --> 00:23:13.900
So it has the potential.

00:23:13.900 --> 00:23:16.240
People's has the potential to be faster than Python.

00:23:16.240 --> 00:23:18.580
But it really depends on how you write that code.

00:23:18.580 --> 00:23:22.840
Because well-written code is always going to run faster than poorly written code.

00:23:22.840 --> 00:23:24.340
It doesn't matter what the two languages.

00:23:24.340 --> 00:23:24.700
Yeah.

00:23:24.700 --> 00:23:25.260
Yeah.

00:23:25.280 --> 00:23:30.780
And I realized that in my world, in my type of application, I almost never create cycles.

00:23:30.780 --> 00:23:40.640
But I often get back more than 700 class objects, which also have dictionaries potentially in the mix as they're allocating the converting, serializing into classes.

00:23:40.640 --> 00:23:42.800
There's got to be a lot of places where that's happened.

00:23:42.800 --> 00:23:44.680
So I just set this number to say, you know what?

00:23:44.680 --> 00:23:46.120
Let's waste a little bit of memory.

00:23:46.120 --> 00:23:48.380
And if there are cycles, we'll come back and get them later.

00:23:48.380 --> 00:23:51.820
And because there's almost no cycles, there's almost no memory growth.

00:23:51.900 --> 00:23:55.740
For example, so the server is running like eight worker processes, one of them.

00:23:55.740 --> 00:23:57.660
And I made this change.

00:23:57.660 --> 00:24:05.740
And I think over after running for a week without restarting any of the processes, it went from 1.89 gigs of memory usage to 1.91.

00:24:05.740 --> 00:24:07.960
So like 220 megs.

00:24:07.960 --> 00:24:09.760
I think it was 20 megs more memory usage.

00:24:09.760 --> 00:24:14.180
And yet like 10% speed up by just changing like one call at startup.

00:24:14.180 --> 00:24:14.860
It was insane.

00:24:14.860 --> 00:24:17.580
Well, and think about what Dr. Becky's code is.

00:24:17.580 --> 00:24:29.480
You know, like, you know, go back to the astrophysicist, you know, thing here, you know, with the sizes of data structures that she's doing or any data scientist who's listening, you know, they're usually dealing with 10,000, 100,000 million items.

00:24:29.480 --> 00:24:34.060
You know, you combine this with all the stuff that we talked about with NumPy and with data processing.

00:24:34.060 --> 00:24:37.680
And, you know, we talk about how long it takes to do some of these data regressions.

00:24:37.680 --> 00:24:38.720
How much would this be?

00:24:38.860 --> 00:24:39.420
Yeah, exactly.

00:24:39.420 --> 00:24:49.680
So if that data is being done in Python and it's not just purely being pushed down into the C data science layer, then yeah, that's really interesting, I think.

00:24:49.680 --> 00:24:55.200
Although I would caution at the same time that there's no such thing as a magic bullet.

00:24:55.200 --> 00:24:58.080
So you have to understand why this is going to speed things up.

00:24:58.080 --> 00:25:04.220
Well, I have to just copy and paste that line that my colleague has that he got from Michael Kennedy because it'll make the code faster.

00:25:04.320 --> 00:25:07.180
No, you have to know why it's going to go faster.

00:25:07.180 --> 00:25:08.400
It's an easy test.

00:25:08.400 --> 00:25:09.560
Some cases it makes sense.

00:25:09.560 --> 00:25:10.320
People can check it out.

00:25:10.320 --> 00:25:12.900
I thought it was really, it just so surprised me.

00:25:12.900 --> 00:25:16.380
I just walk along and I'm like, wait a minute, that must mean something weird is going on.

00:25:16.380 --> 00:25:18.480
And then I put it on just on one of my pages.

00:25:18.480 --> 00:25:21.080
Like, why would I do 77 GCs on a single page load?

00:25:21.080 --> 00:25:21.820
That's crazy.

00:25:21.820 --> 00:25:24.480
And so I just started exploring this and here we are.

00:25:24.480 --> 00:25:30.280
So did you, whatever you're linking to, does it talk about how you can test how many garbage collections?

00:25:30.280 --> 00:25:31.700
Let me see.

00:25:32.240 --> 00:25:36.840
I'm linking to a Twitter thread and way deep down.

00:25:36.840 --> 00:25:40.200
No, but there is a way to do it.

00:25:40.200 --> 00:25:44.900
If you, if you go to the GC, you can say, I think it's set debug stats or something.

00:25:44.900 --> 00:25:48.340
I'll, I'll look it up real quick while we're talking.

00:25:48.340 --> 00:25:49.420
I'll throw it in at the end here.

00:25:49.420 --> 00:25:51.700
But yeah, it's, there is a way to do it.

00:25:51.700 --> 00:25:52.980
Actually, I got it right here.

00:25:52.980 --> 00:25:53.280
Hold on.

00:25:53.280 --> 00:25:53.820
Give me just a sec.

00:25:53.820 --> 00:25:59.320
The way you do it is you say GC dot set underscore debug, and then you pass in numeration and the

00:25:59.320 --> 00:26:01.260
value is GC debug stats.

00:26:01.260 --> 00:26:01.780
Okay.

00:26:01.780 --> 00:26:05.880
So that thing was just lighting up my, you know, when I turned that on, it would just light

00:26:05.880 --> 00:26:11.140
up and just completely fill this, the terminal with the debug or, you know, GC, GC, GC, GC,

00:26:11.140 --> 00:26:15.500
GC over and over and over when I hit the, that one page and then changing it, guess what?

00:26:15.500 --> 00:26:15.960
Made it better.

00:26:15.960 --> 00:26:16.400
Yeah.

00:26:16.400 --> 00:26:20.900
Now we should probably be PC about the GC and call the garbage collector, the, the, the,

00:26:20.900 --> 00:26:23.260
the, the programmatic sanitation engineer.

00:26:23.260 --> 00:26:25.060
Right.

00:26:25.060 --> 00:26:29.360
Well, it, it, it doesn't have, it doesn't, it doesn't take offense.

00:26:29.360 --> 00:26:31.380
It's just there to help us out.

00:26:31.380 --> 00:26:34.620
Brian is probably a pretty awesome library.

00:26:34.620 --> 00:26:35.720
Honestly, the GC library.

00:26:35.720 --> 00:26:37.900
Probably, but it's built in.

00:26:37.900 --> 00:26:38.520
Yeah.

00:26:38.600 --> 00:26:44.080
So I'm, you know, of course I'm susceptible to click on a listicle, but the.

00:26:44.080 --> 00:26:45.080
Who isn't?

00:26:45.080 --> 00:26:45.440
Come on.

00:26:45.440 --> 00:26:45.840
Right.

00:26:45.840 --> 00:26:48.060
But we don't cover them very much, but I really like this.

00:26:48.060 --> 00:26:54.600
So this, this article is a top 10 Python libraries of 2020, but their criteria was interesting.

00:26:54.600 --> 00:26:58.080
The criteria was, it has to be a library that was launched or popular.

00:26:58.080 --> 00:27:03.540
It has to be well maintained as have maintenance changes since their launch date.

00:27:03.700 --> 00:27:06.980
And it has to be just outright cool that you should check it out.

00:27:06.980 --> 00:27:09.340
So I'm going to go through a handful of these.

00:27:09.340 --> 00:27:10.440
They listed 10.

00:27:10.440 --> 00:27:16.180
I don't know if all of them, since I'm, there's like four of them that are machine learning focused that I.

00:27:16.180 --> 00:27:17.820
I think cool is relative.

00:27:17.820 --> 00:27:18.580
Yeah.

00:27:18.580 --> 00:27:25.360
But the first one, I, the first one was typer and I can't, I'm like, I'm, I'm really a fan of typer now.

00:27:25.360 --> 00:27:26.760
Is it really just 2020?

00:27:26.760 --> 00:27:27.780
And I went back and look.

00:27:27.780 --> 00:27:30.820
It was released like, yeah, in December of 2019.

00:27:30.820 --> 00:27:33.140
So Sebastian Ramirez is killing it for sure.

00:27:33.140 --> 00:27:34.260
And then I looked in it.

00:27:34.260 --> 00:27:36.380
I'm like, well, FastAPI, when did that come out?

00:27:36.380 --> 00:27:37.800
Well, that was the previous December.

00:27:37.800 --> 00:27:45.140
So, the end of 2018 released FastAPI and then typer a year later, he's just crushing it.

00:27:45.140 --> 00:27:45.420
Yeah.

00:27:45.420 --> 00:27:46.460
So yeah, nice.

00:27:46.460 --> 00:27:51.240
both a huge fan of both of those, a big fan of rich also.

00:27:51.240 --> 00:27:55.060
So rich, actually just showed up this in last year in 2020.

00:27:55.060 --> 00:27:59.440
and rich is a beautiful, beautiful formatting in the terminal.

00:27:59.440 --> 00:28:03.000
And yes, it's a beautiful, it's really great.

00:28:03.080 --> 00:28:03.700
Let me use that.

00:28:03.700 --> 00:28:04.640
That's glorious.

00:28:04.640 --> 00:28:09.640
I'm even using it even in applications where I just need these, the tables.

00:28:09.820 --> 00:28:19.640
So if you need to print out a table in the command line, the tables, tables are kind of hard and there were like weird other, there were other table, specialized table libraries.

00:28:19.640 --> 00:28:23.420
but this one is great that you can, it works.

00:28:23.420 --> 00:28:27.140
You don't have to specify the width that like comes up with the width on its own.

00:28:27.200 --> 00:28:34.560
And then you, if you, you shrink the terminal to really narrow or wide, it'll word wrap correctly and stuff.

00:28:34.560 --> 00:28:37.300
and that's kind of incredible.

00:28:37.540 --> 00:28:40.540
so even if, even just for tables, I would.

00:28:40.540 --> 00:28:40.800
Yeah.

00:28:40.800 --> 00:28:41.460
Which is awesome.

00:28:41.460 --> 00:28:43.800
The third one is dear pie gooey.

00:28:43.800 --> 00:28:44.960
I think we covered this.

00:28:44.960 --> 00:28:45.560
Maybe we could.

00:28:45.560 --> 00:28:46.780
I don't remember.

00:28:46.780 --> 00:28:49.300
I mean, we did go on our gooey rant, so it feels like it should be.

00:28:49.560 --> 00:28:49.960
Yeah.

00:28:49.960 --> 00:28:51.980
So it's a, a, a gooey project.

00:28:51.980 --> 00:28:55.820
the, nice pictures though, at least.

00:28:55.820 --> 00:28:56.240
Yeah.

00:28:56.240 --> 00:28:56.680
Yeah.

00:28:56.680 --> 00:29:00.180
I've been drooling over, I've been drooling over dear I'm gooey for a while.

00:29:00.180 --> 00:29:02.840
I haven't, I haven't had an opportunity to use it yet, but I've been looking at it.

00:29:02.840 --> 00:29:03.620
So.

00:29:03.620 --> 00:29:04.300
Yeah.

00:29:04.300 --> 00:29:08.520
So, the last few I want to highlight pretty errors looks neat.

00:29:08.520 --> 00:29:12.260
I haven't tried that yet, but it's, it's a way to, yeah.

00:29:12.260 --> 00:29:13.340
That is glorious as well.

00:29:13.340 --> 00:29:14.180
Better tracebacks.

00:29:14.180 --> 00:29:15.140
so.

00:29:15.140 --> 00:29:18.940
I mean, ideally you don't show errors to people, but if you're going to, let's make them at least

00:29:18.940 --> 00:29:19.300
readable.

00:29:19.460 --> 00:29:20.060
This is great.

00:29:20.060 --> 00:29:21.820
And let's treat ourselves too.

00:29:21.820 --> 00:29:25.520
You know, it's like, you know, we're going to have to read the, we're going to spend at

00:29:25.520 --> 00:29:26.940
least half our life reading error messages.

00:29:26.940 --> 00:29:27.520
Face it.

00:29:27.520 --> 00:29:28.900
So let's at least make it readable.

00:29:28.900 --> 00:29:29.600
Yeah.

00:29:29.600 --> 00:29:32.440
And another quarter crying about the, what we just couldn't figure out.

00:29:32.440 --> 00:29:37.360
And then the last two that I want to highlight is diagrams and scaling.

00:29:37.360 --> 00:29:40.300
diagrams is a library.

00:29:40.300 --> 00:29:41.740
Look at that, picture.

00:29:41.740 --> 00:29:46.500
it's a way to do, it's intended for like, cloud architecture drawings.

00:29:46.500 --> 00:29:49.440
but the, it's written in, in Python.

00:29:49.440 --> 00:29:51.620
You, you write these diagrams in Python.

00:29:51.620 --> 00:29:57.460
and so because they're text, you can check them in and with version control.

00:29:57.460 --> 00:29:58.020
That's cool.

00:29:58.020 --> 00:29:59.040
which is nice.

00:29:59.040 --> 00:30:04.520
I'd like to see these sorts of diagrams look more would be great for not just, you

00:30:04.520 --> 00:30:06.420
know, network diagrams, other diagrams.

00:30:06.420 --> 00:30:08.040
Flow charts would be great.

00:30:08.040 --> 00:30:09.460
I still flow chart.

00:30:10.460 --> 00:30:10.900
Yeah.

00:30:10.900 --> 00:30:10.900
Yeah.

00:30:10.900 --> 00:30:10.940
Yeah.

00:30:10.940 --> 00:30:16.340
So the last one is scaling, which, is a, memory CPU and memory profiler in Python

00:30:16.340 --> 00:30:22.080
that, handles multi-threading well and distinguishes between Python versus run for use.

00:30:22.080 --> 00:30:24.220
Oh, that's, pretty cool.

00:30:24.480 --> 00:30:26.060
Like definitely need to try this out.

00:30:26.060 --> 00:30:28.660
I also like that you don't have to modify your code.

00:30:28.660 --> 00:30:29.020
Yeah.

00:30:29.020 --> 00:30:31.620
That's really cool.

00:30:31.620 --> 00:30:32.700
Yeah, absolutely.

00:30:32.700 --> 00:30:33.400
Yeah.

00:30:33.400 --> 00:30:33.840
Those are cool.

00:30:33.840 --> 00:30:35.540
there's a bunch of great ideas there.

00:30:35.540 --> 00:30:39.040
And man, I really need to find a use for rich solution.

00:30:39.040 --> 00:30:42.660
I'm going to source of a problem again, but Hey, I mean, I write a lot of like a little

00:30:42.660 --> 00:30:43.780
terminal apps and stuff.

00:30:43.780 --> 00:30:46.560
And I'm just like, you know, maybe you'll put a little color in here or something.

00:30:46.560 --> 00:30:50.040
And just, you know, I just need to take the time and go, no, this is a UI that I should

00:30:50.040 --> 00:30:50.940
pay more attention to.

00:30:50.940 --> 00:30:53.280
Not just some random thing with text.

00:30:53.280 --> 00:30:53.760
Yeah.

00:30:53.760 --> 00:30:55.200
Well, we'll find this cool stuff.

00:30:55.200 --> 00:30:58.520
It's like, I want to, I want to use, I feel the need to use this somewhere.

00:30:58.520 --> 00:31:03.540
Well, I had a little, so I had a little application where it's just like I said, with the

00:31:03.540 --> 00:31:06.720
tables and, and I'm like, I don't think it needs colors.

00:31:06.720 --> 00:31:08.040
I'm just showing a table.

00:31:08.040 --> 00:31:11.340
but the default for rich is to show colors.

00:31:11.340 --> 00:31:12.640
So, and you don't have to pick them.

00:31:12.640 --> 00:31:18.240
It just, so the, like the heading and the lines between were like different colors

00:31:18.240 --> 00:31:19.440
if you're on a color terminal.

00:31:19.440 --> 00:31:21.720
And if you're not on a color terminal, it works anyway.

00:31:21.720 --> 00:31:24.020
It just figures that out for you and lovely.

00:31:24.020 --> 00:31:24.580
Love it.

00:31:24.580 --> 00:31:24.900
Yeah.

00:31:24.900 --> 00:31:25.440
That's awesome.

00:31:25.440 --> 00:31:26.020
It's awesome.

00:31:26.020 --> 00:31:27.340
It's very awesome.

00:31:27.340 --> 00:31:27.960
Awesome.

00:31:27.960 --> 00:31:28.860
Speaking of awesome.

00:31:28.860 --> 00:31:33.720
So, PEP 518 rolled out a while back.

00:31:33.720 --> 00:31:36.560
I was introducing this thing called a pie project.

00:31:36.760 --> 00:31:40.960
T-O-M-L, I guess it's called a pie project.

00:31:40.960 --> 00:31:41.280
Toml.

00:31:41.280 --> 00:31:46.740
so the idea behind this was that it was going to be this, configuration file, you

00:31:46.740 --> 00:31:48.600
know, one configuration file to rule them all.

00:31:48.600 --> 00:31:51.220
And of course, we're, by then we like things to be simple.

00:31:51.220 --> 00:31:54.980
Well, ironically, this turned into a really political thing, which I'm still trying to

00:31:54.980 --> 00:31:55.680
wrap my head around.

00:31:55.680 --> 00:32:01.060
So basically the nice thing about this repository is, is, is, is keeping track

00:32:01.060 --> 00:32:03.700
of all the projects that have adopted pie project.

00:32:03.700 --> 00:32:07.700
Toml, either optionally or mandatory, for configurations.

00:32:07.700 --> 00:32:11.960
So instead of having to have, you know, a dozen configuration files in your project for all

00:32:11.960 --> 00:32:14.440
these different tools, you can just use this one.

00:32:14.440 --> 00:32:15.640
And so it's got this big list.

00:32:15.640 --> 00:32:18.140
What I find interesting is this part down here at the bottom.

00:32:18.140 --> 00:32:23.040
if you go down to, yeah, just scroll just slightly here, just slightly, just

00:32:23.040 --> 00:32:23.640
a little bit up.

00:32:24.020 --> 00:32:25.680
that's going to sound weird on the podcast.

00:32:25.680 --> 00:32:31.160
Anyway, so if you're going to, so these are projects that are quote unquote, discussing

00:32:31.160 --> 00:32:32.440
the use of pie project Toml.

00:32:32.440 --> 00:32:35.660
But if you actually look at these, it's kind of odd.

00:32:35.660 --> 00:32:39.960
you know, the big sticking points, cause these are the projects that are like stopping

00:32:39.960 --> 00:32:42.780
people from really just going all in on, on pie project Toml.

00:32:42.780 --> 00:32:46.300
And there's even some, you know, talk about circular, you know, dependencies or somewhere

00:32:46.300 --> 00:32:47.740
like, well, I'll do it when they do it.

00:32:47.740 --> 00:32:49.500
And they're like, well, I will do it when they do it.

00:32:49.500 --> 00:32:51.920
which makes you wonder if it's a serious excuse.

00:32:51.920 --> 00:32:53.720
so my pie is the weirdest.

00:32:54.240 --> 00:32:57.040
We'd have an awesome himself said, well, it doesn't solve anything.

00:32:57.040 --> 00:32:59.880
You know, someone said, can we just add this, please just add it.

00:32:59.880 --> 00:33:00.560
It's easy here.

00:33:00.560 --> 00:33:01.420
Here's the PR.

00:33:01.420 --> 00:33:02.240
Somebody even did the PR.

00:33:02.240 --> 00:33:04.120
He's like, nah, it doesn't solve anything.

00:33:04.120 --> 00:33:05.200
And he closed, he closed it.

00:33:05.200 --> 00:33:07.720
It's like, it does solve something.

00:33:07.720 --> 00:33:10.400
It's one less file I have to deal with.

00:33:10.400 --> 00:33:11.220
That is a solution.

00:33:11.220 --> 00:33:15.820
Blake eight, they have a couple of concrete objections.

00:33:15.820 --> 00:33:20.660
One is the fact we don't have the standard Toml parser in the Python, standard library.

00:33:20.660 --> 00:33:23.380
So that could be, you know, that could be a problem.

00:33:23.600 --> 00:33:23.680
Interesting.

00:33:23.680 --> 00:33:28.460
you're adding another dependency to just support having this format.

00:33:28.720 --> 00:33:29.120
Exactly.

00:33:29.120 --> 00:33:29.460
Yeah.

00:33:29.460 --> 00:33:33.300
but then again, it's, if it's a common dependency with a bunch of other, you know,

00:33:33.300 --> 00:33:35.340
tools that are already in use and it almost doesn't matter.

00:33:35.340 --> 00:33:38.900
pip, someone said, I don't understand this.

00:33:38.900 --> 00:33:40.200
Pip to change its behavior.

00:33:40.200 --> 00:33:42.560
So mere presence of the file doesn't change functionality.

00:33:42.560 --> 00:33:45.300
I can't wrap my head around what he's referring to there.

00:33:45.300 --> 00:33:50.220
Maybe a, but the stupid thing is someone already did flake nine, which is a, which an exact fork

00:33:50.220 --> 00:33:52.600
of flake eight that just adds high project Toml.

00:33:52.940 --> 00:33:54.940
So it's like, it's done.

00:33:54.940 --> 00:33:56.960
They just have to merge it.

00:33:56.960 --> 00:34:00.720
But it's, and actually the same thing happened with a bandit.

00:34:00.720 --> 00:34:02.800
someone actually implemented in 2019.

00:34:02.800 --> 00:34:05.120
The PR has been sitting there untouched since 2019.

00:34:05.120 --> 00:34:09.320
So over a year's gone by it's there and bandit is not picking it up.

00:34:09.320 --> 00:34:10.900
They're just, they're silent.

00:34:10.900 --> 00:34:12.840
Read the docs is saying it's too much work.

00:34:12.840 --> 00:34:18.080
like it's a lot of work for us to have the multiple, pie oxidizer shockingly hasn't

00:34:18.080 --> 00:34:18.840
even said anything.

00:34:18.840 --> 00:34:19.740
It's 2019.

00:34:19.740 --> 00:34:25.560
They're, they're like the, they're like the new trendy, like the trend setting packaging

00:34:25.560 --> 00:34:26.420
thing.

00:34:26.420 --> 00:34:29.440
And they haven't been saying anything about this.

00:34:29.440 --> 00:34:29.780
This.

00:34:29.780 --> 00:34:35.100
So I, I'm trying to figure out why it is that this is so controversial because it seems

00:34:35.100 --> 00:34:35.700
so obvious.

00:34:35.700 --> 00:34:39.340
You have one file to store all of the settings for all the different tools.

00:34:39.340 --> 00:34:43.840
and yet everybody seems to want to do their own thing with this.

00:34:43.840 --> 00:34:50.980
Well, I know that, you know, pip and poetry and flit and some of these other tools that

00:34:50.980 --> 00:34:52.260
suggest a workflow.

00:34:52.260 --> 00:34:59.120
I feel like I hear this file format being used along with those and, you know, telling people

00:34:59.120 --> 00:35:02.680
we're going to have a different way for you to like work with your projects and manage

00:35:02.680 --> 00:35:03.700
dependencies and stuff.

00:35:03.700 --> 00:35:06.980
And you know that I think that's part of the source of, of this.

00:35:06.980 --> 00:35:09.780
And I don't know if it's just necessarily all mixed together.

00:35:09.780 --> 00:35:10.580
Brian, what do you think?

00:35:10.580 --> 00:35:11.900
You know more about this than I do.

00:35:11.900 --> 00:35:18.560
I think a lot of projects are on the side of like, for instance, coverage was,

00:35:18.560 --> 00:35:21.100
was it, I don't know where they are on the list.

00:35:21.320 --> 00:35:22.060
That they adopted.

00:35:22.060 --> 00:35:22.220
Did they adopt it?

00:35:22.220 --> 00:35:23.140
Did they adopt it?

00:35:23.140 --> 00:35:23.360
Okay.

00:35:23.360 --> 00:35:23.660
Yeah.

00:35:23.660 --> 00:35:28.860
Well, coverage had this thing in, in other tools we're talking about, you know, there's

00:35:28.860 --> 00:35:32.240
no Toml parser and they, they didn't have any other dependencies.

00:35:32.240 --> 00:35:36.400
So they didn't want to add a third party dependency, just for this.

00:35:36.480 --> 00:35:41.340
And, and if they're just using it for packaging, however, or, or settings or something.

00:35:41.340 --> 00:35:45.920
But, the, so I do, I do think we will see a lot.

00:35:45.920 --> 00:35:50.380
I don't think it's a reasonable argument because, there's, there's reasons why, you know,

00:35:50.400 --> 00:35:54.000
the same thing, reason why request is, because there's making changes.

00:35:54.000 --> 00:35:59.620
But I do think that the, like the format of Toml basic format enough to get a by project,

00:35:59.620 --> 00:36:01.580
um, isn't going to change much.

00:36:01.580 --> 00:36:07.360
so I think enough of a project, Toml parser to handle by project.

00:36:07.360 --> 00:36:13.020
that's, I think we need one of the, something like that in the, in, in, in built into Python.

00:36:13.020 --> 00:36:13.260
Yeah.

00:36:13.260 --> 00:36:15.840
Especially since we have, we have PEP 5.18.

00:36:15.840 --> 00:36:18.680
So like we have some, we have some standard already.

00:36:18.680 --> 00:36:19.180
Yeah.

00:36:19.260 --> 00:36:24.740
So I think we'll see a big, I would like to see at least, even if it isn't the mainstream

00:36:24.740 --> 00:36:28.940
one, if we have, if the, if most projects that are okay with the third party use something

00:36:28.940 --> 00:36:35.160
else, for a Toml parser, but there's some built in stripped down version in the standard

00:36:35.160 --> 00:36:35.640
library.

00:36:35.640 --> 00:36:37.760
I think that that's, I think that's great.

00:36:37.760 --> 00:36:38.160
Yeah.

00:36:38.160 --> 00:36:41.300
I, I see you could solve that problem by just bendering it.

00:36:41.300 --> 00:36:43.600
Just like, here's the two files that make up the parser.

00:36:43.600 --> 00:36:46.220
We're just going to make it part of this package.

00:36:46.220 --> 00:36:47.200
So now we're good to go.

00:36:47.200 --> 00:36:47.920
I don't know.

00:36:47.920 --> 00:36:48.500
Sounds good.

00:36:48.500 --> 00:36:50.800
Well, I think that's it for all of our items.

00:36:50.800 --> 00:36:53.180
Brian, you got anything I actually want to share with folks?

00:36:53.180 --> 00:36:53.780
Yeah.

00:36:53.780 --> 00:36:55.040
I'm, it's my birthday.

00:36:55.040 --> 00:36:55.640
Yay.

00:36:55.640 --> 00:36:56.820
Happy birthday.

00:36:56.820 --> 00:36:57.960
Happy birthday, man.

00:36:57.960 --> 00:37:01.320
So I'm looking good for, I was gonna say you're looking good for 28 brother.

00:37:01.720 --> 00:37:02.620
So I'm 51.

00:37:02.620 --> 00:37:05.460
And, I heard today that that's just one.

00:37:05.460 --> 00:37:08.120
I'm just shy of a full deck.

00:37:08.120 --> 00:37:12.280
Well, yeah, I've, I've never been accused of playing with a full deck myself.

00:37:12.280 --> 00:37:17.240
but don't, I will say, don't let anyone tell you that you're old because, it says

00:37:17.240 --> 00:37:21.440
in the first chapter, chapter of Genesis, thou, and then God said, man's year shall be limited

00:37:21.440 --> 00:37:22.240
to 120.

00:37:22.480 --> 00:37:24.600
Half of 120 is 60.

00:37:24.600 --> 00:37:26.740
So what is biblical that 60 is middle age.

00:37:26.740 --> 00:37:27.720
You're not even middle aged.

00:37:27.720 --> 00:37:29.860
You've got a way to go.

00:37:29.860 --> 00:37:31.800
I mean, it's the Bible.

00:37:33.380 --> 00:37:36.420
I keep telling everybody that I don't look at day over 73.

00:37:36.420 --> 00:37:38.840
Oh, you're a good man.

00:37:38.840 --> 00:37:40.480
a couple of happy birthdays.

00:37:40.480 --> 00:37:43.040
And also you're going to ask if you're still a fan of flit.

00:37:43.040 --> 00:37:43.540
Yeah.

00:37:43.540 --> 00:37:47.700
I love flit, especially since they adopted the, source source directory.

00:37:47.700 --> 00:37:48.560
Yeah, that's right.

00:37:48.560 --> 00:37:49.020
That's awesome.

00:37:49.020 --> 00:37:50.920
that's, that's saved my life.

00:37:50.920 --> 00:37:54.900
Jason, anything extra that you want to throw out there?

00:37:54.900 --> 00:37:58.480
I mean, maybe people have a place they could get notified about your upcoming book or

00:37:58.480 --> 00:37:58.900
something like that.

00:37:58.900 --> 00:37:59.280
Yeah.

00:37:59.280 --> 00:38:02.360
You know, following me on Twitter is probably the best way to do that.

00:38:02.460 --> 00:38:03.760
I'm code mouse nine to one Twitter.

00:38:03.760 --> 00:38:07.600
and then, actually I follow no starts press too.

00:38:07.600 --> 00:38:10.360
I mean, no starts press is awesome to begin with.

00:38:10.360 --> 00:38:11.440
That's where you're doing the book.

00:38:11.440 --> 00:38:12.160
Yeah, exactly.

00:38:12.160 --> 00:38:12.580
You're there.

00:38:12.580 --> 00:38:13.300
They're my publisher.

00:38:13.300 --> 00:38:13.860
No search.

00:38:13.860 --> 00:38:16.160
I don't think they ever put out a bad book.

00:38:16.160 --> 00:38:17.580
I love that publisher.

00:38:17.580 --> 00:38:22.960
So, I was, I can, you can actually, you can ask my mother when I got, when I got,

00:38:22.960 --> 00:38:27.320
when my book contract got accepted, I actually screamed, very high pitched.

00:38:27.320 --> 00:38:28.600
That's awesome.

00:38:28.600 --> 00:38:29.460
Yeah.

00:38:29.460 --> 00:38:29.500
Yeah.

00:38:29.500 --> 00:38:32.020
Follow, follow those starts press for updates on, on that.

00:38:32.080 --> 00:38:34.780
And all their other awesome, they got some other incredible books coming up too.

00:38:34.780 --> 00:38:37.100
So I'll go ahead and ask her.

00:38:37.100 --> 00:38:38.500
So what's your mom's Twitter handle?

00:38:38.500 --> 00:38:40.260
Oh, my mom's Twitter handle.

00:38:40.260 --> 00:38:42.840
Oh, she doesn't have a Twitter handle actually.

00:38:42.840 --> 00:38:44.860
So I'll have to put you in touch directly.

00:38:44.860 --> 00:38:45.260
I think.

00:38:45.260 --> 00:38:46.720
Awesome.

00:38:46.720 --> 00:38:49.160
Well, cool.

00:38:49.160 --> 00:38:50.080
Thanks for being here again.

00:38:50.320 --> 00:38:53.060
So I have a couple of items to throw out here.

00:38:53.240 --> 00:38:56.800
This almost, Brian, this almost could have been an extra, extra, extra, extra, extra, extra,

00:38:56.800 --> 00:38:58.400
extra here all about it, but they're real short.

00:38:58.400 --> 00:38:59.320
So I didn't do that.

00:38:59.320 --> 00:39:01.700
Django 315 is released.

00:39:01.700 --> 00:39:02.380
Django 3.

00:39:02.380 --> 00:39:04.440
Didn't we just, just go to Django 2 or something?

00:39:04.440 --> 00:39:06.080
That's, I mean, that's good.

00:39:06.080 --> 00:39:07.180
That's really good to hear.

00:39:07.180 --> 00:39:08.220
So awesome.

00:39:08.220 --> 00:39:11.880
That Python 310 alpha 4 is available for testing.

00:39:11.980 --> 00:39:15.380
Yeah, the new parser is going to be in that one, which is going to be.

00:39:15.380 --> 00:39:17.580
Oh, that's the peg parser that Gita's been working on?

00:39:17.580 --> 00:39:21.400
Yeah, that's going to be, that's going to, that's going to revolutionize the language eventually.

00:39:21.400 --> 00:39:21.780
Yeah.

00:39:21.780 --> 00:39:22.260
Yeah.

00:39:22.260 --> 00:39:24.500
It'll definitely make it possible to do more.

00:39:24.500 --> 00:39:28.120
And in releases, SciPy 1.6.0 was released.

00:39:28.120 --> 00:39:29.840
I learned about a cool project.

00:39:29.840 --> 00:39:35.040
So we talked about like avoiding Excel for the Python data science stack, right?

00:39:35.040 --> 00:39:36.400
Like just stop doing Excel.

00:39:36.400 --> 00:39:37.540
There's all these weird errors.

00:39:37.780 --> 00:39:44.320
Like the organization that defines or governs how you can name genes has come up

00:39:44.320 --> 00:39:46.580
with rules for names you can't use.

00:39:46.580 --> 00:39:51.240
And the reason they can't be used is they'll be parsed incorrectly into other data types

00:39:51.240 --> 00:39:52.260
by Excel, for example.

00:39:52.260 --> 00:39:57.240
So there's a lot of issues you might run into with Excel and, and that's all good.

00:39:57.240 --> 00:40:02.700
But there's this project called PyXLL and this is actually a paid product.

00:40:02.700 --> 00:40:03.980
They're not sponsoring the show.

00:40:03.980 --> 00:40:04.940
I just think it's kind of neat.

00:40:04.940 --> 00:40:06.220
So spreading the word.

00:40:06.540 --> 00:40:10.360
But anyway, if it's interesting for you, what you can do is it's a plugin for Excel that

00:40:10.360 --> 00:40:16.680
will embed Jupyter into Excel and allow you to write functions and macros in Excel in Python.

00:40:16.680 --> 00:40:21.480
So basically it almost adds the program, Python, the programming language to Excel, which is

00:40:21.480 --> 00:40:21.860
good.

00:40:21.860 --> 00:40:22.340
Yeah.

00:40:22.340 --> 00:40:23.580
It's better than VBA.

00:40:23.580 --> 00:40:24.820
Let's see.

00:40:24.820 --> 00:40:26.000
No, I started in VBA.

00:40:26.000 --> 00:40:26.760
Tell me about it.

00:40:26.760 --> 00:40:29.340
Anything's better than VBA.

00:40:30.080 --> 00:40:36.800
So someone on Twitter asked if PyCharm works okay on my Apple Mac Mini M1.

00:40:36.800 --> 00:40:41.600
And they, PyCharm and JetBrains in general, just released a whole bunch of their tooling

00:40:41.600 --> 00:40:45.980
with different installs for the Apple Silicon native versions.

00:40:46.540 --> 00:40:50.940
And so I've got a cool little video that I'm going to link to in the show notes.

00:40:50.940 --> 00:40:52.600
And it's just like a five second video of here.

00:40:52.600 --> 00:40:58.280
I open up PyCharm and you basically from the time you click on open project till the project's

00:40:58.280 --> 00:40:59.960
open, if you've opened a project before.

00:40:59.960 --> 00:41:01.280
So that caveat.

00:41:01.280 --> 00:41:04.960
But at that point, if you click on it, you cannot perceive click.

00:41:04.960 --> 00:41:08.940
Like by the time you're letting up the mouse, the whole the project is loaded and ready to

00:41:08.940 --> 00:41:09.300
work on.

00:41:09.300 --> 00:41:10.740
It's like it's insane.

00:41:11.160 --> 00:41:15.040
I will I will consider picking up PyCharm again when they add live share into it.

00:41:15.040 --> 00:41:16.420
They have they're they're working on it.

00:41:16.420 --> 00:41:18.040
It's something called code with me.

00:41:18.040 --> 00:41:18.320
Yeah.

00:41:18.320 --> 00:41:18.620
Yeah.

00:41:18.620 --> 00:41:19.660
So I have not tried it.

00:41:19.660 --> 00:41:20.780
I have no one to code with.

00:41:20.780 --> 00:41:23.220
I'm sorry, but email me later.

00:41:23.220 --> 00:41:23.720
We'll set something.

00:41:23.720 --> 00:41:24.420
Yeah, exactly.

00:41:24.420 --> 00:41:25.820
We'll go together.

00:41:25.820 --> 00:41:32.760
So also, since I got my M1 like three, four weeks ago, whatever, I've only used used this

00:41:32.760 --> 00:41:33.900
for all my Python work.

00:41:33.900 --> 00:41:36.040
And apparently it's it's still going strong.

00:41:36.040 --> 00:41:41.040
I even had to send in my MacBook Pro because it had starting started shut.

00:41:41.040 --> 00:41:42.160
The battery was so bad.

00:41:42.160 --> 00:41:43.860
It would shut down at 75 percent.

00:41:43.860 --> 00:41:46.080
Like, you know, when it gets too low, it'll shut down.

00:41:46.080 --> 00:41:48.980
And as the battery gets bad, maybe it shuts down at 10 percent instead of zero.

00:41:48.980 --> 00:41:52.120
If I'm doing video work, it'll actually shut down at 75 percent.

00:41:52.120 --> 00:41:53.080
So I plug it back in.

00:41:53.080 --> 00:41:55.520
So so it's all in one until that comes back.

00:41:55.520 --> 00:41:57.240
Well, I'm I'm still on my system.

00:41:57.240 --> 00:41:58.280
76 Linux.

00:41:58.280 --> 00:41:59.540
I can't speak to Apple.

00:41:59.540 --> 00:42:00.540
I do love my system.

00:42:00.540 --> 00:42:02.040
That's cool.

00:42:02.040 --> 00:42:08.120
I just I think this whole like new arm architecture stuff that they're doing, it's going to be

00:42:08.120 --> 00:42:08.400
interesting.

00:42:08.400 --> 00:42:12.760
You know, I think Microsoft's following suit or trying in parallel with them.

00:42:12.760 --> 00:42:15.040
It just felt to me like Intel and AMD.

00:42:15.040 --> 00:42:16.680
That's just the way it was going to be forever.

00:42:16.680 --> 00:42:18.560
And it's not necessarily the case.

00:42:18.560 --> 00:42:21.600
I don't I don't have a problem with I don't have a problem with competition.

00:42:21.600 --> 00:42:25.880
What I have a problem with is software companies making their own, you know, architecture and

00:42:25.880 --> 00:42:27.280
it only works on their architecture.

00:42:27.280 --> 00:42:28.400
That's what you move towards.

00:42:28.400 --> 00:42:30.860
And then you wind up with a totally fragmented industry.

00:42:31.080 --> 00:42:32.860
I think that's yeah, that's not going to be great.

00:42:32.860 --> 00:42:34.240
Don't do it, Microsoft.

00:42:34.240 --> 00:42:35.140
It's not worth it.

00:42:35.140 --> 00:42:38.180
Awesome.

00:42:38.180 --> 00:42:38.500
All right.

00:42:38.500 --> 00:42:40.960
Well, that that's my extra, extra, extra, extra, extra, extra, right?

00:42:40.960 --> 00:42:41.460
Nice.

00:42:41.460 --> 00:42:43.440
I want to get an M1.

00:42:43.440 --> 00:42:44.440
I'd like to get a mini.

00:42:44.440 --> 00:42:45.840
Yeah, the mini is fantastic.

00:42:45.840 --> 00:42:47.200
I really, really like it.

00:42:47.200 --> 00:42:48.220
It's not even funny.

00:42:48.220 --> 00:42:49.600
It's not even it's not even a joke.

00:42:49.600 --> 00:42:51.640
I'm being serious, but we do need a joke.

00:42:51.640 --> 00:42:52.040
Yes.

00:42:52.040 --> 00:42:53.100
Oh, I have a joke.

00:42:53.100 --> 00:42:53.860
All right.

00:42:53.860 --> 00:42:54.060
Yeah.

00:42:54.060 --> 00:42:55.520
You got the joke this week.

00:42:55.520 --> 00:42:57.080
I actually do have the joke this week.

00:42:57.080 --> 00:42:57.280
Yeah.

00:42:57.480 --> 00:43:01.700
And it was a why, why did the programmer always refuse to check his code into the repository?

00:43:01.700 --> 00:43:02.180
Why?

00:43:02.180 --> 00:43:03.400
He was afraid to commit.

00:43:03.400 --> 00:43:06.520
Yeah.

00:43:06.520 --> 00:43:07.240
Yeah.

00:43:07.240 --> 00:43:10.620
If you want to, if you want a regular dose of my, of my, that is one of my originals.

00:43:10.620 --> 00:43:13.980
If you want a regular dose of my absolutely horrific puns, you can follow me on Twitter,

00:43:13.980 --> 00:43:14.680
your own peril.

00:43:14.680 --> 00:43:16.420
I posted every, every Monday.

00:43:16.420 --> 00:43:17.060
I've got a new one.

00:43:17.060 --> 00:43:17.720
So awesome.

00:43:17.720 --> 00:43:18.260
Nice.

00:43:18.260 --> 00:43:18.680
Yeah.

00:43:18.680 --> 00:43:19.560
Thanks for being on the show.

00:43:19.560 --> 00:43:20.300
Yeah, it was fun.

00:43:20.300 --> 00:43:20.860
Yeah.

00:43:20.940 --> 00:43:24.380
Thanks. See y'all. Thanks everyone out there on the live stream and thanks everyone who listened.

