WEBVTT

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

00:00:04.600 --> 00:00:10.040
This is episode 312, recorded November 29th, 2022.

00:00:10.040 --> 00:00:11.300
I'm Michael Kennedy.

00:00:11.300 --> 00:00:12.520
And I'm Brian Okken.

00:00:12.520 --> 00:00:15.860
This episode is brought to you by the Compiler Podcast from Red Hat.

00:00:15.860 --> 00:00:18.680
Check them out. Really appreciate them supporting the show.

00:00:18.680 --> 00:00:21.200
Brian, we've got a lot to cover today. You want to just jump right into it?

00:00:21.200 --> 00:00:23.500
What I want to talk about is Simon Willison.

00:00:23.500 --> 00:00:25.980
This is incredible.

00:00:25.980 --> 00:00:29.860
So Simon did a talk at DjangoCon 2022.

00:00:30.460 --> 00:00:33.420
And then he wrote up the slides and everything.

00:00:33.420 --> 00:00:35.480
And we're going to link to his blog.

00:00:35.480 --> 00:00:40.100
His blog title is Coping Strategies for the Serial Project Hoarder.

00:00:40.100 --> 00:00:48.840
And then the talk title was Massively Increase Your Productivity on Personal Projects with Comprehensive Documentation and Automated Tests.

00:00:48.840 --> 00:00:50.400
Yes, that's a mouthful.

00:00:50.400 --> 00:00:58.960
But really, I don't know what a good name for this is other than everybody that works with development needs to watch this talk because it's incredible.

00:00:59.500 --> 00:01:02.900
So he goes through a lot of stuff.

00:01:02.900 --> 00:01:03.780
I'm going to go through it.

00:01:03.780 --> 00:01:04.680
I'm going to...

00:01:04.680 --> 00:01:06.640
Luckily, he's got screenshots on here.

00:01:06.640 --> 00:01:09.120
But he starts out...

00:01:09.120 --> 00:01:13.960
So this is important not just for open source projects or personal projects.

00:01:13.960 --> 00:01:17.400
This is also for if you're working in a company.

00:01:17.540 --> 00:01:18.940
I think this is equally true.

00:01:18.940 --> 00:01:24.100
So he talks about how he got these techniques from working at...

00:01:24.100 --> 00:01:25.700
Now I'm going to forget where he worked.

00:01:25.700 --> 00:01:28.380
But yeah, it's gone.

00:01:28.380 --> 00:01:30.880
A large company with multiple continents.

00:01:30.880 --> 00:01:35.680
And it was helpful to do this model.

00:01:35.680 --> 00:01:36.860
So what is he talking about?

00:01:37.380 --> 00:01:41.580
So one of the things he talks about is the perfect commit.

00:01:41.580 --> 00:01:44.140
So we don't really...

00:01:44.140 --> 00:01:48.880
As a professional software developer, you're not really doing new code all the time.

00:01:48.880 --> 00:01:51.420
What you're doing is maintaining existing software.

00:01:52.060 --> 00:01:55.620
So the commit is your unit of work.

00:01:55.620 --> 00:02:00.100
And a perfect commit includes the implementation of whatever you've done.

00:02:00.100 --> 00:02:05.720
But it also has tests and documentation and a link to the issue thread.

00:02:05.720 --> 00:02:07.420
And this is...

00:02:07.420 --> 00:02:08.720
It seems like a lot to me.

00:02:08.720 --> 00:02:11.160
But walking through his talk, it totally makes sense.

00:02:11.600 --> 00:02:17.400
So he gives an example of one of his with some cool highlights.

00:02:17.400 --> 00:02:19.760
The highlights that he's got documentation changes also.

00:02:19.760 --> 00:02:24.580
And the documentation might just be a single line change or something.

00:02:24.580 --> 00:02:27.920
But the tests...

00:02:27.920 --> 00:02:31.460
He does pause here and say tests are hard for some people, for some developers.

00:02:31.460 --> 00:02:37.340
So it's important to get a working test framework in place quickly.

00:02:37.340 --> 00:02:40.660
So that a test developer isn't starting from scratch.

00:02:40.660 --> 00:02:41.460
They're just...

00:02:41.460 --> 00:02:43.300
Or a software developer when they're writing tests.

00:02:43.300 --> 00:02:44.220
It's just...

00:02:44.220 --> 00:02:47.320
It's not like comprehensive testing has to be there.

00:02:47.320 --> 00:02:54.680
But it is a test that passes when your change is there and fails when it's not there.

00:02:54.680 --> 00:02:56.100
Or fails when it's not working.

00:02:56.100 --> 00:02:57.020
That's enough.

00:02:57.020 --> 00:02:59.320
You can do more thorough testing.

00:02:59.320 --> 00:03:02.000
But that's enough to get us started.

00:03:02.000 --> 00:03:04.200
And I think that's a good way to think about it.

00:03:04.200 --> 00:03:05.220
But he goes...

00:03:05.220 --> 00:03:06.120
Talks about...

00:03:06.120 --> 00:03:08.240
He throws in this little cool thing of like,

00:03:08.480 --> 00:03:15.040
Just keep common types of projects that you have around as cookie cutters in your own GitHub area.

00:03:15.040 --> 00:03:20.320
He's got a Python library and a Click app and a dataset plugin for him.

00:03:20.320 --> 00:03:23.360
I might have different things like a pytest plugin or something.

00:03:23.360 --> 00:03:26.620
And that way you can just keep up with your best practices,

00:03:26.620 --> 00:03:29.540
what you think of as best practices in one place.

00:03:29.540 --> 00:03:30.780
This is a cool idea.

00:03:31.240 --> 00:03:32.540
I'm totally going to steal this.

00:03:32.540 --> 00:03:34.860
I've done that for myself as well.

00:03:34.860 --> 00:03:36.180
I've built like a...

00:03:36.180 --> 00:03:37.720
This predated cookie cutter.

00:03:37.720 --> 00:03:39.000
But I built this thing like,

00:03:39.000 --> 00:03:40.520
I always want to have logging.

00:03:40.520 --> 00:03:41.660
And I want it like this.

00:03:41.660 --> 00:03:42.880
I always want to, you know,

00:03:42.880 --> 00:03:44.620
connect to this other service.

00:03:44.620 --> 00:03:46.880
And like ping it to make sure that the thing is alive.

00:03:46.880 --> 00:03:47.240
Or whatever.

00:03:47.240 --> 00:03:50.220
Whatever thing we decided for monitoring inside of our...

00:03:50.220 --> 00:03:51.180
The company I worked at.

00:03:51.180 --> 00:03:53.500
And like all the new projects would just start that way.

00:03:53.780 --> 00:03:54.660
And it was so nice.

00:03:54.660 --> 00:03:55.360
Because you didn't like,

00:03:55.360 --> 00:03:58.780
is it really worth doing the thing to make sure that we can monitor this at some time?

00:03:58.780 --> 00:04:01.620
Like you just run the one command line thing and it's there.

00:04:01.620 --> 00:04:02.180
Right?

00:04:02.180 --> 00:04:05.360
We could give it to an intern and they could run it to start their projects.

00:04:05.360 --> 00:04:05.820
It was great.

00:04:05.820 --> 00:04:10.220
And then he's got like this thing that supposedly with a GitHub hook.

00:04:10.220 --> 00:04:12.040
And I'm going to have to dig into this more.

00:04:12.040 --> 00:04:13.880
Because I didn't quite understand how this works.

00:04:13.880 --> 00:04:16.840
But he's got a way within the GitHub interface to say,

00:04:16.840 --> 00:04:17.600
I want a new project.

00:04:17.600 --> 00:04:21.240
And it automatically like gives you the choices of what kind of project.

00:04:21.460 --> 00:04:24.460
And then fills out all the defaults from the start.

00:04:24.460 --> 00:04:26.700
Instead of just getting the readme like normally.

00:04:26.700 --> 00:04:28.600
So this is kind of neat.

00:04:28.600 --> 00:04:31.100
And I guess I want to try figuring this out.

00:04:31.100 --> 00:04:32.880
The documentation bit.

00:04:32.880 --> 00:04:36.060
At least one of the things about including this.

00:04:36.060 --> 00:04:37.440
Even if it's difficult.

00:04:37.440 --> 00:04:40.620
You can have this be part of the code review requirements.

00:04:40.620 --> 00:04:42.840
So don't accept a code review.

00:04:42.840 --> 00:04:45.260
And tell the documentation is there also.

00:04:45.260 --> 00:04:47.280
So this is a cool idea.

00:04:47.280 --> 00:04:51.280
And then it's the bonus trick of testing.

00:04:51.280 --> 00:04:52.360
Testing documentation.

00:04:52.360 --> 00:04:53.380
Which is a cool idea.

00:04:53.380 --> 00:04:56.300
And then the links to the issue.

00:04:56.300 --> 00:04:58.340
And I thought this was just sort of a yes.

00:04:58.340 --> 00:04:59.260
You should do this.

00:04:59.260 --> 00:05:01.200
But this is really the meat of the talk.

00:05:01.200 --> 00:05:04.620
Is him doing his entire thought process.

00:05:04.620 --> 00:05:05.920
In the issue thread.

00:05:05.920 --> 00:05:07.640
And he even gives examples.

00:05:07.640 --> 00:05:11.740
Where there's sometimes like up to 50, 60 comments.

00:05:11.740 --> 00:05:13.700
And it's just him talking to himself.

00:05:13.700 --> 00:05:15.200
But this is brilliant.

00:05:15.200 --> 00:05:18.520
And I'm not going to convince you as much as he is.

00:05:18.520 --> 00:05:21.060
But it includes screenshots and dead ends.

00:05:21.060 --> 00:05:22.760
Like I tried this thing and it didn't work.

00:05:22.760 --> 00:05:24.340
And we're going to go back and do this other thing.

00:05:24.340 --> 00:05:26.400
This is an...

00:05:26.400 --> 00:05:28.460
He calls it temporal documentation.

00:05:28.560 --> 00:05:30.280
And I just love this idea.

00:05:30.280 --> 00:05:32.520
And I'm going to try to follow this myself.

00:05:32.520 --> 00:05:35.100
Because I have like a memory issue.

00:05:35.100 --> 00:05:36.140
I write stuff down.

00:05:36.140 --> 00:05:38.380
And then I forget where I wrote it down.

00:05:38.380 --> 00:05:43.300
And this way he says, you don't have to remember anything.

00:05:43.300 --> 00:05:45.200
You just dump it there.

00:05:45.200 --> 00:05:48.760
And that way, let's say you get pulled off of a project.

00:05:48.760 --> 00:05:51.980
And you don't get back to it for like six months.

00:05:51.980 --> 00:05:54.340
Because you've been fighting fires and doing other stuff.

00:05:54.340 --> 00:05:55.580
And then you get back to it.

00:05:55.740 --> 00:05:57.300
You won't remember where you're at.

00:05:57.300 --> 00:06:00.600
And with this line of thinking.

00:06:00.600 --> 00:06:02.960
Of keeping all of your thinking in the issue thread.

00:06:02.960 --> 00:06:05.320
You can just jump in and go, oh, that's where I was.

00:06:05.320 --> 00:06:07.020
And get started pretty quickly.

00:06:07.020 --> 00:06:07.780
I love this.

00:06:07.780 --> 00:06:08.340
It's cool.

00:06:08.340 --> 00:06:11.900
So then the rest of the talk is pretty interesting too.

00:06:11.900 --> 00:06:15.140
Talking about how like, you know, scientists have been doing this.

00:06:15.140 --> 00:06:17.540
And other engineers have been doing this for a long time.

00:06:17.540 --> 00:06:19.360
They called them lab notebooks before.

00:06:19.360 --> 00:06:22.220
And we kind of got out of the habit of doing that with software.

00:06:22.220 --> 00:06:24.260
But anyway, lots of great techniques.

00:06:24.360 --> 00:06:27.580
And I think this is just how to be a professional software developer now.

00:06:27.580 --> 00:06:30.700
I love that it's like a casual conversation.

00:06:30.700 --> 00:06:32.480
And not like, here are my four recommendations.

00:06:32.480 --> 00:06:35.980
But like the playing around and the dead ends are really, really valuable.

00:06:35.980 --> 00:06:36.620
Yeah.

00:06:36.620 --> 00:06:41.440
Kim out in the audience says, the cookie cutter approach also works beautifully from a DevOps perspective.

00:06:41.440 --> 00:06:44.880
For setting up developers to use your firm specific infrastructure.

00:06:44.880 --> 00:06:46.200
Yeah, I totally agree.

00:06:46.200 --> 00:06:48.060
And that's a little bit of what I was hinting at.

00:06:48.060 --> 00:06:50.860
Of like, here's how we integrate with this like uptime manager and stuff.

00:06:50.960 --> 00:06:56.280
But obviously DevOps, that was talking, we were deploying to a server in a closet there.

00:06:56.280 --> 00:06:58.800
Which, I mean, that tells you all you need to know.

00:06:58.800 --> 00:06:59.200
Yeah.

00:06:59.940 --> 00:07:08.420
Speaking of stuff you might need to know, Brian, Google Copilot and these code writing AIs, I have more to say about that at the very end of the show, book in this a little bit.

00:07:09.220 --> 00:07:12.760
They train themselves on lots of code.

00:07:12.760 --> 00:07:17.240
And Google Copilot, for those of you who don't know, you basically can give it a comment.

00:07:17.240 --> 00:07:22.200
And it's like, I want to connect to a Postgres database with SQLAlchemy.

00:07:22.200 --> 00:07:29.420
And then, boom, it'll like literally write all the code, import the usings, you know, come up with a connection string, all that kind of stuff.

00:07:29.420 --> 00:07:30.200
It's pretty fantastic.

00:07:30.200 --> 00:07:31.560
Has some privacy issues.

00:07:32.560 --> 00:07:33.980
I don't know what it's doing now.

00:07:33.980 --> 00:07:41.060
It used to send your source code that you wrote up to GitHub, which made me not want to use it already.

00:07:41.060 --> 00:07:49.080
But the big news here is the website GitHubCopilotLitigation.com.

00:07:49.080 --> 00:07:51.860
And that's as ominous as it sounds.

00:07:51.860 --> 00:07:56.660
It says, we filed, this is what the website sort of announces.

00:07:56.660 --> 00:08:03.680
We filed a lawsuit challenging GitHub Copilot, an AI product that relies on unprecedented open source software piracy.

00:08:03.680 --> 00:08:04.680
Why piracy?

00:08:04.680 --> 00:08:10.620
Because it's trained on things that are like GPL and Creative Commons share alike or attribution.

00:08:10.620 --> 00:08:18.040
And then it outputs code based on that original input that has no GPL and it has no, you know, whatever license, right?

00:08:18.040 --> 00:08:20.880
The license is stripped and no attribution.

00:08:20.880 --> 00:08:21.500
What do you think?

00:08:21.500 --> 00:08:25.520
Something we talked about from the very beginning of like, how is this okay?

00:08:25.520 --> 00:08:26.460
Yeah.

00:08:26.460 --> 00:08:27.100
Not sure.

00:08:27.100 --> 00:08:27.840
Absolutely.

00:08:27.840 --> 00:08:35.160
If it did things like we're only going to look at MIT licenses and other commercial open no attribution licenses,

00:08:35.160 --> 00:08:37.900
I don't think there'd be anything to say about it.

00:08:37.900 --> 00:08:39.960
But apparently that's not the case.

00:08:40.080 --> 00:08:42.720
So there's a couple of updates as well.

00:08:42.720 --> 00:08:46.940
I suppose we should also, like they do on this page, say, we are not a lawyer.

00:08:46.940 --> 00:08:48.520
Please don't take legal advice from us.

00:08:48.520 --> 00:08:51.900
We write code, not legal documents.

00:08:51.900 --> 00:08:56.400
But nonetheless, it says, this is Matthew Butterick.

00:08:56.400 --> 00:09:00.800
And they've set up to investigate Google Copilot.

00:09:00.800 --> 00:09:06.840
And they filed a class action lawsuit in the U.S. federal court in San Francisco on behalf of a couple folks.

00:09:07.180 --> 00:09:15.960
So they're challenging the legality of GitHub Copilot and a related product, OpenAI Codex, which powers Copilot.

00:09:15.960 --> 00:09:21.260
The suit has been filed against a set of defendants that includes GitHub, Microsoft, and OpenAI.

00:09:21.260 --> 00:09:21.960
Wow.

00:09:21.960 --> 00:09:24.640
There's an update down here somewhere.

00:09:24.640 --> 00:09:26.040
Let's see.

00:09:26.360 --> 00:09:29.720
It says, here's the motivation for their lawsuit.

00:09:29.720 --> 00:09:36.800
By training their AI systems on public GitHub repositories, though based on their public statements, possibly much more.

00:09:36.800 --> 00:09:46.040
We contend that the defendants have violated the legal rights of a vast number of creators who posted code or other work under certain open source licenses on GitHub.

00:09:46.040 --> 00:09:46.920
Which licenses?

00:09:46.920 --> 00:09:56.100
A set of 11 popular open source licenses that all require attribution, the author's name, and copyright, including, I guess, the MIT license as well, the GPL, and the Apache license.

00:09:56.100 --> 00:09:57.560
And it's listed out there.

00:09:57.560 --> 00:09:58.760
There's a whole bunch more details.

00:09:58.760 --> 00:10:01.220
And it says, update, November 10th.

00:10:01.220 --> 00:10:04.700
That original was November 3rd.

00:10:04.700 --> 00:10:06.260
There's an update here.

00:10:06.260 --> 00:10:10.640
This is, we filed a second class action lawsuit on behalf of two additional plaintiffs.

00:10:11.040 --> 00:10:14.280
The defendants and claimants are otherwise similar to the initial one.

00:10:14.280 --> 00:10:16.080
So, there you go.

00:10:16.080 --> 00:10:17.020
It's going to be interesting.

00:10:17.020 --> 00:10:24.360
It's not going to be just interesting for Google, for Google GitHub, Copilot, but basically AI in general, right?

00:10:24.360 --> 00:10:34.300
It says it's going to challenge that AI strips the ownership and other requirements of inputs and outputs, right?

00:10:34.300 --> 00:10:35.560
And maybe it does, maybe it doesn't.

00:10:35.660 --> 00:10:41.260
I mean, we heard that APIs are not copyrightable in the Google Oracle Java lawsuit.

00:10:41.260 --> 00:10:42.300
So, we're going to find out here.

00:10:42.300 --> 00:10:43.220
Oh, interesting.

00:10:43.220 --> 00:10:44.060
Yeah.

00:10:44.060 --> 00:10:57.480
I mean, like, when we looked into this a little bit earlier, if it's helping you fill in parameters to a function, or what likely things you're going to fill in for a function call, that's one thing.

00:10:57.480 --> 00:11:02.600
But when it plops down, like, 20 lines of code for you, where did it get those 20 lines of code?

00:11:02.600 --> 00:11:07.100
And then, I mean, open source doesn't necessarily mean you can copy it.

00:11:07.100 --> 00:11:08.860
It's just open to read.

00:11:08.860 --> 00:11:12.100
I mean, you can have a, you can put your own license in there.

00:11:12.100 --> 00:11:19.180
You can make up your own license that says, anybody can read this, but you can't copy it, use it, or do anything else with it at all.

00:11:19.180 --> 00:11:20.340
Can't even fork it.

00:11:21.320 --> 00:11:24.540
And there's nothing stopping you from doing that sort of a license.

00:11:24.540 --> 00:11:25.500
Right.

00:11:25.500 --> 00:11:30.840
Or the default, if you put it on GitHub, I believe, if you put no license, means you have no license.

00:11:30.840 --> 00:11:32.660
You're conferring no license whatsoever, right?

00:11:32.660 --> 00:11:33.160
Yeah.

00:11:33.160 --> 00:11:36.140
It means it's just like, it's like writing a book.

00:11:36.140 --> 00:11:41.780
You can't, when you write a book, you have the full copyright, unless you give it to somebody else.

00:11:41.780 --> 00:11:42.240
So.

00:11:42.240 --> 00:11:43.200
Yeah, absolutely.

00:11:43.200 --> 00:11:43.900
All right.

00:11:43.920 --> 00:11:46.300
Well, let's stick with my screen for a second.

00:11:46.300 --> 00:11:50.380
I want to tell you all about our sponsor for this week, Compiler.

00:11:50.380 --> 00:11:56.560
So this episode of Python Bytes, this episode of Python Bytes is sponsored by the Compiler podcast from Red Hat.

00:11:56.560 --> 00:11:59.140
Like you, Brian and I are fans of podcasts.

00:11:59.140 --> 00:12:01.220
I listen to them more and more these days, actually.

00:12:01.220 --> 00:12:05.220
And I'm happy to share this one, Compiler, an original podcast from Red Hat.

00:12:05.220 --> 00:12:10.040
So if you want to stay on top of tech without dedicating tons of time to it, check out Compiler.

00:12:10.040 --> 00:12:15.460
They present perspectives and topics and insights from the tech industry free of jargon and judgment.

00:12:15.460 --> 00:12:22.460
They want to discover where technology is headed beyond headlines and create a place for new IT professionals to learn, grow, and thrive.

00:12:22.460 --> 00:12:28.300
Compiler helps people break through barriers and challenges, turning code into community at all levels of the enterprise.

00:12:28.300 --> 00:12:31.360
One recent interesting episode is their great stack debate.

00:12:31.360 --> 00:12:36.280
I love, love, love talking to people about their architecture, their code, all the trade-offs and conventions.

00:12:36.280 --> 00:12:41.160
As you will see later in the show, I'm going to talk a bit about that at the end as well for us.

00:12:41.160 --> 00:12:45.560
And the costs that come with this, the challenges, things that are awesome, the things that are not.

00:12:45.560 --> 00:12:47.640
So this episode is like that.

00:12:47.640 --> 00:12:52.040
So you can check it out to see if software is like an onion or like lasagna or it's more complicated.

00:12:52.040 --> 00:12:56.040
It's the first episode in a compiler series on the software stack.

00:12:56.040 --> 00:12:58.840
So listen to more about Compiler at pythonbytes.com.

00:12:58.840 --> 00:13:01.920
Yes, you can just go type compiler into your podcast player.

00:13:01.920 --> 00:13:03.340
And that's what I would do in general.

00:13:03.340 --> 00:13:07.220
But please use our link so that the folks at Red Hat know that it came from us.

00:13:07.220 --> 00:13:07.740
Yes.

00:13:07.740 --> 00:13:08.360
Yes.

00:13:08.360 --> 00:13:12.780
And thanks to Compiler for keeping our podcast going strong.

00:13:12.780 --> 00:13:13.560
All right.

00:13:13.560 --> 00:13:14.140
Over to you, Brian.

00:13:14.140 --> 00:13:14.720
What's the next one?

00:13:14.720 --> 00:13:19.020
So this is a silly thing.

00:13:19.020 --> 00:13:26.080
But sometimes I've got Python code that I want to have a pop-up, a window pop-up.

00:13:26.080 --> 00:13:31.060
And I've always been using, what is it, PySimpleGUI?

00:13:31.060 --> 00:13:32.320
Well, not always.

00:13:32.320 --> 00:13:40.220
But that's what I've been using lately for really easy, just a simple pop-up thing, especially if I needed to use run on Macs and really anywhere.

00:13:40.740 --> 00:13:44.960
Because it's totally fast to get it done, and I don't have to think about it anymore.

00:13:44.960 --> 00:13:53.460
However, PySimpleGUI doesn't, I haven't mastered the art of getting it to look just like a native dialog box.

00:13:53.460 --> 00:13:57.260
And maybe there's some tricks that you can do that I just don't know.

00:13:57.260 --> 00:14:07.560
But if I know it's on Windows, maybe we could just go ahead and use the Windows DLLs and do a native Windows dialog box.

00:14:07.560 --> 00:14:14.240
Just call straight into the Windows 132 API for message box 3B2 or whatever it is.

00:14:14.240 --> 00:14:15.320
That shouldn't be too hard, right?

00:14:15.320 --> 00:14:15.860
No.

00:14:15.860 --> 00:14:17.400
It sounds scary to me.

00:14:17.400 --> 00:14:20.840
But I ran across Matt Callahan's blog.

00:14:21.840 --> 00:14:30.680
Matt Callahan has an article called Display a Message Box in Python Without Using a Non-Standard Library or Other Dependency.

00:14:30.680 --> 00:14:31.880
Actually, you can just do this.

00:14:31.880 --> 00:14:33.860
You don't have to install anything.

00:14:33.860 --> 00:14:35.760
And I got this.

00:14:35.760 --> 00:14:37.840
I want to, where did I get this from?

00:14:37.840 --> 00:14:39.540
Give credit where credit is due.

00:14:39.540 --> 00:14:42.640
I got this from the PyQuarters Weekly newsletter.

00:14:42.640 --> 00:14:44.040
So thanks to them.

00:14:44.040 --> 00:14:47.000
Anyway, this is not hard.

00:14:47.000 --> 00:14:48.980
So he has a little pop-up example.

00:14:48.980 --> 00:14:52.640
And I should have read the article, but I just skimmed for the code.

00:14:52.640 --> 00:14:54.640
Here's some code.

00:14:54.640 --> 00:14:55.180
That's it.

00:14:55.180 --> 00:14:57.740
This makes a dialog box pop up.

00:14:57.740 --> 00:15:02.260
And it's calling the, so it calls, it's just like a couple flags.

00:15:02.260 --> 00:15:03.460
It's like 10 lines of code.

00:15:03.460 --> 00:15:10.980
It calls ctypes, win DLL, user 32, message box, EXW, whatever that means.

00:15:10.980 --> 00:15:14.800
And with some stuff in it, like a title and a message and everything.

00:15:15.280 --> 00:15:21.740
So it's using ctypes, which I don't use much, but you can get into DLLs.

00:15:21.740 --> 00:15:23.460
So ctypes is built into Python.

00:15:23.460 --> 00:15:27.720
And so this message box, I wanted to play with it a little bit more.

00:15:27.720 --> 00:15:35.480
So as I was playing with this, looked into the Microsoft documentation, the message box dialogue.

00:15:35.480 --> 00:15:38.320
There's a, one of the flags is this U type.

00:15:38.320 --> 00:15:40.880
And it's like this hex value thing or a bit field.

00:15:40.880 --> 00:15:42.840
And you can orient a whole bunch of stuff.

00:15:42.840 --> 00:15:51.520
So you can use this to, to get like an okay box or an okay cancel box, different types of dialogue boxes using this, this flag.

00:15:51.520 --> 00:15:57.420
And then once you've got this popped up, how do you, you need to know like what users clicked on and stuff.

00:15:57.420 --> 00:16:02.060
So there's, there's return values from this and you can just like check the return value.

00:16:02.060 --> 00:16:09.260
And it's defined to be like, you know, a three for abort and a two for cancel and one for okay.

00:16:09.440 --> 00:16:10.980
And you can just check this value.

00:16:10.980 --> 00:16:17.020
So with just a little bit of code, you can have a native dialogue box pop up if you need to in your code.

00:16:17.020 --> 00:16:18.300
Yeah, that's awesome.

00:16:18.300 --> 00:16:21.220
And it does things like natively that you would expect.

00:16:21.220 --> 00:16:25.160
Like for example, you hit escape and you have an okay cancel, it'll return cancel.

00:16:25.160 --> 00:16:30.920
I hate some of these, these like UI things, they show up and you're like, well, it's got one text input and a submit button.

00:16:30.920 --> 00:16:32.020
You hit enter, it does nothing.

00:16:32.020 --> 00:16:32.740
You're like, yeah, great.

00:16:32.920 --> 00:16:33.200
Okay.

00:16:33.200 --> 00:16:34.980
Apparently this is not real.

00:16:34.980 --> 00:16:37.400
I'm going to have to just, you know, go click it or whatever.

00:16:37.400 --> 00:16:37.740
Right.

00:16:37.740 --> 00:16:40.400
So hooking into the native OS is sweet like that.

00:16:40.400 --> 00:16:47.700
This looks like a thing that would be ripe for a short, simple little package that wraps up, say all the.

00:16:47.700 --> 00:16:48.280
Okay.

00:16:48.280 --> 00:16:48.720
Cancel.

00:16:48.720 --> 00:16:49.460
Yeah.

00:16:49.460 --> 00:16:49.880
Okay.

00:16:49.880 --> 00:16:50.360
Cancel.

00:16:50.360 --> 00:16:51.980
What kind of icon you want?

00:16:51.980 --> 00:16:52.860
Do you want like a warning?

00:16:52.860 --> 00:16:54.420
Do you want an informational icon?

00:16:54.420 --> 00:16:55.620
The buttons?

00:16:55.620 --> 00:16:55.980
Yeah.

00:16:55.980 --> 00:16:56.600
Yeah.

00:16:56.600 --> 00:16:58.720
It seems really great, but this is fantastic.

00:16:58.720 --> 00:17:01.700
So, so neat and, and built in neat.

00:17:01.700 --> 00:17:02.620
So anyway.

00:17:02.620 --> 00:17:03.500
Just a quickie.

00:17:03.500 --> 00:17:04.060
Yeah.

00:17:04.060 --> 00:17:04.660
It comes included.

00:17:04.660 --> 00:17:06.120
And yeah, I really like it.

00:17:06.120 --> 00:17:09.920
And it's also a bit of a roadmap to show what you could do beyond that.

00:17:09.920 --> 00:17:10.080
Right.

00:17:10.080 --> 00:17:12.340
There's more than just really simple dialogue boxes.

00:17:12.340 --> 00:17:16.300
For example, like the open file dialogue box on windows could probably be real similar.

00:17:16.300 --> 00:17:16.540
Right.

00:17:16.540 --> 00:17:17.300
Oh yeah.

00:17:17.300 --> 00:17:17.880
Probably.

00:17:17.880 --> 00:17:18.780
Right.

00:17:18.780 --> 00:17:19.340
Yeah.

00:17:19.340 --> 00:17:22.640
So when I was looking it up, there's a whole bunch of dialogue boxes you got access to.

00:17:22.640 --> 00:17:23.800
Yeah, exactly.

00:17:23.800 --> 00:17:29.340
It's like a roadmap to like, well, I can like create a file or, you know, any of these things, which I think is pretty cool.

00:17:29.340 --> 00:17:30.120
All right.

00:17:30.340 --> 00:17:35.340
Let's flip away from OS specific to OS general, but stick with PyCoders for a minute.

00:17:35.340 --> 00:17:37.060
So this one also comes from PyCoders.

00:17:37.060 --> 00:17:40.400
I don't know if it's the same issue or not, but very cool.

00:17:40.400 --> 00:17:45.760
It says write Chrome extensions, which also mean like Brave and Vivaldi and others.

00:17:45.760 --> 00:17:46.660
Edge maybe.

00:17:46.660 --> 00:17:49.400
Write Chrome extensions in Python.

00:17:49.940 --> 00:17:52.520
Oh, how does it work?

00:17:52.520 --> 00:17:53.660
Hi script.

00:17:53.660 --> 00:17:54.480
Of course.

00:17:54.480 --> 00:18:11.880
So, yeah, we, we just take PyScript and this, this is an article by Pete Fiston and it sort of walks through how he was able to use PyScript, which is Python on WebAssembly running in the browser to use that to power a Chrome extension.

00:18:11.880 --> 00:18:18.400
And it doesn't really matter if it's a bit of a nine meg download because you install it once and it's local on your computer, right?

00:18:18.600 --> 00:18:26.440
So it just, if you want to do this, it walks you through all the things you got to do in order to use PyScript to write Chrome extensions or Python to write Chrome extensions.

00:18:26.440 --> 00:18:27.100
What do you think?

00:18:27.100 --> 00:18:27.460
Cool.

00:18:27.460 --> 00:18:28.700
Even shows you how to put an icon.

00:18:28.700 --> 00:18:29.700
That's pretty cool.

00:18:30.040 --> 00:18:30.280
Yeah.

00:18:30.280 --> 00:18:32.600
But I have more for you.

00:18:32.600 --> 00:18:38.040
So just so in case people don't know, this is an extra, extra, extra hear all about it section because I want to hit a whole bunch of things.

00:18:38.040 --> 00:18:42.000
So as of recently, just published this episode.

00:18:42.000 --> 00:18:42.760
Let me look.

00:18:42.760 --> 00:18:46.020
30, 31 minutes ago.

00:18:46.020 --> 00:18:48.720
And it says PyScript powered by MicroPython.

00:18:48.860 --> 00:19:00.560
So one of the challenges that PyScript has had traditionally is it's based on the full, nearly the full CPython runtime compiled into WebAssembly, which after you strip a bunch out, that doesn't work in the browser.

00:19:00.560 --> 00:19:02.260
It comes down to like nine megabytes.

00:19:02.260 --> 00:19:03.000
Okay.

00:19:03.000 --> 00:19:05.200
It's for like this browser extension thing.

00:19:05.200 --> 00:19:05.800
That's reasonable.

00:19:05.800 --> 00:19:13.440
But for, you would never use in place of like Vue JS on a popular page because you want that page to load quickly.

00:19:13.440 --> 00:19:15.460
You want it to be good for SEO, all those things.

00:19:15.660 --> 00:19:17.500
But you know what's small and fast?

00:19:17.500 --> 00:19:18.840
MicroPython.

00:19:18.840 --> 00:19:19.620
Oh, neat.

00:19:19.620 --> 00:19:34.320
So I just had Brett Cannon, Nicholas Tolerwey, and Fabio Flieger, on Talk Python to talk about the work that they're doing to make PyScript not run on full CPython, but to run on MicroPython.

00:19:34.320 --> 00:19:34.880
Oh, wow.

00:19:34.880 --> 00:19:38.660
MicroPython, you can get that to load up in a hundred milliseconds on your page.

00:19:38.660 --> 00:19:40.220
And it's only a couple hundred K.

00:19:40.220 --> 00:19:47.880
All of a sudden that starts to sound a lot like a pretty rich front end framework level of stuff you got to download and get started and you cash it.

00:19:47.880 --> 00:19:48.980
Then you're, you're good to go.

00:19:48.980 --> 00:19:49.960
That's exciting, huh?

00:19:49.960 --> 00:19:51.240
That's super exciting.

00:19:51.240 --> 00:19:51.900
Yeah.

00:19:51.900 --> 00:19:52.220
Yeah.

00:19:52.220 --> 00:19:54.100
So this Chrome extension thing is cool.

00:19:54.100 --> 00:20:01.760
When you look at the shipping version, I don't know if you can call it shipping because the price script is still like super alpha, but what you can get today.

00:20:02.760 --> 00:20:10.620
So Nicholas said probably spring that they'll have something to share, but in terms of being able to use MicroPython.

00:20:10.620 --> 00:20:11.820
But I think that's pretty excellent.

00:20:11.820 --> 00:20:15.160
That could really, really unlock some, some super cool features.

00:20:15.160 --> 00:20:19.180
If now we could build like a Vue.js type thing, but with Python.

00:20:19.180 --> 00:20:28.880
And one of the goals that they stated is that they're looking to build this as a framework or excuse me, a platform that you can build frameworks on top of.

00:20:28.880 --> 00:20:38.400
So it's not just, here's how you write some Python code in the browser, but here's a foundation that people could create like a PyView or a PyAngular or, you know, whatever they wanted to create.

00:20:38.400 --> 00:20:38.620
Right.

00:20:38.620 --> 00:20:39.080
Yeah.

00:20:39.080 --> 00:20:47.260
So question just for my own personal use is, is, would Chrome extensions work on Vivaldi?

00:20:47.260 --> 00:20:48.240
Yeah, yeah, they do.

00:20:48.240 --> 00:20:48.840
Okay.

00:20:48.840 --> 00:20:54.120
One of the things that's interesting about Vivaldi, and I think it probably affects its reporting a little bit.

00:20:54.120 --> 00:20:59.200
When you look at the user agent of Vivaldi, it's exactly the user agent of Chrome.

00:20:59.200 --> 00:21:02.000
So it lies to the world and tells the world it's Chrome.

00:21:02.000 --> 00:21:04.360
There's no user agent for Vivaldi.

00:21:04.360 --> 00:21:08.160
It's just whatever version of Chrome it's like using, you know?

00:21:08.160 --> 00:21:08.440
Okay.

00:21:08.440 --> 00:21:11.020
So when you go to the Chrome web store, it's like, put this in Chrome.

00:21:11.020 --> 00:21:12.120
You click it and yeah, it goes.

00:21:12.120 --> 00:21:12.940
So it worked perfectly.

00:21:12.940 --> 00:21:13.160
Sure.

00:21:13.160 --> 00:21:13.620
Cool.

00:21:13.620 --> 00:21:14.140
Yes.

00:21:14.140 --> 00:21:15.960
And John Sheehan says, yes, they do.

00:21:15.960 --> 00:21:16.260
All right.

00:21:16.260 --> 00:21:17.540
Next, extra, extra, extra.

00:21:18.180 --> 00:21:20.820
Brian, I've been excited a little bit about Mastodon.

00:21:20.820 --> 00:21:21.740
I don't know if you noticed.

00:21:21.740 --> 00:21:23.000
Yeah, me too.

00:21:23.000 --> 00:21:23.700
I know.

00:21:23.700 --> 00:21:24.200
It's fantastic.

00:21:24.200 --> 00:21:25.720
It's really tons of great interactions.

00:21:25.720 --> 00:21:32.180
And I started putting in our show notes, which you'll see when I publish this, your Mastodon account and mine.

00:21:32.240 --> 00:21:36.240
So people can connect with us and have even more conversations over there.

00:21:36.240 --> 00:21:41.840
But there was a really interesting article by Eugene, the guy who created Mastodon.

00:21:41.840 --> 00:21:44.120
I've been looking and looking.

00:21:44.120 --> 00:21:47.520
It's about scaling Mastodon and the challenges they were having.

00:21:47.520 --> 00:21:49.300
And boy, it's...

00:21:49.300 --> 00:21:51.720
I would love to link to it, but I just can't find it.

00:21:51.720 --> 00:21:53.480
But it's so...

00:21:53.480 --> 00:21:54.900
It's written in Ruby, right?

00:21:54.900 --> 00:22:00.020
And so it talks so much about these are the challenges of scaling out threads.

00:22:00.020 --> 00:22:02.160
And, oh, we have this thing called a GIL.

00:22:02.160 --> 00:22:05.340
And it really doesn't allow you to use threads very easily.

00:22:05.340 --> 00:22:06.580
And here's...

00:22:06.580 --> 00:22:07.060
There's just...

00:22:07.060 --> 00:22:17.900
It was so interesting to look at how a technology that doesn't have asyncio and async and await getting all tangled up trying to do IO-based things.

00:22:17.900 --> 00:22:19.880
So it's like, well, can we have...

00:22:19.880 --> 00:22:24.020
Maybe we should have 10 to 20 threads to do the network communication.

00:22:24.020 --> 00:22:32.880
But if we have more than 20, then we get like a context switching and contention in the operating system, you know, that just comes with having OS threads.

00:22:32.880 --> 00:22:33.640
Well, guess what?

00:22:33.840 --> 00:22:37.240
You can do really well with no threads or one thread.

00:22:37.240 --> 00:22:38.660
You can talk to web...

00:22:38.660 --> 00:22:39.640
You can call other websites.

00:22:39.640 --> 00:22:41.060
You can receive web requests.

00:22:41.060 --> 00:22:44.900
And the mechanism for doing that in Python is async and await.

00:22:44.900 --> 00:22:50.440
And asyncio requires no additional threads, very, very little overhead, no contact switching.

00:22:50.440 --> 00:22:56.080
So this project by Andrew...

00:22:56.080 --> 00:22:58.760
I'm sorry if I am not getting...

00:22:58.760 --> 00:22:59.880
Andrew Godwin, sorry.

00:22:59.880 --> 00:23:01.140
I forgot his last name for a moment.

00:23:01.540 --> 00:23:08.200
I have Django channel said, what if I rewrote this, but in Python with an async and a wait?

00:23:08.200 --> 00:23:08.820
Okay.

00:23:08.820 --> 00:23:09.820
Okay.

00:23:09.820 --> 00:23:12.360
So there's a bunch of challenges of running Mastodon.

00:23:12.360 --> 00:23:15.120
People want to have their own server because they're like, oh, I want my own server.

00:23:15.120 --> 00:23:16.980
So I'm not stuck in one of these communities.

00:23:16.980 --> 00:23:23.140
And as beholden to them, the problem is every one of those is like a standalone DevOps adventure.

00:23:23.520 --> 00:23:25.740
There's tons of like things working together.

00:23:25.740 --> 00:23:27.740
And it's a lot of work, right?

00:23:27.740 --> 00:23:35.220
It would be better if you put like host more of them on one machine and sort of scale that up in a nice way.

00:23:35.220 --> 00:23:39.380
So this one lets you host multiple domains for small to medium instances.

00:23:39.380 --> 00:23:43.440
And it's written with async and await, which is pretty awesome.

00:23:43.800 --> 00:23:44.300
So yeah.

00:23:44.300 --> 00:23:46.500
Anyway, I think you should check this out.

00:23:46.500 --> 00:23:49.780
I didn't know if I caught you trying to pronounce it.

00:23:49.780 --> 00:23:50.600
Takahe?

00:23:50.600 --> 00:23:51.520
Takahe?

00:23:51.520 --> 00:23:52.280
I don't know.

00:23:52.280 --> 00:23:53.720
I'm going to go with that.

00:23:54.580 --> 00:24:01.300
And of course, Andrew Godwin just said, you know, I can probably write this in Python and like get it out in a couple of weeks.

00:24:01.300 --> 00:24:03.340
I think it was like five days or something.

00:24:03.340 --> 00:24:09.960
So key features, multiple domain support, multiple identities per user, which is kind of interesting.

00:24:09.960 --> 00:24:13.040
Desktop mobile and PWA compatible.

00:24:13.040 --> 00:24:14.860
Again, how many days?

00:24:14.860 --> 00:24:16.060
And easy deployment.

00:24:16.060 --> 00:24:18.660
A web worker, a background worker, and one database.

00:24:18.660 --> 00:24:20.820
Not all this crazy, crazy stuff.

00:24:20.820 --> 00:24:23.060
So anyway, people can check it out.

00:24:23.560 --> 00:24:25.000
Let's check out the requirements.

00:24:25.000 --> 00:24:26.800
See what we got going on here.

00:24:26.800 --> 00:24:29.860
uvicorn for an HTTPX.

00:24:29.860 --> 00:24:32.320
I mean, that pretty much says it right there.

00:24:32.320 --> 00:24:33.300
Oh, interesting.

00:24:33.300 --> 00:24:36.300
It's based on Django HTMX.

00:24:36.300 --> 00:24:39.120
It's pretty interesting in some of the building blocks.

00:24:39.120 --> 00:24:40.420
But yeah, super cool.

00:24:40.420 --> 00:24:42.360
So there's another one.

00:24:42.360 --> 00:24:42.820
All right.

00:24:42.820 --> 00:24:47.000
We just had our Black Friday sale over at Talk Python.

00:24:47.000 --> 00:24:48.300
And that was really excellent.

00:24:48.300 --> 00:24:49.240
Sold a bunch of courses.

00:24:49.240 --> 00:24:51.780
We sold some pytest courses, by the way.

00:24:51.780 --> 00:24:52.340
Yeah.

00:24:52.340 --> 00:24:53.520
But I...

00:24:53.520 --> 00:24:57.760
I'm just excited because sometimes we have these sort of conversations about, you know,

00:24:57.760 --> 00:24:58.960
like cool sales and stuff.

00:24:58.960 --> 00:25:00.560
And I'm glad that I get to be a part of that now.

00:25:00.560 --> 00:25:05.080
We've done other fun things where, like, we couldn't sell your book through them because

00:25:05.080 --> 00:25:06.540
it's through the publisher.

00:25:06.540 --> 00:25:08.240
And I guess, yeah, it gets tricky, right?

00:25:08.240 --> 00:25:09.360
So I'm really excited as well.

00:25:09.360 --> 00:25:11.820
So we did our Black Friday sale.

00:25:11.820 --> 00:25:12.780
And guess what?

00:25:12.780 --> 00:25:14.780
I noticed something a little bit unusual.

00:25:14.780 --> 00:25:19.500
It said, after a little bit, I opened up Glances on the main web server and said,

00:25:19.720 --> 00:25:20.760
CPU usage is 85%.

00:25:20.760 --> 00:25:22.360
I'm like, oh, that's not so good.

00:25:22.360 --> 00:25:24.140
88, 91, 92.

00:25:24.140 --> 00:25:24.660
Uh-oh.

00:25:24.660 --> 00:25:31.220
But what was super interesting was Nginx, not Python, was the thing getting hammered.

00:25:31.220 --> 00:25:34.700
So both Nginx workers were like almost 100%.

00:25:34.700 --> 00:25:35.960
And Python was just chilling.

00:25:35.960 --> 00:25:41.000
I'm like, okay, that is a really interesting story for Python performance that something

00:25:41.000 --> 00:25:45.760
amazing like Nginx that people say is fast all the time is the bottleneck.

00:25:45.760 --> 00:25:48.960
And it turned out it survived, but just barely, right?

00:25:48.960 --> 00:25:52.280
If it were like twice as bad, it would have keeled over, which had been bad.

00:25:52.280 --> 00:25:54.180
So I talked to a bunch of people about this.

00:25:54.180 --> 00:25:57.720
And I realized that there's one HTTP response.

00:25:57.720 --> 00:25:58.720
I've got to spell that better.

00:25:59.780 --> 00:26:04.660
And 12 CSS files, 43 images, and one JavaScript file on the page I was sending them.

00:26:04.660 --> 00:26:10.260
So I'm like, all right, maybe I should try to use some interesting CDN, which I had got

00:26:10.260 --> 00:26:12.980
a recommendation from one of our listeners, but otherwise hadn't heard about.

00:26:12.980 --> 00:26:14.500
What a cool service.

00:26:14.880 --> 00:26:21.960
So now we have 112 different locations serving up those static files and just processing.

00:26:21.960 --> 00:26:27.600
So I went back today when we did our Cyber Monday and I said, when I, that was yesterday, when

00:26:27.600 --> 00:26:33.180
I pushed out the announcement for Cyber Monday closing and I pulled up the real-time data,

00:26:33.180 --> 00:26:34.320
look at that traffic.

00:26:34.320 --> 00:26:36.580
That's CSS and JavaScript and images.

00:26:36.580 --> 00:26:38.840
1.4 gigabytes a second.

00:26:38.840 --> 00:26:39.600
Oh my gosh.

00:26:39.600 --> 00:26:40.920
It's insane, dude.

00:26:40.920 --> 00:26:43.040
And check this out on the server.

00:26:43.040 --> 00:26:48.120
This is the most important part, 3% CPU usage on NGINX and across the whole computer,

00:26:48.120 --> 00:26:52.660
across all of the micro-WSGI processes, just a couple more percent.

00:26:52.660 --> 00:26:54.100
CDN to the rescue.

00:26:54.100 --> 00:26:54.800
Exactly.

00:26:54.800 --> 00:26:58.620
But the thing that's also interesting is that Python is just like, yeah, it was nothing.

00:26:58.620 --> 00:27:01.040
Like, we can take that, but it's all those static files.

00:27:01.040 --> 00:27:07.340
So anyway, I put that right up together for people in order to serve out that data, pay $2,

00:27:07.340 --> 00:27:09.980
right, for 0.35 terabytes.

00:27:12.120 --> 00:27:14.440
And by the way, it's going right now.

00:27:14.440 --> 00:27:16.240
Oh, it's got to refresh here.

00:27:16.240 --> 00:27:19.160
They have these cool real-time maps and whatnot.

00:27:19.160 --> 00:27:23.300
But that little spike right there is when I released the Talk Python episode.

00:27:23.300 --> 00:27:28.780
And that's about four and a half terabytes per second, which is just insane.

00:27:28.780 --> 00:27:31.520
So anyway, I totally recommend people check this out.

00:27:31.520 --> 00:27:32.340
It's super fun.

00:27:32.340 --> 00:27:33.940
You're reaching people all over the world.

00:27:33.940 --> 00:27:34.660
That's pretty cool.

00:27:35.140 --> 00:27:35.300
Yeah.

00:27:35.300 --> 00:27:36.020
Isn't that amazing?

00:27:36.020 --> 00:27:37.460
You get all these different locations.

00:27:37.460 --> 00:27:43.520
I think it lost its web socket connection because it stopped updating.

00:27:43.520 --> 00:27:45.260
It's like, there's a little warning.

00:27:45.260 --> 00:27:50.280
This live monitor is like a little bit of a suggestion of how things might be.

00:27:50.280 --> 00:27:51.060
But yeah.

00:27:51.060 --> 00:27:51.420
Anyway.

00:27:51.700 --> 00:27:51.820
Yeah.

00:27:51.820 --> 00:27:53.680
What's up with the Alaska people not listening?

00:27:53.680 --> 00:27:54.520
Hey, Alaska.

00:27:54.520 --> 00:27:54.940
Yeah, man.

00:27:54.940 --> 00:27:55.680
Come on.

00:27:55.680 --> 00:27:56.240
Yeah.

00:27:56.240 --> 00:27:59.680
They're going to have to CD in over to Canada or anyway.

00:27:59.680 --> 00:28:01.440
So not that.

00:28:01.440 --> 00:28:03.260
This final one here.

00:28:03.260 --> 00:28:04.200
No, not final one.

00:28:04.200 --> 00:28:07.480
Second, final one of the read all about it or hear all about it.

00:28:07.480 --> 00:28:08.500
Reader 5.

00:28:08.600 --> 00:28:11.340
I've actually been really getting back into RSS.

00:28:11.340 --> 00:28:13.220
I've never left.

00:28:13.220 --> 00:28:13.820
Yeah.

00:28:13.820 --> 00:28:15.840
What's your RSS story these days?

00:28:15.840 --> 00:28:20.560
No, I use Feedly on my phone just to keep up on stuff.

00:28:20.560 --> 00:28:21.620
Nice.

00:28:21.620 --> 00:28:28.820
I'd switch to things like Zite, which is sadly gone, and Flipboard and these sort of Apple

00:28:28.820 --> 00:28:31.900
News-like things where they kind of curate a bunch of different sources.

00:28:31.900 --> 00:28:32.720
I'm like, you know what?

00:28:32.720 --> 00:28:37.200
There's a bunch of great places I would really like to just directly get them from and curate

00:28:37.200 --> 00:28:39.300
a little more than just I suggest more Python.

00:28:39.300 --> 00:28:46.240
Because do you know how many times my Python channel in Flipboard has women scared of Python

00:28:46.240 --> 00:28:47.860
that comes out of the toilet?

00:28:47.860 --> 00:28:49.840
Like, you know, no, not that Python.

00:28:49.840 --> 00:28:50.660
Really not.

00:28:50.660 --> 00:28:51.840
Oh, no, no.

00:28:51.840 --> 00:28:53.680
And so I've just been super loving.

00:28:53.680 --> 00:28:57.120
I've been using Reader 5 with two E's.

00:28:57.120 --> 00:29:00.680
What a nice piece of software this thing is for $10.

00:29:00.680 --> 00:29:02.040
Okay.

00:29:02.040 --> 00:29:02.560
Really, really cool.

00:29:02.560 --> 00:29:02.860
Yeah.

00:29:02.860 --> 00:29:04.040
I'll check it out.

00:29:04.040 --> 00:29:04.460
Yeah.

00:29:04.640 --> 00:29:10.540
And another thing I would like, if people have awesome recommendations for blogs, especially

00:29:10.540 --> 00:29:15.280
Python blogs that I should be following or people, listeners should be following, put that

00:29:15.280 --> 00:29:19.240
on the YouTube channel comments or send it to us on Mastodon or Twitter.

00:29:19.240 --> 00:29:22.840
And maybe I'll give a shout out to the ones that are extra good.

00:29:22.840 --> 00:29:23.860
But very, very cool.

00:29:23.860 --> 00:29:24.660
Let's see.

00:29:24.660 --> 00:29:26.380
Check this out.

00:29:26.600 --> 00:29:29.220
There's a podcast called Sing for Science.

00:29:29.220 --> 00:29:35.820
And on season three, episode eight, which just came out six days ago, Rivers Cuomo of Weezer

00:29:35.820 --> 00:29:38.500
and Guido Van Rossum sit down for a conversation.

00:29:38.500 --> 00:29:39.440
How cool is that?

00:29:39.440 --> 00:29:40.260
That's pretty cool.

00:29:40.260 --> 00:29:41.600
That's really cool.

00:29:41.600 --> 00:29:42.880
So have you listened to it?

00:29:42.880 --> 00:29:43.940
Yeah, I listened to it.

00:29:43.940 --> 00:29:49.360
I grabbed my phone and my dog and went for a walk and listened to it because the sun came

00:29:49.360 --> 00:29:50.960
out and that was rare right now.

00:29:51.100 --> 00:29:52.720
Yeah, it's really interesting.

00:29:52.720 --> 00:29:53.860
Neat.

00:29:53.860 --> 00:29:59.120
It's a lot of the host talking to Rivers and talking to Guido and a little bit of interaction.

00:29:59.120 --> 00:30:03.300
I would love a little more facilitation of talking directly, but both great people.

00:30:03.300 --> 00:30:05.400
Rivers is awesome.

00:30:05.400 --> 00:30:06.840
He does really cool stuff with Python.

00:30:06.840 --> 00:30:12.920
I had him on Talk Python 327, little automation tools, which was fun.

00:30:13.100 --> 00:30:16.940
So yeah, he's a legit developer these days, which is pretty neat.

00:30:16.940 --> 00:30:17.400
All right.

00:30:17.400 --> 00:30:18.520
Final thing, Brian.

00:30:18.520 --> 00:30:19.980
Final extra, extra, extra.

00:30:19.980 --> 00:30:25.540
We started with, I started at least my segment with AI coding and I'm going to end it with

00:30:25.540 --> 00:30:26.620
AI coding Kite.

00:30:26.620 --> 00:30:27.620
Do you remember Kite?

00:30:27.620 --> 00:30:29.780
It was like the original GitHub co-pilot.

00:30:29.780 --> 00:30:30.320
Yeah.

00:30:30.320 --> 00:30:30.800
Yeah.

00:30:30.800 --> 00:30:33.240
Unfortunately, they are shutting down.

00:30:33.240 --> 00:30:37.120
So they've been around for 10 years or so.

00:30:37.120 --> 00:30:37.880
Not quite.

00:30:37.880 --> 00:30:39.160
Seven years, something like that.

00:30:39.160 --> 00:30:39.420
Really?

00:30:39.420 --> 00:30:41.300
Quite a while, but they're shutting down.

00:30:41.300 --> 00:30:44.260
So thanks for all the code, I suppose.

00:30:44.260 --> 00:30:45.160
And that's it.

00:30:45.160 --> 00:30:47.060
That's all I got for all my extras.

00:30:47.060 --> 00:30:49.140
I want to add one.

00:30:49.140 --> 00:30:55.860
So we talked to Simon Willison, talked to one of the one thing I didn't mention about in

00:30:55.860 --> 00:31:00.560
his talk is he encouraged people to write blogs because there's not that the blogs were huge

00:31:00.560 --> 00:31:04.700
for a while and then everybody was doing it and now not so much.

00:31:04.700 --> 00:31:08.580
And so you do get noticed more if you're writing a blog.

00:31:08.580 --> 00:31:10.100
I think that that's a good thing.

00:31:10.100 --> 00:31:13.940
Plus, we can link to it easier if you got your article on a blog.

00:31:13.940 --> 00:31:14.880
Absolutely.

00:31:15.320 --> 00:31:20.700
But also, and RSS wise, Planet Python is something I still check out.

00:31:20.700 --> 00:31:26.500
So planetpython.org, if you haven't heard of it, you can either have the full content so

00:31:26.500 --> 00:31:30.640
you can read and it pulls all of this through RSS from different blogs.

00:31:31.240 --> 00:31:38.620
So if you have, and titles only, if you have a Python blog or you're starting one, check

00:31:38.620 --> 00:31:42.280
out Python, planetpython.org and try to get your name on the list.

00:31:42.280 --> 00:31:47.580
Maybe put out like three or four articles first and then try to get your name on the list or

00:31:47.580 --> 00:31:48.580
your blog on the list.

00:31:48.580 --> 00:31:53.020
And that way it gets seen by people like us, even if you don't notify us.

00:31:53.280 --> 00:31:54.740
Yeah, that's excellent.

00:31:54.740 --> 00:31:58.900
I didn't subscribe to that because I feel like it's a little bit too much of everything.

00:31:58.900 --> 00:32:03.020
But I went through all the recent posts and said, this writer looks interesting or this

00:32:03.020 --> 00:32:05.220
source looks interesting and like subscribe directly.

00:32:05.220 --> 00:32:09.460
So I kind of used it to start my exploration of those things I wanted to subscribe to.

00:32:09.460 --> 00:32:10.580
Yeah, not a bad idea.

00:32:10.580 --> 00:32:13.280
And you know, they have RSS feeds because they're in here.

00:32:13.280 --> 00:32:14.260
So exactly.

00:32:15.080 --> 00:32:19.060
Since you brought it up, I just want to also point out like one of my roadblocks of writing

00:32:19.060 --> 00:32:23.440
a lot was, well, I don't have time to write like an article, something well thought out

00:32:23.440 --> 00:32:26.180
and, you know, a thousand words and that, you know what?

00:32:26.180 --> 00:32:31.260
My new philosophy has been, let's just write like really short posts.

00:32:31.260 --> 00:32:34.800
Like here's one about a fun thing I did with spammers and it's like three paragraphs.

00:32:34.800 --> 00:32:38.240
Or here's one about installing something as a PWA.

00:32:38.240 --> 00:32:40.680
It's two pictures and four paragraphs.

00:32:40.680 --> 00:32:46.020
And you don't, you don't have to write essay like long essays to contribute interesting

00:32:46.020 --> 00:32:47.380
things and ideas, I think.

00:32:47.380 --> 00:32:48.840
So I just following up on that.

00:32:48.840 --> 00:32:49.240
Yeah.

00:32:49.240 --> 00:32:53.740
My thoughts are if it's going to be a thread, make it a post instead.

00:32:53.740 --> 00:32:54.680
Yeah, exactly.

00:32:54.680 --> 00:32:55.420
Exactly.

00:32:55.420 --> 00:32:56.220
All right.

00:32:56.220 --> 00:32:59.340
Well, my jokes have vanished.

00:32:59.340 --> 00:33:02.260
I had a cool joke on social media and it got taken down.

00:33:02.260 --> 00:33:05.120
It was, it was, it was really funny.

00:33:05.120 --> 00:33:05.920
It was totally benign.

00:33:05.920 --> 00:33:07.520
I don't know why it's gone, but whatever.

00:33:07.520 --> 00:33:10.640
And then by the way, following up on this, Jeremy Page.

00:33:10.640 --> 00:33:13.440
It says you can also RSS Mastodon users.

00:33:13.440 --> 00:33:14.140
Okay.

00:33:14.140 --> 00:33:14.960
That's.

00:33:14.960 --> 00:33:19.420
And Mastodon hashtags as well.

00:33:19.420 --> 00:33:20.660
You can RSS those.

00:33:20.660 --> 00:33:21.100
Okay.

00:33:21.100 --> 00:33:21.560
Yeah.

00:33:21.560 --> 00:33:23.120
I follow the Python hashtag over there.

00:33:23.120 --> 00:33:24.420
I could RSS it, I suppose.

00:33:24.420 --> 00:33:25.280
Excellent.

00:33:25.280 --> 00:33:25.660
All right.

00:33:25.660 --> 00:33:26.100
Brian.

00:33:26.100 --> 00:33:28.080
So do you have a joke for us?

00:33:28.080 --> 00:33:28.640
Yeah.

00:33:28.640 --> 00:33:33.280
So speaking of Mastodon on Mastodon, I said, I'm getting, I'm getting a lot of great Python

00:33:33.280 --> 00:33:38.320
content on Mastodon, but I need some joke people to like, I need some nerd jokes.

00:33:38.700 --> 00:33:40.280
So I'm asking for people.

00:33:40.280 --> 00:33:44.060
And this, somebody didn't ask, tell me a person to follow.

00:33:44.060 --> 00:33:46.260
I'm still looking for people to follow with good jokes.

00:33:46.260 --> 00:33:51.660
So if you send them my way, if, or send me their way, if, if you know of people.

00:33:51.660 --> 00:33:54.680
But here's one that I got from somebody on Mastodon.

00:33:54.680 --> 00:33:57.240
So I got it from, who did I get this from?

00:33:57.240 --> 00:33:58.300
I should probably give credit.

00:33:59.340 --> 00:34:01.560
So this came from Steven Box.

00:34:01.560 --> 00:34:02.420
Nice.

00:34:02.420 --> 00:34:03.080
Thanks, Steven.

00:34:03.080 --> 00:34:06.620
So exit condition from monkeyuser.com.

00:34:06.620 --> 00:34:09.540
So it took me a while to get this.

00:34:10.740 --> 00:34:16.480
So there's a couple of people sitting at a desk, paraprogramming, I'm guessing.

00:34:16.480 --> 00:34:18.280
And then somebody else is frustrated.

00:34:18.280 --> 00:34:19.700
They hear, wait.

00:34:19.700 --> 00:34:22.600
And he says, the frustrated guy says, that's it.

00:34:22.600 --> 00:34:27.400
And, and, and he starts going towards a door that's labeled recursion.

00:34:27.480 --> 00:34:30.960
And somebody says, wait, there's no, I'm going in.

00:34:30.960 --> 00:34:37.660
He goes in and he gets into the other side and says, wait, he's the person trying to say, wait.

00:34:37.660 --> 00:34:39.380
Oh my gosh.

00:34:39.380 --> 00:34:41.420
There's no exit condition.

00:34:41.420 --> 00:34:45.240
So that's a dumb joke, but that's right.

00:34:45.240 --> 00:34:45.980
It's really good.

00:34:45.980 --> 00:34:52.280
And it's got some clever, the cartoon is clever where like the speech of the other one is off screen.

00:34:52.280 --> 00:34:57.160
So it kind of looks like it comes from the original group, but in fact is coming from the recursion of the first one.

00:34:57.160 --> 00:34:58.680
And then, yeah, it's, yeah.

00:34:58.680 --> 00:34:59.240
Okay.

00:34:59.240 --> 00:35:00.160
Well, one more.

00:35:00.160 --> 00:35:05.080
Somebody said, I should follow Olafur White.

00:35:05.080 --> 00:35:09.540
Anyways, I just thought this was dumb and funny.

00:35:09.540 --> 00:35:10.780
Bobby pin.

00:35:10.780 --> 00:35:13.740
No, I go by my full name, Robert Pindle.

00:35:13.740 --> 00:35:17.260
And it reminded me of the Bobby tables thing.

00:35:17.260 --> 00:35:18.280
So yes, exactly.

00:35:18.280 --> 00:35:19.400
I love it.

00:35:19.400 --> 00:35:19.920
All right.

00:35:19.920 --> 00:35:21.760
Well, thank you everyone for listening.

00:35:21.760 --> 00:35:23.440
And Brian, thanks for being here.

00:35:23.440 --> 00:35:24.000
Thank you.

00:35:24.000 --> 00:35:24.400
Yeah.

00:35:24.400 --> 00:35:25.460
Bye everyone.