WEBVTT

00:00:00.001 --> 00:00:04.720
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly

00:00:04.720 --> 00:00:11.140
to your earbuds. This is episode 158, recorded November 20th, 2019. I'm Michael Kennedy.

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

00:00:12.060 --> 00:00:16.100
And this episode is brought to you by DigitalOcean. DigitalOcean's awesome. Check them out at

00:00:16.100 --> 00:00:22.680
pythonbytes.fm/DigitalOcean. Tell you more about that later. But Brian, I find that Python

00:00:22.680 --> 00:00:27.960
is making its way into all these different areas, not just traditional computer science or maybe

00:00:27.960 --> 00:00:33.740
data science. Right. There's an article that I saw that's kind of interesting. I mean,

00:00:33.740 --> 00:00:40.400
there's not a lot of details, but essentially it's saying that Python is replacing Excel in

00:00:40.400 --> 00:00:48.000
banking and investing. The real title is Python already replaced Excel in banking. But we've got

00:00:48.000 --> 00:00:52.260
some interesting quotes from here. So I'm just going to read it out. This is from the article.

00:00:52.260 --> 00:00:57.480
If you wanted to prove your mettle as an entry level banker or trader, it used to be the case that you

00:00:57.480 --> 00:01:03.000
had to know all about financial modeling in Excel. Not anymore. These days, it's all about Python,

00:01:03.000 --> 00:01:09.960
especially on the trading floor. And it goes on to talk about how a lot of different modeling that

00:01:09.960 --> 00:01:16.640
used to be done in smaller cases in Excel, but it would take like a few minutes to run the Excel

00:01:16.640 --> 00:01:24.220
modifications and analysis. Now they can do even like way more data and have it done in like a second

00:01:24.220 --> 00:01:30.620
or two. So it does, it doesn't make sense when in cases where split second decisions are change,

00:01:30.620 --> 00:01:36.640
how you react to the market that you'd want to have speed and ease. So Python makes sense to me.

00:01:36.640 --> 00:01:40.760
Yeah, that's really interesting. I'm sure it's using a lot of the data science stuff like NumPy and whatnot

00:01:40.760 --> 00:01:46.080
to make that fast deep down below. The whole trading, the algorithmic trading, high speed training,

00:01:46.160 --> 00:01:51.980
all that kind of stuff. The latency that those folks care about is crazy, right? Like if you could get it from

00:01:51.980 --> 00:01:56.180
four milliseconds to three milliseconds, we'd really appreciate that, right? And they'll actually like rent

00:01:56.180 --> 00:02:02.160
servers that are nearly co-located to the stock market to reduce the actual latency or set up alternate

00:02:02.160 --> 00:02:07.940
direct connections over microwaves. There's all kinds of crazy stuff. And so if you can go from minutes to seconds,

00:02:07.940 --> 00:02:10.900
that already seems like it would make a big difference to these folks.

00:02:10.900 --> 00:02:16.060
Yeah. And also being able to go to from minutes to seconds and while incorporating more data.

00:02:16.060 --> 00:02:17.580
Yeah. Super, super cool.

00:02:17.580 --> 00:02:23.080
I'm imagining like walking through the trading floor and seeing some, some guy in a hoodie sitting with

00:02:23.080 --> 00:02:28.160
a laptop on the floor. I mean, like, I don't understand this, but yeah, whatever.

00:02:28.160 --> 00:02:32.400
Five years ago, that person would have been arrested. Now people are like, Hey, I need some help,

00:02:32.400 --> 00:02:34.280
man. Can you give me some advice on this trade?

00:02:34.280 --> 00:02:35.340
Yeah.

00:02:35.340 --> 00:02:39.480
I have a little personal experience with this Python replacing Excel and banking and trading.

00:02:39.480 --> 00:02:44.480
Can't talk about the details, but I did teach a class through a bunch of folks working on the

00:02:44.480 --> 00:02:50.680
European stock market and they actually couldn't even take the class during the day because they

00:02:50.680 --> 00:02:55.600
had to be there for a while. The market was open. So we had the class in the evening for a week over

00:02:55.600 --> 00:03:00.340
there and they were all really into learning Python because they had been trying to analyze how their

00:03:00.340 --> 00:03:03.720
day went and do this kind of analysis that you're talking about in Excel. And they're just like,

00:03:03.720 --> 00:03:07.900
we can't do this anymore. We have to get like better tools. And Python was the answer for them as well.

00:03:07.900 --> 00:03:08.560
Pretty cool.

00:03:08.560 --> 00:03:10.340
Oh, that's great. Interesting.

00:03:10.340 --> 00:03:16.220
Yeah. Another thing that I think is really, really good news is something that GitHub just announced.

00:03:16.220 --> 00:03:21.260
GitHub has announced a ton of things. While you were not with us last week when we recorded in Florida,

00:03:21.260 --> 00:03:29.240
we talked about how GitHub has added code navigation to all the source code there, much of the source code.

00:03:29.240 --> 00:03:34.800
you go in there and like click on functions and classes and say, go to definition and Python. And

00:03:34.800 --> 00:03:41.520
that's pretty awesome. So give it a week and GitHub launches security lab to help secure the open source

00:03:41.520 --> 00:03:42.600
ecosystem. Wow.

00:03:42.780 --> 00:03:47.280
So you've probably heard about bug bounties and like these bounties paid out to security

00:03:47.280 --> 00:03:53.220
researchers before, I would guess. Yeah. Yeah. So it's pretty much like that is my understanding of

00:03:53.220 --> 00:04:00.840
it. So it's like a bug bounty program to go and find bugs in open source libraries. But what's kind

00:04:00.840 --> 00:04:06.880
of cool is it seems like the folks like paying out that money are not the open source projects,

00:04:06.880 --> 00:04:11.700
right? Like Apple might pay out a huge amount of money, like a hundred thousand dollars for finding

00:04:11.700 --> 00:04:19.340
a big vulnerability in iOS or Microsoft might or whoever, but who's going to pay to find that

00:04:19.340 --> 00:04:22.480
security bug in Flask or wherever it is. Right.

00:04:22.480 --> 00:04:23.120
All right.

00:04:23.120 --> 00:04:30.440
It seems like that this is to pay for those types of things. So it says organizations as well as

00:04:30.440 --> 00:04:35.980
individual security researchers can join a bug bounty program with rewards of up to $3,000 is available

00:04:35.980 --> 00:04:40.280
to compensate bug hunters for the time they put into searching for vulnerabilities in open source

00:04:40.280 --> 00:04:44.660
projects. Oh, that's neat. Cool, right? Yeah. Yeah. So apparently this has been in beta since

00:04:44.660 --> 00:04:50.720
for a little while. When was it exactly? A little while, not very long. Anyway, the founding members

00:04:50.720 --> 00:04:55.240
who were part of it have already found, reported, and helped fix more than a hundred security flaws

00:04:55.240 --> 00:05:01.720
already across the open source ecosystem. That's pretty cool. Another thing that's interesting is the bug

00:05:01.720 --> 00:05:11.260
report in order to count must contain a code QL, like SQL, but code QL or something. I don't know.

00:05:11.260 --> 00:05:18.720
Code QL, which is an open source tool that GitHub released at the same time. Remember we talked about

00:05:18.720 --> 00:05:23.580
there's semantic code analysis engine. And what it does is basically this is a query that runs against

00:05:23.580 --> 00:05:30.020
source code that will uncover the vulnerabilities in dependent projects.

00:05:30.020 --> 00:05:34.320
Okay. So if I find a bug in Flask, I don't know there is one, but let's just say I just pick a

00:05:34.320 --> 00:05:39.920
random project. I find a bug in Flask and I submit this, I submit a query to GitHub so that they can go

00:05:39.920 --> 00:05:45.120
find all the projects that depend on Flask that have out of date versions of Flask that need to also

00:05:45.120 --> 00:05:48.080
subsequently receive warnings to get their stuff updated.

00:05:48.080 --> 00:05:51.700
So do they then notify all these, the other maintainers or?

00:05:51.700 --> 00:05:57.640
Yes. So if you look at that article, there's like some screenshots of what it gets. So they will get,

00:05:57.640 --> 00:06:03.140
the actual project will get an automated pull request that fixes the security vulnerability.

00:06:03.140 --> 00:06:09.500
Maybe it bumps the requirements pinned version to something where it's fixed or something, right? It gets the

00:06:09.500 --> 00:06:16.300
PR to automatically fix it. And then there's also a button where they can publish an advisory

00:06:16.300 --> 00:06:22.780
out to, from that repository to dependent repositories. And they could also request a CVE,

00:06:22.780 --> 00:06:30.780
which is like a vulnerability official number to be recognized as an actual issue. So GitHub became,

00:06:30.780 --> 00:06:38.620
what was the term they used? A CVE numbering authority, a CMA, of course, to, so that they can actually

00:06:38.620 --> 00:06:45.520
issue these vulnerability numbers to be understood and like referenced as unique IDs across the security

00:06:45.520 --> 00:06:47.120
landscape. Interesting.

00:06:47.120 --> 00:06:51.960
Yeah. So all this stuff is integrated into GitHub. So GitHub, the researchers find the issue in the

00:06:51.960 --> 00:06:58.480
main project. The main project gets a PR. The main project can then also push out these warnings to

00:06:58.480 --> 00:07:02.220
other folks and request CVEs for their projects. That's pretty cool, right?

00:07:02.220 --> 00:07:03.800
Yeah. Open source is growing up.

00:07:03.800 --> 00:07:10.340
Yeah, it totally is. And it seems like it's, it's pretty solid for, for all the folks working on it.

00:07:10.340 --> 00:07:14.960
It doesn't seem like it requires much of the maintainers. It's more like there's this bug bounty program,

00:07:14.960 --> 00:07:20.400
from what I can tell. And also they threw in there right at the end of this. GitHub also updated the

00:07:20.400 --> 00:07:29.340
token scanning and in-house service that scans for like API keys, like AWS access keys or whatever

00:07:29.340 --> 00:07:31.680
that have been accidentally left inside of source code.

00:07:31.680 --> 00:07:32.940
Oh, that's good. Yeah.

00:07:32.940 --> 00:07:33.780
That's really good.

00:07:33.780 --> 00:07:37.780
Yeah. It'd be pretty nice to like, you probably didn't mean this. Click this button to make this go.

00:07:38.740 --> 00:07:44.140
Anyway, I think this is really cool. I think this is like, this is just plumbing to make open source

00:07:44.140 --> 00:07:45.260
more secure. And I like that.

00:07:45.260 --> 00:07:51.840
Yeah. And also just to, to be able to say, to have companies put money at open source projects to keep

00:07:51.840 --> 00:07:57.920
them fixed. And it's not necessarily trying to get the, maintain the official maintainer to do it,

00:07:57.920 --> 00:08:04.160
but to have some incentive for, for everybody else to watch these things. So that's great.

00:08:04.160 --> 00:08:10.040
Absolutely. Yeah. These bug bounty programs have been working really well for the industry and it's cool to see

00:08:10.040 --> 00:08:15.260
GitHub putting that in there. Also cool is digital ocean, not just for sponsoring the show, but because

00:08:15.260 --> 00:08:19.900
they have awesome infrastructure and awesome product and we use them for our stuff. So let me tell you

00:08:19.900 --> 00:08:26.700
about a new thing that they have generally available memory optimized droplets. And if you have a memory

00:08:26.700 --> 00:08:33.320
heavy workload, basically this is the best way to get tons of memory in a droplet or a virtual machine.

00:08:33.320 --> 00:08:41.580
So you can get eight gigs of Ram for each dedicated CPU. And then it goes from two CPUs all the way up to

00:08:41.580 --> 00:08:47.160
enough to get you 256 gigs of Ram, whatever that math works out to be. And it's really good for like

00:08:47.160 --> 00:08:52.980
high memory applications, like high performance SQL or no SQL databases and memory caches like Redis or

00:08:52.980 --> 00:08:58.540
indexes, some kind of large data analysis runtime, something like that. So check those out at

00:08:58.540 --> 00:09:03.380
pythonbytes.fm/digital ocean, really good stuff over there. Lots of cool things coming.

00:09:03.380 --> 00:09:05.460
Brian, what you got next for us?

00:09:05.460 --> 00:09:12.540
Well, we have a couple of friends of ours, Bob Belderbos and Julian Sequeira. They run a thing

00:09:12.540 --> 00:09:18.760
called PyBytes and PyBytes challenges, not affiliated with Python bytes, just sounds similar.

00:09:18.760 --> 00:09:21.960
It's the I versus the Y it's not even close to the same thing.

00:09:21.960 --> 00:09:31.080
It's P Y B it I T dot dot. Yes. Anyway, I enjoy it. It's a challenges platform where you can just

00:09:31.080 --> 00:09:36.300
sort of, there's a few of them for free, but it is a paid service that they give. It's

00:09:36.300 --> 00:09:41.760
one of those things where you, they give you an, like kind of a written assignment and some test code

00:09:41.760 --> 00:09:47.580
already there. And it checks to see, and then you have to fill in like the body of a function to make

00:09:47.580 --> 00:09:52.980
all the test pass. It's a kind of a brain teaser sort of thing. It's a fun way to keep up, make sure

00:09:52.980 --> 00:09:58.460
that you're practicing out of the box Python stuff that you don't normally do. That's what I use it

00:09:58.460 --> 00:10:05.200
for. But the news is they just added test coverage. So, or tests testing. So in the past you were,

00:10:05.200 --> 00:10:11.340
you didn't write the tests. They wrote them to evaluate your code, but they've added, a few test

00:10:11.340 --> 00:10:15.940
challenges where they write the code and you have to write the test code to check that code.

00:10:15.940 --> 00:10:20.700
And it's kind of cool, but they were, they actually talked to me about this as well as to

00:10:20.700 --> 00:10:26.080
try to pick my ideas, but they came up with it on their own. How do you evaluate if the test code is

00:10:26.080 --> 00:10:31.400
good? So if you, you evaluate if your source code is good by running tests, but the other way around

00:10:31.400 --> 00:10:36.040
is a little difficult. Yeah. How do you test the tests? Yeah. So they did it a couple of ways.

00:10:36.040 --> 00:10:41.100
they're using coverage up high to make sure that you're hitting a hundred percent coverage and,

00:10:41.100 --> 00:10:45.580
you know, yes, it's debatable as for a large project of whether you should get a hundred percent

00:10:45.580 --> 00:10:50.760
coverage, but for a small function or some small bit of code, it should, you should be able to hit

00:10:50.760 --> 00:10:56.660
a hundred percent coverage. That's a nice thing. The other one is mutation testing. So there's a couple

00:10:56.660 --> 00:11:05.960
projects we've heard of mut mut and mut pie M U T P Y. And, I think we talked about this earlier,

00:11:05.960 --> 00:11:12.100
but, Ned Batchelder did write an article about his experience with mut mut, but,

00:11:12.100 --> 00:11:18.900
PyBytes is using mut pie. And what it does is it takes your, the source code and changes something

00:11:18.900 --> 00:11:25.140
about it. And mut pie works at the level of the, abstract syntax tree. And it changes like,

00:11:25.140 --> 00:11:31.200
for instance, a division operator to a multiplication or, or changes a string to some other string or

00:11:31.200 --> 00:11:35.880
something. And then it runs the tests again. And the idea is you want your test

00:11:35.880 --> 00:11:40.840
to be able to, it makes a whole bunch of mutants of the code and you want the tests to be able to

00:11:40.840 --> 00:11:46.400
kill off all the mutants, except for the original. That's how they're testing. It's kind of a neat

00:11:46.400 --> 00:11:52.200
idea, but it's fun to play with. It is an interesting question to ask. How do you test the test? And I

00:11:52.200 --> 00:11:57.260
think this is pretty creative. well done, Bob and Julian. I haven't used a mutation testing a lot.

00:11:57.520 --> 00:12:02.860
I've tried it out, but I haven't used it like for projects. The idea of using it in a training

00:12:02.860 --> 00:12:08.220
situation is a novel thing I haven't heard of before. And I think that's a cool idea to be able

00:12:08.220 --> 00:12:14.740
to, to try to test somebody's, test code. Yeah, I agree. And like you said, a hundred percent code

00:12:14.740 --> 00:12:19.900
coverage for a project that's real is challenging. I think also maybe a mutation testing for a project

00:12:19.900 --> 00:12:24.980
that's real tricky because maybe it changes like, you know, the print statement that shows what the title

00:12:24.980 --> 00:12:28.800
the app is and who cares? Like no one's going to check for that. Right. Right. But in this case,

00:12:28.800 --> 00:12:32.520
where pretty much it's a very small focus bit of code and you're supposed to test it, like

00:12:32.520 --> 00:12:38.060
presumably any changes to that are going to appear in the couple of tests. You're right. Yep. Nice.

00:12:38.060 --> 00:12:42.920
Now, speaking of tests, I feel like I stole this one from you, Brian, just out of the universe. I mean,

00:12:42.920 --> 00:12:52.920
so I want to talk about pi HTTP test. So this one comes from Florian Dallas or Dallas, sorry. And,

00:12:52.920 --> 00:12:57.400
he actually sent in two things for this week, which they were both excellent. So I'm going to cover

00:12:57.400 --> 00:13:03.640
them. And this is a command line tool for HTTP tests against restful APIs. Okay. All right. So

00:13:03.640 --> 00:13:10.720
the idea is basically I want to test some restful endpoint and instead of going over and say, okay,

00:13:10.720 --> 00:13:13.660
I'm going to create, I'm going to get requests. I'm going to do a get, I'm going to get the dictionary.

00:13:13.660 --> 00:13:18.900
I'm going to verify like this thing is in the dictionary and so on. What you basically do is you just

00:13:18.900 --> 00:13:25.280
write a simple little JSON document for each test that you want to run. Oh, cool. Yeah. So then it

00:13:25.280 --> 00:13:30.580
has things like, what is the name of the test? What HTTP verb do you want to use? What is the URL

00:13:30.580 --> 00:13:35.640
combination between host and endpoint? The headers you need to pass, a query string you need to pass,

00:13:35.640 --> 00:13:41.540
and then you get back a report. It actually gives you a cool report in a like column or style validation

00:13:41.540 --> 00:13:46.540
that lets you assert things about it. Yeah. There's a handful of these types of things. And I think it's kind of

00:13:46.540 --> 00:13:52.420
neat way to describe API testing. Yeah. It seems really cool. There's a bunch of neat little libraries

00:13:52.420 --> 00:13:57.840
that are used as well, like tabulate, which is a cool way to print the tabular data that they're

00:13:57.840 --> 00:14:03.300
showing there and things like that. But yeah, I like this project. If your job is to test a bunch of

00:14:03.300 --> 00:14:08.960
HTTP endpoints, you know, this is pretty cool. Yeah. Neat. Nice. All right. What else? What's next?

00:14:08.960 --> 00:14:16.780
Oh, next. X-Ray. This was suggested by a listener. I think it's Guido Imperial.

00:14:16.780 --> 00:14:21.020
Yep. I agree. Thanks, Guido. Sent it in. We haven't covered it before. And actually,

00:14:21.020 --> 00:14:25.920
I didn't know about it before. People in the data science community probably do because it seems like

00:14:25.920 --> 00:14:33.100
pretty powerful. But the gist of it is it's built, it uses and builds on top of NumPy and Pandas and

00:14:33.100 --> 00:14:40.820
ask to offer in-dimensional arrays. You can do in-dimensional arrays in Pandas already,

00:14:40.820 --> 00:14:47.700
I believe. But one of the neat things about these is that they've got labels on them. So

00:14:47.700 --> 00:14:52.920
they're self-describing and they've got indexes. There's a few data types within it. There's a data,

00:14:52.920 --> 00:14:59.220
so there's X-Ray data array. The data array is the in-dimensional array, but it has metadata,

00:14:59.220 --> 00:15:06.460
like names and labels for the dimensions. And you can also have coordinates and attributes. And

00:15:06.460 --> 00:15:13.320
coordinates are essentially like the tick elements for the different axes. And then attributes,

00:15:13.320 --> 00:15:20.420
the data array doesn't really do anything with the attributes, but it's a way to consistently keep data

00:15:20.420 --> 00:15:26.340
with data. So if you have to keep track of some extra things like, you know, where was this data

00:15:26.340 --> 00:15:33.020
collected or really anything you can, you can add them as an attribute. And then a data set is a

00:15:33.020 --> 00:15:39.440
dictionary-like collection of data array elements. I was playing with this and it's, it's pretty darn

00:15:39.440 --> 00:15:45.280
cool. The, one of the things, nice things about using it is just keeping all of that, the dimension

00:15:45.280 --> 00:15:50.760
names together. So if you have a multi-dimensional array, even just like a three-dimensional array,

00:15:51.000 --> 00:15:58.280
it's sometimes hard to keep track of, you know, which axes is which, and this is all together. But it's not

00:15:58.280 --> 00:16:06.160
just packaged together. You can also do things like use the label names and the axie names, and even axie

00:16:06.160 --> 00:16:12.220
elements at the coordinates, they don't actually need to be numbers. For instance, you could have like the

00:16:12.220 --> 00:16:18.420
months of the, months of the year or, or the letters of the alphabet be coordinates. You can use those as

00:16:18.600 --> 00:16:25.140
selectors to be able to select rows and columns and those return different data array elements. The data

00:16:25.140 --> 00:16:29.980
array elements also can be used in algorithms. They can just be passed directly to pandas algorithms.

00:16:29.980 --> 00:16:34.980
So these are pretty cool. Yeah. It looks a little bit like it's taken some of the features from NumPy,

00:16:34.980 --> 00:16:39.940
some of the features from pandas, some of the features from Dask, and sort of brings them together

00:16:39.940 --> 00:16:45.220
into one package. So when I was going through some of the tutorials, I was to get somebody to talk about

00:16:45.220 --> 00:16:52.120
this. It was like a three-dimensional array in, I think it's in pandas, is used to be, is considered

00:16:52.120 --> 00:16:57.080
a panel. But when I went to look at the panel information, it looks like panels are being

00:16:57.080 --> 00:17:03.700
deprecated for something else. So even in the pandas documentation, it was pointing to this x-ray

00:17:03.700 --> 00:17:08.260
project. So... Oh, interesting. I think the people in the pandas community are definitely familiar with it.

00:17:08.260 --> 00:17:12.840
But if you're using pandas kind of on the side, and you're not really in it all the time,

00:17:12.840 --> 00:17:17.600
this might be helpful. Now, previously you spoke about Bob Bilderbos, and I said we got this item

00:17:17.600 --> 00:17:22.500
from Florian Dalits. I'm going to bring those two things together in this next one. So...

00:17:22.500 --> 00:17:22.740
Okay.

00:17:22.740 --> 00:17:26.100
Bob had introduced us to Carbon. Remember that?

00:17:26.100 --> 00:17:26.820
Yeah.

00:17:26.820 --> 00:17:32.860
Carbon is like screen, sort of beautiful screenshots for colored code, right? Code, it's like a mock

00:17:32.860 --> 00:17:38.960
faux little shell or whatever editor. Like, you don't use screenshots of real editors. You just

00:17:39.380 --> 00:17:44.140
create that with carbon at carbon.now.sh. And that's cool, but those are generally static.

00:17:44.140 --> 00:17:48.140
So Florian sent in this thing called term to SVG.

00:17:49.140 --> 00:17:58.340
And it's a cool way to create animated terminal GIFs. So instead of going all the way to create, like, full-on screencasts of your

00:17:58.340 --> 00:18:05.760
screen, you can run this in your terminal, and then you just do whatever you want to do in the terminal, and it captures it

00:18:05.760 --> 00:18:14.760
perfectly into SVG, and then you get... convert that out to some kind of animated thing. Like, I guess the SVG itself is animated,

00:18:14.860 --> 00:18:18.980
so you just show that in the browser or wherever you want to put it. Isn't that cool?

00:18:18.980 --> 00:18:19.440
Yeah.

00:18:19.440 --> 00:18:20.200
Very cool.

00:18:20.200 --> 00:18:24.780
You basically just type term to SVG. Once you have it installed and it starts recording, you do a bunch of

00:18:24.780 --> 00:18:30.400
stuff, and then there's a way to get out of its recording status. So it's pretty cool. It produces, like,

00:18:30.400 --> 00:18:36.500
lightweight, clean-looking animations, or you can even do still frames if you want for, like, a project page.

00:18:37.360 --> 00:18:42.860
So instead of, like, carbon is cool because I can put in the text and the code I want to show up, but maybe it

00:18:42.860 --> 00:18:49.200
doesn't have, here is what the progress bar, and then the install steps with the spinner look like.

00:18:49.200 --> 00:18:55.420
Right? It doesn't naturally capture what actually happens when that code or those terminal commands

00:18:55.420 --> 00:18:55.800
execute.

00:18:56.560 --> 00:19:03.820
So this file, it has color themes, animation controls, all sorts of good stuff. And yeah, it's pretty cool.

00:19:03.820 --> 00:19:08.880
So there's a... probably if you want to... if this sounds interesting, you want to check out the examples.

00:19:08.880 --> 00:19:12.840
So there's a whole page of examples, and there's a bunch of different stuff happening. You can just look

00:19:12.840 --> 00:19:18.120
through there. And I think there's also templates that configure how it records and stuff. So there's a

00:19:18.120 --> 00:19:20.720
bunch of predefined templates that you can go play with to get started from.

00:19:20.720 --> 00:19:23.780
That'd be really cool for, like, a tutorial site or something to...

00:19:23.780 --> 00:19:24.720
Yes, exactly.

00:19:24.720 --> 00:19:25.360
Yeah.

00:19:25.360 --> 00:19:29.700
Or even... or if you have a project, right? Like, if you're the maintainer of pipx,

00:19:29.700 --> 00:19:34.460
it'd be cool to use this to create a way to, like, show how awesome pipx is. Like, this step,

00:19:34.460 --> 00:19:37.420
then this step, and then boom. Right? And just put that right in your GitHub readme.

00:19:37.420 --> 00:19:42.700
Yeah, I love it when there's little animated things in the readme. So when you go to GitHub,

00:19:42.700 --> 00:19:43.760
you just see that.

00:19:43.760 --> 00:19:49.720
Yeah. You and I, we spend an inordinate amount of time jumping into new projects and going,

00:19:49.720 --> 00:19:53.400
is it interesting? Yes or no? Why is it interesting, right?

00:19:53.460 --> 00:19:58.840
And this kind of stuff is the thing that just goes, after 10 seconds, I knew I wanted to learn

00:19:58.840 --> 00:20:00.900
about it, right? It really makes a difference, and it's easy.

00:20:00.900 --> 00:20:03.340
Yeah. Yeah. Very cool. Definitely check this out.

00:20:03.340 --> 00:20:06.700
Yeah, for sure. All right. Yeah. So that's a good one. People can check that out,

00:20:06.700 --> 00:20:11.040
Term2SVG. Pretty cool. All right. Well, that's it for our main items. What else you got?

00:20:11.040 --> 00:20:19.960
I have one bit of extra news, is that pytest 5.3.0 was released the other day. And it is mostly,

00:20:20.180 --> 00:20:25.360
there's some cool features. And if you, you know, pytest nerds, definitely check it out. But I wanted

00:20:25.360 --> 00:20:29.880
to bring it up because I think a lot of people that just use pytest and are using it with continuous

00:20:29.880 --> 00:20:36.920
integration systems should pay attention to this because the JUnit XML output, they've changed the

00:20:36.920 --> 00:20:43.940
default. So the default format, there's an XML output has, there's an old version and a new version.

00:20:44.020 --> 00:20:48.300
The new version has some more information, but they wanted to make sure that people know about

00:20:48.300 --> 00:20:52.780
this. So if you run it, you'll get a warning and it's not really a warning. It just says,

00:20:52.780 --> 00:20:57.300
it's just to make you aware that there's a particular format that's being deprecated.

00:20:57.300 --> 00:21:03.980
So eventually in the 5.4 release, they won't support the old format. So if you see this,

00:21:03.980 --> 00:21:10.140
encourage anybody using pytest and continuous integration to read the change log and understand

00:21:10.140 --> 00:21:15.340
what's going on and make sure they're ready to either pin pytest or change their system.

00:21:15.340 --> 00:21:17.980
Yeah. It's a good thing to put on people's radar for sure.

00:21:17.980 --> 00:21:21.040
Okay. How about you, Michael? Any extra spits?

00:21:21.040 --> 00:21:27.080
Yeah, I got a bunch for you. Actually, a couple of things. PyCon. PyCon's awesome. We love that

00:21:27.080 --> 00:21:32.620
each year. And this year it's going to be in Pittsburgh for the first of its two years in that

00:21:32.620 --> 00:21:38.100
city. And PyCon registration is now open. You can go and register, get your ticket before it

00:21:38.100 --> 00:21:42.000
sells out. Oh, cool. Yeah. That comes to us from Jacqueline Wilson. So thank you very much

00:21:42.000 --> 00:21:47.400
for sending that in. And then also I saw, I can't remember where I saw this somewhere. Actually,

00:21:47.400 --> 00:21:53.740
I think somewhere funky, like a flip board or something. So Facebook has now decided that

00:21:53.740 --> 00:21:58.420
Microsoft's Visual Studio Code is their default development platform. That's a little surprising

00:21:58.420 --> 00:22:03.820
to me. Yeah. Interesting. Yeah. That's an article on ZDNet. And they're also helping Microsoft

00:22:03.820 --> 00:22:10.920
improve the remote development experience in VS Code. Cats, dogs, all live in the same place.

00:22:10.920 --> 00:22:17.160
Okay. Yeah. This is cool. I suspect that things like Vim and Emacs and stuff probably have a strong

00:22:17.160 --> 00:22:21.100
representation there. But apparently it's all about Visual Studio Code over there now.

00:22:21.100 --> 00:22:21.760
Anything else?

00:22:21.760 --> 00:22:28.340
Yes. Two more things. Very exciting. So if the release schedule lines up correctly in the future,

00:22:28.340 --> 00:22:36.800
extends as I expect it, this should be Wednesday before Thanksgiving, right? And that would mean

00:22:36.800 --> 00:22:42.680
the day or two after that is going to be Black Friday. So I just want to point out that Talk Python

00:22:42.680 --> 00:22:48.140
training is going to have a really awesome Black Friday sale. Get a whole bunch of stuff on buying

00:22:48.140 --> 00:22:54.020
all of the courses, but also we're doing some special things to support the PSF and other stuff,

00:22:54.020 --> 00:22:59.220
some surprises in there that I suspect people won't guess at. And there's no way people are going to

00:22:59.220 --> 00:23:04.480
guess what is there. So check it out over at training.talkpython.fm. But you got to act right

00:23:04.480 --> 00:23:08.680
away because it's only going to be there for like four days. It's a big deal. So check that out. And also,

00:23:08.680 --> 00:23:15.040
we have a new course coming, Python for the .NET developer. So, so many people are coming from C#

00:23:15.040 --> 00:23:19.940
and the .NET world over into the Python space. I thought it would be cool to create a course that

00:23:19.940 --> 00:23:25.120
kind of gives them a big hug and holds their hand and helps them step over that divide. So it's like,

00:23:25.120 --> 00:23:31.520
do you know about ASP.NET? Here's Flask. And here's how you use it in Python. Do you know about any

00:23:31.520 --> 00:23:36.380
framework? Here's SeqWalchemy. Here's how you use it in Python. Like all the things that they need or

00:23:36.380 --> 00:23:41.720
they love from C# and .NET. Here's the Python equivalent and why it's awesome and how it works.

00:23:41.720 --> 00:23:44.120
Is that one that you did or did somebody else do that?

00:23:44.120 --> 00:23:45.020
No, no, I did that one.

00:23:45.020 --> 00:23:46.720
Because you're like the perfect person for that.

00:23:46.720 --> 00:23:50.920
Exactly. I spent so many years doing C# and now I'm all about Python. So exactly. I figured

00:23:50.920 --> 00:23:56.140
like, why don't I try to think back to the way it was for me many years ago and like sort of extend

00:23:56.140 --> 00:24:01.740
that experience back to other people. It's probably not going to be out yet. It may be out at the time

00:24:01.740 --> 00:24:04.900
that people hear this, but it's coming really soon. So I'll just put it out there as that.

00:24:04.900 --> 00:24:09.760
That's nice. Hey, speaking of Black Friday, I do not have any insider knowledge,

00:24:09.760 --> 00:24:16.420
but Pragmatic Publishers often does a Black Friday sale too. It's usually fairly steep. So if you've

00:24:16.420 --> 00:24:22.040
not picked up the pytest book yet, and really, if you're listening to this and you haven't read it yet,

00:24:22.040 --> 00:24:22.860
what's going on?

00:24:22.860 --> 00:24:23.260
Come on.

00:24:23.260 --> 00:24:29.480
If you haven't, maybe check out pragfrog.com and see if there's a sale.

00:24:29.480 --> 00:24:31.580
Definitely. I'm sure there will be. It would be surprising.

00:24:31.640 --> 00:24:31.760
Yep.

00:24:31.760 --> 00:24:32.600
There weren't. Awesome.

00:24:32.600 --> 00:24:34.420
How about a joke or two or three?

00:24:34.420 --> 00:24:35.380
I like three jokes.

00:24:35.380 --> 00:24:35.800
Okay.

00:24:35.800 --> 00:24:41.500
It's a good number. So this one, first one is more of just a geeky STEM type of joke,

00:24:41.500 --> 00:24:47.820
but I think people will like it. So I love soda drinks, you know, Coca-Cola, Dr. Pepper,

00:24:47.820 --> 00:24:53.560
root beer, things like that. So this one, I try to not drink too much, but I do like it. But here's

00:24:53.560 --> 00:24:58.760
how that world can clash together with math. What do you get when you put root beer into a square

00:24:58.760 --> 00:24:59.200
glass?

00:24:59.200 --> 00:25:00.040
I don't know. What?

00:25:00.040 --> 00:25:00.420
Beer.

00:25:01.540 --> 00:25:05.040
I don't even get it, but it's funny.

00:25:05.040 --> 00:25:07.480
If you take root of beer and you square it.

00:25:07.480 --> 00:25:08.360
Oh, okay.

00:25:08.360 --> 00:25:08.960
Okay.

00:25:08.960 --> 00:25:12.320
Right? Like the square root of beer and then you put it in a square glass.

00:25:12.320 --> 00:25:13.260
Okay. That was bad.

00:25:13.260 --> 00:25:14.160
What's your next one here?

00:25:14.160 --> 00:25:17.060
Okay. What do you call an optimistic front end developer?

00:25:17.760 --> 00:25:19.380
I don't know. What do you call it?

00:25:19.380 --> 00:25:21.380
A stack half full developer.

00:25:21.380 --> 00:25:22.680
That is awesome.

00:25:22.680 --> 00:25:29.080
Okay. Now I also, I was going to tell a version control joke, but they're only funny if you

00:25:29.080 --> 00:25:29.580
get them.

00:25:29.580 --> 00:25:34.180
Get G-I-D. Awesome. Those are both good. I like them. Yeah. Great.

00:25:34.180 --> 00:25:38.340
Cool. Well, thanks again for having a nice conversation this week.

00:25:38.400 --> 00:25:40.080
Yeah. You bet. Thanks as always. See you later, Brian.

00:25:40.080 --> 00:25:40.360
Bye.

00:25:40.360 --> 00:25:45.240
Thank you for listening to Python Bytes. Follow the show on Twitter via at Python Bytes. That's

00:25:45.240 --> 00:25:51.820
Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news

00:25:51.820 --> 00:25:56.360
item you want featured, just visit pythonbytes.fm and send it our way. We're always on the lookout

00:25:56.360 --> 00:26:01.600
for sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy. Thank you

00:26:01.600 --> 00:26:04.360
for listening and sharing this podcast with your friends and colleagues.

