Transcript #387: Heralding in a new era of database queries
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:05 This is episode 387, recorded June 12th.
00:09 And I'm Brian Hawken.
00:10 And I'm Michael Kennedy.
00:11 This episode is sponsored by Scout APM.
00:14 Listen to their segment later in the show.
00:16 Connect with your hosts, as always, through Fostadon, at Adam Kennedy, at Brian Hawken, and at Python Bytes.
00:24 We'd love to hear from you.
00:25 Send in those topics, too.
00:28 You can also, there's a contact list on pythonbytes.fm.
00:33 You can send things that way, too.
00:35 And if you'd like to join the show while we're recording, like some of the people right now,
00:40 you can join us on YouTube at pythonbytes.fm/live to be part of the audience.
00:47 It's usually Tuesdays at 10 a.m. Pacific time.
00:50 And you can also use that to find the link to catch older episodes as well.
00:56 And finally, before we get started, if you'd like to have all these topics and the links to everything we talk about sent directly to your inbox,
01:04 you can go to pythonbytes.fm and become one of our friends of the show and join that list.
01:12 And we'll send those emails to you every week.
01:14 Super useful.
01:15 A lot of people are signing up to them.
01:16 Brian, really quickly, before we jump into the topics, you mentioned Fostadon.
01:20 I got a comment on YouTube, I suppose, is the right place to, where it came from.
01:25 Somebody said, this guy, me, has gone completely crazy because he joined Mastodon.
01:31 Then he joined invite-only Mastodon because Fostadon went to invite-only.
01:36 I'm like, but you can join any, there's thousands of servers, join any one you want.
01:41 So you don't have to be on Fostadon directly to talk with us.
01:45 It's just the same, you know, most people I talk to are not on Fostadon.
01:48 If you want an invite to that private server or invite-only server, which I think that's just trying to limit the scope for the admins and the cost of it and stuff,
01:57 happy to send you on, but yeah, just any old Mastodon will do.
02:01 It doesn't have to be Fostadon in particular.
02:03 Nope, doesn't have to be.
02:04 Yeah.
02:05 It's not Slack, it's not Discord, it's something else.
02:07 It's the Fediverse.
02:08 But if you really want to get into Fostadon, go into the contact form on our site and send us an email and one of us will send you an invite.
02:16 Exactly.
02:17 Well, how should we start the show, Michael?
02:20 Let's herald in a new era of SQL interactions, shall we?
02:25 With the data herald.
02:26 So this comes just under the organization data herald.
02:30 And the idea is you have a SQL database like Postgres or Microsoft SQL Server or whatever, but you are not, either you don't have SQL skills or you don't want to bother your SQL skills.
02:42 This is kind of like for me with regular expressions, right?
02:45 Like I can do regular expressions, but I will take a lot of steps to not actually do regular expressions.
02:51 You know what I mean?
02:53 So this is like that for SQL.
02:55 It's a natural language to SQL engine built for enterprise level question and answering on top of relational data.
03:04 So maybe you've got a database with a bunch of analytics, a bunch of customers, whatever, contacts for like a CRM type thing.
03:13 And you want to let your somewhat technical people just talk to the thing instead of making them learn SQL or use some kind of BI tool.
03:22 So you just put this thing on top of you.
03:23 You're like, tell me all, you know, how much sales did we get from the Philippines last month?
03:29 Something like that.
03:30 Right.
03:30 Which you could write that as a SQL expression, but you don't have to.
03:35 Yeah.
03:35 So some of the features are you can allow business users to get insights into data warehouses without bothering the data analyst.
03:43 You can enable Q&A chat on top of production databases inside your SaaS application.
03:49 That one sounds a little risky, but, you know, maybe internally it's fine.
03:53 You got like a self-hosted one or something like that.
03:55 Or you could create a chat GPD plugin for your proprietary data even.
03:59 Pretty interesting stuff, right?
04:02 This is super cool.
04:04 Yeah.
04:04 Yeah.
04:05 Yeah.
04:05 I haven't tried it yet.
04:06 It's half Python, half JavaScript, 0.3% Docker.
04:10 But the 0.3% Docker comes from the fact that if you want to just run it locally, you can just Docker compose up basically.
04:18 So they actually have that all put together in a script, but you just Docker run off it goes.
04:23 Yeah.
04:24 So it's made up of a bunch of different things, an engine, some enterprise rules like permissions and stuff, an admin console.
04:30 And interestingly, one final thing to throw out here before we move on is a Slack bot.
04:35 So you can add the data herald for your database to your Slack channel and then talk to it as part of your Slack conversation.
04:42 What's the deal with this?
04:44 It's like, I don't know.
04:44 Let's just ask the data herald, you know, and go and send it a message.
04:48 And I think that's actually pretty interesting.
04:50 I think it's, yeah, it's funny.
04:53 It's interesting and kind of funny.
04:55 I kind of forgot that a lot of people are still using Slack.
04:57 Are you slacking off?
04:59 You're not paying attention anymore, right?
05:00 I'm slacking off.
05:01 Yes.
05:02 I still have a Slack.
05:05 No.
05:05 Yeah.
05:06 I have a Slack channel for the course and the book, but it doesn't give a lot of activity.
05:11 So.
05:11 Yeah.
05:13 I'm always torn about these things.
05:14 I want to set up something like that.
05:15 But Discord seems to have a little more traction for public places like that.
05:20 The Slack pricing has gotten really weird.
05:23 Yeah.
05:23 It's for free on open source stuff and big projects.
05:26 It's like, it's got a 90 day limit on it and it throws stuff away, which is a problem.
05:31 So.
05:32 Yeah, exactly.
05:32 I want to set up rocket.chat, which is pretty awesome.
05:36 It's like a self hosted or you can buy their hosting, but it's like open source, a lot nicer,
05:42 white label, et cetera, et cetera, et cetera.
05:45 The only thing is like, if you want to get people to come in and use it and they do,
05:49 do they want to have like another app open and remember to go to another place.
05:53 I think that's the challenge with Discord and Slack.
05:55 It's like, well, I already have that open.
05:56 So now I get notifications for that versus here's one more thing to run.
06:00 But yeah, this is something I'm thinking about.
06:03 It could be fun.
06:04 I switched the pytest course recently from Teachable to Podia and Podia has a community
06:12 aspect where you can ask questions and answers and stuff like that.
06:15 I haven't turned it on yet, but I'm planning on doing that soon just because it solves that
06:19 extra login problem.
06:20 They already have a login to get to the course.
06:22 Right, exactly.
06:23 And I can put it right in there.
06:25 So anyway.
06:26 Cool.
06:27 Maybe someday.
06:27 All right.
06:28 Well, Data Herald, check it out, people.
06:30 If you want to talk to your SQL.
06:32 Talk to your SQL.
06:33 Talk to your database.
06:34 All right.
06:35 If you'd like to talk to just random stuff in Python.
06:40 I don't know how to transition to this.
06:42 The topic I want to talk about is an article by Trey Hunter called Python's Mini Command Line
06:48 Utilities.
06:49 And I knew a lot of this stuff was around, but I always forget about it.
06:53 So I love it when people bring this up.
06:55 So the thing is, in Python, all the built-in stuff, there's standard library stuff.
07:02 And usually you get at it from your Python code by saying import something, like import data
07:07 classes or something like that.
07:09 But some of this stuff has activities built into the dunder main of it in the subproject.
07:17 So that if you write Python-m and then the built-in module, something happens.
07:24 And there's a bunch of them.
07:25 So this is what this article is about.
07:27 And the famous one that is Python-m anti-gravity, which pops open in the KCD comic, which is kind
07:39 of awesome that we have that in the language.
07:42 I never get tired of that one.
07:43 Yeah.
07:44 But it does the import this thing.
07:47 But so there's a whole bunch of cool tools that I was looking at.
07:53 There's general purpose tools that I didn't even know was there.
07:56 Calendar is one of them that is actually really handy.
07:59 So if you just type Python-m calendar, it prints out the current year's calendar, which
08:05 actually, I used to have a desk calendar.
08:08 I don't have a desk calendar anymore.
08:10 So having something like that pop up really easily, really helpful.
08:13 And you can also give it a specific date.
08:17 So if you're like, well, what's my anniversary going to fall on in a couple years?
08:20 You can look that up.
08:22 So really handy to have that around.
08:25 There's the HTTP server, which is built in, which is fun.
08:30 JSON tool is pretty awesome, actually.
08:31 JSON tool lets you nicely format some JSON data.
08:35 Some great stuff there, general purpose.
08:39 There's categories that Trey has put these into.
08:43 And I love the especially handy on a Windows machine category.
08:47 These are Unix-y utilities that I often miss when I'm on a random Windows setup.
08:55 And I never really remember how to get them safely.
08:58 And so having them built into Python, I didn't even know these were here.
09:01 Like gzip and tar.
09:04 I didn't know that I could use gzip and tar easily on Windows with just Python, built in Python.
09:10 How cool is that?
09:12 There's a FTP lib has a built-in FTP utility.
09:15 You can, it's kind of a quick FTP client.
09:18 Nice.
09:19 I don't really need Telnet very much.
09:22 But some of these are pretty nice.
09:24 IMAP lib.
09:25 I didn't know that you could curl to read email through Python.
09:27 Cool.
09:28 Going down, analyzing.
09:31 These are analyzing Python code.
09:34 Huh.
09:35 Tokenize looks fun.
09:36 AST, actually, I did know that.
09:39 Using AST to get an abstract syntax tree for some code from the command line.
09:44 A couple of the ones, what did I want to highlight?
09:48 There's working with code.
09:50 I don't know.
09:52 There's just a whole bunch of fun stuff in here.
09:55 You can get Hello World as a command line argument, or the command line tool.
10:00 It prints Hello World.
10:02 That's funny.
10:03 Sure, why not?
10:05 Python-M this.
10:07 We'll do the Zen of Python.
10:08 But an internal demo.
10:10 Yeah.
10:11 Anyway, fun to check out.
10:14 And these are pretty good stuff.
10:17 Good stuff here.
10:17 Yeah, there's a lot more there than I imagine most people know.
10:21 That's pretty awesome.
10:22 Pretty awesome.
10:23 And there's even a little demo of using cprofile and pstats for getting some profiling of your code.
10:30 Very cool.
10:31 All right.
10:33 What else is cool?
10:35 I would say our sponsor.
10:36 Let me tell you real quick about Scout APM.
10:40 They're big supporters of Python Bytes, so we appreciate that very much.
10:45 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.
10:54 They're a leading Python application.
10:55 They're a leading Python application performance monitoring tool.
11:01 It's an important tool.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:02 It's an easy way to find the root cause of the Python application.
11:03 It's an easy way to find the root cause of the Python application.
11:04 It's an easy way to find the root cause of the Python application.
11:05 It's an easy way to find the root cause of the Python application.
11:06 It's an easy way to find the root cause of the Python application.
11:07 queries, background jobs, and the dreaded N plus one queries that you can end up if you do lazy
11:12 loading in your ORM. And then you say, oh no, why is it so slow? Why are you doing 200 database queries
11:18 for what should be one? So you can find out things like that. And it links it back directly to source
11:22 code so you can spend less time in the debugger and healing logs and just finding the problems and
11:28 moving on. And you'll love it because it's built for developers by developers. It makes it easy to
11:32 get set up. Seriously, you can do it in less than four minutes. So that's awesome. And the best part
11:37 is the pricing is straightforward. You only pay for the data that you use with no hidden overage fees
11:44 or per seat pricing. And I just learned this, Brian. They also have, they provide the pro version for free
11:51 to all open source projects. So if you're an open source maintainer and you want to have Scout APM for
11:57 that project, just shoot them a message or something on their pricing page about that. So you can start
12:01 your free trial and get instant insights today. Visit pythonbytes.fm/scout. The link is in
12:08 your podcast player show notes as well. And please use that link. Don't just search for them because
12:12 otherwise they don't think you came from us. And then they'd stop supporting the show. So please
12:16 use our link pythonbytes.fm/scout. Check them out. It really supports the show.
12:21 Definitely. Definitely. Thank you, Scout.
12:24 Okay. How about we talk about Wolfie?
12:27 Oh, neat.
12:28 Do you know Wolfie?
12:30 No, but I like the name.
12:31 The name is good. So Wolfie, this comes to us from Patrick Smith. And this is a project from
12:39 Chain Guard, which is a company that makes specialized Docker images. So the idea is,
12:48 it's based on this idea of distro-less images. Have you heard of distro-less images? I never had.
12:55 I'm like, what is this? So normally a Docker image, it shares the Linux runtime kernel,
13:02 but then you layer on whatever else you want to add. So, you know, you get the Ubuntu image,
13:08 it comes with apt and bash and all those kinds of things. Systemd, which you're very unlikely to be
13:15 using in Docker and so on. So those are helpful to have if you might want to run across them,
13:21 but they're also, they have a couple of problems. One is they just make the images larger. So you might have a gigabyte image instead of 50 megabyte image,
13:29 if you're going to push it to Docker Hub or something like that, or other people are going to download it. And you'd rather have that smaller, right?
13:34 Yeah.
13:34 And the other one is those things all open up security vulnerabilities and bugs and other issues, right? If there's a bug in something that you weren't using, but it's there, you know, possibly somebody could use that to level up and hack your system, right? That would be less than good.
13:53 So these often, these distro-less images often, or containers often come with, without even a package manager like apt or a shell at all, which makes them very small and very constrained in what people can do with them, right?
14:08 So you can't like open up a shell and do something if literally the shell doesn't exist. However, debugging them is a challenge because, you know, one thing you can do with a running container that is misbehaving,
14:20 as you can say, Docker exec container name, bash or sh, and then get in there and sort of do exploratory stuff, right? So that is a drawback, but they are way more secure, which is pretty cool.
14:33 So this Wolfie thing, they make specialized distro-less containers, now that we know what those are, and they're just super stripped down, but so much so that in general, the distro-less images are so stripped down that you can't run Python, right?
14:49 For example, or other things. So these come with, where is it down here somewhere? Anyway, it comes with, it's basically distro-less images that are built specifically with just enough to run Python.
15:05 So that you can go in and get it working just right. And then once you're sure it's good, you just push it out to production and, you know, count on your logging, I guess. What do you think? Interesting?
15:27 Yeah, I think so.
15:28 Yeah, much smaller, much more secure because it can't do anything.
15:36 And I found the answer, my thought was, why Wolfie? And it's inspired by the world's smallest octopus.
15:42 Yes, of course. The wolf octopus, no, Wolfie. It's very cool. Octopuses are cool as well.
15:50 And, you know, more and more projects and even projects within companies are caring about software build materials or S-BOMs.
16:00 And so minimizing the things that go in your distribution and helps to make that smaller, your S-BOMs smaller.
16:08 So having that be part of Wolfie, including high quality build time S-BOMs is a good addition there. That's cool.
16:17 Yeah, it's cool you caught on to that. That's another nice thing is they specifically call out all the software build materials and having so much less, well, it makes it easier to do so, I suppose.
16:28 Yeah, yeah, definitely.
16:30 Neat.
16:30 Yeah, indeed.
16:33 I ran across recently some, I really like caching. So things like the idea of a memoization or caching of a function.
16:48 So it's where if you run a function once, it does it, does the work. But if you run it again with the same input, it just remembers the answer.
16:58 But there's different ways to do that. And I'm going to highlight a few that I thought were interesting.
17:03 Funktools cache, of course, and I really like that Funktools cache has the cache shortcut because you can just say at cache for a function.
17:15 And for a lot of stuff that doesn't have a lot of different input, it works great.
17:19 So I've got some projects where it'll be a lot of work, but I call it several times and I could cache that externally, but just throwing cache over the top makes it work great.
17:31 So for a lot of cases, just the built-in Funktools cache works awesome.
17:36 If you need more detail, cache is actually just a shortcut into LRU cache with the defaults filled in.
17:45 But you can set the max size or set type also with LRU cache.
17:50 However, you might need more control. And that's where some of these other things come in.
17:56 So there's an extension or a third-party library called CacheTools.
18:00 And CacheTools has just more, you've got more control over it.
18:06 You've got, you can use an LRU cache or a TTL cache.
18:10 TTL caches are interesting because they have time to live built into it.
18:15 So the cache can disappear after minutes or seconds or whatever makes sense for your application to remember things for a while, but then let them go.
18:23 That's super handy.
18:25 Yeah, really handy.
18:26 Not just because it alleviates the cache management from it being too much, but one of the big problems in computer science is cache invalidation, right?
18:36 Like, if it's doing something, I'd say like calling an API, which is the example right on this page, is you don't want to just hit that.
18:44 For example, there's a weather API at a location.
18:47 Like, given the location, the weather doesn't change that fast.
18:50 So let's only refresh every 10 minutes.
18:52 You put that on there and boom, and it's completely managed it, right?
18:55 Yeah.
18:56 And I like the example of weather because we know weather doesn't, the weather forecast isn't going to change that much in the next, you know, I don't know what the 600 is.
19:04 I think it's seconds, 10 minutes.
19:05 Okay.
19:06 So yeah, it's not going to change in 10, you know, refresh it every 10 minutes.
19:09 But for various other APIs, you might know about the API, how often it's updated.
19:16 And if it's only updated once an hour, you don't need to hit it every time your code hits it.
19:23 You can cache that.
19:24 That's pretty neat for TTL.
19:25 I love that.
19:26 So building on top of this is another tool called CacheBox.
19:30 So the other one, first one we talked about was CacheTools.
19:33 Now CacheBox is a similar kind of thing.
19:36 We've got lots of APIs that we can use for it, like LRU Cache and TTL Cache.
19:44 It's a similar API as this other one.
19:47 But there's also like an LFU Cache, least frequently used.
19:53 Least frequently used, I bet.
19:54 And so some other things, but one of the fun things about this is it's written in Rust.
20:01 So for a couple of reasons.
20:04 It's to speed it up a little bit.
20:06 And I mean, but there's also, you could probably do larger objects in there because it's a low memory usage.
20:13 It says it's a third of the size of a dictionary.
20:17 So you're going to use less memory than you would storing it as Python objects.
20:23 So that's pretty cool, especially if you're caching like the output of an API that's a big JSON blob or something.
20:31 So really cool projects if you're trying to speed things up or save memory with the caching.
20:38 So nice.
20:40 Yeah, that's very cool.
20:41 I did not know about it.
20:43 I'm excited.
20:44 Yeah, that's very neat.
20:45 Cachebox just showed up a few days ago that I was aware of.
20:49 I thought, oh, this is interesting.
20:51 And yeah, it looks like it's only a couple weeks old.
20:53 Two weeks old for the repo.
20:54 Yeah.
20:55 Very new.
20:55 Excellent.
20:56 I will definitely give that a look.
20:57 All right.
20:59 Any extras?
21:01 I have had one extra, but then our conversation made me have two extras.
21:07 So I'll just throw it out there.
21:08 I'll just throw into the show notes, the rocket.chat.
21:12 So people have that.
21:13 We already talked about that.
21:13 So Brian, I've been for many, many years a fan of bartender, not the drinking, but the Mac app.
21:20 Yeah.
21:21 You know, in Mac, you have this bar across the top.
21:24 It's sort of equivalent to the task notification area on Windows.
21:29 For some reason, putting stuff up there on Mac is super popular.
21:33 I just counted.
21:34 I have 28 icons in that thing, and it's ridiculous.
21:37 Yeah.
21:39 Being able to control that, it's not a little nice.
21:42 Yeah.
21:42 It's super nice, especially if you're doing presentations like at a conference or for courses or live streams.
21:48 You can just hide more stuff away, and you don't have to have it there, you know, showing weird notifications and stuff.
21:55 But it turns out, like, this bartender app is pretty cool.
21:58 There's some uncertainty about its current status, though.
22:04 So bartender was recently sold to another company, but no one announced that it was sold.
22:10 And they were trying to kind of like, there's nothing to see here until app monitoring service said, you know, that this is, this is looking a little suspicious.
22:19 It's just like, maybe people are buying this to do more deeper tracking.
22:24 Maybe they were doing this to do more.
22:25 Not illegally, but just sort of digging deeper into seeing what you're doing.
22:31 This is bad because it has full screen recording access, access to hotkeys, all sorts.
22:36 So it's got a lot of permissions, this app.
22:39 Yeah.
22:39 So on Mac rumors, let's see.
22:43 What's the CEO?
22:44 So the original article was PSA bartender Mac app under new ownership, but lack of transparency raises concerns.
22:50 Like the guy who sold it didn't even, wasn't willing to acknowledge it until months later.
22:56 And the company that bought it still doesn't, won't talk about it.
22:59 So it's like, a little sus.
23:01 Anyway.
23:02 So I want to link to a thing on Mac rumors.
23:04 Sorry, windows people.
23:06 I know this is not that interesting, but for you, but six bartender alternatives to manage your Mac's menu bar.
23:12 And a lot of them are open source.
23:15 So for example, I'm using ice, which is available on GitHub with like 8,000 stars, you know, pretty nice.
23:24 And guess what?
23:24 It works almost exactly the same.
23:27 It's free.
23:28 It's open source.
23:29 You know, why didn't I just use this earlier?
23:31 There's a few features coming that it doesn't quite have, but for the most part, I think it's really good already.
23:36 That's pretty cool.
23:37 I should check that out.
23:38 Yeah.
23:38 So I've, I've banished bartender just out of a abundance of caution sort of thing.
23:43 All right.
23:43 That's it for my extras.
23:44 How about you?
23:45 just a couple.
23:47 Let's see.
23:47 I just wanted to let people know, the Python 3.12.4 is out.
23:53 So, decent.
23:55 I haven't checked to see what is new in dot four, probably book fixes.
23:59 So don't know.
24:01 but, it's there.
24:02 and then, another, another recent release is, I don't usually keep up on these
24:08 two tightly, but VS Code, the June is Python for Visual Studio Code.
24:14 and then, the June release, includes, a pytest improvement.
24:19 So, there is, there's an ongoing, it's been going on for a while.
24:23 They're, they're rewriting some of the Python testing, functionality.
24:28 And there's a link in this, in the release note to, to how to, how to change that so that
24:33 you can see it.
24:34 But if you're using the updated, testing rewrite, there's some changes that should,
24:39 should help, just help, help things work a little better.
24:43 So, very cool.
24:45 nice, nice additions.
24:47 That's all my extras.
24:48 Yeah.
24:49 I, want to say that when I saw you put into the show notes about an hour ago, or when I
24:54 saw that they were in the show notes, oh, that three, three 12.4 is out.
24:58 I just quick updated a number in the Docker setup.
25:02 Boom.
25:02 All the apps are upgraded to three, four, 13.4, which is, three, 13.4, which are 12.4,
25:08 which is pretty awesome.
25:10 No way that all works, right?
25:11 All right.
25:12 how about a joke?
25:13 That sounds great.
25:14 So before I show this, you know, in CSS, we've got different, different settings.
25:20 You've got visibility, importance, opacity.
25:24 What if you made a series of superheroes or villains or cartoons out of CSS?
25:29 Well, that's the joke.
25:31 So I'll link to this and we won't go through all of them.
25:33 You guys can check it out, but it's called CSS cartoons by Alvaro Montoro.
25:39 And we've got the cloud developer and the cloud developer.
25:43 this is a CSS class dot cloud developer.
25:46 Background is Azure.
25:47 The color isolation is isolate.
25:50 Rest is none.
25:51 Stress is a 100 and content is none.
25:54 They have like cool little pictures of, of like graphics of each.
25:57 So check them out.
25:58 We have a King.
25:59 The position is absolute.
26:01 The richness is 100.
26:02 The color is Royal blue.
26:04 And it says, you got to know your CSS.
26:07 It says ampersand greater than colon first child.
26:10 So stuff can, you know, the first child of all the things contained directly within it.
26:14 All, all colon inherit.
26:17 Isn't that awesome?
26:17 let's see.
26:21 That's great.
26:22 We've got phantom of the opera, Brian.
26:23 This is a, there can only be one of these.
26:25 So it's not a class.
26:26 It's a, ID.
26:28 So hash phantom of the opera mask URL hash face.
26:32 Backface visibility, hidden visibility, hidden pitch is low.
26:38 Volume is soft.
26:39 Phantom of the opera.
26:42 All right.
26:42 We have a winner.
26:43 Order is one running first color gold.
26:46 And then after, you know, colon colon after content is, the, like the first place trophy.
26:53 We have a dictator.
26:55 See the dictator down here in the bottom, Brian.
26:57 See how he looks.
26:58 He's so forbidding.
26:58 a dictator is a class because there can be more than one.
27:02 Of course, position fixed exclamation mark.
27:04 Important.
27:05 Cannot be overridden.
27:06 Will change.
27:07 Order.
27:08 Important.
27:08 Opacity.
27:09 Zero.
27:10 Important.
27:10 Everything's important because of the dictator.
27:13 You can't overwrite it or change it.
27:15 Border.
27:15 Double solid.
27:17 And then dot country has.
27:19 Not dot supporter.
27:20 Will change.
27:22 Orphans.
27:22 Widows.
27:23 Important.
27:23 And translate.
27:25 100 V max to zero.
27:27 Anyway, it just goes on and on.
27:29 Like the scroll bar goes forever.
27:30 We've got a basketball player.
27:31 I encourage people to check this out.
27:33 It's pretty awesome.
27:34 That's pretty good.
27:35 Yeah.
27:35 Yeah.
27:36 CSS jokes or cartoons.
27:38 Very good.
27:39 All right.
27:41 Another awesome episode.
27:43 Thank you, Michael, for meeting me today to talk about Python.
27:47 As always, thank you everyone for listening.
27:50 See you later.