« Return to show page
Transcript for Episode #138:
Will PyOxidizer weld shut one of Python's major gaps?
00:00 KENNEDY: 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.
00:09 OKKEN: And I'm Brian Okken.
00:10 KENNEDY: And this episode is brought to you by DigitalOcean. Check them out at pythonbytes.fm/digitalocean. More on that later, Brian, how you doing?
00:17 OKKEN: I'm good, been recording a lot.
00:19 KENNEDY: Yeah, recording a lot and trying to survive a work move, huh?
00:22 OKKEN: Yeah, I'm not lookin' forward to half an hour drive.
00:25 KENNEDY: 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?
00:30 OKKEN: Yeah. Yeah exactly.
00:33 KENNEDY: Yeah, I don't know if people know, but traffic in Portland and in the North West, it's rough, man.
00:37 OKKEN: 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.
00:43 KENNEDY: Yeah, my commute is really rough. My studio area is like, above my garage, and the garage is detached. So I go across the sidewalk, and periodically there's like a squirrel or something, and it will startle me a little bit. And that's like a rough commute for me. Nah, just kidding. No one should feel sorry for me on that regard.
00:59 OKKEN: Hah, that's awesome.
01:00 KENNEDY: Nice, alright well speaking of keeping everything like, legit and keeping surprises out of it, uh that's probably where we should start, huh?
01:07 OKKEN: Sure, you want to jump into that first item?
01:09 KENNEDY: Yeah, yeah, Flake8, let's do it.
01:11 OKKEN: Okay, I use Flake8 all the time. I actually put it on almost every project to make sure that, I'm just not doing something stupid. It does a whole bunch of different, uh, I think we've talked about it before. But one of the things that I came across, this is submitted by Florian Dalitz, I think, is flake8-comprehensions, which is a plugin for Flake8. You just install that also and it will run automatically. People are used to list comprehensions but there's a whole bunch of other things like dictionary comprehensions and things like that.
01:40 KENNEDY: Set comprehensions yeah, generator expressions all these things right?
01:44 OKKEN: 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.
01:56 KENNEDY: Awesome, like some of the warnings are, unnecessary generator, rewrite that as a list comprehension or unnecessary list comprehension, rewrite it as a dictionary comprehension and interesting stuff along those lines. So yeah, that's pretty cool.
02:10 OKKEN: 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.
02:17 KENNEDY: Yeah there's some nice little clean-ups here and I'm just kind of always amazed at how similar the comprehensions are but how different the resulting outcome of them are. You know especially with list comprehensions, square brackets, and generator expressions, parentheses. One is like this lazily evaluated generator expression that could 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.
02:44 OKKEN: Yeah, and I always forget that set comprehensions are a thing, so.
02:47 KENNEDY: Nice, nice yes 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 four in-loops in Python. So I write that as like actually we have these comprehensions too, you don't need that. So, pretty cool.
03:06 OKKEN: Yup Anytime I can move uh code reviews out of personal opinions and into a static analysis tool it just makes the team smoother.
03:15 KENNEDY: Yeah absolutely, I think it's really interesting psychologically that people, developers, respond differently to criticism from a robot than they do from a human.
03:24 OKKEN: Yeah I mean it's like a compiler warning or something at that point.
03:27 KENNEDY: Exactly say, "Well CI says you got to do it so we all agreed that this is how it's going to be 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".
03:40 OKKEN: It's like somebody will pick up the torch and be the one person that's always telling other people that their, they need to change their code because the style in it just gets old so. Let the computer do it.
03:51 KENNEDY: Exactly, and it's more consistent anyway, no matter how anal the person is. The computer is more so. So uh 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. Now I want to just set the stage here that I think you know, we've talked about this before, I can't remember where, but we've spoken about it before that basically, you know, 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-Magee 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 Kivy, and we have some stuff from Russell's stuff as well right. But those are like sort of, "Well, we'll get it working, it's going to prove the concept". It's not like a visual designer drag and drop who tell you to push this button to publish the apps, all right. 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. So there are ways to do stuff like that, but it's always either like some kind of cluge or yeah, you can build it, but it's going to look like from 1994. Nobody wants that.
05:27 OKKEN: I mean Qt's pretty good.
05:29 KENNEDY: Qt's is pretty good yeah, Qt's pretty good, I'm thinking you know TKinter it's like, it's definitely its age for example. Yeah so, yeah those are great and so like goo 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.
05:52 OKKEN: Oh yeah
05:53 KENNEDY: Yeah, that's a problem and you know what's really interesting was there's uh, a while ago I talked about Guido 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 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, it doesn't seem like a weakness. And Guido's thought was 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 Python3-pip, and so on. 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 tools setup 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?
07:00 OKKEN: Yeah sure.
07:01 KENNEDY: Sure I mean for all of the people that need a dev tool on Linux there are a 100 more, a 100 times more who need an application as an end-user. You know what I mean? 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 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-user applications to 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 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 'em out because it's like, why would you use Python for that? It like doesn't even make sense, right? There's PyInstaller but it's also good, but it has some limitations. So the thing I want to cover again is PyOxidizer. And the reason is, it's now officially released, it has it's first release and I have been watching the GitHub repository. You like as in say, go watch the repo. And my email just like blew up. I couldn't I just go in like was constantly cleaning up like pull requests, issues, all this kind of stuff like people were just going crazy on their repo. 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, ah gosh, uh, Gregor, 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 Python 2019, like I said Russell Keith-Magee said, basically this distribution problem is like a potential black swan event for Python, right.
08:56 OKKEN: I still don't know what that means but, sure.
08:58 KENNEDY: An unseen, super negative thing coming out of the blue that's going to dramatically disrupt it.
09:04 OKKEN: Oh
09:04 KENNEDY: 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?
09:18 OKKEN: Yeah I mean it, Python's still great everywhere else, it'd be cool if it was great there too.
09:21 KENNEDY: 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've have, so if you depend on say, Pandas or whatever, right. It'll bundle that up, it bundles the version of Python that you built it against, right. So you're guaranteed you'll have 3.7 no matter what system you put it on, if you build it against 3.7. And 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.
10:08 OKKEN: Oh wow.
10:08 KENNEDY: 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. Some tools care about starting fast, some don't right, like a website doesn't really care about starting fast, but a command line thing.
10:33 OKKEN: If you're going to write an editor, you want it to just pop open.
10:36 KENNEDY: 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. So you also kind of leaks your source code a little bit right?
10:50 OKKEN: Yeah I guess so.
10:51 KENNEDY: So if this in embedded as a binary, it's less obvious for people who 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 does this doing in my applications root? You know what I mean? Let's go play with those, right? So this is pretty, there's just a lot of interesting thing here, the article that Gregory put out announcing it, is 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 OS's. 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 application to end-users, not just developers and developer tools and servers. Cool well anyway. PyOxidizer, it seems to be catching fire and it's pretty awesome.
11:45 OKKEN: Yeah that's cool, like it.
11:46 KENNEDY: All right what you got, what's the next one?
11:47 OKKEN: 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 got like a, 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. So it's one of the things I'm actually working on a write up, trying to do a writeup of all that, with experimenting using it with, using Flit and PyTest and tox and coverage to make sure it's well tested and structured well and all of that.
12:28 KENNEDY: That's cool because you were, before you were sort of a fan of creating a source directory for your packages and, but that went into trouble with like Flit right or some, Flit or tox?
12:37 OKKEN: That's the thing, with coverage you want to be able to, I want to be able to test and run against the installed version, not the local version. So I want to do all 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 and a lot of people were recommending using a, an intermediate source directory to hide the local code from tox and from, well not really from tox, 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 tox that's called changedir and it's really simple. You just put this in your test environment lines in tox, in your tox.ini file and just say change the directory to like my test directory. And then whalla, you can't see the top level source code anymore, problem solved. So, I've got a longer explanation, I'm going to talk about this on, I have on Episode 80 of Test and Code which will be out by the time this is out. But I was amused because I market through an example. And I'm trying all these things to make sure they work, and the example project I built was a marked down 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.
13:59 KENNEDY: A single regular expression, and Cloudflare is like the intermediary to so many applications out there, it's, that's bad.
14:07 OKKEN: Yeah, they chucked 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 that, 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.
14:23 KENNEDY: Mine tell me they're not working right away. But they say that too frequently. Yeah. Why is this not finding the match, oh well.
14:31 OKKEN: So I thought that was, I was using regular expressions and I thought it was somebody, funny that somebody else reminded me 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.
14:46 KENNEDY: Yeah if your pager was going of at three in the morning, yeah, the humor would be entirely sucked out of that situation. Yeah that's rough. Before we go on to the next one let me just tell you all about DigitalOcean. I try to highlight one of the features of what they've got going on. Like I said many times, our infrastructure runs on DigitalOcean 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 it up with the right scaling infrastructure and all that. So, DigtalOcean 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, but you don't want to deal with it. Or deal with like when the pager goes off 'cause 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 so. You're all good check them out at pythonbytes.fm/digitalocean, they're big supporters of the show and I highly recommend it. 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 app or opportunities for more apps. Now, it used to be if you wanted to have some kind of communication, you'd have to go and 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 Zencastr and whatnot. Now you can just do like live communication in the browser and that's because of WebRTC and ORTC the Web Real-Time Communication is a open project that provides browsers and mobile apps real-time communication and then the open, the ORTC one is basically a similar style of communication. The item I want to talk about is this implementation for Python that uses asyncio so you can write Python applications that then communicate with other things like browsers or mobile apps and whatnot that use WebRTC.
16:59 OKKEN: Oh cool.
18:01 OKKEN: Oh that'll be neat.
18:02 KENNEDY: 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 asyncio well this is pretty cool aiortc.
18:15 OKKEN: Yeah neat.
18:16 KENNEDY: Yeah, speaking of communications, you got another one right.
18:18 OKKEN: This was a listener's suggestion and I can't remember who submitted it, but I think it's, and they even have the, it's called apprise. I think that's how you pronounce it, is that right?
18:27 KENNEDY: Apprise yes, to inform or to tell someone, to make one aware of something. They have apprised me of the situation. Really? Yes. Okay carry on, sorry.
18:38 OKKEN: So apprise is for push notifications and their tagline was push notifications that work on just about every platform. It's kind of a shim layer to put between your app and multiple notification services. So it sends notifications to things like, um, Telegram, they say Telegram, Pushbullet. Never heard of either of those, Slack and Twitter. Yes, I have heard of those. But uh also things like uh Discord, Gitter, Mailgun, Mattermost, Microsoft Teams, even sending SMS's through Twilio or Nexmo that supported email notifications supported for that. Some things are just, you want to email people but if your server's on fire you might want to send an SMS to somebody.
19:21 KENNEDY: Yeah that's cool, it's really cool.
19:23 OKKEN: It 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.
19:30 KENNEDY: Yeah some of the stuff that stood out to me is Growl and Windows notifications.
19:33 OKKEN: Do you know what Growl is?
19:36 KENNEDY: So Growl is, I don't know if this is the way it still works in macOS, but you know the little Toast Notifications that come up in the top right in macOS?
19:43 OKKEN: Oh yeah, yeah.
19:44 KENNEDY: Yeah, Growl does that.
19:45 OKKEN: Oh okay.
19:46 KENNEDY: 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 and then Windows notifications like similarly, but instead of being in the top right, they're in the bottom right. So they're not at all the same thing.
20:01 OKKEN: And it also supposedly supports Matrix so I don't know if that text's Keanu Reeves?
20:05 KENNEDY: Yeah, exactly yeah. I know Kung Fu, okay sorry. Yeah no, this is really cool, if you've got to communicate with Gitter, if this then that all those different things you know, Cisco Teams, Microsoft Teams, all those. Rather than integrate with all of their API's. Or Twilio or whatever just like bring this in, is like a facade over all that, it's great.
20:29 OKKEN: Yup.
20:29 KENNEDY: Yes 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, little more hard to choose the right thing to do because it used to be, ah Django, Flask, uh there's Pyramid also. I like Pyramid and there's, oh there's a few others, there was CherryPy, that's not used that much anymore. So I guess we'll choose between those three, right. Like that was kind of like the end of the thought. But now there's like a 100's like, of little things right. There's BlackSheep that we talked about, there's Masonite, there's Japronto and there's, well there's Websauna as well. So Websauna is a new framework and I think it's super interesting because it, you know, it kind of brings some more beginner friendliness, or CMS friendliness to some of the microframework story. So we've got another way you might break up the web framework thinking processes. Whereas I want an app that's kind of like, I've got to work the way it works but I can block in, I can like slot in these big blocks and have stuff I want like Django. So like I can have an admin backend or just like have, like an Excel like view of my database, if I want that. For example, right. 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. On the other hand you can use Flask or Pyramid where its 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 grain stuff. Like well I think I'm going to use SQLAlchemy 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 Websauna framework is built on Pyramid, SQLAlchemy and obviously Python 3 but it 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, WebSauna is a full stack Python web framework for building web services and back offices with admin interfaces and user signup processes.
22:33 OKKEN: Oh that's good.
22:34 KENNEDY: Yeah so this is while they say well we won't 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 product, which are too specialized for off the shelf solutions. Read, WordPress, SquareSpace. Like all these things you're like oh you could use that, well for like 80% you can use that then, then what? Then where do you go right? So Websauna could now be a place that you might go for that.
23:01 OKKEN: Yeah cool, that, this might be take off, yeah.
23:03 KENNEDY: I think it really could and so they talk about their 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 start real easy, lots of docs, yeah it's just all about being productive. So they have a whole bunch of infrastructure built up and you just kind of fill in the pieces, it's a little more Django-esk but uh than like raw Pyramid is, 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 that really makes it feel like pretty modern and cool.
23:47 OKKEN: Yeah definitely.
23:48 KENNEDY: Yup.
23:49 OKKEN: It looks like it's tested using PyTest also.
23:51 KENNEDY: Yeah it's tested using PyTest, it's deployed using Ansible, let's see what others, there's a couple of others, like yeah, that is super cool. It automatically comes with the top OWASP top ten security vulnerabilities limit like restricted so like they figure out like what are like the top ten reasons websites have security problems and they build into the infrastructure by default to block all those, like cross-site scripting and whatnot. They've got asynchrony built in and it even comes, it even has a IPython notebook shell. So instead of just having like a gridview of admin stuff I can type in, like oh well if you need to do admin tasks, like log in a fire up you know Jupyter on the backend and just start like manage it like that way right. So that's like, all right so it's like a web shell to your server. Keep that super locked down, but you know, still pretty awesome. So there's a bunch of really interesting ideas here that I think are quite cool.
23:51 OKKEN: The documentations pretty thorough, even includes like, okay once you get the stuff working, how to deploy it somewhere.
23:51 KENNEDY: Yeah exactly, this is quite new but it also looks really promising to me and I hope it, I hope it takes off 'cause I feel like this is a like a really nice modern take on what a modern Python web app framework should look like.
23:51 OKKEN: Yeah cool.
23:51 KENNEDY: All right that's it for our main topics, Brian you got something you want to share with us. Just quickly at the end?
23:51 OKKEN: Yeah I was going to mention, so I did, we did mention my move, the move at work is big, caused my scheduled 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, its just whenever I can do it. And later on in July things should settle down, 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.
23:51 KENNEDY: Yeah right on you doing a great job with Test and Code, there's a lot of stuff been coming out, nice and, nice and steady and a lot of good shows there.
23:51 OKKEN: All right thanks, how about you?
23:51 KENNEDY: Well I just released another course that I've been working on for a couple of months on and off. And its called "Building data-driven web apps with Flask and SQLAlchemy", speaking of microframeworks. 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 'cause that's what we use at 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 with Flask and SQLAlchemy.
23:51 OKKEN: Oh that's cool, yeah I'm going to have to check that out too.
23:51 KENNEDY: Yeah absolutely so people can check that out, links in the show notes or just training.talkpython.fm. That's the latest course and you know, no time to rest, since we're done recording here it's time to start with 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 where you just kind of just talking about.
23:51 OKKEN: Yeah, I'll be hopefully working on a course here pretty soon too.
23:51 KENNEDY: I'm very excited about that yeah, I'm not really sure we're ready to share what the topic is yet but uh its going to be in high demand and very popular.
23:51 OKKEN: Yeah I'm looking forward to it. Yeah complete secret, nobody will know what it is until it shows up.
23:51 KENNEDY: Yeah computer version and IoT probably but I'm not going to...
23:51 OKKEN: Yeah maybe, yeah sure.
23:51 KENNEDY: Yeah, prob...
23:51 OKKEN: Or older.
23:51 KENNEDY: 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?"
23:51 OKKEN: I really like that.
23:51 KENNEDY: Yeah it's pretty bad but uh.
23:51 OKKEN: That's good
23:51 KENNEDY: Yeah, its a good one.
23:51 OKKEN: Yeah so I don't have a joke but I saw this on Twitter and I cracked up.
23:51 KENNEDY: I did watch this yes.
23:51 OKKEN: The reset procedure from GE light bulbs, its so funny.
23:51 KENNEDY: These are smart, in quotes, smart light bulbs and you may have like paired them to your device 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?
23:51 OKKEN: Yeah 'cause you can't just like turn it off and turn it on, 'cause that's what light bulbs do so, you have to uh, 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.
23:51 KENNEDY: It goes on and on because like, what if somebody accidentally turns it off for five seconds and on for two seconds, on for eight seconds and off for eight seconds. But didn't mean to reset their bulb, you're going to do like three more rounds of that, it's insane, yeah so. Yeah we'll link to the video for that.
23:51 OKKEN: At the end it's like, if that didn't work, maybe it's an old firmware version, try this other even worse procedure. Awesome user interface experience.
23:51 KENNEDY: I love it, what do you do when like, the only interface you have is like power on, power off. This apparently is it.
23:51 OKKEN: Yeah but the register noted that you could put a hole in it and people could poke it with a clothes pin or whatever.
23:51 KENNEDY: Oh you mean like my router and like all these other normal pieces of technology?
23:51 OKKEN: Yeah, the reset button.
23:51 KENNEDY: Exactly, maybe they don't want people poking metal things into bulbs. 'cause its like too close to poke it right to the socket.
23:51 OKKEN: Because people are always poking metal into light sockets, yeah.
23:51 KENNEDY: Exactly, 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.
23:51 OKKEN: Yep all right, well thanks a lot Michael.
23:51 KENNEDY: You bet, thanks for being here, see ya.
23:51 OKKEN: Bye
23:51 KENNEDY: Thank you for listening to Python Bytes, follow the show on Twitter via @PythonBytes, 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, we're always on the lookout for sharing something cool. On behalf of myself and Brian Okken, this is Michael Kennedy, thank you for listening and sharing this podcast with your friends and colleagues.