Transcript #346: Have you lost your GIL?
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
00:04 your earbuds. This is episode 346. I'm Michael Kennedy. And I'm Brian Okken. And this episode
00:11 is brought to you by us. Check out all of our things and support the show by taking part in
00:17 them. We have our courses, the pytest one Brian wrote, a bunch of other ones. I just did the async
00:22 Python and MongoDB combo with a little bit of FastAPI and load testing in there. That's a good
00:27 one to check out. And if you want to be part of the live stream, just Python by set up him slash
00:32 live and you'll see the next scheduled one we got set up for you queued up for you. Usually 11am
00:38 Pacific on a Tuesday as it is today, but that's not always the case. So be sure to check. It is August,
00:44 Brian. Yeah, the summer is moving along. And so is the Python. You have some big news to share. I know
00:50 I have a bunch of fun, small things, but you got some big ones. You want to kick us off?
00:54 Yeah. So we, I think we've covered this before. There was a PEP 703 to make the global interpreter
00:59 lock optional in CPython. And well, we have some news from the steering council. So the steering
01:06 council has come back. There's a Thomas Wooters posted a steering council notice about PEP 703.
01:15 And there's a lot of news in here that I think I'll let you help me dig through this. So I'm going
01:21 to jump down to the, so there's, there's some assumptions and some discussion around this
01:28 GIL removal thing, but I'm going to jump to the short and midterm and longterm actions. So it's going
01:37 to be in stages. So the idea is in the short term, there'll be a no GIL build as an experimental build.
01:44 And that will be a part of possibly Python, their version 313 or 314. It looks like they're hoping
01:54 for 313, but that's so that what that's like next year or something like that. So and then, okay. So
02:00 then we'll have two builds. What do we do with that? Well, midterm is there is to have, and the
02:07 default is the default version is going to be the, the, the GIL version, of course, just as usual,
02:13 as things go through it, as they figure out and everybody deals with like the rest of the Python
02:19 environment and the community and all the third-party libraries figure out how to deal with the no Gill
02:24 version. So in the midterm is there's going to be a community, hopefully community support to help,
02:30 help get through this no GIL part. And, and then longterm, the no GIL version becomes the main
02:38 GIL or the main, not the main Gill, the main version of Python. And we deprecate the GIL version. So
02:44 the timeframe looks like about the longterm isn't super long. It's like in the five plus year timeframe.
02:52 Well, the plus means like, who knows how long it will be. But I think that there's a lot of energy
02:57 around getting this done and getting a lot done in the next few years. So yeah, the, the timeframe of
03:04 it being an option in three 13, I would put it in October of next year of 2024. Yeah. And some,
03:12 some alphas and betas earlier then. So yeah, for sure. That's pretty quick. And then, so there's just some
03:18 caveats in here saying they're this, everybody's excited about it, but they, they reserve the right to
03:25 just cancel the whole thing. If it's really not sound, if it's not working out. So, but I don't
03:30 think that will happen. Yeah. Yeah. We'll see how it goes. But we talked about this a little bit on
03:34 our AMA episode about the value and basically what the other languages do. Most of them have some
03:40 constructs, but assume that developer is kind of responsible. You pointed out that it's not as
03:45 burdensome as people might think, because most code is not parallel code and you don't have to worry
03:51 about it. It's just kind of a, no, no big deal. You don't have to think about it unless you're writing
03:56 libraries where, you know, that will be used in a thread safe way, you know, things like that, then,
04:01 then you do have to take that into account. I think the trade-off is worth it. We're not getting,
04:07 we're not trending towards a world where there are fewer CPU cores, right? Yeah. It's only getting to
04:13 the point where, you know, like for example, on, on my Mac, if I run some Python program, it has access
04:18 to 10% of the capacity. If I run it on my SIM computer, SIM racing computer, it has one 16th access
04:26 to one 16th of the CPU capacity, right? It's just, if you want to work in modern hardware,
04:31 you really need to have access to parallelism when you need it. So for me, this is a real positive.
04:37 I think the other thing that we previously covered is meta said they will come along and dedicate three
04:42 experienced engineering engineer years to this project to help make, not just it happen in CPython,
04:49 but to make it happen in the important libraries outside there, like NumPy and those types of things.
04:54 So I think for me, this is a super positive. It's always been a little bit weird that Python has been
05:00 so restricted. It's also one of those reasons that might, it's like one of those springboards
05:05 that might eject someone from the community that they would otherwise love, right? You might be told,
05:11 well, we got to get better parallelism. So we're not doing this in Python. We're going to do it and go
05:15 or some other place where you're like, kind of like Python, but I guess it's not a fit anymore,
05:20 right? This would mean that it's a better fit in other places. So this is awesome. I know it's
05:25 going to be a lot of work. It's going to be another legacy Python versus non-legacy Python sort of deal.
05:30 hopefully not too bad. Maybe having gone through it once, the community will go,
05:34 oh, we'll do it again. It's not as bad as we thought.
05:36 Yeah. But I mean, like the goal is so that you can have, like, if you're just writing a little,
05:41 a little single threaded thing or a little script or whatever, the small sort of things you do with
05:47 Python also, that those things are just as easy as they are. They've always been and just as fast.
05:53 That's what we want.
05:55 Yeah. That's certainly the goal. I'm just thinking about the code that uses the Python API for important
06:01 libraries that calls the API, release the gill, take the GIL. When there's no more gill, does that
06:08 library become unusable? Does that become a no-op and it's just undefined behavior? You know what I mean?
06:14 Like there will be some kind of consequence in the ecosystem. I just, I'm not sure what the knock-on
06:19 effect will be.
06:19 Yeah. Yeah. And it'll be interesting to see how, like, applications like Django and things like that
06:26 deal with it.
06:27 Yeah, for sure. And Liz out there points out, get through this long-winded breakup with a GIL.
06:33 We have a semi-toxic and ambivalent relationship with a GIL. We love it and hate it at the same
06:37 time. For sure.
06:38 Yep. Definitely.
06:39 All right. Well, Thomas, thanks for the updates on this. Yeah. And it's going to be an interesting
06:46 journey. Brian, it'll give us plenty to talk about. So that's cool.
06:48 Yeah. Stick with this. Make sure you subscribe to Python Bytes to keep up on everything that's going
06:54 on with the GIL breakup. Yeah, exactly. It'll be fun. All right. I got to adjust my browser before
07:00 we switch or I'm going to spoil the joke. All right. So I want to do just a quick one. This is not
07:06 Python specific, but it's super important for web developers. So we had Google with flock. Remember
07:12 that federated, cohorts of, learning of cohorts. Oh yeah. And then we had the sandbox groups,
07:21 which was kind of like that. And I, I don't remember exactly what that was called, but that was
07:25 another technique because the flocks met with such resistance. Like you could really do some bad stuff
07:31 by putting people into these groups. And so the, I'm not sure where the sandbox stands, but it turns out
07:37 there's now a new proposal, to try to get rid of third-party cookies. My feeling, I don't know for sure,
07:44 but Google is trying to get rid of third-party cookies because they're easy to block and it hurts
07:49 their advertising and they're retargeting. If you can just easily block it by checking a box,
07:53 like, do you want to be tracked? No, thanks. You know, in your browser, right? Like Firefox does,
07:58 like Vivaldi does. You know what? Oddly, I don't remember that setting being a default in Chrome that
08:03 it just offers to block the Google network. That's interesting. It must've been an oversight.
08:07 So anyway, this, they're now out with a new thing and the, over on a bleeping computer,
08:14 they say browser developers push back against Google's web DRM. So basically the different websites
08:21 can choose or be made to choose to force you to verify certain things, that, basically
08:30 prohibit things like ad blocking, like prove that you don't have ad blocking on. So you can visit my
08:35 website or I'm going to tell you, you can't write new authentication system could let websites block
08:40 extensions, jailbroken devices, and other important things. So the, the headline is Google has been
08:45 trying to implement plans to move beyond cookies for years. That sounds great. Comma without denying its
08:52 partners and itself, the means to sell targeted ads, which form the backbone of the company's revenue.
08:57 This new one comes, proposal to guarantee user privacy and security comes to the, the cost of
09:04 freedom of functionality, AKA the open web. So there's a bunch of, it talks a little bit
09:11 about how this works, but basically the website has to come along and decide what browsers it trusts.
09:18 And the web browsers themselves have to implement a mechanism to guarantee who they are. Not surprisingly,
09:25 Vivaldi comes along as one of the first people to push back against this and calling it dangerous.
09:30 If an entity has the power to decide which browsers are trusted and which are not, they say there's no
09:36 guarantee that they will trust any given browser. And a new one that comes along would not by default,
09:42 not be trusted until it's somehow proven itself to the people who run that website. And what about the
09:47 next website? What about the next? And so on, you have, of all these kind of an interesting position like
09:51 this, they, they're just, they use a fork of Chrome that's stripped down of a lot of things. But when you go
09:59 to a website or you look at the user agent, that's how browsers nowadays tell people who they are, right?
10:04 And just send whatever you want. But it usually is a consistent thing. Vivaldi lies and doesn't say,
10:09 we're Vivaldi version. I don't know, whatever version we're on. It says, I'm Chrome. And whatever the current version of Chrome is, it just says that. That way websites don't go, oh, you're going to need to use Chrome because,
10:21 your, your web browser isn't one of those. You know, it's like, it actually is internally identical.
10:27 Just, it's got a different name, right? So they're in this situation where they kind of lie to the world about who they are, the web server world. And this would kind of break that as well. The Brave team says, the Brave team says, they don't really care. They're not shipping it. We'll see if that's a problem or not. And Mozilla doesn't have an official opinion. But one of the folks said the mechanisms to attempt to restrict these choices are
10:51 are harmful to the openness of the web ecosystem. And this one's might be interesting to Brian. Additionally, the use cases listed depend upon the ability to detect non-human traffic, which as described would likely obstruct things like web assistive technologies or automated testing.
11:07 So anyway, this is one of those things that probably deserves enough interest from people in the Python web world to just voice a little bit of no.
11:17 No, the answer is no.
11:19 Yeah. And yeah. So anyway, I, it's, you know, not super actionable. It's not a thing that's out there yet. But like the previous two, it's, it's the folks behind the web side of Google, the web browser side of Google, the web standard side of Google saying, how can we basically change the web?
11:40 So that it's so that we will be able to completely still control and track and sell you right right now. The third party cookie thing is not looking good. Even, you know, parliaments and Congress have gotten into it and said, Oh, you can't have these cookies. We have these stupid pop-ups everywhere.
11:56 This would make those all go away and you would just be like part of the machine. You know what I mean? this is just the third, the third version of how do we make them part of the machine? and this one I think is probably the worst.
12:07 Cause not only is it something that would go into Chrome, which was the previous two, but this is something that would basically make the websites reject browsers. You might say, Michael, why would a website do this? I mean, obviously terrible places like CNN that have some like 45 trackers.
12:23 They put on you every visit, you might see why they would do that, but why would, you know, random little website not want you to come? Well, there could be things like, Oh, do you want to have Google ads on your site or any double click or any ads from any ad network?
12:37 Well, we're not going to allow you to have them at all. Unless your website has this, you know, please reject the ones that we don't like sort of setting turned on. And here's the script will help you do that.
12:47 So it's not ideal. Yeah. It's like, nobody can make money off of traffic except for me. sort of thing.
12:54 Yeah. It's, it's, I mean, it's pretty bad. It's kind of a monopoly type of situation. One in the browser space and then two in the ad space. They're kind of both sides of that markets. It's, it's pretty, pretty much not good.
13:06 I wonder how many people are turning off ads, because I mean, I've gone, I've got Vivaldi running and it's turning off ads and I, I run into websites that say I did. You can't read this unless you turn on.
13:18 Turn on if turn off your ad blocker and I'm like, well, I'm not going to read it then. I'm like, I'll go somewhere else. yeah. But how many people really do? I mean, it's can't be that many, many of us.
13:30 I would say for developers, the developer audience looking at when I used to run Google analytics before I decided they were evil and turn them off. It was about 40 to 50% of the traffic would not show up.
13:44 Yeah. Okay.
13:45 So that is not quite all blocking. There could be robots like, you know, requests doing a request like Python requests, doing a request that also wouldn't register, but that's, that's pretty good. And just, you know.
13:56 Yeah. We'll go back to like magazine ads, never had tracking in them and they did fine.
14:01 Yeah, exactly. So, I mean, it's not just, we're trying to be jerks to websites and we don't want to pay for stuff or we don't look at ads like this headline.
14:10 How long is this? This is just, you know, six months ago or nine months ago, hackers abuse Google ads to spread malware in legit software. Right.
14:17 There's just stuff over and over. Plus what, you know, there's all like the reselling stuff, the NSA, CIA stuff.
14:25 Yeah. Buying your, I mean, there's just lots of, it's not just, I don't want to see ads. There's really negative effects to these things. And it's honestly, it's a little bit disappointing that Google is doing this.
14:36 Right. And we have advertisers and we put ads on our website for the advertiser.
14:41 Absolutely.
14:42 And it's, but it's, there's no tracking. So.
14:44 And they're not even blocked because we're not trying to send it through some creepy network with retargeting. We're just, we tell you things that we've, we've evaluated and thought you might like.
14:54 And people paid us to help spread the word. And, you know, there's certainly ways you could do that. Right. Like this last thing, there's this page we're on here. If it had ads, I don't know if it does or not, cause I'm blocking them like you.
15:05 But if it did, it could easily show you ads about privacy. It could show you ad about browsers. There's like certainly relevant ads that can be put on here just based on the context of the page, not who is viewing it. Right.
15:18 And those work almost as well without all the negative stuff. So anyway, one more thing to keep an eye on folks. And Christopher on the audience says, interesting how Google has lately continuously, continuously been trying to do the exact opposite of don't be evil.
15:34 Yeah.
15:35 Shareholder value, Christopher, shareholder value. Let's have it.
15:38 Well.
15:41 All right, Brian, over to you.
15:42 That's pretty rough news, man.
15:45 No, it's okay. The last two sounded bad, too. And they both got, you know, pushed out of existence. I suspect this one will as well.
15:52 No, I was just trying to do a rough transition.
15:55 Oh, that was pretty rough.
15:58 Anyway, so there's an article. Oh, I lost the author. It's from Matthias.
16:09 From Matthias. How rough changed my Python programming habits. And we've covered rough, I think, several times on the show. But I, I and I've used it on a lot of projects. But, but I, I was excited to see this because it's some stuff about rough that I've, I haven't been paying attention to. It just works. And it's really fast. But there's a whole bunch of cool stuff. So this, in this article talks about, he talks about using pre commit.
16:35 Pre commit. Or has long been using pre commit. And flake eight and black and I sort of all that sort of stuff. And I knew that rough was going to start picking up some of these extra things. But I didn't know how far it went.
16:48 So in this article, he talks about using different rules within, within rough, like, like pie flakes and pie code styles. So that's, and the McCabe for cyclomatic complexity checker, just to make sure that you don't have too many nested, huge loops and different things like that.
17:09 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 I love that magic.
17:10 So all these things you can turn on within, just within, within rough.
17:15 I sort, PEP 8 naming.
17:17 That's cool.
17:18 Pi upgrade.
17:19 Love that.
17:20 Flake, flake eight 2020.
17:22 And I'm going to shortly show where you can look these up.
17:25 So there's a whole bunch of really cool things.
17:27 I really like bug bear, flake eight bug bear also.
17:30 So apparently that's been supported for almost a year within rough.
17:33 like a Django pie simplify, but this, these are just the, the ones that this person likes
17:40 or has, is he trying out and using.
17:42 so I went ahead and kept looking.
17:45 So that's, that's this article, which is a pretty decent article about using how it changes.
17:50 One of the things I want to highlight, and I've been trying to use, I, when I tried to use
17:55 pre-commit a while ago, I haven't been using it lately because a lot of these things take a
18:00 bit.
18:01 they take a bit of time and it's, he writes, there's always a trade-off between
18:07 development speed.
18:08 I.e. waiting on get commit is very boring and strictness.
18:12 And I have to agree.
18:13 So what I've been doing is mostly putting these tests in CI and not doing it as part of pre-commit,
18:18 but having it within, within rough is super fast.
18:22 And you can go back to using pre-commit with rough and just turn on a bunch of these things.
18:27 So, link also linking to the rough configuration, documentation.
18:32 And for example, these aren't, all these things aren't turned on by default.
18:36 We get, I think the air, the, PY code style warnings.
18:42 Oh, it does not turn on.
18:44 It doesn't turn on PY code style warnings.
18:46 It by default, it turns on PY code style errors and PY flakes, errors.
18:51 So those, those are turned on by default and you turn it on with this, like, in within
18:56 the toml file with like a select equal.
18:59 And then you have like just a, a string of characters like E for, PY code style F for PY flakes.
19:05 And then there's a whole list of these.
19:07 so there's an example of you do B for like a bug bear.
19:10 And then there's another page for, rules, where, in the rules list, all of the
19:16 different, different ones.
19:17 So like the PY flakes start with F.
19:19 So if you would add F for that, there's a whole ton of these things, that I'm excited about
19:25 trying to turn, turn more of them on.
19:28 And I have on one of my projects and it's just super fast.
19:31 So you just like within pre-commit.
19:33 So there, when I try to commit something, it'll run these on the files that have changed,
19:39 and try to run, or I can't, I actually don't know.
19:42 It's happening so fast.
19:43 I don't care.
19:44 Maybe it does the whole thing, but it's just super fast now.
19:47 And I don't have to wait to commit, but I know the checks are being done.
19:50 Super fun.
19:51 The other bit that I wanted to, the one last link I want to share is, astral, which is
19:57 the now company, around rough, has a rough pre-commit, hook that you can set
20:05 up for get, for GitHub actions.
20:08 So, if you just add a, this little snippet, that we have a link to, there's just a,
20:16 astral, astral dash sh rough pre-commit repository with a river, with a version and, with
20:23 the hook and you would, that will make it so that your project runs within GitHub actions
20:28 also.
20:29 So super fun.
20:30 Okay.
20:31 Yeah.
20:32 Very cool.
20:33 I also like having it set up.
20:34 So not as a pre-commit hook, but also as a high charm plugin.
20:39 Yeah.
20:40 Oh, right.
20:41 I just misspoke.
20:42 This isn't a GitHub action.
20:43 It's a pre-commit hook.
20:44 So it's, it hooks rough in with pre-commit.
20:46 Sorry about that.
20:47 Yeah.
20:48 Yeah.
20:49 Nice.
20:50 Well, so that way as you're typing and you see the stuff, it just puts a little squiggly
20:53 send there, there and suggests sometimes it can even auto fix it, you know, alt enter,
20:57 fix this thing by, for example, applying strict equals true and the zip.
21:01 Okay.
21:02 So you just have rough rough running in, in PyCharm.
21:05 And it just runs constantly as you type.
21:07 But again, it's so fast.
21:08 Like, you know, you don't notice.
21:09 Well, one of the fun 10 cores, I can do it over there.
21:12 One of the things with the, with the having it be a commit hook also is, you can set
21:18 it up to, to auto fix.
21:20 So rough isn't just, you have errors, but it can find the errors and fix them and not even
21:24 tell you about them.
21:25 It just fixes.
21:26 Oh, that's nice.
21:27 Yeah.
21:28 So like, well, I turned on bug bear or I can't remember what I turned on one of the extra
21:33 rules and it showed some, some, like some spaces at the end of the lines.
21:38 And then I added the command to just fix them for me.
21:42 And then it just didn't do it.
21:43 It just would fix them without even telling me, which is great.
21:46 It's way better than complaining.
21:48 Yeah.
21:49 Like I sort stuff.
21:50 Well, if I, if I, if I'm just, just sort them, if I got them in the wrong order, just
21:55 like, you know, I'm going to do it and that's fine.
21:56 Yeah.
21:57 And Henry says rough also has a VS Code language server plugin as well.
22:00 So either side of the fence that you sit on for those, that's all good.
22:04 All right.
22:05 Onto the next, onto the last.
22:06 All right.
22:07 Onto the last.
22:08 We've discussed F S back file system specification, I'm guessing.
22:14 And the idea of F S spec was that what you can do is you can have all these different
22:20 different file systems that when you would do like open, you know, open some file name
22:25 encoding as this append.
22:27 So on that kind of work, you could point it at different places besides the hard drive.
22:33 You could point it S three.
22:34 You could point it at a, some kind of web dev or some other, you know, blob storage network
22:41 drive, all these different things that you could possibly do.
22:43 And you have exactly the same API as just opening a standard file.
22:47 Right.
22:48 So that was like with open as file stream, dah, dah, dah, dah.
22:53 You go do your thing.
22:54 Right.
22:55 Well, a lot of us are fans of using, pathlib, right?
22:58 So create the path.
23:00 You do like a cool thing.
23:01 You do the, the slash, the division is overridden to look like you can separate the file names
23:06 and all that.
23:07 Right.
23:07 So there's this thing called universal pathlib.
23:10 Now that's, it looks like this project was created two months ago and this was sent in to us.
23:15 So I want to say thank you to Justin Flannery.
23:18 Remember he had that, that camping CLI thing that we could find campsites that are sold out and stuff.
23:23 Yeah.
23:24 and so we talked about that a few months ago.
23:26 So he sent this in and said, look, FS spec is awesome, but now there's a universal pathlib and it extends, the built-in pathlib.
23:35 So the pathlib module dot path API to use basically FS spec, which is awesome.
23:41 And so if you want to talk to things that are not file systems, but you really like the path class, then you can use this one.
23:49 Either saying, you know, import it as you path.
23:52 You could also just import it as path if you want, for long as you're not mixing it up with the other and just treat it the same.
23:57 Right.
23:58 So for example, you could say you path, instead of giving it a directory name or a file name, you would say like S3 colon, you know, slash, slash, some path to your S3 information slash some file.
24:10 Right.
24:11 And you could ask, what is the name?
24:12 What is the suffix?
24:13 Does it exist?
24:14 And read it.
24:15 And so on, just like you would with a normal file.
24:17 But now this thing is in S3.
24:19 We have file.
24:20 We have Azure storage.
24:22 We have HTTP and HTTPS.
24:24 We have Hadoop, Google cloud, S3, web dev.
24:28 And one, I think that would be really cool for testing Brian is memory.
24:32 Yeah.
24:33 Right.
24:33 You want to create a file, work with it, make sure, you know, pass this path like object to other APIs, let it do things.
24:38 And then it just goes away when it goes away.
24:40 Right.
24:41 That's pretty cool.
24:42 Yeah.
24:43 I love using memory file systems for testing.
24:44 Yeah, absolutely.
24:45 Like SQLite has one memory colon, I think it is, or maybe two colons on the front.
24:51 Same thing for the database.
24:52 But yeah, this is really handy.
24:54 Not to be, you might be wondering like, why would I ever use memory?
24:56 Because you don't want to touch the file system.
24:58 You just need to pass a file and there you go.
25:00 So super simple.
25:01 There's a little example notebook that I blasted past somewhere.
25:05 People can check that out if they want to just see how to use it.
25:08 Okay.
25:08 A bunch of examples play with it.
25:09 So if you are working with these alternative file systems, this is definitely worth giving it a look.
25:13 Yeah.
25:14 Cool.
25:14 Nice.
25:15 All right.
25:16 Well, I have no extras.
25:17 How extra are you feeling today?
25:18 I guess I don't really have any extras either.
25:20 Just thinking something funny might be nice.
25:23 I think so.
25:24 And I know that you've done, you do a lot of C these days still, and I've traditionally done some, although not too much lately.
25:31 So I want to have both a joke and something to help people think about pointers and pointers to pointers.
25:36 Because Python is all about pointers, even though we don't realize it, right?
25:40 When you create a variable, it points out to a thing.
25:42 You've got a list.
25:43 It doesn't hold the value of the thing that's in the list.
25:46 It holds the pointers that point to the things that are the values.
25:49 So here's the joke.
25:50 There's an int just written out in memory, just out in space floating there.
25:55 And there's an int star to a pointer to the int.
25:58 It's like an anime character pointing out to it.
26:00 And then what is a pointer to a pointer?
26:02 Well, it's just the anime character pointing at the int star that points over to the other one.
26:07 What do you think of this?
26:08 I think it's just a great, I agree with the comment.
26:10 It's just a great way to describe pointers.
26:12 Actually, somebody pointing.
26:14 Yeah.
26:15 Yeah.
26:16 It seems completely non-scary.
26:18 Whereas thinking about int star star avoid star star, something like that is pretty crazy.
26:23 Well, it's got 18,000 likes on, I don't know what it's on.
26:27 What website is this, Brian?
26:29 The company formerly known as Twitter?
26:34 Yes.
26:35 And yet what is the title of the pages?
26:38 So and so on Twitter and the domain is twitter.com.
26:41 But the logo is X and I don't know what a mess this is.
26:45 But anyway, the joke is funny.
26:47 Well, the next, so the, and the icons, there's an X for closing, which is still confusing.
26:53 Yeah, there's two X's in my tab up there.
26:56 Yeah.
26:57 The left X and the right X.
26:58 Yeah.
26:59 We just, hopefully nobody renames their company greater than greater than and weird things like that.
27:07 Yeah, absolutely.
27:08 So, hey, I want, want to add one more funny thing.
27:11 This is not really programming related, but I've been watching a lot of like streaming, catching up on some TV shows.
27:20 I'm watching.
27:21 I can't remember the name of it now catching up and I want to skip through the beginning.
27:25 Have you ever done that on streaming shows?
27:27 You skip the intro.
27:28 Right.
27:29 So, I saw this the other day.
27:31 It just cracked me up.
27:32 Apparently, it's rude to poke someone in the head, the forehead and say, skip intro when they start talking to you.
27:39 I know people heard the first hour.
27:43 Yeah.
27:44 Like I, okay, can you skip the preamble and just go to the, whatever you wanted to talk to me about.
27:48 So.
27:49 Pretty funny.
27:51 I imagine it probably is a little, little rude, but you know, sometimes you're in a hurry.
27:56 Yeah.
27:57 You've heard it three times already.
27:58 So get to the end.
27:59 Awesome talking with you as usual.
28:01 Indeed.
28:02 Thanks for being here.
28:03 Thank you to everyone who is listening and everyone who participated in the live stream.
28:07 See you all next time.