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 get 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.