Brought to you by Michael and Brian - take a Talk Python course or get Brian's pytest book


Transcript #292: Thursday, it's always a Thursday

Return to episode page view on github
Recorded on Thursday, Jul 7, 2022.

00: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.

Back to show page