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:11.640
This is episode 217, recorded, what is it, January 19, 2021.

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

00:00:12.740 --> 00:00:13.680
I'm Michael Kennedy.

00:00:13.680 --> 00:00:14.780
And I'm Ogie Moore.

00:00:14.780 --> 00:00:16.580
Welcome. Thanks for joining us.

00:00:16.580 --> 00:00:17.560
Thanks for having me.

00:00:17.560 --> 00:00:18.860
Yeah, thanks for coming.

00:00:18.860 --> 00:00:20.560
Who's first? Michael's first.

00:00:20.560 --> 00:00:22.340
I'm first. You want to talk about caching?

00:00:22.340 --> 00:00:24.460
I got some cool stuff to talk about with caching.

00:00:24.460 --> 00:00:35.200
So I recently got a recommendation from Ian Maurer, who was talking about genetics and biology over on Talk Python, I think 154, so a while back.

00:00:35.200 --> 00:00:38.600
But he pointed out this project called Python Disk Cache.

00:00:38.600 --> 00:00:42.000
And it just seems like such a cool project to me.

00:00:42.000 --> 00:00:53.800
So one of the big problems or not problems, one of the tradeoffs or the mix of resources we have to work with when we're running stuff in the cloud so often has to do with limited RAM, limited memory in that regard.

00:00:53.800 --> 00:00:57.620
And limited CPU, but usually have a ton of disk space.

00:00:57.620 --> 00:01:05.980
For example, on my server, I think I've got like using five gigs out of 25 gigs, but I've only got, you know, two or four gigs of RAM, right?

00:01:05.980 --> 00:01:11.860
But one of the things you can do to make your code incredibly fast is to cache stuff that's expensive, right?

00:01:11.860 --> 00:01:18.120
If you're going to do a complicated series of database queries, maybe just save the result and refresh it every so often or something like that, right?

00:01:18.120 --> 00:01:22.980
Well, this library here is kind of the simplest version of one of these caches.

00:01:23.140 --> 00:01:24.920
Like people often recommend Memcached.

00:01:24.920 --> 00:01:27.120
They talk about Redis.

00:01:27.120 --> 00:01:30.940
You might even store something in your database and then pull it back out.

00:01:30.940 --> 00:01:32.380
And all those things are fine.

00:01:32.380 --> 00:01:33.720
They just have extra complexity.

00:01:33.720 --> 00:01:37.280
Now I have a separate database server to talk to if I didn't have one before.

00:01:37.280 --> 00:01:38.940
I've got a Redis caching server.

00:01:38.940 --> 00:01:39.800
Now I got to share.

00:01:39.800 --> 00:01:44.260
What if you just use that extra hard disk space to make your app faster?

00:01:44.260 --> 00:01:49.580
A lot of these cloud systems like Linode, for example, they have SSDs for the hard drive.

00:01:49.580 --> 00:01:52.640
So if you store something and then read it back, it's going to be blazing fast, right?

00:01:52.640 --> 00:01:59.740
So disk cache is all about allowing you to do, you know, put this thing in the cache and get it from the cache, but it actually stores it in the file system.

00:01:59.740 --> 00:02:00.540
That's pretty cool, right?

00:02:00.540 --> 00:02:01.000
Yeah.

00:02:01.240 --> 00:02:01.400
Yeah.

00:02:01.400 --> 00:02:03.660
So it's super easy to use.

00:02:03.660 --> 00:02:06.520
You can just come up here and say, import disk cache.

00:02:06.520 --> 00:02:10.180
Just to get an item, I just say cache, like a dictionary, basically.

00:02:10.180 --> 00:02:11.460
And to put it back, same thing.

00:02:11.460 --> 00:02:12.580
You give it a key and a value.

00:02:12.580 --> 00:02:14.100
It's basically like a dictionary.

00:02:14.360 --> 00:02:15.980
But it persists across runs.

00:02:15.980 --> 00:02:20.100
It's multi-threaded, multi-process safe, and all those kinds of things.

00:02:20.100 --> 00:02:22.080
So incredibly, incredibly cool.

00:02:22.080 --> 00:02:22.960
It's pure Python.

00:02:22.960 --> 00:02:24.460
It runs in process.

00:02:24.460 --> 00:02:25.980
So there's not like a server to manage.

00:02:25.980 --> 00:02:28.840
It has 100% test coverage, hours of stress testing.

00:02:28.840 --> 00:02:30.440
It's focused on performance.

00:02:30.440 --> 00:02:34.380
And it actually, Django has a built-in caching API in Django.

00:02:34.380 --> 00:02:36.220
And you can plug this into Django.

00:02:36.220 --> 00:02:42.740
So when people say cache with my thing, even third-party apps and stuff, you can automatically start using this, which is pretty awesome.

00:02:43.020 --> 00:02:44.340
It has support for eviction.

00:02:44.340 --> 00:02:48.940
So most recently used, first and so on.

00:02:48.940 --> 00:02:53.560
You can tag things and say these can get evicted sooner and whatnot.

00:02:53.560 --> 00:02:54.780
So really, really nice.

00:02:54.780 --> 00:02:55.920
Incredibly easy to use.

00:02:55.920 --> 00:02:59.040
I definitely recommend people check it out because very nice.

00:02:59.040 --> 00:03:05.740
It has different kinds of data structures that you can work with, like a fan-out cache, a Django cache, a regular cache, and so on.

00:03:05.740 --> 00:03:12.480
So if you want to work with some code and it's possibly going to run in multiple processes or it's going to start and then restart,

00:03:12.800 --> 00:03:17.180
start and stop and then run again, and you wanted to not have to recompute everything, this cache.

00:03:17.180 --> 00:03:20.900
Are evictions on hold for 2020?

00:03:20.900 --> 00:03:21.320
Yeah.

00:03:21.320 --> 00:03:24.420
Well, because of COVID, you're going to need more disk bait.

00:03:24.420 --> 00:03:24.920
No, I'm just kidding.

00:03:24.920 --> 00:03:27.720
No, this looks cool.

00:03:27.840 --> 00:03:36.580
So one of the things I was confused about is it's called the cat disk cache, but what's the difference between that and just like a key value store database?

00:03:36.580 --> 00:03:41.100
Well, the key value store database in practice would be no different.

00:03:41.100 --> 00:03:42.000
Okay.

00:03:42.560 --> 00:03:45.760
But you have a separate server.

00:03:45.760 --> 00:03:52.880
Like there is a server process that runs somewhere that you have to have like a connection string and stuff to that you talk to it in this way.

00:03:52.880 --> 00:03:54.360
This is like I have a file.

00:03:54.360 --> 00:03:56.560
I use the same API to talk to it.

00:03:56.560 --> 00:04:01.600
So instead of having another server to manage another place to run it, you just say like, let me just put it on the SSD.

00:04:01.600 --> 00:04:03.040
And that's probably quite fast.

00:04:03.040 --> 00:04:03.480
Cool.

00:04:03.740 --> 00:04:05.840
And then we got a quick question here.

00:04:05.840 --> 00:04:11.260
Brandon asked, do they talk about any way to scale this out, say multiple servers behind a load balancer?

00:04:11.260 --> 00:04:12.940
I did not see anything.

00:04:12.940 --> 00:04:20.020
I'm pretty sure as far as I can tell that it's local, just like sort of a per machine type of thing.

00:04:20.020 --> 00:04:24.840
Not a, but it does go across processes, but it doesn't, I haven't seen anything talking about multiple machine.

00:04:24.840 --> 00:04:28.480
I guess you could set up a, like a microservice, but at that point you might as well just have Redis.

00:04:28.480 --> 00:04:29.000
Yeah.

00:04:29.000 --> 00:04:29.440
Yeah.

00:04:29.440 --> 00:04:33.380
Redis is kind of on my list of things to try here pretty soon too.

00:04:33.380 --> 00:04:34.280
Yeah, absolutely.

00:04:34.280 --> 00:04:41.120
Another thing that I want to check out is, is some of the, well, I like Toml lately.

00:04:41.120 --> 00:04:41.920
Yeah.

00:04:41.920 --> 00:04:42.180
How about you?

00:04:42.180 --> 00:04:42.620
Toml's great.

00:04:42.620 --> 00:04:43.460
Toml's great.

00:04:43.460 --> 00:04:45.160
I heard that it reached 1.0.

00:04:45.160 --> 00:04:45.840
Yeah.

00:04:45.840 --> 00:04:48.100
So it is, it's at 1.0 now.

00:04:48.100 --> 00:04:52.200
And, and I think that they were kind of headed there anyway.

00:04:52.200 --> 00:04:54.840
So I was looking through the change log.

00:04:54.840 --> 00:05:01.820
Looks like they had several release candidates and, and I'm anyway, we'll talk about it a little bit.

00:05:01.820 --> 00:05:03.860
So it's, it's at 1.0 now.

00:05:03.860 --> 00:05:06.200
I mean, a lot of us don't really understand.

00:05:06.200 --> 00:05:08.340
It's maybe I'm speaking for myself.

00:05:08.340 --> 00:05:11.600
Don't really get what, what, what all the specification means.

00:05:11.600 --> 00:05:12.320
I just use it.

00:05:12.320 --> 00:05:13.100
It just works.

00:05:13.100 --> 00:05:13.520
It's easy.

00:05:13.780 --> 00:05:18.220
And, and one of the things I use it for is the pyproject.toml file.

00:05:18.220 --> 00:05:20.140
It's mostly what I use it for.

00:05:20.140 --> 00:05:25.420
But, but pyproject.toml is taking off and this is at 1.0.

00:05:25.420 --> 00:05:26.720
So what does this mean?

00:05:26.720 --> 00:05:33.100
I'm hoping that this means that we have like a Python package built into the Python that parses

00:05:33.100 --> 00:05:33.640
Toml.

00:05:33.740 --> 00:05:33.920
Yeah.

00:05:33.920 --> 00:05:35.220
Now the language is stable, right?

00:05:35.220 --> 00:05:35.620
Yeah.

00:05:35.620 --> 00:05:37.620
Maybe it means I need to learn more about Toml.

00:05:37.620 --> 00:05:38.860
Maybe.

00:05:38.860 --> 00:05:41.520
But I think there's talk about it.

00:05:41.520 --> 00:05:42.960
I'm not sure what the state of it is.

00:05:42.960 --> 00:05:45.940
Maybe we could get Brett or somebody to talk about it.

00:05:46.140 --> 00:05:53.120
But in the meantime, if you want to play with 1.0 with Python, there's, I think there might

00:05:53.120 --> 00:05:53.940
be limited choices.

00:05:53.940 --> 00:05:55.020
So I went out and looked.

00:05:55.020 --> 00:06:01.060
There's a page on the project page that, that shows it's like down at the bottom.

00:06:01.060 --> 00:06:07.600
It shows the different projects, the implement that implement the various versions of Toml.

00:06:07.600 --> 00:06:09.280
And there's one project.

00:06:09.280 --> 00:06:16.120
So there's a C++ project that there are handful C++ that support the 1.0.0, the most

00:06:16.120 --> 00:06:18.220
recent version of Toml.

00:06:18.220 --> 00:06:23.340
And then various support levels for different, for different other things.

00:06:23.340 --> 00:06:28.240
There's a, there's a 1.0.0 release candidate one that's supported by TomlKit.

00:06:28.240 --> 00:06:33.620
So TomlKit is a Python project that looks, and I think that that might be sufficient to

00:06:33.620 --> 00:06:36.320
try out most of the features, the new features.

00:06:36.320 --> 00:06:42.640
And then, then there's the, what I would think of is just the Toml project in Python.

00:06:42.640 --> 00:06:46.680
That one's only, it supports 0.5.0.

00:06:46.680 --> 00:06:48.860
So I'm not sure what's going on there.

00:06:48.860 --> 00:06:51.000
It'd be great if it would support the latest.

00:06:51.000 --> 00:06:52.620
But then I'm like, what does that mean?

00:06:52.620 --> 00:06:55.800
What is, what's different between 0.5.0 and 1.0?

00:06:56.020 --> 00:06:57.700
And so I went and looked at the changelog.

00:06:57.700 --> 00:07:02.780
There's, there's three things that jump out that look like they're new, really changes.

00:07:02.780 --> 00:07:07.660
One of them is leading zeros in exponent parts of floats are permitted.

00:07:07.660 --> 00:07:09.260
So, okay.

00:07:09.620 --> 00:07:15.260
Then allowing raw character tabs in basic strings and multi-line basic strings.

00:07:15.260 --> 00:07:16.660
That seems reasonable.

00:07:16.660 --> 00:07:24.160
And then the difficult one might be allowing heterogeneous values in arrays, which that's

00:07:24.160 --> 00:07:24.560
cool.

00:07:24.560 --> 00:07:25.800
And I'm, yeah.

00:07:25.800 --> 00:07:27.340
So apparently it wasn't there before.

00:07:27.340 --> 00:07:27.800
Yeah.

00:07:27.800 --> 00:07:30.800
But none of those seem like super common stuff.

00:07:30.800 --> 00:07:32.180
That's going to be a big breaking change.

00:07:32.180 --> 00:07:34.720
Like, oh, well, of course we use heterogeneous types in here.

00:07:34.720 --> 00:07:37.160
Like we're just going to mix it up and random stuff in our array, right?

00:07:37.160 --> 00:07:42.180
It seems like it's, it's probably still the built-in or the pure Python one is probably

00:07:42.180 --> 00:07:42.800
decent still.

00:07:42.800 --> 00:07:43.220
Right.

00:07:43.220 --> 00:07:49.220
And I need the, I guess there's a whole bunch of these that are listed as clarify, like

00:07:49.220 --> 00:07:51.320
clarify it, but it is a specification.

00:07:51.320 --> 00:07:55.440
So clarify might be very important, but I'm not sure how important that is.

00:07:55.440 --> 00:08:00.400
It probably affects the implementation, but I'm putting this out because I'd like to hear

00:08:00.400 --> 00:08:04.540
from people that know more than I do about this and how this affects Python.

00:08:04.540 --> 00:08:06.040
And then if we should care about it.

00:08:06.040 --> 00:08:06.260
Yeah.

00:08:06.260 --> 00:08:06.940
Yeah, for sure.

00:08:06.940 --> 00:08:07.600
That's very cool.

00:08:07.600 --> 00:08:11.120
Let's see it coming along and it definitely lends some support to the whole Pi project,

00:08:11.120 --> 00:08:11.740
Toml stuff.

00:08:11.740 --> 00:08:12.200
Yeah.

00:08:12.200 --> 00:08:12.540
Yeah.

00:08:12.540 --> 00:08:17.740
Hey, before we move on to Augie's first topic, Martin Boris asked, I was wondering, is this

00:08:17.740 --> 00:08:22.640
disc cache thing I mentioned, is it a simple way to share data between uvicorn and Gunicorn

00:08:22.640 --> 00:08:23.060
workers?

00:08:23.060 --> 00:08:24.260
Yes, exactly.

00:08:24.260 --> 00:08:29.480
That's exactly why it matters because it goes across the worker processes or across worker process

00:08:29.480 --> 00:08:34.220
in general, across multi-processes and a consequence of multiple worker processes.

00:08:34.220 --> 00:08:36.540
Because normally you would either cache in like process memory.

00:08:36.540 --> 00:08:37.880
So you've got to do it like 10 times.

00:08:37.880 --> 00:08:40.740
You've got it all fanned out, different processes running.

00:08:40.740 --> 00:08:42.220
So this will solve that for sure.

00:08:42.220 --> 00:08:44.680
And then one for you, Brian, for Magnus Carlson.

00:08:44.680 --> 00:08:45.300
Yeah.

00:08:45.300 --> 00:08:46.700
Does, what is that?

00:08:46.700 --> 00:08:48.060
Does PEP 621.

00:08:48.060 --> 00:08:50.580
The Toml spec, whatever the PEP is for that.

00:08:50.580 --> 00:08:52.580
Specify the version of Toml to use.

00:08:52.580 --> 00:08:53.520
I don't know.

00:08:53.520 --> 00:08:54.860
I'll have to ask Brett about that too.

00:08:54.860 --> 00:08:55.300
Yeah.

00:08:55.300 --> 00:08:55.740
I don't know either.

00:08:55.740 --> 00:08:56.040
Sorry.

00:08:56.040 --> 00:08:56.800
All right, Augie.

00:08:56.800 --> 00:08:57.520
What you got?

00:08:57.520 --> 00:08:59.860
Well, I'm here.

00:08:59.860 --> 00:09:01.480
Well, thank you for inviting me again.

00:09:01.720 --> 00:09:06.000
This is actually, you have two consecutive weeks of hosting mechanical engineers as your

00:09:06.000 --> 00:09:06.780
guest on the podcast.

00:09:06.780 --> 00:09:07.520
Why not?

00:09:07.520 --> 00:09:11.200
So thanks for being inclusive.

00:09:11.900 --> 00:09:18.100
But I wanted to talk about PyQtGraph, which is not new, but it's a...

00:09:18.100 --> 00:09:19.580
Yeah, people maybe don't know though, so tell them about it.

00:09:19.580 --> 00:09:20.540
Yeah, absolutely.

00:09:20.540 --> 00:09:27.300
So PyQtGraph is a plotting library, but it's a little different from the likes of Matplotlib

00:09:27.300 --> 00:09:31.080
and on the variance or derivatives from that or a bouquet.

00:09:31.080 --> 00:09:38.780
PyQtGraph uses the Qt framework, and it's meant for embedding interactive plots within

00:09:38.780 --> 00:09:40.440
GUI applications.

00:09:40.440 --> 00:09:48.460
And as a consequence of using the Qt, you can actually get some really high performance

00:09:48.460 --> 00:09:54.640
out of it, which Matplotlib is absolutely phenomenal for generating plots for publications

00:09:54.640 --> 00:09:58.060
or for static media on websites.

00:09:58.060 --> 00:10:01.920
But the moment you try and do anything like with mouse interactions, you might be in for

00:10:01.920 --> 00:10:03.720
a bit of a tough time.

00:10:04.780 --> 00:10:10.080
With this, you're running on like native with Qt, you're running natively on the OS, right?

00:10:10.080 --> 00:10:10.740
Absolutely.

00:10:10.740 --> 00:10:11.960
Yeah, you're running...

00:10:11.960 --> 00:10:16.520
Yeah, there's no client-server relationship like you would get with a bouquet, which you

00:10:16.520 --> 00:10:18.280
might need in some certain situations.

00:10:18.280 --> 00:10:23.920
But anyway, so part of the PyQtGraph library is...

00:10:23.920 --> 00:10:28.460
Which, you know, I guess I should identify that I am a maintainer of.

00:10:28.460 --> 00:10:32.480
But is that we actually bundle an example application.

00:10:32.480 --> 00:10:37.080
So if you're ever curious about the library and its capabilities, you know, and don't feel

00:10:37.080 --> 00:10:41.580
like reading through dozens of pages of documentation, you can just run this example app, which I have

00:10:41.580 --> 00:10:42.340
on the screen share.

00:10:42.340 --> 00:10:44.440
And it shows you the list of various...

00:10:44.440 --> 00:10:46.340
And this comes with PyQtGraph, right?

00:10:46.340 --> 00:10:46.960
Yes.

00:10:46.960 --> 00:10:47.200
Yeah.

00:10:47.200 --> 00:10:48.200
It's bundled in the library.

00:10:48.200 --> 00:10:50.400
So if you put in SolpyQtGraph, you get this.

00:10:50.400 --> 00:10:54.080
And here's some of the basic, you know, plots.

00:10:54.080 --> 00:10:59.020
But, you know, and as you can see, you get our mouse interactivity going and, you know, we

00:10:59.020 --> 00:11:00.560
can do zoom behavior.

00:11:00.560 --> 00:11:01.360
Nice.

00:11:01.360 --> 00:11:07.480
And, but what's really cool about this library is that example here, basic plotting, is generating

00:11:07.480 --> 00:11:07.940
during...

00:11:07.940 --> 00:11:09.040
With this code right here.

00:11:09.040 --> 00:11:11.100
All those plots was in this...

00:11:11.100 --> 00:11:12.400
Oh, I can't tell how many lines.

00:11:12.400 --> 00:11:13.880
Maybe 70 lines total.

00:11:14.200 --> 00:11:14.400
Yeah.

00:11:14.400 --> 00:11:19.640
But anyway, you can, within this editor here, you can change any of the code and experiment

00:11:19.640 --> 00:11:20.260
with yourself.

00:11:20.260 --> 00:11:23.820
And here on the tab, you see all these different items, you know, it does 2D.

00:11:23.820 --> 00:11:27.640
We have some 3D capability, which you need the PyOpenGL library for.

00:11:27.640 --> 00:11:34.740
Another, this one is just maybe a dozen lines of code, but you have a couple plots here.

00:11:34.740 --> 00:11:38.620
And then just with the mouse interactivity, right, we can subselect or here you can get our

00:11:38.620 --> 00:11:42.520
crosshairs and get information about what's the data points underneath the mouse.

00:11:42.720 --> 00:11:48.260
So for an analysis tool, it is really, really, it can be incredibly powerful.

00:11:48.260 --> 00:11:54.020
And if you're generating tools for any kind of engineering or scientific analysis where

00:11:54.020 --> 00:11:58.440
you want like the user to be able to interact with the data in some way, you know, zoom in,

00:11:58.440 --> 00:12:03.700
zoom out, things like that, or PyQD graph might be a really good option for you.

00:12:03.700 --> 00:12:04.400
Yeah, absolutely.

00:12:04.400 --> 00:12:06.920
Can you run the basic plotting thing one real quick?

00:12:06.920 --> 00:12:07.880
Oh yeah, of course.

00:12:09.000 --> 00:12:14.320
So when I was looking at this, the thing that stood out to me was while it looks like the

00:12:14.320 --> 00:12:15.860
graphs are beautiful and they look good.

00:12:15.860 --> 00:12:20.440
You know, the first couple that it's like, I could probably do that in Bokeh or PlotLayer,

00:12:20.440 --> 00:12:21.640
you know, MapPlotLib.

00:12:21.640 --> 00:12:22.720
So something like that, right?

00:12:22.720 --> 00:12:27.680
But the nice interaction between multiple graphs as you zoom in one, the other goes in, or that

00:12:27.680 --> 00:12:31.500
super high frequency yellow one that's people listening.

00:12:31.580 --> 00:12:34.400
It's like refreshing, you know, many, many times a second, right?

00:12:34.400 --> 00:12:39.040
Getting high frame rates out of those like Jupyter notebooks sounds tricky.

00:12:39.040 --> 00:12:39.880
Yeah.

00:12:39.880 --> 00:12:42.520
And I'm actually really glad you brought up high frame rates.

00:12:42.520 --> 00:12:49.180
I'm actually on the verge of merging a pull request to integrate a Coupy support, which is

00:12:49.180 --> 00:12:54.020
the CUDA number arrays or some of the image data.

00:12:54.420 --> 00:12:59.000
And on some of our benchmarks were showing being able to go from, you know, maybe 20 frames

00:12:59.000 --> 00:13:04.280
per second of images up to over 150 frames per second, which, you know, at that point,

00:13:04.280 --> 00:13:08.520
you know, monitors can't keep up, but you know, you lessen the CPU load substantially.

00:13:08.520 --> 00:13:09.540
Yeah, that's fantastic.

00:13:09.540 --> 00:13:12.800
We got a comment question from the Anthony Shah.

00:13:14.880 --> 00:13:19.680
I use the built-in grapher app in macOS.

00:13:19.680 --> 00:13:22.580
I do not know what the built-in grapher app is.

00:13:22.580 --> 00:13:27.540
So I am, I'm afraid I don't know how to answer that.

00:13:27.540 --> 00:13:29.180
You don't know if it can replace it or not.

00:13:29.180 --> 00:13:30.660
I don't know either, but yeah.

00:13:30.660 --> 00:13:35.200
But PyQt graph, it has a couple dependencies.

00:13:35.200 --> 00:13:36.780
You need some Qt bindings.

00:13:36.780 --> 00:13:41.420
And right now we support Qt5, 5.12 and newer.

00:13:41.420 --> 00:13:47.340
Up until very recently, PyQt graph supported like virtually any Qt bindings you could install,

00:13:47.340 --> 00:13:50.900
like even going back a decade, which eventually I had to put an ax to that.

00:13:50.900 --> 00:13:51.960
That was just too much work.

00:13:51.960 --> 00:13:58.260
And so we support Qt5.12 or newer.

00:13:58.260 --> 00:14:05.000
We don't support Qt6 yet, although there is a pull request in to add support for PySide6,

00:14:05.000 --> 00:14:07.200
which was discussed on the show just two weeks ago.

00:14:07.200 --> 00:14:08.480
It just came out, right?

00:14:08.480 --> 00:14:08.880
Right.

00:14:09.100 --> 00:14:15.440
It just came out, which I'm really thankful for contributors that are submitting these pull

00:14:15.440 --> 00:14:15.800
requests.

00:14:15.800 --> 00:14:17.020
I often feel bad.

00:14:17.020 --> 00:14:21.320
I can't keep up with the rate that they're coming in, but it's still appreciated.

00:14:21.320 --> 00:14:24.060
Are you looking for contributors to the project?

00:14:24.060 --> 00:14:25.160
Yeah, absolutely.

00:14:25.160 --> 00:14:32.300
And not just contributors to the code, but also people that are willing to look over a pull

00:14:32.300 --> 00:14:36.820
request or willing to test out pull request mainly with the plotting library.

00:14:36.820 --> 00:14:43.340
Sometimes testing can be really difficult because like visual artifacts, like how do I test for

00:14:43.340 --> 00:14:43.560
that?

00:14:43.560 --> 00:14:43.820
Right.

00:14:45.020 --> 00:14:50.860
And so sometimes a lot of a big chunk of our testing is, well, does this break or does this look

00:14:50.860 --> 00:14:51.180
right?

00:14:51.180 --> 00:14:59.300
And being able to, you know, having somebody else, you know, verify that kind of stuff or is a really

00:14:59.300 --> 00:14:59.940
big help.

00:15:00.100 --> 00:15:10.700
So if you're interested in this and feel free to reach out to me directly or take a look at our issue

00:15:10.700 --> 00:15:11.820
tracker or pull request tracker.

00:15:12.840 --> 00:15:13.240
Yeah.

00:15:13.240 --> 00:15:13.440
No.

00:15:13.440 --> 00:15:16.900
And I guess the last thing I should say is it's, it's primarily used in scientific and

00:15:16.900 --> 00:15:18.020
engineering applications.

00:15:18.020 --> 00:15:23.280
It's a periodically I go through to get log and I look at like the email addresses that

00:15:23.280 --> 00:15:28.960
people are contributing to and, you know, NASA Ames Research Center and a bunch of places

00:15:28.960 --> 00:15:29.480
like that.

00:15:29.480 --> 00:15:33.100
But, but, but yeah, no, I get a kick out of that.

00:15:33.100 --> 00:15:33.500
Yeah.

00:15:33.500 --> 00:15:34.500
That's super, super cool.

00:15:34.500 --> 00:15:34.980
Nice.

00:15:34.980 --> 00:15:36.640
Thanks for sharing that and good work on it.

00:15:36.640 --> 00:15:40.700
Well, I, another cool thing is Linode and they're sponsoring this episode.

00:15:40.700 --> 00:15:41.480
Thank you, Linode.

00:15:41.800 --> 00:15:46.720
Simplify your infrastructure and cut your cloud bills in half with Linode's Linux virtual machines.

00:15:46.720 --> 00:15:50.500
Develop, deploy, and scale your modern applications faster and easier.

00:15:50.500 --> 00:15:55.040
Whether you're developing a personal project or managing larger workloads, you deserve simple,

00:15:55.040 --> 00:15:58.200
affordable, and accessible cloud computing solutions.

00:15:58.200 --> 00:16:02.480
As listeners of Python Bytes, you get a $100 free credit.

00:16:02.480 --> 00:16:07.080
You can find all about the, those details at pythonbytes.fm/Linode.

00:16:07.080 --> 00:16:11.480
Linode also has data centers around the world with this same simple and consistent

00:16:11.480 --> 00:16:14.020
pricing, regardless of location.

00:16:14.020 --> 00:16:16.560
Choose the data center nearest to your users.

00:16:16.560 --> 00:16:24.260
You also receive 24 seven, 365 day human support with no tiers or handoffs, regardless of your

00:16:24.260 --> 00:16:24.940
plan size.

00:16:25.020 --> 00:16:30.100
You can choose shared and dedicated compute instances, or you can use your $100 credit

00:16:30.100 --> 00:16:34.380
on S3 compatible object storage, managed Kubernetes and more.

00:16:34.380 --> 00:16:37.800
If it run on, if it runs on Linux, it runs on Linode.

00:16:37.800 --> 00:16:43.960
Visit pythonbytes.fm Linode slash Linode and click on the create free account, free account

00:16:43.960 --> 00:16:45.100
button to get started.

00:16:45.100 --> 00:16:45.540
Awesome.

00:16:45.740 --> 00:16:47.160
Thanks for supporting the show, Linode.

00:16:47.160 --> 00:16:50.980
Okay, Brian, I want to cover something that comes to us from two listeners.

00:16:50.980 --> 00:16:59.000
This comes from Jim Kring, who pointed out some really interesting aspects, how Python is being

00:16:59.000 --> 00:17:02.980
used in this whole parlor, social media kerfuffle.

00:17:02.980 --> 00:17:07.060
And a great article by my good friend and fellow Portlander, Mark Little.

00:17:07.060 --> 00:17:09.640
So let's go over the article first.

00:17:09.640 --> 00:17:13.500
So you guys heard there was basically an attempt to overthrow the US government.

00:17:13.620 --> 00:17:14.320
You guys hear that?

00:17:14.320 --> 00:17:15.740
That was lovely.

00:17:15.740 --> 00:17:16.720
What idiots.

00:17:16.720 --> 00:17:22.000
So a lot of the people who were there got kicked off of, you know, official social media and

00:17:22.000 --> 00:17:23.540
they went to this site called Parler.

00:17:23.540 --> 00:17:28.660
So Parler, according to Wikipedia, is an American alt tech microblogging and social media networking

00:17:28.660 --> 00:17:29.140
service.

00:17:29.140 --> 00:17:33.540
And it has a significant user base of Donald Trump supporters, conservatives, conservatives,

00:17:33.540 --> 00:17:36.740
conspiracy theorists, and right-wing extremists.

00:17:36.740 --> 00:17:38.200
Not my words, that's Wikipedia.

00:17:38.620 --> 00:17:45.080
So a lot of the people who stormed the Capitol tried to get into Congress and stop the counting

00:17:45.080 --> 00:17:45.600
of the votes.

00:17:45.600 --> 00:17:49.080
They decided to live blog it on their personal accounts.

00:17:49.080 --> 00:17:54.560
But a lot of them were no longer on Twitter and whatnot, although some were.

00:17:54.560 --> 00:17:56.100
So they were on Parler.

00:17:56.100 --> 00:18:01.140
And they probably came to realize, you know, it's probably not a good idea of showing me

00:18:01.140 --> 00:18:05.140
charging into the Capitol as like hundreds of people are being arrested and charged with

00:18:05.140 --> 00:18:06.460
federal crimes, right?

00:18:06.460 --> 00:18:11.760
At the same time, Parler was getting kicked off of Apple's App Store or the iOS.

00:18:11.760 --> 00:18:14.280
They were getting kicked off of the Google Play Store.

00:18:14.280 --> 00:18:15.940
They were getting banned in a lot of places.

00:18:15.940 --> 00:18:21.200
So there was this hacker is not the right person, the sort of data savior person, I guess you could

00:18:21.200 --> 00:18:26.380
say, who came along and realized it would be great if we could download all of that content

00:18:26.380 --> 00:18:31.100
and save it and hand it over to journalists at, say, like ProPublica, hand it over to the

00:18:31.100 --> 00:18:32.420
FBI and so on.

00:18:32.420 --> 00:18:34.680
It turns out it wasn't very hard to do.

00:18:34.680 --> 00:18:36.300
There was a couple of things.

00:18:36.300 --> 00:18:42.700
If you look through the Ars Technica article about how the code behind Parler was a coding

00:18:42.700 --> 00:18:43.160
mess.

00:18:43.160 --> 00:18:46.220
And I've tried to figure out what technology was used to implement it.

00:18:46.220 --> 00:18:47.560
I just couldn't find that anywhere.

00:18:47.560 --> 00:18:53.680
Anyway, it says the reason this woman was so successful at grabbing all this data, which

00:18:53.680 --> 00:18:56.920
she got like 1 million videos and a whole bunch of pictures.

00:18:56.920 --> 00:18:59.080
There's a whole host of mistakes.

00:18:59.080 --> 00:19:02.960
So the public API for it used no authentication.

00:19:02.960 --> 00:19:04.440
Let me rephrase that.

00:19:04.440 --> 00:19:05.640
Restate that.

00:19:05.640 --> 00:19:07.740
The public API used zero authentication.

00:19:07.740 --> 00:19:08.920
No rate limiting, nothing.

00:19:08.920 --> 00:19:10.020
Just, yeah, sure.

00:19:10.020 --> 00:19:10.780
We'll just go ahead.

00:19:10.780 --> 00:19:11.320
There you go.

00:19:11.320 --> 00:19:13.180
You have it all.

00:19:13.180 --> 00:19:17.200
Secondly, when a user deleted their post, the site didn't remove it.

00:19:17.200 --> 00:19:18.600
It just flagged it as deleted.

00:19:18.600 --> 00:19:22.040
So it would show up in the feed, which in and of itself is not necessarily bad.

00:19:22.040 --> 00:19:28.940
But you pair that with every post was an auto incrementing ID, which meant you could just enumerate.

00:19:28.940 --> 00:19:30.180
You're like, oh, I'm on post 500.

00:19:30.180 --> 00:19:31.480
Well, let's see what 501 is.

00:19:31.480 --> 00:19:32.600
It doesn't matter if it's deleted.

00:19:32.600 --> 00:19:33.420
Give me that.

00:19:33.420 --> 00:19:34.820
That's crazy, right?

00:19:34.820 --> 00:19:40.140
So she wrote a script in Python to go download it.

00:19:40.160 --> 00:19:45.460
And you can actually see, like, here's all the videos and all the stuff and their IDs and whatnot.

00:19:45.460 --> 00:19:48.560
And in here, this is the one that Jim sent over.

00:19:48.560 --> 00:19:53.120
If you look, there's a gist here that shows you how do you download a video from Parler.

00:19:53.120 --> 00:19:55.480
Let's go down and find, is it here?

00:19:55.480 --> 00:19:56.440
No, maybe it's not there.

00:19:56.440 --> 00:19:57.120
I think it might be back.

00:19:57.500 --> 00:20:02.440
There's a part where it shows the how do you download it with Python and so on.

00:20:02.440 --> 00:20:06.000
So you just go through and, like, you know, screen scrape it traditional Python right there.

00:20:06.000 --> 00:20:10.380
So apparently Python was used to free and capture all of this.

00:20:10.380 --> 00:20:18.560
Oh, another thing that they did in Parler that made it easy to get was when you upload videos and images to places like Twitter,

00:20:18.560 --> 00:20:22.960
they'll auto strip the XIF, like the geolocation and whatnot from the images.

00:20:22.960 --> 00:20:23.860
No, they don't need it.

00:20:23.860 --> 00:20:24.540
Just post it.

00:20:24.540 --> 00:20:24.760
All right.

00:20:24.800 --> 00:20:29.820
So, like, geolocation, camera name, all that kind of stuff is all in there.

00:20:29.820 --> 00:20:32.540
So there's just a bunch of badness.

00:20:32.540 --> 00:20:37.640
They've been since kicked off of AWS because, you know, crimes.

00:20:37.640 --> 00:20:42.560
And now they're apparently trying to get hosted in a server in Russia.

00:20:42.560 --> 00:20:43.200
Is that right, Augie?

00:20:43.200 --> 00:20:44.100
Yeah.

00:20:44.100 --> 00:20:45.100
There was a...

00:20:45.100 --> 00:20:53.020
Actually, I think there's an article on Ars Technica that went up this morning that they're somewhat partially online on some Russian infrastructure, which...

00:20:53.020 --> 00:20:54.440
Yeah, they're only partially online.

00:20:54.500 --> 00:20:56.000
Because I looked and it...

00:20:56.000 --> 00:20:57.000
They're like...

00:20:57.000 --> 00:20:59.820
It says something like, well, we're trying to come back.

00:20:59.820 --> 00:21:01.180
Here's a couple of posts.

00:21:01.180 --> 00:21:02.800
It's not...

00:21:02.800 --> 00:21:04.700
Yeah, it's not all the way back, right?

00:21:04.700 --> 00:21:10.020
They're experiencing technical difficulties, as in the world hates them and is trying to make them go away.

00:21:10.020 --> 00:21:14.240
So I'm not here to try to make this a political statement or anything like that.

00:21:14.240 --> 00:21:15.460
That's not why I covered the story.

00:21:15.560 --> 00:21:23.200
I covered it because I thought it's very interesting, both the security side and how people were able to leverage Python to sort of grab this stuff before it's gone.

00:21:23.200 --> 00:21:27.260
Some of the journalists were asking, like, is there a more accessible way to get the data?

00:21:27.260 --> 00:21:29.440
They're like, yes, we're going to build...

00:21:29.440 --> 00:21:32.360
The woman who got it is like, we're going to build some better way for you to get it.

00:21:32.360 --> 00:21:36.220
But right now, it's like, I had to run into the burning building and grab the files before they were gone.

00:21:36.620 --> 00:21:43.300
Yeah, the other thing I sort of want to point out about this story is it's not like Parler was lacking funding to develop these tools.

00:21:43.300 --> 00:21:47.480
They had, from what I understand, they had significant financial backing.

00:21:47.480 --> 00:21:48.080
Yeah.

00:21:48.080 --> 00:21:52.640
And whether they did not have the technical expertise, the time, I don't know.

00:21:52.640 --> 00:21:57.020
But I'm really curious as more fallout comes from this, you know.

00:21:57.020 --> 00:21:58.380
Yeah.

00:21:58.380 --> 00:22:01.540
There's going to be some good stories from a technical standpoint on here.

00:22:01.540 --> 00:22:02.820
Absolutely.

00:22:02.820 --> 00:22:04.760
Well, pretty insane.

00:22:04.760 --> 00:22:05.380
All right, Brian.

00:22:05.460 --> 00:22:08.300
Let's move on to something more Devy developer.

00:22:08.300 --> 00:22:09.000
Web Devy.

00:22:09.000 --> 00:22:12.980
Well, you know, maybe if you want to scrape the web or something else.

00:22:12.980 --> 00:22:14.240
Absolutely.

00:22:14.240 --> 00:22:14.880
Yeah.

00:22:14.880 --> 00:22:18.340
We've got a suggestion from Douglas Nichols.

00:22:18.340 --> 00:22:19.020
Thanks, Douglas.

00:22:19.020 --> 00:22:21.780
Best of the web development with Python.

00:22:21.780 --> 00:22:22.660
So we've seen...

00:22:22.660 --> 00:22:24.300
I would put Parler not in that list.

00:22:24.300 --> 00:22:24.740
Yeah.

00:22:24.740 --> 00:22:30.060
So we've seen best of lists like this before.

00:22:30.060 --> 00:22:31.680
I'm kind of a fan of them.

00:22:31.680 --> 00:22:32.240
Yeah.

00:22:32.340 --> 00:22:36.960
But one of the things I liked about this is the icons are nice.

00:22:36.960 --> 00:22:45.380
So there's a whole bunch of different icons that are used to help, you know, you can see the likes or the lows and stuff of different projects.

00:22:45.380 --> 00:22:46.960
And then there's icons for...

00:22:46.960 --> 00:22:49.620
You can search for Flask projects or things like that.

00:22:49.620 --> 00:22:50.100
That's nice.

00:22:50.500 --> 00:22:53.320
But it's a pretty big comprehensive list.

00:22:53.320 --> 00:23:02.940
We've got web frameworks, HTTP clients, servers, authorization tools, URL utilities, OpenAPI, GraphQL, which is nice to see.

00:23:02.940 --> 00:23:09.120
There's even web testing and markdown listed, how to access third-party APIs.

00:23:09.120 --> 00:23:14.740
But then near the end, I really liked seeing there's a bunch of utilities sections.

00:23:14.740 --> 00:23:20.320
So there's Flask utilities and FastAPI and Pyramid and Django utilities, which are really neat.

00:23:20.580 --> 00:23:26.480
And what I really was pleased to see was that even though FastAPI is, what, a couple years old now?

00:23:26.480 --> 00:23:39.200
There's a whole bunch of FastAPI projects that are there to make FastAPI easier, like using SQLAlchemy or, you know, coming up with a contributions thing or...

00:23:39.200 --> 00:23:39.860
Yeah, fantastic.

00:23:39.860 --> 00:23:43.040
...different React, how to use React with it, things like that.

00:23:43.040 --> 00:23:43.260
Yeah.

00:23:43.260 --> 00:23:44.120
So, yeah.

00:23:44.120 --> 00:23:50.840
Nice if you're trying to check out, want to look at different tools that are available for web development with Python.

00:23:50.840 --> 00:23:52.780
This might be a good place to peruse.

00:23:52.780 --> 00:23:59.060
I feel like that's one of the big challenges in general, you know, with people coming into Python or getting into a new framework.

00:23:59.060 --> 00:24:02.040
It's like there's 500 libraries to do a thing.

00:24:02.040 --> 00:24:03.080
Yes.

00:24:03.080 --> 00:24:04.280
Which one should I use?

00:24:04.280 --> 00:24:05.480
Not, can I find a library?

00:24:05.480 --> 00:24:06.500
But there's too many, right?

00:24:06.500 --> 00:24:06.960
Yeah.

00:24:06.960 --> 00:24:07.480
Yeah.

00:24:07.480 --> 00:24:08.800
So do you have a suggestion for that?

00:24:09.040 --> 00:24:11.720
Well, I think these awesome lists are super good, right?

00:24:11.720 --> 00:24:11.880
Yeah.

00:24:11.880 --> 00:24:13.760
Because they're somewhat vetted and whatnot.

00:24:13.760 --> 00:24:15.640
I recommend.

00:24:15.640 --> 00:24:19.120
So, like, for instance, if I was building a...

00:24:19.120 --> 00:24:20.280
Well, it's harder now.

00:24:20.280 --> 00:24:24.960
But if I was building something new with a web development or web interface or something, and I didn't have...

00:24:24.960 --> 00:24:27.300
Like, which framework to pick is, like, one of the starter things.

00:24:27.300 --> 00:24:27.380
Yeah.

00:24:27.380 --> 00:24:31.080
It's the people I have around me as resources.

00:24:31.080 --> 00:24:38.880
So I know that you know about Pyramid, but you're also barely knowledgeable about FastAPI.

00:24:38.880 --> 00:24:39.020
Yeah.

00:24:39.020 --> 00:24:44.740
And I know some people that are Django-friendly and know quite a bit about Django.

00:24:44.740 --> 00:24:53.380
So if you've got a couple of friends that already know one of these big hitters, I would go with that so that you can ask them questions.

00:24:53.740 --> 00:24:58.200
Well, maybe even you don't pick the same thing, but you could ask, like, you chose this one.

00:24:58.200 --> 00:24:58.820
Tell me.

00:24:58.820 --> 00:24:59.840
You looked at a lot of the other ones.

00:24:59.840 --> 00:25:00.760
Why did you pick that?

00:25:00.760 --> 00:25:01.140
Yeah.

00:25:01.140 --> 00:25:01.800
Oh, yeah.

00:25:01.800 --> 00:25:02.280
Yeah.

00:25:02.280 --> 00:25:02.880
That's a good idea.

00:25:02.880 --> 00:25:03.600
Yeah, for sure.

00:25:03.600 --> 00:25:05.520
Like, maybe FastAPI makes sense for me.

00:25:05.520 --> 00:25:06.340
It doesn't make sense for you.

00:25:06.340 --> 00:25:09.600
But you can then see why it made sense for me and not for you or whatever.

00:25:09.600 --> 00:25:10.020
Yeah.

00:25:10.020 --> 00:25:10.440
Yeah.

00:25:10.640 --> 00:25:11.000
Absolutely.

00:25:11.000 --> 00:25:11.740
All right.

00:25:11.740 --> 00:25:12.460
All right.

00:25:12.460 --> 00:25:13.460
I up now?

00:25:13.460 --> 00:25:14.480
Yeah, you're up.

00:25:14.480 --> 00:25:19.340
So Mr. Shaw being in the audience here was a bit of a surprise.

00:25:19.560 --> 00:25:24.340
One of the things I wanted to talk about is, I'm going to butcher this.

00:25:24.340 --> 00:25:25.260
I apologize.

00:25:25.260 --> 00:25:26.600
Pigeon.

00:25:26.600 --> 00:25:27.240
Pigeon.

00:25:27.240 --> 00:25:28.320
I think it's Pigeon.

00:25:28.320 --> 00:25:29.080
Pigeon.

00:25:29.080 --> 00:25:29.880
Oh, that's you.

00:25:29.880 --> 00:25:30.800
Oh, my goodness.

00:25:30.800 --> 00:25:31.540
Okay.

00:25:31.540 --> 00:25:32.000
Yes.

00:25:32.000 --> 00:25:33.320
What a wonderful name.

00:25:33.320 --> 00:25:38.260
And I've been fascinated by this.

00:25:38.260 --> 00:25:46.440
So what Pigeon is, this feels so awkward to talk about somebody else's project when they're

00:25:46.440 --> 00:25:47.120
in the audience here.

00:25:47.120 --> 00:25:47.640
That's it.

00:25:47.640 --> 00:25:49.420
It's a legit extension of CPython.

00:25:49.420 --> 00:25:53.900
That compiles Python code using the .NET 5 CLR.

00:25:53.900 --> 00:26:02.000
And what's been fascinating to me about this is this is like a whole area of software that

00:26:02.000 --> 00:26:04.280
I have absolutely no experience with.

00:26:04.280 --> 00:26:11.200
Like, I know nothing about, but I've been following what Anthony's been talking about on Twitter

00:26:11.200 --> 00:26:11.860
about it.

00:26:11.860 --> 00:26:20.660
And he's been explaining what he's doing along the way in these Twitter-sized increments that

00:26:20.660 --> 00:26:24.400
I feel like I'm able to follow along with the intent.

00:26:24.440 --> 00:26:26.980
And I found this project absolutely fascinating.

00:26:26.980 --> 00:26:31.160
And I'm seeing the rates of improvement over time.

00:26:31.160 --> 00:26:32.720
And I've just been absolutely blown away.

00:26:32.720 --> 00:26:37.980
And so I think this has been absolutely amazing.

00:26:37.980 --> 00:26:39.020
And I really hope that...

00:26:39.020 --> 00:26:40.440
I'm really curious.

00:26:40.840 --> 00:26:45.900
So one of the benchmarks that Anthony's been using is his own Python implementation of the

00:26:45.900 --> 00:26:51.180
end body problem, which is sort of funny that's come up because I've been wanting to do an

00:26:51.180 --> 00:26:54.480
end body plotting example in PyQD graph.

00:26:54.740 --> 00:26:59.560
So now, of course, this has been sort of on my to-do for some time.

00:26:59.560 --> 00:27:05.340
So now I'm curious if I should even attempt to, or if it's even remotely possible to try and

00:27:05.340 --> 00:27:07.840
integrate those functionalities together.

00:27:07.840 --> 00:27:08.320
Yeah.

00:27:08.320 --> 00:27:09.360
That's cool.

00:27:09.360 --> 00:27:11.340
And go ahead.

00:27:11.340 --> 00:27:12.140
No, no, go ahead.

00:27:12.140 --> 00:27:12.760
Oh, sorry.

00:27:12.760 --> 00:27:15.140
The other things that I've...

00:27:15.140 --> 00:27:16.080
This is...

00:27:16.080 --> 00:27:22.920
The other thing that I've recently used for some extension or made use of, but is not particularly

00:27:22.920 --> 00:27:31.360
new, is the NumPy's underscore or dunder array function functionality, which is specified

00:27:31.360 --> 00:27:32.220
in nep18.

00:27:32.220 --> 00:27:42.820
And what that allows for is using NumPy methods on not necessarily NumPy arrays.

00:27:42.820 --> 00:27:49.880
So, for example, with Kupy, you can use the NumPy methods that would operate on an ND array,

00:27:49.880 --> 00:27:52.900
but use it on a Kupy array.

00:27:53.660 --> 00:27:55.720
And this is not limited to Kupy.

00:27:55.720 --> 00:27:59.700
There's other libraries that offer this functionality, too.

00:27:59.700 --> 00:28:08.140
But this makes it so much easier to integrate various libraries together with really having

00:28:08.140 --> 00:28:12.020
minimal code impact and having near-identical APIs.

00:28:12.020 --> 00:28:18.440
And earlier, I was talking about the pull request for giving Kupy support into PyQD Graph and

00:28:18.440 --> 00:28:23.700
this functionality, which was implemented in Kupy, but it's made the integration so much easier.

00:28:23.700 --> 00:28:27.000
Nice, because you guys are already implemented with NumPy, and it's just like, we're just going

00:28:27.000 --> 00:28:28.140
to go through this layer, basically.

00:28:28.140 --> 00:28:28.820
Yeah.

00:28:29.160 --> 00:28:33.520
I mean, there's some other gotchas that you have to have with handing stuff off to the

00:28:33.520 --> 00:28:34.520
GPU and stuff like that.

00:28:34.520 --> 00:28:35.960
But yeah, no, that's...

00:28:35.960 --> 00:28:41.920
But the actual size of the diff was not that big, you know, for what you would think.

00:28:41.920 --> 00:28:45.160
Well, and you think what it means to run on a CPU or run on a GPU.

00:28:45.160 --> 00:28:53.120
Like, that's a very different whole set of computing and assumptions and environments and so on.

00:28:53.120 --> 00:28:56.260
And to make that a very small merge is crazy.

00:28:56.680 --> 00:28:57.280
Right.

00:28:57.280 --> 00:28:57.660
Yeah.

00:28:57.660 --> 00:29:00.020
No, it's fantastic.

00:29:00.020 --> 00:29:00.540
Yeah.

00:29:00.540 --> 00:29:02.140
As I said, it's nothing new.

00:29:02.140 --> 00:29:03.720
This functionality has existed.

00:29:03.720 --> 00:29:10.300
It's been enabled by default in NumPy since version 1.17, which I believe is almost coming

00:29:10.300 --> 00:29:11.620
up on two years old now.

00:29:11.620 --> 00:29:16.860
But this is the first time I've made use of this functionality or been impacted by this

00:29:16.860 --> 00:29:17.800
functionality directly.

00:29:17.800 --> 00:29:19.660
And I'm so appreciative of it.

00:29:19.660 --> 00:29:20.040
Yeah.

00:29:20.040 --> 00:29:20.700
Fantastic.

00:29:20.700 --> 00:29:22.120
And that's super cool.

00:29:22.120 --> 00:29:26.620
I've not really found a reason for me to work with Kupy or anything like that.

00:29:26.620 --> 00:29:31.120
But I'm just really excited about the possibilities for people for who it does matter, you know?

00:29:31.120 --> 00:29:31.620
Yeah.

00:29:31.620 --> 00:29:31.940
Absolutely.

00:29:31.940 --> 00:29:33.040
Yeah.

00:29:33.040 --> 00:29:37.080
I actually, I always, every time I hear about it, I write a note down and say, oh, I got to

00:29:37.080 --> 00:29:37.680
check this out.

00:29:37.680 --> 00:29:38.200
Looks neat.

00:29:38.200 --> 00:29:40.140
Absolutely.

00:29:40.140 --> 00:29:41.200
Well, there we go.

00:29:41.200 --> 00:29:43.360
There's our six, six items.

00:29:43.360 --> 00:29:45.740
Do you have anything extra for us, Michael?

00:29:45.740 --> 00:29:48.520
This all must be an extra, extra, extra, extra.

00:29:48.520 --> 00:29:49.400
You're all about it.

00:29:49.400 --> 00:29:51.460
So I'm just going to throw a few things out really quick.

00:29:52.220 --> 00:29:57.360
One, I got my new M1 not long ago and actually had to send in my old laptop.

00:29:57.360 --> 00:29:58.580
Its battery was dying.

00:29:58.580 --> 00:30:00.420
Its motherboard is dying, all sorts of things.

00:30:00.420 --> 00:30:02.900
So I had to put it in a box and send it away.

00:30:02.900 --> 00:30:05.520
I'm like, I don't really want to put my data in here.

00:30:05.520 --> 00:30:06.880
So I just formatted that as well.

00:30:06.880 --> 00:30:08.120
So now I have two brand new computers.

00:30:08.120 --> 00:30:13.120
I'm trying to think like, all right, what kind of getting bugged by how much spying, monitoring,

00:30:13.120 --> 00:30:15.320
observation, all these different companies are doing.

00:30:15.400 --> 00:30:20.060
So I've started running just Firefox, but also, you know, when things, a lot of times,

00:30:20.060 --> 00:30:22.760
like for example, StreamYard, I can't use a green screen on Firefox.

00:30:22.760 --> 00:30:24.000
I have to use Chrome, it says.

00:30:24.000 --> 00:30:27.320
I'm like, I don't really want to use Chrome, but I want a green screen.

00:30:27.320 --> 00:30:28.000
So here I am.

00:30:28.000 --> 00:30:29.620
So I've started using Brave.

00:30:29.620 --> 00:30:33.340
Whenever something says I have to have Chrome, I started using Brave, which is a more privacy

00:30:33.340 --> 00:30:34.680
focused browser.

00:30:34.680 --> 00:30:35.760
So I thought that was interesting.

00:30:35.760 --> 00:30:41.380
And just turning on a VPN like all the time just to limit people observing, not that I really

00:30:41.380 --> 00:30:42.880
need to keep anything super secret.

00:30:43.300 --> 00:30:48.300
Two conferences are coming out with calls for proposals that are due quite soon.

00:30:48.300 --> 00:30:52.760
So the Python web conf has got some calls for proposal.

00:30:52.760 --> 00:30:56.500
The conference is actually March 24th.

00:30:56.500 --> 00:30:59.360
That order is not quite right, is it?

00:30:59.360 --> 00:31:01.960
22nd to 26th.

00:31:01.960 --> 00:31:06.520
If you look at their site, like the days that it's on are like sort of not in order.

00:31:06.520 --> 00:31:09.740
Anyway, end of March, there's a cool online conference.

00:31:09.740 --> 00:31:13.280
They did this last year, Six Feet Up did, and they're doing it again.

00:31:13.280 --> 00:31:15.060
And this year, I'm actually speaking here.

00:31:15.060 --> 00:31:16.000
Brian, are you speaking there?

00:31:16.000 --> 00:31:17.140
The web conf?

00:31:17.140 --> 00:31:17.520
Yeah.

00:31:17.520 --> 00:31:17.980
No.

00:31:17.980 --> 00:31:19.960
Well, there's a call for paper, so you could be.

00:31:19.960 --> 00:31:21.060
You too, Augie.

00:31:21.060 --> 00:31:22.380
Yeah.

00:31:22.380 --> 00:31:24.560
And I think they expanded it out to be like five days or something.

00:31:24.560 --> 00:31:26.500
So there'll be a lot of content, which is very cool.

00:31:26.500 --> 00:31:30.060
So I'll be giving a talk on Python memory deep dive there, I believe.

00:31:30.060 --> 00:31:32.580
And then the big one, PyCon.

00:31:32.580 --> 00:31:38.360
PyCon is virtual again this year, but the call for proposals has gone out and is due February

00:31:38.360 --> 00:31:38.980
12th.

00:31:38.980 --> 00:31:42.920
So if you want to be part of PyCon, get out there and send something in.

00:31:42.920 --> 00:31:44.220
Are you going to submit something?

00:31:44.220 --> 00:31:45.360
I will probably do it.

00:31:45.360 --> 00:31:45.580
Yeah.

00:31:45.580 --> 00:31:47.780
It means I got more work to do.

00:31:47.780 --> 00:31:50.040
But yeah, I think I'll do it.

00:31:50.040 --> 00:31:50.940
You got any plans?

00:31:50.940 --> 00:31:52.140
I'll probably submit something.

00:31:52.980 --> 00:31:56.040
Maybe three, four, five, six, seven, eight, nine, ten proposals.

00:31:56.040 --> 00:31:59.360
The more you submit, the better chances you got.

00:31:59.360 --> 00:32:00.800
Augie, you can submit to others.

00:32:00.800 --> 00:32:07.480
There's talk amongst us, PyQT graph maintainers, about doing a tutorial session at SciPy.

00:32:07.480 --> 00:32:13.660
So I might, I know that's not listed here, but we're considering doing that, which SciPy

00:32:13.660 --> 00:32:14.260
is also virtual this year.

00:32:14.260 --> 00:32:15.180
That makes a lot of sense.

00:32:15.180 --> 00:32:15.940
Yeah, that's cool.

00:32:15.940 --> 00:32:16.440
Awesome.

00:32:16.520 --> 00:32:21.060
Then final, hear, hear, hear all about it, extra stuff is Apple is launching a racial

00:32:21.060 --> 00:32:24.840
equity and justice initiative, which I think is pretty cool.

00:32:24.840 --> 00:32:30.500
Basically, they're setting up centers to teach programming and other entrepreneurship skills

00:32:30.500 --> 00:32:32.660
in underserved communities.

00:32:32.660 --> 00:32:33.160
Right.

00:32:33.160 --> 00:32:36.860
And I know there's, again, more, a lot of political stuff around all this, but to me, I would just

00:32:36.860 --> 00:32:40.660
love to be in a world where I look around the community and it looks representative of

00:32:40.660 --> 00:32:41.000
everybody.

00:32:41.000 --> 00:32:41.320
Right.

00:32:41.320 --> 00:32:43.200
I think people feel included.

00:32:43.200 --> 00:32:44.620
Like tech is such a wonderful space.

00:32:44.620 --> 00:32:47.180
I think this is a cool initiative.

00:32:47.180 --> 00:32:50.460
Obviously it could be, hopefully they deliver it in the right way.

00:32:50.460 --> 00:32:52.760
It's not just like, we're going to teach everyone how to build iPhone apps.

00:32:52.760 --> 00:32:53.880
That's what the world is.

00:32:53.880 --> 00:32:54.120
Right.

00:32:54.120 --> 00:32:56.400
You know, it's a more broad sort of conversation.

00:32:56.400 --> 00:32:58.100
I could go, go any which way.

00:32:58.100 --> 00:32:59.840
And I, hopefully it's just a start.

00:32:59.840 --> 00:33:03.520
Like if you look, they're saying they're donating a hundred million dollars to this cause, which

00:33:03.520 --> 00:33:06.940
is a lot of money, but it's also only eight hours of profit to Apple.

00:33:06.940 --> 00:33:09.320
So yeah, it's got room to grow, I suppose.

00:33:09.320 --> 00:33:12.260
Anyway, I just want to give a shout out to that as well.

00:33:12.260 --> 00:33:13.120
That seemed pretty cool.

00:33:13.120 --> 00:33:13.720
Hi Brian.

00:33:13.720 --> 00:33:14.360
How about you?

00:33:14.360 --> 00:33:15.280
More conference stuff?

00:33:15.280 --> 00:33:19.780
Well, PyCascades is, actually, I don't remember when it is, but.

00:33:19.780 --> 00:33:20.600
February possibly.

00:33:20.600 --> 00:33:21.780
February probably.

00:33:21.780 --> 00:33:22.760
Yep.

00:33:22.760 --> 00:33:24.220
February 20th it starts.

00:33:24.220 --> 00:33:27.420
And there, there is, the schedule's up.

00:33:27.420 --> 00:33:30.220
So I wanted to announce the schedules there so you can check it out.

00:33:30.220 --> 00:33:34.040
There's still tickets available and you can see what's going to happen.

00:33:34.360 --> 00:33:40.640
I really had, I had fun at the in-person PyCascades and I think they did a good job for the online

00:33:40.640 --> 00:33:41.920
one in 2020.

00:33:41.920 --> 00:33:43.900
So, and we're going to be there.

00:33:43.900 --> 00:33:44.440
Yeah, we are.

00:33:44.440 --> 00:33:45.140
We're on a panel.

00:33:45.140 --> 00:33:45.700
Yeah.

00:33:45.700 --> 00:33:46.620
Along with Ollie Spittle.

00:33:46.620 --> 00:33:47.120
Yeah.

00:33:47.120 --> 00:33:47.840
Should be fun.

00:33:48.080 --> 00:33:49.120
But there's, definitely be fun.

00:33:49.120 --> 00:33:50.280
About podcasting.

00:33:50.360 --> 00:33:55.420
There's like another panel about writing technical books that looks good.

00:33:55.420 --> 00:33:58.060
There's a bunch of cool talks that I'm looking forward to seeing.

00:33:58.060 --> 00:33:58.500
Yeah.

00:33:58.500 --> 00:33:58.920
Me too.

00:33:58.920 --> 00:33:59.500
It looks great.

00:33:59.500 --> 00:34:03.100
I love all these online conferences that it's pretty accessible to everybody.

00:34:03.620 --> 00:34:06.680
Last year, if we would announce this, we'd be like, oh, well, I'm not in Portland, so it

00:34:06.680 --> 00:34:07.400
doesn't matter to me.

00:34:07.400 --> 00:34:07.780
Yeah.

00:34:07.780 --> 00:34:07.960
Right.

00:34:07.960 --> 00:34:13.200
But, Augie, I know you got some stuff to shout out real quick, but also a quick question,

00:34:13.200 --> 00:34:15.000
a follow-up from Anthony.

00:34:15.000 --> 00:34:20.760
NumPy uses AVX extensions for native matrix multiplication on supported CPUs.

00:34:20.760 --> 00:34:24.100
It'd be interesting if that extension supported the same for non-Numpy arrays.

00:34:24.100 --> 00:34:24.680
Thoughts?

00:34:24.680 --> 00:34:25.080
Ideas?

00:34:25.080 --> 00:34:25.620
Yeah.

00:34:25.620 --> 00:34:31.860
I, the, yes, I'm sure you can use those extensions on, I mean, NumPy doesn't have a monopoly

00:34:31.860 --> 00:34:37.480
on AVX extensions, you know, it just needs, whatever library you use, I think you just

00:34:37.480 --> 00:34:44.680
need to, or would need to be compiled with, the Intel MKL BLAS extension, which is,

00:34:44.680 --> 00:34:48.400
um, goes into build systems, which is way over my head.

00:34:48.400 --> 00:34:55.460
and, I, yeah, I used to live in the C++ world and whatnot, but I'm far from that

00:34:55.460 --> 00:34:57.840
world that you and Anthony are inhabiting these days.

00:34:57.840 --> 00:34:58.920
Right.

00:34:58.920 --> 00:35:01.800
So, yeah, I'm, I'm, so yeah, I'm short.

00:35:01.800 --> 00:35:02.320
I'm not sure.

00:35:02.320 --> 00:35:06.500
but in terms of the extras, a couple of things I wanted to bring attention to is,

00:35:06.500 --> 00:35:11.180
uh, I've been loving the Anthony explains video series and these are generated by,

00:35:11.180 --> 00:35:13.440
I'm probably going to mispronounce his last name.

00:35:13.440 --> 00:35:14.280
Anthony style.

00:35:14.280 --> 00:35:18.660
He's, he's been a guest on, can't remember if he's been a guest here, but I think he's

00:35:18.660 --> 00:35:20.220
been on guest on talk by thong to me.

00:35:20.220 --> 00:35:21.760
he maintains pre-commit.

00:35:21.760 --> 00:35:22.760
He's a pie test developer.

00:35:22.760 --> 00:35:24.560
And, Anthony Sotili.

00:35:24.560 --> 00:35:25.420
Sotili.

00:35:25.800 --> 00:35:26.080
Yeah.

00:35:26.080 --> 00:35:32.140
And, and I've been absolutely loving his Anthony explains, playlist series.

00:35:32.140 --> 00:35:37.020
the other resource that I've recently found myself having to make use of is learn X and Y

00:35:37.020 --> 00:35:37.420
minutes.

00:35:37.420 --> 00:35:42.680
I've, you know, sometimes I have to write something in a tech stack or in a language I

00:35:42.680 --> 00:35:44.480
have absolutely no familiarity with.

00:35:44.760 --> 00:35:50.500
and so that's, that resource has been absolutely amazing, for, you know,

00:35:50.500 --> 00:35:52.780
the five minute overview, right on the real.

00:35:52.780 --> 00:35:53.020
Yeah.

00:35:53.020 --> 00:35:53.300
That's cool.

00:35:53.300 --> 00:35:57.780
And then the other one is, this book I've been reading, working in public.

00:35:57.780 --> 00:36:03.320
And, I think, Guido plugged it a while ago on, on his Twitter feed, but, it's,

00:36:03.320 --> 00:36:06.120
uh, talks, talks about maintaining open source projects.

00:36:06.120 --> 00:36:12.080
and some of the issues arising that I think, it's, you know, I'm still not done

00:36:12.080 --> 00:36:16.580
with it, but I think it's both helpful for, a maintainer point of view to, you

00:36:16.580 --> 00:36:21.280
know, for a sanity checking, your experiences might not, you know, you're not, might not

00:36:21.280 --> 00:36:22.100
be as isolated.

00:36:22.100 --> 00:36:27.000
And I think it's helpful for new, open source contributors to see what, what things

00:36:27.000 --> 00:36:29.160
might look like from the maintainer's perspective as well.

00:36:29.160 --> 00:36:30.500
I've heard really good things.

00:36:30.500 --> 00:36:30.800
Yeah.

00:36:30.800 --> 00:36:31.360
Have you read it, Brian?

00:36:31.360 --> 00:36:36.320
I, it has an audio book version, so I listened to it and it, you wouldn't think

00:36:36.320 --> 00:36:39.400
like a book on open source would be good audio, but it was great.

00:36:39.400 --> 00:36:40.120
Yeah.

00:36:40.120 --> 00:36:40.600
Fantastic.

00:36:40.600 --> 00:36:41.300
Awesome.

00:36:41.300 --> 00:36:41.680
All right.

00:36:41.720 --> 00:36:43.320
Well, Brian, should we do a joke?

00:36:43.320 --> 00:36:44.420
Yes, we should.

00:36:44.420 --> 00:36:44.820
All right.

00:36:44.820 --> 00:36:46.960
So I put two jokes into the show notes.

00:36:46.960 --> 00:36:51.620
One of them is a rap song, which I know Brian is especially fond of.

00:36:51.620 --> 00:36:55.000
It's a rap song about working at, the help desk.

00:36:55.000 --> 00:37:00.160
So if you, you're the help desk for your company or, or I guess public support as well, it's

00:37:00.160 --> 00:37:02.120
by dual call or called here to help.

00:37:02.120 --> 00:37:03.680
And man, it is so funny.

00:37:03.680 --> 00:37:07.220
It's a video, song, you know, on YouTube.

00:37:07.220 --> 00:37:10.300
So it doesn't really make sense to cover it, but I thought I'd throw it in there as a pre,

00:37:10.300 --> 00:37:13.320
uh, pre-recommendation of what I'm going to actually talk about.

00:37:13.320 --> 00:37:14.060
Augie, what do you think?

00:37:14.060 --> 00:37:14.640
I see you smiling.

00:37:14.640 --> 00:37:19.540
Oh, I have to say that that song was just a jam after jam after jam.

00:37:19.540 --> 00:37:20.400
It was, it is.

00:37:21.520 --> 00:37:23.500
I need you to click your right mouse button.

00:37:23.500 --> 00:37:25.620
I only have one mouth.

00:37:25.620 --> 00:37:31.300
So here's, here's the actual Python related, a joke, for us.

00:37:31.300 --> 00:37:33.840
and it's a tech support, thing.

00:37:33.840 --> 00:37:36.120
Brian, why don't you be the person that needs some help?

00:37:36.120 --> 00:37:36.520
Okay.

00:37:36.520 --> 00:37:37.060
Hi.

00:37:37.060 --> 00:37:38.440
This is a chat by the way.

00:37:38.440 --> 00:37:39.520
tech support.

00:37:39.520 --> 00:37:40.380
How may I help you?

00:37:40.380 --> 00:37:41.580
Hi, I've got a problem.

00:37:41.580 --> 00:37:44.280
Your program is telling me to get a pet snake.

00:37:44.280 --> 00:37:45.200
I don't want one.

00:37:45.200 --> 00:37:45.780
Excuse me.

00:37:46.180 --> 00:37:49.200
It's giving me a message telling me I need a snake to run it.

00:37:49.200 --> 00:37:49.760
Okay.

00:37:49.760 --> 00:37:51.940
read the message to me, please.

00:37:51.940 --> 00:37:54.300
Python required to run the script.

00:37:54.300 --> 00:37:56.160
That's terrible.

00:37:56.160 --> 00:37:57.160
That is terrible.

00:37:57.160 --> 00:37:58.560
Terribly good is what it is.

00:37:58.560 --> 00:37:59.000
Yeah.

00:37:59.260 --> 00:38:03.400
so, Hey, I wanted to, add some humor as well.

00:38:03.400 --> 00:38:03.660
All right.

00:38:03.660 --> 00:38:03.900
Do it.

00:38:03.900 --> 00:38:09.800
So I saw this on Twitter and it was a quote from, from, how do we, I don't know how to

00:38:09.800 --> 00:38:10.480
pronounce that name.

00:38:10.480 --> 00:38:12.420
Byron, Brian, Byron.

00:38:12.420 --> 00:38:12.960
I don't know.

00:38:12.960 --> 00:38:14.640
A quote from Byron Hobart.

00:38:14.640 --> 00:38:20.120
Running a successful open source project is just goodwill hunting in reverse where you start

00:38:20.120 --> 00:38:24.140
out as a respected genius and you end up being a janitor who gets into fights.

00:38:24.140 --> 00:38:26.360
Yeah, that's awesome.

00:38:26.360 --> 00:38:28.720
And it goes right along with the book recommendation as well.

00:38:29.060 --> 00:38:32.380
Well, that, that's a good way to put a cap in.

00:38:32.380 --> 00:38:33.000
Yep.

00:38:33.000 --> 00:38:33.600
All right.

00:38:33.600 --> 00:38:34.400
Well, thank you, Brian.

00:38:34.400 --> 00:38:34.980
Thank you.

00:38:34.980 --> 00:38:35.340
Thank you, Augie.

00:38:35.340 --> 00:38:36.660
Thank you for having me.