WEBVTT

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

00:00:06.140 --> 00:00:11.100
This is episode 318, recorded January 10th, 2023.

00:00:11.100 --> 00:00:12.320
I'm Michael Kennedy.

00:00:12.320 --> 00:00:13.460
And I'm Brian Okken.

00:00:13.460 --> 00:00:17.580
And this episode is brought to you by Microsoft for Startups Founders Hub.

00:00:17.580 --> 00:00:19.960
Thanks to Microsoft for again supporting the show.

00:00:19.960 --> 00:00:25.200
And I, Brian, just want to let people know real quick at the beginning here that they should join us here on YouTube.

00:00:25.200 --> 00:00:27.220
Like right now, live if they want.

00:00:27.340 --> 00:00:32.940
They could go to pythonbytes.fm/stream slash live or just go to the website and click live stream at the top.

00:00:32.940 --> 00:00:37.080
We typically record on Tuesdays at 11 a.m. at Pacific Time.

00:00:37.080 --> 00:00:39.560
And you can also see the older video versions.

00:00:39.560 --> 00:00:41.060
People want to find them there.

00:00:41.060 --> 00:00:42.900
So it's always nice to have people in the audience.

00:00:42.900 --> 00:00:46.880
And we also put information in there about future episodes.

00:00:46.880 --> 00:00:49.780
So if for some reason it changes, we keep that up to date.

00:00:49.780 --> 00:00:50.260
Or you do.

00:00:50.260 --> 00:00:50.440
Yeah, exactly.

00:00:50.440 --> 00:00:55.420
Usually what I'll do is I'll just schedule whatever time we're going to record a week in advance.

00:00:55.600 --> 00:00:59.620
And YouTube will notify you if you smash the bell, you know, that sort of thing.

00:00:59.620 --> 00:01:00.580
Smash the bell.

00:01:00.580 --> 00:01:00.860
Yeah.

00:01:00.860 --> 00:01:02.560
What do you got to kick us off with today?

00:01:02.560 --> 00:01:06.320
Well, I want to start with something like right out off the presses.

00:01:06.320 --> 00:01:08.960
So we have 703.

00:01:08.960 --> 00:01:11.420
This was suggested by Will Shanks.

00:01:11.420 --> 00:01:13.980
And the author is Sam Gross.

00:01:14.300 --> 00:01:19.200
And it really was the PEP was created just yesterday, January 9th.

00:01:19.200 --> 00:01:20.220
Or at least.

00:01:20.220 --> 00:01:20.640
Yeah.

00:01:20.640 --> 00:01:21.560
So that's pretty cool.

00:01:21.560 --> 00:01:23.340
So very recently.

00:01:23.340 --> 00:01:24.380
That new PEP smell.

00:01:24.380 --> 00:01:25.000
Yeah.

00:01:25.000 --> 00:01:26.500
It has that new PEP smell.

00:01:26.500 --> 00:01:36.860
And what also one of the things that the PEP thing, peps.python.org has a like a dark mode

00:01:36.860 --> 00:01:37.760
and light mode thing.

00:01:37.820 --> 00:01:38.920
I didn't know that.

00:01:38.920 --> 00:01:39.860
I was playing with that today.

00:01:39.860 --> 00:01:40.240
Anyway.

00:01:40.240 --> 00:01:45.780
So the PEP 703 is making the gil optional in CPython.

00:01:45.780 --> 00:01:48.700
I knew that there was talk about this.

00:01:48.700 --> 00:01:50.540
I heard Guido talking about it.

00:01:50.540 --> 00:01:52.600
Possibly going in 312.

00:01:52.600 --> 00:01:55.160
But I didn't know if it really was.

00:01:55.160 --> 00:01:55.760
And it does.

00:01:55.760 --> 00:01:57.260
I mean, it's still in draft stage.

00:01:57.260 --> 00:01:58.980
So it's not it's not promised yet.

00:01:59.100 --> 00:02:04.000
But it's it's targeting 312, which is the one that's being worked on right now.

00:02:04.000 --> 00:02:04.720
It's pretty exciting.

00:02:04.720 --> 00:02:08.640
So, yeah, a couple of things that jump out from reading just the title.

00:02:08.640 --> 00:02:10.540
Optional, not removal.

00:02:10.540 --> 00:02:11.100
Yeah.

00:02:11.100 --> 00:02:13.460
OK, that's interesting.

00:02:13.460 --> 00:02:14.100
I have.

00:02:14.100 --> 00:02:16.240
Like you said, it's still still brand new.

00:02:16.240 --> 00:02:20.920
So I haven't got a chance to research this a lot yet to understand the nuances of what that is.

00:02:20.920 --> 00:02:26.360
But, you know, a lot of the prior talk, we had the Gilectomy and other things like that.

00:02:26.780 --> 00:02:32.800
Eric Snow's subinterpreters, all of those were about how do we remove the gil or effectively remove it.

00:02:32.800 --> 00:02:36.240
And this is like, well, well, not really.

00:02:36.240 --> 00:02:39.500
It is not really optionally selectable while you're running.

00:02:39.500 --> 00:02:42.340
It's a the option is a compile time flag.

00:02:42.340 --> 00:02:49.460
So, yeah, this is and we probably should link to that that that really long interview with Guido.

00:02:49.460 --> 00:02:54.740
But there's a there's an interview with Guido Van Rossum that's that in it,

00:02:54.860 --> 00:02:57.160
talks about some of the guild challenges.

00:02:57.160 --> 00:03:00.180
And it's an interesting bit conversation anyway.

00:03:00.180 --> 00:03:06.980
So there's a flag, a --without Gil flag that's going to be added for compiling CPython.

00:03:06.980 --> 00:03:12.720
So and when I first heard this, I'm like, well, I don't really want to compile CPython.

00:03:12.720 --> 00:03:17.460
I'm I mean, I could, but I'm not that kind of guy that likes to do that in their free time.

00:03:18.100 --> 00:03:19.300
So we have good news.

00:03:19.300 --> 00:03:20.900
I'll share with that with you later.

00:03:20.900 --> 00:03:34.080
But the idea around this is in there's a lot of a lot of interest because there's a lot more scientific computing and machine learning and all this sort of stuff that's running on Python.

00:03:34.080 --> 00:03:38.200
Now that wasn't before or just I don't know what it was doing before.

00:03:38.200 --> 00:03:40.740
But there's a lot of there's a lot of interest in this.

00:03:40.740 --> 00:03:47.140
And scientific computing especially has a lot of concurrency that you can speed things up dramatically.

00:03:47.140 --> 00:03:52.180
If you can run if you've got like these huge vectors that you can all compute at the same time.

00:03:52.180 --> 00:03:54.220
So there's there's ways around it.

00:03:54.220 --> 00:03:56.800
We have some really fast libraries that can do this.

00:03:56.800 --> 00:04:01.000
But these are like engineering feats that people have to do to make this all work.

00:04:01.000 --> 00:04:05.340
And they're usually in C API extensions and you and whatnot.

00:04:05.780 --> 00:04:13.900
So one of some of the motivation is that the there's a there's a lot of obstacles for concurrency because the GIL is in place.

00:04:13.900 --> 00:04:14.600
So what do we do?

00:04:14.600 --> 00:04:22.000
So the I'm going to jump to the distribution part, which I'm pretty excited about distribution.

00:04:22.000 --> 00:04:25.540
The distribution is going to be easier than I thought.

00:04:25.540 --> 00:04:27.740
So I thought people are going to have to build it themselves.

00:04:27.740 --> 00:04:30.280
It doesn't look like that's the case.

00:04:30.360 --> 00:04:40.160
It looks like Sam is going to work with Anaconda to distribute a without GIL version of Python together with compatible packages.

00:04:40.160 --> 00:04:42.400
And I imagine so this will take time.

00:04:42.400 --> 00:04:49.500
One of the things that's is going to be important is to get this out is like quickly so that people can start building packages.

00:04:49.500 --> 00:04:54.400
Because in one of the reasons why I'm glad this is like almost a different distribution.

00:04:54.400 --> 00:04:59.780
I know this is going to be a lot of work, but people can't really use it until the packages that.

00:05:00.120 --> 00:05:05.440
That like allow them to use it, you know, can are there straight pythons.

00:05:05.440 --> 00:05:13.100
The C layer might if you're integrating with C or something, it might assume that there's a GIL and not the safety it needs to do or something.

00:05:13.100 --> 00:05:13.660
Yeah, right.

00:05:13.660 --> 00:05:21.480
And even even if there's no changes that have to be made, they're going to be they're going to be have to these packages are going to have to be recompiled.

00:05:21.480 --> 00:05:25.580
But there probably are changes they have to make, but they're trying to keep it to a minimum.

00:05:25.580 --> 00:05:30.000
But anyway, they'll at least have to get recompiled and they'll be not binary compatible.

00:05:30.000 --> 00:05:31.560
With both versions of python.

00:05:31.560 --> 00:05:35.320
So we'll have this to python world for a little bit, but it's really targeted.

00:05:35.320 --> 00:05:38.660
And I think going through anaconda is a good way to do it.

00:05:38.660 --> 00:05:45.420
It's targeted to people developing these C API extensions so that they can start developing it.

00:05:45.420 --> 00:05:46.720
So that's pretty, pretty neat.

00:05:46.720 --> 00:05:54.260
And this collection of packages that already support the GIL lists python will grow over time.

00:05:54.260 --> 00:05:59.300
And I don't know, I'm okay with having that be coordinated through anaconda.

00:05:59.300 --> 00:06:00.120
It seems reasonable.

00:06:00.120 --> 00:06:00.780
Yeah.

00:06:01.160 --> 00:06:05.240
One of the things I loved about this article is it talked about some of the challenges.

00:06:05.240 --> 00:06:07.080
So zooming really fast.

00:06:07.080 --> 00:06:08.700
Apologies for people watching the video.

00:06:08.700 --> 00:06:19.480
But there's a lot of discussion around the motivation of all the lot of the difficulties of different types of parallelism that you are hard to express with with the GIL in place.

00:06:19.480 --> 00:06:24.000
And it's just an interesting, this part's an interesting read.

00:06:24.000 --> 00:06:27.700
There's effects on Python library usability.

00:06:27.700 --> 00:06:28.840
There's effects.

00:06:28.840 --> 00:06:35.820
You want to be able to GPU heavy workloads require multi-core processing to coordinate the whole thing together.

00:06:35.820 --> 00:06:41.400
There's a lot of stuff that we've done engineering wise to work around the GIL.

00:06:41.680 --> 00:06:47.240
And it's kind of exciting that this is, I didn't think, I actually didn't see this happening this quickly.

00:06:47.240 --> 00:06:48.620
So this is pretty exciting.

00:06:48.620 --> 00:06:50.360
Yeah, this came out of the blue for me too.

00:06:50.360 --> 00:06:55.980
The, one of the things that the discussion, oh cool, I found it.

00:06:55.980 --> 00:06:57.820
The, what's going to change?

00:06:57.820 --> 00:06:59.620
So I had this surprise to me.

00:06:59.620 --> 00:07:07.140
The surprise to me was that the, there's supposedly going to be relatively few changes to the public Python and C APIs.

00:07:07.440 --> 00:07:12.920
So this isn't like a moving from Python two to Python three, you have to rewrite your Python code.

00:07:12.920 --> 00:07:15.440
Hopefully you won't have to change your Python code at all.

00:07:15.440 --> 00:07:17.280
It's going to be some of these extensions.

00:07:17.280 --> 00:07:22.040
And these are, I mean, like the people writing numpy and things like that.

00:07:22.040 --> 00:07:31.760
Pandas, they might, they're probably going to have to do some changes and pillow and, and, you know, types or what, like pie torch and things like that.

00:07:31.760 --> 00:07:37.160
They really care about this and they're going to be working with it, but they, they're the ones that didn't want the GIL there.

00:07:37.220 --> 00:07:37.740
In the first place.

00:07:37.740 --> 00:07:40.160
So I think they're motivated to make these changes.

00:07:40.160 --> 00:07:41.740
It's pretty exciting, but okay.

00:07:41.740 --> 00:07:43.080
So what, what is changing?

00:07:43.080 --> 00:07:44.820
And a lot of the internals of CPython.

00:07:44.820 --> 00:07:53.560
So there's, and I think this is a fascinating thing just as a, like a computer science discussion of, of this is a big problem.

00:07:53.560 --> 00:07:54.600
What are the problems?

00:07:54.600 --> 00:07:57.560
Well, there's, and how do we, what are the changes to solve it?

00:07:57.560 --> 00:08:01.540
And there's reference counting and memory management, container thread safety.

00:08:01.540 --> 00:08:06.380
Like if you've got multiple, multiple threads using the same list, how do you deal with that?

00:08:06.380 --> 00:08:08.400
Locking and atomic APIs.

00:08:08.400 --> 00:08:11.060
And there's a great discussion in here on all those.

00:08:11.060 --> 00:08:18.400
So I really loved this just as a refresher of some of these CS topics and how they're still relevant in, in today's programming.

00:08:18.400 --> 00:08:19.420
So it's pretty cool.

00:08:19.420 --> 00:08:19.820
Yeah.

00:08:19.820 --> 00:08:20.320
Yeah.

00:08:20.320 --> 00:08:27.300
The container one's pretty interesting, especially with Python's extreme dependency upon dictionaries.

00:08:27.300 --> 00:08:27.940
Yes.

00:08:27.940 --> 00:08:30.720
Even being like the foundation of classes and stuff.

00:08:31.380 --> 00:08:35.400
The reference counting is the one that's always been held out as a holdup, right?

00:08:35.400 --> 00:08:41.740
Like, well, we have reference counting and that can be so fast because we don't have to do any locking or any thread safety around it.

00:08:41.740 --> 00:08:45.620
As soon as you remove the gill, all that stuff goes out the window.

00:08:45.620 --> 00:08:52.160
It's, it talks about a couple of building on, on one of the things that was done previously, which is pretty interesting.

00:08:52.160 --> 00:08:57.560
And, you know, Sam Gross behind this and a bunch of other folks have just put together a whole host.

00:08:57.740 --> 00:09:00.580
You know, a lot of this comes out of Cinder, I believe at Meta.

00:09:00.580 --> 00:09:03.760
There's a lot of small building blocks.

00:09:03.760 --> 00:09:05.920
This is not just like, well, here's the change, right?

00:09:05.920 --> 00:09:11.600
And one of the things that I saw in the reference counting section is immortal.

00:09:11.600 --> 00:09:13.040
I think it was immortalizing.

00:09:13.040 --> 00:09:13.960
Oh, yeah.

00:09:13.960 --> 00:09:14.660
Right.

00:09:14.660 --> 00:09:21.680
So one of the things was, can we make it so they basically, we're pretty sure that we don't want to ever remove these.

00:09:21.680 --> 00:09:27.420
So we're just going to take them out of the reference counting checks and just assume that they're going to be here for the life.

00:09:27.420 --> 00:09:28.360
Of the program.

00:09:28.360 --> 00:09:28.880
Yeah.

00:09:28.880 --> 00:09:33.380
Just for performance and memory caching and all that kind of stuff.

00:09:33.380 --> 00:09:39.920
However, you also don't have to lock something that you're not incrementing and decrementing because you've, you've decided not ever to do that.

00:09:39.920 --> 00:09:40.100
Right.

00:09:40.100 --> 00:09:40.160
Right.

00:09:40.160 --> 00:09:43.200
So there's like some interesting piling on effects.

00:09:43.200 --> 00:09:53.600
And also that was talking about, I didn't, I don't remember the word, but something about a certain, a lock free thread, thread safe type of way to do the increment for the.

00:09:53.600 --> 00:09:54.060
Well.

00:09:54.060 --> 00:09:55.500
For the reference counting.

00:09:55.820 --> 00:09:58.920
I mean, I was familiar with just like brute force reference counting.

00:09:58.920 --> 00:10:02.800
Of course, it's a, it's a common way to deal with shared objects.

00:10:02.800 --> 00:10:09.500
But the, one of the things I loved about this is the discussion around biased reference counting and deferred reference counting.

00:10:09.500 --> 00:10:14.900
The notion that like statistically looking at how multi-threaded applications work.

00:10:14.900 --> 00:10:22.740
Most objects really are only like most, most things are only, most objects are only accessed by one thread.

00:10:22.740 --> 00:10:25.300
There's not that many objects that are shared.

00:10:25.480 --> 00:10:41.600
So having like a, each object having a thread owner and the process for what reference counting is for the owner is different than the process for the, or, or different, you know, the non-owner, non-thread owner, you know, people accessing the object.

00:10:41.600 --> 00:10:47.000
And, and all of this is, hopefully invisible to, the people using it.

00:10:47.000 --> 00:10:57.600
I mean, clearly at some point we're going to have to have like some way in Python to be able to utilize this is like, it should, it, it can't be invisible forever.

00:10:57.800 --> 00:10:59.700
so it'll be interesting.

00:10:59.700 --> 00:11:00.180
Yeah.

00:11:00.180 --> 00:11:00.600
Yeah.

00:11:00.600 --> 00:11:02.820
The bias reference counting, that's the word I was looking for.

00:11:02.820 --> 00:11:04.020
That's, that's pretty interesting.

00:11:04.020 --> 00:11:06.440
Like the owner thread might not have to lock it.

00:11:06.440 --> 00:11:07.440
It just does whatever.

00:11:07.440 --> 00:11:09.680
And the others have to care.

00:11:09.680 --> 00:11:18.920
Well, and this also, a lot of this is around, I mean, we do reference counting, but partly because of the reference counting and how our object model is.

00:11:18.920 --> 00:11:30.320
I mean, one of the things I was surprised by when I moved from C++ to Python or picked up Python and with objects and everything is that like in C++, you totally know when the destructor happens.

00:11:30.320 --> 00:11:34.140
But in Python, we don't really talk about destructors too much.

00:11:34.140 --> 00:11:39.960
We have constructors, but we don't really put a ton of work in destructors because you don't really know when it's going to really go away.

00:11:39.960 --> 00:11:46.200
and, I think that's a good thing because now we can say it's actually going to be a little bit longer.

00:11:46.200 --> 00:11:58.780
You thought it was going to, you know, it probably would have disappeared earlier, but we're going to defer that and have a garbage collection phase where it also includes, making sure that the threads are concurrency is saved and stuff like that.

00:11:58.780 --> 00:11:59.040
So.

00:11:59.040 --> 00:11:59.560
Yeah.

00:11:59.560 --> 00:12:00.060
Interesting.

00:12:00.060 --> 00:12:02.500
It's a, it's a very fascinating read.

00:12:02.500 --> 00:12:05.340
I just had a quick read of it this morning, but, uh.

00:12:05.340 --> 00:12:07.640
It looks very clever and I'm, I'm all for it.

00:12:07.640 --> 00:12:08.200
I'm here for it.

00:12:08.200 --> 00:12:08.680
Let's do this.

00:12:08.680 --> 00:12:10.900
I don't want to like paint it too, Rosie.

00:12:11.180 --> 00:12:17.320
And everybody paying attention to this knows that there is a performance hit, for single threaded stuff.

00:12:17.320 --> 00:12:19.660
So, and I thought it was going to be larger.

00:12:19.660 --> 00:12:29.620
the reference in here talks about somewhere between a five and 10% performance hit, but we've already seen these like massive gains in performance.

00:12:29.620 --> 00:12:34.700
So, and the work on improving the performance of Python is going to continue.

00:12:34.700 --> 00:12:36.900
So I personally optimistic.

00:12:36.900 --> 00:12:46.460
I think that the gains in, in performance elsewhere are going to far outweigh the possible slowdown of, you know, single threaded stuff.

00:12:46.460 --> 00:12:51.280
I mean, a lot, a lot of, a lot of people don't really care about 5% difference.

00:12:51.280 --> 00:12:54.360
I mean, the code they're running, that's more simple.

00:12:54.360 --> 00:12:57.740
It, it's probably not performance sensitive a lot of the times.

00:12:57.740 --> 00:13:02.220
And when it is, you, you might be trying to squeeze even more performance out of it.

00:13:02.220 --> 00:13:02.480
Right.

00:13:02.480 --> 00:13:05.640
And, you know, my little mini here has eight cores.

00:13:05.640 --> 00:13:07.660
Python only cares about one of them.

00:13:07.660 --> 00:13:08.020
Yeah.

00:13:08.140 --> 00:13:17.720
If I could use all eight or six or something, I could do way more than 5% better, you know, so I could more than make up for that if I actually leverage this feature.

00:13:17.720 --> 00:13:18.300
Yeah.

00:13:18.300 --> 00:13:21.880
And if I don't care about performance plus or minus 5% probably doesn't matter.

00:13:21.880 --> 00:13:22.360
Yeah.

00:13:22.360 --> 00:13:28.020
I don't, I don't, I don't, I don't, I think they have to bring it up because there's going to be people saying, ah, but it's going to be slower.

00:13:28.020 --> 00:13:29.760
And so I'm glad that.

00:13:29.760 --> 00:13:29.920
Yeah.

00:13:29.920 --> 00:13:38.100
And that's also, that's always been the reason we still have the GIL is it's like, we would like to make changes, but they make a con the most common use case less good.

00:13:38.100 --> 00:13:43.080
So we're not doing it, but maybe this is close enough possible improvements even down the road.

00:13:43.080 --> 00:13:43.800
So yeah.

00:13:43.800 --> 00:13:48.300
I'm just, it's going to be, I'm excited to see how this, how this pans out.

00:13:48.300 --> 00:13:50.120
So yeah, I'm excited as well.

00:13:50.120 --> 00:13:50.920
Very, very cool.

00:13:50.920 --> 00:13:56.620
I would say certainly the biggest news of the show is right here.

00:13:56.620 --> 00:13:58.580
And we've got some good jokes and stuff.

00:13:58.580 --> 00:13:59.680
People can stick around for those.

00:13:59.680 --> 00:14:00.040
They should.

00:14:00.040 --> 00:14:00.320
Yeah.

00:14:00.320 --> 00:14:01.100
Stick around to the end.

00:14:01.100 --> 00:14:02.620
What do you got for us next?

00:14:02.620 --> 00:14:03.720
All right.

00:14:03.720 --> 00:14:06.360
Well, I want to tell you about the ferret.

00:14:06.360 --> 00:14:07.700
You heard of ferret DB?

00:14:08.140 --> 00:14:08.840
I have not.

00:14:08.840 --> 00:14:15.060
Like a mongoose, but it's not quite a, I honestly, if you showed me a mongoose and a ferret and said, which is which?

00:14:15.060 --> 00:14:16.160
I don't know if I could tell.

00:14:16.160 --> 00:14:18.620
Maybe the ferret mongooses are more intense.

00:14:18.620 --> 00:14:19.120
I don't know.

00:14:19.120 --> 00:14:20.740
But ferrets are more pet-like.

00:14:20.740 --> 00:14:21.940
They're pretty similar, right?

00:14:21.940 --> 00:14:23.700
Is Mongo from mongoose?

00:14:23.700 --> 00:14:25.700
No, it's from humongous.

00:14:25.700 --> 00:14:33.560
But there are some frameworks in the JavaScript space called mongoose from the Node.js side.

00:14:33.560 --> 00:14:38.680
Anyway, so ferret DB is this thing that I think someone told me about.

00:14:38.680 --> 00:14:40.980
Let me see if I got some credit.

00:14:40.980 --> 00:14:43.220
Yeah, this comes from John Boltmeyer.

00:14:43.220 --> 00:14:44.280
Boltmeyer, sorry.

00:14:44.280 --> 00:14:45.820
And thanks for sending that in.

00:14:45.820 --> 00:14:47.460
It said, ran across this.

00:14:47.460 --> 00:14:49.900
So ferret DB is pretty interesting.

00:14:49.900 --> 00:14:50.780
We'll see where it goes.

00:14:50.780 --> 00:14:54.300
It's a truly open source mongo DB alternative.

00:14:54.760 --> 00:14:57.660
By the way, I'm going to accept the cookies.

00:14:57.660 --> 00:15:02.540
You know, a cool way you don't have to have cookie policy pop-ups is not to track other people.

00:15:02.540 --> 00:15:03.580
That's even better.

00:15:03.580 --> 00:15:05.420
But I'll go and accept it for them.

00:15:05.420 --> 00:15:08.000
Our site doesn't have any, does it, Brian?

00:15:08.000 --> 00:15:09.320
Because we don't have third-party cookies.

00:15:09.320 --> 00:15:12.840
So 5,000 GitHub stars already.

00:15:12.840 --> 00:15:13.980
That's pretty incredible.

00:15:14.540 --> 00:15:22.880
And these folks are big fans of MongoDB and also really big fans of 100% true open source.

00:15:22.880 --> 00:15:26.040
And that's why they decided to make this thing called ferret DB.

00:15:26.040 --> 00:15:27.800
So here I'll read from their page a bit.

00:15:27.800 --> 00:15:35.140
MongoDB is a life-changing technology for many developers, empowering them to build applications faster than using relational databases.

00:15:35.540 --> 00:15:44.620
However, MongoDB abandoned its open source roots, changing the license to SSPL, making it unusable for many open source and commercial projects.

00:15:44.620 --> 00:15:48.800
Now, MongoDB is still open source, but this is like, I'm pretty sure this is a license.

00:15:48.800 --> 00:15:53.520
So basically, you can't make our thing as a service and then sell it without us.

00:15:53.520 --> 00:15:56.760
Like AWS had a MongoDB as a service.

00:15:56.760 --> 00:16:02.240
And Mongo is like, hello, we want to be, we didn't expect it to be used in this way.

00:16:02.240 --> 00:16:07.340
So I don't think it's, I mean, it's not like a huge bash against Mongo, I don't really think.

00:16:07.340 --> 00:16:12.380
But if you really wanted it to be unencumbered entirely, well, MongoDB is not it, right?

00:16:12.380 --> 00:16:12.800
Right.

00:16:12.800 --> 00:16:14.340
So here's the idea.

00:16:14.340 --> 00:16:22.380
So ferret DB is built on top of Postgres SQL, but it is wire compatible with MongoDB.

00:16:22.380 --> 00:16:31.820
That is, you can use the different libraries or drivers from different languages, you know, Python, JavaScript, .NET, whatever.

00:16:31.820 --> 00:16:36.800
You should be able to just change the connection string over to the ferret DB and off it goes.

00:16:36.800 --> 00:16:37.280
Wow.

00:16:37.280 --> 00:16:44.440
And it exchanges the binary JSON encoding across the wire, just like MongoDB does.

00:16:44.440 --> 00:16:51.180
I'm guessing they're using the JSON column stuff in Postgres SQL to match.

00:16:51.180 --> 00:16:54.380
I couldn't imagine they're trying to do a relational thing over there.

00:16:54.380 --> 00:16:56.060
They're probably just like stashing the blobs.

00:16:56.060 --> 00:16:58.260
But yeah, it's pretty neat.

00:16:58.260 --> 00:16:58.940
What do you think?

00:16:59.360 --> 00:17:08.680
That's actually, the architecture of that sounds great for an open source project to not try to do the entire database backend, but built on top of Postgres.

00:17:08.680 --> 00:17:09.360
Yeah.

00:17:09.360 --> 00:17:12.040
I mean, there's Edge, there's EdgeDB, right?

00:17:12.040 --> 00:17:15.260
Which is quite popular in the Python space.

00:17:15.260 --> 00:17:17.220
And I believe they're doing basically the same thing.

00:17:17.220 --> 00:17:18.460
Like build something.

00:17:18.460 --> 00:17:18.780
Yeah.

00:17:18.780 --> 00:17:19.840
Powered by Postgres.

00:17:20.340 --> 00:17:22.080
Maybe just the query engine.

00:17:22.080 --> 00:17:25.200
I'm not sure if the database engine as well for the EdgeDB folks.

00:17:25.200 --> 00:17:27.960
I interviewed them, but still pretty, pretty neat.

00:17:27.960 --> 00:17:28.920
I can get ahead with the joke.

00:17:28.920 --> 00:17:29.220
Yeah.

00:17:29.220 --> 00:17:40.360
So, FairDB, formerly MangoDB, is an open source proxy that translates MongoDB wire protocol queries to SQL with Postgres as a Postgres SQL as the database engine.

00:17:40.360 --> 00:17:41.540
MangoDB.

00:17:41.540 --> 00:17:43.100
That's a little bit too close, I think.

00:17:43.260 --> 00:17:44.080
Yeah, a little bit.

00:17:44.080 --> 00:17:45.020
Mango.

00:17:45.020 --> 00:17:47.080
Yeah, that's maybe pushing it.

00:17:47.080 --> 00:17:53.540
So, yeah, you pretty much write the regular MongoDB code that you would write, but it apparently works.

00:17:53.540 --> 00:17:56.760
Now, somewhere, I don't know where the roadmap is.

00:17:56.760 --> 00:17:57.640
Let's see.

00:17:57.640 --> 00:17:59.120
They did a blog post.

00:17:59.120 --> 00:18:00.260
Yeah, maybe that's where I should be looking.

00:18:00.640 --> 00:18:04.340
And on the blog post, they have something about their roadmap.

00:18:04.340 --> 00:18:04.940
I don't know.

00:18:04.940 --> 00:18:06.900
I'll link to it if I can find it.

00:18:06.900 --> 00:18:16.580
But there's a FairDB roadmap, and there's one really notable thing that people are going to need to be holding out for, and that's indexes.

00:18:16.580 --> 00:18:17.740
Oh, okay.

00:18:17.740 --> 00:18:24.080
And so if you don't have indexes, you have a real hard time doing fast database stuff.

00:18:24.080 --> 00:18:28.940
So I think they said they're trying to get it kind of all finished up by the end of 2023.

00:18:29.240 --> 00:18:34.280
So this is not like a, hey, you should just jump right on this and run with it.

00:18:34.280 --> 00:18:37.240
Because I don't think it's far enough along.

00:18:37.240 --> 00:18:39.540
It's written in Go, for what that's worth.

00:18:39.540 --> 00:18:45.620
MongoDB itself is written in C, so it's not like it makes it more or less friendly to Python folks.

00:18:45.620 --> 00:18:47.240
So, oh, here's the public roadmap.

00:18:47.240 --> 00:18:47.660
Perfect.

00:18:47.660 --> 00:18:49.660
So it's linked off their GitHub pages.

00:18:49.660 --> 00:18:54.700
And so you can see the end of alpha is supposed to be in the past, and it does look like they're all done.

00:18:54.700 --> 00:18:57.260
You can see their beta stuff they're working on.

00:18:57.260 --> 00:19:01.640
But then for general availability, this index stuff that's supposed to come.

00:19:01.640 --> 00:19:03.620
Actually, I said 2023.

00:19:03.620 --> 00:19:08.320
This is supposed to be done January 2023, which felt like a long time ago.

00:19:08.320 --> 00:19:10.240
Not long ago, but that's actually now.

00:19:10.500 --> 00:19:15.560
I don't know how far along it is, but support for issues, for indexes.

00:19:15.560 --> 00:19:22.260
Look, this issue here looks, I don't see a lot of traffic on it, but still, it would be basically required, right?

00:19:22.260 --> 00:19:27.280
If you've got many, many gigs of data, then you have to have indexes.

00:19:27.280 --> 00:19:27.840
Right.

00:19:27.840 --> 00:19:42.480
However, the devil's advocate here, development work on a project that utilizes this can proceed before you get tons of users and stuff, knowing that it's coming soon, I guess.

00:19:42.480 --> 00:19:43.380
Yeah, that's a good point.

00:19:43.380 --> 00:19:44.220
If you trust him.

00:19:44.460 --> 00:19:50.160
Yeah, although because it's wire protocol, you could just run MongoDB and then flip it theoretically, right?

00:19:50.160 --> 00:19:50.880
You don't have to.

00:19:50.880 --> 00:19:54.160
It's not like a complete new creation you've got to build upon, right?

00:19:54.160 --> 00:19:56.540
It's meant to mirror something that exists.

00:19:56.540 --> 00:19:57.440
So you could do that.

00:19:58.200 --> 00:20:05.720
I think we've got like five, six, seven gigs of data in the database that backs Python bytes.

00:20:05.720 --> 00:20:12.400
Like if you do queries against, you know, give me the 20 things out of this, these millions and millions of records that match this without an index.

00:20:12.400 --> 00:20:17.260
Actually, I think MongoDB may refuse to do it.

00:20:17.260 --> 00:20:23.820
There are certain situations where it's like too much data, no index, not going to be able to answer that question.

00:20:23.820 --> 00:20:28.980
So it might be really slow or it might actually error out and say this, you need to create an index.

00:20:28.980 --> 00:20:33.080
So anyway, long story short, like this is a big deal until this comes in.

00:20:33.080 --> 00:20:37.720
I would not touch it in terms of a, I'm going to try to run on top of this.

00:20:37.720 --> 00:20:38.000
Yeah.

00:20:38.000 --> 00:20:49.520
But if that, if that comes through, then you already have Postgres, but you want some kind of document like experience for part of your app or one of your apps, but you don't want to switch to Mongo.

00:20:49.520 --> 00:20:50.660
That would be pretty cool.

00:20:50.660 --> 00:20:57.220
So one of the things notable in the menu bar of FairDB is careers.

00:20:57.220 --> 00:21:05.920
So this is not, this is intended to be something commercial at some point, unless they just feel like hiring people for the fun of it.

00:21:05.920 --> 00:21:07.620
Yeah, that is interesting.

00:21:07.620 --> 00:21:09.760
So where are they going with it?

00:21:09.760 --> 00:21:09.900
Right.

00:21:09.980 --> 00:21:17.280
So I would imagine they have a FairDB as a service in mind out there, but you're right.

00:21:17.280 --> 00:21:20.020
It's certainly, it has an ink and.

00:21:20.020 --> 00:21:22.100
I mean, that's not necessarily bad.

00:21:22.100 --> 00:21:25.600
That's probably a good thing that there's money behind it, but just interesting.

00:21:25.600 --> 00:21:26.480
It is interesting.

00:21:26.480 --> 00:21:26.780
Yes.

00:21:26.780 --> 00:21:27.500
Very interesting.

00:21:27.500 --> 00:21:27.980
All right.

00:21:27.980 --> 00:21:36.120
Well, FairDB, something I put out there for people to keep their eye on, not necessarily to jump on right away, but quite interesting.

00:21:36.440 --> 00:21:36.640
Yep.

00:21:36.640 --> 00:21:42.400
Oh, by the way, we have a couple of excited folks out in the audience.

00:21:42.400 --> 00:21:44.820
A GIL optional would be amazing, says Ciro.

00:21:44.820 --> 00:21:49.300
And I know that Ciro is working on some real high performance web framework stuff.

00:21:49.300 --> 00:21:50.760
So that would be cool.

00:21:50.760 --> 00:21:55.100
And how about a Docker container prebuilt with CPython with no gill?

00:21:55.100 --> 00:21:57.120
Pick your Docker container and run that one.

00:21:57.120 --> 00:21:57.580
Sure.

00:21:57.580 --> 00:21:58.200
That'd be cool.

00:21:58.440 --> 00:21:59.480
Yeah, that's not a bad idea.

00:21:59.480 --> 00:22:00.020
Yeah.

00:22:00.020 --> 00:22:04.320
And Seth out there says, good thing we invested in faster CPython earlier.

00:22:04.320 --> 00:22:05.760
So now we can roll back a little.

00:22:05.760 --> 00:22:07.080
Yeah.

00:22:07.080 --> 00:22:08.580
I mean, kind of, we knew that was coming.

00:22:08.580 --> 00:22:12.600
So that's one of the reasons for the speed ups in 3.11 and planned for future.

00:22:12.600 --> 00:22:12.980
So.

00:22:12.980 --> 00:22:13.940
Yeah, indeed.

00:22:13.940 --> 00:22:14.440
All right.

00:22:14.440 --> 00:22:20.180
Let's switch over to real quickly talk about our sponsor before we move on here.

00:22:20.400 --> 00:22:23.920
As I said at the beginning, this episode is brought to you by Microsoft for Startups.

00:22:23.920 --> 00:22:25.140
We just got an email.

00:22:25.140 --> 00:22:28.740
I don't know if you saw, Brian, from somebody who signed up for the Microsoft for Startups

00:22:28.740 --> 00:22:30.420
program and said, this is a really great.

00:22:30.420 --> 00:22:34.580
I was a little bit skeptical, but I signed up and this is a really great project, a really

00:22:34.580 --> 00:22:37.600
great service and offering for them.

00:22:37.600 --> 00:22:39.600
And that they actually, it's working really well.

00:22:39.600 --> 00:22:39.880
So.

00:22:39.880 --> 00:22:40.620
That's great.

00:22:40.620 --> 00:22:41.200
Yeah.

00:22:41.200 --> 00:22:42.180
It was really good to hear.

00:22:42.180 --> 00:22:46.280
So, you know, Microsoft knows that starting a business is hard.

00:22:46.280 --> 00:22:51.620
They want to help support startups that can then later, you know, be customers of theirs,

00:22:51.620 --> 00:22:52.060
of course.

00:22:52.060 --> 00:22:57.920
So they put together this Microsoft for Startups program to help them understand what startups

00:22:57.920 --> 00:23:02.660
need to help them be more successful and to create a digital platform to help them overcome

00:23:02.660 --> 00:23:03.280
those challenges.

00:23:03.280 --> 00:23:05.940
And they call that Microsoft for Startups Founders Hub.

00:23:05.940 --> 00:23:11.480
And it provides all founders at any stage with free resources to solve startup challenges,

00:23:11.720 --> 00:23:17.940
provides tech benefits, access to expert guidance and skilling resources, mentorship, network

00:23:17.940 --> 00:23:19.020
connections, and much more.

00:23:19.020 --> 00:23:22.560
It doesn't require the startups to be investor backed or third party validated.

00:23:22.560 --> 00:23:23.520
You just apply.

00:23:23.520 --> 00:23:26.740
Microsoft says it looks like you would be a good fit for this program.

00:23:26.740 --> 00:23:27.400
You're in.

00:23:27.400 --> 00:23:33.340
And with that, you get access to a bunch of cloud resources, GitHub and Azure, Office 365.

00:23:33.340 --> 00:23:40.040
I think you also get access to open AI, which, you know, chat GTP, pretty hopping these days

00:23:40.040 --> 00:23:41.920
and might be something cool to leverage.

00:23:41.920 --> 00:23:47.020
And through Microsoft for Startup Founders Hub, becoming a founder is also no longer about who

00:23:47.020 --> 00:23:47.380
you know.

00:23:47.380 --> 00:23:51.620
You have access to their mentorship network, which I think is one of the biggest values you

00:23:51.620 --> 00:23:52.220
probably get.

00:23:52.220 --> 00:23:57.820
Talk to people about idea validation, fundraising, management, coaching, sales and marketing, and

00:23:57.820 --> 00:23:58.360
all those things.

00:23:58.360 --> 00:24:03.120
And you get to book one-on-one meetings with those mentors to make your idea a reality

00:24:03.120 --> 00:24:06.380
today with the critical support you'll get from Microsoft for Startups Founders Hub.

00:24:06.380 --> 00:24:11.000
To join the program, just visit pythonbytes.fm/foundershub 2022.

00:24:11.000 --> 00:24:12.280
The link's in your show notes.

00:24:12.280 --> 00:24:14.440
So if you're interested, give it a click.

00:24:14.440 --> 00:24:16.140
All right.

00:24:16.140 --> 00:24:16.600
Over to you, Brian.

00:24:16.600 --> 00:24:25.080
Well, I was, I want to guess transition is difficult for me apparently right now, as are

00:24:25.080 --> 00:24:25.460
words.

00:24:26.060 --> 00:24:31.920
Anyway, the next article I want to talk about is four tips for structuring your research

00:24:31.920 --> 00:24:33.380
group's Python package.

00:24:33.380 --> 00:24:40.500
So I think this is just a Python package, but research group, I think this is from David Aaron

00:24:40.500 --> 00:24:40.980
Nicholson.

00:24:40.980 --> 00:24:48.540
And I think the idea around it is a lot of people with scientific computing and various things

00:24:48.540 --> 00:24:53.360
like that might not be, might be struggling with lots of Python code.

00:24:53.360 --> 00:24:58.620
So they're putting it into subdirectories and stuff like that.

00:24:58.620 --> 00:25:04.820
So this is talking about packages in that sense of it's a directory with a __init__() and you

00:25:04.820 --> 00:25:08.080
can reference it by importing it through normal import.

00:25:08.080 --> 00:25:13.320
The import mechanism, it's not about packaging for like IPI or something like that.

00:25:13.320 --> 00:25:15.740
It's still some really great information.

00:25:15.960 --> 00:25:22.620
So the four tips are one, give your packages and modules terse single word names whenever

00:25:22.620 --> 00:25:23.200
possible.

00:25:23.200 --> 00:25:26.340
And there's some great examples of what not to do later.

00:25:26.340 --> 00:25:31.760
Number two, import modules internally instead of importing everything from modules.

00:25:31.760 --> 00:25:34.040
Make use of sub packages.

00:25:34.560 --> 00:25:41.040
And the last one is prefer modules with specific names instead of things like utils, helpers

00:25:41.040 --> 00:25:41.740
and support.

00:25:41.740 --> 00:25:46.920
And this is, this is everyone struggling with this, including me, even though I've been preaching

00:25:46.920 --> 00:25:47.800
this for a long time.

00:25:47.800 --> 00:25:48.720
It's hard.

00:25:48.720 --> 00:25:52.760
There are some great examples of what not to do.

00:25:52.880 --> 00:25:54.640
So the, the, what was this?

00:25:54.640 --> 00:25:57.880
The give your modules terse single word names whenever possible.

00:25:57.880 --> 00:26:00.680
And I guess there's a couple examples of what not to do.

00:26:00.680 --> 00:26:07.120
So there's a really long directory name called electromyography toolkit.

00:26:07.120 --> 00:26:08.540
Yeah, that's a bit long.

00:26:08.540 --> 00:26:13.180
And then prefixing everything with EMG afterwards within it.

00:26:13.180 --> 00:26:14.220
Yeah, don't do that.

00:26:14.220 --> 00:26:15.220
You don't need to.

00:26:15.220 --> 00:26:18.060
It's just some great examples of better versions.

00:26:18.620 --> 00:26:18.980
Right.

00:26:18.980 --> 00:26:23.360
It already has the top level part of the package as the namespace.

00:26:23.360 --> 00:26:24.000
Yeah.

00:26:24.000 --> 00:26:28.160
If you want to be explicit, just, you know, package dot sub package.

00:26:28.160 --> 00:26:34.220
And so they're talking about how, how, what it looks like when you're importing it is different.

00:26:34.220 --> 00:26:37.840
So I'm going to scroll down of like importing stuff.

00:26:37.840 --> 00:26:40.500
I guess I'll just drop to one.

00:26:40.500 --> 00:26:43.120
A better thing would be like EMG toolkit.

00:26:43.120 --> 00:26:46.920
And I would say even like, is toolkit really adding any information?

00:26:47.140 --> 00:26:49.100
Maybe just EMG or something.

00:26:49.100 --> 00:26:56.300
And then having, instead of having like solvers and a whole bunch of prefixes, just put solvers

00:26:56.300 --> 00:26:59.080
in a directory name and then put the types of solvers underneath.

00:26:59.080 --> 00:27:03.400
You don't have to have EMGs under everything or yeah.

00:27:03.400 --> 00:27:04.260
EMG underscore.

00:27:04.260 --> 00:27:08.160
Or a brute force solver and a, a star solver and all that.

00:27:08.160 --> 00:27:11.200
It's just solvers dot a star solvers dot brute force or something.

00:27:11.200 --> 00:27:11.380
Right.

00:27:11.380 --> 00:27:11.780
Yeah.

00:27:11.780 --> 00:27:12.040
Right.

00:27:12.160 --> 00:27:16.860
And I'd argue that you could even just probably drop the toolkit and it'd be EMG dot solvers dot

00:27:16.860 --> 00:27:17.620
brute force.

00:27:17.620 --> 00:27:18.860
It'd be a better name.

00:27:18.860 --> 00:27:25.440
But I think, so I'm not going to go through this, this entire thing, but import modules is

00:27:25.440 --> 00:27:26.320
something I've seen.

00:27:26.320 --> 00:27:31.720
A lot of people will do like a from package solver import and then list all the things that

00:27:31.720 --> 00:27:32.380
they're importing.

00:27:32.600 --> 00:27:38.600
And I think, and I've been guilty of this to doing this before also, especially if I'm

00:27:38.600 --> 00:27:39.540
only importing one.

00:27:39.540 --> 00:27:45.260
One of the things that people will do this for is because the entire name is too long.

00:27:45.260 --> 00:27:47.300
Well then, you know, make the name shorter.

00:27:47.300 --> 00:27:52.800
So instead of doing that, just import the package solver and then you dot reference everything

00:27:52.800 --> 00:27:53.280
else.

00:27:53.280 --> 00:27:53.620
Right.

00:27:54.340 --> 00:27:56.500
Or do what the data scientists do.

00:27:56.500 --> 00:28:00.520
If you don't control the name, you know, import numpy as NP.

00:28:00.520 --> 00:28:01.200
Yeah.

00:28:01.200 --> 00:28:05.700
Then NP dot that you can shorten the name for you, even if you can't shorten it for others

00:28:05.700 --> 00:28:07.360
at the source.

00:28:07.360 --> 00:28:07.900
Right.

00:28:07.900 --> 00:28:12.020
So one of the reminders is you can do from, if you're in the same directory, you can do

00:28:12.020 --> 00:28:17.640
from dot import solvers, and then you can reference like solvers and entropy solver and things

00:28:17.640 --> 00:28:18.080
like that.

00:28:18.320 --> 00:28:25.700
Anyway, some great, even discussion of sub packages of, and this is something that I

00:28:25.700 --> 00:28:26.980
always forget that is difficult.

00:28:26.980 --> 00:28:30.780
It's a, it's a mind shift to say, oh, I'm going to throw things into a directory and then

00:28:30.780 --> 00:28:33.360
have a package, but you can, you can do that again.

00:28:33.360 --> 00:28:37.860
It can, it can keep going down and, and some people forget to do that.

00:28:37.860 --> 00:28:39.980
So the reference is that as well.

00:28:39.980 --> 00:28:40.760
So it's good.

00:28:40.760 --> 00:28:43.360
You can have packages inside of packages inside of packages.

00:28:43.360 --> 00:28:43.780
Nice.

00:28:44.120 --> 00:28:48.740
I think Robert out in the audience, that's a great recommendation to simplify the code

00:28:48.740 --> 00:28:49.340
we got to write.

00:28:49.340 --> 00:28:50.380
Yeah.

00:28:50.380 --> 00:28:54.660
Just how about we just extend it a little bit from star import star and like you just have

00:28:54.660 --> 00:28:55.480
access to everything.

00:28:55.480 --> 00:28:58.040
There's sure the startup time is 10 minutes, but it's fine.

00:28:58.040 --> 00:29:00.880
Yes.

00:29:00.880 --> 00:29:05.840
And then Pampho Roy is reminding us that, you know, one of the Zen of pythons is about these

00:29:05.840 --> 00:29:06.380
namespaces.

00:29:06.380 --> 00:29:06.860
Yeah.

00:29:06.860 --> 00:29:07.340
Yeah.

00:29:07.340 --> 00:29:09.860
And I think it's just also be nice to people.

00:29:10.800 --> 00:29:14.360
Just, you know, people trying to write, write their code in Python.

00:29:14.360 --> 00:29:17.600
They're not doing weird stuff because they want to do weird stuff.

00:29:17.600 --> 00:29:20.300
They just don't know what the normal way to do it is.

00:29:20.300 --> 00:29:22.460
So gentle reminders like this post are good.

00:29:22.460 --> 00:29:22.980
Indeed.

00:29:22.980 --> 00:29:24.180
What you got for us next?

00:29:24.180 --> 00:29:28.620
I don't want to really quibble about it, but let's talk about it anyway.

00:29:28.620 --> 00:29:29.260
Quibbler.

00:29:29.260 --> 00:29:34.120
So quibbler actually is, is interesting keeping with the data science theme.

00:29:34.120 --> 00:29:41.180
So this one here is a way to take matplotlib and make it more interactive.

00:29:41.180 --> 00:29:48.420
So you probably know matplotlib will make a nice, like printable, publishable, high quality

00:29:48.420 --> 00:29:53.260
image, but they're generally not as interactive as like bokeh, some of these other frameworks.

00:29:53.260 --> 00:29:56.600
So quibbler is like your data, but interactive.

00:29:56.600 --> 00:29:59.740
Let me just play a little video for you here and I'll just describe it.

00:29:59.840 --> 00:30:03.260
But this way you'll kind of know what this is about if you haven't checked this out.

00:30:03.260 --> 00:30:09.000
So the idea is you could go and plot something with matplotlib and you have some variable

00:30:09.000 --> 00:30:10.520
you would like to make interactive.

00:30:10.520 --> 00:30:18.240
You just wrap it in an iQuib and all of a sudden the entire UI becomes completely interactive,

00:30:18.240 --> 00:30:19.160
which is insane.

00:30:19.160 --> 00:30:26.060
So here's like a triangle with squares around each, based off each of the edge of the triangle.

00:30:26.320 --> 00:30:31.200
And then if you just make the numbers, the inputs, this iQuib type, then all of a sudden

00:30:31.200 --> 00:30:33.460
you can drag them around and interact with them.

00:30:33.460 --> 00:30:38.920
And even, even works on like cells and zooms and other pictures.

00:30:38.920 --> 00:30:39.380
What do you think?

00:30:39.380 --> 00:30:40.600
This is amazing.

00:30:40.600 --> 00:30:44.700
Also amazing use of video to show people how easy it is to switch.

00:30:44.700 --> 00:30:45.040
Yes.

00:30:45.040 --> 00:30:46.220
Thank you for doing that.

00:30:46.220 --> 00:30:47.720
Thank you for doing that people.

00:30:47.720 --> 00:30:50.660
But yeah, this is a super cool project.

00:30:50.820 --> 00:30:54.960
I don't, I don't have a ton to say about it actually, but you know, if you're working

00:30:54.960 --> 00:30:58.120
with matplotlib already and you're like, you know, what'd be really nice is if we could,

00:30:58.120 --> 00:31:02.420
you know, move some of these things around and create interactive graphics a little bit

00:31:02.420 --> 00:31:08.560
more than, you know, just wrapping the independent variables in iQuib interactive bits.

00:31:08.560 --> 00:31:12.320
And it turns the whole, the whole graph into something that's, that's pretty excellent.

00:31:12.320 --> 00:31:14.780
I, you know, I think this is, it looks great.

00:31:14.780 --> 00:31:17.000
I don't see why you wouldn't, wouldn't want to use it.

00:31:17.280 --> 00:31:17.400
Yeah.

00:31:17.400 --> 00:31:18.940
That's, that's, that looks fun.

00:31:18.940 --> 00:31:19.340
Yeah.

00:31:19.340 --> 00:31:19.600
Cool.

00:31:19.600 --> 00:31:21.860
And someone out of the audience says it loves Quib.

00:31:21.860 --> 00:31:24.040
So they must have experience with as well.

00:31:24.040 --> 00:31:24.420
All right.

00:31:24.420 --> 00:31:28.360
So if you were doing matplotlib and you want to make it more interactive, check this out.

00:31:28.360 --> 00:31:28.920
Awesome.

00:31:28.920 --> 00:31:30.800
It's all of our items, isn't it, Brian?

00:31:30.800 --> 00:31:33.620
Even though somehow I seem to have like a screen full of tabs still.

00:31:33.620 --> 00:31:34.360
I don't know how that works.

00:31:34.360 --> 00:31:34.920
Yeah.

00:31:34.920 --> 00:31:37.260
So you've got some interesting Python related stuff.

00:31:37.260 --> 00:31:43.960
And I thought I would go with the tradition of Python and say, and now for something completely

00:31:43.960 --> 00:31:44.360
different.

00:31:44.360 --> 00:31:47.640
I just ran across an article that I thought I'd share just quickly.

00:31:47.640 --> 00:31:49.080
I'm not going to talk about it a lot.

00:31:49.080 --> 00:31:55.360
But there was an article in Washington post about how turtle moms talk to their eggs before

00:31:55.360 --> 00:31:55.940
they hatch.

00:31:55.940 --> 00:31:58.280
And I just thought it was a fascinating read.

00:31:58.280 --> 00:32:00.360
Plus it's got pictures of turtles.

00:32:00.360 --> 00:32:02.340
So turtles are awesome.

00:32:02.340 --> 00:32:06.000
I wasn't going to talk about it too much, but one of the things I thought was really cool

00:32:06.000 --> 00:32:11.900
was somebody went out and thought, oh, we don't, we, there's the turtle moms hang out in

00:32:11.900 --> 00:32:18.300
the rivers or somewhere near the hatch, the eggs on the sand.

00:32:18.300 --> 00:32:19.800
And they just wait for him or something.

00:32:19.800 --> 00:32:21.100
Well, are they talking?

00:32:21.100 --> 00:32:23.680
It probably not, but they went out and recorded anyway.

00:32:23.680 --> 00:32:28.000
And it's lower frequencies, frequencies that we don't normally hear.

00:32:28.360 --> 00:32:31.520
And, that's also slower timeframes.

00:32:31.520 --> 00:32:35.320
Like a conversation can be like hours for a reply.

00:32:35.320 --> 00:32:38.040
So it takes a while to go back.

00:32:38.040 --> 00:32:41.460
And then also like some of the eggs talk to each other before they hatch.

00:32:41.460 --> 00:32:46.480
they can, they can talk to each other to help possibly coordinate when to hatch.

00:32:46.580 --> 00:32:51.520
Because if there's predators around, more of them will survive if they all hatch at the

00:32:51.520 --> 00:32:51.860
same time.

00:32:51.860 --> 00:32:53.280
So anyway, just cool article.

00:32:53.280 --> 00:32:54.020
Check it out.

00:32:54.020 --> 00:32:55.260
If you guys want to look at turtles.

00:32:55.260 --> 00:32:55.760
Yeah.

00:32:55.760 --> 00:32:56.880
Science is neat, isn't it?

00:32:56.880 --> 00:32:57.760
Yeah.

00:32:57.760 --> 00:32:58.360
Yeah.

00:32:58.360 --> 00:32:58.980
That's really cool.

00:32:58.980 --> 00:33:05.340
So, kind of not one of my extras, but I'll go through this in is the next coming talk

00:33:05.340 --> 00:33:11.820
Python episode is, around the story of imaging black holes with, Dr.

00:33:11.820 --> 00:33:12.180
Sarah.

00:33:12.180 --> 00:33:16.340
I, I said, yeah, so that's going to be really, really awesome.

00:33:16.340 --> 00:33:20.780
And then there's a good chance, not a hundred percent chance, but a good chance that I also

00:33:20.780 --> 00:33:27.880
will have a science show on the few, the fusion, national ignition breakthrough with Python

00:33:27.880 --> 00:33:28.820
as well coming up.

00:33:28.820 --> 00:33:29.820
So very cool.

00:33:29.820 --> 00:33:30.660
Very cool stuff.

00:33:30.660 --> 00:33:31.340
Very neat.

00:33:31.340 --> 00:33:33.700
You get to talk to so many cool people through that.

00:33:33.700 --> 00:33:34.160
That's neat.

00:33:34.160 --> 00:33:37.140
I know it's, it's, I would never get to talk to these people.

00:33:37.140 --> 00:33:38.300
They're like, Hey, I have a podcast.

00:33:38.300 --> 00:33:39.400
Let's talk about it.

00:33:39.400 --> 00:33:39.760
Amazing.

00:33:39.760 --> 00:33:40.640
All right.

00:33:40.640 --> 00:33:42.380
let's do your extras.

00:33:42.380 --> 00:33:42.900
Yeah.

00:33:42.900 --> 00:33:43.520
Let's do my extras.

00:33:43.520 --> 00:33:46.060
So here we go.

00:33:46.100 --> 00:33:51.640
So I've published the thing on RSS a little while ago and talked about a lot about RSS.

00:33:51.640 --> 00:33:59.080
So I have more RSS stuff because I said reader R E E D E R is a really cool thing, but it's

00:33:59.080 --> 00:33:59.560
Mac only.

00:33:59.560 --> 00:34:01.360
Other people are like, Hey, guess what else I use?

00:34:01.360 --> 00:34:01.920
This is neat.

00:34:01.920 --> 00:34:07.020
So there's a fresh RSS, which is like your own hosted RSS web app.

00:34:07.020 --> 00:34:10.020
I think it also does some read later type of things.

00:34:10.660 --> 00:34:10.900
Feedly.

00:34:10.900 --> 00:34:14.980
I knew about Feedly, but I thought it was just, I don't know, just some sort of web

00:34:14.980 --> 00:34:16.280
app, type of thing.

00:34:16.280 --> 00:34:20.880
But apparently it has like a cool AI engine to help kind of recommend if you get like

00:34:20.880 --> 00:34:23.400
overwhelmed with all the stuff you subscribe to.

00:34:23.400 --> 00:34:24.380
You're like, well, now I can't read it.

00:34:24.380 --> 00:34:25.140
It's just insane.

00:34:25.140 --> 00:34:30.140
You know, it has a kind of a, your own personal algorithmic feed, which is, I know algorithmic

00:34:30.140 --> 00:34:32.940
feeds often get a bad name, but there are benefits too, you know?

00:34:32.940 --> 00:34:33.400
Yeah.

00:34:33.660 --> 00:34:34.680
Have you used Feedly lately?

00:34:34.680 --> 00:34:35.320
I have not.

00:34:35.320 --> 00:34:37.000
I've been using it for years.

00:34:37.000 --> 00:34:41.600
So I didn't know about the AI bit, but I, yeah, I use it a lot.

00:34:41.600 --> 00:34:42.000
Yeah.

00:34:42.000 --> 00:34:43.580
I thought that was the one you had said you were using.

00:34:43.580 --> 00:34:46.760
So, but yeah, the AI engine sounds at least interesting.

00:34:46.760 --> 00:34:49.780
Flim on, Android.

00:34:49.780 --> 00:34:50.900
People care about that.

00:34:50.900 --> 00:34:54.340
And read wise, we talked about, but I've been playing the read wise and it continues to

00:34:54.340 --> 00:34:54.960
be interesting.

00:34:54.960 --> 00:34:55.440
Cool.

00:34:55.440 --> 00:35:00.820
Can, not only when I first thought of that, oh, RSS and, you know, maybe read later, but

00:35:00.820 --> 00:35:05.760
you can throw in like EPUB books, you can do YouTube videos and like, it'll let you

00:35:05.760 --> 00:35:08.060
annotate the transcripts that it makes.

00:35:08.060 --> 00:35:09.680
And it's, it's pretty wild.

00:35:09.680 --> 00:35:10.120
Wow.

00:35:10.120 --> 00:35:11.960
and then, okay.

00:35:11.960 --> 00:35:19.780
Going for more RSS here is, just published all the talk Python courses as an RSS feed.

00:35:19.780 --> 00:35:25.040
So if you want to subscribe to that, then soon as we publish a new Talk Python Training course,

00:35:25.040 --> 00:35:29.800
like if we go down here, there's a, pie test one somewhere getting started with pie tests.

00:35:29.800 --> 00:35:30.020
Right.

00:35:30.060 --> 00:35:31.920
So that came out a couple months ago.

00:35:31.920 --> 00:35:35.640
And so people, if they're subscribed to the RSS feed, another one comes out, they'll get

00:35:35.640 --> 00:35:36.200
it straight away.

00:35:36.200 --> 00:35:36.700
It's cool.

00:35:36.700 --> 00:35:36.860
Right.

00:35:36.860 --> 00:35:37.660
That is neat.

00:35:37.660 --> 00:35:38.060
Yeah.

00:35:38.060 --> 00:35:42.240
RSS seeing more of the things over at talk Python, the podcast, not the courses.

00:35:42.240 --> 00:35:44.700
I, we were talking about this right before the show.

00:35:44.700 --> 00:35:50.920
I did a ton of stuff for sort of helping people find when were, was a particular person, a guest

00:35:50.920 --> 00:35:51.460
on the show.

00:35:51.460 --> 00:35:52.940
When were they on the show?

00:35:52.940 --> 00:35:56.220
If they're on one episode, what other episodes did they do?

00:35:56.360 --> 00:36:02.160
So here's a great, huge list of tons of people who have been guests on the show.

00:36:02.160 --> 00:36:04.020
And Brian, who's in number one right now?

00:36:04.020 --> 00:36:07.220
I am with Brett as a close second.

00:36:07.220 --> 00:36:08.400
So a close second.

00:36:08.400 --> 00:36:08.580
Yeah.

00:36:08.580 --> 00:36:10.080
So Brian's been on 10 times.

00:36:10.080 --> 00:36:11.220
Brett Cannon, nine.

00:36:11.220 --> 00:36:12.700
Anthony Shaw, nine.

00:36:12.700 --> 00:36:13.900
Dan Bader, six.

00:36:13.900 --> 00:36:15.780
Lucas Lenga, five.

00:36:15.780 --> 00:36:18.000
Cecil down there at five.

00:36:18.000 --> 00:36:19.100
It's Cecil Phillip as well.

00:36:19.100 --> 00:36:22.460
Anyway, if this is a new resource on the podcast.

00:36:22.460 --> 00:36:26.780
So go, if you want to explore the data for the last seven years in a slightly different

00:36:26.780 --> 00:36:28.100
way, people can check that out.

00:36:28.100 --> 00:36:30.400
And congrats, Brian, for leading the pack there.

00:36:30.400 --> 00:36:31.100
Yes.

00:36:31.260 --> 00:36:38.400
And last, I talked about how to do traveling around, just taking an iPad and still doing

00:36:38.400 --> 00:36:39.080
development work.

00:36:39.080 --> 00:36:40.800
And we talked about prompt and all those things.

00:36:40.800 --> 00:36:44.840
So I basically wrote up an article on that discussion I had there.

00:36:44.840 --> 00:36:45.720
So I'll link to that.

00:36:45.720 --> 00:36:47.280
People can check that out if they want to.

00:36:47.280 --> 00:36:52.880
So there's the written, more formal version called Dev on the Road on my website.

00:36:52.880 --> 00:36:53.360
Cool.

00:36:53.660 --> 00:36:53.920
All right.

00:36:53.920 --> 00:36:56.900
Ready for a joke?

00:36:56.900 --> 00:37:01.740
Oh, by the way, Robert out there is suggesting that we might need to update your photo.

00:37:01.740 --> 00:37:03.800
Now you got your cool hair.

00:37:03.800 --> 00:37:05.840
We might need to update you on that guest list there.

00:37:05.840 --> 00:37:08.240
That was a seven-year-old photo or something.

00:37:08.240 --> 00:37:08.480
Yeah.

00:37:08.480 --> 00:37:10.900
That's from when you were on the show the first time, maybe six years ago.

00:37:10.900 --> 00:37:12.900
No, I really do look like that other photo.

00:37:12.900 --> 00:37:15.200
What you're seeing right now is an AI-generated bot.

00:37:15.200 --> 00:37:15.820
Yeah.

00:37:15.820 --> 00:37:16.900
This is like a...

00:37:16.900 --> 00:37:20.340
Actually, Brian hasn't been here for a few years.

00:37:20.340 --> 00:37:22.080
This is a deep fake and I invented him.

00:37:22.080 --> 00:37:23.160
No, just kidding.

00:37:23.160 --> 00:37:25.060
All right.

00:37:25.060 --> 00:37:25.780
Speaking of jokes.

00:37:25.780 --> 00:37:29.340
The real Brian is still embroiled in a lawsuit to try to get this to stop.

00:37:29.340 --> 00:37:33.200
The real Brian will never defeat the AI.

00:37:33.200 --> 00:37:33.560
Okay.

00:37:33.560 --> 00:37:39.820
So I thought of you actually, Brian, when I saw this one.

00:37:39.820 --> 00:37:42.340
This is on Program and Humor.

00:37:42.340 --> 00:37:51.300
And it says it has this dog-looking thing kind of very deep in thought projected to the sky for reasons I don't understand.

00:37:51.600 --> 00:37:56.020
But it says, am I testing this program or is it testing me?

00:37:56.020 --> 00:38:00.580
I suspect a lot of people can relate to having that go both ways.

00:38:00.580 --> 00:38:01.380
Deep thoughts.

00:38:01.380 --> 00:38:02.340
Deep thoughts.

00:38:02.340 --> 00:38:04.480
And we've got a name for the AI.

00:38:04.480 --> 00:38:05.640
It's called Brian GPT.

00:38:08.220 --> 00:38:08.720
All right.

00:38:08.720 --> 00:38:10.280
I know you got a joke as well for us.

00:38:10.280 --> 00:38:12.900
Maybe more involved than the floating dog.

00:38:12.900 --> 00:38:13.440
Okay.

00:38:13.440 --> 00:38:17.320
I can't remember where I got this, but every cloud architecture.

00:38:17.320 --> 00:38:18.720
It's just, I don't know.

00:38:18.720 --> 00:38:22.200
It's an image with some stuff that I really...

00:38:22.200 --> 00:38:22.600
There's a lot.

00:38:22.660 --> 00:38:27.380
I'm not going to cover everything, but one of my favorite bits of this is the managed services,

00:38:27.380 --> 00:38:31.420
the mismanaged services, and the unmanageable services.

00:38:31.420 --> 00:38:35.260
They're held together by duct tape and like some kind of like super glue.

00:38:35.260 --> 00:38:35.580
Yeah.

00:38:35.580 --> 00:38:37.400
Containers everywhere.

00:38:37.840 --> 00:38:44.260
I do like the cool databases that drive resumes and the real database that's actually doing

00:38:44.260 --> 00:38:45.340
all the actual work.

00:38:45.340 --> 00:38:47.860
The plumbing.

00:38:47.860 --> 00:38:50.020
There's a huge bunch of plumbing around it.

00:38:50.020 --> 00:38:50.880
It just has...

00:38:50.880 --> 00:38:52.700
The data engineers got very excited here.

00:38:52.700 --> 00:38:53.540
Yeah.

00:38:53.540 --> 00:38:54.780
It empties into a data lake.

00:38:54.780 --> 00:38:57.200
Which also drips into a data swamp.

00:38:57.880 --> 00:38:59.880
And there's a blame radius.

00:38:59.880 --> 00:39:02.400
Services that stop stuff.

00:39:02.400 --> 00:39:06.040
There's one tiny cron job that keeps everything from falling apart.

00:39:06.040 --> 00:39:07.160
It's good.

00:39:07.160 --> 00:39:08.360
VPN of sadness.

00:39:08.360 --> 00:39:14.560
And of course, it's all backed by the freaking slick reverse proxy.

00:39:14.560 --> 00:39:15.320
Yeah.

00:39:15.320 --> 00:39:22.820
So this is found on Good Tech Things, which actually has a whole bunch of cool, like funny images.

00:39:22.820 --> 00:39:24.780
So I might steal some more of these from...

00:39:24.780 --> 00:39:27.080
Oh, we might hear from Good Tech Things again.

00:39:27.080 --> 00:39:28.440
This is pretty awesome.

00:39:28.440 --> 00:39:29.520
All right.

00:39:29.520 --> 00:39:30.960
Well, is that everything for us?

00:39:30.960 --> 00:39:31.920
That is.

00:39:31.920 --> 00:39:32.740
That is all of it.

00:39:32.740 --> 00:39:33.680
So...

00:39:33.680 --> 00:39:34.040
Nice.

00:39:34.040 --> 00:39:35.080
Thank you everyone for listening.

00:39:35.080 --> 00:39:36.920
Brian, thanks as always.

00:39:36.920 --> 00:39:37.520
Bye.

