WEBVTT
00:00:00.001 -->
00:00:04.920Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:00:04.920 -->
00:00:11.380This is episode 170, recorded February 19th, 2020. I am Brian Okken.
00:00:11.380 -->
00:00:12.340And I'm Michael Kennedy.
00:00:12.340 -->
00:00:17.060And this episode is brought to you by DigitalOcean. They've got something cool we're going to share
00:00:17.060 -->
00:00:21.480with you a little later. But first, tell me about whatever you're going to tell me about first.
00:00:21.480 -->
00:00:29.420I want to kick things off by building a picture for you. A picture of something awesome and yet
00:00:29.420 -->
00:00:35.060something fairly complex. The Python visualization space. I don't know how you feel about it,
00:00:35.060 -->
00:00:40.040but whenever I think, oh my gosh, I gotta go make some cool pictures and do neat things with Python,
00:00:40.040 -->
00:00:47.460I'm like, matplotlib, bokeh, py, py plot, what else should I learn? All these other things.
00:00:47.460 -->
00:00:53.840And then if I want to do this graph, there's a lot of stuff out there. So Price and Daniel sent across
00:00:53.840 -->
00:00:59.040a website, a resource for anyone who feels like me and says, ah, there's like kind of an
00:00:59.040 -->
00:01:05.700overwhelming sense of all the things happening. And this is called PyViz at pyviz.org.
00:01:06.380 -->
00:01:16.380And basically, the idea with PyViz is they've categorized and mind mapped all the things around
00:01:16.380 -->
00:01:21.280Python data visualization and they've grouped it into different stuff. So the way they describe it
00:01:21.280 -->
00:01:25.960is they say it's an open platform for helping users decide on the best open source Python data
00:01:25.960 -->
00:01:30.540visualization tools for their purpose with links, overviews, comparisons, examples, and tutorials.
00:01:30.540 -->
00:01:31.120That's cool.
00:01:31.260 -->
00:01:35.640Yeah, sounds good, right? So they have different sections that you can go check out. Overview of all
00:01:35.640 -->
00:01:40.880the packages, which is like a nice visual graph relationship thing. High level overview of the
00:01:40.880 -->
00:01:47.520tools, a live table comparing maturity, popularity, and support. Also a special focus on building
00:01:47.520 -->
00:01:53.240dashboards that are like interactive web things that people can interact with for scientific
00:01:53.240 -->
00:02:00.540visualization for rendering embedded three-dimensional objects. And like I said, some tutorials and
00:02:00.540 -->
00:02:04.780examples. Also some of the examples talking about like, if you have this kind of data, here's how
00:02:04.780 -->
00:02:06.180you visualize it. What do you think?
00:02:06.180 -->
00:02:10.920Yeah, I like it that the subset is still a lot of work if you know what you want to do and you still
00:02:10.920 -->
00:02:15.200have to try to figure out what you want to do with it. But at least it's broken it down into
00:02:15.200 -->
00:02:18.120just a handful of things that you have to figure out.
00:02:18.120 -->
00:02:24.540Yeah, absolutely. Well, it doesn't entirely alleviate the challenge of this. But like,
00:02:24.540 -->
00:02:30.040for example, if you go to the overview section, you can see there's three main sections, JavaScript,
00:02:30.040 -->
00:02:35.760matplotlib, and OpenGL. And that might sound like, I thought this was Python. What's up? Like these are,
00:02:35.760 -->
00:02:42.080I'm going to work with Python and get the outcome as a JavaScript thing on a web page or something I can
00:02:42.080 -->
00:02:48.840get into matplotlib or something I can get into like an OpenGL window for interaction and whatnot.
00:02:48.840 -->
00:02:53.760So yeah, there's a bunch of stuff here that you can work with. But I think it's interesting to see the
00:02:53.760 -->
00:02:54.840relationships as well.
00:02:54.840 -->
00:03:02.320Well, we had a visualization thing that we used at work that we had originally done a JavaScript side one.
00:03:02.560 -->
00:03:10.580And I think that we're going to switch and go back to a matplotlib side, mostly because it's whether or not it's
00:03:10.580 -->
00:03:16.220happening on the front end or the back end. That's a division that we have to make, made that decision.
00:03:16.220 -->
00:03:18.760But you know, it's only software, you can change it.
00:03:18.760 -->
00:03:21.040That's right. It's not concrete.
00:03:21.040 -->
00:03:22.360Yeah, just get another intern.
00:03:22.360 -->
00:03:28.460Indeed, indeed. All right. Well, I definitely am going to make use of this site if I've got some
00:03:28.460 -->
00:03:33.940visualization to do. And yeah, there's a couple of things I'm really would like to up the sort of
00:03:33.940 -->
00:03:39.880reporting exploration game for both the course side of things, understanding what users are up to,
00:03:39.880 -->
00:03:44.880but also for the podcasts, right? So we can understand how our listeners are listening a
00:03:44.880 -->
00:03:48.240little bit better. So I'll see what I can do around that for us. It might involve one of these.
00:03:48.240 -->
00:03:52.500Yeah, that'd be cool. I'm intrigued by the breakdown of some of the dashboard ones.
00:03:52.500 -->
00:03:55.380Yeah. Would you say that that project's awesome that I was thinking about?
00:03:55.380 -->
00:03:58.400I think so. Yeah. It's probably going to be an awesome project.
00:03:58.400 -->
00:03:59.100What else is awesome?
00:03:59.100 -->
00:04:04.140Oh, well, Zen is awesome. I actually like a lot of these. I have to admit it,
00:04:04.140 -->
00:04:08.560I like the awesome sites, the collections, awesome collections of different things,
00:04:08.560 -->
00:04:11.620usually thrown up on GitHub. And this one's also on GitHub.
00:04:11.620 -->
00:04:17.280They're usually more concrete, though. They're more like awesome async servers in Python or awesome
00:04:17.280 -->
00:04:18.880web frameworks.
00:04:18.880 -->
00:04:24.220Right. But we want to be a little reflective here. We've got a rabbit hole of Zen with
00:04:24.220 -->
00:04:30.000the awesome Zen of Python. Yeah, I was trying to make a bad pun of a rabbit hole lot of Zen.
00:04:30.000 -->
00:04:36.880So anyway, so the Zen of Python is a thing. So you import this and you see it. And we've covered,
00:04:36.880 -->
00:04:43.100I think, at least one article talking about that. But somebody put together a collection of articles
00:04:43.100 -->
00:04:49.440and video and talks and some other things about the Zen of Python, because people have thought about
00:04:49.440 -->
00:04:54.640it and written about it. And I like it. A couple of things I wanted to point out. Al Swigert has a
00:04:54.640 -->
00:05:01.700nice one that's a Zen of Python explained. It's a really quick reference. If you're new and are
00:05:01.700 -->
00:05:06.200curious about the Zen of Python and you read it and you don't quite get what the heck that is,
00:05:06.200 -->
00:05:12.940I think that he did a good start. I'll probably get his name wrong. But Moshe Zetka has a meditations on
00:05:12.940 -->
00:05:18.240the Zen of Python, which is probably a longer couple paragraphs per item, a little bit longer,
00:05:18.240 -->
00:05:24.480but I like his take on it as well. And one of the things I just learned recently is that there's a
00:05:24.480 -->
00:05:30.220reference to the increment and decrement operator within the Zen of Python, or not the increment and
00:05:30.220 -->
00:05:36.100decrement, but post decrement and pre decrement from C is like something that trips up C people.
00:05:36.220 -->
00:05:39.620There's actually a joke embedded in the Zen of Python about that.
00:05:39.620 -->
00:05:46.140How nice. Yeah, if it has to be an interview question about what incrementing a variable does,
00:05:46.140 -->
00:05:47.180it might be too complicated.
00:05:47.180 -->
00:05:49.340Yeah.
00:05:49.340 -->
00:05:56.700What happens if you test if, you know, plus plus X of this thing or whatever, right? Like that's,
00:05:56.700 -->
00:06:03.480yeah, not good. So although I do wish Python had a X plus plus, you know, sometimes I could go.
00:06:03.480 -->
00:06:08.920Yeah. Just an easy increment or decrement operator would be good, but we don't need two.
00:06:08.920 -->
00:06:10.460No, that's right.
00:06:10.460 -->
00:06:16.060I got to admit, I read in the, now we're getting down the C world in a for loop. It's recommended
00:06:16.060 -->
00:06:21.180that you do a pre-increment because there's a little bit of savings on complex objects to do
00:06:21.180 -->
00:06:26.480pre-increment, but give me a break. It's I plus plus at the end of a for loop. I always do that.
00:06:26.480 -->
00:06:31.540Yeah, it is. Definitely is. So I'm glad Python doesn't even have a for loop.
00:06:31.540 -->
00:06:34.300We have for loops, just not the same.
00:06:34.300 -->
00:06:35.120Yeah.
00:06:35.120 -->
00:06:36.920For I equals zero.
00:06:38.080 -->
00:06:42.320Yeah. Pretty sweet. Yeah. No, this is a cool art, the cool find here. I like this.
00:06:42.320 -->
00:06:49.720The Xenopython is something that's frequently spoken about, but it's very terse and there's
00:06:49.720 -->
00:06:53.860not a lot of explanation about it. So, you know, it's like one of those things I remember being
00:06:53.860 -->
00:06:58.680new going, Oh, the Xenopython. How cool. What does it mean? You know what I mean? Like,
00:06:58.680 -->
00:07:02.080could I get an example for each line, please? It would be nice. You know?
00:07:02.200 -->
00:07:06.700Yeah. I'm also including a link. I think it's important to read the Xenopython as a joke
00:07:06.700 -->
00:07:13.980and here's why. And it talks about a few aspects of it as to basically don't take it too seriously. And
00:07:13.980 -->
00:07:19.260Python is a language that you're really not supposed to take too seriously. Yes, it's serious. We can get
00:07:19.260 -->
00:07:22.100a lot of work done, but don't get freaked out on stuff.
00:07:22.100 -->
00:07:27.060It's named after Monty Python after all. Come on. Yeah, exactly. Lighten up people.
00:07:27.060 -->
00:07:33.080You know what else is awesome? Kubernetes. Kubernetes and DigitalOcean.
00:07:33.080 -->
00:07:38.580And DigitalOcean, yes. Yep. So there is an enormous amount of material on the web about
00:07:38.580 -->
00:07:44.520Kubernetes available both online and in print. So the DigitalOcean community realized that it's a
00:07:44.520 -->
00:07:49.080little, you know, you might have trouble figuring it all out, even though there's a lot of information.
00:07:49.320 -->
00:07:55.640So they developed a Kubernetes for full stack developers course to provide a thorough,
00:07:55.640 -->
00:08:00.740well-maintained and approachable reference set of tutorials for anyone who would like to start
00:08:00.740 -->
00:08:06.960learning about Kubernetes. And if that wasn't cool enough, they also realized that some people don't
00:08:06.960 -->
00:08:11.820want to take courses. They want to read about it. So they compiled the course curriculum into an ebook
00:08:11.820 -->
00:08:17.580to make it available for more people. So you can see that if you go to pythonbytes.fm
00:08:17.580 -->
00:08:25.760slash do dash kube and you can download the book and visit the course. And as always, you can visit
00:08:25.760 -->
00:08:31.540pythonbytes.fm/digital ocean to get a hundred dollar credit for new users to build something awesome.
00:08:31.540 -->
00:08:33.940I think we should just keep rolling things that are awesome. Yeah. Yeah.
00:08:33.940 -->
00:08:38.820So Matt Harrison inadvertently recommended this next item to us.
00:08:38.900 -->
00:08:40.900Really?
00:08:40.900 -->
00:08:46.660I mean, like very indirectly, but he did. So he posted on Twitter how he is absolutely loving
00:08:47.080 -->
00:08:55.260jupitext. J-U-P-Y-T-E-X, jupitext. And I didn't even see it on Twitter. No, Twitter emailed
00:08:55.260 -->
00:09:00.880me a summary of popular tweets, which said Matt Harrison liked this. So thank you, Matt.
00:09:00.880 -->
00:09:02.100Interesting. Okay.
00:09:02.100 -->
00:09:07.580Okay. So Jupyter Notebooks are awesome. They're super cool for exploring data and they're really
00:09:07.580 -->
00:09:12.740powerful for people who are doing like more exploration rather than writing software, right?
00:09:12.900 -->
00:09:16.940You can run the first bits. They might take a while, but then you can slice and dice stuff
00:09:16.940 -->
00:09:21.960to visualize it and explore it as much as you want. However, they're not all the way awesome
00:09:21.960 -->
00:09:28.100because if I put one of those things into say GitHub and you were to check it out and I were
00:09:28.100 -->
00:09:33.540to be messing with running it and that was getting like live data. So non-deterministic results and
00:09:33.540 -->
00:09:37.840you did the same and then we both put it back. It keeps like those results and stuff. And it's not
00:09:37.840 -->
00:09:44.520very friendly in Git, right? Another thing that would be nice would be sometimes you want to
00:09:44.520 -->
00:09:50.240explore stuff in Jupyter, but then productize it, turn it into like a script of its natural language,
00:09:50.240 -->
00:09:54.720right? It supports a bunch of languages now. It would be nice to be able to go. And here's the one we run
00:09:54.720 -->
00:10:00.260where the comment, the text becomes comments or whatever. So basically that's what JupyterText
00:10:00.400 -->
00:10:07.280does. It will take Jupyter notebooks and turn them into markdown documents or Python scripts.
00:10:07.280 -->
00:10:07.720Wow.
00:10:07.720 -->
00:10:11.020And then you put those in source control or whatever, right? You can work with those.
00:10:11.020 -->
00:10:16.980So you could then export it out and work with it in like PyCharm or something like that. You also get
00:10:16.980 -->
00:10:22.420meaningful diffs of what changed when you look at the differences of those. So this thing's really cool.
00:10:22.420 -->
00:10:28.760You can export the Jupyter notebooks in all these different script languages. Currently it supports,
00:10:29.080 -->
00:10:34.780ready for this. Julia, Python, R, Bash, Scheme, Clojure, MATLAB, Octave, which is the open source
00:10:34.780 -->
00:10:44.420MATLAB, C++, UKDB+, IDL, TypeScript, JavaScript, Scala, Rust, PowerShell, C#, F Sharp, and my favorite
00:10:44.420 -->
00:10:46.640behind Python, robot framework.
00:10:46.640 -->
00:10:48.220Nice.
00:10:48.220 -->
00:10:52.600I just want to work in the robot framework. What language did you know? I know, robot. Oh, really?
00:10:52.600 -->
00:10:53.060Cool.
00:10:53.060 -->
00:10:57.880Yeah. Anyway, people who are working in Jupyter notebooks, this looks super helpful. And
00:10:57.880 -->
00:11:00.720Matt, thanks for having a popular tweet that got emailed to me.
00:11:00.720 -->
00:11:03.160Yeah. So can you do Scheme in Jupyter?
00:11:03.160 -->
00:11:04.540You must be able to.
00:11:04.540 -->
00:11:09.240You must be able to. I did Scheme as my CS101 course.
00:11:09.240 -->
00:11:09.880Yeah, me too.
00:11:09.880 -->
00:11:10.980And I did a couple of CS courses.
00:11:10.980 -->
00:11:17.940And I'm not a fan of all the close parentheses, to be honest. I'm like, what a crazy language
00:11:17.940 -->
00:11:19.560this is. But yeah, apparently you can.
00:11:19.560 -->
00:11:20.300Nice.
00:11:20.440 -->
00:11:24.500I guess I would rather do that over like, rather than through like an X term or whatever.
00:11:24.500 -->
00:11:26.220But yeah, apparently you can.
00:11:26.220 -->
00:11:27.260Nice.
00:11:27.260 -->
00:11:30.480Pretty cool. Anyway, so if you work on the Jupyter notebooks and you want to be able to export
00:11:30.480 -->
00:11:33.060them in these cool ways and do other stuff as well, check that out.
00:11:33.060 -->
00:11:37.500Well, one of the things I want to talk about is stuff that we iterate over.
00:11:38.500 -->
00:11:38.900Okay.
00:11:38.900 -->
00:11:41.120This is a failed attempt as a transition.
00:11:41.720 -->
00:11:49.240So a great article called a tour of Python iter tools and iter tools is one of those things
00:11:49.240 -->
00:11:54.080that you kind of, it's so cool, but you kind of blast past it when you learn it. And you,
00:11:54.080 -->
00:11:58.640when you're learning Python, it's a little bit, a little bit more advanced than you want,
00:11:58.640 -->
00:12:04.640but this is cool stuff. This article is by Martin Heinz and he's just kind of briefly
00:12:04.640 -->
00:12:10.120describes what handful of the different tools within iter tools and a library called more iter
00:12:10.120 -->
00:12:15.220iter tools does. And all of these are around iterables and iterating over things.
00:12:15.220 -->
00:12:20.180And you wouldn't think right off the bat that you could do so much, but I'm going to highlight
00:12:20.180 -->
00:12:27.300a few of these, not all of them for iter tools. He talks about compress, accumulate cycle and T.
00:12:27.300 -->
00:12:33.040And I had not been familiar with cycle and T, but they're pretty cool. So iterables,
00:12:33.040 -->
00:12:39.560some of them that they like they're empty once you go over it once and T allows you to make
00:12:39.560 -->
00:12:46.520multiple references to one interval. That's pretty neat. And cycle is so cool. It allows you to like,
00:12:46.520 -->
00:12:52.460so you, if you iterate over like say a set or a list of items, you can just iterate through it once,
00:12:52.460 -->
00:12:56.920but cycle allows you to just keep going over and over and over again. It's like a never ending
00:12:56.920 -->
00:13:03.760repeating iterable. And, the little example in the document or in this article that shows you how to
00:13:03.760 -->
00:13:10.620easily iterate through characters to make a never ending spinner on a command line. So it's kind of
00:13:10.620 -->
00:13:10.720fun.
00:13:10.720 -->
00:13:15.840Oh yeah. That's cool. Yeah. You just put the different ones and a list and then you just cycle
00:13:15.840 -->
00:13:16.040it.
00:13:16.040 -->
00:13:21.180Yeah. The note is that like for things like games and stuff like that, if you iterate through,
00:13:21.180 -->
00:13:25.720through different players, you might have to do that. But there's a lot of cases where I want to,
00:13:25.720 -->
00:13:32.120like maybe zip through a couple of lists, but I, it's really just a site. One of the lists is a
00:13:32.120 -->
00:13:37.780cycle. You can kind of do that. It's cool. More iter tools has a whole bunch of things like he's
00:13:37.780 -->
00:13:43.000highlighting different things that are different ways to chop up your iterations. Like there's a
00:13:43.000 -->
00:13:45.840divide that just divides it into different sub iterables.
00:13:46.140 -->
00:13:49.480Like paging almost, right? Like process them 25 at a time or something.
00:13:49.480 -->
00:13:53.380Yeah. So there's a whole bunch of different ones. Like in partition is like, if you have a,
00:13:53.380 -->
00:13:59.620an expression to that can be mapped to true or false on any of your elements, it'll split the,
00:13:59.620 -->
00:14:04.020the interval into two intervals based on that predicate, which is pretty cool.
00:14:04.020 -->
00:14:08.680A side effect that I never knew about. So if you want to add another, another function
00:14:08.680 -->
00:14:14.820that gets called with each element during iteration, wow, this is cool. I think that's neat.
00:14:14.820 -->
00:14:19.940I don't know what to use it for, but I'm going to come up with a use. There's a bucketizing to be
00:14:19.940 -->
00:14:25.560able to do a bunch of buckets, map reduce, just a whole bunch of neat things. And I think this is a
00:14:25.560 -->
00:14:31.160good, if you think you, you've like sunk your teeth into Python and you want to like take it to the next
00:14:31.160 -->
00:14:33.800level, this is a good article to, to learn iter tools.
00:14:33.800 -->
00:14:38.960This is a super interesting and iter tools is definitely one of those things where you feel like
00:14:38.960 -->
00:14:44.680I'm always surprised that there's extra stuff. Collections as well. You know,
00:14:44.680 -->
00:14:48.880it's just like, wow, there's also that thing. Why did I not ever use that thing? You know,
00:14:48.880 -->
00:14:53.780there's some things about programming that I know some people say they'll, when they come to a problem
00:14:53.780 -->
00:14:59.240and they need a solution for it, then they'll look up. That's how they learn new things. But you're
00:14:59.240 -->
00:15:04.000right with collections and iter tools, you don't know to look it up because you don't know there's
00:15:04.000 -->
00:15:08.940a solution there. So these are good things to like skim through so that you just have seen them once.
00:15:08.940 -->
00:15:14.020So that later when you run into a problem, you're like, oh, there's a thing in iter tools that I can
00:15:14.020 -->
00:15:18.780use for this. Yeah. I know that that's true even before I look, but I don't know what it is.
00:15:18.780 -->
00:15:23.780I just know if I go dive around in there, it's probably something I can use at some point.
00:15:23.780 -->
00:15:27.500Yeah, that's a cool one. And it's nice to see it put together and highlighted like that.
00:15:27.500 -->
00:15:31.120I just really want to talk about this next one. Okay. Okay. All right. So this next one is called
00:15:31.120 -->
00:15:40.960JustPy. And the idea is I want to create a web application that allows me to do single page
00:15:40.960 -->
00:15:45.800app, cool, interactive, front end framework type stuff that I would do with something like say Vue.js,
00:15:45.800 -->
00:15:53.440but I don't want to write JavaScript. So it's pretty interesting. It's a web framework that lives on a
00:15:53.440 -->
00:16:01.760server. So you put it on, you know, your standard, it actually supports async stuff. So you'd put it on
00:16:01.760 -->
00:16:10.100like a async server, like Starlette or something like that, or uvicorn. And then you express how the pages
00:16:10.100 -->
00:16:17.280are supposed to look in Python. And it creates the JavaScript that's going to make that happen. And then
00:16:17.280 -->
00:16:23.720you're going to create, I guess, web sockets or some form of back and forth back to the server to run your
00:16:23.720 -->
00:16:30.600Python code as people interact with it. Okay. Using effectively like Ajax type of interaction. So yeah,
00:16:30.600 -->
00:16:36.480it lets you create these front end and, you know, sort of full stack web apps with no front end programming.
00:16:36.480 -->
00:16:42.500And the way it works is like I said, it has no front end back end distinction. All the programming is
00:16:42.500 -->
00:16:47.140done on the back end, allowing a simpler, more productive way and more Pythonic way to
00:16:47.140 -->
00:16:51.940create a web app, but it intercepts the relevant events on the front end and sends them back to
00:16:51.940 -->
00:16:56.480the back end to be processed, either talking to a database or just like having the Python logic there.
00:16:56.480 -->
00:17:00.960Neat. Yeah. It's a really, really different take. And it's been getting a lot of traction.
00:17:00.960 -->
00:17:06.300My personal thought on it, the verdict's a little bit out. I'm not sure how I feel about it,
00:17:06.300 -->
00:17:10.020but I definitely think it's interesting and people should check it out to see what they think about it.
00:17:10.020 -->
00:17:15.340It's really based on like classes and components. So you can create these components,
00:17:15.340 -->
00:17:19.740which then can be put onto the page. So like here's a login component or like a
00:17:19.740 -->
00:17:25.180component that displays a list of podcast episodes or whatever. You can put those in different places
00:17:25.180 -->
00:17:31.760and you can create these custom components and they can either be just straight Python where you
00:17:31.760 -->
00:17:36.840create kind of the DOM in Python. That's part of the, if it was more HTML based, I'd be happier,
00:17:36.980 -->
00:17:43.380but it does also support HTML components that then work with it and even has like interactive
00:17:43.380 -->
00:17:45.260charts and grids. So that's pretty cool.
00:17:45.260 -->
00:17:51.200Yeah. I see what you're saying. It's kind of neat, but also if you don't want to learn HTML and
00:17:51.200 -->
00:17:53.060JavaScript, learn this instead.
00:17:53.380 -->
00:17:58.580Yes, exactly. It's kind of like that. It's like too much avoiding HTML. I think it's awesome that the
00:17:58.580 -->
00:18:04.220logic of it is in Python and this, this no distinction stuff is really cool about the front and back end.
00:18:04.360 -->
00:18:14.200I just wish I would design the site in HTML and CSS and then plug in the liveness through this, not as much of the content definition.
00:18:14.520 -->
00:18:26.700That said, Quasar, I suspect many listeners are not familiar with the Quasar library, but the Quasar library is a cool library that's got all sorts of stuff built on top of Vue.js.
00:18:26.700 -->
00:18:33.040So their little slogan is build high performance Vue.js user interfaces in record time.
00:18:33.040 -->
00:18:40.520So you can see they've got like, think of kind of like what Bootstrap did for web design is kind of doing that for Vue.js, right?
00:18:40.520 -->
00:18:53.240You get some like cool stuff going on there. And the reason I randomly diverted sideways and started talking about Vue.js and Quasar is because JustPy is built on libraries that you would know.
00:18:53.240 -->
00:19:03.820So Starlette and uvicorn for the server side, but Vue.js for the front end, that means the Quasar library automatically plugs in its components and functionalities into JustPy.
00:19:03.820 -->
00:19:08.680So that gives it like actually a huge boost. Like, oh, there's already this really cool library that just plugs into it.
00:19:08.680 -->
00:19:09.740Oh, nice. Okay.
00:19:10.020 -->
00:19:25.200That gives it a boost. But yeah, I wish you could define more stuff in HTML and then bring it. Now you can say like, here's an HTML page. I'm going to import it and like work with it. But it's not, it doesn't seem to be my first reading that that's like the natural way to go.
00:19:25.200 -->
00:19:26.740Yeah. Okay.
00:19:26.740 -->
00:19:31.100But nonetheless, I love that this exists. It looks really interesting and people should check it out.
00:19:31.100 -->
00:19:31.420Nice.
00:19:31.420 -->
00:19:34.000Nice. I wonder what the maintenance story like is around it though.
00:19:34.000 -->
00:19:42.340Yeah. I'm curious. So we want to talk about maintenance and I'm not sure why this article is titled modularity for maintenance.
00:19:42.560 -->
00:19:49.860So modularity for maintenance, it's a bunch of automation tools that you can use to help maintain your open source projects.
00:19:49.860 -->
00:20:11.400And it's really terse with links, but it's got continuous integration and talks and linting tools and type checking and dependencies and security scanning and using code coverage and formatting help and releasing and all these automation tools that help you, which is actually, it's really cool to have all these listed down in one place.
00:20:11.480 -->
00:20:27.660And I like that. If you've done all this for a bunch of projects and then you start a new project or maybe you split one project into two projects, just the overhead of making, setting all that stuff up again for another project is in itself a lot of work.
00:20:27.660 -->
00:20:43.340So he's hoping for somebody to make so that you can save some time. But all of us also, I never really thought about all of these time-saving things you actually end up having to set up again for each project.
00:20:43.340 -->
00:20:45.280Are they actually saving you time?
00:20:45.280 -->
00:20:46.080Yeah, right.
00:20:46.140 -->
00:20:49.180It depends. It depends how long you use the project. Probably they are, but yeah.
00:20:49.180 -->
00:21:00.740Probably. But I guess it is interesting to think about the extra overhead and you have to have some of these require login credentials and stuff that you have to set up.
00:21:00.740 -->
00:21:08.660But actually, I really like all this list and I kind of want to go take one of my projects and see if I can make sure I'm hitting all of these things.
00:21:08.820 -->
00:21:21.740Yeah, it's super cool. And I just last night used Cookie Cutter, the new Python package template from Cookie Cutter to create a Python package that I'm working on.
00:21:21.740 -->
00:21:30.540So yeah, this is super real. I'm like, oh, I bet there's a Cookie Cutter thing to set up like the setup file just right and integrate talks and whatnot. And yeah, let's hit it with that.
00:21:30.800 -->
00:21:32.640Where was this new Cookie Cutter thing?
00:21:32.640 -->
00:21:42.940It's not super new. If you go to Cookie Cutter, there's like a place called, a park called Pantry Full of Cookies or something like that. Let me go. I'll pull up it really quick.
00:21:42.940 -->
00:21:53.140Under the documentation on cookiecutter.readthedocs, there's a pantry full of cookie cutters. And then the first four are for making packages.
00:21:53.360 -->
00:22:06.260So there's Audrey's ultimate Python package project template creator thing. There's a minimal package for pip installable projects and a couple of others. The one I used was the second one, I believe.
00:22:06.260 -->
00:22:13.260No, third one. I don't know. I can't remember anymore. And it was on a different computer, so I can't get to the history of it.
00:22:13.260 -->
00:22:13.500Okay.
00:22:13.500 -->
00:22:22.740But yeah, anyway, these are really cool because basically it sets it up. I used the one that was the minimal, PyPackage minimal. It automatically sets it up to work with pytest.
00:22:22.740 -->
00:22:28.300And it has the setup Py all generated based on what you tell it and stuff like that. It's pretty cool.
00:22:28.300 -->
00:22:32.800Okay. Well, okay. If it's not using Flit, I don't know if it's really minimal.
00:22:32.800 -->
00:22:42.920But the thing is, it doesn't have all these things that Glyph's talking about, right? It does have Travis CI integration in there.
00:22:42.920 -->
00:22:48.020But there's a lot of things that it could be added, and it's pretty neat. Somebody could fork that and then make it.
00:22:48.020 -->
00:22:51.120Yeah, I definitely think so. So, yeah, hopefully.
00:22:51.340 -->
00:22:55.440Yeah. Nice. All right. Well, I guess that's it, huh? What else we got? What do you want to let people know about?
00:22:55.440 -->
00:23:04.560Here's a quick one. Not really big enough to warrant a whole topic, but I noticed Sentry is helping to fund some open source projects.
00:23:04.560 -->
00:23:10.160They got some money from somebody else. They decided to match it and pass it along.
00:23:10.760 -->
00:23:17.700And they're going to help fund Black, PyPI, pytest, StructLog, and a Rust tool called Gimli.
00:23:17.700 -->
00:23:18.340Cool.
00:23:18.340 -->
00:23:26.040And that's pretty neat. I like the... Actually, I haven't played with StructLog too much. I've played with it a little bit, but all the others I use all the time.
00:23:26.040 -->
00:23:32.140Oh, yeah. Very nice. Yeah. Sentry, a nice open source-based company. Funding open source. Pretty nice.
00:23:32.820 -->
00:23:37.360The circle of life. Except for Sentry's not eating any of these, but other than that.
00:23:37.360 -->
00:23:41.600Nice. Okay.
00:23:41.700 -->
00:23:48.480Thanks. All right. A couple of quick announcements on my end. Just launched a new course, Python for Absolute Beginners.
00:23:48.480 -->
00:23:59.420So this is like, hey, I didn't take CS at college. What the heck is all this stuff about when people talk about memory allocation and variables and data structures, but actually really getting started with Python.
00:23:59.420 -->
00:24:03.520So that's a super fun one. People can check that out. Build a lot of games, but learn a lot of Python.
00:24:04.000 -->
00:24:14.020And then also related on Talk Python training, started streaming a couple of our latest courses where possible, including this one I just announced, is high DPI.
00:24:14.020 -->
00:24:25.060So almost 4K streams, and it's like night and day. It's so awesome to sit there and look at the screen and go, that is like as if I'm looking at a real monitor.
00:24:25.060 -->
00:24:27.000Just back in time.
00:24:27.000 -->
00:24:33.240So anyway, I'm trying that out. Hopefully, so far it's been working well for people, but if for some reason it doesn't, people can send me a note.
00:24:33.940 -->
00:24:36.600Here's an interesting one that comes from Anthony Sotili.
00:24:36.600 -->
00:24:49.620Amazon Web Services has decided to no longer publish AWS CLI, their package, AWS CLI, to PyPI, pulling a 700 million download package off of PyPI.
00:24:49.620 -->
00:24:51.360Think of all the bandwidth they're saving.
00:24:51.360 -->
00:24:53.080That's weird.
00:24:53.080 -->
00:24:58.000So this is not their Python library, potentially.
00:24:58.000 -->
00:25:03.620This is the CLI tool that people who don't even do Python would use.
00:25:03.880 -->
00:25:04.140Right.
00:25:04.140 -->
00:25:05.420It's just implemented in there.
00:25:05.420 -->
00:25:07.520So it's not a huge deal.
00:25:07.520 -->
00:25:10.920It's not like a giant, oh my gosh, what's happening to the world sort of thing.
00:25:10.920 -->
00:25:12.000But it's also strange.
00:25:12.000 -->
00:25:21.200So what's more strange is I'm linking to Anthony Sotili's Twitter thread that talks about this, but then that links over to GitHub where there's more conversation.
00:25:21.540 -->
00:25:23.000On one hand, it makes sense, right?
00:25:23.000 -->
00:25:31.140Like, why use pip to distribute a library that is not specifically for Python developers?
00:25:31.140 -->
00:25:35.580But the other bit is, well, the replacement's an unversioned zip file of script.
00:25:35.580 -->
00:25:39.860So I don't know which is better.
00:25:39.860 -->
00:25:40.680It's a little bit funky.
00:25:41.260 -->
00:25:45.340And then finally, people might have noticed some weirdness with the podcast.
00:25:45.340 -->
00:25:48.340I don't know what has gone on, but something happened.
00:25:48.340 -->
00:25:49.800I think it was at Apple.
00:25:49.800 -->
00:25:58.120On Talk Python, it all of a sudden started showing four episodes, some from three or four years ago, as the latest.
00:25:58.640 -->
00:26:02.840And you might say, well, maybe something changed in the database and the dates got wrong or the number.
00:26:02.840 -->
00:26:04.520Like, we changed nothing.
00:26:04.520 -->
00:26:07.780Didn't change the RSS feed generator.
00:26:07.780 -->
00:26:09.080We didn't change the data.
00:26:09.080 -->
00:26:10.980It just all of a sudden started going crazy.
00:26:10.980 -->
00:26:23.880And my theory is they've put some kind of limit on the size because we were shipping like 2.5 megs of XML for each request, especially for Python bytes because the show notes are large.
00:26:24.800 -->
00:26:30.840And I think it just went like, no, but its response to no was just to do something really weird.
00:26:30.840 -->
00:26:42.180So on Python bytes, we now are showing just the last half year because the alternative was to have things massively broken in the RSS and the podcast players.
00:26:42.180 -->
00:26:45.680So if you want the older ones, they're still available on the website.
00:26:45.680 -->
00:26:47.100We're not doing anything like that.
00:26:47.100 -->
00:26:52.240But this was the fix that I had to put in to get things to work again on the teams.
00:26:52.240 -->
00:26:53.020I don't know what happened.
00:26:53.020 -->
00:26:54.500I think it's a fair tradeoff.
00:26:54.640 -->
00:26:55.160Yeah, I do too.
00:26:55.160 -->
00:26:58.840And also, like, it means stuff refreshes faster for people.
00:26:58.840 -->
00:27:02.360They're not pulling 2.5 megs, like, all day long with their podcast players.
00:27:02.360 -->
00:27:05.420I don't mind on the web server, but for them, they might mind.
00:27:05.420 -->
00:27:05.700Yeah.
00:27:05.700 -->
00:27:09.340They don't pull it all unless they download every episode or something, right?
00:27:09.340 -->
00:27:14.460Well, it's constantly pulling that 2.5 megs over and over and over, right?
00:27:14.460 -->
00:27:18.980Like, if you pull up the tail of the web server, it's just going toom, toom, toom against that over and over and over.
00:27:19.480 -->
00:27:23.780Then it pulls the actual episodes it finds that are different.
00:27:23.780 -->
00:27:24.760Oh, right.
00:27:24.760 -->
00:27:25.060Okay.
00:27:25.060 -->
00:27:25.640Got it.
00:27:25.640 -->
00:27:25.700Yeah.
00:27:25.700 -->
00:27:27.280But it's hitting the full-on RSS.
00:27:27.280 -->
00:27:32.300So now the RSS speed is like 250K, which is still pretty big, but it's not 2.5 megs.
00:27:32.300 -->
00:27:32.740Oh, yeah.
00:27:32.740 -->
00:27:33.720Sounds smaller.
00:27:33.800 -->
00:27:37.320Are you a fan of physics, Einstein, relatively?
00:27:37.320 -->
00:27:38.820I like gravity.
00:27:38.820 -->
00:27:39.240It's good.
00:27:39.240 -->
00:27:39.520Yeah.
00:27:39.520 -->
00:27:39.860Yeah.
00:27:39.860 -->
00:27:42.680And you're also a fan of software quality.
00:27:42.680 -->
00:27:43.080Yep.
00:27:43.080 -->
00:27:45.560As most software people should be, I suspect.
00:27:45.560 -->
00:27:49.400But did you know that E equals MC squared is-
00:27:49.400 -->
00:27:51.260I have heard that on t-shirts before.
00:27:51.260 -->
00:27:55.320It's a statement about programming, really.
00:27:55.320 -->
00:28:00.920I didn't realize Einstein was into this, but it's about, like, testing and code quality and bug rates and whatnot.
00:28:00.920 -->
00:28:01.340How?
00:28:01.340 -->
00:28:06.380Because E equals MC squared is errors equals more code squared.
00:28:06.380 -->
00:28:13.000So as you add code, the errors increase at the square of the amount of code, basically.
00:28:13.000 -->
00:28:14.840And that seems not totally untrue.
00:28:14.840 -->
00:28:15.820Yeah, that's funny.
00:28:15.820 -->
00:28:16.680But yeah, you're right.
00:28:16.680 -->
00:28:18.180It's sort of kind of true.
00:28:18.180 -->
00:28:18.500Yeah.
00:28:18.500 -->
00:28:23.820I'm not sure if it's the square or it's, like, 1.5 or maybe it's, like-
00:28:23.820 -->
00:28:25.460It's definitely nonlinear, though.
00:28:25.460 -->
00:28:29.760You know, some polynomial, but it's nonlinear and it grows.
00:28:29.760 -->
00:28:30.520Yeah, for sure.
00:28:30.520 -->
00:28:30.720Yeah.
00:28:30.720 -->
00:28:31.100For sure.
00:28:31.160 -->
00:28:32.800Anyway, E equals MC squared.
00:28:32.800 -->
00:28:33.840That's the joke for the week.
00:28:33.840 -->
00:28:36.260First law of software quality, E equals MC squared.
00:28:36.260 -->
00:28:36.760Nice.
00:28:36.760 -->
00:28:37.580I like it.
00:28:37.580 -->
00:28:38.240Awesome.
00:28:38.240 -->
00:28:38.980All right.
00:28:38.980 -->
00:28:39.160Yeah.
00:28:39.160 -->
00:28:39.540Thanks.
00:28:39.540 -->
00:28:39.900Bye.
00:28:39.900 -->
00:28:40.260Bye.
00:28:40.260 -->
00:28:42.500Thank you for listening to Python Bytes.
00:28:42.500 -->
00:28:44.960Follow the show on Twitter at Python Bytes.
00:28:44.960 -->
00:28:47.980That's Python Bytes, as in B-Y-T-E-S.
00:28:47.980 -->
00:28:50.880And get the full show notes at Pythonbytes.fm.
00:28:50.880 -->
00:28:55.940If you have a news item you want featured, just visit Pythonbytes.fm and send it our way.
00:28:55.940 -->
00:28:58.000We're always on the lookout for sharing something cool.
00:28:58.240 -->
00:29:02.200This is Brian Okken, and on behalf of myself and Michael Kennedy, thank you for listening
00:29:02.200 -->
00:29:04.420and sharing this podcast with your friends and colleagues.