Python Bytes - #138 Will PyOxidizer weld shut one of Python's major gaps?

Episode Date: July 8, 2019

Topics covered in this episode: flake8-comprehensions PyOxidizer (again) Using changedir to avoid the need for src WebRTC and ORTC implementation for Python using asyncio Apprise - Push Notificatio...ns that work with just about every platform! Websauna web framework Extras Joke See the full show notes for this episode on the website at pythonbytes.fm/138

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds. This is episode 138, recorded July 3rd, 2019. I'm Michael Kennedy. And I'm Brian Ocken. And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm slash DigitalOcean. More on that later. Brian, how you doing?
Starting point is 00:00:17 I'm good. Been recording a lot. Yeah, recording a lot and trying to survive a work move, huh? Yeah, I'm not looking forward to half an hour drive. Yeah. A work move is like when you get to move and your commute changes, but you don't get any say in it, right? Yeah. Yeah, exactly. Yeah. I don't know if people know, but traffic in Portland and in the Northwest, it's rough, man. Yeah. But I mean, I lucked out. So for like nine years, I had a 10 minute commute and I know a lot of people have worse commutes. Yeah. My commute is really rough. My studio area is like above my garage and the garage is detached.
Starting point is 00:00:49 So I go across the sidewalk and periodically there's like a squirrel or something. It'll startle me a little bit. And then that's like a rough commute for me. Yeah. I'm just kidding. No one should feel sorry for me on that regard. That's awesome. Nice.
Starting point is 00:01:01 All right. Well, speaking of keeping everything like legit and keeping surprises out of it, that's probably where we should start, huh? Sure. You want to jump into the first item? Yeah, yeah. Flakegate. Let's do it.
Starting point is 00:01:11 Okay. I use Flakegate all the time. I actually put it on almost every project to make sure that I'm just not doing something stupid. So it does a whole bunch of different, I think we've talked about it before, but one of the things that I came across, this was submitted by Florian Dahlitz, I think, is Flake 8 Comprehensions, which is a plug-in for Flake 8. You just install that also, and it'll run automatically.
Starting point is 00:01:34 People are used to list comprehensions, but there's a whole bunch of other things like dictionary comprehensions and things like that. Set comprehensions, yeah, generator expressions, all these things, right? Yeah. There might be some old code that works fine, but maybe it would be easier to read if it was changed. So this is just some static analysis for your code to check different things to, you know, make your code look nicer. Awesome. Like some of the warnings are unnecessary generator, rewrite that as a list comprehension or unnecessary list comprehension, rewrite it as a dictionary
Starting point is 00:02:04 comprehension and interesting stuff along those lines. So, yeah, that's pretty cool. I'm going to hook it into all my projects. I haven't tried it yet to see if it's helping me at all yet, but it looks like a fun thing to add. Yeah, there's some nice little cleanups here. And I'm just kind of always amazed at how similar the comprehensions are, but how different the resulting outcome of them are,
Starting point is 00:02:29 especially with list comprehensions, square brackets, and generator expressions, parentheses. One is like this lazily evaluated generator expression that can be used once. The other is a list, right? But it's like you just round the edges a little bit on the symbol, and that's it. Yeah, and I always forget that set comprehensions are a thing.
Starting point is 00:02:47 Nice, nice. Yeah. So these are great. I feel like these are in the category of Pythonic code that a lot of folks don't know about, don't use and so on. Right. They're like, well, in C++, what I would do is I would write a for loop. And so they have for in loops in Python.
Starting point is 00:03:02 So I write that. It's like, actually, we have these comprehensions too. You don't need that. So pretty cool. Anytime I can move code reviews out of personal opinions and into a static analysis tool, it just makes the team smoother. Yeah, absolutely.
Starting point is 00:03:16 I think it's really interesting psychologically that people, developers, respond differently to criticism from a robot than they do from a human. Yeah, I mean, it's like a compiler warning or something at that point. Exactly. It's like, well, CI says you got to do it. So we all agreed that this is how it's going to be.
Starting point is 00:03:31 So we do it rather than like, well, that's the guy that's always picky and always says to rewrite my code and it's not Pythonic. I don't want to invite him to lunch anymore. It's like somebody will pick up the torch and be the one person that's always telling other people that they need to change their code because of style. And that just gets old. So yeah, let the computer do it. Exactly. And it's more consistent anyway, no matter how anal the person is, the computer is more so. So this next item here is something that is near and dear to my heart. We've covered it before when it first came onto the scene, but it's now really ready to go.
Starting point is 00:04:10 Now, I want to just set the stage here that I think we've talked about this before. I can't remember where, but we've spoken about it before that basically Python's growth is incredible. We've talked about that a bunch. It's fast becoming one of the most popular languages. But there's really three areas in my assessment where Python could be, you know, it's weak, or it could be dethroned, or it could, in the words of Russell Keith McGee, actually be an existential threat to the longevity of Python. And those are a proper way to build mobile applications with python i know we have kivi and we have some stuff from wrestle stuff as well all right but
Starting point is 00:04:53 those are like sort of well we'll get it working it's kind of proof of concept it's not like a visual designer drag and drop here's how you push this button to publish the app so right like there's not really a proper way to build mobile apps for Python. That's existential threat one. Number two is I would like something like the Slack app in Python. Build that. Yeah, good luck with that, right? Like probably not.
Starting point is 00:05:17 So there are ways to do stuff like that, but it's always either like some kind of kludge or it's, yeah, you can build it, but it's going to look like from 1994. Nobody wants that. I mean, cute's pretty good. Cute is pretty good. Yeah. Cute's pretty good. I'm thinking,
Starting point is 00:05:30 you know, TK enter. It's like, it's definitely showing its age, right? For example. So yeah, those are great.
Starting point is 00:05:36 And so like GUI is probably the least existential threat of these, but it's very clear, closely tied to this last one, which is sharing your application with end users. Somebody who doesn't care whether or not your program is written in Python. They would just want to run your program. How does that happen?
Starting point is 00:05:52 Oh, yeah. Yeah, that's a problem. And what was really interesting was there's a while ago I talked about Gita Van Rossum being interviewed on, I think it was the AI, the MIT's AI podcast. It was a super interesting interview and a lot of great stuff that he said. I think it was the AI, the MIT's AI podcast. It was a super interesting interview
Starting point is 00:06:05 and a lot of great stuff that he said. I think they talked about it there with him. If it wasn't there, it was him being interviewed somewhere else. And basically they said, well, how do you feel about this deployment story? Doesn't it seem like a weakness? And Guido's thought was,
Starting point is 00:06:19 well, you can really use a lot of the Linux package managers to solve a lot of these problems like if I want Python there I can apt install Python 3 if I need to get pip I can apt install Python 3 dash pip and so on and it was very clear like his whole thinking about what getting an application to a user meant was getting it properly set up on a server or like a developer gets the tool set up on their Linux dev machine, which is all well and good. But you know, the most important thing is how do I give an icon thing to a person on a Mac or on Windows, they can double click, and then their thing runs. You know what I mean? Yeah, sure. Sure. I mean, for all the people
Starting point is 00:07:01 that need a dev tool on linux there are a hundred more a hundred times more who need an application as an end user you know what i mean okay yeah so if we want to get if i want to get something like say if i've created some data science tooling and i want to give that to my team i would like to say here's like a dmg or an msi installer you double click it and then you you run. I don't care what version of Python you got set up or anything like that, right? So I think that's the third problem is like, how do we get like end applications users. And the reason I think it's partly, it's kind of this chicken and egg problem. I feel like partly the reason it's not got a lot of
Starting point is 00:07:38 attention in the Python space is because it's so bad. It's like so nearly impossible that people just generally don't do it. So there's like not a lot of demand for people creating those types of applications to get them out because it's like, why would you use Python for that? It's like, doesn't even make sense, right?
Starting point is 00:07:54 There's PyInstaller, but it's also good, but it has some limitations. And so the thing I want to cover again is PyOxidizer. And the reason is it's now officially released. It has its first release. And I had been watching the GitHub repository, as you can say, go watch this repository. And my email just blew up.
Starting point is 00:08:16 I couldn't, I'd just go and was constantly cleaning up pull requests, issues, all this kind of stuff. People were just going crazy on the repository. Okay. It's just got a ton of traction. So that's out. And I just want to kind of highlight some of the stuff. The guy who created it, Gregory created it, and he's done some awesome stuff. He wrote a really nice article, which I'm linking to here, and it covers a lot of the reasons why you would want it. So at PyCon 2019, like I said, Russell Keith-McGee said,
Starting point is 00:08:48 basically, this distribution problem is like a potential black swan event for Python. I still don't know what that means, but sure. An unseen super negative thing coming out of the blue that's going to dramatically disrupt it somehow. I don't know if I would call it that, but I definitely think that distribution is like a reason people would not be using Python for sure. I don't know if I see it as like this negative sense, but I definitely see it as a, it could be so much more, right? Yeah. I mean, Python's so great everywhere else. It'd be cool if it was great there too.
Starting point is 00:09:21 Exactly. Why is it not good there? Gregory said, basically, I'm going to create this project called PyOxidizer, and it uses Rust to bundle up your Python code into an executable application. A.app thing on Mac, a.exe on Windows, and a statically linked binary executable on Linux. So it works on all the different platforms. And what's cool is it takes all the dependencies you have. So you depend on say pandas or whatever right it'll bundle that up it bundles the version of python that you build it against right so you're guaranteed you'll have three seven no matter what system you put it on if you build it against three seven okay what's really interesting is the way it works is it builds a single executable and then your Python code is loaded from bytecode in memory. Oh, wow.
Starting point is 00:10:08 Right? So, like, it actually creates your Python files. It creates PYC files, so pre-computed PYC bytecode, and then loads that out of memory. So, it actually runs faster than if you ran the code. It starts faster than if you ran the code in regular Python. Okay. Some tools care about starting fast. Some don't, right?
Starting point is 00:10:30 Like a website doesn't really care about starting fast. But a command line thing. If you're going to write an editor, you want it to just pop open. Exactly. So the other problem with the other ways in which this was done was they would basically zip up your Python code and maybe unzip it and then try to run it from there in memory thing. in which this was done was they would basically zip up your Python code and maybe unzip it and then try to run it from their in-memory thing. So you also kind of leaks your source code a little
Starting point is 00:10:50 bit, right? Yeah, I guess so. So if this is embedded as a binary, it's less obvious for people to go poking around that this is Python code that they can go read and mess with, right? Like technically, I know it still could be messed with, but it's not like, well, here's the directory of Python files. What is this doing in my applications route? You know what I mean? Let's go play with those, right? So this is pretty, there's just a lot of interesting things here. The article that Gregory put out announcing it, it's pretty broad, and it's really compelling. So it seems like this project is really taking off. I definitely think it would change the landscape if we had something like this legitimately working well across the board on all the OSs.
Starting point is 00:11:28 I think it would actually drive people to build more GUI-based apps because there would be a much more clear path on how to get those applications to end users, not just developers and developer tools and servers. Yeah. Cool. Well, anyway, PyOxidizer, it seems to be catching fire and that's pretty awesome. Yeah, it is cool. I like it.
Starting point is 00:11:45 All right, what you got? What's the next one? Well, speaking of sharing code, one of the things that people do is not with end users, but with just other developers, is to take a script. You've got like just a, you know, you created a script, a little module or something, and it works on your machine. You want to share it with other people, even that there's a little bit of a barrier between writing a simple script and packaging it up properly and getting that running.
Starting point is 00:12:13 So it's one of the things I'm actually working on a write-up, trying to do a write-up of all that with experimenting using it, with using Flit and PyTest and Talks and Coverage to make sure it's well-tested and structured well and all of that. That's cool. Because you were, before, you were sort of a fan of creating a source directory for your packages, but that ran into trouble with flit, right?
Starting point is 00:12:36 Or some flit or tox? That's the thing. With coverage, you want to be able to, I want to be able to test to run against the installed version, not the local version. So I want to do all of the to run against the installed version, not the local version. So I want to do all of the packaging, install it into an environment, and then run the test against that. And that was hard to do. I thought it was hard to do.
Starting point is 00:12:54 And a lot of people were recommending using an intermediate source directory to hide the local code from talks and from, well, not really from talks, but from coverage and PyTest so that you were really loading the installed one. I didn't know there was a thing here. And I'm highlighting a feature of talks that's called changed her. And it's really simple. You just put this in your test environment lines in talks in your talks, any file and just say, change the directory to like my test directory. And then voila, you can't see the top level source code anymore.
Starting point is 00:13:29 Oh, that's cool. Problem solved. So I've got a longer explanation. I'm going to talk about this on, or I have on episode 80 of testing code, which will be out by the time this is out. But I was amused because I'm walking through an example and I'm trying all these things to make sure they work. And the example project I built
Starting point is 00:13:48 was a Markdown converter using regular expressions. And I thought this was really funny because of the news that came out recently that Cloudflare went down because of a regular expression. A single regular expression. And Cloudflare is like the intermediary to so many applications out there. That's bad.
Starting point is 00:14:07 Big chunk of the internet not working because Cloudflare was pegged on one regular expression. I don't even know how to do that. I don't know how to make a regular expression. I do simple regular expressions, so I don't know how to do something that's quadratic in nature. But I thought it was funny.
Starting point is 00:14:23 Mine tell me they're not working right away. But they say that too frequently in nature. But I thought it was funny. Mine tell me they're not working right away, but they say that too frequently. Yeah. Why is this not finding the match? Since I thought that was, I was using regular expressions and I thought it was somebody, funny that somebody else reminded me
Starting point is 00:14:36 of that Mel Brooks quote, that it's tragedy when it happens to me, it's comedy when it happens to you. So I'm laughing at Cloudflare, but I wouldn't be laughing if I was working there. Yeah, if your pager was going off at three in the morning, it's comedy when it happens to you so i'm laughing at cloudflare but i wouldn't be laughing and if i was working there yeah if your pager was going off at three in the morning yeah the humor would be entirely sucked out of that situation yeah that's rough yeah before we get on to the next one let
Starting point is 00:14:54 me just tell you all about digital ocean i try to highlight one of the features of what they've got going on like i said many times our infrastructure runs on digital ocean and they do a great job so one of the things you might not want to deal with is setting up a Postgres server, backing it up, setting up the right scaling infrastructure and all that. So DigitalOcean has this great feature where you can get a managed Postgres database as a service, which solves a whole bunch of problems like figuring out what the optimal database infrastructure footprint is or scaling it as your app grows or creating highly available and failover infrastructure, all that kind of stuff you want,
Starting point is 00:15:31 but you don't want to deal with it or deal with like when the pager goes off because it stopped replicating or it wouldn't scale or whatever, just go to DigitalOcean and check the box to get your managed Postgres database and let them deal with it all. So that's really nice, runs right there in that data center.
Starting point is 00:15:48 So if you're all good, check them out at pythonbytes.fm slash digitalocean. They're big supporters of the show and highly recommended. All right, so this next one, Brian, I think has some pretty interesting possibilities and maybe ties back to my item that I spoke about before, creating like a new type of apps or opportunities for more
Starting point is 00:16:05 apps. Now, it used to be if you wanted to have some kind of communication, you have to go install like weird plugins into your browser. So you could do I don't know, some kind of real time chat or video communication. But recently, these things have just been working all on their own, right? Things like Zencaster and whatnot. Now it could just do like live communication in the browser. And that's because of WebRTC and ORTC. The Web Real-Time Communication is an open project that provides browsers and mobile apps real-time communication. And then the open ORTC one is basically a similar style of communication. Okay. The item I want to talk about is this implementation for Python that uses AsyncIO so you can write Python applications
Starting point is 00:16:52 that then communicate with other things like browsers or mobile apps and whatnot that use WebRTC. Oh, cool. Yeah, so it's called AIO-RTC. AIO is for AsyncIO and then RTC, well, you know, for the protocol. So it's pretty cool. It follows pretty close to the JavaScript counterpart, which is how you would do it in the web. But it uses a lot of Pythonic constructs like the popular JavaScript ones use promises.
Starting point is 00:17:18 So this AIO RTC uses coroutines, which is cool. And events are emitted using the PyEventEmitter, which is all good. The main ones, like the main one is you want to explore these communication protocols are all baked into the browsers and they come in native code. But if you want to explore like a more understandable version, a more hackable version, this one is all just in Python, which is pretty cool for understanding how it works. They also talk about some of the kinds of apps you could build, right? So like you can create some new things in the Python ecosystem.
Starting point is 00:17:50 For example, you could build a server handling both signaling and data channels and apply like computer vision to the video frames using OpenCV like in real time or something cool like that. Oh, that'd be neat. Yeah. So people doing fun stuff with video communications. If you want to write a Python application that can participate in that and you want it to be nice and modern using async and await and async IO.
Starting point is 00:18:12 Well, this is a pretty cool AIO RTC. Yeah. Yeah. Speaking of communications, you got another one, right? This was a listener's suggestion and I can't remember who submitted it,
Starting point is 00:18:22 but I think it's, and they even have the, it's called a prize. I think that's how you pronounce it. Is that right? A prize. Yes. To inform or to tell someone, to make one aware of something. They've apprised me of the situation. Really? Yes. Okay. Carry on. Sorry. So a prize is for push notifications and their tagline was push notifications that work on just about every
Starting point is 00:18:45 platform. It's kind of a shim layer to put between your app and multiple notification services. So it sends notifications to things like Telegram. They say Telegram push bullet. Never heard of either of those. Slack and Twitter. Yes, I have heard of those, But also things like Discord, Gitter, Mailgun, Mattermost, Microsoft Teams, even sending SMSs through Twilio or Nexmo. That's supported. Email notifications supported for that. Some things that you want to just email people, but if your server's on fire,
Starting point is 00:19:19 you might want to send an SMS to somebody. Yeah, this is cool. It's really cool. Looks pretty neat. The API looks nice. Looks like it'd be pleasant to work with. So I think this is a good one to somebody. Yeah, this is cool. It's really cool. Looks pretty neat. The API looks nice. Looks like it'd be pleasant to work with. So I think this is a good one to highlight. Looks neat. Yeah. Some of the stuff that stood out to me is Growl and Windows notifications. Do you know what Growl is? So Growl is, I don't know if this is the way it still works in macOS,
Starting point is 00:19:39 but you know, the little toast notifications that come up in the top right in macOS? Oh yeah. Yeah. Yeah, Growl does that. Oh, okay. But you might have to have a little daemon installed. I can't remember if it natively talks to Mac. I don't think so. I think Growl is like before that was built into the OS. But basically, it does that.
Starting point is 00:19:56 And then Windows notifications like similarly. But instead of being the top right, they're in the bottom right. So they're not at all the same thing. And it also supposedly supports Matrix. So I don't know if that texts Keanu Reeves or. Yeah, exactly. Yeah.
Starting point is 00:20:08 I know Kung Fu. Okay. Sorry. Yeah, no, this is really cool. If you've got to communicate with Gitter, if this,
Starting point is 00:20:16 then that, all those different things, you know, Cisco teams, Microsoft teams, all those rather than integrate with all of their APIs or, or Twilio or whatever, just like bring us in as like a facade over all that.
Starting point is 00:20:29 It's great. So this last thing I want to talk about is a new web framework. And I feel like the web in Python is getting really interesting and also a little more hard to choose the right thing to do because it used to be Django, Flask. There's Pyramid also. I like Pyjango flask there's pyramid also i like pyramid and there's there's a few others there was cherry pie that's not used that much anymore so i guess i'll choose between those three right like that was kind of like the end of the thought but now there's like hundreds like of little things right there's black sheep that we talked
Starting point is 00:20:58 about there's mace knight and there's japan and there's well there's web sauna as well so web sauna is a new framework. And I think it's super interesting because it kind of brings some more beginner friendliness or CMS friendliness to some of the micro framework story. So we've got another way you might break up the web framework thinking process as well is I want an app that's kind of like, I've got to work the way it works, but I can slot in these big blocks and have stuff I want, like Django. So I can have an admin back in where I just have an Excel view of my database if I want that, for example. But if you want to not work the way Django works, well, too bad. You work the way Django works. That's how you use Django, right?
Starting point is 00:21:45 On the other hand, you could use Flask or Pyramid where it's kind of like, well, here's how you process a request. Whatever else you do, that's on you, right? It's up to you. So a lot of people kind of like that more fine-grained stuff. Like, well, I think I'll use SQL Alchemy here, and I'm going to use, like, this for managing passwords, and here's how I do my users and email and all that, right? You get to choose all those little bits, but then you got to choose all the bits and build with it and so on. So this WebSana framework is built on Pyramid, SQL Alchemy, and obviously Python 3, but it
Starting point is 00:22:16 adds a lot of the features people might choose Django for, but in like a super modern and cool way. So I really, really like it. Their description is, WebSan is a full snack Python web framework for building web services and back offices with admin interfaces and user signup processes. That's good.
Starting point is 00:22:34 Yeah, so it says, well, they say, well, when should you use it? Well, it's focused on internet facing sites when you have a public or private signup process and an admin interface. And the sweet spot includes custom business portals, software as a service products, which are too specialized for off the shelf solutions, read WordPress, Squarespace, like all these things. You're like, Oh, you could use that.
Starting point is 00:22:56 Well, for like 80%, you could use that. Then, then what, then where do you go? Right? So WebSonic can now be a place that you might go for that. Oh, cool. This might be take off. Yeah. I think it really could. And so they talk talk about they're focused on like core business logic so you can you know they build all have all the building blocks like you want to sign up with google with your gmail yeah you just like put that in there and it just now you can sign up for the your app with gmail it's nice you can get started real easy lots of docs yeah it's just all about being productive so they have a whole bunch of infrastructure built up and just like kind of fill in the pieces it's nice. You can get started real easy. Lots of docs. Yeah. It's just all about being productive. So they have a whole bunch of infrastructure built up and just like kind of fill in the pieces.
Starting point is 00:23:28 It's a little more Django esque, but, uh, then like raw pyramids, but it's kind of nice that you have this blended option. So I think it's looks really promising. They have a lot of cool things like asynchronous task processing and other stuff like that.
Starting point is 00:23:44 That really makes it feel feel pretty modern and cool. Yeah, definitely. It looks like it's tested using PyTest also. Yeah, it's tested using PyTest. It's deployed using Ansible. Let's see. There's a couple other things. Yeah, that is super cool.
Starting point is 00:23:59 It automatically comes with the top OWASP. Top 10 security vulnerability is restricted. So they figure out what are the top 10ASP, top 10 security vulnerabilities, limit like restricted to like they figure out what are like the top 10 reasons websites have security problems, and they built into the infrastructure by default, to block all those like cross site scripting, and whatnot, they have asynchronous built in, and they even comes it even has a IPython notebook shell. So instead of just having like a grid view of admin stuff I can type in, they're like, oh, well, if you need to do admin tasks, like log in and just fire up, you know, Jupiter on the backend and just start like, manage it like that way. Right. So that's like, all right. So it's like a
Starting point is 00:24:35 web shell to your, your server, keep that super locked down, but you know, still pretty awesome. So there's a bunch of like really interesting ideas here that I think are quite cool. The documentation is pretty thorough. It even includes like, okay, once you get this stuff working, how do you deploy it somewhere? Yeah, exactly. This is quite new, but it also looks really promising to me, and I hope it takes off, because I
Starting point is 00:24:56 feel like this is a really nice modern take on what a modern Python web app framework should look like. Yeah, cool. Alright, well, that's it for our main topics. Brian, you got something you want to share with us? Just quickly at the like. Yeah, cool. All right, well, that's it for our main topics. Brian, you got something you want to share with us? Just quickly at the end? Yeah, I was going to mention, so we mentioned in my move,
Starting point is 00:25:12 the move at work has caused my schedule to be crazy, and I don't know when to interview people. If you've been paying attention to Test and Code, the episodes have been kind of solo episodes lately because I don't have to schedule myself. It's just whenever I can do it. And later on in July, things should settle down. And so if I've bugged you to do an interview or you've asked me and I haven't gotten back to you, get back to me again and we'll schedule that. So that should go on. Yeah, right on. You're doing
Starting point is 00:25:40 a great job with Testing Code. There's a lot of stuff been coming out nice and nice and steady and a lot of good shows there. All right. thanks. How about you? Well, I just released another course that I've been working on for a couple of months on and off. And it's called building data driven web applications with flask and SQL alchemy speaking of micro frameworks. So I had a similar course on pyramid. And a lot of people said, Hey, pyramid's awesome. But we really need to know Flask, because that's what we use our company, or that's what I'm trying to understand for a job or whatever. So I'm like, all right, well, let me go and build the Flask version of this course. So basically, the idea is, we spend about 10 hours recreating PyPI.org from the ground up
Starting point is 00:26:19 with Flask and SQL Alchemy. Oh, that's cool. Yeah, I'm gonna have to check that out, too. Yeah, absolutely. So people can check that out. Links in the the show notes or just training.talkbython.fm that's that's the latest course and you know no time to rest as soon as we're done recording here it's time to start the next continue on the next one i'm working on so i'm really excited to have this out i think a lot of people will appreciate it and it was really fun to write because you got to explore like a lot of these ideas we were just kind of just talking about yeah i'll be hopefully working on a course here pretty soon too i'm very excited about that yeah i'm not really sure we're ready to share what the topic is yet but uh it's going to be in high demand and very popular yeah i'm looking forward to it yeah complete secret nobody
Starting point is 00:26:56 will know what it is until it shows up yeah computer vision iot probably but i'm not going to... Yeah, maybe. Yeah, sure. Or something else. Probably. So speaking of jokes and sarcasm, a SQL query goes into a bar, walks up to two tables and asks, can I join you?
Starting point is 00:27:18 I really like that. Yeah, it's pretty bad. That's good. It's a good one. Yeah. So I don't have a joke, but I saw this on Twitter and I cracked up i did watch this yes the reset procedure from ge light bulbs it's so funny these are smart in quotes smart light bulbs yeah and you may have like paired them to your device
Starting point is 00:27:39 but then you lost your phone or you gave the light bulbs to your friend. You're like, well, how do I reset my light bulb? Right? Yeah, because you can't just like turn it off and turn it on because that's what light bulbs do. So you have to do something else. And this procedure that they've got is hilarious. It's like turn it off for five seconds, then on for eight seconds, then off for two seconds, then on for eight seconds. And if you go through this like five times. It goes on and on because like what if somebody accidentally turns it off for five seconds,
Starting point is 00:28:09 on for two seconds, on for eight seconds, and off for eight seconds, but didn't mean to reset their Revolve. You've got to do like three more rounds of that. It's insane. Yeah. So yeah, we'll link to the video for that. At the end, it's like, if that didn't work work maybe it's an old firmware version try this other even worse procedure awesome user interface experience so i love it what do you do when
Starting point is 00:28:32 like the only interface you have is like power on power off this apparently is it yeah but the register like noted that you could put a hole in it and people could poke it with a like clothes bin or whatever oh you mean like my router and like all these other normal pieces of technology yeah a reset button exactly yeah maybe they don't want people poking metal things into bulbs because it's like too close to poking it right to the socket because people are always poking metal into light sockets yeah exactly exactly all right well yeah people can go check this out and it's intended to be People are always poking metal into light sockets. Yeah. Exactly.
Starting point is 00:29:06 Exactly. All right. Well, yeah, people can go check this out. And it's intended to be serious, but it's actually kind of funny. Yep. All right. Well, thanks a lot, Michael. You bet.
Starting point is 00:29:14 Thanks for being here. See ya. Bye. Thank you for listening to Python Bytes. Follow the show on Twitter via at Python Bytes. That's Python Bytes as in B-Y-T-E-S. And get the full show notes at pythonbytes.fm. If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
Starting point is 00:29:29 We're always on the lookout for sharing something cool. On behalf of myself and Brian Ocken, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.