WEBVTT
00:00:00.001 -->
00:00:05.280Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:05.280 -->
00:00:11.040This is episode 376, recorded March 26, 2024.
00:00:11.040 -->
00:00:12.160I'm Michael Kennedy.
00:00:12.160 -->
00:00:13.600And I am Brian Okken.
00:00:13.600 -->
00:00:18.400And this episode is brought to you all by Scout APM.
00:00:18.400 -->
00:00:19.720I'll tell you more about them later.
00:00:19.720 -->
00:00:20.840We appreciate the support.
00:00:20.840 -->
00:00:27.260Connect with all of us, Brian, me, and the podcast over on fastidon.org,
00:00:27.260 -->
00:00:28.600or Mastodon more broadly.
00:00:29.000 -->
00:00:31.100Links at the top of your podcast player show notes.
00:00:31.100 -->
00:00:33.000Join us live if you like.
00:00:33.000 -->
00:00:37.580We typically do this on Tuesdays at 10 a.m. Pacific time.
00:00:37.580 -->
00:00:38.880Why is time so hard, Brian?
00:00:38.880 -->
00:00:39.880Why is it so hard?
00:00:39.880 -->
00:00:43.980Just go to Pythonbytes.fm slash live to be part of the audience.
00:00:43.980 -->
00:00:45.040See the older shows.
00:00:45.040 -->
00:00:46.720All the older ones are there.
00:00:46.720 -->
00:00:49.120And they are typically the same thing we ship.
00:00:49.120 -->
00:00:54.140We don't really overly edit it or anything other than we do clean them up, tighten them up a little.
00:00:54.140 -->
00:00:58.800So if you like the ones with bloopers included, you can check that out there.
00:00:58.800 -->
00:01:05.040I wonder if I was a search engine and I was trying to find bloopers, would there be a way to not let me find them?
00:01:05.040 -->
00:01:05.760What do you think, Brian?
00:01:05.760 -->
00:01:07.180Well, I hope.
00:01:07.180 -->
00:01:08.260We're trying.
00:01:09.440 -->
00:01:11.480Actually, yeah, I was thinking about this.
00:01:11.480 -->
00:01:17.320I kind of think that the AI stuff should have the best content out there to read from.
00:01:17.320 -->
00:01:19.620But companies are making money from that.
00:01:19.620 -->
00:01:22.520And I'm not making my blog posts.
00:01:22.520 -->
00:01:23.960I'm not getting any money from that.
00:01:24.440 -->
00:01:27.400If I care about that, how do I stop them?
00:01:27.400 -->
00:01:30.740So Jeff Triplett is thinking about that, too.
00:01:30.740 -->
00:01:34.540So he wrote up a blog post called onrobots.txt.
00:01:34.540 -->
00:01:40.640So the idea was robots.txt is to stop search engines and stuff like that.
00:01:40.640 -->
00:01:43.040But I don't actually want to stop search engines.
00:01:43.040 -->
00:01:44.880I want search engines to find my stuff.
00:01:44.980 -->
00:01:47.100I just don't want the AI stuff.
00:01:47.100 -->
00:01:50.220So Jeff's been thinking about this.
00:01:50.220 -->
00:01:51.720I've been thinking about it also.
00:01:51.720 -->
00:01:54.360So he collected a few links around this.
00:01:54.360 -->
00:01:59.220And one of the things here is I spent a lot of time thinking about robots.txt.
00:01:59.620 -->
00:02:05.220In theory, it helps control what search engines and AI scrapers are allowed to visit.
00:02:05.220 -->
00:02:12.500But I need more confidence in its effectiveness in this post-AI apocalyptic world.
00:02:12.500 -->
00:02:13.120I love that.
00:02:13.120 -->
00:02:18.900Anyway, so there's a bunch of these cropping up.
00:02:18.900 -->
00:02:21.600There's a lot of new stuff going on.
00:02:21.600 -->
00:02:24.860So Jeff has decided to use Django robots.
00:02:24.860 -->
00:02:27.180But let's look at some of the links that he included.
00:02:27.180 -->
00:02:28.100So thanks, Jeff.
00:02:28.760 -->
00:02:35.160So there's block the bots that feed AI models by scraping your website.
00:02:35.160 -->
00:02:41.960So there's an article by Neil Clark that has an example robots.txt.
00:02:41.960 -->
00:02:48.120And the idea is almost all of these different AI bots, you've got to block them individually.
00:02:48.120 -->
00:02:52.180So you've got to set up these different rules there.
00:02:52.180 -->
00:02:54.780So it'd be good to keep track of some of these places.
00:02:54.780 -->
00:02:56.980Hopefully he keeps this up.
00:02:57.160 -->
00:03:03.360But there's also an article, go ahead and block rub callers, discussing why you might.
00:03:03.880 -->
00:03:05.620And then a dark visitors.
00:03:05.620 -->
00:03:11.520I think this is going to be one to keep track of, that it might hopefully they keep it up.
00:03:11.520 -->
00:03:16.240But there's a big list of known AI bots to block.
00:03:16.240 -->
00:03:20.300And so maybe keeping up on this might be a good idea if you care about it.
00:03:20.300 -->
00:03:25.960Jeff's note was that he added it to the website.
00:03:25.960 -->
00:03:26.420Django.
00:03:26.640 -->
00:03:31.300There's a couple different articles about adding robots.txt to a Django website.
00:03:31.300 -->
00:03:38.200There's one by Will Vincent and one by Adam Johnson, both biggies in the Django community.
00:03:38.600 -->
00:03:39.800So we'll link to those.
00:03:39.800 -->
00:03:50.120And like I said at the beginning, Jeff said he went with a plugin called Django robots to populate that and control it through his admin interface.
00:03:50.120 -->
00:03:51.640So there's a lot there.
00:03:51.640 -->
00:03:56.860One of the things not included is my blog is run by Hugo or run with Hugo.
00:03:57.200 -->
00:04:04.780Anyway, so I'm going to also link to a how to add robots.txt to your Hugo site if you want to do that.
00:04:04.780 -->
00:04:05.380Oh, nice.
00:04:05.380 -->
00:04:08.500I don't think I've messed with my Hugo robots.txt.
00:04:08.500 -->
00:04:10.620I have not yet, but I think I might.
00:04:10.620 -->
00:04:14.080And I guess I wanted to ask some questions before we moved on.
00:04:14.080 -->
00:04:20.520One is as a community, I think that there should be an easier way to say don't scrape this if you're an AI.
00:04:20.520 -->
00:04:23.860Other than listing each one, we should have a standard for that.
00:04:23.860 -->
00:04:25.200But what do you think of this?
00:04:25.200 -->
00:04:29.220Should, as a content creator, should I care about that?
00:04:29.220 -->
00:04:30.580Should I mean, would you?
00:04:30.580 -->
00:04:33.360You know, it's such an interesting question.
00:04:33.360 -->
00:04:35.880I think it's pretty fraught, right?
00:04:35.880 -->
00:04:39.360On one hand, I don't want to feed the AIs either, necessarily.
00:04:39.360 -->
00:04:45.480I think that it's super awesome that you could go to ChatGPT and say things like, you know, what does Python bias?
00:04:45.480 -->
00:04:47.340What does Talk Python think about this?
00:04:47.340 -->
00:04:52.820Or, you know, write me a summary of this in the style of a Talk Python interview.
00:04:52.820 -->
00:04:54.720Like, is that harming me?
00:04:54.940 -->
00:04:56.040No, probably not.
00:04:56.040 -->
00:05:00.820Is it creating some cool aspect, like Halo, of the content creation side?
00:05:00.820 -->
00:05:04.780The fact that ChatGPT knows about those kind of things, that's kind of cool.
00:05:04.780 -->
00:05:06.300Kind of on the plus side.
00:05:06.300 -->
00:05:07.400I don't know.
00:05:07.400 -->
00:05:08.240I mean, we have...
00:05:08.240 -->
00:05:12.100For you, a lot of your content is, I mean, your open content is open.
00:05:12.100 -->
00:05:16.460But a lot of your content's behind a paywall with Talk Python training.
00:05:16.780 -->
00:05:20.880If somebody were to throw all of those trainings into an AI model...
00:05:20.880 -->
00:05:22.680Yeah, that would be different, right?
00:05:22.680 -->
00:05:23.140Yeah.
00:05:23.520 -->
00:05:24.120So, yeah.
00:05:24.120 -->
00:05:31.020I mean, I certainly have a no robot, no index settings on certain aspects of the site there.
00:05:31.020 -->
00:05:33.280It's also behind accounts and logins.
00:05:33.280 -->
00:05:39.120So, somebody would have to be kind of maliciously doing that, which I imagine that's probably already been done.
00:05:39.340 -->
00:05:40.140But it is...
00:05:40.140 -->
00:05:42.080Yeah, that's a different kind of deal.
00:05:42.080 -->
00:05:42.540You know what I mean?
00:05:42.540 -->
00:05:55.480Maybe the biggest case of this is the link tax that Australia, Spain, and Canada all tried to put onto the search engines and Facebook and social platforms.
00:05:55.880 -->
00:05:56.080Right?
00:05:56.080 -->
00:05:58.540Like, I'm getting this right.
00:05:58.540 -->
00:05:59.340I think it's Canada.
00:05:59.340 -->
00:06:01.180They all blur together.
00:06:01.180 -->
00:06:04.180But, you know, Canada is the most recent one of these, for sure.
00:06:04.180 -->
00:06:11.580And they passed a law saying, well, if one of these big American companies wants to send traffic...
00:06:11.580 -->
00:06:12.400We talked about this.
00:06:12.400 -->
00:06:17.080Want to send traffic to one of our news sites, then they have to pay them for the ride of doing that.
00:06:17.080 -->
00:06:18.800Maybe it is.
00:06:18.800 -->
00:06:20.160Well, it's kind of like Google News.
00:06:20.160 -->
00:06:20.740Maybe it's Australia.
00:06:20.740 -->
00:06:22.320I think it's Australia.
00:06:22.320 -->
00:06:23.820I think it was Facebook.
00:06:24.200 -->
00:06:26.620I'm sorry, folks, if I'm like crossing over companies and stuff.
00:06:26.620 -->
00:06:33.700But I think Facebook just declined to renew their agreements with the Australian newspapers and saying, you know what?
00:06:33.700 -->
00:06:37.200We're not going to send any more traffic and we're not going to allow any links to you whatsoever.
00:06:37.200 -->
00:06:40.600And that's going to be a negative for those news companies as well, right?
00:06:40.600 -->
00:06:46.120The fact that, I mean, they kind of had this shady deal where Facebook would summarize a little bit.
00:06:46.120 -->
00:06:48.580So, like, maybe you don't need to click the link to go to it.
00:06:48.580 -->
00:06:50.260But now they're going to have no links whatsoever.
00:06:50.260 -->
00:06:52.740And they're not going to be in a better place because of that either.
00:06:52.920 -->
00:06:58.020So, it's really this, you know, damned if you do, damned if you don't type of thing is what I'm trying to get at.
00:06:58.020 -->
00:07:03.680And, like, the biggest example that play now is with these news organizations and the social media and search engines.
00:07:03.680 -->
00:07:04.260Yeah.
00:07:04.260 -->
00:07:04.800Yeah.
00:07:04.800 -->
00:07:09.100Except for, I don't know, the AIs aren't, I don't think they're linking back to the original content.
00:07:09.100 -->
00:07:15.560No, you got a good point there that at least search engines and stuff and social media, they credit you.
00:07:15.560 -->
00:07:17.300They send traffic to you.
00:07:17.300 -->
00:07:21.880Whereas, we're going to have to reckon with the AI stuff in some way because it just says, here's the answer.
00:07:21.880 -->
00:07:22.940And how did I get it?
00:07:22.940 -->
00:07:23.320I don't know.
00:07:23.320 -->
00:07:25.760Maybe that's your answer, repurposed.
00:07:25.760 -->
00:07:26.300Yeah.
00:07:26.360 -->
00:07:27.960But you get zero credit for that.
00:07:27.960 -->
00:07:28.360Right.
00:07:28.360 -->
00:07:28.840Anyway.
00:07:28.840 -->
00:07:29.320That's a good point.
00:07:29.320 -->
00:07:31.400We're probably going to solve that today.
00:07:31.400 -->
00:07:32.440Maybe next week.
00:07:32.440 -->
00:07:33.640Want to come back and solve it next week?
00:07:33.640 -->
00:07:34.240Yeah, sure.
00:07:34.520 -->
00:07:41.840Well, if you were to be automating requests to these websites, what is the most popular way to do that?
00:07:41.840 -->
00:07:43.380Well, it's right in the name, requests.
00:07:43.380 -->
00:07:48.240And requests by Kenneth Reitz has been migrated over.
00:07:48.240 -->
00:07:50.080It's, like, so popular.
00:07:50.080 -->
00:07:52.800It's migrated over to the PSF itself, right?
00:07:52.800 -->
00:07:54.780I don't remember where it said.
00:07:54.780 -->
00:07:55.000Yeah.
00:07:55.000 -->
00:07:56.320It actually still has it says.
00:07:56.320 -->
00:08:02.120Request is one of the most downloaded Python packages today, pulling in around 30 million downloads a week.
00:08:02.860 -->
00:08:06.000And it's used by over a million repositories on GitHub.
00:08:06.000 -->
00:08:07.820You can probably trust it.
00:08:07.820 -->
00:08:09.300But there are things that it doesn't do.
00:08:09.300 -->
00:08:14.960Things that it's not necessarily wanting to, like, lead the pleading edge on.
00:08:14.960 -->
00:08:18.040I mean, just with that amount of usage, you've got to be careful, right?
00:08:18.040 -->
00:08:20.900So I'm going to point you at a fork of requests.
00:08:20.900 -->
00:08:22.020And I quests?
00:08:22.020 -->
00:08:22.920I'm not sure.
00:08:22.920 -->
00:08:25.700Hopefully, N-I quests instead of requests.
00:08:25.700 -->
00:08:26.320N-I.
00:08:26.320 -->
00:08:29.620I'm not sure I'm getting the reference here.
00:08:29.620 -->
00:08:31.040There's probably some cleverness to the name.
00:08:31.100 -->
00:08:32.820I'm sorry for not getting it there, Java.
00:08:32.820 -->
00:08:34.880So anyway, it says requests.
00:08:34.880 -->
00:08:39.240But with HTTP 3, HTTP 2, multiplexed connections.
00:08:39.240 -->
00:08:42.880So if you're downloading, you could create multiple connections to the server and download multiple streams.
00:08:42.880 -->
00:08:43.880I think that's what that means.
00:08:43.880 -->
00:08:47.260System certificate authorities, certificate revocation.
00:08:47.480 -->
00:08:57.040So if you want to control what certificates you trust, maybe there's some that have been known to be doing bad things or you just don't want to allow access to certain parts of the internet.
00:08:57.040 -->
00:09:00.320You can revoke those certificates and their authorities and so on.
00:09:00.320 -->
00:09:03.500DNS over HTTPS, TLS, and quick.
00:09:04.260 -->
00:09:15.460So if you want to have better control over how DNS works, if you want to escape what DNS is happening on your server and explicitly control it from your application, you can do that securely, which is awesome.
00:09:15.460 -->
00:09:20.340It has async and await, DNS security, and does much pain removed, which is cool.
00:09:20.860 -->
00:09:23.080So anyway, this is a pretty interesting thing.
00:09:23.080 -->
00:09:27.780If you know requests, you basically know this, except for that it also has async versions, which is kind of cool.
00:09:27.780 -->
00:09:32.720But yeah, it's got like a great long feature list and why they did this.
00:09:32.720 -->
00:09:33.580Yeah.
00:09:33.580 -->
00:09:35.640So worth looking at, I think.
00:09:35.640 -->
00:09:36.880Yeah, definitely.
00:09:36.880 -->
00:09:37.780That's pretty cool.
00:09:38.220 -->
00:09:46.280Yeah, but a lot of those things like the certificate stuff or DNS over HTTPS or DNS security are areas you're like, if we really need that, most people probably don't.
00:09:46.280 -->
00:09:47.880But if you do, this looks pretty cool.
00:09:47.880 -->
00:09:48.360Yeah.
00:09:48.360 -->
00:09:53.200I think it's, I think, my guess is that the name is based on the Knights of Knee.
00:09:53.200 -->
00:09:55.120So it'd be KneeQuest, I think.
00:09:55.120 -->
00:09:56.100KneeQuest.
00:09:56.100 -->
00:09:56.920All right, let's go with it.
00:09:56.920 -->
00:09:57.260KneeQuest.
00:09:57.260 -->
00:09:59.200Yeah, because of course we have those themes, right?
00:09:59.200 -->
00:10:00.080Yeah.
00:10:00.080 -->
00:10:01.380Of course we do.
00:10:01.380 -->
00:10:05.480Now, Brian, we do have a sponsor for this episode, right?
00:10:05.480 -->
00:10:06.280Yay.
00:10:06.280 -->
00:10:07.160Yay.
00:10:07.160 -->
00:10:10.840Let me tell you real quick about Scout APM.
00:10:10.840 -->
00:10:14.500They're big supporters of Python Bytes, so we appreciate that very much.
00:10:14.500 -->
00:10:23.720So if you are tired of spending hours trying to find the root cause of issues impacting your performance, then you owe it to yourself to check out Scout APM.
00:10:23.720 -->
00:10:32.940They're a leading Python application performance monitoring tool, APM, that helps you identify and solve performance abnormalities faster and easier.
00:10:33.520 -->
00:10:44.000Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs, and the dreaded N plus one queries that you can end up if you do lazy loading in your ORM.
00:10:44.200 -->
00:10:46.400And then you say, oh, no, why is it so slow?
00:10:46.400 -->
00:10:48.740Why are you doing 200 database queries for what should be one?
00:10:49.280 -->
00:10:52.500So you can't do it so you can't do it so you can do it so you can do it so you can do it in less than four minutes.
00:10:52.500 -->
00:11:05.460So you can do it in less than four minutes.
00:11:05.460 -->
00:11:06.280So that's awesome.
00:11:06.560 -->
00:11:09.400And the best part is the pricing is straightforward.
00:11:09.400 -->
00:11:14.880You only pay for the data that you use with no hidden overage fees or per seat pricing.
00:11:14.880 -->
00:11:17.380And I just learned this, Brian.
00:11:17.380 -->
00:11:22.520They also have they provide the pro version for free to all open source projects.
00:11:22.520 -->
00:11:29.960So if you're an open source maintainer and you want to have Scout APM for that project, just shoot them a message or something on their pricing page about that.
00:11:30.580 -->
00:11:36.500So you can start your free trial and get instant insights today visit by them by set of him slash Scout.
00:11:36.500 -->
00:11:38.740The link is in your podcast player show notes as well.
00:11:38.740 -->
00:11:40.120And please use that link.
00:11:40.120 -->
00:11:44.080Don't just search for them because otherwise they don't think you came from us.
00:11:44.080 -->
00:11:45.680And then they'd stop supporting the show.
00:11:45.680 -->
00:11:48.240So please use our link by them by set of him slash Scout.
00:11:48.240 -->
00:11:49.160Check them out.
00:11:49.160 -->
00:11:51.140It really supports the show.
00:11:51.140 -->
00:11:51.800Indeed.
00:11:51.800 -->
00:11:52.060Indeed.
00:11:52.060 -->
00:11:53.040Thank you, Brian.
00:11:53.040 -->
00:11:53.680Yeah.
00:11:53.680 -->
00:11:57.780Let's talk about underscore has some underscore has some funky meanings in Python.
00:11:57.780 -->
00:11:58.500It's good.
00:11:58.500 -->
00:11:58.880We love it.
00:11:58.880 -->
00:11:59.740We love the underscore.
00:11:59.740 -->
00:12:00.480Yeah.
00:12:00.500 -->
00:12:03.160Like I'm going to get a new keyboard where I like on my keyboard here.
00:12:03.160 -->
00:12:06.080It has two independent buttons for the space key.
00:12:06.080 -->
00:12:07.500I'm going to make this one just the underscore.
00:12:07.500 -->
00:12:10.560Okay.
00:12:10.560 -->
00:12:12.020Sure.
00:12:12.020 -->
00:12:12.880You can do that.
00:12:12.880 -->
00:12:14.660And you'll probably need it.
00:12:14.660 -->
00:12:15.460What can I do with it?
00:12:15.460 -->
00:12:18.260You could because of all of the Dunder methods.
00:12:18.260 -->
00:12:24.820We have so many underscores that we call two underscores Dunders in Python.
00:12:24.820 -->
00:12:28.080So and what are all these Dunder methods for?
00:12:28.260 -->
00:12:32.960So Trey Hunter has actually put together this really cool resource.
00:12:32.960 -->
00:12:35.340Every Dunder method in Python.
00:12:36.140 -->
00:12:39.720And actually, I mean, I thought I knew quite a few.
00:12:39.720 -->
00:12:49.340And I use probably rep and stir probably the most to make sure that my objects are representable or convertible to strings.
00:12:49.840 -->
00:12:51.840But there's quite a few more.
00:12:51.840 -->
00:12:56.380And so he goes through, like, here's their essentials for a repper.
00:12:56.380 -->
00:13:00.420And, oh, you know, he calls equality essential.
00:13:00.420 -->
00:13:06.800But I don't really, I guess maybe I don't make my own custom data types as often as maybe I should.
00:13:06.800 -->
00:13:10.760But there's the equal, EQ, that does equality.
00:13:10.760 -->
00:13:13.180And then repper that converts to rep.
00:13:13.180 -->
00:13:17.820And it's also used with stir if you didn't have a stir method.
00:13:17.880 -->
00:13:19.040But you can have those be separate.
00:13:19.040 -->
00:13:33.560So the other one that's common is __init__() for how you initialize classes, which, you know, to be honest, I use probably attrs and data classes more than custom data classes.
00:13:33.700 -->
00:13:41.220So I don't really write that myself a lot, but I often use it in initializing another class if I derive from something else.
00:13:41.220 -->
00:13:42.940Anyway, moving on.
00:13:42.940 -->
00:13:44.060There's tons.
00:13:44.060 -->
00:13:46.700He's got equality and hashability.
00:13:46.700 -->
00:13:53.340Hashability is important if you're creating an object that should be hashable.
00:13:53.340 -->
00:13:54.680That way you can create.
00:13:54.680 -->
00:13:55.780Why do you care about that?
00:13:55.780 -->
00:13:59.220You care about hashability because that means your objects can be used.
00:13:59.220 -->
00:14:01.680If they're hashable, they can be used for.
00:14:01.980 -->
00:14:06.420I think there's some other rules, too, but you can use them for keys to dictionaries.
00:14:06.420 -->
00:14:08.740And there's tons of dictionaries in Python.
00:14:08.740 -->
00:14:09.800So we've got-
00:14:09.800 -->
00:14:10.560Maybe also sets.
00:14:10.560 -->
00:14:11.140I'm not sure.
00:14:11.140 -->
00:14:12.380I can't remember about sets.
00:14:12.380 -->
00:14:12.600Maybe.
00:14:12.600 -->
00:14:13.100Maybe.
00:14:13.100 -->
00:14:13.660Yeah, probably.
00:14:13.660 -->
00:14:14.260Yeah.
00:14:14.260 -->
00:14:17.540But you also need to equal it.
00:14:17.540 -->
00:14:19.480I think there's less than you need also.
00:14:19.480 -->
00:14:21.580Anyway, there's orderability.
00:14:21.580 -->
00:14:23.880So you've got less than or greater than and all that.
00:14:23.880 -->
00:14:25.500Type conversions and formatting.
00:14:25.500 -->
00:14:27.380Tons around that.
00:14:27.380 -->
00:14:29.960You don't think about type conversions that much, right?
00:14:30.000 -->
00:14:33.820Because you don't think about testing and all that stuff in Python as much.
00:14:33.820 -->
00:14:34.400Right.
00:14:34.400 -->
00:14:35.560But it is kind of cool.
00:14:35.560 -->
00:14:36.220I didn't know that.
00:14:36.220 -->
00:14:39.800I guess I knew you could do this, but I kind of forgot that you can.
00:14:39.800 -->
00:14:55.800So if you say like int of something or bool of something, if that makes sense for your data type, you can write your own dunder method so that people can just use the built-in type conversion, which is pretty cool.
00:14:56.440 -->
00:15:04.440I didn't know about this format thing so that you can use the f-strings appropriately if you've got the format.
00:15:04.440 -->
00:15:07.540I think you can pass modifiers from the S string.
00:15:07.540 -->
00:15:11.440So like with a floating point number, you can say like for the modifier.
00:15:12.000 -->
00:15:16.460I think you can use the 0.2 F and I'll be like comma separated.
00:15:16.460 -->
00:15:20.480I think you can take your own format specifier there.
00:15:20.480 -->
00:15:21.540I think that's what that's for.
00:15:21.540 -->
00:15:21.960Okay.
00:15:21.960 -->
00:15:23.440I'll have to research that a little bit more.
00:15:23.440 -->
00:15:30.520Anyway, the dunder methods around context managers, which is actually kind of a funny thing.
00:15:30.580 -->
00:15:38.060I think that I've read a lot of tutorials around context managers and sometimes they like try to tell you how to build one up from scratch.
00:15:38.060 -->
00:15:40.320I've never built one up from scratch.
00:15:40.320 -->
00:15:45.600I always use like some of the wrappers and stuff to do context managers.
00:15:45.600 -->
00:15:47.440Anyway, containers and collections.
00:15:47.440 -->
00:15:56.420If you're going to do a container that you want length to work with or to iterate through, you need some dunder methods for that.
00:15:56.420 -->
00:15:59.080Callability is one I've used frequently.
00:15:59.620 -->
00:16:09.900You can create an object that's callable if your class has a call method, which is kind of fun to make callable objects.
00:16:09.900 -->
00:16:13.800A bunch of arithmetic operators so you can overload things.
00:16:13.800 -->
00:16:20.480In place, built-in function, built-in math functions, attribute access, all sorts of dunder methods for you.
00:16:20.480 -->
00:16:28.980So anyway, if you're thinking of overloading a class so that it can deal with different built-in operators,
00:16:28.980 -->
00:16:30.640check out Trey's article.
00:16:30.640 -->
00:16:31.620Yeah, that's pretty nuts.
00:16:31.620 -->
00:16:35.080Actually, I kind of am coming away from this the same feeling.
00:16:35.080 -->
00:16:36.120It's like, I think I knew these.
00:16:36.120 -->
00:16:37.720Like, actually, no, there's more stuff.
00:16:37.720 -->
00:16:39.140There's more that I realized.
00:16:39.540 -->
00:16:41.200Yeah, there's a lot.
00:16:41.200 -->
00:16:43.240I like the orderability, though.
00:16:43.240 -->
00:16:47.020It's because I often, at the very least, I want to be able to sort things.
00:16:47.020 -->
00:16:48.820Yeah, yeah, indeed.
00:16:48.820 -->
00:16:50.060Sorting is good.
00:16:50.060 -->
00:16:56.340The one that I think is news to me, maybe the casting ones, but also the string formatting one.
00:16:56.340 -->
00:16:56.740Yeah.
00:16:56.740 -->
00:16:58.520You could have a user object.
00:16:58.520 -->
00:17:00.880You could say, like, colon E for their email.
00:17:00.880 -->
00:17:03.940I mean, not necessarily would do that exactly, but just weird, right?
00:17:03.940 -->
00:17:05.220Yeah, I'll have to play with that.
00:17:05.220 -->
00:17:05.580Yeah.
00:17:05.580 -->
00:17:06.060All right.
00:17:06.060 -->
00:17:08.620Let's talk about this next one, a lockbox.
00:17:08.620 -->
00:17:10.820I don't think this is Python exactly.
00:17:11.260 -->
00:17:12.060Oh, wait, I take it back.
00:17:12.060 -->
00:17:13.480It is Python, 100%.
00:17:13.480 -->
00:17:21.200But also, even if it weren't, it's the kind of thing that you would use as a Python person, not necessarily make it part of your app.
00:17:21.200 -->
00:17:25.200So this takes a bit of, it takes a moment to get your head around.
00:17:25.200 -->
00:17:30.700So lockbox is a forward proxy for making third-party API calls.
00:17:30.700 -->
00:17:33.020And you're like, okay, keep talking.
00:17:33.020 -->
00:17:34.640Maybe it'll make sense eventually.
00:17:34.640 -->
00:17:36.340So here's the deal.
00:17:36.400 -->
00:17:44.200If you're going to integrate with some third-party thing, think Zapier, if that, if this, then that, et cetera, et cetera.
00:17:44.200 -->
00:17:47.960And those things are making API calls on your behalf.
00:17:47.960 -->
00:17:53.920You have to give them the API calls for the destination thing they're integrating with.
00:17:53.920 -->
00:18:05.360So the example they give is if you want to do a Zapier thing over to Slack or Jira or whatever, you give Zapier your Slack API key or your Jira API key.
00:18:05.760 -->
00:18:07.220Which may be fine.
00:18:07.220 -->
00:18:09.200I mean, Zapier is certainly a trustworthy company.
00:18:09.200 -->
00:18:12.140I've had the CEO on Talk Python a few times.
00:18:12.140 -->
00:18:12.660He's great.
00:18:12.660 -->
00:18:15.560But just on principle, you might not want to do that.
00:18:15.560 -->
00:18:16.620You know what I mean?
00:18:16.620 -->
00:18:17.140Yeah.
00:18:17.140 -->
00:18:19.040So that's what this thing is for.
00:18:19.040 -->
00:18:26.880So instead of giving that third-party, like Zapier, if this, then that, your tokens, what you can do is you can set up this lockbox thing.
00:18:26.880 -->
00:18:30.320And it's like an intermediary for this whole process.
00:18:30.680 -->
00:18:37.480So you can register an app in your lockbox and it gets its own just for this one purpose API key.
00:18:37.480 -->
00:18:38.920You give that to Zapier.
00:18:38.920 -->
00:18:44.380So Zapier calls lockbox, lockbox calls Slack or lockbox calls Jira or whatever.
00:18:44.600 -->
00:18:46.740And it has a couple of advantages.
00:18:46.740 -->
00:18:53.020So you can do things like you can audit what actual traffic is being done.
00:18:53.020 -->
00:18:59.720So you can see exactly what, let's just keep with Zapier, what Zapier is doing on your behalf, exactly what data is passed.
00:18:59.720 -->
00:19:01.420And if something's going wrong, you could see that.
00:19:01.420 -->
00:19:02.500It's still playing.
00:19:02.740 -->
00:19:06.120Zapier is charging you for too many zaps, you can say, I didn't use this many.
00:19:06.120 -->
00:19:07.180Exactly.
00:19:07.180 -->
00:19:09.180Here's how many zaps exactly you used.
00:19:09.180 -->
00:19:09.940Yeah.
00:19:09.940 -->
00:19:11.080Some of these are planned.
00:19:11.080 -->
00:19:15.720So you should be able to restrict access to external APIs in a more fine-grained manner.
00:19:15.720 -->
00:19:16.400You know.
00:19:16.400 -->
00:19:17.820Ooh, rate limiting.
00:19:17.820 -->
00:19:18.340Yeah.
00:19:18.340 -->
00:19:20.340Rate limiting on third-party API calls.
00:19:20.340 -->
00:19:25.240But the primary purpose of it is that the API keys are not exposed to anyone else.
00:19:25.240 -->
00:19:27.980They just live in this lockbox thing that you control.
00:19:27.980 -->
00:19:30.220And then you can, of course, throw them away.
00:19:30.220 -->
00:19:30.680Right.
00:19:30.680 -->
00:19:32.620Drawbacks are, well, you got to run your lockbox.
00:19:32.620 -->
00:19:34.300Basically.
00:19:34.300 -->
00:19:35.900And so on.
00:19:35.900 -->
00:19:38.760But yeah, it's pip install lockbox-proxy.
00:19:38.760 -->
00:19:41.180And you set the sucker up and off it goes.
00:19:41.180 -->
00:19:42.040I think it's pretty cool.
00:19:42.040 -->
00:19:42.580Yeah.
00:19:42.580 -->
00:19:43.080Yeah.
00:19:43.080 -->
00:19:43.560Interesting.
00:19:43.560 -->
00:19:44.240Yeah.
00:19:44.240 -->
00:19:51.320For, especially, even if I didn't use this all the time, to be able to add it later if I needed to, to intercept that.
00:19:51.320 -->
00:19:54.560And especially for some monitoring purposes.
00:19:54.560 -->
00:19:55.380Yeah.
00:19:55.380 -->
00:19:56.560It's an interesting idea.
00:19:56.560 -->
00:19:57.360Yeah.
00:19:57.360 -->
00:19:59.560Andrew out in the audience says, nothing against Zapier.
00:19:59.700 -->
00:20:04.520But that kind of feels like an indication that maybe it isn't a type of thing you should be handing off to third parties.
00:20:04.520 -->
00:20:06.780I may agree with you.
00:20:06.780 -->
00:20:11.220Although, I think in practice, a lot of people pass their keys all over the place to get stuff done.
00:20:11.220 -->
00:20:11.500You know?
00:20:11.500 -->
00:20:13.380Especially the less developer-y.
00:20:13.380 -->
00:20:18.420The less developer-y you are, the more you're like, just click these things together and do it for me.
00:20:18.420 -->
00:20:18.820Yeah.
00:20:19.020 -->
00:20:20.060What could go wrong?
00:20:20.060 -->
00:20:22.320YOLO.
00:20:22.320 -->
00:20:22.800Come on.
00:20:22.800 -->
00:20:24.420My password's the letter A.
00:20:24.420 -->
00:20:25.480I don't see any problem here.
00:20:25.480 -->
00:20:26.760This is way more secure than that.
00:20:26.760 -->
00:20:28.720Good thing we made all passwords password.
00:20:28.720 -->
00:20:29.480Exactly.
00:20:29.480 -->
00:20:30.740That way I never forget it.
00:20:30.740 -->
00:20:31.780It just says, what's your password?
00:20:31.780 -->
00:20:34.000And I'm like, well, you gave me the hint right there.
00:20:34.000 -->
00:20:34.220Perfect.
00:20:34.220 -->
00:20:37.460Well, that's our items, our main items.
00:20:37.460 -->
00:20:38.420What else you got there?
00:20:38.420 -->
00:20:40.080I got a couple extra.
00:20:40.080 -->
00:20:49.140Since I covered Django a little bit earlier, I ran across Adam Johnson's Django Join the Community on Mastodon.
00:20:49.140 -->
00:20:51.100I'm also working with Django a lot lately.
00:20:51.100 -->
00:20:55.940So trying to follow some of the Django people on Mastodon is good.
00:20:55.940 -->
00:20:58.200So he's got a good resource for people that want to.
00:20:58.200 -->
00:21:02.980If you're a Django person, you want to get started on Mastodon, there's some good people to follow.
00:21:02.980 -->
00:21:06.120Some projects, official accounts around Django.
00:21:07.320 -->
00:21:14.180And reminders to do a welcome post, which I still have forgotten to do.
00:21:14.180 -->
00:21:17.120So sorry, people out there that don't know who I am.
00:21:17.120 -->
00:21:20.040Anyway, yeah, the introductory post is a good idea.
00:21:20.040 -->
00:21:21.660And to hit through it.
00:21:21.660 -->
00:21:28.600So the other one extra got sent in just this morning from Kim Van Wyk.
00:21:28.600 -->
00:21:34.800And it's a website called unmaintained.tech.
00:21:35.160 -->
00:21:39.460And essentially, the idea is there's a badge and there's some description.
00:21:39.660 -->
00:21:51.120So basically, if you have some open source stuff that you're just kind of done with and nobody wants to take it over, you can just link to this to tell people that you're not intending to maintain it.
00:21:51.120 -->
00:21:56.820People can still use it as a reference and read it, but no promises as to whether it's going to work because I'm done.
00:21:56.820 -->
00:21:57.720So interesting.
00:21:57.720 -->
00:21:58.220Yeah.
00:21:58.220 -->
00:21:59.260Some things are done.
00:21:59.260 -->
00:22:00.120They're just done.
00:22:00.340 -->
00:22:00.740Yeah.
00:22:00.740 -->
00:22:01.680Some things are done.
00:22:01.680 -->
00:22:02.300And it's okay.
00:22:02.300 -->
00:22:03.560So you don't have to take them down.
00:22:03.560 -->
00:22:05.680Just tell people that you're not working on it anymore.
00:22:05.680 -->
00:22:06.420Interesting.
00:22:06.420 -->
00:22:16.680Wasn't there a thing with GitHub where they were going to either take down or charge very, very briefly for things that had no activity over a two-year period or something like that?
00:22:16.680 -->
00:22:19.120And they quickly rolled it back because people are like, stuff can be done.
00:22:19.120 -->
00:22:19.800Don't do that.
00:22:20.060 -->
00:22:20.300Okay.
00:22:20.300 -->
00:22:20.780Yeah.
00:22:20.780 -->
00:22:23.220I think that was pre-Microsoft takeover.
00:22:23.220 -->
00:22:23.920Yeah.
00:22:23.920 -->
00:22:24.500That might have.
00:22:24.500 -->
00:22:25.160You know what?
00:22:25.160 -->
00:22:27.720I think it probably was when they were like, how are we going to pay for this stuff?
00:22:27.720 -->
00:22:32.780We need to start getting rid of some of the storage of things that just abandoned.
00:22:32.780 -->
00:22:37.920And now they don't want to do that because there's all that AI meat in there to eat.
00:22:37.920 -->
00:22:39.780That's right.
00:22:39.780 -->
00:22:46.900Well, speaking of takeovers, US sues Apple for illegal monopoly over smartphones, says The Verge.
00:22:47.240 -->
00:22:52.080Now, I think the monopoly angle is a little bit of interesting here.
00:22:52.080 -->
00:22:54.600I had some conversations on Mastodon.
00:22:54.600 -->
00:22:56.340People were like, oh, they only have 20% of the market.
00:22:56.340 -->
00:23:02.260In the US, they have over 60%, 68%, 60%, something like that.
00:23:02.260 -->
00:23:05.640But I think the real problem is there's nowhere else to go.
00:23:05.640 -->
00:23:06.320Where do you go?
00:23:06.320 -->
00:23:09.460There's literally one other option in the entire world.
00:23:09.460 -->
00:23:14.320I know technically there's some Kickstarter that somebody could have a hundred other phones.
00:23:14.500 -->
00:23:20.660But in practice, as an adult, you need a smartphone to live these days to function in society.
00:23:20.660 -->
00:23:22.140Like, well, you get this app to do this thing.
00:23:22.140 -->
00:23:24.620Like, well, how do I get it on my phone?
00:23:24.620 -->
00:23:25.860I have to hit to get C.
00:23:25.860 -->
00:23:27.040I press number one three times.
00:23:27.040 -->
00:23:28.740Like, oh, you can't do this part of the world.
00:23:28.740 -->
00:23:29.620You're done.
00:23:29.620 -->
00:23:32.260And I think Apple, I think it's, I don't know.
00:23:32.300 -->
00:23:45.840It's a little bit, a little bit of a silly lawsuit in some senses that people don't really, the people writing the lawsuit seem to be not very connected technically or deeply understand the problems here.
00:23:45.840 -->
00:23:49.500I think there's some really legitimate causes and I'm here for this.
00:23:49.580 -->
00:23:54.400I hope this makes a change because Apple is just such a bully.
00:23:54.400 -->
00:24:05.140I have had such insanely bad experiences working with them, getting apps in the app store, which is crazy because you're like, I spent, me and Lauren spent months writing the latest Talk Python app.
00:24:05.140 -->
00:24:10.800To just try to make the iPhone a little bit better, to make people who want to do our stuff, enjoy doing it more on the iPhone.
00:24:10.800 -->
00:24:12.660They're like, nope, we're rejecting that.
00:24:12.660 -->
00:24:14.080And we have these rules.
00:24:14.080 -->
00:24:18.400We need more money from you, even though you're already paying us a hundred dollars a month and making the platform better.
00:24:18.400 -->
00:24:25.700You know, for example, I'm sure people think I'm cranky about this, but I just want to give a little background for people who haven't heard me rant about this.
00:24:25.700 -->
00:24:29.700Like we submitted it and they said, well, it doesn't have in-app purchases.
00:24:29.700 -->
00:24:30.380I said, that's okay.
00:24:30.380 -->
00:24:32.440I don't really want to sell anything through here.
00:24:32.440 -->
00:24:40.820My main, it's not like people are coming to the app and then they're becoming, I just, this is for people who are already customers of mine, already taking courses.
00:24:40.820 -->
00:24:42.120I just want them to be able to do that better.
00:24:42.120 -->
00:24:43.800Like no apps rejected.
00:24:43.800 -->
00:24:44.460Interesting.
00:24:44.460 -->
00:24:48.280But you have this clause 4.3.1 called reader apps.
00:24:48.280 -->
00:24:54.040It says, if you bought material on the web, like a book, audio, or video, you're allowed to consume that on the phone.
00:24:54.040 -->
00:24:55.880And there's no in-app purchase required.
00:24:55.880 -->
00:24:56.840Like we don't care.
00:24:56.840 -->
00:24:58.100You don't count as that.
00:24:58.100 -->
00:24:58.820You're something else.
00:24:58.820 -->
00:25:00.260You're not as big as Amazon.
00:25:00.260 -->
00:25:01.160So you can't.
00:25:01.160 -->
00:25:01.240Yeah.
00:25:01.240 -->
00:25:02.280You don't get any special treatment.
00:25:02.280 -->
00:25:14.120So what you're going to do is you're going to spend two weeks for two people full-time developing the in-app purchase so that you can sell a couple of courses a month, even though it costs you thousands and thousands of dollars to do it.
00:25:14.120 -->
00:25:15.220Or you can't be part of this.
00:25:15.220 -->
00:25:19.560The majority of your customers in the United States can't have your app, right?
00:25:19.560 -->
00:25:28.340And just that we're going to, you know, grind it out on these little companies to get a couple hundred bucks and cost them tons of effort.
00:25:28.480 -->
00:25:29.840Now it's harder to maintain the app.
00:25:29.840 -->
00:25:35.400If I add a new course, I've got to like do more work and release new versions of the app just because of that.
00:25:35.400 -->
00:25:39.520Like it's incredibly frustrating how they're just doing this.
00:25:39.520 -->
00:25:40.660Well, does this even talk about that?
00:25:40.660 -->
00:25:45.760Because when I read this, I was thinking, I was thinking, I mean, I've felt this.
00:25:45.760 -->
00:25:46.760I love Apple.
00:25:46.760 -->
00:25:49.540I've got two or three computers.
00:25:49.540 -->
00:25:51.000I got the phone watch.
00:25:51.320 -->
00:25:53.740But I've thought, hey, I want to try a different watch.
00:25:53.740 -->
00:25:55.900Oh, it doesn't work with anything else.
00:25:55.900 -->
00:25:57.800I can't really.
00:25:57.800 -->
00:26:00.360So I feel the customer lock-in part.
00:26:00.360 -->
00:26:02.720I'm not really happy about that.
00:26:02.720 -->
00:26:05.000But the other part that I, is that part.
00:26:05.000 -->
00:26:06.980And I don't know if the lawsuit covers that.
00:26:06.980 -->
00:26:10.260Is this whole 30% tax that they want to apply to everything?
00:26:10.260 -->
00:26:16.480Yeah, I think it does cover the lack of ability of using other payment processors and stuff.
00:26:16.480 -->
00:26:19.420Other payment processing, other delivery methods, all that kind of stuff.
00:26:19.420 -->
00:26:31.260Like another really creepy thing that Apple is doing is they're going to allow only the big companies to install apps over the web directly and use their own payment processor directly.
00:26:31.260 -->
00:26:36.340But only in Europe and only for companies that have had over a million downloads previously.
00:26:36.340 -->
00:26:38.200So there's no way to get started ever.
00:26:38.200 -->
00:26:41.700If you created a popular app now, you have to have done it last year.
00:26:41.700 -->
00:26:43.240But if you don't have it yet, how do you?
00:26:43.240 -->
00:26:49.040But then they're charging 27% for their fee for delivering your app.
00:26:49.040 -->
00:26:54.240But if they're not doing the processing and it doesn't go over their servers, what is the 27% for again?
00:26:54.240 -->
00:26:56.280It's just to give them money.
00:26:56.280 -->
00:26:56.920It's bad.
00:26:57.520 -->
00:27:01.640So anyway, there's a couple of videos from this guy called Theo Rants.
00:27:01.640 -->
00:27:08.200They're actually quite good, both the lawsuit and another one.
00:27:08.200 -->
00:27:10.980And then also the day after, this was yesterday, Brian.
00:27:10.980 -->
00:27:14.920The EU rejects Apple's European App Store changes.
00:27:14.920 -->
00:27:18.760This is the one I just talked about with some of those weird fees and other stuff, right?
00:27:18.760 -->
00:27:24.100Company could be fined 10% of global revenue, 20% if they don't fix it after that.
00:27:24.100 -->
00:27:32.180And so it's just one thing after another coming down on this company that's just, you know, they make 85% of their money off in-app purchases from games.
00:27:32.180 -->
00:27:35.640They should just make the rest of it free and not even make it a hassle for people.
00:27:35.640 -->
00:27:36.260You know what I mean?
00:27:36.260 -->
00:27:43.540It's just like, why are they doing all of these things to just for that last little bit of stockholder value, you know?
00:27:43.940 -->
00:27:49.020Yeah, but even the games part, why are they taking 30% cut?
00:27:49.020 -->
00:27:50.940It's just, it's too high.
00:27:50.940 -->
00:27:51.400Yeah.
00:27:51.400 -->
00:27:55.040You know, and honestly, I don't even mind the 30%.
00:27:55.040 -->
00:28:06.800What I mind is that they say that these kinds of apps can't exist or your app has to be completely rewritten so that you do start selling even if you don't want to or we won't accept it.
00:28:07.060 -->
00:28:07.260Right.
00:28:07.260 -->
00:28:10.060It's if I wanted to sell it, I'd be like, all right, look, 30%.
00:28:10.060 -->
00:28:12.880It's, it's rough, but it's digital project products.
00:28:12.880 -->
00:28:13.380I'll live.
00:28:13.380 -->
00:28:17.960But the fact they're like, you can't even not, you can't even choose to not sell stuff.
00:28:17.960 -->
00:28:19.560We're going to make you sell stuff.
00:28:19.560 -->
00:28:24.700And that kind of, that kind of stuff is just, that's where I think like, okay, this is over the line.
00:28:24.700 -->
00:28:30.400When you're, when, when it's that high of a percentage and you treat people like that, it's, it's, it's bad news bears.
00:28:30.400 -->
00:28:33.100That said, I have like five apples to so I says, just in this room.
00:28:33.200 -->
00:28:34.280So I'm very conflicted.
00:28:34.280 -->
00:28:36.360Yeah, definitely.
00:28:36.360 -->
00:28:37.500So yeah.
00:28:37.500 -->
00:28:37.980Yeah.
00:28:37.980 -->
00:28:39.080Okay.
00:28:39.080 -->
00:28:39.840I have a few more things.
00:28:39.840 -->
00:28:40.260They're quicker.
00:28:40.260 -->
00:28:40.840I promise.
00:28:40.840 -->
00:28:46.800The PSF is looking to hire somebody, which is awesome for PyPI support specialist.
00:28:46.800 -->
00:28:47.560How cool is that?
00:28:47.560 -->
00:28:48.420That is cool.
00:28:48.420 -->
00:28:48.900Yeah.
00:28:48.900 -->
00:28:49.240I read about that.
00:28:49.240 -->
00:28:59.400It's kind of nuts that all the PyPI with, you know, you think of the infrastructure, the amount of bandwidth flowing through that thing and how much traffic there is in that website and that there's nobody whose job is to keep it running.
00:28:59.700 -->
00:29:01.580It's kind of nuts, but yeah.
00:29:01.580 -->
00:29:06.840So a PyPI support specialist is a job, a person that are looking to join the team.
00:29:06.840 -->
00:29:08.740So if you're interested in that, check it out.
00:29:08.740 -->
00:29:09.360That'd be really cool.
00:29:09.360 -->
00:29:10.740Let's see.
00:29:10.740 -->
00:29:13.320Why is this looking like it looks here?
00:29:13.320 -->
00:29:14.120There we go.
00:29:14.460 -->
00:29:16.620We're going to do, this needs to go away.
00:29:16.620 -->
00:29:24.480We're going to do a VS Code Ask Me Anything with Brian Clark, not Brian Okken, Brian Clark and Cecil Phillip and me in 21 days.
00:29:24.480 -->
00:29:30.060So if you want to be part of that YouTube only event, then the link is in the show notes.
00:29:30.060 -->
00:29:30.640Check that out.
00:29:30.640 -->
00:29:32.540You can submit questions ahead of time.
00:29:32.540 -->
00:29:34.700So if you've got one, please, please do that.
00:29:34.700 -->
00:29:37.800And lastly, a quick conference thing.
00:29:37.800 -->
00:29:47.180Gareth Thomas said, hey, just let you all know, PyData Eindhoven 2024 will take place on the 11th of July and there's a call for proposals open.
00:29:47.180 -->
00:29:49.060So if you're interested in that, check it out.
00:29:49.060 -->
00:29:52.200Okay, I've got one extra, extra thing.
00:29:52.200 -->
00:29:54.360An extra, you have an extra, extra, extra, extra.
00:29:54.360 -->
00:29:56.500And partly it's an apology.
00:29:56.500 -->
00:30:00.820So I've been doing the emails for the show, but I kind of forgot last week.
00:30:00.820 -->
00:30:05.980So I'll get the, this week you'll get two or we'll combine them into one or something like that.
00:30:05.980 -->
00:30:07.140But how do you get the email?
00:30:07.140 -->
00:30:17.560So if you go to Python Bytes and click on Friends, you can fill out your name there and get the show notes into your inbox if you want.
00:30:17.560 -->
00:30:20.740So, plus we'll sell it and make lots of money.
00:30:20.740 -->
00:30:21.220Yeah, that's...
00:30:21.220 -->
00:30:23.080No, we don't sell your email or anything.
00:30:23.080 -->
00:30:25.120We don't, we don't sell it.
00:30:25.120 -->
00:30:27.980We don't even transfer it to other, other locations.
00:30:27.980 -->
00:30:28.760It's pretty excellent.
00:30:28.760 -->
00:30:30.460We got some good infrastructure set up.
00:30:30.460 -->
00:30:32.500We don't even, I don't even look at them.
00:30:32.500 -->
00:30:33.240So, yeah.
00:30:33.240 -->
00:30:34.520Yeah, exactly.
00:30:34.520 -->
00:30:36.680Only if something goes wrong, do I bother looking at it?
00:30:36.680 -->
00:30:36.920All right.
00:30:36.920 -->
00:30:39.920Well, that's, let's, let's wrap this up with a joke.
00:30:39.920 -->
00:30:40.480Okay.
00:30:40.780 -->
00:30:46.760So, you know, the Windows, some of these different operating systems and ecosystems have more certifications than others.
00:30:46.760 -->
00:30:52.360Like there's the network certifications for network engineers and Windows has got a lot, right?
00:30:52.360 -->
00:30:54.620So there's the Windows certified technician.
00:30:55.960 -->
00:30:57.920Can you, it's a, it's a game.
00:30:57.920 -->
00:31:01.140It's like a giant arcade that has a Windows on.
00:31:01.140 -->
00:31:02.560It says, can you make it work?
00:31:02.560 -->
00:31:03.780Can you make it work?
00:31:03.780 -->
00:31:11.060Battle your way through driver updates and registry edits on your quest to defeat the dreaded blue screen of death.
00:31:11.140 -->
00:31:17.500There's like a super excited guy with a toolbox ready to take on the Windows blue screen of death and hack the registry.
00:31:17.500 -->
00:31:19.900Can you be a Windows certified engineer?
00:31:19.900 -->
00:31:24.640It's the latest, it's the hottest game of Dave and Busters this year.
00:31:24.640 -->
00:31:25.220Okay.
00:31:25.220 -->
00:31:26.780But look, look at the controls.
00:31:26.780 -->
00:31:32.340You got to be a Windows engineer with a trackpad and three buttons.
00:31:32.340 -->
00:31:33.200Yeah.
00:31:33.200 -->
00:31:34.540But look at the labels and the buttons.
00:31:34.540 -->
00:31:35.820I didn't, there's four buttons.
00:31:35.820 -->
00:31:36.780You missed an important one.
00:31:36.880 -->
00:31:41.200There's a big giant rollerball, like trackpad.
00:31:41.200 -->
00:31:41.780What is that?
00:31:41.780 -->
00:31:42.560Trackball.
00:31:42.560 -->
00:31:43.200Trackball.
00:31:43.200 -->
00:31:46.000Then there's three buttons, control, alt, and delete.
00:31:46.000 -->
00:31:49.080But down at the bottom, there's another one that says reboot.
00:31:49.080 -->
00:31:50.740It's like the bonus button.
00:31:50.740 -->
00:31:51.700Yeah.
00:31:51.700 -->
00:31:53.260That's good.
00:31:53.260 -->
00:31:55.680I'll make this the show, the chapter art.
00:31:55.680 -->
00:31:56.320This is good.
00:31:56.320 -->
00:31:56.820Yeah.
00:31:56.820 -->
00:31:57.380Awesome.
00:31:57.380 -->
00:31:58.220All right.
00:31:58.220 -->
00:31:59.460Well, always fun.
00:31:59.460 -->
00:32:00.460Thanks for being here, Brian.
00:32:00.460 -->
00:32:01.080Thank you.
00:32:01.080 -->
00:32:01.540Yeah.
00:32:01.540 -->
00:32:02.560Thanks to everyone for listening.
00:32:02.560 -->
00:32:03.260Catch y'all later.