WEBVTT

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

00:00:05.920 --> 00:00:11.380
This is episode 33, recorded July 5th, 2017.

00:00:11.380 --> 00:00:12.360
And I'm Michael Kennedy.

00:00:12.360 --> 00:00:13.280
And I'm Brian Okken.

00:00:13.280 --> 00:00:15.180
And we've got some pretty sweet stuff lined up for you.

00:00:15.180 --> 00:00:19.700
But Brian, before we get into that, I just want to say this episode is brought to you by Rollbar.

00:00:19.700 --> 00:00:22.700
They've come on to sponsor a lot of the upcoming episodes, so thank you, Rollbar.

00:00:22.700 --> 00:00:23.800
Thank you, Rollbar, yes.

00:00:23.800 --> 00:00:24.280
Absolutely.

00:00:24.280 --> 00:00:28.360
You know, they would actually tell you if you had an error in your code.

00:00:28.360 --> 00:00:32.160
But would it be better if you could actually not have errors in your production code?

00:00:32.160 --> 00:00:33.880
It would be great to not have errors.

00:00:33.880 --> 00:00:42.660
And so our first topic is an article titled, Linting as Lightweight Defect Detection for Python.

00:00:42.660 --> 00:00:52.960
And it's a decent little tutorial just walking you through using how this person's workflow is using Flake 8.

00:00:52.960 --> 00:00:56.380
And it's a pretty short discussion.

00:00:56.640 --> 00:01:02.760
But I actually, and it has a link for, link to the PyCode style documentation.

00:01:02.760 --> 00:01:13.200
And I wanted to bring this up because I've been trying to clean up the code examples for the book and using Flake 8 a lot.

00:01:13.200 --> 00:01:14.680
And I was confused.

00:01:14.940 --> 00:01:19.580
I had used it before and I was confused a little bit because something has changed.

00:01:19.580 --> 00:01:25.000
The change is that there's a tool called Pep8 and there's a tool called Pep257.

00:01:25.000 --> 00:01:30.600
And Pep8 checks for the Pep8 style and a few other things.

00:01:31.100 --> 00:01:35.420
And Pep257 checks for docstring style.

00:01:35.420 --> 00:01:40.080
But these things are now called PyCode style and PyDoc style.

00:01:40.080 --> 00:01:47.360
I mean, the other tools still exist, but these are some new names that the community is using.

00:01:48.100 --> 00:01:55.400
And one of the reasons why that confused me is the documentation for Flake 8 says that it uses PyCode style.

00:01:55.400 --> 00:01:57.540
But those letters are so close together.

00:01:57.540 --> 00:02:03.600
And I was confused because I thought it was saying it was PyDoc style and I couldn't get it to deep by default.

00:02:03.600 --> 00:02:06.180
It doesn't care about these comments at all.

00:02:06.180 --> 00:02:06.560
Yeah.

00:02:06.560 --> 00:02:08.060
It doesn't check comments at all.

00:02:08.060 --> 00:02:08.820
It's so broken.

00:02:09.100 --> 00:02:09.280
Yeah.

00:02:09.280 --> 00:02:12.440
And then the other thing I wanted to bring up is regarding using.

00:02:12.440 --> 00:02:17.180
So Flake 8 is a static, a lint or a static analysis.

00:02:17.180 --> 00:02:20.980
And highly, I think we've talked about it a little bit before.

00:02:20.980 --> 00:02:21.480
Yeah, probably.

00:02:21.480 --> 00:02:25.360
Highly recommended to run your code through Flake 8.

00:02:25.360 --> 00:02:25.600
Yeah.

00:02:25.600 --> 00:02:35.980
And what I like about this article that you put here actually is it's not just your indentation is, you know, non-standard or the number of lines is non-standard between functions or something,

00:02:36.060 --> 00:02:39.260
but actually discovering errors as well, which is really sweet.

00:02:39.260 --> 00:02:40.100
Yeah, definitely.

00:02:40.100 --> 00:02:41.720
And I found problems.

00:02:41.720 --> 00:02:44.400
There is some pickiness that I still have.

00:02:44.400 --> 00:02:52.320
I'm kind of a curmudgeon about like having to go in and change code because there's an extra space at the end of my line.

00:02:52.320 --> 00:02:55.480
And like, really, does that really matter that much?

00:02:55.480 --> 00:03:00.400
But so I definitely recommend people use it.

00:03:00.400 --> 00:03:03.220
And then also Flake 8 has plugins.

00:03:03.840 --> 00:03:14.460
So, for instance, to do doc strings, if you install Flake 8 dash doc strings, it will check your PyDoc style as well.

00:03:14.460 --> 00:03:14.840
Okay.

00:03:14.840 --> 00:03:15.320
Yeah.

00:03:15.320 --> 00:03:16.040
Yeah, yeah.

00:03:16.040 --> 00:03:16.460
That's great.

00:03:16.460 --> 00:03:18.180
Yeah, I like that article.

00:03:18.180 --> 00:03:18.920
That's good.

00:03:18.920 --> 00:03:22.280
I really do like using linters for error checking as well.

00:03:22.280 --> 00:03:25.920
Like, hey, this variable or this parameter you're passed to a function is not used.

00:03:26.900 --> 00:03:28.360
Maybe you intended to use it.

00:03:28.360 --> 00:03:29.240
Yeah, things like that.

00:03:29.240 --> 00:03:33.000
So I want to take it to another, entirely another end.

00:03:33.000 --> 00:03:35.160
So you're down here like working on the source code.

00:03:35.160 --> 00:03:38.900
I don't want to let you just speak like you're in Star Trek to your computer.

00:03:38.900 --> 00:03:40.440
It'd be cool if we could do that, right?

00:03:40.440 --> 00:03:41.220
Yeah, definitely.

00:03:41.220 --> 00:03:41.640
Yeah.

00:03:42.280 --> 00:03:52.160
So a friend of the show, Jacqueline Wilson, wrote, she's a teacher and she teaches, I can't remember if it's math or computer science, but she teaches people who are new to Python.

00:03:52.160 --> 00:03:57.660
So she put together an article that's like a really friendly introduction to working with Alexa.

00:03:58.340 --> 00:04:02.680
So this is the Amazon voice assistant thing.

00:04:02.680 --> 00:04:07.900
And you can create these things called skills, which basically that means you can say new things to them.

00:04:07.900 --> 00:04:10.800
So she says, let's put together one of these.

00:04:10.800 --> 00:04:13.320
And I think the walkthrough is really simple and really straightforward.

00:04:13.320 --> 00:04:21.760
But once you see how easy it is, if you have one of these devices available and you can do anything fun with it, you know, this should really inspire you.

00:04:21.760 --> 00:04:22.100
Right.

00:04:22.100 --> 00:04:27.460
So what they built or what she built in her example was a what's for dinner bot.

00:04:27.460 --> 00:04:31.320
So you can say, hey, thing, what's for dinner?

00:04:31.320 --> 00:04:38.940
And it'll tell you, you know, it'll pick some from things that you like and it'll tell you like randomly pick one for you basically.

00:04:38.940 --> 00:04:43.840
So all you need are you need an Amazon developer account.

00:04:43.840 --> 00:04:47.680
You need an AWS account and you need Python 3.

00:04:47.860 --> 00:04:52.740
And so then you can tell it thing, you can teach it what are called utterances.

00:04:52.740 --> 00:04:55.060
So like, what should I have for dinner?

00:04:55.060 --> 00:04:56.420
Do you have an idea for dinner?

00:04:56.420 --> 00:04:57.220
What's for dinner?

00:04:57.220 --> 00:04:59.400
You could point all of those at the same functionality.

00:04:59.400 --> 00:05:06.500
And that functionality is just a Python 3 function that lives at AWS Lambda.

00:05:06.500 --> 00:05:12.980
Remember we talked about Lambda before and that's just like you go to AWS and you say here I would like to run, write a function.

00:05:12.980 --> 00:05:14.300
It just takes an input and output.

00:05:14.300 --> 00:05:17.520
And here the output is just like a JSON response that goes to Alexa.

00:05:17.740 --> 00:05:18.300
Oh, that's cool.

00:05:18.300 --> 00:05:18.960
Isn't that cool?

00:05:18.960 --> 00:05:19.980
Yeah, I should try that.

00:05:19.980 --> 00:05:20.480
Yeah, yeah.

00:05:20.480 --> 00:05:24.200
I was actually thinking it might be fun and you could probably have it more nuanced.

00:05:24.200 --> 00:05:25.720
Like one of my daughters is vegetarian.

00:05:25.720 --> 00:05:28.640
So, you know, it could ask, well, is your vegetarian daughter here?

00:05:28.640 --> 00:05:29.140
No.

00:05:29.140 --> 00:05:30.000
Well, you should have steak.

00:05:30.000 --> 00:05:30.520
Yes.

00:05:30.520 --> 00:05:30.820
All right.

00:05:30.820 --> 00:05:33.660
Well, you should have something that's not right.

00:05:33.660 --> 00:05:36.600
So I bet you could do some really, really cool things with it.

00:05:36.920 --> 00:05:44.300
And if you want to play around with these ideas but you don't have an Alexa, you can actually go to, there's like a website that'll let you test it.

00:05:44.300 --> 00:05:46.620
Use your voice and just speak to the website instead.

00:05:46.620 --> 00:05:47.400
That's really cool.

00:05:47.400 --> 00:05:47.980
I like that.

00:05:47.980 --> 00:05:48.360
Yeah, yeah.

00:05:48.360 --> 00:05:49.060
It sounds really fun.

00:05:49.060 --> 00:05:49.980
It's totally approachable.

00:05:50.120 --> 00:05:55.880
Like basically if you can drive all the AWS console widgets, which are, there's a lot of them and it's kind of annoying.

00:05:55.880 --> 00:06:00.840
But if you can do that and write a single function in AWS Lambda, you're like more or less ready to rock.

00:06:00.840 --> 00:06:01.600
Oh, that's great.

00:06:01.600 --> 00:06:02.580
I'll have to check this out.

00:06:02.580 --> 00:06:03.040
Cool.

00:06:03.220 --> 00:06:03.580
Yeah, yeah.

00:06:03.580 --> 00:06:04.020
Cool.

00:06:04.020 --> 00:06:10.080
Well, next we've got a tool called Rise, which is a reveal IPython slide extension.

00:06:10.080 --> 00:06:22.880
And it is a slide extension or a tool for, a pip installable tool for using IPython or Jupyter notebooks to create slideshows.

00:06:23.640 --> 00:06:34.100
And there's a couple videos out for how to do it, but the effect and the amount of work they have to put into a slideshow versus the, how nice it looks afterwards.

00:06:34.100 --> 00:06:42.260
I think it's definitely something for people to look into if they use IPython or Jupyter a lot and need to do a slideshow for something.

00:06:42.260 --> 00:06:42.680
Oh yeah.

00:06:42.680 --> 00:06:42.920
Cool.

00:06:42.920 --> 00:06:43.280
Awesome.

00:06:43.280 --> 00:06:44.020
Great recommendation.

00:06:44.540 --> 00:06:55.000
You know, if you're writing your research papers and presentation, written presentation already in IPython, it's kind of cool to just go, and now it's a presentation too, right?

00:06:55.000 --> 00:06:55.440
It's great.

00:06:55.440 --> 00:06:55.680
Yeah.

00:06:55.680 --> 00:07:05.180
And then looking at the, I haven't had a chance to play with it too much, but it looks like there's, there's dropdowns for different slide transitions and stuff too.

00:07:05.180 --> 00:07:06.380
So that's, that's neat.

00:07:06.380 --> 00:07:06.660
Yeah.

00:07:06.660 --> 00:07:07.020
Okay.

00:07:07.020 --> 00:07:07.260
Yeah.

00:07:07.260 --> 00:07:08.440
It looks, it looks really cool.

00:07:08.440 --> 00:07:09.000
Thanks.

00:07:09.000 --> 00:07:12.180
So before we get to the next one, I'm going to tell you about Rollbar.

00:07:12.180 --> 00:07:15.880
So we talked about lending and we don't want errors in our code.

00:07:15.880 --> 00:07:22.800
And if you run any sort of web application, web service, you guys should check out rollbar.com slash Python bytes.

00:07:22.800 --> 00:07:28.840
Basically a couple of lines of code to integrate it with whatever your framework, a web framework is.

00:07:28.840 --> 00:07:30.900
And it will send you notifications.

00:07:30.900 --> 00:07:37.560
If there's any sort of error with things like full stack trays, what was the user who is running your code when that happened?

00:07:37.560 --> 00:07:39.800
How many occurrences are there?

00:07:39.800 --> 00:07:40.860
All sorts of stuff.

00:07:40.860 --> 00:07:44.380
So real time notifications for errors in your sites.

00:07:44.380 --> 00:07:48.260
I use this on my, on all my sites and I'm totally a fan.

00:07:48.260 --> 00:07:49.140
So check it out.

00:07:49.140 --> 00:07:51.540
Python bytes.com slash rollbar.

00:07:51.540 --> 00:07:52.140
Wonderful.

00:07:52.140 --> 00:07:52.520
Yep.

00:07:52.520 --> 00:07:52.760
Yep.

00:07:52.760 --> 00:07:53.160
Good stuff.

00:07:53.160 --> 00:07:57.900
So do you ever run processes on a remote machines, Brian?

00:07:57.900 --> 00:08:05.780
Wouldn't it be cool if like you forget to close them down and they could just like fade away and not pile up on those remote servers?

00:08:06.080 --> 00:08:08.820
Is that, I guess I hadn't really thought about that.

00:08:08.820 --> 00:08:09.500
Is that an issue?

00:08:09.500 --> 00:08:09.920
I guess.

00:08:09.920 --> 00:08:10.240
Yeah.

00:08:10.240 --> 00:08:20.300
Well, if you start up a bunch and they like, if basically like what if you write some Python code and it itself use basically like sub process type things to create a bunch of processes.

00:08:20.800 --> 00:08:24.420
And if those don't properly get closed down, that can be a problem.

00:08:24.420 --> 00:08:25.660
You know, one of them hangs or something.

00:08:26.260 --> 00:08:35.400
The next one I would cover is called closer and closer will let you run and basically control remote processes over SSH.

00:08:35.720 --> 00:08:42.300
So the guy who created it said it was born out of the trouble of like killing the processes that he had started remotely via SSH.

00:08:42.300 --> 00:08:47.900
So he could start them pretty easily, but then like they would keep running and he wanted to shut them down or something like that.

00:08:47.900 --> 00:08:58.720
So this closer, you can use this within Python and basically say like I would like the lifetime of the sub processes to be tied to the lifetime of my local Python program.

00:08:58.720 --> 00:08:59.340
Oh, neat.

00:08:59.520 --> 00:08:59.720
Yeah.

00:08:59.720 --> 00:09:01.800
So the program runs and you can say cleanup.

00:09:01.800 --> 00:09:09.300
Like when I start this process remotely, you can like get the output of that process back to your local machine.

00:09:09.300 --> 00:09:13.380
But you can also say when this process exits, shut that down.

00:09:13.380 --> 00:09:13.780
Right.

00:09:13.780 --> 00:09:18.460
Automatically clean up and shut down those ones like forcibly kill them or whatever you need to do.

00:09:18.460 --> 00:09:25.720
So it'll remotely kill all the processes either by choice or at the end of the project, the calling process.

00:09:25.720 --> 00:09:28.440
It will capture the output.

00:09:28.680 --> 00:09:38.580
You can do live monitoring so you can start a remote process and have it be doing a thing and basically set up a callback for like its output, a callback for when it dies.

00:09:38.580 --> 00:09:42.780
So if it crashes before you expected somewhere along the way, things like that.

00:09:42.780 --> 00:09:43.060
Yeah.

00:09:43.060 --> 00:09:47.520
And the examples show that it works within Jupyter Notebooks as well.

00:09:47.520 --> 00:09:48.400
Yeah, exactly.

00:09:48.400 --> 00:09:50.080
So yeah, basically any process.

00:09:50.080 --> 00:09:52.160
And if you exit that one, then it's gone.

00:09:52.160 --> 00:09:54.440
So Closer, definitely cool.

00:09:55.100 --> 00:10:00.540
Honestly, I don't have that much of a use for it because I don't remotely run processes over SSH.

00:10:00.540 --> 00:10:04.880
But I can imagine like if I was doing DevOps or something, yeah, this would be a big one.

00:10:04.880 --> 00:10:07.700
Actually, I don't often have a need for that.

00:10:07.700 --> 00:10:12.920
And that's part of the problem is that I'm not doing it enough to where I'm really good at it.

00:10:13.000 --> 00:10:22.620
So when I do have a need to have a couple computers working together to do or do a remote process, making sure that I get it all cleaned up correctly, that would be a good tool.

00:10:22.620 --> 00:10:22.960
Yeah.

00:10:23.480 --> 00:10:29.660
Well, it basically makes me think as well, like I should probably be thinking about how I could use these types of features and functionality.

00:10:29.660 --> 00:10:32.100
I'm like, I should probably be doing that, but I'm not.

00:10:32.100 --> 00:10:32.720
Okay, cool.

00:10:32.720 --> 00:10:39.340
Well, speaking of things that you probably should be doing, we've actually had this recommendation from a lot of people.

00:10:39.340 --> 00:10:41.220
And I was surprised we haven't covered it yet.

00:10:41.220 --> 00:10:45.820
And somebody can correct me if I'm wrong, if we actually have covered it and I've forgotten.

00:10:45.820 --> 00:10:46.460
I don't think so.

00:10:46.840 --> 00:10:50.860
Okay, so there's a checklist for Python library APIs.

00:10:50.860 --> 00:10:59.960
And I'd actually not taken a look at this for a while because I thought it was mostly a REST API thing.

00:10:59.960 --> 00:11:01.820
And it isn't.

00:11:01.820 --> 00:11:06.140
It's a topic for any, like a library API.

00:11:06.140 --> 00:11:06.880
Oh, I see.

00:11:06.880 --> 00:11:12.280
And it's, I'm actually not sure what the little check marks I'll talk about a little bit.

00:11:12.280 --> 00:11:13.960
Yeah, they're actually check boxes.

00:11:13.960 --> 00:11:15.020
I can actually check them.

00:11:15.020 --> 00:11:17.980
Yeah, but I don't think it does anything when I check them off.

00:11:17.980 --> 00:11:19.820
It makes me feel good when I click them.

00:11:19.820 --> 00:11:29.120
But it talks about things like simplicity and making sure you have a readme and going through some consistency thing with naming conventions,

00:11:29.120 --> 00:11:37.840
looking at flexibility, looking at how you're doing, what your abstractions are like, type safety,

00:11:38.200 --> 00:11:45.500
like one of the ones to make sure that if somebody passes a wrong type into your library function,

00:11:45.500 --> 00:11:49.980
to make sure you throw, raise a value error or something like that.

00:11:49.980 --> 00:11:53.680
There's quite a few checklist things to go down.

00:11:53.680 --> 00:11:59.260
And one of them, like we've talked about before, is making sure you've used PEP 8 and FLAC8.

00:11:59.480 --> 00:12:07.620
I initially was somebody that had a whole bunch of exceptions to PEP 8 and FLAC8, but I'm doing more vanilla FLAC8 now.

00:12:07.620 --> 00:12:13.120
It's a good checklist to look at if you are deciding to put a library up.

00:12:13.120 --> 00:12:16.900
Maybe run through this and make sure you're doing some of the right things first.

00:12:17.100 --> 00:12:24.620
Sure, this sort of goes along with some of your guidance on your open source package organization and some of those other types of things as well.

00:12:24.620 --> 00:12:25.480
Nice.

00:12:25.480 --> 00:12:25.820
All right.

00:12:25.820 --> 00:12:28.000
I almost told you about Fades before, but I'm going to tell you about Fades now.

00:12:28.000 --> 00:12:30.800
So Fades is not closer.

00:12:30.800 --> 00:12:31.600
Fades is really cool.

00:12:31.600 --> 00:12:36.720
So the problem of Python packaging actually I think is still not solved.

00:12:36.720 --> 00:12:42.780
How do we get our Python programs to people and get them to run those things reliably?

00:12:42.780 --> 00:12:45.180
So there's a lot of interesting takes.

00:12:45.500 --> 00:12:48.000
There's pipinv from Kenneth Writes.

00:12:48.000 --> 00:12:50.360
There's obviously standard pip.

00:12:50.360 --> 00:12:52.620
There's requirements.txt.

00:12:52.620 --> 00:12:57.560
There's a ton of different things trying to solve this problem, and Fades is one of them.

00:12:57.560 --> 00:13:04.480
So Fades is a cross-platform thing, and what it does is basically it will auto, given any script,

00:13:04.480 --> 00:13:09.380
it will auto-discover, with a caveat, auto-discover the dependencies of that script,

00:13:09.380 --> 00:13:13.420
see if it has a virtual environment that has previously run,

00:13:13.500 --> 00:13:16.500
or create a new virtual environment if it hasn't for this script,

00:13:16.500 --> 00:13:19.800
and install all those dependencies, and then run it.

00:13:20.120 --> 00:13:26.860
So basically you can give a script to somebody and say, run this with Fades, and run it with Python, really.

00:13:26.860 --> 00:13:31.480
And it will handle all of the pip install this, make sure it's that kind of version,

00:13:31.480 --> 00:13:33.560
this one has to be greater than that, and so on.

00:13:33.560 --> 00:13:34.540
It's really cool.

00:13:34.540 --> 00:13:34.800
Hmm.

00:13:34.800 --> 00:13:35.220
Okay.

00:13:35.320 --> 00:13:39.240
So, yeah, so if you're going to be passed around scripts, and they've got dependencies,

00:13:39.240 --> 00:13:42.480
this is really an interesting way to take it on.

00:13:42.480 --> 00:13:45.480
So I said it'll auto-discover the dependencies, but with a caveat.

00:13:45.480 --> 00:13:48.580
So there's basically two ways to tell it what it needs to run a script.

00:13:48.580 --> 00:13:50.520
You can use a comment.

00:13:51.120 --> 00:13:58.000
So, like, if you said import some module, you could say, like, hash as a comment, fades equal equal three,

00:13:58.000 --> 00:14:00.940
or fades greater than or equal to 2.1, or whatever.

00:14:00.940 --> 00:14:07.180
And then it'll look through all the source code, find all the little fades annotations, I guess you could call them.

00:14:07.540 --> 00:14:12.680
And then it'll create a virtual environment with those modules pip installed with the way you set it up,

00:14:12.680 --> 00:14:13.520
and then it'll just run.

00:14:13.520 --> 00:14:19.920
So you could ship your code with requirements.txt, but then that's a whole other level of experience

00:14:19.920 --> 00:14:21.680
the person running your code has to have.

00:14:21.680 --> 00:14:22.100
Yeah.

00:14:22.100 --> 00:14:25.520
Another thing I think that's cool about it is it creates these virtual environments,

00:14:25.520 --> 00:14:31.740
but you can basically, say, run this and upgrade your virtual environment.

00:14:31.740 --> 00:14:37.060
So, you know, imagine, like, you just say, I'm using requests, import requests, here's, you know, hash fades, whatever.

00:14:37.480 --> 00:14:39.440
No version number specified there.

00:14:39.440 --> 00:14:42.240
And a new version of requests is released.

00:14:42.240 --> 00:14:49.360
You can basically tell it, go and look for updates to the dependencies that you know about before you run it.

00:14:49.360 --> 00:14:49.860
Oh, yeah.

00:14:49.860 --> 00:14:50.420
Okay.

00:14:50.420 --> 00:14:51.760
Yeah, it's pretty interesting.

00:14:51.760 --> 00:14:55.140
And you can create these configuration files.

00:14:55.140 --> 00:14:56.140
All right.

00:14:56.140 --> 00:15:00.480
So basically, create a configuration file, say, my default version of Python is this,

00:15:00.480 --> 00:15:03.200
my default update behavior is that, and so on.

00:15:03.200 --> 00:15:05.060
And you can even clean up these old environments.

00:15:05.060 --> 00:15:09.720
There's a way to say, like, delete all the ones that haven't been accessed for a couple of days.

00:15:09.720 --> 00:15:10.720
Things like that.

00:15:10.720 --> 00:15:11.120
It's pretty neat.

00:15:11.120 --> 00:15:16.120
Yeah, it looks like it has some support for non-other repositories as well.

00:15:16.120 --> 00:15:16.380
Yep.

00:15:16.380 --> 00:15:17.120
Yeah, exactly.

00:15:17.120 --> 00:15:22.280
So if you're pulling, like, out of a private Git repo or something like that to execute your code,

00:15:22.440 --> 00:15:25.280
like for your pip install, you know, you can pass it a Git repo.

00:15:25.280 --> 00:15:31.540
It will also, you can pass that as well as part of your dependency statement, I guess.

00:15:31.540 --> 00:15:31.720
Cool.

00:15:31.720 --> 00:15:32.280
In your little annotation.

00:15:32.280 --> 00:15:32.660
Yeah.

00:15:32.660 --> 00:15:33.320
Pretty cool.

00:15:33.320 --> 00:15:33.780
Yeah.

00:15:33.780 --> 00:15:34.380
Yeah, very fun.

00:15:34.380 --> 00:15:37.360
You can even use a different index for your pip argument.

00:15:37.620 --> 00:15:39.760
So you could come off a private PyPI server.

00:15:39.760 --> 00:15:40.620
All right.

00:15:40.620 --> 00:15:41.340
That's it for the news.

00:15:41.340 --> 00:15:43.980
But I wanted to cover one quick thing.

00:15:43.980 --> 00:15:47.420
So many people know they can add comments to the show.

00:15:47.420 --> 00:15:52.000
Just go to pythonbytes.fm/the episode number.

00:15:52.000 --> 00:15:55.120
So for example, this one, pythonbytes.fm/33.

00:15:55.380 --> 00:15:59.280
And at the bottom, there's a comment section, discuss section, also powered by Python.

00:15:59.280 --> 00:16:06.120
And last time, we got a really cool comment from Jan Oglop.

00:16:06.120 --> 00:16:10.160
And he said, hey, Michael and Brian, I wanted to thank you for the amazing work you do and

00:16:10.160 --> 00:16:14.240
let you know that you have helped me find the working place of my dreams.

00:16:14.240 --> 00:16:18.100
My colleagues have similar hobbies and love Python as much as I do.

00:16:18.100 --> 00:16:18.740
Thank you again.

00:16:18.740 --> 00:16:19.220
That's really great.

00:16:19.220 --> 00:16:19.460
How about that?

00:16:19.460 --> 00:16:20.040
That's cool.

00:16:20.040 --> 00:16:20.460
Yeah.

00:16:20.460 --> 00:16:21.340
Congratulations, Jan.

00:16:21.340 --> 00:16:22.140
That's fantastic.

00:16:22.140 --> 00:16:23.900
So very, very cool.

00:16:23.980 --> 00:16:26.760
If you guys want to leave a comment, we might read it on the show as well.

00:16:26.760 --> 00:16:31.720
All right, Brian, anything else you want to add before we put a wrap on this week's Python

00:16:31.720 --> 00:16:32.760
announcements?

00:16:32.760 --> 00:16:38.740
Just that next time there's a holiday, we need to not schedule like super early recording

00:16:38.740 --> 00:16:40.100
times right after the holiday.

00:16:40.100 --> 00:16:47.140
Yeah, to be honest, like, you know, last night was 4th of July in the US and I was out with

00:16:47.140 --> 00:16:47.580
my kids.

00:16:47.580 --> 00:16:51.500
And I don't know about your neighborhood, but my neighborhood just goes off the hook.

00:16:51.680 --> 00:16:55.920
Like there was such an insane firework display down at the local elementary school.

00:16:55.920 --> 00:16:59.180
People just all descended and set off all sorts of stuff.

00:16:59.180 --> 00:17:03.020
And I thought from all the yelling with my kids, I might actually not have a voice this

00:17:03.020 --> 00:17:03.280
morning.

00:17:03.280 --> 00:17:09.020
So yeah, and I'm acting like I'm blaming Michael on this, but I'm the one that picked the 7 a.m.

00:17:09.020 --> 00:17:09.320
time.

00:17:09.320 --> 00:17:10.480
So it's kind of my fault.

00:17:10.480 --> 00:17:11.540
So it helps.

00:17:11.540 --> 00:17:12.940
I'm still partly on Dublin time.

00:17:13.580 --> 00:17:14.780
Well, yeah, welcome back.

00:17:14.780 --> 00:17:16.800
So yeah, thanks.

00:17:16.800 --> 00:17:17.760
It's good to be back.

00:17:17.760 --> 00:17:18.340
It's good to be back.

00:17:18.340 --> 00:17:19.780
Well, thanks again for another episode.

00:17:19.780 --> 00:17:20.340
You bet.

00:17:20.340 --> 00:17:20.840
Thanks, Brian.

00:17:20.840 --> 00:17:21.920
And thank you everyone for listening.

00:17:21.920 --> 00:17:22.600
Bye.

00:17:24.020 --> 00:17:25.600
Thank you for listening to Python Bytes.

00:17:25.600 --> 00:17:28.160
Follow the show on Twitter via at Python Bytes.

00:17:28.160 --> 00:17:31.060
That's Python Bytes as in B-Y-T-E-S.

00:17:31.060 --> 00:17:34.460
And get the full show notes at pythonbytes.fm.

00:17:34.460 --> 00:17:38.820
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:17:38.820 --> 00:17:41.520
We're always on the lookout for sharing something cool.

00:17:41.520 --> 00:17:44.900
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:17:44.900 --> 00:17:48.540
Thank you for listening and sharing this podcast with your friends and colleagues.