« Return to show page
Transcript for Episode #205:
This is going to be a little bit awkward
00:00 Hello, and welcome to Python bytes where we deliver Python news and headlines directly to your earbuds. This is Episode 205. Recorded October 21. I'm Michael Kennedy. And I'm Brian. Okay. And this episode is brought to you by us more about that later how you can support what we're doing. Right now. I'm really sorry, man by I've got some little bit awkward to talk about. This is awkward. I know. But luckily, it's just you and me. So you don't mind if I just sort of tell it to you straight? Yeah, just Okay. All right. Well, sometimes I have an array, and it's perfectly tabular. Like, it's, it's maybe just a linear array, or sometimes the array goes across, like, every entry is like 20. It's like a list with like, 20 length 20 lesson, and it's all the right size. But sometimes, you know, maybe it's it's the wrong shape. And it's awkward. And it's hard to deal with in Python, you know, a lot of re processing happens happens in NumPy. But NumPy is all about rectangular like things. And so if you've got data that's kind of like an array, multi dimensional array, but it doesn't fit that shape, what do you do? Oh, better Simon, Thor, send us a message and said, You all should talk about awkward arrays. so awkward arrays, this is a it's actually a pretty advanced library. So it's a little bit like NumPy. And it has NumPy, like idioms and so on. But it's a library for nested variable size data, including arbitrary linked lists, records, mixed data types, missing data, and all those things and dealing with those with NumPy, like idioms. So it's better for handling, you know, like what I described, not the same shaped data, it's kind of the same dimensions, but it's not always the same length on the various parts. Yeah. And you could even use it with things like number to JIT compile the code to make it even faster. And they just announced version 1.0 of this library, which was originally written in Python. So it was good, but not super, super fast. And they rewrote the core in c++. So now, it's like a lot of the data science stuff c++ at or the business end of the library. So it's super fast. Nice. Yeah, I'm pretty cool. What do you think about the logo,
02:12 the logo is actually great. It's awkward array. But the second array is below awkward. And the a is capitalized. So it sort of runs into the K and the W and the F to squish out of the way, it's very clever. kind of been
02:27 awkward looking at it. It's pretty clever. I like it as well. Another thing that I thought was interesting, if you open up the link over they don't have to, but if you were to go there, like right in the page, it says, here's the Python quickstart Oh, and here's the c++ quickstart. So this library, the internals of it are written in c++, right? Okay, so that it's fast from Python. But also, you can go straight to the template library side of c++ and use it directly, if you are, say, building some stuff in c++ and also want to use this library. Or maybe you're building a library that does data science things, and you have a big c++ c component aspect of it. You could use the C side of it directly. They're
03:05 nice. Yeah.
03:06 So that's actually something I don't see. Almost ever is. Here's the Python library and the c++ API that corresponds to it.
03:13 Yeah, that's pretty cool. Yeah. So it's, um, I know a lot of cases for this. I'm gonna definitely check this out. This is great.
03:20 Yeah, it's pretty cool. So thank you, Simon for sending that in. last quick note is when you install it you pip install awkward. The number one, not just awkward, I think awkward, which, my gosh, it's just so weird to have a package called awkward, but it's great. Anyway, I think awkward is the older version and awkward one is this new 1.0 release. I think it's the same library. I wasn't sure if like, I was like, Okay, if this is awkward one, what is just awkward by itself, it's got to even be more awkward. But I think it's the same library. It's just a different API version.
03:53 Okay. Like, you
03:55 might be surprised by it. But nonetheless, it's it's pretty good library. One, check it out. Yeah. You got any surprises for us?
04:01 Yeah. The surprises came from Ned batchelder. So Ned surprised us with some surprising order. dict ordered dict surprises. So I think we've covered this but in Python three, six, dictionaries changed a little bit. So normal dictionary, just because you say dict or just declare one, they retain their insertion order. If you list them out again, or just, you know, say, you know, if you have x equals m dictionary and print x on the rebel, it'll just print it in the same order that it arrived in,
04:31 right. And if you do, like for K comma V, in your dictionary dot items, you'll get them in the same order now, which is nice. I think probably one of the most annoying things was if you are saving a dictionary, if you're going back and forth between a JSON file into a dictionary, and then you save it again, right? Like that could just randomly be changing before whereas you'll be getting like, yeah, diffs on that file on Anyway, like this. stabilities Nice.
04:59 I really like it. But I just sort of assumed I knew that may have been some differences. There's still a collections dot ordered dict, that is around, it's still around. And there's a few reasons for it. And then one of them is just because it's a class that some other stuff derives from, and it would break backwards compatibility to remove it. So God is still there. But Ned brings up a couple surprising things around it. The first actually wasn't that surprising to me what the, they're ordered, but you can't get access to them by order. You can't say give me the first one by like saying, like bracket zero or something? Does that surprise you? Doesn't really surprise me?
05:36 Not really. I mean, I would just do I mean, yeah, just get the first thing out of items. And then just be happy with that? I don't know. But yeah, there's no way to like index like bracket zero, the dictionary,
05:49 right? That's okay. The thing that actually I didn't really think about before was that nederburg brings up is the how we quality and ordered mix. So in the dictionaries for Python, three, six and above. Now, if you declare two dictionaries with the same content, but they have they've the, they're created in the different order, they're still going to be equal. So to dictionaries are equal if they have equal contents, it would superbug me, like if I have a equals one, b equals two, or B equals two equals one. If the dictionary contents are the same, but the order changes in your face, they say they're not equal that would, I mean, that would bug me I think, right? But ordered dict. Apparently, it doesn't matter. So if you if you care about order, you can use ordered dict to make sure they're in the same order.
06:36 Yeah, I guess you're explicitly saying I super care about order. So if the order changes, they're not the same.
06:41 Yeah. So just a little surprise, surprise, surprise, but thanks.
06:47 Yeah, that's cool. I, I wouldn't have known that. That's pretty neat. To get to know and stuff, you and I work on a few things. We've got some Patreon stuff going on a lot of ways people can support us, I just really quick shout out as a lot of people know, if you want to get better at Python, learn some things, check out training, talk python.fm got a ton of classes coming up on almost 200 hours of polished Python content over there, which is pretty crazy.
07:11 Yeah, I love the content there. We now have 55 supporters on Patreon, which is super cool. And if you go to any of our show notes, there's a Patreon link on the side. You can click on it and, and a lot of people are just sending a buck a month is just awesome. That adds up. And it helps out.
07:27 Yeah, thank you. Yeah, definitely helps out covers operating expenses, like editing and transcripts and whatnot.
07:33 Yeah. So would you get an X force? I have
07:38 a follow on to a follow on to a follow on. How about that. That's great. Yes. So we spoke about black cell magic, which is a way to type a thing into a cell and Jupiter, and have black formatted. And a bunch of people said, Oh, and there's this and there's that. And there's all these great things. And you covered I think was NB, NB q QA. Yeah, it wasn't, it wasn't the last sort of QA, which is cool. So that's kind of like a bigger set of tooling and other libraries along with black on top of that. But one of the things that bugs me about Jupiter notebooks is they just seem to lack some of this, like proper editor support and black, like format code is one of those. But it's not the only one that bugs me. And it took me a while to kind of get the Zen of notebooks like, why do I create one of those instead of something else? And what's the flow and I really do find them valuable, but it drives me crazy that if I type, you know, class object library dot, I just have to know, like, there's no help, I have to know what I'm supposed to type. And then when I type it out, I say parenthese. And there's some number of arguments that go into this function call or whatever, I have to just know the order the type the name, everything. Now, before someone mails in, I know, I can type thing dot and then press tab, and it'll come up in a list. But like this, like, please help me out on request. I don't know. It's like just typing dot should just I should be able to just flow and not have to like okay, type and then Okay, now, what's the documentation again, for this signature? Where is it defined? All those kinds of things. So there's this cool project that was sent in by Anders Colmar, called Jupiter lab LSP for language server protocol integration, or more and more, it rolls right off the tongue. Language server protocol integration for Jupiter lab is its official name. But it's super cool. It brings a lot of these things that I felt were missing from the Jupiter experience. So if you go there, you'll see that it's a bunch of examples, sample code, which shows Python that actually works in our bash, TypeScript and a bunch of other languages. So here are some of the things that are supported one if I hover over a piece of code, if an underlying appears, you can press CTRL to get a tooltip with the function and function or class signature, you can get documentation and other information about it. Just by hovering. It'll show you like, if you write code that's bad like in Jupiter, if I write code that's bad, it just, it looks like code that's good except for it won't run, or it's here to put little squigglies under and say there's something wrong with this. Or there's a warning here, you're doing something wrong, right? So editor, stuff like that, jump to definition. So you can right click and say, Take me to where this variable or this function is defined, which is pretty awesome. It'll highlight your references. If you place it on a variable, like in PI charm, you put got a variable, you put your cursor on it, like all the places where it's used or defined light up. So like that. Yeah. And that is auto completion. If I type the character.it will know that I want autocomplete, so I don't have to keep typing stuff. That's pretty cool. Then on top of that, it has a rename, rename refactorings. So you can rename stuff across your, your all your cells and things like that, as well. It's fast. So you know, not groundbreaking world changing, but it definitely seems like it will take take it up a notch in your Jupiter experience, right? Just to bring you a little closer to editors like pi charm in VS code.
11:14 And it proves the point that the hardest thing in computer science is naming. That's right.
11:20 The whole function when you get that wrong, is what you do. Yeah. But I mean the name Jupiter, Jupiter, or Jupiter dash Jupiter lab dash LSP. Yes, indeed. Okay. All right. All right. What's the next one you got?
11:35 Well, speaking of Jupiter, I guess it's a little related. This is a project that is implemented as a Jupiter book. I'm not sure if we covered Jupiter books, the Jupiter book project before, but it's a pretty neat documentation system. This is open source tools and data for music source separation. I was researching music, Python music tools. I recently came across this, and it's really cool. So what it is, it's an online book powered by Jupiter book. The authors are Ethan Manilow, Prem, Seth, ermine, and Justin Solomon, I think. And it's a tutorial intended to guide people through modern open source tooling and data sets for running, evaluating, researching, and deploying source separation approaches, and focuses on music. Now, that's a mouthful, and maybe that's a limited set of people. But it's really neat. It uses Python. And it has like interactive demos with things with audio are way easier to visualize if you have a waveform in front of you. And this uses waveforms and stuff. It's beautiful. One of the things I want to highlight is there's a basics of source separation section. And that includes a primer on digitizing audio signals. And it looks at frequency time frequency representations, what phases, some evaluations and measurements. Anyway, I think this is the best reference for understanding digitizing signals that I've seen so far. It's really great. This is super cool. I think maybe the most generally useful thing at all, this is the whole Jupiter book way to create something like this for any knowledge base. Yeah, I'd love to see how they do it. And it's a creative commons sort of thing. They got links to their GitHub repo, so anybody can see how they do this. So it's really cool. I like it. Yeah,
13:25 yeah, it's super cool. And they do have it on it's open source on GitHub. So that's pretty sweet. And I do have a complaint, though. Okay, this is a big deal. So there's a section in here on the basics of bass, bass and bass training, like waveforms and what phases and so on. There's some formulas in here where they define j to be the square root of negative one, we all know that i is the square root of negative one, come on. I mean, it's an imaginary number. Does it start with J or I? Sorry, carry on.
13:57 That phase thing is gorgeous. It's got
14:00 the animations and phases actually really nice. Yeah,
14:02 to tell you the truth I deal with like signals all the time. And if you want to get into the math, the math is here. So this is this actually would be great actual textbook for a university course. But I just skip over the math part and read the explanations and stuff. It's still useful.
14:18 Yeah, so quite neat. All right. Let me ask you a question. Okay. You've done c++ ton. He still do it every now and then. Right? Dude every day? Yeah. Right on. I thought I pointers
14:28 somewhere. I guess.
14:30 It's got to does it have value types? Like non pointers, kind of a thing that doesn't behave like a pointer?
14:35 I think of it more like references. Yeah, all Python
14:38 seems like a reference. I want to cover an article pass by reference in Python background and best practices from the real Python crew.
14:45 And also, I just apparently failed this job interview. So
14:50 by Maurice Mogi, our rosy planet, got that somewhat close. So Maurice wrote this article over there on Well, Python, which is pretty interesting, and it sort of compares languages that have explicit, you can explicitly work with things as references, or pointers, or you can work with them as local value types. And then sort of compare that, like, there are certain types of problems you might solve or address or algorithms over there that don't necessarily make a lot of sense in Python. So how would you simulate some of those behaviors? So Python is interesting, because in the guts, like, everything is a pointer, even the number four, if you ask, like the number four and C, press it for, how many bytes would you think that would take?
15:36 It depends on See? Yeah, it's it's the machine type. So it's a surprise for eight,
15:41 something like that. Right? How many bytes? Yeah, yeah, exactly. And when you create one, it would be associated with the stack, unless you did some funky stuff to like, allocate it, and like you do in like an ampere to get the address. But by default, it's like, comes on the stack, and you pass around and makes a copy of it. In Python. The number four is a pointer. It's a C, it's a PI long object out in the heap. And it takes like 28 bytes, like the number for it takes 28 bytes, which is pretty nice. But so everything, even basic numbers that seemed like they just might be values are, like in the guts, the sort of reference types, but the function passing behavior is they say something called pass by assignment, which I'll go with that. So when I pass in, like if I create a variable, say x equals four, and then I pass the extra function, and that function changes the value of x, it's changed for the function, but not for the global thing that had it before, right? Yes, well, in C, or c++, or C sharp, like all the examples here, actually C sharp, you can say, No, no, pass it so that if you the function changes the variable, the one where it came from also changes, right? Or I could pass the, the, I guess, in C, that would be the pointer to the pointer, you would make a change to the pointer. In C sharp, you'd say ref, or out or something like that. And it would make a change on the other side. So how do we do that in Python? And like, what are some of the interesting things that you might do that? Well, Python doesn't have value type. So it doesn't, one of the problems with the value type world is like, maybe if I created a class, let's say, a class in c++, and I create on the stack and I pass it, it's, they can make a copy of that. Is that right? Anyway, it's definitely if you don't use the new keyword like these passed by values, or making copies of the data that's passed around that can make things slow, Python, everything, at some level being a pointer doesn't have that problem. So that doesn't apply. But how do you implement these algorithms? So it says, Well, if you want to actually have the function make a change, you can do a couple of interesting things like you could suppose I want to pass in a variable, maybe have that variable change, but also get like a true false back, they get worked or didn't work or something along those lines. Do they said look, you can use tuple unpacking to return multiple values, the return value and then the modified value, which is one another thing is you could pass in a mutable data type, like I create an object and change a field on the object, right? So that we have this word list or Yeah, anything that is mutable, basically, or another interesting one would be returning optional. value types. So if I had like a function that was say, like it was said, Okay, we're going to try to parse a string into an integer. And I either want to tell you, here's the number the integer you got, or it didn't work. Forget that you might throw an exception. But suppose for some reason, this example, you don't want to throw an exception, right? What do you do? Well, you could return the value and whether or not it worked as a tuple. And that's one thing. Like, in C sharp, the example they says it says that tryparse takes a string and an out integer, which is like a one way ref type of thing. So how do we do that in Python? Well, you could do just this multi value, multi return value, tuple unpacking, like it worked, and here's the value or it didn't work, and there's no value, which is I don't really love that one. One that kind of interesting is like, you could use optional type, so you could return an integer. And if it's not possible, you return none. And then use the walrus operator to say like value colon equals try to parse it. If that's not none, then you're good to go. That one's kind of okay with me. How do you feel about this? Brian?
19:29 I feel like people are trying to force non python programming styles into Python.
19:34 Yeah, but it's interesting. It was read through it just made me think about the back to my c++ days and all these patterns of passing variables and changes and, you know, passing by reference, pass, copy, copying values and all that stuff. It's probably worth reading, I think, even if you don't necessarily need to do it that much.
19:51 Yeah, I actually like to be more explicit and have either do functional programming where you're, I like the functional model where you You pass in data and you return the return the modified. Yeah, exactly. The other approaches to that I like is to know, I mean, you have a shared data that you're pointing to that the, you know, your pass a modifiable data like, like a list or something and say, Hey, this function and it's nice to be obvious, like, fill out the data, you know, it's, it's very obvious that that the thing you're calling is going to change that, or use a database that reference tangible stuff. But
20:29 yeah, that can be done with data structures. Hey, I thought it was interesting to compare these other styles of programming to how you might compare to get them done in Python. I think I'll go for the optional via to pick one of these two. Right. I think I would go for the optional tryparse that returns none. If, yeah, if it doesn't work, assuming that you don't want exceptions. Right,
20:48 right. And I mean, that's also like the default. If you've got, like the return of a value in, in some nested data, there's logic, and you don't return anything, otherwise, you're going to return none. So yeah.
21:03 Yeah. You know, when I first started learning Python, that's something that was strange to me is that every function returns a value, even if the word return doesn't appear in the function. It just happens to be none, like the fall through case sort of, in various return none. If
21:17 not got that. That's not obvious. Yeah.
21:20 Yeah. Yeah. But that's, that takes some getting used to because all the other languages, you say it returns one of these things, if you want to return something, you say, return, none at the end or something. Anyway, yeah, a lot of interesting ways to think about passing variables and some of the patterns there, my head hurts. So we're gonna write some some of these down, maybe you should just put them in and GitHub and store them. I
21:41 apologize. Again, I think somebody on Twitter sent us this, but I couldn't find the reference this morning. This is a really cool thing. The author is Wei Wang, I think, goes by only way on GitHub. And it's a tool for visualizing Git concepts. And I absolutely love this. He actually references a git basics page, which is I forget where that, but it's a good explanation. But it's uh, you know, it's a visual, that really, it's like a static thing that you read about all the different ways and all the repos and where they are and everything. And that's, you kind of have to read that once. Even though, if it doesn't make sense, read something about how Git goes together. But this visualizing tool is super cool. The one he's he's put together, it says visualizing get concepts in d3. And it just nails the things home, it's really cool. It's got these all these different concepts like commit branch checkout checkout with a be reset, revert, merge, rebase, tag, fetch, pull, push. And you just start out with a like a diagram of what your repo looks like with branches and everything in the dots. And then on the left side, you can type commands and you you don't have any code you're changing. You're just you're just typing these commands to see what it does to the repository tree. And it'll like add nodes and add tags and things move around. And it's like light bulbs go off in your head where you're like, Oh, that's what's happening. When I do a checkout. All I'm doing is looking at a different branch. And that's it. Yeah,
23:14 that's pretty cool. So yeah, it's this cool interactive command thing, like you said, there. What if I type this and this? What if I do like, two commits and then a branch and then a commit? And then check it out other branch and do a commit? How does that whole thing look
23:28 at it's pretty nice. It tells you like, there's a little instructions around each little lesson to like, describe what's going on and then suggest things to try. But the interactive thing you can do whatever you want within it, you can you can try things out, and it doesn't. It doesn't handle all of the things like for instance, I tried to get checkout with a dash for the last branch. That's not implemented. It's not there. So
23:53 but yeah, but it's pretty cool.
23:55 Yeah, another thing that's nice about it, I mean, the fact that it doesn't support, everything isn't necessarily ideal. But one thing that is pretty cool is you don't have to be totally accurate. there to make it work, right. You can just do a git commit. And if you don't just like add stuff, and fake stage things, and then like commit, yeah, you just type like git commit git commit git branch. And it kind of just shows like, there's sort of a shorthand, like, if you kind of got the sense of it, it'll do the stuff to let you you have to know your Git perfectly.
23:55 Yeah. And the commands that involve because you kind of want to play with this stuff to try to get it, get your head around it. But you don't really want to muck up your own repo or your code base. The ones that involve like, the origin remote repository, like fetch, pull and push. Those are great to be you visualize both of them at the same time. And if there's two pictures going on, and this is definitely something a desktop sort of thing. I don't think that I think it would be tricky to do this on iPhone or something like that. But yeah,
23:55 yeah, without a keyboard. Yeah, for sure.
23:55 I'm gonna definitely bring this to my team and say, Hey, everybody, Check this out. Yeah,
23:55 you could do things like I want you to build a picture that looks like this. What? Git commands in what order the commands are necessary to result in this structure? Right. I think that would be a cool way to do it,
23:55 man. Okay, so so the second part of the interview, I will fail at also.
23:55 Man, you're tough. I'm glad I'm not interviewing with you. Oh, my gosh.
23:55 Yeah. I think that would be cool, though. Cuz you're like I? Well, because I think conceptually, we also have this idea of like, I, this is the picture I want. But what are the commands that like, take those steps? Right?
23:55 Yeah. I'm still getting over the Yeah. Click the integer for how many bytes is? How many bytes in Python for eight or something?
23:55 One, eight. Yeah, definitely. 28 is not what you would expect. But in Python is 28. Yeah. Okay, if you want to test, import this to get object size pass number four. All right, but here's the here's the next question. Brian. If I have 100 fours in a Python program, how many bytes to take? Wait. Yeah, exactly. Plus the pointers that point at them. But yeah, 28. That's pretty cool.
23:55 So 128 times 828. I don't know how bigger the pointers. I think they're 64 bit so they gotta be eight. I don't know. We've gone
23:55 down a hole, though. We don't need to. What I would rather talk about is micro Python.
23:55 Yeah. So this is the extras.
23:55 Yeah, we're in the extras. Now, a micro bit, announced that it's going to come out with a new version in November. It's got a whole bunch of videos showing the cool stuff. They're shooting at the same price point they had before which I have no idea what it was. But reasonable. But micro bit now has a speaker and a microphone. So you can play sounds and and do things like I don't know, record your voice or something. I don't know what you want to do. But but that's nice. Nice, Mike. Yeah, it does do micro Python. I think that I think that do something else also. But why would you do something else use micro Python?
23:55 Yeah, exactly. I'm looking for the price. Um, I had too much math. I think it's $21. But that's Australian. So I don't know, some like it's not a lot. Well, the first thing I pulled up was $2,119. Australia, but that's for 100 packs. Oh. All right, cool. Now that's really neat that the sound is coming in and you can interact with it. I think it'll be a lot of neat stuff you can do there. It's a really I mean, so far, a lot of these little devices like how do you interact with it? Well, you can kind of shake it or you can touch this button or like has an LED and sound is a whole nother level. Right? You could do speech recognition, you could play like, I think it's really neat.
23:55 Looks like they've got some plans to extend what this can do in the future, too. So it's pretty cool. Yeah, I'm a fan of the circuit playground Express. That's really fun thing to play with. But this is neat also,
23:55 yeah, for sure. All right, I got two quick things to share with people one really fast one yesterday. So eight days ago, in real time, I was on the 425 show, which is Microsoft identity, which stream spent three hours converting a flask web app, to use federated identity and like remote login, and all sorts of cool stuff like that. Like, just to step away from also having like social logins and whatnot, using all those libraries. So people are interested in that I'll link to the whole show. And I just want to comment, it's kind of, it's a very different way of presenting, like, I'm used to polished presentations, like, what are we going to do in this half hour? Let's get it all down really clear. Here's the demo, I'm gonna write I've already like, gone through it once I know it's gonna work. And this is like, Hey, we have this idea. Let's just work on it until we get it done. And just kind of like take input from the audience from the people watching live. And for people who've done presentations, and haven't done this style, it's, it's an interesting shift is a cool way to like sort of present programming to people. I think.
23:55 So would you do it again? It was a fun.
23:55 Yeah, it was fun. It was a little stressful, because I haven't done a lot with like, you know, like, oh, auth identity type stuff. So I'm like, I have no idea what's gonna be successful, like making this work at all. But it was fun. And yeah,
23:55 spoiler alert, at worst, in the end is the 425 a joke on like, you know, five minutes after 420? or?
23:55 Yeah, that's, I have no idea. No idea why, okay. There's an about Let me see if it says what it says in the about. I have no, it doesn't say, okay, but anyway, it was, it was fun, so people can check out that video. And then also, I've started using something interesting that people may find interesting. So one thing that bugs me, is, so much of our life is on the web, right? As you know, and how many cookies Do you think your browser has in it? Have you like to sum them up across all the sites? No, like it like an untold number as like 100,200 like some insane number, if it had been, you know, the same browser for years, and you've used it all day, like Who knows? Right? So I had couple of thoughts, I decided, well, I want to just restart all that from scratch. So I erased every bit of history from my browser and fired it back up, like, okay, now I'm gonna log into all these things again, just fine. But then also realize, like, Do I want like, say, if I go to some random site, and maybe it has some cross site vulnerability, or whatever do I want that site potentially be able to say, to get to my GitHub things, or my bank, or whatever, if I'm logged in? So I started using this thing called Firefox containers that let you basically create like isolated independent browsers were like categories of sites. So like, like GitHub and all that, and Bitbucket and all those things are in their own, like, container. So only cookies they ever see. And login sessions and whatnot are between, say, GitHub and Bitbucket like those, and all the other browsing, none of them know anything about that I've ever visited. Get up, for example. Oh, cool. So anyway, if people are, if that sounds interesting, I'll link to a little short video
23:55 there limited me because you could possibly just do a container for each site that you go to,
23:55 you could it gets a little bit annoying, because if you click on, like, if you're in like Google Drive, and you click on a link, and it takes you somewhere, and you did that, like over over grouping like it, you'd have to log in every time because I wouldn't know there's a little bit of juggling said too many is it gets annoying. But yeah, it's kind of a cool idea to like, keep all those things separate.
23:55 Definitely should put Facebook in there. Because Oh, yeah, I
23:55 have. I have one. It specifically the container. Like the containers are like banking, shopping code, cloud drives, and I have one called shunned. And shunned is what Facebook is. Yeah. So for example, that's a great example. So like, you go to all these sites, they have like Facebook pixels, and all this tracking stuff. Like, because I put Facebook over there and didn't log into it anywhere else, then it will never, those things will never trigger for me in the sense of like being tied to my account. Right. And that makes me happy.
23:55 I've got like one relative that's that the only way to get ahold of them is through Facebook Messenger. So I have to have Facebook just for that.
23:55 Yeah, so you gotta get one of these and like you kinda sorta don't have it. Awesome. All right. Well, that was funny, but not nearly as funny as what we got coming up here. Okay. All right. You want to do the first one? I'll do the next one. And then you got to do the last one cuz I don't know where we'll go with it.
23:55 Okay, so I'm doing the first one. Yeah. Okay. Where did developers drink? I don't know. Where do they drink
23:55 at the FUBAR? FUBAR. I love it. All right, this one? You got to do the last line for me. Okay, because this is a knock knock joke. Or normally it's like Knock knock. Who's there? A cow. Which cow Interrupting cow. That kind of thing. Right? Yeah. All right. Knock Knock async function.
23:55 Who's there?
23:55 Perfect. All right. So those are the two jokes. What's his last one?
23:55 Oh, also, if anybody tells us that we've already done this as a knock knock joke before. We haven't. This is the first time we just somehow a synced? That's right.
23:55 Exactly. Yeah. Yeah. It's just It's a race condition. It's not a not a problem. But
23:55 yeah, no, I just something funny happened to me on Twitter. The other day, somebody contacted me and said, Hey, Brian, what testing module would you recommend? I'm aware that there's unit tests and pi test. But are there better options? In your Can you guess which one I recommended?
23:55 Well, you don't
23:55 like to install stuff. So you definitely said unit tests. Yeah, that's right. Yeah. That's awesome.
23:55 Cool. I thought it was a joke. At first. I really thought they were joking.
23:55 They are pulling your leg. They're like, let's see what you're saying. Come on. Of course, you'll say my desk.
23:55 Yeah. But apparently, he knew of me somehow without knowing that I wrote the book. So yeah,
23:55 exactly. Cool. Cool. Well, thank you as always,
23:55 thank you. Yep. Next time.
23:55 Yeah, see you next time. Thank you for listening to Python bytes. Follow the show on Twitter via at Python bytes events Python bytes as in B yt. S and get the full show notes at python bytes.fm. If you have a news item you want featured just visit Python by set FM and send it our way. We're always on the lookout for sharing something cool. On behalf of myself and Brian rockin. This is Michael Kennedy. Thank you for listening and sharing this podcast with your friends and colleagues.