WEBVTT

00:00:00.001 --> 00:00:03.900
Hey there, thanks for listening. Before we jump into this episode, I just want to remind you

00:00:03.900 --> 00:00:09.800
that this episode is brought to you by us over at Talk Python Training and Brian through his pytest

00:00:09.800 --> 00:00:15.060
book. So if you want to get hands-on and learn something with Python, be sure to consider our

00:00:15.060 --> 00:00:22.240
courses over at Talk Python Training. Visit them via pythonbytes.fm/courses. And if you're

00:00:22.240 --> 00:00:27.840
looking to do testing and get better with pytest, check out Brian's book at pythonbytes.fm slash

00:00:27.840 --> 00:00:33.460
pytest. Enjoy the episode. Hello and welcome to Python Bytes, where we deliver Python news and

00:00:33.460 --> 00:00:41.580
headlines directly to your earbuds. It's episode 255, recorded October 20th, 2021. I'm Brian Okken.

00:00:41.580 --> 00:00:46.960
I'm Michael Kennedy. And I'm Will McGugan. Welcome Will. Thank you. Good to be here. I'm sure people

00:00:46.960 --> 00:00:55.100
know who you are through all you do with Textual and Rich. Could you do a quick intro? Sure, yeah. I'm

00:00:55.100 --> 00:01:00.720
software developer from Edinburgh, Scotland. Last couple of years, been working quite heavily in

00:01:00.720 --> 00:01:08.820
open source. I built Rich and started work on Textual, which is an application framework using

00:01:08.820 --> 00:01:16.760
Rich. And I'm currently working exclusively on that. So I've taken a year off, probably more than that,

00:01:16.760 --> 00:01:20.940
to work on open source projects. I'm very excited about that. We're excited about it too.

00:01:22.840 --> 00:01:29.040
Yeah, that's fantastic, Will. I think we've talked about this offline as well, the success you're

00:01:29.040 --> 00:01:35.240
having with Rich and Textual and this opportunity you have to really just double down on this project

00:01:35.240 --> 00:01:39.780
you created. And I know there must be thousands of maintainers of projects out there. If I could just

00:01:39.780 --> 00:01:44.140
put all my energy into this, and you're currently lucky enough to be in that situation, right? That's

00:01:44.140 --> 00:01:51.500
fantastic. Yeah, I'm very fortunate, actually. I mean, I put some money aside. I planned for this

00:01:51.500 --> 00:01:58.000
year. But things are really looking up. And I've been blown away by the level of interest from it.

00:01:58.000 --> 00:02:05.220
I mean, it gradually ramped up with Rich. People like that. I think there was a missing niche or

00:02:05.220 --> 00:02:12.060
something which did that. But then with the Textual, people were excited about it. I mean, I put a disclaimer

00:02:12.060 --> 00:02:18.900
on the ReadMe that said it's not quite ready for prime time yet. It might break and it's in active

00:02:18.900 --> 00:02:26.220
development, but it doesn't seem to discourage anyone. They're very busy building things with it. So I'm excited.

00:02:26.220 --> 00:02:33.260
I want to take it to the next level. And to be honest, if I was doing it part-time like I was doing Rich,

00:02:33.580 --> 00:02:41.040
it would just take too long. If it was evening and weekends, it would be two years before it was like

00:02:41.040 --> 00:02:47.180
1.0. Yeah, and we're ready to use it now. So yeah, most people want to use it yesterday.

00:02:47.180 --> 00:02:54.100
Congrats again on that. That's cool. It's great stuff. You know, we've talked about over on Talk Python

00:02:54.100 --> 00:02:59.240
and people want to dive in. We've certainly covered it many times over here as well. So we're happy to

00:02:59.240 --> 00:03:02.160
spread the word on it. Yeah, Michael, let's kick off the topics.

00:03:02.160 --> 00:03:07.620
I do want to kick it off. All right. How about we start with some awesome Python topic like C++?

00:03:07.620 --> 00:03:09.180
I like both of them.

00:03:09.180 --> 00:03:16.460
This is right in your wheelhouse, Brian. A lot of C++. So I want to talk about this tutorial article

00:03:16.460 --> 00:03:23.180
series, however you want to think about it, of wrapping C++ code with Cython. So the interoperability

00:03:23.180 --> 00:03:30.860
story with C and Python being CPython as the runtime is pretty straightforward, right? But C++ is a

00:03:30.860 --> 00:03:35.880
little more interesting with classes and this pointers and all those kinds of things. So the

00:03:35.880 --> 00:03:44.000
basic idea is Cython is this thing that allows us to write very nearly Python code and sometimes

00:03:44.000 --> 00:03:50.480
actually just Python code, sometimes like in a little extended language of Python that then compiles down

00:03:50.480 --> 00:03:57.860
to C. And if that's the case, well, it's probably pretty easy to get that Cython code to work with C code.

00:03:57.860 --> 00:04:04.520
And then Cython naturally is exposed as Python objects and variables and whatnot. So that should

00:04:04.520 --> 00:04:11.500
be a good bridge between C++ and Python, right? And it turns out it is. So this person, Anton Zedan

00:04:11.500 --> 00:04:17.500
Pushkin wrote an article or is working on a series of articles called wrapping C++ with Cython.

00:04:17.880 --> 00:04:23.980
And so there's this library called Yarkerl, yet another audio recognition library. And it's kind

00:04:23.980 --> 00:04:29.620
of like Shazam. It'll, you give it a small fragment of audio and it'll say, oh, that's Pearl Jam black,

00:04:29.620 --> 00:04:34.820
you know, black by Pearl Jam or something like that. Right. Pretty cool. And if you look at it,

00:04:34.820 --> 00:04:40.600
it's got some neat C++ features, you know, Brian, feel free to jump in on this, but see that right there?

00:04:40.760 --> 00:04:48.200
Namespace. So cool. I love how they're writing like well-structured C++ code here. But basically,

00:04:48.200 --> 00:04:53.260
there's a couple of structures like a WAV file and an MP3 file and then classes, which have like a

00:04:53.260 --> 00:04:58.580
fingerprint and public methods and storage and so on. And so the idea is how could we take this and

00:04:58.580 --> 00:05:04.280
potentially make this a Python library, right? Basically create a Python wrapper with Cython for it.

00:05:04.500 --> 00:05:07.360
So you're going to come down here and says, all right, well, what we're going to do is we're going

00:05:07.360 --> 00:05:16.080
to write some Cython code and Cython doesn't immediately know how to take a C++ header file,

00:05:16.080 --> 00:05:21.660
which is where stuff is defined in C++ and turn that into things that Python understands. So you've

00:05:21.660 --> 00:05:29.560
got to write basically a little file, a PXD file that declares what the interface looks like. So you write

00:05:29.560 --> 00:05:31.380
code like this. Have you done this stuff before, Brian?

00:05:31.380 --> 00:05:34.000
No, but this looks pretty straightforward.

00:05:34.000 --> 00:05:36.220
Yeah, it's pretty straightforward. How about you, Will?

00:05:36.220 --> 00:05:41.420
I've never wrapped a library, but I've used Cython quite successfully. So it's a really good system.

00:05:41.420 --> 00:05:44.720
Yeah, yeah, I agree. I've done it, but not to wrap C++ code.

00:05:44.720 --> 00:05:44.940
No.

00:05:44.940 --> 00:05:49.620
So basically you do things like CDEF extern from this header, create a namespace,

00:05:49.620 --> 00:05:56.980
and then you have CDEF, a keyword CPP class. And then you get, what's interesting about this is

00:05:56.980 --> 00:06:02.300
you get to give it two names. And you get to say, here's the name, I want to talk about it in Python.

00:06:02.500 --> 00:06:09.920
So CPP wave file. And then here's its name in C, which is YAR control colon colon wave file.

00:06:09.920 --> 00:06:19.200
And the value of this is they want to have a thing called wave file in Python, but not the C++ one, a friendly Python one, but it needs to use the wave file from the C library.

00:06:19.340 --> 00:06:24.520
So if you directly import it, then there's like this name clash, which I suppose you could fix with namespaces and all.

00:06:24.520 --> 00:06:29.840
But I think it's cool that you can give it this name, this kind of this internal name and off it goes.

00:06:29.840 --> 00:06:36.040
Right. So then you def out its methods, basically like just here are the functions of the class.

00:06:36.200 --> 00:06:39.340
Same thing for the fingerprint and the storage and off it goes.

00:06:39.340 --> 00:06:41.940
And so all of this stuff is pretty neat.

00:06:41.940 --> 00:06:47.560
And yeah, this thing I'm talking about is called aliasing, which is pretty awesome.

00:06:47.560 --> 00:06:55.900
Like it lets you reserve the name wave file and storage and fingerprint and stuff like that for your Python library without,

00:06:56.320 --> 00:06:58.300
even though that's what the C names are as well.

00:06:58.300 --> 00:07:00.400
So yeah, pretty straightforward.

00:07:00.400 --> 00:07:02.200
What was the next thing I really want to highlight?

00:07:02.200 --> 00:07:03.400
There's kind of this long article here.

00:07:03.400 --> 00:07:08.020
So the next thing they talk about is using this thing called extension types.

00:07:08.020 --> 00:07:17.480
So an extension is just a C structure or C++ library, and you create some class that is kind of a proxy to it.

00:07:17.480 --> 00:07:25.860
So here we say C def Python class called storage, and then internal it has in Python language, you have to say C def.

00:07:26.180 --> 00:07:28.660
It has a C++ class called this.

00:07:28.660 --> 00:07:32.100
And then from then on, you just go and write standard Python code.

00:07:32.100 --> 00:07:40.240
And anytime you need to talk to the C library, you just work with this like inner pointer thing that you've created, which is pretty awesome.

00:07:40.240 --> 00:07:43.660
You just new one up in the constructor and the C++ thing.

00:07:43.660 --> 00:07:47.220
And then like it goes off to Python's memory management.

00:07:47.220 --> 00:07:50.000
So you don't have to worry about deleting it, stuff like that.

00:07:50.000 --> 00:07:56.040
I guess you do have to sort of deallocate here, but that's, you know, once you write that code, then Python will just take it from there.

00:07:56.040 --> 00:07:56.240
Right.

00:07:56.240 --> 00:07:58.320
So pretty neat, a way to do this.

00:07:58.320 --> 00:08:01.640
And the library goes on to talk about how you use it and so on.

00:08:01.640 --> 00:08:08.300
So there's a couple of interesting things about like dereferencing the pointer, like basically modeling reference types in Python.

00:08:08.300 --> 00:08:15.060
But if you've got a C++ library that you want to integrate here, I think this is a pretty cool hands-on way to do a Cython.

00:08:15.060 --> 00:08:17.000
Yeah, I think this looks fun.

00:08:17.000 --> 00:08:18.320
I'd like to give it a try.

00:08:18.320 --> 00:08:19.400
Yeah, definitely.

00:08:19.400 --> 00:08:21.880
Another one is Pybind 11.

00:08:21.880 --> 00:08:24.160
That might also be another option to look at.

00:08:24.500 --> 00:08:27.600
So I saw Henry out into the live stream there.

00:08:27.600 --> 00:08:32.660
So here's another way to operate seamlessly between C++ 11 and Python.

00:08:32.660 --> 00:08:36.680
So another option in this realm.

00:08:36.680 --> 00:08:39.140
Maybe I'll throw that link into the show notes as well.

00:08:39.140 --> 00:08:47.360
But yeah, a lot of cool stuff for taking these libraries written in C++ and turning them into Python-friendly, feeling Python-native libraries.

00:08:47.420 --> 00:08:59.260
Well, you know, that's really how a lot of Python's taken off, right, is because we've been able to take these super powerful C++ libraries and wrap a Python interface into it and have them stay up to date.

00:08:59.260 --> 00:09:04.360
When you make updates to the C++ code, you can get updates to the Python.

00:09:04.360 --> 00:09:08.380
So you sometimes hear Python described as a glue language.

00:09:08.380 --> 00:09:12.720
I think many years ago, that's probably what it was.

00:09:12.720 --> 00:09:14.160
I think Python's growing.

00:09:14.160 --> 00:09:19.780
It's more than just a glue language, but it's very good at connecting other languages together.

00:09:19.780 --> 00:09:21.640
It's still good as a glue language, though.

00:09:21.640 --> 00:09:23.740
Yeah, it's not just a glue language.

00:09:23.740 --> 00:09:26.220
It's a language of its own, I guess.

00:09:26.220 --> 00:09:26.860
Yeah.

00:09:26.860 --> 00:09:30.940
I was talking to somebody over on Talk Python, and I'm super sorry.

00:09:30.940 --> 00:09:37.880
I forgot which conversation this was, but they described Python as a glue language for web development.

00:09:37.880 --> 00:09:39.720
I thought, okay, that's kind of a weird way to think of it.

00:09:39.720 --> 00:09:40.140
But R.I.

00:09:40.140 --> 00:09:42.320
said, well, no, no, look, here's what you do with your web framework.

00:09:42.320 --> 00:09:43.740
You glue things together.

00:09:43.920 --> 00:09:47.780
You glue your database over to your network response.

00:09:47.780 --> 00:09:50.580
You glue an API call into that.

00:09:50.580 --> 00:09:53.740
I'm like, actually, that kind of is what a website is.

00:09:53.740 --> 00:09:54.640
It talks to databases.

00:09:54.640 --> 00:09:56.000
It talks to external APIs.

00:09:56.000 --> 00:09:59.420
It talks to the network in terms of HTML responses.

00:09:59.420 --> 00:10:01.740
And that's the entire web framework.

00:10:01.740 --> 00:10:04.900
But yeah, you can kind of even think of those things in those terms there.

00:10:04.900 --> 00:10:07.640
It's like a party where no one's talking to each other.

00:10:07.640 --> 00:10:10.960
And you need someone to start conversations.

00:10:10.960 --> 00:10:12.060
It's what Python does.

00:10:12.720 --> 00:10:13.220
Yeah, yeah.

00:10:13.220 --> 00:10:17.380
And I think also that that's why Python is so fast for web frameworks.

00:10:17.380 --> 00:10:20.440
Even though computationally, it's not super fast.

00:10:20.440 --> 00:10:23.800
Like it's mostly spending a little time in its own code.

00:10:23.800 --> 00:10:25.760
But a lot of time, it's like, oh, I'm waiting on the database.

00:10:25.760 --> 00:10:26.640
I'm waiting on the network.

00:10:26.640 --> 00:10:27.560
I'm waiting on an API.

00:10:27.560 --> 00:10:30.280
And that's where web apps spend their time anyway.

00:10:30.280 --> 00:10:31.000
So it doesn't matter.

00:10:31.000 --> 00:10:31.760
All right.

00:10:32.120 --> 00:10:33.520
Brian, you want to grab the next one?

00:10:33.520 --> 00:10:34.260
Yeah, sure.

00:10:34.260 --> 00:10:36.160
Bump it on to topic two.

00:10:36.160 --> 00:10:37.260
Bump it on.

00:10:37.260 --> 00:10:43.280
So I've got, I just have a few packages that I support on PyPI.

00:10:43.280 --> 00:10:46.000
And then a whole bunch of internal packages that I work on.

00:10:46.000 --> 00:10:51.240
And one of the things that is a checklist that I've got is what do I do when I bump the version?

00:10:51.240 --> 00:10:55.320
And I know that there have been some automated tools before.

00:10:55.320 --> 00:11:01.880
But they've kind of, I don't know, they make too many assumptions, I think, about how you structure your code.

00:11:02.280 --> 00:11:05.240
So I was really happy to see T-Bump come by.

00:11:05.240 --> 00:11:09.520
This was suggested by Cephi Berry.

00:11:09.520 --> 00:11:13.320
But so T-Bump is an open source package that was developed.

00:11:13.320 --> 00:11:16.220
Looks like it was developed in-house by somebody.

00:11:16.220 --> 00:11:18.160
But then their employer said, hey, go for it.

00:11:18.160 --> 00:11:18.760
Open source it.

00:11:18.760 --> 00:11:19.580
So that's cool.

00:11:19.580 --> 00:11:26.000
And the idea really is you just, it's just to bump versions.

00:11:26.000 --> 00:11:26.580
And that's it.

00:11:26.580 --> 00:11:28.520
But it does a whole bunch of cool stuff.

00:11:28.520 --> 00:11:29.260
It does.

00:11:29.260 --> 00:11:31.520
So let's say I've got to initialize it.

00:11:31.620 --> 00:11:36.800
So you initialize it as a little TML file that stores the information in the configuration.

00:11:36.800 --> 00:11:44.140
But if you don't want yet another TML file or another configuration, it can also append that to the PyProject.com.

00:11:44.140 --> 00:11:45.900
That was a nice addition.

00:11:45.900 --> 00:11:48.420
You can combine them or keep it separate up to you.

00:11:48.420 --> 00:11:51.600
And so, for instance, I tried it on one of my projects.

00:11:51.600 --> 00:11:55.980
And I kept it separate because I didn't want to muck up my PyProject.tML file.

00:11:56.880 --> 00:12:05.540
But once you initialize it, all you have to do when you want to add and bump a new version is just say T-Bump and then give it the new version.

00:12:05.540 --> 00:12:08.000
It doesn't automatically count up.

00:12:08.000 --> 00:12:10.400
I mean, you could probably write a wrapper that counts up.

00:12:10.400 --> 00:12:14.540
But looking at your own version and deciding what the new one is reasonable.

00:12:14.540 --> 00:12:16.120
That's a reasonable way to do it.

00:12:16.460 --> 00:12:21.780
And then it goes out and it patches any versions you've got.

00:12:21.780 --> 00:12:26.720
And then in your code, in your code base or your files or config files or wherever.

00:12:26.720 --> 00:12:31.020
And then it commits those changes.

00:12:31.020 --> 00:12:34.840
It adds a version tag, pushes your code, pushes the version tag.

00:12:34.840 --> 00:12:40.740
And then also you could have these optional run things, places where, like, before you commit, you can run some stuff.

00:12:40.740 --> 00:12:47.820
Like, for instance, check to make sure that you've added that version to your changelog or your, if you want to check your documentation.

00:12:48.200 --> 00:12:48.960
So that's pretty cool.

00:12:48.960 --> 00:12:50.980
And then also you can have post actions.

00:12:50.980 --> 00:12:54.380
If you wanted to, I was thinking a post action would be cool.

00:12:54.380 --> 00:12:57.500
You could just automatically tweet out, hey, a new version is here.

00:12:57.500 --> 00:12:58.980
Somehow hook that up.

00:12:58.980 --> 00:12:59.480
That'd be fun.

00:12:59.480 --> 00:12:59.940
Yeah.

00:12:59.940 --> 00:13:02.560
Grab the first line out of the release notes and just tweet that.

00:13:02.560 --> 00:13:03.060
Yeah.

00:13:03.060 --> 00:13:09.680
And then the hard part, really, is how does it know where to change the version?

00:13:09.680 --> 00:13:13.720
And that's where part of the configuration, I think, is really pretty cool.

00:13:14.160 --> 00:13:22.540
It just has this file configuration setting, if I can find it on here, that you list the source.

00:13:22.540 --> 00:13:27.200
And then you can also list, like, the configuration of it.

00:13:27.200 --> 00:13:28.280
Let me grab one.

00:13:28.280 --> 00:13:34.020
So, like, the source and then how to look for it.

00:13:34.020 --> 00:13:39.240
So, like, it's a search string or something of what line to look for and then where to replace the version.

00:13:39.760 --> 00:13:41.920
And that's pretty straight.

00:13:41.920 --> 00:13:44.940
I mean, you kind of have to do some hand tweaking to get this to work.

00:13:44.940 --> 00:13:47.140
But, for instance, it's just a couple lines.

00:13:47.140 --> 00:13:48.700
It makes it pretty nice.

00:13:48.700 --> 00:13:51.380
At first, I thought, well, it's not that much work anyway.

00:13:51.380 --> 00:13:53.240
But it's way less work now.

00:13:53.240 --> 00:13:55.400
And then, frankly, I usually forget.

00:13:55.400 --> 00:13:56.900
I'll remember to push the version.

00:13:56.900 --> 00:14:00.720
But I'll forget to make sure that the version's in the changelog.

00:14:00.920 --> 00:14:08.140
I'll forget to push the tags to GitHub because I don't really use the tags, the version tags in GitHub.

00:14:08.140 --> 00:14:09.280
But I know other people do.

00:14:09.280 --> 00:14:10.920
Yeah, that's nice.

00:14:10.920 --> 00:14:14.900
You know, Will, what do you think as someone who ships libraries frequently that matter?

00:14:14.900 --> 00:14:16.060
I think it's useful.

00:14:16.060 --> 00:14:20.540
I think for my libraries, I've got the version in two places, two files.

00:14:21.700 --> 00:14:25.560
So, for me, it's like edit two files and I'm done.

00:14:25.560 --> 00:14:29.920
Probably wouldn't be like massive time saver.

00:14:29.920 --> 00:14:34.080
But I like the other things you can do with it, the actions you can attach to it.

00:14:34.080 --> 00:14:37.660
Like creating a tag in GitHub.

00:14:37.660 --> 00:14:40.280
So, I do often, quite often forget that.

00:14:40.280 --> 00:14:41.700
Especially for like minor releases.

00:14:42.340 --> 00:14:44.160
I sometimes forget that.

00:14:44.160 --> 00:14:45.000
So, that's quite useful.

00:14:45.000 --> 00:14:46.220
Yeah, it's the extra stuff.

00:14:46.220 --> 00:14:47.520
It's not just changing the files.

00:14:47.520 --> 00:14:52.060
But like Brian described, like creating a branch, creating a tag, pushing all that stuff over,

00:14:52.060 --> 00:14:53.060
making sure they're in sync.

00:14:53.060 --> 00:14:53.640
That's pretty cool.

00:14:53.640 --> 00:14:54.200
Yeah.

00:14:54.200 --> 00:14:55.140
Yeah, good find.

00:14:55.140 --> 00:14:57.460
This does more than I expected when I saw the title.

00:14:57.460 --> 00:14:58.480
What do we go next?

00:14:58.480 --> 00:14:59.160
Will.

00:14:59.160 --> 00:15:00.160
Yeah, okay.

00:15:00.160 --> 00:15:00.900
It goes off on your first one.

00:15:00.900 --> 00:15:06.960
This is Close Ember, which is, what's the purpose?

00:15:06.960 --> 00:15:08.900
Portmanteau is when you put two words together.

00:15:08.900 --> 00:15:10.360
November and close.

00:15:11.060 --> 00:15:18.180
The idea is to help open source maintainers close issues and close PRs.

00:15:18.180 --> 00:15:21.960
So, is this like to recover from the hangover of Hacktober?

00:15:21.960 --> 00:15:22.620
Hacktober.

00:15:22.620 --> 00:15:23.700
I think so.

00:15:23.700 --> 00:15:26.760
I didn't do Hacktober this year.

00:15:26.760 --> 00:15:27.640
I didn't either, no.

00:15:27.640 --> 00:15:28.060
No.

00:15:28.060 --> 00:15:32.520
Last year, I mean, I got a lot of PRs coming in.

00:15:32.520 --> 00:15:35.220
Some of them are of dubious quality.

00:15:35.220 --> 00:15:39.880
Some of them just, some of them are very good, actually.

00:15:40.040 --> 00:15:45.240
I did actually benefit a lot, but it does actually generate extra work.

00:15:45.240 --> 00:15:47.280
If you manage it, it's really great.

00:15:48.160 --> 00:15:52.600
But this is, it generates more work for you, even though it's in your benefit.

00:15:52.600 --> 00:15:57.600
But Close Ember is purely to take work away from you, work away from maintainers.

00:15:59.200 --> 00:16:00.320
You know, there's lots of issues.

00:16:00.320 --> 00:16:06.740
I mean, I've been very busy lately and not kept an eye on the rich issues, and they've just piled up.

00:16:07.440 --> 00:16:10.440
Some of them can be closed with a little bit of effort.

00:16:10.440 --> 00:16:15.620
So, I think that's what this project is more of a movement than a project designed to do.

00:16:15.620 --> 00:16:20.100
It's designed to take away some of that burden from maintainers.

00:16:21.100 --> 00:16:24.240
And it's a very nice website here.

00:16:24.240 --> 00:16:27.760
There's a leaderboard on different issues.

00:16:28.300 --> 00:16:34.400
And it describes what you should do to close issues and PRs.

00:16:34.400 --> 00:16:38.960
The author, his name is Matthias Boussounier.

00:16:38.960 --> 00:16:40.600
I've probably mispronounced that.

00:16:40.600 --> 00:16:45.700
He started this, and I think it's going to turn into a movement.

00:16:45.700 --> 00:16:51.880
Possibly it's too soon to really get big this year.

00:16:52.100 --> 00:16:54.860
But I'm hoping that next year, it'll be a big thing.

00:16:54.860 --> 00:17:06.860
It'll be after Hacktober, you can relax a bit because someone, you know, get lots of people coming in to, like, fix your issues and clear some PRs and things like that.

00:17:06.860 --> 00:17:08.500
I mean, sometimes it's maintenance.

00:17:08.500 --> 00:17:17.220
It's just tidying up, closing PRs, which have been merged, and closing issues, which have been fixed, that kind of thing.

00:17:17.220 --> 00:17:18.540
So, I think it's a great thing.

00:17:18.540 --> 00:17:20.900
I guess I don't quite get what it is.

00:17:20.900 --> 00:17:24.280
Is it a call out to people to help maintainers?

00:17:24.280 --> 00:17:24.780
Yeah.

00:17:24.780 --> 00:17:25.340
Yeah.

00:17:25.340 --> 00:17:29.840
It's like a month-long thing, and it's almost like a competition that they've given.

00:17:29.840 --> 00:17:31.540
Yeah, they've got a leaderboard, right?

00:17:31.540 --> 00:17:32.000
Yeah.

00:17:32.000 --> 00:17:32.620
Yeah.

00:17:32.620 --> 00:17:33.180
Yeah.

00:17:33.180 --> 00:17:40.560
Matthias is a core developer of Jupyter and IPython, so he's definitely working on some of the main projects there.

00:17:40.560 --> 00:17:40.900
Yeah.

00:17:40.900 --> 00:17:45.920
He probably understands the burden of open source maintainer.

00:17:45.920 --> 00:17:51.120
Even if you love something, it can be hard work.

00:17:51.120 --> 00:17:53.260
Too much of a good thing, right?

00:17:53.260 --> 00:17:56.140
But no T-shirt for this, at least not this year.

00:17:56.140 --> 00:17:57.780
I don't think they offer T-shirts.

00:17:57.780 --> 00:17:59.120
No, maybe next year.

00:17:59.120 --> 00:18:01.720
I wonder if you can add your project to this.

00:18:01.720 --> 00:18:06.360
I think you can tag your project with Closeember.

00:18:06.360 --> 00:18:07.480
I think that's how it works.

00:18:07.860 --> 00:18:13.200
And then other people can search for it and decide which one they want to help with.

00:18:13.200 --> 00:18:13.720
All right.

00:18:13.720 --> 00:18:14.280
That's pretty cool.

00:18:14.640 --> 00:18:17.300
So another Brian, Brian Skin, sent over.

00:18:17.300 --> 00:18:18.180
Thank you, Brian.

00:18:18.180 --> 00:18:20.740
He's been sitting in a ton of stuff our way lately, and we really appreciate it.

00:18:20.740 --> 00:18:21.060
Yeah.

00:18:21.060 --> 00:18:21.540
Keep it coming.

00:18:21.540 --> 00:18:27.700
So this one is, the announcement is that scikit-learn goes 1.0.

00:18:27.700 --> 00:18:36.600
And if you look at the version history, it's been zero for, zero-ver for a long time with being, you know, 0.20, 0.21, 0.22.

00:18:36.600 --> 00:18:44.020
So this release is really a realization that the library has been super stable for a long time.

00:18:44.020 --> 00:18:52.220
But here's a signal to everyone consuming scikit-learn that, in fact, we intended, they intended to be stable, right?

00:18:52.220 --> 00:18:59.440
So there's certain groups and organizations that just perceive zero-ver stuff as not finished,

00:18:59.440 --> 00:19:05.900
especially in the enterprise space, in the places that are not typically working in open source as much,

00:19:05.900 --> 00:19:07.280
but are bringing these libraries in.

00:19:07.280 --> 00:19:09.420
You can see managers, like, we can't use scikit-learn.

00:19:09.420 --> 00:19:10.180
It's not even done.

00:19:10.180 --> 00:19:11.560
0.24.

00:19:11.560 --> 00:19:12.080
Come on.

00:19:12.080 --> 00:19:12.480
All right.

00:19:12.480 --> 00:19:17.280
So this sort of closes that gap as well, signals that the API is pretty stable.

00:19:17.280 --> 00:19:22.180
Will, Textual is not quite ready for this, is it yet?

00:19:22.180 --> 00:19:30.800
No, it's still on zero because I'm kind of advertising that I might change a signature next version and break your code.

00:19:30.800 --> 00:19:33.840
Never do that lightly, but it's always a possibility.

00:19:34.300 --> 00:19:43.400
So if you use a zero-point version bit of anything, you should probably pin that and just make sure that if there's an update that you check your code.

00:19:43.400 --> 00:19:44.280
Right.

00:19:44.280 --> 00:19:53.980
As a consumer of Rich or a consumer of Blask or a consumer of whatever, if you're using a zero-ver, you're recommending you pin that in your application or library that uses it, right?

00:19:53.980 --> 00:19:55.480
Yeah, exactly.

00:19:55.480 --> 00:20:00.920
I mean, you might want to pin anyway just to, you know, lots of bits of software working together.

00:20:00.920 --> 00:20:05.460
There could be problems with one update here that breaks this bit of software here.

00:20:06.200 --> 00:20:16.240
But when you've got 1.0, that's the library developer is telling you, I'm not going to break anything backwards compatibility without bumping that major version number.

00:20:16.720 --> 00:20:23.280
If they're using Semver, but because there's lots of other versioning schemes that have the pros and cons.

00:20:23.280 --> 00:20:26.560
Yeah, like calendar-based versioning and stuff like that, right?

00:20:26.560 --> 00:20:27.020
Yeah.

00:20:27.020 --> 00:20:27.440
Yeah.

00:20:27.840 --> 00:20:31.720
I think that makes more sense in an application than it does in a library.

00:20:31.720 --> 00:20:33.860
Calendar versioning.

00:20:33.860 --> 00:20:35.240
I think it might do, actually.

00:20:35.240 --> 00:20:38.100
How much calendar versioning makes sense for libraries?

00:20:38.100 --> 00:20:38.680
Maybe it does.

00:20:38.680 --> 00:20:39.140
I don't know.

00:20:39.140 --> 00:20:47.680
I think some projects that have shifted to Calver have recognized that they really are almost never changing backwards compatibility.

00:20:47.680 --> 00:20:53.080
So they're never going to go to a higher number.

00:20:53.080 --> 00:20:53.700
Yeah.

00:20:53.700 --> 00:20:55.600
It's strange that there's no one perfect system.

00:20:56.660 --> 00:21:01.420
I quite like Semver, but by and large, it does what I need of it.

00:21:01.420 --> 00:21:03.980
But there is no perfect system, really.

00:21:03.980 --> 00:21:05.880
Yeah, I like it as well.

00:21:05.880 --> 00:21:10.880
Just the whole zero verb being for like something is on zero version, zero dot something for 15 years.

00:21:10.880 --> 00:21:11.780
Like that doesn't make sense.

00:21:11.780 --> 00:21:12.180
Yeah.

00:21:12.180 --> 00:21:12.440
All right.

00:21:12.440 --> 00:21:19.940
So as we're talking about the 1.0 release of scikit-learn, let me give a quick shout out to some of the new features or some of the features they're highlighting.

00:21:20.200 --> 00:21:27.700
So it exposes many functions and methods which take lots of parameters like hist gradient boosting regressor.

00:21:27.700 --> 00:21:28.860
Use that all the time.

00:21:28.860 --> 00:21:29.420
No, not really.

00:21:29.420 --> 00:21:32.160
But it takes, I don't know, was that 15 parameters?

00:21:32.160 --> 00:21:36.060
Like 20, zero, 255, none, none, false.

00:21:36.060 --> 00:21:36.940
What?

00:21:36.940 --> 00:21:38.360
Like what are these, right?

00:21:38.660 --> 00:21:45.240
And so a lot of these are moving to require you to explicitly say min sample leaf is 20.

00:21:45.240 --> 00:21:47.660
L2 regularization is zero.

00:21:47.660 --> 00:21:48.920
Max bins is 255.

00:21:48.920 --> 00:21:51.640
Like keyword arguments to make it more readable and clear.

00:21:51.920 --> 00:21:56.220
I like to make virtually all my arguments keyword only.

00:21:56.220 --> 00:22:00.440
I might have one or two positional arguments, but the rest, keyword only.

00:22:00.440 --> 00:22:03.620
I think it makes code more descriptive.

00:22:03.620 --> 00:22:08.580
You can look at that code and then you know at a glance what this argument does.

00:22:08.580 --> 00:22:09.780
Yeah, absolutely.

00:22:09.780 --> 00:22:16.440
Yeah, it drives me nuts when there's like, I want all the defaults except for like something special at the last one.

00:22:16.440 --> 00:22:19.380
And so I've got to like fill in all of them just to hit that.

00:22:19.380 --> 00:22:24.760
And also I would love to throw out that this is way better than star star kwa args.

00:22:24.760 --> 00:22:26.080
Way better, right?

00:22:26.080 --> 00:22:32.540
If you've got 10 optional parameters that have maybe defaults or don't need to have a specified value, make them keyword arguments.

00:22:32.540 --> 00:22:38.540
It means that the tooling like PyCharm and VS Code will show you autocomplete for these.

00:22:38.540 --> 00:22:43.540
I mean, if it's truly open-ended and you don't know what could be passed, star star kwa args.

00:22:43.540 --> 00:22:47.660
But if you do know what could be passed, something like this is way better as well.

00:22:47.660 --> 00:22:49.080
Very much more exclusive.

00:22:49.080 --> 00:22:50.660
Yeah, you have to type more.

00:22:50.660 --> 00:22:56.300
If you've got like a signature which takes the same parameter or something else, you just have to type it all over again.

00:22:56.300 --> 00:22:57.180
It can be a bit tedious.

00:22:57.180 --> 00:23:01.740
But it's very beneficial, I think, for the tooling, like you said.

00:23:01.740 --> 00:23:02.360
Indeed.

00:23:02.360 --> 00:23:04.300
Also for typing, right?

00:23:04.300 --> 00:23:08.200
You can say that this keyword argument thing is an integer and that one's a string, right?

00:23:08.240 --> 00:23:10.820
And if it's star star kwa args, you're just any, any.

00:23:10.820 --> 00:23:11.140
Great.

00:23:11.140 --> 00:23:11.480
Okay.

00:23:11.480 --> 00:23:12.440
Or string any.

00:23:12.440 --> 00:23:13.160
Okay.

00:23:13.160 --> 00:23:15.960
So we also have new spline transformers.

00:23:15.960 --> 00:23:20.280
So you can create spline bezier curves, which is cool.

00:23:20.280 --> 00:23:23.000
Quintile regressor is updated.

00:23:23.000 --> 00:23:24.600
Feature name support.

00:23:25.080 --> 00:23:33.640
So when you're doing an estimator pass to a pandas data frame during a fit, it will, estimator will set up feature names in attribute containing the feature names.

00:23:33.640 --> 00:23:34.020
Right?

00:23:34.020 --> 00:23:34.780
So that's pretty cool.

00:23:34.780 --> 00:23:36.100
Different examples of that.

00:23:36.100 --> 00:23:38.200
A more flexible plotting API.

00:23:38.200 --> 00:23:42.260
Online one class SVM for all sorts of cool graphs.

00:23:42.260 --> 00:23:46.360
Histogram based gradient boosting models are stable and new documentation.

00:23:46.420 --> 00:23:50.220
And of course you can launch it in a binder and play with it, which is pretty sweet.

00:23:50.220 --> 00:23:52.180
Congrats to the scikit learn folks.

00:23:52.180 --> 00:23:53.220
That's very nice.

00:23:53.220 --> 00:23:59.100
And also kind of interesting to get your take on API changes and versioning and stuff, Will.

00:23:59.100 --> 00:24:04.520
Oh, before we move on, Brian, I saw a quick question that maybe makes sense to throw over to Will from Anu.

00:24:04.520 --> 00:24:04.920
Don't go.

00:24:04.920 --> 00:24:07.420
Everybody keeps asking this.

00:24:07.420 --> 00:24:09.460
So I've ordered a Windows laptop.

00:24:09.460 --> 00:24:12.700
For everyone listening, the question is when will there be Windows support for Textual?

00:24:12.700 --> 00:24:13.280
Yeah.

00:24:13.280 --> 00:24:14.620
I've ordered a Windows laptop.

00:24:15.180 --> 00:24:19.160
I've been working on a VM, but it's a pain to work on a VM.

00:24:19.160 --> 00:24:22.600
I've ordered a Windows laptop and that's going to arrive at the end of this month.

00:24:22.600 --> 00:24:29.140
And I don't know exactly when, but that'll definitely need that to get started.

00:24:29.140 --> 00:24:33.400
And in Siri, it should only be a week or two of work.

00:24:33.400 --> 00:24:36.240
So how about I say this year?

00:24:36.240 --> 00:24:36.840
This year.

00:24:36.840 --> 00:24:39.740
After the month of configuring your laptop.

00:24:39.740 --> 00:24:40.680
That's true.

00:24:40.680 --> 00:24:41.480
That's true.

00:24:41.480 --> 00:24:44.860
I haven't used Windows in I don't know how long apart from a VM.

00:24:44.860 --> 00:24:49.700
I need to test it with a new Windows terminal, which is actually really, really good.

00:24:49.700 --> 00:24:50.440
Yeah.

00:24:50.440 --> 00:24:51.320
The Windows terminal is good.

00:24:51.320 --> 00:24:52.160
Yeah.

00:24:52.160 --> 00:24:57.000
I think it can be like a first class, like textual platform.

00:24:57.000 --> 00:25:00.320
The Mac works great.

00:25:00.320 --> 00:25:01.160
Linux works great.

00:25:01.160 --> 00:25:03.460
Windows has always been like a bit of a black sheep.

00:25:03.980 --> 00:25:09.440
But the new Windows terminal is a godsend because the old terminal was frankly terrible.

00:25:09.440 --> 00:25:10.860
It hadn't been updated in decades.

00:25:10.860 --> 00:25:11.460
Yeah.

00:25:11.460 --> 00:25:13.320
The old school one is no good.

00:25:13.320 --> 00:25:14.940
But the new Windows terminal is really good.

00:25:14.940 --> 00:25:18.040
Also, just a quick shout out for some support here.

00:25:18.040 --> 00:25:19.600
Nice comment to Shar.

00:25:19.600 --> 00:25:24.000
Windows support will be provided when you click the pink button on Will's GitHub profile,

00:25:24.140 --> 00:25:25.400
aka the sponsor button.

00:25:25.400 --> 00:25:29.660
It's not a ransom, I promise.

00:25:29.660 --> 00:25:31.300
I do intend to do it.

00:25:31.300 --> 00:25:33.400
All right.

00:25:33.400 --> 00:25:35.980
How about some server stuff?

00:25:35.980 --> 00:25:40.180
We talked, I can't remember, I think several times talked about how to use,

00:25:40.180 --> 00:25:42.800
how to develop packages while you're offline.

00:25:42.800 --> 00:25:47.220
Let's say you're on an airplane or at the beach or something with no Wi-Fi.

00:25:47.220 --> 00:25:51.080
I mean, maybe there's Wi-Fi at the beach, but not at the beaches I go to.

00:25:51.080 --> 00:25:57.040
That's because you live in Oregon and some of the most rural parts are the beach.

00:25:57.040 --> 00:25:58.660
If this was California, you'd have 5G.

00:25:58.660 --> 00:25:59.280
Yeah.

00:25:59.280 --> 00:26:01.980
Well, I mean, I could tether my phone to it or something.

00:26:01.980 --> 00:26:10.140
But anyway, so Jason Coombs sent over an article using DevPy as an offline PyPI cache.

00:26:10.140 --> 00:26:15.560
And I got to tell you, to be honest, I don't know if it's just the documentation for DevPy

00:26:15.560 --> 00:26:17.220
or the other tutorials.

00:26:17.220 --> 00:26:22.560
It just threw out a few commands and they're like, you're good.

00:26:22.560 --> 00:26:23.560
That'll work.

00:26:23.560 --> 00:26:25.260
And I just never got it.

00:26:25.260 --> 00:26:27.380
I've tried and it just didn't work for me.

00:26:27.380 --> 00:26:28.440
But this did.

00:26:28.440 --> 00:26:32.960
So this tutorial is just a straightforward, okay, we're just going to walk you through

00:26:32.960 --> 00:26:34.680
exactly everything you do.

00:26:34.680 --> 00:26:36.120
It's really not that much.

00:26:36.420 --> 00:26:42.780
For instance, he suggests using PipX to install DevPy server, which is nice.

00:26:42.780 --> 00:26:47.060
The T-Bump package as well suggested installing itself with PipX.

00:26:47.060 --> 00:26:49.180
PipX is gaining a lot of momentum.

00:26:49.180 --> 00:26:55.540
Well, especially things like, well, like, yeah, T-Bump or, well, or DevPy.

00:26:55.540 --> 00:26:59.060
I don't know if I'd do it with T-Bump because I want other package maintainers to be able to

00:26:59.060 --> 00:26:59.760
use it too.

00:26:59.760 --> 00:27:02.960
But anyway, this is definitely something you're just using on your own machine.

00:27:02.960 --> 00:27:04.960
So why not let it sit there?

00:27:05.560 --> 00:27:10.980
And then, so you install it, you init it, and it creates some stuff.

00:27:10.980 --> 00:27:12.960
I don't know what it does when you init it.

00:27:12.960 --> 00:27:18.800
But then you, hidden in here is you run DevPy server also then.

00:27:18.800 --> 00:27:21.920
So it really is just a few commands and you get a server running.

00:27:21.920 --> 00:27:23.380
But there's nothing in it.

00:27:23.380 --> 00:27:25.280
There's no cache in it yet.

00:27:25.280 --> 00:27:31.340
So then you have to, you have to go somewhere else and then prime it.

00:27:31.340 --> 00:27:35.220
So you've got a local host and you, that it, it, it reports.

00:27:35.220 --> 00:27:40.660
So you can export that as your pip index and then just create a virtual environment and start

00:27:40.660 --> 00:27:41.400
installing stuff.

00:27:41.400 --> 00:27:42.320
That's all you got to do.

00:27:42.460 --> 00:27:44.520
And now, now it's all primed.

00:27:44.520 --> 00:27:48.880
And then what you do is you turn off when, next time when you're, when you don't have any wifi,

00:27:48.880 --> 00:27:56.120
you turn off, you can run the DevPy server as, where is it?

00:27:56.120 --> 00:27:57.940
DevPy offline mode.

00:27:58.660 --> 00:28:00.300
And then there you have it.

00:28:00.300 --> 00:28:03.000
You've got a cache of everything you need.

00:28:03.000 --> 00:28:08.720
So I tried this out, just on like, like, you know, installing pytest for my plugins

00:28:08.720 --> 00:28:14.740
and then, set it in offline mode and then, try it in the, all the installing the normal

00:28:14.740 --> 00:28:18.000
stuff that I just did worked fine into a new, new virtual environment.

00:28:18.000 --> 00:28:22.800
But then when I tried to do something like, install requests that I didn't have yet

00:28:22.800 --> 00:28:27.900
or something else, it just said, Oh, that's not, it's not a, I can't find it or something.

00:28:27.900 --> 00:28:29.180
It's a happy failure.

00:28:29.180 --> 00:28:31.680
So anyway, this, this instruction worked great.

00:28:31.680 --> 00:28:36.140
I know DevPy can be, do a whole bunch of other stuff, but I don't need it to do a whole bunch

00:28:36.140 --> 00:28:36.840
of stuff myself.

00:28:36.840 --> 00:28:38.980
I just need it to be a IPI cache.

00:28:39.660 --> 00:28:40.840
Yeah, this is really neat.

00:28:40.840 --> 00:28:48.440
The init looks like it creates the database schema as well as allows you to set up, set

00:28:48.440 --> 00:28:48.960
up a user.

00:28:48.960 --> 00:28:49.640
Okay.

00:28:49.640 --> 00:28:53.880
I guess you could, you set up with some authentication that no one can mess with it and stuff like

00:28:53.880 --> 00:28:54.120
that.

00:28:54.120 --> 00:28:57.140
Apparently this works just fine for teams.

00:28:57.140 --> 00:29:02.980
So you can set up, set up a server on like a, on just like a computer that in your

00:29:02.980 --> 00:29:05.600
network that, just runs as a cache.

00:29:05.600 --> 00:29:08.040
And then you can point, everybody can point to the same one.

00:29:08.160 --> 00:29:13.620
So, I mean, that, that, that would work as a really quick and dirty and not too dirty,

00:29:13.620 --> 00:29:17.780
just a fairly quick way for a local team to, to have a caching server.

00:29:17.780 --> 00:29:23.040
I'd probably even think about doing this for testing, even on one machine so that

00:29:23.040 --> 00:29:27.300
you can have multiple, like, you know, completely clean out your environments and still run,

00:29:27.300 --> 00:29:29.860
run a test machine and not hit the network so much.

00:29:29.860 --> 00:29:32.200
If you're pulling a lot of, a lot of different stuff.

00:29:32.200 --> 00:29:36.600
Henry Schreiner out in the live stream says, can we also mention that Jason, the article

00:29:36.600 --> 00:29:41.640
we're just talking about also maintains 148 libraries, including setup tools on PyPI.

00:29:41.640 --> 00:29:42.960
Oh, that's awesome.

00:29:42.960 --> 00:29:47.780
So may know something about interacting with PyPI.

00:29:47.780 --> 00:29:49.540
That's phenomenal.

00:29:49.540 --> 00:29:51.100
I don't know how he finds the time to be honest.

00:29:51.100 --> 00:29:52.560
148 packages.

00:29:52.560 --> 00:29:54.480
he needs closed, closed Ember.

00:29:54.480 --> 00:29:55.780
Yeah.

00:29:55.780 --> 00:29:56.880
He needs a lot of closed Ember.

00:29:56.880 --> 00:29:58.360
Awesome.

00:29:58.500 --> 00:30:00.880
All right, well, what's this, last one you got for us here?

00:30:00.880 --> 00:30:01.500
Sure.

00:30:01.500 --> 00:30:05.780
So I found this, project on Reddit.

00:30:05.780 --> 00:30:07.860
it's called PyPI command line.

00:30:07.860 --> 00:30:12.160
And I noticed it in particular because it used rich, but it is a pretty cool project.

00:30:12.160 --> 00:30:17.080
it's notable because the author is 14 years old.

00:30:17.340 --> 00:30:19.160
Like that's blown me away.

00:30:19.160 --> 00:30:22.580
it's going to be that young and he's, he's done a very good job of it.

00:30:22.580 --> 00:30:25.780
so it's, interface to PyPI from the command line.

00:30:25.780 --> 00:30:30.900
you can do things like, get the top, top 10 packages.

00:30:30.900 --> 00:30:33.340
you can search for packages.

00:30:33.340 --> 00:30:41.480
you can say here's, I think that's a search, PyPI search rich.

00:30:41.480 --> 00:30:45.780
And that's, given all the packages that have got rich in the name, it's got a description,

00:30:45.780 --> 00:30:46.960
everything and the date.

00:30:46.960 --> 00:30:50.240
And here you can, PyPI info Django.

00:30:50.240 --> 00:30:55.000
That gives you some nice information about the Django package, which it pulls from PyPI.

00:30:55.000 --> 00:31:01.640
Like the GitHub stars, the download traffic, what it depends upon, meta information like

00:31:01.640 --> 00:31:03.060
it's licensed and who owns it.

00:31:03.060 --> 00:31:04.080
This is really cool.

00:31:04.080 --> 00:31:04.700
Yeah.

00:31:04.700 --> 00:31:05.880
It's, it's, it's really nice.

00:31:05.880 --> 00:31:10.600
here we have the description and that's rendered in, that renders the mark down right

00:31:10.600 --> 00:31:11.100
in the terminal.

00:31:11.100 --> 00:31:13.200
I wonder how it does that.

00:31:13.200 --> 00:31:16.600
I couldn't hazard a guess.

00:31:16.600 --> 00:31:18.360
It's got to use rich, right?

00:31:18.360 --> 00:31:19.780
I think it might.

00:31:19.780 --> 00:31:20.020
Yeah.

00:31:20.020 --> 00:31:21.740
And, yeah.

00:31:21.740 --> 00:31:23.900
So it's, it makes good use of rich.

00:31:23.900 --> 00:31:28.060
That's how I, how I noticed it, but it is a very cool project in its own right.

00:31:28.060 --> 00:31:30.460
It also uses, questionnaire.

00:31:30.460 --> 00:31:36.120
so that's like a, terminal thing for, for selecting stuff from, for the menu.

00:31:36.120 --> 00:31:41.020
so it does a bit dynamically and also has like a command line.

00:31:41.020 --> 00:31:45.180
to do it more from the, the, all the terminal.

00:31:45.180 --> 00:31:46.320
Yeah.

00:31:46.320 --> 00:31:48.600
I think it's well worth, checking out.

00:31:48.600 --> 00:31:53.740
I think I want to check it out just for an example of using, using this sort of a workflow,

00:31:53.740 --> 00:31:57.280
not necessarily with PYPI, but with just sort of copying the codes.

00:31:57.640 --> 00:31:58.040
Yeah.

00:31:58.040 --> 00:31:58.660
Yeah.

00:31:58.660 --> 00:32:01.720
It's a really nice looking terminal user interface type thing.

00:32:01.720 --> 00:32:06.200
I think it could be really interesting for you to me, Brian, to just do like info on the

00:32:06.200 --> 00:32:07.240
various things we're talking about.

00:32:07.240 --> 00:32:07.420
Right.

00:32:07.420 --> 00:32:09.780
That'll, that might be fun to pull up as well.

00:32:09.780 --> 00:32:10.280
Yeah.

00:32:10.280 --> 00:32:13.620
And there's, there's actually tons of times where I don't, I don't really want to pull up

00:32:13.620 --> 00:32:17.360
a web browser just to put up, but I do want more information just to help.

00:32:17.580 --> 00:32:21.820
I love the web, but sometimes you have to do a context, which if you're in the terminal,

00:32:21.820 --> 00:32:26.440
you're, you're writing commands and then you've got to like, switch windows and find the

00:32:26.440 --> 00:32:28.500
title, the bar and type everything in.

00:32:28.500 --> 00:32:34.600
it's just a little bit of effort, but it can kind of like interrupt your, your flow when

00:32:34.600 --> 00:32:35.080
you are working.

00:32:35.080 --> 00:32:35.700
Yeah.

00:32:35.700 --> 00:32:38.940
I mean, especially when you got like the whole, I've got like a big monitor and I've got

00:32:38.940 --> 00:32:41.160
them all, everything in place exactly where I want it.

00:32:41.160 --> 00:32:42.480
And there's no web browser.

00:32:42.480 --> 00:32:45.880
So if I want to look something up, I got to like, you know, interrupt that.

00:32:45.880 --> 00:32:46.360
Yeah.

00:32:46.360 --> 00:32:52.120
Or the browser he wants there, but it's behind a dozen other windows, dozen other web browsers

00:32:52.120 --> 00:32:52.600
typically.

00:32:52.600 --> 00:32:54.520
Exactly.

00:32:54.520 --> 00:32:55.200
Yeah.

00:32:55.200 --> 00:32:55.920
That's a good find.

00:32:55.920 --> 00:33:00.460
And, well done to this, this guy who wrote it at such a young age.

00:33:00.460 --> 00:33:00.820
Very cool.

00:33:00.820 --> 00:33:03.900
I was just going to ask you if you have an extras, thing.

00:33:03.900 --> 00:33:04.400
So, yep.

00:33:04.400 --> 00:33:05.540
Do I have any extras?

00:33:05.540 --> 00:33:06.520
Ta-da!

00:33:06.520 --> 00:33:08.140
Here's my little banner extras.

00:33:08.140 --> 00:33:10.800
I, I do have some actually, Brian, a quick shout out.

00:33:10.960 --> 00:33:17.980
Madison sent over a notice to let us know that high cascades 2022, their call for

00:33:17.980 --> 00:33:19.180
proposals is out.

00:33:19.180 --> 00:33:24.540
So if people want to sign up for that, it closes October 24th.

00:33:24.540 --> 00:33:29.980
So, you know, make haste, you've got four days, but yeah, still, closes in four days.

00:33:29.980 --> 00:33:30.480
Yeah.

00:33:30.480 --> 00:33:32.820
So if you're thinking of preparing something, you got three days.

00:33:32.820 --> 00:33:34.240
Talks are 25 minutes long.

00:33:34.240 --> 00:33:34.900
It was a lot of fun.

00:33:34.900 --> 00:33:40.000
You know, we both attended this conference a few times it in the before times it was in Portland,

00:33:40.460 --> 00:33:41.520
Seattle and Vancouver.

00:33:41.520 --> 00:33:44.540
this, I'm not sure what the story is with this one.

00:33:44.540 --> 00:33:45.880
If it's going to be in person.

00:33:45.880 --> 00:33:47.140
I think it's remote, right?

00:33:47.140 --> 00:33:47.380
Yeah.

00:33:47.380 --> 00:33:48.260
I think so.

00:33:48.260 --> 00:33:49.980
At least I hope I'm not wrong.

00:33:49.980 --> 00:33:50.420
Yeah.

00:33:50.420 --> 00:33:51.000
I think you're right.

00:33:51.000 --> 00:33:54.660
Then, have you got your Mac book, your, M1 max?

00:33:54.660 --> 00:33:55.900
Have you ordered that yet?

00:33:55.900 --> 00:33:57.700
I want one, but no.

00:33:57.700 --> 00:33:59.540
The $3,000.

00:34:00.320 --> 00:34:02.340
I would love one, but I have no idea what I'd do with it.

00:34:02.340 --> 00:34:04.680
You know, I'll, I just work in the terminal most of the time.

00:34:04.680 --> 00:34:09.580
Hey, you know, it has that new pro, was it pro res?

00:34:09.580 --> 00:34:14.400
Something display where it has 120 adaptive, display Hertz display.

00:34:14.700 --> 00:34:15.760
So, you know, maybe.

00:34:15.760 --> 00:34:18.520
I think my monitor only does 60.

00:34:18.520 --> 00:34:23.840
So I don't know if I could use it, but, I have actually got textual running at 120 frames

00:34:23.840 --> 00:34:24.320
per second.

00:34:24.320 --> 00:34:26.200
which is pretty crazy.

00:34:26.700 --> 00:34:26.840
Yeah.

00:34:26.840 --> 00:34:27.440
That's pretty crazy.

00:34:27.440 --> 00:34:32.400
I did end up ordering one and, on my Apple account, I have this really cool message.

00:34:32.400 --> 00:34:33.900
It says your order will be available soon.

00:34:33.900 --> 00:34:37.120
MacBook pro available ship available to ship null.

00:34:37.120 --> 00:34:38.840
So, we'll see where that goes.

00:34:38.840 --> 00:34:41.980
See where that goes.

00:34:41.980 --> 00:34:47.200
But I think, I should have think how many people's orders I would be getting.

00:34:47.200 --> 00:34:49.180
I would get just like a stack of boxes outside.

00:34:49.180 --> 00:34:50.520
Did that Amazon or something?

00:34:50.520 --> 00:34:50.900
Yeah.

00:34:50.900 --> 00:34:54.020
and then I think also, I want to give a quick shout out to this thing.

00:34:54.140 --> 00:35:01.360
This, code weavers crossover, which allows you to run windows apps natively on macOS

00:35:01.360 --> 00:35:02.800
without a virtual machine.

00:35:02.800 --> 00:35:04.900
It's like a, it's like an intermediate layer.

00:35:04.900 --> 00:35:08.200
So I think that that kind of stuff is going to get real popular, especially since the new

00:35:08.200 --> 00:35:12.720
M ones have like a super crappy story for windows as a virtual machine.

00:35:12.720 --> 00:35:17.100
Cause windows has a crappy arm story and you can only do our VMs over there.

00:35:17.100 --> 00:35:20.100
So I think that, things like this are going to become really popular.

00:35:20.100 --> 00:35:21.560
There's a bunch of cool stuff.

00:35:21.560 --> 00:35:24.120
If people haven't checked out this crossover stuff, I haven't really done much.

00:35:24.120 --> 00:35:25.620
in it, but it looks super promising.

00:35:25.620 --> 00:35:29.040
I've like been on the verge of like, I almost need this, but I just run into VM.

00:35:29.040 --> 00:35:29.740
That's that.

00:35:29.740 --> 00:35:30.820
Anyway, those are my extras.

00:35:30.820 --> 00:35:31.480
Okay.

00:35:31.780 --> 00:35:34.020
Well, I've got a couple.

00:35:34.020 --> 00:35:36.240
we've, we've brought up starship.

00:35:36.240 --> 00:35:39.680
Once I just, I broke down and I'm using starship.

00:35:39.680 --> 00:35:41.340
Now it looks working nice.

00:35:41.500 --> 00:35:46.700
And one of the things that installed when I, when I grew installed starship, it also installed

00:35:46.700 --> 00:35:47.380
I end.

00:35:47.380 --> 00:35:48.480
I'm not sure why.

00:35:48.480 --> 00:35:53.200
So I started using my, I have also it was still in pain works great.

00:35:53.200 --> 00:35:57.360
I like it on my Mac, but I still don't think it belongs in Python tutorials.

00:35:58.000 --> 00:36:03.040
Anyway, burning still out on me whether or not it's any better than just downloading

00:36:03.040 --> 00:36:03.820
off of org.

00:36:03.820 --> 00:36:05.060
You're going to get tweets, Brian.

00:36:05.060 --> 00:36:05.820
You're going to get tweets.

00:36:05.820 --> 00:36:08.460
But I agree with you.

00:36:08.460 --> 00:36:09.460
I support you on this.

00:36:09.460 --> 00:36:14.900
And so, one of the things that was announced today is, VS Code.dev is a thing.

00:36:15.300 --> 00:36:18.600
so I thought it was already there, but apparently this is new.

00:36:18.600 --> 00:36:24.920
if you go to VS Code.dev, it is, just VS Code in the browser.

00:36:24.920 --> 00:36:25.980
Oh, interesting.

00:36:25.980 --> 00:36:27.420
I think it was already there.

00:36:27.420 --> 00:36:27.680
Where does it execute?

00:36:27.680 --> 00:36:30.480
And where, where, where's your file system and stuff like that?

00:36:30.480 --> 00:36:34.860
Well, I think it's the same as like the GitHub code spaces.

00:36:34.860 --> 00:36:35.120
You press dot.

00:36:35.120 --> 00:36:35.680
Yeah.

00:36:35.680 --> 00:36:36.320
Okay.

00:36:36.320 --> 00:36:36.700
Got it.

00:36:36.700 --> 00:36:37.760
so.

00:36:37.760 --> 00:36:40.980
It can use the local file system though, which I think is a difference.

00:36:40.980 --> 00:36:44.780
GitHub had this thing where you hit dot and it, it brought up,

00:36:45.140 --> 00:36:47.680
a VS Code, which worked with the files in your repo.

00:36:47.680 --> 00:36:52.040
But I think with this, it can actually use your local, file system.

00:36:52.040 --> 00:36:52.860
Wow.

00:36:52.860 --> 00:36:53.660
Yeah.

00:36:53.660 --> 00:36:55.120
Which makes it more interesting.

00:36:55.120 --> 00:36:57.280
I mean, it's great if you work on another computer and you just pop it open,

00:36:57.280 --> 00:36:58.420
you've got all your settings there.

00:36:58.420 --> 00:36:59.340
Yeah, exactly.

00:36:59.340 --> 00:37:00.200
And boom, you're ready to go.

00:37:00.200 --> 00:37:00.620
Yeah.

00:37:00.620 --> 00:37:03.220
Oh, that actually is quite a bit different then.

00:37:03.220 --> 00:37:03.840
That's pretty cool.

00:37:03.840 --> 00:37:04.280
Yeah.

00:37:04.280 --> 00:37:08.440
Two use cases for me that, that I think I would use this, that seem really nice.

00:37:08.440 --> 00:37:12.120
One is I'm working like, say on my daughter's computer.

00:37:12.120 --> 00:37:14.020
She's like, dad, help me with this file.

00:37:14.020 --> 00:37:15.120
You know, there's help me with,

00:37:15.120 --> 00:37:19.320
something and I've got to open some file in a way that has some form of structure.

00:37:19.320 --> 00:37:22.280
And I, you know, she doesn't have VS Code set up on her computer.

00:37:22.280 --> 00:37:23.020
She's in middle school.

00:37:23.020 --> 00:37:23.580
She doesn't care.

00:37:23.580 --> 00:37:29.000
but I could just fire this up and, you know, look at some file in a non-terrible way.

00:37:29.000 --> 00:37:29.580
Right.

00:37:29.580 --> 00:37:30.240
That would be great.

00:37:30.240 --> 00:37:31.600
The other is on my iPad.

00:37:31.600 --> 00:37:32.360
Oh yeah.

00:37:32.360 --> 00:37:32.960
Right.

00:37:32.960 --> 00:37:35.420
Like there's not a good, super good story for that.

00:37:35.420 --> 00:37:39.980
But this kind of like VS Code in the browser, other things in the browser, they seem really nice.

00:37:40.120 --> 00:37:42.240
Or if I was on a Chromebook or something like that, right?

00:37:42.240 --> 00:37:45.000
If I was trying to help somebody with code on a Chromebook, that'd be good.

00:37:45.000 --> 00:37:45.820
How about you, Will?

00:37:45.820 --> 00:37:46.880
Do you have any extras for us?

00:37:46.880 --> 00:37:47.600
Here we go.

00:37:48.280 --> 00:37:50.680
Python multi-threading, without the GIL.

00:37:50.680 --> 00:37:54.120
GIL stands for, global interpreter lock.

00:37:54.120 --> 00:37:59.300
And it's something which prevents, Python threads from truly running in parallel.

00:37:59.300 --> 00:38:03.620
it's, people have been talking about this for years and I've got a bit kind of, you know,

00:38:03.620 --> 00:38:08.280
a dismissive because every time it comes up, it never seems to happen because, there's

00:38:08.280 --> 00:38:09.600
quite a lot of trade-offs generally.

00:38:09.600 --> 00:38:15.640
if you get rid of the GIL, you hurt single-threaded, performance and most things

00:38:15.640 --> 00:38:16.980
are single-threaded.

00:38:16.980 --> 00:38:24.820
but this, looks like, the author, Sam Gross has come up with, a way of

00:38:24.820 --> 00:38:28.260
removing the GIL without hurting, single-threaded performance.

00:38:28.260 --> 00:38:31.640
I think they've got, it's to do with reference counting.

00:38:31.640 --> 00:38:37.280
They've got two references, reference counts, one for, the thread which owns the object

00:38:37.280 --> 00:38:39.700
and one for all the other threads.

00:38:39.700 --> 00:38:42.440
And apparently it's, it works quite well.

00:38:42.440 --> 00:38:43.900
And the great thing about this is...

00:38:43.900 --> 00:38:48.100
Yeah, that's super creative to basically think of like, well, let's treat, the ref count

00:38:48.100 --> 00:38:49.780
as a thread local storage.

00:38:49.780 --> 00:38:52.720
And probably when that hits zero, you're like, okay, well, let's go look at the other threads

00:38:52.720 --> 00:38:54.040
and see if they're also zero.

00:38:54.040 --> 00:38:55.040
Right?

00:38:55.040 --> 00:38:56.040
Yeah.

00:38:56.040 --> 00:38:57.040
Yeah.

00:38:57.040 --> 00:39:00.640
And if this goes ahead and it's got, quite a lot of support, I think in the core

00:39:00.640 --> 00:39:04.960
dev community, I don't keep a, really strong eye on that, but, from what I

00:39:04.960 --> 00:39:07.880
from what I hear is, is, got a lot of support.

00:39:07.880 --> 00:39:13.780
And if, if that lands, then we can get a fantastic performance out of multi-threaded code.

00:39:13.780 --> 00:39:18.580
You know, if you've got 20 threads, you get almost 20 times, performance.

00:39:18.580 --> 00:39:20.380
So that, that could be huge.

00:39:20.380 --> 00:39:27.040
I've no doubt there'll be a lot of technical hurdles, from, C libraries and things.

00:39:27.040 --> 00:39:29.300
but I'm really excited about that.

00:39:29.300 --> 00:39:33.500
I think, you know, performance improvements, the single thedded, they come in little fits

00:39:33.500 --> 00:39:37.060
and starts, you know, we get 5% here, 10% here, and it's all very welcome.

00:39:37.060 --> 00:39:42.860
but if this lands, then we can get like 20 times for certain types of computing tasks.

00:39:42.860 --> 00:39:45.280
so I'm, I'm really excited.

00:39:45.280 --> 00:39:47.340
I hope this one, this one lands.

00:39:47.340 --> 00:39:48.960
I mean, you're talking about this.

00:39:48.960 --> 00:39:51.000
Oh, here, let's, let's get this multi-thread stuff.

00:39:51.060 --> 00:39:55.160
You know, you were just saying, what are we going to do with these new M1 pros and M1 max?

00:39:55.160 --> 00:39:59.220
I mean, 10 core machines, 30, 32 core GPUs.

00:39:59.220 --> 00:40:04.840
There's a lot of, a lot of stuff that's significantly difficult to take advantage of with Python, unless

00:40:04.840 --> 00:40:07.240
something like this comes into existence, right?

00:40:07.240 --> 00:40:07.760
Exactly.

00:40:07.760 --> 00:40:11.200
If you have 10 cores, chances are you'd just use one of them.

00:40:11.200 --> 00:40:16.460
I'm wondering if, if this goes in, whether it'll change, we'll need some other ways of

00:40:16.460 --> 00:40:17.500
taking advantage of that.

00:40:17.560 --> 00:40:21.960
Because, I think at the moment for most tasks, you'd have to explicitly create

00:40:21.960 --> 00:40:23.680
and launch threads.

00:40:23.680 --> 00:40:30.340
I wonder if there'll be advances where, Python could just launch threads and things

00:40:30.340 --> 00:40:32.020
which could be easily parallelized.

00:40:32.020 --> 00:40:36.740
maybe I'm, I'm hoping for, for too much, but I've, I've no doubt there'll be some kind

00:40:36.740 --> 00:40:41.540
of like software solution to help you just, launch threads and like use all those cores

00:40:41.540 --> 00:40:43.700
and your shiny new, new max.

00:40:43.700 --> 00:40:46.980
There's a lot of interesting stuff that you can do with async and await.

00:40:47.240 --> 00:40:50.700
And there's also some cool thread scheduler type things.

00:40:50.700 --> 00:40:55.820
But I think the, you know, much like Python three, when type annotations came along, there

00:40:55.820 --> 00:41:00.300
was a whole bunch of stuff that blossomed that took advantage of it, like Pydantic and fast

00:41:00.300 --> 00:41:01.040
API and stuff.

00:41:01.040 --> 00:41:06.220
I feel like that, that blossoming hasn't happened because you're really limited by the gill

00:41:06.220 --> 00:41:06.960
of the CP level.

00:41:06.960 --> 00:41:11.560
Then you go multi-processing and you have like a data exchange and compatibility issues.

00:41:11.700 --> 00:41:15.480
But if this were to go through all of a sudden people were like, all right, now how do we

00:41:15.480 --> 00:41:18.040
create these libraries that we've wanted all along?

00:41:18.040 --> 00:41:18.840
Yeah.

00:41:18.840 --> 00:41:19.420
Yeah.

00:41:19.420 --> 00:41:20.480
I think that's it.

00:41:20.480 --> 00:41:25.920
I think, once you've got over that technical hurdle, all the, all the library authors,

00:41:25.920 --> 00:41:33.780
um, will be like looking for like a creative ways of using this, for speeding code up and

00:41:33.780 --> 00:41:36.040
for just doing more with your Python.

00:41:36.500 --> 00:41:36.940
Yeah.

00:41:36.940 --> 00:41:41.800
I mean, with it, with every programming language, the jump from single threaded to multi-process

00:41:41.800 --> 00:41:43.600
is a huge overhead.

00:41:43.600 --> 00:41:48.460
So you don't do it lightly, but you could do it lightly with multi-threads.

00:41:48.460 --> 00:41:51.120
You don't have such a huge, overhead burden.

00:41:51.120 --> 00:41:52.260
It's very exciting.

00:41:52.260 --> 00:41:53.980
I was also super excited about this.

00:41:53.980 --> 00:41:55.120
So I'm glad you gave it a shout out.

00:41:55.120 --> 00:41:57.480
We'll probably come back and spend some more time on it at some point.

00:41:57.480 --> 00:41:57.960
Yeah.

00:41:57.960 --> 00:41:59.040
And, where is it?

00:41:59.040 --> 00:42:04.580
somebody said, one of the exciting things about it is we didn't say no immediately.

00:42:05.960 --> 00:42:06.980
That's a very good sign.

00:42:06.980 --> 00:42:08.420
Yeah.

00:42:08.420 --> 00:42:11.780
Which has not been the case with some of these other ones because they were willing to sacrifice

00:42:11.780 --> 00:42:15.260
single threaded performance to get better multi-course performance.

00:42:15.260 --> 00:42:18.480
Like, you know, this is not a common enough use case that we're willing to do that.

00:42:18.480 --> 00:42:23.420
I think actually, the solution the author came up with, it did reduce single,

00:42:23.420 --> 00:42:30.520
um, threaded performance, but he also added some unrelated, optimizations, which speeded

00:42:30.520 --> 00:42:31.300
it back up again.

00:42:31.300 --> 00:42:32.380
Exactly.

00:42:32.380 --> 00:42:33.500
I'm sorry.

00:42:33.500 --> 00:42:34.100
I fixed it.

00:42:34.100 --> 00:42:34.400
Yeah.

00:42:34.400 --> 00:42:34.460
Yeah.

00:42:34.460 --> 00:42:35.260
Yeah.

00:42:35.780 --> 00:42:36.720
Interesting.

00:42:36.720 --> 00:42:38.560
One more thought on this really quick.

00:42:38.560 --> 00:42:42.780
David pushing out in the live stream says the Gilectomy is like nuclear fusion.

00:42:42.780 --> 00:42:44.040
It's always 10 years away.

00:42:44.040 --> 00:42:44.620
Yeah.

00:42:44.620 --> 00:42:46.300
I hope hopefully it's not 10.

00:42:46.300 --> 00:42:52.140
It's possible, but I think this is the biggest possibility since then to do interesting things,

00:42:52.140 --> 00:42:55.640
maybe already taking account that, you know, looked at it and didn't say no immediately

00:42:55.640 --> 00:43:02.100
to, this is a project from, this is a project Sam's working on, but it's supported by Facebook

00:43:02.100 --> 00:43:02.880
where he works.

00:43:02.880 --> 00:43:05.320
So there's like a lot of time and energy.

00:43:05.320 --> 00:43:06.740
It's not just a side project.

00:43:06.740 --> 00:43:13.380
Third, Larry Hastings Hastings, the guy who was doing the Gilectomy commented on this

00:43:13.380 --> 00:43:15.700
thread saying, you've made way more progress than I did.

00:43:15.700 --> 00:43:16.600
Well done, Sam.

00:43:16.600 --> 00:43:17.700
So these are all good signs.

00:43:17.700 --> 00:43:18.660
That's fantastic.

00:43:18.660 --> 00:43:18.980
Yeah.

00:43:18.980 --> 00:43:19.520
Yeah.

00:43:19.800 --> 00:43:20.220
All right.

00:43:20.220 --> 00:43:22.980
Well, Ryan, are we ready for our joke?

00:43:22.980 --> 00:43:23.500
Yeah.

00:43:23.500 --> 00:43:23.880
Laugh.

00:43:23.880 --> 00:43:24.560
Definitely.

00:43:24.560 --> 00:43:28.860
See, this is optimistic because they're not always that funny, but I'm going to give it

00:43:28.860 --> 00:43:29.140
a try.

00:43:29.140 --> 00:43:34.040
This one is for the web developers out there for those folks that work on APIs and probably

00:43:34.040 --> 00:43:36.040
have been working for a long time on them.

00:43:36.040 --> 00:43:39.480
So, the first one I got for us, I just found another one I'm going to throw in from,

00:43:39.480 --> 00:43:43.540
uh, inspired by the live stream, but this one is entitled the torture never stops.

00:43:44.240 --> 00:43:44.860
All right.

00:43:44.860 --> 00:43:45.460
Okay.

00:43:45.460 --> 00:43:49.940
So it's a, every one of these, it's four different pictures in this cartoon.

00:43:49.940 --> 00:43:56.060
There's a, there's a different developers up at the board describing some new way to talk

00:43:56.060 --> 00:43:57.560
to web servers from your app.

00:43:57.560 --> 00:44:02.640
So way back in 2000, it says soap, simple object, object access protocol.

00:44:02.640 --> 00:44:04.340
Soap makes programming easier.

00:44:04.340 --> 00:44:08.200
And the developer in the audience like WTF is soap.

00:44:08.200 --> 00:44:09.000
Oh, come on.

00:44:09.000 --> 00:44:09.640
What is this?

00:44:09.640 --> 00:44:11.300
Crazy namespaces in XML.

00:44:11.300 --> 00:44:12.880
Skip ahead 10 years.

00:44:13.020 --> 00:44:16.860
Now there's a developer up here saying rest representational state transfer.

00:44:16.860 --> 00:44:18.520
Rest is better than soap.

00:44:18.520 --> 00:44:21.680
The developer now as WTF was wrong with soap.

00:44:21.680 --> 00:44:27.320
2015 graph QL graph QL is more versatile than rest.

00:44:27.320 --> 00:44:28.080
WTF.

00:44:28.080 --> 00:44:29.600
I was just getting the hang of rest.

00:44:29.600 --> 00:44:31.880
2018 GRPC.

00:44:31.880 --> 00:44:34.120
GRPC is faster than graph QL.

00:44:34.120 --> 00:44:34.720
WTF.

00:44:34.720 --> 00:44:38.320
I thought you knew by now that torture never stops.

00:44:38.320 --> 00:44:42.800
Like the guy next to the other developer that's been complaining for 20 years.

00:44:42.800 --> 00:44:45.940
I think that that hits a bit too close to home.

00:44:45.940 --> 00:44:49.980
But if you're a JavaScript developer, that gets compressed into like the last six months,

00:44:49.980 --> 00:44:50.620
I think.

00:44:50.620 --> 00:44:51.620
That's right.

00:44:51.620 --> 00:44:53.980
You've lived it really hard, really intensely.

00:44:53.980 --> 00:44:56.120
Nick says, let's just start over with soap.

00:44:56.120 --> 00:44:57.040
Yeah, pretty good.

00:44:57.040 --> 00:44:57.400
Pretty good.

00:44:57.400 --> 00:44:57.740
All right.

00:44:57.740 --> 00:45:04.520
And then we were talking about VS Code.dev and how you just press dot in your browser

00:45:04.520 --> 00:45:08.060
and GitHub or how you go to that URL and so on.

00:45:08.060 --> 00:45:08.760
How cool was.

00:45:08.760 --> 00:45:10.800
And somebody said, oh, it doesn't work in Safari.

00:45:10.800 --> 00:45:14.060
So I want to come back to this joke that used to be applied to IE.

00:45:14.060 --> 00:45:19.460
But now I think it should be applied to Safari.

00:45:19.460 --> 00:45:21.560
Like genuinely, I think it should be.

00:45:22.240 --> 00:45:26.560
Is it's the browser wars as a cartoon.

00:45:26.560 --> 00:45:28.200
So there's Chrome and Firefox.

00:45:28.200 --> 00:45:30.900
It's a little dated because Firefox is not as popular as it used to be, sadly.

00:45:30.900 --> 00:45:33.940
But it's like Chrome and Firefox are fiercely fighting.

00:45:33.940 --> 00:45:36.540
And like IE is in the corner eating glue.

00:45:37.500 --> 00:45:40.560
I just feel like that needs a little Safari icon and we'd be good.

00:45:40.560 --> 00:45:41.060
Yeah.

00:45:41.060 --> 00:45:42.780
We'd be all up to date in 2021.

00:45:42.780 --> 00:45:44.460
How do you know it's IE?

00:45:44.460 --> 00:45:47.440
It has a little E on it in a window symbol.

00:45:47.440 --> 00:45:48.760
Oh, okay.

00:45:48.760 --> 00:45:52.300
Well, the E, of course, is backwards because the shirt's probably on backwards or something.

00:45:52.300 --> 00:45:53.580
Also, it's eating glue.

00:45:53.580 --> 00:45:58.400
Yeah, true.

00:45:58.400 --> 00:45:59.240
Funny.

00:45:59.240 --> 00:46:01.960
So thanks, Will, for joining us today.

00:46:01.960 --> 00:46:03.000
This was a really fun show.

00:46:03.000 --> 00:46:05.920
Thanks, everybody in the chat for all the great comments.

00:46:05.920 --> 00:46:06.720
Thanks, Brian.

00:46:06.720 --> 00:46:07.260
Thanks, Will.

00:46:07.260 --> 00:46:07.840
See you all later.

00:46:07.840 --> 00:46:08.080
Thanks.

00:46:08.080 --> 00:46:08.820
Thanks, guys.

00:46:08.820 --> 00:46:09.480
Bye-bye.

00:46:09.480 --> 00:46:12.180
Thanks for listening to Python Bytes.

00:46:12.180 --> 00:46:15.000
Follow the show on Twitter via at Python Bytes.

00:46:15.000 --> 00:46:18.200
That's Python Bytes as in B-Y-T-E-S.

00:46:18.200 --> 00:46:21.360
Get the full show notes over at pythonbytes.fm.

00:46:21.360 --> 00:46:26.600
If you have a news item we should cover, just visit pythonbytes.fm and click submit in the

00:46:26.600 --> 00:46:27.020
nav bar.

00:46:27.020 --> 00:46:29.140
We're always on the lookout for sharing something cool.

00:46:29.140 --> 00:46:34.180
If you want to join us for the live recording, just visit the website and click live stream to

00:46:34.180 --> 00:46:36.900
get notified of when our next episode goes live.

00:46:37.200 --> 00:46:41.500
That's usually happening at noon Pacific on Wednesdays over at YouTube.

00:46:41.500 --> 00:46:45.420
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:46:45.420 --> 00:46:49.140
Thank you for listening and sharing this podcast with your friends and colleagues.