WEBVTT

00:00:00.001 --> 00:00:05.280
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.

00:00:05.280 --> 00:00:09.720
This is episode 292, recorded July 7th, 2022.

00:00:09.720 --> 00:00:10.960
I'm Michael Kennedy.

00:00:10.960 --> 00:00:12.100
And I am Brian Okken.

00:00:12.100 --> 00:00:13.720
Yeah. Great to have you here, Brian.

00:00:13.720 --> 00:00:15.720
This episode is brought to you by us.

00:00:15.720 --> 00:00:17.280
Check out Brian's book.

00:00:17.280 --> 00:00:19.660
And if you want a course, check out Talk Python Training.

00:00:19.660 --> 00:00:22.320
Actually, a few more topics on that at the very end.

00:00:22.320 --> 00:00:24.420
Some cool stuff going on there I want to tell people about.

00:00:24.420 --> 00:00:27.560
Right now, I would like to hear about your first item.

00:00:27.560 --> 00:00:29.960
Something rich, if you will.

00:00:30.300 --> 00:00:30.580
Yeah.

00:00:30.580 --> 00:00:41.380
So it wouldn't be our Python Bytes podcast if we didn't talk about Will, Will McGugan and his Rich project.

00:00:41.380 --> 00:00:42.540
But anyway.

00:00:42.540 --> 00:00:46.140
Something built from Rich almost always, yes.

00:00:46.140 --> 00:00:46.500
Yeah.

00:00:46.500 --> 00:00:49.880
So Will tweeted out, fantastic today.

00:00:49.880 --> 00:00:53.620
Fantastic project from Phil Ewells, maybe.

00:00:54.120 --> 00:01:00.940
It generates screenshots of commands on the fly from Markdown files to keep them up to date.

00:01:00.940 --> 00:01:03.140
And this is great.

00:01:03.140 --> 00:01:10.720
So let's say you want to do an output from a terminal output from your command or something in your readme.

00:01:10.720 --> 00:01:15.520
It looks great if it's like, here's a kitty cat.

00:01:15.520 --> 00:01:17.160
I mean, you're probably not going to put that in you.

00:01:17.160 --> 00:01:21.640
But for instance, you might have your help text.

00:01:21.640 --> 00:01:23.600
And this looks beautiful.

00:01:23.600 --> 00:01:26.500
And that can just show up.

00:01:26.500 --> 00:01:27.700
And so that's a Markdown file?

00:01:27.700 --> 00:01:29.020
Well, yeah.

00:01:29.020 --> 00:01:30.480
So that's just this.

00:01:30.680 --> 00:01:33.120
You just stick this little line in your Markdown file.

00:01:33.120 --> 00:01:38.180
And it runs what Rich Codex does.

00:01:38.180 --> 00:01:39.000
Oh, yeah.

00:01:39.000 --> 00:01:40.220
I forgot to say what it is.

00:01:40.220 --> 00:01:42.000
The project's called Rich Codex.

00:01:42.000 --> 00:01:48.260
What it does is it looks for these image tags within your Markdown file.

00:01:48.260 --> 00:01:52.960
And if there's backticks, it figures that you want to run that code.

00:01:52.960 --> 00:01:56.960
And it runs the code and then puts the output in this image file.

00:01:57.420 --> 00:01:58.100
And that's it.

00:01:58.100 --> 00:01:58.820
And that's enough.

00:01:58.820 --> 00:01:59.200
I see.

00:01:59.200 --> 00:02:02.700
And then includes that in your Markdown as an image, right?

00:02:02.700 --> 00:02:03.940
Well, it's already there.

00:02:03.940 --> 00:02:05.320
It already shows up like this.

00:02:05.320 --> 00:02:06.920
It doesn't change your readme at all.

00:02:06.920 --> 00:02:08.300
It doesn't change your Markdown file.

00:02:08.300 --> 00:02:11.180
It just generates the image from the code for you.

00:02:11.180 --> 00:02:13.440
And then you have this.

00:02:13.440 --> 00:02:14.940
So this is in this right here.

00:02:14.940 --> 00:02:17.340
So this is an image, I'm sure, generated from here.

00:02:17.340 --> 00:02:19.660
And then you can resize it.

00:02:19.660 --> 00:02:21.400
And it's an image.

00:02:21.400 --> 00:02:23.640
It's a vector image.

00:02:23.640 --> 00:02:24.520
So it just resizes.

00:02:24.520 --> 00:02:25.720
How cool is that?

00:02:26.460 --> 00:02:27.600
That is really cool.

00:02:27.600 --> 00:02:29.040
So you can do these.

00:02:29.040 --> 00:02:30.840
You can run a command like this.

00:02:30.840 --> 00:02:33.900
Just throw an image in there in your Markdown file or wherever.

00:02:33.900 --> 00:02:36.960
You can also do code snippets.

00:02:36.960 --> 00:02:43.920
So you can give it like this code snippet of showing a snippet of some JSON.

00:02:43.920 --> 00:02:55.660
And it will detect this comment out of your code and then embed it as this image and show up like this.

00:02:55.660 --> 00:02:58.560
So colorize your code.

00:02:59.180 --> 00:03:02.440
One of the ideas around this is images are nice.

00:03:02.440 --> 00:03:06.500
And they really make a readme really easy to...

00:03:06.500 --> 00:03:07.620
I mean, it's colorful.

00:03:07.620 --> 00:03:08.480
It's cool.

00:03:08.480 --> 00:03:10.340
And we like them.

00:03:10.340 --> 00:03:13.340
But it's hard to keep up to date.

00:03:13.340 --> 00:03:17.500
And this way, you can have it kept up to date all the time.

00:03:17.840 --> 00:03:21.040
What I really, really love about this is so you have all these things.

00:03:21.040 --> 00:03:22.620
So you can do code snippets.

00:03:22.620 --> 00:03:25.580
You can even do config files.

00:03:25.580 --> 00:03:26.560
You can have...

00:03:26.560 --> 00:03:37.360
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.

00:03:37.360 --> 00:03:45.140
But the cool thing about all of this is that he's got it set up for GitHub Actions.

00:03:45.140 --> 00:03:52.240
So you just stick this bit of code within your GitHub Actions and it'll regenerate your images for you.

00:03:52.240 --> 00:03:53.540
It even does...

00:03:53.540 --> 00:03:57.360
If there's any changes, it even does a commit with your changes back in.

00:03:57.360 --> 00:03:58.820
That's pretty cool.

00:03:58.820 --> 00:03:59.120
Yeah.

00:03:59.120 --> 00:04:00.360
Yeah, yeah.

00:04:00.360 --> 00:04:01.020
That's fantastic.

00:04:01.020 --> 00:04:01.920
Really sweet.

00:04:01.920 --> 00:04:05.620
You check in your readme, the action runs, and then it rebuilds the graphics.

00:04:05.620 --> 00:04:07.000
Yes, exactly.

00:04:07.380 --> 00:04:07.520
Cool.

00:04:07.520 --> 00:04:12.760
And then you got a nice looking readme with just like this little tiny line of code in your readme.

00:04:12.760 --> 00:04:13.500
Nice.

00:04:13.500 --> 00:04:14.300
Pretty neat.

00:04:14.300 --> 00:04:15.800
Yeah, that's a cool project.

00:04:15.800 --> 00:04:17.200
Very nice.

00:04:17.200 --> 00:04:17.880
All right.

00:04:17.880 --> 00:04:26.340
Well, let's jump over to this one, which is sent in to us by Roman Wright.

00:04:26.340 --> 00:04:29.380
And it's actually a project by Rami Awar.

00:04:29.380 --> 00:04:31.640
And the project is called...

00:04:31.640 --> 00:04:32.000
Let's see.

00:04:32.000 --> 00:04:32.600
Scroll down.

00:04:32.600 --> 00:04:33.240
Get this right.

00:04:33.240 --> 00:04:34.180
Piedastic.

00:04:34.180 --> 00:04:34.740
Okay.

00:04:35.080 --> 00:04:42.720
So the idea is, it says, Rami says, inspired by Sebastian Ramirez's SQL model and Roman the

00:04:42.720 --> 00:04:43.740
Wright's Beanie.

00:04:43.740 --> 00:04:46.220
So SQL model, we've talked about that.

00:04:46.220 --> 00:04:50.800
That is Piedantic models that are also SQLAlchemy models.

00:04:50.800 --> 00:04:55.820
So basically a database layer on top of Async that on SQLAlchemy that you can do like Async

00:04:55.820 --> 00:04:56.520
stuff and so on.

00:04:56.580 --> 00:04:58.420
That is built on Piedantic.

00:04:58.420 --> 00:05:04.220
And then Beanie is the same thing built on top of Motor, but the models are Piedantic models.

00:05:04.220 --> 00:05:11.500
So here's another one, like an Elasticsearch ORM to do CRUD results and bulk operations and

00:05:11.500 --> 00:05:11.880
so on.

00:05:11.880 --> 00:05:15.100
Built on Piedantic, but now talking to Elasticsearch.

00:05:15.100 --> 00:05:15.900
How cool is that?

00:05:15.900 --> 00:05:17.340
Oh, that is very cool.

00:05:17.340 --> 00:05:17.840
Yeah.

00:05:18.100 --> 00:05:18.320
Yeah.

00:05:18.320 --> 00:05:22.020
So if you're going to do an Elasticsearch and I feel like this is one of those tools that

00:05:22.020 --> 00:05:25.440
I don't use, but I'm like, oh, I should probably learn this because it seems really useful.

00:05:25.440 --> 00:05:28.880
So let's, let's step, take a step back real quick.

00:05:28.880 --> 00:05:32.920
So Elasticsearch is part of the Elastic stack, right?

00:05:32.920 --> 00:05:35.760
There's the whole Elastic.co company and so on.

00:05:35.760 --> 00:05:42.380
But the core of this is the open source Elasticsearch, which is a distributed RESTful search and analytics

00:05:42.380 --> 00:05:47.620
engine capable of a whole bunch of different things, stores your data for lasting lightning

00:05:47.620 --> 00:05:52.200
fast search, fine tune relevancy, you know, ranking of your search and so on.

00:05:52.200 --> 00:05:54.700
And basically search and analytics, right?

00:05:54.700 --> 00:06:00.200
So if you want to do that, but you want to have your models be cool Python Piedantic models,

00:06:00.200 --> 00:06:03.240
well, this Piedastic thing is the way to go.

00:06:03.240 --> 00:06:03.780
Nice.

00:06:03.780 --> 00:06:05.460
Kind of fun name too.

00:06:05.720 --> 00:06:07.800
So to get, it does, these all have fun names.

00:06:07.800 --> 00:06:13.000
So the way you do it is, you know, if you know Piedantic, you basically know how to do this.

00:06:13.000 --> 00:06:18.360
You create a class and it derives from now an ES model, but you can bet that that's also

00:06:18.360 --> 00:06:22.380
like a derived class from a Piedantic base model, model base.

00:06:22.380 --> 00:06:23.100
I think it's model base.

00:06:23.100 --> 00:06:25.320
Anyway, the base class of Piedantic.

00:06:25.320 --> 00:06:28.560
And then you just say like name, stir, phone, optional stir.

00:06:28.560 --> 00:06:32.020
And even you can do the Piedantic field stuff.

00:06:32.020 --> 00:06:35.580
So you could say it's a date time, but it's a field with a default.

00:06:35.680 --> 00:06:37.600
Factory of date time dot now, right?

00:06:37.600 --> 00:06:40.840
All the cool stuff that you would do for a Piedantic model.

00:06:40.960 --> 00:06:47.740
And then you can add a meta class to add information over to Elastic.

00:06:47.740 --> 00:06:50.780
So for example, the meta here says index is user.

00:06:50.780 --> 00:06:52.220
Then you just set up a connection.

00:06:52.220 --> 00:06:54.740
You create one of these objects and you save it.

00:06:54.740 --> 00:06:57.320
You can change its name and save again.

00:06:57.320 --> 00:06:59.120
You know, standard ORM stuff.

00:06:59.120 --> 00:07:01.320
You can get one of these objects by ID.

00:07:01.320 --> 00:07:04.680
And yeah, you can even create new ones, delete ones.

00:07:04.680 --> 00:07:05.300
Pretty straightforward.

00:07:05.560 --> 00:07:09.880
The other thing to realize is it uses the unit of work design pattern.

00:07:09.880 --> 00:07:16.180
So it says this is based on SQLAlchemy session, which is the unit of work applied to SQLAlchemy.

00:07:16.180 --> 00:07:18.540
So, you know, by the transitive property.

00:07:18.540 --> 00:07:22.480
Anyway, you create a context manager and then you do a bunch of work and then you commit it.

00:07:22.480 --> 00:07:25.900
So you can transactionally make changes to your data in Elasticsearch.

00:07:26.280 --> 00:07:26.740
Oh, that's cool.

00:07:26.740 --> 00:07:27.680
Yeah, I like that.

00:07:27.680 --> 00:07:27.880
Yeah.

00:07:27.880 --> 00:07:28.860
And that's pretty much it, right?

00:07:28.860 --> 00:07:29.480
You can query.

00:07:29.480 --> 00:07:30.140
You know what?

00:07:30.140 --> 00:07:30.940
There is one.

00:07:30.940 --> 00:07:33.640
I feel like this is a little bit ironic.

00:07:33.640 --> 00:07:34.960
The one part missing.

00:07:34.960 --> 00:07:38.740
Still haven't got an idea how to wrap the underlying API productively.

00:07:38.740 --> 00:07:42.140
So how do you search Elasticsearch?

00:07:42.140 --> 00:07:44.640
I'm not really sure yet, but you could put something to it.

00:07:44.640 --> 00:07:46.580
I love that it just says that.

00:07:46.580 --> 00:07:47.640
It just says in the docs.

00:07:47.640 --> 00:07:50.280
Still haven't got an idea of how to wrap the underlying API.

00:07:50.280 --> 00:07:52.060
Anyone got an idea?

00:07:52.320 --> 00:07:57.080
So shoot me a thought if you've got some ideas out there.

00:07:57.080 --> 00:07:58.700
Maybe you all can figure it out.

00:07:58.700 --> 00:08:02.020
So I guess when you do a regular query, you get these results back.

00:08:02.020 --> 00:08:02.940
Maybe it's a dictionary.

00:08:02.940 --> 00:08:05.980
I haven't actually tried the raw API for Elasticsearch either.

00:08:05.980 --> 00:08:09.980
But if you get a dictionary back or list of dictionaries, then you can just jam those into

00:08:09.980 --> 00:08:12.120
your pridantic models anyway, right?

00:08:12.120 --> 00:08:13.100
You can transform them back.

00:08:13.100 --> 00:08:13.740
But yeah.

00:08:13.740 --> 00:08:16.740
Anyway, if you're doing Elasticsearch stuff, you know, check this out.

00:08:16.740 --> 00:08:17.940
It looks pretty cool.

00:08:18.180 --> 00:08:23.220
And if you have ideas on how to address that, the final bit to do the search in a good way,

00:08:23.220 --> 00:08:25.340
then, you know, maybe take up that conversation.

00:08:25.340 --> 00:08:25.840
Yeah.

00:08:25.840 --> 00:08:26.380
Nice.

00:08:26.380 --> 00:08:26.860
Yeah.

00:08:26.860 --> 00:08:27.080
Cool.

00:08:27.080 --> 00:08:33.500
Well, I'm going to stick with kind of some web stuff for a minute and talk about PyScript

00:08:33.500 --> 00:08:33.940
again.

00:08:33.940 --> 00:08:37.080
So we've covered PyScript several times, I think.

00:08:37.080 --> 00:08:42.640
And so, but I ran across this article called the three things to know before building PyScript.

00:08:43.100 --> 00:08:47.520
And I got to say one of the, I haven't played, you've made a little application with PyScript

00:08:47.520 --> 00:08:48.200
already, right?

00:08:48.200 --> 00:08:49.300
Yes, I have.

00:08:49.300 --> 00:08:49.900
And I loved it.

00:08:49.900 --> 00:08:50.140
Yeah.

00:08:50.140 --> 00:08:50.580
It's very cool.

00:08:50.580 --> 00:08:52.960
So I hadn't played with it yet.

00:08:52.960 --> 00:08:58.580
And one of the things I love about this is it's got a little crash course and it's really

00:08:58.580 --> 00:08:59.140
short.

00:08:59.140 --> 00:09:03.220
The crash course is, yes, you got to stick this in the head and that's it.

00:09:03.480 --> 00:09:10.380
And then in the body, you wrap some of your Python code in PyScript and when you print

00:09:10.380 --> 00:09:11.640
things, it comes out.

00:09:11.640 --> 00:09:12.800
That's pretty much it.

00:09:12.800 --> 00:09:12.960
Yeah.

00:09:12.960 --> 00:09:13.420
Crash course.

00:09:13.420 --> 00:09:15.480
That's pretty easy.

00:09:15.480 --> 00:09:21.900
One thing I would like to throw in there about the script bit, it's not exactly obvious in

00:09:21.900 --> 00:09:27.320
a lot of the documentation, but you can host your own runtime of the PyOidite and PyScript

00:09:27.320 --> 00:09:28.580
web assemblies and stuff.

00:09:28.580 --> 00:09:29.140
Okay.

00:09:29.140 --> 00:09:33.040
So this just downloads it off of there, which I don't think the caching works super well

00:09:33.040 --> 00:09:38.120
from there, but you can put it in your own place and cache it and so on.

00:09:38.120 --> 00:09:38.600
Okay.

00:09:38.600 --> 00:09:40.980
So I think that's the PyEMV or something.

00:09:40.980 --> 00:09:45.160
So if people are checking that out and you maybe want to pin it so it's stable or something

00:09:45.160 --> 00:09:46.860
like that, then you can do that.

00:09:46.860 --> 00:09:50.620
Or just make sure it's on your server so that you're not pulling it off of their server all

00:09:50.620 --> 00:09:51.560
the time or something.

00:09:51.560 --> 00:09:51.820
Right.

00:09:51.820 --> 00:09:54.200
Because maybe they'll change it or who knows, right?

00:09:54.200 --> 00:09:54.340
Right.

00:09:54.340 --> 00:09:54.580
Exactly.

00:09:54.580 --> 00:09:54.940
Yeah.

00:09:54.940 --> 00:10:00.700
And I was curious about that, but for when you're just learning and playing around with

00:10:00.700 --> 00:10:02.160
it, you can obviously use it.

00:10:02.160 --> 00:10:04.260
Just drop the script link in there.

00:10:04.260 --> 00:10:04.420
Yep.

00:10:04.420 --> 00:10:04.720
Yeah.

00:10:04.720 --> 00:10:07.260
So just a few snippets.

00:10:07.260 --> 00:10:09.140
And I forgot to mention who wrote this.

00:10:09.140 --> 00:10:12.240
Brandon Riggs wrote this.

00:10:12.700 --> 00:10:17.580
And the first thing that he brings up is package indentation matters.

00:10:17.580 --> 00:10:20.260
And I'm glad I probably would have messed this up.

00:10:20.260 --> 00:10:21.260
So this is kind of interesting.

00:10:21.260 --> 00:10:28.260
You can do a PyEMV and in one of those tags, HTML tags.

00:10:28.260 --> 00:10:34.780
But the packages have to be, have dashes and they have to be all the way to the left.

00:10:34.780 --> 00:10:37.880
So you can't have those indented with your PyEMV.

00:10:38.080 --> 00:10:38.560
Yeah.

00:10:38.560 --> 00:10:42.280
It's nuts because it's, it's basically embedded YAML.

00:10:42.280 --> 00:10:42.900
Oh, okay.

00:10:42.900 --> 00:10:49.100
And YAML is sensitive to indentation, but white space is not supposed to matter in HTML.

00:10:49.100 --> 00:10:51.980
So if you do auto reformat of the doc, it keeps breaking it.

00:10:51.980 --> 00:10:53.720
So you got to be super careful with that section.

00:10:53.720 --> 00:10:54.320
Interesting.

00:10:54.320 --> 00:10:55.460
Yeah.

00:10:55.460 --> 00:10:55.880
It's a pain.

00:10:55.880 --> 00:11:00.760
So for something to watch out for, the next one is local file access, which I thought,

00:11:00.760 --> 00:11:02.140
I'm like, I don't believe this.

00:11:02.140 --> 00:11:04.060
And I had to try it out and play with it.

00:11:04.540 --> 00:11:10.360
You, because normally you don't access local files through JavaScript, but, but you can

00:11:10.360 --> 00:11:13.440
apparently through this Python thing, sort of.

00:11:13.440 --> 00:11:17.240
So you have to set up a paths in your environment.

00:11:17.240 --> 00:11:20.380
And then I guess, what does the slash mean?

00:11:20.380 --> 00:11:22.200
Just the current directory or something like that?

00:11:22.200 --> 00:11:23.060
Or I don't know.

00:11:23.060 --> 00:11:23.520
Yeah.

00:11:23.520 --> 00:11:28.780
I think it's, I think what it means, those have to be static files on your web server.

00:11:28.780 --> 00:11:34.120
So this says for people listening forward slash views.csv, you need to be able to take that

00:11:34.120 --> 00:11:37.160
URL and jam it into the, just the web browser and see the file.

00:11:37.160 --> 00:11:42.640
So if it was like your server.com slash views.csv, that's the little fragment without the domain

00:11:42.640 --> 00:11:43.100
that goes there.

00:11:43.100 --> 00:11:43.580
Yeah.

00:11:43.580 --> 00:11:47.580
And in this part, when I was trying it just on my own, but the first part, actually you

00:11:47.580 --> 00:11:52.640
can, you can run a little, a PI script thing just as a file, an HTML file on your computer.

00:11:52.720 --> 00:11:56.800
But if you're doing this, the local file thing, it needs a server.

00:11:56.800 --> 00:12:01.300
So you need to run a little, but there's a, there's ways to do still a little Python server.

00:12:01.300 --> 00:12:02.180
easy.

00:12:02.180 --> 00:12:03.840
so that, that's interesting.

00:12:03.840 --> 00:12:10.180
the, and his examples is using, using a CSV file here to just, like, import

00:12:10.180 --> 00:12:14.700
pandas and use pandas to read a CSV file, which is pretty sweet.

00:12:14.700 --> 00:12:22.280
and I, the last bit is DOM manipulation, which I never, which of course you'd want to

00:12:22.280 --> 00:12:26.600
do within if you're going to stick some Python code in your, in your, in your PI script.

00:12:26.600 --> 00:12:31.540
But, there's just some gotchas that he can't ran across or just some things that weren't

00:12:31.540 --> 00:12:32.320
obvious to him.

00:12:32.320 --> 00:12:39.180
So that, I guess it's a, there's a, there for buttons, there's a Pisys on click, or

00:12:39.180 --> 00:12:41.380
PYS dash on click.

00:12:41.380 --> 00:12:45.400
And then there's a, how you get the element.

00:12:45.400 --> 00:12:49.900
You can get an element through the document and, and then you can put it back.

00:12:49.920 --> 00:12:51.800
You can, you can do PI script, right.

00:12:51.800 --> 00:12:53.220
And right to an element.

00:12:53.220 --> 00:12:56.960
And there's, it's nice to have this little example to be able to see.

00:12:56.960 --> 00:12:58.940
So, it's good to try this out.

00:12:58.940 --> 00:13:01.580
So like on this, we're PI script, right.

00:13:01.580 --> 00:13:07.700
It's going to this, out, out P well, that shows up as an ID and a div somewhere.

00:13:07.700 --> 00:13:11.480
So you can grab, try to specify where you want to write to.

00:13:11.560 --> 00:13:13.000
And then, yeah.

00:13:13.000 --> 00:13:17.340
And then how to get this, this kind of example is kind of nice because it has like the grabbing

00:13:17.340 --> 00:13:21.660
from a grabbing from an input field and how to deal with the click and stuff like that.

00:13:21.660 --> 00:13:23.300
So, yeah, that's really nice.

00:13:23.300 --> 00:13:28.840
and it, can you go back really quick to where you have the E, the PI EMV section

00:13:28.840 --> 00:13:30.500
and the static file, the CSV.

00:13:30.500 --> 00:13:30.800
Yeah.

00:13:30.800 --> 00:13:32.380
A little bit further, a little further back.

00:13:32.380 --> 00:13:32.760
A little further.

00:13:32.760 --> 00:13:37.360
So one of the things that's really cool is you can actually, in addition to these CSV files,

00:13:37.360 --> 00:13:39.220
you can put Python files in there.

00:13:39.220 --> 00:13:39.600
Yeah.

00:13:39.600 --> 00:13:40.320
I was curious about that.

00:13:40.320 --> 00:13:41.220
One to the other.

00:13:41.220 --> 00:13:46.840
You can say like, if you had like a helper.py, you could say somewhere else, import helper

00:13:46.840 --> 00:13:49.040
and then call helper.suchandsuch or whatever.

00:13:49.040 --> 00:13:53.860
And that's all you got to do to kind of like register where the modules live.

00:13:53.860 --> 00:13:54.080
Okay.

00:13:54.080 --> 00:13:57.980
So you can break your code up and you don't have the example here shows it all written

00:13:57.980 --> 00:14:00.320
in the HTML file, which is kind of insane.

00:14:00.320 --> 00:14:02.140
And you should put those into separate files.

00:14:02.140 --> 00:14:04.260
You wouldn't do that with JavaScript generally.

00:14:04.260 --> 00:14:04.560
Right.

00:14:04.560 --> 00:14:06.060
So you shouldn't do it with Python either.

00:14:06.060 --> 00:14:06.300
Right.

00:14:06.560 --> 00:14:11.920
So that's, it's really easy to use that path thing to break it up across Python files.

00:14:11.920 --> 00:14:13.620
You get full autocomplete and everything with.

00:14:13.620 --> 00:14:17.980
And then same thing then, would you, would your Python file have to be served so that

00:14:17.980 --> 00:14:19.080
you could just stick it on a.

00:14:19.080 --> 00:14:19.380
Yes.

00:14:19.380 --> 00:14:19.800
Yeah.

00:14:19.800 --> 00:14:20.380
Just serve it.

00:14:20.380 --> 00:14:20.580
Yeah.

00:14:20.580 --> 00:14:26.320
And so that part, the client side, so weird to say, the client side Python files have to

00:14:26.320 --> 00:14:29.100
live in a static, servable section.

00:14:29.100 --> 00:14:29.580
Okay.

00:14:29.580 --> 00:14:30.700
Normally that's not possible.

00:14:30.700 --> 00:14:31.180
Right.

00:14:31.180 --> 00:14:32.360
Normally that's blocked as it should be.

00:14:32.360 --> 00:14:32.660
Yeah.

00:14:32.660 --> 00:14:33.180
Nice.

00:14:33.180 --> 00:14:34.760
Anyway, interesting.

00:14:34.760 --> 00:14:40.720
This was enough to, to get me to try it, to try a price script because it was pretty

00:14:40.720 --> 00:14:40.960
fun.

00:14:40.960 --> 00:14:42.080
So that's pretty cool.

00:14:42.240 --> 00:14:42.400
Yeah.

00:14:42.400 --> 00:14:43.060
It's very fun.

00:14:43.060 --> 00:14:44.400
And it's, it's quite neat.

00:14:44.400 --> 00:14:46.040
All the things you can build.

00:14:46.040 --> 00:14:48.780
And I think we're just at the beginning, right?

00:14:48.780 --> 00:14:52.800
A lot of the examples are data science oriented, but some of the things you showed, like the

00:14:52.800 --> 00:14:58.160
events and the DOM manipulation and whatnot, you can build full-fledged JavaScript run-in

00:14:58.160 --> 00:14:59.160
style apps.

00:14:59.160 --> 00:15:02.760
They don't have to be only showing graphs and data frames, you know?

00:15:02.760 --> 00:15:03.140
Right.

00:15:03.140 --> 00:15:06.900
And I think, I think we're going to see some interesting stuff because like you said there,

00:15:07.160 --> 00:15:14.040
if you serve up your, like extra helper file or it may, basically it might be most of your

00:15:14.040 --> 00:15:16.380
code actually is in, in these extra files.

00:15:16.380 --> 00:15:23.460
Then, then we really can, I mean, it pulls some, some do most of your code and do demos and

00:15:23.460 --> 00:15:25.260
it's all live and everything.

00:15:25.260 --> 00:15:26.560
And that'll be pretty cool.

00:15:26.560 --> 00:15:27.140
It'll be fantastic.

00:15:27.200 --> 00:15:30.600
Now, when I tried this, the delay actually surprised me.

00:15:30.600 --> 00:15:34.720
It shouldn't surprise me because it's pulling in the whole, whatever the PyScript library

00:15:34.720 --> 00:15:38.000
and everything, but it does like this little spinny wheel thing.

00:15:38.000 --> 00:15:41.240
And you got to wait a few seconds now for a lot of applicants.

00:15:41.240 --> 00:15:44.680
And I think that's one of the reasons why I think data scientists could really take off

00:15:44.680 --> 00:15:47.960
quickly is because they're not going to, it's an internal thing.

00:15:47.960 --> 00:15:48.940
You're not bothered by it.

00:15:48.940 --> 00:15:53.940
It's not something I would, I don't think it's, I'd like it to be the point where you could,

00:15:53.940 --> 00:15:59.120
you could really use Python instead of JavaScript in, in a customer application or something,

00:15:59.120 --> 00:16:01.180
but I don't think it's going to be a while.

00:16:01.180 --> 00:16:01.560
Yeah.

00:16:01.560 --> 00:16:05.820
It's going to be a while before you see it in like a landing page scenario, but you may

00:16:05.820 --> 00:16:10.280
well see it in the equivalent of Gmail, but internal, you know, like that kind of app where

00:16:10.280 --> 00:16:11.980
you open it and you stay on there for a while.

00:16:11.980 --> 00:16:12.500
Yeah, that's true.

00:16:12.500 --> 00:16:14.080
Especially if it's an internal app.

00:16:14.080 --> 00:16:14.260
Yeah.

00:16:14.260 --> 00:16:15.240
Some backend stuff.

00:16:15.240 --> 00:16:16.000
Yeah, sure.

00:16:16.000 --> 00:16:16.520
Yeah.

00:16:16.520 --> 00:16:21.440
After, after, you know, I got to log into this thing and I sit and then like, so the video

00:16:21.440 --> 00:16:26.180
that I did last month or so was about how do you host that and then do a progressive web

00:16:26.180 --> 00:16:27.740
app so that it stores that offline.

00:16:27.740 --> 00:16:30.400
In which case the web app startup time is like one second.

00:16:30.400 --> 00:16:31.240
Always.

00:16:31.240 --> 00:16:32.680
Like it's really, really quick.

00:16:32.680 --> 00:16:35.840
If you get it off of the server, like they list here, then it takes a lot longer.

00:16:35.840 --> 00:16:36.560
So anyway.

00:16:36.560 --> 00:16:36.840
Cool.

00:16:36.840 --> 00:16:37.880
We'll have to try that next.

00:16:37.880 --> 00:16:40.620
But yeah, it's, yeah, I'm super excited about this.

00:16:40.620 --> 00:16:41.180
This is great.

00:16:41.180 --> 00:16:41.820
All right.

00:16:41.820 --> 00:16:42.680
What do I have next?

00:16:42.680 --> 00:16:43.660
Let's see.

00:16:43.660 --> 00:16:44.340
Okay.

00:16:44.340 --> 00:16:45.340
We covered these.

00:16:45.960 --> 00:16:47.540
Next up, more fun names.

00:16:47.540 --> 00:16:52.480
This one comes to us from Sean Koenig and it says, Hey, this might be a good one.

00:16:52.480 --> 00:16:53.920
The, you like punny names.

00:16:53.920 --> 00:16:57.900
So this is dis snake, D I S snake.

00:16:57.900 --> 00:16:58.480
Dis snake.

00:16:58.480 --> 00:17:00.180
And dis snake.

00:17:00.180 --> 00:17:03.460
So dis snake is a modern.

00:17:03.460 --> 00:17:04.460
I agree with that.

00:17:04.460 --> 00:17:11.120
But you'll see in a second, easy to use feature rich async API wrapper in Python for that, for

00:17:11.120 --> 00:17:11.460
discord.

00:17:11.740 --> 00:17:16.660
So discord being the, yeah, like the community place, there's a lot of stuff happening there.

00:17:16.660 --> 00:17:21.180
You know, it's a little, feels a slightly different role than slack and teams, but you

00:17:21.180 --> 00:17:25.100
know, kind of more community oriented rather than company oriented, I suppose.

00:17:25.100 --> 00:17:26.960
Although you can sort of do that with slack.

00:17:26.960 --> 00:17:28.980
It's not really like it's focus.

00:17:28.980 --> 00:17:31.500
It's more some of the people jammed it into.

00:17:31.500 --> 00:17:35.240
Like, for example, if you want to save the history of your community and you're doing

00:17:35.240 --> 00:17:37.140
slack, you've got to pay per user.

00:17:37.140 --> 00:17:40.520
But it's like, if it's a public community, like everyone who randomly shows up, you're like

00:17:40.520 --> 00:17:41.720
$8 a month for them too.

00:17:41.720 --> 00:17:42.120
Oh no.

00:17:42.120 --> 00:17:42.440
Right.

00:17:42.440 --> 00:17:46.720
So for lots of reasons for gaming and others, discord is very popular.

00:17:46.720 --> 00:17:51.200
But what you can do is you can create bots for your community that do fun things.

00:17:51.200 --> 00:17:54.660
And this is a way to do that fun and easily in Python.

00:17:54.660 --> 00:17:59.840
So features include a modern async and await API.

00:18:00.240 --> 00:18:05.260
One of the problems apparently you run into is you can overrun your rate limit by being too

00:18:05.260 --> 00:18:05.600
chatty.

00:18:05.600 --> 00:18:08.260
So it has built in like rate limiting.

00:18:08.260 --> 00:18:12.180
So it doesn't destroy, it doesn't get a 409 too many requests errors.

00:18:12.180 --> 00:18:14.160
It has a really cool command extension.

00:18:14.160 --> 00:18:19.380
You'll see in a moment, object oriented and both optimized for speed and memory.

00:18:19.380 --> 00:18:19.880
Okay.

00:18:19.880 --> 00:18:21.100
So that's pretty cool.

00:18:21.100 --> 00:18:25.260
probably the best way to understand is to just check out the quick, quick start.

00:18:25.260 --> 00:18:26.800
So here's a minimal bot.

00:18:26.800 --> 00:18:27.500
Here's what you do, Brian.

00:18:27.560 --> 00:18:32.220
You import to snake and you create a client at with a dis snake dot client.

00:18:32.220 --> 00:18:35.440
And then you call, you create some functions and you decorate them.

00:18:35.440 --> 00:18:38.600
And then you say a client dot run and you give your API token.

00:18:38.600 --> 00:18:41.300
So then you just write regular async functions.

00:18:41.300 --> 00:18:45.320
It handles the execution of the async functions, but they need to be async.

00:18:45.320 --> 00:18:47.940
And you just say, here's an event or on ready.

00:18:47.940 --> 00:18:50.140
Here's an event on message.

00:18:50.140 --> 00:18:55.320
So if somebody sends a message to that community, then it's going to call back into here straight

00:18:55.320 --> 00:18:55.600
away.

00:18:55.600 --> 00:18:56.400
Oh, interesting.

00:18:56.400 --> 00:18:57.040
All right.

00:18:57.060 --> 00:19:01.320
So just this function, this on message function gets called every time a message happens,

00:19:01.320 --> 00:19:05.300
including if the thing itself sends a message or the account itself.

00:19:05.300 --> 00:19:09.620
So it sort of checks to make sure it doesn't go into like some sort of infinite loop where

00:19:09.620 --> 00:19:11.100
it sends out messages.

00:19:11.100 --> 00:19:15.580
If you send a message, but it just checks, Hey, if you send the string dollar, hello, it'll

00:19:15.580 --> 00:19:16.260
send back.

00:19:16.260 --> 00:19:16.600
Hello.

00:19:16.600 --> 00:19:19.100
The dollar means send this to the bot.

00:19:19.100 --> 00:19:19.620
You know what I mean?

00:19:19.620 --> 00:19:19.960
Okay.

00:19:19.960 --> 00:19:21.220
In this world.

00:19:21.220 --> 00:19:23.480
So yeah, that's pretty much how it works.

00:19:23.480 --> 00:19:26.960
It's kind of interesting, but if you look at the commands and it gets,

00:19:26.960 --> 00:19:27.920
way more powerful.

00:19:27.920 --> 00:19:31.640
So the commands are what people would probably think of like what I want to do with a bot.

00:19:31.640 --> 00:19:36.340
So with this minimal bot, what you do is you sync the events like on message and ready and

00:19:36.340 --> 00:19:36.780
such.

00:19:36.780 --> 00:19:41.720
But with the commands, you can go over here to the, you import the bot thing and say at

00:19:41.720 --> 00:19:45.100
decorate another async function at bot decorate command.

00:19:45.220 --> 00:19:46.540
And this one's called foo.

00:19:46.540 --> 00:19:51.700
So when that's the case, you know, it takes arguments and so on in discord, you can write

00:19:51.700 --> 00:19:53.820
dollar foo and then other stuff.

00:19:53.820 --> 00:19:55.280
And that other stuff goes to the argument.

00:19:55.680 --> 00:20:00.160
So all you got to do is have a single function with that name and you put the decorator on

00:20:00.160 --> 00:20:00.260
it.

00:20:00.260 --> 00:20:03.440
And now all of a sudden that's a command in discord that talks to the bot.

00:20:03.440 --> 00:20:04.160
Oh, that's cool.

00:20:04.160 --> 00:20:04.720
Yeah.

00:20:04.720 --> 00:20:05.520
Isn't that easy?

00:20:05.520 --> 00:20:05.840
Yeah.

00:20:05.840 --> 00:20:06.340
Yeah.

00:20:06.640 --> 00:20:07.860
So there's some other examples.

00:20:07.860 --> 00:20:10.820
You can register your bot with a prefix.

00:20:10.820 --> 00:20:16.560
So you could use, I don't know, exclamation versus dollar versus whatever it is you want

00:20:16.560 --> 00:20:16.840
to do.

00:20:16.840 --> 00:20:23.620
And by default, the command name is the same as the function name, but you can also pass

00:20:23.620 --> 00:20:24.080
in a name.

00:20:24.080 --> 00:20:27.620
Like for example, if the name is list, you can't have a function called list because it'll freak

00:20:27.620 --> 00:20:28.560
out what list means.

00:20:28.560 --> 00:20:32.580
So you can give it a name and then use a different function name and so on.

00:20:32.620 --> 00:20:35.120
And then again, passing arguments and such.

00:20:35.120 --> 00:20:38.020
So there's some cool little examples of they're saying dollar test.

00:20:38.020 --> 00:20:38.300
Hello.

00:20:38.300 --> 00:20:40.380
And the documentation bot says, hello.

00:20:40.380 --> 00:20:41.420
And they say dollar test.

00:20:41.420 --> 00:20:42.060
Hello world.

00:20:42.060 --> 00:20:42.840
Hello world.

00:20:42.840 --> 00:20:44.020
So yeah.

00:20:44.020 --> 00:20:44.560
Okay.

00:20:44.560 --> 00:20:49.980
So I was thinking stuff like you could give, give people access to some of these commands.

00:20:49.980 --> 00:20:54.800
Like if you want to subscribe to my newsletter, you could give it a subscribe command with your

00:20:54.800 --> 00:20:56.700
email address and subscribe yourself.

00:20:56.700 --> 00:20:57.440
Yeah.

00:20:57.440 --> 00:20:58.400
You could totally do that.

00:20:58.400 --> 00:21:01.940
And you could just on, on the bot side of things, you have the command.

00:21:02.080 --> 00:21:03.600
It takes an argument, which is the email.

00:21:03.600 --> 00:21:08.460
And then you just use the MailChimp or whatever API to just stick them in there.

00:21:08.460 --> 00:21:08.920
Yeah.

00:21:08.920 --> 00:21:09.180
Yeah.

00:21:09.180 --> 00:21:10.540
And that's running on your server.

00:21:10.540 --> 00:21:12.360
So it can do, you know, all sorts of things.

00:21:12.360 --> 00:21:13.020
Interesting.

00:21:13.020 --> 00:21:13.700
Yeah.

00:21:13.700 --> 00:21:14.260
Cool.

00:21:14.260 --> 00:21:18.320
So if you want to do something with discord and check this out, I haven't, haven't used

00:21:18.320 --> 00:21:20.940
it because I haven't tried to build a bot for discord, but this looks pretty fun.

00:21:20.940 --> 00:21:22.160
So check that out.

00:21:22.160 --> 00:21:22.520
Definitely.

00:21:22.520 --> 00:21:23.080
Yeah.

00:21:23.080 --> 00:21:26.000
So that's our items for today.

00:21:26.000 --> 00:21:29.140
Do you have any, any extras for us?

00:21:29.140 --> 00:21:30.060
I have extras.

00:21:30.060 --> 00:21:30.780
I do.

00:21:30.860 --> 00:21:35.000
I do have extras and I actually came up with another extra while I was thinking about the

00:21:35.000 --> 00:21:35.280
extras.

00:21:35.280 --> 00:21:35.900
So yeah.

00:21:35.900 --> 00:21:36.420
Yeah.

00:21:36.420 --> 00:21:36.960
Okay.

00:21:36.960 --> 00:21:38.820
So some exciting stuff.

00:21:38.820 --> 00:21:40.040
Let me pull my screen back up here.

00:21:40.040 --> 00:21:41.680
What's the order I want.

00:21:41.680 --> 00:21:42.620
Let's talk about this one first.

00:21:42.620 --> 00:21:49.880
So last time I spoke about the modern APIs with FastAPI, MongoDB, Beanie, Python as a in-person

00:21:49.880 --> 00:21:54.100
live course that runs for two weeks that I'm teaching and people can check that out.

00:21:54.100 --> 00:21:55.860
Starts on August 8th.

00:21:55.860 --> 00:21:59.380
So I'll link to that, but that's not my item because that's what I talked about last time.

00:21:59.380 --> 00:22:06.160
What I decided to do is I'm opening up a scholarship program for people who are underrepresented in

00:22:06.160 --> 00:22:10.920
the Python space and programming in general and who maybe also just need a hand up through

00:22:10.920 --> 00:22:11.680
different groups there.

00:22:12.220 --> 00:22:17.200
So if you're a woman in tech or a person of color, or maybe you lost your job and you're

00:22:17.200 --> 00:22:18.300
like, I'm trying to get into programming.

00:22:18.300 --> 00:22:19.840
Maybe this course will help me do that.

00:22:19.840 --> 00:22:21.640
I could try and get into programming as a job.

00:22:21.640 --> 00:22:26.500
Check out the scholarship link that I put in here and I'm saving some spots in that live

00:22:26.500 --> 00:22:28.580
course for people who could benefit from that.

00:22:28.680 --> 00:22:29.320
Oh, that's pretty cool.

00:22:29.320 --> 00:22:29.840
Kudos.

00:22:29.840 --> 00:22:30.480
Nice.

00:22:30.480 --> 00:22:30.720
Yeah.

00:22:30.720 --> 00:22:31.040
Thanks.

00:22:31.040 --> 00:22:31.520
Yeah.

00:22:31.520 --> 00:22:31.860
Thanks.

00:22:31.860 --> 00:22:32.500
Okay.

00:22:32.500 --> 00:22:38.820
Now just, this is fresh, hot off the presses as in is one hour and 30 minutes old.

00:22:38.820 --> 00:22:43.800
We have operation Python 2022 software bundle from humble bundle.

00:22:43.800 --> 00:22:50.620
So we're doing another humble bundle this year and I've got my Git course and a cutter course

00:22:50.620 --> 00:22:56.560
and a Pythonic code course that I put in there for people to take, but there's also 24 other

00:22:56.560 --> 00:23:02.660
topics like some stuff from real Python, some stuff from Rufin Lerner, from PyCharm and so

00:23:02.660 --> 00:23:02.820
on.

00:23:02.820 --> 00:23:04.940
So people can look through there and check that out.

00:23:04.940 --> 00:23:09.920
It's certainly a good way to get a deal on Python educational stuff.

00:23:09.920 --> 00:23:10.380
Nice.

00:23:10.380 --> 00:23:10.940
Cool.

00:23:10.940 --> 00:23:11.740
That's pretty cool.

00:23:11.740 --> 00:23:12.040
All right.

00:23:12.040 --> 00:23:13.840
And here's the one that, yeah, thanks.

00:23:13.840 --> 00:23:14.940
I'm pretty excited about that.

00:23:14.940 --> 00:23:18.080
The last one is I told you about these crazy headphones that I have.

00:23:18.080 --> 00:23:20.780
And I just want to tell people maybe quick about this.

00:23:20.780 --> 00:23:24.020
So I got this thing called Ultimate Ear Fits, UE Fits.

00:23:24.020 --> 00:23:29.040
And there are these fitted earplugs, earbuds, which I'm wearing now, obviously on the YouTube

00:23:29.040 --> 00:23:29.400
channel.

00:23:29.400 --> 00:23:34.220
And what they do is they come really soft and smushy and they're light sensitive and heat

00:23:34.220 --> 00:23:34.520
sensitive.

00:23:34.520 --> 00:23:38.060
You put them in your ear and you press up, you pair them to your phone, you press a button.

00:23:38.060 --> 00:23:42.700
They start blazing out light and heat and they form to the shapes of your ears.

00:23:42.700 --> 00:23:44.500
So Brian, what do you think of that?

00:23:44.500 --> 00:23:47.880
That's, I don't know.

00:23:47.880 --> 00:23:48.380
Unusual, right?

00:23:48.380 --> 00:23:49.680
Yeah, it sounds pretty cool.

00:23:49.680 --> 00:23:52.720
I just don't want it to go too far and to take over my brain.

00:23:52.720 --> 00:23:56.540
What if it's too mushy and it, yes, if it gets in there, you don't know, you can't, can't

00:23:56.540 --> 00:23:56.880
get it out.

00:23:56.880 --> 00:23:57.780
No, it's probably safe.

00:23:57.780 --> 00:23:59.800
Anyway, you and I were talking about that right before we started.

00:23:59.800 --> 00:24:01.540
So I thought I'd just give a quick shout out to that.

00:24:01.540 --> 00:24:01.980
That's kind of fun.

00:24:01.980 --> 00:24:02.920
So how's the sound so far?

00:24:02.920 --> 00:24:03.860
It sounds great.

00:24:03.860 --> 00:24:06.380
It's kind of like you're wearing earplugs.

00:24:06.380 --> 00:24:10.240
So the sound is a little bit blocked out, but then there's a speaker on the inside.

00:24:10.240 --> 00:24:10.700
Okay.

00:24:10.700 --> 00:24:11.220
Nice.

00:24:11.220 --> 00:24:12.020
Yeah.

00:24:12.020 --> 00:24:14.000
Any extras from you?

00:24:14.000 --> 00:24:15.440
I don't have any extras.

00:24:15.440 --> 00:24:16.180
All right.

00:24:16.180 --> 00:24:17.220
Well, let's tell the joke then.

00:24:17.320 --> 00:24:17.460
Okay.

00:24:17.460 --> 00:24:23.980
So this one is a proposed, more of a comment on a proposed idea, which gosh, it probably

00:24:23.980 --> 00:24:25.620
will never happen, but I would wish it would.

00:24:25.620 --> 00:24:31.080
It says, if we're going to unionize and forget wage, increased wages and that kind of stuff.

00:24:31.080 --> 00:24:33.320
I want this instead as a software developer.

00:24:33.440 --> 00:24:40.280
And what it is, is it's a proposed new standard year, which breaks up the year into 13 different

00:24:40.280 --> 00:24:40.740
months.

00:24:40.740 --> 00:24:41.040
Yeah.

00:24:41.040 --> 00:24:45.680
They're all 28 days, which almost exactly rounds out the year.

00:24:45.780 --> 00:24:48.540
So every single month, the first is Sunday.

00:24:48.540 --> 00:24:50.940
The fifth is Thursday.

00:24:50.940 --> 00:24:52.820
The 26th is a Thursday.

00:24:52.820 --> 00:24:55.840
It's always the same year after year after year.

00:24:56.080 --> 00:25:01.540
So you know about the days, you know, how many months it is, how long, if you have 28 days

00:25:01.540 --> 00:25:05.780
or, you know, 45 days from now, you know, it doesn't matter what month you're in on how

00:25:05.780 --> 00:25:07.300
far that pushes you into the next month.

00:25:07.300 --> 00:25:08.580
But there's one day left over.

00:25:08.580 --> 00:25:12.280
It says the day, the one day left over is new year's day.

00:25:12.280 --> 00:25:14.380
It isn't a weekend or a weekday.

00:25:14.380 --> 00:25:15.140
It's magic.

00:25:15.140 --> 00:25:17.340
And on leap years, it's a double vacation day.

00:25:17.340 --> 00:25:18.380
The rest is easy.

00:25:18.540 --> 00:25:19.940
Someone says, I'll see you on the 19th.

00:25:19.940 --> 00:25:20.980
You know, it's on a Thursday.

00:25:20.980 --> 00:25:22.560
Doesn't matter what month or anything.

00:25:22.560 --> 00:25:23.980
What do you think of this?

00:25:23.980 --> 00:25:29.280
I, I've always been a proposal, a proponent to the fixed calendar.

00:25:29.280 --> 00:25:30.320
I think it's a great idea.

00:25:30.320 --> 00:25:34.800
And I'm, I don't remember the history, but I'm pretty sure that we probably started out

00:25:34.800 --> 00:25:39.260
this way because it's the, it's the lunar calendar essentially.

00:25:39.260 --> 00:25:40.140
Yeah.

00:25:40.140 --> 00:25:40.560
Yeah.

00:25:40.560 --> 00:25:41.000
Pretty much.

00:25:41.000 --> 00:25:41.140
Yeah.

00:25:41.140 --> 00:25:45.440
And I thought I read somewhere once that the people were freaked out by the number 13.

00:25:45.440 --> 00:25:47.180
So they dropped it to 12 or something.

00:25:47.300 --> 00:25:49.620
I'm sure somebody in the channel or somebody will.

00:25:49.620 --> 00:25:51.020
I think we could fix it.

00:25:51.020 --> 00:25:52.480
If you just started with zero based.

00:25:52.480 --> 00:25:53.580
Oh, zero to 12.

00:25:53.580 --> 00:25:54.100
Zero to 12.

00:25:54.100 --> 00:25:54.820
That's better.

00:25:54.820 --> 00:25:55.480
Yeah.

00:25:55.480 --> 00:25:56.860
January zero.

00:25:56.860 --> 00:25:57.460
Perfect.

00:25:57.460 --> 00:25:58.820
Exactly.

00:25:58.820 --> 00:25:59.540
Yeah.

00:25:59.540 --> 00:26:01.700
Yeah.

00:26:01.700 --> 00:26:05.760
Anyway, it's sort of a joke, but the comment about it, that's the joke.

00:26:05.760 --> 00:26:06.980
Yeah.

00:26:06.980 --> 00:26:09.240
You got any other jokes you want to share?

00:26:09.240 --> 00:26:09.860
Is that a.

00:26:09.860 --> 00:26:11.080
No, I don't.

00:26:11.080 --> 00:26:11.720
I didn't.

00:26:11.720 --> 00:26:12.540
All right.

00:26:12.540 --> 00:26:13.220
Fantastic.

00:26:13.220 --> 00:26:14.060
Good talking to you again.

00:26:14.060 --> 00:26:16.500
Well, yeah, it's great to talk to you as always.

00:26:17.000 --> 00:26:17.620
Thanks for being here.

00:26:17.620 --> 00:26:19.080
Thanks everyone for being out in the audience.

00:26:19.080 --> 00:26:19.420
Yeah.

00:26:19.420 --> 00:26:19.840
Thank you.

00:26:19.840 --> 00:26:20.240
Bye.