WEBVTT

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

00:00:04.620 --> 00:00:11.320
This is episode 341, recorded June 20th, 2023, and I am Brian Okken.

00:00:11.320 --> 00:00:12.260
And I'm Michael Kennedy.

00:00:12.260 --> 00:00:14.560
This episode is sponsored by us.

00:00:14.560 --> 00:00:18.960
If you want to support us, you can take one of the courses at Talk Python Training.

00:00:18.960 --> 00:00:20.960
There's an excellent pytest course there.

00:00:20.960 --> 00:00:26.720
And please check out Test and Code podcast and a book about pytest if you're curious.

00:00:26.720 --> 00:00:29.900
We also have Patreon supporters, so thank you, Patreon supporters.

00:00:29.900 --> 00:00:37.780
If you'd like to talk to us or suggest something, we've got a contact form at pythonbytes.fm.

00:00:37.780 --> 00:00:41.880
But you can also send us something on Mastodon.

00:00:41.880 --> 00:00:49.000
We're all at fosstodon.org, at mkennedy, @brianokken, and at Python Bytes.

00:00:49.000 --> 00:00:50.720
And we check those regularly.

00:00:50.720 --> 00:00:52.220
Let's hit it off.

00:00:52.220 --> 00:00:54.560
Michael, what do you got for us for the first topic?

00:00:54.560 --> 00:00:57.040
I'm going to back up what you just said, Brian.

00:00:57.040 --> 00:00:57.620
Okay.

00:00:57.620 --> 00:01:00.500
The very first item comes to us from Mario Munoz.

00:01:00.500 --> 00:01:01.300
Thank you, Mario.

00:01:01.300 --> 00:01:02.680
Right on Mastodon.

00:01:02.680 --> 00:01:03.500
Awesome.

00:01:03.500 --> 00:01:06.140
Mario says, the Pydantic roadmap looks interesting.

00:01:06.140 --> 00:01:09.940
I especially like the combination of analytics and observability.

00:01:09.940 --> 00:01:12.100
Looking forward to what the team ends up building.

00:01:12.100 --> 00:01:16.560
So the first thing I want to talk about is this thing that Mario referenced pointed us at.

00:01:16.560 --> 00:01:21.800
The Pydantic 2.0 roadmap, or more specifically, Pydantic Incorporated.

00:01:22.280 --> 00:01:24.780
So recall Samuel Colvin, excellent guy.

00:01:24.780 --> 00:01:25.680
Got to hang out.

00:01:25.680 --> 00:01:29.560
We both got to hang out both with Mario and Samuel at PyCon this year, which was fun.

00:01:29.560 --> 00:01:38.520
And he announced Pydantic Incorporated, which is a company around building data tools, somewhat

00:01:38.520 --> 00:01:44.180
around Pydantic and Rust and those kinds of things for the Python and larger space, the larger

00:01:44.180 --> 00:01:44.900
developer space.

00:01:44.900 --> 00:01:49.020
But it didn't have a ton of details of exactly where they were going.

00:01:49.400 --> 00:01:51.540
So this roadmap is two things.

00:01:51.540 --> 00:01:57.040
It is a hint on what Pydantic Inc. is going to be about, what kind of tools Samuel and

00:01:57.040 --> 00:01:57.900
team are going to offer.

00:01:57.900 --> 00:02:03.480
There's also a call to action to help them choose the right direction so that when they

00:02:03.480 --> 00:02:06.860
go off building things, they might build something that you actually would want to use.

00:02:06.860 --> 00:02:07.520
Oh, cool.

00:02:07.520 --> 00:02:07.980
Yeah.

00:02:07.980 --> 00:02:08.360
Right.

00:02:08.360 --> 00:02:14.460
And so it says, look, in return for giving us honest feedback, you have the option to get

00:02:14.460 --> 00:02:18.680
early access, get inside the closed beta, all those things for the platform.

00:02:18.680 --> 00:02:23.640
And if you're familiar with Pydantic, you know, it's all about data exchange, data validation,

00:02:23.640 --> 00:02:27.480
strong schemas where there are none and those kinds of things, right?

00:02:27.480 --> 00:02:29.620
Bringing sanity to your data, as they say.

00:02:29.620 --> 00:02:31.540
So there's two tacks here.

00:02:31.540 --> 00:02:35.140
Samuel says, well, first, before going into what we might build, I want to tell you what

00:02:35.140 --> 00:02:35.780
we're not building.

00:02:35.780 --> 00:02:38.480
We're not building a new database or query engine.

00:02:38.480 --> 00:02:43.480
They're not going to be building or pretending that non-developers or AI can do the job of a

00:02:43.480 --> 00:02:44.440
developer, right?

00:02:44.440 --> 00:02:47.320
They want to accelerate developers' workflows.

00:02:47.320 --> 00:02:49.820
So for example, they're going to have CLIs before they have GUIs.

00:02:49.820 --> 00:02:55.920
And they're not doing 314 integrations into every conceivable technology, right?

00:02:55.920 --> 00:02:57.680
Think Zapier or something like that.

00:02:57.680 --> 00:02:58.900
If this, then that.

00:02:58.900 --> 00:03:02.100
And finally, they're not going to have an SDK for every language.

00:03:02.100 --> 00:03:05.700
They're just focusing on a few languages with Python right up front, I'm sure.

00:03:05.700 --> 00:03:07.120
So it says, how can you help?

00:03:07.120 --> 00:03:11.480
Well, give us feedback on the five different things that they're considering.

00:03:11.480 --> 00:03:11.920
Okay.

00:03:11.920 --> 00:03:12.500
Okay.

00:03:13.000 --> 00:03:16.480
Number one, this is the one that Mario liked.

00:03:16.480 --> 00:03:19.220
Python analytics and observability.

00:03:19.220 --> 00:03:25.400
A logging and metrics platform with tight integration with Python and Pydantic designed

00:03:25.400 --> 00:03:30.280
to make the data flowing through your application more readily usable for both engineering and

00:03:30.280 --> 00:03:31.260
business analytics.

00:03:31.260 --> 00:03:31.760
Right?

00:03:31.800 --> 00:03:35.320
So if you're doing, say, FastAPI, exchanging data, right?

00:03:35.680 --> 00:03:41.320
Over at Python bytes, like all the stuff coming to you has come through Pydantic classes because

00:03:41.320 --> 00:03:45.480
we're using Bini as the database access layer, which is based on Pydantic, if you don't know.

00:03:45.480 --> 00:03:46.460
Okay.

00:03:46.460 --> 00:03:48.800
So that's the analytics and observability.

00:03:48.800 --> 00:03:53.440
Another one is a couple angles here around data gateways for object stores.

00:03:53.560 --> 00:03:59.220
So think S3, something, you know, Azure blob storage, those kinds of things, visualization spaces.

00:04:00.080 --> 00:04:02.200
So a gateway for your object store.

00:04:02.200 --> 00:04:08.120
So add validation, transformation, and cataloging in front of things like S3 with schemas defined

00:04:08.120 --> 00:04:11.700
and Pydantic models and then validated by their Rust service.

00:04:11.700 --> 00:04:15.260
Or same idea, but integrated into your existing data warehouse.

00:04:15.640 --> 00:04:17.440
Number four is a schema catalog.

00:04:17.440 --> 00:04:22.780
For many, Pydantic already holds the highest fidelity representation of data schemas.

00:04:22.780 --> 00:04:27.700
So if you had a schema catalog, it could take that to the next level, serving as an organization

00:04:27.700 --> 00:04:30.460
wide single source of truth for those schemas.

00:04:30.460 --> 00:04:35.720
So if you've got a bunch of different, different apps or whatever, especially across language,

00:04:35.720 --> 00:04:41.260
maybe that languages that's that talk to certain data stores, certain APIs, like might be some

00:04:41.260 --> 00:04:44.060
kind of central store that says, this is what it looks like.

00:04:44.060 --> 00:04:46.820
And here's how you maybe generate classes to talk to it.

00:04:46.820 --> 00:04:52.260
Finally, dashboards and UIs powered by Pydantic models, a managed platform to deploy and control

00:04:52.260 --> 00:04:57.420
dashboards, auxiliary apps, and internal tools where everything from UI components like forms

00:04:57.420 --> 00:05:01.100
and tables to database schema would be defined in Python using Pydantic models.

00:05:01.100 --> 00:05:06.740
So they go into a bunch of details with code samples of what they actually might look like

00:05:06.740 --> 00:05:08.840
if you were to go down one of these paths.

00:05:08.840 --> 00:05:12.840
But I'm just going to leave it here and say, encourage everyone who cares about this to go

00:05:12.840 --> 00:05:17.140
participate in Samuel's survey so that they get the right feedback that they need.

00:05:17.140 --> 00:05:19.100
Is all of the above an option?

00:05:19.100 --> 00:05:20.440
Because that all sounds great.

00:05:20.440 --> 00:05:21.980
Yeah, that sounds pretty good, doesn't it?

00:05:21.980 --> 00:05:22.420
Yeah.

00:05:22.420 --> 00:05:27.580
And some of these don't really apply to me, like a schema catalog for the whole company, right?

00:05:27.580 --> 00:05:30.260
Like it's me, sometimes me and another developer.

00:05:30.260 --> 00:05:35.440
So it's, you know, but if you were in a large organization, even a handful of people or a couple

00:05:35.440 --> 00:05:37.860
of software teams, it's just to get real valuable.

00:05:38.200 --> 00:05:43.480
I think they all look great, but the data gateway for data warehouses and for object stores,

00:05:43.480 --> 00:05:51.320
it sounds really cool because, I mean, that's a sort of, actually, the, yeah, they all look

00:05:51.320 --> 00:05:51.780
pretty good.

00:05:51.780 --> 00:05:52.520
I was curious.

00:05:52.520 --> 00:05:54.300
So you use Pydantic now, right?

00:05:54.300 --> 00:05:56.600
So what happened?

00:05:56.740 --> 00:06:01.800
So I know one of the things it does is it filters out like stuff that, or it sends a,

00:06:01.800 --> 00:06:03.380
like an error code or something.

00:06:03.380 --> 00:06:09.620
If you try to send data and it's not the right type or the right kind of data, is that reported

00:06:09.620 --> 00:06:10.020
somewhere?

00:06:10.020 --> 00:06:12.900
Or is that part of the analytics and observability thing?

00:06:12.900 --> 00:06:13.660
Because...

00:06:13.660 --> 00:06:17.800
I think that would be analytics and observability because right now it just appears as an exception.

00:06:17.800 --> 00:06:21.580
And if you have integration with something like Sentry or one of them other things, then

00:06:21.580 --> 00:06:24.760
it would, you know, report it as an exception with some details.

00:06:24.760 --> 00:06:26.500
But that's, I don't think that's what they're thinking.

00:06:26.500 --> 00:06:31.440
I think they're thinking much more, you know, even possibly like success data going through.

00:06:31.440 --> 00:06:32.020
Oh, yeah.

00:06:32.020 --> 00:06:32.440
Yeah.

00:06:32.440 --> 00:06:35.900
Like really see how people are using an API.

00:06:35.900 --> 00:06:38.160
So, or using an entry point.

00:06:38.160 --> 00:06:40.100
I think that's, that looks pretty cool.

00:06:40.100 --> 00:06:40.800
Yeah.

00:06:40.800 --> 00:06:41.660
It does look pretty cool.

00:06:41.660 --> 00:06:42.700
Nice.

00:06:43.320 --> 00:06:44.780
Well, over to you.

00:06:44.780 --> 00:06:47.300
I'd like to talk about shells.

00:06:47.300 --> 00:06:52.940
So out of the web and into talking with, talking with your operating system, kind of.

00:06:52.940 --> 00:06:59.040
So I want to highlight an article called the right way to run shell commands from Python.

00:06:59.040 --> 00:07:03.660
So it's not, I guess it's not really necessarily shell commands, but kind of.

00:07:03.660 --> 00:07:09.060
So when you're, when you're writing some Python programs have to interact with the operating system

00:07:09.060 --> 00:07:13.300
for things like file system things or starting other applications.

00:07:13.300 --> 00:07:16.640
And there's various ways to do that.

00:07:16.640 --> 00:07:21.580
But one of the, I guess, I guess that's kind of part of this article is talking about some

00:07:21.580 --> 00:07:22.180
of these tools.

00:07:22.180 --> 00:07:27.700
So there's a, it starts off with talking about natively into Python.

00:07:27.860 --> 00:07:32.480
So some things that you might not, when you start having to think I have to interact with the,

00:07:32.480 --> 00:07:38.180
with the shell, you might not have to actually, like there's path lib that can, can do quite

00:07:38.180 --> 00:07:43.640
a bit for you and you can create temp files and stuff like that with a temp file package.

00:07:43.640 --> 00:07:48.680
And there's a shutil, which is, I guess, pretty good.

00:07:48.680 --> 00:07:53.300
And, and I've never used syslog or, or signal, but those things are around.

00:07:53.860 --> 00:07:54.300
Okay.

00:07:54.300 --> 00:07:56.280
So those are, those are things built into Python.

00:07:56.280 --> 00:07:59.640
So make sure that you check out the things built into Python already.

00:07:59.640 --> 00:08:06.280
But then there's, there's a couple other different modules that might help the OS module.

00:08:06.280 --> 00:08:12.880
He's kind of using, going this backwards is, is probably don't directly reach for the OS module,

00:08:12.880 --> 00:08:16.120
but there's a few things in the OS module that are really great.

00:08:16.120 --> 00:08:21.280
Like to get your, get, get environmental variables, like get the path variable or something.

00:08:21.280 --> 00:08:23.200
You can use OS get, get env.

00:08:23.200 --> 00:08:27.140
And there's a few other things like getting username and stuff.

00:08:27.140 --> 00:08:31.120
But the, I guess, get you name.

00:08:31.120 --> 00:08:32.020
I don't know what that is.

00:08:32.020 --> 00:08:32.700
Is that username?

00:08:32.700 --> 00:08:33.460
I don't know.

00:08:33.460 --> 00:08:40.600
But anyway, the, so there's a few, a few things in the OS module that are interesting that you're

00:08:40.600 --> 00:08:41.600
probably not looking there.

00:08:42.300 --> 00:08:49.140
I often have, have used sub process and this is, I guess, a reminder that with modern Python

00:08:49.140 --> 00:08:54.140
development, you, if you're using sub process, you probably want sub process run, even though

00:08:54.140 --> 00:09:00.120
there's a lot of other legacy stuff in the sub project, sub process.

00:09:00.120 --> 00:09:00.960
Yeah.

00:09:00.960 --> 00:09:02.040
Open and P open.

00:09:02.040 --> 00:09:02.620
Yeah.

00:09:02.620 --> 00:09:03.900
P open, for example.

00:09:03.900 --> 00:09:04.320
Yeah.

00:09:04.320 --> 00:09:04.660
Yeah.

00:09:04.660 --> 00:09:05.900
And call.

00:09:05.900 --> 00:09:07.000
You probably don't want those.

00:09:07.000 --> 00:09:08.460
What you probably want is run.

00:09:08.460 --> 00:09:13.560
Run is kind of a catch all that works for most things now.

00:09:13.560 --> 00:09:24.260
Because I really like, doesn't show it in the example, but there's, there's options in run to just turn on like in encoding.

00:09:24.260 --> 00:09:27.060
Here's the encoding bit that says, you know, turn it, turn it on.

00:09:27.060 --> 00:09:28.560
And there's the standard end.

00:09:28.560 --> 00:09:28.960
Oh yeah.

00:09:28.960 --> 00:09:29.480
There it is.

00:09:29.480 --> 00:09:32.140
Capture standard capture output equals true.

00:09:32.140 --> 00:09:34.940
So that's the, is, is so that you can capture the output.

00:09:34.940 --> 00:09:39.520
That's often what I want to do if I'm running a program is find out what its output is.

00:09:39.520 --> 00:09:41.140
So this is handy.

00:09:41.140 --> 00:09:50.240
the, however, one of the things that I haven't used, this, this article, Martin Hines, mentions, there's one right

00:09:50.240 --> 00:09:55.500
way and in his, for his opinion, the right way is use the, third party package.

00:09:55.500 --> 00:10:01.160
which is that, which is a very unsearchable package name called the essay.

00:10:01.160 --> 00:10:04.280
You don't even want to talk about it.

00:10:05.620 --> 00:10:10.920
So I have no idea if anybody's written about this because it's really hard to Google SH because

00:10:10.920 --> 00:10:11.780
it's everywhere.

00:10:11.780 --> 00:10:14.360
but it's kind of a neat package.

00:10:14.360 --> 00:10:21.280
so I looked it up of course, and it's, tested on all sorts of versions

00:10:21.280 --> 00:10:22.900
and downloaded a ton.

00:10:23.080 --> 00:10:29.260
So 3.9 million a month, look at the stars, 6.6 thousand stars.

00:10:29.260 --> 00:10:31.560
So, fairly popular package.

00:10:31.560 --> 00:10:33.360
So most of you probably already know about it.

00:10:33.360 --> 00:10:34.480
but the.

00:10:34.480 --> 00:10:35.280
It's just us, Brian.

00:10:35.280 --> 00:10:38.740
We didn't know, but there's, it's kind of neat.

00:10:38.740 --> 00:10:43.960
There's what it is, is you've got commands that are, that are just kind of look like

00:10:43.960 --> 00:10:44.880
they did before.

00:10:44.880 --> 00:10:47.600
Like LS is sh.ls.

00:10:47.600 --> 00:10:48.860
That's kind of neat.

00:10:48.860 --> 00:10:50.140
And you can pass in arguments.

00:10:50.140 --> 00:10:52.820
what's, some of the others.

00:10:52.820 --> 00:10:55.380
Like, I'm going to go over to the documentation.

00:10:55.380 --> 00:10:56.500
You've got LS.

00:10:56.500 --> 00:10:58.840
You've got like, what else?

00:10:58.840 --> 00:11:02.020
Oh, I guess it just has LX examples.

00:11:02.020 --> 00:11:03.060
Get.

00:11:03.060 --> 00:11:04.840
Yeah, get that.

00:11:04.840 --> 00:11:05.520
That's cool.

00:11:05.520 --> 00:11:06.140
Anyway.

00:11:06.140 --> 00:11:07.440
find.

00:11:07.440 --> 00:11:08.580
There's a few others.

00:11:08.580 --> 00:11:09.760
There's a, there's a bunch of others.

00:11:09.760 --> 00:11:14.960
Actually, it's a pretty big package and it isn't, it isn't a rewriting of all of these

00:11:14.960 --> 00:11:15.300
things.

00:11:15.300 --> 00:11:17.340
It's actually talking to your operating system.

00:11:17.340 --> 00:11:18.540
So that's the catch.

00:11:18.540 --> 00:11:22.500
It's talking to a, a, a Unix like operating system.

00:11:22.500 --> 00:11:23.860
So it works on Linux.

00:11:23.860 --> 00:11:24.980
It works on Mac.

00:11:24.980 --> 00:11:26.640
It will not work on Windows apparently.

00:11:26.640 --> 00:11:27.000
So.

00:11:27.000 --> 00:11:30.500
Unless you're using Windows, Linux subsystem for a window.

00:11:30.500 --> 00:11:30.880
Wait.

00:11:30.880 --> 00:11:31.480
Yeah.

00:11:31.480 --> 00:11:33.160
Linux subsystem for Windows.

00:11:33.160 --> 00:11:34.060
Maybe.

00:11:34.060 --> 00:11:35.040
yeah.

00:11:35.040 --> 00:11:36.040
Or Linux, I guess it is.

00:11:36.040 --> 00:11:36.180
Yeah.

00:11:36.180 --> 00:11:39.120
Anyway, the embedded Linux, you can run on Windows if you want.

00:11:39.120 --> 00:11:39.560
Okay.

00:11:39.680 --> 00:11:40.500
Cause that's just Ubuntu.

00:11:40.500 --> 00:11:41.220
So it should work.

00:11:41.220 --> 00:11:41.660
Perfect.

00:11:41.660 --> 00:11:44.600
One thing I like, if you scroll up just a little bit here so I can point at you on it.

00:11:44.600 --> 00:11:46.820
So it says, actually it's down on one page.

00:11:46.820 --> 00:11:53.320
It says, what you can do is you can say sh dot ls or you can create a command like any,

00:11:53.320 --> 00:11:55.500
any executable you want.

00:11:55.500 --> 00:11:59.240
You can just say sh dot command and you give it the path to the executable.

00:11:59.240 --> 00:12:00.020
Oh, right.

00:12:00.020 --> 00:12:05.540
And then the arguments can be passed as if they were a function call on that resulting thing.

00:12:05.540 --> 00:12:09.640
So instead of like chaining it all together, you could say like create the git command and

00:12:09.640 --> 00:12:15.980
then you could do a, a git parenthesis, you know, check out comma main or prod or whatever.

00:12:15.980 --> 00:12:16.480
Right.

00:12:16.480 --> 00:12:19.280
That's a pretty cool way to integrate with the command line there.

00:12:19.280 --> 00:12:19.720
Yeah.

00:12:19.720 --> 00:12:20.500
That is pretty neat.

00:12:20.500 --> 00:12:23.980
So, and that, that'll work with even your, like, like you said.

00:12:23.980 --> 00:12:27.800
So if you look at the next example down right below the ls underscore command.

00:12:27.800 --> 00:12:28.400
Yeah.

00:12:28.400 --> 00:12:28.940
Yeah.

00:12:28.940 --> 00:12:30.320
Custom CMD is what it says.

00:12:30.320 --> 00:12:30.480
Yeah.

00:12:30.480 --> 00:12:35.840
So your own command, you can, you can have it run something and have the arguments listed.

00:12:35.840 --> 00:12:36.680
It's pretty neat.

00:12:36.680 --> 00:12:38.560
It'd even be another Python command.

00:12:38.840 --> 00:12:41.380
You might think, why would I ever do that in Python?

00:12:41.380 --> 00:12:44.480
But, you know, maybe that's coming out of a different virtual environment with like some

00:12:44.480 --> 00:12:48.800
setup that's got a bunch of things that you're not integrating into your system.

00:12:48.800 --> 00:12:49.220
I don't know.

00:12:49.220 --> 00:12:49.840
There might be reasons.

00:12:49.840 --> 00:12:59.180
Or you're using, so, like if you're using, what click or was the typer, they

00:12:59.180 --> 00:13:03.380
have built in test frameworks, but if you have another, a different, command line interface

00:13:03.380 --> 00:13:07.480
that you're testing against, it might not have a way to run the commands directly.

00:13:07.480 --> 00:13:10.260
So you could use this to run a Python command for testing.

00:13:10.260 --> 00:13:10.560
Yeah.

00:13:10.560 --> 00:13:11.960
So neat.

00:13:11.960 --> 00:13:15.160
A couple of, live stream comments, Brian.

00:13:15.160 --> 00:13:17.600
Michael says, the Michael, Michael W.

00:13:17.600 --> 00:13:21.840
Every time I fall back to OS dot system out of habit, I feel like the old guy measuring

00:13:21.840 --> 00:13:24.880
his gas mileage and rods for hedgehog's head.

00:13:25.940 --> 00:13:26.760
I love it.

00:13:26.760 --> 00:13:32.460
And then Henry Schreiner out there says there's also a plumbum of which he's been a maintainer

00:13:32.460 --> 00:13:33.040
since 2000.

00:13:33.040 --> 00:13:40.100
Similar to SH, but he's not, well, not really up on them both well enough to like give a comparison.

00:13:40.100 --> 00:13:41.660
He doesn't know SH that well.

00:13:41.660 --> 00:13:43.000
I will check out plumbum.

00:13:43.000 --> 00:13:43.620
Nice.

00:13:43.620 --> 00:13:44.520
Cool.

00:13:44.520 --> 00:13:45.200
Thanks guys.

00:13:45.200 --> 00:13:46.420
Well, what you got for us?

00:13:46.420 --> 00:13:47.280
I think.

00:13:47.280 --> 00:13:47.880
Oh yeah.

00:13:47.900 --> 00:13:48.580
No, we got one more.

00:13:48.580 --> 00:13:50.100
Don't we got another one.

00:13:50.100 --> 00:13:53.540
So over here I've got, or do we want to do an end?

00:13:53.540 --> 00:13:57.020
Well, encourage people to check out the courses over talk about on training.

00:13:57.020 --> 00:14:00.060
Always supports us that way, including the pie test course.

00:14:00.060 --> 00:14:03.500
Check out the new mobile app that we built and check out the pie test book.

00:14:03.500 --> 00:14:05.100
That's really supporting our work.

00:14:05.100 --> 00:14:09.400
that way is really the best way to support the podcast and visit and visiting the sponsors

00:14:09.400 --> 00:14:11.060
when we have other sponsors.

00:14:11.440 --> 00:14:14.740
But I want to talk about buying and selling your data.

00:14:14.740 --> 00:14:21.160
So there's an article on PCMag of all places that I got this, that talks about a report released

00:14:21.160 --> 00:14:29.940
by the Office of the Director of National Intelligence, ODNI, which pretty much I'm going to refer to

00:14:29.940 --> 00:14:30.900
them from here on out.

00:14:30.900 --> 00:14:36.380
ODNI released this, or declassified this report from January, 2022.

00:14:37.020 --> 00:14:42.160
And the headline is the U.S. says, United States says, yep, we're buying your data, including

00:14:42.160 --> 00:14:43.380
your embarrassing secrets.

00:14:43.380 --> 00:14:49.300
Digital information can be purchased from commercial data brokers and de-anonymized to ID the person

00:14:49.300 --> 00:14:52.900
it is tied to, including U.S. citizens, says the ODNI.

00:14:52.900 --> 00:14:53.840
That's a little disturbing.

00:14:53.840 --> 00:15:00.740
So when you, you know, when you go to, you know, that ad-ridden website that has 29 trackers

00:15:00.740 --> 00:15:04.460
and 42 ad networks on it, right?

00:15:04.500 --> 00:15:08.060
They're collecting a bunch of data, but that same network is on a bunch of other sites

00:15:08.060 --> 00:15:09.620
and they're pulling all those things together.

00:15:09.620 --> 00:15:14.920
We have these data brokers who gather all that information, but also really, really frustrating

00:15:14.920 --> 00:15:20.380
things where they buy and sell your credit card data and you don't get to say whether or

00:15:20.380 --> 00:15:22.200
not you want your credit card data for sale.

00:15:22.200 --> 00:15:24.240
I'm pretty sure it was T-Mobile.

00:15:24.240 --> 00:15:29.980
There's one of the mobile carriers who was selling your location data and you didn't get to opt

00:15:29.980 --> 00:15:30.380
out of it.

00:15:30.380 --> 00:15:32.420
Just like, well, you're using your phone, right?

00:15:32.440 --> 00:15:33.800
Just so why isn't that for sale?

00:15:33.800 --> 00:15:37.660
And all of that stuff gets combined into like a profile on you, right?

00:15:37.660 --> 00:15:38.400
A shadow profile.

00:15:38.400 --> 00:15:46.000
And so the news is that the declassified report here talks about how the U.S. has been buying

00:15:46.000 --> 00:15:53.280
large amounts of this type of commercial information for purposes of spying and other intelligence

00:15:53.280 --> 00:15:54.400
related things.

00:15:54.400 --> 00:15:54.780
Right.

00:15:54.860 --> 00:15:59.040
And to some degree, I support what the U.S. does with national intelligence.

00:15:59.040 --> 00:16:02.200
You want them to keep us safe and things like that.

00:16:02.200 --> 00:16:05.260
On the other hand, this seems really out of bounds, right?

00:16:05.260 --> 00:16:12.820
Like I think the report itself even said the declassification report prompted Senator Wyden

00:16:12.820 --> 00:16:15.580
to call on the U.S. government to rein in unchecked surveillance.

00:16:15.580 --> 00:16:22.720
And according to the report, ODNI does not even know which agents are doing this and said

00:16:22.720 --> 00:16:28.140
if the government can buy its way around the Fourth Amendment, the required must have a reason

00:16:28.140 --> 00:16:31.280
to search people and their properties due process.

00:16:31.280 --> 00:16:33.280
Then, you know, what's the point of it, right?

00:16:33.480 --> 00:16:37.640
So that's basically what this report goes through and talks about.

00:16:37.640 --> 00:16:44.540
And yeah, it's not terribly scary, but it's just another reminder that you should be, when

00:16:44.540 --> 00:16:51.260
you go to a website, like if you go to say CNN.com or somewhere else and you get a big pop-up,

00:16:51.260 --> 00:16:52.500
don't you want to support us?

00:16:52.500 --> 00:16:54.240
Unblock your ad blocker, right?

00:16:54.240 --> 00:16:57.140
It's not just about selling the ads, right?

00:16:57.140 --> 00:17:05.380
It's about, you know, willingly feeding yourself into surveillance pipelines, into retargeting

00:17:05.380 --> 00:17:10.140
pipelines that might change the price you pay for insurance or determine whether or not

00:17:10.140 --> 00:17:15.120
you're eligible for a mortgage, not because of what you present, but because of, you know,

00:17:15.120 --> 00:17:19.860
some back-channel thing that has been discovered about you in some way that you didn't intend

00:17:19.860 --> 00:17:22.180
to or probably, you know, maybe doesn't even make sense, right?

00:17:22.180 --> 00:17:22.620
Yeah.

00:17:22.840 --> 00:17:26.780
Accidentally clicked a link and now you're marked as something that you didn't necessarily

00:17:26.780 --> 00:17:27.500
mean to be, right?

00:17:27.500 --> 00:17:30.040
So anyway, you can, people can look through this.

00:17:30.040 --> 00:17:35.140
I just want to encourage, encourage folks to like, as they think about working with ad

00:17:35.140 --> 00:17:38.420
companies, they think about creating these products, just, you know, probably less ads,

00:17:38.420 --> 00:17:38.920
right?

00:17:38.920 --> 00:17:41.500
Over at Python Bytes, go to one of these.

00:17:41.500 --> 00:17:42.640
We have our ads right here.

00:17:42.640 --> 00:17:45.360
I have like the most intense ad blocking you can get pretty much.

00:17:45.360 --> 00:17:46.660
And what do we see right there?

00:17:46.660 --> 00:17:49.800
An ad from Influx Data because we're not retracking you.

00:17:49.800 --> 00:17:50.560
We're not targeting you.

00:17:50.560 --> 00:17:52.620
You don't see a cookie banner because there's no cookies.

00:17:52.620 --> 00:17:52.980
Right.

00:17:52.980 --> 00:17:54.180
There's no third-party cookies.

00:17:54.180 --> 00:17:57.000
And this, this is certainly possible.

00:17:57.000 --> 00:18:02.200
So I encourage people to use browsers such as Vivaldi or Brave, not Chrome, that do not

00:18:02.200 --> 00:18:05.920
track you as well as NextDNS.io.

00:18:05.920 --> 00:18:07.540
I put a link to that in the show notes.

00:18:07.540 --> 00:18:10.740
So NextDNS, got to spell that right.

00:18:10.740 --> 00:18:12.160
Which is, this is awesome.

00:18:12.160 --> 00:18:14.860
I talked about it before, but like on your mobile phone app.

00:18:14.860 --> 00:18:19.040
So for example, Flipboard is a thing you flip through when you're magazine ads or Apple

00:18:19.040 --> 00:18:20.220
News, when you open it up.

00:18:20.220 --> 00:18:24.120
Those are still full of ads, even if you've got an ad blocker installed on your browser.

00:18:24.120 --> 00:18:24.680
Right.

00:18:24.680 --> 00:18:29.420
But once you put this on your local network, then everything has ad blocking built in, even

00:18:29.420 --> 00:18:31.200
your mobile apps, which is pretty excellent.

00:18:31.200 --> 00:18:32.060
That's pretty cool.

00:18:32.060 --> 00:18:32.500
Yeah.

00:18:33.740 --> 00:18:39.240
And I highly encourage people with like lots of non-tech savvy people in your household

00:18:39.240 --> 00:18:42.880
to turn this on so that people that can be protected.

00:18:42.880 --> 00:18:43.400
Anyway.

00:18:43.400 --> 00:18:49.040
The only trick is it's a little bit challenging to turn it off because it's like a router setting

00:18:49.040 --> 00:18:50.000
for the whole system.

00:18:50.000 --> 00:18:50.540
Okay.

00:18:50.580 --> 00:18:55.760
And so what you can do is you can set up DNS over HTTP on your browsers, right?

00:18:55.760 --> 00:18:58.380
So that way, even if you're not at home, it still works.

00:18:58.380 --> 00:19:03.720
But also I have a second browser, a second browser that if I have to turn off that, I

00:19:03.720 --> 00:19:08.840
set its HTTPS or DNS over HTTPS to a non-blocking one.

00:19:08.840 --> 00:19:13.920
So I can turn on the ads with that browser explicitly, like to get around this so I don't have to configure

00:19:13.920 --> 00:19:14.300
things.

00:19:14.300 --> 00:19:16.880
But it's a tiny bit of a hassle, but it's super worth it.

00:19:17.020 --> 00:19:23.820
Another thing, you talked about ads, but there's also tracking analytics.

00:19:23.820 --> 00:19:30.100
So a lot of people are not doing any ads, but they're just curious about how good their site

00:19:30.100 --> 00:19:31.400
is working and stuff.

00:19:31.400 --> 00:19:34.640
So they turn on Google Analytics or some other analytics.

00:19:34.640 --> 00:19:41.220
And a lot of analytics are kind of awful about collecting and selling data.

00:19:41.220 --> 00:19:43.360
You might get a little bit of value.

00:19:43.360 --> 00:19:46.920
Google gets a lot of value from seeing everybody that goes to your website.

00:19:46.920 --> 00:19:53.340
So I do like a lot of people switching to other types of analytics, collecting download

00:19:53.340 --> 00:19:53.720
counts.

00:19:53.720 --> 00:19:56.520
A lot of times you're just your host can do that.

00:19:56.520 --> 00:19:59.420
You don't need to put that in cookies or anything like that.

00:19:59.420 --> 00:19:59.860
Exactly.

00:19:59.860 --> 00:20:00.500
Exactly.

00:20:00.500 --> 00:20:01.660
That's what we did as well.

00:20:01.660 --> 00:20:03.500
I do want to point out one final thing.

00:20:03.500 --> 00:20:05.640
I do find it kind of ironic.

00:20:05.640 --> 00:20:07.800
I don't know really what you do about this in life.

00:20:07.960 --> 00:20:12.560
So this article is on PCMag, which is a nice, well-written article by Michael Pan.

00:20:12.560 --> 00:20:18.160
If I go to search that in Haggy and I pull it up, Haggy has like a privacy report on the

00:20:18.160 --> 00:20:19.620
right-hand side of all these things.

00:20:19.620 --> 00:20:25.780
19 trackers and blockers, including advertising, Google email aggressive, fingerprinting, email

00:20:25.780 --> 00:20:28.380
invasive, fingerprinting, on and on and on.

00:20:28.440 --> 00:20:29.240
It's like, well, okay.

00:20:29.240 --> 00:20:29.860
Wow.

00:20:29.860 --> 00:20:36.000
As you go to learn about how this is not ideal, you only get 19 trackers put on you.

00:20:36.000 --> 00:20:37.220
Yeah.

00:20:37.220 --> 00:20:37.840
Yeah.

00:20:37.840 --> 00:20:39.600
Okay.

00:20:39.600 --> 00:20:45.520
Maybe one final thing here is Daniel points out, PyHole DNS ad blocker has a feature that

00:20:45.520 --> 00:20:47.800
lets you disable ad blocking for a period of time.

00:20:47.800 --> 00:20:48.200
Interesting.

00:20:48.200 --> 00:20:52.480
And so the next DNS thing is like PyHole as a service, basically.

00:20:52.480 --> 00:20:53.860
So there's some more.

00:20:53.860 --> 00:20:54.300
Interesting.

00:20:54.300 --> 00:20:54.620
Okay.

00:20:54.620 --> 00:20:55.340
All right.

00:20:55.520 --> 00:21:01.200
Well, on a slightly brighter note, maybe, let's talk about pytest.

00:21:01.200 --> 00:21:02.140
Yes.

00:21:02.140 --> 00:21:09.980
So Frank Wiles wrote an article for Rebsys titled Pro Tip, pytest fixtures are magic.

00:21:09.980 --> 00:21:13.000
They're not really magic, but they kind of look like magic.

00:21:13.000 --> 00:21:13.920
They seem like magic.

00:21:13.920 --> 00:21:22.060
So I just wanted to highlight this because it was a pretty, fixtures are the part of pytest

00:21:22.060 --> 00:21:23.380
that is the brain shift.

00:21:23.740 --> 00:21:31.460
So when you get into pytest, understanding fixtures is the big thing that is difficult

00:21:31.460 --> 00:21:32.500
to get your head around.

00:21:32.500 --> 00:21:37.400
So that's why I really appreciate the article kind of talking through that.

00:21:37.400 --> 00:21:43.020
And fixtures, if anybody is unfamiliar, you can kind of think of them like setup and teardown.

00:21:43.020 --> 00:21:45.180
They run before and after your test.

00:21:46.320 --> 00:21:50.500
And well, parts of it run after if you set it up, if you need to.

00:21:50.500 --> 00:21:54.300
Now, Rebsys does a lot of work with Django.

00:21:54.860 --> 00:22:02.520
So this is articles talking about the idea of like you to test your like, let's say you have a,

00:22:02.520 --> 00:22:09.940
it has a like, it's the hypothetical scenario that you've got a feature where like you're testing a workflow where you have,

00:22:10.320 --> 00:22:14.820
you want your, you need to, you got to have different users.

00:22:14.820 --> 00:22:19.820
You need to create an owner because you want to see if you can filter swear words out of comments.

00:22:20.040 --> 00:22:31.800
So in like something in, and so in like in GitHub or something, you'd have to create an organization and then create a user and then have a public repo and a private repo to be able to test your functionality.

00:22:31.800 --> 00:22:32.880
And there's a lot of setup.

00:22:32.880 --> 00:22:37.240
And there's often a lot of setup needed for a lot of, a lot of software projects.

00:22:37.240 --> 00:22:38.980
So fixtures are helpful.

00:22:38.980 --> 00:22:44.940
So that's the setup he gets through, goes through just talking basically about how to use them.

00:22:44.940 --> 00:22:49.040
Fixtures are just a function that's decorated with pytest.fixture.

00:22:49.040 --> 00:22:56.360
And you use it by, in the test, you just call the, you put the function name, the name of the fixture in the parameter list.

00:22:56.360 --> 00:22:58.580
And it magically just happens for you.

00:22:58.580 --> 00:23:00.000
And that's the magic part.

00:23:00.720 --> 00:23:05.960
The, one of the things I really like is it goes, kind of goes into depth of even more than that.

00:23:05.960 --> 00:23:06.600
They're kind of cool.

00:23:06.600 --> 00:23:07.660
You can compose them.

00:23:07.660 --> 00:23:11.220
Fixtures can use other fixtures and you can use more than one.

00:23:11.220 --> 00:23:11.920
It's kind of neat.

00:23:11.920 --> 00:23:18.700
It goes through talking about also that they can return things.

00:23:18.700 --> 00:23:27.840
So they can return either just simple data like strings or numbers, but they can also return dictionaries and objects and instantiated things.

00:23:28.240 --> 00:23:32.860
And they can even return a function that can create things for you.

00:23:32.860 --> 00:23:36.320
So, so there was kind of a, a neat example.

00:23:36.320 --> 00:23:45.260
He, he returns, he has a fixture called make user that returns, that returns a new user created.

00:23:45.260 --> 00:23:49.840
It's a, it returns a function that you can call to create a user with parameters and stuff.

00:23:50.100 --> 00:23:51.600
So that's kind of a neat example.

00:23:51.600 --> 00:23:53.520
It's like a fixture factory.

00:23:53.520 --> 00:23:53.980
Yeah.

00:23:53.980 --> 00:23:55.000
Like, yeah.

00:23:55.000 --> 00:23:55.380
Oh yeah.

00:23:55.380 --> 00:23:58.700
Like an object factory returned as a fixture thing.

00:23:58.700 --> 00:23:59.480
So yeah.

00:23:59.480 --> 00:23:59.780
Yeah.

00:24:00.040 --> 00:24:07.880
And another example with like a, a make, a make admin fixture that call, that returns a function that can create an admin user.

00:24:07.880 --> 00:24:09.260
So that's kind of neat.

00:24:09.920 --> 00:24:16.760
One of the things that was new that I hadn't seen, which is kind of a cool idea is how to organize your fixtures.

00:24:16.760 --> 00:24:30.280
So he talks about putting, he's got like, let's say a big Django project and each of the, each of the different Django applications within the project have, have their own tests.

00:24:30.280 --> 00:24:32.880
And within those, there's a fixtures file.

00:24:32.880 --> 00:24:35.280
You know, you can't use that directly there.

00:24:35.380 --> 00:24:40.400
There, this is a trick that they're doing is sticking the fixtures in a, in a file called fixtures.

00:24:40.400 --> 00:24:46.880
And then at the top level, having a conf test file that imports those just imports everything out of it.

00:24:46.880 --> 00:24:49.620
And at first I've been like, why wouldn't you, why would you do that?

00:24:49.620 --> 00:24:51.460
Why don't you just put conf test files there?

00:24:51.460 --> 00:25:00.000
And his reason, whether you think he's sane or not, the reason is so that you can keep the code local to the application that's using it.

00:25:00.620 --> 00:25:07.080
And maybe it's a, maybe it's even a sub, a sub project or sub get repo or something, who knows.

00:25:07.080 --> 00:25:10.980
But at the top level, the top level, you can, you can have access to it.

00:25:10.980 --> 00:25:19.760
So any test can access any fixture within any other application that may or may not be a good thing for you, but, but it's kind of a cool idea.

00:25:19.760 --> 00:25:25.360
And then talks about how he talks about how plugins can have fixtures.

00:25:25.360 --> 00:25:35.120
There's also, there's a, the excellent pytest Django, a plugin that has things like a DB, which marks your tests that creates the database for you before you start.

00:25:35.120 --> 00:25:42.440
And a client that, you know, it makes it that's, I'm, I'm learning Django right now and I'm using pytest Django and it's pretty awesome.

00:25:42.820 --> 00:25:58.360
And then RevSys itself has a, an extension called Django test plus, which has a thing called TP and that has, has some extra cool features that, that aren't out of the box with, with pytest Django.

00:25:58.360 --> 00:25:59.500
So that's kind of fun.

00:25:59.500 --> 00:26:00.460
The last bit.

00:26:00.460 --> 00:26:02.960
And even get requests like within the app.

00:26:02.960 --> 00:26:03.520
Yeah.

00:26:03.860 --> 00:26:04.300
Yeah.

00:26:04.300 --> 00:26:04.340
Yeah.

00:26:04.340 --> 00:26:05.640
And tests for the response.

00:26:05.640 --> 00:26:05.820
Yeah.

00:26:05.820 --> 00:26:09.760
A lot of, kind of like what you would do with requests, but inside without actually going through the network.

00:26:09.760 --> 00:26:10.200
Right.

00:26:10.200 --> 00:26:27.760
And it's, it's very similar to the unit test framework around the Django built into Django also, but it's, and I'm glad that the Django, Django test plus and the Django pytest plugin are pretty consistent with the unit test.

00:26:27.760 --> 00:26:30.400
So if you want to switch back and forth, it's not that hard.

00:26:30.400 --> 00:26:33.960
And as a reminder, you can run unit test functions.

00:26:33.960 --> 00:26:36.340
You can from pytest also, but why would you?

00:26:36.340 --> 00:26:44.220
The last bit I want to highlight, and I have reached out to, reached out to Frank, but haven't heard anything back.

00:26:44.220 --> 00:26:45.980
He has an example on auto use.

00:26:45.980 --> 00:26:47.260
It's just wrong.

00:26:47.260 --> 00:26:49.240
So don't take his word for it.

00:26:49.240 --> 00:26:51.520
The auto use is cool.

00:26:51.520 --> 00:26:56.900
Auto use makes fixtures just run automatically before your tests without having to call them out.

00:26:56.900 --> 00:27:04.260
But there, it's really hard to come up with a good toy example for why you'd use it because there aren't very many good examples for why you would use it.

00:27:04.260 --> 00:27:06.000
It seems magical at first.

00:27:06.000 --> 00:27:11.940
And then it suddenly doesn't take long to go, wow, I really should be careful with that because you should be careful with it.

00:27:11.940 --> 00:27:16.520
This example shows that a global value being set with a fixture.

00:27:16.520 --> 00:27:17.600
And that's just not true.

00:27:17.600 --> 00:27:18.360
It doesn't do that.

00:27:18.360 --> 00:27:24.980
If you want to get the object, the out, the return value of a fixture, you have to name the fixture within the test.

00:27:25.360 --> 00:27:27.340
So that's about it, really.

00:27:27.340 --> 00:27:30.380
It's a pretty fun introduction to fixtures.

00:27:30.380 --> 00:27:36.020
Yeah, they could fix it up by just having a variable in the module and saying global and then set its value, right?

00:27:36.020 --> 00:27:37.820
Like you would with any other Python function.

00:27:37.820 --> 00:27:38.120
Yeah.

00:27:38.120 --> 00:27:39.060
Yeah, if you wanted to.

00:27:39.060 --> 00:27:43.880
The other thing I wanted to point out is he says tempter is a really cool built-in fixture.

00:27:44.340 --> 00:27:46.800
And it is, but it's kind of deprecated.

00:27:46.800 --> 00:27:52.600
Temp path is what we try to get people to use now because it uses Pathlib and Pathlib is awesome.

00:27:52.600 --> 00:27:54.360
So anyway.

00:27:54.360 --> 00:27:55.080
Indeed.

00:27:55.080 --> 00:28:02.440
Tony Sherman has been on the same journey and says, it seems so great auto use at the beginning and things blow up quickly.

00:28:02.440 --> 00:28:03.340
Yeah.

00:28:03.800 --> 00:28:05.760
Brian, can you open up a website for me?

00:28:05.760 --> 00:28:06.240
Sure.

00:28:06.240 --> 00:28:09.640
Before we move on as a piece of follow-up for plausible.io.

00:28:09.640 --> 00:28:22.740
So Pat Decker, former co-guest host about a year ago, says plausible is the open source option alternative to Google Analytics, which is GDPR compliant and doesn't set third-party cookies.

00:28:22.740 --> 00:28:24.800
If you scroll down, you can see that somewhere in there.

00:28:24.800 --> 00:28:25.240
Cool.

00:28:25.480 --> 00:28:26.600
Why did I ask you to open it?

00:28:26.600 --> 00:28:28.380
Why didn't I just open it on my share?

00:28:28.380 --> 00:28:36.920
Because my next DNS blocks it like it does everything else until I clear the DNS out of my web browser, which is going to, oh, it finally came back.

00:28:36.920 --> 00:28:37.540
It took a while.

00:28:37.540 --> 00:28:39.780
Even though I low-listed it so I could pull it up.

00:28:39.780 --> 00:28:41.920
But yeah, it looks pretty interesting.

00:28:41.920 --> 00:28:42.980
I had not heard about that.

00:28:42.980 --> 00:28:44.600
So thank you, Pat, for that shout out.

00:28:44.600 --> 00:28:55.200
That certainly seems like a, I know nothing about it, but what I've already learned is it looks like a mega improvement over the other types of retargeting, feeding, third-party cookie drop-in.

00:28:55.200 --> 00:28:57.180
So pretty cool.

00:28:57.180 --> 00:28:57.680
Thanks.

00:28:57.680 --> 00:28:58.180
Cool.

00:28:58.180 --> 00:28:58.440
Yeah.

00:28:58.440 --> 00:29:00.140
I have no extras, believe it or not.

00:29:00.140 --> 00:29:00.640
You have no extras.

00:29:00.640 --> 00:29:01.360
So it's all you.

00:29:01.360 --> 00:29:01.920
Okay.

00:29:01.920 --> 00:29:03.140
Well, I got a couple of extras.

00:29:03.140 --> 00:29:09.180
I ran across this fun tool or fun contest.

00:29:09.180 --> 00:29:14.400
The International Obfuscated Python Code Competition.

00:29:14.400 --> 00:29:21.240
I know that those existed for C and Perl, but I didn't know that we had a Python one.

00:29:21.880 --> 00:29:25.880
Submissions are due tentatively by August 30th.

00:29:25.880 --> 00:29:29.540
And I have nothing, no idea about who's running this.

00:29:29.540 --> 00:29:31.860
But it looks fun.

00:29:31.860 --> 00:29:33.700
Oh, probably the judges.

00:29:33.700 --> 00:29:36.800
So Julius, Kevin, Shane, and Anonymous.

00:29:36.800 --> 00:29:37.700
Anonymous will judge you.

00:29:37.700 --> 00:29:38.120
Yeah.

00:29:38.120 --> 00:29:48.580
But I'm just curious if, I know that it's possible to write out a terrible Python code, but I'm looking forward to seeing the results.

00:29:49.460 --> 00:29:57.460
Next up, there's a quick, we talk about a lot of things that are using Rust to speed up parts of Python.

00:29:57.460 --> 00:30:02.120
So there's a decent article called Porting Python Objects to Rust.

00:30:02.120 --> 00:30:03.120
I think it's decent.

00:30:03.120 --> 00:30:05.360
I haven't walked through it to see if you can actually do this.

00:30:05.360 --> 00:30:16.700
But the recommendation here is if you've got a Python project that you'd like to replace all or part of it with Rust, go slow and port pieces of it at a time.

00:30:16.700 --> 00:30:17.760
Iterative porting.

00:30:17.760 --> 00:30:27.160
So there's a lot of things that I've thought about or cool Python tools that'd be kind of neat if part of it was sped up with Rust.

00:30:27.360 --> 00:30:30.080
Step one, learn Rust.

00:30:30.080 --> 00:30:30.920
Step one.

00:30:30.920 --> 00:30:35.840
Or step one, have a podcast where you convince other people to write it in Rust.

00:30:35.840 --> 00:30:37.380
That's right.

00:30:37.380 --> 00:30:38.680
Also an option.

00:30:38.680 --> 00:30:39.180
Yeah.

00:30:39.180 --> 00:30:40.520
Anyway, that's all I got.

00:30:40.520 --> 00:30:41.040
All right.

00:30:41.040 --> 00:30:41.440
Cool.

00:30:41.440 --> 00:30:41.840
Those are good.

00:30:41.840 --> 00:30:47.660
Final one here is Henry points out that scientific Python uses it possible on their website, presumably.

00:30:47.660 --> 00:30:48.440
Okay.

00:30:48.440 --> 00:30:48.960
Okay.

00:30:48.960 --> 00:30:50.520
Ready for a joke?

00:30:51.000 --> 00:30:52.020
Well, almost.

00:30:52.020 --> 00:30:57.740
I would like to encourage people to submit questions to our Ask Me Anything.

00:30:57.740 --> 00:31:00.080
Let's see.

00:31:00.080 --> 00:31:01.200
Do we have a link for that?

00:31:01.200 --> 00:31:02.960
We do have a link for that.

00:31:02.960 --> 00:31:08.340
And the link is, which, yeah, I was going to mention that and then somehow didn't, didn't I?

00:31:08.340 --> 00:31:11.700
It's pythonbytes.fm/AMA2023.

00:31:11.700 --> 00:31:13.380
I'll put a link in the show notes.

00:31:13.380 --> 00:31:13.800
Okay.

00:31:13.800 --> 00:31:14.860
Link will be in the show notes.

00:31:14.860 --> 00:31:16.180
And it'll look something like this.

00:31:16.180 --> 00:31:17.120
Indeed.

00:31:17.120 --> 00:31:17.280
Indeed.

00:31:17.280 --> 00:31:21.340
And we've got a bunch of great comments and thoughts and very kind messages in there as

00:31:21.340 --> 00:31:21.520
well.

00:31:21.520 --> 00:31:22.960
So much appreciated.

00:31:22.960 --> 00:31:29.820
We're going to do our Ask Me, Ask Us Anything in, I think, July 11th, if we can make it work

00:31:29.820 --> 00:31:30.000
then.

00:31:30.000 --> 00:31:33.700
We'll confirm as we get closer, but that'd be a fun one for a lot of people to attend live

00:31:33.700 --> 00:31:35.340
if they could also ask us stuff.

00:31:35.340 --> 00:31:35.800
Yeah.

00:31:35.800 --> 00:31:36.480
It'll be good.

00:31:36.480 --> 00:31:36.980
Sure will.

00:31:36.980 --> 00:31:37.320
All right.

00:31:37.320 --> 00:31:38.180
Ready for a joke now?

00:31:38.180 --> 00:31:38.760
Yes.

00:31:38.760 --> 00:31:41.400
So Stack Overflow is pretty awesome, right, Brian?

00:31:41.400 --> 00:31:45.440
I mean, it's a huge resource if you want to find something, right?

00:31:45.440 --> 00:31:49.440
You got some kind of problem, especially if it's kind of outside the realm of your usual

00:31:49.440 --> 00:31:49.980
expertise.

00:31:49.980 --> 00:31:53.740
You're like, ah, I got to work on, get to work on this JavaScript thing.

00:31:53.740 --> 00:31:54.460
I don't know how it works.

00:31:54.460 --> 00:31:57.980
If I just Google it, maybe someone else had the problem or, you know, something's not working.

00:31:57.980 --> 00:31:58.340
Yeah.

00:31:58.340 --> 00:32:02.200
But as a social network, it can be a bit of a rough and tumble place.

00:32:02.200 --> 00:32:09.220
Come in here and it has this picture of this, this guy wearing a t-shirt offering like a

00:32:09.220 --> 00:32:14.520
bouquet of lavender flowers or something he just picked up off of the, you know, like

00:32:14.520 --> 00:32:16.360
along the side during some protests.

00:32:16.360 --> 00:32:19.540
And there's these like cops or military folks in like armor.

00:32:19.540 --> 00:32:21.120
And he tries to offer it to one of them.

00:32:21.120 --> 00:32:23.980
It says, me asking a question on Stack Overflow.

00:32:23.980 --> 00:32:29.240
And then immediately they swarm him and like, you know, put him in a neck lock and stuff.

00:32:29.240 --> 00:32:30.320
It says, marked as duplicate.

00:32:30.320 --> 00:32:32.500
It's always marked as duplicate.

00:32:33.020 --> 00:32:33.300
Yeah.

00:32:33.300 --> 00:32:35.540
And that's the easy one.

00:32:35.540 --> 00:32:38.880
It can be a brutal place.

00:32:38.880 --> 00:32:40.080
Yes, it can.

00:32:40.080 --> 00:32:41.980
I find it better as read only.

00:32:41.980 --> 00:32:43.840
Yeah.

00:32:43.840 --> 00:32:44.500
Yeah.

00:32:44.500 --> 00:32:49.580
But it is one of those handy places that happens to have, like when you, when you just take a,

00:32:49.580 --> 00:32:55.380
your actual error message and Google it, it often lands in Stack Overflow somewhere.

00:32:55.380 --> 00:32:55.980
Yes, it does.

00:32:55.980 --> 00:32:57.740
So it is often helpful.

00:32:57.740 --> 00:33:00.540
You're willing to take a little abuse.

00:33:00.540 --> 00:33:02.280
If you want to get a headlock.

00:33:02.280 --> 00:33:02.640
Yeah.

00:33:02.940 --> 00:33:03.580
Yeah, exactly.

00:33:03.580 --> 00:33:05.200
Nice.

00:33:05.200 --> 00:33:11.600
I also heard that like recently, there's been a bunch of Stack Overflow like issue moderators

00:33:11.600 --> 00:33:12.620
and stuff that.

00:33:12.620 --> 00:33:12.900
Reddit.

00:33:12.900 --> 00:33:13.940
Oh, was it Reddit?

00:33:13.940 --> 00:33:15.040
Reddit blackout.

00:33:15.040 --> 00:33:15.600
Yeah.

00:33:15.600 --> 00:33:22.600
So the CEO, we got the guy's name, the CEO of Reddit decided that they were going to monetize

00:33:22.600 --> 00:33:26.180
the API of Reddit because like Twitter did a little bit.

00:33:26.180 --> 00:33:30.260
Twitter wanted to kill off the third party clients just to make them go away.

00:33:30.260 --> 00:33:31.220
So they had more control.

00:33:31.220 --> 00:33:31.580
Right.

00:33:31.660 --> 00:33:34.540
That was sort of one of the things that happened when us took over.

00:33:34.540 --> 00:33:36.320
So they didn't quite want to do that.

00:33:36.320 --> 00:33:40.720
They wanted to charge money for the API because they're not showing ads for the mobile apps.

00:33:40.720 --> 00:33:45.180
And Apollo was the mobile app that was most is, I guess, maybe was more accurate.

00:33:45.180 --> 00:33:46.120
It was most popular.

00:33:46.800 --> 00:33:51.300
And in order for that app to keep running, I think they have to pay $20 million a year in

00:33:51.300 --> 00:33:53.320
API fee call fees.

00:33:53.320 --> 00:33:55.420
So they're like, well, we don't make that much money.

00:33:55.420 --> 00:33:55.980
We're shutting down.

00:33:55.980 --> 00:34:01.220
And so they're effectively killed off all the third party clients, which set off a protest.

00:34:01.220 --> 00:34:08.960
And the protest manifested in that people who are moderating popular Reddit areas, subreddits,

00:34:08.960 --> 00:34:14.920
mark them all as private to say, you know, we're taking our content, our contributions of,

00:34:14.920 --> 00:34:19.760
we put into Reddit off as a way of protesting what you're doing with the community to like

00:34:19.760 --> 00:34:22.160
close it down and, you know, extract money from it basically.

00:34:22.160 --> 00:34:24.980
Yeah, but also, I mean, also Stack Overflow.

00:34:24.980 --> 00:34:32.880
So Stack Overflow is, six months ago, is, is like blocked because of people

00:34:32.880 --> 00:34:37.680
like it'd be obviously, I think everybody on our that's listening here knows what Stack Overflow

00:34:37.680 --> 00:34:42.980
is, but people are taking the questions and just going and pasting them in ChatGPT, getting

00:34:42.980 --> 00:34:45.180
the answer and putting them back into Stack Overflow.

00:34:45.180 --> 00:34:46.340
That's lame.

00:34:46.340 --> 00:34:49.660
What even?

00:34:49.660 --> 00:34:52.020
So apparently that's blocked.

00:34:52.020 --> 00:34:53.300
So, yeah, cool.

00:34:53.300 --> 00:34:56.800
Well, I sure had fun talking with you today and talking with everybody.

00:34:56.800 --> 00:35:03.640
and, just, excited, about the future of not using AI for my software.

00:35:03.640 --> 00:35:04.860
So thanks, Michael.

00:35:04.860 --> 00:35:06.420
I have to go back to writing to myself as well.

00:35:06.420 --> 00:35:06.800
Yeah.

00:35:06.800 --> 00:35:07.800
Thanks as always, Brian.