WEBVTT

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

00:00:05.640 --> 00:00:10.200
This is episode 260, recorded November 19th, 2021.

00:00:10.200 --> 00:00:11.560
I'm Michael Kennedy.

00:00:11.560 --> 00:00:12.920
And I'm Brian Okken.

00:00:12.920 --> 00:00:13.860
I'm Chris Petty.

00:00:13.860 --> 00:00:15.720
Chris, welcome to the podcast.

00:00:15.720 --> 00:00:20.700
You're a podcast veteran, but the first time here on Python Bytes.

00:00:20.700 --> 00:00:21.400
Happy to have you here.

00:00:21.400 --> 00:00:22.840
Thank you very much.

00:00:22.840 --> 00:00:23.780
It's a pleasure to be here.

00:00:23.780 --> 00:00:24.860
It's good to be back.

00:00:24.860 --> 00:00:29.040
We're going to jump into a bunch of the news, but before we do, you know, tell people a bit about yourself.

00:00:29.040 --> 00:00:29.840
Absolutely.

00:00:30.320 --> 00:00:35.740
I've been in the tech business for about 35 years now, something like that.

00:00:35.740 --> 00:00:42.460
And I've been a self-identifying Pythonista for about the last five or six years.

00:00:42.460 --> 00:00:44.880
I work for these days.

00:00:44.880 --> 00:00:49.040
I work for just recently changed jobs within Amazon.

00:00:49.040 --> 00:00:52.600
I used to work for the Web Services Elastic File System team.

00:00:52.600 --> 00:00:54.060
And I now work.

00:00:54.060 --> 00:00:59.240
I switched gears from, you know, living in the clouds to living in the Amazon Fulfillment

00:00:59.240 --> 00:00:59.640
centers.

00:00:59.640 --> 00:01:01.100
We're now a network.

00:01:01.100 --> 00:01:02.300
So does that mean you're doing what?

00:01:02.300 --> 00:01:04.480
Like programming in COBOL or are we using now?

00:01:04.480 --> 00:01:05.940
Yeah.

00:01:05.940 --> 00:01:07.860
Nothing but COBOL and Fortran.

00:01:07.860 --> 00:01:09.980
Just all the worst, all the most possible.

00:01:09.980 --> 00:01:10.720
You know, not at all.

00:01:10.720 --> 00:01:16.900
We do, my team, OpsTech IT, we do network automation for infrastructure.

00:01:17.400 --> 00:01:19.040
So it's a lot of fun, actually.

00:01:19.040 --> 00:01:24.840
It's really kind of neat going from building microservices and things like that, being infrastructure

00:01:24.840 --> 00:01:30.540
oriented at that level to like working with being responsible for automating things like,

00:01:30.540 --> 00:01:37.580
you know, network protocols, DNS, DHCP, fun stuff like that at scale in the fulfillment centers.

00:01:37.580 --> 00:01:38.720
It's a really cool gig.

00:01:38.720 --> 00:01:39.220
Yeah.

00:01:39.220 --> 00:01:40.360
That sounds really interesting.

00:01:40.360 --> 00:01:44.860
And you get an interface with physical things that go physical places, which is interesting.

00:01:44.860 --> 00:01:46.200
It really is.

00:01:46.200 --> 00:01:46.920
Thank you.

00:01:46.920 --> 00:01:48.140
I only ship beds.

00:01:48.140 --> 00:01:48.620
I don't know.

00:01:48.620 --> 00:01:51.300
Brian, you also, you also work on physical things.

00:01:51.300 --> 00:01:51.960
Yeah.

00:01:52.180 --> 00:01:54.800
I like working with actual, we make things.

00:01:54.800 --> 00:01:55.460
It's nice.

00:01:55.460 --> 00:01:56.260
Yeah, absolutely.

00:01:56.260 --> 00:01:57.760
It's a nice change of pace.

00:01:57.760 --> 00:01:58.400
Yeah.

00:01:58.400 --> 00:01:59.200
It's all I've known.

00:01:59.200 --> 00:02:03.240
Out in the audience, Ned Batchelder.

00:02:03.240 --> 00:02:03.640
Hey, Ned.

00:02:03.640 --> 00:02:04.280
Thanks for being here.

00:02:04.280 --> 00:02:06.040
Does Chris Boston represent?

00:02:06.040 --> 00:02:06.800
Hey, Ned.

00:02:06.800 --> 00:02:06.980
Yeah.

00:02:06.980 --> 00:02:08.960
Ned is amazing.

00:02:08.960 --> 00:02:14.080
He does so much work with Boston Python and I can't wait till we can get back to actually

00:02:14.080 --> 00:02:17.440
like being in a room together with other people again.

00:02:17.440 --> 00:02:19.480
I know.

00:02:19.480 --> 00:02:20.000
Absolutely.

00:02:20.700 --> 00:02:26.560
So, Brian, I used to feel like a cog in the machine, but now I work at a pretty small

00:02:26.560 --> 00:02:29.320
company where I make a lot of the choices, so I don't have to feel like that.

00:02:29.320 --> 00:02:34.320
But, you know, I think we're going to talk about something that I think is awesome because

00:02:34.320 --> 00:02:35.020
Ned is here.

00:02:35.020 --> 00:02:36.820
Yeah, it's kind of nice that Ned's here.

00:02:36.820 --> 00:02:38.300
We picked this just for you, Ned.

00:02:38.300 --> 00:02:43.640
But the, so Ned, one of the, Ned does a lot of stuff for Python.

00:02:43.640 --> 00:02:49.900
And one of the things that he's done is this cool tool called Cog, which I've been watching

00:02:49.900 --> 00:02:54.500
for a while, but I haven't had a really good reason to use.

00:02:54.500 --> 00:03:01.660
But what cog does is you point it, you can have these cog, like these, it's like three

00:03:01.660 --> 00:03:05.200
brackets and the cog word and then some code.

00:03:05.200 --> 00:03:08.480
And then, then another magic incantation at the end.

00:03:08.480 --> 00:03:11.100
It's pretty simple, but it's hard to explain.

00:03:11.240 --> 00:03:12.060
But you have some code.

00:03:12.060 --> 00:03:16.800
And when you point cog at it, it will run the code and then put the output of the code

00:03:16.800 --> 00:03:18.500
somewhere else where you put it to.

00:03:18.500 --> 00:03:20.060
So, seems neat.

00:03:20.060 --> 00:03:21.240
I wanted to use it.

00:03:21.240 --> 00:03:25.460
And, but I didn't know what a use case I would use it for.

00:03:25.460 --> 00:03:32.540
Well, Simon Willison wrote this article called Using Cog to Update Help, the help output for

00:03:32.540 --> 00:03:33.780
a markdown readme file.

00:03:33.940 --> 00:03:35.100
And I think this is brilliant.

00:03:35.100 --> 00:03:37.500
So, this is super awesome use case.

00:03:37.500 --> 00:03:47.100
So, Simon, he even has it going up on his CSVS to SQLite project.

00:03:47.580 --> 00:03:54.040
And the idea is you've got at the end, the end of the project, he actually lists on the

00:03:54.040 --> 00:03:56.220
readme, he lists the help output.

00:03:56.220 --> 00:04:01.340
Now, I actually have a project that the help output is out of date because the way I deal

00:04:01.340 --> 00:04:03.600
with it is I run the help and then copy and paste.

00:04:03.600 --> 00:04:09.600
But this is, Simon's right, this is a great use for cog to just point cog at it.

00:04:09.600 --> 00:04:14.820
So, so he wrote a little snippet of code that goes in his readme.

00:04:14.820 --> 00:04:21.500
And since cog ignores comments, you can put it in an HTML comment block.

00:04:21.500 --> 00:04:25.280
And it, so cog will run that file and took the output and stick it out.

00:04:25.280 --> 00:04:27.160
And then Simon didn't stop there.

00:04:27.160 --> 00:04:32.100
He said, I want to make sure that this gets run when it needs to get run.

00:04:32.100 --> 00:04:39.080
So, he wrote a test in pytest, of course, to check to see if cog needs to be written.

00:04:39.080 --> 00:04:41.200
So, this is just, this is really pretty cool.

00:04:41.200 --> 00:04:41.920
I like it.

00:04:41.920 --> 00:04:44.100
This is the kind of thing that's, it's so cool.

00:04:44.100 --> 00:04:45.520
Pardon me, Mike.

00:04:45.520 --> 00:04:51.540
This is the kind of thing that's so cool because anytime you can eliminate a DIY, right?

00:04:51.540 --> 00:04:57.840
Anytime you can make one thing, the one true source of whatever piece of the puzzle you're

00:04:57.840 --> 00:05:00.340
looking to, to, to, to build you with.

00:05:00.340 --> 00:05:01.940
And this is a great example of that.

00:05:01.940 --> 00:05:02.440
Yeah.

00:05:02.800 --> 00:05:05.540
Out in the audience, a little light, a real-time feedback.

00:05:05.540 --> 00:05:13.060
Ned says, I also just updated the coverage and cog docs to do the same thing and to get help output into the docs.

00:05:13.060 --> 00:05:13.760
Nice.

00:05:13.760 --> 00:05:14.420
Yeah.

00:05:14.420 --> 00:05:14.940
Very cool.

00:05:14.940 --> 00:05:17.260
I love the inception of it.

00:05:17.260 --> 00:05:17.680
Yeah.

00:05:17.680 --> 00:05:19.780
This is definitely a cool project.

00:05:20.060 --> 00:05:22.800
I want to take you all on a journey.

00:05:22.800 --> 00:05:26.880
Come with me into the world of bank Python.

00:05:26.880 --> 00:05:27.620
My drink.

00:05:27.620 --> 00:05:30.660
This, this is an interesting article here.

00:05:30.660 --> 00:05:37.900
It's one of these things that says, I can't exactly tell you precisely where I worked or what we did.

00:05:37.960 --> 00:05:41.440
And I have to make up names for the projects that are not the actual names.

00:05:41.440 --> 00:05:43.400
It's by Cal Patterson.

00:05:43.400 --> 00:05:48.420
And it says the strange world of Python as used by big investment banks.

00:05:48.420 --> 00:05:51.580
So this is quite the read.

00:05:51.580 --> 00:05:57.560
If you go through it, if you click the little reader bit here, it says, you know, 30 minutes of reading time to read it.

00:05:57.560 --> 00:06:06.040
So it's, it is a non-trivial bit of history, but let me see if I can give you some of, some of the highlights that I took from this.

00:06:06.060 --> 00:06:08.460
And you can go read it if you really feel like you want to dive into it.

00:06:08.460 --> 00:06:14.640
So one of the things they talk about is the database and all these things have interesting names.

00:06:14.640 --> 00:06:18.200
I'm sure that they have actual interesting names as well that are not these names.

00:06:18.200 --> 00:06:21.880
So for example, like the database like system is called Barbara.

00:06:21.880 --> 00:06:34.020
And I guess the place to start here with this oral history that Cal talks about is that bank Python implementations are basically forks of the entire Python ecosystem.

00:06:34.300 --> 00:06:42.480
Not just a fork of CPython, but like the libraries that it uses and everything, which are used at many, but not all of the biggest investment banks.

00:06:42.480 --> 00:06:46.380
So it says, let's talk about this system called Minerva.

00:06:46.380 --> 00:06:47.360
Minerva.

00:06:47.760 --> 00:06:51.620
And it's a global database of Python objects.

00:06:51.620 --> 00:06:54.180
And Barbara is this way to talk to it.

00:06:54.180 --> 00:06:54.560
Okay.

00:06:54.560 --> 00:06:57.040
So a lot of interesting keywords to keep it hidden.

00:06:57.040 --> 00:06:57.260
Right.

00:06:57.260 --> 00:07:07.280
But one of the things that's wild, this Barbara thing is it's like a hierarchical database that stores basically zipped pickle objects.

00:07:07.280 --> 00:07:08.600
Wait, wait, what?

00:07:09.160 --> 00:07:14.520
So it's in, when I say hierarchical, I mean, it's in what they call rings.

00:07:14.520 --> 00:07:22.140
So you would talk to a database and there might be like a nearby replica that you talk to that might have a record or it might not.

00:07:22.260 --> 00:07:27.440
And so then there's like a bigger replica, a sort of fallback to go look in this place.

00:07:27.440 --> 00:07:29.380
And if it's not there, go back and look at another one.

00:07:29.380 --> 00:07:30.600
They call these rings.

00:07:30.980 --> 00:07:35.000
And then you would ask for something by its key and then you get it back.

00:07:35.000 --> 00:07:39.940
So first of all, what do you guys think of just pickling all of your data objects?

00:07:39.940 --> 00:08:00.320
It's really, I, that, that bit made me chuckle because it is exactly this, the kind of like at the time, pragmatic engineering trade-off that somebody made right years ago before we all saw pickles as the great villain of the Python ecosystem.

00:08:00.320 --> 00:08:07.040
Before we knew that there could be downsides to pickling all the things and they're like, well, it's perfect.

00:08:07.040 --> 00:08:07.680
Pickle idea.

00:08:07.680 --> 00:08:08.560
What more could you want?

00:08:08.560 --> 00:08:10.000
And now we're all just kind of looking at it.

00:08:10.000 --> 00:08:10.600
It's so simple.

00:08:10.600 --> 00:08:11.380
It's small.

00:08:11.380 --> 00:08:12.160
It's fast.

00:08:12.160 --> 00:08:12.560
Yeah.

00:08:12.560 --> 00:08:13.660
Yeah.

00:08:13.660 --> 00:08:14.720
How do you index something?

00:08:14.720 --> 00:08:16.000
Actual database.

00:08:16.000 --> 00:08:17.220
Just curious.

00:08:17.220 --> 00:08:17.940
Yeah.

00:08:17.940 --> 00:08:19.020
This is a fine question.

00:08:19.020 --> 00:08:20.000
They do.

00:08:20.000 --> 00:08:23.720
If you read it, they do also use databases sometimes.

00:08:23.720 --> 00:08:24.460
Okay.

00:08:24.460 --> 00:08:28.620
So, but the primary way seems to be this, this system called Barbara.

00:08:28.900 --> 00:08:35.020
So one of the things that comes to mind for me here is, oh my gosh, what if you upgrade something?

00:08:35.020 --> 00:08:43.840
What if you change the file, the structure in code of something that you put in the database five years ago?

00:08:43.840 --> 00:08:44.920
Whoops.

00:08:44.920 --> 00:08:46.200
Yeah.

00:08:46.200 --> 00:08:46.980
Yeah.

00:08:46.980 --> 00:08:51.000
That used to be, you know, signed up for the mailing list.

00:08:51.000 --> 00:08:51.580
Yes or no.

00:08:51.580 --> 00:08:55.780
And now when you change the order that yes or no became yes or no is admin.

00:08:55.780 --> 00:08:56.780
Oh, oops.

00:08:56.780 --> 00:09:01.440
Or it just doesn't match anymore and it crashes and you can't read your data because it's incompatible.

00:09:01.440 --> 00:09:06.140
So this would happen with Python, the runtime, but also the libraries you're using, it seems to me.

00:09:06.140 --> 00:09:08.820
And it's just incredibly unstable.

00:09:09.660 --> 00:09:19.420
How much you want to make a bet they also have like some kind of really highly evolved over many years validation system that ensures that the, that's good.

00:09:19.420 --> 00:09:24.920
That the pickles that you think are being used in the way that you think they're being used are actually still used that way.

00:09:24.920 --> 00:09:25.460
Yeah.

00:09:25.460 --> 00:09:26.160
Yeah, exactly.

00:09:26.160 --> 00:09:27.700
There's got to be layers.

00:09:28.300 --> 00:09:32.500
Sam out in the live, in the audience live stream says, good luck upgrading a new Python.

00:09:32.500 --> 00:09:33.540
Yeah, exactly.

00:09:33.540 --> 00:09:34.480
Yeah.

00:09:34.480 --> 00:09:35.580
Like as in never.

00:09:35.580 --> 00:09:40.380
And that's probably why part of it is like, yeah, we just forked it and froze it because that's crazy.

00:09:40.380 --> 00:09:41.580
Let me show you something else.

00:09:41.580 --> 00:09:44.500
I will, try to jump around the article by a search.

00:09:44.500 --> 00:09:45.260
Cause I took notes.

00:09:45.260 --> 00:09:55.360
Applications also commonly store their internal state in Barbara, writing data classes straight into and out of Barbara with very simple locking and transactions.

00:09:55.700 --> 00:10:06.620
If not, and one of the things they decided is there's no file system available to these, to this platform and the little bits of data that the script picks gets picked up and outputs.

00:10:06.620 --> 00:10:11.680
It all just goes back into this key value store pickled database thing called Barbara.

00:10:11.680 --> 00:10:12.860
That's pretty wild, right?

00:10:12.860 --> 00:10:13.520
Yeah.

00:10:13.520 --> 00:10:14.240
Okay.

00:10:14.240 --> 00:10:21.260
they also talk about having these overlay features, which, is pretty wild.

00:10:21.260 --> 00:10:24.700
This has to do with the different rings that I talked about.

00:10:24.780 --> 00:10:30.680
So when you connect, you can say, I want to connect to the middle office ring and then the FICC ring and then the default ring.

00:10:30.680 --> 00:10:37.140
So then when you do a database query, which by the way, it looks like a dictionary index, just bracket key.

00:10:37.140 --> 00:10:40.800
It first is going to look for it in the middle office database.

00:10:40.800 --> 00:10:44.960
And then it's going to look in the FICC database and then the default database.

00:10:44.960 --> 00:10:48.960
So there's like these layers of settings and these layers of specificity.

00:10:49.680 --> 00:10:54.000
And they, they even do things that are to some effect of like monkey patching.

00:10:54.000 --> 00:11:00.240
Like if you, if you need to change it, you can have like your dev ring and then the middle office ring and then the outer ring.

00:11:00.240 --> 00:11:04.060
And you could change the value and kind of like for mocking or something.

00:11:04.060 --> 00:11:08.180
so yeah, to your point, Brian, they say there are some good reasons.

00:11:08.240 --> 00:11:10.080
There are some good reasons not to use Barbara.

00:11:10.080 --> 00:11:14.720
If your data, let me count the ways.

00:11:14.720 --> 00:11:24.520
If your data set is a large, it may be a good idea to look elsewhere, perhaps in a traditional SQL database or a KDB plus, which I have no idea what that is.

00:11:24.840 --> 00:11:33.260
there's a limit on the size of Barbara objects, which is compressed at when it's zipped 16 megs or, smaller, which is pretty interesting.

00:11:33.260 --> 00:11:42.280
And then paired with this is this direct, this thing called dagger, which is a directed acyclic graph that allows you to set up relationships between instruments.

00:11:42.280 --> 00:11:46.280
Like, okay, I've got a bond and then I've got a credit default swap on that bond.

00:11:46.280 --> 00:11:51.980
And then I've got like a fund of default swaps or, you know, like this whole layer of stuff.

00:11:51.980 --> 00:12:03.580
And all of these things are like linked objects through these pickled things that you can ask questions about and like, get sort of like graph database type things.

00:12:03.580 --> 00:12:05.000
That's pretty interesting.

00:12:05.000 --> 00:12:12.020
they talk a lot about how you model these things, like class, like instruments and swaps and stuff and Python.

00:12:12.020 --> 00:12:16.420
And that's not super interesting, but, I wanted to highlight this section and see what y'all thought.

00:12:16.420 --> 00:12:33.180
It says, if you understand, if you understand, Excel, you'll be starting to recognize how a lot of the stuff here works in Excel spreadsheets their cells and they have dependencies, which is like an acyclic graph, like this dagger hierarchy, graph database thing has.

00:12:33.180 --> 00:12:35.200
and it has a lot.

00:12:35.200 --> 00:12:38.940
So they basically modeled so much of the code around how Excel works.

00:12:38.940 --> 00:12:41.900
So you model the data first and then the behavior rather.

00:12:41.900 --> 00:12:45.720
Usually we write code and then we have data that comes out of it.

00:12:45.720 --> 00:12:48.100
So it's, it's pretty interesting.

00:12:48.100 --> 00:12:52.540
There's also this thing called a wall pole, which is a database runner.

00:12:52.540 --> 00:12:56.660
So when you get to this section, it says it's time to drop a bit of a bombshell.

00:12:56.660 --> 00:12:59.780
Let's talk about deployment, versioning, et cetera.

00:13:00.000 --> 00:13:06.460
The source code of the source code of this entire system itself, even including a Barbara is stored in Barbara, not on disk.

00:13:06.460 --> 00:13:07.460
And it remains composed.

00:13:07.460 --> 00:13:11.900
And it's kept in a special Barbara ring called source code.

00:13:11.900 --> 00:13:15.720
All right.

00:13:15.720 --> 00:13:16.700
What do you all think of that?

00:13:18.140 --> 00:13:20.740
My hidden release engineer has left the building.

00:13:20.740 --> 00:13:23.060
Oh man.

00:13:23.060 --> 00:13:23.660
That's frightening.

00:13:23.660 --> 00:13:24.220
Yeah.

00:13:24.220 --> 00:13:27.820
So, not keeping the source code in the file system breaks some assumptions.

00:13:27.820 --> 00:13:29.600
Like how does the program run?

00:13:29.600 --> 00:13:30.100
Yeah.

00:13:30.160 --> 00:13:35.660
So this wall pole thing runs, it's built to basically run source code that originates from a database.

00:13:35.660 --> 00:13:37.980
And you, it's all one huge database.

00:13:37.980 --> 00:13:46.440
So like, if you think mono repo, it's like that because you import from database and it's just like, whatever you need is there.

00:13:46.520 --> 00:13:55.380
So versioning, it's like the anti microservice, basically the entire whole thing is literally there.

00:13:55.380 --> 00:13:59.220
And then the way that you deploy it, let's see there, they talked about vouch.

00:13:59.220 --> 00:14:07.740
So the way that you deploy to it is really interesting in that you, it reminds me of the, it works on my machine certification program.

00:14:07.740 --> 00:14:14.600
So the way you deploy to the system is you just commit it to the database and boom, it's deployed.

00:14:14.600 --> 00:14:15.620
It's running, right?

00:14:15.620 --> 00:14:17.660
Because there's only one place the code lives.

00:14:17.660 --> 00:14:18.340
It's in the database.

00:14:18.340 --> 00:14:21.040
So once you do a commit, that's a full on deployment.

00:14:21.040 --> 00:14:23.520
Now, how does it get into there?

00:14:23.520 --> 00:14:30.220
There's a vouch system where you can get somebody who can code review what you've done and say, yeah, I vouch for this.

00:14:30.220 --> 00:14:35.560
You can commit it unless you have a high reputation for not breaking the system.

00:14:35.560 --> 00:14:38.500
In which case you can directly commit to it without question.

00:14:41.640 --> 00:14:45.240
So I guess the culture of code review is not like a thing there.

00:14:45.240 --> 00:14:47.540
I, I guess.

00:14:47.540 --> 00:14:54.900
so another interesting knock on that comes from storing your code in a database is how do you edit it?

00:14:54.900 --> 00:14:55.060
Right?

00:14:55.060 --> 00:14:56.380
Like what editor to use?

00:14:56.380 --> 00:14:57.800
VI won't work on it.

00:14:57.800 --> 00:14:59.060
PyCharm won't work on it.

00:14:59.060 --> 00:15:02.200
VS Code won't work on it because those work on files.

00:15:02.420 --> 00:15:11.380
So, this Minerva system has its own IDE because most IDEs think you have files, not databases that contain the data.

00:15:11.380 --> 00:15:14.660
Does that make sense?

00:15:14.660 --> 00:15:15.360
It is.

00:15:15.360 --> 00:15:16.180
That makes sense.

00:15:16.180 --> 00:15:16.540
It really is.

00:15:16.540 --> 00:15:20.520
The guy, Cal says, what I can't understand is why does it contain its own web framework?

00:15:20.520 --> 00:15:26.420
Investment banks have a, a one way approach to open source software.

00:15:26.700 --> 00:15:29.560
Some of it can come in, but none of it can go out.

00:15:29.560 --> 00:15:38.540
Well, I, I've seen, I've seen projects that like, like, people building IDEs within a company.

00:15:38.540 --> 00:15:40.980
And I always shake my head.

00:15:40.980 --> 00:15:43.400
It's like, why you, this isn't your business.

00:15:43.400 --> 00:15:46.060
Why are you making an IDE within your company?

00:15:46.060 --> 00:15:47.240
There are a couple of things.

00:15:47.240 --> 00:15:49.380
There are a couple of things that strike me from this article.

00:15:49.540 --> 00:15:52.780
The first is as I read it, cause I really enjoyed it.

00:15:52.780 --> 00:15:54.120
Did you read the whole thing?

00:15:54.120 --> 00:15:56.620
I, most, it's long, right?

00:15:56.620 --> 00:15:57.000
It's the way through.

00:15:57.000 --> 00:15:57.340
It is.

00:15:57.340 --> 00:15:58.080
It's crazy, right?

00:15:58.080 --> 00:15:59.080
It really is.

00:15:59.080 --> 00:15:59.800
It really is.

00:15:59.800 --> 00:16:10.040
The thing that struck me is this is a perfect example of large organization, complex, code base and engineering system.

00:16:10.040 --> 00:16:11.020
And tie.

00:16:11.020 --> 00:16:21.820
Cause this really just smells like something that just got like built up, like, you know, the layers of rings around a tree over time engineer after engineer year after year making decisions.

00:16:21.940 --> 00:16:35.740
And I'm sure like in the modern day, everyone who walks to the door, they probably have to plan for the period of time where the new engineer just freaks out when they tell them all this dumb as they adjust to the new reality that they're being exposed to.

00:16:35.740 --> 00:16:36.380
Yeah.

00:16:36.380 --> 00:16:44.580
And that is in some sense, this is a particular wacky case, but it's that way in kind of every large corporate environment in a, in a way.

00:16:44.580 --> 00:16:44.960
That's true.

00:16:44.960 --> 00:16:46.040
Yeah, that's totally true.

00:16:46.500 --> 00:16:55.140
He actually, Cal actually discusses this a little bit here and says, this fact that you can't do very much of open source, you're stuck on some version of Python.

00:16:55.140 --> 00:16:58.980
That's never going to see, never going to go back to sync with the real Python.

00:16:58.980 --> 00:17:02.240
Cause how do you even do a database migration to that thing?

00:17:02.240 --> 00:17:07.820
Says it could be the biggest disadvantage for you as your profession.

00:17:07.820 --> 00:17:14.780
Every year you spend in the Minerva monoculture, the skills you need to interact with normal software atrophy.

00:17:15.040 --> 00:17:21.680
By the time I left, I had pretty much forgotten how to wrestle pip in virtual EMV into shape essential skills for normal Python.

00:17:21.680 --> 00:17:27.620
When everything is in the same repo and all the code is just an import away, software packaging just does not come up.

00:17:27.620 --> 00:17:36.500
So yeah, there's a lot of, that's one way to deal with retention is to have a system where people, need to be skilled to use it.

00:17:36.500 --> 00:17:40.640
And, it removes all of their other skills so they can't get another job.

00:17:40.640 --> 00:17:47.520
Oh, I was just about to say, this seems like a retention at it pattern to me, but, you know,

00:17:47.520 --> 00:17:54.580
It depends on which side of, of that, leave stay story you're on.

00:17:54.580 --> 00:17:59.140
Because if your job is like, I want job security and I don't want to have to learn new things.

00:17:59.140 --> 00:18:02.780
Like welcome to Minerva, whatever this is, right?

00:18:02.780 --> 00:18:03.700
You're, you're home.

00:18:03.700 --> 00:18:05.380
You can stay here forever.

00:18:05.380 --> 00:18:06.760
They won't replace you.

00:18:06.960 --> 00:18:10.780
On the other hand, if you want to use like FastAPI, you're like, I got to get out of here.

00:18:10.780 --> 00:18:14.280
We can't be on, you know, Python two, three this long.

00:18:14.280 --> 00:18:14.940
I'm out.

00:18:14.940 --> 00:18:16.360
Off.

00:18:16.360 --> 00:18:23.720
So I did want to mention that both Minerva and Barbara are things that you can pip install, but those aren't things we're talking about.

00:18:23.720 --> 00:18:26.080
No, these are like secret code names.

00:18:26.080 --> 00:18:29.440
I suspect the Minerva you installed doesn't have its own ID.

00:18:29.440 --> 00:18:30.780
I'm just guessing.

00:18:30.780 --> 00:18:31.020
Right.

00:18:31.020 --> 00:18:31.500
Yeah.

00:18:31.500 --> 00:18:35.900
there's a lot of, a lot of interesting conversation here about this.

00:18:36.060 --> 00:18:38.080
just a quick little note.

00:18:38.080 --> 00:18:40.180
I actually ended up, I'm like, it was late last night.

00:18:40.180 --> 00:18:43.580
I'm like, I don't want to read this like 30 minute thing, but I do want to talk about it tomorrow.

00:18:43.580 --> 00:18:45.700
So I actually use this thing called natural reader.

00:18:45.700 --> 00:18:48.060
You can just throw this in here and it'll just like read it back.

00:18:48.060 --> 00:18:48.760
Super nice.

00:18:48.760 --> 00:18:49.700
That's so cool.

00:18:49.700 --> 00:18:53.820
So I was, it was like 1130 last night when I started on this.

00:18:53.820 --> 00:18:56.800
I'm like, Oh, I'm a little too tired to focus on this much stuff.

00:18:56.800 --> 00:18:58.760
But, yeah, it's pretty nice.

00:18:58.760 --> 00:19:02.240
You may have just made my day because I actually, you know, being part.

00:19:02.240 --> 00:19:02.460
Yeah.

00:19:02.460 --> 00:19:05.160
Because being partially blind, I feel like, you know,

00:19:05.160 --> 00:19:08.600
like, you know how some people who have like lupus and other kinds, they talk about spoons.

00:19:08.600 --> 00:19:10.240
Like they only have so much energy.

00:19:10.240 --> 00:19:14.040
My eyes only have so much like ice cream spoons.

00:19:14.040 --> 00:19:14.640
Yeah.

00:19:14.640 --> 00:19:17.760
In the course of any one day that I can, I can do it.

00:19:17.760 --> 00:19:21.980
There are times when I'm like, I cannot stare at a screen for even a moment longer.

00:19:21.980 --> 00:19:27.020
And I really love things like audio books or the rare services like pocket that will actually

00:19:27.020 --> 00:19:27.980
read you articles.

00:19:28.160 --> 00:19:32.800
And so this sounds like an awesome tool for those things that don't have that feature

00:19:32.800 --> 00:19:33.140
already.

00:19:33.140 --> 00:19:33.720
Nice.

00:19:33.720 --> 00:19:34.520
It's, it's really neat.

00:19:34.520 --> 00:19:36.940
It has different, different modes.

00:19:36.940 --> 00:19:40.000
I don't know how to make this thing come up without creating an account because I don't

00:19:40.000 --> 00:19:44.580
want to know what my login is here, but it has like, if, if you're dyslexic, it has like

00:19:44.580 --> 00:19:47.560
a dyslexic font you can turn on and it'll highlight as you write.

00:19:47.560 --> 00:19:48.900
It's, it's, it's pretty neat.

00:19:49.140 --> 00:19:50.960
That's so, yeah, cool.

00:19:50.960 --> 00:19:54.340
Not directly related, but I've found it to be useful in doing this research.

00:19:54.340 --> 00:19:55.640
I was too tired.

00:19:55.640 --> 00:19:58.260
A little bit of audience interaction here.

00:19:58.260 --> 00:20:02.220
Brandon says run, run the source code from a database.

00:20:02.220 --> 00:20:04.040
That's a one heck of an injection attack.

00:20:04.040 --> 00:20:04.280
Yeah.

00:20:04.280 --> 00:20:07.000
I mean, little Bobby tables would be just all over this thing, right?

00:20:07.000 --> 00:20:10.300
It's one big injection risk.

00:20:10.300 --> 00:20:15.660
Although on the other hand, I feel there might be some big safety here as well because everything

00:20:15.660 --> 00:20:16.260
is pickled.

00:20:16.640 --> 00:20:21.540
you've got to know what version of Python they forked it from and any variations.

00:20:21.540 --> 00:20:25.480
They may be changed to the object model to even get it, to parse it back.

00:20:25.480 --> 00:20:29.520
So it might be naturally safe as it's just like an opaque, it's almost like encryption.

00:20:29.520 --> 00:20:34.720
Really, really, really weak encryption.

00:20:34.720 --> 00:20:35.660
Yeah.

00:20:35.660 --> 00:20:37.180
And then let's see.

00:20:37.180 --> 00:20:37.760
Yeah.

00:20:37.760 --> 00:20:39.140
David says absolutely.

00:20:39.140 --> 00:20:42.220
Everyone in the live audience has a furrowed brow right now.

00:20:42.220 --> 00:20:46.520
yes, David, or, or some like.

00:20:46.520 --> 00:20:47.580
Nervous laughter.

00:20:47.580 --> 00:20:48.000
Yeah.

00:20:48.000 --> 00:20:50.940
There is one serious, serious aspect of this though.

00:20:50.940 --> 00:20:56.200
We're talking about like retention and, and the article talks about like, as he worked

00:20:56.200 --> 00:21:01.060
up in this, in this private ecosystem, he felt his external skills atrophying.

00:21:01.060 --> 00:21:04.200
That is a common problem that I have heard.

00:21:04.200 --> 00:21:10.680
So many people who work in these large kind of like pocket universes, whether it's an Amazon

00:21:10.680 --> 00:21:16.220
or a Google or a Microsoft or an IBM or whatever people, people, people can kind of feel very

00:21:16.220 --> 00:21:22.500
disconnected from where the field is currently going at the hot leading edge in the outside

00:21:22.500 --> 00:21:23.060
world.

00:21:23.060 --> 00:21:27.940
And, and I think it's a real issue because you can't always justify pulling in the latest,

00:21:27.940 --> 00:21:28.320
greatest.

00:21:28.320 --> 00:21:33.940
Sometimes there are engineering or earing implications to that, that would be really problematic to your

00:21:33.940 --> 00:21:35.520
businesses bottom line.

00:21:35.520 --> 00:21:42.680
And so I say, and I realized time is, is finite and it's, this is hard, but this is where I

00:21:42.680 --> 00:21:48.080
say even dabbling in having side projects, even if it's just the kind of thing you do on weekend,

00:21:48.080 --> 00:21:53.440
every once in a while, when you have time, it's a great way to sort of like feel unconstrained

00:21:53.440 --> 00:21:59.400
by the requirements of your business and to go sort of play on your own terms.

00:21:59.400 --> 00:22:04.020
I mean, write helper scripts for yourself, even for your job in, in modern Python.

00:22:04.020 --> 00:22:04.640
Bingo.

00:22:04.640 --> 00:22:05.820
Yeah, absolutely.

00:22:05.820 --> 00:22:07.120
Good, good advice.

00:22:07.120 --> 00:22:07.460
Indeed.

00:22:07.460 --> 00:22:08.080
All right.

00:22:08.080 --> 00:22:08.940
Over to you, Chris.

00:22:08.940 --> 00:22:09.660
Okay.

00:22:09.660 --> 00:22:10.120
Thank you.

00:22:10.120 --> 00:22:16.400
So I decided I was thinking about this and thinking about the fact that, you know,

00:22:16.400 --> 00:22:22.640
most of the people who come in and our guests here on this podcast are really sort of accomplished

00:22:22.640 --> 00:22:26.400
hardcore Python programmers and they're familiar with the latest and greatest tools.

00:22:26.400 --> 00:22:29.000
There is no way that I'm going to scoop you all.

00:22:29.000 --> 00:22:34.620
So I decided to go a completely different direction and go in the direction.

00:22:34.620 --> 00:22:35.700
That's right.

00:22:35.700 --> 00:22:36.200
Exactly.

00:22:36.200 --> 00:22:41.560
Of, of the whimsical side of computing, because I think we all need to stay in touch with that.

00:22:41.560 --> 00:22:46.880
I know I had a, an issue a number of months ago, before I changed jobs where I was feeling

00:22:46.880 --> 00:22:51.600
very burned out and I felt like I just, I need to sort of get back in touch with like, why am I

00:22:51.600 --> 00:22:55.180
passionate about, about computing and programming in this space?

00:22:55.180 --> 00:23:02.280
And one of the things that really was ball into my, you know, soothed by my burnt out soul was

00:23:02.280 --> 00:23:05.500
these retro consoles up.

00:23:05.500 --> 00:23:08.500
I used one called take 80, which was not Python based.

00:23:08.500 --> 00:23:09.660
It's it's Lua based.

00:23:09.900 --> 00:23:17.560
But the idea here is you can build like basically retro style video games very, very, very easily

00:23:17.560 --> 00:23:24.880
with very few lines of code because these things, they do have some constraints, but the constraints

00:23:24.880 --> 00:23:26.900
are completely artificial, right?

00:23:26.900 --> 00:23:31.400
Like in this case, this one is fixed 16 color palette, 256 by 256.

00:23:31.760 --> 00:23:39.840
you know, like the constraints, the world that you're building in is uncomplicated and small.

00:23:39.840 --> 00:23:48.020
And so as a result, you can sort of like step in and wrap your head around this thing so quickly and come up to speed.

00:23:48.020 --> 00:23:53.400
And suddenly you're like, you know, Oh, I made a flying saucer fly across the screen.

00:23:53.400 --> 00:23:55.700
I built a spray on making music.

00:23:55.700 --> 00:24:02.500
I'm coding, you know, the mean loop of my game and you can do it in a very comparatively speaking,

00:24:02.500 --> 00:24:05.820
short period of time with just a few lines of code.

00:24:05.820 --> 00:24:07.460
I'm just skipping down a little bit here.

00:24:07.460 --> 00:24:09.380
like let's take an example.

00:24:09.380 --> 00:24:14.660
They have the sort of like, you know, sneak eating dots kind of game.

00:24:14.660 --> 00:24:20.160
And it's comparatively speaking, like when you compare it with like one of the modern,

00:24:20.160 --> 00:24:24.540
you know, game, framework code bases.

00:24:24.820 --> 00:24:26.400
Like unreal engine or something.

00:24:26.400 --> 00:24:30.440
Unreal engine or do you think we were talking about like, here's my 60 pages of,

00:24:30.440 --> 00:24:31.740
of coordinate transforms.

00:24:31.740 --> 00:24:35.040
And you just look at it and you're like, I can't, I can't.

00:24:35.040 --> 00:24:38.700
And my a hundred gigs of, textures that we're going to export.

00:24:38.700 --> 00:24:39.120
Yeah.

00:24:39.120 --> 00:24:39.920
Exactly.

00:24:39.920 --> 00:24:40.080
Yeah.

00:24:40.080 --> 00:24:41.960
So this project is called pixel.

00:24:41.960 --> 00:24:44.720
I'm guessing that's how you P Y X E L.

00:24:44.720 --> 00:24:50.480
And it allows you to create extremely simple 2d animated games in Python, right?

00:24:50.480 --> 00:24:51.120
Yes.

00:24:51.120 --> 00:24:51.660
I apologize.

00:24:51.660 --> 00:24:52.600
I shouldn't have said that.

00:24:52.600 --> 00:24:53.600
yes, exactly.

00:24:53.940 --> 00:24:58.980
and so, back when I was using the other one, I kept thinking the entire time,

00:24:58.980 --> 00:24:59.560
like, wow.

00:24:59.560 --> 00:24:59.860
Wow.

00:24:59.860 --> 00:25:02.060
You know, I'm really having fun with this.

00:25:02.060 --> 00:25:06.900
And I'm really, I actually really enjoyed learning Lua and it's a really fun language.

00:25:06.900 --> 00:25:12.100
And it has a lot of, a lot of, you know, characteristics that are wonderful.

00:25:12.100 --> 00:25:13.780
But I kept thinking like, wow.

00:25:13.780 --> 00:25:18.240
I kind of wish I didn't have to get my brain to switch gears, which is not very good at

00:25:18.240 --> 00:25:18.820
doing always.

00:25:18.820 --> 00:25:20.820
I wish I could be coding this in Python.

00:25:20.820 --> 00:25:25.540
And so this framework gives you the opportunity to do just that.

00:25:25.540 --> 00:25:27.300
and so you can use these.

00:25:27.300 --> 00:25:32.320
It almost feels like for those of us who are old enough to remember, it almost feels like

00:25:32.320 --> 00:25:36.700
coding in basic on the microcomputers that some of us grew up with in the eighties.

00:25:36.700 --> 00:25:36.980
Right.

00:25:36.980 --> 00:25:41.180
Like it's that sort of kind of like back, back when you could type it in, you're like,

00:25:41.180 --> 00:25:43.620
I saw it printed and I typed it in and I ran it.

00:25:43.620 --> 00:25:44.860
Exactly.

00:25:44.860 --> 00:25:45.600
Exactly.

00:25:45.600 --> 00:25:46.160
Exactly.

00:25:46.160 --> 00:25:49.500
You know, it's like, yeah, it really, really is.

00:25:49.620 --> 00:25:53.800
And so I really, this one, what's, what's kind of interesting about this one is like,

00:25:53.800 --> 00:25:59.120
this is a great example that the sort of like sounding music section of this snake game here

00:25:59.120 --> 00:26:05.220
is, this one is actually a little bit more Pythonic, which I think is actually really

00:26:05.220 --> 00:26:10.260
kind of cool for Python folks like us, because the other ones that I've seen kind of like

00:26:10.260 --> 00:26:16.040
drifted more back towards the 1980s, like, you know, a little bit lower level of abstraction

00:26:16.040 --> 00:26:16.740
kind of thing.

00:26:16.740 --> 00:26:21.280
Whereas this one really takes advantage of some of the beautiful data structures like

00:26:21.280 --> 00:26:25.080
stats and dictionaries and the like that Python has to offer.

00:26:25.080 --> 00:26:31.080
So you can use this really kind of nice express and tax to, to write you games.

00:26:31.080 --> 00:26:33.120
And I am just super excited.

00:26:33.120 --> 00:26:35.080
I, I played with it a bit.

00:26:35.080 --> 00:26:39.860
I wrote a few lines of it and I, I, you know, kick the tires just to see how it worked, but

00:26:39.860 --> 00:26:45.420
I really have not had the opportunity yet to, to dive deep and kind of rewrite my side

00:26:45.420 --> 00:26:46.300
project in it.

00:26:46.300 --> 00:26:51.360
But I totally intend to, and I'm super psyched about it and I'm really, really glad that it

00:26:51.360 --> 00:26:51.760
exists.

00:26:51.760 --> 00:26:52.420
Yeah.

00:26:52.420 --> 00:26:53.200
I'd love to do this.

00:26:53.200 --> 00:26:59.200
I mean, I got my start typing in games from the back on a TRS 80 from the back of magazines

00:26:59.200 --> 00:27:01.800
and, and have an example.

00:27:01.800 --> 00:27:05.280
So one of the things, something like some engine like this, one of the things I love to do with

00:27:05.280 --> 00:27:09.960
somebody is, is take an existing game and say, let's look at the code and see what,

00:27:09.960 --> 00:27:12.260
what happens if we modify this, this field.

00:27:12.260 --> 00:27:15.020
There's, there's any way we can get the character to run faster.

00:27:15.020 --> 00:27:17.980
does that make it more fun to play the game or less fun?

00:27:17.980 --> 00:27:18.580
Things like that.

00:27:18.580 --> 00:27:19.320
Absolutely.

00:27:19.320 --> 00:27:23.140
And that's, and that kind of thing, that kind of like, well, let's take a look at this and

00:27:23.140 --> 00:27:27.920
tweak it a little bit is so simple with this kind of thing, because it's like, everything

00:27:27.920 --> 00:27:32.220
is so like, uncomplicated and straightforward.

00:27:32.220 --> 00:27:38.080
Like chances are like the, here is the number of frames that we skip as we transition our

00:27:38.080 --> 00:27:39.660
sprite character across the screen.

00:27:39.660 --> 00:27:40.960
Oh, let's just tweak that.

00:27:40.960 --> 00:27:45.040
Now you've done your sort of like, let's make him run a little faster kind of thing.

00:27:45.040 --> 00:27:50.900
It's all so satisfyingly in a world where I don't know about you guys, but my day job,

00:27:50.900 --> 00:27:54.940
especially the old one that I did was like, you know, make a code change or make a configuration

00:27:54.940 --> 00:27:55.600
change.

00:27:55.600 --> 00:27:58.920
And then wait, you know, eight hours for it to deploy through the pipeline.

00:27:58.920 --> 00:28:04.140
Like having something that's immediate instant feedback like this was just a delight.

00:28:04.140 --> 00:28:05.240
Sorry.

00:28:05.240 --> 00:28:08.120
I'm just shocked at the eight hour turnaround time.

00:28:08.120 --> 00:28:08.980
I'm so sorry.

00:28:08.980 --> 00:28:09.900
That was it.

00:28:09.900 --> 00:28:10.420
That was it.

00:28:10.420 --> 00:28:13.220
That was just a really bad example there that, you know, a couple of cases.

00:28:13.220 --> 00:28:15.080
It's not, that's not my day-to-day life.

00:28:15.080 --> 00:28:16.680
I actually love my day-to-day life.

00:28:16.680 --> 00:28:19.000
I'm very happy, but that was just, you know what I mean?

00:28:19.000 --> 00:28:20.720
We all have these like long build times.

00:28:20.880 --> 00:28:21.000
Yep.

00:28:21.000 --> 00:28:21.660
Yep.

00:28:21.660 --> 00:28:22.940
Will McGugan.

00:28:22.940 --> 00:28:23.240
Hey, Will.

00:28:23.240 --> 00:28:28.280
Says, this makes me nostalgic for my ZX Spectrum in the 80s.

00:28:28.280 --> 00:28:30.360
Exactly.

00:28:30.360 --> 00:28:35.040
There's an Atari 800 XL behind my head that I enjoy as well.

00:28:35.040 --> 00:28:36.540
So I feel that.

00:28:36.540 --> 00:28:40.060
Who's not surprised that Will's been coding since the 80s?

00:28:40.060 --> 00:28:41.380
So anyway.

00:28:41.380 --> 00:28:44.280
Now, now.

00:28:44.280 --> 00:28:48.460
And then also a few more follow-up items for your comment on side projects.

00:28:48.460 --> 00:28:50.700
Sam in the audience says, 100% agree, Chris.

00:28:50.800 --> 00:28:53.320
Side projects are a great way to keep yourself sharp.

00:28:53.320 --> 00:28:57.140
And Jose says, plus one for the side projects to try out the latest.

00:28:57.140 --> 00:28:57.480
Indeed.

00:28:57.480 --> 00:29:02.060
So before we move on though, Brian, I want to tell everyone about our sponsor.

00:29:02.060 --> 00:29:04.840
This episode is sponsored by Shortcut.

00:29:04.840 --> 00:29:09.200
Again, thank you Shortcut for sponsoring and supporting Python Bytes.

00:29:09.200 --> 00:29:14.240
So there's a lot of project management tools out there, but they often suffer from either

00:29:14.240 --> 00:29:18.200
being too simple for the engineering teams or too complex.

00:29:18.580 --> 00:29:21.900
And they end up looking like Bugzilla or something insane.

00:29:21.900 --> 00:29:23.380
And you're like, I really don't want to go here.

00:29:23.380 --> 00:29:27.000
So you want something nice and simple, but that actually scales with you.

00:29:27.000 --> 00:29:30.480
Something that's good both for managers and for engineers.

00:29:30.980 --> 00:29:32.600
So that's what Shortcut is.

00:29:32.600 --> 00:29:35.300
It's built to cater to both of these groups.

00:29:35.300 --> 00:29:39.140
So it's built for software teams based on making workflows easy.

00:29:39.140 --> 00:29:44.580
Big scale objectives, goals, roadmaps can be easily tied into a team or individual work

00:29:44.580 --> 00:29:45.120
sprints.

00:29:45.120 --> 00:29:48.460
Progress on those are easily flow back to higher level reports.

00:29:49.100 --> 00:29:52.800
And of course, as all things should be, it's keyboard friendly.

00:29:52.800 --> 00:29:56.340
You don't have to take your hand off and do a bunch of mousing around.

00:29:56.340 --> 00:30:00.940
You can use the UI if you like, but there's a bunch of hotkeys, which is fantastic, as I

00:30:00.940 --> 00:30:01.720
think they all should be.

00:30:01.720 --> 00:30:03.740
So it makes you work faster and just keep going.

00:30:03.740 --> 00:30:05.560
Good version control integration.

00:30:05.560 --> 00:30:08.820
Works with Git, GitHub, GitLab, and so on.

00:30:08.820 --> 00:30:10.560
A lot of the places that you probably already know.

00:30:10.940 --> 00:30:16.060
So you can update your task project just by doing a commit or a PR, which is fantastic.

00:30:16.060 --> 00:30:20.960
The last thing you want to do is update Git and GitHub and then go update your system, right?

00:30:20.960 --> 00:30:26.120
As iteration planning, you can see your team activity when you want to, or just focus on

00:30:26.120 --> 00:30:26.640
what you're doing.

00:30:26.640 --> 00:30:29.460
And you can even let it schedule your project for you.

00:30:29.460 --> 00:30:32.440
So nice burn down charge, cycle time, all that kind of stuff.

00:30:32.440 --> 00:30:37.060
So finally, you can have a project management tool that's both for engineers and managers.

00:30:37.060 --> 00:30:40.220
Give it a try at pythonbytes.fm/shortcut.

00:30:40.460 --> 00:30:42.720
It's a cool project and it helps support the show.

00:30:42.720 --> 00:30:44.360
So thank you for supporting us.

00:30:44.360 --> 00:30:46.300
Brian, what do you got next?

00:30:46.300 --> 00:30:47.260
What are we ditching now?

00:30:47.260 --> 00:30:49.940
We're ditching CodeCov.

00:30:49.940 --> 00:30:52.180
Harsh crowd.

00:30:52.180 --> 00:30:54.540
So, okay.

00:30:54.540 --> 00:30:58.460
So CodeCov has been great for a lot of people who have used it.

00:30:58.460 --> 00:31:05.060
It's a third-party service that you can attach to your repo or something.

00:31:05.060 --> 00:31:10.120
And it makes sure that you, and this has been helpful for merge requests and stuff.

00:31:10.220 --> 00:31:15.280
So if somebody does a PR, it makes sure that the coverage is 100.

00:31:15.280 --> 00:31:18.080
If you've had 100% coverage, it makes sure that they don't degrade it.

00:31:18.080 --> 00:31:21.360
The code they add makes the coverage stay at a high level.

00:31:22.480 --> 00:31:27.220
But so it's not without problems, however.

00:31:27.540 --> 00:31:38.800
And Hinnick mentions that on some of his projects, it's been sometimes a CI pipeline is blocked just because it timed out with CodeCov.

00:31:38.800 --> 00:31:43.580
And that's not a good reason to fail a build.

00:31:44.000 --> 00:31:50.880
So anyway, Hinnick has this project where he said, wait a second.

00:31:50.880 --> 00:31:53.740
I'm just trying to make sure everything goes to 100%.

00:31:53.740 --> 00:31:55.020
Coverage.py.

00:31:55.020 --> 00:31:56.220
Hey, Ned.

00:31:56.220 --> 00:31:58.240
Second thing here for you.

00:31:58.640 --> 00:32:07.560
But coverage.py from Ned Batchelder, maintaining it, of course, has a thing that it says fail if under 100%, under a percent.

00:32:07.560 --> 00:32:11.320
So you can do 100%, but you can do 80% or whatever your current percentage is.

00:32:11.820 --> 00:32:17.760
But anyway, if you want that, something like CodeCov, you can get that with coverage.py.

00:32:17.760 --> 00:32:19.380
But there's some tricks around it.

00:32:19.380 --> 00:32:28.400
So if you've got, one of the things coverage does is let's say you've got a project that has some code that is run,

00:32:28.400 --> 00:32:32.620
like you're trying to take advantage of some of the newer things, but you also, newer Python things,

00:32:32.620 --> 00:32:34.300
but you want to run on older Python too.

00:32:34.300 --> 00:32:37.020
So there's some if statements for Python version, for example.

00:32:37.020 --> 00:32:41.480
But it might be different hardware as well, like Windows versus Mac.

00:32:41.480 --> 00:32:45.420
But there might be code that's run in one test suite and not in the other.

00:32:45.420 --> 00:32:52.600
So in order to do that, you kind of have to run in parallel mode and then combine the coverage reports at the end.

00:32:52.600 --> 00:32:57.100
And it sounds complicated, but mostly we just copy somebody else's work.

00:32:57.100 --> 00:33:00.980
So, and Hinnick has the examples here.

00:33:00.980 --> 00:33:10.500
So Hinnick goes through using GitHub and coverage to do everything that you used to be able, you were doing with CodeCov.

00:33:10.500 --> 00:33:13.500
So this is a nice article with examples.

00:33:13.500 --> 00:33:24.000
So we've got, for each project, we're downloading the coverage report and then combining it at the end with a report with a fail under 100.

00:33:24.000 --> 00:33:25.060
Really cool.

00:33:25.060 --> 00:33:29.440
It's, if this is something you want to do, it's basically, it's a short article with examples.

00:33:29.440 --> 00:33:38.180
He even shows, he's got in his struct log, he shows his main workflow for GitHub pipelines that does all of this.

00:33:38.180 --> 00:33:41.560
So just kind of read his code and make it work.

00:33:41.560 --> 00:33:45.780
And I'm, I was actually thinking of doing this on a couple of projects I've got.

00:33:46.000 --> 00:33:50.220
I wanted to make sure that they were up at 100% and do something like this.

00:33:50.220 --> 00:33:55.820
But I actually, for some reason, I was dragging my feet and I didn't know why, but now I don't need to.

00:33:55.820 --> 00:33:58.500
I'll go ahead and use Hinnick's suggestion.

00:33:58.500 --> 00:33:59.520
Now you don't have to invent it.

00:33:59.520 --> 00:34:00.000
Just do it.

00:34:00.000 --> 00:34:02.560
Just set up that job on GitHub.

00:34:02.940 --> 00:34:06.060
This is actually something I've been, I've been kind of struggling with.

00:34:06.060 --> 00:34:07.020
I shouldn't say struggling with.

00:34:07.020 --> 00:34:18.520
I should say this is a journey that I have been on in that testing and code coverage and that whole class of, of proof of correctness is my weakest suit.

00:34:18.520 --> 00:34:33.300
And one of the things that I've really been sort of try to wrap my head around is I see a lot of like unit test code that seems like it was just, it's just there to keep the coverage percentage up.

00:34:33.300 --> 00:34:47.820
And as far as I can tell, it doesn't actually test anything like we're creating these mocks and like in everything and, but they don't actually like enforce any contracts or prove anything out.

00:34:47.820 --> 00:35:01.800
And I, I, I, I've trying to figure out how we can use these tools in ways that actually sort of raise the bar on code quality without encouraging this kind of like, I don't know, T crossing and I dotting behavior.

00:35:02.300 --> 00:35:15.760
Well, we're kind of getting on a tangent, but I would say that code reviews on tests are important because that's, that's just, I mean, one of the easiest ways to get a hundred percent coverage with no tip failing tests is don't put any asserts in your tests.

00:35:15.760 --> 00:35:20.600
Just saying.

00:35:20.600 --> 00:35:20.880
Good.

00:35:20.880 --> 00:35:21.500
That's it.

00:35:21.500 --> 00:35:23.980
And that makes an excellent point unto itself.

00:35:23.980 --> 00:35:24.380
Yes.

00:35:24.380 --> 00:35:24.740
Thank you.

00:35:24.740 --> 00:35:24.960
Yes.

00:35:24.960 --> 00:35:25.600
Nice.

00:35:25.600 --> 00:35:26.160
All right.

00:35:26.160 --> 00:35:29.920
Well, let's talk about the tippy top, the tip top.

00:35:30.060 --> 00:35:32.320
So I'm sure you all are familiar with top.

00:35:32.320 --> 00:35:39.360
It's like this somewhat dreadful way to tell what's happening on a Unix system, on Linux to see like what's happening.

00:35:39.360 --> 00:35:40.520
Is it, why is it busy?

00:35:40.520 --> 00:35:41.160
Is it not busy?

00:35:41.160 --> 00:35:43.920
I say dreadful because it's so simple and there's better tools.

00:35:43.920 --> 00:35:48.640
One of them being this tip top thing for, so for a long time, I use glances.

00:35:48.640 --> 00:35:49.680
I didn't know.

00:35:49.680 --> 00:35:50.560
I still do use glances.

00:35:50.560 --> 00:35:56.500
I'm not sure if you're all are familiar with the glances, but the UI that it creates is fantastic.

00:35:56.500 --> 00:36:03.080
So you just type glances and you get this sort of progress bars that show in the CPU, the memory, all the processes.

00:36:03.080 --> 00:36:04.480
It has like hotkeys.

00:36:04.480 --> 00:36:10.500
You can sort by CPU or memory, filter by process name or ID, all kinds of stuff going on here.

00:36:10.500 --> 00:36:12.240
And this, this is what I use now.

00:36:12.240 --> 00:36:16.760
But Zach Villers sent in tip top as a competing thing.

00:36:16.760 --> 00:36:19.200
And by the way, glances is Python and tip top is Python.

00:36:19.440 --> 00:36:23.460
So very good candidates for pip X because no project needs them.

00:36:23.460 --> 00:36:25.660
You just want to run them as commands, but they're Python, right?

00:36:25.660 --> 00:36:40.080
So if you look at the same picture over on the tip top page, you can see that you get similar information, but you get a little bit better historical understanding of how your CPU is doing, how your memory is doing.

00:36:40.420 --> 00:36:43.480
It even breaks it down per thread or per core.

00:36:43.480 --> 00:36:49.180
It shows you your memory broken down by what's being used, what's being cached, what's free.

00:36:49.180 --> 00:36:50.760
There's a graph of that over time.

00:36:50.760 --> 00:36:56.060
Something that made me sad is it shows the network over time as well, the in and out flow.

00:36:56.520 --> 00:37:08.920
But what happened to me is one of my servers, I ran this and it only would show the output from like a, some kind of, there were multiple network adapters and would only show the one that's not being used, not the one that's being used.

00:37:08.920 --> 00:37:11.400
So I'm like, well, that's, that part is useless, unfortunately here.

00:37:11.400 --> 00:37:19.960
But, and then it shows all the programs, like the CPU usage, the user it's running as the arguments that were passed to it, how much memory it has and stuff.

00:37:20.160 --> 00:37:28.460
So I don't think I'm going to give up using glances because I really love that, but this feels like a, another tool to get a view of that sort into it.

00:37:28.460 --> 00:37:28.980
What do y'all think?

00:37:28.980 --> 00:37:31.620
I like the visual design on the face of it.

00:37:31.620 --> 00:37:46.500
It, it like, especially comparing it to the glances screenshot that you showed, it feels like it might, it's a little prettier and it might, to me at least it looks a little bit less like dense and maybe a little bit easier to sort of like, maybe it's just the bounding boxes.

00:37:46.500 --> 00:37:54.620
But I also feel like it's the way the screen is laid out a way to visually, an easier way to visually parse the information that's presenting.

00:37:54.620 --> 00:37:57.700
That's always something I look for in the tool that I use.

00:37:57.700 --> 00:37:59.020
Absolutely.

00:37:59.020 --> 00:37:59.760
Brian?

00:37:59.760 --> 00:38:03.320
Why do you need some, I don't use anything like this.

00:38:03.320 --> 00:38:03.920
So.

00:38:03.920 --> 00:38:05.360
All right.

00:38:05.500 --> 00:38:17.840
So for example, if you log into, let's say you logged into a web server that was running a search job and it said, you're running a little bit low on memory as a, over the last few minutes.

00:38:17.840 --> 00:38:23.980
And you've got five different web apps set up running there, web processes with like a bunch of their sub processes running.

00:38:23.980 --> 00:38:25.460
And you wouldn't answer the question.

00:38:25.460 --> 00:38:26.020
Okay.

00:38:26.020 --> 00:38:26.660
Which one is it?

00:38:26.660 --> 00:38:27.880
Which one do I have to restart?

00:38:27.880 --> 00:38:28.660
Okay.

00:38:28.660 --> 00:38:29.200
Yeah.

00:38:29.520 --> 00:38:30.340
Things like that.

00:38:30.340 --> 00:38:38.280
It's easy to see where you might not encounter this or have a need for this when you're working in the world of things, right?

00:38:38.280 --> 00:38:44.540
Like the world of not servers, but embedded devices that might run Python or C or whatever.

00:38:44.540 --> 00:38:47.900
And, you know, this is like managing infrastructure.

00:38:47.900 --> 00:38:49.840
So you don't use this on your desktop?

00:38:50.200 --> 00:38:57.720
No, I don't use this on my Mac, but I use this on all of my, not necessarily tip top, but glances on all of my Linux servers, including the Python bytes one.

00:38:57.720 --> 00:39:02.380
So it's, it's nice to go in there and see what's going on in the servers with all I have is SSH.

00:39:02.380 --> 00:39:03.940
I'm more of a high level person.

00:39:03.940 --> 00:39:05.820
I'd rather pay somebody else to do this for me.

00:39:05.820 --> 00:39:11.420
Well, let's like, but it looks pretty.

00:39:11.420 --> 00:39:15.560
Let's see if I can pull up a picture of top.

00:39:15.560 --> 00:39:18.000
On behalf of my employer, Brian, thank you.

00:39:18.220 --> 00:39:18.600
Thank you.

00:39:18.600 --> 00:39:20.740
Yes, we're happy to take me to do that for you.

00:39:20.740 --> 00:39:21.140
No problem.

00:39:21.140 --> 00:39:30.920
Like this, this is the thing it's replacing, by the way, is it's just a list of processes and it moves around all the time and the stuff shoots off the screen.

00:39:30.920 --> 00:39:32.320
It's like, why is it doing this?

00:39:32.320 --> 00:39:33.760
You know, it's.

00:39:33.760 --> 00:39:37.960
I mean, to be fair, it was also written probably in like 1968 or something.

00:39:37.960 --> 00:39:38.680
Yeah, yeah, absolutely.

00:39:38.680 --> 00:39:39.100
Yeah.

00:39:39.100 --> 00:39:42.240
I'm not knocking on it.

00:39:42.240 --> 00:39:47.560
I'm just saying I would rather use, you know, something like this that gives me way more real time.

00:39:48.060 --> 00:39:50.220
Like graphs, not just snapshot.

00:39:50.220 --> 00:39:51.100
Now it is.

00:39:51.100 --> 00:39:51.840
Now it is.

00:39:51.840 --> 00:39:52.520
Now it is.

00:39:52.520 --> 00:39:56.820
But like, here's, here's what's happening as the things are running and doing their work.

00:39:56.820 --> 00:39:57.040
Right.

00:39:57.040 --> 00:39:58.860
So that, that's super helpful to me to see.

00:39:58.860 --> 00:40:00.160
To be fair.

00:40:00.160 --> 00:40:05.260
I also just, just installed Tiptop just for the heck of it on my Mac and a really quick install.

00:40:05.260 --> 00:40:06.720
And it does look pretty.

00:40:06.720 --> 00:40:07.940
I just don't know what to do with it.

00:40:07.940 --> 00:40:08.620
But yeah.

00:40:08.880 --> 00:40:11.300
And by the way, let's just tie it back to the audience again.

00:40:11.300 --> 00:40:18.920
So Tiptop uses textual for layout, which is based on, which is Wilma Googan's thing also based on rich.

00:40:18.920 --> 00:40:20.380
So it's quite modern.

00:40:20.840 --> 00:40:26.100
I think if we had Ned and Wil in the audience, we would always touch on something they were doing.

00:40:26.100 --> 00:40:26.760
Every year.

00:40:26.760 --> 00:40:30.740
I'll tell you what, Brian, here's a way you could use this totally in your day-to-day life.

00:40:30.740 --> 00:40:33.000
Your Mac is running slow, right?

00:40:33.000 --> 00:40:35.620
And you say, why is my Mac running slow?

00:40:35.940 --> 00:40:39.960
You could totally use this and at a glance say, what's hoovering all my RAM?

00:40:39.960 --> 00:40:41.980
What is throttling my disk?

00:40:41.980 --> 00:40:45.400
What is using up all my CP, et cetera, et cetera.

00:40:45.400 --> 00:40:45.900
Okay.

00:40:45.900 --> 00:40:46.260
Yeah.

00:40:46.260 --> 00:40:51.680
Like, for example, you can run activity monitor, which will show you the process thing.

00:40:51.680 --> 00:40:54.500
And you go to the memory thing, which will show you just a single graph.

00:40:54.500 --> 00:40:55.920
But like, why is it using all that memory?

00:40:55.920 --> 00:40:58.120
Is that actually being used or is that cache?

00:40:58.120 --> 00:41:01.460
Because you loaded a bunch of files and now it's kind of could be free, but it's not.

00:41:01.460 --> 00:41:02.820
What's happening on the network?

00:41:02.820 --> 00:41:04.820
You can't see very well on macOS.

00:41:05.100 --> 00:41:09.880
I don't know why activity monitor is adverse to showing you network traffic, but you could

00:41:09.880 --> 00:41:12.660
see like, am I downloading something or not right now?

00:41:12.660 --> 00:41:14.140
I can be taught new things.

00:41:14.140 --> 00:41:14.420
Okay.

00:41:14.420 --> 00:41:15.020
Thanks.

00:41:15.020 --> 00:41:15.780
Yeah.

00:41:15.780 --> 00:41:16.260
Yeah.

00:41:16.260 --> 00:41:16.420
Yeah.

00:41:16.420 --> 00:41:19.200
Anyway, I'm not excited for that use case.

00:41:19.200 --> 00:41:21.500
I'm excited for using it on the servers to understand them better.

00:41:21.500 --> 00:41:22.040
Yeah.

00:41:22.040 --> 00:41:22.580
Yeah.

00:41:22.580 --> 00:41:23.300
All right.

00:41:23.300 --> 00:41:27.000
Let's bring it home with some more retro, Chris.

00:41:27.000 --> 00:41:29.760
Back in the world of Wibzy.

00:41:31.300 --> 00:41:37.400
I've always been into, well, you know, always, ever since they weren't retro and they were,

00:41:37.400 --> 00:41:38.820
they were just 8-bit machines.

00:41:38.820 --> 00:41:42.260
I have, I grew up, started with, with 8-bit computer.

00:41:42.260 --> 00:41:44.200
I was an Atari kid.

00:41:44.200 --> 00:41:51.880
Never owned a C64, but someone has actually written a Commodore 64 emulator called PyC64

00:41:51.880 --> 00:41:53.360
in pure Python.

00:41:53.360 --> 00:41:55.980
And the reason that I picked this is-

00:41:55.980 --> 00:41:56.500
That's wild.

00:41:56.500 --> 00:41:58.320
It really is, isn't it?

00:41:58.320 --> 00:42:05.360
I think it is so cool because not only do you get this Commodore 64 emulator, it's not

00:42:05.360 --> 00:42:13.580
100% coverage, like he has openly emulated the display to the point where you can display

00:42:13.580 --> 00:42:14.740
Petsiki characters.

00:42:14.740 --> 00:42:19.080
But the bottom line is, it is other than that, a largely full machine emulator.

00:42:19.080 --> 00:42:27.880
It runs on the Pi65 library, which is a 6502 CPU chip emulator also written in pure Python.

00:42:27.880 --> 00:42:28.420
Oh my gosh.

00:42:28.420 --> 00:42:29.180
That's hard work.

00:42:29.660 --> 00:42:30.520
It really is.

00:42:30.520 --> 00:42:31.780
And, and it's so neat.

00:42:31.780 --> 00:42:34.000
I was able to pull this thing down and run it.

00:42:34.000 --> 00:42:40.600
And I was actually writing like Commodore 64 basic that poked bits into screen memory and,

00:42:40.600 --> 00:42:42.580
you know, drew pictures off the screen.

00:42:42.580 --> 00:42:49.160
And, and one of the really cool things is this thing even concludes, you can sort of like pop

00:42:49.160 --> 00:42:54.820
out of your emulator 64 with the gopy command to get a Python repl.

00:42:55.220 --> 00:43:01.400
Skype is actually doing that, like, quality quality, the emulated Commodore 64's memory

00:43:01.400 --> 00:43:05.280
by tweaking the Python data structures inside the repl.

00:43:05.280 --> 00:43:07.040
It is just, it is.

00:43:07.040 --> 00:43:08.400
That's pretty deep.

00:43:08.400 --> 00:43:09.120
Thank you.

00:43:09.120 --> 00:43:10.360
It is, it is really cool.

00:43:10.360 --> 00:43:15.840
And, and it is also from my perspective, one of the reasons I picked it, it's a testament

00:43:15.840 --> 00:43:20.020
to this programming language that we all use and love for our work.

00:43:20.020 --> 00:43:25.020
And, you know, whether it's webby stuff or testing devices or in my case, automating network

00:43:25.020 --> 00:43:27.720
infrastructure, it can do so much.

00:43:27.720 --> 00:43:33.420
You can reach out into all these other really kind of, you know, cool niche areas, whatever

00:43:33.420 --> 00:43:39.300
you're interested in and, and do neat things with Python on your computer.

00:43:39.300 --> 00:43:41.920
So I just thought this was incredibly cool.

00:43:41.920 --> 00:43:46.880
I had enjoyed playing with it and I definitely intend to enjoy playing with it some more.

00:43:46.880 --> 00:43:51.420
It might be some interesting ways to go back and study operating systems back when they were

00:43:51.420 --> 00:43:51.740
simple.

00:43:51.740 --> 00:43:54.220
If you were like a computer science student as well.

00:43:54.220 --> 00:43:55.440
Yeah, for sure.

00:43:55.520 --> 00:43:57.140
I think there's a lot to learn there.

00:43:57.140 --> 00:44:03.560
you know, even if you're not necessarily someone who is keenly interested in writing your

00:44:03.560 --> 00:44:08.760
own operating system, I think there's a lot to learn just in terms of the programming paradigm,

00:44:08.760 --> 00:44:09.240
right?

00:44:09.240 --> 00:44:13.900
Like when, when you wanted to solve a problem and you want it to display something on the

00:44:13.900 --> 00:44:21.040
screen and a perfectly reasonable answer was I'm going to poke the right bits into screen

00:44:21.040 --> 00:44:26.940
memory because that's a more efficient way to display this thing as opposed to using whatever

00:44:26.940 --> 00:44:28.780
my high level language provides.

00:44:28.780 --> 00:44:34.420
It is, it's such a different way of thinking the reality that most of us have it day to day.

00:44:34.420 --> 00:44:38.760
It's just a fun, refresh, refreshing place to visit, at least from my perspective.

00:44:38.760 --> 00:44:39.320
Yeah.

00:44:39.320 --> 00:44:39.920
Very cool.

00:44:39.920 --> 00:44:40.600
It's a good one.

00:44:40.600 --> 00:44:41.220
Thank you.

00:44:41.220 --> 00:44:43.920
Brian, it's time for extra, extra, extra here all about it.

00:44:43.920 --> 00:44:45.220
How many extras do you have?

00:44:45.220 --> 00:44:47.640
I have zero today.

00:44:47.640 --> 00:44:49.200
You have no extras.

00:44:49.200 --> 00:44:50.700
You're not adding to the number of extras.

00:44:50.700 --> 00:44:53.340
Chris, anything else you want to throw out there that people know about?

00:44:53.340 --> 00:44:54.060
Sure.

00:44:54.060 --> 00:44:54.780
Absolutely.

00:44:54.780 --> 00:44:57.040
My, my team at Amazon is hiring.

00:44:57.040 --> 00:44:59.480
Hopefully we can put a link in the show notes.

00:44:59.480 --> 00:45:01.040
I work for OpsTech IT.

00:45:01.040 --> 00:45:08.320
We work with the fulfillment centers and I, the, I cannot say enough how much I love working

00:45:08.320 --> 00:45:08.920
with this team.

00:45:08.920 --> 00:45:14.700
People are incredible and they're sort of like, at least the folks I'm working directly with

00:45:14.700 --> 00:45:21.180
are people who started out in the fulfillment centers and were interested in technology, right?

00:45:21.180 --> 00:45:25.140
And they were able to prove that they could actually walk the walk.

00:45:25.140 --> 00:45:28.620
And now they're being promoted into full on engineering positions.

00:45:28.620 --> 00:45:31.840
And I just find that so incredibly refreshing.

00:45:31.840 --> 00:45:32.400
Yeah.

00:45:32.400 --> 00:45:33.000
That's fantastic.

00:45:33.480 --> 00:45:33.660
Yeah.

00:45:33.660 --> 00:45:35.680
These people just have a very different perspective.

00:45:35.680 --> 00:45:37.240
You know, they're not the jaded.

00:45:37.240 --> 00:45:40.140
Like I've been in the tech industry for 20 years types like me.

00:45:40.140 --> 00:45:42.980
It's, it's really inspiring to work with them.

00:45:42.980 --> 00:45:43.280
Yeah.

00:45:43.280 --> 00:45:46.500
Not, not too many debates of like, why don't we just switch to a functional language?

00:45:46.500 --> 00:45:47.440
Come on.

00:45:49.040 --> 00:45:49.800
More practical.

00:45:49.800 --> 00:45:49.840
More practical.

00:45:49.840 --> 00:45:51.020
We'll just get stuff done.

00:45:51.020 --> 00:45:51.740
I love it.

00:45:51.740 --> 00:45:52.260
Exactly.

00:45:52.260 --> 00:45:52.800
Thank you.

00:45:52.800 --> 00:45:53.300
Before we move.

00:45:53.300 --> 00:45:53.560
Yeah.

00:45:53.560 --> 00:45:54.260
Yeah.

00:45:54.260 --> 00:45:55.340
So we'll put that link in the show notes.

00:45:55.340 --> 00:45:58.300
Before we move on to my extras, which are not many.

00:45:58.300 --> 00:46:02.060
Sam says, it's so helpful to understand how a computer works when you're writing code.

00:46:02.060 --> 00:46:04.460
These kinds of things are a good way to learn that.

00:46:04.460 --> 00:46:06.820
Talking about the Commodore 64 emulator.

00:46:06.820 --> 00:46:07.440
Awesome.

00:46:07.440 --> 00:46:07.800
All right.

00:46:07.800 --> 00:46:14.700
So I just have one and that's, I'm going to be speaking at FlaskCon 2021.

00:46:15.400 --> 00:46:19.800
And so FlaskCon is the first week of December, which has a remote attendance.

00:46:19.800 --> 00:46:24.500
I'm going to be talking about HTMX and Flask once again, because I'm super psyched about

00:46:24.500 --> 00:46:24.980
all that stuff.

00:46:24.980 --> 00:46:30.920
And so if you want to see some really cool apps get built using HTMX and Flask, drop in over

00:46:30.920 --> 00:46:31.140
there.

00:46:31.140 --> 00:46:33.320
There's a whole bunch of other talks going on as well.

00:46:33.320 --> 00:46:35.300
So I'll put the link to that in the show notes.

00:46:35.300 --> 00:46:36.140
All right.

00:46:36.140 --> 00:46:38.240
Shall we finish it off with a joke?

00:46:38.240 --> 00:46:39.080
Yeah.

00:46:39.080 --> 00:46:40.640
Levity is the soul of wit.

00:46:40.640 --> 00:46:41.140
Absolutely.

00:46:41.140 --> 00:46:42.260
It is.

00:46:43.040 --> 00:46:48.980
So we just recently went through the whole daylight savings unraveling and went back

00:46:48.980 --> 00:46:50.180
to normal time.

00:46:50.180 --> 00:46:56.780
And I don't know what it's like for you all, but when I look at the weather and stuff here,

00:46:56.780 --> 00:46:58.960
I suspect Chris, it's similar in Boston.

00:46:58.960 --> 00:47:01.100
I mean, I know it's similar for you, Brian.

00:47:01.100 --> 00:47:01.640
Yes.

00:47:01.640 --> 00:47:06.380
It's like sunset is at 438 PM and we're headed towards the winter solstice.

00:47:06.380 --> 00:47:08.420
So it's only getting earlier in the day.

00:47:08.500 --> 00:47:13.560
It's like, ah, that, that, that doesn't make me, it doesn't spark joy in my, in my heart

00:47:13.560 --> 00:47:15.200
that it's already dark at 430.

00:47:15.200 --> 00:47:16.380
I like it.

00:47:16.380 --> 00:47:16.760
Yeah.

00:47:16.760 --> 00:47:18.260
I like the dark.

00:47:18.260 --> 00:47:20.360
I don't mind that it gets dark.

00:47:20.360 --> 00:47:21.480
I just wish it wouldn't.

00:47:21.480 --> 00:47:22.680
I wish we could just move it.

00:47:22.680 --> 00:47:25.040
So there's a little time at the end of the day where there's still sun.

00:47:25.040 --> 00:47:25.400
I remember.

00:47:25.400 --> 00:47:26.380
I'm with you, Michael.

00:47:26.380 --> 00:47:27.340
I'm solo powered.

00:47:27.340 --> 00:47:28.780
So I enjoy the sunlight.

00:47:28.780 --> 00:47:30.880
I don't like it getting dark earlier either.

00:47:31.960 --> 00:47:32.960
Yeah, absolutely.

00:47:32.960 --> 00:47:33.860
I don't hate the winter.

00:47:33.860 --> 00:47:36.620
I just don't wish it shifted around a little bit.

00:47:36.620 --> 00:47:39.520
So this is a technical take on that.

00:47:39.520 --> 00:47:41.680
Our joke as this comes from the New Yorker.

00:47:41.680 --> 00:47:42.960
I mean, we're pretty highfalutin, right?

00:47:42.960 --> 00:47:46.400
We're not doing like dev jokes.io or whatever it was anymore.

00:47:48.100 --> 00:47:53.980
So this is by Matt Reuter and it's, it's a little cartoon of two people clearly in kind

00:47:53.980 --> 00:47:58.440
of a darker space, a woman sitting in her chair with a laptop and you could just like

00:47:58.440 --> 00:48:00.980
the beaming laptop screen is like a lightener up.

00:48:00.980 --> 00:48:01.200
Right.

00:48:01.200 --> 00:48:05.360
And the guy here on his tablet, same thing glowing on his face.

00:48:05.360 --> 00:48:09.720
And underneath it, it says, I hate how the screens get bright so early this time of year.

00:48:09.720 --> 00:48:11.980
Nice.

00:48:11.980 --> 00:48:14.440
This is so much about our modern world.

00:48:14.440 --> 00:48:17.060
It's both, it's both hilarious and kind of sad.

00:48:17.240 --> 00:48:18.240
All it wouldn't go.

00:48:18.240 --> 00:48:20.000
Absolutely.

00:48:20.000 --> 00:48:21.820
Yeah.

00:48:21.820 --> 00:48:25.240
So welcome to daylight savings or standard time.

00:48:25.240 --> 00:48:29.100
I guess everyone, the screens do get bright this time of year.

00:48:29.100 --> 00:48:30.800
That's funny.

00:48:30.800 --> 00:48:31.400
Nice.

00:48:31.400 --> 00:48:33.980
And Chris, thanks for being on the show.

00:48:33.980 --> 00:48:35.140
Brian, thanks as always.

00:48:35.140 --> 00:48:35.720
Yeah.

00:48:35.720 --> 00:48:36.300
Thanks a lot.

00:48:36.300 --> 00:48:37.200
Thank you so much.

00:48:37.200 --> 00:48:40.300
You know, I really appreciate everything that you guys do for the community.

00:48:40.300 --> 00:48:45.880
It's, it's really, you guys are great examples of why Python is such an amazing place to

00:48:45.880 --> 00:48:46.140
live.

00:48:46.380 --> 00:48:46.760
Thank you.

00:48:46.760 --> 00:48:47.620
Thanks, Chris.

