WEBVTT

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

00:00:04.860 --> 00:00:09.420
It's episode 68, recorded February 28th, 2018.

00:00:09.420 --> 00:00:10.580
I'm Michael Kennedy.

00:00:10.580 --> 00:00:11.440
And I'm Brian Okken.

00:00:11.440 --> 00:00:15.540
And we have yet another bundle of amazing stuff to share with you.

00:00:15.540 --> 00:00:18.100
I'm super excited about the ones I got. How about you, Brian?

00:00:18.100 --> 00:00:21.880
I'm really excited. I had to kick some out because I had too many things to cover.

00:00:21.880 --> 00:00:25.020
I think I changed my list four times this week because I'm like, oh, this is a great list.

00:00:25.020 --> 00:00:27.640
Oh, no, this one's more important. This is even better. It's awesome.

00:00:27.640 --> 00:00:28.000
Yeah.

00:00:28.140 --> 00:00:32.140
Yeah. So before we get to it, I just want to say thanks to DigitalOcean for sponsoring this episode.

00:00:32.140 --> 00:00:34.760
Check them out at do.co slash Python.

00:00:34.760 --> 00:00:39.720
Right now, I want to hear about PyPI, but there's something wrong with it.

00:00:39.720 --> 00:00:40.660
What's up here?

00:00:40.660 --> 00:00:44.680
Well, so I've had this on the list for a long time.

00:00:44.680 --> 00:00:47.480
A project called the Dumb P-O-I-P-I.

00:00:47.480 --> 00:00:50.080
So Dumb PyPI or PyPI. I don't know.

00:00:50.080 --> 00:00:52.360
Anyway, it's not really that dumb, though.

00:00:52.360 --> 00:00:55.440
So there's a lot of local.

00:00:55.440 --> 00:00:57.360
So you can have your own repository.

00:00:57.620 --> 00:01:02.920
So there's a bunch of different ways you can set up your own server so that you can serve your own packages.

00:01:02.920 --> 00:01:12.040
Like if you've got a team or something that you've got proprietary code that you don't want to share with others on normal PyPI, you can have your own.

00:01:12.040 --> 00:01:14.460
But you have to have a server running.

00:01:14.460 --> 00:01:19.240
And there's a lot of the generation of the server code is tied to it.

00:01:19.280 --> 00:01:22.240
So there's like a flask version and there's various versions.

00:01:22.240 --> 00:01:25.440
This one is just a flat file creator.

00:01:25.440 --> 00:01:42.880
So this package, Dumb PyPI, will just take a directory full of wheels or zipped packages and create a directory that you can just stick on any server and have it be served up for an index.

00:01:43.580 --> 00:01:44.880
And for instance, I've got a...

00:01:44.880 --> 00:01:47.180
So it doesn't do any caching.

00:01:47.180 --> 00:01:50.820
It doesn't go through to PyPI and grab things that it's missing.

00:01:50.820 --> 00:01:52.940
So you have to manually do that yourself.

00:01:52.940 --> 00:02:01.920
But if we combine this with what we learned in episode 24 that you can just do pip download easily and download your own files somewhere.

00:02:01.920 --> 00:02:11.840
This combined, I'm using this at work now to create a really simple PyPI server behind our firewall that doesn't have...

00:02:11.840 --> 00:02:14.220
I don't have to give it permission to talk to the outside world.

00:02:14.220 --> 00:02:15.420
It's just a bunch of files.

00:02:15.420 --> 00:02:15.940
So...

00:02:15.940 --> 00:02:16.900
It's actually really cool.

00:02:17.040 --> 00:02:22.040
So you could even put it up on like Amazon S3 or somewhere like that, right?

00:02:22.040 --> 00:02:22.380
Right.

00:02:22.380 --> 00:02:26.080
And actually, there is an example on...

00:02:26.080 --> 00:02:31.380
I think that is the example on the website or the package website.

00:02:31.380 --> 00:02:33.920
GitHub site does have an S3 example.

00:02:33.920 --> 00:02:39.160
It's like super fast and slick and it doesn't do anything like updates or anything.

00:02:39.160 --> 00:02:40.960
You have to rebuild everything yourself.

00:02:41.280 --> 00:02:42.480
But if you're going to...

00:02:42.480 --> 00:02:45.020
You can set up a cron job or something to do some of this.

00:02:45.020 --> 00:02:45.460
Exactly.

00:02:45.460 --> 00:02:47.460
Just do it at night when nobody's around.

00:02:47.460 --> 00:02:49.140
Yeah.

00:02:49.140 --> 00:02:50.700
Just update it daily.

00:02:50.700 --> 00:02:52.340
How often do these packages change, right?

00:02:52.340 --> 00:02:57.700
But like, for instance, I've got like all of our test code that we're creating virtual environments to...

00:02:57.700 --> 00:03:00.340
And then pulling in test packages and different packages.

00:03:00.340 --> 00:03:01.720
That stuff just...

00:03:01.720 --> 00:03:03.560
I don't want it to update all the time.

00:03:03.560 --> 00:03:04.320
I want it to...

00:03:04.320 --> 00:03:07.520
I want it to grab certain versions that I know are there.

00:03:07.520 --> 00:03:09.440
So something like this is perfect.

00:03:09.440 --> 00:03:09.760
Yeah.

00:03:09.760 --> 00:03:10.500
It looks really cool.

00:03:10.500 --> 00:03:12.920
I think it needs a better name than dumb PyPI.

00:03:12.920 --> 00:03:13.760
Yeah.

00:03:13.760 --> 00:03:15.540
Yeah, it does.

00:03:15.540 --> 00:03:17.600
Clever, but doesn't do anything PyPI.

00:03:17.600 --> 00:03:18.260
How about that?

00:03:18.260 --> 00:03:19.720
No server.

00:03:19.720 --> 00:03:20.260
Server.

00:03:20.260 --> 00:03:22.100
Serverless PyPI.

00:03:22.100 --> 00:03:22.800
How about this?

00:03:22.800 --> 00:03:23.560
Come on.

00:03:23.560 --> 00:03:23.920
Yeah.

00:03:23.920 --> 00:03:24.720
Awesome.

00:03:24.720 --> 00:03:25.040
Okay.

00:03:25.040 --> 00:03:28.940
So the next thing I want to talk about is something for humans.

00:03:28.940 --> 00:03:31.600
And if I said it was for humans, who would that mean?

00:03:31.600 --> 00:03:32.120
Kenneth.

00:03:32.120 --> 00:03:32.600
That's right.

00:03:32.600 --> 00:03:33.120
Kenneth writes.

00:03:33.120 --> 00:03:35.280
So he's got all of his things for humans.

00:03:35.280 --> 00:03:40.480
He's got Maya, date time for humans, records, sequel for humans, obviously requests.

00:03:40.680 --> 00:03:42.340
So he's out with a new human thing.

00:03:42.340 --> 00:03:44.600
And this time for web scraping.

00:03:44.600 --> 00:03:50.680
So he created this thing called requests HTML, HTML parsing for humans.

00:03:51.020 --> 00:03:57.080
So when I looked at this, I thought, oh, is this maybe like a replacement for beautiful soup or something like that?

00:03:57.080 --> 00:03:58.780
Like in some kind of extension to requests.

00:03:58.780 --> 00:04:02.460
But in fact, it actually depends upon beautiful soup.

00:04:02.460 --> 00:04:03.280
Right.

00:04:03.340 --> 00:04:16.240
So what it is, it's a library that like puts a different API on top of combining requests plus beautiful soup, plus something called py query, which lets you run jQuery style CSS selectors.

00:04:17.040 --> 00:04:18.780
So it does a bunch of cool stuff.

00:04:18.780 --> 00:04:29.780
Some of the notable features are it has full JavaScript support, which I'm taking to mean that it will parse and execute the JavaScript necessary.

00:04:29.780 --> 00:04:37.760
So if I hit like an AngularJS page, instead of just seeing curly brackets everywhere, there's data that would have gone in there, which is a big deal in web scraping.

00:04:37.980 --> 00:04:45.320
Because if you just use straight up request plus beautiful soup, you just get the markup where those bits would execute when it does, right?

00:04:45.320 --> 00:04:45.640
Yeah.

00:04:45.640 --> 00:04:51.160
The CSS selectors, XPath selectors mocked user agents.

00:04:51.160 --> 00:04:52.680
So it pretends to be a real browser.

00:04:52.680 --> 00:04:55.600
So people don't know that you're trying to scrape their sites, which is kind of interesting.

00:04:55.600 --> 00:04:59.160
It uses connection pooling and cookie persistence.

00:04:59.160 --> 00:05:02.840
So you can like log in and then go do a bunch of stuff at a site.

00:05:02.840 --> 00:05:05.680
And you can do it without reconnecting every time.

00:05:05.680 --> 00:05:06.800
So that's pretty cool.

00:05:06.800 --> 00:05:15.040
Yeah, and it keeps the session open and tying requests with, I mean, that's what people often did anyway is a request plus beautiful soup.

00:05:15.040 --> 00:05:19.740
And tying it in with one API is great.

00:05:19.740 --> 00:05:25.580
And actually, I like the idea anyway of somebody saying, hey, these tools are great, but I wish the API was different.

00:05:25.580 --> 00:05:30.540
So just write another package that uses others and write a better API then.

00:05:30.540 --> 00:05:34.840
Yeah, it's a little like Flask, what Flask did, but for requests and parsing.

00:05:34.840 --> 00:05:38.280
Kenneth is a great one for, he's got good eye for APIs.

00:05:38.280 --> 00:05:39.220
Yeah, that's for sure.

00:05:39.220 --> 00:05:40.880
People definitely seem to love his APIs.

00:05:40.880 --> 00:05:44.840
So I'll leave you with the final sort of tagline here from their website.

00:05:44.840 --> 00:05:48.620
The request experience you know and love, but with magical parsing abilities.

00:05:48.620 --> 00:05:49.900
That's nice.

00:05:49.900 --> 00:05:51.020
Yeah, not bad, right?

00:05:51.020 --> 00:05:51.720
Cool.

00:05:51.860 --> 00:05:54.440
So what's up with this phony number thing?

00:05:54.440 --> 00:05:56.460
You got some like prank calls to make?

00:05:56.460 --> 00:05:58.420
This was awesome.

00:05:58.420 --> 00:06:02.840
So Twilio does their Twilio blog where people can write for them.

00:06:02.840 --> 00:06:05.180
And I think we've talked about it before.

00:06:05.180 --> 00:06:09.580
They do a pretty cool program where they give you an editor even to help you out with it.

00:06:10.020 --> 00:06:15.100
But this article is basically a, and you don't have to do a Twilio project, but this is a

00:06:15.100 --> 00:06:15.760
Twilio project.

00:06:15.760 --> 00:06:17.960
This is a phone number proxy.

00:06:17.960 --> 00:06:23.940
So the idea is you imagine a situation like, for instance, you've got a, I don't know, a

00:06:23.940 --> 00:06:26.040
meetup or some temporary event.

00:06:26.240 --> 00:06:30.900
And you want people to be able to text you because you're not going to be around your

00:06:30.900 --> 00:06:31.680
computer all the time.

00:06:31.680 --> 00:06:35.140
You want to be able to people, people to be able to text you and you want to text back,

00:06:35.140 --> 00:06:37.060
but you don't want to give out your phone number.

00:06:37.060 --> 00:06:41.380
Well, this project gives you a little proxy so that you can set it up with Flask and set

00:06:41.380 --> 00:06:47.560
up a server with Twilio and have give out a temporary phone number and have it be attached

00:06:47.560 --> 00:06:48.180
to your phone.

00:06:48.180 --> 00:06:51.960
And I'm going to definitely have to try this out because it looks fun.

00:06:51.960 --> 00:06:53.200
Yeah, that looks really, really cool.

00:06:53.200 --> 00:06:55.340
And I think that program they have is awesome.

00:06:55.340 --> 00:07:00.100
One of the challenges of getting started blogging is nobody knows about you.

00:07:00.100 --> 00:07:03.700
Nobody, like you'll put all this effort into writing this thing and you'll put it out there

00:07:03.700 --> 00:07:09.900
and your 10 friends who are willing to follow your tech stuff off of Facebook glanced at it,

00:07:09.900 --> 00:07:10.140
right?

00:07:10.140 --> 00:07:16.600
And so here's a way to like appear on a major, major blog and highlight what you're doing

00:07:16.600 --> 00:07:19.320
and maybe jumpstart your other tech stuff, right?

00:07:19.320 --> 00:07:21.420
Like you could link back to your blog or something like this.

00:07:21.420 --> 00:07:24.440
Having somebody work with you to polish it up a little bit.

00:07:25.140 --> 00:07:25.940
Is a good idea.

00:07:25.940 --> 00:07:31.200
Often when you just tap your friends for that sort of help, they'll just tell you, oh, it

00:07:31.200 --> 00:07:31.720
looks great.

00:07:31.720 --> 00:07:32.460
Go ahead and put it up.

00:07:32.460 --> 00:07:32.840
Yeah, yeah.

00:07:32.840 --> 00:07:33.240
Very cool.

00:07:33.240 --> 00:07:33.700
Very cool.

00:07:33.700 --> 00:07:35.100
But this project is also pretty neat.

00:07:35.100 --> 00:07:39.420
It does encourage you to do some of the paid part of Twilio.

00:07:39.420 --> 00:07:42.400
But I think for something like this, it's a good idea.

00:07:42.400 --> 00:07:43.080
Yeah, very nice.

00:07:43.080 --> 00:07:44.140
Good article.

00:07:44.140 --> 00:07:44.840
All right.

00:07:44.840 --> 00:07:48.080
Before we get to the next, let me just tell you about DigitalOcean.

00:07:48.500 --> 00:07:50.300
They're doing some really amazing stuff.

00:07:50.300 --> 00:07:56.000
So the thing I'd like to highlight is they just upgraded all of their things and left

00:07:56.000 --> 00:07:56.840
the price the same.

00:07:56.840 --> 00:08:00.700
And they, by upgraded, I mean doubled all the stuff at least.

00:08:00.700 --> 00:08:07.100
So for example, you go to DigitalOcean and get a Linux server with all variety of Linux machines,

00:08:07.480 --> 00:08:15.920
Linux distributions, with four gigs of RAM, two CPUs, 80 gigs of SSD for $20 a month.

00:08:15.920 --> 00:08:16.880
Like that's insane.

00:08:16.880 --> 00:08:17.760
Right?

00:08:17.760 --> 00:08:19.320
That is a crazy thing.

00:08:19.320 --> 00:08:20.680
And that used to cost $40.

00:08:20.680 --> 00:08:23.140
And they just said, nope, that's now $20.

00:08:23.140 --> 00:08:26.060
And it comes with four terabytes of free traffic.

00:08:26.620 --> 00:08:33.220
If I were to just transfer that over S3, which is $0.09 a gigabyte, just that bandwidth would

00:08:33.220 --> 00:08:35.280
be $368 at S3.

00:08:35.280 --> 00:08:37.500
That's included in your $20 server.

00:08:37.500 --> 00:08:38.680
So really, really awesome stuff.

00:08:38.680 --> 00:08:41.980
Check them out over at do.co slash Python.

00:08:41.980 --> 00:08:44.520
And you know, check out what they're doing.

00:08:44.520 --> 00:08:45.420
Help support the show.

00:08:45.420 --> 00:08:46.820
Everybody's getting good stuff.

00:08:46.820 --> 00:08:48.560
So thanks to DigitalOcean for that.

00:08:48.560 --> 00:08:49.460
All right.

00:08:49.860 --> 00:08:57.980
I kind of want to just go on a Jupyter-like notebook rant for a while, Brian, because the

00:08:57.980 --> 00:09:00.940
news around this stuff is just coming in fast and furious.

00:09:00.940 --> 00:09:04.740
So there are so many things going on with notebooks right now.

00:09:04.740 --> 00:09:06.700
And like, this is a world I don't really live in.

00:09:06.700 --> 00:09:12.180
I'm much more a Creative Python project and have like 10 related files and run stuff on the

00:09:12.180 --> 00:09:17.280
command line or my editor and not put it in these cells because that's just not my world.

00:09:17.580 --> 00:09:22.200
But I see how powerful it is for people who are exploring data and being more iterative

00:09:22.200 --> 00:09:23.560
with their code.

00:09:23.560 --> 00:09:27.240
And in the last couple of weeks, they've got a lot more options.

00:09:27.240 --> 00:09:28.780
They've been in the news a lot right now.

00:09:28.780 --> 00:09:30.520
So I'll start with one for this one.

00:09:30.520 --> 00:09:32.780
And then we'll do another one in the final segment.

00:09:32.780 --> 00:09:37.860
So for this one, I want to talk about something that's brand new called Datalore.

00:09:37.860 --> 00:09:39.300
Have you heard of Datalore?

00:09:39.300 --> 00:09:39.940
I have not.

00:09:39.940 --> 00:09:41.500
You've heard of PyCharm, right?

00:09:41.500 --> 00:09:47.080
So this is like PyCharm in a notebook, online, hosted.

00:09:47.380 --> 00:09:49.160
So it's from the JetBrains guys.

00:09:49.160 --> 00:09:50.900
It's just in the cloud.

00:09:50.900 --> 00:09:51.780
You just go sign up.

00:09:51.780 --> 00:09:55.020
It has this intelligent editor, just like JetBrains has.

00:09:55.020 --> 00:10:01.820
Like, you know, IntelliJ plus PyCharm has with all of the like the cool autocomplete and IntelliSense.

00:10:01.820 --> 00:10:06.100
It comes like pre-installed with a bunch of stuff that you need, like Matplotlib and so on.

00:10:06.400 --> 00:10:07.640
It has collaboration.

00:10:07.640 --> 00:10:12.000
So you can log in and kind of like do Google Docs style, work on it together.

00:10:12.000 --> 00:10:14.580
I don't know how real-time it is.

00:10:14.580 --> 00:10:16.540
Like, do you actually see every character going in?

00:10:16.540 --> 00:10:19.240
Or do you, you know, do you have to refresh it?

00:10:19.240 --> 00:10:20.240
Does it automatically refresh?

00:10:20.780 --> 00:10:27.660
I'm not entirely sure the level of collaboration, but there's some real-time multiple people working on the same notebook type of collaboration.

00:10:27.660 --> 00:10:29.180
I got to check that out.

00:10:29.180 --> 00:10:31.580
It has integrated version control.

00:10:31.580 --> 00:10:40.320
So you don't have to be like if you're a student or you say you're an engineer, but you don't like, you're not like git pushed on the command line type of competent, right?

00:10:40.620 --> 00:10:42.780
You go there and just say, create me a save point.

00:10:42.780 --> 00:10:45.700
It basically saves it and tags it so you can get it back.

00:10:45.700 --> 00:10:46.460
Things like that.

00:10:46.460 --> 00:10:47.100
Oh, that's great.

00:10:47.100 --> 00:10:47.460
Pretty cool.

00:10:47.460 --> 00:10:51.520
The JetBrains, like the diff viewer for version control is really great.

00:10:51.520 --> 00:10:53.960
So that, building that in here is cool.

00:10:53.960 --> 00:10:55.300
Yeah, they've got some really cool stuff.

00:10:55.300 --> 00:10:59.360
And finally, this might be pretty big for some folks, depending on what you're doing.

00:10:59.360 --> 00:11:01.020
They have incremental calculations.

00:11:01.020 --> 00:11:05.760
So you can like, if you're doing like machine learning and training and all sorts of analysis,

00:11:05.760 --> 00:11:08.880
and there's a bunch of cells that work together to generate that data,

00:11:09.380 --> 00:11:14.040
they actually have figured out how to track the dependencies between where that data comes from.

00:11:14.040 --> 00:11:15.980
And you have to rerun the entire thing.

00:11:15.980 --> 00:11:22.460
If you're changing your model, it only reruns the parts that have changed, that depend upon something you've changed.

00:11:22.460 --> 00:11:23.320
Oh, that's awesome.

00:11:23.320 --> 00:11:24.200
Yeah, it's pretty cool, right?

00:11:24.200 --> 00:11:29.240
So if your computation takes two minutes, but this little part's really quick because it uses mostly finished data,

00:11:29.240 --> 00:11:30.880
that's a really big deal, I think.

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

00:11:31.200 --> 00:11:33.200
So anyway, data lore, it seems like it's in beta.

00:11:33.200 --> 00:11:36.780
I don't know what it costs, if there's a free thing or whatever.

00:11:36.780 --> 00:11:43.980
But it's a Jupyter Notebook-like hosted service from JetBrains, which I thought was pretty cool and worth talking about.

00:11:43.980 --> 00:11:44.260
Yeah.

00:11:44.260 --> 00:11:44.940
Neat.

00:11:44.940 --> 00:11:45.260
Nice.

00:11:45.820 --> 00:11:49.260
I have no idea how to get started on this next one.

00:11:49.260 --> 00:11:51.620
I'm just going to say the name, Belly Button.

00:11:51.620 --> 00:11:52.920
Belly Button, yes.

00:11:52.920 --> 00:11:54.140
For personal lint.

00:11:54.140 --> 00:11:54.900
What's up with us?

00:11:56.340 --> 00:12:03.000
So, yeah, I think it's a play on words around, like, linters and where lint usually shows up.

00:12:03.540 --> 00:12:12.960
So we have things like pylint and flake 8, which in PyCode style, which used to be called Pep8, that I use all the time and love.

00:12:12.960 --> 00:12:19.100
But there's times where you have, like, extra requirements for your own team or for your own project.

00:12:19.100 --> 00:12:25.180
And it'd be cool to have, like, something like pylint, but just with your own rules in it.

00:12:25.740 --> 00:12:27.840
And that's where Belly Button comes in.

00:12:27.840 --> 00:12:34.340
So it's a way to create rules around for static analysis or style.

00:12:34.340 --> 00:12:45.700
And one of the examples that I thought was great was, let's say you've got a library with some functions that you decide that your team uses, but you decided some of them are dumb and deprecate them.

00:12:46.260 --> 00:12:47.880
Yeah, or maybe there's a better way to do things.

00:12:47.880 --> 00:12:55.340
You can add some of these rules to Belly Button to say, hey, this code here, you need to change it this way.

00:12:55.340 --> 00:12:59.280
And actually give exact examples of how somebody should change it.

00:12:59.280 --> 00:13:01.400
And I think that's a really cool idea.

00:13:01.400 --> 00:13:02.280
Yeah, awesome.

00:13:02.280 --> 00:13:02.720
Belly Button.

00:13:02.720 --> 00:13:03.680
I wanted to bring that up.

00:13:03.680 --> 00:13:04.500
Yeah, it sounds really cool.

00:13:04.500 --> 00:13:05.800
These linters are really great.

00:13:05.800 --> 00:13:10.680
And I typically think of them in the context of, like, continuous integration and sort of team-wide things.

00:13:10.680 --> 00:13:14.220
But, yeah, here's a cool way to sort of make your own overrides and whatnot.

00:13:14.360 --> 00:13:32.740
Yeah, and any time where you've got, like, a coding style within your team, if you can automate it and take the person out of it and take that out of your code reviews, it helps with team dynamics to just have the computer say, hey, change this code instead of having your coworkers keep telling you to change your code.

00:13:32.740 --> 00:13:34.800
Yeah, that's a really interesting dynamic, isn't it?

00:13:34.800 --> 00:13:44.280
Like, people are willing to take petty, nitpicky criticism from robots and automated systems way more than from your manager.

00:13:44.280 --> 00:13:45.280
Or whoever.

00:13:45.280 --> 00:13:50.460
Yeah, and you can just, like, we've already had the discussion about what our style is.

00:13:50.460 --> 00:13:51.620
This is what it is.

00:13:51.620 --> 00:13:53.980
I don't want to keep opening up the discussion.

00:13:53.980 --> 00:13:55.800
So, just, you know, do it.

00:13:55.800 --> 00:13:56.420
Nice.

00:13:56.420 --> 00:13:57.560
Manager speak.

00:13:57.560 --> 00:13:58.900
That's right.

00:13:58.900 --> 00:13:59.140
Cool.

00:13:59.140 --> 00:13:59.600
All right.

00:13:59.600 --> 00:14:01.840
You ready for Notebooks Galore Part 2?

00:14:01.840 --> 00:14:03.860
Oh, more notebook news.

00:14:03.860 --> 00:14:04.200
Yay.

00:14:04.320 --> 00:14:04.720
Yes.

00:14:04.720 --> 00:14:16.940
So, our friend, our friend of the show, Daniel Schorstein, posted something on Reddit, some news that has to do with free hosted notebooks in Azure, right?

00:14:16.940 --> 00:14:20.540
This would be, like, pretty much a direct competitor to Datalore, right?

00:14:20.900 --> 00:14:26.200
So, they are now supporting Python 3.6 Jupyter Notebooks in Azure.

00:14:26.200 --> 00:14:29.600
And there's a nice conversation over on Reddit about that.

00:14:29.600 --> 00:14:33.200
And you go over and read more about it and so on.

00:14:33.200 --> 00:14:40.440
So, they have, basically, if you just drop in on notebooks.azure.com, then off you go.

00:14:40.440 --> 00:14:42.300
You can go work with it right there.

00:14:42.300 --> 00:14:44.560
And that's, like, straight up Jupyter Notebooks, I believe.

00:14:44.560 --> 00:14:46.160
That's pretty cool, right?

00:14:46.520 --> 00:14:48.440
Free, in the cloud, powered by Jupyter.

00:14:48.440 --> 00:14:51.880
Like, I'm telling you, this is, like, a space that is just, like, so blowing up right now.

00:14:51.880 --> 00:14:52.380
Yeah.

00:14:52.380 --> 00:14:55.100
We better pay attention to it more if people are fighting over it.

00:14:55.100 --> 00:14:55.860
Exactly.

00:14:55.860 --> 00:14:57.100
There's big companies fighting over it.

00:14:57.100 --> 00:15:00.300
So, speaking of big companies that want to fight over it, have you heard of Co-Laboratory?

00:15:00.300 --> 00:15:00.680
No.

00:15:00.680 --> 00:15:01.500
A great word, though.

00:15:01.500 --> 00:15:02.140
It is.

00:15:02.140 --> 00:15:08.700
So, this comes from a research, the research group at Google, colab.research.google.com.

00:15:08.700 --> 00:15:14.440
And people, this has been around for a little while, and people have been kind of dissing on it a little bit because it had been just Python 2.

00:15:15.020 --> 00:15:21.040
However, it is now Python supporting, not legacy Python, but modern Python.

00:15:21.040 --> 00:15:23.260
So, that's really cool.

00:15:23.260 --> 00:15:32.340
And since the time that I took this note to talk to you about it today, and today, they now have also launched GPU support.

00:15:32.340 --> 00:15:36.560
So, you go to your notebook, and you say, I want to do some machine learning.

00:15:36.960 --> 00:15:37.300
Oh, yeah.

00:15:37.300 --> 00:15:42.520
Run this TensorFlow, this training process on a GPU.

00:15:42.520 --> 00:15:47.340
And you can basically hit Command-Shift-P to make it run on a GPU.

00:15:47.340 --> 00:15:48.800
Like, how insane is that?

00:15:48.800 --> 00:15:49.400
That's cool.

00:15:49.400 --> 00:15:49.740
Okay.

00:15:49.740 --> 00:15:50.820
So, that was pretty cool.

00:15:50.820 --> 00:15:52.300
You ready for some more notebook news?

00:15:52.300 --> 00:15:52.820
Yes.

00:15:53.980 --> 00:15:56.780
JupyterLab is ready for users.

00:15:56.780 --> 00:15:57.440
It's now open.

00:15:57.440 --> 00:15:58.480
What is JupyterLab?

00:15:58.480 --> 00:16:06.900
So, Jupyter is something based on Jupyter Notebooks, but it's more than just – so, we're going to have to put this with a grain of salt.

00:16:07.040 --> 00:16:10.480
Probably a lot of people out there know better than I do.

00:16:10.480 --> 00:16:15.340
But so, it's like a hosted Jupyter Notebooks, which is really cool.

00:16:15.340 --> 00:16:24.980
But it also enables you to use text editors, terminals, data file viewers, and, like, all sorts of other stuff that's not just in the notebook.

00:16:24.980 --> 00:16:31.500
So, you could, like, SSH in and do stuff behind the scenes or something to this effect, right?

00:16:31.500 --> 00:16:33.600
So, they've got some cool pictures.

00:16:34.060 --> 00:16:38.380
Like, they have – it's almost like this crazy web IDE.

00:16:38.380 --> 00:16:40.160
So, you've got, like, your files on the left.

00:16:40.160 --> 00:16:42.200
You've got your standard notebook with graphs in the middle.

00:16:42.200 --> 00:16:49.740
And then on the right, you might have, like, a map, a couple of JSON files, and a CSV in, like, an Excel thing all in the same window.

00:16:49.740 --> 00:16:50.260
Okay.

00:16:50.260 --> 00:16:50.980
Well, that's neat.

00:16:50.980 --> 00:16:51.200
Yeah.

00:16:51.200 --> 00:16:53.720
And you can build, like, extensions and plugins.

00:16:53.720 --> 00:16:56.820
So, like, that CSV thing, it's probably, like, a JupyterLab extension.

00:16:56.820 --> 00:16:57.460
Nice.

00:16:57.460 --> 00:17:01.380
So, yet another really cool thing going on there.

00:17:01.900 --> 00:17:17.860
And I guess the final piece, a tip, maybe from the very first one from this segment is, Daniel said, one thing that can happen is when you log into, say, like, the Azure notebook, some of their dependencies are a little bit old, like Pandas or Matplotlib or something like that.

00:17:18.460 --> 00:17:26.020
He shows you how to import pip and then execute pip inside your notebook to force it to upgrade the dependencies in your project.

00:17:26.020 --> 00:17:27.100
Oh, okay.

00:17:27.100 --> 00:17:30.820
And it's good that you put – you're going to put the snippet in our notes.

00:17:30.820 --> 00:17:32.020
Yeah, the snippet is in there.

00:17:32.020 --> 00:17:40.960
But you can basically – it shows you how to, from code, run pip to upgrade stuff, which I think is interesting and useful outside of just notebooks.

00:17:41.120 --> 00:17:45.900
But it happens to be, like, if you don't get a remote into them, to the servers, you still want to upgrade stuff.

00:17:45.900 --> 00:17:46.720
It's pretty helpful.

00:17:46.720 --> 00:17:47.420
Yeah, nice.

00:17:47.420 --> 00:17:48.120
Cool.

00:17:48.120 --> 00:17:48.540
All right.

00:17:48.540 --> 00:17:48.760
Whew.

00:17:48.760 --> 00:17:49.880
That's a lot of notebook news.

00:17:49.880 --> 00:17:50.940
We'll probably have more next week.

00:17:50.940 --> 00:17:51.440
Probably.

00:17:51.440 --> 00:17:52.960
Probably.

00:17:52.960 --> 00:17:57.660
It's really cool, though, to see so much innovation and creativity around this stuff.

00:17:57.780 --> 00:18:00.900
So it's kind of a paradox of choice problem going on.

00:18:00.900 --> 00:18:02.960
Like, if I wanted to get started, what the heck would I do?

00:18:02.960 --> 00:18:05.080
But there's a bunch of good options here.

00:18:05.080 --> 00:18:05.520
Definitely.

00:18:05.520 --> 00:18:05.980
Awesome.

00:18:05.980 --> 00:18:06.280
All right.

00:18:06.280 --> 00:18:08.500
You got anything extra you want to let everyone know about this week?

00:18:08.500 --> 00:18:11.920
Just that maybe I should spend more time paying attention to Jupyter.

00:18:11.920 --> 00:18:13.460
But other than that, no.

00:18:13.460 --> 00:18:15.640
Yeah, Jupyter is pretty cool.

00:18:15.640 --> 00:18:16.660
Jupyter Labs is exciting.

00:18:16.660 --> 00:18:17.700
Collaboratory is exciting.

00:18:17.700 --> 00:18:19.000
Notebooks on Azure is exciting.

00:18:19.000 --> 00:18:19.900
Data lore is exciting.

00:18:19.900 --> 00:18:22.540
Yeah, I'll have to pay more attention as well.

00:18:22.540 --> 00:18:23.380
Do you have any news?

00:18:23.380 --> 00:18:24.040
No news.

00:18:24.160 --> 00:18:30.680
Well, when this episode goes out, there's a very good chance that I'll be at PyCon Slovakia.

00:18:30.680 --> 00:18:33.320
And if I am and you hear this, feel free to come say hi.

00:18:33.320 --> 00:18:33.800
That'd be cool.

00:18:33.800 --> 00:18:34.120
Neat.

00:18:34.120 --> 00:18:34.320
Yeah.

00:18:34.320 --> 00:18:36.420
So I think that's the right timing.

00:18:36.420 --> 00:18:37.340
I'm pretty sure it will be.

00:18:37.340 --> 00:18:38.520
I'll try to line it up that way.

00:18:38.520 --> 00:18:39.860
All right.

00:18:39.860 --> 00:18:41.580
Well, thanks for getting all this stuff together, Brian.

00:18:41.580 --> 00:18:42.180
This is great stuff.

00:18:42.180 --> 00:18:42.860
Yeah, thank you.

00:18:42.860 --> 00:18:46.300
Thank you for listening to Python Bytes.

00:18:46.300 --> 00:18:48.860
Follow the show on Twitter via at Python Bytes.

00:18:48.860 --> 00:18:51.740
That's Python Bytes as in B-Y-T-E-S.

00:18:52.100 --> 00:18:55.180
And get the full show notes at pythonbytes.fm.

00:18:55.180 --> 00:18:59.500
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:18:59.500 --> 00:19:02.200
We're always on the lookout for sharing something cool.

00:19:02.200 --> 00:19:05.600
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:19:05.600 --> 00:19:09.220
Thank you for listening and sharing this podcast with your friends and colleagues.

