WEBVTT

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

00:00:04.720 --> 00:00:09.600
This is episode 118, recorded February 19th, 2019.

00:00:09.600 --> 00:00:10.760
I'm Michael Kennedy.

00:00:10.760 --> 00:00:11.580
And I'm Brian Okken.

00:00:11.580 --> 00:00:14.140
And this episode is brought to you by DigitalOcean.

00:00:14.140 --> 00:00:16.780
Check them out at pythonbytes.fm/DigitalOcean.

00:00:16.780 --> 00:00:17.760
More on that later.

00:00:17.760 --> 00:00:20.040
Right now, Brian, it's...

00:00:20.040 --> 00:00:21.200
Man, it is cold outside.

00:00:21.200 --> 00:00:22.720
It's not bad.

00:00:22.720 --> 00:00:25.300
I would say it's frozen.

00:00:25.300 --> 00:00:26.520
Okay.

00:00:26.520 --> 00:00:28.400
Oh, yeah.

00:00:28.660 --> 00:00:30.340
The whole transition thing.

00:00:30.340 --> 00:00:31.180
You're so good at that.

00:00:31.180 --> 00:00:33.960
The first topic is frozen Flask.

00:00:33.960 --> 00:00:37.460
This was sent in by somebody who I probably should have written their name down.

00:00:37.460 --> 00:00:39.660
But it was recommended by a listener.

00:00:39.660 --> 00:00:42.320
And it's actually pretty darn cool.

00:00:42.320 --> 00:00:45.660
So I've been playing with static site generators a little bit.

00:00:45.660 --> 00:00:54.380
And here's the idea is if you already have Flask application up, and it's mostly static-y content anyway,

00:00:54.380 --> 00:00:55.380
or it's got some...

00:00:55.980 --> 00:00:58.620
Yeah, activity is more JavaScript-y or something.

00:00:58.620 --> 00:01:05.540
You can just freeze that into a statically servable web thing with frozen Flask.

00:01:05.540 --> 00:01:06.600
And it's pretty painless.

00:01:06.600 --> 00:01:08.060
Frozen Flask looks so cool.

00:01:08.060 --> 00:01:09.180
Yeah, it really does.

00:01:09.620 --> 00:01:18.480
And then I also stumbled across a tutorial that's called Dead Easy Yet Powerful Static Website Generator with Flask.

00:01:18.480 --> 00:01:20.360
And it talks about frozen Flask.

00:01:20.360 --> 00:01:31.420
And it also talks about an extension to Flask called Flask Flat Pages, which allows you to have a bunch of pages generated from Markdown.

00:01:31.420 --> 00:01:32.260
Oh, that's pretty cool.

00:01:32.260 --> 00:01:33.240
Yeah, I haven't heard of that.

00:01:33.240 --> 00:01:33.720
That's nice.

00:01:33.880 --> 00:01:35.200
And it's pretty fun.

00:01:35.200 --> 00:01:37.180
I'm going to warn you, I tried to go through this tutorial.

00:01:37.180 --> 00:01:39.300
It's still got a lot of great information.

00:01:39.300 --> 00:01:40.140
It's well written.

00:01:40.140 --> 00:01:41.200
It's just a little...

00:01:41.200 --> 00:01:44.080
Since it was from 2012, it's a little out of date.

00:01:44.080 --> 00:01:45.960
Some of the imports don't quite work.

00:01:45.960 --> 00:01:47.360
So you'll have to do some Googling.

00:01:47.360 --> 00:01:51.020
The frozen Flask that we also link to has some really cool...

00:01:51.020 --> 00:01:54.300
It's some pretty easy tutorials on there too.

00:01:54.440 --> 00:01:55.540
So it looks fun.

00:01:55.540 --> 00:01:56.680
Yeah, that looks really cool.

00:01:56.680 --> 00:02:04.960
There's always this tension between having a data-driven website where maybe I've got a bunch of podcast episodes or something.

00:02:04.960 --> 00:02:05.780
And they all have notes.

00:02:05.780 --> 00:02:09.300
But I want to have a whole bunch of stuff around them and have that generated.

00:02:09.300 --> 00:02:13.280
And of course, that would be like a regular Flask data-driven app, right?

00:02:13.280 --> 00:02:17.100
But if I'm going to do that with a static thing, how do I do that?

00:02:17.100 --> 00:02:19.060
Do I create a bunch of static Markdown?

00:02:19.060 --> 00:02:20.060
How do I mix it all together?

00:02:20.060 --> 00:02:20.960
It can be painful, right?

00:02:21.300 --> 00:02:24.820
So Frozen Flask is like, well, you create the dynamic thing, but then you host it.

00:02:24.820 --> 00:02:26.800
You don't have to deal with the infrastructure hosting.

00:02:26.800 --> 00:02:30.980
You just put HTML and CSS somewhere and it runs great, right?

00:02:30.980 --> 00:02:31.300
Yeah.

00:02:31.300 --> 00:02:34.280
Like, for instance, I was thinking it would be a neat way to do this.

00:02:34.280 --> 00:02:38.160
I was always potentially looking for ways I can use something also.

00:02:38.160 --> 00:02:45.920
Like if I've got something internal for our test team, for instance, and we want to look at all of our test data and analytics and all that stuff,

00:02:45.920 --> 00:02:49.000
having a more dynamic site would be really neat.

00:02:49.180 --> 00:02:57.680
But then also a periodic generation of like a version report or something as a static site.

00:02:57.680 --> 00:02:57.860
Yeah.

00:02:57.860 --> 00:02:59.540
This would be useful for something like that.

00:02:59.540 --> 00:02:59.760
Yeah.

00:02:59.760 --> 00:03:05.120
And so place that I just want to throw out is like an extra for this part that I have no experience with,

00:03:05.120 --> 00:03:06.720
but seems super cool.

00:03:06.720 --> 00:03:09.500
And I think you also are familiar with this is Netlify.

00:03:09.500 --> 00:03:10.040
Yeah.

00:03:10.040 --> 00:03:10.340
Yeah.

00:03:10.400 --> 00:03:14.940
So Netlify is a place specifically for hosting static sites.

00:03:14.940 --> 00:03:18.600
So it says build, deploy, and manage modern web projects.

00:03:18.600 --> 00:03:24.820
And it gives you a global CDN, continuous integration, and automatic free HTTPS,

00:03:24.820 --> 00:03:27.920
I think even your own domain name, 100% for free.

00:03:27.920 --> 00:03:32.600
There are ways to pay for it, but so much of it is for free that this seems like a really good option.

00:03:32.820 --> 00:03:32.960
Yeah.

00:03:32.960 --> 00:03:34.840
And they're not sponsoring this episode.

00:03:34.840 --> 00:03:35.600
It's just cool.

00:03:35.600 --> 00:03:37.180
That's not, that's, that's just something that's cool.

00:03:37.180 --> 00:03:37.600
That's right.

00:03:37.600 --> 00:03:38.600
Digital Ocean.

00:03:38.600 --> 00:03:40.020
They are sponsoring this episode.

00:03:40.800 --> 00:03:47.760
So last week, I think it was, we spoke about the new PEP that is for Dunder PyPackages.

00:03:47.760 --> 00:03:48.060
Yeah.

00:03:48.060 --> 00:03:49.680
And you said that's awesome, except.

00:03:49.680 --> 00:03:50.060
Yeah.

00:03:50.060 --> 00:03:52.680
It's awesome, but.

00:03:52.680 --> 00:03:58.020
And one of the challenges you said was, well, if you just want to have packages and put them in there

00:03:58.020 --> 00:04:00.140
and run your app, that's totally good.

00:04:00.140 --> 00:04:01.300
It'll pick it up and run.

00:04:01.300 --> 00:04:12.820
But the big, the thing that was missing was to run the command line binary apps like pytest or Tox or P-Serve or, you know, like MicroWSGI,

00:04:12.820 --> 00:04:18.580
all those things that would then get stuffed into that place that is really nearly impossible to put into your path, right?

00:04:18.580 --> 00:04:18.860
Yeah.

00:04:18.860 --> 00:04:19.400
Yeah.

00:04:19.400 --> 00:04:20.600
Well, not impossible, but.

00:04:20.600 --> 00:04:22.780
Not impossible, but it's a, it's a super pain.

00:04:22.780 --> 00:04:24.920
Like every time you create a virtual environment to add it.

00:04:24.920 --> 00:04:25.340
Yeah.

00:04:25.340 --> 00:04:26.560
To the path, right?

00:04:26.640 --> 00:04:38.100
So, so Chad Smith, who had worked on that before, well, we mentioned who was part of the, this Python loc for like local Python project to let you do like a preview interaction with that.

00:04:38.100 --> 00:04:46.580
Sent us a message and said, Hey, actually you should know about my other project called PIPX, I guess for a pip executable or something like that.

00:04:46.580 --> 00:04:51.720
And the idea is it will execute binary Python packages in isolated environments.

00:04:51.720 --> 00:04:56.360
And the closest analogy analogy to this is probably PIPC, which we have spoken about before.

00:04:56.560 --> 00:04:56.800
Oh yeah.

00:04:56.800 --> 00:04:57.260
Okay.

00:04:57.260 --> 00:05:07.780
So, so the idea is, yeah, you can create these, you can basically, instead of pip install a thing, you can PIPX install a thing and it'll automatically create a virtual environment for you.

00:05:07.780 --> 00:05:09.700
Install it and its dependencies.

00:05:09.700 --> 00:05:11.480
And even it, it's even nice.

00:05:11.480 --> 00:05:17.620
It makes sure your pip is up to date, which is almost never the case when you create a new virtual environment and it just installs it there.

00:05:17.620 --> 00:05:19.280
And then it puts it in the path.

00:05:19.800 --> 00:05:29.800
It puts it in a location on your system that when you install PIPX is in the path, but is not in the restricted part of your operating system.

00:05:29.800 --> 00:05:32.260
So you can pip install anything you need to run.

00:05:32.260 --> 00:05:36.180
So you can run it from the command line in your path without doing sudo.

00:05:36.180 --> 00:05:36.520
Okay.

00:05:36.520 --> 00:05:42.260
So the entry points are going to all go from a bunch of different virtual environments are all going to go to the same place, I guess.

00:05:42.260 --> 00:05:42.520
Yes.

00:05:42.520 --> 00:05:44.580
It does a bunch of like linking back.

00:05:44.580 --> 00:05:45.020
Okay.

00:05:45.020 --> 00:05:49.000
Some place that's in the path back to the various virtual environments it manages.

00:05:49.000 --> 00:05:49.360
Okay.

00:05:49.420 --> 00:05:50.260
This is a very cool.

00:05:50.260 --> 00:05:51.040
Now I'm excited.

00:05:51.040 --> 00:05:51.320
Yeah.

00:05:51.320 --> 00:05:52.540
Now I'm even more excited.

00:05:52.540 --> 00:05:52.760
Yeah.

00:05:52.760 --> 00:05:53.960
This is, this is super cool.

00:05:53.960 --> 00:06:04.320
So you can safely install these packages into virtual environments, which is where they belong, but globally, but without messing up other things or, or, you know, put them all into one virtual environment.

00:06:04.320 --> 00:06:05.040
That's in your path.

00:06:05.040 --> 00:06:05.280
Yeah.

00:06:05.280 --> 00:06:07.440
You can do things like list the stuff that's installed.

00:06:07.440 --> 00:06:10.080
So you can see which of the, which it's kind of like brew.

00:06:10.080 --> 00:06:13.540
You can say, what have I installed here through PIPX, which is pretty cool.

00:06:13.540 --> 00:06:18.180
I'd also run binaries out of the pie package directory as well.

00:06:18.680 --> 00:06:21.260
So it's kind of a companion tool to Python Locke as well.

00:06:21.260 --> 00:06:21.580
Okay.

00:06:21.580 --> 00:06:22.180
Nice.

00:06:22.180 --> 00:06:25.760
Being a Gen Xer, I'm, I'm a sucker for anything with X at the end.

00:06:25.760 --> 00:06:26.160
I know.

00:06:26.160 --> 00:06:26.680
It's amazing.

00:06:26.680 --> 00:06:27.680
It's, it's the best.

00:06:27.680 --> 00:06:31.340
So basically you just pip install PIPX.

00:06:31.340 --> 00:06:36.440
And then from then on, you can say pip install like PT Python, which is an awesome thing.

00:06:36.440 --> 00:06:38.800
You could pip install pytest.

00:06:38.800 --> 00:06:41.440
You could pip install all sorts of things, glances.

00:06:41.440 --> 00:06:46.720
And there's a couple of ways in which it's sort of like Pipsy, but also better.

00:06:46.720 --> 00:06:50.420
So one of the things that I really like, you know, I made the analogy to homebrew before

00:06:50.420 --> 00:06:53.800
is you can go and say PIPX upgrade all.

00:06:54.200 --> 00:06:58.920
And so everything that you've installed throughout the last six months or whatever with PIPX,

00:06:58.920 --> 00:07:03.280
it'll go and find those and see if there's any updates for any of your little Python utilities

00:07:03.280 --> 00:07:03.820
you've installed.

00:07:03.820 --> 00:07:04.320
Oh, cool.

00:07:04.320 --> 00:07:05.380
That's cool, right?

00:07:05.380 --> 00:07:05.600
Yeah.

00:07:05.600 --> 00:07:05.860
Yeah.

00:07:05.860 --> 00:07:09.200
And then there's also a comparison, little matrix thing by matrix.

00:07:09.200 --> 00:07:11.900
I mean, one dimensional single line.

00:07:11.900 --> 00:07:16.300
Anyway, there's a comparison to PIPC and it talks about how PIPX is under active development.

00:07:16.300 --> 00:07:19.700
PIPC isn't in a bunch of other stuff.

00:07:19.700 --> 00:07:22.140
You know, it's based on Python three, six and so on.

00:07:22.140 --> 00:07:24.720
It uses V and V not virtual environment.

00:07:24.780 --> 00:07:27.260
And there's just a bunch of little niceties.

00:07:27.260 --> 00:07:31.640
And, you know, one that made me smile is it prints out emojis when it's doing stuff.

00:07:31.640 --> 00:07:35.980
It prints out little happy face, like little indicator emojis on the terminal, which, you

00:07:35.980 --> 00:07:36.900
know, makes me happy.

00:07:36.900 --> 00:07:37.260
Yeah.

00:07:37.260 --> 00:07:38.660
What's the other thing that does that?

00:07:38.660 --> 00:07:40.000
PIPenv does that, right?

00:07:40.000 --> 00:07:40.300
Yeah.

00:07:40.300 --> 00:07:40.780
Yeah.

00:07:41.020 --> 00:07:43.860
And yeah, Kubernetes, some of the Kubernetes tools do as well.

00:07:43.860 --> 00:07:48.640
It's a trend I'm seeing coming along here, but there's a lot of smiley, happy little things

00:07:48.640 --> 00:07:50.700
on the terminal, which is, you know, it doesn't hurt.

00:07:50.700 --> 00:07:50.920
Yeah.

00:07:50.920 --> 00:07:51.200
Yeah.

00:07:51.200 --> 00:07:52.040
What's the next thing you got for us?

00:07:52.040 --> 00:07:58.500
This is an article from Vicky Boykus that's called Data Science is Different Now.

00:07:58.500 --> 00:08:02.880
It's a fairly lengthy article, but it's some pretty good information.

00:08:02.880 --> 00:08:04.640
So here's the situation we've got.

00:08:04.640 --> 00:08:06.760
We've been talking about data science.

00:08:06.760 --> 00:08:08.980
Everybody's been talking about, say, data science.

00:08:09.600 --> 00:08:11.500
There's just a lot of buzz around it.

00:08:11.500 --> 00:08:16.920
So there's a lot of people with just a little bit of training in it going through book camps

00:08:16.920 --> 00:08:20.020
or MOOCs or, is that how you pronounce MOOCs?

00:08:20.020 --> 00:08:20.480
MOOCs?

00:08:20.480 --> 00:08:21.540
I think so, yeah.

00:08:21.540 --> 00:08:21.840
Okay.

00:08:21.840 --> 00:08:25.480
M-O-O-C, the Massive Online Courses, yeah.

00:08:25.480 --> 00:08:25.840
Yeah.

00:08:25.840 --> 00:08:26.280
Okay.

00:08:26.280 --> 00:08:30.400
Or they're self-taught or they get a remote degree or some other training and they want to

00:08:30.400 --> 00:08:31.540
get a data science job.

00:08:31.540 --> 00:08:38.100
So there's a whole bunch of people trying to get into data science and this partly can become

00:08:38.100 --> 00:08:38.740
a problem.

00:08:39.120 --> 00:08:44.940
So the market, she notes that the market can be very, very discouraging for this flood

00:08:44.940 --> 00:08:50.040
of beginners because since there's a lot of beginners, there's a lot of people.

00:08:50.040 --> 00:08:52.560
The jobs are also becoming more advanced.

00:08:52.560 --> 00:08:54.880
They have more specific requirements.

00:08:54.880 --> 00:09:00.660
And also just the job description is sort of vague.

00:09:00.760 --> 00:09:02.840
So what is it you're actually going to be doing?

00:09:02.840 --> 00:09:07.800
And when people are actually doing it in the workplace, it seems a lot more like engineering

00:09:07.800 --> 00:09:10.720
than this shiny new thing that we've been talking about.

00:09:11.960 --> 00:09:12.260
That's right.

00:09:12.260 --> 00:09:18.180
It's just a kind of a good view of reality check for data science, people interested in getting

00:09:18.180 --> 00:09:19.180
into it.

00:09:19.180 --> 00:09:23.640
But there's a, she also ends with some advice, not just a complaining about it.

00:09:23.720 --> 00:09:27.500
But her advice is for people that wanted to get into it.

00:09:27.500 --> 00:09:32.640
Her first bullet point is don't get into data science, which I just laughed.

00:09:32.640 --> 00:09:33.720
I actually laughed out loud.

00:09:33.720 --> 00:09:35.220
I'm like, that's awesome advice.

00:09:35.360 --> 00:09:40.440
But no, basically, she said, just don't, don't follow the crowd because following what everybody

00:09:40.440 --> 00:09:42.840
else is doing is not going to differentiate you.

00:09:42.840 --> 00:09:48.960
And she recommends a backdoor approach is of like starting as a junior developer or in DevOps

00:09:48.960 --> 00:09:54.520
or project management or something like that and learn a lot of data science stuff on the

00:09:54.520 --> 00:10:00.280
job and then build that up into a position that you can work at the company as a data scientist.

00:10:00.800 --> 00:10:05.660
You know, that sounds like a pretty good bit of advice because I feel like data scientists

00:10:05.660 --> 00:10:09.280
are a little more on their own than software developers.

00:10:09.280 --> 00:10:09.680
Yeah.

00:10:09.680 --> 00:10:16.160
Like at a company, there'll be five or 10 software developers working on one web app or one other

00:10:16.160 --> 00:10:17.400
automation project.

00:10:17.400 --> 00:10:21.440
But how often do you have five to 10 data scientists all working on the same problem?

00:10:21.440 --> 00:10:21.880
Right.

00:10:21.880 --> 00:10:26.420
I feel like they're all kind of doing their own thing a lot of times, which as a beginner

00:10:26.420 --> 00:10:27.780
can make it more difficult.

00:10:27.780 --> 00:10:28.080
Right.

00:10:28.080 --> 00:10:32.140
So maybe get some of these engineering skills through the approach that you're just talking

00:10:32.140 --> 00:10:35.660
about and then branch out into that more solo side of things.

00:10:35.660 --> 00:10:35.980
Yeah.

00:10:35.980 --> 00:10:41.320
And then she also has like some skill, a whole list of specific skills for like, let's say

00:10:41.320 --> 00:10:45.540
you did get a junior developer job or you got some other job, which skills should you beef

00:10:45.540 --> 00:10:45.960
up on?

00:10:45.960 --> 00:10:49.680
So she's got a bunch of listed, a bunch of skills to try to beef up on that.

00:10:49.680 --> 00:10:50.320
So yeah.

00:10:50.320 --> 00:10:50.740
What are they?

00:10:50.740 --> 00:10:54.820
Creating Python packages, putting R into production, which I don't like that one.

00:10:54.820 --> 00:10:55.780
You should use Python.

00:10:55.780 --> 00:10:57.800
But anyway, what do I know?

00:10:57.800 --> 00:10:58.880
We'll talk more about that later.

00:10:58.880 --> 00:11:01.680
Optimizing Spark jobs so they run more efficiently.

00:11:01.680 --> 00:11:03.060
I don't even know what that means.

00:11:03.060 --> 00:11:04.420
Version controlling data.

00:11:04.420 --> 00:11:05.800
Ooh, that sounds neat.

00:11:05.800 --> 00:11:08.200
Making models and data reproducible.

00:11:08.200 --> 00:11:10.160
Version controlling SQL.

00:11:10.160 --> 00:11:11.560
Building and maintaining.

00:11:11.560 --> 00:11:12.080
That sounds hard.

00:11:12.080 --> 00:11:14.280
Clean data in data lakes.

00:11:14.280 --> 00:11:16.260
I love data lakes and data swamps.

00:11:16.260 --> 00:11:17.540
It's just funny.

00:11:17.540 --> 00:11:20.260
Tooling for time series.

00:11:20.260 --> 00:11:21.680
Forecasting at scale.

00:11:21.680 --> 00:11:22.920
Scaling, sharing.

00:11:22.920 --> 00:11:24.560
Sharing of Jupyter Notebooks.

00:11:24.780 --> 00:11:26.580
Thinking about systems for clean data.

00:11:26.580 --> 00:11:27.780
And lots of JSON.

00:11:27.780 --> 00:11:28.600
Yeah, that's cool.

00:11:28.600 --> 00:11:29.500
All right.

00:11:29.500 --> 00:11:30.260
That sounds good.

00:11:30.260 --> 00:11:31.200
Like a good advice.

00:11:31.200 --> 00:11:31.580
Yeah.

00:11:31.580 --> 00:11:32.380
That's a good pick.

00:11:32.380 --> 00:11:38.940
Speaking of good stuff and sponsored episodes, this one is brought to you by DigitalOcean.

00:11:38.940 --> 00:11:42.800
And they, you know, it's February 19th as we're recording this, Brian.

00:11:42.960 --> 00:11:45.960
And not long ago, five days ago, was Valentine's Day, right?

00:11:45.960 --> 00:11:46.280
Yeah.

00:11:46.280 --> 00:11:46.520
Yeah.

00:11:46.520 --> 00:11:50.320
So DigitalOcean, they actually had a Valentine's Day present for the world.

00:11:50.320 --> 00:11:52.880
And their present was database as a service.

00:11:52.880 --> 00:11:59.460
So until now, you would go over to DigitalOcean, you create a server, and then you would have to put your own database on there.

00:11:59.460 --> 00:12:03.260
Or use some other external service, like Object Rocket or something like that.

00:12:03.800 --> 00:12:10.260
So now you can get managed Postgres databases on DigitalOcean, which is pretty sweet if you're going to work with Postgres.

00:12:10.260 --> 00:12:15.340
So you just check the box, and they handle all the operational bits for you.

00:12:15.340 --> 00:12:15.940
It's pretty cool, right?

00:12:15.940 --> 00:12:16.840
Yeah, that is cool.

00:12:16.840 --> 00:12:17.760
Yeah.

00:12:17.760 --> 00:12:18.280
Yeah, definitely.

00:12:18.280 --> 00:12:22.740
So check them out at pythonbytes.fm/DigitalOcean.

00:12:22.740 --> 00:12:26.580
New users get $100 credit to play around with Postgres or whatever else you want to play with.

00:12:26.580 --> 00:12:29.060
And, yeah, they're a very good service.

00:12:29.060 --> 00:12:30.900
Definitely can recommend them.

00:12:30.900 --> 00:12:33.280
So this next one is pretty interesting.

00:12:33.580 --> 00:12:39.320
It's not super actionable yet, Brian, but it starts to approach something that I'm really passionate about.

00:12:39.320 --> 00:12:42.060
So the thing I want to tell you about is Rust Python.

00:12:42.060 --> 00:12:47.700
So we have the language Rust, we have the language Python, and somehow they come together.

00:12:47.700 --> 00:12:51.640
So the Rust doesn't replace the Python, it replaces the C in CPython.

00:12:51.640 --> 00:12:57.860
The idea is, like, here's a new interpreter, a new runtime built on Rust instead of on C.

00:12:57.860 --> 00:12:58.200
Wow.

00:12:58.200 --> 00:12:58.440
Yeah.

00:12:58.440 --> 00:13:03.160
So that feels like a more modern type of language to use than just C, right?

00:13:03.240 --> 00:13:04.320
To build a foundation.

00:13:04.320 --> 00:13:07.280
And that might be a little bit nicer if they could get that working really well.

00:13:07.280 --> 00:13:07.540
Yeah.

00:13:07.540 --> 00:13:07.800
Yeah.

00:13:07.800 --> 00:13:08.980
And it's Python 3 only.

00:13:08.980 --> 00:13:10.480
So 3, 5, and above.

00:13:10.480 --> 00:13:13.420
And basically, the interpreter is written in Rust.

00:13:13.420 --> 00:13:16.200
And this comes to us from Frederick Averpil.

00:13:16.200 --> 00:13:17.880
So thanks, Frederick, for sending that over.

00:13:17.880 --> 00:13:19.560
But, yeah, this looks pretty interesting.

00:13:19.560 --> 00:13:21.580
And I would say it's definitely under active development.

00:13:21.700 --> 00:13:23.900
When I was getting ready for this recording, I looked at the site.

00:13:23.900 --> 00:13:27.340
And the GitHub said, last commit an hour ago.

00:13:27.340 --> 00:13:29.360
So it feels like people are working on it.

00:13:29.360 --> 00:13:31.160
You always, you know, wonder, is this thing real?

00:13:31.160 --> 00:13:32.180
Are people doing anything?

00:13:32.180 --> 00:13:36.900
Now, I say that because they're not really ready to, like, do much.

00:13:36.940 --> 00:13:39.700
Like, you can create a REPL and you can run some basic Python and stuff.

00:13:39.700 --> 00:13:45.040
But, like, there's not a great standard library written with Rust foundations and things like that.

00:13:45.040 --> 00:13:46.460
So there's a lot of work to be done.

00:13:46.460 --> 00:13:53.680
But the goals are to have a full Python 3 environment entirely in Rust with no CPython bindings or no C bindings, really.

00:13:53.680 --> 00:13:57.080
And a clean implementation without compatibility hacks.

00:13:57.080 --> 00:13:57.460
Okay.

00:13:57.460 --> 00:14:03.720
Yeah, so if you want to practice some Rust and play around, there's a lot of things that you could do here that might be fun.

00:14:03.720 --> 00:14:08.640
I think people who played with this would probably understand regular CPython better as well, right?

00:14:08.640 --> 00:14:12.060
Obviously, if you reimplement it in another language, that would be good.

00:14:12.060 --> 00:14:17.360
But they have a bunch of tasks on the issue trackers and they're labeled very nicely, like, good first issue and stuff.

00:14:17.360 --> 00:14:18.720
So if people want to get started, they can do that.

00:14:18.720 --> 00:14:25.020
Yeah, also kind of be a fun getting in in the early stages sort of a thing to jump in and help out.

00:14:25.020 --> 00:14:25.440
Exactly.

00:14:25.620 --> 00:14:28.880
Like in five years, if people keep working on this, this will be really hard to contribute to.

00:14:28.880 --> 00:14:30.040
But right now, it'd be really easy.

00:14:30.040 --> 00:14:30.440
Yeah.

00:14:30.440 --> 00:14:31.740
Relatively speaking.

00:14:31.740 --> 00:14:34.480
So why do I think this is super cool?

00:14:34.480 --> 00:14:41.100
Well, Rust comes from Mozilla and Rust has good support for compiling to WebAssembly, right?

00:14:41.100 --> 00:14:41.680
Oh, okay.

00:14:41.680 --> 00:14:48.260
And WebAssembly is the much better, faster, stronger way of running something in the browser.

00:14:48.920 --> 00:15:03.320
So if this thing got off the ground and it actually worked in a meaningful way and it could be compiled to WebAssembly, well, then, all of a sudden, we have a super awesome Python implementation in the browser on the client side.

00:15:03.320 --> 00:15:03.700
Yeah.

00:15:03.700 --> 00:15:08.320
So we could have Python really full stack on both ends, the server and the client.

00:15:08.320 --> 00:15:08.540
Yeah.

00:15:08.540 --> 00:15:09.460
Yeah.

00:15:09.460 --> 00:15:10.580
So it would be super cool.

00:15:10.580 --> 00:15:13.480
And this is one possible path down that.

00:15:13.480 --> 00:15:13.920
I don't know.

00:15:13.920 --> 00:15:15.100
I don't know that that's the goal.

00:15:15.100 --> 00:15:20.820
But they do talk about WebAssembly being an option in sort of a toy sense because it's not really quite ready yet.

00:15:20.820 --> 00:15:21.880
But there's some stuff there.

00:15:21.880 --> 00:15:24.480
So anyway, that was what really got my interest.

00:15:24.480 --> 00:15:26.580
I'm like, okay, another implementation address.

00:15:26.580 --> 00:15:27.300
It's kind of interesting.

00:15:27.300 --> 00:15:28.940
Like, oh, wait, WebAssembly support?

00:15:28.940 --> 00:15:31.340
That would be a big deal if that came on.

00:15:31.700 --> 00:15:36.840
Maybe in a few years we'll see something like a book called Python Script, just the good parts.

00:15:36.840 --> 00:15:37.960
Exactly.

00:15:37.960 --> 00:15:39.880
Very cool.

00:15:39.880 --> 00:15:40.160
All right.

00:15:40.160 --> 00:15:40.820
Well, what's the next one?

00:15:40.820 --> 00:15:43.480
The next one is this is an article.

00:15:43.480 --> 00:15:48.440
Actually, it's kind of a team up between Mike Driscoll and RealPython.

00:15:48.440 --> 00:15:54.240
So Mike Driscoll wrote an article on RealPython called Jupyter Notebook, an Introduction.

00:15:54.240 --> 00:16:01.040
And, of course, we've talked about Jupyter Notebooks before and a lot of stuff around data and around that.

00:16:01.520 --> 00:16:05.320
However, this is actually a tutorial that I think was kind of missing.

00:16:05.320 --> 00:16:11.080
And it's not all the cool things you can do with it, but it's, I know I want to use it.

00:16:11.080 --> 00:16:12.700
No, really, how do I start?

00:16:12.700 --> 00:16:20.720
And it really starts from installing it, of course, up to and then just kind of walks through some of the real basics,

00:16:20.720 --> 00:16:26.860
like creating a new, once you get it up and loaded, you've got a blank notebook or a blank interface,

00:16:26.860 --> 00:16:28.820
and you can create a new notebook in there.

00:16:29.280 --> 00:16:38.820
And then even something simple, like I didn't know that it was so easy to change the name just by clicking on the name of the untitled notebook that you get right away.

00:16:38.820 --> 00:16:41.740
And you can click and rename it something else.

00:16:41.740 --> 00:16:43.500
It talks about how to run cells.

00:16:43.500 --> 00:16:48.500
I think I played with Notebooks for quite a while before I learned the shortcut of Shift-Enter.

00:16:48.500 --> 00:16:48.760
Yep.

00:16:48.760 --> 00:16:55.820
And then it goes through just some of the menu options and some of the neat features that you might not be obvious if you didn't think of exploring them before.

00:16:55.820 --> 00:16:59.300
Like File has a save and checkpoint.

00:16:59.300 --> 00:17:04.660
As you're working on a notebook, you can, it's kind of like a version control thing built into it.

00:17:04.700 --> 00:17:07.640
You can just save it, save at different checkpoints and move on.

00:17:07.640 --> 00:17:08.080
That's cool.

00:17:08.080 --> 00:17:17.480
The edit menu has, I wouldn't have thought to look there for things like splitting and merging cells or moving cells around, but it's in there.

00:17:17.480 --> 00:17:20.980
And then the cell menu has a whole bunch of cool ways to run.

00:17:21.220 --> 00:17:29.320
I knew you could run a cell or run everything, but there's also things like run a subset or run everything above this cell or below this cell or something.

00:17:29.320 --> 00:17:29.880
Yeah.

00:17:29.880 --> 00:17:30.560
Excellent.

00:17:30.560 --> 00:17:38.220
At first, when I was reading this, there's a couple of questions that I have right away when I start with the notebooks that I, that wasn't covered.

00:17:38.220 --> 00:17:48.500
So I'm going to go ahead and push promote these practices right away is when you're installing Jupyter, if you're installing it with pip, do it in a virtual environment.

00:17:48.500 --> 00:17:55.840
And then all the installs within your notebooks will go in that environment and you can keep those separate from the rest of your work of everything else.

00:17:55.840 --> 00:18:03.440
Once you have a notebook up, you can pip install within there now with the percent pip install that works now.

00:18:03.440 --> 00:18:07.220
Thanks to, I think at least Jake VanderPlas publicized it.

00:18:07.220 --> 00:18:11.240
I'm not sure if he did the work or not, but so that's kind of really what I wanted to talk to about.

00:18:11.240 --> 00:18:14.320
This is a really good, I think a good article to send to people.

00:18:14.320 --> 00:18:21.280
If you're working with notebooks and you want to share something with somebody else and they've never experienced them before, just send them to this also.

00:18:21.280 --> 00:18:21.500
Yeah.

00:18:21.500 --> 00:18:23.820
It's a good resource and, you know, very comprehensive.

00:18:23.820 --> 00:18:26.980
So definitely a good one that Mike Driscoll put up there.

00:18:26.980 --> 00:18:34.140
Now I want to round out the show talking about the Python developer survey results from 2018.

00:18:34.140 --> 00:18:35.420
This is the end of 2018.

00:18:35.560 --> 00:18:38.800
So this is pretty fresh from the PSF and JetBrains.

00:18:38.800 --> 00:18:43.840
We talked about their stuff a year ago when they did it for 2017 and in 2017.

00:18:43.840 --> 00:18:46.480
So this is the next year.

00:18:46.480 --> 00:18:47.000
All right.

00:18:47.000 --> 00:18:47.760
Have you seen this yet, Brian?

00:18:47.760 --> 00:18:49.640
I've only briefly looked through it.

00:18:49.640 --> 00:18:49.880
Yeah.

00:18:49.940 --> 00:18:52.400
So there's a couple of interesting things that I pulled out.

00:18:52.400 --> 00:18:58.740
And one of them is that Python usage as a main language.

00:18:58.740 --> 00:19:02.580
So one of the questions I say is, so you're here because you use Python.

00:19:02.580 --> 00:19:04.780
Is that because you use it as a secondary thing?

00:19:04.780 --> 00:19:08.980
Like maybe you're a C++ developer, but you use it for DevOps or something like that.

00:19:08.980 --> 00:19:10.940
Or do you use it as your main language?

00:19:10.940 --> 00:19:15.520
The answer of Python is my main language is up 5% from last year.

00:19:15.520 --> 00:19:16.100
That's awesome.

00:19:16.100 --> 00:19:16.360
Yeah.

00:19:16.360 --> 00:19:21.380
So now it's 84% of the people and it was 79 last year.

00:19:21.380 --> 00:19:27.640
So when the PSF conducted the survey, the other big thing to talk about maybe is what do you use Python for?

00:19:27.640 --> 00:19:34.240
And the number one thing is data analysis and then web development and then machine learning.

00:19:34.240 --> 00:19:34.640
Okay.

00:19:34.640 --> 00:19:37.660
That sounds like a lot of data science and probably a lot of Jupyter stuff happening.

00:19:37.660 --> 00:19:38.260
Yeah.

00:19:38.260 --> 00:19:39.440
Between those top three, right?

00:19:39.440 --> 00:19:44.680
And also, so one of the things that's cool about this survey is now they've been doing it a few years is they have a comparison,

00:19:44.680 --> 00:19:46.880
like a sort of a trend predictor.

00:19:46.880 --> 00:19:49.640
Is the derivative positive or negative on this trend here?

00:19:49.640 --> 00:19:53.760
And so I put those numbers down for 2018 and 2017.

00:19:53.760 --> 00:19:59.400
So for data analysis, it's 59% of the people now use that for data analysis, use Python for data analysis.

00:19:59.400 --> 00:20:01.240
That's up 8%.

00:20:01.240 --> 00:20:01.660
Oh, wow.

00:20:01.660 --> 00:20:03.360
And, you know, it's above web development.

00:20:03.360 --> 00:20:07.680
So you might think it's a zero-sum game, like more people are not doing web and now they're doing data science.

00:20:07.960 --> 00:20:10.480
But no, like web development's up 2%.

00:20:10.480 --> 00:20:12.300
Machine learning is up 7%.

00:20:12.300 --> 00:20:13.860
Your R comment and all that, right?

00:20:13.860 --> 00:20:15.520
So pretty interesting.

00:20:15.520 --> 00:20:20.340
And the other thing they let you do is they let you ask for people who answer this question,

00:20:20.340 --> 00:20:25.920
let's partition their answers by whether Python is their main language or it's just kind of a secondary thing they do.

00:20:26.380 --> 00:20:36.680
So the main takeaway of this section is that web development is the only category with a large gap separating main users of Python versus secondary ones,

00:20:36.680 --> 00:20:42.080
like 56% versus 36%, 20% difference depending on how you use Python.

00:20:42.080 --> 00:20:43.840
All the other ones are pretty similar.

00:20:43.840 --> 00:20:44.160
Okay.

00:20:44.160 --> 00:20:44.920
Cross this too.

00:20:45.040 --> 00:20:46.920
Yeah, I want to point out a couple other things.

00:20:46.920 --> 00:20:47.220
Okay.

00:20:47.220 --> 00:20:54.400
From the survey, 93% say that they're involved with software testing or writing automated tests.

00:20:54.400 --> 00:20:56.400
That's pretty cool, right?

00:20:56.400 --> 00:20:56.960
That's awesome.

00:20:56.960 --> 00:20:59.640
Or at least maybe that's professional versus hobby.

00:20:59.640 --> 00:21:00.780
I don't know.

00:21:00.780 --> 00:21:01.940
Yeah, anyway.

00:21:01.940 --> 00:21:02.860
Yeah, but it's quite high.

00:21:02.860 --> 00:21:05.760
And they said they ask you which test frameworks you're using.

00:21:05.760 --> 00:21:08.340
For test framework, pytest is number one.

00:21:08.340 --> 00:21:09.300
Of course.

00:21:09.300 --> 00:21:10.520
Of course.

00:21:10.520 --> 00:21:11.160
That's pretty cool.

00:21:11.520 --> 00:21:21.300
Another one that's interesting is kind of like last year they said sort of scientific computing, data-oriented, like data analysis, machine learning, whatnot.

00:21:21.300 --> 00:21:23.800
How does that compare to web development?

00:21:23.800 --> 00:21:29.560
And it's now 27% web development, 28% scientific development, they call it.

00:21:29.560 --> 00:21:31.120
It's like data science plus machine learning.

00:21:31.120 --> 00:21:34.940
Also, Python versus legacy Python, super good news here.

00:21:34.940 --> 00:21:41.240
Of the surveyed folks, 84% are using Python 3 versus 16% for legacy Python.

00:21:41.440 --> 00:21:42.600
Yeah, that's awesome.

00:21:42.600 --> 00:21:43.660
So that's really good.

00:21:43.660 --> 00:21:45.260
And it also is growing very rapidly.

00:21:45.260 --> 00:21:48.580
So like 9% more people are using modern Python, which is great.

00:21:48.580 --> 00:21:52.980
Web frameworks, Flask is now the most popular web framework on the survey.

00:21:52.980 --> 00:21:54.200
Django was last year.

00:21:54.200 --> 00:21:54.920
Yeah, that's interesting.

00:21:54.920 --> 00:21:56.880
Yeah, but they're still really close.

00:21:56.880 --> 00:21:58.280
They're neck and neck for sure.

00:21:58.280 --> 00:22:02.780
Then it goes Tornado and then Pyramid and then Databases, Postgres, MySQL, SQLite.

00:22:02.780 --> 00:22:04.260
Those are the top three relational.

00:22:04.480 --> 00:22:08.180
And then MongoDB is tailing along in the NoSQL bit.

00:22:08.180 --> 00:22:12.000
And then ORMs, SQLAlchemy, and Django ORM are tied for that.

00:22:12.000 --> 00:22:14.700
Anyway, a bunch of like, that's just skimming the service.

00:22:14.700 --> 00:22:17.940
There's a ton of cool little interactive bits you can go explore the survey with.

00:22:17.940 --> 00:22:18.200
Yeah.

00:22:18.200 --> 00:22:18.800
Wow.

00:22:18.800 --> 00:22:19.420
Neat.

00:22:19.420 --> 00:22:19.640
Yeah.

00:22:19.640 --> 00:22:20.360
So good stuff.

00:22:20.360 --> 00:22:22.780
And yeah, people should go check it out.

00:22:22.780 --> 00:22:24.040
Of course, the links in the show notes.

00:22:24.040 --> 00:22:26.260
All right, Brian, you got anything else you want to share?

00:22:26.260 --> 00:22:28.020
That's not one of our main topics.

00:22:28.020 --> 00:22:33.140
Yeah, Nina mentioned to us, you can pronounce her name, but I have trouble with this.

00:22:33.140 --> 00:22:33.700
Zacharena?

00:22:33.700 --> 00:22:34.100
Yeah.

00:22:34.100 --> 00:22:34.880
Zacharenko?

00:22:34.880 --> 00:22:38.820
She hit us up and said, if we could plug this, it'd be great.

00:22:38.820 --> 00:22:42.880
Mentored sprints for diverse beginners are something that's at PyCon.

00:22:42.880 --> 00:22:47.360
I don't know if they've always been a thing, but that's something that's available this year.

00:22:47.360 --> 00:22:51.220
It's a newcomer's introduction to contributing to an open source project.

00:22:51.220 --> 00:22:52.940
And we have a link in the show notes.

00:22:52.940 --> 00:22:53.600
Yeah, cool.

00:22:53.600 --> 00:22:58.420
You do have to both, there's a call for applications, both for projects and for participants.

00:22:58.420 --> 00:23:00.600
That's open until March 14th.

00:23:00.600 --> 00:23:05.380
And a highlight, if you're wondering if this event is for you, it definitely is.

00:23:05.380 --> 00:23:07.520
And we'd love to have you take part of it.

00:23:07.520 --> 00:23:08.520
So that's a neat thing.

00:23:08.520 --> 00:23:14.640
Yeah, and they'll take place on Saturday, May 4th from 2.30 to 6.30 at the main PyCon.

00:23:14.640 --> 00:23:15.480
So that's cool.

00:23:15.480 --> 00:23:15.940
Yeah, neat.

00:23:15.940 --> 00:23:16.700
Yeah, that's a great thing.

00:23:16.700 --> 00:23:18.140
I'm glad we get a chance to highlight it.

00:23:18.140 --> 00:23:18.520
All right.

00:23:18.520 --> 00:23:18.800
All right.

00:23:18.800 --> 00:23:20.180
Do you got a joke for us?

00:23:20.180 --> 00:23:21.060
I don't have a joke.

00:23:21.060 --> 00:23:21.840
All right, I grabbed one.

00:23:22.180 --> 00:23:26.020
This one plays a little better in cartoon form, but I'm going to try it in audio.

00:23:26.020 --> 00:23:26.500
Okay.

00:23:26.500 --> 00:23:26.760
Okay.

00:23:26.760 --> 00:23:33.600
So if you have some pseudocode in like a sample.txt file or something like that, what's the easiest

00:23:33.600 --> 00:23:35.040
way to convert that to Python?

00:23:35.040 --> 00:23:35.640
I don't know.

00:23:35.640 --> 00:23:35.940
How?

00:23:35.940 --> 00:23:37.960
You change the extension to .py.

00:23:37.960 --> 00:23:43.920
For some reason, the pseudocode is very similarly written to Python.

00:23:43.920 --> 00:23:46.220
And of course, it speaks to Python's readability, right?

00:23:46.220 --> 00:23:49.640
So maybe you got to throw a colon in there somewhere, but yeah, pretty much.

00:23:50.140 --> 00:23:51.100
And I have an extra.

00:23:51.100 --> 00:23:52.620
I actually have two extras for you.

00:23:52.620 --> 00:23:52.900
Okay.

00:23:52.900 --> 00:23:54.860
The first one is this Python song.

00:23:54.860 --> 00:24:01.500
And it takes a bunch of like modern songs and it converts them into like learning chapters.

00:24:01.500 --> 00:24:05.040
So you learn things like you learn about Python basics, like looping and variables.

00:24:05.040 --> 00:24:06.540
You learn about classes.

00:24:06.540 --> 00:24:07.860
You learn about web design.

00:24:08.080 --> 00:24:10.520
So there's like a little different song for each one.

00:24:10.520 --> 00:24:15.000
It's these folks somewhere like Sweden or Norway or somewhere like that.

00:24:15.000 --> 00:24:15.500
I can't remember.

00:24:15.500 --> 00:24:16.080
Maybe Denmark.

00:24:16.080 --> 00:24:23.700
And they put together this really funny like six and a half minute set of little songs all

00:24:23.700 --> 00:24:24.740
put together into chapters.

00:24:24.740 --> 00:24:25.940
And it's all about Python.

00:24:25.940 --> 00:24:28.220
I'm totally going to subject my daughter to this.

00:24:28.220 --> 00:24:28.520
Yeah.

00:24:28.520 --> 00:24:28.840
Yeah.

00:24:28.840 --> 00:24:29.700
It's pretty funny.

00:24:29.700 --> 00:24:31.640
And then I'll throw one more in there really quick for you.

00:24:31.640 --> 00:24:33.080
I did my speaking of daughters.

00:24:33.160 --> 00:24:35.840
My daughter literally sent this in like about an hour ago.

00:24:35.840 --> 00:24:39.940
And speaking of all the data analysis and data science folks, I think this one might

00:24:39.940 --> 00:24:40.300
resonate.

00:24:40.300 --> 00:24:41.260
I'll let you.

00:24:41.260 --> 00:24:42.400
I'll let you be the judge.

00:24:42.400 --> 00:24:45.860
So an infinite number of mathematicians walk into a bar.

00:24:45.860 --> 00:24:48.460
The first one tells the bartender he wants a beer.

00:24:48.460 --> 00:24:50.680
The second one tells the bartender he wants half a beer.

00:24:50.680 --> 00:24:53.240
The third one says she wants a fourth of a beer.

00:24:53.240 --> 00:24:57.480
The bartender interrupts and puts two beers on the table and says, people, you really need

00:24:57.480 --> 00:24:58.140
to learn your limits.

00:24:58.140 --> 00:25:01.940
Okay.

00:25:01.940 --> 00:25:02.620
That's funny.

00:25:02.620 --> 00:25:04.060
It's pretty good, right?

00:25:04.060 --> 00:25:04.940
Yeah, definitely.

00:25:04.940 --> 00:25:05.500
Pretty good.

00:25:05.500 --> 00:25:06.660
All right.

00:25:06.660 --> 00:25:07.200
Super.

00:25:07.200 --> 00:25:07.720
Okay.

00:25:07.720 --> 00:25:10.580
Well, Brian, these joke segments always make me smile.

00:25:10.580 --> 00:25:11.640
Yeah, definitely.

00:25:11.640 --> 00:25:12.720
Yeah.

00:25:12.720 --> 00:25:14.680
Thanks for doing the episode as always.

00:25:14.680 --> 00:25:15.120
All right.

00:25:15.120 --> 00:25:15.620
Thank you.

00:25:15.620 --> 00:25:15.860
Yep.

00:25:15.860 --> 00:25:18.240
And I guess we will see everyone at Pi Cascades, right?

00:25:18.240 --> 00:25:18.620
Oh, yeah.

00:25:18.620 --> 00:25:19.940
That will be the next thing.

00:25:19.940 --> 00:25:20.500
That's this week.

00:25:20.500 --> 00:25:20.860
Yeah.

00:25:20.860 --> 00:25:23.140
We head out in like three days or something like that for the conference.

00:25:23.140 --> 00:25:25.920
So if you're going to be there, hopefully we'll get a chance to meet you.

00:25:25.980 --> 00:25:27.900
Otherwise, see you some other place.

00:25:27.900 --> 00:25:28.320
All right.

00:25:28.320 --> 00:25:28.920
Bye.

00:25:28.920 --> 00:25:29.140
Bye.

00:25:29.140 --> 00:25:30.960
Thank you for listening to Python Bytes.

00:25:30.960 --> 00:25:33.480
Follow the show on Twitter via at Python Bytes.

00:25:33.480 --> 00:25:36.380
That's Python Bytes as in B-Y-T-E-S.

00:25:36.380 --> 00:25:39.780
And get the full show notes at pythonbytes.fm.

00:25:39.780 --> 00:25:44.120
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:25:44.120 --> 00:25:46.840
We're always on the lookout for sharing something cool.

00:25:46.840 --> 00:25:50.220
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:25:50.220 --> 00:25:53.740
Thank you for listening and sharing this podcast with your friends and colleagues.