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


« Return to show page

Transcript for Episode #175:
Python string theory with superstring.py

Recorded on Wednesday, Mar 25, 2020.

00:00 Hello, and welcome to Python bytes where we deliver Python news and headlines directly to your earbuds. This is Episode 175. Recorded March 26 2020. I'm Michael Kennedy. And I'm Barry knockin, Brian, we have a special guest. Welcome Matt Harrison. How you doing? Man? Glad to have you here. Good. Good. Yeah. Come on. Yeah. It's always nice to have you on the show. Before we get into it. Let me just tell you this episode sponsored by data dog, check them out of Python bytes.fm slash data dog. I'll tell you more stuff about them later. First, I want to just throw this out to both of you guys like the world is? I don't know is it turned upside down? Or is that locked down? Or what has gone on with the world? That's crazy. We're kind of software people. So and I know we're all kind of in different boats, I am definitely grateful that I'm a software person. I have a lot of a lot of friends that are not that are in the retail industry, or the selling stuff that people sort of industry, or self employed. And those people, they're really hurting. I've got a lot of people, I know that if they're self employed, you don't qualify for, like, unemployment insurance and stuff. So there's a lot of people hurting. Are you guys it's crazy. Yeah, man, how about you, I just found out this morning that my largest client just dropped all my trainings for the rest of the year. So that's not your favorite phone call or email to receive. That's not the best news. But the thought that I have on that is like, past couple years have been very good, right? And people said, like, the bubble will burst. And I don't know that we thought that a virus would do this. But I mean, it looks like winter came for better for worse. And so people are going to have to adapt. And now if you can weather the storm, it might. It's going to be tough, though. I mean, I I was even talking with some friends who are in the medical industry. And they're like, we're worried about our jobs. Right. And these are like, doctors and people who work at the hospital. So it's Yeah, it's interesting to see what's going on. And I've worked from home for the good portion last 15 years. And right now, it's scary to see that there's a lot of upheaval, and we'll see what happens. How are things going for you, Michael? Well, you know what, it's really interesting if, if you'd asked me this question, like six years ago, when I was doing mostly in person training, it would have been like somebody just cut the lights with Java said, you know, we're all leaving. Yeah, lock the door on your way out. Right, it would have been purely traumatic. Luckily now, like, online courses are great. Still, podcasting is great. Like, what's ironic is my work life is literally unchanged. But the rest of my life is scrambled, right like my daughter's home from school because they closed school like Oregon's now on full lockdown. Like, it's hard to go out to dinner, right? So everything is changed in some ways, but ironically, not my work life. Really. I'm sure it'll have some effect eventually, but nothing immediate. Now. I guess one more thing, before we move off. I'm just curious, like, what are your plans are on training? Like? Are you going to be teaching over zoom? Or is it just focus on other stuff until it comes back? Yeah, I think both of that I do have some clients who are moving to virtual training. And I already do a bunch of virtual training anyway. So I mean, it's sad that some of them aren't able to or can't due to circumstances or whatnot, but try and see if other people want Virtual Training and just work on other products that people are interested in as well. Yeah, absolutely. Well, Jeff, you guys and everyone out there, it's, it's gonna be a wild ride. And hopefully, the software side of the worlds a little bit less bumpy, but it's still it's crazy. Yeah. All right. Well, let's talk a little bit about the future, Brian, like, we can't predict when the COVID stuff is gonna be better. But I you could probably predict some stuff about the Python future, I'm just still getting excited used to be able to have Python three, eight everywhere, and, but we've got Python three, nine, right around the corner. And, and October is the scheduled release. I don't know if that'll change due to the virus or not. But that's where it is. And one of the cool things that I noticed from my blog article is that there's union operators coming for dictionaries. In Python three, nine, and this is pepp 584. And there's a article called the dictionary merging and updating in Python three, nine, by not, I think young CWI. And there's a couple new operators one of them, it's just the the bar, or the bar equals, or the pipe operator, whatever looks normal for if you're used to, I guess that's the math or operator, it's like a bit wise, or a bit wise, or Yeah, I'm kind of excited about it. And so you can combine two dictionaries by just doing like a dictionary one, or dictionary D two, or dictionary two or something like that. And then the equivalent assignment operator as well, which is an up really an update operator and emerge. The article spent a little bit of time talking about the other older methods that you can use to combine dictionaries now and I know

05:00 People have covered those in a lot of places. The one thing, that article actually spent a lot of time on it. And I just think it's something to watch out for and be aware of is when you're combining dictionaries, usually the if there's overlapping values, like if there's a value with the same key, in both dictionaries, you'll get the second one will take precedence. It's just something to be aware of. Yeah, yeah. And that's the way it works in the, like, the current operators as well. Right? The star star sort of combine stuff and whatnot. Yeah. So as you're aware of it, it's good to know, but this is clean. It's actually something that now that I see it, I'm surprised that we don't already have a, an operator already into mind dictionaries, because it's something I got to do a lot of. So yeah, and if you look at the syntax there for the pipe, I mean, the pipe is already in the set operator, and prior to sets existing when people used to use dictionaries to emulate sets. I mean, they wouldn't do the OR operator. But but it's it's interesting, that sort of coming round circle now that we originally had dictionaries, people started using dictionaries as a simple replacement for sets. Then we got sets, which had the pipe operator, now the pipe is coming back to the dictionary. Interesting. So why do you guys think they didn't use plus? Like, you want to combine two things? Like two lists, you don't use a pipe to put them together? Use a plus for strings? Use a plus? Plus already existed? I think it's because of the Union operator already being used for sets? Yeah, I think so. Yeah. All right. Cool. Well, yeah, it's good to see some nice short hands coming there. But if we can have a pipe equals operator, give me the plus plus, come on, I just want the plus plus.

06:40 Yeah, Jeff. Oh, five. What does that mean? All right, Matt, you got the next one. And this one is short and sweet. But it looks pretty cool. Have you got the use case for it? Yeah, yeah. So there is this super string library, which is a new library, that's a replace meant of, well, not a replacement. But it's a new string library for holding sequences of characters, it's built on this rope data structure. And apparently, it's pretty optimized, it uses a 20th, the amount of memory and fifth, the speed, so operates five times faster for a lot of operations. I think this could be super useful for people who are manipulating data. So it'd be interesting to look at, you know, if the people who are doing NLP could take advantage of this. Definitely, like the memory constraints, you know, using a 20th, the amount of memory would be awesome, even in places like pandas, NLP, as well, natural language processing. The API is pretty basic. Right? Now, it's got concatenation, getting to the length, doing some indexing and slicing and stripping and upper casing and lower casing. So that could be a good with the speed and memory performance or showing that could be a good enough limited set of capabilities. Sort of, for me, the elephant in the room is the F string. For me. That's the best feature of Python three. I know. implement that. And let's use it. Yeah, the other thing that's missing is negative indexes. But that can't be hard to add, honestly, maybe it's hard to add quickly. But it can't be hard to add negative indexing. That's a good point. I mean, they don't make any reference to whether they support Unicode. So that's, I guess another question, right? If they do support the Unicode capabilities, the Python supporting I mean, Unicode can make indexing a little bit more complicated. But that might be what's going on there. But yeah, this was interesting to watch. Interesting library to watch. What do you think, Brian? I'm just not in a place where this drinks, strings or the memory or the like the bottleneck in my any of my applications, though? Yeah, yeah. But they give you an example, like a real world example. Like, I'm been playing with some markdown stuff for like this sort of CMS side of things that I'm writing a markdown. And if you've got something that's maybe 1020 pages of markdown, it takes half a second, to convert that from markdown to HTML. I don't know how much of that is like the actual string juggling and how much of that is just converting it to markdown is slow. But that's a non trivial amount of processing. That's, like sort of around the corner. I mean, you would never do it manually, you would use a library, right? But still, you can bet on that. You can think of all the people who are using static libraries, right for webpages who you know, once you get, they all complain about once you get x number of pages in there, they start getting slow and the rebuild takes five seconds instead of a half a second or whatever, right? And so write something like this could help there as well. Right, theoretically, so this is not a super popular library, but I'm glad you put it on here because I think it's pretty cool. I guess two thoughts. One, it'd be interesting to look at what they're doing and if there's any easy low hanging fruit to bring back to C Python because it

10:00 It'd be better if just Python strings were faster. They're like, why would you make this? It's the same speed. I mean, then the other Brian, you may have noticed there's no test. Oh, yeah, it looks like it's recent. It's like, I don't know if it's even been around for more than a week. So yeah, I think it's pretty new. So somebody's like, Oh, this is cool. Let me try it out. Like maybe a way you could participate is like, write some tests just to verify things, right. But uh, yeah, pretty cool. It's just imaginary. If there's no test, it's like, no picture, no proof, man. If it continuously deployed in the woods, and there were no test to hear it didn't actually happen. Something like that. Yeah, yeah. Exactly. sure that that's the same, I think the historical version, I thought your way of your new testing strategy is if it doesn't have tests, and you don't commit it, and you say you're using something like that?

10:48 Yeah, that's, that's good. I thought, Yeah, that's a good way for sure. Alright, so this next one is going to affect everybody who works with Python, this is a big deal. Hopefully, it's not a bumpy deal. But it's a big deal. So the Python packaging authority folks, the PSF. subgroup, they recently got funding to hire some developers to make PIP better. So PIP is awesome. We all PIP things and even if you don't PIP things, if you you know, Pip, em them or your poetry them, you really PIP them down below, right? So they got a bunch of funny to make that better. And one of the challenges one of the first challenges that they're tackling is that PIP will. It's not, it doesn't take into account all the stuff you're trying to do. It just says, I see a requirements file. Let me just go from top to bottom, just start hitting it right? install the first one. So the second one, so they're rolling out a new PIP resolver at the end of the year. That's pretty cool. Yeah, this is neat. Yeah. So the idea is, basically, it's good to go. And it's going to look at the dependencies of the various packages and try to install something that is consistent across all of them, like maybe the first package in your requirements file requires, I don't know, Doc utils 16. And the second one requires doc utils 15. Or maybe the first one doesn't even specify and 16, just the latest, if you pip install dash R, that you're gonna get 16. And then it's gonna complain that you have 16 and not 15. You know what I mean? It's like, it just doesn't even factor in the larger system that these two things have to coexist. So that's one of the things that we're working on. So to reduce inconsistency, you know, no longer install a combination of packages that's mutually inconsistent, and it will be no pushover can be strict.

12:33 If you ask it to install two packages with incompatible requirements, it will say no, it will not do it. Yeah. And then it just doesn't install anything, I think, yeah, just says doc inside, like you that might have some problems, right? Yeah, am I or make people's

12:50 process work differently? Because I mean, right now, I know, it sounds a bunch of library, top of each other. And I can sort of just install them over on top, I have my libraries, and some of them serve for work, and some of work doesn't refuse to install them. So this might be a speed bump in the road for a lot of people. And maybe in the end it it works out better. But my cousin consternation in the short. Yeah, that was my first thought Exactly. It's like, oh, there's gonna be a bunch of stuff that just won't install anymore. And maybe a library itself can stall because two of its base libraries dependencies like themselves are inconsistent. How are they working now that you just get a warning, and it just still works. It's not that they're necessarily truly inconsistent. It's one says I require library less than equal to this version. Another one says, I require library greater than equal that version. That doesn't necessarily mean, the one that requires the lower one wouldn't work with the newer one. It's just that's what the requirements state, you know, what I mean? Like, for example, Boto three, which is the Python three library for talking to AWS and its underlying library, Boto core. At one point, were having different dependency, like inconsistent dependency statements, or something weird like that I was running into, but it didn't matter. It still ran, I'm just like, a better run the unit test, it says, These aren't going to work together. Let's see if they, you know, like, maybe there's some corner of that thing. That doesn't work, but I don't use that corner. So like, I don't care. Yeah. Or you have like in the machine learning side, you have like, this library depends on some old version of TensorFlow. But it doesn't, you're not using tensor flow, you're using some utility library in it. But it also has support for tensor flow, but you're not using it. So if you had a different version of tensor flow on it, it wouldn't really affect you because you weren't using that portion of it. Right, but it sounds like PIP will say, No, I can't stall these things. They they make statements about two things that they they can't coexist, but you're like, I don't really care that they're working. You know what I mean? So I think this is good. I think it makes things more predictable. But you're right, man, it's definitely gonna cause some

15:00 some challenges and maybe it'll get people to update things like the base library statements that they depend upon more carefully. Yeah, one of the things I'd like to see for talking about PIP is that I'd really like to see Python come out with Dart releases that if there's a new version of Pip, that all the latest versions of Python have have the latest version of Pip. I'm just really tired of installing Python places and immediately having PIP out of date. Yeah, I actually have a an alias that when I create a virtual environment, then immediately does a pip dash install dash s upgrade PIP instead of tools, because why doesn't it just do that for me? Yeah. Anyway, can I just update the top level one so that all my new virtual environments get get the newest one? Yeah. Anyway, this is coming. They blogged about it, I link to the blog post from the PSF. They said this couple things you can do to help First and most fundamentally, help them understand how you're using Pip, they have some user experience research going on, there's a link to go to part of that. You can check right now if this is going to be a problem for you go to your project, your virtual vironment activated and type PIP check. And it will tell you if you are in this inconsistent state. I had one website that was couple that weren't, I hacked around to I fixed him up and everything was good. Make sure you test the new version of PIP are probably bout may help spread the word. All three of us are doing that today. Awesome. And if you develop a tool like poetry or something that lives on top of this, make sure that you test integration with the thing coming out in beta in May. All right. Really quickly, before we move on, let me tell you all about data dog, because this episode is brought to them brought to you by them. So let me ask you a question. Do you have an app in production that's slower than you'd like? is its performance all over the place? Maybe fast, sometimes slow others? Here's the important question. Do you know why it's slow or inconsistent with data dog you will you can troubleshoot your apps performance with data dogs end to end tracing, use the detailed frame graphs to identify bottlenecks and latency and that finicky app of yours. be the hero that got the app back on track at your company. Get started with a free trial today at Python bytes FM slash data dog usable product help support the show. Matt, I think this next topic you got here. This pretty much is on everyone's mind right now. And we may be trying to not think about it. But there's some useful stuff going on here. Yeah, just with the whole Coronavirus, COVID. Teen, I've been thinking, you know, what can I do as an individual to help and and I think a lot of people are trying to flatten the curve or limit the growth. And I think a lot of people, at least in our community understand the importance of that, but maybe not the general populace as well. So one of the things that I thought that I could do is just, you know, spread among my local community, through my local social media, like what is the growth locally here where I'm based, I'm based out of Salt Lake in Utah. And so I had a problem actually getting the data even. I mean, there, there aren't any repositories that have local Utah data, the local department of health is reporting on it. But their data, there's not a source of data that you can cleanly pull. So I've, I've been pulling, making my own data source. And then I've been just posting those on Twitter and LinkedIn, just with my local data to sort of track what that growth looks like in sort of that people's minds to sort of pay think about, think about what's going on locally and see what changes you can make. And I did some basic modeling to sort of predict what's going on, because I've been reading other people's models about you know, this is an exponential growth, wait, blah, blah, blah, what what that looks like. And so I did some basic models using machine learning. But it's also in the twittersphere. And elsewhere, people are saying all these data scientists are coming and just throwing machine learning at this. And that's not the right thing to do the right thing to do is read the literature and see, you know, what epidemiologists and others have done. And so I just want to point to some things that might be interesting, I've got a link to a kaggle project that that shows that making some basic machine learning models, but it also points to a library that's found in Sai pi, that probably a lot of people don't know about, I know about because I teach about it. And that's in sci fi. There's an od e i n t function, which is an A solver for what's called ordinary differential equations. And so this is probably a math class that you may have taken in college, I took one in college and it was purely theoretical, and I basically forgot everything since then. But there's what's called an SI ER model. And that stands for you have people who are susceptible to being sick, you have people who are infected and you have people who are recovered. And so typically, these flatten the curves are looking at the infected part, the infected growth of that, but there's a relationship between all these three different groups and they're more complex.

20:00 models. But if you use ordinary differential equations, that is the tool that epidemiologists and statisticians use to plot these and determine what's going on here, rather than just, you know, throwing it at linear regression, or trying to do a machine learning model that way. So just want to point people at this kaggle project has got an example of doing this si r model, it's also got some basic machine learning models as well. But be aware that you know, a lot of these things that we learn about that in theory, you think, oh, that doesn't make sense. This is actually a case where ordinary differential equations are the right or one of the right tools to look at this data and understand what's going on there. And it's a cool project. Yeah, definitely. cool project. I'm sure there's a ton of data science going on around all of this. There's a lot of data. It's coming from different places, like live dashboards and stuff. And I think this is this is really cool. I didn't know about the SRO model. That's cool. There are a bunch of other Python libraries as well that epidemiologists have created and whatnot that the implement these ASR models, and there's another one si er, and so check those out, if you're interested in sort of digging with the data, but a plea to people to think about what you can do for your local community. You know, if you've got skills to help out, what can you do locally to to help out and help others? Yeah, absolutely. Also, random side point here looking through this code on kaggle, I'd never realized that you could unpack a tuple in a nested way. Like, thing comma tuple unpacking thing, right. So we're like, you can layer these in deeper and deeper. That's pretty awesome. Actually. Yeah, your data structure is nested. Right? That not necessarily, it's gonna make your code easy, but you can, you can have fun there. They can definitely, definitely make it shorter. All right, cool. That's a nice one. Brian, you're getting all philosophical on this. But this next one, what's up? Okay, so this is totally we're going from serious to definitely not serious, so that I noticed this also. So there's a a Reddit thread that's now or, I don't know if it was Reddit, or, or Stack Overflow, but got taken down. But essentially, the question was, why does all return true? If the iterable is empty? So there's an all keyword in Python that I guess actually a lot of people don't know about? That takes probably not takes an iterable. And it returns true if all of the elements of the iterable are true, or evaluate to true in a Boolean context, it's really helpful for a lot of a lot of things. The interesting aspect is, what should you do if it's if the iterable is empty? And because, you know, the actually the the person asking the question said, shouldn't it be false? Just like, you know, you can say if list, and if it's an empty list, it's false. Why would all be true if it's empty? And I enjoyed the conversation that somebody wrote an article called about this? Why is why does all return true? The End lesson is it doesn't matter why? Because the core team decided it, and you just need to know it, and work. Lastly, decreed to be true. So therefore, it is true. Yeah. And then one of the things I wanted to point out from this discussion is the statement all unicorns are blue. I just love that. You can't tell me it is definitely true, because there are no unicorns. So therefore, it's true for me to say, false blue. Yeah. And so I like that. And I guess I'm glad that my daughter doesn't listen to this to hear me say that there are no unicorns. Sorry, Honey, don't break her heart. Next, you can talk about no Santa, or what's going on here. Like, the tooth fairy is not real cooking. But the person writing this article, Carl Johnson is actually also a philosopher and a programmer. So he talks about this 2500 year old debate in philosophy about whether or not all unicorns or blue should be true or false. And also, we get talked about predicate logic and Socrates and as Aristotle in syllogisms, and things like that. Actually, we'd never at the end, I still don't know why the core team shows that that is true. But it's a fun thing to look into. That's fine. So look at it from the outside. I envision it working like this the way all works to be efficient is it says fourth thing in collection. If not thing return false. Go all the way and return true. And it just never goes into that loop. So return true, probably. Yeah. But I probably got to go and open up the C Python source code to find out. Matt, what do you think? I don't know. I'm looking at the Unicode symbol, the Unicode emoji in my Python repple right now, and that's hex code point one f 984. And it doesn't look blue. It looks pink. So some help

20:00 We definitely got to put somebody's gonna have to put a comment on that blog post. Yeah, that's not true. All unicorns are pink. It's interesting that they didn't make it true to your point, like in a Boolean context, right? Anything empty in Python is false. So yeah, I mean, another option would have been to raise an exception. So you can't ask for the truth. And as if nothing, the main reason why I wanted to bring it up, and the main reason I enjoy reading this article is now I will never forget that, that all of nothing is true.

20:00 I'm also thinking, have I ever used all in an if statement? I don't know that I have used all in an if statement. Where do you use it? Yeah, I guess I have. Yeah, I've used it. Usually, I'll put like a set a some kind of generator expression in there. Because I don't usually want to test all the things are actually true. I want to test like, the dates are greater than day today for all of them or something. Right? So put a little comprehension in there. And they ask all of that. But yeah, I get that. Yeah, I guess it returns a Boolean. So you would put it in an IP state?

20:00 I guess I I don't use it a ton either. But every now and then I'm, I'm happy with it. If I put it in an if statement, am I going to loop over the contents of all right. I don't know that I I have

20:00 a blue photon that it would be to avoid a loop. Right? It'd be like one line, a loop basically. Yeah. Cool. Yeah, I won't forget either. Now, I didn't realize it was so philosophical. But apparently, here it is.

20:00 All right, last one. This was really quick. This is a project written by john Sebastian, do a look at that closely. Right. called pi test monitor. And the idea of pi test monitor. Brian, you familiar this one already? I looked it up quickly. Yeah. I haven't used it. But yeah, but Okay, cool. Basically, you pip install this. And then anytime you run a PI test test, it's going to automatically collect some data for you. It'll analyze memory consumption, timing, CPU usage, stuff like that. And it put it into a little local sequel lite database file. And you can look at it over time and whatnot. So it's pretty cool, right? If you want to say, Well, how long does this code take to run on the production machine versus on our laptop? Right, you actually get tracking and whatnot from that. So not a huge addition. But it's kind of cool. It's built on a couple of libraries, PS util and memory profiler, which let it basically go and ask all these questions on a per test basis is cool. And then obviously, it just runs in PI test. That's cool. I could see where you might want to have a report where you just want to run the limit what that's running on. I don't know that I would want that necessarily on everything. But you might have some hotspots or whatever, where you want to throw that and report on that. Right? having it on everything seems like, No, I don't know what the performance amplification implications are of like all that monitoring. Yeah, I think it'd be cool to see this is one of the parts where I'd like to actually see the reporting of this project, have some reporting, that's a nicer around it, because that's some really cool information. But it doesn't think some reporting would help it. Yeah, it said, Look, it's not beautiful as it It isn't a sequel lite database, you could grab it and do what you want. But like, then you got to write that this like coverage. One of the wonderful things about coverage, is that the reporting part of it? Yeah, absolutely. All right. Well, if that something you guys care about, go install that and check it out. All right. Well, that's it for all of our major items. Brian, Matt, you guys got anything you want to throw out there extra? Before we get to our joke? Stay safe? Absolutely. I've got nothing extra. I bet you Michael? Well, I took two of my projects that I've been kind of fiddling with for either a short time or a long time, depending on which one and put them both up on pi pi as things you can now pip install. So that's kind of cool. So the switch Lang my little extension to add switch to the Python language. You can pip install that now. I still love that thing. I use it all the time. And then my markdown sub templates. What's that? Man? You use that in production? Oh, yeah. All the time? Yeah. Oh, yeah. Yeah, there's like a couple of places where it would be like this huge if statement or some other weird look up. And it's, it does cool stuff to say like, Oh, you already tested for this case, or you're like have the same case in two places. You would miss one, the second one because it be caught by the first and so on? Well, yep. And then the second one, the markdown sub template thing, which we talked about before, but it was not then PIP installable. So nowadays, people can check those out if tests on these. Of course we got tests on this. I don't have I don't have pi test monitor on it. But we got test going high tests in there. So they do exist. The code does exist as test. A is yes, we can speak of it. Yes. You're ready for a joke. Yes. This one is it's not really that funny. It's more like as opposed to the rest of our jokes. Dude, I think I've done that.

20:00 Well, some of them are like meant to be straight out funny. This one's like, funny ironic because yeah, I did that too at one point or something like that. Right?

20:00 So this guy on Twitter, sent a message, sarcastic pharmacist turned over and said, I was listening to discussion on talkback on about rebooting a server instead of chasing bugs, and why you should check out XKCD comm 1495.

20:00 And there's just a picture. And it has like a trade off. It says, Okay, why is everything broken? Am I live here? Here's the deal. Like, I could spend one to 10 hours figuring out why my server keeps running out of swap space and crashing. Or I could spend five minutes plugging into a light timer that reboots it every 24 hours. That takes five minutes. Let's do that. Yeah. So true. Yeah, that's actually an interesting thing was we just ordered a bunch of web programmable power strips.

20:00 Yeah, because one of the things you do when working with electronics is sometimes power cycle the things a no way to go and do that when I'm working from home. So How interesting. So you built that into like the CI CD, hey, with the test, like, let's do that, like most of the time, these aren't problematic. But there is the occasional in development instrument where, or in development operating system portions or something like that, where it gets into flaky situations, and rebooting is a good is a good thing to do from the start. Because as a software developer, I can get things into really wacky states doesn't happen a lot. But it happens enough to where it's good to know that, yeah, you can buy these webs, power switches, we're getting industrial ones, which are kind of expensive, because you can stick them in insert racks. But they're just a normal power strip. But you've they've got a web address, and the rest are on a rest like API that you can put them in strips. And if you Yeah, if you want to use them in a CI CD pipeline, you can call them that way too, if you want. But normally we just have them as a backup so that we we can log in and reboot them if we need to, you know, have them connected to Alexa.

20:00 Alexa, reboot my computer. Yeah. My testimony has health. Shall I reboot again? Yes, please.

20:00 Awesome. I well, Brian, thank you as always, and Matt, thanks for being here today. It's fun to chat with you. Yeah, thank you. Thank you for listening to Python bytes. Follow the show on Twitter via at Python bytes events Python bytes as mb yts and get the full show notes at python bytes.fm. If you have a news item you want featured just visit Python by set FM and send it our way. We're always on the lookout for sharing something cool. On behalf of myself and Brian knockin. This is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.

Back to show page