WEBVTT

00:00:00.001 --> 00:00:03.360
Python is said to be a language that comes with batteries included.

00:00:03.360 --> 00:00:06.500
It has many meanings depending on the level you're focusing on.

00:00:06.500 --> 00:00:09.640
The lowest, it's a very rich and expressive language.

00:00:09.640 --> 00:00:16.140
Most commonly, this phrase means Python has a very powerful and comprehensive standard library.

00:00:16.140 --> 00:00:18.200
Itertools or elementary, anyone?

00:00:18.200 --> 00:00:23.620
But more holistically, most of the batteries are external, interchangeable ones from PyPI.

00:00:23.840 --> 00:00:30.120
Right now on PyPI.io, there are over 97,000 packages listed there.

00:00:30.120 --> 00:00:31.300
That's fantastic.

00:00:31.300 --> 00:00:34.740
However, it does lead to a discoverability problem.

00:00:34.740 --> 00:00:37.700
What options do you have for admin backends on web apps?

00:00:37.700 --> 00:00:40.920
How about cryptography or raw socket programming and so on?

00:00:40.920 --> 00:00:43.000
This week, Matt Makai is back with me.

00:00:43.000 --> 00:00:46.420
Remember him talking about deployments on episode 26 last year?

00:00:46.420 --> 00:00:48.900
This time, we're talking about Awesome Python,

00:00:48.900 --> 00:00:54.220
a website and open source project attempting to categorize and sort of rank these options.

00:00:54.220 --> 00:01:00.240
This is Talk Python To Me, episode 96, recorded January 16th, 2016.

00:01:00.240 --> 00:01:03.720
Developers, developers, developers, developers, developers.

00:01:03.720 --> 00:01:06.880
I'm a developer in many senses of the word

00:01:06.880 --> 00:01:11.240
because I make these applications, but I also use these verbs to make this music.

00:01:11.240 --> 00:01:15.780
I construct it line by line, just like when I'm coding another software design.

00:01:15.780 --> 00:01:19.020
In both cases, it's about design patterns.

00:01:19.020 --> 00:01:20.480
Anyone can get the job done.

00:01:20.480 --> 00:01:22.000
It's the execution that matters.

00:01:22.000 --> 00:01:23.460
I have many interests.

00:01:23.460 --> 00:01:24.200
Sometimes you can fly to Python.

00:01:24.200 --> 00:01:27.800
Welcome to Talk Python To Me, a weekly podcast on Python,

00:01:27.800 --> 00:01:30.860
the language, the libraries, the ecosystem, and the personalities.

00:01:30.860 --> 00:01:32.980
This is your host, Michael Kennedy.

00:01:32.980 --> 00:01:34.980
Follow me on Twitter where I'm @mkennedy.

00:01:34.980 --> 00:01:38.860
Keep up with the show and listen to past episodes at talkpython.fm

00:01:38.860 --> 00:01:41.440
and follow the show on Twitter via at Talk Python.

00:01:42.020 --> 00:01:47.900
This episode has been sponsored by AnacondaCon from Continuum Analytics and by Hired.

00:01:47.900 --> 00:01:50.000
Thank you both for supporting the podcast.

00:01:50.000 --> 00:01:51.340
Hey, Matt.

00:01:51.340 --> 00:01:53.080
Welcome back to Talk Python.

00:01:53.080 --> 00:01:53.860
Thanks, Michael.

00:01:53.860 --> 00:01:54.760
It's good to be back.

00:01:54.760 --> 00:01:55.940
It's great to have you back.

00:01:55.940 --> 00:01:59.840
You just pointed out a little bit ago that it's been 70 episodes

00:01:59.840 --> 00:02:04.760
since you were on episode 26 to talk about deployments with Python.

00:02:04.760 --> 00:02:06.020
I can't believe it's been so long.

00:02:06.020 --> 00:02:07.360
It's hard to believe.

00:02:07.360 --> 00:02:09.440
It's been like a year and a half, almost two years.

00:02:09.860 --> 00:02:10.320
Yeah, yeah.

00:02:10.320 --> 00:02:11.260
Well, that was a great episode.

00:02:11.260 --> 00:02:12.160
It was really popular.

00:02:12.160 --> 00:02:16.040
And, you know, the world has changed a lot since then.

00:02:16.040 --> 00:02:19.880
So that's a lot of cool things we're going to be talking about today.

00:02:19.880 --> 00:02:23.660
We're going to focus on stuff that we found, mostly you have found,

00:02:23.660 --> 00:02:25.720
that's awesome in the Python community.

00:02:25.720 --> 00:02:29.440
But before we get into those, let's, you know, 70 episodes ago.

00:02:29.440 --> 00:02:32.080
I'm not sure everybody can remember back 70 episodes.

00:02:32.080 --> 00:02:33.240
What do you do day to day?

00:02:33.580 --> 00:02:33.740
Sure.

00:02:33.740 --> 00:02:36.340
So I'm a developer evangelist at Twilio.

00:02:36.340 --> 00:02:40.060
And Twilio makes it easy for developers to add communications.

00:02:40.060 --> 00:02:44.240
So if you want to send a text message or you want to make a phone call with Python

00:02:44.240 --> 00:02:48.360
or any programming language or add video chat to an application,

00:02:48.360 --> 00:02:49.540
you can do that with Twilio.

00:02:49.540 --> 00:02:54.000
What I do as a developer evangelist, I am, first off, a software developer.

00:02:54.000 --> 00:02:55.040
I write a lot of code.

00:02:55.040 --> 00:02:56.800
Most of my code is open source.

00:02:56.800 --> 00:03:03.920
So it'll be examples for how to use Twilio or even just how to create something as a developer.

00:03:03.920 --> 00:03:05.240
It doesn't have to use Twilio.

00:03:05.240 --> 00:03:11.380
And then I travel and speak at tech conferences all on software development.

00:03:11.380 --> 00:03:12.980
No marketing fluff.

00:03:12.980 --> 00:03:18.800
Just really just being a software developer, I get to write code, explain code, and teach other people,

00:03:18.800 --> 00:03:20.480
which is just absolutely awesome.

00:03:20.480 --> 00:03:21.160
Yeah, that's great.

00:03:21.160 --> 00:03:25.640
I always, I've always thought that these developer evangelist jobs were just fantastic, right?

00:03:25.640 --> 00:03:28.200
Like it's part research and play.

00:03:28.200 --> 00:03:30.820
It's part telling people about stuff that's cool.

00:03:30.820 --> 00:03:34.440
And you have a lot of freedom to kind of learn and explore, right?

00:03:34.440 --> 00:03:34.960
Yeah.

00:03:34.960 --> 00:03:38.620
I mean, the big thing for me is just getting the time to create projects.

00:03:38.620 --> 00:03:41.820
Like when I have an idea, I can just go sit down, write some code, implement it,

00:03:41.820 --> 00:03:42.820
and then show it to other people.

00:03:42.820 --> 00:03:45.140
It's really, it's one of my favorite parts about it.

00:03:45.140 --> 00:03:50.540
How much does that feedback like tweak or inform the APIs that Twilio uses?

00:03:50.540 --> 00:03:51.480
Oh, a lot.

00:03:51.480 --> 00:03:52.480
Coming back from the evangelist.

00:03:52.480 --> 00:03:52.740
Yeah.

00:03:52.800 --> 00:03:56.760
I mean, one of the best parts about the gig is I get to use all of our APIs before they come out.

00:03:56.760 --> 00:04:02.540
So before anybody gets their hands on them, myself and some of my colleagues are like testing out the APIs,

00:04:02.540 --> 00:04:04.920
giving feedback to the API teams.

00:04:04.920 --> 00:04:10.060
And that helps to improve the results that ultimately get into the hands of developers.

00:04:10.060 --> 00:04:10.860
Oh, that's great.

00:04:10.860 --> 00:04:22.240
Now, if I go out and search for something on Python, there's a very good chance that something that you are responsible for that's not directly part of Twilio will be like the number one Google result for my answer.

00:04:22.240 --> 00:04:23.360
You do full stack Python, right?

00:04:23.480 --> 00:04:23.720
Yeah.

00:04:23.720 --> 00:04:27.900
So I'm the author of full stack Python, which is a open source project.

00:04:27.900 --> 00:04:29.560
I started over four years ago.

00:04:29.940 --> 00:04:33.400
And the whole idea behind full stack Python was I'm a Python developer.

00:04:33.400 --> 00:04:35.600
And I had this before I joined Twilio.

00:04:35.600 --> 00:04:39.840
I had a bunch of junior developers that were joining my team and they kept sending me emails.

00:04:39.840 --> 00:04:41.680
Hey, what's a what's a whiskey server?

00:04:41.680 --> 00:04:42.380
Like, what is that?

00:04:42.380 --> 00:04:48.580
And I kept sending all these emails and I was like, this would probably be relevant to much more than just our team.

00:04:48.580 --> 00:04:54.500
So I started putting together a project with pages that had explanations on every single Python topic.

00:04:54.500 --> 00:04:56.440
And it's just expanded out from there.

00:04:56.440 --> 00:04:57.820
I pretty much work on it every day.

00:04:57.820 --> 00:05:02.020
And it's it's read by over 80,000 developers a month at this point.

00:05:02.020 --> 00:05:02.980
That's fantastic.

00:05:02.980 --> 00:05:04.700
And you have a book that goes with it as well, right?

00:05:04.700 --> 00:05:09.200
Yeah, that's what I was on for in episode 26 back 70 episodes ago.

00:05:09.200 --> 00:05:13.700
It's about it's a step by step guide to deploying Python applications.

00:05:13.700 --> 00:05:16.420
So if you've never done it before, you've built your first web application.

00:05:16.880 --> 00:05:31.660
This is every single step to get a virtual private server and to stand everything up that you need DNS, the whiskey server, reverse proxy, all those things that trip developers up and certainly trip me up several years ago when I was trying to deploy my own applications.

00:05:31.660 --> 00:05:42.900
Yeah, it feels to me like that kind of that kind of information, those kinds of things are the things that you kind of it's a lot of work and a lot of research to get it all put all the pieces combined just right.

00:05:42.900 --> 00:05:46.420
So your web apps work great, but then you write it down, you put it in a script and you forget about it.

00:05:46.420 --> 00:05:50.460
So having like a book as a reference to learn it the first time and then keep it around is really cool.

00:05:50.460 --> 00:05:51.220
Yeah, exactly.

00:05:51.220 --> 00:05:56.920
So and as we talked about on that episode, first, I teach how to do it manually and then we automate it with Ansible.

00:05:56.920 --> 00:06:00.780
So it's a pretty good way to kind of understand the nitty gritty and then automate it.

00:06:00.780 --> 00:06:05.260
And you know what, if you want to forget about it at that point and just use the scripts, you can, but at least you learned it the first time.

00:06:05.260 --> 00:06:06.040
Yeah, absolutely.

00:06:06.040 --> 00:06:07.740
You'll understand that when you come back, right?

00:06:07.740 --> 00:06:11.080
You'll know what you're doing if you need to need to come back and tweak the automation.

00:06:11.080 --> 00:06:11.580
That's cool.

00:06:11.580 --> 00:06:15.440
Now we're going to talk about Awesome Python, the project, the GitHub project.

00:06:15.440 --> 00:06:20.700
But before we get into that, how about we do a quick update on our Python for Entrepreneurs course that you and I are writing together?

00:06:20.700 --> 00:06:21.600
Yeah, let's do it.

00:06:21.600 --> 00:06:22.360
Yeah, let's do it.

00:06:22.360 --> 00:06:24.220
So that course is almost done.

00:06:24.320 --> 00:06:28.200
I have to say, this one is, how shall I put it, longer than I expected.

00:06:28.200 --> 00:06:31.860
A little longer to write than I expected.

00:06:31.860 --> 00:06:37.240
But I haven't even told you, I've finished almost all the chapters I have to record.

00:06:37.240 --> 00:06:38.840
They're off to editors.

00:06:38.840 --> 00:06:43.000
I have basically one and a half chapters left to record and I'll be done.

00:06:43.000 --> 00:06:45.920
And then that just leaves a few more to go and that class will be all wrapped up.

00:06:45.920 --> 00:06:57.740
Yeah, and for me, I'm just finishing up some of the second Git chapter and then we're going to get into deployments and SEO and everything that goes along with actually running the application that you build.

00:06:57.740 --> 00:06:59.480
So I'm really excited.

00:06:59.480 --> 00:07:02.060
I am so excited to get this thing out to people.

00:07:02.060 --> 00:07:07.900
I know people have been watching it in early access mode, which you get from just buying, pre-ordering the course.

00:07:07.900 --> 00:07:11.160
But I'm excited for it to be like really wrapped up and done.

00:07:11.160 --> 00:07:20.440
Yeah, I really hope this turns out to be a great resource for the Python community around sort of this whole lifecycle of idea to web app to deployment to business.

00:07:20.440 --> 00:07:21.220
It'll be fun.

00:07:21.220 --> 00:07:26.160
Okay, so we'll come back and let people know when that's actually finished, but it'll be soon.

00:07:26.160 --> 00:07:28.000
I promise those of you who are out there waiting.

00:07:28.000 --> 00:07:30.300
So let's talk about some stuff that's awesome.

00:07:30.300 --> 00:07:30.940
Sure.

00:07:30.940 --> 00:07:37.400
So the awesome Python repository has the great slogan, life is short, you need Python.

00:07:37.740 --> 00:07:41.120
And it is one of many awesome lists.

00:07:41.120 --> 00:07:48.680
So the awesome list popped up on GitHub where people just started throwing together lists of tools and resources that they were using.

00:07:48.680 --> 00:07:53.080
And so this repository came up in the Python community.

00:07:53.080 --> 00:07:57.420
And so this is a GitHub Vinta slash awesome Python.

00:07:57.660 --> 00:08:00.740
It was created by Vinta Chen about a little over two years ago.

00:08:00.740 --> 00:08:15.580
And this is kind of the main one for the Python ecosystem that goes over all of the different open source projects and categorizes them, whether they're a task queue or web framework has some sort of basic categorization for each of the projects.

00:08:15.580 --> 00:08:22.100
Yeah, I think this is really handy when you don't know what it is you need for something.

00:08:22.100 --> 00:08:24.460
And so I don't know how many projects are listed here.

00:08:24.460 --> 00:08:29.220
I probably could have gone through GitHub source code and like written some script or something to figure it out.

00:08:29.240 --> 00:08:35.340
But it seems to me like it's close to like 500, 400 projects.

00:08:35.340 --> 00:08:36.700
And they're all categorized.

00:08:36.700 --> 00:08:38.420
Like you said, here's admin backends.

00:08:38.420 --> 00:08:40.180
Here's authentication.

00:08:40.180 --> 00:08:41.280
Here's caching.

00:08:41.280 --> 00:08:46.520
And maybe under caching, there's like 10 choices on how you can do caching and plug that into your apps.

00:08:47.300 --> 00:08:58.560
So if you don't know what you need or what even a good choice for caching is in Python, you're just like, hey, I know I need caching, but that's as much as I know, you know, drop into awesome-python.com.

00:08:58.560 --> 00:09:03.240
And then you can go to the caching section and, you know, pick.

00:09:03.240 --> 00:09:14.100
Yeah, so I think for me as a fairly senior developer, what I think these lists are most useful for is if you've already been programming in one language, say you're a Java developer.

00:09:14.280 --> 00:09:17.700
Like I actually came from Java and then started in Python several years ago.

00:09:17.700 --> 00:09:22.160
And I didn't know what the equivalent to a web application server was.

00:09:22.160 --> 00:09:23.260
Well, that's a WSGI server.

00:09:23.260 --> 00:09:28.960
And with the awesome lists, I can see at a glance, like what should I be using for caching in Python?

00:09:28.960 --> 00:09:39.700
So if you were already familiar with all the conceptual ideas, like a task queue, like a web framework, then you can see the implementations in a different programming language.

00:09:39.700 --> 00:09:52.220
So you could go to the awesome Ruby repository and see the equivalents to the Python projects that are out there in case you just happen to want to learn Ruby or you're, you know, on the job and you have to suddenly write some Ruby code.

00:09:52.220 --> 00:09:53.580
Yeah, I think exactly.

00:09:53.580 --> 00:10:02.580
If you know I need caching and you want to say these are the five things I should probably research and you can compare them pretty quickly because, you know, you'll open up the GitHub page.

00:10:02.580 --> 00:10:05.780
You can tell, does this have five stars or 5,000 stars, right?

00:10:05.780 --> 00:10:06.660
How active is it?

00:10:06.660 --> 00:10:08.000
What are the deployments?

00:10:08.000 --> 00:10:08.580
Things like that.

00:10:08.580 --> 00:10:10.420
It's really good for that.

00:10:10.420 --> 00:10:17.100
If you totally don't even know what you need to look for, you know, maybe something like full stack Python makes more sense, right?

00:10:17.100 --> 00:10:18.920
You want to talk about how you see those differently?

00:10:18.920 --> 00:10:33.200
Yeah, so there is a there's a bit of difference between an awesome list and what I'm trying to create with full stack Python, which is the awesome list is really a laundry list of all of the open source code that is out there that might be applicable to your your project.

00:10:33.340 --> 00:10:45.060
But again, going back to task use, for instance, if you're a junior developer or you're in a boot camp or you're just starting to program and you don't know what a task queue is, well, seeing a list of implementations really is not going to help you.

00:10:45.060 --> 00:10:50.640
It's not going to sell re RQ and these different implementations.

00:10:50.640 --> 00:10:52.860
You don't know what they're going to do for you.

00:10:52.860 --> 00:10:59.760
So that's why I have like a task queue page that explains the conceptual idea and then explains the differences between the implementations.

00:10:59.940 --> 00:11:03.100
So I think what's missing from an awesome list is the context.

00:11:03.100 --> 00:11:15.100
But if you're a more senior developer, you've already been working in one ecosystem and you're trying to switch over to another one or you're just trying to see what other implementations are out there compared to the implementations you've been using that.

00:11:15.100 --> 00:11:16.100
I mean, it's great for that.

00:11:16.100 --> 00:11:21.220
Doesn't it just kind of gets past the verbiage and gives you all the implementations that you need?

00:11:21.220 --> 00:11:23.820
Yeah, I find having been a programmer for a long time.

00:11:23.960 --> 00:11:32.680
I find these lists really, really helpful for discovering things that, you know, maybe they're not at the top of Google, but actually turn out to be just the thing that I need.

00:11:32.680 --> 00:11:37.520
So but yeah, it's when you're totally new, maybe maybe it's not the best place to start.

00:11:37.520 --> 00:11:39.720
But still, even if you're new, go check out the project.

00:11:39.720 --> 00:11:41.800
It's you'll find it interesting, I think.

00:11:42.180 --> 00:11:50.220
So you and I chose some things out of this awesome Python list that we thought would be fun to highlight as part of the show.

00:11:50.220 --> 00:11:52.260
Yeah, my criteria for this.

00:11:52.260 --> 00:11:55.960
So we picked 10 libraries at random that are listed in the awesome Python.

00:11:55.960 --> 00:12:02.840
And by the way, Talk Python To Me is not one of the 10 we chose, but it is listed on an awesome Python as it should be.

00:12:02.840 --> 00:12:03.460
Thank you.

00:12:03.460 --> 00:12:04.540
And so is Full Stack Python.

00:12:05.320 --> 00:12:19.320
And so the criteria that we used were projects that were not completely obvious to the community, but that are almost everywhere, or that have like a ton of potential to really impact the Python ecosystem.

00:12:19.320 --> 00:12:26.400
So for example, we didn't choose Django because Django is talked about widely and used widely in the Python ecosystem.

00:12:26.700 --> 00:12:31.460
But we did pick a CMS that is powered by Django under the cover.

00:12:31.460 --> 00:12:35.940
So the CMS runs on top of Django, and we'll get to that in a few minutes.

00:12:35.940 --> 00:12:45.660
So that's sort of the criteria we used to pick 10 projects at random that we wanted to highlight because they're important to the Python ecosystem, or they have potential to become really important in the future.

00:12:45.660 --> 00:12:55.980
I think that's really interesting and really great because it's while we could do a show where we just go and say, let's just go find the 10 most downloaded packages on PyPI.

00:12:55.980 --> 00:12:57.600
That would actually be pretty interesting.

00:12:57.600 --> 00:13:02.880
But I think here we're going to hopefully expose people to things that are like, oh, I didn't even know that existed.

00:13:02.880 --> 00:13:03.720
That's going to be awesome.

00:13:03.720 --> 00:13:04.720
I'm going to go check it out.

00:13:04.720 --> 00:13:06.800
So let's see if we can deliver on that, huh?

00:13:06.800 --> 00:13:07.640
Exactly.

00:13:07.640 --> 00:13:08.380
All right.

00:13:08.380 --> 00:13:09.020
You want to dive in?

00:13:09.020 --> 00:13:09.880
Yeah, let's get started.

00:13:09.880 --> 00:13:19.840
So the first thing that I'm really happy to see that's on our list is something that helps us move from legacy Python to Python, or as some people say, from Python 2 to Python 3.

00:13:19.840 --> 00:13:20.580
Sure.

00:13:20.580 --> 00:13:21.300
Yeah.

00:13:21.300 --> 00:13:24.100
So this is the library 6.

00:13:24.100 --> 00:13:28.100
So 6 is a Python 2 to 3 compatibility library.

00:13:28.100 --> 00:13:39.400
And this is one that you're not necessarily going to build an entire application around, but it is incredibly useful for developers who have built a Python 2 library.

00:13:39.620 --> 00:13:42.620
And now they want to support both Python 2 and 3.

00:13:42.620 --> 00:13:44.740
So you can think about it as a bridge.

00:13:44.740 --> 00:13:51.380
6 is a bridge from Python 2 to Python 3 and allows you to support both ecosystems at once.

00:13:51.380 --> 00:13:57.740
So it's really providing utility functions to smooth over some of the differences between the Python versions.

00:13:57.740 --> 00:14:07.120
And the goal is really to have that Python code that you're writing for your own library be compatible with both Python 2 and Python 3.

00:14:07.120 --> 00:14:07.480
Right.

00:14:07.480 --> 00:14:15.960
So where there's some kind of difference versus, you know, like raw input versus input or bytes versus stir, things like that.

00:14:15.960 --> 00:14:22.600
You can use this library and it will know which version of Python it's running on and it will, you know, switch between them.

00:14:22.600 --> 00:14:22.860
Right.

00:14:22.860 --> 00:14:23.160
Yep.

00:14:23.280 --> 00:14:23.720
Exactly.

00:14:23.720 --> 00:14:32.740
So if you're using Python 2.6 or above Python 2.6, 2.7, and then you want to support Python 3, for example, the syntax compatibility.

00:14:33.100 --> 00:14:35.160
So we've got print functions that have changed.

00:14:35.160 --> 00:14:40.100
We have other tech, the way that Unicode is handled.

00:14:40.100 --> 00:14:46.940
All those things need to be either smoothed over in your own code or you can just use 6 as a dependency.

00:14:46.940 --> 00:14:49.540
And it's only one Python file, which is awesome.

00:14:49.680 --> 00:14:51.420
So you can just copy this into your project.

00:14:51.420 --> 00:15:00.540
And then this helps you to smooth over those differences in that would otherwise come up because you're trying to support both 2 and 3.

00:15:00.540 --> 00:15:00.900
Right.

00:15:00.900 --> 00:15:07.240
And hopefully you can do this without having if Python 3, this code, if Python 2, that code.

00:15:07.240 --> 00:15:13.560
But right, just leveraging this library and presumably somewhere deep inside of it, it's doing those types of things for you.

00:15:13.720 --> 00:15:16.940
So you mentioned some of the areas that you can help with.

00:15:16.940 --> 00:15:18.060
What else does it cover?

00:15:18.060 --> 00:15:19.120
Where am I to use this?

00:15:19.120 --> 00:15:25.320
For example, if you have unit test assertions in your code or you're renaming modules and attributes.

00:15:25.320 --> 00:15:40.080
So there's actually a huge laundry list of areas that you may not be that intuitive if you're a Python developer, that if you're building a library for others to use, sort of it just crops up as you're looking to port from 2 to 3.

00:15:40.080 --> 00:15:42.320
And that's really where this would come in.

00:15:42.320 --> 00:15:42.640
Yeah.

00:15:42.640 --> 00:15:43.180
Okay, cool.

00:15:43.180 --> 00:15:51.600
Yeah, I remember there's like a module, something like copy underscore reg in Python 2 and it's copy reg without the underscore in Python 3 or vice versa.

00:15:51.600 --> 00:15:52.740
You know, things like that, right?

00:15:52.740 --> 00:15:55.160
Like, why are these so just barely different?

00:15:55.160 --> 00:15:55.880
This is crazy.

00:15:55.880 --> 00:15:57.120
Anyway.

00:15:57.120 --> 00:15:57.520
Okay.

00:15:57.520 --> 00:15:58.440
So, yeah.

00:15:58.440 --> 00:16:09.960
So if you've got some Python 2 code that you want to bring forward or maybe you can even use it to help somewhat bring a Python 3 libraries to support Python 2 if you're writing some kind of package, right?

00:16:09.960 --> 00:16:10.240
Yeah.

00:16:10.240 --> 00:16:10.680
Yeah.

00:16:10.680 --> 00:16:11.120
Yeah.

00:16:11.120 --> 00:16:14.500
And the reason why I picked this one to highlight was it's really everywhere.

00:16:14.500 --> 00:16:25.980
Many of the really popular, most commonly used Python libraries rely on 6 library in order to smooth over the differences in Python 2 and 3.

00:16:26.320 --> 00:16:33.000
And so it's sort of the guy behind the scenes who's helping everybody out, but no one really talks about as like the main person.

00:16:33.000 --> 00:16:34.000
It's the guy behind the curtain.

00:16:34.000 --> 00:16:34.440
Yeah.

00:16:34.440 --> 00:16:34.680
Okay.

00:16:34.680 --> 00:16:35.020
Awesome.

00:16:35.020 --> 00:16:35.280
Yeah.

00:16:35.320 --> 00:16:36.180
So check it out, 6.

00:16:36.180 --> 00:16:38.520
And it's named 6 because 2 times 3.

00:16:38.520 --> 00:16:39.320
Yeah.

00:16:39.320 --> 00:16:39.960
There you go.

00:16:39.960 --> 00:16:40.340
Nice.

00:16:40.340 --> 00:16:45.980
Let me take just a moment and tell you about an offer from one of our sponsors, Continuum Analytics.

00:16:45.980 --> 00:16:48.560
They're hosting AnacondaCon 2017.

00:16:48.560 --> 00:16:52.500
It's the first conference for open data science leaders around the world.

00:16:52.920 --> 00:16:55.800
This is the definitive gathering place for the Anaconda crew.

00:16:55.800 --> 00:17:05.060
Whether you're a new or a long-standing member of the data science community focused on business or technology, AnacondaCon will help you conquer your biggest data science challenges.

00:17:05.480 --> 00:17:12.500
Over 20 industry experts will discuss the open data science movement and share their best practices for leveraging Anaconda.

00:17:12.500 --> 00:17:20.760
You'll hear how they're discovering cures for rare genetic diseases, performing city planning, and refining tax policy analysis with Python.

00:17:20.760 --> 00:17:31.780
Team Anaconda wants to help empower your whole team, so they're offering a two-for-one ticket price to AnacondaCon 17 from now through January 31, 2017.

00:17:32.280 --> 00:17:38.740
Register today at talkpython.fm/acon to take advantage of this excellent offer.

00:17:38.740 --> 00:17:41.420
That's talkpython.fm/acon.

00:17:41.420 --> 00:17:44.340
Thank Continuum for supporting Talk Python.

00:17:44.340 --> 00:17:45.680
They help make the show possible.

00:17:45.680 --> 00:17:47.220
Now back to the interview with Matt.

00:17:47.220 --> 00:17:58.440
There are a lot of data scientists and actual straight scientists that listen to this show, and they might be happy to hear about your number two item here.

00:17:58.440 --> 00:17:59.080
Yeah.

00:17:59.080 --> 00:18:02.460
So I picked Boca, or you can also pronounce it Bo-kay.

00:18:02.460 --> 00:18:06.360
In the official FAQ for the project, it says you can pronounce it either way.

00:18:06.360 --> 00:18:11.300
I'm not sure if there's a more right version, but we'll call it Boca for now.

00:18:11.300 --> 00:18:16.360
And so what this allows you to do is write Python code and create data visualizations.

00:18:16.720 --> 00:18:23.640
And so I have tried to create data visualizations in many different JavaScript libraries before.

00:18:23.640 --> 00:18:27.000
The most popular right now, it seems like, is D3JS.

00:18:27.000 --> 00:18:28.600
And I love those libraries.

00:18:28.600 --> 00:18:36.180
But when I'm in Python land, sometimes I just, I can't think about switching over into the JavaScript world.

00:18:36.180 --> 00:18:42.460
And so a Boca allows you to just write the Python code, and then it will build the visualizations for you.

00:18:42.460 --> 00:18:48.580
Now, it's not relying on D3JS, but it draws visualizations that are very similar to that.

00:18:48.580 --> 00:18:52.360
And so you're not just getting like a cut rate data visualization.

00:18:52.360 --> 00:18:59.120
This is actually building something that is like, you can include it in your web application, and it is nice and professional.

00:18:59.120 --> 00:19:01.240
Yeah, this is really, really a cool library.

00:19:01.240 --> 00:19:09.080
And if you're already doing some kind of scientific computation or numerical computation in Python,

00:19:09.080 --> 00:19:16.160
you don't want to like drop out and just, you know, drop a bunch of data into a JavaScript file or to an HTML file

00:19:16.160 --> 00:19:20.260
and then write a bunch of JavaScript D3 to actually turn that back into something visual.

00:19:20.680 --> 00:19:24.640
You can basically do all the visualizations in Python and then just plug it in.

00:19:24.640 --> 00:19:29.740
And what's really cool is it's not just like generating like a picture, say, with Matplotlib.

00:19:29.740 --> 00:19:33.580
Like, so with Matplotlib, you can say, here, I'd like to have this picture, boom, save it to an image,

00:19:33.580 --> 00:19:34.820
then put the image on a page.

00:19:34.820 --> 00:19:41.740
But these things, these bokeh graphs and visualizations that go up there, they're totally interactive, right?

00:19:41.740 --> 00:19:42.640
Yeah, exactly.

00:19:42.640 --> 00:19:46.040
So it's not just, as you said, it's not just an image that is generated.

00:19:46.040 --> 00:19:50.360
It is the actual visualization that can be, that is fully interactive as well.

00:19:50.360 --> 00:19:57.580
And so you can control how much interactivity and what data and what axes you want to, you want the user to be able to explore.

00:19:57.580 --> 00:19:59.880
But you can do that all in, in Python itself.

00:19:59.880 --> 00:20:04.420
And I actually, I found out about this project a couple of years ago at PyCon 2015.

00:20:04.420 --> 00:20:12.020
Sarah Bird gave an awesome talk where, and you can actually go, go find it on YouTube for, if you search Sarah Bird PyCon 2015.

00:20:12.020 --> 00:20:15.520
And she drew an entire map with just bokeh.

00:20:15.520 --> 00:20:20.560
And I was like, whoa, you just, you just wrote, she live coded some Python code.

00:20:20.560 --> 00:20:22.580
And I was like, whoa, you've got a map on there with all your data.

00:20:22.900 --> 00:20:25.800
That would have taken me a week in D3JS.

00:20:25.800 --> 00:20:27.280
I was just so impressed with it.

00:20:27.280 --> 00:20:28.540
Yeah, it's really, really cool.

00:20:28.540 --> 00:20:29.640
Okay.

00:20:29.640 --> 00:20:38.060
So, you know, another thing that's really popular in Python these days, it seems, is static site generators, right?

00:20:38.060 --> 00:20:38.640
Yep.

00:20:38.640 --> 00:20:46.820
That well, and, and, and Pelican, which is a static site generator, which is not the project we pick, but Pelican, I use every single day to create full stack Python.

00:20:46.820 --> 00:20:53.540
So I picked a separate one, and this one is either pronounced make docs or mk docs.

00:20:53.540 --> 00:21:05.940
I actually just gave a talk on static site generators at San Francisco Python, and I tweeted at Tom Christie, who's the creator of not only Django rest framework, but this project as well, make docs.

00:21:05.940 --> 00:21:09.060
And I said, hey, how do I, I'm going to check myself before I wreck myself.

00:21:09.060 --> 00:21:10.760
How do I pronounce this project?

00:21:10.760 --> 00:21:15.220
And he said, well, you know, I say mk docs with a Scottish accent.

00:21:15.600 --> 00:21:17.220
And I was like, mk docs.

00:21:17.220 --> 00:21:18.640
Okay.

00:21:18.640 --> 00:21:22.780
I don't, you know, I'm not, I don't really have a Scottish accent.

00:21:22.780 --> 00:21:24.200
So, okay, sure.

00:21:24.200 --> 00:21:25.940
And then he said, but, you know, I don't really know.

00:21:25.940 --> 00:21:27.840
Let me, let me talk to one of their core committers.

00:21:27.840 --> 00:21:32.740
And he said, mk docs, that's how he pronounced it, but they don't really have a particular opinion about it.

00:21:32.740 --> 00:21:35.380
So, you know, whatever's easiest for you.

00:21:35.380 --> 00:21:40.440
If you've got a great Scottish accent, I say go for that route, but, but I certainly do not.

00:21:40.440 --> 00:21:46.620
So what make docs is, is a static site generator for really for project documentation.

00:21:46.620 --> 00:21:52.000
Let me ask you a quick question or clarification just for everyone listening, because many people would know, but not everyone.

00:21:52.000 --> 00:21:53.220
What's a static site?

00:21:53.220 --> 00:21:53.680
Yeah.

00:21:53.760 --> 00:21:57.880
So a static site is kind of taking you back to the origins of the web.

00:21:57.880 --> 00:22:05.700
It's just HTML flat files, HTML, and it has CSS and usually JavaScript, but there's no database backend.

00:22:05.700 --> 00:22:08.280
There's no dynamic content on the backend.

00:22:08.280 --> 00:22:11.680
So it's really just files that can be served up by a web server.

00:22:11.680 --> 00:22:13.820
And the reason why it's called a generator.

00:22:13.820 --> 00:22:15.320
So that, that would be the static site.

00:22:15.320 --> 00:22:23.300
The generator part of it is you write your content either in markdown or restructured text or some sort of markup format.

00:22:23.300 --> 00:22:25.280
And then you have templates.

00:22:25.280 --> 00:22:30.660
So for Pelican, for example, Pelican has Jinja templates that you can use.

00:22:30.660 --> 00:22:37.000
So Jinja is a template engine and make docs has its own, actually make docs makes it even easier.

00:22:37.000 --> 00:22:38.420
You don't even have to write the templates.

00:22:38.420 --> 00:22:40.540
If you don't want to, you just write the content.

00:22:40.540 --> 00:22:48.260
And what that does is it combines the content that you've written with some sort of template engine and then produces HTML files or some sort of output.

00:22:48.260 --> 00:22:53.340
It could be XML, whatever you want, but most commonly you're producing a static site, which would be an HTML.

00:22:53.340 --> 00:22:53.880
Okay.

00:22:53.880 --> 00:22:54.840
Yeah, that's really cool.

00:22:54.840 --> 00:22:56.340
And there's a lot of benefits to that.

00:22:56.340 --> 00:23:00.720
It's super easy to scale a site like that, right?

00:23:00.720 --> 00:23:04.440
You don't have to worry about the databases and concurrence execution.

00:23:04.440 --> 00:23:05.800
You're just serving static files.

00:23:05.800 --> 00:23:10.880
And it's also easy to put that on to like a CDN sort of thing, like Fastly or something, right?

00:23:10.880 --> 00:23:11.480
Yeah.

00:23:11.480 --> 00:23:18.960
So the way that I deploy a full stack Python is it's just, you know, it's just a bunch of HTML files that get generated with some CSS and JavaScript.

00:23:18.960 --> 00:23:22.000
And then I just have a content delivery network.

00:23:22.000 --> 00:23:24.380
So I have the files hosted.

00:23:24.380 --> 00:23:26.120
Sometimes I use GitHub pages.

00:23:26.120 --> 00:23:28.740
I've also switched it over to Amazon S3.

00:23:28.740 --> 00:23:32.740
In front of that is a CDN, and I use Cloudflare.

00:23:32.740 --> 00:23:35.700
And what that does is it just serves up all those files.

00:23:35.700 --> 00:23:37.700
There's no database calls or anything like that.

00:23:37.700 --> 00:23:43.360
It's just really fast, immediately serving up those files to whatever web browser is requesting them.

00:23:43.360 --> 00:23:43.900
Nice.

00:23:43.900 --> 00:23:44.680
And it serves them up.

00:23:44.680 --> 00:23:49.280
It moves them around the globe and serves them up from somewhere by place, which is pretty awesome.

00:23:49.280 --> 00:23:55.320
So people on the other side of the earth don't suffer because you decided to put your server in New York or whatever.

00:23:55.320 --> 00:23:56.680
Globally distributed, exactly.

00:23:56.680 --> 00:23:57.200
Yeah, yeah.

00:23:57.200 --> 00:23:57.640
That's awesome.

00:23:57.640 --> 00:23:58.340
Okay.

00:23:58.340 --> 00:24:00.080
So what's cool about MakeDocs?

00:24:00.080 --> 00:24:02.460
Why is it a great one?

00:24:02.460 --> 00:24:03.120
How does it work?

00:24:03.440 --> 00:24:08.800
I think the thing about static sites is they've traditionally been made around blogs.

00:24:08.800 --> 00:24:16.180
But project documentation is one of the best examples that I think, if you want to use the word, use cases that I've seen.

00:24:16.420 --> 00:24:24.720
So the idea behind MakeDocs is it's already being used to power a really popular project, a Python project, which is Django REST framework.

00:24:24.720 --> 00:24:30.140
And that allows MakeDocs to have a real project using it.

00:24:30.140 --> 00:24:32.920
And then they open sourced it so that anybody can use it.

00:24:32.920 --> 00:24:36.380
And the idea is generate beautiful project documentation.

00:24:36.620 --> 00:24:40.540
Now, for many developers, documentation is sort of not the first thing on their mind.

00:24:40.540 --> 00:24:45.420
But in the Python community, I think we have really great documentation for most of our projects.

00:24:45.420 --> 00:24:47.600
It's kind of something that is a badge of pride.

00:24:47.600 --> 00:24:55.440
And so that's where I think using MakeDocs and just writing your content, you don't have to worry about the styling if you don't want to.

00:24:55.780 --> 00:24:59.280
It's just going to create a beautiful set of project documentation for you.

00:24:59.280 --> 00:25:00.160
Yeah, that's excellent.

00:25:00.160 --> 00:25:04.000
And I think, you know, you could even check in the docs into, like, your GitHub repository.

00:25:04.000 --> 00:25:09.520
And if somebody clones your repo, they can just go, like, right there and just have offline docs as static files.

00:25:09.520 --> 00:25:10.180
That's really cool.

00:25:10.180 --> 00:25:11.280
Very nice.

00:25:11.280 --> 00:25:12.220
Okay, MakeDocs.

00:25:12.220 --> 00:25:20.360
You know, speaking of Markdown, I think having Markdown wherever you accept user input is really nice in your web apps.

00:25:20.360 --> 00:25:22.960
You know, Stack Overflow definitely popularized this.

00:25:23.180 --> 00:25:28.420
Markdown comes from John Grubner a long ago, I don't know, like 2008 or something like this.

00:25:28.420 --> 00:25:29.520
It's not a brand new idea.

00:25:29.520 --> 00:25:39.540
But certainly using Markdown to accept input from users is much safer than accepting pure, you know, rich formatted HTML, right?

00:25:39.540 --> 00:25:39.900
Yeah.

00:25:39.900 --> 00:25:43.740
So the thing about Markdown is it's a certain format.

00:25:43.740 --> 00:25:49.840
And there's, well, for better or worse, without getting too into the weeds, there are different variations on that format.

00:25:49.840 --> 00:25:51.780
But there is sort of a standard Markdown format.

00:25:52.060 --> 00:25:54.900
And there's a Python project that parses that out.

00:25:54.900 --> 00:25:57.560
So then you can work with it in your Python code.

00:25:57.560 --> 00:26:01.100
And so the Python Markdown project is kind of everywhere.

00:26:01.100 --> 00:26:07.360
Whenever you're talking about a content management system or a static site generator like MakeDocs or Pelican, which I use.

00:26:07.520 --> 00:26:20.840
Really, when you do pip install Markdown, what happens is that a Markdown parser is installed and allows the whatever libraries you're depending on to then parse out that Markdown and work with it in their own code.

00:26:20.840 --> 00:26:21.840
Yeah, that's really cool.

00:26:21.840 --> 00:26:31.320
So, for example, on like Python Bytes, the new podcast that I started, so Python Bytes.fm, on there, there's a back-end CMS type thing that I created for it.

00:26:31.320 --> 00:26:32.820
And there's a place we put the show notes.

00:26:33.160 --> 00:26:36.460
And on Talk Python, that was just an HTML fragment.

00:26:36.460 --> 00:26:38.840
But every now and then I would mess up that HTML fragment.

00:26:39.320 --> 00:26:41.640
And it would screw up the site.

00:26:41.640 --> 00:26:46.600
Or, you know, I just have to like format HTML in the browser and write it by hand.

00:26:46.600 --> 00:26:47.600
And it's not so fun.

00:26:47.600 --> 00:26:49.960
So when I did Python Bytes, I'm like, that's it.

00:26:49.960 --> 00:26:54.760
This part is going to be input as Markdown, output as, you know, HTML.

00:26:54.760 --> 00:26:59.480
And so I use something similar to Python Markdown for that, which is really cool.

00:26:59.480 --> 00:27:02.620
I actually use this thing called Python-Markdown2.

00:27:02.940 --> 00:27:04.620
I don't think they're related to these two things.

00:27:04.620 --> 00:27:07.160
It's nice because it has extensions.

00:27:07.160 --> 00:27:09.900
You can add on like variations.

00:27:09.900 --> 00:27:13.760
Like I want to add like GitHub table support type things and stuff like that.

00:27:13.760 --> 00:27:14.020
Yeah.

00:27:14.020 --> 00:27:16.860
Again, this is just another one of those libraries that's everywhere.

00:27:16.860 --> 00:27:21.760
And whether they're using Python Markdown, Python Markdown2, or there's many other parses that are out there,

00:27:21.760 --> 00:27:26.060
they're kind of the guy, the gal behind the scenes that is doing a lot of the heavy lifting

00:27:26.060 --> 00:27:29.580
and allows other projects to take advantage of that work that's done.

00:27:29.580 --> 00:27:30.100
Nice.

00:27:30.760 --> 00:27:37.200
So while we're on the topic of, hey, I want to put some stuff into some kind of back end on my site and have it show up,

00:27:37.200 --> 00:27:43.320
one thing you do is write a site from scratch and fill in a few pieces like show notes and episode names,

00:27:43.320 --> 00:27:45.640
or you could grab a whole CMS, right?

00:27:45.640 --> 00:27:46.120
Yeah.

00:27:46.120 --> 00:27:51.420
So Django can often be used as a CMS, which is a content management system.

00:27:51.420 --> 00:27:55.460
I would say like WordPress is probably the most popular of these, right?

00:27:55.460 --> 00:28:00.260
If you look at like overall deployments or maybe Squarespace, but plug it into Django is really sweet.

00:28:00.260 --> 00:28:02.100
So you found a really nice one.

00:28:02.100 --> 00:28:08.420
What happens is if you start building a site on Django, and particularly if people that are not developers are using it,

00:28:08.420 --> 00:28:11.060
you often find that you run into limitations.

00:28:11.060 --> 00:28:15.480
And that's not, I wouldn't say that this is necessarily something that Django has to fix.

00:28:15.480 --> 00:28:17.760
This is where a content management system comes in.

00:28:17.760 --> 00:28:19.820
So let me give you a specific example.

00:28:20.300 --> 00:28:29.640
If you have people that are not developers that are punching their content into this content management system, like Django and the Django admin panel, for example,

00:28:29.640 --> 00:28:34.820
and then you want to roll back, you say, oh, shoot, I deleted, I deleted a page.

00:28:34.820 --> 00:28:36.460
You know, let's roll back.

00:28:36.460 --> 00:28:40.180
Well, Django doesn't have that type of capability.

00:28:40.180 --> 00:28:44.540
And that's where content management systems are on top of that.

00:28:44.680 --> 00:28:47.380
So the one that we picked here is Wagtail.

00:28:47.380 --> 00:28:54.400
And Wagtail is actually a newer content management system than some of the other ones like Mezzanine or Django CMS.

00:28:54.400 --> 00:28:58.120
But Wagtail is, I've been really impressed with Wagtail.

00:28:58.120 --> 00:29:04.560
I've used it a bit, both as a non-developer user to punch content in and a little bit on the back end as well.

00:29:04.560 --> 00:29:06.000
And it's been really powerful so far.

00:29:06.000 --> 00:29:07.160
Yeah, that's really great.

00:29:07.300 --> 00:29:09.220
And they've got a great example.

00:29:09.220 --> 00:29:12.560
They have like a demo video for it as well for Wagtail.

00:29:12.560 --> 00:29:14.840
And it was used at the Royal College of Art.

00:29:14.840 --> 00:29:16.560
It's in the UK somewhere.

00:29:16.560 --> 00:29:25.680
And it basically powers that website with thousands of web pages and many, many users and all sorts of really cool workflows.

00:29:25.680 --> 00:29:27.880
It's actually quite visual and pretty.

00:29:27.880 --> 00:29:36.500
One of the things that comes to mind when I think of CMSs is they seem synonymous with slow and clunky to me.

00:29:36.800 --> 00:29:42.920
There's a tradeoff with CMSs, which is that they're building all this extra functionality on top of an existing web framework.

00:29:42.920 --> 00:29:45.440
And they need to be used by people that are not developers.

00:29:45.440 --> 00:29:53.160
So you don't want to get into a situation where the CMS is preventing you from doing things with your content that you want.

00:29:53.160 --> 00:29:54.420
So there's a tradeoff.

00:29:54.420 --> 00:29:56.120
Sometimes CMSs are too heavy-handed.

00:29:56.120 --> 00:29:59.300
Sometimes they're just really confusing to use.

00:29:59.300 --> 00:30:05.380
But I found that Wagtail, which we're actually using at Twilio, is actually one of our favorite CMSs.

00:30:05.380 --> 00:30:08.140
And we did a large evaluation with a lot of different programming languages.

00:30:08.140 --> 00:30:10.700
And this is the one that came on top for us.

00:30:10.700 --> 00:30:14.920
It's not necessarily the best for everybody, but it's the one that works really well for us.

00:30:14.920 --> 00:30:22.360
I can say the Royal College of Art website is quite zippy, even though I'm like nine hours time zone away from it.

00:30:22.360 --> 00:30:24.920
So mostly any sort of slowness would be ping time.

00:30:25.120 --> 00:30:29.540
So I feel like this is a CMS that doesn't have that feeling, right?

00:30:29.540 --> 00:30:30.400
It's really nice.

00:30:30.400 --> 00:30:32.040
And it's awesome because you're using it at Twilio, too.

00:30:32.040 --> 00:30:36.440
Well, the thing about Wagtail is that they've done a great job with making it really polished.

00:30:36.440 --> 00:30:39.560
And I think that's one of the reasons why we were so impressed with it.

00:30:39.560 --> 00:30:42.860
And so this is what's powering the Twilio docs.

00:30:43.120 --> 00:30:52.460
We actually look at our documentation, the documentation for the Twilio APIs as a platform itself, because many different teams around Twilio are using the docs.

00:30:52.460 --> 00:30:53.260
They're writing docs.

00:30:53.260 --> 00:30:55.980
They're updating the docs when things need to be fixed.

00:30:56.180 --> 00:31:01.260
And so we needed some sort of powerful platform that allowed many different teams to interact with it.

00:31:01.260 --> 00:31:05.900
So after our evaluation, we've used Wagtail as our CMS for the Twilio docs.

00:31:05.900 --> 00:31:06.840
Yeah, it's really cool.

00:31:06.840 --> 00:31:10.120
I'm looking forward to finding a place to use it because it looks like it's fun to use.

00:31:10.120 --> 00:31:14.300
The back end looks real friendly and modern, not like some crummy sort of app.

00:31:14.300 --> 00:31:14.880
It's nice.

00:31:14.880 --> 00:31:16.760
It's a really nice and polished project, really.

00:31:16.760 --> 00:31:19.760
I think a little bit newer and up and coming as a CMS.

00:31:19.760 --> 00:31:20.360
Awesome.

00:31:20.360 --> 00:31:22.320
And it's cool that it was on the awesome list.

00:31:22.660 --> 00:31:26.120
Okay, so another thing that I think is really interesting is design patterns.

00:31:26.120 --> 00:31:27.520
I've always loved design patterns.

00:31:27.520 --> 00:31:35.920
You know, I've read, I remember reading the Gang of Four book about C++ and small talk design patterns like way long ago.

00:31:35.920 --> 00:31:40.200
And then reading it again so I could actually understand it like a few years later.

00:31:40.200 --> 00:31:49.340
But one of the things that I think is interesting is if you take those patterns and you apply them to Python, sometimes they look very different and sometimes they look very similar.

00:31:49.340 --> 00:31:51.840
Like, for example, the decorator pattern.

00:31:52.520 --> 00:31:57.980
You know, that has one form of C++, but it's almost a language feature in Python.

00:31:57.980 --> 00:31:58.380
Yeah.

00:31:58.380 --> 00:32:03.980
That's where the, on the awesome list is the Python patterns repository.

00:32:03.980 --> 00:32:05.560
So there's a link to Python patterns.

00:32:05.560 --> 00:32:14.520
And this is the implementations of various patterns, whether it's like behavioral patterns or structural patterns, different conceptual ideas.

00:32:14.520 --> 00:32:15.980
And they're implemented in Python code.

00:32:15.980 --> 00:32:27.480
And they're implemented in Python code, which allows someone, for example, when I was going from Java and I had constantly use the singleton pattern or the factory pattern to then see what that looks like in Python.

00:32:27.560 --> 00:32:31.060
I think it's really great for people who are coming from another language.

00:32:31.060 --> 00:32:33.660
They already have these ideas in their mind, right?

00:32:33.660 --> 00:32:39.220
They can drop in really quick and you just pull up like, you know, 20 lines of code and you're like, oh, this is how you do it in Python.

00:32:39.220 --> 00:32:40.740
I never would have thought to do it this way.

00:32:40.780 --> 00:32:43.580
This is so much better than what I was trying to do a minute ago.

00:32:43.580 --> 00:32:46.040
And they have some interesting ones in here.

00:32:46.040 --> 00:32:50.880
They have the standard gang of four ones like state, strategy, iterator, visitor, and so on.

00:32:50.880 --> 00:32:57.180
But then they also have some things like the Borg design pattern and the Blackboard design pattern.

00:32:57.180 --> 00:32:59.740
So I actually learned a few things.

00:32:59.740 --> 00:33:04.140
And I don't really know yet where I'd use the Borg, but I'm pretty sure I like the name of it.

00:33:04.140 --> 00:33:06.720
This repository is great for learning.

00:33:06.720 --> 00:33:19.340
I would caution anyone that is coming from another programming language to suddenly drop different patterns into their code when those patterns may not be idiomatic to the way that you would write Python code.

00:33:19.340 --> 00:33:30.320
Because Python code has its own way of a different way that you would write Python code, for example, making everything explicit rather than implicit like you would in the Ruby ecosystem.

00:33:30.320 --> 00:33:35.200
So I think these are awesome for just learning about how different patterns could be implemented.

00:33:35.200 --> 00:33:44.040
But I would caution people to make sure that this is actually how you would write Python code as opposed to just dropping them into your code without thinking about them.

00:33:44.040 --> 00:33:50.180
Yeah, I kind of have like an Einstein type of philosophy about design patterns.

00:33:50.180 --> 00:33:51.700
Like design patterns are awesome.

00:33:51.700 --> 00:33:53.840
And you should use them in your code.

00:33:53.840 --> 00:33:56.520
But just enough, right?

00:33:56.520 --> 00:33:58.980
Things should be as simple as they can, but not simpler, right?

00:33:58.980 --> 00:34:01.060
Like you should have patterns that solve problems.

00:34:01.060 --> 00:34:05.320
But I feel like people, when they learn design patterns at first, they're like, oh, I'm going to put patterns everywhere.

00:34:05.320 --> 00:34:07.800
I can't wait to like turn everything into a state pattern.

00:34:07.800 --> 00:34:09.540
And then the visitors go in here like, oh, no.

00:34:09.540 --> 00:34:11.840
Oh, no, that's going to be unmaintainable, right?

00:34:11.900 --> 00:34:15.000
And so patterns, I don't know, to me, they're like salt, right?

00:34:15.000 --> 00:34:15.940
A little bit here and there.

00:34:15.940 --> 00:34:16.760
Yep.

00:34:16.760 --> 00:34:25.100
And if you find yourself with a specific problem in your code, knowing what those patterns are and how they can be implemented in your programming language can be really powerful.

00:34:25.100 --> 00:34:25.860
Yeah, absolutely.

00:34:25.860 --> 00:34:34.060
You know, another thing that I'd like to lean on to some kind of framework for is authentication, especially things like OAuth.

00:34:34.060 --> 00:34:37.580
Those are super, super complicated to figure out yourself.

00:34:37.580 --> 00:34:40.440
But luckily on our list here, we have some OAuth stuff, right?

00:34:40.720 --> 00:34:40.860
Yeah.

00:34:40.860 --> 00:34:43.420
So the project we picked here is Authomatic.

00:34:43.420 --> 00:34:48.740
And the tagline here is simple but powerful framework authentication and authorization client.

00:34:48.740 --> 00:34:52.720
I think there's a spectrum with authentication libraries.

00:34:52.720 --> 00:34:56.180
On one hand, you've got sort of these maybe heavy handed.

00:34:56.180 --> 00:34:59.860
They tell you exactly how to implement authentication models.

00:35:00.020 --> 00:35:01.100
So for example, OAuth.

00:35:01.100 --> 00:35:05.760
Let's say you want to have a Twitter-based login or a GitHub-based login.

00:35:05.760 --> 00:35:16.180
Some of the authentication authorization frameworks will tell you, hey, in these three steps, add this to your code, and then you'll have OAuth login.

00:35:16.580 --> 00:35:23.060
But on the other hand, these libraries have to work with various frameworks.

00:35:23.060 --> 00:35:29.720
So the way that you would implement something in Django versus Flask versus Pyramid versus Turbogears can be different.

00:35:29.720 --> 00:35:35.080
And that's where I think taking a look at all the different libraries can be helpful.

00:35:35.280 --> 00:35:41.800
So Authomatic seemed like a really great one because it had examples with different frameworks, which I really liked.

00:35:41.800 --> 00:35:42.280
Yeah.

00:35:42.280 --> 00:35:45.600
You can definitely go in there and it's like these are the few things you drop in for Django.

00:35:45.600 --> 00:35:47.360
Here's the few things you do for Flask.

00:35:47.360 --> 00:35:48.320
Here's what you do for Pyramid.

00:35:48.320 --> 00:35:49.640
Even one for Google App Engine.

00:35:49.980 --> 00:35:55.020
And I really found that some of the other ones that seemed comprehensive had almost no examples.

00:35:55.020 --> 00:35:57.700
And you're like, but there's all these moving parts.

00:35:57.700 --> 00:36:01.040
How do I put this together in this particular web framework?

00:36:01.040 --> 00:36:02.600
Like, why is there no example here?

00:36:02.600 --> 00:36:04.580
Yeah, I looked at a number of them.

00:36:04.580 --> 00:36:08.620
And maybe we should put a little word of caution in that this hasn't been updated for a little while.

00:36:08.620 --> 00:36:11.720
But that's kind of true with some of the other options out there as well.

00:36:11.720 --> 00:36:16.080
So they kind of seem more steady state or they're in some sort of flux or something.

00:36:16.080 --> 00:36:17.920
So look through the whole list.

00:36:18.020 --> 00:36:19.680
Here's just one example to sort of point out.

00:36:19.680 --> 00:36:23.540
Like, there's a bunch of great things about OAuth and social auth and things like that.

00:36:23.540 --> 00:36:23.820
Yep.

00:36:23.820 --> 00:36:29.220
And this makes it much easier for you to implement them rather than having to rewrite everything in your own code.

00:36:29.220 --> 00:36:30.020
Yeah, for sure.

00:36:30.020 --> 00:36:44.080
This portion of Talk Python is brought to you by Hired.

00:36:44.080 --> 00:36:47.100
Hired is the platform for top Python developer jobs.

00:36:47.420 --> 00:36:51.900
Create your profile and instantly get access to 3,500 companies who will work to compete with you.

00:36:51.900 --> 00:36:54.780
Take it from one of Hired's users who recently got a job and said,

00:36:54.780 --> 00:37:00.060
I had my first offer on Thursday after going live on Monday and I ended up getting eight offers in total.

00:37:00.060 --> 00:37:03.520
I've worked with recruiters in the past, but they've always been pretty hit and miss.

00:37:03.520 --> 00:37:06.360
I tried LinkedIn, but I found Hired to be the best.

00:37:06.360 --> 00:37:08.460
I really like knowing the salary up front.

00:37:08.460 --> 00:37:10.820
Privacy was also a huge seller for me.

00:37:10.820 --> 00:37:12.500
Sounds awesome, doesn't it?

00:37:12.500 --> 00:37:14.520
Well, wait until you hear about the sign-in bonus.

00:37:14.740 --> 00:37:17.940
Everyone who accepts a job from Hired gets $1,000 signing bonus.

00:37:17.940 --> 00:37:20.600
And as Talk Python listeners, it gets way sweeter.

00:37:20.600 --> 00:37:25.840
Use the link Hired.com slash Talk Python To Me and Hired will double the signing bonus to $2,000.

00:37:25.840 --> 00:37:27.620
Opportunity's knocking.

00:37:27.620 --> 00:37:31.400
Visit Hired.com slash Talk Python To Me and answer the door.

00:37:38.780 --> 00:37:40.700
You talked about static sites earlier.

00:37:40.700 --> 00:37:44.860
We mentioned the deployment and the performance story and all that, and that's great.

00:37:44.860 --> 00:37:49.080
But sometimes you just need a data-driven web app, right?

00:37:49.080 --> 00:37:56.040
Like, for example, it's super hard to go to, like, a static site and add voting or comments or things like this, right?

00:37:56.040 --> 00:38:01.540
So maybe the thing that you're building, you really do need to have some kind of data-driven thing here.

00:38:02.340 --> 00:38:05.240
But if it's not fast enough, what are you going to do?

00:38:05.240 --> 00:38:06.800
Well, you've got to have caching.

00:38:06.800 --> 00:38:10.620
So, you know, caching is one of these really hard problems in computer science.

00:38:10.620 --> 00:38:15.800
So taking advantage of a library that allows you to implement caching can be really helpful.

00:38:15.800 --> 00:38:18.560
And I know this one you picked, Beaker.

00:38:18.560 --> 00:38:20.400
Why don't you tell us a little bit about Beaker?

00:38:20.620 --> 00:38:21.100
Yeah, yeah.

00:38:21.100 --> 00:38:22.360
Beaker looks really awesome.

00:38:22.360 --> 00:38:31.820
So Beaker is a way in which you can cache binary representations, pickled versions of Python object graphs.

00:38:31.820 --> 00:38:35.500
So you just take the thing you want to save and you just stash it in Beaker.

00:38:35.500 --> 00:38:38.520
And it can go into all different places, right?

00:38:38.520 --> 00:38:41.020
It can go into databases.

00:38:41.020 --> 00:38:42.220
It can go into memcached.

00:38:42.220 --> 00:38:46.380
It can go into just be stuck in memory, you know, until your process reboots.

00:38:46.380 --> 00:38:47.360
You can go straight to the file.

00:38:47.480 --> 00:38:49.940
And it also has a SQLAlchemy plug-in.

00:38:49.940 --> 00:38:54.260
So you point SQLAlchemy at the database that you care about, right?

00:38:54.260 --> 00:38:56.460
SQLAlchemy supports all sorts of different databases.

00:38:56.460 --> 00:38:58.760
And then it just talks to SQLAlchemy.

00:38:58.760 --> 00:39:06.240
So pretty much any type of database you want to use as a back-end for your cache, if you don't want to put it in memory, you can do it here.

00:39:06.240 --> 00:39:08.460
So there's all sorts of cool stuff.

00:39:08.460 --> 00:39:13.140
Like you can take it and plug it in as middleware in WSGI servers.

00:39:13.580 --> 00:39:18.780
So it automatically has little plug-ins for pylons, pyramid, turbo gears, things like this.

00:39:18.780 --> 00:39:20.000
Yeah.

00:39:20.000 --> 00:39:26.640
I think this could be really helpful for people who need that one or two slow pages to go much faster.

00:39:26.640 --> 00:39:27.100
Yeah.

00:39:27.100 --> 00:39:33.940
And if you can't build your site as a static site, certainly you're probably going to investigate caching at some point in order to improve the performance.

00:39:33.940 --> 00:39:37.200
So Beaker seems like a really capable one to use.

00:39:37.200 --> 00:39:37.600
Yeah.

00:39:37.600 --> 00:39:37.800
Yeah.

00:39:37.800 --> 00:39:38.360
It definitely does.

00:39:38.500 --> 00:39:42.320
So some of the features they list are like it's fast, obviously.

00:39:42.320 --> 00:39:44.180
That's a requirement for a cache, right?

00:39:44.180 --> 00:39:48.260
But it has multiple reader, reader, writer, block performance.

00:39:48.260 --> 00:39:53.120
So it avoids duplicate creation but allows for high parallelism for reading.

00:39:53.120 --> 00:40:00.060
All the back-ends, like I said, you can extend it and write your own back-end if you want to plug into TinyDB or, you know, whatever.

00:40:00.060 --> 00:40:02.140
All that kind of stuff is really cool.

00:40:02.580 --> 00:40:02.700
Yeah.

00:40:02.700 --> 00:40:04.640
Sounds like a good one to check out.

00:40:04.640 --> 00:40:11.680
So another one that you picked, which I think is really smart because people always say, hey, don't roll your own crypto.

00:40:11.680 --> 00:40:18.760
And you don't want to write your own password storage hashing library unless you're just trying to learn how it's done.

00:40:18.760 --> 00:40:20.800
But you don't necessarily want to write something for production.

00:40:20.800 --> 00:40:23.680
But you picked Passlib, which you've used in the past.

00:40:23.680 --> 00:40:24.800
Why don't you tell us about Passlib?

00:40:25.040 --> 00:40:26.940
Yeah, I use Passlib all over the place.

00:40:26.940 --> 00:40:29.700
I use it on the training website, for example, for accounts there.

00:40:29.700 --> 00:40:34.780
And I don't want people to end up on, you know, some sort of news story.

00:40:34.780 --> 00:40:39.860
Oh, a development server with production data was compromised.

00:40:39.860 --> 00:40:42.880
And here's, you know, a quarter million accounts.

00:40:42.880 --> 00:40:48.360
And too bad they used poor, like an old outdated hashing algorithm or something like that.

00:40:48.360 --> 00:40:52.980
And it turns out that everybody's going to have to reset all their passwords on the internet everywhere.

00:40:52.980 --> 00:40:58.060
So Passlib, I hope, will help people avoid that fate.

00:40:58.060 --> 00:41:10.760
The idea with Passlib is it takes all the best practices around password storage and verification and validation and puts them into two functions, encrypt and verify.

00:41:11.720 --> 00:41:18.660
So if you can't remember to call encrypt and verify, you know, you probably have no business writing authentication code, right?

00:41:18.660 --> 00:41:25.340
But the idea is they provide a whole bunch of different caching algorithms or, sorry, hashing algorithms.

00:41:25.340 --> 00:41:40.420
And they only support ones that have no known vulnerabilities, are public, have public reference implementations, can be made to be computationally expensive, you know, have a lot of scrutiny and things like that.

00:41:40.420 --> 00:41:45.140
So Argon2, Bcrypt, SHA-512crypt, things like that.

00:41:45.140 --> 00:41:50.820
So you're already starting from, thank goodness they didn't use MD5 for the hashing, right?

00:41:50.820 --> 00:41:53.480
Which is one of the problems.

00:41:53.480 --> 00:42:04.140
The other problem is with the advent of graphics, the GPU processing, people can use the GPUs to do advent of computational GPU processing, not for graphics.

00:42:04.140 --> 00:42:11.700
They can use the power of those graphics cards to just try so many variations on these hashes because the graphics cards can do them really quickly.

00:42:11.700 --> 00:42:17.760
And so you want to make the stored passwords computationally difficult to guess at.

00:42:17.760 --> 00:42:24.480
So instead of just hashing with a strong algorithm, Passlib will take it and it'll hash it like 200,000 times.

00:42:24.580 --> 00:42:30.580
So it'll take the input, stuff it back around, hash that thing, and then just, you know, fold it over 200,000 times.

00:42:30.580 --> 00:42:34.040
And it also adds random salt to each thing it stores.

00:42:34.040 --> 00:42:36.340
And, of course, folds that all through.

00:42:36.340 --> 00:42:40.000
So it's just super hard to guess what the possibility is.

00:42:40.000 --> 00:42:42.000
But it's easy for you.

00:42:42.000 --> 00:42:43.780
You get back some kind of password hash.

00:42:43.860 --> 00:42:46.900
You call verify with the plain text password and either it matches or it doesn't.

00:42:46.900 --> 00:42:47.140
Yeah.

00:42:47.140 --> 00:42:54.360
Well, it seems like it provides a really good tradeoff between, you know, developers want to spend a least amount of time working on security.

00:42:54.360 --> 00:42:56.820
And so they have more time to work on features.

00:42:56.820 --> 00:43:01.540
And it seems like this is making a good tradeoff where it's, hey, this is really simple.

00:43:01.540 --> 00:43:02.320
Here's what you do.

00:43:02.320 --> 00:43:05.320
Call these two functions and we'll take care of this bit for you.

00:43:05.320 --> 00:43:09.340
So that seems like, as far as a library, that's probably some of the best you can ask for.

00:43:09.340 --> 00:43:10.360
Yeah, it's really cool.

00:43:10.360 --> 00:43:12.840
And you can actually evolve over time.

00:43:12.840 --> 00:43:21.740
So, for example, part of the thing that gets stored in the database has the number of rounds or the number of folding iterations you've done.

00:43:21.740 --> 00:43:28.160
And so as computers get faster, you can actually crank that number up over time without breaking the old passwords.

00:43:28.160 --> 00:43:33.680
And then when the user comes back, you just regenerate with a newer, more computationally expensive variant.

00:43:33.680 --> 00:43:34.100
Nice.

00:43:34.100 --> 00:43:34.400
Yep.

00:43:34.400 --> 00:43:38.140
Also supports two-factor authentication, but I know nothing about this.

00:43:39.640 --> 00:43:43.680
You could use Authy for that or implement with SMS via Twilio.

00:43:43.680 --> 00:43:46.800
That's my little Twilio commercial for this one episode.

00:43:46.800 --> 00:43:47.580
Oh, awesome.

00:43:47.580 --> 00:43:48.560
Very cool.

00:43:48.560 --> 00:43:49.300
Okay.

00:43:49.300 --> 00:43:58.000
So another thing that's cool, well, something that's just awesome about Python, the whole ecosystem, is really pip and the deployment and packaging story, right?

00:43:58.000 --> 00:44:03.520
That I can just go grab all these awesome packages and, you know, 95,000 others.

00:44:03.920 --> 00:44:04.240
Yeah.

00:44:04.240 --> 00:44:14.180
So the fact that we have PyPI as the central repository for all of our dependencies and it's really easy to upload your own libraries to the central repository.

00:44:14.920 --> 00:44:17.560
As a Python developer, it makes things so much easier for me.

00:44:17.560 --> 00:44:23.940
When I was a Java developer and I used to use Maven, Maven was incredibly complicated.

00:44:23.940 --> 00:44:27.640
You have this huge, you have these massive XML files.

00:44:27.640 --> 00:44:31.320
It worked, but it was just, it was really complicated.

00:44:31.400 --> 00:44:35.340
And then I came over to Python and you've got a requirements.txt file.

00:44:35.340 --> 00:44:40.060
And requirements.txt, when I read it, I thought, this is so beautiful.

00:44:40.060 --> 00:44:42.140
I literally thought it was beautiful.

00:44:42.680 --> 00:44:45.700
There, you have the name of the library that you depend upon.

00:44:45.700 --> 00:44:51.320
You have, and then you optionally have the version number that you want to use for that library.

00:44:51.320 --> 00:44:54.860
Now I say optionally, but really it should be required.

00:44:54.860 --> 00:45:04.740
Before I joined Twilio, I did a lot of Python consulting and it was my nightmare when I would get a project and either would not have a requirements.txt file.

00:45:04.940 --> 00:45:09.580
You know, this is something that had been running in production for a few years and they said, yeah, we threw all this stuff together.

00:45:09.580 --> 00:45:10.920
You know, we use Django.

00:45:10.920 --> 00:45:12.900
And I thought, okay, Django, that's great.

00:45:12.900 --> 00:45:13.680
Which version?

00:45:13.680 --> 00:45:15.440
And they're like, well, we don't, we don't know.

00:45:15.440 --> 00:45:24.200
And so, so we've got, we luckily have now some tools that help out with figuring out what those dependencies are.

00:45:24.200 --> 00:45:35.720
So pip-tools is a set of tools, not only to keep your, your pinned dependencies fresh, but also to kind of infer what some of the requirements are that you may, you may have.

00:45:35.720 --> 00:45:47.040
What's great about this is if you don't necessarily know what the exact version numbers are of all of the, of all of your dependencies, you can use the, some of the pip-tools in order to infer some of those things.

00:45:47.040 --> 00:45:51.620
So if you, for example, like Django, which version of Django is at 1.4 is a 1.10.

00:45:51.620 --> 00:45:53.140
This will help you to figure that out.

00:45:53.140 --> 00:45:53.920
Yeah, absolutely.

00:45:54.680 --> 00:45:54.800
Yeah.

00:45:54.800 --> 00:46:00.080
And pip-tools will actually generate the full dependency graph for you.

00:46:00.080 --> 00:46:10.040
So one thing you might say in your requirements file is like, I require flask and maybe even say I require flask 0.10.1 or whatever it happens to be.

00:46:10.040 --> 00:46:10.280
Right.

00:46:10.280 --> 00:46:16.420
But flask itself requires it's dangerous and Jinja to and markup safe and these types of things.

00:46:16.420 --> 00:46:22.180
So you can go to pip-tools and you say, run pip compile, and it will actually generate a requirements.txt.

00:46:22.860 --> 00:46:28.280
That has the sort of closure of all of your dependencies, the dependencies and their dependencies and so on.

00:46:28.280 --> 00:46:31.520
So you can see and pin every single dependence you have.

00:46:31.740 --> 00:46:36.360
And it also adds a little comment like these dependencies were added because of flask.

00:46:36.360 --> 00:46:41.200
This one was added because of Jinja, which was added because of flask, things like that.

00:46:41.200 --> 00:46:42.080
I think that was really cool.

00:46:42.080 --> 00:46:42.380
Yeah.

00:46:42.380 --> 00:46:43.060
Yeah, definitely.

00:46:43.060 --> 00:46:44.460
And just incredibly handy.

00:46:44.460 --> 00:46:53.120
If you get dropped into a project and you have no idea what the exact version numbers and requirements and dependencies of dependencies are.

00:46:53.120 --> 00:46:53.780
Yeah, absolutely.

00:46:53.780 --> 00:47:00.120
And the thing that I use actually in production for this kind of stuff, it's not the same, but I use pyup.io.

00:47:00.540 --> 00:47:04.020
I met those guys through the show a while ago and I'm like, wow, this is such a cool project.

00:47:04.020 --> 00:47:05.280
Pyup.io.

00:47:05.280 --> 00:47:08.720
And you basically, it's like an online system.

00:47:08.720 --> 00:47:12.880
You point it at your GitHub repo, public or private, and it will watch this file.

00:47:12.880 --> 00:47:22.480
And if there's changes or releases or especially security releases, it will like send you a pull request saying there's a security vulnerability and it's dangerous or something.

00:47:22.640 --> 00:47:25.820
Here's the updated requirements.txt to fix it in your app.

00:47:25.820 --> 00:47:26.180
Wow.

00:47:26.180 --> 00:47:27.000
That is incredible.

00:47:27.000 --> 00:47:27.940
That's super useful.

00:47:27.940 --> 00:47:28.760
Yeah.

00:47:28.760 --> 00:47:29.660
It's the notification.

00:47:29.660 --> 00:47:38.300
I mean, these things are changing all the time, but it's like the push notification to you that your app now has like an important update to its dependency, which I thought was really cool.

00:47:38.300 --> 00:47:39.480
Awesome.

00:47:39.480 --> 00:47:39.880
Okay.

00:47:39.880 --> 00:47:42.340
Well, those were a great bunch of libraries.

00:47:42.340 --> 00:47:44.400
Hopefully you guys learned a lot about them.

00:47:44.400 --> 00:47:47.920
Matt, it was fun to explore these with you.

00:47:47.920 --> 00:47:50.020
I didn't know about all of them before we started talking.

00:47:50.020 --> 00:47:55.040
Well, I don't think anybody knows all of the Python projects that are out there.

00:47:55.040 --> 00:47:58.740
You wouldn't get any coding done if you knew what all the projects were.

00:47:58.740 --> 00:48:06.960
So that's what I think is great about the awesome lists is you get to see at a glance just different libraries that you may never have known about.

00:48:06.960 --> 00:48:07.240
Yeah.

00:48:07.240 --> 00:48:08.140
I totally agree.

00:48:08.140 --> 00:48:17.240
And that's why I think it's so interesting to bring it up for people is because you can drop in there and really quickly learn about all these tools that you didn't know about a few minutes ago.

00:48:17.240 --> 00:48:17.600
Very cool.

00:48:17.600 --> 00:48:18.160
All right.

00:48:18.260 --> 00:48:22.200
So as always, before I let you get out of here, let me ask you the two questions.

00:48:22.200 --> 00:48:23.320
Okay.

00:48:23.320 --> 00:48:27.080
So I don't even actually remember your answer from a year and a half ago.

00:48:27.080 --> 00:48:30.740
So when you write some Python code or any code, really, what editor do you use?

00:48:30.740 --> 00:48:31.780
So I use Vim.

00:48:31.780 --> 00:48:33.180
That hasn't changed.

00:48:33.180 --> 00:48:36.800
It's been Vim for a fairly long amount of time.

00:48:36.800 --> 00:48:40.240
Now, to be fair, I use Vim for Python code.

00:48:40.240 --> 00:48:41.620
Most things I do.

00:48:41.620 --> 00:48:48.460
I use Xcode for my Swift code and I use IntelliJ, the ultimate IntelliJ edition for Java code.

00:48:48.460 --> 00:48:50.640
So I've been doing some more Java coding lately.

00:48:51.180 --> 00:48:52.900
So I kind of bounce back and forth.

00:48:52.900 --> 00:48:57.100
But I almost always use the Vim mode in whatever editor that I'm in.

00:48:57.100 --> 00:48:57.540
Yeah.

00:48:57.540 --> 00:48:59.080
That's probably a requirement for you, right?

00:48:59.080 --> 00:49:00.100
That it has a Vim mode.

00:49:00.100 --> 00:49:01.020
Yes.

00:49:01.020 --> 00:49:02.240
Nice.

00:49:02.240 --> 00:49:03.160
All right.

00:49:03.200 --> 00:49:07.320
And we kind of touched on a bunch here, but you want to pull out a favorite PyPI package?

00:49:07.320 --> 00:49:08.020
Oh, man.

00:49:08.020 --> 00:49:13.000
I'm going to, I got to, you know, I got to give a shout out to Pelican.

00:49:13.000 --> 00:49:18.580
I just, as a static site generator, I think when you use a tool, and I may have said this

00:49:18.580 --> 00:49:23.900
on episode 26, but when you use a tool for six, seven years and you still love it, I think

00:49:23.900 --> 00:49:25.980
that's a really good, really good sign.

00:49:25.980 --> 00:49:27.900
So Pelican is that tool for me.

00:49:27.900 --> 00:49:32.220
And it's a great static site generator that powers full stack Python.

00:49:32.220 --> 00:49:33.040
Yeah, that's awesome.

00:49:33.140 --> 00:49:34.640
I think that is a really good sign.

00:49:34.640 --> 00:49:39.440
If you love it after you've lived with it for a while, then it must be something special.

00:49:39.440 --> 00:49:40.620
Very cool.

00:49:40.620 --> 00:49:46.260
So I feel kind of like as a final call to action, I noticed there were some projects not listed

00:49:46.260 --> 00:49:48.260
there that I thought were awesome.

00:49:48.260 --> 00:49:53.120
You look in various, some of the categories, you're like, oh, why is this not listed here?

00:49:53.120 --> 00:49:57.940
So maybe if you're out there and you own a package or you're really passionate about it

00:49:57.940 --> 00:50:01.320
and you don't see it there, you think it's awesome, maybe go send those guys a message

00:50:01.320 --> 00:50:03.400
and let them know they should add your package.

00:50:03.400 --> 00:50:04.560
All right.

00:50:04.560 --> 00:50:07.060
Well, Matt, it's been fun to talk to you.

00:50:07.060 --> 00:50:09.080
Thanks for sharing these packages with everyone.

00:50:09.080 --> 00:50:09.620
Yeah.

00:50:09.620 --> 00:50:10.260
Thanks, Michael.

00:50:10.260 --> 00:50:11.340
It's been a great time.

00:50:11.340 --> 00:50:11.640
Yeah.

00:50:11.640 --> 00:50:12.420
Great to catch up with you.

00:50:12.420 --> 00:50:12.860
See you later.

00:50:14.660 --> 00:50:17.500
This has been another episode of Talk Python To Me.

00:50:17.500 --> 00:50:19.980
Today's guest has been Matthew Mackay.

00:50:19.980 --> 00:50:26.060
And this episode has been sponsored by AnacondaCon from Continuum Analytics and by Hired.

00:50:26.060 --> 00:50:28.160
Thank you both for supporting the podcast.

00:50:28.160 --> 00:50:32.800
Whether you want to hear the keynote by Ryan Curran from Forrester Research, meet the guys

00:50:32.800 --> 00:50:36.960
behind Anaconda, or just mingle with high-end data scientists, you need to find your way to

00:50:36.960 --> 00:50:39.400
Austin, Texas for AnacondaCon this February.

00:50:39.800 --> 00:50:42.340
Start at talkpython.fm/acon.

00:50:42.340 --> 00:50:45.360
Hired wants to help you find your next big thing.

00:50:45.360 --> 00:50:50.100
Visit Hired.com slash Talk Python To Me to get five or more offers with salary and equity

00:50:50.100 --> 00:50:53.840
presented right up front and a special listener signing bonus of $2,000.

00:50:53.840 --> 00:50:56.760
Are you or a colleague trying to learn Python?

00:50:56.760 --> 00:51:01.440
Have you tried books and videos that just left you bored by covering topics point by point?

00:51:01.840 --> 00:51:07.440
Well, check out my online course, Python Jumpstart by Building 10 Apps at talkpython.fm/course

00:51:07.440 --> 00:51:10.020
to experience a more engaging way to learn Python.

00:51:10.020 --> 00:51:14.840
And if you're looking for something a little more advanced, try my Write Pythonic Code course

00:51:14.840 --> 00:51:17.400
at talkpython.fm/Pythonic.

00:51:17.400 --> 00:51:19.860
Be sure to subscribe to the show.

00:51:19.860 --> 00:51:22.060
Open your favorite podcatcher and search for Python.

00:51:22.060 --> 00:51:23.300
We should be right at the top.

00:51:23.300 --> 00:51:29.100
You can also find the iTunes feed at /itunes, Google Play feed at /play, and

00:51:29.100 --> 00:51:32.620
direct RSS feed at /rss on talkpython.fm.

00:51:32.620 --> 00:51:37.720
Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.

00:51:37.720 --> 00:51:42.400
Corey just recently started selling his tracks on iTunes, so I recommend you check it out at

00:51:42.400 --> 00:51:44.400
Talk Python.fm slash music.

00:51:44.400 --> 00:51:48.840
You can browse his tracks he has for sale on iTunes and listen to the full-length version

00:51:48.840 --> 00:51:49.760
of the theme song.

00:51:50.580 --> 00:51:51.840
This is your host, Michael Kennedy.

00:51:51.840 --> 00:51:53.120
Thanks so much for listening.

00:51:53.120 --> 00:51:54.300
I really appreciate it.

00:51:54.300 --> 00:51:56.440
Smix, let's get out of here.

00:51:56.440 --> 00:51:56.440
Smix, let's get out of here.

00:51:56.440 --> 00:52:18.740
Outro Music.

00:52:18.740 --> 00:52:48.720
Thank you.

