Python Bytes - #138 Will PyOxidizer weld shut one of Python's major gaps?
Episode Date: July 8, 2019Topics 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)
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?
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.
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.
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.
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.
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
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,
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.
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.
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.
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.
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.
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
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.
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,
you know,
TK enter.
It's like,
it's definitely showing its age,
right?
For example.
So yeah,
those are great.
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?
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
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,
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
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
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?
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.
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,
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.
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.
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?
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
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.
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.
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.
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?
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.
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.
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
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.
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.
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
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
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,
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.
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
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
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.
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.
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.
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,
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
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,
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,
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.
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.
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 APIs or,
or Twilio or whatever,
just like bring us in as like a facade over all that.
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
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?
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
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.
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.
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.
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.
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.
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
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
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,
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
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
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
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?
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
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,
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
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.
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.
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.
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.