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


« Return to show page

Transcript for Episode #283:
The sports episode

Recorded on Tuesday, May 10, 2022.

00:00 Hello, and welcome to python bytes where we deliver Python news and headlines directly to your earbuds. This is episode 283. Recorded may 10. And I am Brian rockin

00:09 Michael Kennedy. And I am Tanya sens.

00:12 Well welcome Tanya, since we're just meeting also, and some of our people might not know who you are. Tell us a little bit about yourself. Sure.

00:18 Well, thank you so much for having me today. I'm very excited to be here. Um, so my name is Tanya. And I'm currently a Python developer advocate at a company called Deep Graham. And so deep Graham, we do speech to text speech recognition technology, I would say with my path to technology is a little bit unconventional. I come from like an athletic background. I started playing basketball. I was five years old, how old I am now. But so yeah, so I played basketball in college. I played professionally in Europe, in a little bit in the WNBA. And then I got into sales, and then from sales, I got an into tech. So yes, it's been very unconventional.

00:56 That's pretty, pretty awesome. I wish we could jump in deeper. But yeah, yeah, that

01:00 is super awesome. And you know, as you're telling us that I'm listening, and you think about all the stats, and statistics and graphs, and visualizations and optimizations of sports, right? Like, these Python programming skills are actually pretty relevant. Although maybe you were just deep down in the sport side, and then got into programming afterwards.

01:20 Yeah. So yeah, I think you're totally random. Python is like the perfect language for doing a lot of stuff with like stats like sports, such statistics, things like that. And like the visualization of it. But yeah, I started getting into coding when I was when I was a kid, actually. But then I stopped for a long time, because you know, who would have thought let's think about coding, or computers would have taken off and be where it is today? Yeah, absolutely.

01:43 Yeah. fascinating is that is let's take a different path, Michael,

01:47 yes, a different path. And indeed, a fine transition there, Brian. So this one was sent over recommended to us by one of our listeners, Spencer. So thank you Spencer for sending this in. And we talked about things like Fs spec and other ways in which you could sort of abstract away just like I'm talking to a file, but oh, hey, that happens to live on Azure Blob storage, or AWS, or Google Cloud Storage or something like that. So this one is called pathI, a path interface for local and cloud buckets storage. So if you've got data that's stored in at the moment, AWS, or Google Cloud Storage, and that AWS one that's s3, so I suspect that means like Linode, and any other s3 compatible storage, you know, there's many of these places that have object storage for their cloud services that are basically wrapping up the AWS story. So this might be much broader than actually just those two clouds. Anyway, the idea is that this is a Python package with type annotations they like to call out, which is great for working with Cloud bucket storage, using path lib. So path lib is great, right? We can create a path lib and give it a path and it has things like make directory or the parent of the parents have this thing, or does it exist and so on. So if you like working with path, the path class from path lib, how about turning that loose against Cloud Storage? That's cool.

03:11 Very, yeah,

03:12 it's very awesome. Yeah. So

03:13 what's nice about it is you basically give it a URL with a some type of scheme, you know, traditional schemes are like HTTP, HTTPS, but like je s for Google Cloud Storage, or something in here that I'm not seeing for Azure, not Azure, AWS, but you give it just the prefix, or you just give it a local file path. And it will determine which that is and just start talking to that platform, which I think is actually pretty neat here. So yeah, if basically, if you want to work with cloud storage using pathlab, well, then here you go. It also supports caching locally, which is neat, because that's one way in which you could get all of your cloud files are downloaded and replicated locally as well. And then Spencer had a quick comment saying the really cool function is fluid down here. With fluid, you can take any type of local Google Cloud Storage or s3 path string, and it'll just give you a path object that lets you interact with it agnostic of the platform. So basically, like I was saying, you say s3 colon, or GS colon or just a local path, and it'll just give you back a path lib, and you don't care where it is. Is it in the cloud? Is it local? Who cares? Because it's just, you know, it's abstracted that away using path lib. And I don't know about YouTube that I had been a bit of a holdout on path lib. It was all import system dot i or import IO, whatever it was, and just use the IO way working with it. But I've really come to like path and path lib last year, too.

04:44 Yeah, I really, I love the the interface. The just it feels, it's easier to program it to me, just feels easier. It feels more obvious. So yeah,

04:55 yeah, this is great. I've been wanting to do more with cloud technologies. So yeah, I think Severe a really good place to start.

05:01 Yeah. And so much of that possibility is just working with static files on s3 or static files in blob storage and other places.

05:09 Sure, I'd love to not have to care about that. So,

05:13 yes, if I could just not do Boto three, that would be fantastic. Because nothing drives me crazy so much. Don't get me another rant. Talking about your topic saved me from ranting about Boto three.

05:24 Okay, well, let's talk about Robin. So Robin, for one as just an awesome logo

05:30 bird being hooked by snake.

05:33 That's, that's pretty clever. So what does Robin there's a Robin is, is a async web server and runtime written in rust. And so that's pretty cool. And actually, it's kind of been taking off in popularity and stuff. But the so there's, we're going to link to a bunch of stuff. One of them is the Hello, Robin, blog post written by the author. And so Robin is a fast, high performance Python web framework with rust runtime. So what does that mean? It means that it's kind of like flask it it looks a lot like in one of the examples, it looks a lot like just a little flask thing you can do. APA gets an app puts in different things, it's decorators, it's very new, there's not there's a lot of work to be done. So there's not a lot of ecosystem around it yet. But it's pretty cool. And I just kind of liked this idea of like, well, let's let's make your code. The code you write look like Python, it's ESP THON, but the back end stuff, well, maybe you don't care what that's running on. And maybe rust is is fine. So one of the things that doesn't have an ASCII or or a SGI or Ws gi underlying, because that's a Python thing. It is async. It's very flask like, and the numbers kind of look impressive. So I know that benchmarks you have to like read those with a grain of salt, but still requests per second getting. So we've got this document showing flask with two unicorn at 1800 requests per second. But Robin going at 6400 requests per second. This is this is kind of insane. So definitely worth checking out and trying, I think, or maybe not trying but just watching to see what this does, though. Since it's very new, though. One of the things I have to say is there's there needs to be some it's not really newbie friendly, then I guess, because there's not a lot of Doc's yet. There is a there is a Doc site started. But but there's a lot of work to do. But still getting started with it. If you have a really fast thing. It's pretty good. So Oh,

07:46 yeah, go ahead. Yeah, well, a couple of notable things that stand out to me. One, it supports async and await, and it supports multi threading at the rust layer. So combine those two things. And you might end up in a really interesting situation, which is probably where it's getting a lot of its its high numbers in that benchmark from Yeah, so that's great. It looks really simple. You know, it's very flask or fast API like so that's cool. One thing that's notably missing that I haven't seen is like, how do I render an HTML page from it? It shows how to serve static files, which can be an HTML page, but I'm thinking your Jinja templates, chameleon templates equivalent to Django templates like, like that sort of the missing bit of dynamic interactive website. Yeah, that also has an API, you could, you could just import Jinja, configure it yourself or import chameleon and configure itself. And I've done that in some of my like, decorator API or a wrapper things for adding that onto API calls. But you know, that's just a layer of a thing. You've got to learn to use it instead of just saying, here's the template or render this template or whatever. Right. So I would love to see some sort of template support come built. Yeah. And

08:59 then I think that's something that definitely could be put in place. And then there are

09:04 actually not very hard at all, it's just, it just doesn't I just

09:08 so yeah, target market, maybe just API's.

09:14 Yeah, it's got a lot of examples of JSON type of exchange, right? Yeah. What do you think?

09:20 Yeah, I was gonna ask what does that come with it when you pip install it? What are their packages that come with? It doesn't do anything. I'm just curious. Well,

09:28 it's, we could look I don't think there's much else there. We've got the very little here. Yeah.

09:39 Yeah, if you look at Brian, open up the just the requirements dot txt file there, and you'll get see it's like I was the last fall. Okay. I like that's the that's the super small list.

09:51 Oh, wow. Okay. Yeah, I mean, we have to start somewhere. Right. So I think it is definitely a good start. It just seemed like a lot of the number a lot. Maybe they'll last few framework So what frameworks that have come out in Python here? They do kind of model after flask? Yeah, yeah. I've been doing quite a bit in fast API and flask as well. 2.0. Yeah, cool.

10:09 Yeah. I think flask is has become very popular in its own right. But it also, its idea of how web apps should look in Python has spread all the other frameworks that are kind of new, right? Like SAS API is a variation on that add

10:23 in, I can't remember where I read it. But there's, there was a part of this Robin documentation that talked about just like almost started out as a, I think, a college project or something of like, what if I built flasks, but async and are in the target? It ends up being sort of like fast API? So fast API? Yes, you can render websites with it. But the original focus wasn't websites. It was API's. And, and I think this is it's even an earlier stage thing than fast API. So I think it's definitely worth watching. One of the apparent there is a talk from last fall. That's linked to on I think, the main page. And then Henry Shern Shriner in the audience says, Robin had a lightning talk at PyCon. So check nice to

11:13 Oh, nice. Yeah. Well, yeah, I shouldn't. I didn't hear about that. But

11:16 nice. Yeah, absolutely. Brian, scroll down, scroll down to just where it says why another framework real quick. Oh, just a bit more. Yeah. So one of the interests, this is pretty interesting to me. And it could be a sign of things to come. Or it could be just really grateful, Robin, it says, one of the things they're trying to get around is the execution. Traditionally, a lot of these frameworks has been with Python. So Python has the Gil, which is rough on parallelisation, and so on, it says this is using the rust runtime, and server which attempts to work around the GIL in order to improve performance. So if you could set yourself free from the Gil, and you know, maybe it has like multiple little pythons per Yeah, or thread or something. That's pretty cool.

12:01 That's one of the things I'm wondering is if if the runtimes in Rust, how is it launching your code for the callbacks? But I don't know. There is a documentation does have architecture Docs. So if you're actually it's very well documented architecture wise, it's not well documented for how to use it wise, but

12:18 yeah, yeah, indeed. All right. Well, good. Find that one. Sounds great. Alright, tiny off off to your item next.

12:25 All right. This is sports epi. So there's somebody I mean, okay. So for those of you don't know, I'm really big into sports, right. And I'm a huge NBA, NFL, baseball, hockey football fan. So I'm doing a lot now with, you know, writing sub web application, sports web applications. So this is a library that somebody sent me, called sports apply to free sports API to written for Python. And what it does it actually pull stats from a sports reference.com I believe it sports das referenced that calm and that site, it's a great website, that site is for getting sports us to just look for like professional sports like the NBA, NFL, NHL, Major League Baseball, and college basketball, and football. And it's funny, because yeah, it is really cool. And that site, it looks like a sports reference that kind of looks kind of like a, you know, like an HTML site from like the 90s. So it really does. So I think it's also great for, you know, if you want to, like learn or do some like web scraping, but of course, you know, email the site owners first, I believe that is allowed on that site. But anyways, so back to the UI of sports EPI, you can get like a lot of API queries for like, all the meaning like the North American Sports that was saying like the NBA, NFL, National Hockey League, Major League Baseball, you can get, like the list of teams that score, the date and time of games, the total number of wins for a team during the season, and much more, you can also get stats from players and from box scores. So you can build some cool stuff around sports and how teams or players before during the game or during the season, or even do something even better with it.

14:16 This is super cool. It's kind of a nice object oriented model. So like, you know, from sports to pi dot NFL dot teams, import teams, and then you can create a, like a Detroit team or Yeah, or whatever. And then, or Purdue and get their schedule, even has integration with pandas. So you get like a data frame out. This is neat. Yeah, I

14:39 haven't used this one yet. I just had another one that we'll talk about later this this afternoon. But yeah, I want to try this out as well. Because like I was saying, I'm always on sports wordpress.com. I'll just check out the stats from the games. People ask

14:52 me a lot of times for API so they can build interesting examples or they play around and stuff and it's so much of the is tied into, you know, either college or professional sports. That information is really wrapped up and hard to get. Right. It is.

15:06 Yeah. Yeah, it has been for a long time. I think it's become a little narrower, a little easier. But it's, for some reason I remember like, five, seven years ago that I want to do stuff with sport, like both applications with sports, but I couldn't find any guy that had real sports data. Everything was kind of locked down.

15:25 Yeah. Well, I can start with his five year old CSV file. I guess that's not so inspiring. But this looks really good. Yeah. Cool. Cool. Great. All right. Now, before we move on, Brian, let me tell you about our sponsor for this week. Okay. Okay. So this episode is brought to you by compiler from a podcast from Red Hat. So just like you all out there listening, Brian and I are fans of podcasts, I'm happy to share a new one from Red Hat, compiler and open original podcasts from Red Hat. So with more and more of us working from home, it's important to keep human connections and not just be stuck in our work from home setup. And compiler unravels industry topics and trends and things you've always want to know through interviews with people who know it best and you know, telling the stories of technology, not just the house of it. So on compiler, you can hear a chorus of perspectives from diverse communities behind the code. These conversations include answering big questions like What is technical debt? What are tech hiring managers actually looking for? And do you have to know how to code to get started in open source, I actually was a guest on Red Hat's previous podcasts command line heroes for their Python episode. And it was super well done, really polished, and compiler follow as long as that excellent tradition. So I checked out Episode 12, a compiler how we should handle failure, you know, really creating a space for people to grow technically, and you're not not get fired just for your one mistake. But how do you create an environment where people are willing to grow and try things like well, let's try out Robin and try that. And if it doesn't work? Well, we gave it a good try. You know, you've learned something. So learn more about them at Python bytes at FM slash compiler. The link is in your podcast player show notes. I know you're out there listening, you can just go to your podcast app and type compiler. But please visit Python bisetta FM slash compiler and just click the link for your podcast player. There's like tons of them here. That way they know it came from us. So thank you Red Hat and compiler for supporting our show. Alright, Brian, are you ready for the next one?

17:29 I am, because this give us a shot at terminals, a shot at terminals.

17:33 I seem to have mess up my tabs, though. So let me just open that back up here. There we go. So this one comes to me, I believe, from Jay Miller. I'm pretty sure he's the one who told me about it. So thank you, Jay. And the idea is really simple. I want to create a screenshot of something I'm doing for a demo code. You know, I create a lot of courses and presentations. So it's super helpful for that. And he's doing Dev Rel, and she's I'm sure doing lots of presentations, where there's like, I need a screenshot of this thing and priming for books and so on. Yeah, I could totally. So this might, yeah, this thing might turn out to be super useful. So what it is, is it's a thing, you brew, install it, and then or there's different ways in which you can install it, it's a little bit like carbon, not now not sh or if people have seen that. And you can capture some kind of output in your terminal Exactly. Like it looks directly to an image. And you can even, you know, specify, I would like to pipe that directly to whatever app, you edit screenshots. And so for example, I use Pixelmator Pro. And so I might just say, Take this, run this command, take the screenshot and open it in Pixelmator, pro go and stuff like that. So really, really nice. The way you run it, it's a little bit like time or watch or perf. So you just say term shot, and then like Python, some file or whatever it is you're trying to do. Here's an example of one that I did on this is a program using color Rama to make interesting colors on the screen, doing async and await examples of like doing a bunch of requests against a talk Python, and then pulling back the titles using BeautifulSoup. And I just said term shot Python program, boom and out. It comes with this really nice looking picture, exactly the right size. So however long the scroll back is like, like that's the size of the screenshot. You don't have to like, you know, take a picture resume, scroll down, take another picture, try to fit it back together, all that kind of weirdness. So, yeah, really neat. Yeah. And then the final thing is, if for some reason, it's more complicated than one line of just Python this but you're like, I want to run three commands. So maybe what I want to do is I want to show that I'm SSH into a server, then I'm running this command and then I'm open you know, I'm seeing the result of that or something like that through like ls. So if if all else fails, you just type term shot and you give it some shell like you could say slash bin slash Z shell, Z, sh, or slash bin slash bash, you do your work. And once you exit the shell, it'll just take a screenshot of like whatever you did while you were in there. So that's also pretty good. Thinking.

20:11 I like that. Yeah, that's exactly so. Yeah, it's so interesting. You're mentioning, Colorado. Michael, I learned about karma from you. Actually, I took here, your async a synchronous programming course. Oh, you did? Oh, yeah, I did. Yeah. On. Yeah. Thank you. Yeah. Oh, yeah, of course. Yeah. That

20:28 example was from that course for sure. Okay. Yeah. Yeah,

20:31 it looked familiar. Nice. Cool. Yeah. What

20:33 I thought was neat about it is it like even with just non standard print output and stuff, it still captures it reliably, which is, which is nice.

20:40 So when you run that command it it takes a screenshot and saves it to your desktop, or send it like with carbon UPenn? You know, you can like, click a button, it will save it, you know, it'll just save it and then you can just paste it into wherever you want. Yeah, exactly. I

20:55 don't think it goes to your to, I think it goes to whatever working directory you happen to be in. Okay. Just wherever you ran the command in that directory, there's an out dot png. And there's probably ways to specify it or whatever. But by default, it just drops that PNG file there. Yeah, it's super handy for presentations, I think. Yeah. All right. Over to you, Brian. Well,

21:14 um, I want to talk about the Gil. We talked about it a little bit earlier. But so it Mr. Turner, Turing wrote an article called Win, win, Python can't thread a deep dive into the gills impact. And what I really like about this article is just that the focus of it is to try to build not, not the specifics of everything around the Gil. But as a user of Python, what's the mental model that you need to to be able to use utilize threading and multi processing and, and different extensions correctly to try to figure this out, so that you just have a gut feel for how things work so that you can work through it and everything. There's a little bit it's kind of in the middle of the article, there's a mental model that he presents. And I'm, I'd like to talk about a little bit some of the other cool aspects of the article. But first, the mental model is going for is a thread must hold the Gil, to call a C Python API. And the so anything that any Python code that's using API, like built in Python calls is, is going to block because it's going to grab the Gil, other threads can't run if if the GIL is there. But if you're doing pure Python stuff, your stuff gets interrupted every five milliseconds automatically. Didn't know this. But that's kind of cool, long running things. So if you have asleep or some other extra process that takes a long time, not Python code going through but but like, asleep, or something, or you probably don't have a lot of sleep, but maybe you're reading a file or something, some something that talking to a database, something like that, yeah, it doesn't automatically interrupt every five milliseconds. So the five milliseconds isn't guaranteed. So there's blocking possibilities. And then Python extensions written in C, or rust, or something can explicitly release the Gil, to allow so you can get around this with extensions and stuff. So this is this, that's the mental model, but to really sink at home, he's got a whole bunch of these profiling graphs that are great. So here's an example of a little program that starts there's like two functions, there's a, it's really a main and a go. And essentially, you end up with two threads, like the thread starts this go thing, and then you run go within the main thread also. So what this is done is just doing like some summing of a whole bunch of numbers. But the examples just to keep busy for a while, and, and then look at what happens. And what happens is you get you get these, these shifts of like one of them is spinning around. But the other ones just, you know this toggling back and forth, that happens. It's kind of cool. There's the all the different models that can happen. And like, here's one where you're let's see, what are we doing here? It's sleeping for a while. So it's completely blocked. So you've got one thread that's just completely blocked for a long time. And individuals have the profiler. Great to to visualize what's going on. So anyway, at the end of the article, he talks about how to get around it and when, when and where and how to use different models like async and extensions and things like that. So anybody that's really caring about this sort of stuff, I think this is a great article.

24:46 The visualizations are quite neat. You know, instead of just saying you're spending this much time in a particular function, it says, and you're waiting or you're doing CPU work, right, and you can actually see those side by side and see like the CPUs here because normal profilers will just tell you, Well, you just spending time, you know, here. What are you doing?

25:08 Yeah, exactly. Right. Yeah. It's really helpful. The visual, I learned visually, like, three, you know, large visual learner. Yeah, like the gills or something that's always kind of like, just was really confusing to me. You know, when I was first starting out and getting into like, more intermediate stuff that I took the SAT, it was like a Python deep dive course where the instructor really kind of like, talk about things behind the language. You know, salad really kind of helped me grasp and wrap my head around it more. But yeah, this is great. I love this.

25:39 Yeah, I swear guitar. This is definitely a good one. I like the pictures as well. All right. On, you want to take us out? And I apologize. I believe I switch the order of your two topics.

25:50 That's okay. No worries. out there. That's okay. So this is the FA. So this was the NBA API. So this one is just strictly for the NBA National Basketball Association. This is really close to home for you, right? This is like, yeah, you're very close to home. Yeah. So it brings back memories. So in right now, you know, NBA Playoffs happening, I think this is pretty exciting. So this package is maintained by a gentleman named swarco. Tau, I'll miss a very great job of maintaining it very up to date. This API pulls data from the nba.com. Right, that's the official website of the National Basketball Association. With this package, you get like more accessible endpoints, all the documentation is really, really good. I think it's probably you know, it's a really well documented API. See what else here, the nba.com API isn't as well documented, because a lot of things change, you know, things change frequently, right? Like players are treated players get injured players retire, you have to take into account all the stats as well, like points per game, rebounds per game, and that type of thing. So this package, the NBA PEP package has tons of features. Like you can get information on players, teams, like you know, more static data as well as like data that changes as well, like, you know, their stats. I think their stats per game per season, like their player game, while there's tons and tons of endpoints. So I would if you want to work with this API, I recommend looking up the API endpoints, there's probably like over 40 of them. Wow, maybe around 40? Actually, yeah, it's just really cool. I'm actually working with this right now. And I'm writing a building a sports NBA ranking website. Right now I'm using this

27:41 package fun. One of the things that's cool is it has a lot of search functionalities, and not just direct buy, you know, find me the team from the city or this name, but like, find teams by state or something. Yeah,

27:55 yeah. Yeah, it's definitely very clever. And it I would say, between like, the first one, we looked at a sports reference.com. I don't know where they're pulling, I think, I'm not sure where they're pulling there it is what's referred to at trial and each individual site of the, you know, the sports associations, I'm guessing.

28:13 Right. Okay.

28:14 But what I

28:16 mean, like, for example, if the data from MBAs gotta be more centralized than like, all of the college ball stuff, right? Yeah. Yeah.

28:26 It's cool. Even so important for live data here. Like NBA dot live in points for scoreboard and all kinds of stuff. That looks that looks pretty neat. Wow, this is awesome. There's a lot of data here. Yeah, you check out the right there, no books,

28:42 no books, and that you burn a boat to him? Yeah. And there's a lot of data. It's very good. Yeah, it's pretty, pretty awesome. There's a lot that you can do a lot of fun stuff.

28:50 Cool. So I know, so many people want to build examples with sports. And I think having some live data would be really, really neat. So you know, like, during, like you're saying, like, right now during the playoffs or something. And you could, you could do some fun things. Indeed. Yep. All right. Brian, is that our six items

29:08 is? So do you have any anything extra to share with us?

29:12 I have, I think just a real quick, quick one here for us. From Pablo, we have Python 311. Beta one is here. So Hurrah. This marks feature freeze, which means there'll be no new features or API's only bug fixes. So please, they say, if you maintain a Python package, help us test that everything works as expected. This is pretty nice. Yeah, that's it for me.

29:40 On that, I'm going to grab this just a second. We'll link to this as well. Simon Wilson has a little blurb on like if you're using GitHub actions to test your packages. Simon has a code snippet for exactly how to to do that. Essentially the Python thing you want is Python 3.3 11 Dash Dev and make sure it's in quotes. And just add that to your Python versions matrix.

30:10 All right, fantastic. Cool.

30:13 So how about you, Tanya Dhoni extra?

30:16 That's pretty much it. I will I do see some people in the chat that I've met at PyCon. Last week, Mario? Hey, Mario, I'm not sure if you're still here. But how? Cool.

30:25 Fantastic. Yeah, you just came back from PyCon. And Brian and I were not there. You want to give us a quick? Just a quick report from being on scene?

30:33 Yeah, it was amazing. It was my first PyCon. And actually, one of my first tech con was actually, it was great. I spent most of the time working on booths for deepgram Because we're helping to sponsor the event. I did catch a few talks. And met so many amazing people and also, like, just connected with people that I have been communicating with over the last several years, you know, via internet and, you know, chat and stuff like that. So it was just really fun. It was a good time.

31:03 I love PyCon. It's, I consider it my geek holiday. To go there and meet so many people. Everyone's so accessible. And I spend most of my time just walking around, looking there. Say Hi, folks and whatnot.

31:16 Yeah, so I did Miko, maybe next year. We should go. Yeah.

31:19 Yeah, maybe next year. We should go. Yeah, definitely. I'm looking forward to getting back there. Well, do you have any looking forward to a joke? Yeah, I do. Well, I have something for you. I'll let you be the judge of it's funny. All right. So here's here's what I got. Brian, just maybe give us a quick description. What he's what this picture is about here.

31:38 I don't know there's a guy like, looks like really stressed out holding. I mean, crying Yeah,

31:46 he's pretty sad. I mean, red eyes almost just crying. And so you know, we all come to these websites. And it's, you know, prove you're human and all these reCAPTCHA things. And sometimes you're lucky to get a slide the puzzle over until like, the dog fits in his house or so rather than find all you know, highlight all the stoplights anyway. So the joke is when, with a very sad guy, you're asking when a computer asks, are you a robot? Maybe it's just wanting to find its family. Or thing? It does, maybe we're not. We shouldn't just be helping more than you know, every time I prove a reCAPTCHA it's just like, No, that's not my family. So funny.

32:28 One of the funniest find this memes that I saw recently was just like a picture of space. And it said, click all the squares that have a Klingon bird of prey inside.

32:42 A cloak. They're very good. Very good. Thanks

32:48 again for having a great podcast. Thanks, Tanya, for showing up and doing this with us. So

32:53 yeah, thanks for having me.

32:54 It was fun. Yeah. Great to have you on your Tanya. Thank you.

Back to show page