Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #56: The pendulum of time swings beautifully in PyPI

Return to episode page view on github
Recorded on Wednesday, Dec 13, 2017.

00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to

00:05 your earbuds. This is episode 56, recorded December 12th, 2017. I'm Michael Kennedy.

00:11 And I'm Brian Okken.

00:12 And we got a bunch of awesome stuff like always lined up for you. Before we get to it, Brian,

00:16 let's just say thanks to Rollbar.

00:17 Thanks, Rollbar.

00:17 Yeah, thank you, Rollbar, for supporting the show, tell you more about what they got going

00:21 on later. I want to hear the tick-tock of the pendulum, if you will.

00:26 I was reading an article called Dealing with Date Times Like a Pro in Python.

00:30 Which can be way harder than it should be, right?

00:32 Yes. And I think that there's things like Arrow and Maya that try to get so that, you know,

00:38 I really have to deal with date times directly. But this is actually a nice article on dealing

00:43 with date times if you want to use the direct library. However, at the end of it, they mentioned

00:48 Pendulum, which I hadn't run across before. So checking it out, there's a link here for the

00:53 Pendulum Python Date Times Made Easy. And the website is beautiful. But also the interface

01:01 to it, it looks really nice. I mean, you can do things like just import Pendulum and then

01:08 Pendulum Now in Europe, Paris, or in America, or something. And then you can do things like

01:15 add dates together and do, you know, subtract dates. And the normal things you have to do with

01:21 date times. But the just the model looks nice. I like it.

01:24 Yeah, it looks really, really nice. And the website is quite stunning. And you know, to me,

01:30 like on one hand, like, okay, whatever, it's documentation. On the other, it really shows the

01:34 people working on this actually care about this project. And it's not just some random thing

01:38 thrown on GitHub. So yeah, it's really cool. So you say like Pendulum.now and you give it a time

01:42 zone, say like Europe slash Paris. And then you can subtract weeks from it. Or you can,

01:47 one thing I like to do is put times relative to humans like a week ago, five seconds ago in 10

01:53 minutes. And so it just has a diff for humans, you know, and that's really nice.

01:58 I'm going to include in the show notes links to Arrow and Maya. And I think it's, it's a matter of

02:03 developer taste really, and what looks more natural to you. So check them all out and see what's nicer

02:09 for you.

02:09 Yeah, it's really nice. The other one to throw in here while we're thinking about all this is parsing

02:13 date times, which I think there's 700 different formats for date times and text, which is insane.

02:19 But I really like to use Python date util. So pip install Python dash date util, but just import

02:25 date util. And it compars like lots and lots of stuff. So you can just go here, load that into time,

02:31 you know, and that's, that's one more thing. But this is really, really slick. It has more

02:35 sort of time delta things like how many weeks, how many days, how many hours, as opposed to just like

02:40 the seconds, total seconds, the built in one really nice. I like it. Good find. So the next thing that

02:45 I want to talk about, we're going to talk about some web stuff, aren't we? So the next one I want

02:48 to do is, it's sort of a web thing, but it doesn't really have to be it's any kind of service or long

02:53 running thing. So one of the things that can be a challenge with web applications is long, long

03:00 running tasks or tasks that are slow, but you don't really need to like wait on their outcome.

03:04 So I'll give you an example. On my training website, training.talkpython.fm on that site,

03:10 there's a capability to email everyone in a class. And it turns out, if you in the same request,

03:19 actually email thousands of people, one at a time, like through Amazon SES or something that

03:25 request times out, and then you've emailed some people and you don't know how far you got,

03:31 you've got to go figure out how to rewrite that some other way, right? That's a problem.

03:35 Yeah. So there's certain things like email, like logging, like other sort of kick this job off and

03:41 forget about it, that would be much better served in some sort of asynchronous way. One of the best

03:46 things you can do to add scalability to your app is to push those kinds of things onto some background,

03:50 sort of get to it when you can style. And probably the most formal way is to use some kind of queuing.

03:57 So this, the thing I want to talk about now is this article called Flask, asynchronous background

04:01 tasks with Celery and Redis. Although it has nothing really to do with Flask, although it just

04:06 uses Flask as an example. It could be Django, it could be Pyramid, like really it's the Celery bit

04:10 that's interesting. So you take Celery as the work, the worker, right? It's going to run back there.

04:15 It's going to look at the Redis message bus. And what you do is you just kick jobs off to it,

04:21 and it'll just start pulling them off and working on them. So what I could have done is said,

04:24 I want to email, you know, 3000 people. So go to the database, get the 3000 people and just put 3000

04:30 email this person jobs onto a Celery queue and been done straight away. And it would just, you know,

04:36 do it over the next minute or two. Actually, that's pretty cool. Yeah, I've got my the wheels are

04:40 turning in my head thinking things that I want to use Celery for. I know, I feel the same way. It's

04:44 really nice write up of how you like walk through these things. So it talks about using the Celery client to

04:48 connect Flask to Celery, the Celery worker process, the message broker that works with the

04:54 Redis back end. And the other thing that's interesting about this is so often these Python

04:59 examples, these especially Python web examples are done on macOS or Linux, and this is all on Windows.

05:05 And I don't think Redis is even supported on Windows or Celery, one of them. I think it's Redis. It's not,

05:11 there's like a, an unofficial build or something. So I think it's kind of extra interesting to show

05:16 this other angle and show people how to do it where it might not be so obvious. Also something

05:21 like taking on Celery, it's kind of nice to look at an example project to see how it's been used,

05:26 because just jumping right into the, the entry of the documentation can be a little scary sometimes.

05:31 Here's a nice little simple example and take it and do what you will with it. Yeah. Well,

05:35 we have another web example that I liked in it. This is from Bob Belderboss of PyBytes. He wrote a

05:43 guest article on real Python called building a simple web app with bottle SQLAlchemy and the

05:49 Twitter API. And the reason why this caught my attention is because I was curious about having some

05:55 way to interact with Twitter and Python. So I think I'm going to walk through this a little bit. And

06:00 from start to finish, it's a project that pulls, it isn't pushing things into Twitter,

06:06 it's reading Twitter and then displaying them on a, a little bottle website that they pushed up to

06:12 Heroku. And that's kind of cool that they document everything from start to finish for this.

06:17 Yeah. And it has the deployment bit as well, like pushing it to Heroku and making it work there,

06:22 which is also kind of cool because your web apps are fun, but they belong on the web, not your laptop.

06:27 It's on my queue of things to, on my salary queue of things to learn because I'm, I'm busy learning

06:33 Flask at the time, but maybe I'll check this out next. Yeah. It sounds really interesting. Definitely.

06:38 Nice job, Bob. Now, before we get on to talking about something that's actually not on the web,

06:45 but to do with Python, let me just tell you a quick story of yesterday. Yesterday I decided,

06:52 let me see how far I can push the performance of micro WSGI and NGINX on the talk Python sites.

06:59 Luckily for you, Brian, I didn't do this on pythonbytes.fm, but like, all right, I think I can push

07:06 the parallelism out better. I could crank up the number of threads. I can crack open the process

07:11 affinity, processor affinity. So like get the maximum parallelization out of micro WSGI, which is one of

07:18 the better sort of application tier worker process web servers for Python. Okay. So that seemed like a

07:26 good idea, right? Yeah. Turns out something about the threading was bad and I don't know what it is.

07:32 I don't really care to look into it, but I started getting roll bar notifications saying that the template

07:40 files could not be found for the website, which has been basically largely unchanged for months.

07:48 And then it couldn't convert this template to a string and all sorts of random errors. And I'm like,

07:54 what is going on? And there's some kind of corruption timing problem in this whole series.

07:59 And I would have, it happened like one out of a hundred thousand times. I mean, really,

08:04 really rare, but it started coming in like a couple of times yesterday. So I'm like, all right, well,

08:09 I guess we're going to turn that back down and turn it back down. Errors went away. And without roll bar,

08:13 I never would have known it. So if you guys want to make sure that your apps are working,

08:17 go check out roll bar, just pythonbytes.fm/rollbar and you sign up and you too may start getting

08:24 weird messages that you need to go look into. It'd be awesome. Yeah. Nice.

08:27 Yeah. So that was yesterday, but today I want to move on and talk about something that actually

08:34 covered way back on Talk Python, let's say about a 40 episodes ago. So not quite a year, 40 weeks ago.

08:41 And that was the Visual Studio Code extension written by a guy named Don Jayamana.

08:48 John Amani. Sorry about that. I'm sure I'm messing up your name. And he wrote a really cool Python

08:55 extension to basically add Python capabilities to VS Code. And it turned out to be the first or second

09:00 most popular thing in Visual Studio Code. It happened like millions of downloads. That's pretty cool,

09:05 right? That's very cool. Yeah. Yeah. And so one of the things I looked at, you know, when we spoke,

09:10 it's pretty interesting. He took, I'd say maybe 10 different packages, Jedi and other, you know,

09:16 Flake 8 and those types of things. And he basically wove those together into an extension for VS Code.

09:22 He didn't really build a huge amount, but he definitely put it together in a really, really usable way.

09:27 So that was, that was pretty cool. So today, this week, the news is that he is now officially hired by

09:34 Microsoft because of his open source project. That's nice. Really cool. Yeah. So here's a guy who started

09:39 an open source project and got this pretty influential job just because he had a really successful

09:45 plugin for this open source thing. So pretty, pretty cool. You know, it doesn't really mean many changes.

09:50 I just, there's a few more people working on the Python extension for VS Code, which if you're into VS Code,

09:56 it's a lot like Adam or a sublime. It's quite, quite nice. If that's your style of editor, it does a lot of

10:03 cool stuff. And so basically there'll be more people working on it, fewer bugs, faster turnaround.

10:07 The other big news is they're also hiring for a Visual Studio Code Python developer. So if you're

10:12 looking for a job and that sounds pretty awesome, you know, there's some really cool guys over there.

10:16 There's Brett Cannon, there's Steve Dower, some of the big hitters on the Python core dev team,

10:21 in addition to Don. So that might be worth looking into if that interests you.

10:25 Nice. So I feel like you're kind of doing this web crash course and getting into a lot of different

10:30 things on the web, right?

10:32 I'm trying to embrace the web a little bit more.

10:34 Nice. So what'd you find?

10:35 Yeah. So one of the things with, we talk about a lot of mechanics of how to get websites up

10:41 with Flask and Bottle and Django and all that. But sometimes the design of your website that,

10:49 as it turns out at the end, is like leaves a little bit lacking.

10:53 It looks like a developer designed it.

10:55 Yeah, it definitely looks like a developer designed it, which is usually better than when it looks like

11:01 like a database engineer designed it. But still, there's an article called a comprehensive,

11:07 it's on Smashing Magazine called a comprehensive guide to web design. It's a long article, but it's

11:13 all one page. And it's a, it's a nice, I think a good overview of the basically the basics of

11:20 make sure you have this stuff down and to make sure your website doesn't suck too bad.

11:26 That's really cool. I feel like design is one of those things that feels like a barrier to developers.

11:31 You're like, I'm not a designer. I can't do stuff that's pretty. I can't build these types of things.

11:35 But if you put in just a little effort, you can turn that barrier into a superpower because most

11:39 people don't have it. And it's actually not that hard if you just sit down and focus and try to study it

11:45 for a month or something. Especially a lot of times, like there's a lot of projects that get done, like

11:49 internal work projects or, or different tools for a small group of people that you don't have the money

11:56 to hire a front end designer. So something like this to go through and make sure that you do your breadcrumbs

12:02 appropriately and you put your search box in a findable place and some of these page structure

12:09 are reviews that are good to just make, make it more usable. And it, this doesn't add a lot of work to your

12:14 workflow. It actually, I think it takes away some of the stress of designing a web page if you're not a designer.

12:21 Yeah, it's cool. It gives you a framework to think through and stuff you got to do anyway. That's cool.

12:24 All right. Final item. What would you name the baby of requests and Selenium coming together to create some new library?

12:33 Well, I know the answer, but.

12:35 Requestium.

12:36 Requestium.

12:37 Maybe, maybe one of the candidates you throw out there, right?

12:40 Yeah.

12:40 So the thing I want to talk about is this thing called Requestium. And we have requests,

12:44 which everybody knows, super, super popular library for just downloading HTML.

12:49 And we have Selenium, which fewer people know, but is basically a headless Chrome browser.

12:55 There's other options as well, but let's say Chrome for now. And you control it from Python.

12:59 And so use them in different situations. Requests is super lightweight, takes no, very,

13:04 very few dependencies. I mean, it doesn't depend on say Chrome. It just depends on a few packages.

13:08 And you can download the HTML and do what you will with it. But if you happen to run into,

13:13 let's say an AngularJS or VueJS or any other JS site that has like a front end JavaScript framework

13:20 that basically requires the JavaScript to execute, to get the content, you end up with just a bunch

13:26 of curly braces that have no meaning when you hit it with requests, right?

13:29 Yeah. I didn't know that.

13:30 Yeah. You just get the HTML that's basically, here's where JavaScript will fill out the holes.

13:34 Good luck with that. You know what I mean? And so that's kind of useless. So you might use Selenium,

13:39 but you know, Selenium is way more heavyweight. So that Requestium basically merges the power of

13:44 requests, Selenium, and this thing called Parcel, which is like beautiful soup or Scrapey. It

13:49 understands HTML and lets you ask questions of it. So the idea is like, it's written for mostly when

13:55 you're doing requests, but that one time or two that you're like, oh, you need this login sequence

14:00 has to happen in a richer JavaScript way. And it lets you do crazy things like automatically switch

14:06 between request sessions and Selenium sessions. And it lets you basically, I think, share cookies

14:13 across them and all sorts of interesting stuff like that. So if you need like a little bit heavier weight,

14:18 then request, but not full on Selenium, here's a nice combo sort of marriage of the two.

14:23 Oh, that's nice. Cool.

14:24 Yeah. So very good for either testing or web scraping or some other, other types of things.

14:30 But if you need to test something that's JavaScript heavy, this is a pretty good,

14:33 pretty good option here.

14:34 Nice.

14:34 All right. Well, that's our news, Brian, at least the ones we've selected for everyone else. But how

14:38 about yourself? What do you got going on?

14:39 Well, I finally got a, a testing code episode out this not too long ago. I don't know if I brought it

14:45 up already.

14:46 I don't think so. Not here.

14:47 It was a nice interview with Catherine Jarmal or Kjam about testing and data science. And it's a

14:55 testing code episode 33, and it's been very well received so far. So a lot of people get some value

15:00 out of it.

15:01 Yeah, that's great. Catherine's done a bunch of cool work. So definitely go over there and check it out.

15:04 And the last thing I wanted to mention was I had asked people to leave Amazon reviews for books

15:10 that they like, including mine, hopefully. And so far, nine people have left reviews on Python testing

15:17 with pytest. So thanks a lot.

15:19 Yeah, that's great.

15:19 How about you? Any news?

15:20 Not a whole lot of news. I'm working hard, but I'm getting things ready to talk about. Nothing

15:26 to talk about yet, but someday soon. I guess the big thing I have coming up, I just recorded

15:31 some nice talk Python episodes. One actually on optimizing web servers. And then later this week,

15:38 I'm recording one, which is a panel session on machine learning and artificial intelligence at

15:44 the Large Hadron Collider and in particle physics.

15:46 Oh, that sounds interesting. And the last few episodes that you've put out, I mean, you always

15:52 have good episodes, but I've really enjoyed the last few quite a bit.

15:54 Thanks a bunch. Yeah, same for you. All right, man. Well, thank you for sharing this stuff. And

16:00 everyone, thank you for listening.

16:01 Thank you.

16:02 Thank you for listening to Python Bytes. Follow the show on Twitter via @pythonbytes.

16:07 That's Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm.

16:14 If you have a news item you want featured, just visit pythonbytes.fm and send it our way. We're

16:18 always on the lookout for sharing something cool. On behalf of myself and Brian Okken,

16:23 this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.

Back to show page