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


Transcript #138: Will PyOxidizer weld shut one of Python's major gaps?

Return to episode page view on github
Recorded on Thursday, Jul 4, 2019.

00:00 Hello and welcome to Python Bytes where we deliver Python news and headlines directly to your earbuds.

00:04 This is episode 138, recorded July 3rd, 2019. I'm Michael Kennedy.

00:09 And I'm Brian Aiken.

00:10 And this episode is brought to you by DigitalOcean.

00:12 Check them out at pythonbytes.fm/digitalocean.

00:15 More on that later. Brian, how are you doing?

00:17 I'm good. Been recording a lot.

00:19 Yeah, recording a lot and trying to survive a work move, huh?

00:22 Yeah, I'm not looking forward to half an hour drive.

00:25 - 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:31 - Yeah, yeah, exactly.

00:32 - Yeah, I don't know if people know, but traffic in Portland and in the Northwest, it's rough, man.

00:37 - Yeah, but I mean, I lucked out.

00:38 So for like nine years, I had a 10-minute commute.

00:42 And I know a lot of people have worse commutes.

00:43 - Yeah, my commute is really rough.

00:45 My studio area is like above my garage, and the garage is detached.

00:49 So I go across the sidewalk, and periodically there's like a squirrel or something that'll startle me a little bit.

00:54 And that's like a rough commute for me.

00:56 - Yeah, yeah.

00:56 - I'm just kidding.

00:57 No one should feel sorry for me in that regard.

01:00 - That's awesome.

01:01 - Nice, all right, well, speaking of keeping everything like legit and keeping surprises out of it, that's probably where we should start, huh?

01:07 - Sure, you wanna jump into the first item?

01:10 - Yeah, yeah, Flakegate, let's do it.

01:11 - Okay, I use Flakegate all the time.

01:13 I actually put it on almost every project to make sure that I'm just not doing something stupid.

01:18 So it does a whole bunch of different, I think we've talked about it before.

01:22 But one of the things that I came across, this was submitted by Florian Dollitz, I think, is Flake 8 Comprehensions, which is a plugin for Flake 8.

01:30 You just install that also, and it'll run automatically.

01:34 People are used to list comprehensions, but there's a whole bunch of other things like dictionary comprehensions and things like that.

01:40 - Set comprehensions, yeah, generator expressions, all these things, right?

01:44 - Yeah, there might be some old code that works fine, but maybe it would be easier to read if it was changed.

01:49 So this is just some static analysis for your code to check different things to make your code look nicer.

01:56 Awesome.

01:57 Like some of the warnings are unnecessary generator.

02:00 Rewrite that as a list comprehension, or unnecessary list comprehension.

02:04 Rewrite it as a dictionary comprehension.

02:05 And interesting stuff along those lines.

02:08 So yeah, that's pretty cool.

02:10 I'm going to hook it into all my projects.

02:12 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 Yeah, there's some nice little cleanups here.

02:19 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.

02:34 One is like this lazily evaluated generator expression that can be used once, the other is a list, right?

02:40 But it's like, you just round the edges a little bit on the symbol, and that's it.

02:43 Yeah.

02:44 And I always forget that set comprehensions are a thing.

02:47 Nice, nice.

02:48 These are great.

02:49 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?

02:56 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.

03:03 It's like, actually, we have these comprehensions too.

03:05 You don't need that.

03:06 So pretty cool.

03:06 - Anytime I can move code reviews out of personal opinions and into a static analysis tool, it just makes the team smoother.

03:15 - Yeah, absolutely.

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.

03:24 - Yeah, I mean, it's like a compiler warning or something at that point.

03:27 - Exactly, so well, CI says you gotta do it, so we all agreed that this is how it's gonna 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.

03:39 I don't wanna invite him to lunch anymore.

03:40 - 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.

03:50 So yeah, let the computer do it.

03:51 - Exactly.

03:52 And it's more consistent anyway, no matter how anal the person is, the computer is more so.

03:59 So this next item here is something that is near and dear to my heart.

04:04 We've covered it before when it first came onto the scene, but it's now really ready to go.

04:10 Now I wanna 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, Python's growth is incredible.

04:22 We've talked about that a bunch.

04:23 It's fast becoming one of the most popular languages, but there's really three areas in my assessment where Python could be, 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.

04:42 And those are a proper way to build mobile applications with Python.

04:48 I know we have Kivy, and we have some stuff from WrestleStuff as well, all right?

04:53 But those are like, sort of, well, we'll get it working.

04:56 It's kind of proof of concept.

04:57 It's not like a visual designer, drag and drop.

05:00 Here's how you push this button to publish the app.

05:02 So, right, like, there's not really a proper way to build mobile apps for Python.

05:06 That's existential threat one.

05:08 Number two is, I would like something like the Slack app in Python.

05:13 Build that.

05:15 Yeah, good luck with that, right?

05:16 Like, probably not.

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 gonna look like from 1994.

05:26 Nobody wants that.

05:27 - I mean, Qt's pretty good.

05:29 - Qt is pretty good, yeah, Qt's pretty good.

05:30 I'm thinking, you know, TK Enter.

05:32 It's like, it's definitely showing its age, right?

05:34 For example.

05:34 So, yeah, those are great.

05:36 And so, like, GUI is probably the least existential threat of these, but it's very closely tied to this last one, which is sharing your application with end users.

05:46 Somebody who doesn't care whether or not your program is written in Python, they would just want to run your program.

05:51 How does that happen?

05:52 - Oh yeah.

05:53 - Yeah, that's a problem.

05:55 And you know 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.

06:04 It was a super interesting interview and a lot of great stuff that he said.

06:07 I think they talked about it there with him.

06:10 If it wasn't there, was him being interviewed somewhere else.

06:12 And basically, they said, well, how do you feel about this deployment story?

06:16 Doesn't it seem like a weakness?

06:18 And Guido's thought was, well, you can really use a lot of the Linux package managers to solve a lot of these problems.

06:25 Like if I want Python there, I can apt install Python 3.

06:28 If I need to get pip, I can apt install Python 3-pip, and so on.

06:34 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.

06:50 But 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?

06:59 You know what I mean?

07:00 - Yeah, sure.

07:01 - 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.

07:10 You know what I mean?

07:11 - Okay. - Yeah?

07:12 So if we wanna get, if I wanna get something, like say if I've created some data science tooling and I wanna give that to my team, I would like to say, here's like a DMG or an MSI installer.

07:22 You double click it and then you run.

07:24 I don't care what version of Python you got set up or anything like that, right?

07:28 So I think that's the third problem, is like how do we get like end applications users?

07:32 And the reason I think it's partly, it's kind of this chicken and egg problem.

07:36 I feel like partly the reason it's not got a lot of attention in the Python space is because it's so bad.

07:42 It's like so nearly impossible that people just generally don't do it.

07:46 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?

07:52 It's like doesn't even make sense, right?

07:55 There's PI installer, but it's also good, but it has some limitations.

07:59 And so the thing I want to cover again is PI oxidizer.

08:04 And the reason is, it's now officially released.

08:07 It has its first release.

08:09 And I had been watching the GitHub repository, as you can say, go watch this repository.

08:15 And my email just blew up.

08:17 I just go and was constantly cleaning up pull requests, issues, all this kind of stuff.

08:23 People were just going crazy on the repository.

08:26 It's just got a ton of traction.

08:28 So that's out.

08:30 And I just want to highlight some of the stuff.

08:32 The guy who created it, Gregory, created it, and he's done some awesome stuff.

08:37 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.

08:43 So at PyCon 2019, like I said, Russell Keith-Magee said basically this distribution problem is like a potential black swan event for Python, right?

08:55 - I still don't know what that means, but sure.

08:58 - An unseen, super negative thing coming out of the blue that's going to dramatically disrupt it somehow.

09:05 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 first term.

09:13 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.

09:17 Right.

09:18 Yeah.

09:18 I mean, Python is so great everywhere else.

09:20 It'd be cool if it was great there too.

09:21 Exactly.

09:22 Why is it not good there?

09:23 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.

09:32 A .app thing on Mac, a .exe on Windows, and a statically linked binary executable on Linux.

09:40 So it works on all the different platforms.

09:42 And what's cool is it takes all the dependencies you have.

09:45 So if you depend on, say, pandas or whatever, it'll bundle that up.

09:49 It bundles the version of Python that you build it against.

09:53 So you're guaranteed you'll have 3.7 no matter what system you put it on, if you build it against 3.7.

09:58 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 - Oh, wow.

10:09 - Right, so it actually creates your Python files, it creates PYC files, so pre-computed PYC bytecode, and then loads that out of memory.

10:18 So it actually runs faster than if you ran the code.

10:23 It starts faster than if you ran the code in regular Python.

10:27 Some tools care about starting fast.

10:29 Some don't.

10:30 Like a website doesn't really care about starting fast.

10:32 But a command line thing--

10:33 If you're going to write an editor, you want it to just pop open.

10:36 Exactly.

10:36 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 their in-memory thing.

10:47 So you also kind of leaks your source code a little bit, right?

10:50 Yeah, I guess so.

10:51 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.

11:01 Technically, I know it still could be messed with.

11:03 But it's not like, well, here's the directory of Python files.

11:06 What is this doing in my applications root?

11:08 You know what I mean?

11:09 Let's go play with those.

11:10 So there's just a lot of interesting things here.

11:13 The article that Gregory put out announcing it is pretty broad, and it's really compelling.

11:18 So it seems like this project is really taking off.

11:20 I definitely think it would change the landscape if we had something like this legitimately working well across the board on all the OSs.

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.

11:40 - Yeah. - Cool.

11:41 Well, anyway, PyOxidizer, it seems to be catching fire and that's pretty awesome.

11:45 - Yeah, it is cool, I like it.

11:45 - All right, what you got?

11:46 What's the next one?

11:47 - 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.

11:57 You've got like just a--

11:58 you created a script, a little module or something.

12:02 And it works on your machine.

12:03 You want to share it with other people.

12:05 Even that, there's a little bit of a barrier between writing a simple script and packaging it up properly and getting that running.

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 tox and coverage to make sure it's well tested and structured well and all of that.

12:28 - That's cool.

12:29 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?

12:36 Or some flit or tox.

12:37 - That's the thing with coverage, you wanna be able to, I wanna be able to test so running against the installed version, not the local version.

12:45 So I wanna do all the packaging, install it into an environment, and then run the test against that.

12:51 And that was hard to do.

12:53 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.

13:09 I didn't know there was a thing here, and I'm highlighting a feature of talks that's called Changedr, and it's really simple.

13:16 You just put this in your test environment lines in tox, in your tox any file, and just say change the directory to like my test directory.

13:25 And then voila, you can't see the top level source code anymore.

13:29 - Oh, that's cool.

13:30 - Problem solved.

13:31 So I've got a longer explanation.

13:34 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.

13:40 But I was amused because I'm walking through an example and I'm trying all these things to make sure they work.

13:46 And the example project I built was a markdown converter using regular expressions.

13:51 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 - A single regular expression.

14:01 And Cloudflare is like the intermediary to so many applications out there.

14:06 It's, that's bad.

14:07 - Big chunk of the internet not working because Cloudflare was pegged on one regular expression.

14:13 I don't even know how to do that.

14:14 I don't know how to make a regular expression that I do simple regular expressions.

14:18 So I don't know how to do something that's quadratic in nature.

14:23 But I thought it was funny.

14:23 - Mine tell me they're not working right away, but they say that too frequently.

14:28 - Yeah.

14:29 - Like why is this not finding the match?

14:31 - 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.

14:42 So I'm laughing at Cloudflare, but I wouldn't be laughing if I was working there.

14:46 - Yeah, if your pager was going off at three in the morning, the humor would be entirely sucked out of that situation.

14:52 Yeah, that's rough.

14:53 Before we get on to the next one, let me just tell you all about DigitalOcean.

14:56 I try to highlight one of the features of what they've got going on.

14:59 Like I said, many times our infrastructure runs on DigitalOcean and they do a great job.

15:04 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.

15:12 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 '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.

15:45 So that's really nice, runs right there in that data center.

15:48 So if you're all good, check them out at pythonbytes.fm/digitalocean.

15:52 They're big supporters of the show and highly recommended.

15:55 All right, so this next one, Brian, I think has some pretty interesting possibilities.

15:59 It maybe ties back to my item that I spoke about before, creating like a new type of apps or opportunities for more apps.

16:05 Now, it used to be, if you wanted to have some kind of communication, you'd 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.

16:18 But recently, these things have just been working all on their own, right?

16:22 Things like Zencastr and whatnot.

16:24 Now it could just do live communication in the browser, and that's because of WebRTC and ORTC.

16:29 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.

16:44 The item I want to talk about is this implementation for Python that uses async I/O so you can write Python applications that then communicate with other things like browsers or mobile apps and whatnot that use WebRTC.

16:59 Yeah, so it's called AIO RTC.

17:02 AIO is for async I/O and RTC, well, for the protocol.

17:06 So it's pretty cool.

17:08 It follows pretty close to the JavaScript counterpart, which is how you would do it in the web.

17:12 But it uses a lot of Pythonic constructs like the popular JavaScript ones use promises.

17:18 So this AIO RTC uses coroutines, which is cool.

17:22 And events are emitted using the Py event emitter, which is all good.

17:27 The main ones, like the main ones if you want to explore these communication protocols are all baked into the browsers and they come in native code.

17:34 But if you want to explore like a more understandable version, a more hackable version.

17:39 This one is all just in Python, which is pretty cool for understanding how it works.

17:44 They also talk about some of the kind of apps you could build, right?

17:46 So like you can create some new things in the Python ecosystem.

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.

18:01 - Oh, that'd be neat.

18:02 - Yeah, so people doing fun stuff with video communications.

18:05 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 a pretty cool AIO RTC.

18:15 Yeah, neat.

18:16 Speaking of communications, you got another one, right?

18:19 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?

18:28 A prize, yes.

18:29 To inform or to tell someone, to make one aware of something.

18:33 - You've apprised me of the situation.

18:35 Really, yes, okay, carry on, sorry.

18:37 (laughing)

18:38 - So, Apprise is for push notifications, and their tagline was push notifications that work on just about every platform.

18:46 It's kind of a shim layer to put between your app and multiple notification services.

18:51 So, it sends notifications to things like Telegram.

18:55 They say Telegram Pushbullet, never heard of either of those.

18:59 Slack and Twitter, yes, I have heard of those.

19:01 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.

19:15 Some things that you'd want to just email people, but if your server's on fire, you might want to send an SMS to somebody.

19:21 - Yeah, this is cool.

19:22 It's really cool.

19:23 - It looks pretty neat.

19:24 The API looks nice.

19:25 It looks like it'd be pleasant to work with.

19:27 So I think this is a good one to highlight.

19:30 It looks neat.

19:30 One of the stuff that stood out to me is Growl and Windows Notifications.

19:34 Do you know what Growl is?

19:36 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 Oh yeah, yeah.

19:44 Yeah, Growl does that.

19:45 Oh, okay.

19:46 But you might have to have a little daemon installed.

19:47 I can't remember if it natively talks to Mac.

19:51 I don't think so.

19:52 I think Growl is like before that was built into the OS.

19:55 But basically it does that and then Windows Notifications like similarly.

19:58 But instead of being in the top right, they're in the bottom right.

19:59 so they're not at all the same thing.

20:01 - And it also supposedly supports matrix, so I don't know if that texts Keanu Reeves or--

20:05 - Yeah, exactly, yeah.

20:07 (laughing)

20:09 I know Kung Fu.

20:10 Okay, sorry.

20:11 (laughing)

20:13 Yeah, no, this is really cool.

20:14 If you gotta 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 Twilio or whatever, just like bring this in as like a facade over all that, it's great.

20:29 So this last thing I want to talk about is a new web framework.

20:33 And I feel like the web in Python is getting really interesting.

20:37 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 pyramid and there's, there's a few others that was cherry pie, but it's not used that much anymore.

20:50 So I guess I'll choose between those three, right?

20:52 Like that was kind of like the end of the thought.

20:54 But now there's like 100s like, little things, right?

20:57 There's Black Sheep that we talked about, there's Mace Knight, and there's Gepronto, and there's, well, there's WebSANA as well.

21:03 So WebSANA 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.

21:19 So we've got another way you might break up the web framework thinking process as well 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.

21:31 I want Django so I can have an admin back end where I just have an Excel-like view of my database if I want that, for example.

21:39 But if you want to not work the way Django works, well, too bad.

21:43 You work the way Django works.

21:44 That's how you use Django, right?

21:46 On the other hand, you could use Flask or Pyramid where it's kind of like, well, here's how you process a request.

21:50 Whatever else you do, that's on you.

21:53 It's up to you.

21:54 So a lot of people kind of like that more fine grained stuff.

21:57 Like, well, I think I'll use SQLAlchemy here, and I'm going to use this for managing passwords, and here's how I do my users, and email, and all that.

22:04 You get to choose all those little bits, but then you've got to choose all the bits and build with it, and so on.

22:08 So this WebSona framework is built on Pyramid, SQLAlchemy, and obviously Python 3.

22:16 But it adds a lot of the features people might choose Django 4, but in a super modern and cool way.

22:23 So I really, really like it.

22:24 Their description is, "WebSond is a full snack by the web framework for building web services and back offices with admin interfaces and user sign-up processes." That's good.

22:34 Yeah, so they say, well, when should you use it?

22:36 Well, it's focused on internet-facing sites when you have a public or private sign-up process and an admin interface.

22:43 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.

22:55 You're like, oh, you could use that.

22:56 Well, for like 80%, you could use that.

22:57 Then what?

22:58 Then where do you go, right?

22:59 So WebSonic can now be a place that you might go for that.

23:01 - Oh, cool.

23:02 This might be take off, yeah.

23:03 - I think it really could.

23:04 And so they talk about, they're focused on like core business logic.

23:09 So you can, you know, they build all, have all the building blocks.

23:12 Like you want to sign up with Google with your Gmail.

23:15 Yeah, you just like put that in there and it just, now you can sign up for your app with Gmail.

23:20 It's nice, you can get started real easy, lots of docs.

23:23 Yeah, it's just all about being productive.

23:24 So they have a whole bunch of infrastructure built up and you just kind of fill in the pieces.

23:28 It's a little more Django-esque than raw Pyramid is, but it's kind of nice that you have this blended option.

23:36 So I think it looks really promising.

23:38 They have a lot of cool things like asynchronous task processing and other stuff like that that really makes it feel pretty modern and cool.

23:47 - Yeah, definitely.

23:48 - And it looks like it's tested using pytest also.

23:51 - Yeah, it's tested using pytest.

23:53 It's deployed using Ansible.

23:56 Let's see, there's a couple other things.

23:58 Yeah, that is super cool.

23:59 It automatically comes with the top OWASP, top 10 security vulnerabilities, limit, like restricted.

24:06 So they figure out what are 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.

24:15 They have asynchrony built in, And it even has a IPython notebook shell.

24:20 So instead of just having a grid view of admin stuff I can type in, they're like, oh, well, if you need to do admin tasks, log in and just fire up Jupyter on the back end and just start--

24:32 manage it that way.

24:33 So that's like, all right.

24:34 So it's like a web shell to your server.

24:37 Keep that super locked down.

24:39 But still pretty awesome.

24:40 So there's a bunch of really interesting ideas here that I think are quite cool.

24:44 -The documentation is pretty thorough.

24:46 It even includes like, okay, once you get this stuff working, how do you deploy it somewhere?

24:50 - Yeah, exactly.

24:51 This is quite new, but it also looks really promising to me and I hope it takes off, 'cause I feel like this is like a really nice modern take on what a modern Python web app framework should look like.

25:02 - Yeah, cool.

25:03 - All right, well, that's it for our main topics, Brian.

25:06 You got something you wanna share with us?

25:08 Just quickly at the end?

25:09 - Yeah, I was gonna mention, so we mentioned my move.

25:12 The move at work has caused my schedule to be crazy and I don't know when to interview people.

25:19 If you've been paying attention to Test & Code, the episodes have been kind of solo episodes lately because I don't have to schedule myself.

25:26 It's just whenever I can do it.

25:28 Later on in July, things should settle down.

25:31 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.

25:38 So that should go on.

25:39 - Yeah, right on.

25:40 You're doing a great job with Test & Code.

25:41 There's a lot of stuff been coming out, nice and steady and a lot of good shows there.

25:45 - All right, thanks.

25:46 How about you?

25:47 - 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 SQLAlchemy, Speaking in Microframeworks.

25:58 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 our company, or that's what I'm trying to understand for a job or whatever.

26:09 So I'm like, all right, well let me go build the Flask version of this course.

26:13 So basically the idea is we spend about 10 hours recreating pypi.org from the ground up with Flask and SQLAlchemy.

26:21 - Oh, that's cool.

26:22 Yeah, I'm gonna have to check that out too.

26:24 - Yeah, absolutely.

26:25 So people can check that out.

26:26 Links are in the show notes or just training.talkbythumb.fm.

26:28 That's the latest course and no time to rest.

26:31 Since we're done recording here, it's time to start the next, continue on the next one I'm working on.

26:36 So I'm really excited to have this out.

26:37 I think a lot of people will appreciate it and it was really fun to write because you gotta explore a lot of these ideas we were just kinda just talking about.

26:43 - Yeah, I'll be hopefully working on a course here pretty soon too.

26:46 - I'm very excited about that, yeah.

26:48 I'm not really sure we're ready to share what the topic is yet, but it's gonna be in high demand and very popular.

26:53 - Yeah, I'm looking forward to it.

26:55 Yeah, complete secret, nobody'll know what it is until it shows up.

26:58 - Yeah, computer vision and IoT probably, but I'm not gonna...

27:01 (laughing)

27:04 - Yeah, maybe, yeah, sure.

27:06 - Or something else, probably.

27:08 So speaking of jokes and sarcasm, a SQL query goes into a bar, walks up to two tables and asks, "Can I join you?" (laughing)

27:18 - I really like that.

27:19 - Yeah, it's pretty bad, but--

27:21 - That's good.

27:22 - It's a good one.

27:23 - Yeah, so I don't have a joke, but I saw this on Twitter and I cracked up.

27:29 - I did watch this, yes.

27:30 - The reset procedure from GE light bulbs, it's so funny.

27:34 - These are smart, in quotes, smart light bulbs.

27:37 - Yeah.

27:38 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?

27:47 Right?

27:47 - Yeah, 'cause you can't just like turn it off and turn it on 'cause that's what light bulbs do.

27:51 So you have to do something else.

27:54 And this procedure that they've got is hilarious.

27:56 And it's like, turn it off for five seconds, then on for eight seconds, then off for two seconds, then on for eight seconds.

28:03 And if you go through this like five times.

28:05 - 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?

28:15 You gotta do like three more rounds of that.

28:17 It's insane, yeah.

28:18 - Yeah.

28:18 - Yeah, we'll link to the video for that.

28:21 - At the end, it's like, if that didn't work, maybe it's an old firmware version.

28:25 Try this other, even worse procedure.

28:27 Awesome user interface experience.

28:31 - I love it.

28:32 What do you do when like the only interface you have is like power on, power off?

28:36 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 clothespin 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 poke it right to the socket because people are always poking metal into light sockets. Yeah.

29:04 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.

29:11 Yep, all right. Well, thanks a lot, Michael. You bet. Thanks for being here. See ya. Bye.

29:15 Thank you for listening to Python Bytes. Follow the show on Twitter via @pythonbytes.

29:19 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.

29:32 On behalf of myself and Brian Auchin, this is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.

Back to show page