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 and I'm Brian Okken.
00:10 And I'm Michael Kennedy.
00:11 This episode is sponsored by Scout APM. Listen to their segment later in the show.
00:16 Connect with your hosts as always through Fosted On at Adam Kennedy, at Brian Okken,
00:22 and at Python Bytes. We love to hear from you. Send in those topics too.
00:28 You can also, there's a contact list on pythonbytes.fm. You can send things that way too.
00:34 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 10am 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
01:01 to everything we talk about sent directly to your inbox, you can go to pythonbytes.fm and
01:07 become one of our friends of the show and join that list. And we'll send those emails to you every week.
01:14 Super useful. A lot of people are signing up to them.
01:16 Brian, really quickly before we jump into the topics, you mentioned Fosted On.
01:20 I got a comment on YouTube, I suppose is the right place to, where it came from.
01:26 And somebody said, "This guy, me, has gone completely crazy because he joined Mastodon.
01:31 Then he joined invite-only Mastodon because Fosted On went to invite-only."
01:36 I'm like, but you can join any...
01:39 It's just any Mastodon.
01:39 There's thousands of servers. Join any one to any one. So you don't have to be on Fosted On
01:44 directly to talk with us. It's just the same. Most people we talk to are not on Fosted On.
01:49 If you want an invite to that private server or invite-only server, which I think that's just
01:54 to limit the scope for the admins and the cost of it and stuff, happy to send you one.
01:58 But yeah, just any old Mastodon will do. It doesn't have to be Fosted On in particular.
02:03 Nope, doesn't have to be.
02:05 It's not Slack. It's not Discord. And something else. It's a Fediverse.
02:09 But if you really want to get into Fosted On, go into the contact form on our site and send us an
02:14 email and one of us will send you an invite.
02:16 Exactly.
02:18 Well, how should we start the show, Michael?
02:21 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. And the idea is you have a SQL database
02:33 like Postgres or Microsoft SQL Server or whatever, but you are not...
02:37 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
02:50 do regular expressions. You know what I mean?
02:52 So this is like that for SQL. It's a natural language to SQL engine built for enterprise
03:00 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,
03:09 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
03:20 learn SQL or use some kind of BI tool.
03:22 You just put this thing on top of you like, tell me all, you know, how much sales did we get from
03:27 the Philippines last month? Something like that, right?
03:30 Which you could write that as a SQL expression, but you don't have to.
03:34 Yeah, so some of the features are you can allow business users to get insights into data warehouses
03:41 without bothering the data analysts.
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 ChatGPT plugin for your proprietary data even.
03:59 Pretty interesting stuff, right?
04:02 This is super cool. Yeah.
04:04 Yeah. Yeah. I haven't tried it yet. 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,
04:14 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:29 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
04:41 of your Slack conversation. What's the deal with this?
04:43 Like, I don't know, 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. It's interesting and kind of funny.
04:54 I kind of forgot that a lot of people are still using Slack.
04:57 Are you slacking off? You're not paying attention anymore, right?
05:00 I'm slacking off. Yes. I still have a Slack. No, yeah.
05:05 I have a Slack channel for the course and the book, but it doesn't get a lot of activity.
05:11 So yeah, I'm always torn about these things. I want to set up something like that,
05:16 but Discord seems to have a little more traction for public places like that.
05:20 The Slack pricing has gotten really weird.
05:22 Yeah, for free on open source stuff and big projects, it's like it's got a 90 day limit on it
05:29 on and then throw stuff away, which is a problem.
05:31 So yeah, exactly. I want to set up rocket.chat, which is pretty awesome.
05:35 It's like self hosted or you can buy their hosting, but it's like open source,
05:41 a lot nicer, white label, et cetera, et cetera, et cetera.
05:44 The only thing is like, if you want to get people to come in and use it and they 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 That'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 setting up. It could be fun.
06:04 I switched the pytest course recently from Teachable to Podia.
06:09 And Podia has a community aspect where you can ask questions and answers and stuff like that.
06:14 I haven't turned it on yet, but I'm planning on doing that soon just because it solves that 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. So anyway.
06:26 Cool.
06:27 Maybe someday.
06:28 It's all right. Well, Data Herald, check it out, people.
06:30 If you want to talk to your SQL.
06:32 Talk to your SQL, talk to your database.
06:34 All right.
06:35 If you'd like to talk to just random stuff in Python.
06:39 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 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, is so if you in Python, all the built in stuff, there's standard library stuff, and usually you get at it from your Python code
07:04 by saying import something like import data classes or something like that.
07:08 But some of the stuff has activities built into the dunder main of it in the sub project.
07:18 So that if you write Python dash M and then the module 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 a Python dash M anti gravity, which pops up in an exit KCD
07:37 comic, which is kind of awesome that we have that in the language.
07:40 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:57 Calendar is one of them that is actually really handy.
07:59 So if you just type Python dash M calendar, it prints out the current year's calendar,
08:04 which actually there's a 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 you can also give it a specific date.
08:16 So if you're like, well, what's my anniversary going to fall on in a couple years?
08:21 You can you can look that up.
08:22 So really handy to have that around.
08:25 There's the web HTTP server, which is built in, which is fun.
08:30 Jason tool is pretty awesome.
08:31 Actually, Jason tool lets you nicely format some Jason data.
08:35 Some great stuff there.
08:37 General purpose.
08:38 The there's a cat, these categories that trace put these into.
08:43 And I love the especially handy on a Windows machine category.
08:47 These are Unixy utilities that I often miss when I'm on a random Windows setup and and I never really remember how to get them safely.
08:58 And so having a built into Python, I didn't even know these were here like Gzip and and tar.
09:04 I didn't know that I could use Gzip and tar easily on Windows with just Python and Python.
09:10 How cool is that?
09:11 There's a FTP lib has a built in FTP utility.
09:15 You can it's kind of a quick FTP client.
09:17 Nice.
09:18 I don't really need telnet very much.
09:22 But but some of these pretty nice.
09:24 I map lib.
09:24 I didn't know that you could curl to read email through Python.
09:27 Cool.
09:28 Going down, analyzing.
09:32 These are analyzing Python code.
09:34 Huh.
09:34 Tokenize looks fun.
09:35 AST.
09:36 Actually, I did know that using using AST to get an abstract syntax tree for some code
09:43 from the command line.
09:44 The a couple of the ones that I wanted to highlight is working with code.
09:51 I don't know.
09:52 There's there's just just a whole bunch of fun stuff in here.
09:55 that is a 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.
10:04 Why not?
10:05 Python dash m this will do the Zen and Python, 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 So, yeah, there's a lot more there than.
10:20 I imagine most people know that's pretty awesome.
10:22 Pretty awesome.
10:23 And there's even a little demo of, using C profile and P stats for, for getting
10:29 some profiling of your code.
10:30 So very cool.
10:31 All right.
10:32 What else?
10:34 I would say our sponsor.
10:36 Let me tell you real quick about Scout APM.
10:40 They're big supporters of Python bites.
10:42 So we appreciate that very much.
10:44 So if you are tired of spending hours trying to find the root cause of issues impacting
10:50 your performance, then you owe it to yourself to check out Scout APM.
10:54 They're a leading Python application performance monitoring tool, APM, that helps you identify
11:00 and solve performance abnormalities faster and easier.
11:03 Scout APM ties bottlenecks such as memory leaks, slow database queries, background jobs,
11:08 and the dreaded N plus one queries that you can end up if you do lazy loading in your
11:13 ORM, and then you say, Oh no, why is it so slow?
11:16 Why are you doing 200 database queries for what should be one?
11:19 So you can find out things like that.
11:20 And it links it back directly to source code.
11:22 So you can spend less time in the debugger and tailing logs and just finding the problems
11:27 and moving on.
11:28 And you'll love it because it's built for developers by developers.
11:31 It makes it easy to get set up.
11:33 Seriously, you can do it in less than four minutes.
11:35 So that's awesome.
11:36 And the best part is the pricing is straightforward.
11:40 You only pay for the data that you use with no hidden overage fees or per seat pricing.
11:45 And I just learned this, Brian.
11:47 They also have, they provide the pro version for free to all open source projects.
11:53 So if you're an open source maintainer and you want to have Scout APM for that project,
11:57 just shoot them a message or something on their pricing page about that.
12:00 So you can start your free trial and get instant insights today.
12:04 Visit pythonbytes.fm/scout.
12:07 The link is in your podcast player show notes as well.
12:09 And please use that link.
12:10 Don't just search for them because otherwise they don't think you came from us.
12:14 And then they'd stop supporting the show.
12:16 So please use our link pythonbytes.fm/scout.
12:19 Check them out.
12:19 It really supports the show.
12:22 Definitely. Definitely.
12:23 Thank you, Scout.
12:24 Okay. How about we talk about Wolfie?
12:27 Oh, neat.
12:28 Do you know Wolfie?
12:29 No, but I like the name.
12:31 The name is good.
12:32 So Wolfie, this comes to us from Patrick Smith.
12:35 And this is a project from ChainGuard, which is a company that makes specialized Docker images.
12:46 So the idea is, it's based on this idea of distro-less images.
12:52 Have you heard of distro-less images?
12:54 I never had.
12:55 I'm like, what is this?
12:57 So normally a Docker image, it shares the Linux runtime kernel, but then you layer on whatever else you want to add.
13:06 So, you know, you get the Ubuntu image.
13:08 It comes with apt and bash and all those kinds of things.
13:12 Systemd, which you're very unlikely to be using in Docker and so on.
13:16 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.
13:23 One is they just make the images larger.
13:25 So you might have a gigabyte image instead of 50 megabyte image if you're going to push it to Docker Hub or something like that,
13:31 or other people are going to download it.
13:32 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?
13:41 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?
13:51 That would be less than good.
13:53 So these often, these distro-less images often, or containers often come with,
13:58 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.
14:13 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?
14:28 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,
14:42 but so much so that in general, the distro-less images are so stripped down that you can't run Python, right?
14:48 For example, or other things.
14:51 So these come with, where is it down here?
14:56 Somewhere.
14:56 Anyway, it comes with, it's basically distro-less images that are built specifically with just enough to run Python.
15:05 And in the show notes, I've got a couple of examples of using really restricted versions of these images, as well as some developer ones.
15:15 And the developer ones have pip and bash and APK and so on, so that you can go in and get it working just right.
15:22 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.
15:27 What do you think? Interesting?
15:29 Yeah, I think so.
15:30 Yeah, much smaller, much more secure, because it can't do anything.
15:36 And I found the answer, my thought was, why Wolfie?
15:40 And it's inspired by the world's smallest octopus.
15:42 Yes, of course.
15:44 The wolf octopus, no, Wolfie.
15:47 It's very cool.
15:48 Octopuses are cool as well.
15:50 And, you know, more and more projects and even projects within companies
15:54 are caring about software build materials or SBOMs.
16:00 And so minimizing the things that go in your distribution and helps to make that smaller, your SBOM smaller.
16:08 So having that be part of Wolfie, including high quality build time SBOMs
16:15 is a good addition there.
16:16 That's cool.
16:17 Yeah, it's cool you caught on to that.
16:19 That's another nice thing is they specifically call out all the software build materials and having so much less,
16:26 well, it makes it easier to do so, I suppose.
16:28 Yeah, yeah, definitely.
16:30 Neat.
16:30 Indeed.
16:32 I ran across recently some, I really like caching.
16:39 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.
16:52 Does the work.
16:53 But if you run it again with the same input, it just memorize.
16:57 It remembers the answer.
16:58 But there's different ways to do that.
16:59 And I'm going to highlight a few that I thought were interesting.
17:02 Functools cache, of course, and I really like that Functools cache has the cache shortcut because you can just say at cache for a function in it.
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
17:26 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 Functools cache works awesome.
17:36 If you need more detail, cache is actually just a shortcut into LRU cache with default,
17:43 the defaults filled in.
17:45 But if you can set the max size or set type to also with LRU cache.
17:50 However, you might need more control.
17:53 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 like just more, you 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:14 So the cache can disappear after minutes or seconds or whatever makes sense for your application
18:20 to remember things for a while, but then let them go.
18:23 - That's super handy.
18:24 - Yeah, really handy.
18:25 - Not just because it alleviates the cache management from it being too much,
18:31 but one of the big problems in computer science is cache invalidation, right?
18:36 - Yeah.
18:37 - Like if it's doing something, I'd say like calling an API, which is the example right on this page
18:42 is you don't want to just hit that every, you know, for example, there's a weather API at a location, like given the location,
18:48 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, and I like the example of weather because we know weather doesn't,
18:59 the weather forecast isn't going to change that much in the next, you know, I don't know what the 600 is, but...
19:04 - I think it's seconds, 10 minutes.
19:05 - Okay, so yeah, it's not going to change in 10, you know, refresh 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:22 You can cache that.
19:23 That's pretty neat for TTL, 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, for like LRU cache and TTL cache.
19:44 It's a similar API as this other one, but there's also like an LFU cache,
19:50 least LF, what's LFU?
19:51 Least Frequently Used?
19:52 - Least Frequently Used, I'll bet.
19:54 - Yeah.
19:54 And so some other things, but the fun, one of the fun things about this is it's written in Rust.
20:02 So for a couple of reasons, to speed it up a little bit.
20:06 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 gonna use less memory than you would storing it as Python objects.
20:22 So that's pretty cool, especially if you were caching like the output of an API that's a big
20:29 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:39 So, thanks.
20:40 - Yeah, that's very cool.
20:42 I did not know about it.
20:43 I'm excited.
20:44 Yeah, that's very neat.
20:44 - CacheBox just showed up a few days ago that I was aware of.
20:49 I thought, oh, this is interesting.
20:50 And yeah, it looks like it's only a couple of weeks old.
20:53 - Two weeks old for the repo, yeah.
20:55 Very new.
20:55 Excellent.
20:56 I will definitely give that a look.
20:57 - All right.
20:58 Any extras?
21:00 - 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 so people have that.
21:12 We already talked about that.
21:13 So, Brian, I've been for many, many years a fan of Bartender.
21:18 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 And for some reason, putting stuff up there on Mac is super popular.
21:33 I just counted, I have 28 icons in that thing.
21:36 And it's ridiculous.
21:37 - Yeah, being able to control that, it's not a little nice.
21:42 - It's super nice, especially if you're doing presentations, like at a conference,
21:46 or for courses, or live streams.
21:48 You can just hide more stuff away.
21:50 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, this is looking a little suspicious.
22:19 Like, maybe people are buying this to do more deeper tracking." And 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:38 So, on Mac Rumors, let's see, where's the, yeah.
22:44 So, the original article was, "PSA, Bartender Mac app under new ownership,
22:48 but lack of transparency raises concerns." 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, which, like, a little sus.
23:01 Anyway, so I want to link to a thing on Mac Rumors.
23:04 Sorry, Windows people, I know this is not that interesting.
23:07 But for you, six Bartender alternatives to manage your Mac's mini bar.
23:13 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.
23:22 You know, pretty nice.
23:24 And guess what?
23:24 It works almost exactly the same.
23:27 It's free, it's open source.
23:29 Yeah, 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,
23:35 I think it's really good already.
23:36 That's pretty cool.
23:37 I should check that out.
23:38 Yeah, so I've banished Bartender just out of abundance of caution sort of thing.
23:43 All right, that's it for my extras.
23:44 How about you?
23:45 Just a couple.
23:46 Let's see.
23:47 I just wanted to let people know the Python 3.12.4 is out.
23:53 So, I haven't checked to see what is new in .4.
23:58 Probably bug fixes.
23:59 So, I don't know.
24:00 But it's there.
24:02 And then another recent release is, I don't usually keep up on these two tightly,
24:09 but VS Code, the June, Python for Visual Studio Code.
24:14 The June release includes a pytest improvement.
24:19 So, there is an ongoing, it's been going on for a while.
24:22 They're rewriting some of the Python testing functionality.
24:28 And there's a link in the release note to how to change that so that you can see it.
24:33 But if you're using the updated testing rewrite, there's some changes that should help.
24:40 Just help things work a little better.
24:43 So, very cool.
24:45 Nice additions.
24:47 That's all my extras.
24:48 Yeah, I want to say that when I saw you put into the show notes about an hour ago,
24:54 when I saw that they were in the show notes, oh, the 3.12.4 is out.
24:58 I just quick updated a number in the Docker setup.
25:02 Boom, all the apps are upgraded to 3.13.4, which is pretty awesome.
25:10 Now that all works, right?
25:11 All right, how about a joke?
25:13 That sounds great.
25:14 So, before I show this, you know in CSS, we've got 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:30 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.
25:35 But it's called CSS Cartoons by Alvaro Montoro.
25:39 And we've got the cloud developer.
25:41 And the cloud developer, this is a CSS class dot cloud developer.
25:46 Background is Azure, the color.
25:48 Isolation is isolate.
25:50 Rest is none.
25:51 Stress is a 100 and content is none.
25:54 They've like cool little pictures of like graphics of each.
25:57 So, check them out.
25:58 We have a king.
26:00 The position is absolute.
26:01 The richness is 100.
26:03 The color is royal blue.
26:05 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:15 All colon inherit.
26:17 Isn't that awesome?
26:17 Let's see.
26:21 We've got Phantom of the Opera, Brian.
26:24 This is, 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.
26:30 Mask URL.
26:31 Hash face.
26:32 Back face visibility hidden.
26:36 Visibility hidden.
26:37 Pitch is low.
26:38 Volume is soft.
26:39 Phantom of the Opera.
26:41 All right.
26:42 We have a winner.
26:44 Order is one.
26:44 Running first.
26:46 Color gold.
26:47 And then after, you know, colon colon after content is the, like the first place trophy.
26:54 We have a dictator.
26:55 See the dictator down here in the bottom, Brian?
26:57 See how he looks?
26:57 He's so forbidding.
26:59 A dictator is a class because there can be more than one, of course.
27:02 Position fixed!
27:03 Exclamation mark important.
27:05 Cannot be overridden.
27:06 Will change.
27:07 Order important.
27:09 Opacity zero important.
27:10 Everything's important because of the dictator.
27:13 You can't override it or change it.
27:15 Border double solid.
27:17 And then .country has not .supporter.
27:20 Will change orphans, widows important.
27:23 And translate 100 vmax to zero.
27:27 Anyway, it just goes on and on.
27:29 Like the scroll bar goes forever.
27:30 We 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:40 Another awesome episode.
27:43 Thank you, Michael, for this meeting me today to talk about Python.
27:48 As always, thank you everyone for listening.
27:50 See you later.