WEBVTT

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

00:00:04.680 --> 00:00:09.520
This is episode 232, recorded May 5th, 2021. I'm Michael Kennedy.

00:00:09.520 --> 00:00:10.680
And I'm Brian Okken.

00:00:10.680 --> 00:00:11.900
And I'm Annette Lewis.

00:00:11.900 --> 00:00:14.700
Annette, welcome to the show. It's so great to have you here.

00:00:14.700 --> 00:00:17.000
Thank you. It's great to be here. Thanks for inviting me.

00:00:17.000 --> 00:00:22.940
Yeah, of course. We were on a panel together at the Python WebConf, and that was a lot of fun.

00:00:22.940 --> 00:00:27.600
It was like a close out the conference trivia show or something like that, right?

00:00:27.600 --> 00:00:31.620
Yes. That was a ton of fun. It was nerve-wracking, but I really enjoyed it.

00:00:31.620 --> 00:00:35.740
Yeah, absolutely. So tell people a bit about yourself before we jump into the topics.

00:00:35.740 --> 00:00:42.480
Okay. So as I said, hi, I'm Annette. I am a Plone and Python developer with Six Feet Up.

00:00:42.480 --> 00:00:47.800
I've been working professionally in the web development world for probably eight years now,

00:00:47.800 --> 00:00:51.480
but my interest with working with web technology started back in 1999.

00:00:51.480 --> 00:00:54.560
It's just been a passion that's followed me all the way till now.

00:00:54.560 --> 00:00:56.840
Oh, that's awesome. Did you start in Python or?

00:00:57.200 --> 00:01:02.300
No, I didn't start in Python. I actually started just HTML, CSS, and as I got more eager,

00:01:02.300 --> 00:01:06.680
I just put more and more languages, and then Plone was my gateway into the Python world.

00:01:06.680 --> 00:01:08.280
Yeah. Oh, fantastic.

00:01:08.280 --> 00:01:12.820
Interesting. Plone is kind of a microcosm now, so.

00:01:12.820 --> 00:01:18.800
Yeah, it definitely seems like it. All right, Brian, well, you want to kick us off with a web topic?

00:01:19.480 --> 00:01:25.940
Yeah, this was just announced last week. The Sphinx Theme Gallery, which it has an updated look.

00:01:25.940 --> 00:01:31.720
And I actually, to be honest, I didn't look at it before, so I wasn't sure what it looked like before.

00:01:31.720 --> 00:01:38.340
But I have a new Sphinx project that I'm working on, so I was interested in this, and it looks awesome.

00:01:38.640 --> 00:01:44.700
So the Theme Gallery has, if you go to the Theme Gallery page, you see, you can just browse through.

00:01:44.700 --> 00:01:46.960
And all the themes are just like these images.

00:01:46.960 --> 00:01:51.660
Oh, yeah. If you want to look like Read the Docs, you can do that, or you can get like a plain white one.

00:01:51.660 --> 00:01:52.640
Yeah, very nice.

00:01:52.640 --> 00:01:53.160
That's neat.

00:01:53.380 --> 00:01:57.340
Yeah, and it wasn't obvious to me at first, although it's kind of obvious now.

00:01:57.340 --> 00:02:06.540
Each theme is shown in three different sizes, so you get the full wide layout, or you get the narrow layout, or what it might look on your phone.

00:02:06.540 --> 00:02:10.420
Interesting. So like this press one on the screen here, which I actually like a lot.

00:02:10.420 --> 00:02:17.900
You can tell it's clearly responsive and adapting like the design to the phone, but like the celery one, it's just lots of side scrolling.

00:02:18.380 --> 00:02:33.220
Yeah, and then click on one. So if you click on any of them, you get a demo of what it looks like, and right away you get like some instructions on how to install it if you want to, and then a link to the documentation for the theme.

00:02:33.220 --> 00:02:42.280
And then you also have, there's a nice kitchen sink feature, so you can go ahead and you can see all the different markups that's possible.

00:02:42.540 --> 00:02:52.340
And what I really like is there's a specific API documentation example, because for the project I'm working on, I really want the, I'm using it to document some code.

00:02:52.340 --> 00:02:58.720
So I really want the API documentation to be really clean and easy to read. That's the most important feature for me.

00:02:58.720 --> 00:03:05.340
So I think we're going to go with the book theme, because the book theme's API documentation looks pretty good, but we're going to start with at least.

00:03:06.400 --> 00:03:14.440
And anyway, I think this is just a really nice way to review everything. So drop down the kitchen sink thing, and then click on API.

00:03:14.440 --> 00:03:15.380
Oh, yeah.

00:03:15.380 --> 00:03:15.940
Look at that.

00:03:15.940 --> 00:03:20.880
It's very nice looking to break up the different API documents.

00:03:20.880 --> 00:03:25.800
This shows you how the API of your project will be presented through the documentation, right?

00:03:26.340 --> 00:03:33.320
Yeah, yeah. So yeah, using the API, I don't know, I'm still on the fence about how I'm going to put all this in.

00:03:33.320 --> 00:03:39.460
But listing all the API of the project I'm working on, it's going to be an internal documentation project.

00:03:39.460 --> 00:03:44.880
But this is really helpful, and I really think it's really nice looking. So good job, guys.

00:03:44.880 --> 00:03:49.880
Yeah, yeah, that's super neat. You got to write in restructured text, is that right, by default?

00:03:50.300 --> 00:04:04.000
No, no, no. I'm doing all Markdown now. So the cool thing is, and I probably should do a write-up of this at some point, but Paul Everett's doing a talk for PyCon about doing Sphinx and Markdown.

00:04:04.000 --> 00:04:16.540
And that's what I'm going with. So there's, yeah, the missed parser using that. And then there's also a way that you can actually put Markdown in your doc strings, so you can even write Markdown within your code comments.

00:04:16.540 --> 00:04:19.440
Oh, that's cool. And that's what you think of this project.

00:04:19.440 --> 00:04:31.520
I think it's really cool. I mean, when you work with so many clients and so many pieces of thing, anything where you can get nice, clear documentation and any themes are like a passion of mine, especially starting in front end.

00:04:31.520 --> 00:04:32.480
So this is laid out.

00:04:32.480 --> 00:04:43.220
Yeah, because you work, that's cool. Yeah, your work with Six Feet Up is primarily like a consulting role, like you guys help other people with their Python and web apps and stuff, right?

00:04:43.220 --> 00:04:53.800
Yes. So we get to do lots of different projects. And the best thing about that is we're always trying to solve different types of complex problems. So any tools that we can use or introduce them to this is a great asset.

00:04:53.800 --> 00:05:01.840
Yeah, very, very cool. All right. Well, this next one that I want to talk about is near and dear to my heart. Brian, you may have heard me talk about MongoDB before.

00:05:02.280 --> 00:05:02.580
Yeah.

00:05:02.580 --> 00:05:20.900
Yeah, I'm actually a huge fan of MongoDB. Like our site runs with MongoDB is the back end. And one of the things I've been jealous about is SQLite. So if I was working with Postgres and I wanted to use, say, Portis ORM, I wanted to use SQLAlchemy, I wanted just a simple little version.

00:05:21.060 --> 00:05:34.220
Well, I could use SQLite and then change the connection string over to Postgres and get a real proper database. But I don't have to always have that in place, right? Various reasons. We even talked about using SQLite as a database file format, which was super cool.

00:05:34.880 --> 00:05:52.500
So MongoDB doesn't really have something like that to a great degree. There was TinyDB, which is like it, but yeah, similar. But TinyDB, I don't believe it's actually MongoDB compatible. I could be wrong about that, but I believe TinyDB is a little bit different.

00:05:52.500 --> 00:05:53.420
Yeah, it's different.

00:05:53.420 --> 00:06:01.740
Yeah. It's a document database, but it's not just swap the connection string for MongoDB, I believe. So let me tell you about Mangita.

00:06:01.740 --> 00:06:05.340
I don't know how that's really meant to be pronounced, but I'm going with it. It sounds fun.

00:06:05.340 --> 00:06:17.480
So Scott Rogowski created this thing called Mangita, and he says, Mangita is to MongoDB as SQLite is to SQL, which is really, really nice.

00:06:17.480 --> 00:06:24.040
So it has a cool, I don't know, meerkat type of animal or something. Mongoose, I'm guessing maybe that's a mongoose.

00:06:24.040 --> 00:06:30.660
Anyway, I love the cool little animals and whatnot, but it's quite new.

00:06:30.660 --> 00:06:37.220
But it also seems to be coming along and he highlights a couple of uses here, like for embedded applications, you might use it for.

00:06:37.220 --> 00:06:39.520
So an embedded database, right?

00:06:39.520 --> 00:06:47.000
If I want to ship an app and it needs a database storage, but I would rather use a document type of database instead of a relational one, you can use it for that.

00:06:47.140 --> 00:06:48.140
Also for testing.

00:06:48.140 --> 00:06:58.960
This is kind of cool because it's not a hundred percent, but it's a non-trivial amount of the underlying MongoDB Python API is implemented.

00:06:58.960 --> 00:07:03.340
So you might be able to just swap it out and use like an in-memory.

00:07:03.340 --> 00:07:06.340
So one of the connection strings or clients you can use is just an in-memory one.

00:07:06.340 --> 00:07:11.080
So you could write like a pytest fixture, Brian, that like loads up your test data and then swaps things out.

00:07:11.080 --> 00:07:17.400
And then just from there on out, you think you're talking to MongoDB, but you're talking to something in memory through Mangita, which is pretty cool.

00:07:17.800 --> 00:07:19.600
And Sam asks, can we run this in memory?

00:07:19.600 --> 00:07:20.680
Yes, exactly.

00:07:20.680 --> 00:07:21.540
Exactly.

00:07:21.540 --> 00:07:23.080
I can't wait to try this.

00:07:23.080 --> 00:07:24.380
This is pretty cool.

00:07:24.380 --> 00:07:25.840
Yeah, it looks pretty cool.

00:07:25.840 --> 00:07:30.160
And Dean is pointing out this may be the most popular DB in the country of Mongolia.

00:07:30.160 --> 00:07:33.980
Anyway, so design.

00:07:33.980 --> 00:07:36.360
Gosh, I didn't get the joke at first.

00:07:36.360 --> 00:07:37.100
That's bad.

00:07:37.100 --> 00:07:47.040
So it's meant to be compatible with MongoDB and implement a commonly used subset of the PyMongo API.

00:07:47.380 --> 00:07:48.220
It's embedded.

00:07:48.220 --> 00:07:54.760
So instead of having a separate database server, you can just have this, which is really cool, like for workshops and stuff.

00:07:54.760 --> 00:07:58.640
It's supposed to be not super fast, but decent enough to work with fast.

00:07:58.640 --> 00:07:59.600
It's all tested.

00:07:59.600 --> 00:08:04.860
Its only dependencies are PyMongo, which is the thing you've got to replace, and then sorted containers.

00:08:04.860 --> 00:08:06.620
And theoretically, it's thread safe.

00:08:06.620 --> 00:08:10.400
Obviously, it's not a real database, but I still think it's pretty cool.

00:08:10.400 --> 00:08:26.800
So you can come along and just say, instead of creating a PyMongo client, a PyMongo.mongodb client, you could create like a Mongita client disk or a Mongita client memory, and then just do the queries against it, which is pretty cool.

00:08:26.900 --> 00:08:30.220
There's some performance comparisons and whatnot about how it works.

00:08:30.320 --> 00:08:36.120
And then I'm going to point out one thing that we were talking about over here recently, connection with Mongo Engine.

00:08:36.120 --> 00:08:49.800
So if you're working with an ODM, and you don't want to write raw queries and dictionaries, which I encourage you not to do, work with some kind of ODM, it would be nice if you could just change something, and then all of your code keeps working.

00:08:50.200 --> 00:08:55.240
So this person, Rocky Holmes comes to us, it'd be really awesome if I could connect this through Mongo Engine.

00:08:55.240 --> 00:08:56.960
He's like, I'm not sure what's going on.

00:08:56.960 --> 00:09:03.940
I'm like, well, so I wrote some code and said, all right, here's all the things that have to change to plug Mongo Engine directly into it.

00:09:03.940 --> 00:09:06.800
And basically, there's just certain things you have to say.

00:09:06.800 --> 00:09:08.120
Yeah, yeah, yeah, sure.

00:09:08.120 --> 00:09:11.020
I'll do that for you, like setting the host.

00:09:11.020 --> 00:09:15.360
You have to be able to set the host because the underlying library tries to set the host, but obviously there's no host.

00:09:15.360 --> 00:09:17.600
But if it's not there, the code won't run, right?

00:09:17.600 --> 00:09:20.320
So there's a few things, and Scott went through and merged that back.

00:09:20.320 --> 00:09:28.380
So now there's a subset of working with Mongo Engine as well by just swapping out the client, basically monkey patching the client.

00:09:28.380 --> 00:09:29.460
That's so cool.

00:09:29.460 --> 00:09:30.440
That's nice.

00:09:30.440 --> 00:09:31.560
Yeah, neat, right?

00:09:31.560 --> 00:09:45.020
Yeah, I've been using TinyDB in small projects, and I think I definitely want to try this out because the road between, path between, you know, starting with TinyDB and then going to Mongo is kind of a big hurdle.

00:09:45.020 --> 00:09:47.060
But this looks like a smaller job.

00:09:47.160 --> 00:09:48.100
Much, much closer, yeah.

00:09:48.100 --> 00:09:54.960
And if you use the disk, the disk writer thing, I think it's going to save it in direct BSON instead of JSON.

00:09:54.960 --> 00:09:57.060
So it should make it parse less and whatnot.

00:09:57.060 --> 00:10:03.840
I haven't tried that yet, but it does store it in BSON, which is the binary version of JSON that MongoDB uses.

00:10:03.840 --> 00:10:10.380
So I would suspect that's a smaller, faster, lighter file format than actually going to JSON and parsing the strings back.

00:10:10.380 --> 00:10:10.980
Nice.

00:10:11.420 --> 00:10:12.040
Yeah, yeah.

00:10:12.040 --> 00:10:12.820
Pretty cool.

00:10:12.820 --> 00:10:13.200
Pretty cool.

00:10:13.200 --> 00:10:13.820
All right.

00:10:13.820 --> 00:10:16.000
Next up is Annette.

00:10:16.000 --> 00:10:17.320
What's your first item?

00:10:17.320 --> 00:10:20.000
My first item is about World Plone Day.

00:10:20.220 --> 00:10:31.660
So last week, the Plone community actually put together World Plone Day, and I was kind of blown away by it because it was a 24-hour online streaming event, and it was held, let's just say it last week.

00:10:31.660 --> 00:10:35.960
And they put together over 50 videos, 16 countries.

00:10:35.960 --> 00:10:42.300
It was like 10, 11 languages of content just introducing all types of different parts of Plone.

00:10:42.520 --> 00:10:45.540
So they went through, like, some general interest.

00:10:45.540 --> 00:10:52.460
They went through some technical talks, case studies, and it's all available on YouTube right now, so you can go and watch it.

00:10:52.460 --> 00:10:54.780
And it's a great primer if you're familiar with Plone.

00:10:54.780 --> 00:11:05.020
If you're not familiar with Plone, even if you just want to learn some new techniques or see some case studies, they have some great case studies about different universities that they were using.

00:11:05.480 --> 00:11:10.760
So here, they actually put together a nice list of highlights, and of course, yeah.

00:11:10.760 --> 00:11:15.760
So if you're overwhelmed with looking at everything, here's, like, a good list that you can go through.

00:11:15.760 --> 00:11:21.400
But, like, I laser focused, of course, on Plone 6 because that is something I have been waiting to come out.

00:11:21.400 --> 00:11:24.760
And the more, like, breadcrumbs they get me, the more excited I get.

00:11:24.760 --> 00:11:29.840
And they actually did this Plone 6 introduction in, I believe, seven languages already.

00:11:30.240 --> 00:11:35.600
They're trying to add a couple more so that everyone can get this introduction to what Plone 6 is going to be like.

00:11:35.600 --> 00:11:36.760
That's amazing.

00:11:36.760 --> 00:11:38.960
I've never heard of a conference doing that.

00:11:38.960 --> 00:11:46.000
Even places like WWDC or Google I.O. or Microsoft Build, like, there might be subtitles, but not different versions.

00:11:46.000 --> 00:11:46.500
Yeah.

00:11:46.500 --> 00:11:47.320
So it's amazing.

00:11:47.320 --> 00:11:53.820
And, like, at the very bottom, you can see that part of the link where they actually have a couple hours of content in just Italian.

00:11:53.820 --> 00:11:55.600
So it's for everybody.

00:11:55.600 --> 00:11:57.280
It truly is a worldwide event.

00:11:57.280 --> 00:11:58.280
That's cool.

00:11:58.280 --> 00:12:03.020
And with Plone 6, they're talking about, like, Volto and Under the Hood.

00:12:03.020 --> 00:12:10.220
So if you're not familiar with Plone 6 or Plone in general, it's a Python content management system.

00:12:10.220 --> 00:12:15.200
But Plone 6 is also going to have a React front end available to you in the form of Volto.

00:12:15.200 --> 00:12:17.920
So you'll have the Volto front end.

00:12:17.920 --> 00:12:21.620
You can decouple that and use any front end you want because it has the REST API.

00:12:21.620 --> 00:12:23.640
They're making it easier to install.

00:12:23.640 --> 00:12:26.080
So I just can't wait to get my hands on it.

00:12:26.420 --> 00:12:26.660
Okay.

00:12:26.660 --> 00:12:27.420
Yeah.

00:12:27.420 --> 00:12:28.340
Here we go.

00:12:28.340 --> 00:12:33.680
We've got the, if I can pull this up, we've got the Volto, a new experience for editing the web.

00:12:33.680 --> 00:12:34.840
Is that, this is what you're talking about?

00:12:34.840 --> 00:12:35.500
Yes.

00:12:35.500 --> 00:12:36.420
Okay.

00:12:36.420 --> 00:12:42.300
It's like turn your CMS into kind of WordPress that you write in place or something like that.

00:12:42.300 --> 00:12:42.900
Right.

00:12:43.060 --> 00:12:48.020
So what it does is the Volto gives you the ability to dynamically make your layout.

00:12:48.020 --> 00:12:50.320
So they break the content into little blocks.

00:12:50.320 --> 00:12:54.140
So you can kind of drag and drop blocks and arrange your areas.

00:12:54.400 --> 00:12:59.140
So it takes someone who might not be really technical or not be able to do front end or such.

00:12:59.140 --> 00:13:04.360
You can kind of just drag and drop them and get that modern layout experience without having to know all of that.

00:13:04.360 --> 00:13:07.300
But then if you have that skill, you can make more blocks.

00:13:07.300 --> 00:13:09.380
You can present clients with more options.

00:13:09.380 --> 00:13:12.240
So you can use as little or as much as you want.

00:13:12.240 --> 00:13:15.500
And you get all the speediness and fastness of a React front end.

00:13:15.500 --> 00:13:16.140
Okay.

00:13:16.140 --> 00:13:16.680
Yeah.

00:13:16.680 --> 00:13:17.600
That's really, really cool.

00:13:17.600 --> 00:13:19.500
Because there's a lot of competition for CMSs.

00:13:19.500 --> 00:13:21.900
You know, there's Wagtail for Django.

00:13:21.900 --> 00:13:26.400
And then there's obviously WordPress that seems to run way more of the internet than it should.

00:13:26.820 --> 00:13:29.220
And you might wonder, like, okay, why am I going to use this one or that one?

00:13:29.220 --> 00:13:32.740
This is a really compelling idea to put in front of CMS.

00:13:32.740 --> 00:13:35.400
And I'm sure this will give Plone a big leg up.

00:13:35.400 --> 00:13:36.040
Yes.

00:13:36.040 --> 00:13:38.340
So I guess maybe I've missed it.

00:13:38.340 --> 00:13:42.060
Is Plone 6 something that's out already or something that's coming?

00:13:42.060 --> 00:13:43.160
It's coming.

00:13:43.160 --> 00:13:46.480
So they're still in the alpha phase.

00:13:46.480 --> 00:13:47.560
It's not completely out.

00:13:47.560 --> 00:13:56.620
But what happens is you can basically put together the Plone 6 experience by downloading the Volto front end and then also having the Plone back end.

00:13:56.740 --> 00:13:57.780
So you have the two parts.

00:13:57.780 --> 00:14:06.520
But they're getting it to the point where it's going to be a real easy install process where installing Plone will install both halves that you need and get you up and running.

00:14:06.520 --> 00:14:12.220
So you can start practicing if you're an early adopter now, if you go through the Volto documentation.

00:14:12.220 --> 00:14:16.680
But then the official Plone 6 will be all ready for you, packaged to go.

00:14:16.680 --> 00:14:17.260
Cool.

00:14:17.260 --> 00:14:17.820
Yeah.

00:14:17.820 --> 00:14:18.300
Very cool.

00:14:18.300 --> 00:14:21.140
Thanks for pointing out both those things, the conference and Volto.

00:14:21.140 --> 00:14:23.880
All right, Brian, you beat me to this one here.

00:14:23.880 --> 00:14:24.560
Did I?

00:14:24.560 --> 00:14:25.060
Tell us about it.

00:14:25.320 --> 00:14:27.760
Well, I was considering covering it, but you got it, man.

00:14:27.760 --> 00:14:28.140
Go for it.

00:14:28.140 --> 00:14:28.760
It's a good one.

00:14:28.760 --> 00:14:29.040
Worth it.

00:14:29.040 --> 00:14:29.680
Yeah.

00:14:29.680 --> 00:14:32.220
So Brett Cannon, he gave a talk.

00:14:32.220 --> 00:14:33.420
This is interesting.

00:14:33.420 --> 00:14:42.860
Anyway, he gave a great talk a few years ago at one of the PyCons about he did a keynote about basically burnout in open source developers.

00:14:42.920 --> 00:14:52.620
But this is, he wrote another article today, or it wasn't today, it was in April, but called the social contract of open source.

00:14:52.620 --> 00:14:57.900
But the highlight I really like is view every commit as a gift.

00:14:58.420 --> 00:15:00.480
So this is a really great article.

00:15:00.480 --> 00:15:00.480
So this is a really great article.

00:15:00.480 --> 00:15:09.700
It's some interesting thoughts on what the contract is and the relationship and what relationship exists between a maintainer and the users of a project.

00:15:10.240 --> 00:15:24.800
And there's a really interesting analogy that he talks about of the open source developers, like somebody that's just giving away free software, but they just have like a pile of USB drives in their front yard with a sign that says free.

00:15:25.180 --> 00:15:27.220
So you can drive by, you can pick one up.

00:15:27.220 --> 00:15:32.400
And if you need a new version, you can drive by and see if there's a new version there and you can get one if you want.

00:15:32.400 --> 00:15:43.340
So that kind of analogy is interesting because if that was the case, the things that you would not want to do, you would not want to go up to the door and knock on the front door and yell at the developer.

00:15:43.340 --> 00:15:47.000
You wouldn't want to leave an angry letter in their mailbox.

00:15:47.000 --> 00:15:51.180
You wouldn't egg their house because you're mad that they didn't have a feature you wanted.

00:15:51.180 --> 00:15:52.440
TP their tree.

00:15:53.600 --> 00:16:01.400
You wouldn't go down into the middle of the street in their town and start yelling about how much you hate their software or how much an idiot the developer is.

00:16:01.400 --> 00:16:03.800
You would treat each one as a gift.

00:16:03.800 --> 00:16:04.480
It's like free.

00:16:04.480 --> 00:16:10.080
And if it disappeared, if it didn't show up anymore, if there were no versions, you're kind of on your own.

00:16:10.080 --> 00:16:10.720
It's a gift.

00:16:10.720 --> 00:16:11.540
Take it or leave it.

00:16:11.540 --> 00:16:18.400
He brought up an interesting quote from Emanuel Kant, which I didn't quite get, but he kind of translated.

00:16:19.220 --> 00:16:34.780
And his translation really is when you treat a maintainer as a fellow human being who may be able to do you a favor of their own volition, then you end up in an appropriate relationship where you're not trying to use the maintainer for something specific.

00:16:34.780 --> 00:16:37.100
So you're not using them as a mean to an end.

00:16:37.100 --> 00:16:39.560
You're treating them as somebody that's giving you a gift.

00:16:40.280 --> 00:16:43.960
And I really just I like this attitude and it's great.

00:16:43.960 --> 00:16:46.560
Yeah, Brett is a real thought leader on this whole area.

00:16:46.560 --> 00:16:54.280
And then you work with people who are probably coming to consume some of this technology on a corporate side and they might have different expectations.

00:16:54.280 --> 00:17:03.320
You know, maybe they're switching from, you know, Java or .NET where they had somebody to go to and ask, like, we need you to support us in this world.

00:17:03.320 --> 00:17:08.440
If we ask for a feature for fixing a bug or something, here's our SLA to make that happen.

00:17:08.440 --> 00:17:08.920
Right.

00:17:08.920 --> 00:17:10.440
Is that something you run into any?

00:17:10.440 --> 00:17:14.000
Well, they always, of course, they set up the expectation.

00:17:14.000 --> 00:17:17.840
So I'd like to say at least I've been very lucky.

00:17:17.840 --> 00:17:23.200
So, like, I think most of the clients I've run into do treat it like everything that we provide for them.

00:17:23.200 --> 00:17:25.300
Every interaction is a gift interaction.

00:17:25.500 --> 00:17:28.020
So we're very fortunate in that front.

00:17:28.020 --> 00:17:36.140
But I definitely know, especially when you have the and do hobby programming, that is especially where you see this come up.

00:17:36.140 --> 00:17:42.680
If you contribute anything, I always think if I ever, ever, ever want to contribute to not to be scared.

00:17:42.680 --> 00:17:47.560
But if I put something out there in the world, someone's going to expect me to support it sooner or later.

00:17:47.560 --> 00:17:48.300
Yeah.

00:17:48.300 --> 00:17:48.840
Yeah.

00:17:48.840 --> 00:17:50.700
I have a couple of projects that I'm like, these are really neat.

00:17:50.700 --> 00:17:53.040
And if I put them on PyPI, that would be great.

00:17:53.040 --> 00:17:58.060
But I'm not sure I'm ready to commit the energy and time to it.

00:17:58.060 --> 00:18:05.400
So I think putting it out there fully in that way signals to some degree like I'm making something of a commitment.

00:18:05.400 --> 00:18:08.020
At least, you know, some people will see it that way.

00:18:08.020 --> 00:18:09.700
So, yeah, I've held back a bit.

00:18:09.700 --> 00:18:11.740
Oh, I actually.

00:18:11.740 --> 00:18:12.960
So that's interesting.

00:18:12.960 --> 00:18:14.020
I was talking with Brett.

00:18:14.020 --> 00:18:18.160
Actually, there's a testing code episode that's getting released this week with Brett.

00:18:18.160 --> 00:18:20.000
And we were talking about packaging.

00:18:20.640 --> 00:18:27.700
And on one of my projects, I don't list which Python version it is compatible with, but it really isn't compatible with everything.

00:18:27.700 --> 00:18:31.020
So I asked him about that.

00:18:31.020 --> 00:18:37.780
And he said, well, if you only like, for instance, he said, if you only want to test on 3.9 and like 3.8 and 3.9, just list those.

00:18:37.780 --> 00:18:42.300
And I said, well, shouldn't I try to expand it to more Python versions?

00:18:42.300 --> 00:18:46.060
He said, if you can, if you want to, but it's really up to you.

00:18:46.060 --> 00:18:46.720
It's your code.

00:18:46.720 --> 00:18:48.620
You can share it however you want to share it.

00:18:48.620 --> 00:18:49.920
So that's it.

00:18:50.300 --> 00:18:50.880
Yeah, that's a good point.

00:18:50.880 --> 00:18:52.620
It's kind of a freeing mindset also.

00:18:52.620 --> 00:18:54.280
Yeah, absolutely.

00:18:54.280 --> 00:18:55.760
Well, nice article.

00:18:55.760 --> 00:18:57.540
Brett, I have one more for you.

00:18:57.540 --> 00:18:58.460
And I'm pretty excited about this.

00:18:58.460 --> 00:19:00.000
I think this is a pretty cool idea.

00:19:00.000 --> 00:19:06.960
Brian, we've spoken before about some of the tools to allow people to have private IPI servers for several reasons.

00:19:07.360 --> 00:19:15.780
One might be we want to be able to publish one of our teams creates a package that we want to share throughout our other code.

00:19:15.780 --> 00:19:18.460
You could publish that internally and not make that a public thing.

00:19:18.460 --> 00:19:20.880
But, you know, have a private IPI server for that.

00:19:20.880 --> 00:19:23.460
But this is a pretty cool article.

00:19:23.460 --> 00:19:28.360
I saw through this place called Built in Africa, builtinafrica.io.

00:19:28.740 --> 00:19:34.100
And it's about creating a portable IPI server for offline access.

00:19:34.100 --> 00:19:36.160
So if you're in that cool.

00:19:36.260 --> 00:19:42.480
So if you're in some place where Internet is not super reliable or maybe it's reliable, but it's really slow.

00:19:42.480 --> 00:19:48.340
And you want to work with things like all the packages on PyPI, you know, those can start to be a big problem.

00:19:48.340 --> 00:19:51.740
Or especially if you have got intermittent downtime or something like that.

00:19:51.740 --> 00:19:53.900
So that's what this project is about.

00:19:53.900 --> 00:20:01.280
And this person, Vuey Sealy, and not love, not love you.

00:20:01.280 --> 00:20:03.360
If I'm sorry, I'm sure I'm messing up your name.

00:20:03.360 --> 00:20:07.020
But they created this thing called PyPI in a Box.

00:20:07.020 --> 00:20:20.860
And the idea is here is a real simple way to take a Raspberry Pi and turn it into a portable PyPI server and offline caching here, I guess, of all the PyPI pip infrastructure.

00:20:20.860 --> 00:20:22.420
Pretty cool, right?

00:20:22.420 --> 00:20:25.760
Apparently I've got to use cookies, but, you know, it's all good.

00:20:25.760 --> 00:20:29.680
So the idea is basically it's a standard Raspberry Pi.

00:20:29.680 --> 00:20:32.560
And it's supposed to be super affordable.

00:20:32.560 --> 00:20:34.600
Should be very, very little setup.

00:20:34.720 --> 00:20:39.560
And it uses a couple of cool libraries that might be relevant to people anyway, right?

00:20:39.560 --> 00:20:41.760
So you get this little 200 gigs SD card.

00:20:41.760 --> 00:20:45.520
Use mini repo, which is a thing that will clone PyPI.

00:20:45.520 --> 00:20:49.440
Use PyPI server to serve it up, serve up the packages.

00:20:49.440 --> 00:20:53.020
And then put Nginx in front of the PyPI server.

00:20:53.020 --> 00:20:57.080
Because PyPI server apparently doesn't do caching and is slow to like reread.

00:20:57.080 --> 00:21:00.420
If you like literally cloned PyPI, it would be like a little bit hard on it.

00:21:00.420 --> 00:21:06.120
So you can put caching in front of it for different search requests and install requests to make it much faster using Nginx.

00:21:06.120 --> 00:21:10.820
So this article really just talks about all the things you got to do.

00:21:10.820 --> 00:21:12.240
You know, you start with the Raspberry Pi.

00:21:12.240 --> 00:21:14.280
You get Ubuntu on it.

00:21:14.280 --> 00:21:16.900
You configure DHCP, create an access point.

00:21:17.100 --> 00:21:19.880
You add routing to it.

00:21:19.880 --> 00:21:22.480
You clone PyPI with this mini repo library.

00:21:22.480 --> 00:21:23.460
That was pretty cool.

00:21:23.460 --> 00:21:26.540
It's just a CLI thing you can get, which is cool.

00:21:26.540 --> 00:21:30.200
You set up PyPI server, run it on the stuff that you've cloned.

00:21:30.200 --> 00:21:34.940
And then you put up Nginx in front of it to make it much, much quicker.

00:21:34.940 --> 00:21:35.560
Yeah.

00:21:35.560 --> 00:21:36.980
And that's pretty much it.

00:21:36.980 --> 00:21:39.580
You could even do like SSL over it.

00:21:39.740 --> 00:21:42.940
And then it talks about how do you integrate this into somewhere down here.

00:21:42.940 --> 00:21:45.600
Talks about how you integrate this into Pip.

00:21:45.600 --> 00:21:47.340
You can pip install things and so on.

00:21:47.340 --> 00:21:50.900
Anyway, I think this is a fantastic idea that this person put together.

00:21:50.900 --> 00:21:53.080
And yeah, I like it.

00:21:53.080 --> 00:22:00.640
I think it's, it could be a huge benefit to people, not just in places where the internet is not as reliable or as good,

00:22:00.700 --> 00:22:09.060
but maybe you're traveling and your internet is super, super slow while you're out of town for two months with your family.

00:22:09.060 --> 00:22:14.660
Or I was just camping with my family and there was literally no internet, no cell coverage, nothing.

00:22:14.660 --> 00:22:21.840
And if I wanted to work on a project, it'd be cool to be able to have this if we were staying for a long time to still continue to work in reasonable ways.

00:22:21.840 --> 00:22:23.520
What do you think about this?

00:22:23.520 --> 00:22:24.860
I think it's amazing.

00:22:25.660 --> 00:22:29.200
Like, I know I've, I've traveled a lot in this.

00:22:29.200 --> 00:22:36.780
There's sometimes I used to take train rides that were 14 hour train rides and every tunnel, every bridge, you have no idea what your service is going to be like.

00:22:36.780 --> 00:22:42.220
So something like this would be so great to, when you're sitting in a chair for that many hours, you can get a lot done.

00:22:42.220 --> 00:22:45.700
And if I had pip in a box, it would make that so much easier.

00:22:45.700 --> 00:22:46.920
Yeah, absolutely.

00:22:46.920 --> 00:22:50.020
Like Sam Morley out there says for traveling, definitely.

00:22:50.020 --> 00:22:52.860
And then this actually, I believe was sent over by Jared Chunks.

00:22:52.860 --> 00:22:53.600
Thank you, Jared.

00:22:53.960 --> 00:22:59.200
And he says, you know, also on an intercontinental flight or when the power goes out or something like that.

00:22:59.200 --> 00:23:02.800
You know, there's a lot of people who are sort of living the digital nomad life.

00:23:02.800 --> 00:23:03.820
Doesn't work for me.

00:23:03.820 --> 00:23:07.580
There's too many people in the life, in schools and stuff.

00:23:07.580 --> 00:23:09.720
But if you were, this seems like a really cool idea.

00:23:09.720 --> 00:23:22.960
Another thing to point out in here, there's a nice little comment that I can't make, I don't see any instructions for, but this thing is a Raspberry Pi with Stack Overflow and Pi PI cloned into it.

00:23:23.060 --> 00:23:27.020
So the two, the two things you need.

00:23:27.020 --> 00:23:27.960
Oh gosh.

00:23:27.960 --> 00:23:32.100
If I had those two things, I'd probably really not need the internet again for quite some time.

00:23:32.100 --> 00:23:36.320
This would give it an entire new meaning to like a stealth startup.

00:23:36.320 --> 00:23:39.840
And you come out of stealth mode means like you literally just reconnect to the internet.

00:23:39.840 --> 00:23:40.460
Yeah.

00:23:40.460 --> 00:23:41.460
I like this idea.

00:23:41.460 --> 00:23:43.640
This looks really, really useful for lots of reasons.

00:23:43.640 --> 00:23:48.800
And it's not very expensive to the extent that it can empower people who are struggling with these kinds of things.

00:23:48.800 --> 00:23:49.740
I think that's all the better.

00:23:49.740 --> 00:23:53.800
I definitely need to try this, especially the mini repo thing.

00:23:53.800 --> 00:23:55.500
I was taking a look at that.

00:23:55.500 --> 00:23:56.260
It looks great.

00:23:56.260 --> 00:24:02.900
And also it looks like you can boil it down and only like only have certain Python versions.

00:24:03.100 --> 00:24:06.560
So if you're only going to work on Python 3, you don't need to download all the 2.7 stuff.

00:24:06.560 --> 00:24:07.460
Oh, right.

00:24:07.460 --> 00:24:08.100
Yeah.

00:24:08.100 --> 00:24:08.300
Yeah.

00:24:08.300 --> 00:24:08.840
That's super cool.

00:24:08.840 --> 00:24:09.420
That's a good idea.

00:24:09.420 --> 00:24:11.700
So yeah, this is neat.

00:24:11.700 --> 00:24:12.340
Nice.

00:24:12.340 --> 00:24:13.000
All right.

00:24:13.000 --> 00:24:14.060
And that you got the last one, right?

00:24:14.060 --> 00:24:15.300
Yes, I do.

00:24:15.860 --> 00:24:19.600
So this was a fun project that I just came across browsing the internet.

00:24:19.600 --> 00:24:22.380
It's a blog post by Kevin Martin Jose.

00:24:22.380 --> 00:24:27.220
And it was about film simulations from scratch using Python.

00:24:27.220 --> 00:24:38.720
In particular, this goes over implementing a color lookup table to an image with Python and like image processing, almost like in the film industry when you want to color grade something.

00:24:38.720 --> 00:24:41.520
And I thought, that's an amazing project.

00:24:42.060 --> 00:24:49.300
And the way this is broken down is they kind of walk you through the pieces and build you up to getting to a more complex project.

00:24:49.300 --> 00:24:51.900
And they explain the lookup tables while they're at it.

00:24:51.900 --> 00:24:56.400
So the primer, I'm going to give a real quick primer on the color lookup table.

00:24:56.400 --> 00:25:01.740
So basically, you have this magical 3D cube of color or some representation of color.

00:25:01.740 --> 00:25:05.640
And of all the colors in the world, you want to map it to a certain amount of numbers.

00:25:05.640 --> 00:25:10.560
So I might say, if I have whatever many colors, I want to map it to just eight colors.

00:25:10.600 --> 00:25:13.900
And I want every red to be this red and every blue to be this blue and such.

00:25:13.900 --> 00:25:18.500
So what they end up doing is they just start with pill and image.

00:25:18.500 --> 00:25:20.800
And they just start with a red image.

00:25:20.800 --> 00:25:23.080
And then they make their own lookup table.

00:25:23.080 --> 00:25:24.380
And they're using NumPy.

00:25:24.380 --> 00:25:29.260
So they're using those arrays to make the reference table that they look for.

00:25:29.760 --> 00:25:33.300
And then afterwards, they say, okay, I'm going to take all these red values.

00:25:33.300 --> 00:25:40.660
And I'm going to write a new method that's going to pass this image through and reapply the colors depending on what my lookup table is.

00:25:40.660 --> 00:25:43.880
So in the first example, it's just a red cube.

00:25:43.880 --> 00:25:47.840
And since they're using NumPy zeros, their entire table is zero.

00:25:47.840 --> 00:25:49.080
So that comes out to black.

00:25:49.620 --> 00:25:52.120
So their little red square just turns black.

00:25:52.120 --> 00:25:54.200
And they're like, well, that's not quite as interesting.

00:25:54.200 --> 00:25:54.860
Yeah.

00:25:54.960 --> 00:25:58.900
So they actually take a specific address in that table.

00:25:58.900 --> 00:26:01.260
And they say, we want to reassign this one to green.

00:26:01.260 --> 00:26:03.940
So the next time they apply this, it turns to green.

00:26:03.940 --> 00:26:10.700
And then as you get through the article further and further, they take up this charming little truck from Rome image.

00:26:10.860 --> 00:26:14.600
And they say, okay, let's map all of the reds to green.

00:26:14.600 --> 00:26:18.100
And of course, well, that means all of the other colors end up being black.

00:26:18.100 --> 00:26:21.180
So it's like those things in Microsoft Paint.

00:26:21.180 --> 00:26:25.240
If you take a big image and you open it with two-bit color, that kind of image.

00:26:25.240 --> 00:26:27.660
Do you want to feel like you're back on a Commodore 64?

00:26:27.660 --> 00:26:28.600
Yeah.

00:26:28.600 --> 00:26:35.180
So then afterwards, they say, okay, well, now we've got to make this a little more detailed.

00:26:35.180 --> 00:26:39.440
So they make a more complex table and magic happens in code and such.

00:26:39.920 --> 00:26:41.320
There'll be a link to this article.

00:26:41.320 --> 00:26:44.480
So if you want to read through it, it's actually a really interesting read.

00:26:44.480 --> 00:26:48.820
But then afterwards, they make a bigger table and they try and get more color.

00:26:48.820 --> 00:26:51.700
So they bring it up to like, I believe, 12 representations.

00:26:51.700 --> 00:26:53.560
And now it looks recognizable.

00:26:53.560 --> 00:27:03.500
But then finally, now that they've gotten through all of this color and the for loop where they're actually iterating through all of the pixels in the array and then reassigning it.

00:27:03.500 --> 00:27:04.920
And they use a scale.

00:27:05.140 --> 00:27:15.860
They're also using numpy rint, rounding it, to round the scale to certain values so they can say, okay, I'm taking this entire block of color and signing it to this color block.

00:27:15.860 --> 00:27:17.100
Oh, yeah.

00:27:17.100 --> 00:27:18.200
Like quantizing it.

00:27:18.200 --> 00:27:18.440
Yeah.

00:27:18.600 --> 00:27:19.280
Yeah, exactly.

00:27:19.280 --> 00:27:26.860
I think they take the table size, divide by the number of colors, and then they reassign them as they need to.

00:27:26.860 --> 00:27:32.820
But then afterwards, they actually say, okay, now we've gotten you through all of those pieces.

00:27:32.820 --> 00:27:35.040
And they have nice side by side.

00:27:35.040 --> 00:27:37.120
So you can kind of see, oh, before and after.

00:27:37.120 --> 00:27:38.500
I noticed that about that article.

00:27:38.500 --> 00:27:42.840
That's so amazing that you have a slider to like sort of see the image effects.

00:27:42.840 --> 00:27:44.200
Like that's a cool blog post.

00:27:44.200 --> 00:27:46.300
And that's just with the identity of the 12.

00:27:46.300 --> 00:27:48.340
It's not even that many colors.

00:27:48.340 --> 00:27:51.020
So it's amazing how the human eye just says, oh, that looks good enough.

00:27:51.020 --> 00:27:55.220
But then afterwards, they're like, okay, now we've made our own lookup table.

00:27:55.220 --> 00:27:58.940
Now we can download lookup tables and start manipulating.

00:27:59.280 --> 00:28:01.180
So they reassign a value to green.

00:28:01.180 --> 00:28:04.360
So you get that truck and they just patch green into the red areas.

00:28:04.360 --> 00:28:10.180
And then finally, they end up using a hauled clots.

00:28:10.180 --> 00:28:12.260
Yeah.

00:28:12.260 --> 00:28:15.700
Because I would get it.

00:28:15.700 --> 00:28:16.440
Yeah.

00:28:16.440 --> 00:28:21.280
So they actually download a PNG version of this table.

00:28:21.280 --> 00:28:24.320
So instead of a 3D cube and just numbers, it's an image.

00:28:24.320 --> 00:28:28.260
And then this is what I thought was the coolest part about all of this.

00:28:28.640 --> 00:28:31.560
Is they scroll, scroll, scroll, magic numbers.

00:28:31.560 --> 00:28:34.820
But what they basically do is they take that image.

00:28:34.820 --> 00:28:36.320
They open it with pill.

00:28:36.320 --> 00:28:41.040
They use the numpy array to make that an array of values that they can use against.

00:28:41.040 --> 00:28:42.900
They bring in the image of the truck.

00:28:42.900 --> 00:28:49.340
And then they have all of this magic code there that they reassign those values one by one.

00:28:49.340 --> 00:28:50.860
So it iterates through all the pixels.

00:28:50.860 --> 00:28:53.740
And then it spits out the filtered image.

00:28:53.740 --> 00:28:57.760
And then pill puts it back into an image form so you can see what you got.

00:28:58.000 --> 00:29:00.140
And I'll skip to the very last one.

00:29:00.140 --> 00:29:01.420
Oh, did I miss one?

00:29:01.420 --> 00:29:02.420
Oh, there you go.

00:29:02.420 --> 00:29:05.240
You can see how this is less desaturated.

00:29:05.240 --> 00:29:06.080
Oh, yeah.

00:29:06.500 --> 00:29:10.040
So like, that's just that particular type that they applied there.

00:29:10.040 --> 00:29:12.320
And I thought there was one more in here somewhere.

00:29:12.320 --> 00:29:12.900
Oh, there you go.

00:29:12.900 --> 00:29:17.700
There's the green tint where they just added a little bit of green to every color.

00:29:17.700 --> 00:29:30.640
And it was so cool because I spend so much time in the web Python world that it's so easy to forget that Python is it's got such a wide array of things that you can do with it.

00:29:30.640 --> 00:29:33.260
And just image processing just blew my mind.

00:29:33.260 --> 00:29:34.440
Yeah, I agree.

00:29:34.440 --> 00:29:35.400
This is super neat.

00:29:35.520 --> 00:29:37.580
And it's the kind of stuff that I wouldn't do that often.

00:29:37.580 --> 00:29:39.900
But it's also really cool to see what you can do.

00:29:39.900 --> 00:29:43.160
It's kind of think Instagram filters type of thing, right?

00:29:43.160 --> 00:29:43.840
Mm-hmm.

00:29:43.840 --> 00:29:44.740
Yeah.

00:29:44.740 --> 00:29:46.740
Some of the image processing stuff is really cool.

00:29:46.820 --> 00:30:03.320
I remember in the university, I had a class where we took the colors that we took it, looked at the colors that the human eye sees best, and then tried to map those to colors that different animals see different colors better or different frequency ranges.

00:30:04.100 --> 00:30:15.220
So you can translate those and highlight, kind of translate other frequencies and shift them so that you can kind of represent what an image might look like to a different kind of animal.

00:30:15.220 --> 00:30:17.540
Those are interesting things.

00:30:17.540 --> 00:30:21.000
Like the bird eye, the dog eye, the cat eye.

00:30:21.000 --> 00:30:21.940
Yeah.

00:30:22.120 --> 00:30:33.780
Well, like, for instance, birds and insects often see different, since they see different frequencies, the flowers, a lot of flowers have patterns in them that we can't see because they're not intended for us to see.

00:30:33.780 --> 00:30:34.740
Huh.

00:30:34.740 --> 00:30:35.880
Very cool.

00:30:35.880 --> 00:30:36.500
Okay.

00:30:36.500 --> 00:30:37.180
Awesome.

00:30:37.180 --> 00:30:37.520
Yeah.

00:30:37.520 --> 00:30:42.020
Jared Chung out there also says, always want to play around with images using Python but haven't got around to yet.

00:30:42.020 --> 00:30:43.800
This is a really neat example to explore.

00:30:43.800 --> 00:30:45.700
I totally agree.

00:30:45.700 --> 00:30:47.340
And then a couple of comments just going back.

00:30:47.340 --> 00:30:50.940
Sam Morley says, you know, about the IPI in a box.

00:30:51.400 --> 00:30:54.540
Like for an on-system package, you could actually do this in Docker on localhost.

00:30:54.540 --> 00:30:59.860
So if you just wanted it for you, you didn't want to share it, that might be pretty neat as well.

00:30:59.860 --> 00:31:05.720
And of course, if you removed all the duplicate questions and the comments saying you're doing it wrong, you could probably just fit it on a Raspberry Pi.

00:31:05.720 --> 00:31:06.800
The stack of workflow is.

00:31:06.800 --> 00:31:14.720
And then Kelly Paradis from Teaching Python Podcast, a former guest here.

00:31:14.720 --> 00:31:15.840
Does super cool.

00:31:15.840 --> 00:31:16.180
Share.

00:31:16.180 --> 00:31:16.560
Thanks.

00:31:16.560 --> 00:31:19.880
Even the simple thought of turning simple pixels into another color.

00:31:20.280 --> 00:31:26.180
It would be really nice for students because, yeah, she and Sean teach middle schoolers how to do Python, which is neat.

00:31:26.180 --> 00:31:27.160
Awesome.

00:31:27.160 --> 00:31:27.400
Awesome.

00:31:27.400 --> 00:31:27.780
All right.

00:31:27.780 --> 00:31:30.080
Well, I think that's all of our items, isn't it, Brian?

00:31:30.080 --> 00:31:30.900
Yeah.

00:31:30.900 --> 00:31:31.720
Yep.

00:31:31.720 --> 00:31:33.740
Do you have any extra information for us?

00:31:33.740 --> 00:31:35.340
Oh, you know it.

00:31:35.340 --> 00:31:39.540
It was almost an extra, extra, extra, extra here all about it.

00:31:39.540 --> 00:31:40.500
I'll be quick, though.

00:31:40.860 --> 00:31:43.660
So many of the Python things are available in new form.

00:31:43.660 --> 00:31:46.860
Most notably, Python 310 beta 1.

00:31:46.860 --> 00:31:48.380
I saw that in PyCoders today.

00:31:48.380 --> 00:31:51.020
So thanks, Dan and team for putting that out there.

00:31:51.020 --> 00:31:51.840
Point that out.

00:31:51.840 --> 00:31:57.000
But yeah, this is the first beta of 310, which is sort of the stable version, right?

00:31:57.000 --> 00:31:58.140
Which is pretty neat.

00:31:58.140 --> 00:31:59.160
Let's see.

00:31:59.260 --> 00:32:04.060
Then I covered HTMX not too long ago, a couple episodes ago.

00:32:04.060 --> 00:32:11.020
And that's a really cool way to basically add JavaScript-y dynamic front-end stuff without doing almost anything.

00:32:11.020 --> 00:32:12.240
It's more like declarative stuff.

00:32:12.240 --> 00:32:17.540
But someone pointed out that Hyperscript is sort of a companion-type thing.

00:32:17.980 --> 00:32:19.800
It's pretty new, but really simple.

00:32:19.800 --> 00:32:23.460
You can just say, like, button, on click, toggle this CSS element.

00:32:23.460 --> 00:32:24.700
And yeah.

00:32:24.700 --> 00:32:25.500
Nice.

00:32:25.500 --> 00:32:34.460
Super, super neat ways to add little bits of interactivity to your web page without really doing a ton of JavaScript stuff.

00:32:34.460 --> 00:32:37.660
And apparently, it is accompanied with a haiku, which is always cool.

00:32:37.660 --> 00:32:40.920
And then lastly, this is not quite last.

00:32:40.920 --> 00:32:41.480
Maybe it's last.

00:32:41.480 --> 00:32:43.780
I also want to point out that we just released a new course.

00:32:43.780 --> 00:32:46.140
I talked about it coming, but now it is out.

00:32:46.420 --> 00:32:47.880
Getting Started with Dask.

00:32:47.880 --> 00:33:01.300
So if you want to take Pandas code and run it on all 16 cores on your machine, or you don't have enough memory, but you've got disk space to load up the data, or you want to run it on a cluster, Dask is like the next level scaled out Pandas.

00:33:01.300 --> 00:33:08.480
So here's a free course I put together with Matthew Rocklin and team over at Coiled on working with Dask and just getting started with it.

00:33:08.480 --> 00:33:10.120
So people should check that out if they want.

00:33:10.120 --> 00:33:13.400
And I believe that is it for all of my extra items.

00:33:13.400 --> 00:33:15.800
Either of you want to add anything else?

00:33:16.040 --> 00:33:17.140
Oh, I have something.

00:33:17.140 --> 00:33:17.720
Yeah.

00:33:17.720 --> 00:33:18.420
Awesome.

00:33:18.420 --> 00:33:18.780
Yes.

00:33:18.780 --> 00:33:27.240
So the Python Web Conference 2021 happened in March, but we're getting a head start on the Python Web Conference 2022.

00:33:27.240 --> 00:33:29.480
And their call for papers is open.

00:33:29.980 --> 00:33:36.220
So that's a conference that's put on by Six Feet Up, and it focuses on Python, particularly in the world of the web.

00:33:36.220 --> 00:33:40.480
And that's actually where I met Michael Kennedy doing our panel, our fun quiz show panel.

00:33:40.480 --> 00:33:46.740
It's also where I've met a lot of the Pythonistas that I've come to call my friends and in the community as a whole.

00:33:47.200 --> 00:33:55.060
So just want to say, if you're interested in speaking, I will say this, and it probably seems ironic since I'm on a live cast right now.

00:33:55.060 --> 00:33:56.180
I'm an introvert.

00:33:56.180 --> 00:33:59.560
I'm really shy, and I usually don't like speaking in public.

00:33:59.720 --> 00:34:09.340
But I always push myself and try and give a talk just because if you're passionate about it, you'll probably find somebody who's just as interested, and you can learn and teach both the same way.

00:34:09.340 --> 00:34:11.680
So there's a variety of different topics.

00:34:11.680 --> 00:34:14.680
We have speakers from all over the world.

00:34:14.680 --> 00:34:16.780
It's a great time.

00:34:16.780 --> 00:34:20.100
So whether you attend or just put in a talk, I hope to see you there.

00:34:20.100 --> 00:34:21.340
That's a great shout out.

00:34:21.340 --> 00:34:22.960
And this conference is quite large.

00:34:22.960 --> 00:34:29.120
You said you're seeking 60 speakers for topics related to this big, long list that people can find in the link.

00:34:29.120 --> 00:34:31.360
Yeah, it was like four or five days, something like that.

00:34:31.360 --> 00:34:32.980
Yeah, it was five days.

00:34:32.980 --> 00:34:35.860
They did half days, so you didn't get as much fatigue.

00:34:35.860 --> 00:34:36.720
That was really cool.

00:34:36.720 --> 00:34:37.760
I like that.

00:34:37.760 --> 00:34:39.020
And four tracks.

00:34:39.020 --> 00:34:40.680
And I know they even had a culture track.

00:34:40.680 --> 00:34:45.540
So even if you're not technical, they're still just with the Python community and culture, things to listen to.

00:34:46.060 --> 00:34:47.040
Yeah, very nice.

00:34:47.040 --> 00:34:52.480
I want to second your thought about encouraging people to speak, even if they're introverts or shy or they don't feel like they're ready.

00:34:52.480 --> 00:34:57.300
A lot of times, just putting yourself out there can really help amplify your career.

00:34:57.300 --> 00:35:02.020
And it could be something like, here's how I learned to become a Python web dev.

00:35:02.020 --> 00:35:05.140
And these are the things that were struggles, and these are how I overcame them.

00:35:05.140 --> 00:35:07.400
That might be really helpful to a large group of people.

00:35:07.400 --> 00:35:11.100
And just putting yourself outside of your comfort zone can make a big, big difference.

00:35:11.100 --> 00:35:14.900
And here's a pretty low stress, low risk way to do it.

00:35:15.340 --> 00:35:16.360
Yeah, fantastic.

00:35:16.360 --> 00:35:18.520
I guess I want to reiterate that.

00:35:18.520 --> 00:35:26.140
I think one of the things about either blogging or speaking at a conference or something, as a developer, and especially an introvert,

00:35:26.140 --> 00:35:29.580
I'm often looking just at the people that are better at me.

00:35:29.580 --> 00:35:31.440
So I'm looking at learning.

00:35:32.020 --> 00:35:39.160
So either writing or talking gives you a chance to turn around and see how far you've come and start teaching some of that back.

00:35:39.160 --> 00:35:44.700
And I think it's good for mentally just to help people realize they've come a long ways.

00:35:44.700 --> 00:35:46.540
Yeah, for sure.

00:35:46.540 --> 00:35:46.980
For sure.

00:35:46.980 --> 00:35:47.860
All right.

00:35:47.860 --> 00:35:48.820
Do you have something funny?

00:35:49.240 --> 00:35:50.460
I do have something funny.

00:35:50.460 --> 00:35:50.760
Okay.

00:35:50.760 --> 00:35:56.500
So this one, I found out about it because of our friend Cecil Phillip, who was just on the last episode.

00:35:56.500 --> 00:35:59.380
And he tweeted, this changes everything.

00:35:59.380 --> 00:36:00.620
And I'm like, all right, what is this about?

00:36:02.300 --> 00:36:04.320
So this comes from Stack Overflow.

00:36:04.320 --> 00:36:07.420
It's a little bit old, but it's a goodie from April 1st.

00:36:07.420 --> 00:36:08.900
It says, the reviews are in.

00:36:08.900 --> 00:36:10.520
The key is flawless.

00:36:10.520 --> 00:36:12.880
The key is a new keyboard from Stack Overflow.

00:36:12.880 --> 00:36:14.600
And it comes in this super tiny box.

00:36:14.760 --> 00:36:16.840
And it's here to help programmers code better.

00:36:16.840 --> 00:36:18.100
And so there's this video.

00:36:18.100 --> 00:36:22.300
I don't think I can get the audio into the streets.

00:36:22.300 --> 00:36:23.040
You have to watch it.

00:36:23.040 --> 00:36:23.580
I'll link to it.

00:36:23.580 --> 00:36:26.080
But the idea is you have this keyboard here.

00:36:26.080 --> 00:36:28.260
And it only has three buttons.

00:36:28.260 --> 00:36:32.100
It has a Stack Overflow icon, which is like the command or the control button.

00:36:32.100 --> 00:36:33.880
And then it has a C and a V.

00:36:33.880 --> 00:36:38.520
It has a really beautiful whisper click sound.

00:36:38.520 --> 00:36:42.540
And yeah, it says, free your keyboard with the unlimited copy and paste.

00:36:42.540 --> 00:36:44.020
The key is the name of the keyboard.

00:36:44.020 --> 00:36:44.740
What do you think?

00:36:44.920 --> 00:36:46.400
Oh my gosh, that's great.

00:36:46.400 --> 00:36:50.480
Like if I could have that in my normal keyboard, just so I know, it's like, okay, it's time

00:36:50.480 --> 00:36:51.860
for some Stack Overflow time.

00:36:51.860 --> 00:36:53.280
Copy, paste.

00:36:53.280 --> 00:36:54.300
Exactly.

00:36:54.300 --> 00:36:58.200
I mean, it's obviously a joke, but it could be kind of like, all right, I'm going into the

00:36:58.200 --> 00:36:58.440
mode.

00:36:58.440 --> 00:37:00.140
I'm using the special three key keyboard.

00:37:00.140 --> 00:37:00.840
Let's do this.

00:37:00.840 --> 00:37:01.560
Yeah.

00:37:01.560 --> 00:37:05.980
If you could have like whatever you highlight in your code, it just automatically looks that

00:37:05.980 --> 00:37:07.080
up in Stack Overflow.

00:37:07.080 --> 00:37:10.500
And then a key to copy the answer, the top answer.

00:37:10.500 --> 00:37:12.320
And yeah, there you go.

00:37:12.320 --> 00:37:13.360
Yeah, exactly.

00:37:13.880 --> 00:37:15.380
Just automate all of programming.

00:37:15.380 --> 00:37:18.060
Yeah.

00:37:18.060 --> 00:37:20.700
You could even tie this together with that Stack Overflow in a box thing.

00:37:21.720 --> 00:37:22.580
I'm not sure.

00:37:22.580 --> 00:37:25.940
I'm not a huge fan about the touch bar thing in the Macs.

00:37:25.940 --> 00:37:28.620
They're fine, but I mean, I don't hate them, but I don't really love them.

00:37:28.620 --> 00:37:33.520
But it seems like somebody could program one of those touch keyboards to have just this.

00:37:33.520 --> 00:37:37.600
If it sees you're in a browser with that URL, it just switches to just these three keys.

00:37:37.600 --> 00:37:38.540
I love it.

00:37:38.540 --> 00:37:41.000
Yeah.

00:37:41.840 --> 00:37:42.240
Fantastic.

00:37:42.240 --> 00:37:42.280
Fantastic.

00:37:42.280 --> 00:37:43.140
All right.

00:37:43.140 --> 00:37:45.600
Well, I think that is, that's it.

00:37:45.600 --> 00:37:46.180
That's the show.

00:37:46.180 --> 00:37:47.460
Brian, thanks for being here as always.

00:37:47.460 --> 00:37:48.860
And that's so great to have you here.

00:37:48.860 --> 00:37:49.420
Thanks.

00:37:49.420 --> 00:37:50.080
Good to be here.

00:37:50.080 --> 00:37:50.600
Yeah.

00:37:50.600 --> 00:37:51.300
Bye, everyone.

00:37:51.800 --> 00:37:53.340
Thank you for listening to Python Bytes.

00:37:53.340 --> 00:37:55.900
Follow the show on Twitter via at Python Bytes.

00:37:55.900 --> 00:37:58.780
That's Python Bytes as in B-Y-T-E-S.

00:37:58.780 --> 00:38:02.220
And get the full show notes at pythonbytes.fm.

00:38:02.220 --> 00:38:06.540
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.

00:38:06.540 --> 00:38:09.240
We're always on the lookout for sharing something cool.

00:38:09.240 --> 00:38:12.480
On behalf of myself and Brian Okken, this is Michael Kennedy.

00:38:12.480 --> 00:38:16.040
Thank you for listening and sharing this podcast with your friends and colleagues.

