WEBVTT

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

00:00:04.480 --> 00:00:09.100
This is episode 145, recorded August 28th, 2019.

00:00:09.100 --> 00:00:13.140
I'm Michael Kennedy, and Brian is away on vacation.

00:00:13.140 --> 00:00:15.500
Yeah, I was on vacation last week, now Brian's gone.

00:00:15.500 --> 00:00:18.760
But don't despair, we have two special guests.

00:00:18.760 --> 00:00:19.740
We have Matt Harrison.

00:00:19.740 --> 00:00:20.160
Hello.

00:00:20.160 --> 00:00:20.920
Welcome, Matt.

00:00:20.920 --> 00:00:23.040
And Anthony Sotili.

00:00:23.040 --> 00:00:23.900
Welcome.

00:00:23.900 --> 00:00:25.020
First time here on the show.

00:00:25.020 --> 00:00:25.920
Nice to have you here.

00:00:25.920 --> 00:00:26.780
Nice to be on the show.

00:00:26.780 --> 00:00:28.040
Yeah, it's great to have you.

00:00:28.040 --> 00:00:30.980
I'm looking forward to talking about all these things with you.

00:00:30.980 --> 00:00:35.340
Now, before we get on to our topics, let me just say real quickly, the show is brought to you by Datadog.

00:00:35.340 --> 00:00:38.100
Check them out at pythonbytes.fm/Datadog.

00:00:38.100 --> 00:00:39.880
More on that later.

00:00:39.880 --> 00:00:50.400
But I want to focus first on something that's going to help people learning Python or teaching people who are learning Python.

00:00:50.400 --> 00:00:54.420
And that's this project called Friendly Traceback.

00:00:54.420 --> 00:00:56.020
Matt, you do a lot of teaching.

00:00:56.020 --> 00:01:02.560
What is your experience with folks, you know, one of their first programming experiences running into like a traceback crash?

00:01:02.560 --> 00:01:03.760
Like, is it really clear for them?

00:01:03.760 --> 00:01:10.320
Most of my training is with experienced technologists to understand what a traceback is.

00:01:10.820 --> 00:01:16.380
So I do do some with kids in elementary school, that sort of thing.

00:01:16.380 --> 00:01:19.740
But my issue is I like the idea here.

00:01:19.740 --> 00:01:28.220
But in my courses, I teach explicitly have them hit errors and teach them how to read the traceback and recover them.

00:01:28.220 --> 00:01:29.080
How to recover, yeah.

00:01:29.200 --> 00:01:30.560
So I like the idea.

00:01:30.560 --> 00:01:35.920
The other thing that I have sort of an issue with is that you have to install it, right?

00:01:36.060 --> 00:01:40.880
So having someone who's a beginner install something, I don't know.

00:01:40.880 --> 00:01:41.920
What do you think about that?

00:01:41.920 --> 00:01:45.740
That's an interesting question because you – well, let me tell folks what it is real quick.

00:01:45.740 --> 00:01:50.940
So this one comes to us from Jose Carlos Garcia, I think, because his Twitter name is in Elite Speak.

00:01:50.940 --> 00:01:53.360
So that's my attempt to understand it back into English.

00:01:54.360 --> 00:01:56.660
So thank you, Carlos, for sending that in.

00:01:56.660 --> 00:02:01.660
And the idea is it's really aimed at beginners, as you kind of hinted at, Matt.

00:02:01.660 --> 00:02:04.160
And let me just give folks a sense of what it is.

00:02:04.160 --> 00:02:07.660
So normal traceback will have, like, in reverse order, the call stack.

00:02:07.660 --> 00:02:10.360
And then maybe the line of code.

00:02:10.360 --> 00:02:13.240
And then the error message, like the error type.

00:02:13.240 --> 00:02:15.840
And then possibly the error message, right?

00:02:15.840 --> 00:02:22.880
Well, what this does instead is it will catch the exception type, like an index error.

00:02:23.260 --> 00:02:26.000
And then it has a little help message and an example, right?

00:02:26.000 --> 00:02:27.880
So it says, oh, this is a Python exception.

00:02:27.880 --> 00:02:28.940
You got an index error.

00:02:28.940 --> 00:02:31.660
That means the list index is out of range in this case.

00:02:31.660 --> 00:02:34.200
And this error occurs under these circumstances.

00:02:34.200 --> 00:02:35.900
Here's usually what happened.

00:02:35.900 --> 00:02:37.140
Here's usually the cause.

00:02:37.140 --> 00:02:41.740
And then one thing I really like about it is it first shows the line of code where it happened.

00:02:41.740 --> 00:02:44.400
And then it actually shows the local variables.

00:02:44.400 --> 00:02:49.280
So like in the example there, it has a function called get last item, and you're passing a list.

00:02:49.280 --> 00:02:52.920
And it says the list that was passed was 1, 2, 3.

00:02:53.160 --> 00:02:59.660
And then here is actually like three or four lines of code where this error is happening and what the index value was and all that.

00:02:59.660 --> 00:03:04.460
So you could actually diagnose this without even stepping into a debugger.

00:03:04.460 --> 00:03:05.740
You could just say, oh, I see.

00:03:05.740 --> 00:03:10.540
The index is 3, but actually it's 0, 1, 2 by just looking at the output on the screen here.

00:03:10.540 --> 00:03:11.720
And that I think is pretty cool.

00:03:11.720 --> 00:03:12.120
Yeah.

00:03:12.400 --> 00:03:14.180
I think it's definitely useful.

00:03:14.180 --> 00:03:16.080
I looked over the documentation.

00:03:16.080 --> 00:03:17.880
I thought, this is really cool.

00:03:17.880 --> 00:03:22.500
My issue with beginners is how to walk them through something.

00:03:22.500 --> 00:03:27.100
And installing is always a pain when they're beginners.

00:03:27.100 --> 00:03:32.080
I also, the other thing that's really cool about it is it looks like it has some hooks.

00:03:32.240 --> 00:03:34.960
So you can define your own exceptions.

00:03:34.960 --> 00:03:38.000
You can customize how you handle those.

00:03:38.000 --> 00:03:40.400
So I think that that looks kind of cool as well.

00:03:40.400 --> 00:03:49.080
I mean, I can imagine maybe if you're in a environment at work where you have support people.

00:03:49.240 --> 00:03:56.640
And they might have to look at your code or look at your servers and take problems and resolve them.

00:03:56.640 --> 00:03:58.600
This might be something that could aid them.

00:03:58.600 --> 00:03:58.840
Right.

00:03:58.840 --> 00:04:02.940
The fact that it catches the local variables in production would be kind of nice.

00:04:02.940 --> 00:04:03.440
Yeah.

00:04:03.440 --> 00:04:07.280
I think it really comes down to, are you using any external packages?

00:04:07.280 --> 00:04:10.660
If there's a pip install or a condo install, right?

00:04:10.660 --> 00:04:13.340
You could wrap this up to include friendly traceback, right?

00:04:13.340 --> 00:04:17.780
But if you're using none of that, then all of a sudden, yeah, this is like another burden, right?

00:04:17.780 --> 00:04:18.020
Yeah.

00:04:18.020 --> 00:04:18.940
Yeah.

00:04:19.120 --> 00:04:21.400
This actually looks a lot like the pytest tracebacks.

00:04:21.400 --> 00:04:25.160
And I sometimes find that those are useful and sometimes not so useful.

00:04:25.160 --> 00:04:26.520
Yeah, exactly.

00:04:26.520 --> 00:04:27.440
I think it depends.

00:04:27.440 --> 00:04:31.340
Like they said that there's a lot of tools to make exceptions better for advanced developers.

00:04:31.340 --> 00:04:32.240
This is not that.

00:04:32.240 --> 00:04:33.440
This is something else.

00:04:33.440 --> 00:04:37.380
One of the things I thought that was cool about this is there's three ways to like integrate

00:04:37.380 --> 00:04:38.180
it into your app.

00:04:38.180 --> 00:04:41.660
You can install it as an exception hook.

00:04:41.660 --> 00:04:46.700
So all exceptions in the application are caught, which is cool because I mean, I knew that that

00:04:46.700 --> 00:04:49.100
was possible, but I didn't really, I've never really played.

00:04:49.100 --> 00:04:50.580
I'm like, oh, look how easy it is.

00:04:50.580 --> 00:04:56.300
You just take a function and assign it to this callback globally and any error will go through

00:04:56.300 --> 00:04:56.440
it.

00:04:56.440 --> 00:04:56.860
That's cool.

00:04:56.860 --> 00:04:59.480
So you can do that at the top of like your startup or your app.

00:04:59.940 --> 00:05:05.340
You can actually in a try except block, you know, say, explain friendly traceback explain,

00:05:05.340 --> 00:05:08.040
and it'll do that on demand.

00:05:08.040 --> 00:05:10.180
But both of those require you changing your code.

00:05:10.180 --> 00:05:11.660
You can also use it from the outside.

00:05:11.660 --> 00:05:16.180
When you run an app, you can say dash M friendly traceback, then the script file.

00:05:16.180 --> 00:05:19.000
And it'll, that way you can run it on code.

00:05:19.000 --> 00:05:21.460
That's not modified to be like friendly, I guess.

00:05:21.460 --> 00:05:22.440
Unfriendly code.

00:05:22.500 --> 00:05:23.260
I don't know.

00:05:23.260 --> 00:05:25.780
Anthony, let's wrap this up.

00:05:25.780 --> 00:05:26.600
What are your thoughts on this thing?

00:05:26.600 --> 00:05:27.140
Looks good.

00:05:27.140 --> 00:05:29.320
I'm actually teaching my brother how to program right now.

00:05:29.320 --> 00:05:32.880
And he was pretty overwhelmed by the first stack trace that he saw.

00:05:32.880 --> 00:05:37.160
And I think if he would have saw something like this, it would have changed his perception

00:05:37.160 --> 00:05:41.540
about errors and maybe taught him something more than I had to teach him after the fact.

00:05:41.540 --> 00:05:42.960
Exactly.

00:05:42.960 --> 00:05:45.700
I mean, yeah, I totally, I think it's awesome.

00:05:45.700 --> 00:05:47.140
I really, really liked the idea.

00:05:47.140 --> 00:05:53.020
I do take Matt's point as valid as like, it's now a step preceding actually writing code

00:05:53.020 --> 00:05:54.220
that they've got to go through.

00:05:54.220 --> 00:05:58.420
So depending on how much control you have over their environment, if you can like get this

00:05:58.420 --> 00:06:00.160
in place for them, then maybe it's no big deal.

00:06:00.160 --> 00:06:00.740
But yeah.

00:06:00.740 --> 00:06:02.360
Anyway, worth considering.

00:06:02.360 --> 00:06:04.080
Matt, what do you got next for us?

00:06:04.080 --> 00:06:10.260
So recently the Pandas developers released the Pandas user survey from 2019.

00:06:10.260 --> 00:06:11.880
So this came out last week.

00:06:11.880 --> 00:06:18.200
They had a call on Twitter and they had about 1200 responses.

00:06:18.200 --> 00:06:19.380
Yeah, that's cool.

00:06:19.380 --> 00:06:21.760
I was surprised they got so many folks to participate.

00:06:21.760 --> 00:06:24.240
That's really, those are really solid numbers for statistics.

00:06:24.240 --> 00:06:24.720
Yeah.

00:06:24.720 --> 00:06:30.020
I think we've got a link to the survey there, but some of the things that stood out to me

00:06:30.020 --> 00:06:36.580
is that more than half of the people who responded have been using Pandas for less than two years.

00:06:36.760 --> 00:06:43.820
Pandas has been out for quite a while now, but it seems to be one of, from what I see,

00:06:43.820 --> 00:06:46.500
it's one of the key drivers of growth.

00:06:46.500 --> 00:06:51.520
It's just sort of a central component of sort of the data analysis, data science space.

00:06:51.520 --> 00:06:55.000
And it looks like they're getting a lot of new users there.

00:06:55.000 --> 00:06:55.280
Yeah.

00:06:55.280 --> 00:06:59.080
And so, you know, we talked about the incredible growth of Python before,

00:06:59.080 --> 00:07:04.080
and a lot of that has to do with this big inflection point where Python was largely adopted,

00:07:04.080 --> 00:07:06.400
moved to by data scientists.

00:07:06.720 --> 00:07:09.720
Do you think this is like an indicator of that?

00:07:09.720 --> 00:07:12.360
Like there's all these new folks coming into the Python ecosystem,

00:07:12.360 --> 00:07:14.420
and they're often coming into the data science space.

00:07:14.420 --> 00:07:17.360
And so, hence, they haven't been here for many, many years?

00:07:17.360 --> 00:07:18.340
Yeah, I think so.

00:07:18.340 --> 00:07:21.260
I mean, that's the sexy thing right now, data science.

00:07:21.260 --> 00:07:24.160
And it kind of didn't exist before.

00:07:24.160 --> 00:07:27.100
So there's a big push for AI, ML, that sort of thing.

00:07:27.100 --> 00:07:32.280
But if you look at, you know, the number one tool that data scientists use,

00:07:32.280 --> 00:07:33.460
it's often called Python.

00:07:33.460 --> 00:07:40.720
And I would say that Pandas is probably the number one tool of those people who are using data science.

00:07:40.720 --> 00:07:41.440
Cool.

00:07:41.440 --> 00:07:42.300
What else is in the survey?

00:07:42.300 --> 00:07:45.540
That was really interesting is they have the numbers of the operating system.

00:07:45.540 --> 00:07:47.660
So I sort of geek out on that sort of thing.

00:07:47.800 --> 00:07:51.140
But this isn't what I thought I would have thought at all,

00:07:51.140 --> 00:07:57.220
because some definitions of data scientists are they're a statistician who uses a MacBook in San Francisco.

00:07:57.220 --> 00:08:02.240
Yeah, you definitely do better data science if like the back of your laptop glows.

00:08:02.240 --> 00:08:05.260
An Alienware, maybe, but certainly an Apple.

00:08:05.260 --> 00:08:06.040
No, I'm just kidding.

00:08:07.440 --> 00:08:17.860
Yeah, so the numbers, actually, they have about 60% of their users use both Linux, 60% use Windows and 42 Mac.

00:08:17.860 --> 00:08:19.460
So I wouldn't have thought that.

00:08:19.460 --> 00:08:21.520
I mean, obviously, those don't add to 100.

00:08:21.520 --> 00:08:25.700
So I imagine you've got a lot of deployments on Linux, that sort of thing.

00:08:25.700 --> 00:08:30.440
But people tend to forget that Linux sort of rules the enterprise world.

00:08:30.440 --> 00:08:36.160
And I think this might be, you know, further indication that Pandas adoption or Python's adoption

00:08:36.160 --> 00:08:40.860
is not limited to just startups and people hacking around on their MacBook.

00:08:40.860 --> 00:08:45.280
I'm always super surprised by the percentage of Windows users when you consider Python.

00:08:45.280 --> 00:08:49.240
And I guess it makes sense because it's really easy to get started with Python on Windows.

00:08:49.240 --> 00:08:51.720
But it's the number just blows me away every time.

00:08:51.720 --> 00:08:52.680
Yeah, absolutely.

00:08:53.320 --> 00:08:58.480
Steve Dower did a great talk at PyCon called Python is OK on Windows, actually, or something like that.

00:08:58.480 --> 00:09:00.220
And he had some really interesting...

00:09:00.220 --> 00:09:00.900
Yeah, it was really good.

00:09:00.900 --> 00:09:02.140
And it had some interesting statistics.

00:09:02.140 --> 00:09:09.480
I feel like the Windows Python developers are somewhat in this realm of like the dark matter developers

00:09:09.480 --> 00:09:12.800
in that you know they're using it because it keeps showing up in these surveys.

00:09:12.800 --> 00:09:17.840
But you go to PyCon and there's many more MacBooks toting around and whatnot.

00:09:17.840 --> 00:09:19.860
But yeah, it's definitely a good thing to remember.

00:09:19.860 --> 00:09:22.880
And, you know, honestly, Matt, the thing that surprised me most here

00:09:22.880 --> 00:09:24.340
is how high Linux is in this group.

00:09:24.340 --> 00:09:26.700
Yeah, I imagine that's deployments.

00:09:26.700 --> 00:09:31.240
But the other interesting number here is Python 3 percentage.

00:09:31.240 --> 00:09:34.440
And Python 3 percentage is 93%.

00:09:34.440 --> 00:09:37.560
So legacy Python goodbye there, I guess.

00:09:37.560 --> 00:09:40.160
The data scientists move on to the latest and greatest.

00:09:40.160 --> 00:09:45.200
Yeah, the data scientists are leading the way with ditching legacy Python.

00:09:45.200 --> 00:09:49.380
I mean, the whole Python 3 statement came out of that space, which is pretty cool.

00:09:49.380 --> 00:09:56.060
I think that also has to do with less legacy code, as well as the models and the technology are changing so fast.

00:09:56.060 --> 00:09:58.220
You don't keep building on the same code.

00:09:58.220 --> 00:09:59.000
You're like, forget that.

00:09:59.000 --> 00:10:02.560
We're going to go to TensorFlow because this whole thing is slow and wrong, right?

00:10:02.740 --> 00:10:03.080
Mm-hmm.

00:10:03.080 --> 00:10:04.800
Yeah, like you said, I think they're leading the way.

00:10:04.800 --> 00:10:09.820
Well, speaking of Python 3, I think Anthony has something around that as well.

00:10:09.820 --> 00:10:10.280
Yeah.

00:10:10.280 --> 00:10:11.200
I do indeed.

00:10:11.200 --> 00:10:11.540
Yeah.

00:10:11.540 --> 00:10:16.700
Let's talk about the Y2K problem that I kind of stumbled upon recently.

00:10:16.700 --> 00:10:18.180
The YP3 problem?

00:10:18.180 --> 00:10:19.020
Yeah.

00:10:20.200 --> 00:10:21.140
Yeah, okay, what is this?

00:10:21.140 --> 00:10:25.300
Python 3.8, close to release, and Python 3.9, right around the corner.

00:10:25.300 --> 00:10:28.720
There's the question that comes up, which is, what is going to come after?

00:10:28.720 --> 00:10:34.560
And we really have two main choices, which would be like Python 3.10 or Python 4.0.

00:10:34.560 --> 00:10:38.500
But both of these present problems just because of their version number.

00:10:38.500 --> 00:10:46.540
So there's a significant amount of code out there that's using the sys.version and sys.version info variables in the sys module.

00:10:46.540 --> 00:10:52.540
Right, and trying to just take that string and go, is there a Python 3 or 2 in here or something like that, right?

00:10:52.540 --> 00:10:59.320
Yeah, there's a lot of slicing or checking the first character of that string, and it presents a number of different problems.

00:10:59.320 --> 00:11:07.160
The most common one that I've seen is when you access sys.version and look at the first three characters, and that works fine.

00:11:07.160 --> 00:11:10.220
It's like 2.7 or 3.6 or whatever.

00:11:10.220 --> 00:11:16.000
But as soon as the second minor version of Python becomes 10, you're suddenly reporting Python 3.1 again.

00:11:16.200 --> 00:11:18.360
All right, sorry, this doesn't support Python 3.1.

00:11:18.360 --> 00:11:19.900
You need at least version 3.5.

00:11:19.900 --> 00:11:22.000
You're like, no, it is 3.5.

00:11:22.000 --> 00:11:29.240
There's an even worse situation where if you check, even if you're doing it correctly and using sys.version info,

00:11:29.240 --> 00:11:35.860
if you only check the first number and only check a quality, so like say sys.version info 0 equals equals 3,

00:11:35.860 --> 00:11:40.100
that's a perfectly fine check if you're checking if it's exactly Python 3.

00:11:40.840 --> 00:11:44.400
But as soon as Python 4 happens, that condition is going to be false.

00:11:44.400 --> 00:11:45.680
And guess what?

00:11:45.680 --> 00:11:47.020
You're going to run Python 2 again.

00:11:47.020 --> 00:11:51.360
Yeah, some of the maintainability libraries like 6 have this in there, right?

00:11:51.360 --> 00:11:51.640
Yep.

00:11:51.640 --> 00:11:56.780
Yeah, 6 is broken if you change the version to 4, which is a little scary,

00:11:56.780 --> 00:12:00.520
given it's one of the most installed libraries, as we'll see later.

00:12:00.720 --> 00:12:05.240
Yeah, well, you know, I guess that makes sense because 6 is not divisible by 4, so it's probably fine.

00:12:05.240 --> 00:12:07.500
No, actually, this is really tricky.

00:12:07.500 --> 00:12:09.860
You know, it reminds me of Windows 10, right?

00:12:09.920 --> 00:12:15.620
Like, if you look at the Windows operating system numbers, we had Windows 7, which was XP,

00:12:15.620 --> 00:12:18.180
Windows 8, which was Vista, and then Windows 10.

00:12:18.180 --> 00:12:21.780
And the reason they don't have a Windows 9 is exactly this.

00:12:21.780 --> 00:12:28.560
Like, so many people were doing substring searches for Windows space 9 for looking for 95 or 98.

00:12:28.560 --> 00:12:32.520
And so if they had a 9 that was beyond, you know, Vista or whatever.

00:12:32.520 --> 00:12:34.360
Yeah, even Oracle Java had that problem.

00:12:34.720 --> 00:12:38.280
Yeah, it's, so they just said, you don't forget it, we're going to 10.

00:12:38.280 --> 00:12:42.440
But it doesn't sound like skipping to 4 is going to make this better, probably worse.

00:12:42.440 --> 00:12:44.280
I don't know, which do you think is the worst way to go?

00:12:44.280 --> 00:12:46.360
I think skipping to 4 is going to be worse.

00:12:46.360 --> 00:12:52.260
Most of the things with the 3.10 release will just be, like, slightly broken.

00:12:52.260 --> 00:12:57.060
But trying to run Python 2 code in Python 3 is way more broken.

00:12:57.060 --> 00:12:58.200
Yeah, for sure.

00:12:58.200 --> 00:13:03.220
So I haven't followed this, but I recall, and maybe my memory is just fading me,

00:13:03.440 --> 00:13:07.420
that there was talk that there would never be a Python 4.

00:13:07.420 --> 00:13:09.480
So has that changed?

00:13:09.480 --> 00:13:12.260
As far as I know, that hasn't changed.

00:13:12.260 --> 00:13:15.720
I think the jury's still kind of out on that one.

00:13:15.720 --> 00:13:22.120
Like, from what I understand, there was talks of, like, Python 4 just being the next version of Python 3.

00:13:22.120 --> 00:13:27.460
But I don't think anyone has definitively chosen whether it'll be 3.10 or 4.0 next.

00:13:27.460 --> 00:13:28.000
Yeah.

00:13:28.000 --> 00:13:28.260
Yeah.

00:13:28.260 --> 00:13:30.320
I mean, we're at this crossroads, right?

00:13:30.320 --> 00:13:34.560
Guido has expressed a dislike of double-digit second version numbers.

00:13:34.560 --> 00:13:37.940
But everyone is tired of this two versus three debate.

00:13:37.940 --> 00:13:39.880
We don't want to kick it up a notch, right?

00:13:39.880 --> 00:13:41.360
So where do you go from there, right?

00:13:41.360 --> 00:13:44.880
We'll just release 3.9.9.9.9.9 forever.

00:13:44.880 --> 00:13:46.320
That's right.

00:13:46.320 --> 00:13:47.480
Yeah, it'll be fine.

00:13:47.540 --> 00:13:49.200
But yeah, this actually is coming up pretty quickly.

00:13:49.200 --> 00:13:52.020
So 3.9 will reach beta.

00:13:52.020 --> 00:13:55.780
According to the PEP, we'll reach beta sometime in 2020.

00:13:55.780 --> 00:14:02.020
And usually when the next version releases on beta, they start developing the version afterwards.

00:14:02.020 --> 00:14:04.440
And so we'll start seeing 3.10 in the wild.

00:14:04.440 --> 00:14:10.220
But I made a couple easy ways that you can start fixing these problems before they're a problem, I guess.

00:14:10.220 --> 00:14:13.920
One of them, I pre-built a version of Python 3.10.

00:14:13.920 --> 00:14:16.540
Well, it's actually 3.8, but with a fake version number.

00:14:16.540 --> 00:14:19.120
And you can run that directly on Ubuntu today.

00:14:19.120 --> 00:14:24.960
And I made a Flake 8 plugin which checks for these common issues called Flake 8 2020.

00:14:24.960 --> 00:14:25.620
Nice.

00:14:25.620 --> 00:14:26.480
Yeah, that's really cool.

00:14:26.480 --> 00:14:27.880
Yeah, it makes it into your...

00:14:27.880 --> 00:14:30.720
So does that suggest that you use version info instead?

00:14:30.720 --> 00:14:35.340
Yeah, it makes the proper suggestion when it detects which thing that you're using incorrectly.

00:14:35.340 --> 00:14:35.780
Cool.

00:14:35.780 --> 00:14:36.420
Yeah, super.

00:14:36.420 --> 00:14:36.840
And that's great.

00:14:36.840 --> 00:14:40.340
Now, before we get to the next one, let me just tell you all quickly about Datadog.

00:14:40.340 --> 00:14:42.440
They're a long-term supporter of the show.

00:14:42.440 --> 00:14:49.680
And Datadog is a modern cloud-scale monitoring platform that brings all your metrics and logs and distributed traces together.

00:14:49.680 --> 00:14:55.180
So basically, it will auto-instrument all the popular frameworks, Django, Flask, Postgres, whatnot.

00:14:55.580 --> 00:15:01.440
And you can actually trace your requests and your performance across different service boundaries.

00:15:01.440 --> 00:15:07.940
So not just what is your Python code doing or what is your database doing, but like all together in one coherent thing, which is cool.

00:15:07.940 --> 00:15:12.360
If you go to a free trial with them, you'll get a cool Datadog t-shirt.

00:15:12.360 --> 00:15:15.220
Just visit pythonbytes.fm/Datadog to get started.

00:15:16.020 --> 00:15:20.240
Now, Anthony, you had hinted that we may come back to popular packages.

00:15:20.240 --> 00:15:28.360
And some folks out of the – I think they're associated with the University of Michigan, but they also have their own consulting project, these two folks.

00:15:28.360 --> 00:15:33.100
They did some interesting research on the current state of PyPI.

00:15:33.100 --> 00:15:35.560
Now, sometimes people use BigQuery.

00:15:35.560 --> 00:15:40.800
You can ask interesting questions like, well, what are the most common user agents downloading from PyPI?

00:15:40.960 --> 00:15:43.320
Or what are the most common packages or whatever?

00:15:43.320 --> 00:15:48.260
These folks went all in and they downloaded all of the packages from what I can tell.

00:15:48.260 --> 00:15:50.000
Like all of them.

00:15:50.000 --> 00:15:55.360
And then they started analyzing all sorts of stuff about them.

00:15:55.360 --> 00:16:08.460
So they started saying, look, we downloaded 178,592 packages, which has roughly 1.7 million releases and 77,000 contributors.

00:16:09.100 --> 00:16:17.180
And they also analyzed something that was pretty interesting is the connections or the interconnectivity or dependency graphs of these various things.

00:16:17.180 --> 00:16:23.040
And they found there's 157 million import statements within these packages.

00:16:23.040 --> 00:16:26.060
And then, yeah, they just did a bunch of analysis.

00:16:26.060 --> 00:16:29.620
This is basically like an academic research paper.

00:16:29.620 --> 00:16:32.060
So the thing I'm linking to is actually a PDF.

00:16:32.560 --> 00:16:36.100
So, you know, look for a download you're going to get rather than a website they set up.

00:16:36.100 --> 00:16:39.720
But, yeah, it's pretty interesting what these guys put together.

00:16:39.720 --> 00:16:42.300
What do you see that caught your attention going through this?

00:16:42.300 --> 00:16:47.320
I went to their what I read the paper and then I looked at they actually have a GitHub project.

00:16:47.320 --> 00:16:49.860
And I wanted to actually pull the data from the GitHub.

00:16:49.860 --> 00:16:51.460
But sadly, the data is not there.

00:16:51.460 --> 00:16:54.080
It says coming soon because I wanted to do some analysis on it.

00:16:54.080 --> 00:16:54.540
Ah, bummer.

00:16:54.680 --> 00:16:58.900
So my question is, what do you think is the most common third-party library?

00:16:58.900 --> 00:17:01.000
And it wasn't what I thought it would be.

00:17:01.000 --> 00:17:04.880
I mean, my guess was just going to be like six because you see that everywhere.

00:17:04.880 --> 00:17:05.380
Okay.

00:17:05.380 --> 00:17:06.440
All sorts of projects.

00:17:06.440 --> 00:17:08.000
Yeah, it's super, super low level.

00:17:08.000 --> 00:17:09.860
Yeah, I would have guessed requests.

00:17:09.860 --> 00:17:11.740
Yeah, that would have been my guess as well, I think.

00:17:11.860 --> 00:17:16.400
But the most common was NumPy, which surprised me.

00:17:16.400 --> 00:17:19.260
Those data scientists, they're really dominating.

00:17:19.260 --> 00:17:20.460
I don't know.

00:17:20.460 --> 00:17:21.760
They definitely are.

00:17:21.760 --> 00:17:22.040
Wow.

00:17:22.040 --> 00:17:22.960
How interesting.

00:17:22.960 --> 00:17:31.640
So certainly, so many of these libraries that are in the data science space do seem to all focus in on NumPy as the foundation, don't they?

00:17:31.640 --> 00:17:33.320
Yeah, sort of built around that as well.

00:17:33.320 --> 00:17:41.540
Yeah, I wonder how much more commonality there is, like more shared foundation there is in the data science space rather than, say, the web space.

00:17:41.540 --> 00:17:46.160
Where you've got Flask, Django, Pyramid, Bottle, Molten, whatever.

00:17:46.160 --> 00:17:48.520
And they all kind of have their own foundation.

00:17:48.520 --> 00:17:52.400
So that breaks up their potential high radius.

00:17:52.400 --> 00:17:53.520
Yeah, yeah, yeah.

00:17:53.520 --> 00:17:55.800
That was definitely interesting, NumPy.

00:17:55.800 --> 00:17:58.400
I wouldn't have guessed that, but I guess it does make sense.

00:17:58.400 --> 00:18:10.600
So some interesting things that I saw was within PyPI, they said they find that the growth of PyPI itself, all the packages, has been robust under all measures.

00:18:10.840 --> 00:18:17.380
With an annual compound growth of 47% year over year for the number of active packages.

00:18:17.380 --> 00:18:20.820
And 39% for new authors.

00:18:20.820 --> 00:18:24.140
And 61% for new import statements.

00:18:24.140 --> 00:18:28.960
So I guess that means Python packages are becoming more dependent on each other.

00:18:28.960 --> 00:18:30.100
Yeah, that doesn't make sense.

00:18:31.780 --> 00:18:37.380
Again, when I'm doing a training, I will go to PyPI, the Python package index.

00:18:37.380 --> 00:18:39.520
And I point them at that number.

00:18:39.520 --> 00:18:41.300
And I'm at it right now.

00:18:41.300 --> 00:18:44.740
And it says 193,830 projects right now.

00:18:44.740 --> 00:18:48.220
And I think that's pretty mind-blowing.

00:18:48.480 --> 00:18:52.500
But also, like you said, you've got 47% growth in there.

00:18:52.500 --> 00:18:55.040
39% for new authors, right?

00:18:55.040 --> 00:18:56.260
Yeah, that's incredible.

00:18:56.920 --> 00:19:05.520
Apparently, it's somewhat straightforward for someone to come into Python, make a package, and start contributing and sharing it with the community.

00:19:05.520 --> 00:19:05.920
Yeah.

00:19:06.060 --> 00:19:09.380
I think the new authors is the most impressive stat from there.

00:19:09.380 --> 00:19:15.200
Like, it means that people are coming into the community and, like, building stuff for other people, which is great.

00:19:15.320 --> 00:19:16.120
That's a really good point.

00:19:16.120 --> 00:19:16.740
Yeah, absolutely.

00:19:16.740 --> 00:19:18.500
That's a super positive number.

00:19:18.500 --> 00:19:23.520
That's really high growth when you're talking about you already have 77,000 authors, right?

00:19:23.520 --> 00:19:23.880
Yeah.

00:19:23.880 --> 00:19:26.360
Some other real quick stats I thought was interesting.

00:19:26.360 --> 00:19:31.040
They have the number of active packages, which is a much smaller number than the total packages.

00:19:31.040 --> 00:19:38.820
But in 2005, you could go to PyPI, and you could literally just kind of browse all the active packages.

00:19:38.820 --> 00:19:39.560
There were 96.

00:19:39.560 --> 00:19:40.680
Yeah.

00:19:40.800 --> 00:19:46.920
So in the early days, it was useful to have it, but it was not quite as amazing as almost 200,000 now.

00:19:46.920 --> 00:19:51.580
Before PyPI, there's this cheese shop, which I think was the predecessor of that.

00:19:51.580 --> 00:19:56.100
And it was sort of a single web page, and it had, like, here are the categories, right?

00:19:56.100 --> 00:19:58.840
And so on that web page was the list of packages.

00:19:58.840 --> 00:20:00.840
But yeah, this is crazy.

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

00:20:01.240 --> 00:20:06.200
So the cheese shop, you're telling me, is kind of like Yahoo for packaging.

00:20:06.200 --> 00:20:07.120
Yeah.

00:20:07.120 --> 00:20:08.900
All right.

00:20:09.200 --> 00:20:10.660
Final stat from this analysis.

00:20:10.660 --> 00:20:15.420
The most popular license for packages in the Python space is MIT.

00:20:15.420 --> 00:20:18.340
They've got all the lists, all of them listed there.

00:20:18.340 --> 00:20:18.820
That's pretty cool.

00:20:18.820 --> 00:20:20.740
All right, Matt, what's this next one?

00:20:20.740 --> 00:20:23.280
Speaking of data scientists, you got another one for us.

00:20:23.280 --> 00:20:23.320
Yeah.

00:20:23.320 --> 00:20:31.180
So speaking of data scientists and sort of, I guess, the proliferation of, Michael mentioned proliferation of web frameworks,

00:20:31.460 --> 00:20:38.600
I came across a new project that I hadn't seen before recently called DAPI, D-A-P-I.

00:20:38.600 --> 00:20:39.520
DAPI.

00:20:39.520 --> 00:20:40.860
DAPI.

00:20:41.100 --> 00:20:49.320
And it sort of labels itself as pandas for humans.

00:20:49.320 --> 00:20:54.400
And so I just think this is interesting now.

00:20:54.760 --> 00:20:55.760
We're going to be able to do that.

00:20:55.760 --> 00:21:03.080
And I recall, you know, when Django came out, at that time, there was another popular web framework called Turbo Gears.

00:21:03.080 --> 00:21:10.400
And there is sort of a faction in the Python community of like, are you a Turbo Gears person or you're a Django person, right?

00:21:10.420 --> 00:21:14.920
And they both sort of had their pluses and minuses, right?

00:21:14.920 --> 00:21:19.540
But I think, and Turbo Gears has sort of morphed into what we see as pyramid these days.

00:21:19.540 --> 00:21:21.680
But I see that there's been benefit.

00:21:21.680 --> 00:21:23.580
I think in general competition is good.

00:21:23.580 --> 00:21:25.560
And there's been benefit from that.

00:21:25.560 --> 00:21:27.320
This is an interesting library.

00:21:27.320 --> 00:21:30.400
It looks like it's sort of is pandas-esque.

00:21:30.400 --> 00:21:38.900
It's got portions of pandas in it, but it also has scikit-learn in it, yellow brick, which is a visualization tool for machine learning,

00:21:39.360 --> 00:21:40.520
and NumPy as well.

00:21:40.520 --> 00:21:45.860
And it says explicitly on there that it's designed for data analysis, not for coders,

00:21:45.860 --> 00:21:51.020
which I think that's trying to say that maybe pandas is a little too complicated

00:21:51.020 --> 00:21:56.160
and that data analysts maybe need something a little bit more simple than that.

00:21:56.160 --> 00:22:01.380
But I think it's interesting that there's now a proliferation and people are using Python.

00:22:01.380 --> 00:22:06.420
And maybe they're saying, oh, this, we want to use Python, but we want to use maybe something simpler.

00:22:06.420 --> 00:22:08.420
And there's a proliferation there.

00:22:08.680 --> 00:22:09.740
Yeah, I think it's super interesting.

00:22:09.740 --> 00:22:16.480
One of the things it seems to do is also leverage the simpler startup idea, kind of like you talked about before.

00:22:16.480 --> 00:22:23.500
Like a lot of folks say, well, you get started by setting up a Jupyter server and installing, you know, pandas and NumPy and all that stuff.

00:22:23.560 --> 00:22:34.340
And one of the things you can do with this is you can have one of these data sheets and you can say show and it will like print out an ASCII representation of the table and stuff like that.

00:22:34.340 --> 00:22:34.780
Yeah.

00:22:34.940 --> 00:22:41.840
In general, with most software, like a good five minute out of the box experience is really good for bringing someone on.

00:22:41.840 --> 00:22:42.180
Right.

00:22:42.180 --> 00:22:55.500
It'll be interesting to see what happens to this moving forward, because what I'm also seeing is a lot of new projects are taking the interface from pandas and replicating that.

00:22:55.540 --> 00:22:57.980
I mean, you've talked to people who are doing similar things, right?

00:22:57.980 --> 00:23:00.760
But like Dask, for example, and stuff like that.

00:23:00.760 --> 00:23:01.560
Like Dask.

00:23:01.600 --> 00:23:06.580
I was just playing the other day with a library called CUDF.

00:23:06.580 --> 00:23:13.560
I don't know how you pronounce that, but basically it's a pandas on top of CUDA.

00:23:13.560 --> 00:23:17.580
So you can leverage your GPU to do pandas like operations.

00:23:17.580 --> 00:23:19.940
So it'll be interesting to see where that goes.

00:23:19.940 --> 00:23:30.040
It looks like in general that the data science community is sort of honing in or adopting the pandas interface as sort of a standard interface.

00:23:30.260 --> 00:23:34.920
But, you know, is there room for improvement, room for something more for humans?

00:23:34.920 --> 00:23:37.060
I guess that remains to be seen there.

00:23:37.060 --> 00:23:37.340
Yeah.

00:23:37.340 --> 00:23:39.100
It definitely seems like a lot of flowers are blooming.

00:23:39.100 --> 00:23:40.000
Yeah.

00:23:40.000 --> 00:23:41.800
Which I think in general is good.

00:23:41.800 --> 00:23:42.820
Competition is good.

00:23:42.820 --> 00:23:47.240
And, you know, if you only have one tool, you have to use that tool.

00:23:47.240 --> 00:23:47.460
Right.

00:23:47.460 --> 00:23:52.320
But if there are multiple tools and some are better at certain things, then I think it pushes everyone to be better.

00:23:52.320 --> 00:23:54.300
So appreciate the competition there.

00:23:54.300 --> 00:23:54.760
For sure.

00:23:54.760 --> 00:23:58.700
How do you think a programming library that's not for coders works out?

00:23:59.040 --> 00:23:59.440
Yeah.

00:23:59.440 --> 00:24:02.000
I'm not sure how to interpret that.

00:24:02.000 --> 00:24:05.040
You start by installing friendly traceback and then you go from there.

00:24:05.040 --> 00:24:06.440
Yeah.

00:24:06.440 --> 00:24:07.600
Good one.

00:24:07.600 --> 00:24:11.340
I mean, I also consider Excel a programming environment.

00:24:11.340 --> 00:24:11.720
Right.

00:24:11.760 --> 00:24:15.000
I think Excel is the most common programming environment in the world.

00:24:15.000 --> 00:24:17.500
And lots of people use it.

00:24:17.500 --> 00:24:19.940
They won't admit that they're programming.

00:24:19.940 --> 00:24:24.420
But, I mean, if you do a VLOOKUP or something like that, you're programming using Excel.

00:24:24.420 --> 00:24:26.960
And Google Sheets is a great database.

00:24:26.960 --> 00:24:27.680
Yeah.

00:24:27.820 --> 00:24:31.400
At some point, I think you have to bite the bullet and learn some syntax.

00:24:31.400 --> 00:24:35.360
And so I'm not quite sure how to interpret that statement there.

00:24:35.360 --> 00:24:43.240
But friendly interface, Pandas has gotten some slack for some things that might not be super intuitive or not Pythonic in that way.

00:24:43.420 --> 00:24:45.740
So whether this is an improvement on that.

00:24:45.740 --> 00:24:47.680
Maybe it's a way to graduate to Pandas.

00:24:47.680 --> 00:24:48.140
Yeah.

00:24:48.140 --> 00:24:48.600
Yeah.

00:24:48.600 --> 00:24:50.580
This is your training wills.

00:24:50.580 --> 00:24:50.880
Yeah.

00:24:50.880 --> 00:24:51.480
Potentially.

00:24:51.480 --> 00:24:51.860
Potentially.

00:24:52.280 --> 00:25:03.220
Now, I started off this whole conversation by saying we could use this friendly traceback to possibly gather information about crashes on the server because it captures local.

00:25:03.220 --> 00:25:07.020
But, Anthony, this next one you've got might take it up a notch, right?

00:25:07.020 --> 00:25:07.340
Yeah.

00:25:07.340 --> 00:25:10.020
So I'm actually going to talk about Python Remote PDB.

00:25:10.020 --> 00:25:13.900
This is intended to be a small over-the-network remote debugger.

00:25:13.900 --> 00:25:18.700
It's a very, very thin wrapper around PDB that ships in a single file.

00:25:19.020 --> 00:25:26.160
It's really easy to kind of drop into an existing environment and just, like, add it to your path using Python Path.

00:25:26.160 --> 00:25:28.760
Or you can pip install if that's easier for you.

00:25:28.760 --> 00:25:30.500
It doesn't have all that many features.

00:25:30.500 --> 00:25:33.900
There's a bunch of other remote debuggers that are much more powerful.

00:25:33.900 --> 00:25:43.240
Things like PUDB or RPDB or PyCharm's debugger or Visual Studio Code's debugger or, like, any of the other things that are brought to the table.

00:25:43.240 --> 00:25:44.640
But I found this.

00:25:44.640 --> 00:25:45.360
It was pretty simple.

00:25:45.360 --> 00:25:48.140
It solved my use case and worked pretty well.

00:25:48.140 --> 00:25:48.860
That's cool.

00:25:48.860 --> 00:25:56.560
So it integrates with Python's new breakpoint feature, which lets you plug in a new debugger, right?

00:25:56.560 --> 00:25:56.920
Yep.

00:25:56.920 --> 00:25:57.160
Yeah.

00:25:57.160 --> 00:25:58.900
You just set some environment variables.

00:25:58.900 --> 00:26:06.740
And any time you call breakpoint in your code, the runtime knows how to import the right module and call the right stuff to call your debugger.

00:26:06.960 --> 00:26:15.080
So if you wanted to call remote PDB, you would just set Python breakpoint equals remote PDB dot set trace, and it would just do the right thing.

00:26:15.080 --> 00:26:15.420
Yeah.

00:26:15.420 --> 00:26:16.120
That's pretty cool.

00:26:16.120 --> 00:26:16.520
Yeah.

00:26:16.680 --> 00:26:17.100
Yeah.

00:26:17.100 --> 00:26:28.320
And the access for this tool is you generally just use, like, Telnet or Netcat or SocketCat or anything that can talk to a socket and basically gives you a PDB session remotely.

00:26:29.020 --> 00:26:33.300
I'm actually working on creating my own text editor just so I can learn curses.

00:26:33.300 --> 00:26:40.720
And it was really useful to be able to debug a curses application because you can't really enter PDB while it's trying to paint your screen.

00:26:40.720 --> 00:26:41.140
Yeah.

00:26:41.240 --> 00:26:41.980
That's interesting.

00:26:41.980 --> 00:26:47.540
So, I mean, even though it sets up a little server, you don't have to have it be on a different machine, right?

00:26:47.540 --> 00:26:48.120
Yep.

00:26:48.120 --> 00:26:48.360
Yeah.

00:26:48.360 --> 00:26:51.820
I was just developing it in one tab, and I had a debugger in my other tab.

00:26:51.820 --> 00:26:52.280
Yeah.

00:26:52.280 --> 00:26:52.480
Yeah.

00:26:52.480 --> 00:27:04.100
So, in general, anything that's printing to – if you've got something that's printing to the screen or maybe doing input from the screen, that might be a case where this would be more appropriate than the built-in debugging tools of Python.

00:27:04.380 --> 00:27:04.860
Yeah.

00:27:04.860 --> 00:27:13.520
Another use case might be if you're, like, using a web server, although, like, Flask has nice tools for using a debugger, and Pyramid does as well, and I'm sure the others do also.

00:27:13.520 --> 00:27:15.500
But it's a potential tool.

00:27:15.500 --> 00:27:16.460
Yeah, that's cool.

00:27:16.460 --> 00:27:17.320
Yeah, more tools are good.

00:27:17.320 --> 00:27:19.100
Tell folks really quick what curses is.

00:27:19.100 --> 00:27:25.880
Curses is a library which allows you to paint kind of graphical user interfaces, but in a terminal.

00:27:25.880 --> 00:27:31.760
It's kind of how text editors like Vim or Nano or Emacs draw out their UI.

00:27:31.760 --> 00:27:33.940
Or if I wanted to create a game for, like, a BBS.

00:27:34.900 --> 00:27:35.220
Oh, yeah.

00:27:35.220 --> 00:27:36.320
You can make games with it, too.

00:27:36.320 --> 00:27:37.900
I've seen some really good curses games.

00:27:37.900 --> 00:27:38.780
Yeah, that's pretty cool.

00:27:38.780 --> 00:27:39.460
All right.

00:27:39.460 --> 00:27:41.560
Well, that's definitely a good one, and I hadn't heard of it.

00:27:41.560 --> 00:27:42.740
So, yeah, thanks for sharing that.

00:27:42.740 --> 00:27:48.740
And that's it for our main topics, but I do have a few quick extras I know we all do that I want to share.

00:27:48.740 --> 00:27:51.780
I just want to share a story that just made me laugh.

00:27:51.780 --> 00:27:52.680
I really love it.

00:27:52.680 --> 00:27:55.180
So, there was this – the press calls them a hacker.

00:27:55.180 --> 00:28:00.260
I don't really know what this person would be classified as because this is like a pretty low-level hack.

00:28:00.260 --> 00:28:13.140
But a person was trying to avoid getting parking tickets, and they assumed that if what they could insert into the field that contains the number for the license plate was null,

00:28:13.560 --> 00:28:22.740
the systems like at, you know, the county or whatever is going to give you a ticket, say, oh, there's no address or there's no license plate here, so we can't send them a ticket.

00:28:22.740 --> 00:28:25.760
But in fact, quite the opposite is the case.

00:28:25.800 --> 00:28:33.000
So, there's this person who got a custom license plate, which you can do in the U.S. and have like words on it, and they got the word null, N-U-L-L, all capital.

00:28:33.000 --> 00:28:44.020
And then all of a sudden, all the other places where there actually were nulls in the database started directing to this license plate,

00:28:44.020 --> 00:28:53.320
and they got $12,000 in parking tickets without even parking illegally because they started to receive all the failure cases of the database for the parking.

00:28:53.320 --> 00:28:55.580
Ah, guess he hacked himself.

00:28:55.580 --> 00:28:56.600
Exactly.

00:28:56.600 --> 00:29:03.060
I don't know, hackers would take kindly to the naming there, but I don't think it worked out how he wanted it to.

00:29:03.060 --> 00:29:04.420
It was definitely a backfire.

00:29:04.420 --> 00:29:05.860
Anyway, I'll link into that.

00:29:05.860 --> 00:29:06.360
That's pretty funny.

00:29:06.360 --> 00:29:11.220
And then just really quick, PyCon 2020 has been sort of officially announced.

00:29:11.220 --> 00:29:13.860
It's going to be earlier this year.

00:29:13.860 --> 00:29:15.620
I'm trying to figure out exactly.

00:29:15.620 --> 00:29:16.220
Yeah, yeah.

00:29:16.220 --> 00:29:22.200
It's going to be April 15 to 23 in Pittsburgh, and the website is already up.

00:29:22.200 --> 00:29:24.000
So go check it out.

00:29:24.000 --> 00:29:24.500
Sign up.

00:29:24.500 --> 00:29:26.360
Maybe you can submit a talk.

00:29:26.360 --> 00:29:28.520
I'm not entirely sure, but the website at least is already up.

00:29:28.520 --> 00:29:30.280
So I'll link to that, and people can check that out.

00:29:30.280 --> 00:29:31.100
Matt, what do you got?

00:29:31.320 --> 00:29:37.200
I recently released a course on Pluralsight on the XGBoost library.

00:29:37.200 --> 00:29:49.820
So XGBoost, if you're not familiar with it, is a library that a lot of people are using with great success in like Kaggle competitions for analyzing structured data and making predictive models around that.

00:29:49.820 --> 00:30:02.080
So if you're interested in an in-depth course on XGBoost, not only how to use it, but how to tune it, how to understand what the model is predicting when it comes out, check that out.

00:30:02.080 --> 00:30:08.980
I've got a bit.ly link, bit.ly slash PSXGB, Pluralsight XGBoost.

00:30:08.980 --> 00:30:11.160
So PSXGB if you're interested in that.

00:30:11.160 --> 00:30:11.420
Nice.

00:30:11.420 --> 00:30:12.880
Yeah, we'll put the links to the show notes.

00:30:12.880 --> 00:30:14.100
Congrats on the new course.

00:30:14.200 --> 00:30:17.980
You and I have both written a fair number of online courses, and that's a lot of work.

00:30:17.980 --> 00:30:18.840
Yeah, thank you.

00:30:18.840 --> 00:30:19.760
Yeah, I'm excited about it.

00:30:19.760 --> 00:30:23.140
I think it's a great course for anyone interested in XGBoost.

00:30:23.140 --> 00:30:23.940
Yeah, awesome.

00:30:23.940 --> 00:30:25.000
Anthony?

00:30:25.000 --> 00:30:25.440
Cool.

00:30:25.440 --> 00:30:27.100
I've got one quick little library.

00:30:27.100 --> 00:30:30.780
This is on the same line as the Curses work above.

00:30:30.780 --> 00:30:32.980
I found a tool called Ekate.

00:30:32.980 --> 00:30:34.280
I don't know how to pronounce it.

00:30:34.280 --> 00:30:38.780
It labels itself as a Selenium web driver, but for the terminal.

00:30:39.120 --> 00:30:46.300
And it's kind of a cool library that allows you to control a process in the background and make assertions about it as a testing library.

00:30:46.300 --> 00:30:51.340
So are you sending Curses commands, or is that like expect?

00:30:51.340 --> 00:30:58.760
So the way it works is it runs a TMux server in the background and then uses the TMux commands to interact with it.

00:30:58.760 --> 00:31:02.080
So it'll sound like up arrow or like control X.

00:31:02.080 --> 00:31:03.600
Like sends keys, kind of.

00:31:03.600 --> 00:31:04.580
Yep, pretty much.

00:31:04.580 --> 00:31:05.860
Ah, that's cool.

00:31:06.400 --> 00:31:11.640
I can see utility in that for like driving demos and that sort of thing as well.

00:31:11.640 --> 00:31:12.140
That's cool.

00:31:12.140 --> 00:31:13.020
Oh, yeah, that would be cool.

00:31:13.020 --> 00:31:16.500
Yeah, you sit there and it looks like you're typing and you're just flying through it.

00:31:16.500 --> 00:31:17.160
And you just get up.

00:31:17.160 --> 00:31:19.060
You say, let me show you some over here and it just keeps going.

00:31:19.060 --> 00:31:19.460
Feel like.

00:31:19.460 --> 00:31:21.860
Yeah.

00:31:21.860 --> 00:31:24.600
Yeah, and you could make it understand Emacs.

00:31:24.600 --> 00:31:25.780
It could even control Emacs.

00:31:25.780 --> 00:31:26.220
Awesome.

00:31:26.220 --> 00:31:26.900
Yeah.

00:31:26.900 --> 00:31:28.720
Yeah, it works great for Emacs too.

00:31:28.720 --> 00:31:29.680
Sweet.

00:31:29.680 --> 00:31:30.020
All right.

00:31:30.020 --> 00:31:32.720
We always sit in the show with a joke or two.

00:31:32.720 --> 00:31:36.840
And this one is not like a laugh out loud sort of joke.

00:31:36.840 --> 00:31:38.180
But Matt, you're here.

00:31:38.180 --> 00:31:39.160
You do a lot of data science.

00:31:39.160 --> 00:31:43.360
I thought I'd bring some sort of scientific-esque humor here.

00:31:43.360 --> 00:31:46.360
And I just, this one just really is deeply satisfying to me.

00:31:46.360 --> 00:31:47.940
So I'll just, it's a little story.

00:31:47.940 --> 00:31:49.640
I'll get you all a reaction in a minute.

00:31:50.380 --> 00:31:54.340
So there are two mathematicians sitting at a table in a pub having an argument about the

00:31:54.340 --> 00:31:57.880
level of math education among the general public.

00:31:57.880 --> 00:32:00.360
Like one of them is defending overall math knowledge.

00:32:00.360 --> 00:32:02.760
And he gets up and goes to the restroom.

00:32:02.760 --> 00:32:06.120
And on his way back, he wants to prove his point, right?

00:32:06.120 --> 00:32:11.040
So he encounters the waitress and says, hey, I'll give you an extra $10 on your tip if you

00:32:11.040 --> 00:32:12.720
can answer a question for me.

00:32:12.720 --> 00:32:14.420
It doesn't matter what I ask.

00:32:14.420 --> 00:32:17.020
Just say the words X squared.

00:32:17.020 --> 00:32:17.880
X squared, okay?

00:32:17.880 --> 00:32:18.920
She's like, yeah, sure.

00:32:18.920 --> 00:32:19.260
No problem.

00:32:19.780 --> 00:32:22.340
So a few minutes later, the guy sits back down with his buddy.

00:32:22.340 --> 00:32:26.720
He says, I'll bet you $20 that even our waitress can tell us the integral of 2X.

00:32:26.720 --> 00:32:29.260
And the cynic's like, yeah, I'll take that bet, buddy.

00:32:29.260 --> 00:32:29.760
No problem.

00:32:29.760 --> 00:32:34.780
So he beckons her over to the table, asks the question to which she replies, X squared.

00:32:34.780 --> 00:32:37.840
And this mathematician begins to go and demand is winning.

00:32:37.840 --> 00:32:39.620
And she says, plus a constant.

00:32:39.620 --> 00:32:45.860
I don't know why I like that one.

00:32:45.860 --> 00:32:46.660
At least she knows.

00:32:47.980 --> 00:32:50.460
Yeah, I don't know why I like that one, but it's just satisfying to me.

00:32:50.460 --> 00:32:51.360
So yeah.

00:32:51.360 --> 00:32:57.320
So on that, brief aside, there was a poll on Twitter the other day whether they should

00:32:57.320 --> 00:33:00.300
teach statistics or calculus in high school.

00:33:00.300 --> 00:33:01.900
That's an interesting question.

00:33:01.900 --> 00:33:05.840
And I said, the only times I've used calculus since high school, even though I much enjoyed

00:33:05.840 --> 00:33:09.320
the class, was tutoring other people in calculus.

00:33:10.740 --> 00:33:12.660
That's a good career path, by the way.

00:33:12.660 --> 00:33:13.980
Just, you know, when you're young.

00:33:13.980 --> 00:33:15.200
That's right.

00:33:15.200 --> 00:33:16.540
No, I hear you.

00:33:16.540 --> 00:33:21.500
But I honestly, if you're going to throw up a math class in high school for the first sacrifice,

00:33:21.500 --> 00:33:22.600
geometry.

00:33:22.600 --> 00:33:24.320
It's got to be geometry.

00:33:24.320 --> 00:33:26.120
Replace that with some computer programming.

00:33:26.120 --> 00:33:27.700
Serve as the same purpose.

00:33:27.700 --> 00:33:28.560
Logical thinking.

00:33:28.560 --> 00:33:29.240
Let's do it.

00:33:29.240 --> 00:33:30.500
Awesome.

00:33:31.800 --> 00:33:33.420
But yeah, I definitely take your point.

00:33:33.420 --> 00:33:34.760
All right.

00:33:34.760 --> 00:33:37.520
Anthony, do you have another joke or you want to, should we wrap it up?

00:33:37.520 --> 00:33:40.600
I had a Golang joke prepared, but then I panicked.

00:33:40.600 --> 00:33:41.540
Whoa.

00:33:41.540 --> 00:33:42.320
Whoa.

00:33:42.320 --> 00:33:44.900
I would cut that too.

00:33:44.900 --> 00:33:45.760
No, no.

00:33:45.760 --> 00:33:46.520
Don't worry about it.

00:33:46.520 --> 00:33:48.140
It's all good, man.

00:33:48.140 --> 00:33:52.040
Thank you, Matt Harrison, Anthony Sotile.

00:33:52.040 --> 00:33:53.560
Thank you both for being here.

00:33:53.560 --> 00:33:56.980
It's been really great to have you, Matt, back on the show and Anthony here for the first

00:33:56.980 --> 00:33:57.200
time.

00:33:57.200 --> 00:33:57.480
Yeah.

00:33:57.480 --> 00:33:58.200
Thanks for having me.

00:33:58.200 --> 00:33:58.460
Yeah.

00:33:58.460 --> 00:33:58.940
Thanks guys.

00:33:58.940 --> 00:33:59.400
Bye.

00:33:59.400 --> 00:33:59.480
Bye.

00:33:59.680 --> 00:33:59.840
Okay.

00:33:59.840 --> 00:34:00.040
Bye.

00:34:00.040 --> 00:34:02.180
Thank you for listening to Python Bytes.

00:34:02.180 --> 00:34:04.720
Follow the show on Twitter via at Python Bytes.

00:34:04.720 --> 00:34:07.560
That's Python Bytes as in B-Y-T-E-S.

00:34:07.560 --> 00:34:10.800
And get the full show notes at pythonbytes.fm.

00:34:10.800 --> 00:34:15.020
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:34:15.020 --> 00:34:17.720
We're always on the lookout for sharing something cool.

00:34:17.720 --> 00:34:20.820
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:34:20.820 --> 00:34:24.260
Thank you for listening and sharing this podcast with your friends and colleagues.

