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


Transcript #291: Wait, you have how many licenses?!?

Return to episode page view on github
Recorded on Wednesday, Jul 6, 2022.

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

00:05 This is episode 291, recorded July 6, 2022, and I'm Brian Otkin.

00:11 Hey, I'm Michael Kennedy.

00:12 Good to see you, Michael. It's been a while.

00:14 Yeah, good to see Brian as well. Fun as always.

00:17 There's just a never-ending flow of fun stuff to talk about. I know we've got good stuff to share today, as always.

00:22 Yes, we do. Why don't you kick us off?

00:24 licensing, something everybody's super psyched about.

00:28 But I think you will find this project interesting.

00:31 And I don't know how you'll receive it, but I was like, wait a minute, what?

00:36 This is odd.

00:36 So this project comes to us from Tom Nighthof.

00:40 And he sent this in and said, you know, it occurred to me that we have licenses for things like pytest.

00:46 So I could go search for pytest and over on GitHub, or my programming lens, over on GitHub, I could check this out.

00:54 And what is the license?

00:56 Well, it looks like the license is MIT.

00:58 So if I want to use pytest, I'm buying into the MIT license, right?

01:02 - Yeah, kinda.

01:03 - Sometimes.

01:04 - Only if you ship with it.

01:05 - So it's gonna be pytest.

01:06 That's true.

01:07 But you know, there are libraries like request or whatever that you might, you know, ship, right?

01:11 So I'll just put pytest in here to see what we get.

01:13 So this project is called Python Project Insight, and it only has about 5,300 packages parsed in so far.

01:20 But the idea is you can say load the dependencies and it'll show you the licenses.

01:26 So for example, for pytest we have the MIT license, but pytest depends upon packaging and import lib metadata and Colorama and PyParsing and Adders and typing extensions.

01:37 Well, packaging has the Apache license, Colorama has the BST license, Adders has MIT license, so does pytest, and then the Python Software Foundation has typing extensions.

01:48 So I don't know, what do you think of that?

01:50 - It is interesting and I don't know what to do with it.

01:54 - I don't either.

01:55 I'm like, wait a minute, I have to kind of, sorta consider the transit of closure of the dependencies for their licenses.

02:03 And I had never really, I'm sure people are there.

02:05 Well, of course, Michael, of course, that's how it works.

02:08 But for me, I like, I hadn't really thought about it.

02:09 I look at the project or the library and has this license.

02:12 Like another one could be, you know, that you would build on before, more likely would be like requests.

02:17 So if we load the dependencies for requests, You have Apache, BSC, MIT, and Mozilla split across that one project.

02:24 So yeah, I just think this is pretty wild.

02:28 Tom pointed out that TensorFlow was one of the more wild ones.

02:32 If you load up TensorFlow, there's just lots of different licenses here.

02:36 Like, sample the GitHub licensing options, basically.

02:39 - So if I was shipping a commercial project, a commercial product with Python that used a whole bunch of dependencies, I do know that this transitive closure stuff, the stuff that I'm actually shipping with, I really am supposed to list those and have those licenses listed in somewhere.

02:57 - Right, in a sense, because you are shipping the dependencies of a thing in order for that thing to work, right?

03:03 - Yeah, so you're at least saying, I'm using this, it's here, and here's the license for it.

03:09 I think that's the case.

03:10 I'm not a lawyer, of course.

03:12 But the-- - Neither am I.

03:14 - There's a whole bunch of these tools, like pytest, for instance, that we use that we don't ship.

03:19 those are a different story.

03:21 And that's kind of a different license thing.

03:23 But I don't know about the packages.

03:25 Are these, like the packages that, these are shipping, they're there, they're not really being sold, but do you have to list the licenses of the things that you're depending on?

03:35 I don't know.

03:36 - I don't know either.

03:37 I think maybe in sometimes it doesn't matter.

03:40 But if it was GPL rather than LGPL, right, for example, that might be something you care about.

03:46 You know, I don't know.

03:48 I would love to hear people who really understand this super well, if they could maybe tweet at us or comment on the YouTube stream or something like that about exactly what that means, but I do think it's pretty interesting information.

04:00 Mostly this shows the licenses, but it also shows the total size of installing the project and what libraries it depends upon.

04:07 So you can poke around with that as well.

04:09 >> That's actually pretty useful and interesting information as well that you don't really think about is, How big of a download do I get if I put all these things together?

04:19 So yeah.

04:20 >> Yeah, and you can pile them up.

04:22 So you can say I'm using TensorFlow, I'm using SKLearn, I'm using requests, whatever.

04:29 Then you can say like, okay, for those three, tell me about what the story is.

04:33 You know what I mean?

04:34 >> Yeah.

04:34 >> Then it gets a little more interesting still.

04:36 I guess maybe that's not quite right.

04:38 But that just comes with SciPy.

04:40 But anyway, yeah, something like that, right?

04:42 >> Yeah.

04:42 >> Yeah, neat. So anyway, thanks Tom for sending that in, and share it with us.

04:46 - Well, I think I'll switch gears a little bit and talk about data classes.

04:51 So I actually really like data classes.

04:53 Have you used data classes much, Mike, Michael?

04:56 - Some, they definitely have some very neat properties.

05:00 I find myself, kind of when I'm on the edge of using a data class, I'm like, maybe Pydantic, but Frozen is a cool option you can add.

05:08 Slots, Slots makes so many things awesome in terms of lower memory usage, faster attribute access, all kinds of things.

05:16 And if it's just slots equal true on the class definition, that's kind of nice.

05:20 - Yeah, it is.

05:21 So Trey Hunter is a Python trainer, and he came up with this cool tool on his Python Marshalls site called the Undata Class.

05:31 And it's actually also a library that he released, a little tool that's Undata Class.

05:35 And the idea is, he was thinking, what would be the equivalent of a data class If you didn't write a data class, if you wanted to have the same sort of functionality, what would you do in a normal class?

05:46 So he's got this cool tool down, and the example shows, yeah, it shows here slots, just a point with XYZ, all floats, and also shows frozen sets and slots, but I'm gonna turn those off.

06:00 And you just change the class, and it changes the output in it.

06:03 Like, he like prints out what an equivalent class would be if you didn't use data classes.

06:11 So actually I'm not, and I tried to make sure I understood all of this.

06:15 So one of the things that it's kind of neat that it just, it's part of a learning tool that he's got that it shows you, you know, what you get with data classes, but there's not a lot of description around like what all this means.

06:26 So this is sort of a fun thing to help you look up stuff, I guess.

06:30 So right off the bat, if we just have X, Y, and Z, you have a dunder and net that takes X, Y, and Z as input values and assigns them.

06:38 And it comes with a nice wrapper class and then an EQ, a Dunder EQ, which is for equality.

06:45 And one of the things I knew I wanted to look up was to make sure I understood is what it does is it says if the other thing, if I'm getting compared to something else, if that other thing is also my same type in this point, in this case point, then you can do the equality comparison.

07:03 Otherwise, the rays are not implemented.

07:06 And that's just kind of a convention because Python, and then what happens is Python will try to call EQ on the other thing, like reverse the order and stuff, because it's kind of how Python works.

07:19 But it's one of those hidden sort of things is you need to kind of know that.

07:22 If you don't know what to do in an EQ class or an EQ function, rays not implemented, and then Python goes from there.

07:31 And then resetting though, if you give it slots, all the slots does is add slots to it.

07:39 And that's it, which is kind of cool.

07:41 And what slots does, yeah.

07:43 And what slots does is it makes it so that you can't add later.

07:46 So if you can't add a W attribute later to your point, but then if you do frozen, it does a whole bunch of stuff.

07:56 Oh, you get a whole bunch more Dunder methods, But mostly, these are just raising exceptions so that if you try to change it, it raises the exception.

08:05 So anyway, this is kind of cool.

08:06 - Yeah, do you see the Dunder init, the constructor implementation when you add frozen?

08:12 It doesn't say self.x. - Oh, it does change.

08:13 - It calls setAdder like behind the scenes and then it implements setAdder and delAdder and raises exceptions if you try to mess with it.

08:22 Pretty wild.

08:23 - That's cool.

08:25 We're also going to link to a couple of articles that Trey wrote about.

08:31 He wrote about this, about how he wrote this.

08:34 And one of the things I'm bringing this up partly because I like data classes, and it's kind of cool for people to learn what they are.

08:41 But in his developing this, he says he came up with having a great use case for the match case, new match case blocks in Python using Sentinel objects, which I'm not sure what he's talking about there.

08:55 So I'll just take that, look at that.

08:57 Using TextWrapDedent, which I love, and it's nice to see somebody else using that.

09:02 Slice, and then an AST, so he's using AST in here.

09:05 So it's kind of a cool, fun example of using that.

09:08 Anyway.

09:09 - Cool, a lot of cool stuff in there.

09:10 Go back to the first one, the first tab you got there.

09:13 - Yeah.

09:14 - One of the things I appreciate from this example is you just say class point, X colon float, Y colon float, Z colon float.

09:20 - Yeah.

09:21 - Put the data class attribute on it.

09:21 Look how much it's doing for you, right?

09:23 Like it's not just the typed values, but it's protecting the read/write ability, making it read-only, it's getting a wrapper definition, it's getting a hashability equality, not quality effectively by, all right, there's a lot of cool things that's adding for you there.

09:39 - Yeah, and he's--

09:40 - You can appreciate the data class.

09:42 - He's suggesting doing other stuff like using keyword only and fields, different fields to see if you can change how it works.

09:51 But yeah, I'll have to play with this more.

09:54 And a reminder to everybody that is like, data classes are almost enough, but you need more.

10:00 We'll also look at adders, because adders is a kind of a super set of data classes.

10:05 - Right, yeah, fantastic.

10:06 That's great, cool.

10:07 All right, Brian, the next one I got here, this one's for you, okay?

10:10 - All right.

10:11 - All right, so let's go back.

10:13 We'll take a two-step process to approach this.

10:17 Did you ever use links, L-Y-N-X?

10:20 - Yeah, like a long, long time ago.

10:22 - I remember SSH, I know, I think I telnet it into the mainframes back at the university and I'd run ly and x.

10:31 This predated the graphical web.

10:34 I mean, it's insane, right?

10:35 So, but it's a browser that is pure text in the terminal.

10:39 Today we have all these fancy browsers, but one of the things you had a lot of was like keyboard shortcuts and other types of things you could do, right?

10:46 - Yeah.

10:47 - Well, now that it's 30 years later, what if we could go back to a time, a little bit like that.

10:51 So I wanna introduce you to the Qt Browser, Q-U-T-E Browser, okay?

10:57 - Okay.

10:58 - So what is this?

10:59 The Qt Browser is also like kind of in need of a homepage refresh, but it's a keyboard focused browser with a minimal GUI.

11:07 And what's interesting is it's built with Python, okay?

11:10 So it's a full web browser built with Python, and it's kind of like a Vimper or one of these other ones that lets you do Vim like control and behavior of it.

11:21 A little bit like, a little bit like links, but it's actual, actually Chrome more or less, at least the Chrome runtime.

11:29 So this one was sent in, I'm gonna make sure I give him credit for giving the shout out.

11:33 This was sent in to us by Martin Boris, and it's pretty neat.

11:38 So it's a browser.

11:38 Let me switch up my screen share just for you for a sec.

11:42 Stop, and then I'm gonna add the Qt browser.

11:46 Ready?

11:46 Where is it?

11:47 There, all right.

11:48 So look at this bad boy.

11:50 So this is the browser.

11:52 And how do I go to places?

11:53 Well, I can click on things, like here's a link I can click on.

11:56 But if I want to go somewhere, I press O, and it pulls up a place I can open.

12:01 Look at this.

12:01 I got my history.

12:02 >> Oh, that's pretty cool.

12:03 >> I want to go to Talk Python.

12:07 If I want to do a command, I hit colon.

12:09 And here's all my commands.

12:10 I have my tab, and I give focus and control and so on.

12:15 Over here, I just type F. So if I want to--

12:18 If I want to navigate, for example, I'm here on the Talk Python page.

12:21 What if I want to go to courses, I type F and then everything, see how everything gets a letter above it?

12:26 >> That's pretty great.

12:27 >> Yeah.

12:27 >> L, D, D, G. If I want to go to D, I just press D and then we're off on the Talk Python Training site and so on.

12:33 So I could open, or I could say open, and I can search for pytest, and I'll pull up my tests and so on.

12:41 I can do a new tab.

12:42 I got to remember how to do that.

12:44 Yeah, I'll say tab clone.

12:46 I come over here. I know there's a bunch of good commands that I'm not following, like very much like if I was actually using Vim.

12:53 If I could search for pytest book, I could come over here like that, and I can hit, is it Control or Windows Control?

13:00 >> That's a good book.

13:01 >> I heard that's a good book. I can cycle through my tabs, see how minimal my tabs are and stuff there.

13:05 >> Yeah.

13:06 >> On the bottom, it's got all these little commands.

13:08 Anyway, I can type colon Q, boom, we're out.

13:11 >> Nice.

13:12 >> What do you think of this? Yeah, what do you think of that?

13:14 >> I actually love the Qt Browser.

13:15 I haven't used it much, But I definitely know about it because the Florian Bruin who started Browser, he's a pytest core contributor and also one of the technical reviewers for the pytest book.

13:30 So really cool guy.

13:31 But I love the idea of being able to just use a browser with a keyboard and not have to touch the mouse at all.

13:37 That's next level.

13:39 >> It's pretty neat.

13:40 >> Yeah.

13:41 >> Yeah. Let's see.

13:42 Out in the audience, Kim VanWijk, hey Kim, says, "I resign myself to using a mouse more than I want to.

13:48 Qt Browser may be the way to go." Thanks for the tip, awesome.

13:51 >> Yeah.

13:51 >> Alvaro says, "Are those VS Code shortcuts?

13:54 I suppose only if you have the Vim binding set in VS Code." But then I sort of yes.

13:59 >> Well, of course you do. Why wouldn't you?

14:02 >> Are you a monster?

14:04 >> Can you even do Emacs bindings?

14:08 >> I don't know. You could do non-Vim bindings.

14:11 >> Yeah, right.

14:12 But then people would look down on you, right, Brian?

14:15 >> But-

14:15 >> I don't do Vim stuff in my- I know that you probably do though.

14:18 >> Yeah, I use Vim everywhere, especially in VS Code. So nice.

14:24 But I think people should check it out.

14:26 It's a cool project and also it helped push forward some of the, some high test things.

14:33 We got some new features because of this.

14:35 >> Yeah, that's great. I installed it with Homebrew.

14:39 So that was easy to install.

14:40 we can install it with apt on Linux.

14:42 I'm not sure about Windows, but they've got a quick start guide so you can follow along to see what you might want to do.

14:49 It's not super obvious.

14:50 >> No, that cheat sheet is a bit of an eye chart.

14:55 >> It's a bit of an eye chart.

14:57 I suspect you can zoom it.

14:59 It's still small.

15:01 It's still small.

15:03 But yeah, I do like the navigation, pressing F and then just a letter to navigate instead of using your mouse to follow the links.

15:11 That's pretty cool.

15:12 >> Do you remember those templates that people used to have back in the day for like in Office tools where they would overlay?

15:21 >> It was actually an overlay on your keyboard?

15:23 >> Yeah, it would go over the function keys so you can remember which functions did what during what application.

15:30 If you switch to Word, you put a different, or probably WordPerfect at the time, you put a different template over it.

15:36 >> Yeah. I'm going to use Lotus 1, 2, 3, give me the function key over.

15:40 >> Yeah. I'm just showing.

15:43 >> I totally like that. It is.

15:44 >> Showing how old I am. Let's talk about something new.

15:47 >> I'm sure they still teach that in college.

15:48 >> Yeah. Although in college, I had to teach.

15:53 I was a TA for a computers 101 class during grad school, and links was one of the things we had to teach.

16:01 I was like, nobody's going to use this.

16:03 >> Really?

16:03 >> Yeah. But it was part of the curriculum.

16:05 >> Incredible.

16:05 >> Yeah.

16:06 >> That's awesome.

16:07 Anyway, so let's switch to something new like async.

16:11 So I think we've talked about court probably several times.

16:16 Court is like Flask, but it's async.

16:20 It actually supports the Flask API, or I think, and looks the same, but it's async instead. But there's a problem.

16:31 >> It's super close.

16:32 You can basically, everywhere you have the word Flask, if you replace it with the word court, it more or less works.

16:38 So like lower case F flask, you import lower case court.

16:43 If you create an object capital F flask, you use capital court and then it lets you do async basically.

16:47 >> Cool. But there's ecosystem around both of them now.

16:51 So there are extensions to flask, some of them work on court.

16:55 There's extensions to court.

16:57 I don't know if any of those work on flask, but the people behind both of them are supportive of the whole thing.

17:05 And so Port is actually now part of the Pallets project was is the big news.

17:11 And Pallets is the project that includes Flask and a whole bunch of other stuff.

17:19 But it because of this, it will help maybe the maintainers kind of work together a little bit better and smoother to iron this out.

17:28 So the big difference of course, is that Flask has a whiskey server behind it, server is the right word, and Cort is ASCII, so asynchronous.

17:41 So this is cool.

17:45 Well, why do we care a little bit is that it used to be that really you had to do async.

17:50 If you wanted async, you had to do Cort.

17:52 But now Flask, as a Flask 2.0, you do have some async capabilities, but it's still using a single threaded server.

18:03 So there are some limitations.

18:05 So kind of interesting to read about this.

18:08 There is a async and await page on the Flask website that talks about really what the trade-offs are, what the performance and the background tasks and how to do that without shifting to court, but then also talks about at some point, you might wanna just switch to court instead.

18:29 Along this line is, I was thinking about this partly while I was looking at this other article from Steve Pate that called, "Should you use async on your next Python web application?" Which I was, I wanted to bring this up 'cause I was curious about what your take on it was.

18:48 The first part is it's a really nice history.

18:50 It talks about the history of web server interfaces with Python, with the timelines and, and Whiskey and Ascii.

18:58 and then how AsyncIO came into play and how uvicorn is popular and unicorn, I don't know how to say that.

19:12 - I'm pretty sure it's G-unicorn 'cause it's short for green unicorn.

19:16 - Okay. - So the last bit should still be pronounced unicorn, so I'm gonna go with G.

19:19 - Okay, and then there's Hypercorn, which is the asynchronous web server that's similar.

19:25 Anyway, so it talks about this, But then at the end, the conclusion, it talks about all the different frameworks.

19:31 In the conclusion is, most people don't need async on their web server.

19:36 And I was curious what your reaction to this conclusion is.

19:41 - I have some thoughts, but let me pull up some first.

19:45 Okay, so here's my thought.

19:47 It depends.

19:48 It depends on how far you need to push it towards the edge.

19:51 I was surprised how far you can get without async in terms of concurrency.

19:57 - Okay.

19:58 - So I recently did an in-person class, imagine that, over Zoom, but live in person.

20:05 I actually have some more to say about that, it's kind of related.

20:07 But anyway, I just did a course with some folks who are doing FastAPI, and they said, "Look, this async stuff that we're doing "adds some complexity to the way that we gotta write code.

20:18 "We're not sure whether or not there's a trade-off." So what we did is we actually ended up writing a FastAPI app with using the sync and the async version of SQLAlchemy, and then using async and an async version of FastAPI endpoints.

20:33 >> Okay.

20:33 >> With the database that we had as the back-end, and the database was not the limiting factor because it was at 10 percent CPU while this was happening, it was just chilling.

20:43 >> Yeah.

20:44 >> But with a real database Postgres as the back-end, what we found was we could do, I can remember this right.

20:51 Oh boy, I'll give you, I can certainly give you the relative bit.

20:55 So with the synchronous version, we got way more scalability than we thought.

21:00 So it was like 75% performance of the async version.

21:06 So that seems way higher because the database, like most of the things we were doing just waiting on the database.

21:11 But because we are running in gunicorn with uvicorn workers, I was really just in gunicorn with threads, you know, Python doesn't do threading well, except when it's listening on a network socket or doing a few other things that will release the gill.

21:25 And guess what?

21:26 When you're talking to database, you're listening to network socket.

21:27 So there's all these points that naturally free up the threading.

21:31 - Interesting.

21:31 - And actually got us like 75% of the way there, but we still got 25 to 30% more performance out of the async version.

21:39 And it was like, I think it was five worker processes running on my eight core machine, talking to Postgres and we were getting some like, you know, like 2000 requests per second versus 1500 a second, or maybe it was 1000, 1500, something like that was a lot of requests per second. But we did get more performance out of the async version. So my depends is like that last 25. Are you like that close to your performance, I would say 95% of the web apps are not maxed, right? They're not maxed out with like multiple servers trying to deal with it. All right, 95% of servers are doing important work, but they're probably still have a lot of capacity left.

22:19 So it's like, it depends on like, do you need that last 25% or does it not really matter?

22:23 - Yeah. Yeah. And also like...

22:26 - Those are my thoughts.

22:27 - What's the load like on your typical, I mean, what are your levels anyway, right? So if you already have that, like for instance, if you already have an application running, you can measure it and see what your load is looking like and how many people you have.

22:42 And then if you if you think, oh, I might I might increase my what if we double, then you can kind of guess what your load is going to look like if you double and stuff.

22:52 So interesting.

22:53 Yeah, one of the I recommend people check out this locus thing because it's so easy to say a typical user clicks on the page between five and 15 seconds.

23:03 They might go log in some of the time they might go hit the home page that might hit the about.

23:07 And then you can say, I would like to see how many users I can take.

23:10 And if you're 10x what you need, you know, it doesn't matter whether you use async or not, but there is a performance benefit.

23:16 It's just not as massive as it might sound.

23:19 The other bit that I want to like point out is the the one statement that like depends on what you're using also.

23:27 Like I can't find the bit here, but it he was talking about how one application he had, he was thinking about, oh, I might do async, except for he was using a payment gateway that didn't have an async version.

23:41 So he had to use a synchronous for that.

23:44 And since it's synchronous somewhere, you kind of have, is this true, if it's synchronous somewhere, you have to be synchronous everywhere or is that not really true?

23:52 Do you know?

23:53 - Sorry, say that if it's async, it's async everywhere or sync, it's sync everywhere.

23:58 - Either one, is either one of those true?

23:59 If I, like if I have a, if I've got an application and I do need to hit a gateway that's synchronous, do I need to, if I isolate it, I guess I can probably do asynchronous and hide it that way.

24:12 >> You just don't get as good a scalability there, and you block up the processing if you do the sync.

24:18 For the async one, you can do a wrapper where you say, we're going to do some async work, but I'm just going to call that and block because all the other stuff above it doesn't want to deal with being async.

24:29 >> Yeah.

24:29 >> So it's easier to go from sync to async, to have part of it be async.

24:34 The other way around is a little more tricky, you can mess it up a bit.

24:37 >> Okay, cool. Nice, interesting conversation. Thanks a lot.

24:41 >> Absolutely, it sure is.

24:43 Is that it? Is that all of our items?

24:45 >> Are we? I think.

24:47 Is that all of our items? I guess so.

24:48 >> Yeah. You got any extras for us?

24:51 >> I don't.

24:52 >> Okay. I have some.

24:54 Let me pull them up here.

24:55 Locust, look, let me tell you about it. Now, it's great.

24:57 Now, I have three things I want to tell people about.

24:59 Number one is I did a talk at Python Web Conference, the HTML and Flask one that I've done in some other places, but that was a fun talk like a 45 minute flask plus HTMX goodness there.

25:12 So that video along with all the other Python webconf 2022 talks are now on YouTube.

25:19 So people can check that out.

25:20 >> Cool.

25:20 >> Did you know that the Python web conference had five days, and I think it was like four or five tracks all day.

25:28 So there are a ton of videos.

25:29 There's like 150 videos or something on there.

25:32 I mean, look at this scroll bar here.

25:33 It's probably going to like page as I get to the bottom too.

25:37 Yep. Look at that.

25:39 There's a lot of talks that people can come check out if they're interested in that.

25:43 >> That's pretty cool.

25:44 >> One of them being HTMX that I did.

25:46 >> Yeah. I want to watch your talk.

25:47 You've given that a couple of times, haven't you?

25:49 >> Yeah. I've gave it a couple of times.

25:51 Basically, the way it worked is like when I was working on that course and really playing with those ideas, I submitted to a bunch of conferences, and those conferences were either a year out or they were like a month out or something.

26:01 That's how that ended up so spread out.

26:03 The other one is I mentioned the browser that was fun, but how about the Browser-a-saurus?

26:08 >> Okay.

26:09 >> A macOS only tool, but there's probably something like it for the others.

26:13 So here's the thing. Suppose I'm in Typeora, which is a markdown editor, or I'm in PowerPoint and it's got a link and I click it.

26:22 By default, it opens in the default browser.

26:25 But depending on what you're doing, you might want it to be like, oh, sometimes I wanted to open in Vivaldi, but other times I wanted to open in, like say the cute browser or Orion or some odd thing like that.

26:35 Right?

26:36 So the idea with this thing is that you click a link and when it opens up, instead of opening in the default browser, the browser, a source is the default, and then you have, keyboard shortcuts like F for Firefox, E for edge S for Safari, and you say, well, which one do you want to open in right now?

26:53 And it basically just delegates to the different browsers you register it with.

26:57 So you hit T for tour or F for Firefox.

26:59 When you click a link, that's kind of cool.

27:00 Right?

27:01 That is pretty cool.

27:02 Yeah.

27:02 I haven't been convinced that I would use that or not, but I do appreciate it.

27:07 And I feel like maybe someone sent that in, and if they did, I really appreciate it.

27:12 But yeah, I don't have any notes of who sent it in.

27:14 So anyway, that's pretty cool.

27:15 If you find yourself, you know, copy link, going to different browsers a lot, and you're on Mac, I know that's like a small, a rapidly decreasing Venn diagram.

27:24 But if you're in that space, this might be a cool option for you.

27:26 - Yeah.

27:27 - What is it written with anyway?

27:29 TypeScript mostly.

27:30 >> Okay. Speaking of browsers, I just found this because I was like, is links dead? Can I use something like links now?

27:36 There's a browser called Browse, which is a text-based browser.

27:41 That's still a thing.

27:42 Cool. I had to try this out.

27:44 >> My gosh. I love it that it has text, but it's like 8-bit pixelated.

27:50 >> Yeah, it takes the images.

27:51 >> I mean, it has pictures, but it takes the images and makes them look like what you would get.

27:55 >> Yeah. I'll have to give this a try.

27:58 >> Yeah. You've run it in Docker.

27:59 >> Of course you do. All right. Pretty cool.

28:03 One more before we get to our joke.

28:07 >> Okay.

28:08 >> The other one is I talked about doing a live class.

28:11 I actually have an announcement for a live class that I'm doing.

28:15 Obviously, people know I have a bunch of online courses and of course I'm going to keep, I'm already working on the next one of those, and we've got a bunch coming there.

28:22 But I want to try some experiments, something where people can attend a class in person with other people, right?

28:31 If they sort of help each other along, and I've tried this before, this cohort thing, but I think I've got a better platform, a better way to do it.

28:39 So over at, this link I'm gonna put in the show notes, I'm doing a FastAPI in MongoDB.

28:45 So basically FastAPI, Pydantic, Beanie, and MongoDB course that is going to be a four day, six day course over two weeks and it has a couple hours a day and.

28:56 >> Oh, wow.

28:57 >> You'd have a bunch of people there working together on some fun stuff and I'll be live teaching every session so it's going to be like a live course as if you were attending it in person just remotely because it's 2022, and I guess it's not post-COVID all the way.

29:15 But anyway, it's got a really cool set of topics that we cover.

29:17 It talks about async, It talks about Mongo, Beanie, Pydandic, FastAPI, of course.

29:23 We even use Locust at the end to test it out.

29:25 - I think this would be fun.

29:27 This looks great.

29:28 Cool.

29:29 - Yeah, awesome.

29:30 I think it'll be fun too.

29:31 I think it'll be neat to have this experience with people.

29:34 And I've tried this before, but all my prior attempts were, they were good, I think, but they were like, "Oh, take the online course, "and then we'll do like a community type thing." This is like a live course that I'm just teaching one-off for that group of people that sign up.

29:45 So we'll see how that goes.

29:47 If it goes really well, people love it, then I'll do more of these.

29:49 If not, then maybe less of them.

29:50 I don't know, we'll see how it goes, but this is happening August 8th to 19th.

29:55 So it has a real date, 'cause it has a real live aspect to it.

29:59 - Nice, cool.

30:00 - All right, and Mario on the i says, "That's my stack right there." Oh yeah, that's a good stack, right?

30:06 There's some really good stuff to talk about there.

30:09 I've been using Beanie and FastAPI for stuff, and obviously Mongo.

30:13 - Yeah, speaking of courses, one question out there, How's the pytest course going?

30:19 It is going, it's creeping forward, but life has gotten in the way.

30:25 - Yeah, it's awesome that you're working on that.

30:30 Takes a while to create a course, doesn't it?

30:31 - Longer than I thought.

30:32 I'm like, man, I already wrote the book.

30:34 I can totally pop a course out in a couple days.

30:36 (laughing)

30:38 - Yes, of course.

30:39 Would you say that as a junior developer, you might think about this differently than after somebody's been doing it for a while?

30:45 >> Yeah, this cracked me up.

30:48 I can't remember who shared this.

30:49 >> It's a great joke you got here.

30:51 >> Somebody shared on Twitter, sorry.

30:53 I don't know who. In a job interview, you've got somebody gets asked, where do you see yourself in five years?

31:02 The junior developer in this interview question, shows a picture of the black hoodie with multiple screens and light up keyboard.

31:12 I'm in hacker zone.

31:13 of screens, just totally coding.

31:15 Yeah.

31:16 >> Senior developer, where do you see yourself in five years?

31:18 On a farm.

31:20 >> Pumpkin farming with cows and apples.

31:23 You know what, I'm about done. I love it.

31:27 >> Yeah. My personal thoughts are, why not both?

31:30 This is just a view of the inside his office and then outside.

31:34 Working from home, man.

31:36 >> That's right, working from home.

31:37 >> Yeah.

31:38 >> All right. I have maybe the one that preceded that, the one that or maybe is in between these two that might precipitate the second.

31:45 >> Okay.

31:45 >> All right. So this is a tweet from Programming Humor.

31:48 It's a strange language that JS.

31:50 JavaScript is such a strange language.

31:52 Nobody can understand it, but if they manage to, then they create their own framework.

31:58 Everyone's got their JavaScript front-end framework or something like that.

32:03 >> Yeah. You know you've made it when the framework you've invented starts showing up on job requirements.

32:10 That's right. With four years experience.

32:13 Or until it's years old.

32:15 Exactly.

32:15 Well, good episode, Michael. Thanks for showing up again.

32:20 You bet. Fun as always.

32:21 Thanks, everybody.

32:22 In the slack and everything. Bye.

Back to show page