Transcript #292: Thursday, it's always a Thursday
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 292, recorded July 7th, 2022.
00:09 I'm Michael Kennedy.
00:10 And I am Brian Okken.
00:12 Yeah. Great to have you here, Brian.
00:13 This episode is brought to you by us.
00:15 Check out Brian's book.
00:17 And if you want a course, check out Talk Python Training.
00:19 Actually, a few more topics on that at the very end.
00:22 Some cool stuff going on there I want to tell people about.
00:24 Right now, I would like to hear about your first item.
00:27 Something rich, if you will.
00:30 Yeah.
00:30 So it wouldn't be our Python Bytes podcast if we didn't talk about Will, Will McCoogan and his Rich project.
00:41 But anyway.
00:42 Something built from Rich almost always, yes.
00:46 Yeah.
00:46 So Will tweeted out, fantastic today.
00:49 Fantastic project from Phil Ewells, maybe.
00:54 It generates screenshots of commands on the fly from Markdown files to keep them up to date.
01:00 And this is great.
01:03 So let's say you want to do an output from a terminal output from your command or something in your readme.
01:10 It looks great if it's like, here's a kitty cat.
01:15 I mean, you're probably not going to put that in you.
01:17 But for instance, you might have your help text.
01:21 And this looks beautiful.
01:23 And that can just show up.
01:26 And so that's a Markdown file?
01:27 Well, yeah.
01:29 So that's just this.
01:30 You just stick this little line in your Markdown file.
01:33 And it runs what Rich Codex does.
01:38 Oh, yeah.
01:39 I forgot to say what it is.
01:40 The project's called Rich Codex.
01:42 What it does is it looks for these image tags within your Markdown file.
01:48 And if there's backticks, it figures that you want to run that code.
01:52 And it runs the code and then puts the output in this image file.
01:57 And that's it.
01:58 And that's enough.
01:58 I see.
01:59 And then includes that in your Markdown as an image, right?
02:02 Well, it's already there.
02:03 It already shows up like this.
02:05 It doesn't change your readme at all.
02:06 It doesn't change your Markdown file.
02:08 It just generates the image from the code for you.
02:11 And then you have this.
02:13 So this is in this right here.
02:14 So this is an image, I'm sure, generated from here.
02:17 And then you can resize it.
02:19 And it's an image.
02:21 It's a vector image.
02:23 So it just resizes.
02:24 How cool is that?
02:26 That is really cool.
02:27 So you can do these.
02:29 You can run a command like this.
02:30 Just throw an image in there in your Markdown file or wherever.
02:33 You can also do code snippets.
02:36 So you can give it like this code snippet of showing a snippet of some JSON.
02:43 And it will detect this comment out of your code and then embed it as this image and show up like this.
02:55 So colorize your code.
02:59 One of the ideas around this is images are nice.
03:02 And they really make a readme really easy to...
03:06 I mean, it's colorful.
03:07 It's cool.
03:08 And we like them.
03:10 But it's hard to keep up to date.
03:13 And this way, you can have it kept up to date all the time.
03:17 What I really, really love about this is so you have all these things.
03:21 So you can do code snippets.
03:22 You can even do config files.
03:25 You can have...
03:26 If you want just to generate the image and you're not referencing it from your readme, maybe you're referencing it somewhere else or something, you can have it generated from like a config file.
03:37 But the cool thing about all of this is that he's got it set up for GitHub Actions.
03:45 So you just stick this bit of code within your GitHub Actions and it'll regenerate your images for you.
03:52 It even does...
03:53 If there's any changes, it even does a commit with your changes back in.
03:57 That's pretty cool.
03:58 Yeah.
03:59 Yeah, yeah.
04:00 That's fantastic.
04:01 Really sweet.
04:01 You check in your readme, the action runs, and then it rebuilds the graphics.
04:05 Yes, exactly.
04:07 Cool.
04:07 And then you got a nice looking readme with just like this little tiny line of code in your readme.
04:12 Nice.
04:13 Pretty neat.
04:14 Yeah, that's a cool project.
04:15 Very nice.
04:17 All right.
04:17 Well, let's jump over to this one, which is sent in to us by Roman Wright.
04:26 And it's actually a project by Rami Awar.
04:29 And the project is called...
04:31 Let's see.
04:32 Scroll down.
04:32 Get this right.
04:33 Piedastic.
04:34 Okay.
04:35 So the idea is, it says, Rami says, inspired by Sebastian Ramirez's SQL model and Roman the
04:42 Wright's Beanie.
04:43 So SQL model, we've talked about that.
04:46 That is Piedantic models that are also SQLAlchemy models.
04:50 So basically a database layer on top of Async that on SQLAlchemy that you can do like Async
04:55 stuff and so on.
04:56 That is built on Piedantic.
04:58 And then Beanie is the same thing built on top of Motor, but the models are Piedantic models.
05:04 So here's another one, like an Elasticsearch ORM to do CRUD results and bulk operations and
05:11 so on.
05:11 Built on Piedantic, but now talking to Elasticsearch.
05:15 How cool is that?
05:15 Oh, that is very cool.
05:17 Yeah.
05:18 Yeah.
05:18 So if you're going to do an Elasticsearch and I feel like this is one of those tools that
05:22 I don't use, but I'm like, oh, I should probably learn this because it seems really useful.
05:25 So let's, let's step, take a step back real quick.
05:28 So Elasticsearch is part of the Elastic stack, right?
05:32 There's the whole Elastic.co company and so on.
05:35 But the core of this is the open source Elasticsearch, which is a distributed RESTful search and analytics
05:42 engine capable of a whole bunch of different things, stores your data for lasting lightning
05:47 fast search, fine tune relevancy, you know, ranking of your search and so on.
05:52 And basically search and analytics, right?
05:54 So if you want to do that, but you want to have your models be cool Python Piedantic models,
06:00 well, this Piedastic thing is the way to go.
06:03 Nice.
06:03 Kind of fun name too.
06:05 So to get, it does, these all have fun names.
06:07 So the way you do it is, you know, if you know Piedantic, you basically know how to do this.
06:13 You create a class and it derives from now an ES model, but you can bet that that's also
06:18 like a derived class from a Piedantic base model, model base.
06:22 I think it's model base.
06:23 Anyway, the base class of Piedantic.
06:25 And then you just say like name, stir, phone, optional stir.
06:28 And even you can do the Piedantic field stuff.
06:32 So you could say it's a date time, but it's a field with a default.
06:35 Factory of date time dot now, right?
06:37 All the cool stuff that you would do for a Piedantic model.
06:40 And then you can add a meta class to add information over to Elastic.
06:47 So for example, the meta here says index is user.
06:50 Then you just set up a connection.
06:52 You create one of these objects and you save it.
06:54 You can change its name and save again.
06:57 You know, standard ORM stuff.
06:59 You can get one of these objects by ID.
07:01 And yeah, you can even create new ones, delete ones.
07:04 Pretty straightforward.
07:05 The other thing to realize is it uses the unit of work design pattern.
07:09 So it says this is based on SQLAlchemy session, which is the unit of work applied to SQLAlchemy.
07:16 So, you know, by the transitive property.
07:18 Anyway, you create a context manager and then you do a bunch of work and then you commit it.
07:22 So you can transactionally make changes to your data in Elasticsearch.
07:26 Oh, that's cool.
07:26 Yeah, I like that.
07:27 Yeah.
07:27 And that's pretty much it, right?
07:28 You can query.
07:29 You know what?
07:30 There is one.
07:30 I feel like this is a little bit ironic.
07:33 The one part missing.
07:34 Still haven't got an idea how to wrap the underlying API productively.
07:38 So how do you search Elasticsearch?
07:42 I'm not really sure yet, but you could put something to it.
07:44 I love that it just says that.
07:46 It just says in the docs.
07:47 Still haven't got an idea of how to wrap the underlying API.
07:50 Anyone got an idea?
07:52 So shoot me a thought if you've got some ideas out there.
07:57 Maybe you all can figure it out.
07:58 So I guess when you do a regular query, you get these results back.
08:02 Maybe it's a dictionary.
08:02 I haven't actually tried the raw API for Elasticsearch either.
08:05 But if you get a dictionary back or list of dictionaries, then you can just jam those into
08:09 your pridantic models anyway, right?
08:12 You can transform them back.
08:13 But yeah.
08:13 Anyway, if you're doing Elasticsearch stuff, you know, check this out.
08:16 It looks pretty cool.
08:18 And if you have ideas on how to address that, the final bit to do the search in a good way,
08:23 then, you know, maybe take up that conversation.
08:25 Yeah.
08:25 Nice.
08:26 Yeah.
08:26 Cool.
08:27 Well, I'm going to stick with kind of some web stuff for a minute and talk about PyScript
08:33 again.
08:33 So we've covered PyScript several times, I think.
08:37 And so, but I ran across this article called the three things to know before building PyScript.
08:43 And I got to say one of the, I haven't played, you've made a little application with PyScript
08:47 already, right?
08:48 Yes, I have.
08:49 And I loved it.
08:49 Yeah.
08:50 It's very cool.
08:50 So I hadn't played with it yet.
08:52 And one of the things I love about this is it's got a little crash course and it's really
08:58 short.
08:59 The crash course is, yes, you got to stick this in the head and that's it.
09:03 And then in the body, you wrap some of your Python code in PyScript and when you print
09:10 things, it comes out.
09:11 That's pretty much it.
09:12 Yeah.
09:12 Crash course.
09:13 That's pretty easy.
09:15 One thing I would like to throw in there about the script bit, it's not exactly obvious in
09:21 a lot of the documentation, but you can host your own runtime of the PyOidite and PyScript
09:27 web assemblies and stuff.
09:28 Okay.
09:29 So this just downloads it off of there, which I don't think the caching works super well
09:33 from there, but you can put it in your own place and cache it and so on.
09:38 Okay.
09:38 So I think that's the PyEMV or something.
09:40 So if people are checking that out and you maybe want to pin it so it's stable or something
09:45 like that, then you can do that.
09:46 Or just make sure it's on your server so that you're not pulling it off of their server all
09:50 the time or something.
09:51 Right.
09:51 Because maybe they'll change it or who knows, right?
09:54 Right.
09:54 Exactly.
09:54 Yeah.
09:54 And I was curious about that, but for when you're just learning and playing around with
10:00 it, you can obviously use it.
10:02 Just drop the script link in there.
10:04 Yep.
10:04 Yeah.
10:04 So just a few snippets.
10:07 And I forgot to mention who wrote this.
10:09 Brandon Riggs wrote this.
10:12 And the first thing that he brings up is package indentation matters.
10:17 And I'm glad I probably would have messed this up.
10:20 So this is kind of interesting.
10:21 You can do a PyEMV and in one of those tags, HTML tags.
10:28 But the packages have to be, have dashes and they have to be all the way to the left.
10:34 So you can't have those indented with your PyEMV.
10:38 Yeah.
10:38 It's nuts because it's, it's basically embedded YAML.
10:42 Oh, okay.
10:42 And YAML is sensitive to indentation, but white space is not supposed to matter in HTML.
10:49 So if you do auto reformat of the doc, it keeps breaking it.
10:51 So you got to be super careful with that section.
10:53 Interesting.
10:54 Yeah.
10:55 It's a pain.
10:55 So for something to watch out for, the next one is local file access, which I thought,
11:00 I'm like, I don't believe this.
11:02 And I had to try it out and play with it.
11:04 You, because normally you don't access local files through JavaScript, but, but you can
11:10 apparently through this Python thing, sort of.
11:13 So you have to set up a paths in your environment.
11:17 And then I guess, what does the slash mean?
11:20 Just the current directory or something like that?
11:22 Or I don't know.
11:23 Yeah.
11:23 I think it's, I think what it means, those have to be static files on your web server.
11:28 So this says for people listening forward slash views.csv, you need to be able to take that
11:34 URL and jam it into the, just the web browser and see the file.
11:37 So if it was like your server.com slash views.csv, that's the little fragment without the domain
11:42 that goes there.
11:43 Yeah.
11:43 And in this part, when I was trying it just on my own, but the first part, actually you
11:47 can, you can run a little, a PI script thing just as a file, an HTML file on your computer.
11:52 But if you're doing this, the, the, the local file thing, it needs a server.
11:56 So you need to run a little, but there's a, there's ways to do still a little Python server.
12:01 easy.
12:02 so that, that's interesting.
12:03 the, and his examples is using, using a CSV file here to just, like, import
12:10 pandas and use pandas to read a CSV file, which is pretty sweet.
12:14 and I, the last bit is DOM manipulation, which I never, which of course you'd want to
12:22 do within if you're going to stick some Python code in your, in your, in your PI script.
12:26 But, there's just some gotchas that he can't ran across or just some things that weren't
12:31 obvious to him.
12:32 So that, I guess it's a, there's a, there for buttons, there's a Pisys on click, or
12:39 PYS dash on click.
12:41 And then there's a, how you get the element.
12:45 You can get an element through the document and, and then you can put it back.
12:49 You can, you can do PI script, right.
12:51 And right to an element.
12:53 And there's, it's nice to have this little example to be able to see.
12:56 So, it's good to try this out.
12:58 So like on this, we're PI script, right.
13:01 It's going to this, out, out P well, that shows up as an ID and a div somewhere.
13:07 So you can grab, try to specify where you want to write to.
13:11 And then, yeah.
13:13 And then how to get this, this kind of example is kind of nice because it has like the grabbing
13:17 from a grabbing from an input field and how to deal with the click and stuff like that.
13:21 So, yeah, that's really nice.
13:23 and it, can you go back really quick to where you have the, the E, the PI EMV section
13:28 and the static file, the CSV.
13:30 Yeah.
13:30 A little bit further, a little further back.
13:32 A little further.
13:32 So one of the things that's really cool is you can actually, in addition to these CSV files,
13:37 you can put Python files in there.
13:39 Yeah.
13:39 I was curious about that.
13:40 One to the other.
13:41 You can say like, if you had like a helper.py, you could say somewhere else, import helper
13:46 and then call helper.suchandsuch or whatever.
13:49 And that's all you got to do to kind of like register where the modules live.
13:53 Okay.
13:54 So you can break your code up and you don't have the example here shows it all written
13:57 in the HTML file, which is kind of insane.
14:00 And you should put those into separate files.
14:02 You wouldn't do that with JavaScript generally.
14:04 Right.
14:04 So you shouldn't do it with Python either.
14:06 Right.
14:06 So that's, it's really easy to use that path thing to break it up across Python files.
14:11 You get full autocomplete and everything with.
14:13 And then same thing then, would you, would your Python file have to be served so that
14:17 you could just stick it on a.
14:19 Yes.
14:19 Yeah.
14:19 Just serve it.
14:20 Yeah.
14:20 And so that part, the client side, so weird to say, the client side Python files have to
14:26 live in a static, servable section.
14:29 Okay.
14:29 Normally that's not possible.
14:30 Right.
14:31 Normally that's blocked as it should be.
14:32 Yeah.
14:32 Nice.
14:33 Anyway, interesting.
14:34 This was enough to, to get me to try it, to try a price script because it was pretty
14:40 fun.
14:40 So that's pretty cool.
14:42 Yeah.
14:42 It's very fun.
14:43 And it's, it's quite neat.
14:44 All the things you can build.
14:46 And I think we're just at the beginning, right?
14:48 A lot of the examples are data science oriented, but some of the things you showed, like the
14:52 events and the DOM manipulation and whatnot, you can build full-fledged JavaScript run-in
14:58 style apps.
14:59 They don't have to be only showing graphs and data frames, you know?
15:02 Right.
15:03 And I think, I think we're going to see some interesting stuff because like you said there,
15:07 if you serve up your, like extra helper file or it may, basically it might be most of your
15:14 code actually is in, in these extra files.
15:16 Then, then we really can, I mean, it pulls some, some do most of your code and do demos and
15:23 it's all live and everything.
15:25 And that'll be pretty cool.
15:26 It'll be fantastic.
15:27 Now, when I tried this, the delay actually surprised me.
15:30 It shouldn't surprise me because it's pulling in the whole, whatever the PyScript library
15:34 and everything, but it does like this little spinny wheel thing.
15:38 And you got to wait a few seconds now for a lot of applicants.
15:41 And I think that's one of the reasons why I think data scientists could really take off
15:44 quickly is because they're not going to, it's an internal thing.
15:47 You're not bothered by it.
15:48 It's not something I would, I don't think it's, I'd like it to be the point where you could,
15:53 you could really use Python instead of JavaScript in, in a customer application or something,
15:59 but I don't think it's going to be a while.
16:01 Yeah.
16:01 It's going to be a while before you see it in like a landing page scenario, but you may
16:05 well see it in the equivalent of Gmail, but internal, you know, like that kind of app where
16:10 you open it and you stay on there for a while.
16:11 Yeah, that's true.
16:12 Especially if it's an internal app.
16:14 Yeah.
16:14 Some backend stuff.
16:15 Yeah, sure.
16:16 Yeah.
16:16 After, after, you know, I got to log into this thing and I sit and then like, so the video
16:21 that I did last month or so was about how do you host that and then do a progressive web
16:26 app so that it stores that offline.
16:27 In which case the web app startup time is like one second.
16:30 Always.
16:31 Like it's really, really quick.
16:32 If you get it off of the server, like they list here, then it takes a lot longer.
16:35 So anyway.
16:36 Cool.
16:36 We'll have to try that next.
16:37 But yeah, it's, yeah, I'm super excited about this.
16:40 This is great.
16:41 All right.
16:41 What do I have next?
16:42 Let's see.
16:43 Okay.
16:44 We covered these.
16:45 Next up, more fun names.
16:47 This one comes to us from Sean Koenig and it says, Hey, this might be a good one.
16:52 The, you like punny names.
16:53 So this is dis snake, D I S snake.
16:57 Dis snake.
16:58 And dis snake.
17:00 So dis snake is a modern.
17:03 I agree with that.
17:04 But you'll see in a second, easy to use feature rich async API wrapper in Python for that, for
17:11 discord.
17:11 So discord being the, yeah, like the community place, there's a lot of stuff happening there.
17:16 You know, it's a little, feels a slightly different role than slack and teams, but you
17:21 know, kind of more community oriented rather than company oriented, I suppose.
17:25 Although you can sort of do that with slack.
17:26 It's not really like it's focus.
17:28 It's more some of the people jammed it into.
17:31 Like, for example, if you want to save the history of your community and you're doing
17:35 slack, you've got to pay per user.
17:37 But it's like, if it's a public community, like everyone who randomly shows up, you're like
17:40 $8 a month for them too.
17:41 Oh no.
17:42 Right.
17:42 So for lots of reasons for gaming and others, discord is very popular.
17:46 But what you can do is you can create bots for your community that do fun things.
17:51 And this is a way to do that fun and easily in Python.
17:54 So features include a modern async and await API.
18:00 One of the problems apparently you run into is you can overrun your rate limit by being too
18:05 chatty.
18:05 So it has built in like rate limiting.
18:08 So it doesn't destroy, it doesn't get a 409 too many requests errors.
18:12 It has a really cool command extension.
18:14 You'll see in a moment, object oriented and both optimized for speed and memory.
18:19 Okay.
18:19 So that's pretty cool.
18:21 probably the best way to understand is to just check out the quick, quick start.
18:25 So here's a minimal bot.
18:26 Here's what you do, Brian.
18:27 You import to snake and you create a client at with a dis snake dot client.
18:32 And then you call, you create some functions and you decorate them.
18:35 And then you say a client dot run and you give your API token.
18:38 So then you just write regular async functions.
18:41 It handles the execution of the async functions, but they need to be async.
18:45 And you just say, here's an event or on ready.
18:47 Here's an event on message.
18:50 So if somebody sends a message to that community, then it's going to call back into here straight
18:55 away.
18:55 Oh, interesting.
18:56 All right.
18:57 So just this function, this on message function gets called every time a message happens,
19:01 including if the thing itself sends a message or the account itself.
19:05 So it sort of checks to make sure it doesn't go into like some sort of infinite loop where
19:09 it sends out messages.
19:11 If you send a message, but it just checks, Hey, if you send the string dollar, hello, it'll
19:15 send back.
19:16 Hello.
19:16 The dollar means send this to the bot.
19:19 You know what I mean?
19:19 Okay.
19:19 In this world.
19:21 So yeah, that's pretty much how it works.
19:23 It's kind of interesting, but if you look at the commands and it gets, way more powerful.
19:27 So the commands are what people would probably think of like what I want to do with a bot.
19:31 So with this minimal bot, what you do is you sync the events like on message and ready and
19:36 such.
19:36 But with the commands, you can go over here to the, you import the bot thing and say at
19:41 decorate another async function at bot decorate command.
19:45 And this one's called foo.
19:46 So when that's the case, you know, it takes arguments and so on in discord, you can write
19:51 dollar foo and then other stuff.
19:53 And that other stuff goes to the argument.
19:55 So all you got to do is have a single function with that name and you put the decorator on
20:00 it.
20:00 And now all of a sudden that's a command in discord that talks to the bot.
20:03 Oh, that's cool.
20:04 Yeah.
20:04 Isn't that easy?
20:05 Yeah.
20:05 Yeah.
20:06 So there's some other examples.
20:07 You can register your bot with a prefix.
20:10 So you could use, I don't know, exclamation versus dollar versus whatever it is you want
20:16 to do.
20:16 And by default, the command name is the same as the function name, but you can also pass
20:23 in a name.
20:24 Like for example, if the name is list, you can't have a function called list because it'll freak
20:27 out what list means.
20:28 So you can give it a name and then use a different function name and so on.
20:32 And then again, passing arguments and such.
20:35 So there's some cool little examples of they're saying dollar test.
20:38 Hello.
20:38 And the documentation bot says, hello.
20:40 And they say dollar test.
20:41 Hello world.
20:42 Hello world.
20:42 So yeah.
20:44 Okay.
20:44 So I was thinking stuff like you could give, give people access to some of these commands.
20:49 Like if you want to subscribe to my newsletter, you could give it a subscribe command with your
20:54 email address and subscribe yourself.
20:56 Yeah.
20:57 You could totally do that.
20:58 And you could just on, on the bot side of things, you have the command.
21:02 It takes an argument, which is the email.
21:03 And then you just use the MailChimp or whatever API to just stick them in there.
21:08 Yeah.
21:08 Yeah.
21:09 And that's running on your server.
21:10 So it can do, you know, all sorts of things.
21:12 Interesting.
21:13 Yeah.
21:13 Cool.
21:14 So if you want to do something with discord and check this out, I haven't, haven't used
21:18 it because I haven't tried to build a bot for discord, but this looks pretty fun.
21:20 So check that out.
21:22 Definitely.
21:22 Yeah.
21:23 So that's our items for today.
21:26 Do you have any, any extras for us?
21:29 I have extras.
21:30 I do.
21:30 I do have extras and I actually came up with another extra while I was thinking about the
21:35 extras.
21:35 So yeah.
21:35 Yeah.
21:36 Okay.
21:36 So some exciting stuff.
21:38 Let me pull my screen back up here.
21:40 What's the order I want.
21:41 Let's talk about this one first.
21:42 So last time I spoke about the modern APIs with FastAPI, MongoDB, Beanie, Python as a in-person
21:49 live course that runs for two weeks that I'm teaching and people can check that out.
21:54 Starts on August 8th.
21:55 So I'll link to that, but that's not my item because that's what I talked about last time.
21:59 What I decided to do is I'm opening up a scholarship program for people who are underrepresented in
22:06 the Python space and programming in general and who maybe also just need a hand up through
22:10 different groups there.
22:12 So if you're a woman in tech or a person of color, or maybe you lost your job and you're
22:17 like, I'm trying to get into programming.
22:18 Maybe this course will help me do that.
22:19 I could try and get into programming as a job.
22:21 Check out the scholarship link that I put in here and I'm saving some spots in that live
22:26 course for people who could benefit from that.
22:28 Oh, that's pretty cool.
22:29 Kudos.
22:29 Nice.
22:30 Yeah.
22:30 Thanks.
22:31 Yeah.
22:31 Thanks.
22:31 Okay.
22:32 Now just, this is fresh, hot off the presses as in is one hour and 30 minutes old.
22:38 We have operation Python 2022 software bundle from humble bundle.
22:43 So we're doing another humble bundle this year and I've got my Git course and a cutter course
22:50 and a Pythonic code course that I put in there for people to take, but there's also 24 other
22:56 topics like some stuff from real Python, some stuff from Rufin Lerner, from PyCharm and so
23:02 on.
23:02 So people can look through there and check that out.
23:04 It's certainly a good way to get a deal on Python educational stuff.
23:09 Nice.
23:10 Cool.
23:10 That's pretty cool.
23:11 All right.
23:12 And here's the one that, yeah, thanks.
23:13 I'm pretty excited about that.
23:14 The last one is I told you about these crazy headphones that I have.
23:18 And I just want to tell people maybe quick about this.
23:20 So I got this thing called Ultimate Ear Fits, UE Fits.
23:24 And there are these fitted earplugs, earbuds, which I'm wearing now, obviously on the YouTube
23:29 channel.
23:29 And what they do is they come really soft and smushy and they're light sensitive and heat
23:34 sensitive.
23:34 You put them in your ear and you press up, you pair them to your phone, you press a button.
23:38 They start blazing out light and heat and they form to the shapes of your ears.
23:42 So Brian, what do you think of that?
23:44 That's, I, I don't know.
23:47 Unusual, right?
23:48 Yeah, it sounds pretty cool.
23:49 I just don't want it to go too far and to take over my brain.
23:52 What if it's too mushy and it, yes, if it gets in there, you don't know, you can't, can't
23:56 get it out.
23:56 No, it's probably safe.
23:57 Anyway, you and I were talking about that right before we started.
23:59 So I thought I'd just give a quick shout out to that.
24:01 That's kind of fun.
24:01 So how's the sound so far?
24:02 It sounds great.
24:03 It's kind of like you're wearing earplugs.
24:06 So the sound is a little bit blocked out, but then there's a speaker on the inside.
24:10 Okay.
24:10 Nice.
24:11 Yeah.
24:12 Any extras from you?
24:14 I don't have any extras.
24:15 All right.
24:16 Well, let's tell the joke then.
24:17 Okay.
24:17 So this one is a proposed, more of a comment on a proposed idea, which gosh, it probably
24:23 will never happen, but I would wish it would.
24:25 It says, if we're going to unionize and forget wage, increased wages and that kind of stuff.
24:31 I want this instead as a software developer.
24:33 And what it is, is it's a proposed new standard year, which breaks up the year into 13 different
24:40 months.
24:40 Yeah.
24:41 They're all 28 days, which almost exactly rounds out the year.
24:45 So every single month, the first is Sunday.
24:48 The fifth is Thursday.
24:50 The 26th is a Thursday.
24:52 It's always the same year after year after year.
24:56 So you know about the days, you know, how many months it is, how long, if you have 28 days
25:01 or, you know, 45 days from now, you know, it doesn't matter what month you're in on how
25:05 far that pushes you into the next month.
25:07 But there's one day left over.
25:08 It says the day, the one day left over is new year's day.
25:12 It isn't a weekend or a weekday.
25:14 It's magic.
25:15 And on leap years, it's a double vacation day.
25:17 The rest is easy.
25:18 Someone says, I'll see you on the 19th.
25:19 You know, it's on a Thursday.
25:20 Doesn't matter what month or anything.
25:22 What do you think of this?
25:23 I, I've always been a proposal, a proponent to the fixed calendar.
25:29 I think it's a great idea.
25:30 And I'm, I don't remember the history, but I'm pretty sure that we probably started out
25:34 this way because it's the, it's the lunar calendar essentially.
25:39 Yeah.
25:40 Yeah.
25:40 Pretty much.
25:41 Yeah.
25:41 And I thought I read somewhere once that the people were freaked out by the number 13.
25:45 So they dropped it to 12 or something.
25:47 I'm sure somebody in the channel or somebody will.
25:49 I think we could fix it.
25:51 If you just started with zero based.
25:52 Oh, zero to 12.
25:53 Zero to 12.
25:54 That's better.
25:54 Yeah.
25:55 January zero.
25:56 Perfect.
25:57 Exactly.
25:58 Yeah.
25:59 Yeah.
26:01 Anyway, it's sort of a joke, but the comment about it, that's the joke.
26:05 Yeah.
26:06 You got any other jokes you want to share?
26:09 Is that a.
26:09 No, I don't.
26:11 I didn't.
26:11 All right.
26:12 Fantastic.
26:13 Good talking to you again.
26:14 Well, yeah, it's great to talk to you as always.
26:17 Thanks for being here.
26:17 Thanks everyone for being out in the audience.
26:19 Yeah.
26:19 Thank you.
26:19 Bye.