WEBVTT

00:00:00.001 --> 00:00:09.360
Hello and welcome to Python Bytes. This is episode 231, recorded April 28th. Is that right? Yeah. 2021. I'm Brian Okken.

00:00:09.360 --> 00:00:10.520
I'm Michael Kennedy.

00:00:10.520 --> 00:00:11.600
I'm Cecil Phillip.

00:00:11.600 --> 00:00:12.340
Yay.

00:00:12.340 --> 00:00:13.580
Hey, welcome Cecil.

00:00:13.580 --> 00:00:21.900
Hey, thanks for having me on. It's always good to come back on this podcast. This, you know, unbiasedly is probably one of my favorite podcasts to listen to, to be honest with you.

00:00:21.900 --> 00:00:23.440
Mine too. Yeah.

00:00:23.440 --> 00:00:24.860
Thanks so much.

00:00:25.860 --> 00:00:34.560
We get to learn so much stuff by studying and just getting ready for each week. And it's always fun to just see like the new and exciting. Like developers, we love the shiny new things, right?

00:00:34.560 --> 00:00:35.160
Yeah.

00:00:35.160 --> 00:00:43.620
Absolutely. Well, before we jump into the topic, I thought maybe we could let Cecil introduce himself real quick. I know you've been on the show before, but it's been a little while.

00:00:43.620 --> 00:00:49.840
Yeah, it has been a little while since I've been on. But hi, everyone. I'm Cecil Phillip. I'm a cloud advocate at Microsoft.

00:00:50.240 --> 00:01:02.860
And that pretty much just means I spent a lot of time in the community working with, you know, different companies and students and, you know, just really creating content around how, you know, how developers can start using our tools.

00:01:02.860 --> 00:01:10.600
One of the things that I do, Michael's showing you, you know, one of the pages from our Channel 9 video site. I help run the on.net show.

00:01:11.160 --> 00:01:17.720
It's not Python, but it is .NET and we do talk about, you know, just a lot of different things in the ecosystem.

00:01:17.720 --> 00:01:19.220
So about-

00:01:19.220 --> 00:01:24.180
You also do Python stuff on some live stream on Twitch and so on, right? Just not on the official .NET channel?

00:01:24.180 --> 00:01:33.220
Yeah, yeah, yeah. So we do do, the live streaming stuff happens on Twitch and YouTube. And, you know, you could always go back and check out like the, you know, the recordings of those tools.

00:01:33.220 --> 00:01:43.260
Really quickly, before we jump to Brian's item, I do want to point out on the screen that's top level statements that C# has added, which is like, let's be more like Python.

00:01:43.260 --> 00:01:45.240
I just think that's kind of an interesting thing, right?

00:01:45.900 --> 00:01:54.660
I think with the last set of, like in C# 9, a lot of the things that came out of the last language feature set, everyone is just like, this looks a lot like Python.

00:01:54.660 --> 00:01:55.900
This looks a lot like Python.

00:01:55.900 --> 00:02:02.920
Wait till .NET 6 and C# 10 come out, then I'll have to see what you say there.

00:02:02.920 --> 00:02:06.660
We're going to use the def keyword and all that. Typing's optional.

00:02:06.660 --> 00:02:07.360
Got it.

00:02:07.360 --> 00:02:09.380
I mean, I don't know. We'll see. We'll see what happens.

00:02:09.380 --> 00:02:13.360
So I might have to check out C# again if it gets close to Python.

00:02:13.500 --> 00:02:15.500
I mean, it's not a bad sign to jump in.

00:02:15.500 --> 00:02:19.200
Yeah. Yeah. Definitely one of the better languages out there. I certainly think so.

00:02:19.200 --> 00:02:21.180
All right, Brian, take us away. What's your first item here?

00:02:21.180 --> 00:02:23.400
Are you going to tell us or else what?

00:02:23.400 --> 00:02:25.980
Yeah. Or else.

00:02:25.980 --> 00:02:33.720
So I actually was intrigued by this because this is, it's an article called the basic, well, what's the article called?

00:02:33.720 --> 00:02:37.620
For else, a weird but useful feature in Python.

00:02:37.620 --> 00:02:39.960
Plus there's a cute avocado stuffy.

00:02:41.100 --> 00:02:47.540
But there's, I'm not used to using else or break in my Python code.

00:02:47.540 --> 00:02:49.740
I just don't do it that much.

00:02:49.740 --> 00:02:52.200
So the, yes, hello birds.

00:02:52.200 --> 00:02:55.880
So the, this is an interesting,

00:02:55.880 --> 00:03:00.800
interesting article about,

00:03:00.800 --> 00:03:02.940
about the else block.

00:03:03.400 --> 00:03:07.680
And what it does is if you've got a for loop and you,

00:03:07.680 --> 00:03:10.120
there's no break inside of it,

00:03:10.120 --> 00:03:11.660
well, then your else will get hit.

00:03:11.660 --> 00:03:17.240
So the only way to use a else effectively is to maybe have a break so that you,

00:03:17.240 --> 00:03:20.360
at some times don't hit it.

00:03:20.560 --> 00:03:23.100
So it's still a little confusing to me.

00:03:23.100 --> 00:03:25.400
So I was reading more.

00:03:25.400 --> 00:03:30.140
The, the article goes on about talking about some examples where you'd want to do it.

00:03:30.340 --> 00:03:34.380
And, and it does explain, it explains it way better than I just did.

00:03:34.380 --> 00:03:36.540
So if you're interested about that, read the article.

00:03:36.780 --> 00:03:40.900
But the explanation of why you would use it.

00:03:40.900 --> 00:03:44.380
My favorite is if you were going to iterate to find an item.

00:03:44.380 --> 00:03:51.360
And you would normally maybe use a found flag or something to say that you found it.

00:03:51.360 --> 00:03:52.780
You don't need to with this.

00:03:52.780 --> 00:03:55.440
You can, you can, once you find the item,

00:03:55.440 --> 00:03:56.640
you can break.

00:03:57.420 --> 00:04:05.320
And then the, and then you'll hop out and the else block will only get run if you did not find the item.

00:04:05.320 --> 00:04:09.720
So that's really pretty much the use case that I think is neat.

00:04:09.720 --> 00:04:11.620
Yeah, I agree with that one.

00:04:11.620 --> 00:04:14.720
And I love the break out of these loops early, you know,

00:04:14.720 --> 00:04:19.860
because we end up so often with super indented code, right?

00:04:19.860 --> 00:04:22.900
It's like, if this is true and if this is true and if this is true,

00:04:22.900 --> 00:04:26.220
and you could put those into a couple of breaks or continues in your loop.

00:04:26.300 --> 00:04:28.620
And then, oh boy, it's nice and flat ish.

00:04:28.620 --> 00:04:29.300
Yeah.

00:04:29.300 --> 00:04:32.940
The, the other, one of the other use cases he brought up was,

00:04:32.940 --> 00:04:35.480
was using it with an exception.

00:04:35.480 --> 00:04:41.300
So if, if you've got an exception, try except block within a for loop.

00:04:41.300 --> 00:04:47.480
And, and you kind of want to know outside whether or not any exceptions were caught.

00:04:47.480 --> 00:04:50.740
You can use the else block to find out if you, if any of the exceptions.

00:04:50.740 --> 00:04:52.020
Man, I can't get behind that.

00:04:52.020 --> 00:04:53.420
Like, I know that's the use case.

00:04:53.420 --> 00:04:55.100
Try this else.

00:04:55.620 --> 00:04:56.920
I can't get behind it.

00:04:56.920 --> 00:05:00.900
I, it's just, it's too, it's too weird for me to think about.

00:05:00.900 --> 00:05:05.260
I, I would, I just never use it because it just seems a little unusual.

00:05:05.260 --> 00:05:07.780
And I know I've talked with some folks on the internet.

00:05:07.780 --> 00:05:13.540
They're like, oh, but this is a way to add like a continuation to your try block that you

00:05:13.540 --> 00:05:14.940
won't overcatch errors.

00:05:14.940 --> 00:05:16.280
And I'm, yeah, I don't know.

00:05:16.280 --> 00:05:17.200
I hear you.

00:05:17.200 --> 00:05:21.580
But I, but this, this else one on the loop, I could, I can see this as a, you know,

00:05:21.580 --> 00:05:23.420
not too bad compared to found flag.

00:05:23.420 --> 00:05:28.740
And then what I want to express before we leave this is if you're going to either put

00:05:28.740 --> 00:05:33.460
a, I think both break or else, if that's in your code, there should be a comment explaining

00:05:33.460 --> 00:05:37.880
what it does because there's a lot of Python developers that won't know what's going on.

00:05:37.880 --> 00:05:38.260
So.

00:05:38.260 --> 00:05:38.840
Yeah.

00:05:38.840 --> 00:05:39.560
So what do you think?

00:05:39.900 --> 00:05:40.060
Yeah.

00:05:40.060 --> 00:05:45.360
I, I actually really like both of them, like both the four, the four else and the, the

00:05:45.360 --> 00:05:51.020
try else only because I think about how much code would I have had to have written otherwise.

00:05:51.020 --> 00:05:52.000
You know what I mean?

00:05:52.000 --> 00:05:52.160
Yeah.

00:05:52.160 --> 00:05:55.180
For me, it just kind of makes those situations a little bit more succinct.

00:05:55.180 --> 00:06:00.260
And I completely understand what you're saying because a part of me also on the other half

00:06:00.260 --> 00:06:03.520
is like, well, I could just put the rest of the code inside the try block.

00:06:03.520 --> 00:06:04.020
Right.

00:06:04.020 --> 00:06:06.800
And then, you know, obviously there's no exception.

00:06:06.800 --> 00:06:08.100
We'll just keep running on.

00:06:08.100 --> 00:06:08.580
Exactly.

00:06:08.780 --> 00:06:09.220
Yeah.

00:06:09.220 --> 00:06:11.800
Like my continuation happens in the same block of code.

00:06:11.800 --> 00:06:14.180
So I completely understand it from that perspective too.

00:06:14.180 --> 00:06:15.220
So I don't know.

00:06:15.220 --> 00:06:16.760
I guess I'm kind of 50, 50 on it.

00:06:16.760 --> 00:06:17.820
I kind of like it.

00:06:17.820 --> 00:06:20.500
I kind of, I'm like, well, we could do it another way.

00:06:20.500 --> 00:06:21.320
So I don't know.

00:06:21.320 --> 00:06:21.840
Yeah.

00:06:21.840 --> 00:06:24.020
And just jumping back a tiny bit.

00:06:24.020 --> 00:06:24.520
That's all.

00:06:24.520 --> 00:06:27.300
Dean has a bit of foreshadowing for you in the live stream.

00:06:27.300 --> 00:06:31.060
John posted in 2022, looking for Pi Sharp developers with 10 years of experience.

00:06:31.060 --> 00:06:32.980
Wow.

00:06:32.980 --> 00:06:38.040
And Rob is out there giving a shout out to Brian's birds.

00:06:38.200 --> 00:06:41.040
I don't know how accurate that emoji is, but it looks pretty legit.

00:06:41.040 --> 00:06:42.040
That's pretty good.

00:06:42.040 --> 00:06:42.340
Yeah.

00:06:42.340 --> 00:06:43.500
We got, I got three here.

00:06:43.500 --> 00:06:45.380
Nice.

00:06:45.380 --> 00:06:45.700
All right.

00:06:45.700 --> 00:06:47.020
I think I got the next one, right?

00:06:47.020 --> 00:06:48.860
So let's talk.

00:06:48.860 --> 00:06:49.740
You were done with this one, right?

00:06:49.740 --> 00:06:50.620
And I didn't steal it from you.

00:06:50.620 --> 00:06:51.440
Yeah.

00:06:51.440 --> 00:06:53.720
And I'm going to, I'm going to step out and cover the birds.

00:06:53.720 --> 00:06:54.220
So.

00:06:54.220 --> 00:06:54.600
Okay.

00:06:54.600 --> 00:06:57.520
Well, I'll tell you about the ORM while we're doing that.

00:06:57.520 --> 00:07:03.400
So probably the two most popular ORMs we have out there are Django ORM.

00:07:03.400 --> 00:07:08.060
And if you're, which really only makes sense if you're actually doing Django or SQLAlchemy.

00:07:08.280 --> 00:07:12.200
And those are both really interesting, but I want to give a shout out to Tortoise ORM.

00:07:12.200 --> 00:07:14.780
I think these names are always interesting.

00:07:14.780 --> 00:07:15.900
Like naming things is hard.

00:07:15.900 --> 00:07:20.920
I always think of databases and database libraries to be awesome if they're fast.

00:07:20.920 --> 00:07:21.480
Yeah.

00:07:21.480 --> 00:07:23.100
The less awesome if they're slow.

00:07:23.100 --> 00:07:25.320
But Tortoise doesn't scream speedy.

00:07:25.320 --> 00:07:34.360
But I think you should think of it more in the speedy side because it's primarily an asyncio object relational mapper inspired by Django.

00:07:34.360 --> 00:07:40.240
So if you were like, I love what Django does, but what I really want is an async version of that.

00:07:40.240 --> 00:07:42.180
Tortoise ORM is a really good example.

00:07:42.180 --> 00:07:48.740
And, you know, it uses the active record design pattern instead of unit of work, which SQLAlchemy uses.

00:07:48.740 --> 00:07:49.840
So it's pretty neat.

00:07:49.840 --> 00:07:51.260
They have a bunch of performance stuff.

00:07:51.260 --> 00:08:00.280
And I really like that they show performance against many different ORMs, not just Django and SQLAlchemy, but other ones like Pony and Kiwi and a lot of different use cases.

00:08:00.280 --> 00:08:00.900
You can get a sense.

00:08:00.900 --> 00:08:01.820
Like it's pretty fast.

00:08:01.820 --> 00:08:03.960
It's not raging fast, but it's async.

00:08:03.960 --> 00:08:07.060
So that's a really, really good option there.

00:08:07.060 --> 00:08:09.060
Super simple to use.

00:08:09.060 --> 00:08:14.000
When you install it, you typically need to install the underlying database driver that it's going to use.

00:08:14.000 --> 00:08:17.900
So if you're going to use it with Postgres, you install asyncpg.

00:08:17.900 --> 00:08:22.720
If you're going to use it with MySQL, you install AIO, MySQL, and so on along with it.

00:08:22.720 --> 00:08:24.800
But if you look at the code, it's super simple.

00:08:24.800 --> 00:08:34.820
And if you're familiar with Django, you go and create the fields as members of a class equal to some descriptor like fields.intfield or field.textfield.

00:08:34.820 --> 00:08:38.560
Set them have indexes and so on.

00:08:38.560 --> 00:08:41.980
What's really nice is there's like really good modeling of relationships.

00:08:41.980 --> 00:08:49.060
So there's like fields.foreignkeyfield, fields.mini2misfield, and it talks about the relations and so on.

00:08:49.060 --> 00:08:51.240
So yeah, this is a really nice RM.

00:08:51.240 --> 00:08:54.940
If you're looking for something async that is like Django, give this a shot.

00:08:54.940 --> 00:08:55.940
It's pretty popular.

00:08:55.940 --> 00:08:57.440
It has almost 2,000 GitHub stars.

00:08:57.440 --> 00:08:59.360
It was updated two days ago.

00:08:59.360 --> 00:09:01.960
So yeah, it seems like a nice, happy project.

00:09:02.420 --> 00:09:03.140
This looks pretty cool.

00:09:03.140 --> 00:09:12.040
When you were showing that installation section just now, so you still have to install like the async versions of, I guess, that particular database's driver.

00:09:12.040 --> 00:09:15.820
So async MySQL, async Postgres, and things of that nature.

00:09:15.820 --> 00:09:20.880
So I'm guessing what this adds, kind of like what you said, is that active record programming model.

00:09:20.880 --> 00:09:23.900
So if you want to write your code in that style, you know what I mean?

00:09:23.900 --> 00:09:31.200
I can write it and then now I could just switch, swap out the database driver and I could point to a different database implementation if I wanted to.

00:09:31.200 --> 00:09:31.980
Yeah, exactly.

00:09:31.980 --> 00:09:33.600
I think it does two things.

00:09:33.600 --> 00:09:37.940
One is there's always like database dialects, like how do you express parameters?

00:09:37.940 --> 00:09:40.760
Question mark or at parameter name or whatever, right?

00:09:40.760 --> 00:09:41.820
I think it handles that.

00:09:41.820 --> 00:09:46.560
And then a lot of those drivers, they're async, but they only work in raw SQL.

00:09:46.560 --> 00:09:49.780
So select star from such and such and so on.

00:09:49.780 --> 00:09:52.800
And so this just gives you the ORM wrapper on top of it.

00:09:52.800 --> 00:09:59.740
But I think it does this dependency thing because otherwise it would have to install like every driver it supports.

00:09:59.740 --> 00:10:00.420
Sure.

00:10:00.420 --> 00:10:02.000
And, you know, that would be a hassle, right?

00:10:02.000 --> 00:10:03.020
Because you only want one.

00:10:03.020 --> 00:10:04.180
Yeah, that would be a little messy.

00:10:04.180 --> 00:10:04.880
Yeah.

00:10:04.880 --> 00:10:06.060
Why does it take so long to install?

00:10:06.060 --> 00:10:08.320
Well, it's installing every database driver it can think of.

00:10:08.320 --> 00:10:09.420
No, this is pretty cool.

00:10:09.420 --> 00:10:09.800
I like it.

00:10:09.800 --> 00:10:10.420
Brian, what do you think?

00:10:10.420 --> 00:10:12.760
Actually, I think it's pretty great.

00:10:12.760 --> 00:10:17.520
And I was actually starting to look at an ORM for a new project.

00:10:17.520 --> 00:10:18.820
So I might check this out.

00:10:18.820 --> 00:10:20.200
Yeah, I like it pretty well.

00:10:20.200 --> 00:10:22.380
It's got some really simple ways to program it.

00:10:22.740 --> 00:10:27.200
You can create one of these objects and then you just await tournament.save.

00:10:27.200 --> 00:10:32.620
If it's a tournament in this case, or it has like a factory sort of create method for queries.

00:10:32.620 --> 00:10:37.880
You go do some kind of query, then just await a class.filter type of thing.

00:10:37.880 --> 00:10:39.020
And it even does like the join.

00:10:39.020 --> 00:10:41.740
So you don't end up with the N plus one performance problems.

00:10:41.740 --> 00:10:46.680
One thing I guess I would throw out there is it seems to me like this is 100% async.

00:10:46.860 --> 00:10:51.020
So if you're going to use it, you have to create an event loop and just run it in there.

00:10:51.020 --> 00:10:55.020
And if your app is not very asyncy, then it might be kind of a hassle to use.

00:10:55.020 --> 00:10:56.180
I'm not totally sure about that.

00:10:56.180 --> 00:11:04.060
It used to be that there were these wrappers you could get that would take non-async libraries and database libraries and stuff and make them async by putting them on threads.

00:11:04.320 --> 00:11:09.200
I can see a world where we get back to wrappers that make them sync so they're easier to use if you don't want to do async.

00:11:09.200 --> 00:11:09.740
Yeah.

00:11:09.740 --> 00:11:17.680
I know one of the things for me that's always been a little challenging is when you have like these async database things, like how do I test them?

00:11:17.680 --> 00:11:18.440
You know what I mean?

00:11:18.600 --> 00:11:27.040
I always find like testing, at least when it comes to unit testing, testing asyncio things is relatively non-trivial.

00:11:27.040 --> 00:11:27.900
You know what I mean?

00:11:27.900 --> 00:11:28.100
Yeah.

00:11:28.100 --> 00:11:35.020
Like I have a thing that uses motor, like so the MongoDB async library, and I'm using it in FastAPI.

00:11:35.020 --> 00:11:37.540
And, you know, FastAPI does this injection thing.

00:11:37.540 --> 00:11:38.540
I'm like, oh, great.

00:11:38.540 --> 00:11:42.220
My code is clean because I'm, you know, I'm separating concerns and I'm doing all this thing.

00:11:42.220 --> 00:11:44.720
Man, like how do I test this thing?

00:11:44.720 --> 00:11:45.840
Like how do I...

00:11:45.840 --> 00:11:48.440
Brian, do you got any advice on testing async things?

00:11:48.920 --> 00:11:54.660
Well, I don't right now, but I think that'd be a great topic to explore and try to get some people on the podcast.

00:11:54.660 --> 00:11:55.440
Yeah.

00:11:55.440 --> 00:11:56.340
Yeah, I agree.

00:11:56.340 --> 00:11:57.360
Yeah, that'd be great.

00:11:57.360 --> 00:11:59.800
If you ever write like part two of your book, I'd love to see it.

00:11:59.800 --> 00:12:05.020
Well, there's a second edition coming out, but it doesn't include async.

00:12:05.020 --> 00:12:07.240
It hasn't published yet, has it?

00:12:07.240 --> 00:12:08.580
There's still time for another chapter.

00:12:08.580 --> 00:12:09.620
There you go.

00:12:09.620 --> 00:12:10.520
There you go.

00:12:10.520 --> 00:12:18.420
Jumping back, I did see that Brett Cannon had an interesting...

00:12:18.420 --> 00:12:20.840
comment about the else clause.

00:12:20.840 --> 00:12:23.060
One of the benefits is that...

00:12:23.060 --> 00:12:23.320
Hey, Brett.

00:12:23.320 --> 00:12:27.500
Makes you look like a Python expert in code reviews when you suggest people use it.

00:12:27.500 --> 00:12:28.360
So...

00:12:28.360 --> 00:12:31.180
I think that's funny.

00:12:31.180 --> 00:12:32.520
Yeah, that is funny.

00:12:32.520 --> 00:12:35.040
Yeah, a lot of thoughts here on the else clause.

00:12:35.040 --> 00:12:36.380
I do think it's one of these things.

00:12:36.380 --> 00:12:37.240
It's a little unusual.

00:12:37.240 --> 00:12:40.380
Like a lot of languages have like, oh, we all have the while loop.

00:12:40.380 --> 00:12:41.300
We all have the for loop.

00:12:41.300 --> 00:12:42.140
We all have the statements.

00:12:42.140 --> 00:12:43.040
They all look like this.

00:12:43.040 --> 00:12:44.740
And this is kind of a little bit different.

00:12:44.900 --> 00:12:45.820
So it's kind of interesting.

00:12:45.820 --> 00:12:46.480
All right.

00:12:46.480 --> 00:12:46.960
Cool.

00:12:46.960 --> 00:12:48.080
Cecil, you're up next, right?

00:12:48.080 --> 00:12:49.060
Yeah, I am.

00:12:49.060 --> 00:12:54.420
So I ran into this post about faster Python with Go shared objects, which I thought was

00:12:54.420 --> 00:12:56.000
a really interesting read.

00:12:56.000 --> 00:13:00.900
Mainly for me, I'm really into like language interrupt, right?

00:13:00.900 --> 00:13:02.780
Like the fast part is cool and I get it.

00:13:02.780 --> 00:13:05.500
Like fast is always a relative thing that we could consider.

00:13:05.500 --> 00:13:07.460
What do we really consider to be fast or not?

00:13:07.640 --> 00:13:11.160
But, you know, it's always interesting for me to see how we can take one language and

00:13:11.160 --> 00:13:12.860
another and kind of plug them together.

00:13:12.860 --> 00:13:13.580
You know what I mean?

00:13:13.580 --> 00:13:18.400
Because I'm a big believer in let's, you know, let the thing do what it's best at.

00:13:18.400 --> 00:13:19.180
You know what I mean?

00:13:19.180 --> 00:13:22.360
Like, so for instance, Python is really good at doing certain things.

00:13:22.360 --> 00:13:23.340
Let Python do that.

00:13:23.340 --> 00:13:25.000
Or Go is really good at doing certain things.

00:13:25.000 --> 00:13:26.060
Let Go do that.

00:13:26.060 --> 00:13:28.180
But now how do we plug these worlds together?

00:13:28.640 --> 00:13:33.220
And so this article kind of goes through talking about how, you know, within Go, you can create

00:13:33.220 --> 00:13:35.520
these things called shared libraries.

00:13:35.520 --> 00:13:40.540
And I believe what it does is that it outputs a .so file or a .dl file.

00:13:40.540 --> 00:13:41.120
Yeah.

00:13:41.120 --> 00:13:46.280
And then based on that in Python, you could use something like ctypes or this article actually

00:13:46.280 --> 00:13:48.780
even references something called cffi.

00:13:48.780 --> 00:13:50.320
I've never heard about cffi.

00:13:50.320 --> 00:13:52.180
I don't know if y'all have spoken about it before.

00:13:52.180 --> 00:13:56.240
Yeah, it's a more modern interop layer between c libraries.

00:13:56.240 --> 00:13:57.920
Yeah, I think they mentioned it as well.

00:13:58.300 --> 00:13:59.080
Yeah, yeah, right there.

00:13:59.080 --> 00:13:59.940
Yeah.

00:13:59.940 --> 00:14:04.080
So it mentions using things like cffi, for instance, to be able to load some of these

00:14:04.080 --> 00:14:06.720
files and do interop, which I think is actually pretty cool.

00:14:06.720 --> 00:14:11.400
You know, it does also talk about some of the pros and cons, which I think are very important

00:14:11.400 --> 00:14:11.920
to discuss.

00:14:11.920 --> 00:14:16.600
So for instance, this says, well, it's really good if you're just passing around like primitive

00:14:16.600 --> 00:14:17.040
types.

00:14:17.040 --> 00:14:21.140
But now when you want to pass around like more complex types, like, you know, dictionaries

00:14:21.140 --> 00:14:25.160
and classes and things of that nature, then it becomes a little bit more tricky to do.

00:14:25.160 --> 00:14:28.280
But, you know, again, just in terms of, hey, I have this thing.

00:14:28.280 --> 00:14:33.360
I want to pass on to go to maybe, I don't know, maybe go runs it in the background or,

00:14:33.360 --> 00:14:38.820
you know, runs this microservice thing that, you know, does Docker and Kubernetes or whatever

00:14:38.820 --> 00:14:39.420
the case is.

00:14:39.420 --> 00:14:43.660
You know, we could leverage both ecosystems to, again, have them do what they're good at

00:14:43.660 --> 00:14:46.700
and kind of like just plug them together, which I think is a pretty cool read.

00:14:47.120 --> 00:14:50.000
I'd love to hear what folks think about it after they read through it.

00:14:50.000 --> 00:14:51.720
Yeah, I think it looks really interesting.

00:14:51.720 --> 00:14:56.780
You know, one of the powers of Python is this interoperability, mostly around C, but also

00:14:56.780 --> 00:14:59.780
other things like weird things like Fortran and so on, right?

00:14:59.780 --> 00:15:05.000
Like people say, oh, well, doing math with Python is super slow relative to C++ or whatever.

00:15:05.200 --> 00:15:08.780
And yet data science is so popular where it's almost all math, right?

00:15:08.780 --> 00:15:11.280
How do you square these two things?

00:15:11.280 --> 00:15:12.240
Like, how do you make them work?

00:15:12.240 --> 00:15:17.660
And it's because a lot of that gets pushed down into some more native layer, like a C layer.

00:15:17.660 --> 00:15:20.080
You just hand off the data and then zip it.

00:15:20.080 --> 00:15:21.240
The real work happens there.

00:15:21.260 --> 00:15:25.060
And this seems like another really cool way to do that, right?

00:15:25.060 --> 00:15:30.660
Something that works really well in Go, write a package, wrap up the Go bits, put them in a wheel,

00:15:30.660 --> 00:15:33.080
hip install them, and people don't have to know.

00:15:33.080 --> 00:15:36.380
It's also not just what the language can do best.

00:15:36.380 --> 00:15:37.980
It's what the developers can do best.

00:15:37.980 --> 00:15:42.840
And if you've got somebody that's really good at Go working on part of the problem,

00:15:42.840 --> 00:15:45.220
being able to connect them together is a good idea.

00:15:45.660 --> 00:15:53.940
I think that we're far away from the time where people just had one language that they knew anyway.

00:15:53.940 --> 00:15:57.080
And I don't know if we ever were there.

00:15:57.080 --> 00:16:03.240
But definitely, you know, early in my career, there were some C and C++ developers that that's all they knew.

00:16:03.240 --> 00:16:05.560
A little shell scripting.

00:16:05.560 --> 00:16:07.880
But I don't find that anymore.

00:16:07.880 --> 00:16:10.880
And I think most Python developers know some other language as well.

00:16:10.880 --> 00:16:12.400
Yeah, like CSS.

00:16:12.400 --> 00:16:13.880
They typically program in CSS.

00:16:13.880 --> 00:16:15.000
That's just the bad.

00:16:15.000 --> 00:16:16.200
That's what the bad surveys ask.

00:16:16.200 --> 00:16:17.160
No, but you're right.

00:16:17.160 --> 00:16:20.540
And it's also not just about knowing the language.

00:16:20.540 --> 00:16:24.500
It's about, well, we spent two years building this other library and it works.

00:16:24.500 --> 00:16:26.240
Can we just use that over here?

00:16:26.240 --> 00:16:29.660
Like this interop for just reuse is really powerful as well.

00:16:29.660 --> 00:16:30.500
Yeah, definitely.

00:16:30.500 --> 00:16:31.260
Yeah.

00:16:31.260 --> 00:16:35.320
I always found when I was growing up, you know, when I went through college, you know,

00:16:35.320 --> 00:16:41.060
my professors always told me any good programming, good programmer knows like three or four different languages.

00:16:41.060 --> 00:16:43.200
Like that's, you know, what they kept drilling into us.

00:16:43.680 --> 00:16:48.560
And it's funny, we always talked about learning different languages, but we never ever spoke about putting them together.

00:16:48.560 --> 00:16:49.420
You know what I mean?

00:16:49.420 --> 00:16:51.020
And kind of like what you were saying, right?

00:16:51.020 --> 00:16:52.540
I feel like that's kind of where we are.

00:16:52.540 --> 00:16:54.860
Like no one knows one language.

00:16:54.860 --> 00:17:00.160
You know, like no one that works in a company in a really productive ecosystem does one thing.

00:17:00.220 --> 00:17:06.980
You probably know some JavaScript and some Python and some, you know, Go and Rust and SQL and like there's stuff in there.

00:17:06.980 --> 00:17:12.000
But how do we put that stuff together in a very clean and like maintainable way?

00:17:12.000 --> 00:17:12.540
Yeah.

00:17:12.540 --> 00:17:19.420
Another thing, you know, thinking back to the times when we were all in college, so much of what we did was like really low level.

00:17:19.420 --> 00:17:21.980
Like, oh, I need to, you know, load this file.

00:17:21.980 --> 00:17:25.460
So I got to write the binary bits to parse this file, right?

00:17:25.460 --> 00:17:27.680
It was like super low level and it took a long time.

00:17:27.680 --> 00:17:29.440
And these days it's more about Lego blocks.

00:17:29.440 --> 00:17:32.960
Get this thing, that thing, click them together and make that piece go over there, right?

00:17:32.960 --> 00:17:36.420
And this whole interop for that is also, you know, makes sense in that world.

00:17:36.800 --> 00:17:36.920
Yeah.

00:17:36.920 --> 00:17:44.260
Well, we have some, you have some cool, I want to plug your stuff.

00:17:44.260 --> 00:17:45.320
So we don't have a sponsor.

00:17:45.320 --> 00:17:47.080
So we'll plug your training.

00:17:47.080 --> 00:17:47.300
Yeah.

00:17:47.300 --> 00:17:47.420
So, yeah.

00:17:47.420 --> 00:17:48.340
Thanks, man.

00:17:48.340 --> 00:17:49.160
I appreciate it.

00:17:49.160 --> 00:17:49.280
Yeah.

00:17:49.280 --> 00:17:52.140
Well, you, let me, I'll be specific about something.

00:17:52.140 --> 00:18:00.020
Something that I think if you dug through the course catalog, there's a little coming soon graphic, but people probably don't know is we're about to release a course on Dask.

00:18:00.020 --> 00:18:03.460
So Dask is a way to do like pandas type stuff.

00:18:03.540 --> 00:18:16.260
But if it needs to load 10 terabytes of data and that won't fit even on your hard drive, or you want to run it across, you know, 16 cores on your machine across 10 machines, you just write pandas code, but you point it somewhere else.

00:18:16.260 --> 00:18:19.340
And it just parallelizes that beautifully with this cool little dashboard.

00:18:19.340 --> 00:18:23.720
So anyway, there's a free course coming on Dask that people will be able to take really, really soon.

00:18:23.720 --> 00:18:24.420
That'll be fun.

00:18:24.420 --> 00:18:25.320
No, it's good.

00:18:25.320 --> 00:18:27.140
I think everybody should check out your course catalog.

00:18:27.140 --> 00:18:33.460
And one of the best things that happened to the Python community was when you quit your full time job and started working on this full time.

00:18:33.460 --> 00:18:34.600
Thanks.

00:18:34.600 --> 00:18:36.740
A short four or five years ago.

00:18:36.740 --> 00:18:40.660
I would definitely concur with that.

00:18:40.660 --> 00:18:46.320
I'm curious about Dask too, because I remember you all speaking about it in a previous podcast.

00:18:47.080 --> 00:18:50.240
And I always wondered, oh, wow, is this only for pandas?

00:18:50.240 --> 00:18:54.760
Or can I use Dask to just run remote Python anywhere I wanted to?

00:18:54.760 --> 00:18:59.000
I think you can actually, I do think you can make it run remote Python.

00:18:59.000 --> 00:19:04.540
The simple use case is sort of import something different that looks like pandas and use it, you know?

00:19:04.540 --> 00:19:09.900
But I think there's a way, there's like a lower level set of libraries that do that orchestration.

00:19:09.900 --> 00:19:11.140
You probably could use it.

00:19:11.140 --> 00:19:12.820
I'm trying to remember and make sure that that's the right one.

00:19:12.860 --> 00:19:16.520
I think that's what Matthew Rockland pointed out when we were talking about it.

00:19:16.520 --> 00:19:17.460
So, yeah, quite cool.

00:19:17.460 --> 00:19:22.560
Yeah, because that would make, for me, makes Python really interesting from a distributed systems perspective.

00:19:22.560 --> 00:19:23.060
Yeah.

00:19:23.060 --> 00:19:29.360
Again, we think about like containers and multiple VMs and even just talking across boundaries of networks, right?

00:19:29.360 --> 00:19:30.080
Yeah.

00:19:30.080 --> 00:19:33.580
Yeah, and just being able to import my library and run it.

00:19:33.580 --> 00:19:34.320
You know what I mean?

00:19:34.320 --> 00:19:35.260
Yeah, absolutely.

00:19:35.260 --> 00:19:36.080
Super cool.

00:19:36.080 --> 00:19:37.220
All right, Brian, you got the next one?

00:19:37.220 --> 00:19:37.900
Yeah.

00:19:37.900 --> 00:19:45.800
So, speaking of learning to code, you know, as you go on with your learning to code, there's tutorials and stuff.

00:19:45.800 --> 00:19:51.520
But then you want to get into really finding out how things, people are really solving problems all over the place.

00:19:51.520 --> 00:19:57.900
And a great discussion around that is to, and good recommendations, is to just go read some code.

00:19:57.900 --> 00:19:59.040
You need to read a lot of code.

00:19:59.440 --> 00:20:01.620
And there's problems with that, though.

00:20:01.620 --> 00:20:04.820
And so, this is an interesting article I'm going to link to.

00:20:04.820 --> 00:20:11.600
Learning to read code, Python Standard Library Design Decisions Explained for Advanced Beginners.

00:20:11.600 --> 00:20:13.360
That's an interesting term, advanced beginners.

00:20:13.360 --> 00:20:17.520
But, so, there's an interesting discussion around this.

00:20:17.520 --> 00:20:18.940
So, the standard library is there.

00:20:18.940 --> 00:20:20.600
So, that's a great thing to go look at.

00:20:20.600 --> 00:20:21.320
It's available.

00:20:21.320 --> 00:20:25.540
And all of it's there, so you can read all of it.

00:20:25.540 --> 00:20:30.200
But there's some interesting caveats and some in both good and bad.

00:20:30.200 --> 00:20:31.720
So, there's pros and cons.

00:20:31.720 --> 00:20:33.840
One of the pros is all the peps are around.

00:20:33.840 --> 00:20:38.380
So, you can read the design decisions of why things are the way they are.

00:20:38.380 --> 00:20:41.760
And some of the history and what problem they're trying to solve.

00:20:41.760 --> 00:20:48.620
That's actually an incredible benefit because I don't even get that with, like, internal code often with a company.

00:20:49.500 --> 00:20:52.900
It's often just the code that was left to me that I have to maintain.

00:20:52.900 --> 00:20:54.520
So, this is kind of neat.

00:20:54.520 --> 00:20:57.880
And usually, it was done just enough to work and then we're done with it.

00:20:57.880 --> 00:20:59.360
Yeah.

00:20:59.360 --> 00:21:03.560
So, and Python gets to improve on itself, which is nice.

00:21:03.560 --> 00:21:08.900
The downside is there's a lot of it and a lot of it's really old.

00:21:08.900 --> 00:21:11.280
So, there's some code in there from 10 to 20 years ago.

00:21:11.800 --> 00:21:16.260
And there's what's Pythonic now might not have been Pythonic then.

00:21:16.260 --> 00:21:18.660
So, maybe not best practices.

00:21:18.660 --> 00:21:22.380
I don't know this firsthand, but this is a comment from the article.

00:21:22.380 --> 00:21:23.820
So, I think that's fair.

00:21:23.820 --> 00:21:26.940
And also, you don't really want to learn.

00:21:26.940 --> 00:21:35.040
This isn't necessarily from the Python Center Library, but just picking something that you use on GitHub.

00:21:35.560 --> 00:21:37.320
It could be incredibly useful.

00:21:37.320 --> 00:21:39.320
That doesn't mean that it's coded well, though.

00:21:39.320 --> 00:21:41.080
So, it might not be a good example for coding.

00:21:41.080 --> 00:21:50.400
So, the author has three or four different standard libraries that it recommends, which is pretty interesting.

00:21:50.400 --> 00:21:52.440
The statistics module.

00:21:52.440 --> 00:21:57.580
It says the code is simple and it's fairly well documented.

00:21:57.580 --> 00:21:58.780
And the PEP describes...

00:21:58.780 --> 00:22:01.340
I think it's also pretty new, which is kind of a...

00:22:01.340 --> 00:22:01.700
Oh, really?

00:22:01.700 --> 00:22:02.060
Good.

00:22:02.060 --> 00:22:04.020
I'm not sure when the statistics...

00:22:04.020 --> 00:22:04.640
But it was added.

00:22:04.640 --> 00:22:06.000
It didn't come originally.

00:22:06.000 --> 00:22:07.260
It's been added after a while.

00:22:07.260 --> 00:22:12.380
But there's other things around that people use statistics for statistics.

00:22:12.380 --> 00:22:21.740
So, the PEP apparently talks about design decisions about not trying to reimplement NumPy or something like that within the standard library.

00:22:21.740 --> 00:22:23.680
But just have basic statistics.

00:22:23.680 --> 00:22:27.000
3.4, by the way, is when statistics showed up.

00:22:27.000 --> 00:22:27.620
Oh, yeah.

00:22:27.900 --> 00:22:29.400
So, it's not that old, right?

00:22:29.400 --> 00:22:29.760
Yeah.

00:22:29.760 --> 00:22:33.140
And actually, the next two are fairly recent as well.

00:22:33.140 --> 00:22:38.240
Pathlib is recommended because it's extremely well documented.

00:22:38.240 --> 00:22:40.020
And it's...

00:22:40.020 --> 00:22:41.360
Oh, no.

00:22:41.360 --> 00:22:44.100
And object-oriented, good object-oriented example.

00:22:44.100 --> 00:22:48.420
There's not a lot of object-oriented examples out there in Python because a lot of people don't use it.

00:22:48.420 --> 00:22:49.480
So, it's good.

00:22:49.480 --> 00:22:53.480
Also, a nice comparative study because we already had OSPath.

00:22:53.560 --> 00:22:58.240
So, you can look at how OSPath solved it versus Pathlib solving the same problem.

00:22:58.240 --> 00:22:58.960
That's kind of neat.

00:22:58.960 --> 00:23:06.040
Data classes is apparently very well documented.

00:23:06.040 --> 00:23:10.780
And I'm not sure what else I was going to say because I wrote down, it's a good example of data classes.

00:23:10.780 --> 00:23:12.160
That doesn't make sense.

00:23:12.540 --> 00:23:16.880
It may be the very best example of data classes implementation.

00:23:16.880 --> 00:23:17.820
Yeah.

00:23:17.820 --> 00:23:18.280
Or the only.

00:23:19.000 --> 00:23:26.580
And then Graphlib, which says it's a bonus, but it's interesting because it does one thing.

00:23:26.580 --> 00:23:33.100
It's an implementation of a topological sort algorithm, which I'm not exactly 100% sure what that is.

00:23:33.100 --> 00:23:34.800
But it's a narrow problem.

00:23:35.640 --> 00:23:42.740
And there's no PEP, but apparently there's an issue that the article links to with a long thread discretion.

00:23:42.740 --> 00:23:47.600
And the interesting thing about this isn't the discussion about how it should be implemented.

00:23:47.600 --> 00:23:51.100
It's the discussion of what the API should look like.

00:23:51.100 --> 00:23:55.000
So, how it should be used from a user perspective.

00:23:55.220 --> 00:24:00.300
And that actually seems fascinating to me because I think we need to talk about that more of people.

00:24:00.300 --> 00:24:09.960
How designing APIs and coming to terms with that is almost more important than what the code looks like.

00:24:09.960 --> 00:24:12.320
Because you have to live with the API.

00:24:12.320 --> 00:24:14.440
You can change the code later if you need to.

00:24:14.440 --> 00:24:15.360
Yeah.

00:24:15.360 --> 00:24:17.460
That's a good point because you can refactor internally.

00:24:17.460 --> 00:24:19.620
But yeah, the API you're stuck with.

00:24:19.620 --> 00:24:23.280
Unless you're like one of the packages I use for security on the website today.

00:24:23.280 --> 00:24:27.940
That just completely changed a bunch of the module names and submodules and moved classes around.

00:24:27.940 --> 00:24:33.800
And then my website in dev, not in production, wouldn't start after I updated it.

00:24:33.800 --> 00:24:35.460
I'm like, well, I don't understand.

00:24:35.460 --> 00:24:38.300
Shouldn't there be at least a deprecation warning for a little bit or something?

00:24:38.300 --> 00:24:38.820
Nope.

00:24:38.820 --> 00:24:39.660
Oh, well.

00:24:39.660 --> 00:24:43.600
One of the things I really like about articles like this.

00:24:43.600 --> 00:24:44.440
Oh, I'm sorry.

00:24:44.440 --> 00:24:45.280
Yeah, I was going to say.

00:24:45.280 --> 00:24:51.060
One of the things I really like about articles like this is, you know, we often talk about like the beginner path.

00:24:51.060 --> 00:24:52.840
Like how do I get started with a thing?

00:24:53.220 --> 00:24:59.180
But after we've, you know, you know, brought all these beginners together, like how do I take you from beginner plus plus?

00:24:59.180 --> 00:25:00.860
Like what is like the next step look like?

00:25:00.860 --> 00:25:05.160
And, you know, you always hear folks talk about just you got to read code, right?

00:25:05.160 --> 00:25:13.100
Like go to GitHub and click browse and kind of just dig around projects that you're interested in and things you want to learn about and kind of just try and understand how it works.

00:25:13.100 --> 00:25:13.300
Right.

00:25:13.300 --> 00:25:21.100
Like if you want to understand how Flask works, if you want to see how folks use different things and FastAPI or Django or even Tortoise that Michael was showing a little while ago.

00:25:21.440 --> 00:25:23.020
I mean, just it's open source, right?

00:25:23.020 --> 00:25:24.420
And that's the beauty about it.

00:25:24.420 --> 00:25:24.740
Yeah.

00:25:24.740 --> 00:25:29.400
You just go on GitHub and just read the code and then, you know, change it, right?

00:25:29.400 --> 00:25:32.720
Change it on your machine and see what it does and see, does it get faster?

00:25:32.720 --> 00:25:33.480
Is it slower?

00:25:33.740 --> 00:25:35.440
Is it more or less readable?

00:25:35.440 --> 00:25:37.340
You know, do you understand it a little better?

00:25:37.340 --> 00:25:38.720
Did the test make sense?

00:25:38.720 --> 00:25:42.640
Brian could tell you about like writing good tests for different packages and stuff.

00:25:42.640 --> 00:25:45.160
But I think we need to do more of this.

00:25:45.160 --> 00:25:52.760
Like, and we as like an industry, because I feel like we're like a drowning in how to get started content now on this level.

00:25:52.760 --> 00:25:53.580
You know what I mean?

00:25:53.580 --> 00:26:02.700
Let's go like one step above that now and start to talk about like what is the step two, three, four look like, you know, between junior and senior.

00:26:03.180 --> 00:26:04.320
Yeah, there's definitely that cliff.

00:26:04.320 --> 00:26:06.940
Brian, you got a learning curve here to back this up?

00:26:06.940 --> 00:26:07.540
Yeah.

00:26:07.540 --> 00:26:09.940
No, I just saw this interesting graphic.

00:26:09.940 --> 00:26:10.700
I think you muted, Brian.

00:26:10.700 --> 00:26:12.100
Oh, yeah.

00:26:12.100 --> 00:26:18.140
I saw this interesting graphic and I kind of related to it really well in production.

00:26:18.140 --> 00:26:22.260
I'm not sure about the early parts of the learning curve.

00:26:22.260 --> 00:26:31.300
But the end part is welcome to production programming where there's strange mission critical code left behind by the last developer.

00:26:32.600 --> 00:26:36.720
And I mean, actually, this is, you know, funny, but also it's true.

00:26:37.360 --> 00:26:44.020
In, you know, production code in a company, you often have to support code that you don't know what the decisions are.

00:26:44.020 --> 00:26:44.640
You don't.

00:26:44.640 --> 00:26:47.400
It's just it's working, but you're not sure why it's working.

00:26:47.400 --> 00:26:50.180
And yeah, there's some strange stuff.

00:26:50.180 --> 00:26:50.680
Yeah.

00:26:51.040 --> 00:26:53.820
It can definitely get weird in that stage.

00:26:53.820 --> 00:27:00.860
But Cecil, I agree that going from like, oh, I learned, learned the language so I can actually do stuff that there's a huge gap right there.

00:27:01.500 --> 00:27:07.920
Dean out in the live stream says, I wonder if some design decisions that were best in the 90s are less optimal today.

00:27:07.920 --> 00:27:12.760
I feel like in the 90s it was all about object, object orienting all the things.

00:27:12.940 --> 00:27:17.840
And then there was like a push, like, you know, maybe that's not the best way to just develop everything.

00:27:17.840 --> 00:27:20.840
Like maybe a little bit mix, a little bit of composition and so on.

00:27:20.840 --> 00:27:21.760
That's fun.

00:27:21.760 --> 00:27:30.600
And then John says, coming from a number of other languages, when I first started using Python, I took a conscious effort to seek out learning the idiomatic on way of doing things.

00:27:30.600 --> 00:27:34.620
And I think that's really important because it's so easy to just get it to work and then like leave it there.

00:27:34.620 --> 00:27:36.200
And you're like, no one would ever do this.

00:27:36.200 --> 00:27:40.100
Well, you wouldn't like put your number in a fake for loop that increments that.

00:27:40.100 --> 00:27:41.600
And it goes the other way, too.

00:27:41.600 --> 00:27:52.540
So like Cecil mentioned, real developers, if you work a professional developer is going to know several languages.

00:27:53.180 --> 00:28:01.040
But it's not just knowing three languages and knowing how to code C in three different languages.

00:28:01.040 --> 00:28:05.860
It's about learning the idiomatic way to do Python.

00:28:05.860 --> 00:28:10.640
It's learning how to do C# the way other C# developers do it.

00:28:10.640 --> 00:28:16.640
It's not just about trying to translate your own language into three languages or something.

00:28:16.640 --> 00:28:20.460
And it's even simple stuff like variable naming and function naming, right?

00:28:20.560 --> 00:28:24.440
In Java, you start with a lowercase letter, then have camel case in a Python.

00:28:24.440 --> 00:28:25.540
It's all lowercase.

00:28:25.540 --> 00:28:26.240
C#.

00:28:26.240 --> 00:28:30.200
I mean, it's just like this person clearly is not of this ecosystem.

00:28:30.200 --> 00:28:33.920
Like you can just tell straight away just by weird things like naming that are so easy to change.

00:28:33.920 --> 00:28:34.380
Yeah.

00:28:34.380 --> 00:28:39.860
I think that's one of the things you see a lot when people do like those auto-generated libraries.

00:28:39.860 --> 00:28:45.500
You know, so I know some folks, if you're familiar with things like OpenAPI and Autoress and things of that nature,

00:28:45.500 --> 00:28:50.260
like you point a thing at your API definition, it just generates stuff.

00:28:50.260 --> 00:28:50.840
Right?

00:28:50.840 --> 00:28:53.400
But what if the casing doesn't match, right?

00:28:53.400 --> 00:28:58.440
So if I generate like a Java library and a JavaScript library and a Python library, you know,

00:28:58.440 --> 00:29:02.040
but like the casing is going to be different across all those idiomatically.

00:29:02.040 --> 00:29:08.380
But like now these code generator things have to kind of take that into consideration as they're building out these libraries.

00:29:08.380 --> 00:29:13.420
Your classes like Pydantic that automatically map them over now have to look like Java classes or whatever.

00:29:13.680 --> 00:29:16.300
I did see in Pydantic that you can now have an alias.

00:29:16.300 --> 00:29:22.680
So it's like this is what it looks like in JavaScript, but it has this other proper name, like this Python name in Python,

00:29:22.680 --> 00:29:23.760
which is I think it's kind of cool.

00:29:23.760 --> 00:29:24.300
All right.

00:29:24.300 --> 00:29:28.080
Let's talk about something that's really fun and visual.

00:29:28.320 --> 00:29:32.040
So there's this thing called Bradio, Gradio, something.

00:29:32.040 --> 00:29:34.140
I'm messing up the pronunciation.

00:29:34.140 --> 00:29:36.860
I'm sure this comes to us from David Smith.

00:29:36.860 --> 00:29:38.500
So thanks for sending that over.

00:29:38.500 --> 00:29:44.780
And this is a really cool way to add simple interactive UIs to your machine learning scripts.

00:29:45.020 --> 00:29:51.120
So it says generate an easy to use UI for your ML model function or API with only a few lines of code

00:29:51.120 --> 00:29:55.300
and integrate it directly into your Python notebook or share a link with anyone.

00:29:55.300 --> 00:30:02.080
So here, like all beautiful user interface things, it actually has not just graphics, but interactive graphics.

00:30:02.080 --> 00:30:07.260
So you might import Gradio and then write the code that implements it

00:30:07.260 --> 00:30:12.360
and then just give it the function that it wants to use and say the input is a sketchpad

00:30:12.360 --> 00:30:15.660
and the output is a label run and that's the implementation.

00:30:15.660 --> 00:30:22.240
So here's a machine learning model that allows me to draw an ink and then tell me what letter it is.

00:30:22.240 --> 00:30:25.520
So if I did like this, it'll tell you, oh, I think that's a seven.

00:30:25.520 --> 00:30:26.140
That's not a seven.

00:30:26.140 --> 00:30:26.940
Let's see.

00:30:26.940 --> 00:30:28.080
What about a one?

00:30:28.080 --> 00:30:29.720
You think that's, I think that's a four.

00:30:29.720 --> 00:30:33.900
This model is not very good, but that's not the problem.

00:30:33.900 --> 00:30:34.860
That's not the point, right?

00:30:34.860 --> 00:30:35.720
That should be a five.

00:30:35.720 --> 00:30:38.720
I'm going to draw, I'm going to do a zero.

00:30:38.720 --> 00:30:39.500
There we go.

00:30:39.500 --> 00:30:39.900
Yes.

00:30:39.900 --> 00:30:40.940
I nailed it with a zero.

00:30:40.940 --> 00:30:41.900
Two.

00:30:42.400 --> 00:30:43.120
Yeah, two and those two.

00:30:43.120 --> 00:30:43.820
I don't know.

00:30:43.820 --> 00:30:48.580
The point is not that the model is accurate, but this is a really cool UI that you can build

00:30:48.580 --> 00:30:50.080
in a couple of lines of code, right?

00:30:50.080 --> 00:30:50.980
I think that's super.

00:30:50.980 --> 00:30:52.260
Yeah, this is pretty nice.

00:30:52.260 --> 00:30:52.820
Yeah.

00:30:52.820 --> 00:30:54.360
Let's see what other examples they got in here.

00:30:54.360 --> 00:30:56.960
Question and answer with a paragraph.

00:30:56.960 --> 00:31:02.100
So here's the text that the source text is, you know, Victoria has written a constitution

00:31:02.100 --> 00:31:04.060
enacted in 1975, et cetera, et cetera.

00:31:04.060 --> 00:31:09.180
And then you could ask the model the question, when did Victoria enact its constitution?

00:31:09.180 --> 00:31:09.880
Holy moly.

00:31:09.880 --> 00:31:10.880
Wait for it.

00:31:10.880 --> 00:31:11.760
1975.

00:31:11.760 --> 00:31:13.700
Like that is insane.

00:31:13.700 --> 00:31:14.320
Right?

00:31:14.320 --> 00:31:15.220
And you could cool this.

00:31:15.220 --> 00:31:18.420
You can build this cool UI here, a face segmentation.

00:31:18.420 --> 00:31:20.380
I'm not going to do my webcam.

00:31:20.380 --> 00:31:22.280
It's going to break stuff for the live stream.

00:31:22.740 --> 00:31:26.200
Yeah, all sorts of things though, like little sliders and whatnot.

00:31:26.200 --> 00:31:28.060
We need social distancing.

00:31:28.060 --> 00:31:28.380
Yes.

00:31:28.380 --> 00:31:29.100
There we go.

00:31:29.100 --> 00:31:35.200
So pretty neat way to really simply add UIs and integrate them both onto websites and into

00:31:35.200 --> 00:31:35.800
Jupyter notebooks.

00:31:35.800 --> 00:31:36.640
Nice.

00:31:36.640 --> 00:31:37.160
I like it.

00:31:37.160 --> 00:31:37.900
I like it.

00:31:37.900 --> 00:31:38.160
Yeah.

00:31:38.160 --> 00:31:41.200
I love too that it's just running in the browser too.

00:31:41.200 --> 00:31:41.900
I know.

00:31:41.900 --> 00:31:42.740
That's awesome.

00:31:42.740 --> 00:31:43.340
Yeah.

00:31:43.340 --> 00:31:47.600
I mean, that's proper JavaScript work to be putting like a little sketch pad and then

00:31:47.600 --> 00:31:49.160
taking that image and sending it back up.

00:31:49.620 --> 00:31:51.100
Dean helping us with the naming.

00:31:51.100 --> 00:31:54.540
So ML models usually use gradients.

00:31:54.540 --> 00:31:58.280
So called grade in slang terms, I guess grade IO.

00:31:58.280 --> 00:31:59.320
Yeah, that sounds good.

00:31:59.320 --> 00:31:59.740
Cool.

00:31:59.740 --> 00:32:00.120
Thanks.

00:32:00.120 --> 00:32:00.860
All right.

00:32:00.860 --> 00:32:02.820
So you can take us out of here with the last one you got.

00:32:02.820 --> 00:32:04.240
Yeah, sure.

00:32:04.240 --> 00:32:05.720
Let's take a look.

00:32:05.720 --> 00:32:07.560
All right.

00:32:07.560 --> 00:32:08.860
So my screen should be up now.

00:32:08.860 --> 00:32:14.680
So there's this movie that's coming out later this summer, 2021 called Space Jam.

00:32:14.680 --> 00:32:18.420
I don't know if you ever heard about Space Jam, but heard about it.

00:32:18.420 --> 00:32:19.540
I don't know enough.

00:32:19.540 --> 00:32:20.600
What's that?

00:32:20.600 --> 00:32:22.060
I only heard of it.

00:32:22.060 --> 00:32:22.900
I haven't seen it.

00:32:22.900 --> 00:32:23.400
Yeah.

00:32:23.400 --> 00:32:28.320
I mean, you know, I know if anyone that's born after like the year 2000 probably has never

00:32:28.320 --> 00:32:29.160
heard of Space Jam.

00:32:29.160 --> 00:32:35.560
But what we actually did, so Microsoft and some folks at Warner Brothers, I believe, partnered

00:32:35.560 --> 00:32:40.280
together to create like a set of learning modules and stuff like that around basketball.

00:32:40.280 --> 00:32:42.360
And it was completely inspired by Space Jam.

00:32:42.700 --> 00:32:45.340
So what you're looking at here is a learning path.

00:32:45.340 --> 00:32:49.540
And this learning path, I think, has one, two, three.

00:32:49.540 --> 00:32:52.120
It has about three different modules in here.

00:32:52.120 --> 00:32:55.520
And it kind of walks you through exploring basketball data.

00:32:55.520 --> 00:33:00.320
And you can use that to start like predicting the outcomes of games and player performance and

00:33:00.320 --> 00:33:01.380
all this cool stuff.

00:33:01.500 --> 00:33:02.720
But it uses Python.

00:33:02.720 --> 00:33:03.840
It uses Pandas.

00:33:03.840 --> 00:33:04.840
It uses VS Code.

00:33:04.840 --> 00:33:07.120
There is some JavaScript in there.

00:33:07.120 --> 00:33:10.240
And there's some like real, you know, there's some NBA data in there.

00:33:10.240 --> 00:33:11.440
There's some basketball data in there.

00:33:11.440 --> 00:33:14.060
You kind of use and explore and play around with.

00:33:14.060 --> 00:33:15.440
So I think this is really cool.

00:33:15.760 --> 00:33:20.140
Again, going back to the conversation we had before about like, you know, okay, I know some

00:33:20.140 --> 00:33:20.760
Python, right?

00:33:20.760 --> 00:33:22.780
Like, how do I do some cool stuff with it?

00:33:22.780 --> 00:33:23.080
Right?

00:33:23.080 --> 00:33:24.060
Like, what's the next step?

00:33:24.060 --> 00:33:28.520
And I thought this was a great example of us showing, hey, let me take something that I

00:33:28.520 --> 00:33:29.240
actually care about.

00:33:29.240 --> 00:33:30.880
Maybe some of you all care about basketball.

00:33:30.880 --> 00:33:31.920
Maybe some of you don't.

00:33:31.920 --> 00:33:36.180
But, you know, whether it's sports or racing or, you know, maybe you like to listen to podcasts.

00:33:36.180 --> 00:33:40.280
How can I take podcast data and run some machine learning and, you know, different things

00:33:40.280 --> 00:33:40.640
around it?

00:33:40.640 --> 00:33:43.780
Like, I think these are all really cool projects for you to think about.

00:33:44.200 --> 00:33:49.040
But this one specifically is about like using basketball stats, you know, inspired by Space

00:33:49.040 --> 00:33:53.280
Jam and using Python and Pandas and just, you know, just creating some really cool projects

00:33:53.280 --> 00:33:53.640
out of it.

00:33:53.640 --> 00:33:54.800
So I thought this was cool.

00:33:54.800 --> 00:33:56.920
Hopefully folks check it out and let us know what you think.

00:33:56.920 --> 00:33:57.400
Nice.

00:33:57.400 --> 00:34:01.020
So this is a free like learning thing that people can go check out, right?

00:34:01.020 --> 00:34:02.980
Yeah, this is this is 100% free.

00:34:02.980 --> 00:34:03.760
Excuse me.

00:34:03.760 --> 00:34:05.040
It's 100% free.

00:34:05.040 --> 00:34:09.940
Free as in like, I don't need your, you know, your address and information and all of that.

00:34:09.940 --> 00:34:10.920
Like you could just go out.

00:34:10.920 --> 00:34:11.520
It's a credit card.

00:34:11.520 --> 00:34:12.260
You cancel anytime.

00:34:12.260 --> 00:34:13.120
It's totally free.

00:34:13.560 --> 00:34:16.400
One thing I would tell you, if you do decide to create an account.

00:34:16.400 --> 00:34:18.240
So I have an account here.

00:34:18.240 --> 00:34:20.260
So you'll notice you'll get points.

00:34:20.260 --> 00:34:21.460
You get XP points.

00:34:21.460 --> 00:34:23.540
So this one is worth 4000 XP.

00:34:23.540 --> 00:34:27.300
So if I get that, you know, hopefully I'll bump up and I'll be at a level.

00:34:27.300 --> 00:34:29.620
You're going to go to level nine if you get if you finish this one.

00:34:29.620 --> 00:34:30.660
Yeah, yeah, yeah.

00:34:30.660 --> 00:34:33.980
So I want to I want to make sure I get it make some time to go through this learning

00:34:33.980 --> 00:34:35.300
this learning path.

00:34:35.660 --> 00:34:39.360
But if you do want to sign up, you know, it's a good way to keep score.

00:34:39.360 --> 00:34:41.220
You get badges and all kinds of stuff.

00:34:41.220 --> 00:34:44.400
We do have other Python related courses in here, too.

00:34:44.400 --> 00:34:48.500
Like we just released a intro to Django on here.

00:34:48.500 --> 00:34:49.560
That's in here as well.

00:34:49.560 --> 00:34:52.940
So if folks are interested in that and, you know, did you guys do something with Dr.

00:34:52.940 --> 00:34:55.980
Becky around like NASA or something?

00:34:55.980 --> 00:34:56.680
Or is that?

00:34:56.760 --> 00:34:57.200
Yeah, yeah, yeah.

00:34:57.200 --> 00:35:00.800
We did have we do have one that's around the moon landing.

00:35:00.800 --> 00:35:06.360
And then also, if you remember that that Netflix movie, I think it's called Over the Moon or

00:35:06.360 --> 00:35:07.000
something like that.

00:35:07.000 --> 00:35:12.640
There's also a learn module, I believe, that's also associated with that movie that we partner

00:35:12.640 --> 00:35:13.480
with Netflix on.

00:35:13.480 --> 00:35:14.960
So that was also super cool.

00:35:14.960 --> 00:35:15.540
Yeah.

00:35:15.540 --> 00:35:16.040
Nice.

00:35:16.040 --> 00:35:19.800
What I really like about this is when people are trying to get into program, especially

00:35:19.800 --> 00:35:22.280
taking that next step of like, OK, I've learned what a loop is.

00:35:22.840 --> 00:35:28.340
It's so hard to know what can I build because you have these like, well, I'd love to build

00:35:28.340 --> 00:35:31.080
a game like, well, building a game takes a team of people in a year.

00:35:31.080 --> 00:35:32.500
Like that's not a good next step.

00:35:32.500 --> 00:35:34.980
It's just like knowing what the next thing to build.

00:35:34.980 --> 00:35:38.080
It's a little more complicated that you're really actually interested in.

00:35:38.080 --> 00:35:42.640
You want to build like this is the type of thing, you know, if you had a like a coding

00:35:42.640 --> 00:35:46.740
club at a high school, maybe COVID times is not the best for this, but you could say,

00:35:46.740 --> 00:35:51.360
let's build an app that will do like statistics for our basketball team and like all sorts

00:35:51.360 --> 00:35:56.300
of interesting things like you could build really neat stuff and put it together in ways

00:35:56.300 --> 00:35:57.300
I think people will care about.

00:35:57.300 --> 00:35:58.420
Yeah, exactly.

00:35:58.420 --> 00:36:04.260
And I'm just like I said, just in general, I think the best way for you to go from beginner

00:36:04.260 --> 00:36:08.900
to whatever that next level is, is just find something that you really care about and see

00:36:08.900 --> 00:36:11.080
if you can attach technology to it.

00:36:11.080 --> 00:36:12.840
You know, like I care about basketball.

00:36:12.840 --> 00:36:14.340
I've been watching basketball for years.

00:36:14.340 --> 00:36:17.600
So when I heard Space Jam and Python, I'm like, oh, that's easy.

00:36:17.600 --> 00:36:18.400
You know what I mean?

00:36:18.400 --> 00:36:20.460
Like, yes, like that's something that I care about.

00:36:20.500 --> 00:36:21.640
That's something I want to do.

00:36:21.640 --> 00:36:26.060
Like we mentioned before, we have ones on NASA, but maybe you're into some other stuff.

00:36:26.060 --> 00:36:29.500
Maybe you're into, you know, agriculture and flowers and plants.

00:36:29.500 --> 00:36:32.280
Maybe you want to do something that categorizes that type of stuff.

00:36:32.280 --> 00:36:33.280
Maybe you're into cars.

00:36:33.280 --> 00:36:36.540
Maybe you like racing or, you know, some other activity.

00:36:36.540 --> 00:36:41.160
You know, find a way that you can integrate what you're doing with, you know, in your real

00:36:41.160 --> 00:36:44.000
world life with what you're doing in your computer life.

00:36:44.000 --> 00:36:44.260
Right.

00:36:44.260 --> 00:36:45.720
And see if we can put those together.

00:36:46.160 --> 00:36:49.580
I think there'd be awesome IoT stuff to do with agriculture.

00:36:49.580 --> 00:36:50.700
Yeah, for sure.

00:36:50.700 --> 00:36:51.420
I think so, too.

00:36:51.420 --> 00:36:57.680
You know, I've heard about like a lot of different projects that, you know, use IoT, you know,

00:36:57.680 --> 00:37:02.520
particularly outside of the United States to do things like detecting diseases and, you

00:37:02.520 --> 00:37:07.240
know, letting them know when's the right time to like manage crops and, you know, getting

00:37:07.240 --> 00:37:12.880
information from, you know, weather APIs and like using it inside of their IoT devices and

00:37:12.880 --> 00:37:15.900
stuff like that to help make decisions, which I think is really cool.

00:37:15.900 --> 00:37:16.820
Yeah.

00:37:16.820 --> 00:37:18.120
And, you know, when you think about.

00:37:18.120 --> 00:37:20.100
You could look at the crops and say, how wet is this?

00:37:20.100 --> 00:37:22.380
You know, could it hold out 12 more hours?

00:37:22.380 --> 00:37:24.420
Because I see it's going to rain in 12 hours.

00:37:24.420 --> 00:37:27.240
So, like, let's not waste the water now.

00:37:27.240 --> 00:37:27.820
Save some.

00:37:27.820 --> 00:37:28.580
Yeah, exactly.

00:37:28.580 --> 00:37:31.720
Like little micro optimizations like that.

00:37:31.720 --> 00:37:34.740
That'll probably won't save you a lot of money and resources.

00:37:34.740 --> 00:37:38.180
But then also make sure that you're, you know, you can control your environment.

00:37:38.660 --> 00:37:39.020
Yeah.

00:37:39.020 --> 00:37:42.880
But yeah, I think those are all really cool use cases that, you know, we should definitely

00:37:42.880 --> 00:37:44.440
encourage more folks to get involved in.

00:37:44.440 --> 00:37:44.880
Yeah.

00:37:44.880 --> 00:37:48.860
So I don't know if we should go down it, but Dean is calling Jordan the goat.

00:37:48.860 --> 00:37:50.240
I don't know what's going on here.

00:37:50.240 --> 00:37:51.960
I agree with him 100%.

00:37:51.960 --> 00:37:53.380
I would defend that any day.

00:37:53.380 --> 00:37:56.620
It goes Jordan, Kobe, LeBron.

00:37:56.620 --> 00:37:57.740
That's how it goes in my head.

00:37:57.740 --> 00:37:58.340
Awesome.

00:37:58.340 --> 00:37:59.700
All right.

00:37:59.700 --> 00:38:02.080
Well, that's all of our main items.

00:38:02.080 --> 00:38:04.820
Brian, do you have anything extra you want to give a shout out to?

00:38:05.320 --> 00:38:08.680
No, but I just wanted to say, I thought it was a trick question when you said, do you

00:38:08.680 --> 00:38:09.760
know what Space Jam is?

00:38:09.760 --> 00:38:12.540
And I thought everybody knew what Space Jam was.

00:38:12.540 --> 00:38:13.280
I had to look it up.

00:38:13.280 --> 00:38:14.840
I didn't realize it came out in 96.

00:38:14.840 --> 00:38:17.000
So it's been a while.

00:38:17.000 --> 00:38:18.000
Absolutely.

00:38:18.000 --> 00:38:18.140
Yeah.

00:38:18.140 --> 00:38:18.700
That's what I said.

00:38:18.700 --> 00:38:22.300
If you're born after 2000, like, you know, what Space Jam is?

00:38:22.300 --> 00:38:25.860
If you've got good parents, you'll know because they would have shown you.

00:38:27.620 --> 00:38:30.320
I actually made my son watch it like a couple of weeks ago.

00:38:30.320 --> 00:38:31.180
Yeah.

00:38:31.180 --> 00:38:31.860
Did he enjoy it?

00:38:31.860 --> 00:38:32.480
Yeah.

00:38:32.480 --> 00:38:33.040
He loved it.

00:38:33.040 --> 00:38:34.820
Now, you know, one day I came home.

00:38:34.820 --> 00:38:36.780
He's just like, daddy, what are we going to watch tonight?

00:38:36.780 --> 00:38:37.820
I'm like, I don't know.

00:38:37.820 --> 00:38:38.520
What do you want to watch?

00:38:38.520 --> 00:38:39.800
That's what Space Jam.

00:38:39.800 --> 00:38:41.340
I'm like, yes, I'm a good father.

00:38:41.340 --> 00:38:42.160
Yes.

00:38:42.160 --> 00:38:43.000
Got it.

00:38:43.000 --> 00:38:49.580
My wife and I tried to have our daughters watch all the James Bond 007 stuff.

00:38:49.580 --> 00:38:53.060
The natural way would be to start at the very first one with Sean Connery and make

00:38:53.060 --> 00:38:54.180
your way up to Daniel Craig.

00:38:54.180 --> 00:38:55.920
And today they watched like 10 minutes.

00:38:55.920 --> 00:38:56.640
Like this is so fake.

00:38:56.680 --> 00:38:57.440
I can't watch this.

00:38:57.440 --> 00:38:57.980
Yeah.

00:38:57.980 --> 00:38:59.100
Different generation.

00:38:59.100 --> 00:38:59.900
Different generation.

00:38:59.900 --> 00:39:00.420
Yeah.

00:39:00.420 --> 00:39:01.240
It's different.

00:39:01.240 --> 00:39:01.840
All right.

00:39:01.840 --> 00:39:03.000
So let's see.

00:39:03.000 --> 00:39:06.440
Cecily, got anything you want to give a quick shout out to that didn't land in the main topics?

00:39:06.440 --> 00:39:09.820
I feel like I should have prepared for this.

00:39:09.820 --> 00:39:10.600
Yeah.

00:39:10.600 --> 00:39:11.640
No, I don't think so.

00:39:11.640 --> 00:39:12.000
Tell me about the Twitch.

00:39:12.000 --> 00:39:13.900
Are you still doing the Twitch streams, Brian?

00:39:13.900 --> 00:39:15.000
Yeah, we're still doing the Twitch streams.

00:39:15.000 --> 00:39:15.720
Other Brian, Brian Clark.

00:39:15.720 --> 00:39:20.560
My co-host Brian had taken some time off because Brian had a baby.

00:39:20.560 --> 00:39:22.440
So congratulations to Brian and his family.

00:39:22.440 --> 00:39:22.880
Congratulations.

00:39:22.880 --> 00:39:24.900
But he will be back.

00:39:25.740 --> 00:39:29.200
Well, he is back, but we'll be live streaming again starting next week.

00:39:29.200 --> 00:39:31.660
Now that he's back and settled and stuff like that.

00:39:31.660 --> 00:39:35.380
But yeah, we do a weekly live stream on Twitch.

00:39:35.380 --> 00:39:38.560
So you can go to twitch.tv.

00:39:38.560 --> 00:39:39.040
I think it is.

00:39:39.040 --> 00:39:41.600
Twitch.tv slash Microsoft Developer.

00:39:42.080 --> 00:39:44.660
It's every Wednesday at 1.30 p.m.

00:39:44.660 --> 00:39:45.480
Eastern Standard Time.

00:39:45.480 --> 00:39:48.640
And we just, you know, we talk all things Python.

00:39:48.640 --> 00:39:50.220
We do different projects.

00:39:50.220 --> 00:39:52.960
Yeah, I believe both of you gentlemen have been on.

00:39:52.960 --> 00:39:57.620
We've had, you know, Brian come on to talk about testing and solve some problems that I was having.

00:39:58.040 --> 00:40:00.680
And Michael, you came on too, which was great.

00:40:00.680 --> 00:40:05.720
And yeah, we just, you know, we try and take a beginner's perspective.

00:40:05.720 --> 00:40:06.820
You know what I mean?

00:40:06.820 --> 00:40:15.120
You know, my Brian, not Brian on the stream, but like my co-host Brian and myself, we try to take it from the perspective of, okay, well, he knows JavaScript.

00:40:15.260 --> 00:40:30.400
I know C#, let's come together and like play around with Python and, you know, show all the mistakes and the typos and, you know, the things that happen that we don't always see on video and live streams and show people like, well, you know, anyone could really just take the time to learn.

00:40:30.400 --> 00:40:31.360
You just got to put in the effort.

00:40:31.360 --> 00:40:32.180
Yeah, awesome.

00:40:32.180 --> 00:40:33.760
Yeah, people should definitely check that out.

00:40:33.760 --> 00:40:34.600
That's well done.

00:40:34.600 --> 00:40:42.220
So before I give my quick one item that I want to share, Dean says, PyCon Israel is next week, May 2nd and 3rd.

00:40:42.220 --> 00:40:43.060
It's free and virtual.

00:40:43.060 --> 00:40:43.960
So all are welcome.

00:40:43.960 --> 00:40:44.220
Yeah.

00:40:44.540 --> 00:40:46.020
Thanks for that real time update.

00:40:46.020 --> 00:40:54.900
And then, Brian, people are loving our, what you call it, the absolute privacy updates to the site.

00:40:54.900 --> 00:40:55.360
Check this out.

00:40:55.360 --> 00:41:00.420
154 people like some random update about removing analytics from the website.

00:41:00.420 --> 00:41:01.420
I think that's great.

00:41:01.420 --> 00:41:02.060
Yeah.

00:41:02.060 --> 00:41:10.640
So now if you go to like pythonbytes.fm in Firefox and you look, there's perfect security shield, perfect privacy shield.

00:41:10.640 --> 00:41:12.140
And we happen to be live streaming.

00:41:12.560 --> 00:41:14.540
So did you just remove Google Analytics from it?

00:41:14.540 --> 00:41:15.040
Is that what you did?

00:41:15.040 --> 00:41:22.120
We were using GetClicky, which is like a more real time, but I think Google Analytics is basically the same.

00:41:22.120 --> 00:41:26.520
The thing I liked about GetClicky is it was a paid service that didn't share your data with advertisers.

00:41:26.900 --> 00:41:28.380
So it was better, at least in that regard.

00:41:28.380 --> 00:41:35.820
But all the ad blockers and everything were already like degrading the data so badly that it was kind of like, well, it's maybe half of the population.

00:41:35.820 --> 00:41:38.000
I don't know that we get information about it.

00:41:38.000 --> 00:41:38.760
So let's just take it out.

00:41:38.760 --> 00:41:39.260
Right.

00:41:39.500 --> 00:41:40.460
Got it.

00:41:40.460 --> 00:41:40.680
Got it.

00:41:40.680 --> 00:41:40.680
Got it.

00:41:40.680 --> 00:41:41.080
Got it.

00:41:41.080 --> 00:41:41.340
All right.

00:41:41.340 --> 00:41:47.200
I wish we would have had this joke last week, maybe two weeks ago, but I've got a good joke for us.

00:41:47.200 --> 00:41:54.300
You know, there was that giant evergreen shipping container thing that clogged up the canals at the Suez Canal.

00:41:54.480 --> 00:42:03.080
Costs like $400 million an hour lost commerce with the Middle East and Europe.

00:42:03.080 --> 00:42:03.360
Right.

00:42:03.360 --> 00:42:04.220
That was bad.

00:42:04.220 --> 00:42:09.480
So there's this great joke here about Linux containers and Kubernetes.

00:42:09.480 --> 00:42:16.320
So it's got the evergreen ship stuck sideways and like another shipping container clearly stopped.

00:42:16.320 --> 00:42:17.540
Like this is blocked.

00:42:17.540 --> 00:42:18.400
We can't make it through.

00:42:18.400 --> 00:42:21.700
And then the title is Linux containers and Kubernetes for beginners.

00:42:21.700 --> 00:42:22.540
Like containers.

00:42:22.540 --> 00:42:23.660
Yeah, that'll fix it.

00:42:24.300 --> 00:42:24.900
Hilarious.

00:42:24.900 --> 00:42:27.180
That's hilarious.

00:42:27.180 --> 00:42:29.360
By the way, did they ever get that thing out?

00:42:29.360 --> 00:42:31.480
It got out like a week ago, I think.

00:42:31.480 --> 00:42:31.760
Yeah.

00:42:31.760 --> 00:42:36.280
Eventually they had to dig the sand out underneath it until it could float again, basically.

00:42:36.280 --> 00:42:37.620
Oh my gosh.

00:42:37.620 --> 00:42:38.520
That's ridiculous.

00:42:38.520 --> 00:42:41.760
And then Cecil, are you a fan of the Oh Really covers?

00:42:41.760 --> 00:42:42.640
I am.

00:42:42.640 --> 00:42:42.900
Yeah.

00:42:42.900 --> 00:42:43.460
Yeah.

00:42:43.460 --> 00:42:43.720
Yeah.

00:42:43.720 --> 00:42:46.420
So we've got the Oh Really instead of O'Reilly.

00:42:46.420 --> 00:42:47.880
Kubernetes for beginners.

00:42:47.880 --> 00:42:48.640
What could go wrong?

00:42:48.640 --> 00:42:49.100
Dev oops.

00:42:49.100 --> 00:42:49.600
Nice.

00:42:49.600 --> 00:42:50.240
I like it.

00:42:50.240 --> 00:42:51.260
Dev oops.

00:42:51.260 --> 00:42:51.700
I like it.

00:42:51.700 --> 00:42:53.960
But I love the evergreen container ship.

00:42:54.120 --> 00:42:54.560
Containers.

00:42:54.560 --> 00:42:55.180
That'll fix it.

00:42:55.180 --> 00:42:57.340
That's hilarious.

00:42:57.340 --> 00:42:58.480
Yeah.

00:42:58.480 --> 00:42:59.700
All right, Brian.

00:42:59.700 --> 00:43:00.100
Is that it?

00:43:00.100 --> 00:43:00.740
Yeah.

00:43:00.740 --> 00:43:01.400
Is that a show?

00:43:01.400 --> 00:43:02.200
Put a wrap on it?

00:43:02.200 --> 00:43:03.000
Nice bow.

00:43:03.000 --> 00:43:03.540
Yeah.

00:43:03.540 --> 00:43:04.280
Good job.

00:43:04.280 --> 00:43:05.060
Good guest.

00:43:05.060 --> 00:43:05.780
Yeah.

00:43:05.780 --> 00:43:07.560
Great guest, Cecil.

00:43:07.560 --> 00:43:08.860
Super to catch up with you.

00:43:08.940 --> 00:43:10.120
Thank you for being on the show again.

00:43:10.120 --> 00:43:11.080
Thanks, everybody.

00:43:11.080 --> 00:43:12.740
Thank you both for having me come on, man.

00:43:12.740 --> 00:43:14.420
Again, it's always a fun time.

00:43:14.420 --> 00:43:15.560
I'm trying to break the record.

00:43:15.560 --> 00:43:19.960
I want to know who your most frequent guest is and whatever that is, I want to break the

00:43:19.960 --> 00:43:20.140
record.

00:43:20.140 --> 00:43:24.300
Oh, I'm going to get one of those great IO type things and point it at our site and then

00:43:24.300 --> 00:43:24.860
I'll ask it.

00:43:24.860 --> 00:43:25.480
Yeah.

00:43:26.480 --> 00:43:27.040
Let me know.

00:43:27.040 --> 00:43:29.960
No, I think actually probably you're near the top.

00:43:29.960 --> 00:43:30.920
I have to do some counting.

00:43:30.920 --> 00:43:31.460
We'll have to see.

00:43:31.460 --> 00:43:32.380
But yeah, for sure.

00:43:32.380 --> 00:43:32.960
Yeah.

00:43:32.960 --> 00:43:33.320
Let me know.

00:43:33.320 --> 00:43:35.320
I got to make sure I keep standards high.

00:43:35.320 --> 00:43:36.480
That's right.

00:43:36.480 --> 00:43:38.340
Brett Cannon out there in the live stream.

00:43:38.340 --> 00:43:39.540
If he's still there, he's definitely one.

00:43:39.540 --> 00:43:41.080
He's one of the contenders as well.

00:43:41.080 --> 00:43:42.520
So we'll let you know.

00:43:42.520 --> 00:43:43.060
Okay.

00:43:43.060 --> 00:43:43.720
Yeah.

00:43:43.720 --> 00:43:44.300
Cool.

00:43:44.300 --> 00:43:45.760
Well, bye, everybody.

00:43:45.760 --> 00:43:46.680
Bye, everyone.

00:43:46.680 --> 00:43:47.320
Take care.

00:43:47.320 --> 00:43:47.980
See ya.

00:43:47.980 --> 00:43:49.920
Thank you for listening to Python Bytes.

00:43:49.920 --> 00:43:52.480
Follow the show on Twitter via at Python Bytes.

00:43:52.480 --> 00:43:55.360
That's Python Bytes as in B-Y-T-E-S.

00:43:55.360 --> 00:43:58.760
And get the full show notes at Python Bytes.fm.

00:43:58.760 --> 00:44:03.120
If you have a news item you want featured, just visit Python Bytes.fm and send it our way.

00:44:03.120 --> 00:44:05.820
We're always on the lookout for sharing something cool.

00:44:05.820 --> 00:44:09.060
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:44:09.500 --> 00:44:12.620
Thank you for listening and sharing this podcast with your friends and colleagues.