#96: Exploring Awesome Python Transcript
00:00 Python is said to be a language that comes with batteries included.
00:03 It has many meanings depending on the level you're focusing on.
00:06 The lowest, it's a very rich and expressive language.
00:09 Most commonly, this phrase means Python has a very powerful and comprehensive standard library.
00:16 Itertools or elementary, anyone?
00:18 But more holistically, most of the batteries are external, interchangeable ones from PyPI.
00:23 Right now on PyPI.io, there are over 97,000 packages listed there.
00:30 That's fantastic.
00:31 However, it does lead to a discoverability problem.
00:34 What options do you have for admin backends on web apps?
00:37 How about cryptography or raw socket programming and so on?
00:40 This week, Matt McKay is back with me.
00:43 Remember him talking about deployments on episode 26 last year?
00:46 This time, we're talking about Awesome Python, a website and open source project attempting to categorize and sort of rank these options.
00:54 This is Talk Python to Me, episode 96, recorded January 16th, 2016.
01:00 Developers, developers, developers, developers, developers.
01:03 I'm a developer in many senses of the word because I make these applications, but I also use these verbs to make this music.
01:11 I construct it line by line, just like when I'm coding another software design.
01:15 In both cases, it's about design patterns.
01:19 Anyone can get the job done.
01:20 It's the execution that matters.
01:22 I have many interests.
01:23 Sometimes you can fly to Python.
01:24 Welcome to Talk Python to Me, a weekly podcast on Python, the language, the libraries, the ecosystem, and the personalities.
01:30 This is your host, Michael Kennedy.
01:32 Follow me on Twitter where I'm @mkennedy.
01:34 Keep up with the show and listen to past episodes at talkpython.fm and follow the show on Twitter via at Talk Python.
01:42 This episode has been sponsored by AnacondaCon from Continuum Analytics and by Hired.
01:47 Thank you both for supporting the podcast.
01:50 Hey, Matt.
01:51 Welcome back to Talk Python.
01:53 Thanks, Michael.
01:53 It's good to be back.
01:54 It's great to have you back.
01:55 You just pointed out a little bit ago that it's been 70 episodes since you were on episode 26 to talk about deployments with Python.
02:04 I can't believe it's been so long.
02:06 It's hard to believe.
02:07 It's been like a year and a half, almost two years.
02:09 Yeah, yeah.
02:10 Well, that was a great episode.
02:11 It was really popular.
02:12 And, you know, the world has changed a lot since then.
02:16 So that's a lot of cool things we're going to be talking about today.
02:19 We're going to focus on stuff that we found, mostly you have found, that's awesome in the Python community.
02:25 But before we get into those, let's, you know, 70 episodes ago.
02:29 I'm not sure everybody can remember back 70 episodes.
02:32 What do you do day to day?
02:33 Sure.
02:33 So I'm a developer evangelist at Twilio.
02:36 And Twilio makes it easy for developers to add communications.
02:40 So if you want to send a text message or you want to make a phone call with Python
02:44 or any programming language or add video chat to an application, you can do that with Twilio.
02:49 What I do as a developer evangelist, I am, first off, a software developer.
02:54 I write a lot of code.
02:55 Most of my code is open source.
02:56 So it'll be examples for how to use Twilio or even just how to create something as a developer.
03:03 It doesn't have to use Twilio.
03:05 And then I travel and speak at tech conferences all on software development.
03:11 No marketing fluff.
03:12 Just really just being a software developer, I get to write code, explain code, and teach other people,
03:18 which is just absolutely awesome.
03:20 Yeah, that's great.
03:21 I always, I've always thought that these developer evangelist jobs were just fantastic, right?
03:25 Like it's part research and play.
03:28 It's part telling people about stuff that's cool.
03:30 And you have a lot of freedom to kind of learn and explore, right?
03:34 Yeah.
03:34 I mean, the big thing for me is just getting the time to create projects.
03:38 Like when I have an idea, I can just go sit down, write some code, implement it,
03:41 and then show it to other people.
03:42 It's really, it's one of my favorite parts about it.
03:45 How much does that feedback like tweak or inform the APIs that Twilio uses?
03:50 Oh, a lot.
03:51 Coming back from the evangelist.
03:52 Yeah.
03:52 I mean, one of the best parts about the gig is I get to use all of our APIs before they come out.
03:56 So before anybody gets their hands on them, myself and some of my colleagues are like testing out the APIs,
04:02 giving feedback to the API teams.
04:04 And that helps to improve the results that ultimately get into the hands of developers.
04:10 Oh, that's great.
04:10 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.
04:22 You do full stack Python, right?
04:23 Yeah.
04:23 So I'm the author of full stack Python, which is a open source project.
04:27 I started over four years ago.
04:29 And the whole idea behind full stack Python was I'm a Python developer.
04:33 And I had this before I joined Twilio.
04:35 I had a bunch of junior developers that were joining my team and they kept sending me emails.
04:39 Hey, what's a what's a whiskey server?
04:41 Like, what is that?
04:42 And I kept sending all these emails and I was like, this would probably be relevant to much more than just our team.
04:48 So I started putting together a project with pages that had explanations on every single Python topic.
04:54 And it's just expanded out from there.
04:56 I pretty much work on it every day.
04:57 And it's it's read by over 80,000 developers a month at this point.
05:02 That's fantastic.
05:02 And you have a book that goes with it as well, right?
05:04 Yeah, that's what I was on for in episode 26 back 70 episodes ago.
05:09 It's about it's a step by step guide to deploying Python applications.
05:13 So if you've never done it before, you've built your first web application.
05:16 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.
05:31 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.
05:42 So your web apps work great, but then you write it down, you put it in a script and you forget about it.
05:46 So having like a book as a reference to learn it the first time and then keep it around is really cool.
05:50 Yeah, exactly.
05:51 So and as we talked about on that episode, first, I teach how to do it manually and then we automate it with Ansible.
05:56 So it's a pretty good way to kind of understand the nitty gritty and then automate it.
06:00 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.
06:05 Yeah, absolutely.
06:06 You'll understand that when you come back, right?
06:07 You'll know what you're doing if you need to need to come back and tweak the automation.
06:11 That's cool.
06:11 Now we're going to talk about Awesome Python, the project, the GitHub project.
06:15 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?
06:20 Yeah, let's do it.
06:21 Yeah, let's do it.
06:22 So that course is almost done.
06:24 I have to say, this one is, how shall I put it, longer than I expected.
06:28 A little longer to write than I expected.
06:31 But I haven't even told you, I've finished almost all the chapters I have to record.
06:37 They're off to editors.
06:38 I have basically one and a half chapters left to record and I'll be done.
06:43 And then that just leaves a few more to go and that class will be all wrapped up.
06:45 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.
06:57 So I'm really excited.
06:59 I am so excited to get this thing out to people.
07:02 I know people have been watching it in early access mode, which you get from just buying, pre-ordering the course.
07:07 But I'm excited for it to be like really wrapped up and done.
07:11 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.
07:20 It'll be fun.
07:21 Okay, so we'll come back and let people know when that's actually finished, but it'll be soon.
07:26 I promise those of you who are out there waiting.
07:28 So let's talk about some stuff that's awesome.
07:30 Sure.
07:30 So the awesome Python repository has the great slogan, life is short, you need Python.
07:37 And it is one of many awesome lists.
07:41 So the awesome list popped up on GitHub where people just started throwing together lists of tools and resources that they were using.
07:48 And so this repository came up in the Python community.
07:53 And so this is a GitHub Vinta slash awesome Python.
07:57 It was created by Vinta Chen about a little over two years ago.
08:00 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.
08:15 Yeah, I think this is really handy when you don't know what it is you need for something.
08:22 And so I don't know how many projects are listed here.
08:24 I probably could have gone through GitHub source code and like written some script or something to figure it out.
08:29 But it seems to me like it's close to like 500, 400 projects.
08:35 And they're all categorized.
08:36 Like you said, here's admin backends.
08:38 Here's authentication.
08:40 Here's caching.
08:41 And maybe under caching, there's like 10 choices on how you can do caching and plug that into your apps.
08:47 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.
08:58 And then you can go to the caching section and, you know, pick.
09:03 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.
09:14 Like I actually came from Java and then started in Python several years ago.
09:17 And I didn't know what the equivalent to a web application server was.
09:22 Well, that's a WSGI server.
09:23 And with the awesome lists, I can see at a glance, like what should I be using for caching in Python?
09:28 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.
09:39 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.
09:52 Yeah, I think exactly.
09:53 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.
10:02 You can tell, does this have five stars or 5,000 stars, right?
10:05 How active is it?
10:06 What are the deployments?
10:08 Things like that.
10:08 It's really good for that.
10:10 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?
10:17 You want to talk about how you see those differently?
10:18 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.
10:33 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.
10:45 It's not going to sell re RQ and these different implementations.
10:50 You don't know what they're going to do for you.
10:52 So that's why I have like a task queue page that explains the conceptual idea and then explains the differences between the implementations.
10:59 So I think what's missing from an awesome list is the context.
11:03 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 the implementations you've been using that.
11:15 I mean, it's great for that.
11:16 Doesn't it just kind of gets past the the verbiage and gives you all the implementations that you need?
11:21 Yeah, I find having been a programmer for a long time.
11:23 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.
11:32 So but yeah, it's when you're totally new, maybe maybe it's not the best place to start.
11:37 But still, even if you're new, go check out the project.
11:39 It's you'll find it interesting, I think.
11:42 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.
11:50 Yeah, my criteria for this.
11:52 So we picked 10 libraries at random that are listed in the awesome Python.
11:55 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.
12:02 Thank you.
12:03 And so is Full Stack Python.
12:05 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.
12:19 So for example, we didn't choose Django because Django is talked about widely and used widely in the Python ecosystem.
12:26 But we did pick a CMS that is powered by Django under the cover.
12:31 So the CMS runs on top of Django, and we'll get to that in a few minutes.
12:35 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.
12:45 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.
12:55 That would actually be pretty interesting.
12:57 But I think here we're going to hopefully expose people to things that are like, oh, I didn't even know that existed.
13:02 That's going to be awesome.
13:03 I'm going to go check it out.
13:04 So let's see if we can deliver on that, huh?
13:06 Exactly.
13:07 All right.
13:08 You want to dive in?
13:09 Yeah, let's get started.
13:09 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.
13:19 Sure.
13:20 Yeah.
13:21 So this is the library 6.
13:24 So 6 is a Python 2 to 3 compatibility library.
13:28 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.
13:39 And now they want to support both Python 2 and 3.
13:42 So you can think about it as a bridge.
13:44 6 is a bridge from Python 2 to Python 3 and allows you to support both ecosystems at once.
13:51 So it's really providing utility functions to smooth over some of the differences between the Python versions.
13:57 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.
14:07 Right.
14:07 So where there's some kind of difference versus, you know, like raw input versus input or bytes versus stir, things like that.
14:15 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.
14:22 Right.
14:22 Yep.
14:23 Exactly.
14:23 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.
14:33 So we've got print functions that have changed.
14:35 We have other tech, the way that Unicode is handled.
14:40 All those things need to be either smoothed over in your own code or you can just use 6 as a dependency.
14:46 And it's only one Python file, which is awesome.
14:49 So you can just copy this into your project.
14:51 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.
15:00 Right.
15:00 And hopefully you can do this without having if Python 3, this code, if Python 2, that code.
15:07 But right, just leveraging this library and presumably somewhere deep inside of it, it's doing those types of things for you.
15:13 So you mentioned some of the areas that you can help with.
15:16 What else does it cover?
15:18 Where am I to use this?
15:19 For example, if you have unit test assertions in your code or you're renaming modules and attributes.
15:25 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.
15:40 And that's really where this would come in.
15:42 Yeah.
15:42 Okay, cool.
15:43 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.
15:51 You know, things like that, right?
15:52 Like, why are these so just barely different?
15:55 This is crazy.
15:55 Anyway.
15:57 Okay.
15:57 So, yeah.
15:58 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?
16:09 Yeah.
16:10 Yeah.
16:10 Yeah.
16:11 And the reason why I picked this one to highlight was it's really everywhere.
16:14 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.
16:26 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.
16:33 It's the guy behind the curtain.
16:34 Yeah.
16:34 Okay.
16:34 Awesome.
16:35 Yeah.
16:35 So check it out, 6.
16:36 And it's named 6 because 2 times 3.
16:38 Yeah.
16:39 There you go.
16:39 Nice.
16:40 Let me take just a moment and tell you about an offer from one of our sponsors, Continuum Analytics.
16:45 They're hosting AnacondaCon 2017.
16:48 It's the first conference for open data science leaders around the world.
16:52 This is the definitive gathering place for the Anaconda crew.
16:55 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.
17:05 Over 20 industry experts will discuss the open data science movement and share their best practices for leveraging Anaconda.
17:12 You'll hear how they're discovering cures for rare genetic diseases, performing city planning, and refining tax policy analysis with Python.
17:20 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.
17:32 Register today at talkpython.fm/acon to take advantage of this excellent offer.
17:38 That's talkpython.fm/acon.
17:41 Thank Continuum for supporting Talk Python.
17:44 They help make the show possible.
17:45 Now back to the interview with Matt.
17:47 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.
17:58 Yeah.
17:59 So I picked Boca, or you can also pronounce it Bo-kay.
18:02 In the official FAQ for the project, it says you can pronounce it either way.
18:06 I'm not sure if there's a more right version, but we'll call it Boca for now.
18:11 And so what this allows you to do is write Python code and create data visualizations.
18:16 And so I have tried to create data visualizations in many different JavaScript libraries before.
18:23 The most popular right now, it seems like, is D3JS.
18:27 And I love those libraries.
18:28 But when I'm in Python land, sometimes I just, I can't think about switching over into the JavaScript world.
18:36 And so a Boca allows you to just write the Python code, and then it will build the visualizations for you.
18:42 Now, it's not relying on D3JS, but it draws visualizations that are very similar to that.
18:48 And so you're not just getting like a cut rate data visualization.
18:52 This is actually building something that is like, you can include it in your web application, and it is nice and professional.
18:59 Yeah, this is really, really a cool library.
19:01 And if you're already doing some kind of scientific computation or numerical computation in Python,
19:09 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
19:16 and then write a bunch of JavaScript D3 to actually turn that back into something visual.
19:20 You can basically do all the visualizations in Python and then just plug it in.
19:24 And what's really cool is it's not just like generating like a picture, say, with Matplotlib.
19:29 Like, so with Matplotlib, you can say, here, I'd like to have this picture, boom, save it to an image,
19:33 then put the image on a page.
19:34 But these things, these bokeh graphs and visualizations that go up there, they're totally interactive, right?
19:41 Yeah, exactly.
19:42 So it's not just, as you said, it's not just an image that is generated.
19:46 It is the actual visualization that can be, that is fully interactive as well.
19:50 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.
19:57 But you can do that all in, in Python itself.
19:59 And I actually, I found out about this project a couple of years ago at PyCon 2015.
20:04 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.
20:12 And she drew an entire map with just bokeh.
20:15 And I was like, whoa, you just, you just wrote, she live coded some Python code.
20:20 And I was like, whoa, you've got a map on there with all your data.
20:22 That would have taken me a week in D3JS.
20:25 I was just so impressed with it.
20:27 Yeah, it's really, really cool.
20:28 Okay.
20:29 So, you know, another thing that's really popular in Python these days, it seems, is static site generators, right?
20:38 Yep.
20:38 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.
20:46 So I picked a separate one, and this one is either pronounced make docs or mk docs.
20:53 I actually just gave a talk on static site generators at San Francisco Python, and I tweeted at Tom Christie, who's the, the creator of not only Django rest framework, but this project as well, make docs.
21:05 And I said, hey, how do I, I'm going to check myself before I wreck myself.
21:09 How do I pronounce this project?
21:10 And he said, well, you know, I, I say mk docs with a Scottish accent.
21:15 And I was like, mk docs.
21:17 Okay.
21:18 I don't, you know, I'm not, I don't really have a Scottish accent.
21:22 So, okay, sure.
21:24 And then he said, but, you know, I don't really know.
21:25 Let me, let me talk to one of their core committers.
21:27 And he said, mk docs, that's how he pronounced it, but they don't really have a particular opinion about it.
21:32 So, you know, whatever's easiest for you.
21:35 If you've got a great Scottish accent, I say go for that route, but, but I, I certainly do not.
21:40 So what make docs is, is a static site generator for really for project documentation.
21:46 Let me ask you a quick question or clarification just for everyone listening, because many people would know, but not everyone.
21:52 What's a static site?
21:53 Yeah.
21:53 So a static site is kind of taking you back to the origins of the web.
21:57 It's just HTML flat files, HTML, and it has CSS and usually JavaScript, but there's no database backend.
22:05 There's no dynamic content on the backend.
22:08 So it's really just files that can be served up by a web server.
22:11 And the reason why it's called a generator.
22:13 So that, that would be the static site.
22:15 The generator part of it is you write your content either in markdown or restructured text or some sort of markup format.
22:23 And then you have templates.
22:25 So for Pelican, for example, Pelican has Jinja templates that you can use.
22:30 So Jinja is a template engine and make docs has its own, actually make docs makes it even easier.
22:37 You don't even have to write the templates.
22:38 If you don't want to, you just write the content.
22:40 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.
22:48 It could be XML, whatever you want, but most commonly you're producing a static site, which would be an HTML.
22:53 Okay.
22:53 Yeah, that's really cool.
22:54 And there's a lot of benefits to that.
22:56 It's super easy to scale a site like that, right?
23:00 You don't have to worry about the databases and concurrence execution.
23:04 You're just serving static files.
23:05 And it's also easy to put that on to like a CDN sort of thing, like Fastly or something, right?
23:10 Yeah.
23:11 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.
23:18 And then I just have a content delivery network.
23:22 So I have the files hosted.
23:24 Sometimes I use GitHub pages.
23:26 I've also switched it over to Amazon S3.
23:28 In front of that is a CDN, and I use Cloudflare.
23:32 And what that does is it just serves up all those files.
23:35 There's no database calls or anything like that.
23:37 It's just really fast, immediately serving up those files to whatever web browser is requesting them.
23:43 Nice.
23:43 And it serves them up.
23:44 It moves them around the globe and serves them up from somewhere by place, which is pretty awesome.
23:49 So people on the other side of the earth don't suffer because you decided to put your server in New York or whatever.
23:55 Globally distributed, exactly.
23:56 Yeah, yeah.
23:57 That's awesome.
23:57 Okay.
23:58 So what's cool about MakeDocs?
24:00 Why is it a great one?
24:02 How does it work?
24:03 I think the thing about static sites is they've traditionally been made around blogs.
24:08 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.
24:16 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.
24:24 And that allows MakeDocs to have a real project using it.
24:30 And then they open sourced it so that anybody can use it.
24:32 And the idea is generate beautiful project documentation.
24:36 Now, for many developers, documentation is sort of not the first thing on their mind.
24:40 But in the Python community, I think we have really great documentation for most of our projects.
24:45 It's kind of something that is a badge of pride.
24:47 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.
24:55 It's just going to create a beautiful set of project documentation for you.
24:59 Yeah, that's excellent.
25:00 And I think, you know, you could even check in the docs into, like, your GitHub repository.
25:04 And if somebody clones your repo, they can just go, like, right there and just have offline docs as static files.
25:09 That's really cool.
25:10 Very nice.
25:11 Okay, MakeDocs.
25:12 You know, speaking of Markdown, I think having Markdown wherever you accept user input is really nice in your web apps.
25:20 You know, Stack Overflow definitely popularized this.
25:23 Markdown comes from John Grubner a long ago, I don't know, like 2008 or something like this.
25:28 It's not a brand new idea.
25:29 But certainly using Markdown to accept input from users is much safer than accepting pure, you know, rich formatted HTML, right?
25:39 Yeah.
25:39 So the thing about Markdown is it's a certain format.
25:43 And there's, well, for better or worse, without getting too into the weeds, there are different variations on that format.
25:49 But there is sort of a standard Markdown format.
25:52 And there's a Python project that parses that out.
25:54 So then you can work with it in your Python code.
25:57 And so the Python Markdown project is kind of everywhere.
26:01 Whenever you're talking about a content management system or a static site generator like MakeDocs or Pelican, which I use.
26:07 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.
26:20 Yeah, that's really cool.
26:21 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.
26:31 And there's a place we put the show notes.
26:33 And on Talk Python, that was just an HTML fragment.
26:36 But every now and then I would mess up that HTML fragment.
26:39 And it would screw up the site.
26:41 Or, you know, I just have to like format HTML in the browser and write it by hand.
26:46 And it's not so fun.
26:47 So when I did Python Bytes, I'm like, that's it.
26:49 This part is going to be input as Markdown, output as, you know, HTML.
26:54 And so I use something similar to Python Markdown for that, which is really cool.
26:59 I actually use this thing called Python-Markdown2.
27:02 I don't think they're related to these two things.
27:04 It's nice because it has extensions.
27:07 You can add on like variations.
27:09 Like I want to add like GitHub table support type things and stuff like that.
27:13 Yeah.
27:14 Again, this is just another one of those libraries that's everywhere.
27:16 And whether they're using Python Markdown, Python Markdown2, or there's many other parses that are out there,
27:21 they're kind of the guy, the gal behind the scenes that is doing a lot of the heavy lifting
27:26 and allows other projects to take advantage of that work that's done.
27:29 Nice.
27:30 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,
27:37 one thing you do is write a site from scratch and fill in a few pieces like show notes and episode names,
27:43 or you could grab a whole CMS, right?
27:45 Yeah.
27:46 So Django can often be used as a CMS, which is a content management system.
27:51 I would say like WordPress is probably the most popular of these, right?
27:55 If you look at like overall deployments or maybe Squarespace, but plug it into Django is really sweet.
28:00 So you found a really nice one.
28:02 What happens is if you start building a site on Django, and particularly if people that are not developers are using it,
28:08 you often find that you run into limitations.
28:11 And that's not, I wouldn't say that this is necessarily something that Django has to fix.
28:15 This is where a content management system comes in.
28:17 So let me give you a specific example.
28:20 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,
28:29 and then you want to roll back, you say, oh, shoot, I deleted, I deleted a page.
28:34 You know, let's roll back.
28:36 Well, Django doesn't have that type of capability.
28:40 And that's where content management systems are on top of that.
28:44 So the one that we picked here is Wagtail.
28:47 And Wagtail is actually a newer content management system than some of the other ones like Mezzanine or Django CMS.
28:54 But Wagtail is, I've been really impressed with Wagtail.
28:58 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.
29:04 And it's been really powerful so far.
29:06 Yeah, that's really great.
29:07 And they've got a great example.
29:09 They have like a demo video for it as well for Wagtail.
29:12 And it was used at the Royal College of Art.
29:14 It's in the UK somewhere.
29:16 And it basically powers that website with thousands of web pages and many, many users and all sorts of really cool workflows.
29:25 It's actually quite visual and pretty.
29:27 One of the things that comes to mind when I think of CMSs is they seem synonymous with slow and clunky to me.
29:36 There's a tradeoff with CMSs, which is that they're building all this extra functionality on top of an existing web framework.
29:42 And they need to be used by people that are not developers.
29:45 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.
29:53 So there's a tradeoff.
29:54 Sometimes CMSs are too heavy-handed.
29:56 Sometimes they're just really confusing to use.
29:59 But I found that Wagtail, which we're actually using at Twilio, is actually one of our favorite CMSs.
30:05 And we did a large evaluation with a lot of different programming languages.
30:08 And this is the one that came on top for us.
30:10 It's not necessarily the best for everybody, but it's the one that works really well for us.
30:14 I can say the Royal College of Art website is quite zippy, even though I'm like nine hours time zone away from it.
30:22 So mostly any sort of slowness would be ping time.
30:25 So I feel like this is a CMS that doesn't have that feeling, right?
30:29 It's really nice.
30:30 And it's awesome because you're using it at Twilio, too.
30:32 Well, the thing about Wagtail is that they've done a great job with making it really polished.
30:36 And I think that's one of the reasons why we were so impressed with it.
30:39 And so this is what's powering the Twilio docs.
30:43 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.
30:52 They're writing docs.
30:53 They're updating the docs when things need to be fixed.
30:56 And so we needed some sort of powerful platform that allowed many different teams to interact with it.
31:01 So after our evaluation, we've used Wagtail as our CMS for the Twilio docs.
31:05 Yeah, it's really cool.
31:06 I'm looking forward to finding a place to use it because it looks like it's fun to use.
31:10 The back end looks real friendly and modern, not like some crummy sort of app.
31:14 It's nice.
31:14 It's a really nice and polished project, really.
31:16 I think a little bit newer and up and coming as a CMS.
31:19 Awesome.
31:20 And it's cool that it was on the awesome list.
31:22 Okay, so another thing that I think is really interesting is design patterns.
31:26 I've always loved design patterns.
31:27 You know, I've read, I remember reading the Gang of Four book about C++ and small talk design patterns like way long ago.
31:35 And then reading it again so I could actually understand it like a few years later.
31:40 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.
31:49 Like, for example, the decorator pattern.
31:52 You know, that has one form of C++, but it's almost a language feature in Python.
31:57 Yeah.
31:58 That's where the, on the awesome list is the Python patterns repository.
32:03 So there's a link to Python patterns.
32:05 And this is the implementations of various patterns, whether it's like behavioral patterns or structural patterns, different conceptual ideas.
32:14 And they're implemented in Python code.
32:15 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.
32:27 I think it's really great for people who are coming from another language.
32:31 They already have these ideas in their mind, right?
32:33 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.
32:39 I never would have thought to do it this way.
32:40 This is so much better than what I was trying to do a minute ago.
32:43 And they have some interesting ones in here.
32:46 They have the standard gang of four ones like state, strategy, iterator, visitor, and so on.
32:50 But then they also have some things like the Borg design pattern and the Blackboard design pattern.
32:57 So I actually learned a few things.
32:59 And I don't really know yet where I'd use the Borg, but I'm pretty sure I like the name of it.
33:04 This repository is great for learning.
33:06 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.
33:19 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.
33:30 So I think these are awesome for just learning about how different patterns could be implemented.
33:35 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.
33:44 Yeah, I kind of have like an Einstein type of philosophy about design patterns.
33:50 Like design patterns are awesome.
33:51 And you should use them in your code.
33:53 But just enough, right?
33:56 Things should be as simple as they can, but not simpler, right?
33:58 Like you should have patterns that solve problems.
34:01 But I feel like people, when they learn design patterns at first, they're like, oh, I'm going to put patterns everywhere.
34:05 I can't wait to like turn everything into a state pattern.
34:07 And then the visitors go in here like, oh, no.
34:09 Oh, no, that's going to be unmaintainable, right?
34:11 And so patterns, I don't know, to me, they're like salt, right?
34:15 A little bit here and there.
34:15 Yep.
34:16 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.
34:25 Yeah, absolutely.
34:25 You know, another thing that I'd like to lean on to some kind of framework for is authentication, especially things like OAuth.
34:34 Those are super, super complicated to figure out yourself.
34:37 But luckily on our list here, we have some OAuth stuff, right?
34:40 Yeah.
34:40 So the project we picked here is Authomatic.
34:43 And the tagline here is simple but powerful framework authentication and authorization client.
34:48 I think there's a spectrum with authentication libraries.
34:52 On one hand, you've got sort of these maybe heavy handed.
34:56 They tell you exactly how to implement authentication models.
35:00 So for example, OAuth.
35:01 Let's say you want to have a Twitter-based login or a GitHub-based login.
35:05 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.
35:16 But on the other hand, these libraries have to work with various frameworks.
35:23 So the way that you would implement something in Django versus Flask versus Pyramid versus Turbogears can be different.
35:29 And that's where I think taking a look at all the different libraries can be helpful.
35:35 So Authomatic seemed like a really great one because it had examples with different frameworks, which I really liked.
35:41 Yeah.
35:42 You can definitely go in there and it's like these are the few things you drop in for Django.
35:45 Here's the few things you do for Flask.
35:47 Here's what you do for Pyramid.
35:48 Even one for Google App Engine.
35:49 And I really found that some of the other ones that seemed comprehensive had almost no examples.
35:55 And you're like, but there's all these moving parts.
35:57 How do I put this together in this particular web framework?
36:01 Like, why is there no example here?
36:02 Yeah, I looked at a number of them.
36:04 And maybe we should put a little word of caution in that this hasn't been updated for a little while.
36:08 But that's kind of true with some of the other options out there as well.
36:11 So they kind of seem more steady state or they're in some sort of flux or something.
36:16 So look through the whole list.
36:18 Here's just one example to sort of point out.
36:19 Like, there's a bunch of great things about OAuth and social auth and things like that.
36:23 Yep.
36:23 And this makes it much easier for you to implement them rather than having to rewrite everything in your own code.
36:29 Yeah, for sure.
36:30 This portion of Talk Python is brought to you by Hired.
36:44 Hired is the platform for top Python developer jobs.
36:47 Create your profile and instantly get access to 3,500 companies who will work to compete with you.
36:51 Take it from one of Hired's users who recently got a job and said, I had my first offer on Thursday after going live on Monday and I ended up getting eight offers in total.
37:00 I've worked with recruiters in the past, but they've always been pretty hit and miss.
37:03 I tried LinkedIn, but I found Hired to be the best.
37:06 I really like knowing the salary up front.
37:08 Privacy was also a huge seller for me.
37:10 Sounds awesome, doesn't it?
37:12 Well, wait until you hear about the sign-in bonus.
37:14 Everyone who accepts a job from Hired gets $1,000 signing bonus.
37:17 And as Talk Python listeners, it gets way sweeter.
37:20 Use the link Hired.com slash Talk Python to me and Hired will double the signing bonus to $2,000.
37:25 Opportunity's knocking.
37:27 Visit Hired.com slash Talk Python to me and answer the door.
37:38 You talked about static sites earlier.
37:40 We mentioned the deployment and the performance story and all that, and that's great.
37:44 But sometimes you just need a data-driven web app, right?
37:49 Like, for example, it's super hard to go to, like, a static site and add voting or comments or things like this, right?
37:56 So maybe the thing that you're building, you really do need to have some kind of data-driven thing here.
38:02 But if it's not fast enough, what are you going to do?
38:05 Well, you've got to have caching.
38:06 So, you know, caching is one of these really hard problems in computer science.
38:10 So taking advantage of a library that allows you to implement caching can be really helpful.
38:15 And I know this one you picked, Beaker.
38:18 Why don't you tell us a little bit about Beaker?
38:20 Yeah, yeah.
38:21 Beaker looks really awesome.
38:22 So Beaker is a way in which you can cache binary representations, pickled versions of Python object graphs.
38:31 So you just take the thing you want to save and you just stash it in Beaker.
38:35 And it can go into all different places, right?
38:38 It can go into databases.
38:41 It can go into memcached.
38:42 It can go into just be stuck in memory, you know, until your process reboots.
38:46 You can go straight to the file.
38:47 And it also has a SQLAlchemy plug-in.
38:49 So you point SQLAlchemy at the database that you care about, right?
38:54 SQLAlchemy supports all sorts of different databases.
38:56 And then it just talks to SQLAlchemy.
38:58 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.
39:06 So there's all sorts of cool stuff.
39:08 Like you can take it and plug it in as middleware in WSGI servers.
39:13 So it automatically has little plug-ins for pylons, pyramid, turbo gears, things like this.
39:18 Yeah.
39:20 I think this could be really helpful for people who need that one or two slow pages to go much faster.
39:26 Yeah.
39:27 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.
39:33 So Beaker seems like a really capable one to use.
39:37 Yeah.
39:37 Yeah.
39:37 It definitely does.
39:38 So some of the features they list are like it's fast, obviously.
39:42 That's a requirement for a cache, right?
39:44 But it has multiple reader, reader, writer, block performance.
39:48 So it avoids duplicate creation but allows for high parallelism for reading.
39:53 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.
40:00 All that kind of stuff is really cool.
40:02 Yeah.
40:02 Sounds like a good one to check out.
40:04 So another one that you picked, which I think is really smart because people always say, hey, don't roll your own crypto.
40:11 And you don't want to write your own password storage hashing library unless you're just trying to learn how it's done.
40:18 But you don't necessarily want to write something for production.
40:20 But you picked Passlib, which you've used in the past.
40:23 Why don't you tell us about Passlib?
40:25 Yeah, I use Passlib all over the place.
40:26 I use it on the training website, for example, for accounts there.
40:29 And I don't want people to end up on, you know, some sort of news story.
40:34 Oh, a development server with production data was compromised.
40:39 And here's, you know, a quarter million accounts.
40:42 And too bad they used poor, like an old outdated hashing algorithm or something like that.
40:48 And it turns out that everybody's going to have to reset all their passwords on the internet everywhere.
40:52 So Passlib, I hope, will help people avoid that fate.
40:58 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.
41:11 So if you can't remember to call encrypt and verify, you know, you probably have no business writing authentication code, right?
41:18 But the idea is they provide a whole bunch of different caching algorithms or, sorry, hashing algorithms.
41:25 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.
41:40 So Argon2, Bcrypt, SHA-512crypt, things like that.
41:45 So you're already starting from, thank goodness they didn't use MD5 for the hashing, right?
41:50 Which is one of the problems.
41:53 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.
42:04 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.
42:11 And so you want to make the stored passwords computationally difficult to guess at.
42:17 So instead of just hashing with a strong algorithm, Passlib will take it and it'll hash it like 200,000 times.
42:24 So it'll take the input, stuff it back around, hash that thing, and then just, you know, fold it over 200,000 times.
42:30 And it also adds random salt to each thing it stores.
42:34 And, of course, folds that all through.
42:36 So it's just super hard to guess what the possibility is.
42:40 But it's easy for you.
42:42 You get back some kind of password hash.
42:43 You call verify with the plain text password and either it matches or it doesn't.
42:46 Yeah.
42:47 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.
42:54 And so they have more time to work on features.
42:56 And it seems like this is making a good tradeoff where it's, hey, this is really simple.
43:01 Here's what you do.
43:02 Call these two functions and we'll take care of this bit for you.
43:05 So that seems like, as far as a library, that's probably some of the best you can ask for.
43:09 Yeah, it's really cool.
43:10 And you can actually evolve over time.
43:12 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.
43:21 And so as computers get faster, you can actually crank that number up over time without breaking the old passwords.
43:28 And then when the user comes back, you just regenerate with a newer, more computationally expensive variant.
43:33 Nice.
43:34 Yep.
43:34 Also supports two-factor authentication, but I know nothing about this.
43:39 You could use Authy for that or implement with SMS via Twilio.
43:43 That's my little Twilio commercial for this one episode.
43:46 Oh, awesome.
43:47 Very cool.
43:48 Okay.
43:49 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?
43:58 That I can just go grab all these awesome packages and, you know, 95,000 others.
44:03 Yeah.
44:04 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.
44:14 As a Python developer, it makes things so much easier for me.
44:17 When I was a Java developer and I used to use Maven, Maven was incredibly complicated.
44:23 You have this huge, you have these massive XML files.
44:27 It worked, but it was just, it was really complicated.
44:31 And then I came over to Python and you've got a requirements.txt file.
44:35 And requirements.txt, when I read it, I thought, this is so beautiful.
44:40 I literally thought it was beautiful.
44:42 There, you have the name of the library that you depend upon.
44:45 You have, and then you optionally have the version number that you want to use for that library.
44:51 Now I say optionally, but really it should be required.
44:54 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.
45:04 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.
45:09 You know, we use Django.
45:10 And I thought, okay, Django, that's great.
45:12 Which version?
45:13 And they're like, well, we don't, we don't know.
45:15 And so, so we've got, we luckily have now some tools that help out with figuring out what those dependencies are.
45:24 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.
45:35 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.
45:47 So if you, for example, like Django, which version of Django is at 1.4 is a 1.10.
45:51 This will help you to figure that out.
45:53 Yeah, absolutely.
45:54 Yeah.
45:54 And pip-tools will actually generate the full dependency graph for you.
46:00 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.
46:10 Right.
46:10 But flask itself requires it's dangerous and Jinja to and markup safe and these types of things.
46:16 So you can go to pip-tools and you say, run pip compile, and it will actually generate a requirements.txt.
46:22 That has the sort of closure of all of your dependencies, the dependencies and their dependencies and so on.
46:28 So you can see and pin every single dependence you have.
46:31 And it also adds a little comment like these dependencies were added because of flask.
46:36 This one was added because of Jinja, which was added because of flask, things like that.
46:41 I think that was really cool.
46:42 Yeah.
46:42 Yeah, definitely.
46:43 And just incredibly handy.
46:44 If you get dropped into a project and you have no idea what the exact version numbers and requirements and dependencies of dependencies are.
46:53 Yeah, absolutely.
46:53 And the thing that I use actually in production for this kind of stuff, it's not the same, but I use pyup.io.
47:00 I met those guys through the show a while ago and I'm like, wow, this is such a cool project.
47:04 Pyup.io.
47:05 And you basically, it's like an online system.
47:08 You point it at your GitHub repo, public or private, and it will watch this file.
47:12 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.
47:22 Here's the updated requirements.txt to fix it in your app.
47:25 Wow.
47:26 That is incredible.
47:27 That's super useful.
47:27 Yeah.
47:28 It's the notification.
47:29 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.
47:38 Awesome.
47:39 Okay.
47:39 Well, those were a great bunch of libraries.
47:42 Hopefully you guys learned a lot about them.
47:44 Matt, it was fun to explore these with you.
47:47 I didn't know about all of them before we started talking.
47:50 Well, I don't think anybody knows all of the Python projects that are out there.
47:55 You wouldn't get any coding done if you knew what all the projects were.
47:58 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.
48:06 Yeah.
48:07 I totally agree.
48:08 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.
48:17 Very cool.
48:17 All right.
48:18 So as always, before I let you get out of here, let me ask you the two questions.
48:22 Okay.
48:23 So I don't even actually remember your answer from a year and a half ago.
48:27 So when you write some Python code or any code, really, what editor do you use?
48:30 So I use Vim.
48:31 That hasn't changed.
48:33 It's been Vim for a fairly long amount of time.
48:36 Now, to be fair, I use Vim for Python code.
48:40 Most things I do.
48:41 I use Xcode for my Swift code and I use IntelliJ, the ultimate IntelliJ edition for Java code.
48:48 So I've been doing some more Java coding lately.
48:51 So I kind of bounce back and forth.
48:52 But I almost always use the Vim mode in whatever editor that I'm in.
48:57 Yeah.
48:57 That's probably a requirement for you, right?
48:59 That it has a Vim mode.
49:00 Yes.
49:01 Nice.
49:02 All right.
49:03 And we kind of touched on a bunch here, but you want to pull out a favorite PyPI package?
49:07 Oh, man.
49:08 I'm going to, I got to, you know, I got to give a shout out to Pelican.
49:13 I just, as a static site generator, I think when you use a tool, and I may have said this
49:18 on episode 26, but when you use a tool for six, seven years and you still love it, I think
49:23 that's a really good, really good sign.
49:25 So Pelican is that tool for me.
49:27 And it's a great static site generator that powers full stack Python.
49:32 Yeah, that's awesome.
49:33 I think that is a really good sign.
49:34 If you love it after you've lived with it for a while, then it must be something special.
49:39 Very cool.
49:40 So I feel kind of like as a final call to action, I noticed there were some projects not listed
49:46 there that I thought were awesome.
49:48 You look in various, some of the categories, you're like, oh, why is this not listed here?
49:53 So maybe if you're out there and you own a package or you're really passionate about it
49:57 and you don't see it there, you think it's awesome, maybe go send those guys a message
50:01 and let them know they should add your package.
50:03 All right.
50:04 Well, Matt, it's been fun to talk to you.
50:07 Thanks for sharing these packages with everyone.
50:09 Yeah.
50:09 Thanks, Michael.
50:10 It's been a great time.
50:11 Yeah.
50:11 Great to catch up with you.
50:12 See you later.
50:14 This has been another episode of Talk Python to Me.
50:17 Today's guest has been Matthew Mackay.
50:19 And this episode has been sponsored by AnacondaCon from Continuum Analytics and by Hired.
50:26 Thank you both for supporting the podcast.
50:28 Whether you want to hear the keynote by Ryan Curran from Forrester Research, meet the guys
50:32 behind Anaconda, or just mingle with high-end data scientists, you need to find your way to
50:36 Austin, Texas for AnacondaCon this February.
50:39 Start at talkpython.fm/acon.
50:42 Hired wants to help you find your next big thing.
50:45 Visit Hired.com slash Talk Python to me to get five or more offers with salary and equity
50:50 presented right up front and a special listener signing bonus of $2,000.
50:53 Are you or a colleague trying to learn Python?
50:56 Have you tried books and videos that just left you bored by covering topics point by point?
51:01 Well, check out my online course, Python Jumpstart by Building 10 Apps at talkpython.fm/course
51:07 to experience a more engaging way to learn Python.
51:10 And if you're looking for something a little more advanced, try my Write Pythonic Code course
51:14 at talkpython.fm/Pythonic.
51:17 Be sure to subscribe to the show.
51:19 Open your favorite podcatcher and search for Python.
51:22 We should be right at the top.
51:23 You can also find the iTunes feed at /itunes, Google Play feed at /play, and
51:29 direct RSS feed at /rss on talkpython.fm.
51:32 Our theme music is Developers, Developers, Developers by Corey Smith, who goes by Smix.
51:37 Corey just recently started selling his tracks on iTunes, so I recommend you check it out at
51:42 talkpython.fm/music.
51:44 You can browse his tracks he has for sale on iTunes and listen to the full-length version
51:48 of the theme song.
51:50 This is your host, Michael Kennedy.
51:51 Thanks so much for listening.
51:53 I really appreciate it.
51:54 Smix, let's get out of here.
51:56 Smix, let's get out of here.
51:56 Outro Music.
52:18 Thank you.