Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
This is episode 376, recorded March 26, 2024.
I'm Michael Kennedy.
And I am Brian Okken.
And this episode is brought to you all by Scout APM.
I'll tell you more about them later.
We appreciate the support.
Connect with all of us, Brian, me, and the podcast over on fastidon.org,
or Mastodon more broadly.
Links at the top of your podcast player show notes.
Join us live if you like.
We typically do this on Tuesdays at 10 a.m. Pacific time.
Why is time so hard, Brian?
Why is it so hard?
Just go to Pythonbytes.fm slash live to be part of the audience.
See the older shows.
All the older ones are there.
And they are typically the same thing we ship.
We don't really overly edit it or anything other than we do clean them up, tighten them up a little.
So if you like the ones with bloopers included, you can check that out there.
I 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?
What do you think, Brian?
Well, I hope.
We're trying.
Actually, yeah, I was thinking about this.
I kind of think that the AI stuff should have the best content out there to read from.
But companies are making money from that.
And I'm not making my blog posts.
I'm not getting any money from that.
If I care about that, how do I stop them?
So Jeff Triplett is thinking about that, too.
So he wrote up a blog post called onrobots.txt.
So the idea was robots.txt is to stop search engines and stuff like that.
But I don't actually want to stop search engines.
I want search engines to find my stuff.
I just don't want the AI stuff.
So Jeff's been thinking about this.
I've been thinking about it also.
So he collected a few links around this.
And one of the things here is I spent a lot of time thinking about robots.txt.
In theory, it helps control what search engines and AI scrapers are allowed to visit.
But I need more confidence in its effectiveness in this post-AI apocalyptic world.
I love that.
Anyway, so there's a bunch of these cropping up.
There's a lot of new stuff going on.
So Jeff has decided to use Django robots.
But let's look at some of the links that he included.
So thanks, Jeff.
So there's block the bots that feed AI models by scraping your website.
So there's an article by Neil Clark that has an example robots.txt.
And the idea is almost all of these different AI bots, you've got to block them individually.
So you've got to set up these different rules there.
So it'd be good to keep track of some of these places.
Hopefully he keeps this up.
But there's also an article, go ahead and block rub callers, discussing why you might.
And then a dark visitors.
I think this is going to be one to keep track of, that it might hopefully they keep it up.
But there's a big list of known AI bots to block.
And so maybe keeping up on this might be a good idea if you care about it.
Jeff's note was that he added it to the website.
Django.
There's a couple different articles about adding robots.txt to a Django website.
There's one by Will Vincent and one by Adam Johnson, both biggies in the Django community.
So we'll link to those.
And 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.
So there's a lot there.
One of the things not included is my blog is run by Hugo or run with Hugo.
Anyway, so I'm going to also link to a how to add robots.txt to your Hugo site if you want to do that.
Oh, nice.
I don't think I've messed with my Hugo robots.txt.
I have not yet, but I think I might.
And I guess I wanted to ask some questions before we moved on.
One is as a community, I think that there should be an easier way to say don't scrape this if you're an AI.
Other than listing each one, we should have a standard for that.
But what do you think of this?
Should, as a content creator, should I care about that?
Should I, I mean, would you?
You know, it's such an interesting question.
I think it's pretty fraught, right?
On one hand, I don't want to feed the AIs either, necessarily.
I think that it's super awesome that you could go to ChatGPT and say things like, you know, what does Python bias?
What does Talk Python think about this?
Or, you know, write me a summary of this in the style of a Talk Python interview.
Like, is that harming me?
No, probably not.
Is it creating some cool aspect, like Halo, of the content creation side?
The fact that ChatGPT knows about those kind of things, that's kind of cool.
Kind of on the plus side.
I don't know.
I mean, we have...
For you, a lot of your content is, I mean, your open content is open.
But a lot of your content's behind a paywall with Talk Python training.
If somebody were to throw all of those trainings into an AI model...
Yeah, that would be different, right?
Yeah.
So, yeah.
I mean, I certainly have a no robot, no index settings on certain aspects of the site there.
It's also behind accounts and logins.
So, somebody would have to be kind of maliciously doing that, which I imagine that's probably already been done.
But it is...
Yeah, that's a different kind of deal.
You know what I mean?
Maybe 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.
Right?
Like, I'm getting this right.
I think it's Canada.
They all blur together.
But, you know, Canada is the most recent one of these, for sure.
And they passed a law saying, well, if one of these big American companies wants to send traffic...
We talked about this.
Want to send traffic to one of our news sites, then they have to pay them for the ride of doing that.
Maybe it is.
Well, it's kind of like Google News.
Maybe it's Australia.
I think it's Australia.
I think it was Facebook.
I'm sorry, folks, if I'm like crossing over companies and stuff.
But I think Facebook just declined to renew their agreements with the Australian newspapers and saying, you know what?
We're not going to send any more traffic and we're not going to allow any links to you whatsoever.
And that's going to be a negative for those news companies as well, right?
The fact that, I mean, they kind of had this shady deal where Facebook would summarize a little bit.
So, like, maybe you don't need to click the link to go to it.
But now they're going to have no links whatsoever.
And they're not going to be in a better place because of that either.
So, 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.
And, like, the biggest example that play now is with these news organizations and the social media and search engines.
Yeah.
Except for, I don't know, the AIs aren't, I don't think they're linking back to the original content.
No, you got a good point there that at least search engines and stuff and social media, they credit you.
They send traffic to you.
Whereas, we're going to have to reckon with the AI stuff in some way because it just says, here's the answer.
And how did I get it?
I don't know.
Maybe that's your answer, repurposed.
Yeah.
But you get zero credit for that.
Right.
Anyway.
That's a good point.
We're probably going to solve that today.
Maybe next week.
Want to come back and solve it next week?
Yeah, sure.
Well, if you were to be automating requests to these websites, what is the most popular way to do that?
Well, it's right in the name, requests.
And requests by Kenneth Wrights has been migrated over.
It's, like, so popular.
It's migrated over to the PSF itself, right?
I don't remember where it said.
Yeah.
It actually still has it says.
Request is one of the most downloaded Python packages today, pulling in around 30 million downloads a week.
And it's used by over a million repositories on GitHub.
You can probably trust it.
But there are things that it doesn't do.
Things that it's not necessarily wanting to, like, lead the pleading edge on.
I mean, just with that amount of usage, you've got to be careful, right?
So I'm going to point you at a fork of requests.
And I quests?
I'm not sure.
Hopefully, N-I quests instead of requests.
N-I.
I'm not sure I'm getting the reference here.
There's probably some cleverness to the name.
I'm sorry for not getting it there, Java.
So anyway, it says requests.
But with HTTP 3, HTTP 2, multiplexed connections.
So if you're downloading, you could create multiple connections to the server and download multiple streams.
I think that's what that means.
System certificate authorities, certificate revocation.
So 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.
You can revoke those certificates and their authorities and so on.
DNS over HTTPS, TLS, and quick.
So 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.
It has async and await, DNS security, and does much pain removed, which is cool.
So anyway, this is a pretty interesting thing.
If you know requests, you basically know this, except for that it also has async versions, which is kind of cool.
But yeah, it's got like a great long feature list and why they did this.
Yeah.
So worth looking at, I think.
Yeah, definitely.
That's pretty cool.
Yeah, 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.
But if you do, this looks pretty cool.
Yeah.
I think it's, I think, my guess is that the name is based on the Knights of Knee.
So it'd be KneeQuest, I think.
KneeQuest.
All right, let's go with it.
KneeQuest.
Yeah, because of course we have those themes, right?
Yeah.
Of course we do.
Now, Brian, we do have a sponsor for this episode, right?
Yay.
Let me tell you real quick about Scout APM.
They're big supporters of Python Bytes, so we appreciate that very much.
So 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.
They're a leading Python application performance monitoring tool, APM, that helps you identify and solve performance abnormalities faster and easier.
Scout 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.
And then you say, oh, no, why is it so slow?
Why are you doing 200 database queries for what should be one?
So 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.
So you can do it in less than four minutes.
So that's awesome.
And the best part is the pricing is straightforward.
You only pay for the data that you use with no hidden overage fees or per seat pricing.
And I just learned this, Brian.
They also have they provide the pro version for free to all open source projects.
So 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.
So you can start your free trial and get instant insights today visit by them by set of him slash Scout.
The link is in your podcast player show notes as well.
And please use that link.
Don't just search for them because otherwise they don't think you came from us.
And then they'd stop supporting the show.
So please use our link by them by set of him slash Scout.
Check them out.
It really supports the show.
Indeed.
Thank you, Brian.
Yeah.
Let's talk about underscore has some underscore has some funky meanings in Python.
It's good.
We love it.
We love the underscore.
Yeah.
Like I'm going to get a new keyboard where I like on my keyboard here.
It has two independent buttons for the space key.
I'm going to make this one just the underscore.
Okay.
Sure.
You can do that.
And you'll probably need it.
What can I do with it?
You could because of all of the Dunder methods.
We have so many underscores that we call two underscores Dunders in Python.
So and what are all these Dunder methods for?
So Trey Hunter has actually put together this really cool resource.
Every Dunder method in Python.
And actually, I mean, I thought I knew quite a few.
And I use probably rep and stir probably the most to make sure that my objects are representable or convertible to strings.
But there's quite a few more.
And so he goes through, like, here's their essentials for a repper.
And, oh, you know, he calls equality essential.
But I don't really, I guess maybe I don't make my own custom data types as often as maybe I should.
But there's the equal, EQ, that does equality.
And then repper that converts to rep.
And it's also used with stir if you didn't have a stir method.
But you can have those be separate.
So the other one that's common is Dunder init for how you initialize classes, which, you know, to be honest, I use probably adders and data classes more than custom data classes.
So I don't really write that myself a lot, but I often use it in initializing another class if I derive from something else.
Anyway, moving on.
There's tons.
He's got equality and hashability.
Hashability is important if you're creating an object that should be hashable.
That way you can create.
Why do you care about that?
You care about hashability because that means your objects can be used.
If they're hashable, they can be used for.
I think there's some other rules, too, but you can use them for keys to dictionaries.
And there's tons of dictionaries in Python.
So we've got-
Maybe also sets.
I'm not sure.
I can't remember about sets.
Maybe.
Yeah, probably.
Yeah.
But you also need to equal it.
I think there's less than you need also.
Anyway, there's orderability.
So you've got less than or greater than and all that.
Type conversions and formatting.
Tons around that.
You don't think about type conversions that much, right?
Because you don't think about testing and all that stuff in Python as much.
Right.
But it is kind of cool.
I didn't know that.
I guess I knew you could do this, but I kind of forgot that you can.
So 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.
I didn't know about this format thing so that you can use the f-strings appropriately if you've got the format.
I think you can pass modifiers from the S string.
So like with a floating point number, you can say like for the modifier.
I think you can use the 0.2 F and I'll be like comma separated.
I think you can take your own format specifier there.
I think that's what that's for.
Okay.
I'll have to research that a little bit more.
Anyway, the dunder methods around context managers, which is actually kind of a funny thing.
I 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.
I've never built one up from scratch.
I always use like some of the wrappers and stuff to do context managers.
Anyway, containers and collections.
If 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.
Callability is one I've used frequently.
You can create an object that's callable if your class has a call method, which is kind of fun to make callable objects.
A bunch of arithmetic operators so you can overload things.
In place, built-in function, built-in math functions, attribute access, all sorts of dunder methods for you.
So anyway, if you're thinking of overloading a class so that it can deal with different built-in operators,
check out Trey's article.
Yeah, that's pretty nuts.
Actually, I kind of am coming away from this the same feeling.
It's like, I think I knew these.
Like, actually, no, there's more stuff.
There's more that I realized.
Yeah, there's a lot.
I like the orderability, though.
It's because I often, at the very least, I want to be able to sort things.
Yeah, yeah, indeed.
Sorting is good.
The one that I think is news to me, maybe the casting ones, but also the string formatting one.
Yeah.
You could have a user object.
You could say, like, colon E for their email.
I mean, not necessarily would do that exactly, but just weird, right?
Yeah, I'll have to play with that.
Yeah.
All right.
Let's talk about this next one, a lockbox.
I don't think this is Python exactly.
Oh, wait, I take it back.
It is Python, 100%.
But 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.
So this takes a bit of, it takes a moment to get your head around.
So lockbox is a forward proxy for making third-party API calls.
And you're like, okay, keep talking.
Maybe it'll make sense eventually.
So here's the deal.
If you're going to integrate with some third-party thing, think Zapier, if that, if this, then that, et cetera, et cetera.
And those things are making API calls on your behalf.
You have to give them the API calls for the destination thing they're integrating with.
So 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.
Which may be fine.
I mean, Zapier is certainly a trustworthy company.
I've had the CEO on Talk Python a few times.
He's great.
But just on principle, you might not want to do that.
You know what I mean?
Yeah.
So that's what this thing is for.
So 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.
And it's like an intermediary for this whole process.
So you can register an app in your lockbox and it gets its own just for this one purpose API key.
You give that to Zapier.
So Zapier calls lockbox, lockbox calls Slack or lockbox calls Jira or whatever.
And it has a couple of advantages.
So you can do things like you can audit what actual traffic is being done.
So you can see exactly what, let's just keep with Zapier, what Zapier is doing on your behalf, exactly what data is passed.
And if something's going wrong, you could see that.
It's still playing.
Zapier is charging you for too many zaps, you can say, I didn't use this many.
Exactly.
Here's how many zaps exactly you used.
Yeah.
Some of these are planned.
So you should be able to restrict access to external APIs in a more fine-grained manner.
You know.
Ooh, rate limiting.
Yeah.
Rate limiting on third-party API calls.
But the primary purpose of it is that the API keys are not exposed to anyone else.
They just live in this lockbox thing that you control.
And then you can, of course, throw them away.
Right.
Drawbacks are, well, you got to run your lockbox.
Basically.
And so on.
But yeah, it's pip install lockbox-proxy.
And you set the sucker up and off it goes.
I think it's pretty cool.
Yeah.
Interesting.
Yeah.
For, 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.
And especially for some monitoring purposes.
Yeah.
It's an interesting idea.
Yeah.
Andrew out in the audience says, nothing against Zapier.
But that kind of feels like an indication that maybe it isn't a type of thing you should be handing off to third parties.
I may agree with you.
Although, I think in practice, a lot of people pass their keys all over the place to get stuff done.
You know?
Especially the less developer-y.
The less developer-y you are, the more you're like, just click these things together and do it for me.
Yeah.
What could go wrong?
YOLO.
Come on.
My password's the letter A.
I don't see any problem here.
This is way more secure than that.
Good thing we made all passwords password.
Exactly.
That way I never forget it.
It just says, what's your password?
And I'm like, well, you gave me the hint right there.
Perfect.
Well, that's our items, our main items.
What else you got there?
I got a couple extra.
Since I covered Django a little bit earlier, I ran across Adam Johnson's Django Join the Community on Mastodon.
I'm also working with Django a lot lately.
So trying to follow some of the Django people on Mastodon is good.
So he's got a good resource for people that want to.
If you're a Django person, you want to get started on Mastodon, there's some good people to follow.
Some projects, official accounts around Django.
And reminders to do a welcome post, which I still have forgotten to do.
So sorry, people out there that don't know who I am.
Anyway, yeah, the introductory post is a good idea.
And to hit through it.
So the other one extra got sent in just this morning from Kim Van Wyk.
And it's a website called unmaintained.tech.
And essentially, the idea is there's a badge and there's some description.
So 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.
People 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.
So interesting.
Yeah.
Some things are done.
They're just done.
Yeah.
Some things are done.
And it's okay.
So you don't have to take them down.
Just tell people that you're not working on it anymore.
Interesting.
Wasn'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?
And they quickly rolled it back because people are like, stuff can be done.
Don't do that.
Okay.
Yeah.
I think that was pre-Microsoft takeover.
Yeah.
That might have.
You know what?
I think it probably was when they were like, how are we going to pay for this stuff?
We need to start getting rid of some of the storage of things that just abandoned.
And now they don't want to do that because there's all that AI meat in there to eat.
That's right.
Well, speaking of takeovers, US sues Apple for illegal monopoly over smartphones, says The Verge.
Now, I think the monopoly angle is a little bit of interesting here.
I had some conversations on Mastodon.
People were like, oh, they only have 20% of the market.
In the US, they have over 60%, 68%, 60%, something like that.
But I think the real problem is there's nowhere else to go.
Where do you go?
There's literally one other option in the entire world.
I know technically there's some Kickstarter that somebody could have a hundred other phones.
But in practice, as an adult, you need a smartphone to live these days to function in society.
Like, well, you get this app to do this thing.
Like, well, how do I get it on my phone?
I have to hit to get C.
I press number one three times.
Like, oh, you can't do this part of the world.
You're done.
And I think Apple, I think it's, I don't know.
It'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.
I think there's some really legitimate causes and I'm here for this.
I hope this makes a change because Apple is just such a bully.
I 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.
To 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.
They're like, nope, we're rejecting that.
And we have these rules.
We need more money from you, even though you're already paying us a hundred dollars a month and making the platform better.
You 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.
Like we submitted it and they said, well, it doesn't have in-app purchases.
I said, that's okay.
I don't really want to sell anything through here.
My 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.
I just want them to be able to do that better.
Like no apps rejected.
Interesting.
But you have this clause 4.3.1 called reader apps.
It says, if you bought material on the web, like a book, audio, or video, you're allowed to consume that on the phone.
And there's no in-app purchase required.
Like we don't care.
You don't count as that.
You're something else.
You're not as big as Amazon.
So you can't.
Yeah.
You don't get any special treatment.
So 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.
Or you can't be part of this.
The majority of your customers in the United States can't have your app, right?
And 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.
Now it's harder to maintain the app.
If I add a new course, I've got to like do more work and release new versions of the app just because of that.
Like it's incredibly frustrating how they're just doing this.
Well, does this even talk about that?
Because when I read this, I was thinking, I was thinking, I mean, I've felt this.
I love Apple.
I've got two or three computers.
I got the phone watch.
But I've thought, hey, I want to try a different watch.
Oh, it doesn't work with anything else.
I can't really.
So I feel the customer lock-in part.
I'm not really happy about that.
But the other part that I, is that part.
And I don't know if the lawsuit covers that.
Is this whole 30% tax that they want to apply to everything?
Yeah, I think it does cover the lack of ability of using other payment processors and stuff.
Other payment processing, other delivery methods, all that kind of stuff.
Like 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.
But only in Europe and only for companies that have had over a million downloads previously.
So there's no way to get started ever.
If you created a popular app now, you have to have done it last year.
But if you don't have it yet, how do you?
But then they're charging 27% for their fee for delivering your app.
But if they're not doing the processing and it doesn't go over their servers, what is the 27% for again?
It's just to give them money.
It's bad.
So anyway, there's a couple of videos from this guy called Theo Rants.
They're actually quite good, both the lawsuit and another one.
And then also the day after, this was yesterday, Brian.
The EU rejects Apple's European App Store changes.
This is the one I just talked about with some of those weird fees and other stuff, right?
Company could be fined 10% of global revenue, 20% if they don't fix it after that.
And 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.
They should just make the rest of it free and not even make it a hassle for people.
You know what I mean?
It's just like, why are they doing all of these things to just for that last little bit of stockholder value, you know?
Yeah, but even the games part, why are they taking 30% cut?
It's just, it's too high.
Yeah.
You know, and honestly, I don't even mind the 30%.
What 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.
Right.
It's if I wanted to sell it, I'd be like, all right, look, 30%.
It's, it's rough, but it's digital project products.
I'll live.
But the fact they're like, you can't even not, you can't even choose to not sell stuff.
We're going to make you sell stuff.
And that kind of, that kind of stuff is just, that's where I think like, okay, this is over the line.
When 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.
That said, I have like five apples to so I says, just in this room.
So I'm very conflicted.
Yeah, definitely.
So yeah.
Yeah.
Okay.
I have a few more things.
They're quicker.
I promise.
The PSF is looking to hire somebody, which is awesome for PyPI support specialist.
How cool is that?
That is cool.
Yeah.
I read about that.
It'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.
It's kind of nuts, but yeah.
So a PyPI support specialist is a job, a person that are looking to join the team.
So if you're interested in that, check it out.
That'd be really cool.
Let's see.
Why is this looking like it looks here?
There we go.
We're going to do, this needs to go away.
We're going to do a VS Code Ask Me Anything with Brian Clark, not Brian Ockin, Brian Clark and Cecil Phillip and me in 21 days.
So if you want to be part of that YouTube only event, then the link is in the show notes.
Check that out.
You can submit questions ahead of time.
So if you've got one, please, please do that.
And lastly, a quick conference thing.
Gareth 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.
So if you're interested in that, check it out.
Okay, I've got one extra, extra thing.
An extra, you have an extra, extra, extra, extra.
And partly it's an apology.
So I've been doing the emails for the show, but I kind of forgot last week.
So I'll get the, this week you'll get two or we'll combine them into one or something like that.
But how do you get the email?
So 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.
So, plus we'll sell it and make lots of money.
Yeah, that's...
No, we don't sell your email or anything.
We don't, we don't sell it.
We don't even transfer it to other, other locations.
It's pretty excellent.
We got some good infrastructure set up.
We don't even, I don't even look at them.
So, yeah.
Yeah, exactly.
Only if something goes wrong, do I bother looking at it?
All right.
Well, that's, let's, let's wrap this up with a joke.
Okay.
So, you know, the Windows, some of these different operating systems and ecosystems have more certifications than others.
Like there's the network certifications for network engineers and Windows has got a lot, right?
So there's the Windows certified technician.
Can you, it's a, it's a game.
It's like a giant arcade that has a Windows on.
It says, can you make it work?
Can you make it work?
Battle your way through driver updates and registry edits on your quest to defeat the dreaded blue screen of death.
There's like a super excited guy with a toolbox ready to take on the Windows blue screen of death and hack the registry.
Can you be a Windows certified engineer?
It's the latest, it's the hottest game of Dave and Busters this year.
Okay.
But look, look at the controls.
You got to be a Windows engineer with a trackpad and three buttons.
Yeah.
But look at the labels and the buttons.
I didn't, there's four buttons.
You missed an important one.
There's a big giant rollerball, like trackpad.
What is that?
Trackball.
Then there's three buttons, control, alt, and delete.
But down at the bottom, there's another one that says reboot.
It's like the bonus button.
Yeah.
That's good.
I'll make this the show, the chapter art.
This is good.
Yeah.
Awesome.
All right.
Well, always fun.
Thanks for being here, Brian.
Thank you.
Yeah.
Thanks to everyone for listening.
Catch y'all later.