WEBVTT

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

00:00:04.740 --> 00:00:08.960
This is episode 211, recorded December 2nd, 2020.

00:00:08.960 --> 00:00:10.180
I'm Michael Kennedy.

00:00:10.180 --> 00:00:11.340
And I'm Brian Okken.

00:00:11.340 --> 00:00:12.620
And we have a special guest.

00:00:12.620 --> 00:00:13.160
Yeah.

00:00:13.160 --> 00:00:14.020
Matthew Feigert, welcome.

00:00:14.020 --> 00:00:15.660
Yeah, thanks so much for having me on.

00:00:15.660 --> 00:00:17.020
Yeah, it's great to have you here.

00:00:17.020 --> 00:00:20.160
You've been over on Talk Python before, right?

00:00:20.160 --> 00:00:20.600
Yeah.

00:00:20.600 --> 00:00:24.980
Talking about some cool high energy physics and all that kind of stuff.

00:00:24.980 --> 00:00:28.400
Yeah, I looked that up last night just to try and remind myself.

00:00:28.400 --> 00:00:29.980
That was episode 144.

00:00:29.980 --> 00:00:37.800
I was on with my colleagues, Michaela Paganini and Michael Kagan to talk with you about machine learning applications at the LHC.

00:00:37.800 --> 00:00:38.280
Yeah.

00:00:38.280 --> 00:00:42.120
And you do stuff over with CERN at the Large Hadron Collider and things like that?

00:00:42.120 --> 00:00:42.640
Yeah.

00:00:42.640 --> 00:00:42.980
Yeah.

00:00:42.980 --> 00:00:47.160
So I'm a postdoctoral researcher at the University of Illinois at Urbana-Champaign.

00:00:47.160 --> 00:00:57.400
And so there I split my time between working on the Atlas experiment and working as a software researcher at the Institute for Research and Innovation and Software for High Energy Physics.

00:00:57.800 --> 00:01:07.200
And so like on Atlas, Atlas is this like huge five story tall particle detector that lives 100 meters underground at CERN's Large Hadron Collider.

00:01:07.200 --> 00:01:10.320
That's just outside beautiful Geneva, Switzerland.

00:01:11.100 --> 00:01:21.700
And so there I work with a few thousand of my closest colleagues and friends to try and look for evidence of new physics and make precision measurements of physics we do know about.

00:01:22.500 --> 00:01:37.800
And then my IRISHEP work is kind of focused on working in an interdisciplinary and inter-experimental team to try and improve the necessary cyber infrastructure and software for us to be able to use in upcoming runs of the Large Hadron Collider.

00:01:37.800 --> 00:01:41.900
And in what we call like a high luminosity run, which is going to be way more collisions than normal.

00:01:41.900 --> 00:01:43.480
Have you guys ever turned it up to full power?

00:01:43.480 --> 00:01:45.400
Have you turned it up to full power yet?

00:01:45.900 --> 00:01:53.620
So, yeah, the design luminosity or the design energy of the LHC is at something called 14 tera electron volts, 14 TV.

00:01:53.620 --> 00:02:00.140
And we've been running intentionally at a lower operating energy for the last couple of years, just a little bit below that.

00:02:00.140 --> 00:02:03.740
But in the late 2020s, we're going to suck the entire Earth into it.

00:02:05.300 --> 00:02:08.460
You know, no, no experimental evidence of black hole creation.

00:02:08.460 --> 00:02:08.800
Yeah.

00:02:08.800 --> 00:02:18.860
But kind of the cool thing is that if we even did make a black hole, the LHC due to something called Hawking radiation, it would evaporate well before it could actually ever do anything interesting gravitationally.

00:02:18.860 --> 00:02:20.600
But yeah, it's really exciting.

00:02:20.600 --> 00:02:21.100
Really.

00:02:21.100 --> 00:02:23.680
I'm joking, but it's such a cool place.

00:02:23.680 --> 00:02:25.060
Such cool technology.

00:02:25.060 --> 00:02:27.520
I mean, that's right out of the edge of physics these days.

00:02:27.520 --> 00:02:29.640
And the technology side is neat, too.

00:02:29.640 --> 00:02:30.140
Yeah.

00:02:30.140 --> 00:02:31.060
No, it's super fun.

00:02:31.060 --> 00:02:34.020
Well, welcome over to Python Bytes.

00:02:34.020 --> 00:02:35.100
Yeah, it's great to be here.

00:02:35.100 --> 00:02:36.820
So I yeah, it's good to have you.

00:02:36.820 --> 00:02:37.440
Thanks for coming.

00:02:37.440 --> 00:02:41.640
And Brian, I think let's let's start with another one of my favorite topics.

00:02:41.640 --> 00:02:42.320
Farms.

00:02:42.320 --> 00:02:43.580
I love farming.

00:02:43.580 --> 00:02:45.400
You know, you see the bumper sticker.

00:02:45.400 --> 00:02:46.860
No farms, no food.

00:02:46.860 --> 00:02:48.020
I like food a lot.

00:02:48.020 --> 00:02:49.160
So I love farms.

00:02:49.160 --> 00:02:50.220
No, no.

00:02:50.220 --> 00:02:51.800
But the farm stack.

00:02:51.800 --> 00:02:54.420
We've heard the lamp stack, other stacks.

00:02:54.420 --> 00:02:56.680
Like lamp is not as useful as farm.

00:02:56.680 --> 00:02:57.100
Right.

00:02:57.100 --> 00:02:57.960
Farm sounds more useful.

00:02:57.960 --> 00:02:59.180
So tell us about farm.

00:02:59.180 --> 00:03:02.440
So Aaron Bassett, he's I'm not sure.

00:03:02.680 --> 00:03:08.960
I think he's one of the spokespeople for Mongo or something like advocate or something like

00:03:08.960 --> 00:03:09.120
that.

00:03:09.120 --> 00:03:15.240
Anyway, he's he's doing he he wrote this article, but they've also done.

00:03:15.500 --> 00:03:18.100
I think that there's been some talks given.

00:03:18.100 --> 00:03:19.960
But this is this is a nice article.

00:03:19.960 --> 00:03:24.520
It's a called introducing farm stack, which is FastAPI react and MongoDB.

00:03:25.220 --> 00:03:34.540
So the I really actually appreciated the article and the code with it, because there's a GitHub,

00:03:34.540 --> 00:03:37.740
a little GitHub to do credit app that they've put together.

00:03:37.740 --> 00:03:45.800
And it the article describes basically all of the pieces of the application using it like

00:03:45.800 --> 00:03:46.700
a little to do app.

00:03:46.700 --> 00:03:53.840
But with FastAPI, you've got this is interactive, interactive documentation mode where you can

00:03:53.840 --> 00:03:57.160
interact with the application just almost immediately.

00:03:57.160 --> 00:04:00.080
You don't have to really do much to put it all together.

00:04:00.080 --> 00:04:05.740
And and then for all your endpoints, you can actually interact with them, send send data,

00:04:05.740 --> 00:04:06.420
do queries.

00:04:06.820 --> 00:04:09.880
And there's a little animated gif to show how that's done.

00:04:09.880 --> 00:04:15.460
But the article then, you know, goes through and says, you know, basically how how the endpoints

00:04:15.460 --> 00:04:23.440
and routes get hooked up and then uses you, you, you, a corn to set up an async event loop and

00:04:23.440 --> 00:04:30.480
get that going shows how easy it is to connect to a database and then defining models with and

00:04:30.480 --> 00:04:33.640
how easy it is to set up a schema goes through.

00:04:34.120 --> 00:04:39.660
And then it kind of hooks up, talks through the code discussion of you do have to write

00:04:39.660 --> 00:04:44.860
code for the endpoints and and really how easy those are with all of these these pieces.

00:04:44.860 --> 00:04:49.820
The React application is it's kind of a minimal app React application.

00:04:49.820 --> 00:04:53.480
I'm not sure why they kind of included that, but it's kind of a neat addition.

00:04:53.480 --> 00:04:59.000
There's a React application that's running that just sort of shows some of the interaction with

00:04:59.000 --> 00:05:05.840
the the CRUD app and it gets updated while, you know, while you're changing things through

00:05:05.840 --> 00:05:07.260
the interactive API.

00:05:07.260 --> 00:05:14.120
And I just I like the demonstration of working through working with an API and working through

00:05:14.120 --> 00:05:20.820
changing things and seeing it show up having a like a React app at the other end.

00:05:20.820 --> 00:05:24.040
It's kind of a fun way to kind of experiment with an API.

00:05:24.200 --> 00:05:26.140
This is a really neat thing.

00:05:26.140 --> 00:05:29.680
And one of the other major stacks that's been used around Mongo is the mean stack.

00:05:29.680 --> 00:05:34.080
And the farm stack is way nicer than the mean stack, not just because it uses Python and not

00:05:34.080 --> 00:05:34.380
JavaScript.

00:05:34.380 --> 00:05:36.180
But there's some interesting things here.

00:05:36.180 --> 00:05:43.180
One of the examples is actually kind of blowing my mind in that it's an if statement using the

00:05:43.180 --> 00:05:48.080
walrus operator awaiting an asynchronous call in an API method.

00:05:48.080 --> 00:05:51.960
like the walrus operator and async, the await keyword.

00:05:51.960 --> 00:05:52.940
I've never seen those together.

00:05:52.940 --> 00:05:55.180
And it's kind of like it's inspiring.

00:05:55.180 --> 00:05:56.040
It's nice.

00:05:56.040 --> 00:05:56.660
It's good.

00:05:56.660 --> 00:05:57.100
Yeah.

00:05:57.100 --> 00:05:57.520
Yeah.

00:05:57.520 --> 00:05:59.360
Such succinct code as well.

00:05:59.360 --> 00:06:00.540
It's super nice.

00:06:00.540 --> 00:06:02.640
I mean, it uses FastAPI, which is fantastic.

00:06:02.640 --> 00:06:09.720
It's using motor, which is MongoDB's officially supported Python async library because you need an

00:06:09.720 --> 00:06:13.980
async capable library in order to do things against MongoDB.

00:06:14.640 --> 00:06:17.280
You know, this actually comes from the developer blog at MongoDB.

00:06:17.280 --> 00:06:24.280
There also are some ORM like things, some ODMs, object document mapper stuff that also supports

00:06:24.280 --> 00:06:25.820
async and await from MongoDB.

00:06:25.820 --> 00:06:28.500
So if you're more in the ORM style, you might check that out.

00:06:28.500 --> 00:06:30.340
But other than that, this looks pretty neat to me.

00:06:30.340 --> 00:06:30.480
Yeah.

00:06:30.480 --> 00:06:30.980
Yeah.

00:06:30.980 --> 00:06:35.660
And I do know that a lot of people use the ORMs, but I like I appreciated the example without

00:06:35.660 --> 00:06:41.760
an ORM for people because you throw an ORM example in there and then people that don't

00:06:41.760 --> 00:06:43.740
use that particular one get lost.

00:06:44.140 --> 00:06:44.580
Yeah.

00:06:44.580 --> 00:06:46.540
Matthew, do you guys do anything with MongoDB?

00:06:46.540 --> 00:06:47.780
Any of these kind of things?

00:06:47.780 --> 00:06:48.260
FastAPI?

00:06:48.260 --> 00:06:49.280
Yeah.

00:06:49.280 --> 00:06:50.420
I have some friends that do.

00:06:50.420 --> 00:06:56.820
I personally, myself, I'm not too versed in Mongo, but I've heard it on the show and

00:06:56.820 --> 00:06:58.320
many, many times elsewhere.

00:06:58.320 --> 00:07:03.640
So this is, I think, also just kind of paging through the article as Ryan was talking about.

00:07:03.640 --> 00:07:04.620
It is pretty impressive.

00:07:04.620 --> 00:07:06.780
So it's really concise.

00:07:06.780 --> 00:07:10.040
Like, here's your four lines to completely implement the API.

00:07:10.040 --> 00:07:10.540
Yeah.

00:07:10.540 --> 00:07:11.560
Type of things, right?

00:07:11.560 --> 00:07:13.680
Asynchronous, fast, like all the cool stuff.

00:07:13.760 --> 00:07:13.920
Yeah.

00:07:13.920 --> 00:07:14.760
Yeah.

00:07:14.760 --> 00:07:20.540
There was an example, a case study of MongoDB being used at the Large Hadron Collider, but

00:07:20.540 --> 00:07:22.720
that was many years ago and I don't know if it still is.

00:07:22.720 --> 00:07:24.900
So I've completely forgotten where that is.

00:07:24.900 --> 00:07:25.320
Yeah.

00:07:25.320 --> 00:07:25.960
I don't know.

00:07:25.960 --> 00:07:26.620
Yeah.

00:07:26.620 --> 00:07:27.060
Yeah.

00:07:27.060 --> 00:07:27.540
Cool.

00:07:27.540 --> 00:07:27.780
Cool.

00:07:27.880 --> 00:07:31.840
So next thing I want to talk about another programming language.

00:07:31.840 --> 00:07:37.400
Last time, Brian, I went on and on, maybe the time before, two times ago, about .NET and C-Sharp

00:07:37.400 --> 00:07:41.920
because Anthony Shaw had done that work on Pigeon to get Python to run on .NET.

00:07:41.920 --> 00:07:45.900
And we're like, well, why are we talking about C-Sharp on this project, right?

00:07:45.900 --> 00:07:46.680
On this podcast.

00:07:47.100 --> 00:07:49.680
Well, I want to talk about something even more advanced, AppleScript.

00:07:49.680 --> 00:07:52.040
Wow.

00:07:52.040 --> 00:07:52.660
Cutting edge.

00:07:52.660 --> 00:07:53.280
Yes.

00:07:53.280 --> 00:07:57.280
It's like the CMD shell script of Apple.

00:07:57.280 --> 00:07:59.520
Have you ever programmed an AppleScript?

00:07:59.520 --> 00:08:00.200
It's painful.

00:08:00.620 --> 00:08:01.240
No, I have not.

00:08:01.240 --> 00:08:06.500
It's like you say, like, tell this application that to like make a command.

00:08:06.500 --> 00:08:08.180
Oh, it's bad news bears.

00:08:08.180 --> 00:08:08.700
Let me tell you.

00:08:08.700 --> 00:08:15.880
So what I've come across is this thing called PyAppleScript.

00:08:15.880 --> 00:08:18.840
Now, this is not brand new, but it's brand new to me.

00:08:18.840 --> 00:08:23.140
And there's a lot of talk about Macs and people may be getting new Macs.

00:08:23.140 --> 00:08:27.780
So I thought I would say, hey, look, here's a cool way to automate your Mac or, you know,

00:08:27.780 --> 00:08:29.380
Macs within your company or whatever.

00:08:29.700 --> 00:08:32.900
With Python instead of this dreaded NS AppleScript.

00:08:32.900 --> 00:08:33.520
Okay.

00:08:33.520 --> 00:08:33.780
All right.

00:08:33.780 --> 00:08:39.620
So basically it's a Python wrapper around NS AppleScript, allowing Python scripts or applications

00:08:39.620 --> 00:08:44.580
to communicate with AppleScript and AppleScriptable applications.

00:08:44.580 --> 00:08:48.880
So apps for which they basically implement AppleScript and let you do that.

00:08:48.880 --> 00:08:52.800
So scripts get compiled either from source or they can be loaded from disk.

00:08:52.800 --> 00:08:57.740
They have these, some of these ideas are from AppleScript as a standard run handler and user

00:08:57.740 --> 00:09:00.820
defined handlers can be invoked with or without arguments.

00:09:00.820 --> 00:09:02.440
They're automatically converted.

00:09:02.660 --> 00:09:08.060
The responses to and from AppleScript are automatically converted either from AppleScript to Python

00:09:08.060 --> 00:09:12.400
types like Python string versus AppleScript one or vice versa.

00:09:12.400 --> 00:09:12.680
Right.

00:09:12.680 --> 00:09:14.940
So you don't have to do the type coercion, which is cool.

00:09:14.940 --> 00:09:16.320
And they're persistent.

00:09:16.320 --> 00:09:20.920
So you can call your handle multiple times and it retains a state like AppleScript would.

00:09:20.920 --> 00:09:28.800
And it also has no dependency on the legacy AppleScript library or the so-called flawed scripting

00:09:28.800 --> 00:09:32.640
bridge framework, which is limited to OSA script executables.

00:09:32.840 --> 00:09:33.600
So that's pretty cool.

00:09:33.600 --> 00:09:38.900
If you want to automate things on your Mac, you obviously could use Bash.

00:09:38.900 --> 00:09:43.840
But if you're talking to some kind of application that implements one of these scripts, like for

00:09:43.840 --> 00:09:48.780
example, you want to tell this other application to grab something out of the clipboard and then

00:09:48.780 --> 00:09:50.840
tell it to do something or something like that.

00:09:50.840 --> 00:09:51.040
Right.

00:09:51.040 --> 00:09:52.860
Like you couldn't reasonably do that with Bash.

00:09:52.860 --> 00:09:53.260
Right.

00:09:53.260 --> 00:09:56.500
Once it starts up, you kind of want to go back and forth with it.

00:09:56.500 --> 00:09:58.800
So it sounds like AppleScript might be the thing to do.

00:09:58.800 --> 00:09:59.300
Pretty cool.

00:09:59.500 --> 00:09:59.940
Yeah.

00:09:59.940 --> 00:10:00.500
Yeah.

00:10:00.500 --> 00:10:00.980
Yeah.

00:10:00.980 --> 00:10:02.400
I mean, not a lot to it.

00:10:02.400 --> 00:10:07.760
Like if you've got a script, your Apple macOS stuff, do it with Python.

00:10:07.760 --> 00:10:10.260
You don't have to do it with that AppleScript stuff.

00:10:10.260 --> 00:10:11.060
No, it's neat.

00:10:11.060 --> 00:10:11.460
Yeah.

00:10:11.460 --> 00:10:11.880
Yeah.

00:10:11.880 --> 00:10:16.380
So Matthew, you probably brought something to do with physics, data science, I'm guessing.

00:10:16.380 --> 00:10:17.380
What's your first one here?

00:10:17.380 --> 00:10:18.160
Yeah, a bit.

00:10:18.160 --> 00:10:24.780
So we currently live in this like really nice age of having awesome CI services and all these

00:10:24.780 --> 00:10:27.240
really nice metrics for all your GitHub projects and everything.

00:10:27.240 --> 00:10:30.920
So, you know, if you're, I'm thinking of like coverage.

00:10:30.920 --> 00:10:35.600
So if you're, you know, using pytest and, you know, making sure that you're reporting your

00:10:35.600 --> 00:10:39.880
coverage, you have all these really great services to also track your coverage and report that

00:10:39.880 --> 00:10:40.880
in a nice shiny badge.

00:10:41.120 --> 00:10:46.540
But let's say you're developing some tool or some library and you have some sort of performance

00:10:46.540 --> 00:10:48.380
metric that you care about.

00:10:48.380 --> 00:10:53.500
Let's say like how fast some, the speed of evaluation for certain expensive functions.

00:10:53.500 --> 00:10:57.040
And you actually want to try and like track that through the entire history of your code

00:10:57.040 --> 00:10:57.320
base.

00:10:57.320 --> 00:11:00.680
And that's not something that's like traditionally very super easy to do.

00:11:01.040 --> 00:11:03.220
So recently I was really happy to find something.

00:11:03.220 --> 00:11:04.500
So like if you're making changes.

00:11:04.500 --> 00:11:09.160
So if you're going to be adding some feature or whatever, you are refactoring it.

00:11:09.160 --> 00:11:12.160
So it's easier to write, but you're not sure if that makes it faster or slower.

00:11:12.160 --> 00:11:16.120
And this would sort of give you that information from week to week or something like that.

00:11:16.120 --> 00:11:16.680
Exactly.

00:11:16.680 --> 00:11:16.980
Yeah.

00:11:17.060 --> 00:11:21.220
So you might like, you might go ahead and say like, okay, well, you know, I have like

00:11:21.220 --> 00:11:25.860
some, some tests that make sure that this function evaluates and under some period of time, if

00:11:25.860 --> 00:11:28.560
it's an expensive function for your test.

00:11:28.560 --> 00:11:33.700
But let's say you actually want to like track across like different, different parameter,

00:11:33.700 --> 00:11:39.060
parameterizations, how that function actually is about is being performing and evaluating it

00:11:39.060 --> 00:11:39.940
in your whole code base.

00:11:39.940 --> 00:11:45.580
So I've recently found this super cool tool written in Python called airspeed velocity.

00:11:46.600 --> 00:11:53.040
And so from the docs, ASV airspeed velocity is a tool for benchmarking Python packages over

00:11:53.040 --> 00:11:53.700
their lifetime.

00:11:53.700 --> 00:11:59.180
So it deals with runtime memory consumption and even custom compute values.

00:11:59.180 --> 00:12:05.320
And the results are then displayed in a super nice web front end that's interactive and basically

00:12:05.320 --> 00:12:07.560
just requires like static webpage hosting.

00:12:07.560 --> 00:12:10.760
So it's, it's pretty impressive.

00:12:10.760 --> 00:12:15.120
And just if you click on the docs, you can see that's developed by a community of people,

00:12:15.120 --> 00:12:18.800
but led by Michael Dorritboom.

00:12:18.800 --> 00:12:20.800
I'm probably getting your, your name wrong.

00:12:20.800 --> 00:12:21.500
Very sorry.

00:12:21.500 --> 00:12:23.900
And Pauly Burton.

00:12:23.900 --> 00:12:25.860
But if you look at some...

00:12:25.860 --> 00:12:29.560
He's the guy that who was behind a pie oxidizer at Mozilla.

00:12:29.560 --> 00:12:30.060
Oh, really?

00:12:30.060 --> 00:12:30.920
Oh, okay.

00:12:30.920 --> 00:12:31.260
Yeah.

00:12:31.260 --> 00:12:32.780
That's a super cool project.

00:12:32.780 --> 00:12:34.120
Yeah, for sure.

00:12:34.240 --> 00:12:34.680
Yeah.

00:12:34.680 --> 00:12:34.800
Yeah.

00:12:34.800 --> 00:12:35.640
yeah.

00:12:35.640 --> 00:12:40.240
And so, I mean, if you look at the other people that are on the contributor list, you can spot

00:12:40.240 --> 00:12:44.480
a lot of names that are common in the SciPy and Jupyter ecosystem.

00:12:44.480 --> 00:12:48.980
So it's, you already know that this is a nice community built tool.

00:12:48.980 --> 00:12:54.320
And then also, as kind of some example cases, they give, current projects that

00:12:54.320 --> 00:12:56.840
are using it like NumPy and SciPy and AstroPy.

00:12:56.840 --> 00:12:59.300
So pretty well established projects.

00:12:59.300 --> 00:13:03.940
And just as kind of like an example, if you click on like the SciPy project and go

00:13:03.940 --> 00:13:08.380
to the interpolate function there, you can, you can just kind of look at a very nice

00:13:08.380 --> 00:13:14.320
visualization of the actual evaluation, in time on the vertical axis across a whole

00:13:14.320 --> 00:13:19.460
bunch of parameterizations, such as like CPython version and number of samples that are being

00:13:19.460 --> 00:13:19.800
run.

00:13:19.800 --> 00:13:24.460
And you can see this for the entire lifetime of the code base and you can zoom in on any

00:13:24.460 --> 00:13:25.640
section just with the mouse.

00:13:25.820 --> 00:13:30.040
And something I think that is super, super cool is if you, if you're looking at the visualization

00:13:30.040 --> 00:13:34.420
of the plot and you see that, oh, there's like one commit where all of a sudden things go

00:13:34.420 --> 00:13:36.700
funky and the evaluation time just jumps up.

00:13:36.700 --> 00:13:42.100
You can just click on that node and it immediately opens up to that commit in GitHub, which is,

00:13:42.100 --> 00:13:45.880
I think, super awesome that you don't have to go and like search through your commit history

00:13:45.880 --> 00:13:48.280
to figure out what, like where that corresponds to.

00:13:48.280 --> 00:13:49.240
It's just boom, right?

00:13:49.240 --> 00:13:52.160
I'm looking at, it shows the Shaw from GitHub.

00:13:52.160 --> 00:13:52.760
Yeah.

00:13:53.100 --> 00:13:56.240
The, the unique identifier of the commit.

00:13:56.240 --> 00:13:57.560
That's crazy.

00:13:57.560 --> 00:13:57.920
Yeah.

00:13:57.920 --> 00:13:58.880
So, wow.

00:13:58.880 --> 00:13:59.300
Yeah.

00:13:59.300 --> 00:14:03.740
So I've, I've, you know, a project that I'm working on, we've been interested in trying

00:14:03.740 --> 00:14:07.200
to have the sort of like metric tracking for some of our, for some of our work.

00:14:07.200 --> 00:14:11.720
So this is something that I'm actively kind of, looking at how we might be able to deploy

00:14:11.720 --> 00:14:14.120
this for one of my projects with my coauthors.

00:14:14.240 --> 00:14:16.440
but it's openly developed on GitHub.

00:14:16.440 --> 00:14:19.020
It's up on pipe, pipe behind as well.

00:14:19.020 --> 00:14:20.660
So just pip install ASV.

00:14:20.660 --> 00:14:25.400
and then I think something that's kind of very cute and very kind of Pythonic is that,

00:14:25.400 --> 00:14:29.680
uh, if you, when you go to the reporting dashboard for the different libraries that you're actually

00:14:29.680 --> 00:14:35.540
benchmarking, it will, up at the top, say the airspeed velocity of an unladen X.

00:14:35.540 --> 00:14:40.460
So the airspeed velocity of an unladen like numpy or an unladen scipy.

00:14:40.460 --> 00:14:44.380
So, you know, keeping very true to the, you know, Python's roots there.

00:14:44.380 --> 00:14:50.120
There's some Monty Python, the show Zen in there for sure.

00:14:50.120 --> 00:14:50.620
Exactly.

00:14:50.620 --> 00:14:51.080
Yeah.

00:14:51.080 --> 00:14:52.240
This is impressive.

00:14:52.240 --> 00:14:55.020
I mean, Brian, how do you see this fitting into like testing and stuff?

00:14:55.020 --> 00:14:56.300
I actually love this.

00:14:56.300 --> 00:14:57.960
I, I could use this right away.

00:14:57.960 --> 00:15:02.020
There's, there's lots of, well, a lot of times it's, it's not, yeah.

00:15:02.020 --> 00:15:05.240
Performance of performance is always something we care about.

00:15:05.240 --> 00:15:11.300
And, and benchmarking systems, and, you know, testing, it's always, it's something

00:15:11.300 --> 00:15:17.380
you forget about sometimes, like running, running stuff and it still works, but like

00:15:17.380 --> 00:15:21.060
over time things slow down and it's good to, good to know that.

00:15:21.060 --> 00:15:21.580
Yeah.

00:15:21.580 --> 00:15:26.340
And if this could just be automatic and just part of your CI, you just go back and see the

00:15:26.340 --> 00:15:26.700
updates.

00:15:26.700 --> 00:15:27.640
That'd be very cool.

00:15:27.640 --> 00:15:28.260
Definitely.

00:15:28.260 --> 00:15:28.840
Yeah.

00:15:28.840 --> 00:15:33.400
I don't think that this is something that at the moment, and I'm happy to be corrected about

00:15:33.400 --> 00:15:33.620
this.

00:15:33.620 --> 00:15:37.960
I don't think at the moment there is some way that this is currently being, given

00:15:37.960 --> 00:15:41.860
as like a CI service, but I think that this is something that you could like set up and

00:15:41.860 --> 00:15:43.260
run for yourself pretty easily.

00:15:43.260 --> 00:15:43.660
Yeah.

00:15:43.660 --> 00:15:45.220
You could probably plug it in.

00:15:45.220 --> 00:15:45.720
Yeah.

00:15:45.720 --> 00:15:46.640
Yeah, exactly.

00:15:46.640 --> 00:15:53.000
But you could probably do some kind of webhook when, when there's a check-in automatically

00:15:53.000 --> 00:15:54.580
kick it off and then save a result.

00:15:54.580 --> 00:15:54.840
Right.

00:15:54.860 --> 00:15:59.340
You could just hook into the GitHub actions and then have it just call you back and start

00:15:59.340 --> 00:16:02.420
your, you know, let's take a, take a record of this or whatever.

00:16:02.420 --> 00:16:03.060
Yeah.

00:16:03.060 --> 00:16:03.360
Yeah.

00:16:03.360 --> 00:16:03.760
Very cool.

00:16:03.760 --> 00:16:04.720
This is a great idea.

00:16:04.720 --> 00:16:05.260
Yeah.

00:16:05.260 --> 00:16:09.800
Something else that I'm, I haven't really investigated yet, but that I'm looking into is if this can

00:16:09.800 --> 00:16:12.380
also be used to do like GPU benchmarking.

00:16:12.380 --> 00:16:16.960
So like, let's say you have a library that, you know, also that is going to be, you

00:16:16.960 --> 00:16:21.420
can transparently, use the APIs to transparently move from CPU to GPU.

00:16:21.420 --> 00:16:26.480
Like you have something like Jack's or TensorFlow or PyTorch, then this might be kind of a nice

00:16:26.480 --> 00:16:26.820
way.

00:16:26.820 --> 00:16:31.280
if it's, if it's based on those to be able to like benchmark your GPU performance

00:16:31.280 --> 00:16:31.700
as well.

00:16:31.700 --> 00:16:32.160
Yeah.

00:16:32.460 --> 00:16:34.460
Well, and that's one of the things you might not test, right?

00:16:34.460 --> 00:16:38.580
If it could run either way, you might just run it on your machine, whichever one of those

00:16:38.580 --> 00:16:40.560
it is and forget to try the other style.

00:16:40.560 --> 00:16:40.840
Right.

00:16:40.840 --> 00:16:41.500
Exactly.

00:16:41.500 --> 00:16:41.940
Yeah.

00:16:41.940 --> 00:16:46.020
And I don't think there's too many CI services that are going to, you know, generously give

00:16:46.020 --> 00:16:48.980
you some like really nice GPUs to be doing benchmarking on.

00:16:48.980 --> 00:16:50.320
Yeah, that's for sure.

00:16:50.320 --> 00:16:50.880
For sure.

00:16:50.880 --> 00:16:51.520
All right.

00:16:51.520 --> 00:16:54.820
Now for the next item, let me tell you about our sponsor.

00:16:54.820 --> 00:16:59.520
This episode is brought to you by Tech Meme, the Tech Meme Ride Home Podcast.

00:17:00.240 --> 00:17:05.460
They've been for two years recording episodes every single day.

00:17:05.460 --> 00:17:11.300
And so they're Silicon Valley's favorite tech news podcast, and you can get them daily 15

00:17:11.300 --> 00:17:15.380
to 20 minutes, exactly by 5 PM Eastern, all the tech news you want.

00:17:15.380 --> 00:17:15.720
Right.

00:17:15.720 --> 00:17:17.960
But it's not just headlines, much like by them bites.

00:17:17.960 --> 00:17:21.560
Actually, it's a very similar show, but for the broader tech industry, you could have a robot

00:17:21.560 --> 00:17:26.120
read the headlines or just flip through them, but it has the context and the analysis all

00:17:26.120 --> 00:17:26.560
around it.

00:17:26.560 --> 00:17:29.520
So it's like tech news as a service, if you will.

00:17:29.680 --> 00:17:35.020
So the folks over at Tech Meme, they're online all day reading to catch you up and just search

00:17:35.020 --> 00:17:42.220
your podcast app for the Ride Home and subscribe to the Tech Meme Ride Home Podcast or just visit

00:17:42.220 --> 00:17:45.160
pythonbytes.fm/ride to subscribe.

00:17:45.160 --> 00:17:48.200
I have a theory, a hypothesis about this.

00:17:48.200 --> 00:17:53.820
I think that probably actually be a ton of work to put together a show daily on a time like

00:17:53.820 --> 00:17:54.020
that.

00:17:54.020 --> 00:17:55.040
But it's great that they're doing it.

00:17:55.040 --> 00:17:57.160
Do you have any other hypotheses, Brian?

00:17:57.480 --> 00:17:57.860
Yes.

00:17:57.860 --> 00:18:04.020
My hypothesis is that there's not enough examples out in the world of how people are using a

00:18:04.020 --> 00:18:07.120
hypothesis in the field in real world applications.

00:18:07.120 --> 00:18:12.320
So I'm excited that Parsec put it together.

00:18:12.320 --> 00:18:13.020
So Parsec...

00:18:13.020 --> 00:18:15.820
Well, let's take a real quick step back just for people who don't know.

00:18:15.820 --> 00:18:17.180
What is Hypothesis?

00:18:17.180 --> 00:18:18.080
Oh, okay.

00:18:18.080 --> 00:18:18.380
Right.

00:18:18.380 --> 00:18:20.240
Hypothesis is a testing framework.

00:18:20.240 --> 00:18:21.540
Well, it's not really...

00:18:21.540 --> 00:18:23.140
It attaches to other testing frameworks.

00:18:23.140 --> 00:18:25.840
So you can use it with unit test or py test.

00:18:25.840 --> 00:18:27.720
You probably should use it with py test.

00:18:27.720 --> 00:18:35.760
But it's a way, instead of writing a declarative single test or test case, you can...

00:18:35.760 --> 00:18:37.340
It's a property-based testing.

00:18:37.340 --> 00:18:40.220
So you describe kind of...

00:18:40.220 --> 00:18:41.400
It's not like...

00:18:41.400 --> 00:18:43.420
I expect one plus two equals three.

00:18:43.980 --> 00:18:50.940
I expect if I add two integers and they're both positive that the result is going to be

00:18:50.940 --> 00:18:52.360
greater than both of them.

00:18:52.360 --> 00:18:56.600
You have these properties that you describe what the answer is.

00:18:57.260 --> 00:18:58.600
There's a...

00:18:58.600 --> 00:19:06.420
The examples that Hypothesis and other tutorials on how to use Hypothesis have given are more

00:19:06.420 --> 00:19:08.180
of these like A plus B sort of things.

00:19:08.180 --> 00:19:09.280
They're simplistic things.

00:19:09.280 --> 00:19:14.680
And I do see a lot of value in Hypothesis and I know a lot of people are using it.

00:19:14.680 --> 00:19:19.960
But there haven't been a lot of good descriptions for really how it's being used.

00:19:19.960 --> 00:19:23.100
Like a real world example of how it's being used.

00:19:23.100 --> 00:19:26.700
Because I'm probably not going to...

00:19:26.700 --> 00:19:28.960
I don't have those little tiny algorithm things.

00:19:28.960 --> 00:19:30.300
I've got big chunks of stuff.

00:19:30.300 --> 00:19:34.080
And Hypothesis does have to run the test many times.

00:19:34.080 --> 00:19:37.220
So how do you do this effectively on a large project?

00:19:37.220 --> 00:19:38.940
So I love seeing this article.

00:19:38.940 --> 00:19:41.700
So Parsec is a...

00:19:41.700 --> 00:19:45.160
It's a client-side encrypted file sharing service.

00:19:45.160 --> 00:19:46.440
I'd never heard of them before.

00:19:46.440 --> 00:19:48.240
This blog.

00:19:48.240 --> 00:19:49.220
But it sounds cool.

00:19:49.220 --> 00:19:49.480
It's cool.

00:19:49.580 --> 00:19:54.700
They describe themselves as the zero trust file sharing service like Dropbox where it's

00:19:54.700 --> 00:19:56.420
end-to-end encryption for Dropbox.

00:19:56.420 --> 00:20:00.000
You could share the files, but it only matters if you actually have the key, right?

00:20:00.000 --> 00:20:00.480
Right.

00:20:00.480 --> 00:20:02.320
Actually, I have no idea.

00:20:02.320 --> 00:20:03.920
Sure.

00:20:03.920 --> 00:20:05.200
I suspect so.

00:20:05.200 --> 00:20:05.420
Yeah.

00:20:05.420 --> 00:20:07.120
It sounds like a cool service, actually.

00:20:07.120 --> 00:20:08.280
It sounds pretty neat.

00:20:08.280 --> 00:20:13.420
So they describe kind of what they're doing and some of the problems.

00:20:13.420 --> 00:20:17.780
It's a large four-year-old asynchronous Python project.

00:20:18.480 --> 00:20:24.820
And then they describe this RAID redundancy algorithm that they need.

00:20:24.820 --> 00:20:31.580
It's fairly complex with a bunch of servers and stuff, a bunch of data stores going on.

00:20:31.680 --> 00:20:40.820
And what they need to test is they need to check things like if the blocks can be split into chunks and if the blocks can be rebuilt from the chunks that were split up before.

00:20:41.060 --> 00:20:44.300
And then if you can rebuild them if you've got missing chunks.

00:20:44.300 --> 00:20:50.740
And so this all sounds fairly, you know, yeah, I can understand how you could try to test that.

00:20:50.740 --> 00:20:52.360
But there's a lot of variables in there.

00:20:52.360 --> 00:20:53.820
How big is the chunk size?

00:20:53.820 --> 00:20:54.900
How many chunks?

00:20:55.260 --> 00:20:56.760
How much stuff should be missing?

00:20:56.760 --> 00:20:58.480
And all that sort of stuff.

00:20:58.480 --> 00:21:04.060
And then they're thinking, yeah, hypothesis would be good for that.

00:21:04.060 --> 00:21:12.320
The normal tutorials talk about a stateless way to test with hypothesis.

00:21:12.320 --> 00:21:21.760
But they're saying that for them, the stateful method that is supported is very useful because they're an asynchronous system.

00:21:21.760 --> 00:21:23.080
And they describe how to do that.

00:21:23.080 --> 00:21:25.780
It's actually a fairly complex description.

00:21:25.780 --> 00:21:28.460
And it's kind of a lot to get through.

00:21:28.460 --> 00:21:30.580
But it's neat that the power's there.

00:21:30.660 --> 00:21:37.620
So it does, you know, walks through how they exactly how they set up a test like this.

00:21:37.620 --> 00:21:43.720
And this is something I think the testing community of considering hypothesis has been missing.

00:21:43.720 --> 00:21:45.060
So this is great.

00:21:45.060 --> 00:21:51.600
They end with some recommendations, which it's great.

00:21:51.600 --> 00:21:57.820
So the recommendation is for parts of your system that which parts should you throw hypothesis at?

00:21:57.820 --> 00:22:00.520
That's a really good question because you don't want to throw it at everything.

00:22:00.520 --> 00:22:01.120
Right.

00:22:01.120 --> 00:22:04.420
Because there is some expense to set it up and also to run everything.

00:22:04.420 --> 00:22:15.540
So they describe it as if the piece you're testing is kind of an encoder decoder thing, like theirs is you're splitting things into chunks and then rebuilding things.

00:22:15.540 --> 00:22:21.020
It's a hypothesis is a no brainer for that because you can compare.

00:22:21.020 --> 00:22:26.400
Is my input the same as the encoded then decoded output?

00:22:26.400 --> 00:22:27.500
Yeah.

00:22:27.500 --> 00:22:35.260
The other case is if you have a simple oracle, like it's simple to test the answer, but it's complex to come up with the answer.

00:22:35.260 --> 00:22:38.080
I'm not sure what that is.

00:22:38.080 --> 00:22:43.240
But in the case, you know, some of the cases are, you know, I've got a complex system.

00:22:43.240 --> 00:22:47.580
And I just there's properties about the output that are easy to describe.

00:22:48.020 --> 00:22:53.180
The other one is, yeah, I guess similar is if it's hard to compute, but easy to check.

00:22:53.180 --> 00:23:01.560
Well, one example that just jumps out at me right away is anytime you have a file format, I'm going to save this thing, be able to save and load these files.

00:23:01.560 --> 00:23:02.120
Right.

00:23:02.180 --> 00:23:06.120
Because all you got to do is load up a whole bunch of random data, say save, load.

00:23:06.120 --> 00:23:06.880
Is it the same?

00:23:06.880 --> 00:23:09.060
If it's not, that's a problem.

00:23:09.060 --> 00:23:09.460
Yeah.

00:23:09.460 --> 00:23:10.040
Yeah.

00:23:10.040 --> 00:23:10.620
Yeah.

00:23:10.620 --> 00:23:21.900
And actually, I have talked with some people that that have thrown this at some of the standard library modules just on the side to test.

00:23:22.360 --> 00:23:29.500
Because there's a lot of standard library stuff that's like kind of encoding, decoding sort of thing or two way conversions.

00:23:29.500 --> 00:23:30.100
Yeah.

00:23:30.100 --> 00:23:30.380
Cool.

00:23:30.380 --> 00:23:30.780
Yeah.

00:23:30.780 --> 00:23:31.800
This is super nice.

00:23:31.800 --> 00:23:34.700
I'm going to have to really dig into this article in more detail.

00:23:34.700 --> 00:23:42.620
I remember the first time I like learned about hypothesis was when one of the core devs gave a talk at PyCypys 2019.

00:23:42.620 --> 00:23:44.780
And it just blew my mind then.

00:23:44.780 --> 00:23:49.280
And so this is so cool to see this like very, very interesting application here.

00:23:49.280 --> 00:23:49.800
Yeah.

00:23:49.800 --> 00:23:50.260
Yeah.

00:23:50.380 --> 00:23:52.500
It seems like there's a lot of uses in data science.

00:23:52.500 --> 00:24:00.340
Data science seems tough to test like that scientific computation side because slight variations, you might not get perfect equality.

00:24:00.340 --> 00:24:01.160
Exactly.

00:24:01.160 --> 00:24:02.160
Close enough.

00:24:02.160 --> 00:24:02.640
Right.

00:24:02.640 --> 00:24:08.140
It's like, well, it's off, but it's like, you know, 10 to the negative 10th or something off.

00:24:08.140 --> 00:24:08.580
Right.

00:24:08.580 --> 00:24:10.780
That doesn't actually matter, but the equality fails.

00:24:10.780 --> 00:24:11.320
Yeah.

00:24:11.320 --> 00:24:11.660
Yeah.

00:24:11.660 --> 00:24:19.060
You end up using NumPy's, you know, NumPy's approximation comparison schemes quite a bit in your.

00:24:19.800 --> 00:24:20.040
Yeah.

00:24:20.040 --> 00:24:20.760
And your pie test.

00:24:20.760 --> 00:24:21.500
I can imagine.

00:24:21.500 --> 00:24:22.840
I can imagine.

00:24:22.840 --> 00:24:23.580
Very cool.

00:24:23.580 --> 00:24:24.400
All right.

00:24:24.400 --> 00:24:25.640
Next one, Brian.

00:24:25.640 --> 00:24:31.380
I told you about last time I talked about I'm still waiting on my Mac mini, right?

00:24:31.380 --> 00:24:31.920
Yes.

00:24:31.920 --> 00:24:35.680
I ordered the Apple, the M1 Mac mini maxed out.

00:24:35.680 --> 00:24:37.060
And I'm a little bit jealous.

00:24:37.060 --> 00:24:40.020
My daughter is getting a new Mac mini.

00:24:40.020 --> 00:24:42.700
She doesn't, or Mac Air.

00:24:42.700 --> 00:24:45.940
She doesn't know what about, but it's supposed to show up tomorrow and mine's still weeks away.

00:24:45.940 --> 00:24:47.120
And I don't think that that's very fair.

00:24:47.480 --> 00:24:53.820
But if you are an organization that depends on cloud computing and, you know, what organizations

00:24:53.820 --> 00:24:55.100
don't these days, right?

00:24:55.100 --> 00:24:56.060
They almost all do.

00:24:56.060 --> 00:25:02.760
It was just announced at reInvent that AWS is going to be offering Mac instances as a type

00:25:02.760 --> 00:25:03.100
of VM.

00:25:03.220 --> 00:25:06.920
So until now you've been able to get Windows, Linux, that's it.

00:25:06.920 --> 00:25:11.900
So for all those people out there who are offering some kind of iOS app, even if they're not like

00:25:11.900 --> 00:25:16.580
a Mac shop, they still have to have Macs around because you can't compile and sign your IPA,

00:25:16.580 --> 00:25:19.700
your Mac, whatever iPhone app format is.

00:25:19.780 --> 00:25:21.800
You can't create those without a Mac.

00:25:21.800 --> 00:25:26.340
So there's all these Macs that are around for like continuous, you know, CI/CD or checking those

00:25:26.340 --> 00:25:27.700
things and whatnot.

00:25:27.700 --> 00:25:32.080
So now you can go to AWS and say, I'll take a Mac mini, please.

00:25:32.080 --> 00:25:32.940
That's pretty cool.

00:25:32.940 --> 00:25:33.460
That's cool.

00:25:33.460 --> 00:25:33.980
Yeah.

00:25:33.980 --> 00:25:36.580
So you can do your tests up there and they don't have M1 yet.

00:25:36.580 --> 00:25:40.000
Those are the Intel ones, but the M1 chips are coming later.

00:25:40.000 --> 00:25:41.020
So you'll be able to do it.

00:25:41.020 --> 00:25:46.480
What's interesting about this offering from AWS as is basically any cloud service, you would

00:25:46.480 --> 00:25:47.720
imagine it's a VM, right?

00:25:47.940 --> 00:25:52.420
But these, when you say I want one of these, you actually get a dedicated Mac mini.

00:25:52.420 --> 00:25:53.900
That's you get pure hardware.

00:25:53.900 --> 00:25:57.160
Well, that's why you can't get yours because Amazon bought them.

00:25:57.160 --> 00:25:58.540
They did.

00:25:58.540 --> 00:26:00.480
They had a huge truck full of them.

00:26:00.480 --> 00:26:01.720
Well, they bought the Intel one.

00:26:01.720 --> 00:26:03.280
So those were on sale, I bet anyway.

00:26:03.280 --> 00:26:09.020
But no, they have some interesting, what do they call it?

00:26:09.020 --> 00:26:09.500
Nitro.

00:26:09.500 --> 00:26:14.140
I think they call it their Nitro service or something like that, which allows them to virtualize

00:26:14.140 --> 00:26:15.460
actual real hardware.

00:26:15.460 --> 00:26:16.980
So this is pretty neat.

00:26:16.980 --> 00:26:17.620
You can sign up.

00:26:17.620 --> 00:26:18.960
The billing is interesting.

00:26:18.960 --> 00:26:24.100
You have to pay for at least one day's worth if you get it, which I think is like $24.

00:26:24.100 --> 00:26:29.060
If you're going to run it continuously all the time, this is one pricey sucker.

00:26:29.060 --> 00:26:33.220
Like the Mac mini you can get now is $700.

00:26:33.220 --> 00:26:36.220
This is $770 a month.

00:26:36.720 --> 00:26:37.640
Oh, okay.

00:26:37.640 --> 00:26:42.580
So if what you need is like a couple of Mac minis, you're probably, and you need them

00:26:42.580 --> 00:26:43.420
on all the time.

00:26:43.420 --> 00:26:47.340
You're probably better off just buying a few and sticking them in a closet, especially the

00:26:47.340 --> 00:26:48.000
M1s.

00:26:48.000 --> 00:26:51.600
But if you just need one on demand every now and then, or you need to burst into them or

00:26:51.600 --> 00:26:52.860
something like that, that could be interesting.

00:26:52.860 --> 00:26:53.280
Yeah.

00:26:53.280 --> 00:26:53.720
Yeah.

00:26:53.720 --> 00:26:56.780
If you're back old school and you only release like once every three months.

00:26:56.780 --> 00:27:03.700
Well, there was some conversations like, well, if your data is already stored in S3 and you

00:27:03.700 --> 00:27:08.080
have like huge quantity of data and what you need to run is actually running like some video

00:27:08.080 --> 00:27:12.040
processing on the Mac, you could do it by the data instead of transferring that kind of stuff.

00:27:12.040 --> 00:27:13.800
Things like that might be interesting.

00:27:13.800 --> 00:27:14.760
I don't know.

00:27:14.760 --> 00:27:18.720
I would go ahead and throw out there also that this is all interesting.

00:27:18.720 --> 00:27:23.440
I have links to this kind of stuff and whatnot, like the blog post announcing it and so on.

00:27:23.440 --> 00:27:26.460
But there's also this thing called Mac Stadium.

00:27:26.460 --> 00:27:28.740
And if you look at Mac Stadium, it's pretty interesting.

00:27:28.740 --> 00:27:33.900
You go over there and say, give me a dedicated bare mini, a bare metal Mac mini in their data

00:27:33.900 --> 00:27:35.400
center, $60 a month.

00:27:35.400 --> 00:27:41.520
So you can actually get like a decent one for a decent price over there.

00:27:41.520 --> 00:27:43.980
So if you just want one running all the time, it might be good.

00:27:43.980 --> 00:27:48.360
But the thing is, if you're already like deeply integrated to AWS, maybe this is a good thing.

00:27:48.360 --> 00:27:48.780
Yeah.

00:27:48.780 --> 00:27:49.240
Yeah.

00:27:49.240 --> 00:27:51.480
Is there anything you, yeah, go ahead.

00:27:51.480 --> 00:27:53.220
I was just going to say, this seems pretty interesting.

00:27:53.220 --> 00:27:58.380
I mean, I know one of the reasons that I love using GitHub Actions and Azure Pipelines

00:27:58.380 --> 00:28:04.240
is the ability to be able to get access to Mac VMs for builds.

00:28:04.240 --> 00:28:08.520
But if you, I could also see this being really interesting and useful if you have like some

00:28:08.520 --> 00:28:13.700
very huge application or some like very large stack that you want to be able to be able

00:28:13.700 --> 00:28:18.360
to do CI or tests on, that this could be really, really nice.

00:28:18.360 --> 00:28:23.380
Especially if you don't just want to be like, you know, pounding and destroying like one Mac

00:28:23.380 --> 00:28:24.520
over and over and over again.

00:28:25.180 --> 00:28:25.320
Yeah.

00:28:25.320 --> 00:28:25.720
Yeah.

00:28:25.720 --> 00:28:26.440
This is nice.

00:28:26.440 --> 00:28:28.040
Especially if you have a distributed team.

00:28:28.040 --> 00:28:29.380
Yeah.

00:28:29.380 --> 00:28:32.200
Which every team is basically a distributed team.

00:28:32.200 --> 00:28:32.400
Yeah.

00:28:32.400 --> 00:28:32.680
Yeah.

00:28:32.680 --> 00:28:33.520
Welcome to 2020.

00:28:33.520 --> 00:28:37.780
One thing that's interesting about this is you can literally press a button or even just

00:28:37.780 --> 00:28:40.020
through the AWS, probably the Bodo API.

00:28:40.660 --> 00:28:42.920
You can just make a new Mac instantly.

00:28:42.920 --> 00:28:46.380
Like within seconds, you can have a clean, pre-configured Mac.

00:28:46.380 --> 00:28:52.580
You can create AMIs, the Amazon machine image, which are like, install a bunch of stuff and

00:28:52.580 --> 00:28:56.580
get it set up and then like save it so I can respawn new machines from it.

00:28:56.580 --> 00:28:59.900
Those are pretty interesting options that just having a Mac mini in the closet.

00:28:59.900 --> 00:29:03.340
You know, push a button, make a brand new one, try this, throw it away, make it a different

00:29:03.340 --> 00:29:04.160
way, throw it away.

00:29:04.160 --> 00:29:06.720
Like there are some use cases here that could be interesting.

00:29:06.720 --> 00:29:08.380
That said, I won't be using it.

00:29:10.000 --> 00:29:12.020
I'm just going to buy a Mac mini if I can ever get it.

00:29:12.020 --> 00:29:14.040
All right, Matthew, what's this last one you got for us?

00:29:14.040 --> 00:29:17.700
Yeah, I don't have any clever transition, but all right.

00:29:17.700 --> 00:29:24.520
So maybe, I don't know about you, but I end up having to deal with a lot of JSON serializations

00:29:24.520 --> 00:29:29.260
of different statistical models and different, and, you know, sometimes also getting, you know,

00:29:29.260 --> 00:29:33.280
CSVs of different data sets that I want to be doing analysis on.

00:29:33.280 --> 00:29:38.020
And, you know, your first instinct might just be to say, okay, I'm just going to open

00:29:38.020 --> 00:29:41.180
this up in Pandas and start to get to work on it.

00:29:41.180 --> 00:29:47.060
But if you kind of are used and comfortable to working in the Linux command line kind of

00:29:47.060 --> 00:29:51.500
ecosystem of data tools, you might be itching a little bit and want to kind of just, you

00:29:51.500 --> 00:29:54.840
know, peek inside at the command line level and kind of get to work there.

00:29:54.840 --> 00:29:59.960
And so in that case, you might be really interested in this tool called VisiData.

00:29:59.960 --> 00:30:01.940
So VisiData is written on this.

00:30:01.940 --> 00:30:03.740
This is blowing my mind, actually.

00:30:03.940 --> 00:30:07.300
Like, when I saw this, my jaw was kind of on the floor.

00:30:07.300 --> 00:30:12.260
So we'll make sure that this is linked in the show notes because it has some really cool

00:30:12.260 --> 00:30:12.740
videos.

00:30:12.740 --> 00:30:18.540
But so from the docs, so it's VisiData is described as data science without the drudgery.

00:30:18.820 --> 00:30:22.040
So it's an interactive multi-tool for tabular data.

00:30:22.040 --> 00:30:27.460
It combines clarity of spreadsheets with efficiencies of being at the terminal and also, you know,

00:30:27.460 --> 00:30:33.360
the power of Python 3 on a really lightweight utility that can handle millions of rows with

00:30:33.360 --> 00:30:33.700
ease.

00:30:33.700 --> 00:30:35.180
I can attest to that personally.

00:30:35.360 --> 00:30:40.260
I've opened up to like four gigabyte CSV files before and it just, you know, drops

00:30:40.260 --> 00:30:43.020
right in and starts asynchronously loading like a champ.

00:30:43.020 --> 00:30:47.540
It's in addition to that, it supports kind of a really astounding number of file formats

00:30:47.540 --> 00:30:48.280
that it supports.

00:30:48.280 --> 00:30:52.540
Currently on the website, it says it supports 42 different file formats.

00:30:52.540 --> 00:30:58.040
So it, you know, supports things that you would expect like CSV and JSON, but then it also

00:30:58.040 --> 00:30:59.720
supports things like JIRA.

00:30:59.720 --> 00:31:05.040
I guess like whatever JIRA uses for their sort of like tabular stuff.

00:31:05.040 --> 00:31:07.320
It also can like read my, my SQL.

00:31:07.320 --> 00:31:13.220
And I guess it can also even deal with PNG, the image file format, which I was, you know,

00:31:13.220 --> 00:31:13.880
impressed by.

00:31:13.880 --> 00:31:15.720
So this is all openly developed.

00:31:15.720 --> 00:31:17.580
The output is a terminal, right?

00:31:17.580 --> 00:31:17.920
Yeah.

00:31:17.920 --> 00:31:19.640
Not a thing like text.

00:31:19.640 --> 00:31:20.540
Yeah.

00:31:21.540 --> 00:31:22.020
Yeah.

00:31:22.020 --> 00:31:27.560
So this is all openly developed on GitHub by a guy named Saul Pawson, I think.

00:31:27.560 --> 00:31:36.240
And if you go to the, if you go to the Visadata website, it also has plenty of links to live

00:31:36.240 --> 00:31:40.000
demos of him doing kind of interactive examples of visualizations.

00:31:40.000 --> 00:31:45.900
There's one lightning talk that he's given at, I think, PyCascades 2018 or something like

00:31:45.900 --> 00:31:51.520
that, where he's able to just call up a CSV file of, of like, 311 components.

00:31:51.520 --> 00:31:58.380
And then through the, through using Visadata, just kind of hone down onto certain boroughs

00:31:58.380 --> 00:32:05.000
and then be able to do a filter on, on different complaint types to be able to basically find

00:32:05.000 --> 00:32:10.720
complaints about rodents and then filter on rat complaints and then plot that inside of Visadata

00:32:10.720 --> 00:32:17.040
still on the terminal to basically make a visualization of like rodent distribution in the New York City

00:32:17.040 --> 00:32:17.460
boroughs.

00:32:17.560 --> 00:32:20.600
So I thought that was, you know, quite amusing and really cool.

00:32:20.600 --> 00:32:24.540
It's also, you know, this is a Python application.

00:32:24.540 --> 00:32:30.300
So you might not want to, you know, continuously install this in every single virtual environment you make.

00:32:30.920 --> 00:32:34.580
So, I mean, it is up on PyPI, so you can just do pip install Visadata.

00:32:34.580 --> 00:32:40.340
But since it's an application, you probably might also want it just kind of as a generic tool on your machine.

00:32:40.340 --> 00:32:45.600
So it's distributed through a lot of, you know, nice common package managers.

00:32:45.600 --> 00:32:52.040
So if you're on Linux, they've got it on apt, as well as things like NX and GUX.

00:32:52.440 --> 00:32:54.160
But I didn't see it on Yum.

00:32:54.160 --> 00:32:57.620
So if you're on Fedora or CentOS, you might be a little bit out of luck.

00:32:57.620 --> 00:32:58.460
You might have to do it manually.

00:32:58.460 --> 00:33:02.040
It's, of course, on Homebrew and even Condo Forge.

00:33:02.040 --> 00:33:08.060
And it's not listed there, but a very, very cool tool that's been featured on the show before,

00:33:08.060 --> 00:33:10.340
which is PipX by Chad Smith.

00:33:10.340 --> 00:33:11.060
Yeah, PipX is awesome.

00:33:11.060 --> 00:33:11.820
It's so good.

00:33:11.820 --> 00:33:12.460
I love it.

00:33:12.460 --> 00:33:14.160
I tested this last night.

00:33:14.160 --> 00:33:21.100
I just fired up a Python 3.8 Docker container and, you know, went ahead and installed PipX

00:33:21.100 --> 00:33:25.420
and then used PipX to install Vizidata and was able to drop right into Vizidata as expected.

00:33:25.420 --> 00:33:28.040
So it's very, very cool.

00:33:28.040 --> 00:33:33.680
And just the power that you can have with it, I think, is worth checking out for anybody who

00:33:33.680 --> 00:33:36.040
is doing data analysis with tabular data.

00:33:36.040 --> 00:33:37.240
This is super cool.

00:33:37.240 --> 00:33:41.240
I love when people build these tools that are kind of, you don't really expect them to be

00:33:41.240 --> 00:33:41.720
so powerful.

00:33:41.720 --> 00:33:44.920
And you talked about how you just dropped in and grabbed some random data and started answering

00:33:44.920 --> 00:33:45.480
questions.

00:33:45.480 --> 00:33:46.700
And that's super neat.

00:33:46.700 --> 00:33:47.120
Yeah.

00:33:47.120 --> 00:33:47.620
Yeah.

00:33:47.620 --> 00:33:48.720
The number of inputs.

00:33:48.940 --> 00:33:54.560
And because it's open source and because of all the other examples of data types, I

00:33:54.560 --> 00:33:59.840
think even if you have a different data type, it shouldn't be too hard to modify this to

00:33:59.840 --> 00:34:01.060
handle something different.

00:34:01.060 --> 00:34:03.040
I do notice I'm excited about it.

00:34:03.040 --> 00:34:05.580
It does have PCAP files for packet capture.

00:34:05.580 --> 00:34:08.800
These are for communication packets.

00:34:08.800 --> 00:34:12.460
Talking to all your devices and all your hardware at your company, right?

00:34:12.840 --> 00:34:16.320
Well, this is like even Wi-Fi packets and cellular packets.

00:34:16.320 --> 00:34:17.980
That's how we debug those.

00:34:17.980 --> 00:34:18.980
So nice.

00:34:18.980 --> 00:34:20.000
It's very cool.

00:34:20.000 --> 00:34:20.760
Yeah.

00:34:20.760 --> 00:34:21.200
Very cool.

00:34:21.200 --> 00:34:22.240
And PipX is great.

00:34:22.240 --> 00:34:28.060
I install a bunch of apps like Glances, which is a fantastic, like visualize the state, you

00:34:28.060 --> 00:34:29.420
know, like top, but way, way better.

00:34:29.420 --> 00:34:34.140
The ACPy, which is great for it's a better, but much, much better curl.

00:34:34.320 --> 00:34:38.660
But the most important thing I install that way is a Py joke.

00:34:38.660 --> 00:34:42.600
So now I can type Py joke on my command line and we're always right there.

00:34:42.600 --> 00:34:47.360
So speaking of which, move on to our extras.

00:34:47.360 --> 00:34:48.860
That's all of our main topics.

00:34:48.860 --> 00:34:50.200
Brian, you got anything this week?

00:34:50.200 --> 00:34:51.220
Oh, I did.

00:34:51.220 --> 00:34:52.780
I haven't dropped them in.

00:34:52.780 --> 00:34:53.860
Where'd my extras go?

00:34:53.860 --> 00:34:56.160
Yeah, well, you got it.

00:34:56.160 --> 00:35:03.540
I just wanted to bring up that the PyCon 2021 is going to be virtual and there's a website

00:35:03.540 --> 00:35:04.000
up.

00:35:04.000 --> 00:35:07.060
It's us.pycon.org slash 2021.

00:35:07.060 --> 00:35:12.440
And there's not a lot there yet, but you can check out what's going to happen.

00:35:12.440 --> 00:35:19.620
It's not surprising that they have to start planning it and they may as well plan it as a virtual

00:35:19.620 --> 00:35:20.020
event.

00:35:20.720 --> 00:35:23.940
I'm just kind of hoping that we would have live, but I understand.

00:35:23.940 --> 00:35:24.820
Yeah.

00:35:24.820 --> 00:35:27.360
I mean, Hycon is my geek holiday.

00:35:27.360 --> 00:35:28.360
I love it.

00:35:28.360 --> 00:35:32.860
It's both work, but it's also just such a nice getaway to connect with everybody.

00:35:32.860 --> 00:35:38.340
You, everyone else we know from the community, listeners, I'm going to miss not having it.

00:35:38.340 --> 00:35:38.800
Yeah.

00:35:38.800 --> 00:35:39.300
I'm glad.

00:35:39.300 --> 00:35:40.060
Do you attend?

00:35:40.060 --> 00:35:40.800
Sorry, Brian.

00:35:40.800 --> 00:35:45.660
No, it's good that they, I always check whenever they announce the date to make sure it doesn't

00:35:45.660 --> 00:35:46.720
overlap Mother's Day.

00:35:46.720 --> 00:35:48.780
And it does not.

00:35:48.780 --> 00:35:49.860
That's not good.

00:35:50.660 --> 00:35:50.840
Yeah.

00:35:50.840 --> 00:36:00.120
So I have unfortunately not attended PyCon yet in person or, I mean, it was canceled this

00:36:00.120 --> 00:36:00.320
year.

00:36:00.320 --> 00:36:06.500
So maybe, maybe I'll attend this year remote, but I'm a regular attendee of the SciPy conference,

00:36:06.500 --> 00:36:11.720
which this, so this past year, SciPy 2020 was moved online.

00:36:11.720 --> 00:36:16.680
And I thought that the organizers did a fantastic job of actually writing it online while still,

00:36:16.680 --> 00:36:19.000
you know, keeping kind of that SciPy community feel.

00:36:19.000 --> 00:36:23.080
So that was helped a lot also by, you know, plenty of bad puns.

00:36:23.080 --> 00:36:28.840
So I think that might, might be something that still comes through for PyCon 2021, maybe.

00:36:28.840 --> 00:36:30.060
Yeah, absolutely.

00:36:30.060 --> 00:36:36.780
One of the live listeners, Mohammed said, ask if it's going to cost money or if it's going to

00:36:36.780 --> 00:36:38.400
be free this year to attend.

00:36:38.400 --> 00:36:40.080
Did you notice anything, Brian?

00:36:40.080 --> 00:36:41.680
I haven't looked.

00:36:41.680 --> 00:36:45.780
I'm looking around and I don't know that it costs anything.

00:36:45.780 --> 00:36:46.920
It's from what I can tell.

00:36:46.920 --> 00:36:48.000
I don't see any pricing.

00:36:48.000 --> 00:36:53.920
What I saw was sponsor information to get sponsors to sign up to be part of whatever they're doing

00:36:53.920 --> 00:36:54.140
there.

00:36:54.140 --> 00:36:55.480
but I can't tell.

00:36:55.480 --> 00:36:56.280
Yeah, not sure.

00:36:56.280 --> 00:37:01.360
Somebody else throw in the chat or put it into the, you know, visit pythonbytes.fm/211

00:37:01.360 --> 00:37:02.560
and put it in the comments down there.

00:37:02.560 --> 00:37:03.040
All right.

00:37:03.040 --> 00:37:04.460
I got a couple here.

00:37:04.460 --> 00:37:08.560
First of all, we're trying out live streaming here and I think it's going pretty well.

00:37:08.560 --> 00:37:10.460
Seems like it's working out.

00:37:10.460 --> 00:37:11.460
There's a bunch of people watching.

00:37:11.460 --> 00:37:17.420
So if you want to get notified and we happen to keep doing this, just visit pythonbytes.fm

00:37:17.420 --> 00:37:21.160
slash YouTube and it should have like the scheduled upcoming live stream.

00:37:21.160 --> 00:37:22.400
You can like get notified there.

00:37:22.400 --> 00:37:23.920
So we'll, maybe we'll keep doing this.

00:37:23.920 --> 00:37:24.480
It's been fun.

00:37:24.480 --> 00:37:26.720
Thanks for everyone out there who's watching right now.

00:37:26.720 --> 00:37:33.440
And in addition to PyCon, which you just announced or mentioned the announcement of, that is the

00:37:33.440 --> 00:37:40.020
main way that the PSF is funded, but they're also doing a dedicated offering sort of fundraiser

00:37:40.020 --> 00:37:46.620
thing with six companies to help raise some money for the PSF and Talk Python training is

00:37:46.620 --> 00:37:47.240
being part of that.

00:37:47.240 --> 00:37:53.440
And 50% of the revenue of a certain set of our courses that are sold during the month of

00:37:53.440 --> 00:37:55.680
December goes directly to the PSF.

00:37:55.680 --> 00:38:00.940
And people who buy those courses through the PSF fundraiser also get like 20% of a discount.

00:38:00.940 --> 00:38:06.360
So there's a link in the show notes for people to take some of our courses and donate to the

00:38:06.360 --> 00:38:06.740
PSF.

00:38:06.740 --> 00:38:08.800
If you'd rather just directly donate, that's fine.

00:38:08.880 --> 00:38:12.920
But if you're looking to get some of our courses anyway, you can do it this way and support the PSF.

00:38:12.920 --> 00:38:14.320
They're hoping to raise $60,000.

00:38:14.320 --> 00:38:17.320
You know, hopefully we can do that for them and we'll see.

00:38:17.800 --> 00:38:20.060
Brian, you announced Big PyCon.

00:38:20.060 --> 00:38:24.840
Another thing that got announced is Small PyCon, PyCascades.

00:38:25.300 --> 00:38:28.800
PyCascades being the mountain range that connects Portland, Seattle, and Vancouver.

00:38:28.800 --> 00:38:32.080
And traditionally, this conference is cycled between those three cities.

00:38:32.080 --> 00:38:34.920
I don't even remember anymore what it's supposed to be this year.

00:38:34.920 --> 00:38:38.780
I think it's supposed to go back to Vancouver, but it's not going to Vancouver because nobody's

00:38:38.780 --> 00:38:39.300
going anywhere.

00:38:39.300 --> 00:38:41.740
So PyCascades is online.

00:38:42.020 --> 00:38:42.940
And those do cost money.

00:38:42.940 --> 00:38:48.020
It's $10 for students, $20 for individuals, and $50 for professionals to support that conference.

00:38:48.020 --> 00:38:52.140
But I'll link to that one since that's one of our local conferences, if you will.

00:38:52.140 --> 00:38:53.200
Yeah, they're trying to push.

00:38:53.200 --> 00:38:57.240
They often push what's going on, try new things.

00:38:57.240 --> 00:38:58.680
So it's a neat conference.

00:38:58.680 --> 00:38:59.280
Yeah.

00:38:59.280 --> 00:38:59.600
Yeah.

00:38:59.600 --> 00:39:00.640
I enjoy my time there as well.

00:39:00.640 --> 00:39:02.220
All right, Matthew, what are you got for us?

00:39:02.220 --> 00:39:03.800
Anything else you want to get a shout out to?

00:39:03.800 --> 00:39:05.720
Yeah, just a few items.

00:39:05.720 --> 00:39:09.520
So Advent of Code 2020 is started now.

00:39:09.520 --> 00:39:13.380
It's day two, but there's still plenty of time to get involved with that if you want to.

00:39:13.380 --> 00:39:19.700
And for those of you who might not know, Advent of Code is just an annual coding challenge that

00:39:19.700 --> 00:39:21.020
takes place every December.

00:39:21.020 --> 00:39:26.400
And it's just basically 25 days of fun and interesting programming challenges.

00:39:26.400 --> 00:39:31.900
So it's always a great opportunity to try and brush up on your Python and maybe learn about

00:39:31.900 --> 00:39:37.420
some interesting collections that you might not have known about in the standard library.

00:39:38.200 --> 00:39:39.840
So that's going on right now.

00:39:39.840 --> 00:39:41.000
Worth checking out, I think.

00:39:41.000 --> 00:39:48.420
And then I'm going to sneak in some very small physics-related follow-up to Python Bytes

00:39:48.420 --> 00:39:52.680
episode 205, in which awkward arrays were talked about.

00:39:52.680 --> 00:39:59.440
So the lead developer of awkward arrays is my friend and colleague, Jim Povarsky, who is one

00:39:59.440 --> 00:40:04.700
of my scikit-hep co-collaborators, as well as also a member of iris-hep.

00:40:04.700 --> 00:40:13.320
And as of today, which is recording December 2nd, awkward v1.0 is a release can that is up on PyPI.

00:40:13.320 --> 00:40:20.080
So by the time that this goes live, if you just do pip install awkward, you should get awkward 1.0 releases

00:40:20.080 --> 00:40:21.740
instead of having to do the...

00:40:21.740 --> 00:40:22.500
No more awkward 1.

00:40:22.620 --> 00:40:22.980
Exactly.

00:40:22.980 --> 00:40:24.360
No more awkward 1.0.

00:40:24.360 --> 00:40:25.000
No more awkward 0.0.

00:40:25.000 --> 00:40:25.820
All that jazz.

00:40:25.820 --> 00:40:28.980
It's so good to have the actual install statement be awkward itself.

00:40:28.980 --> 00:40:29.560
Exactly.

00:40:29.560 --> 00:40:32.060
So that's a nice little tidbit.

00:40:32.060 --> 00:40:38.060
And I think there's some nice links in episode 205 if people want to learn more about awkward.

00:40:38.480 --> 00:40:43.660
But that's kind of a backbone of kind of the Pythonic ecosystem for physics right now.

00:40:43.660 --> 00:40:49.980
And then finally, I just want to give some kudos to Python Bytes as well, specifically for making

00:40:49.980 --> 00:40:54.360
full transcripts of the shows available to view on pythonbytes.fm.

00:40:54.360 --> 00:40:58.960
Not only is this, I think, like a cool idea in general, but I think this also makes the show

00:40:58.960 --> 00:41:03.120
more inclusive to the deaf Python community, which is definitely out there.

00:41:03.120 --> 00:41:09.880
And one of my good friends and co-authors is deaf, and I know that he definitely appreciates

00:41:09.880 --> 00:41:10.140
this.

00:41:10.140 --> 00:41:14.460
So good job, Ben, you guys for being more inclusive of the wider community.

00:41:14.460 --> 00:41:15.500
Oh, that's so cool.

00:41:15.500 --> 00:41:17.360
I didn't know anybody was utilizing it.

00:41:17.360 --> 00:41:18.520
Yeah, that's awesome.

00:41:18.520 --> 00:41:19.240
Thank you.

00:41:19.240 --> 00:41:24.200
I think it's absolutely critical for that because the format is only audio.

00:41:24.200 --> 00:41:28.240
But a lot of folks have reached out and said they also appreciate it if they're English as

00:41:28.240 --> 00:41:31.900
a second language and they're not as good with English as well.

00:41:31.900 --> 00:41:33.880
So that also helps, I think.

00:41:33.880 --> 00:41:35.800
They're like, what was I saying again?

00:41:35.800 --> 00:41:36.620
What a weird word.

00:41:36.620 --> 00:41:37.860
Awkward array?

00:41:37.860 --> 00:41:38.860
Why would they talk about that?

00:41:38.860 --> 00:41:40.240
It doesn't make sense.

00:41:40.240 --> 00:41:44.540
Yeah, transcripts and closed captioning is just more inclusive for everyone.

00:41:44.540 --> 00:41:45.740
So that's awesome.

00:41:45.740 --> 00:41:46.680
Yeah, thanks.

00:41:46.680 --> 00:41:47.660
All right.

00:41:47.660 --> 00:41:51.100
Well, let's wrap it up with a joke, Brian.

00:41:51.100 --> 00:41:51.760
Yeah.

00:41:51.760 --> 00:41:52.300
All right.

00:41:52.300 --> 00:41:54.560
So you guys, I'm going to need your help here.

00:41:54.560 --> 00:41:57.320
I'm going to let Matthew, I'm going to let you pick.

00:41:57.320 --> 00:41:58.780
Do you want to be Windows or Apple?

00:41:58.780 --> 00:42:00.220
I'll be Windows.

00:42:00.220 --> 00:42:01.980
All right, Brian, you'd be Apple.

00:42:01.980 --> 00:42:07.880
So the idea is like the title here is how to fix a computer, any computer.

00:42:07.880 --> 00:42:10.200
So instructions for Windows.

00:42:10.200 --> 00:42:10.900
Go ahead, Matthew.

00:42:10.900 --> 00:42:12.660
So step one, reboot.

00:42:12.660 --> 00:42:15.320
And then the flowchart goes to, did that fix it?

00:42:15.320 --> 00:42:17.060
If no, proceed to step two.

00:42:17.060 --> 00:42:20.880
Step two, format your hard drive and then reinstall Windows.

00:42:20.880 --> 00:42:23.420
Lose all of your files and quietly leap.

00:42:23.420 --> 00:42:26.360
Brian, Apple doesn't have that problem.

00:42:26.360 --> 00:42:28.120
There's some totally different solution there.

00:42:28.360 --> 00:42:28.760
Okay.

00:42:28.760 --> 00:42:30.260
For Apple, it's step one.

00:42:30.260 --> 00:42:31.400
Take it to an Apple store.

00:42:31.400 --> 00:42:32.560
Did that fix it?

00:42:32.560 --> 00:42:34.300
If no, proceed to step two.

00:42:34.300 --> 00:42:36.240
Step two is buy a new Mac.

00:42:36.240 --> 00:42:39.220
Overdraw your account and quietly weep.

00:42:39.220 --> 00:42:41.540
That's me right now.

00:42:41.540 --> 00:42:41.840
All right.

00:42:41.840 --> 00:42:43.000
I got the Linux fix.

00:42:43.000 --> 00:42:43.520
It's so easy.

00:42:43.520 --> 00:42:45.380
It's totally like you don't need those things.

00:42:45.780 --> 00:42:48.140
So you learn to code in C++.

00:42:48.140 --> 00:42:49.740
You recompile the kernel.

00:42:49.740 --> 00:42:53.360
You build your own microprocessor out of spare silicon you have laying around.

00:42:53.360 --> 00:42:55.180
You recompile the kernel again.

00:42:55.180 --> 00:42:56.180
You switch distros.

00:42:56.180 --> 00:43:02.380
You recompile the kernel again, but this time using a CPU powered by the reflected light from

00:43:02.380 --> 00:43:02.800
Saturn.

00:43:02.800 --> 00:43:04.360
You grow a giant beard.

00:43:04.360 --> 00:43:06.120
You blame Sun Microsystems.

00:43:06.300 --> 00:43:10.160
You turn your bedroom into a server closet and spend 10 years falling asleep to the sound

00:43:10.160 --> 00:43:10.840
of wearing fans.

00:43:10.840 --> 00:43:11.960
You switch distros again.

00:43:11.960 --> 00:43:13.280
You abandon all hygiene.

00:43:13.280 --> 00:43:17.740
You write a regular expression that would make any other programmers cry blood.

00:43:17.740 --> 00:43:19.120
You learn to code in Java.

00:43:19.120 --> 00:43:22.080
You recompile again, but this time while wearing your lucky socks.

00:43:22.080 --> 00:43:22.960
Did that fix it?

00:43:22.960 --> 00:43:23.600
No.

00:43:23.600 --> 00:43:24.620
Proceed to step two.

00:43:24.620 --> 00:43:26.660
Revert back to using Windows and Mac.

00:43:26.660 --> 00:43:27.640
Or Mac.

00:43:27.640 --> 00:43:28.520
Quietly weep.

00:43:30.080 --> 00:43:31.540
There's really no good outcome here.

00:43:31.540 --> 00:43:33.380
They all in and quietly weep.

00:43:33.380 --> 00:43:38.780
As a Linux user for the better part of a decade, I can neither confirm nor deny how accurate

00:43:38.780 --> 00:43:39.680
that last part is.

00:43:39.680 --> 00:43:44.440
Yeah, they all have their own special angle.

00:43:44.440 --> 00:43:49.320
It just takes longer to get there with Linux to get to your destination, I guess.

00:43:49.320 --> 00:43:49.860
Yeah.

00:43:49.860 --> 00:43:50.440
All right.

00:43:50.440 --> 00:43:51.920
Well, that's fun as always.

00:43:51.920 --> 00:43:54.940
And everyone watching on YouTube, thanks for being here live and everyone listening.

00:43:54.940 --> 00:43:55.940
Just thank you for listening.

00:43:55.940 --> 00:43:57.380
Matthew, thanks for joining us.

00:43:57.380 --> 00:43:58.820
Hey, thanks so much for having me.

00:43:58.820 --> 00:43:59.780
This was really fun.

00:43:59.780 --> 00:44:00.500
Yeah, yeah.

00:44:00.500 --> 00:44:01.880
Great for the items you brought.

00:44:01.880 --> 00:44:02.680
Enjoyed them.

00:44:02.680 --> 00:44:04.460
And Brian, thanks as always, man.

00:44:04.460 --> 00:44:05.120
Thank you.

00:44:05.120 --> 00:44:05.720
It's been fun.

00:44:05.720 --> 00:44:06.240
Yep.

00:44:06.240 --> 00:44:06.760
See ya.

00:44:06.760 --> 00:44:07.160
Bye.

00:44:07.160 --> 00:44:09.180
Thank you for listening to Python Bytes.

00:44:09.180 --> 00:44:11.740
Follow the show on Twitter via at Python Bytes.

00:44:11.740 --> 00:44:14.620
That's Python Bytes as in B-Y-T-E-S.

00:44:14.620 --> 00:44:17.960
And get the full show notes at pythonbytes.fm.

00:44:17.960 --> 00:44:22.220
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:44:22.220 --> 00:44:24.920
We're always on the lookout for sharing something cool.

00:44:24.920 --> 00:44:28.100
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:44:28.180 --> 00:44:31.540
Thank you for listening and sharing this podcast with your friends and colleagues.

