WEBVTT

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

00:00:04.900 --> 00:00:11.720
your earbuds. This is episode 127, recorded April 24th, 2019. I'm Michael Kennedy.

00:00:11.720 --> 00:00:12.600
And I'm Brian Okken.

00:00:12.600 --> 00:00:17.140
And we have a special guest this week as well, Kenneth Reitz. Welcome to the show, man.

00:00:17.140 --> 00:00:18.240
Hi, thanks for having me.

00:00:18.240 --> 00:00:23.380
It's great to have you here. I wonder if requests will come up as a topic during the show. What do

00:00:23.380 --> 00:00:23.680
you think?

00:00:23.680 --> 00:00:25.360
Request three might.

00:00:25.360 --> 00:00:29.980
The future of requests. How exciting. Awesome. Well, thanks for being here. It's great to have

00:00:29.980 --> 00:00:33.800
you here. Before we get any further, I want to say thank you to Datadog for sponsoring this show.

00:00:33.800 --> 00:00:39.440
Check them out at pythonbytes.fm/Datadog. More on why they're cool later. Brian, I feel like

00:00:39.440 --> 00:00:44.180
WebAssembly, Rust, all these things are just, there's so many cool things going on around it.

00:00:44.180 --> 00:00:47.380
And that's something you found for us to start off with, right?

00:00:47.380 --> 00:00:52.700
Yeah, I saw this from a cool, actually a Twitter post from Mara Boss. I think it's Boss, B-O-S.

00:00:52.700 --> 00:00:59.960
And it's an extension to Rust that's an inline Python. So if you're a Rust person and you need a

00:00:59.960 --> 00:01:05.580
Python in there, you can just inline it as a, I think it's as a macro or something. I'm not a Rust

00:01:05.580 --> 00:01:11.400
person, so I'm not sure how this works. But you can inline Python code, including things like

00:01:11.400 --> 00:01:18.040
embedding a map potlib call to pop up a window. So it's pretty neat. I don't really have much more

00:01:18.040 --> 00:01:21.180
to say about it other than neat. You can run Python within Rust.

00:01:21.180 --> 00:01:23.380
I think that's pretty awesome. Yeah, quite cool.

00:01:23.380 --> 00:01:28.860
I wrote something like this week, actually, for Bash in Python. So you can do inline Bash in Python.

00:01:28.860 --> 00:01:32.740
So it seems to be a trend. People want to embed other languages in other languages.

00:01:32.740 --> 00:01:36.080
That's cool. Can people get to your Bash thing? Is that a public thing?

00:01:36.080 --> 00:01:38.540
Yeah, it's just import Bash or pip install Bash.

00:01:38.740 --> 00:01:43.400
That's pretty cool. There's a lot of interesting interplays here. Brian, have I talked about

00:01:43.400 --> 00:01:48.900
WASMR, as in WebAssembly-mer, before on the show?

00:01:48.900 --> 00:01:49.520
I'm not sure.

00:01:49.520 --> 00:01:53.300
I think that's going to have to be a topic. So there's all sorts of cool interplays between

00:01:53.300 --> 00:01:58.120
Rust and Python these days. And like Rust, obviously, is big for generating WebAssembly.

00:01:58.360 --> 00:02:03.480
So there's now a project called WASMR, which lets you... I think I talked about it last week.

00:02:03.480 --> 00:02:08.220
I did, yeah. So lets you basically run WebAssembly in Python. And this is kind of like

00:02:08.220 --> 00:02:09.160
the opposite.

00:02:09.160 --> 00:02:09.700
Oh, really?

00:02:09.700 --> 00:02:14.580
It's an interesting way. Yeah, yeah. So kind of like Node.js is the platform for running JavaScript

00:02:14.580 --> 00:02:19.480
outside of the browser. Like WASMR kind of does similar stuff. It lets you take any WebAssembly

00:02:19.480 --> 00:02:22.980
thing and run it in your Python code. You basically import the functions from it,

00:02:22.980 --> 00:02:24.180
and then you call them in straight Python.

00:02:24.180 --> 00:02:29.840
So do you have to do reflecting, where you know what the structure of the code looks like

00:02:29.840 --> 00:02:30.620
when you import it?

00:02:30.620 --> 00:02:35.540
I don't know. I doubt it gives you any help. But the way you interact with it looks like

00:02:35.540 --> 00:02:38.480
Python. You don't have to do anything special beyond an import statement.

00:02:38.480 --> 00:02:40.340
Okay, so you don't have to write C or anything?

00:02:40.340 --> 00:02:43.460
Like a load statement. No, nothing like that. It's pretty much straight Python.

00:02:43.460 --> 00:02:48.440
This is really cool, Brian. Yeah, I like this. Very nice find. Cool. All right, Kenneth,

00:02:48.440 --> 00:02:51.920
what's your next one? You want to tell us about the future with your back from the past

00:02:51.920 --> 00:02:57.080
microphone? Yeah, sure. I wanted to announce that request three is underway right now. We're doing

00:02:57.080 --> 00:03:01.820
a development cycle at the moment. And I wanted to announce just some information about that,

00:03:01.820 --> 00:03:07.520
basically. So request two, which is the thing that you know and love, is going to go into CVE

00:03:07.520 --> 00:03:12.700
only mode, which is basically been for a long time. That's kind of the way things have been for

00:03:12.700 --> 00:03:17.480
a couple years now. Does that mean like security fixes only or security fixes and bug fixes?

00:03:17.480 --> 00:03:25.600
It means that if there's a CVE, like if there's a true security vulnerability, we'll fix that as soon

00:03:25.600 --> 00:03:29.780
as possible. And if there's a, you know, any security conscious bugs that will will address those as

00:03:29.780 --> 00:03:35.300
well. But you know, things like people suggest UI changes a lot. And it's just not going to happen

00:03:35.300 --> 00:03:39.440
at this point. It's going to happen in request three, if you're going to awesome. So what's the story

00:03:39.440 --> 00:03:43.380
of the request three? What do you guys what are the major features? Yeah, so the major features are

00:03:43.380 --> 00:03:47.700
there's going to have async and await keywords. So you're going to be able to do asynchronous calls,

00:03:47.700 --> 00:03:53.540
we're ripping out URL of three, which is unfortunate, because there's different approaches on how the

00:03:53.540 --> 00:03:59.100
future of the project could unfold. And it's this needs to start happening now. So we're just taking

00:03:59.100 --> 00:04:05.020
action and making our own library for making these low level requests. And we'll see how far along we

00:04:05.020 --> 00:04:10.600
get with that. But there's we don't see any blockers that we can foresee at this point. So we'll have a new

00:04:10.600 --> 00:04:16.280
core, if you will. And it'll be as a new namespace request three. So everything that you know,

00:04:16.280 --> 00:04:21.440
that depends on requests, this is going to have backwards incompatible changes. But it'll be under

00:04:21.440 --> 00:04:25.340
a new namespace. So you won't have to worry about that. You can have both installed at the same time.

00:04:25.340 --> 00:04:27.700
Nice. And it's modern Python only, right?

00:04:27.700 --> 00:04:32.160
Yeah, it's only Python three, six. And it has type annotations and all the public functions. So your

00:04:32.160 --> 00:04:37.440
IDEs can get some nice code completion and stuff like that. I'm pretty excited about it. So that I

00:04:37.440 --> 00:04:39.700
don't want to take up too much time now. So I guess we got to keep moving.

00:04:39.700 --> 00:04:44.020
Well, we do. But I'm pretty excited. So I have one more question. So why three, six and not three,

00:04:44.020 --> 00:04:48.580
five? Like three, five is fine for async and await. Did you do like different type annotations? Or

00:04:48.580 --> 00:04:51.060
what was the three, six? Maybe f-strings?

00:04:51.060 --> 00:04:54.400
Okay, F, yes. Right on. Brian, I still owe you a sticker.

00:04:54.400 --> 00:04:58.880
They're really useful when you're writing a low level library or something that deals with a lot of

00:04:58.880 --> 00:05:00.680
URLs. It's really nice to have f-strings.

00:05:00.680 --> 00:05:01.500
Yeah, that's pretty cool.

00:05:01.500 --> 00:05:07.720
I don't find it acceptable to use three, five. Like if you have three, six, even three, six doesn't seem to

00:05:07.720 --> 00:05:11.540
be acceptable. I'd like to, it's going to be documented as three, seven only because like,

00:05:11.540 --> 00:05:15.800
if you're going to be on latest Python, you might as well be on latest, latest Python.

00:05:15.800 --> 00:05:16.600
Yeah. Yeah.

00:05:16.600 --> 00:05:21.020
Right on. And by the time that that comes out, three, seven will definitely be easy, easy.

00:05:21.020 --> 00:05:22.320
What's the timeframe?

00:05:22.500 --> 00:05:27.720
Yeah. I think it'll secretly work at three, six and secretly work at three, seven, but I'll just say it works at three, eight.

00:05:27.720 --> 00:05:30.980
I love it. Brian, you excited?

00:05:30.980 --> 00:05:33.500
Yeah. I actually, I think, I think that'll be fun.

00:05:33.500 --> 00:05:42.400
Yeah. I'm thinking of also ripping out the dot get keyword. That's the thing I'm torn about at the moment. Like the request dot get that everyone uses.

00:05:42.400 --> 00:05:44.640
What would it, what it's going to force everyone to use session.

00:05:44.780 --> 00:05:48.440
Oh, interesting. Okay. So you create a session and then you call get on the session, right?

00:05:48.440 --> 00:05:59.740
Yeah. So it would be, it's called HTTP session now. So it'd be HTTP dot request is what I want people to do, but I'm still playing with the idea. So I'm, it might be not changed. We'll see.

00:05:59.920 --> 00:06:03.040
Yeah. You could face some backlash, but yeah, it sounds good.

00:06:03.040 --> 00:06:03.820
I'm willing to take it.

00:06:03.820 --> 00:06:07.060
You got some tough skin. You've been on the internet for a while, right?

00:06:07.060 --> 00:06:13.260
Yeah. Let's not go down that path. All right. So maybe you could even say that you've been in some flame wars.

00:06:13.260 --> 00:06:28.160
So the next item I have is called PyFlame and PyFlame is pretty cool. Like if you want to know how the performance of your program or a certain library is going, you can generate what's called a flame graph for Python.

00:06:28.700 --> 00:06:37.080
And what's really nice about this is it's super low overhead enough that you can even run it in production without like hurting your program.

00:06:37.080 --> 00:06:44.660
So you could say, Oh, there's something going wrong with the website. Let me log in and attach, you know, PyFlame to it and see what's happening.

00:06:44.660 --> 00:06:51.520
And then just break loose and go analyze that rather than, you know, try to simulate what's happening. So I think that's pretty cool.

00:06:51.520 --> 00:06:58.420
We actually use this on the PIPAM team at one point to determine what, where our slow points were in, like how fast our boot up time is.

00:06:58.420 --> 00:06:59.680
Yeah. And was it useful?

00:06:59.680 --> 00:07:11.180
It was very useful. It shows you every single call in your stack and just shows you a graph over time of how much time was spent on each call and all the sub calls. So it's, it's great. I really like it.

00:07:11.180 --> 00:07:17.820
Yeah. And the graphs are nice as well. They're pretty obvious, not just like a grid of numbers, like a spreadsheet, but you know, graphs.

00:07:17.820 --> 00:07:27.860
Yeah. Usually when you hear someone talk about graphs that are generated from Python, it's like, you have to work with them all to make them useful. But this, these ones are useful out of the box, which I really like.

00:07:27.860 --> 00:07:47.860
Yeah. Cool. Another thing that it said that it does, which is nice, has nothing to do with PIPAM in this feature, but it's capable of profiling embedded Python interpreters. So like, for example, in micro whiskey or Gunicorn or some of these, you know, backend worker processes for web servers. So you can get in there and get that in multi-threaded stuff. So I think it's pretty awesome.

00:07:47.860 --> 00:07:59.920
Brian, do you guys care about performance where you are? I mean, you're doing testing hardware, so it's not like users are directly interacting with it. Is it, is it, I guess not, do you care about it, but is it something you have to like worry about?

00:07:59.920 --> 00:08:06.680
In my production stuff, the Python is not the bottleneck. It's the communication. So yeah.

00:08:06.680 --> 00:08:07.980
That's a great response.

00:08:07.980 --> 00:08:10.820
It's on the wire. It's not our fault.

00:08:11.360 --> 00:08:19.240
Well, it usually is our fault, but it's usually an optimization of doing too many calls and reducing the communication latencies.

00:08:19.240 --> 00:08:24.760
Right. Having a chatty API versus trying to bulk up the thing you want to ask it or whatever, right?

00:08:24.760 --> 00:08:26.400
Are you working with a lot of microservices?

00:08:26.400 --> 00:08:32.520
Working with test equipment. So communicating commands and retrieving data.

00:08:32.520 --> 00:08:34.680
Yeah. That would take a lot of time.

00:08:34.680 --> 00:08:38.280
Yeah. Brian tests actual devices with Python.

00:08:38.280 --> 00:08:40.580
That's awesome. Oh, that's right. I knew about this.

00:08:40.580 --> 00:08:43.660
Yeah. You test like, like phones and stuff, don't you?

00:08:43.660 --> 00:08:45.420
Yep. That's awesome.

00:08:45.420 --> 00:08:49.900
Yeah. Pretty cool. All right. Before we get onto the next one, which looks pretty interesting.

00:08:49.900 --> 00:08:55.620
Let me just tell you about data dogs. So they've been sponsoring Python bytes for quite a while and we definitely appreciate them.

00:08:55.620 --> 00:09:02.340
So there are monitoring and analytics service that lets you take all of your metrics and logs and tracing and whatnot across your services,

00:09:02.340 --> 00:09:05.720
like microservices, like it's just said, and put them all in one place.

00:09:05.860 --> 00:09:14.540
And it automatically instruments async libraries like asyncio and Django and tornado and helps you visualize all that stuff across the boundaries to find your bottlenecks.

00:09:14.540 --> 00:09:21.860
Super cool. So check them out to get a free 14 day trial and a cool data dog t-shirt over at pythonbytes.fm/data dog.

00:09:22.020 --> 00:09:24.720
All right. Thanks data dog. Brian, what do you got next?

00:09:24.720 --> 00:09:29.300
This was going to be one of my extras, but I thought I'd just discuss it because I was curious what you guys thought.

00:09:29.300 --> 00:09:38.740
So flit is, I really like it. It's a little package that allows you to quickly build a pipe project.tomo file and a license file.

00:09:38.740 --> 00:09:45.480
And basically, you know, if you've got a module that you want to share with somebody or a package that's just a source package,

00:09:45.480 --> 00:09:50.880
it's just a few commands to try to get it into a wheel form to so you can share it.

00:09:50.880 --> 00:09:52.900
And it even does publishing within it.

00:09:52.900 --> 00:09:57.600
The one thing I didn't like about it is it didn't support source directories.

00:09:57.600 --> 00:09:59.860
And I like source directories in my packages.

00:09:59.860 --> 00:10:05.460
So I did what you can do with open source projects is I submitted a pull request.

00:10:05.460 --> 00:10:07.860
So just submitted this last night.

00:10:08.380 --> 00:10:18.220
I've been playing with the corner cases today and there's still some I'm listing it as a work in progress because there's some corner cases that still need tested and probably ironed out.

00:10:18.220 --> 00:10:21.700
But I don't know. We'll see. We'll see where this goes.

00:10:21.700 --> 00:10:25.700
Did you make it so it's configurable to any directory or specifically SRC?

00:10:25.700 --> 00:10:28.120
Specifically SRC.

00:10:28.120 --> 00:10:29.300
Okay, cool.

00:10:29.300 --> 00:10:31.200
It doesn't break any of the other.

00:10:31.460 --> 00:10:38.820
So really right now it used to have two kinds of projects, just a module or a package with a name.

00:10:38.820 --> 00:10:42.500
And now I'm just adding those two within a source directory.

00:10:42.500 --> 00:10:45.460
The old mechanism all works. It's just extending it.

00:10:45.460 --> 00:10:50.980
Yeah, Flet is a little bit like a combination between Twine and Cookie Cutter a little bit.

00:10:50.980 --> 00:10:53.860
Like it's far reduced in scope from Cookie Cutter.

00:10:53.860 --> 00:10:58.720
And in Twine, all it does is publish things, publish wheels for you.

00:10:58.720 --> 00:11:01.340
And that's the tool I typically use in my workflow.

00:11:01.340 --> 00:11:05.720
But Flit is a great alternative if you don't already have your setup stuff built out.

00:11:05.720 --> 00:11:12.020
I think Flit is like a great first tool to go for, especially if you don't have those files already written.

00:11:12.020 --> 00:11:12.760
Yeah, that's awesome.

00:11:12.760 --> 00:11:13.100
Yeah.

00:11:13.100 --> 00:11:14.640
Well, hopefully people like it.

00:11:14.640 --> 00:11:16.160
I mean, it's out there, the PR, right?

00:11:16.160 --> 00:11:16.780
They could merge it.

00:11:16.780 --> 00:11:17.540
That's pretty cool.

00:11:17.540 --> 00:11:18.460
Yeah, so hopefully.

00:11:18.460 --> 00:11:19.880
Hopefully they'll put it in.

00:11:19.880 --> 00:11:21.340
Otherwise, you can't use it on your project.

00:11:21.340 --> 00:11:25.080
You'll have to succumb to our side where you don't use source.

00:11:25.080 --> 00:11:27.460
Well, I could fork it.

00:11:27.460 --> 00:11:28.480
Yeah, you could.

00:11:29.160 --> 00:11:31.000
But I don't really want to support it.

00:11:31.000 --> 00:11:32.420
So I'm hoping that...

00:11:32.420 --> 00:11:32.920
Call it Slit.

00:11:32.920 --> 00:11:37.580
Yeah, you don't want that puppy.

00:11:37.580 --> 00:11:39.700
You don't need another thing to take care of, right?

00:11:39.700 --> 00:11:41.280
Yeah, that's a good name though.

00:11:41.280 --> 00:11:43.540
She's going to do it.

00:11:43.540 --> 00:11:46.080
Awesome.

00:11:46.080 --> 00:11:46.460
All right.

00:11:46.460 --> 00:11:52.100
So speaking of packaging and things that we've talked about and things we're like, I'm a huge fan of PipX.

00:11:52.100 --> 00:11:53.680
I think PipX is really killer.

00:11:53.680 --> 00:11:54.180
Yeah.

00:11:54.280 --> 00:11:54.740
The way it works.

00:11:54.740 --> 00:11:58.760
I've run into some issues with Homebrew in it, but I'm going to put those aside for a minute.

00:11:58.760 --> 00:12:00.960
Also, PipInf, tell us the story here.

00:12:00.960 --> 00:12:06.180
My endorsement is also with this flag, which is I've run into some issues and I'm not sure what they are yet.

00:12:06.720 --> 00:12:09.420
So it appears as though PipX is great.

00:12:09.420 --> 00:12:14.260
And what it does is it just creates a virtual environment and installs binaries for you.

00:12:14.260 --> 00:12:18.120
So it's like a Pipsy replacement or a virtual amp wrapper.

00:12:18.120 --> 00:12:19.380
If you have like...

00:12:19.380 --> 00:12:24.360
Sometimes people will have like a system virtual amp where they install their system utilities or they'll just...

00:12:24.360 --> 00:12:31.600
They'll keep their system utilities in the system installation of Python and then they'll isolate their different projects into virtual amps.

00:12:31.600 --> 00:12:37.280
This makes it so every single tool has its own virtual amp, which is really best practice.

00:12:37.280 --> 00:12:48.660
So if you're using PipAmp, if you're using HTTP IE, if you're using anything pip itself, anything that's pip installable from the command line, you can install it easily with PipX.

00:12:48.660 --> 00:12:57.200
And it does appear as though it has shims, so I'm not sure that it's fantastic, but it appears as though it works pretty well so far.

00:12:57.200 --> 00:12:59.460
And I really like that it supports multiple binaries.

00:12:59.460 --> 00:13:00.240
Yeah, I do too.

00:13:00.240 --> 00:13:01.140
It's quite nice.

00:13:01.140 --> 00:13:05.420
And to me, it feels like homebrew, but for Python executables.

00:13:05.420 --> 00:13:12.360
Like it's not necessarily for managing stuff for your project, but for stuff that is Python based that you just want to run, right?

00:13:12.360 --> 00:13:17.380
Like I want to, I don't know, run Glances or Cookie Cutter or something like that, right?

00:13:17.380 --> 00:13:17.980
Or PipInf.

00:13:17.980 --> 00:13:18.500
Exactly.

00:13:18.740 --> 00:13:21.640
And it gives you a nice isolated environment in which to install that.

00:13:21.640 --> 00:13:26.340
And some of these, like PipInf has like some 50 dependencies or something crazy.

00:13:26.340 --> 00:13:30.200
So it's really good to have an isolated virtual environment for that.

00:13:30.200 --> 00:13:35.540
Because in Python, you can't install multiple versions of a dependency like you can in Ruby.

00:13:35.540 --> 00:13:38.620
So that's why we need to do this, basically.

00:13:38.620 --> 00:13:39.340
Yeah, cool.

00:13:39.340 --> 00:13:40.600
Well, I definitely like it.

00:13:40.600 --> 00:13:44.440
Yeah, that's the end of my endorsement with the asterisk afterwards.

00:13:44.440 --> 00:13:45.700
Yeah, I love it.

00:13:45.780 --> 00:13:55.140
The problem that I ran into, the only problem I ran into was when I installed Python 3 through Homebrew and then Python 3 got upgraded by Homebrew.

00:13:55.140 --> 00:14:00.400
It had lost like the symlink to where Python was in all of the virtual environments that it had created.

00:14:00.400 --> 00:14:01.460
Oh, interesting.

00:14:01.780 --> 00:14:02.440
Yeah, yeah.

00:14:02.440 --> 00:14:06.960
So when I basically, when I upgraded Python, it like lost track of what it was up to.

00:14:06.960 --> 00:14:09.780
So I just had to like re-PipX install everything.

00:14:09.780 --> 00:14:11.420
There's maybe another way to fix it.

00:14:11.420 --> 00:14:12.920
But that was what I did.

00:14:12.920 --> 00:14:16.340
Because all the virtual environments it manages seem to have gotten whacked.

00:14:16.340 --> 00:14:18.300
Yeah, Pip-Am does that too, where it'll break.

00:14:18.300 --> 00:14:21.540
All your virtual environments just break if you upgrade your Python underneath it.

00:14:21.540 --> 00:14:21.940
So.

00:14:21.940 --> 00:14:22.260
Yeah.

00:14:22.260 --> 00:14:23.360
What do you do to fix it?

00:14:23.360 --> 00:14:24.420
You know better than I do.

00:14:24.420 --> 00:14:25.520
I just delete them all.

00:14:25.520 --> 00:14:26.740
Okay.

00:14:26.740 --> 00:14:28.940
So even you have the same fix as I do.

00:14:28.940 --> 00:14:31.580
Did you try turning it off and on?

00:14:31.580 --> 00:14:32.440
How many times?

00:14:32.440 --> 00:14:33.080
Three times.

00:14:33.080 --> 00:14:33.900
I always do it three times.

00:14:34.000 --> 00:14:36.980
I would like to automate that so it does it for you.

00:14:36.980 --> 00:14:39.960
Like, you know, it has a message like, oh, you appear to have upgraded your Python.

00:14:39.960 --> 00:14:41.940
We're going to clean it up for you.

00:14:41.940 --> 00:14:44.020
But, you know, there's limited time.

00:14:44.020 --> 00:14:44.440
Exactly.

00:14:44.440 --> 00:14:45.120
Quite cool.

00:14:45.120 --> 00:14:45.540
All right.

00:14:45.540 --> 00:14:46.460
The last one.

00:14:46.460 --> 00:14:50.620
Kenneth, I think you'll like this one because it has to do with requesting things on the internet.

00:14:50.620 --> 00:14:52.620
And I don't know how to say this.

00:14:52.620 --> 00:14:54.300
I'm guessing cheat sheet.

00:14:54.300 --> 00:14:57.340
Cheat.sh as a domain.

00:14:57.340 --> 00:14:57.820
Okay.

00:14:58.280 --> 00:15:08.080
So this is a, an interesting like cheat sheet for getting started with Python or bash or whatever.

00:15:08.080 --> 00:15:17.260
And the way it works is you send it curl requests or send it HTTP py requests on the command line to ask it questions.

00:15:17.260 --> 00:15:17.980
Okay.

00:15:17.980 --> 00:15:27.300
So you can go over there and say, like if you have HTTP py installed, you could say HTTP space CHT.sh slash Python.

00:15:27.420 --> 00:15:28.680
That tells you you're talking about Python.

00:15:28.680 --> 00:15:30.980
Then you could say slash sort plus list.

00:15:30.980 --> 00:15:37.740
And if you run that, it will tell you, oh, here's a Python example of how you sort a list.

00:15:37.740 --> 00:15:38.760
You create the list.

00:15:38.760 --> 00:15:40.040
You say my list dot sort.

00:15:40.040 --> 00:15:43.180
You set the key to like string dot lower or, you know, whatever you want to sort.

00:15:43.180 --> 00:15:47.700
If you like say you want to sort alphabetically, but without concern of casing, things like that.

00:15:47.700 --> 00:15:56.820
So you can ask it arbitrary questions like cheat sheet dot slash Python slash connect to database or something like that with a pluses in there.

00:15:57.020 --> 00:15:59.920
And it'll like tell you, oh, here's some ways you can do it.

00:15:59.920 --> 00:16:00.580
Like with SQLite.

00:16:00.580 --> 00:16:01.580
Let's see what it says for this one.

00:16:01.580 --> 00:16:02.440
Oh yeah.

00:16:02.440 --> 00:16:07.920
Here's a little example of how I use PeeWee to open up a pretty little class and do ORM stuff to it.

00:16:07.920 --> 00:16:11.720
And just, it's pretty, pretty funky, pretty interesting.

00:16:11.720 --> 00:16:16.080
And then you can ask it questions like how to get started with a colon learn on any project.

00:16:16.080 --> 00:16:17.280
Like how do I get started with Python?

00:16:17.280 --> 00:16:20.400
And it'll tell you in its little way.

00:16:20.400 --> 00:16:21.140
It's pretty sweet.

00:16:21.240 --> 00:16:22.860
I think funky is the right word for this.

00:16:22.860 --> 00:16:24.840
It's different, right?

00:16:24.840 --> 00:16:26.420
So it's like Google, but harder.

00:16:26.420 --> 00:16:27.760
Yeah, basically.

00:16:27.760 --> 00:16:30.880
It's slightly more deterministic.

00:16:30.880 --> 00:16:34.060
Yes, but it has integration into Visual Studio Code and Vim.

00:16:34.060 --> 00:16:34.860
Oh, nice.

00:16:34.860 --> 00:16:35.740
Which is interesting.

00:16:36.140 --> 00:16:41.080
And then you can also, like you can install a client and put it into stealth mode.

00:16:41.080 --> 00:16:49.900
So like if you're doing an interview, anything that you select in a text box, it will start like on the side printing out its response to that.

00:16:51.200 --> 00:16:51.640
Okay.

00:16:51.640 --> 00:16:53.920
So if like you're in a chat window.

00:16:53.920 --> 00:16:57.600
I'm looking at the readme and he really takes this very seriously.

00:16:57.600 --> 00:16:58.700
It is.

00:16:58.700 --> 00:17:01.920
He says ultra fast returns answers within 100 milliseconds as a rule.

00:17:01.920 --> 00:17:05.000
So like he's definitely making scalability concern.

00:17:05.000 --> 00:17:07.880
So I think this is like a really fun production project.

00:17:07.880 --> 00:17:08.700
I think so too.

00:17:08.700 --> 00:17:11.500
And it doesn't use its own data sources.

00:17:11.500 --> 00:17:15.060
It uses other community driven repos for different topics.

00:17:15.060 --> 00:17:16.760
And it tries to pull those in.

00:17:16.760 --> 00:17:18.540
So it's not like it tries to be the answer.

00:17:18.660 --> 00:17:22.860
It tries to be like a facade front end API to the answers.

00:17:22.860 --> 00:17:24.960
So it has sources that it gets them from.

00:17:24.960 --> 00:17:26.980
I'm interested in seeing that part.

00:17:26.980 --> 00:17:27.280
Yeah.

00:17:27.280 --> 00:17:27.540
Yeah.

00:17:27.540 --> 00:17:28.020
It's pretty interesting.

00:17:28.020 --> 00:17:31.040
So I just want to give a shout out to John Boltmeier.

00:17:31.040 --> 00:17:33.720
He sent this in a while ago and, you know, I thought it was fun.

00:17:33.720 --> 00:17:34.660
So I thought I'd throw it out there.

00:17:34.660 --> 00:17:39.000
And he also has clipboard integration and tab completion support for Bash, Fish and ZSH.

00:17:39.000 --> 00:17:39.740
I know.

00:17:39.740 --> 00:17:41.240
I mean, this is in depth, right?

00:17:41.240 --> 00:17:43.960
Like you can really go all out with this.

00:17:43.960 --> 00:17:45.980
Yes, you can.

00:17:45.980 --> 00:17:46.700
All right.

00:17:46.760 --> 00:17:49.240
Well, that's it for our full major topics.

00:17:49.240 --> 00:17:52.100
But I'm sure we'll have a couple of extra things to throw out here real quick.

00:17:52.100 --> 00:17:53.500
Brian, you want to start us off?

00:17:53.500 --> 00:17:56.960
So you guys were giving me a bad time about being a VI person last week.

00:17:56.960 --> 00:18:01.320
So I thought I'd throw in an article about VI is good for beginners.

00:18:01.320 --> 00:18:05.320
It's just a fun read for anybody that thinks that VI is terrible.

00:18:05.320 --> 00:18:07.240
Do you use Vim, not VI?

00:18:07.240 --> 00:18:10.540
I actually use PyCharm right now with IdeaVim.

00:18:10.620 --> 00:18:15.320
Yeah, this is an interesting contrarian sort of take on the simplicity is good for you.

00:18:15.320 --> 00:18:15.580
Yeah.

00:18:15.580 --> 00:18:15.980
Yeah.

00:18:15.980 --> 00:18:16.800
Myself.

00:18:16.800 --> 00:18:19.000
I think it's a good thing to learn.

00:18:19.000 --> 00:18:21.900
I did a presentation last week with a Jupyter notebook.

00:18:21.900 --> 00:18:28.320
And one of the things I needed to do was to quickly make sure I cleaned out all the output of a bunch of notebooks.

00:18:28.700 --> 00:18:31.400
And I found this tool called the NB strip out.

00:18:31.400 --> 00:18:33.800
And so I wanted to drop a link to that.

00:18:33.800 --> 00:18:34.760
It's pretty helpful.

00:18:34.760 --> 00:18:35.620
Yeah.

00:18:35.620 --> 00:18:37.020
It's just a command line thing.

00:18:37.020 --> 00:18:43.120
And then we had a bunch of people, a couple of people, including Cecil, mentioned Pyodide.

00:18:43.520 --> 00:18:45.240
But we did cover that in episode 93.

00:18:45.240 --> 00:18:49.580
But there was a recent article written up about Pyodide that's kind of neat.

00:18:49.580 --> 00:18:51.840
So I'll drop a link to that in the show notes as well.

00:18:51.840 --> 00:18:53.520
I'm super excited about Pyodide.

00:18:53.520 --> 00:19:07.060
I actually just yesterday interviewed Michael Drotboom, who wrote that article you're referencing here and worked on the project on Talk Python, going deep into WebAssembly and what Mozilla is doing with Pyodide stuff.

00:19:07.060 --> 00:19:08.300
So it's, yeah, it's super cool.

00:19:08.300 --> 00:19:10.000
Kenneth, have you seen this, Pyodide?

00:19:10.080 --> 00:19:11.020
I'm looking at it now.

00:19:11.020 --> 00:19:15.160
So it's like all of the scientific Python stack in WebAssembly?

00:19:15.160 --> 00:19:15.800
Yes.

00:19:15.800 --> 00:19:19.900
Including the libraries like NumPy and Matplotlib and stuff like that.

00:19:19.900 --> 00:19:20.560
That's awesome.

00:19:20.560 --> 00:19:22.100
Not just like CPython.

00:19:22.100 --> 00:19:24.380
That is not unimpressive.

00:19:24.380 --> 00:19:26.000
No, it's not.

00:19:26.000 --> 00:19:27.700
It's quite something.

00:19:27.700 --> 00:19:28.260
That's awesome.

00:19:28.260 --> 00:19:28.760
Let's see.

00:19:28.760 --> 00:19:30.200
I guess I'll start mine really quick.

00:19:30.200 --> 00:19:32.180
I got some quick conference announcements.

00:19:32.180 --> 00:19:33.360
Kenneth, I see you do as well.

00:19:33.360 --> 00:19:37.200
So PyCon Australia just opened their call for proposals.

00:19:37.600 --> 00:19:39.920
So Australia is a beautiful place to be.

00:19:39.920 --> 00:19:43.840
Either maybe you're already there and you just want to go to the conference or you want an excuse to go to Australia.

00:19:43.840 --> 00:19:45.080
Submit a talk.

00:19:45.080 --> 00:19:45.540
That's awesome.

00:19:45.540 --> 00:19:53.100
And then last time I had used about whether the gravitational waves of black holes colliding.

00:19:53.820 --> 00:19:56.180
That research was also done with Python.

00:19:56.180 --> 00:20:00.240
So remember we talked about the black hole picture and all that stuff, Brian?

00:20:00.240 --> 00:20:00.660
Yeah.

00:20:00.660 --> 00:20:04.320
Well, our listeners are awesome because they're like, oh, Michael, did you wonder about this?

00:20:04.320 --> 00:20:04.600
Yes.

00:20:04.600 --> 00:20:09.320
Here's the package they use to discover gravitational waves and do all this amazing science.

00:20:09.480 --> 00:20:12.940
So actually, there's some really cool projects out there.

00:20:12.940 --> 00:20:15.840
And I'll link to a video of someone talking about it.

00:20:15.840 --> 00:20:19.360
So thanks to Dave Kirby and Matthew Feikert both for that.

00:20:19.360 --> 00:20:21.240
And I think it's GWPy.

00:20:21.240 --> 00:20:21.940
Yeah.

00:20:21.940 --> 00:20:27.620
GWPy.github.io is a Python package for gravitational wave astrophysics.

00:20:27.980 --> 00:20:32.760
So detecting when black holes collide and the ripple in space time they make with Python is pretty awesome.

00:20:32.760 --> 00:20:33.000
Yeah.

00:20:33.000 --> 00:20:38.780
I was really surprised to find out that when that code was made available that a request was used for it.

00:20:38.780 --> 00:20:39.580
That's so awesome.

00:20:39.580 --> 00:20:40.860
I have no idea how.

00:20:40.860 --> 00:20:43.000
It doesn't matter.

00:20:43.000 --> 00:20:43.700
It's awesome.

00:20:43.700 --> 00:20:44.780
But it's in there.

00:20:44.780 --> 00:20:45.840
So I was like, yes.

00:20:45.840 --> 00:20:47.180
That is super cool.

00:20:47.180 --> 00:20:47.840
Congrats, man.

00:20:47.840 --> 00:20:53.840
And then finally, another thing that's awesome about our listeners is anytime we mention something, we think it's unique.

00:20:53.840 --> 00:20:54.860
They're like, there's four other ones.

00:20:54.860 --> 00:20:55.460
Here's another one.

00:20:55.460 --> 00:20:57.060
So Bullet, we talked about.

00:20:57.060 --> 00:20:57.700
Cooked input.

00:20:57.800 --> 00:20:58.220
We talked about.

00:20:58.220 --> 00:20:58.620
It's awesome.

00:20:58.620 --> 00:21:03.440
Bullet is super cool for like drop downs inside terminal windows and like nice selections.

00:21:03.440 --> 00:21:05.020
But it doesn't work on windows.

00:21:05.020 --> 00:21:12.160
So someone else, Sander Tunison, sent over questionnaire, which is one that is also compatible for windows, for our windows folks.

00:21:12.160 --> 00:21:14.100
Thanks for putting that in because I need that.

00:21:14.100 --> 00:21:15.240
See?

00:21:15.240 --> 00:21:19.280
You were like the first, one of the very first people to benefit from this podcast.

00:21:19.280 --> 00:21:20.240
I feel the same way.

00:21:20.240 --> 00:21:24.780
Like people are like, oh, you finally, like I benefit from this just like you guys do.

00:21:24.780 --> 00:21:26.980
It's just I have to get there first before we publish it.

00:21:26.980 --> 00:21:27.460
Awesome.

00:21:27.620 --> 00:21:28.020
Awesome.

00:21:28.020 --> 00:21:28.380
Okay.

00:21:28.380 --> 00:21:29.280
Kenneth, what do you got?

00:21:29.440 --> 00:21:31.380
Honestly, I have a few CFPs I wanted to announce.

00:21:31.380 --> 00:21:32.840
One of them is for Pi Colorado.

00:21:32.840 --> 00:21:34.420
It's a great conference.

00:21:34.420 --> 00:21:35.720
It's going to be their first year.

00:21:35.720 --> 00:21:37.160
It's run by a great team, at least.

00:21:37.160 --> 00:21:38.200
It should be a great conference.

00:21:38.200 --> 00:21:44.800
If they are actively looking for people to submit to their CFP, they have not had as many submissions as they would like to so far.

00:21:44.960 --> 00:21:45.960
Bad timing with the conference here.

00:21:45.960 --> 00:21:54.000
They have a great team of people to submit, so if anyone has any talks that they think could be applicable to that event, please submit.

00:21:54.000 --> 00:22:01.360
Pi Ohio also has their CFP open at the moment, and they're looking for people to submit, but they never have a problem with getting too many submissions.

00:22:01.360 --> 00:22:06.860
So I wouldn't rush to that one if you're feeling iffy about it.

00:22:07.300 --> 00:22:19.740
And then the last one is a PiCon remote, which is something that I'm going to be putting on if all goes according to plan with Calvin Spellingman, I believe is how you say his last name, who is from the Pi Tennessee organizers group.

00:22:20.460 --> 00:22:21.820
Him and I are co-chairing.

00:22:21.820 --> 00:22:22.240
That's cool.

00:22:22.240 --> 00:22:22.900
What's that about?

00:22:22.900 --> 00:22:29.320
It's basically a PiCon, but it'll be accessible to people who can't attend PiCon or who can't normally speak at PiCon.

00:22:29.320 --> 00:22:31.480
Is it also virtual or only virtual?

00:22:31.480 --> 00:22:32.420
Only virtual.

00:22:32.420 --> 00:22:33.320
Okay, sweet.

00:22:33.320 --> 00:22:34.180
That's awesome.

00:22:34.180 --> 00:22:34.500
Yeah.

00:22:34.500 --> 00:22:43.620
We're still figuring out what the feasibility of different approaches are, but it'll most likely be live streamed and people will send in videos ahead of time of their talks.

00:22:43.620 --> 00:22:44.040
Okay.

00:22:44.040 --> 00:22:46.740
Unless they're like a keynote speaker or something like that.

00:22:47.000 --> 00:22:50.740
So we're still figuring out the details, but it'll be, it should be good.

00:22:50.740 --> 00:22:53.560
We have a mailing list with like 700 people who have signed up so far.

00:22:53.560 --> 00:22:57.620
So it should be, it should be something we can pull off.

00:22:57.620 --> 00:23:03.800
So if you're interested and want to learn more, you can go to do slash co slash pi con dash remote.

00:23:03.800 --> 00:23:07.060
I know it's not the best URL, but that's the best I can give you right now.

00:23:07.060 --> 00:23:07.460
Awesome.

00:23:07.460 --> 00:23:07.860
Yeah.

00:23:07.860 --> 00:23:08.940
We'll put the link in the show notes.

00:23:08.940 --> 00:23:10.280
People can just click it in there.

00:23:10.280 --> 00:23:10.820
Their player.

00:23:10.820 --> 00:23:11.220
That's awesome.

00:23:11.220 --> 00:23:12.000
All right.

00:23:12.000 --> 00:23:15.020
Well, let's round it out with some, some jokes here.

00:23:15.020 --> 00:23:18.360
Brian, you want to go first?

00:23:18.360 --> 00:23:20.000
We're not doing all the jokes.

00:23:20.000 --> 00:23:20.320
All right.

00:23:20.320 --> 00:23:21.780
We got to go fast.

00:23:21.780 --> 00:23:22.480
We got to go fast.

00:23:22.480 --> 00:23:22.940
Okay.

00:23:22.940 --> 00:23:25.020
So yeah, I'll just pick one.

00:23:25.020 --> 00:23:27.440
I don't know how tasteful this is.

00:23:27.440 --> 00:23:28.920
We'll let it land anyway.

00:23:28.920 --> 00:23:32.500
So Python used to be directed by the BDFL Guido.

00:23:32.500 --> 00:23:34.800
Now it's directed by steering council.

00:23:34.800 --> 00:23:36.320
Guids zero through four.

00:23:36.320 --> 00:23:39.720
Love it.

00:23:39.720 --> 00:23:40.860
Kenneth, you want to do one?

00:23:40.860 --> 00:23:41.240
You got any,

00:23:41.240 --> 00:23:43.040
what's the difference between a musician and a pizza?

00:23:43.300 --> 00:23:43.660
I don't know.

00:23:43.660 --> 00:23:44.380
You can eat a pizza.

00:23:44.380 --> 00:23:45.920
Pizza can feed a family of four.

00:23:45.920 --> 00:23:47.160
Oh, that hurts.

00:23:47.160 --> 00:23:50.420
I can say that because I've made $25 off of my music so far.

00:23:50.420 --> 00:23:51.660
Beautiful.

00:23:51.660 --> 00:23:52.560
All right.

00:23:52.560 --> 00:23:53.460
I got two, but they're related.

00:23:53.460 --> 00:23:54.760
So I'm going to put them together real quick.

00:23:54.760 --> 00:24:00.260
I think first to kick it off that Ubuntu users are apt to get this joke that I'm about to tell.

00:24:00.260 --> 00:24:00.880
Okay.

00:24:01.220 --> 00:24:07.080
And then the second one, the second one, this is fun.

00:24:07.080 --> 00:24:13.100
I actually, I know Kenneth, you switched over to windows recently, and I'm also kind of a fan of it, even though I spend a lot of time on Mac.

00:24:13.100 --> 00:24:14.140
Still, I like the joke.

00:24:14.140 --> 00:24:17.800
How many programmers does it take to kill a cockroach?

00:24:17.800 --> 00:24:18.300
Two.

00:24:18.300 --> 00:24:20.880
One holds, the other installs windows on it.

00:24:20.880 --> 00:24:24.220
All right.

00:24:24.220 --> 00:24:24.480
Beautiful.

00:24:24.600 --> 00:24:27.100
Well, I think that's probably about it for our show today.

00:24:27.100 --> 00:24:28.580
Kenneth, thank you for coming.

00:24:28.580 --> 00:24:30.080
Brian, thank you as always for being here.

00:24:30.080 --> 00:24:30.640
Yeah, thank you.

00:24:30.640 --> 00:24:32.560
Thank you for listening to Python Bytes.

00:24:32.560 --> 00:24:35.100
Follow the show on Twitter via at Python Bytes.

00:24:35.100 --> 00:24:37.960
That's Python Bytes as in B-Y-T-E-S.

00:24:37.960 --> 00:24:41.200
And get the full show notes at pythonbytes.fm.

00:24:41.420 --> 00:24:45.400
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:24:45.400 --> 00:24:48.100
We're always on the lookout for sharing something cool.

00:24:48.100 --> 00:24:51.220
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:24:51.220 --> 00:24:54.660
Thank you for listening and sharing this podcast with your friends and colleagues.

