WEBVTT

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

00:00:05.760 --> 00:00:09.820
This is episode 80, recorded May 25th, 2018.

00:00:09.820 --> 00:00:11.180
I'm Michael Kennedy.

00:00:11.180 --> 00:00:12.060
And I'm Brian Okken.

00:00:12.060 --> 00:00:13.600
And Brian, we have a special guest, don't we?

00:00:13.600 --> 00:00:14.180
Yes.

00:00:14.180 --> 00:00:16.080
Hey, hello, Dan Bader.

00:00:16.080 --> 00:00:19.700
Hey, guys. It's me, Dan. Good to be back on the show.

00:00:19.700 --> 00:00:23.340
And it's always so nice to hear you do this intro live, Mike.

00:00:23.340 --> 00:00:24.700
Thank you.

00:00:24.700 --> 00:00:27.860
It's not, it's so unreal. It's like, and you sound so smooth. I love it.

00:00:27.860 --> 00:00:29.500
I guess I've done it 80 times now.

00:00:29.500 --> 00:00:34.520
Maybe 82 or 83 for the few times I screwed up with the wrong date.

00:00:34.520 --> 00:00:36.840
Well, thank you. And it's great to have you.

00:00:36.840 --> 00:00:44.160
For those of you who don't know Dan, Dan's well known from RealPython and dbeta.org and a bunch of Python goodness.

00:00:44.160 --> 00:00:47.460
Before we get to the show, I want to say thank you to DigitalOcean.

00:00:47.460 --> 00:00:55.060
So they're sponsoring this episode and a number of them coming up, as well as the actual infrastructure delivering all this technology to you.

00:00:55.060 --> 00:01:00.220
So pythonbytes.fm/digitalization, get a $100 credit for new users.

00:01:00.220 --> 00:01:01.140
Pretty awesome.

00:01:01.140 --> 00:01:06.880
Brian, I feel like there's a few themes that we touch on frequently in this podcast.

00:01:06.880 --> 00:01:08.140
Yeah, I guess that we do.

00:01:08.140 --> 00:01:09.720
And one of them is packaging.

00:01:10.080 --> 00:01:12.000
So we've talked about packaging a few times.

00:01:12.000 --> 00:01:20.620
And the Python Packaging Authority has their tutorial on how to package Python packages.

00:01:21.400 --> 00:01:26.360
And it used to be out of date, but now they've recently revamped it and rewritten it.

00:01:26.360 --> 00:01:29.120
And it's very user-friendly now.

00:01:29.120 --> 00:01:39.380
It's a short little walkthrough of how to set up a package and push it to both the test server and then to the full Python Package Index, PYPI.

00:01:39.380 --> 00:01:41.020
Yeah, I got that out.

00:01:41.180 --> 00:01:47.360
One of the things that's kind of fun to note that I noted is the readme example is in Markdown.

00:01:47.360 --> 00:01:49.200
And that's cool.

00:01:49.200 --> 00:01:50.660
And that's a new feature, right?

00:01:50.660 --> 00:01:55.820
That's one of the things of them switching to Warehouse and the big release of the new pypi.org.

00:01:55.820 --> 00:01:59.600
I think I remember the old examples for setup.py.

00:01:59.600 --> 00:02:01.400
They were either too small.

00:02:01.400 --> 00:02:03.460
They didn't include everything they needed.

00:02:03.660 --> 00:02:05.820
Or they were too big and kind of scary.

00:02:05.820 --> 00:02:11.160
And now this is a medium-sized example setup.py that is actually pretty nice.

00:02:11.160 --> 00:02:15.540
You know, I read through it and it looked like the same tool set that I used to push up.

00:02:15.540 --> 00:02:17.320
So I think it's pretty accurate now.

00:02:17.320 --> 00:02:18.020
So that's nice.

00:02:18.020 --> 00:02:18.300
Nice.

00:02:18.300 --> 00:02:19.980
You didn't feel like you were super out of date.

00:02:19.980 --> 00:02:21.940
You're like, why am I not using this or using that?

00:02:21.940 --> 00:02:31.680
Yeah, because when I learned how to do it the first time, I think I read both the old tutorial and then like four or five or six different blog articles on how to do it now.

00:02:31.680 --> 00:02:33.840
I don't know how to do it now because it changed.

00:02:33.840 --> 00:02:35.240
But now this is all up to date.

00:02:35.240 --> 00:02:36.140
So it's good.

00:02:36.140 --> 00:02:36.660
Very nice.

00:02:36.660 --> 00:02:38.500
Dan, did you do much packaging?

00:02:38.500 --> 00:02:39.060
Yeah.

00:02:39.060 --> 00:02:48.660
So I run a couple of open source projects and I always felt like, you know, exactly like what you were just saying, Brian, where I had to combine a couple of tutorials just to get it to work.

00:02:48.660 --> 00:02:50.380
And it never really felt all that straightforward.

00:02:50.380 --> 00:02:54.740
And so I think this is a pretty nice and pretty minimal write-up.

00:02:54.740 --> 00:02:55.340
I like that.

00:02:55.340 --> 00:03:00.080
And I'm surprised that the recommendation now seems to be to use Markdown-based readme files.

00:03:00.280 --> 00:03:01.300
Like I really like Markdown.

00:03:01.300 --> 00:03:04.280
I really warmed up to restructured text so much.

00:03:04.280 --> 00:03:07.000
And it's definitely cool that they're supporting that now.

00:03:07.000 --> 00:03:07.600
That's awesome.

00:03:07.600 --> 00:03:09.920
I think restructured text maybe predated Markdown.

00:03:09.920 --> 00:03:15.880
And it was, you know, it was the thing when the original PyPI was created.

00:03:15.880 --> 00:03:18.940
And then just like that thing was, you know, calcified.

00:03:18.940 --> 00:03:20.360
And I go, let's not touch this.

00:03:20.360 --> 00:03:21.940
Let's just not mess with this.

00:03:21.940 --> 00:03:22.900
Let's just keep it running.

00:03:22.900 --> 00:03:23.200
Right.

00:03:24.000 --> 00:03:26.340
It's really good to see that getting a fresh update.

00:03:26.340 --> 00:03:28.640
Also, Brian, you talk about Twine in here.

00:03:28.640 --> 00:03:29.500
What's the story with Twine?

00:03:29.500 --> 00:03:31.100
I don't know if there's a story with it.

00:03:31.100 --> 00:03:36.220
That's just the tool you use to push things up to PyPI.

00:03:36.220 --> 00:03:36.780
Oh, nice.

00:03:36.780 --> 00:03:39.880
I probably used it and didn't realize it or forgot that I used it.

00:03:39.880 --> 00:03:41.960
Maybe there's another way, but that's what I've always used.

00:03:41.960 --> 00:03:42.500
Yeah, cool.

00:03:42.560 --> 00:03:45.220
Actually, there's a cool project to throw in the mix here.

00:03:45.220 --> 00:03:47.940
It's called FLIT, F-L-I-T.

00:03:47.940 --> 00:03:51.880
And it's, well, what's a good way to describe it?

00:03:51.880 --> 00:03:56.420
It's sort of a minimal, simple way to put Python packages on PyPI.

00:03:56.420 --> 00:03:59.700
So they kind of completely done away with the setup.py.

00:03:59.700 --> 00:04:03.860
Instead, you write an init file where you just put in, you know, your author name and your

00:04:03.860 --> 00:04:04.500
homepage or whatever.

00:04:04.500 --> 00:04:06.620
And it generates all of that other stuff.

00:04:06.620 --> 00:04:09.880
And it might not be really necessary anymore now.

00:04:09.880 --> 00:04:13.540
You know, if you have like a really sort of short and sweet tutorial, like the one that

00:04:13.540 --> 00:04:14.480
we were just talking about.

00:04:14.480 --> 00:04:18.940
But it is super, super beginner friendly, this FLIT thing.

00:04:18.940 --> 00:04:20.140
Oh, that's cool.

00:04:20.140 --> 00:04:20.480
Nice.

00:04:20.480 --> 00:04:21.400
It's F-L-I-T?

00:04:21.400 --> 00:04:22.380
It's F-L-I-T.

00:04:22.380 --> 00:04:22.720
Yeah.

00:04:22.720 --> 00:04:23.100
Awesome.

00:04:23.100 --> 00:04:23.720
All right.

00:04:23.720 --> 00:04:25.860
And so that's probably on GitHub, isn't it, Dan?

00:04:25.860 --> 00:04:26.760
Yes, it is.

00:04:26.760 --> 00:04:28.080
Nice transition.

00:04:28.080 --> 00:04:32.760
So the next thing you have for us is an async library for calling GitHub's API.

00:04:32.760 --> 00:04:33.400
Yeah.

00:04:33.400 --> 00:04:33.860
Yeah.

00:04:33.860 --> 00:04:39.520
So I was going to talk about this thing called GidgetHub, which is, yeah, a Python wrapper

00:04:39.520 --> 00:04:40.820
around the GitHub API.

00:04:40.820 --> 00:04:45.700
So basically allows you to talk to GitHub and you can interact with all the different

00:04:45.700 --> 00:04:49.100
content types that GitHub provides or exposes.

00:04:49.100 --> 00:04:51.340
So you can add and modify issues.

00:04:51.340 --> 00:04:53.480
You can, you know, create pull requests.

00:04:53.480 --> 00:04:55.520
You can add comments to pull requests.

00:04:55.520 --> 00:04:58.120
You can download all the comments to pull requests and all that stuff.

00:04:58.660 --> 00:05:03.960
So the other thing it does, it allows you to parse GitHub's webhooks.

00:05:03.960 --> 00:05:08.360
So you can configure GitHub so that every time a new pull request or something like that is

00:05:08.360 --> 00:05:14.540
created, it sends, essentially calls a, an API callback on the web, like on some URL that

00:05:14.540 --> 00:05:15.200
you give it.

00:05:15.200 --> 00:05:21.960
And so what you can use GidgetHub for is a really nice and clean way to write GitHub bots with

00:05:21.960 --> 00:05:22.860
Python, essentially.

00:05:23.700 --> 00:05:26.180
And it's just a really cool library.

00:05:26.180 --> 00:05:28.080
And I think it's API super well designed.

00:05:28.080 --> 00:05:34.840
So we were recently using it on a workshop that we did in Vancouver, like Marietta, who's a

00:05:34.840 --> 00:05:36.080
CPython core developer, did it.

00:05:36.080 --> 00:05:38.060
And I served T8 and was running around helping her.

00:05:38.060 --> 00:05:41.880
And so she wrote a really good, cool tutorial about how to use GidgetHub.

00:05:42.420 --> 00:05:48.080
I think it's just a really nice example from modern Python web API library.

00:05:48.080 --> 00:05:49.180
It looks really great.

00:05:49.180 --> 00:05:52.240
And so you just go over here and you say like, I'd like to open a PR.

00:05:52.240 --> 00:05:57.700
So you get some PR data, then you say await GitHub.post.

00:05:57.700 --> 00:06:01.680
And, you know, all your, all your methods are async.

00:06:01.680 --> 00:06:03.240
Yeah, definitely nice and scalable.

00:06:03.240 --> 00:06:10.020
Well, it looks like it's based on aiohttp, which is a really nice client side, async enabled

00:06:10.020 --> 00:06:12.440
REST library.

00:06:12.440 --> 00:06:16.700
What's really, really cool about this GidgetHub thing is that it's actually abstracting away

00:06:16.700 --> 00:06:22.220
from the actual backend, I want to say, you know, what the actual library you use to talk

00:06:22.220 --> 00:06:26.840
to or to handle those web requests, whether they're incoming or outbound.

00:06:26.840 --> 00:06:31.720
So I just learned that this is referred to as a sans IO library.

00:06:31.720 --> 00:06:37.380
So basically, it's just a protocol implementation that doesn't really specify how the IO is

00:06:37.380 --> 00:06:37.780
performed.

00:06:37.780 --> 00:06:45.320
So it allows you to plug in different backends, different concrete implementations that make

00:06:45.320 --> 00:06:47.300
this thing super reusable.

00:06:47.300 --> 00:06:51.120
Because, well, if there's a new async library, you know, flavor of the day kind of thing in

00:06:51.120 --> 00:06:53.940
a couple of months, then, well, you can probably just plug that in and work with that.

00:06:53.940 --> 00:06:55.460
So it's kind of nice.

00:06:55.460 --> 00:06:56.480
It's really well-designed.

00:06:56.480 --> 00:06:58.060
Yeah, so you can use aiohttp.

00:06:58.060 --> 00:06:59.540
You can use Tornado.

00:06:59.540 --> 00:06:59.980
Yep.

00:06:59.980 --> 00:07:05.620
Yeah, I was recently, we covered it on the show, this thing called unsync instead of async,

00:07:05.620 --> 00:07:06.360
U-N-sync.

00:07:07.300 --> 00:07:12.940
And it's a different implementation with a different event loop thing.

00:07:12.940 --> 00:07:14.880
Maybe you could use that here as well.

00:07:14.880 --> 00:07:16.100
That's pretty awesome.

00:07:16.100 --> 00:07:17.400
I like it.

00:07:17.400 --> 00:07:18.320
Nice pick.

00:07:18.320 --> 00:07:18.900
Nice, yeah.

00:07:18.900 --> 00:07:19.740
It's nice to use.

00:07:19.740 --> 00:07:20.640
Super friendly.

00:07:20.640 --> 00:07:21.100
Yeah.

00:07:21.100 --> 00:07:22.820
Brian, do you guys do any GitHub automation?

00:07:22.820 --> 00:07:25.840
You just started with Git at your organization, right?

00:07:25.920 --> 00:07:30.340
We're doing a, we've got a private server, so we don't go through GitHub for work stuff.

00:07:30.340 --> 00:07:32.040
But I use GitHub all the time.

00:07:32.040 --> 00:07:32.740
Yeah, of course.

00:07:32.740 --> 00:07:33.160
Locally.

00:07:33.160 --> 00:07:34.080
Yeah, nice.

00:07:34.080 --> 00:07:40.500
Yeah, I feel like this kind of automation is more relevant and useful when either you're

00:07:40.500 --> 00:07:46.120
building an app or you have like a big organization and you want to automate your company's interaction

00:07:46.120 --> 00:07:47.560
with GitHub, right?

00:07:47.560 --> 00:07:53.140
Like me as an individual, I just don't really see a massive use of this for me because I just

00:07:53.140 --> 00:07:55.880
don't do that much different other than what I personally do with GitHub.

00:07:55.880 --> 00:07:59.100
But I think it looks really cool and I love the way it works.

00:07:59.100 --> 00:08:02.700
Some uses where you could often use like Travis or something like that.

00:08:02.700 --> 00:08:07.160
Like if you were watching different, if your project depended on a bunch of dependencies

00:08:07.160 --> 00:08:12.240
and you wanted to, when, if they changed, pull them in and run your build, repackage everything

00:08:12.240 --> 00:08:16.100
and run some tests against it, you could do that locally with something like this.

00:08:16.240 --> 00:08:16.880
Yeah, that's pretty cool.

00:08:16.880 --> 00:08:20.060
Or you have that one person on your team that often breaks the build.

00:08:20.060 --> 00:08:22.740
So you run extra tests when you see them do a check-in.

00:08:22.740 --> 00:08:28.660
A harassment bot that just goes in and be careful.

00:08:28.660 --> 00:08:32.920
Yeah, I think they use it on CPython.

00:08:32.920 --> 00:08:35.520
You know, they've moved all of the source for that to GitHub.

00:08:35.520 --> 00:08:39.940
And I think now they, they have run a couple of bots that I think one of the things they

00:08:39.940 --> 00:08:44.800
do is, so when you contribute to CPython, they need you to sign an agreement that you're

00:08:44.800 --> 00:08:47.060
giving up the rights essentially for your contributions.

00:08:47.060 --> 00:08:49.600
And so they, I think Marietta actually runs that bot.

00:08:49.600 --> 00:08:54.120
I might be mistaken here, but it's a bot that checks if that committer or that contributor

00:08:54.120 --> 00:08:55.360
already has given their permission.

00:08:55.360 --> 00:08:58.400
And if they didn't yet, then it's just going to ask them to do it.

00:08:58.400 --> 00:08:59.600
And it sets a flag on the PR.

00:08:59.600 --> 00:09:04.300
So it's, it's super cool that way when you can sort of code up a workflow like that, that

00:09:04.300 --> 00:09:08.180
you never have to worry about again in your life because it's a hundred percent automated.

00:09:08.180 --> 00:09:10.920
So I think it's, it's great for that sort of use case.

00:09:11.120 --> 00:09:12.120
That is a great use case.

00:09:12.120 --> 00:09:13.380
Yeah, that's really, really awesome.

00:09:13.380 --> 00:09:13.900
Okay.

00:09:13.900 --> 00:09:19.860
So the next one that I wanted to talk about actually was recommended to me, recommended

00:09:19.860 --> 00:09:24.360
to me and Brian because of some stuff that I had recently been doing.

00:09:24.360 --> 00:09:25.800
I think, you know, we were all at PyCon.

00:09:25.800 --> 00:09:29.280
I think maybe we're all at the same, same meeting or get together.

00:09:29.800 --> 00:09:31.660
And I had just decided like, that's it.

00:09:31.660 --> 00:09:40.420
I'm writing a Python system D daemon that will synchronize all of my course data geo, basically

00:09:40.420 --> 00:09:43.020
across the various servers in the different locations.

00:09:43.020 --> 00:09:47.960
So there's like eight or nine places in the world that serve up course content based on

00:09:47.960 --> 00:09:48.500
where you are.

00:09:48.500 --> 00:09:55.600
And so I wrote a service in Python that is a system D service that will basically keep all

00:09:55.600 --> 00:09:56.780
those places in sync.

00:09:57.160 --> 00:09:58.700
Nothing too impressive, but it's kind of cool.

00:09:58.700 --> 00:09:59.440
You can do that in Python.

00:09:59.440 --> 00:10:05.980
So we got pointed at this thing called PySystemD and this was actually presented at PyCon 2018.

00:10:05.980 --> 00:10:10.020
So there's a whole talk and you can go learn about what is system D, why you care about it,

00:10:10.020 --> 00:10:10.780
how is it used.

00:10:10.780 --> 00:10:19.640
But the short version is this PySystemD is an API into the system D whole API part of Linux.

00:10:19.840 --> 00:10:23.380
So you can create things that are daemons.

00:10:23.380 --> 00:10:28.800
You can say like, I would like to have my Python web app start and I want it to start in this

00:10:28.800 --> 00:10:33.100
way, but I want it to not start before my MongoDB server starts.

00:10:33.100 --> 00:10:35.080
I don't want MongoDB to start in that way.

00:10:35.080 --> 00:10:39.740
You can configure these things to all just happen on boot or on demand, things like that.

00:10:39.740 --> 00:10:42.080
So I think this is really pretty awesome.

00:10:42.300 --> 00:10:46.760
So if anyone's doing any sort of automation with system D and they're already using Python,

00:10:46.760 --> 00:10:51.300
here's a really great way to just like, you know, import this library and just ask, hey,

00:10:51.300 --> 00:10:55.860
let's load up this unit, which is like one of these services and ask, is it running?

00:10:55.860 --> 00:10:57.140
Let's start it.

00:10:57.140 --> 00:10:58.180
Let's create a new one.

00:10:58.180 --> 00:10:59.060
All sorts of stuff.

00:10:59.060 --> 00:10:59.780
Really, really nice.

00:10:59.780 --> 00:11:00.400
That's cool.

00:11:00.400 --> 00:11:01.160
Yeah.

00:11:01.200 --> 00:11:03.480
And also kind of cool how this was built.

00:11:03.480 --> 00:11:05.280
So this is like based on Cython.

00:11:05.280 --> 00:11:09.780
So it's a wrapper and the C library that actually talks to system D, right?

00:11:09.780 --> 00:11:10.720
Yeah, I think so.

00:11:10.720 --> 00:11:17.240
And actually, I'm going to cover in the next episode, this sort of article on using Cython

00:11:17.240 --> 00:11:21.440
as a way for a simple way to wrap C APIs.

00:11:21.440 --> 00:11:22.760
That's what surprised me.

00:11:22.760 --> 00:11:23.200
Yeah.

00:11:23.200 --> 00:11:26.060
I think that's why, because it doesn't seem like a performance thing, right?

00:11:26.080 --> 00:11:31.940
I think it's like, let's use Cython to get a really simple API into the C layer as well

00:11:31.940 --> 00:11:33.900
as build the integration back into Python.

00:11:33.900 --> 00:11:34.640
So pretty cool.

00:11:34.640 --> 00:11:35.060
Yeah, nice.

00:11:35.060 --> 00:11:38.600
I'd love to see that because I'm surprised they're using Cython for that and not just,

00:11:38.600 --> 00:11:40.860
you know, C types or CFFI or something like that.

00:11:40.860 --> 00:11:43.340
But I'm sure there's a reason for that.

00:11:43.340 --> 00:11:47.800
The other thing I wanted to point out about this is this was created and presented by Alvaro

00:11:47.800 --> 00:11:48.820
Liva.

00:11:48.820 --> 00:11:50.640
Sorry if I'm mispronouncing your last name there.

00:11:50.640 --> 00:11:54.880
But he's a production engineer at Instagram and Facebook.

00:11:55.280 --> 00:11:57.880
And so, you know, they have a few servers to manage.

00:11:57.880 --> 00:12:03.620
And this is probably pretty polished and comes from a pretty well, well-informed space if

00:12:03.620 --> 00:12:04.800
it's being used there, right?

00:12:04.800 --> 00:12:05.540
Pretty sweet.

00:12:05.540 --> 00:12:06.720
All right.

00:12:06.720 --> 00:12:11.300
So before we get to the next one, let me tell you guys about DigitalOcean.

00:12:11.300 --> 00:12:19.220
So DigitalOcean is definitely one of the best hosting frameworks or places out there.

00:12:19.220 --> 00:12:23.700
You can go up, create a server, super easy, create a load balancer.

00:12:24.480 --> 00:12:30.260
You can create floating APIs that allow you to switch between various machines with perceived

00:12:30.260 --> 00:12:32.120
zero downtime, all sorts of stuff.

00:12:32.120 --> 00:12:37.340
All of our code and our sites, our delivery, all that stuff is running on top of it.

00:12:37.340 --> 00:12:40.180
It has been for a long time and it's been working great.

00:12:40.740 --> 00:12:45.480
So like I said, if you're thinking about running servers and you want to do it affordably, high

00:12:45.480 --> 00:12:50.480
performance with lots of control, then go to pythonbytes.fm/DigitalOcean.

00:12:50.480 --> 00:12:53.600
If you're a new user, you'll get $100 credit.

00:12:53.600 --> 00:12:56.020
And, you know, check out what they have.

00:12:56.020 --> 00:13:00.880
It takes about 60 seconds to set up a new server and you'll be SSH'd in and doing all sorts of

00:13:00.880 --> 00:13:01.240
good stuff.

00:13:01.660 --> 00:13:05.080
Maybe you could even use PySystemD to like automate some cool stuff on it afterwards.

00:13:05.080 --> 00:13:07.280
So check them out.

00:13:07.280 --> 00:13:08.100
It helps support the show.

00:13:08.100 --> 00:13:10.640
And it's definitely a good product worth checking out.

00:13:10.640 --> 00:13:13.320
Speaking of products, Brian, you're excited about one.

00:13:13.320 --> 00:13:14.240
Oh, an update one, right?

00:13:14.240 --> 00:13:15.640
Yeah, I am.

00:13:15.640 --> 00:13:23.880
I usually, for a while, I was running the latest or the last 2017 release of PyCharm.

00:13:24.440 --> 00:13:31.540
But I don't know how recent this was, but not too long ago, we had the early access program

00:13:31.540 --> 00:13:36.920
build one of 2018.2 is out for PyCharm.

00:13:36.920 --> 00:13:43.600
And the really exciting bit, and we got notified by this from the Bruno Oliveira, who goes by

00:13:43.600 --> 00:13:48.880
Nicodermis on Twitter, but it supports a whole bunch of new pytest features.

00:13:48.880 --> 00:13:52.620
And I'm kind of a pytest kind of nut.

00:13:53.080 --> 00:13:55.440
So the things that I'm really excited about...

00:13:55.440 --> 00:13:56.760
You could say you wrote the book on it.

00:13:56.760 --> 00:13:57.300
Yeah.

00:13:57.300 --> 00:14:00.020
Well, you could, because I did.

00:14:00.020 --> 00:14:06.220
Anyway, a couple of the features that I was really waiting for is PyCharm's really, being

00:14:06.220 --> 00:14:09.380
an IDE, has a lot of, like, what do you call that?

00:14:09.380 --> 00:14:10.540
IntelliSense or something?

00:14:10.540 --> 00:14:11.880
Yeah, Autocomplete IntelliSense.

00:14:11.880 --> 00:14:12.280
Yeah.

00:14:12.280 --> 00:14:12.980
Autocomplete.

00:14:12.980 --> 00:14:16.320
That didn't work for fixtures to a test.

00:14:16.320 --> 00:14:22.260
So if your test was using fixtures and you was returning an object or a function or something,

00:14:22.720 --> 00:14:27.200
and you were trying to call that, you didn't have all of those cool autocomplete features,

00:14:27.200 --> 00:14:30.460
those are now in for fixtures of tests.

00:14:30.460 --> 00:14:32.120
And that's really cool.

00:14:32.120 --> 00:14:39.340
But the thing that I'm really excited about is parameterization now works seamlessly within

00:14:39.340 --> 00:14:39.760
PyCharm.

00:14:39.900 --> 00:14:45.980
So if you've got a test that is parameterized so that you've got, like, several, or in my

00:14:45.980 --> 00:14:51.300
case, sometimes dozens of different parameter sets that are run through the same test, you

00:14:51.300 --> 00:14:55.360
could always run that through, run all of those parameterizations in PyCharm.

00:14:55.360 --> 00:14:56.220
And that was wonderful.

00:14:56.380 --> 00:15:01.780
If you wanted to rerun one or rerun the failing ones, it would just rerun all of them.

00:15:01.780 --> 00:15:02.080
I see.

00:15:02.080 --> 00:15:05.900
It treated like a whole method in the decorator bit that had, here's all the variations.

00:15:06.120 --> 00:15:08.720
That was just like a thing that it would just rerun, right?

00:15:08.720 --> 00:15:09.000
Yeah.

00:15:09.000 --> 00:15:10.520
So now you can run a test.

00:15:10.520 --> 00:15:16.280
And then in the left sidebar, you can right click on one of them and rerun just one of the

00:15:16.280 --> 00:15:17.020
parameterizations.

00:15:17.020 --> 00:15:23.560
Or you can, like, for instance, if like only two or three or some of them failed, when you

00:15:23.560 --> 00:15:26.740
rerun failures, it only runs the parameterizations that failed.

00:15:26.740 --> 00:15:29.760
And this is a huge time saver for me.

00:15:29.760 --> 00:15:30.980
So I'm really excited about it.

00:15:30.980 --> 00:15:31.540
Yeah, that's nice.

00:15:31.580 --> 00:15:33.980
I use that feature a lot where I just say rerun the failed tests.

00:15:33.980 --> 00:15:37.880
For people that are like really, and may not be too much of an issue for people that are

00:15:37.880 --> 00:15:42.620
running really quick tests, but a lot of my tests talk to hardware.

00:15:42.620 --> 00:15:44.080
So they're not really that fast.

00:15:44.080 --> 00:15:47.720
So this will save me like an hour a day, I'm sure.

00:15:47.720 --> 00:15:48.300
That's awesome.

00:15:48.300 --> 00:15:49.220
Very, very cool.

00:15:49.220 --> 00:15:50.900
Dan, do you use pytest?

00:15:50.900 --> 00:15:51.400
Yeah, I do.

00:15:51.400 --> 00:15:54.280
Yeah, I actually just, you know, used it.

00:15:54.280 --> 00:15:57.360
I rewrote the backend for realpython.com.

00:15:57.360 --> 00:16:00.800
So we've got pytest powered tests and integration tests for that.

00:16:00.800 --> 00:16:03.480
And yeah, it's just been a joy to use, like especially the parameterization stuff.

00:16:03.480 --> 00:16:06.660
It's just so nice when you can reuse a lot of test code.

00:16:06.660 --> 00:16:08.660
You don't have to like copy paste it around so much.

00:16:08.660 --> 00:16:13.160
So Dan, one thing I was going to cover, but you put it in here before, before I could get

00:16:13.160 --> 00:16:13.500
to it.

00:16:13.500 --> 00:16:21.540
So you're faster is basically why is installing Python 3.6 so hard and so sort of confusing,

00:16:21.540 --> 00:16:21.900
right?

00:16:21.900 --> 00:16:26.620
Like you talked about this workshop that you recently did and I've thrown this out on Twitter

00:16:26.620 --> 00:16:28.440
and people sometimes tell me, oh, it's not hard.

00:16:28.440 --> 00:16:28.940
It's super easy.

00:16:29.040 --> 00:16:33.240
You do this, but then you, if you actually go teach a workshop to beginners, you're like,

00:16:33.240 --> 00:16:36.000
why are those four people over there not ready yet?

00:16:36.000 --> 00:16:36.960
Like it's been 10 minutes.

00:16:36.960 --> 00:16:38.540
What could they have possibly been doing?

00:16:38.540 --> 00:16:41.260
And it's because it's like, there's all these edge cases, right?

00:16:41.260 --> 00:16:45.920
It's one of these things where in theory it's easy and it's not a problem that you really

00:16:45.920 --> 00:16:48.680
run into when you've, you know, have a little bit more experience under your belt.

00:16:48.960 --> 00:16:52.780
But for people getting into Python, it is definitely a barrier.

00:16:52.780 --> 00:16:56.080
And we were taught, teaching this, this workshop.

00:16:56.080 --> 00:16:59.380
So Mariada was teaching it and I was just running around kind of, you know, supporting people.

00:17:00.040 --> 00:17:05.200
And for some people we spend almost like two hours to get them to a working Python 3.6 install.

00:17:05.200 --> 00:17:05.600
That's insane.

00:17:06.420 --> 00:17:10.460
And, you know, there were some really, like you hit all of these interesting, but obviously

00:17:10.460 --> 00:17:12.260
kind of frustrating edge cases.

00:17:12.260 --> 00:17:17.020
Like some people were running, they were running a Windows host and then they were also running

00:17:17.020 --> 00:17:18.540
the Linux subsystem for Windows.

00:17:18.540 --> 00:17:23.560
So now you can, you know, can essentially boot up a VM that is integrated into Windows and it

00:17:23.560 --> 00:17:26.800
boots Ubuntu or Debian or some other Linux, the Linux distribution, I think.

00:17:26.800 --> 00:17:28.520
I think it defaults to Ubuntu.

00:17:28.520 --> 00:17:28.960
I'm not sure.

00:17:29.120 --> 00:17:29.940
I think it's Ubuntu as well.

00:17:29.940 --> 00:17:30.540
Yeah, that's nice.

00:17:30.540 --> 00:17:34.080
So basically you have this like really tightly integrated Linux environment that you can just

00:17:34.080 --> 00:17:37.140
work from, from your Windows host environment.

00:17:37.140 --> 00:17:44.260
The problem is that people maybe accidentally installed Python in the Linux environment and

00:17:44.260 --> 00:17:48.480
they try and access it from the Windows environment because it's a little bit unclear if you're a

00:17:48.480 --> 00:17:51.060
beginner, like what actually the difference is, you know, between these like two different

00:17:51.060 --> 00:17:52.140
terminal windows.

00:17:52.140 --> 00:17:52.900
Right.

00:17:52.900 --> 00:17:55.460
And you also might open PowerShell, which is like a third still.

00:17:55.460 --> 00:17:55.940
Exactly.

00:17:55.940 --> 00:17:56.720
You know, things like that.

00:17:56.720 --> 00:17:58.820
And then you have like your paths set in different ways.

00:17:59.000 --> 00:18:00.800
And other issues were that.

00:18:00.800 --> 00:18:05.460
So the previous long term release of Ubuntu, I think it was 1604.

00:18:05.460 --> 00:18:08.600
So it doesn't ship with Python 3.6.

00:18:08.600 --> 00:18:11.060
And so for this tutorial, we specifically needed 3.6.

00:18:11.060 --> 00:18:16.440
And so, you know, people started Googling and just copying a bunch of stuff from Stack Overflow

00:18:16.440 --> 00:18:18.300
to install Python 3.6 on Ubuntu.

00:18:18.300 --> 00:18:21.280
Well, it turns out there's like two different PPAs.

00:18:21.280 --> 00:18:24.560
So like third party packages that you can install this from.

00:18:24.560 --> 00:18:28.300
And one of them is broken or was broken during that time.

00:18:28.880 --> 00:18:33.280
So, you know, people would have Python 3, but it had broken SSL and no pip.

00:18:33.280 --> 00:18:37.320
So it was essentially useless for the purposes of this tutorial.

00:18:38.100 --> 00:18:42.760
And it's kind of crazy just into, you know, all of the edge cases you can encounter with this.

00:18:42.760 --> 00:18:45.220
And I think it's really something we need to keep in mind.

00:18:45.220 --> 00:18:50.300
You know, when we're teaching beginners or kind of telling people how awesome Python is, it can be a pretty jarring experience.

00:18:50.300 --> 00:18:52.780
If you try to set it up and you're just sitting there.

00:18:52.780 --> 00:18:53.680
Well, okay.

00:18:53.680 --> 00:18:54.580
I just wanted to try this.

00:18:54.580 --> 00:18:55.060
It doesn't work.

00:18:55.060 --> 00:18:55.420
For sure.

00:18:55.900 --> 00:19:01.680
Well, so you guys are writing this up at realpython.com slash installing dash Python as sort of an ongoing guide, right?

00:19:01.800 --> 00:19:01.960
Yeah.

00:19:01.960 --> 00:19:04.360
So we decided to do something about it.

00:19:04.360 --> 00:19:07.180
So shout out to John Sturtz and Jim Anderson.

00:19:07.680 --> 00:19:13.920
And we got together and put together this sort of the ultimate Python 3 install guide.

00:19:13.920 --> 00:19:15.900
And we're going to keep it maintained.

00:19:15.900 --> 00:19:21.360
And it tells you how to install Python in very specific steps in all kinds of different configurations.

00:19:21.360 --> 00:19:25.800
So Linux, macOS, different Linux distributions, how to compile it from source.

00:19:26.120 --> 00:19:29.100
And we're just going to add to it and, you know, improve it based on feedback.

00:19:29.100 --> 00:19:33.600
And hopefully that's something we can just use in the next workshop and then tell people what to do.

00:19:33.600 --> 00:19:39.040
I hope that when you refer to Python 2 in there to say, oh, don't do Python 2, do Python 3, that you call it legacy Python.

00:19:39.040 --> 00:19:41.340
So just throw that in there.

00:19:41.340 --> 00:19:43.540
I'm still trying to make that a thing.

00:19:43.540 --> 00:19:45.900
I don't think we even mentioned it in that particular piece.

00:19:45.900 --> 00:19:47.260
This is Python 3 only.

00:19:47.260 --> 00:19:51.960
And then my Mac is about ready for a format because, you know, it's time.

00:19:51.960 --> 00:19:54.060
It's been like, it's been bad.

00:19:54.060 --> 00:19:56.040
So anyway, it's about time for format.

00:19:56.700 --> 00:20:00.140
What would you, like, after going through this whole experience, we could do homebrew.

00:20:00.140 --> 00:20:01.320
You could do anaconda.

00:20:01.320 --> 00:20:05.760
You could do download the PKG file from python.org, et cetera, et cetera.

00:20:05.760 --> 00:20:08.480
What would you do if you were setting up a new computer?

00:20:08.480 --> 00:20:09.460
Like on Mac?

00:20:09.460 --> 00:20:10.380
Yeah, on Mac.

00:20:10.380 --> 00:20:10.720
Yeah.

00:20:10.720 --> 00:20:16.800
So I'm a big homebrew fan because it makes upgrading very easy.

00:20:16.800 --> 00:20:22.300
And it's just something that I personally use for other purposes as well.

00:20:22.380 --> 00:20:27.780
So one of the things I usually do, you know, when I set up a new macOS development environment, I upgrade bash.

00:20:28.160 --> 00:20:33.340
So I use bash as my preferred shell and macOS ships with a super old version of bash.

00:20:33.340 --> 00:20:37.740
And with homebrew, it's super easy just to get the latest version of bash.

00:20:37.740 --> 00:20:40.460
And then, you know, a bunch of other command line tools that I use.

00:20:40.460 --> 00:20:43.180
And so I just use that to install Python as well.

00:20:43.180 --> 00:20:44.720
So I kind of like that.

00:20:44.820 --> 00:20:47.580
I mean, Python.org version, it works as well.

00:20:47.580 --> 00:20:54.520
But if you're going to use homebrew anyway, which I think you want to use if you're on a Mac, then I would just keep everything in homebrew.

00:20:54.520 --> 00:20:55.680
Yeah, that's what I'm thinking as well.

00:20:55.680 --> 00:20:56.440
It makes a lot of sense.

00:20:56.440 --> 00:20:57.600
Awesome.

00:20:57.600 --> 00:20:59.140
Both on Mac and on Windows.

00:20:59.140 --> 00:21:02.600
I just always just use the python.org installer.

00:21:02.600 --> 00:21:04.220
Yeah, that's what I've been doing as well.

00:21:04.220 --> 00:21:09.060
But with homebrew, you just type upgrade, you know, and you can have different versions and stuff.

00:21:09.060 --> 00:21:09.540
I don't know.

00:21:09.540 --> 00:21:11.220
I'm thinking of playing with homebrew next time.

00:21:11.300 --> 00:21:12.360
But anyway, very cool.

00:21:12.360 --> 00:21:13.700
Yeah, there's also pyenv.

00:21:13.700 --> 00:21:15.020
So that's sort of the other.

00:21:15.020 --> 00:21:19.700
If you're going to go with homebrew, you could just go, you know, brew installed Python 3.

00:21:19.700 --> 00:21:22.400
And you get sort of one, the latest version of Python 3.

00:21:22.400 --> 00:21:26.040
Or you could install something called pyenv first.

00:21:26.040 --> 00:21:35.440
And then that's another layer of abstraction on top that allows you to switch between different versions of Python, including different versions of Python 3.

00:21:35.440 --> 00:21:38.980
So you can just go, you know, I want Python 3.5 for testing.

00:21:38.980 --> 00:21:41.260
And I'm going to run all of my latest stuff.

00:21:41.260 --> 00:21:44.160
On the Python 3.7 beta version or something like that.

00:21:44.160 --> 00:21:45.780
So that's super nice.

00:21:45.780 --> 00:21:46.920
It's maybe a little bit more advanced.

00:21:46.920 --> 00:21:48.500
So I feel like you're probably there, Mike.

00:21:48.500 --> 00:21:50.760
But for a complete beginner, I'm not sure if I would recommend it.

00:21:50.760 --> 00:21:51.360
Yeah, yeah, yeah.

00:21:51.360 --> 00:21:51.800
Sure, of course.

00:21:51.800 --> 00:21:52.820
I don't think I'm there.

00:21:52.820 --> 00:21:55.680
I've tried it several times and it hasn't worked for me.

00:21:55.680 --> 00:21:56.960
I don't want to go too much longer.

00:21:57.120 --> 00:22:10.540
But what I've started doing on my servers is when I SSH in, part of my shell profile automatically configures the main virtual environment for whatever that purpose of that server is.

00:22:10.540 --> 00:22:14.880
So when I SSH in, I'm actually running just a virtual environment just by default.

00:22:15.440 --> 00:22:20.560
And I was considering doing even that for my Mac and just changing the shell back so it doesn't do something weird.

00:22:20.560 --> 00:22:21.080
I don't know.

00:22:21.080 --> 00:22:23.740
I may get myself into trouble with that, but it's been working so far.

00:22:23.740 --> 00:22:24.720
All right.

00:22:24.720 --> 00:22:30.820
So I want to round this out with just a short little list of 30 amazing Python projects from 2018.

00:22:31.060 --> 00:22:41.140
So there's this thing called MyBridge and MyBridge is a little bit like a readability or a little bit like a flipboard where they kind of keep track of different articles.

00:22:41.140 --> 00:22:44.960
But it's more technology focused than just say Flipboard or Zite, those types of things.

00:22:44.960 --> 00:22:55.280
And the article starts with the MyBridge AI evaluates the quality by considering popularity, engagement, recency, and so on.

00:22:55.340 --> 00:23:02.660
So apparently they have this AI, which is kind of cool, that goes through and looks at human interaction with all these articles, these tech articles in the Python space,

00:23:02.660 --> 00:23:10.080
and then says, here's the articles that our community sort of interacted with that they really liked, or packages actually in this case.

00:23:10.080 --> 00:23:18.160
So let me just give you a quick rundown on these just to kind of give you all some exposure and like, oh, hey, I hadn't heard of that package.

00:23:18.160 --> 00:23:19.140
That's pretty cool.

00:23:19.140 --> 00:23:20.780
And then you guys can jump in and give me some thoughts.

00:23:21.200 --> 00:23:25.120
So I'll go from the least popular to the most popular.

00:23:25.120 --> 00:23:33.720
So number 30 is PDF tab extract, which is a set of tools for getting tables out of PDF documents, which is pretty cool.

00:23:33.720 --> 00:23:35.720
And data mining on scan documents, pretty sweet.

00:23:35.720 --> 00:23:46.140
There's number 28 is surprise, which is a scikit learn extension for building and analyzing a building a recommender system.

00:23:46.320 --> 00:23:49.360
So you can like say, you might also like this, which is kind of cool.

00:23:49.360 --> 00:23:51.460
Number 27, we won't do all of them.

00:23:51.460 --> 00:23:53.500
That's why I'm skipping number 29.

00:23:53.500 --> 00:24:03.100
Number 27 is eel, which is basically a simple equivalent of the Python's version of an Electron JS system.

00:24:03.100 --> 00:24:03.960
What do you guys think of that?

00:24:03.960 --> 00:24:06.420
How have we not covered that already?

00:24:06.420 --> 00:24:11.960
I think we might have mentioned it because we have been on a, I think we've covered it, but there's two variations.

00:24:11.960 --> 00:24:16.160
And the sort of story that seems to go along with this is like, it's a simple library.

00:24:16.160 --> 00:24:17.800
It's not really like fully.

00:24:17.800 --> 00:24:22.740
There's my understanding that you can build simple apps, but not like full on massive apps.

00:24:22.740 --> 00:24:25.940
But if you could build full on massive apps, I'd be all over this.

00:24:25.940 --> 00:24:26.400
That's awesome.

00:24:26.400 --> 00:24:36.920
Number 25, clairvoyant, a Python program that identifies and monitors historical cues for short, short term stock movement and stuff.

00:24:37.540 --> 00:24:40.480
So I don't do really any stock trading.

00:24:40.480 --> 00:24:43.660
I mean, I put money into mutual funds, so I don't really care that much about it.

00:24:43.660 --> 00:24:51.440
But the reason I bring this up is Python actually is pretty involved in the whole stock trading automation and real time stuff.

00:24:51.440 --> 00:24:58.080
There's actually a really good documentary called The Wall Street Code that goes into all these programmers that are building like AIs and stuff in Python.

00:24:58.080 --> 00:24:59.140
And it's pretty cool.

00:24:59.140 --> 00:25:00.380
So it's free on YouTube.

00:25:00.380 --> 00:25:00.880
Nice.

00:25:00.880 --> 00:25:01.200
Yeah.

00:25:01.200 --> 00:25:03.660
Brian, are you a fan of Mr. Robot or Dan?

00:25:03.660 --> 00:25:04.180
Either you guys?

00:25:04.180 --> 00:25:05.180
Yeah, I was just going to say.

00:25:05.180 --> 00:25:06.180
No?

00:25:06.180 --> 00:25:06.580
No.

00:25:06.580 --> 00:25:07.260
Oh, man.

00:25:07.260 --> 00:25:07.860
Dan?

00:25:07.860 --> 00:25:08.500
I like it.

00:25:08.500 --> 00:25:08.720
Yeah.

00:25:08.720 --> 00:25:09.540
Good show.

00:25:09.540 --> 00:25:11.420
I think it went a little weird in episode two.

00:25:11.420 --> 00:25:12.660
I was sorry, season two.

00:25:12.660 --> 00:25:14.980
But like the first year, I was just like blown away.

00:25:14.980 --> 00:25:24.040
So there's this thing called F Society, which is a hacking tools pack for penetration testing in Python, which of course, Python is very big in the cybersecurity space.

00:25:24.040 --> 00:25:30.560
You might, if you want to like check your own stuff, run some of these tools against your things before someone else does.

00:25:31.200 --> 00:25:32.880
We talked about Kenneth Wright's last time.

00:25:32.880 --> 00:25:36.020
And number 18 was Maya, date time for humans.

00:25:36.020 --> 00:25:37.280
Better exceptions.

00:25:37.280 --> 00:25:38.400
I think we covered that as well.

00:25:38.400 --> 00:25:47.100
16, API star, a really cool, expressive Python 3, 5 based API from Tom Christie.

00:25:47.100 --> 00:25:48.440
Same guy that does Django rest framework.

00:25:48.600 --> 00:25:52.220
But this is like the re-envisioned Python 3 version, which is cool.

00:25:52.220 --> 00:25:55.500
Micro Python, very awesome for little projects.

00:25:55.500 --> 00:25:57.060
spaCy, industrial strength.

00:25:57.060 --> 00:25:59.880
Natural language processor is number six.

00:25:59.880 --> 00:26:02.760
Number two was PyTorch for machine learning.

00:26:02.760 --> 00:26:06.220
That seems to be sort of becoming one of the main machine learning libraries.

00:26:06.400 --> 00:26:10.000
Number one, home assistant for open source home automation.

00:26:10.000 --> 00:26:10.580
Very cool.

00:26:10.580 --> 00:26:16.260
I keep dreaming of like creating some IoT thing with MicroPython and then plugging it into home assistant.

00:26:16.260 --> 00:26:19.560
But I just have to figure out what that thing is going to be.

00:26:19.560 --> 00:26:23.180
It's a solution looking for a problem, right?

00:26:23.180 --> 00:26:25.800
It's a good solution, I think.

00:26:25.800 --> 00:26:27.520
Yeah, yeah, I think so.

00:26:27.520 --> 00:26:31.600
It's a good solution if I could just find a problem to like apply it to.

00:26:31.600 --> 00:26:34.040
Those that I read off there, are those surprising?

00:26:34.040 --> 00:26:35.660
Any of those like super interesting to you guys?

00:26:35.660 --> 00:26:36.920
I'm a huge fan of MicroPython.

00:26:36.920 --> 00:26:39.660
So I just learned a little bit more about it.

00:26:39.660 --> 00:26:46.060
And so it's basically this like super small and lean re-implementation of Python 3, I guess,

00:26:46.060 --> 00:26:51.040
that runs on these like super low power, low computational power microcontrollers.

00:26:51.040 --> 00:26:58.080
And it's, I mean, it's just so cool to be running Python on tiny, tiny machines that have very little RAM.

00:26:58.080 --> 00:27:00.360
And, you know, we're talking kilobytes and stuff.

00:27:00.360 --> 00:27:03.140
And it's just insane that you can program this with Python.

00:27:03.140 --> 00:27:03.920
Yeah, yeah.

00:27:03.920 --> 00:27:04.620
So cool.

00:27:04.720 --> 00:27:08.040
Yeah, and you got one of those little in your goodie bag at PyCon, right?

00:27:08.040 --> 00:27:11.500
They did like a video review of that on YouTube.

00:27:11.500 --> 00:27:14.840
And I was just, you know, all giddy about it, just playing with this thing.

00:27:14.840 --> 00:27:18.300
It just plugs into your USB and you can, you know, start running Python on this thing.

00:27:18.300 --> 00:27:20.300
That's a really good implementation they did.

00:27:20.300 --> 00:27:21.180
Brian, how about you?

00:27:21.260 --> 00:27:23.340
Yeah, I guess I'd have to second that.

00:27:23.340 --> 00:27:24.860
MicroPython is awesome.

00:27:24.860 --> 00:27:28.920
And a bunch of the Adafruit products run, are able to run it.

00:27:28.920 --> 00:27:31.580
And yeah, it's all fun.

00:27:31.580 --> 00:27:35.140
API store is something I've been meaning to try still.

00:27:35.140 --> 00:27:37.420
I haven't done any projects with it.

00:27:37.420 --> 00:27:38.960
But it looks fun.

00:27:39.100 --> 00:27:39.920
Yeah, it definitely looks fun.

00:27:39.920 --> 00:27:40.840
Quite cool.

00:27:40.840 --> 00:27:41.040
All right.

00:27:41.040 --> 00:27:42.960
There's one final thing I want to cover.

00:27:42.960 --> 00:27:48.500
We had the GDPR stuff come out, basically come into effect at the end of last week.

00:27:48.880 --> 00:27:56.100
So just a quick point to an article from our friend Chris Medina at tryexceptpass.org slash article slash GDPR.

00:27:56.100 --> 00:27:58.020
Sort of a take for developers.

00:27:58.020 --> 00:28:04.200
And if you haven't got your stuff all in line yet, please consider doing so for your own good.

00:28:04.200 --> 00:28:06.960
Pythonbytes.fm is all up and ready.

00:28:06.960 --> 00:28:10.980
So yeah, Dan, you probably had to do the same for real Python, right?

00:28:10.980 --> 00:28:15.660
Yeah, some sleepless nights because it's, well, everything is up for interpretation, right?

00:28:15.660 --> 00:28:19.620
So it's kind of hard to, yeah, just to put it into concrete terms.

00:28:19.620 --> 00:28:25.880
But I mean, it's just been nuts, you know, that now that the deadline for that law to go into effect is passed.

00:28:25.880 --> 00:28:27.980
Like we've seen some services shut down.

00:28:27.980 --> 00:28:31.900
I think like Instapaper is a service that I really, I've been using it for a long time.

00:28:31.900 --> 00:28:34.280
And they just shut down in Europe.

00:28:34.280 --> 00:28:36.340
They say it's temporary, but, you know, who knows?

00:28:36.340 --> 00:28:37.020
Yeah, we'll see.

00:28:37.020 --> 00:28:38.400
It's temporary until it's not.

00:28:38.400 --> 00:28:40.220
But yeah, hopefully they get that figured out.

00:28:40.220 --> 00:28:41.080
But yeah, I saw that.

00:28:41.080 --> 00:28:42.960
That was quite the discussion on Hacker News.

00:28:43.520 --> 00:28:47.900
The other thing I wanted to bring up, which I don't know, this is pretty cool to me.

00:28:47.900 --> 00:28:51.080
I deal with an insane amount of large files.

00:28:51.080 --> 00:28:53.440
And I use Dropbox mostly for that.

00:28:53.440 --> 00:29:00.440
Like to give you a sense, like I have the terabyte plan and it's like sometimes gets too full and I have to clean up my Dropbox storage.

00:29:00.440 --> 00:29:03.740
But my hard drive doesn't really want to sync that much stuff.

00:29:03.740 --> 00:29:06.760
Did you guys know that Dropbox released this thing called Smart Sync?

00:29:06.900 --> 00:29:07.220
Yes.

00:29:07.220 --> 00:29:10.780
And I've been wanting to use it, but it installs a kernel module.

00:29:10.780 --> 00:29:14.260
And so I was like, ah.

00:29:14.260 --> 00:29:15.380
Right.

00:29:15.380 --> 00:29:17.780
Because it's got to get into the file driver.

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

00:29:18.060 --> 00:29:30.680
So if people have this problem, Dropbox came out with this thing called Smart Sync that will basically give you and your Explorer and your Open Dialogues and Windows or Mac a view which pretends as if the files are there.

00:29:30.680 --> 00:29:36.300
And as soon as you try to interact with them, even from like the command line, they will automatically download if they're not.

00:29:36.300 --> 00:29:41.600
Which is basically lets you sync nothing but what you interact with, which is really amazing.

00:29:41.600 --> 00:29:42.620
It sounds super cool.

00:29:42.620 --> 00:29:49.600
Like I have a lot of trust in the Dropbox engineering team and like if it works that smoothly, I think it's an amazing feature.

00:29:49.600 --> 00:29:52.040
Sort of been hesitant about enabling it.

00:29:52.040 --> 00:29:52.220
All right.

00:29:52.220 --> 00:29:53.680
When you enable it, you tell us how it goes.

00:29:53.680 --> 00:29:57.400
I'll probably try it out.

00:29:57.400 --> 00:29:59.600
I'll give you guys a report eventually.

00:29:59.600 --> 00:30:00.100
Cool.

00:30:00.100 --> 00:30:00.520
All right.

00:30:00.520 --> 00:30:01.400
Well, I think that's it.

00:30:01.400 --> 00:30:03.820
Unless Brian or Dan, you have extra stuff to share with everyone?

00:30:03.820 --> 00:30:04.140
Yeah.

00:30:04.140 --> 00:30:04.700
Right on.

00:30:04.700 --> 00:30:04.980
Well.

00:30:04.980 --> 00:30:05.820
I think I'm all good.

00:30:05.820 --> 00:30:06.100
Yeah.

00:30:06.100 --> 00:30:06.660
Yeah.

00:30:06.660 --> 00:30:07.500
Great to be back.

00:30:07.500 --> 00:30:08.400
Yeah.

00:30:08.400 --> 00:30:09.240
Definitely.

00:30:09.880 --> 00:30:10.860
Brian, thank you so much.

00:30:10.860 --> 00:30:16.540
And Dan, thanks for dropping in and adding some spice to the mix for our whole podcast here.

00:30:16.540 --> 00:30:17.120
Awesome.

00:30:17.120 --> 00:30:17.660
Thanks, guys.

00:30:17.660 --> 00:30:17.980
Yep.

00:30:17.980 --> 00:30:18.480
Bye, everyone.

00:30:18.480 --> 00:30:18.740
Bye.

00:30:18.740 --> 00:30:19.100
Bye.

00:30:19.100 --> 00:30:22.200
Thank you for listening to Python Bytes.

00:30:22.200 --> 00:30:24.760
Follow the show on Twitter via at Python Bytes.

00:30:24.760 --> 00:30:27.640
That's Python Bytes as in B-Y-T-E-S.

00:30:27.640 --> 00:30:31.040
And get the full show notes at Pythonbytes.fm.

00:30:31.040 --> 00:30:35.400
If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.

00:30:35.400 --> 00:30:38.140
We're always on the lookout for sharing something cool.

00:30:38.760 --> 00:30:41.500
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:30:41.500 --> 00:30:45.120
Thank you for listening and sharing this podcast with your friends and colleagues.

