Python Bytes - #283 The sports episode

Episode Date: May 12, 2022

Topics covered in this episode: Pathy: a Path interface for local and cloud bucket storage Robyn Termshot When Python can’t thread: a deep-dive into the GIL’s impact Extras Joke See the full... show notes for this episode on the website at pythonbytes.fm/283

Transcript
Discussion (0)
Starting point is 00: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 10th, and I am Brian Ocken. I'm Michael Kennedy. And I am Tanya Sims. 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. Well, thank you so much for having me today. I'm very excited to be here. So my name is Tanya and I'm currently
Starting point is 00:00:25 a Python developer advocate at a company called Deepgram. And so at Deepgram we do speech to text, speech recognition technology. I would say that my path to technology is a little bit unconventional. I come from like an athletics background. I started playing basketball when I was five years old. I don't know how old I am now, but. So yeah, so I played basketball in college. I played professionally in Europe and a little bit in the WNBA. And then I got into sales and then from sales, I got into tech. So yes, it's been very unconventional. That's pretty, pretty awesome. I wish 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 and programming skills are actually pretty relevant, although maybe you were just deep. I think Python is like the perfect language for doing a lot of stuff with like stats, like sports statistics and things like that. And like the visualization of it. But yeah, I started getting into coding when I was a kid, actually. But then I stopped for a long time because, you know, who would have thought this thing about coding or computers would have taken off and be where it is today?
Starting point is 00:01:42 Yeah, absolutely. Yeah. Fascinating as that is. Let's take a different path, Michael. Yeah, absolutely. Yeah. Fascinating as that is, let's take a different path, Michael. 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.
Starting point is 00:01:55 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 Pathy, a path interface for local and cloud bucket 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.
Starting point is 00:02:32 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 Pathlib. So Pathlib is great, right? We can create a Pathlib and give it a path and it has things like make directory or the parent of the parent of 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?
Starting point is 00:03:10 That's cool, huh? Very, yeah. Yeah, it's very awesome. Yeah. So what's nice about it is you basically give it a URL with some type of scheme, you know, traditional schemes are like HTTP, HTTPS, but like GS 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, basically, if you want to work with cloud storage using Pathlib, well, then here you go. It also supports caching locally, which is neat because that's one way in
Starting point is 00:03:53 which you could get all of your cloud files sort of downloaded and replicated locally as well. And then Spencer had a quick comment saying the really cool function is fluid. So 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,
Starting point is 00:04:19 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 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 you too but i had been a bit of a holdout on path lib it was all import you know system.io or import io whatever it was and just use the io uh way working with it but i've really
Starting point is 00:04:41 come to like path and pathlib last year or two. Yeah, I really, I love the interface. Just, it feels it's easier to program into me. It just feels easier. It feels more obvious. Yeah. Yeah, this is great. I've been wanting to do more with cloud technologies. So, yeah, I think this would be a really
Starting point is 00:05:00 good place to start. Yeah, and so much of that possibility is just working with static files on S3 or static files in blob storage and other places. Sure. I'd love to not have to care about that. Yes, if I could just not do Boto3, that would be fantastic
Starting point is 00:05:17 because that thing drives me crazy so much. Don't give me another rant. Brian, talk about your topic. Save me from ranting about Boto3. Okay, well, letrian talk about your topic save me from ranting about photo 3 okay well let's talk about uh robin so robin for one has just an awesome logo bird being hugged by a snake that's that's pretty clever so what is robin there's a robin is uh is is a async web server and runtime uh written in rust um and so that's pretty cool and actually it's kind of been taking
Starting point is 00:05:46 off uh in popularity and stuff but the um so there's we're going to link to a bunch of stuff one of them is the hello robin uh blog post uh written by the author and uh 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 it looks a lot like uh in one of the examples it looks a lot like just a little flask thing you can do app gets and app uh puts and 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 um uh ecosystem around it yet um but um it's pretty cool and i just kind of like this idea of like well let's let's make your code the code you write look like python it is python but the uh the back end stuff well maybe you don't care what
Starting point is 00:06:37 that's running on and maybe uh rust is is fine so one of the things it doesn't have an ascii or or asgi or wsgi underlying because that's a python thing um it is async it's very flask like and the numbers kind of look impressive so and i know that benchmarks you have to like read those with a grain of salt but still um request Um, request per second, uh, getting, so we've got this document showing, uh, flask with G unicorn at 1800 requests per second, but, uh, Robin going at 6,400 requests per second. And this is, this is kind of insane. So definitely worth checking out and trying. Um, I think I, or maybe not trying, but just watching to see what this does. Since it's very new, though, one of the things I have to say is there needs to be some, it's not really newbie friendly then, I guess, because there's not a lot of docs yet. There is a doc site started, but there's a lot of work to do.
Starting point is 00:07:40 But still, getting started with it, if you have a really fast thing, it's pretty good. Oh, go ahead. Yeah, well, a couple of notable things that stand out to me. One, it supports async and await, and it supports multithreading 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 high numbers in that benchmark from. So that's great. It looks really simple. It's very Flask or FastAPI-like, so that's cool. One thing that's notably missing that I haven't seen is 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
Starting point is 00:08:23 Jinja templates, Chameleon templates, equivalent of Django templates, like, like that's sort of the missing bit of a dynamic interactive website. Yeah. That also has an API. You could, you could just import Jinja and configure it yourself or import chameleon and configure it itself. And I've done that in some of my like decorator API or a wrapper things for adding that onto API calls. But that's just a layer of a thing you've got to learn to use it instead of just saying, here's a template or render this template or whatever. So I would love to see some sort of template support
Starting point is 00:08:57 come built in for it. Yeah, and I think that's something that definitely could be put in place. Sure, no, it's actually not very hard at all. It just doesn't, I just didn't think that's something that definitely could be put in place. Sure. It's actually not very hard at all. It just doesn't. I just didn't think that's all. So target market, maybe just APIs? Yeah, it's got a lot of examples of JSON type of exchange, right?
Starting point is 00:09:19 Yeah. Tanya, what do you think? Yeah, I was going to ask, what does it come with? Like when you pip install it, what other packages does it come with? Does it indicate? I'm just curious. Well, we could look. I don't think there's much else there.
Starting point is 00:09:33 We've got the... There's very little here. Okay. Yeah. Yeah, if you look at... Brian, open up just the requirements.txt file there, and you'll get... See, it's like... I was... Yeah.txt file there. And you'll get, see it's like the last file there. Okay.
Starting point is 00:09:49 Like that's the super small list. Oh, wow. Okay. Yeah, I mean, we get to start somewhere, right? So I think it is definitely a good start. It does seem like a lot of the, not a lot, maybe the last few frameworks, web frameworks that have come out in Python here,
Starting point is 00:10:02 they do kind of model after Flask. Yeah, yeah, yeah. Yeah, I've been doing quite a bit in kind of model after Flask. Yeah, yeah, yeah. I've been doing quite a bit in FastAPI and Flask as well, 2.0. Yeah, cool. I think Flask has become very popular in its own right, but it also its idea of how web apps should look in Python has spread
Starting point is 00:10:18 to all the other frameworks that are kind of new, right? Like FastAPI is a variation on that. I can't remember where i read it but there's um there was a part of this robin documentation that talked about just um uh it was like almost started out as a i think a college project or something of like what if i built flask but async and it or and 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 apis um and and i think this is it's even an earlier stage thing than
Starting point is 00:10:54 fast api so i think it's definitely worth watching uh one of the apparent there is a talk from last fall um that's linked to on i think the main page and then um henry uh schreiner in the audience says robin had a lightning talk at pycon so check that out too oh nice yeah i will yeah you shouldn't i didn't hear about that but nice so yeah absolutely brian's scrolling down to just where it says why another framework real quick just a bit more yeah so one of the interests this this is pretty interesting to me and it could be a sign of things to come or it could be just really great for Robin.
Starting point is 00:11:30 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 parallelization 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.
Starting point is 00:11:52 So if you could set yourself free from the GIL, I don't know, maybe it hosts like multiple little Pythons per thread or something. That's pretty cool. That's one of the things I'm wondering is if the runtime is in Rust, how is it launching your code for the callbacks? But I don't know. The documentation does have architecture docs. Actually, it's very well-documented architecture-wise. It's not well-documented for how to use it-wise. Yeah, yeah, indeed.
Starting point is 00:12:20 All right, well, good find. That one's great. All right, Tanya, off to your item next. All right. This, good find. That one's great. All right, Tanya, off to your item next. All right. This is Sportsify. So somebody told, I mean, okay, so for those of you who don't know, I'm really big into sports, right? I'm a huge NBA, NFL, baseball, hockey, football fan. So I'm doing a lot now with um you know writing some web application
Starting point is 00:12:47 sports web application so this is a library that somebody sent me um called sports api it's a free sports api written for python and uh what it does it actually pulls stats from uh sports reference.com i believe it's sports dash reference.com and I believe it's sports-reference.com. And that site, it's a great website. That site is for getting sports statistics for like professional sports, like the NBA, NFL, NHL, Major League Baseball, and college basketball and football.
Starting point is 00:13:17 And it's funny because, yeah, it is really cool. And that site, it looks like sportsreference.com looks kind of like an HTML site from the 90s. It does look like the dream of the 90s is alive, doesn't it? It does, doesn't it? Oh, my goodness. It really does. So I think it's also great for, you know, if you want to learn or do some web scraping.
Starting point is 00:13:35 But of course, you know, email the site or a source. I believe that is allowed on that site. But anyway, so back to the API of Sportsify. You can get like a lot of API queries for like all the, you know, mainly like the North American sports. I was saying like the NBA, NFL, National Hockey League, Major League Baseball.
Starting point is 00:13:53 You can get like the list of teams for that sport, 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 know you can build some cool stuff around sports and how teams or players perform during a game or during a season or do even do something even better with it this is super cool yeah it's it's got a kind of a nice object oriented model so like you know from
Starting point is 00:14:23 sportsify.nfl.teams import teams and then you can create a like a Detroit team or yeah nice object oriented model. So like, you know, from sports API dot NFL dot teams import teams and then you can create a like a Detroit team 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 haven't used
Starting point is 00:14:39 this one yet. I just another one that we'll talk about later this afternoon. But yeah, I want to try this one as well because like I was saying, I'm always on sportsreference.com. Just check out the stats from the games.
Starting point is 00:14:52 People ask me a lot of times for APIs so they can build interesting examples or play around and stuff. And it's so much of this tied into either college or professional sports.
Starting point is 00:15:04 That information is really wrapped up and hard to get, right? It is, yes. Yeah, it has been for a long time. I think it's becoming a little, I don't know, a little easier, but it's, for some reason, I remember like five, seven years ago, I wanted to do stuff with sports, like build applications with sports, but I couldn't find an API that had sports data. Everything was kind of locked down.
Starting point is 00:15:25 Yeah, yeah. Well, I can start with this five-year-old CSV file. I guess that's what I'm going to build. It's not so inspiring, but this looks really good. Yeah, cool. It is. Cool. Great.
Starting point is 00:15:34 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 uh compiler and open an original podcast 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 Copiler unravels industry
Starting point is 00:16:10 topics and trends and things you always want to know through interviews with people who know it best and telling the stories of technology, not just the hows of it. So on Copiler, 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 podcast,
Starting point is 00:16:38 Command Line Heroes, for their Python episode, and it was super well done, really polished, and Compiler follows along in that excellent tradition. So I checked out episode 12 of compiler, how we should handle failure, really creating a space for people to grow technically and not get fired just for one mistake. But how do you create an environment
Starting point is 00:16:59 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 pythonbytes.fm slash compiler. The link is in your podcast player show notes. I know you all out there listening, you can just go to your podcast app and type compiler,
Starting point is 00:17:16 but please visit pythonbytes.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. All right, Brian, you ready for the next one? I am. Give us a shot of terminals. A shot of terminals. I seem to have messed up my tabs though. So let me just open that back up
Starting point is 00:17:37 here. Here 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. Honey is doing DevRel and she's, I'm sure doing lots of presentations where there's like, I need a screenshot of this thing and Brian need for books and so on. Yeah, I could totally use it. 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.
Starting point is 00:18:14 It's a little bit like carbon.now.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 specify, I would like to pipe that directly to whatever app you edit screenshots in. So for example, I use Pixelmator Pro. So I might just say, run this command, take the screenshot, and then open it in Pixelmator Pro, go, and stuff like that. So really, really nice.
Starting point is 00:18:43 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 Colorama to make interesting colors on the screen, doing async and await examples of like doing a bunch of requests against DocPython 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, zoom, scroll down some, take another picture, try to fit it back together, all that kind of weird screenshot. You don't have to like, you know, take a picture, scroll down some, take another picture,
Starting point is 00:19:25 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 SSHing into a server,
Starting point is 00:19:44 then I'm running this command and then I'm open command, and then I'm seeing the result of that or something like that through LS. So if all else fails, you just type term shot and you give it some shell, like you could say slash bin slash zshell, zsh, or slash bin slash bash. You do your work, and once you exit the shell, it'll just take a of like whatever you did while you were in there so that's also pretty good that takes less thinking i like that yeah it does exactly so yeah it's so interesting you're you're mentioning uh color ramo michael i learned about color ramo from you actually uh i took your your async uh asynchronous programming course oh you did oh did? Oh, how amazing. Yeah, I did. Yeah.
Starting point is 00:20:26 Thank you. Yeah, you're welcome. Yeah, of course. Yeah, that example was from that course for sure. Okay, yeah. Yeah, I look familiar. Nice. Cool.
Starting point is 00:20:33 Yeah, what I thought was neat about it is even with just non-standard print output and stuff, it still captures it reliably, which is nice. So when you run that command, it takes a screenshot and saves it to, I don't know, your desktop or, so I know like with Carve and New Pen, you can like click a button and it'll save it, you know, it'll just save it and then you can just paste it into wherever you want to. Yeah, exactly.
Starting point is 00:20:55 I don't think it goes to your, 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.png. Okay. There's probably ways to specify it or whatever, but by default, it just drops that PNG file there.
Starting point is 00:21:09 It's super handy for presentations, I think. Yeah. All right. Over to you, Brian. Well, I want to talk about the GIL. We talked about it a little bit earlier. So, Itamar Turner-Troering wrote an article called When Python Can't Thread, A Deep Dive Into the GIL's Impact. And what I really like about this article is just that the focus of it 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 um 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
Starting point is 00:22:10 the mental model he's going for is a thread must hold the gill to call a c python api um and uh the the so anything that any python code that's using um, like built in Python calls is is going to block because it's going to grab the gill. Other threads can't run if the gill is there. But if you're doing pure Python stuff, your stuff gets interrupted every five milliseconds automatically. I didn't know this, but that's kind of cool. Long running things. So if you have a sleep or some other extra process that takes a long time, not Python code going through, but like a sleep or something. Or you probably don't have a long sleep, but maybe you're reading a file or something. Something that takes a long time.
Starting point is 00:22:59 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 to allow, so you can get around this with extensions and stuff. So that's the mental model. But to really
Starting point is 00:23:25 sink it 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 has done it's just doing like some summing of a whole bunch of numbers but the example is just to keep busy for a while and um and and then look at what happens and what happens is you've get you get these meant these shifts of like one of them is spinning around but the other one's just uh you know this toggling
Starting point is 00:24:06 back and forth that happens kind of cool there's uh the all the different models that can happen and like here's one where you're um let's see what are we doing here uh 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 in the visuals of the profile are great to to visualize what's going on so anyway uh 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 uh anybody that's really caring about this sort of stuff, I think this is a great article. The visualizations are quite neat.
Starting point is 00:24:49 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 CPU's here because normal profilers will just tell you, well, you're just spending time, you know, here, what are you doing?
Starting point is 00:25:08 Yeah, exactly. Right. Yeah. It's really helpful. The visual, I don't know. I, I learned visually, I'm like very, you know, large visual learner. Um, yeah, like the guild is something that's always kind of like, I don't know, it just was really confusing to me, you know, when I was first starting out
Starting point is 00:25:23 and, um, getting into like more intermediate stuff. But I took this, it was like a Python deep dive course where the instructor really kind of like talked about things behind the language, you know, so it really kind of helped me grasp and wrap my head around it more. But yeah, this is great. I love this.
Starting point is 00:25:39 Yeah. Nice work, Atamar. This is definitely a good one. I like the pictures as well. All right. I know you want to take us out. And I apologize. I believe I switched the order of your two topics.
Starting point is 00:25:50 That's okay. No worries. I hope I didn't throw you off there. That's okay. So this is the NBA API. So this one is just strictly for the NBA, the National Basketball Association. This is really close to home for you, right? This is like your world.
Starting point is 00:26:04 Yeah, it's very close to home. Yes, it brings back memories. So, and right now with, you know, NBA playoffs happening, I think this is pretty exciting. So this package is maintained by a gentleman named Swar Kutau. He does a very great job of maintaining it. It's very up to date. This API pulls data from the mba.com, right? That's the official website of the National
Starting point is 00:26:29 Basketball Association. With this package, you get like more accessible endpoints. The documentation is really, really good. I think it's probably, you know, it's a really well documented API. Let me see what else here. The m NBA.com API isn't as well documented because a lot of things change, you know, things change frequently, right? Like players retreat, 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 guy 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 law, 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.
Starting point is 00:27:30 Maybe around 40, actually. Yeah, it's just really cool. I'm actually working with this right now, and I'm building a sports NBA ranking website right now. I'm using this package. Fun. One of the things that's cool is it has a lot of search functionalities and not just direct by you know find me the team from this city or this name but like um find teams by state or or something yeah yeah yeah it's definitely very clever um
Starting point is 00:27:58 and it um i would say between like the first one we looked at is sports reference.com i don't know where they're pulled i think i'm not sure where they're pulling their data. Sports reference may be from each individual site of the, you know, the sports associations, I'm guessing. Right. Okay. Well, I mean, like, for example, the data from NBA has got to be more centralized than like all of the college ball stuff. Right. Yeah. Yeah yeah this is cool
Starting point is 00:28:26 even as support for live data here like nba.live endpoints for scoreboard and all kinds of stuff that looks that looks pretty neat wow this is some there's a lot of data here yeah you check out the yeah there's tons of data right the notebooks seem to have yeah yeah i have a notebook and i do better notebooks i have yeah. There's a lot of data. It's very good. Yeah, it's pretty awesome. There's a lot that you can do. A lot of fun stuff.
Starting point is 00:28:50 Cool. 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, you could do some fun things. Indeed. Yep. All right. Brian, you could do some fun things. Indeed. Yep. All right. Brian, is that our six items?
Starting point is 00:29:08 It is. So do you have anything extra to share with us? I have, I think, just a real quick one here for us. From Pablo, we have Python 3.11. Beta 1 is here. So hurrah. This marks feature freeze, which means there will be no new
Starting point is 00:29:28 features or APIs, only bug fixes. So please, they say, if you maintain a Python package, help us test that everything works as expected. This is pretty neat. Nice. That's it for me. On that, I'm going to grab this
Starting point is 00:29:43 just a second. We'll link to this as well simon willison has a a little blurb on like if you're using github actions to test your packages um uh simon has a code snippet for exactly how to to to do that essentially the the python thing you want is python 3.311-dev and make sure it's in quotes and just add that to your Python versions matrix. All right. Fantastic. Cool. So how about you,
Starting point is 00:30:14 Tanya? Do you have any extras? That's pretty much it. Well, I do see some people in the chat that I met at PyCon last week. Mario. Hey, Mario. I'm not sure if you're still here, but hello. Cool. Fantastic. Yeah, you just came back from PyCon and Brian and I were not sure if you're still here but hello cool 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 yeah it was amazing it was my first PyCon and actually
Starting point is 00:30:37 one of my first tech con was actually it was great I spent most of the time working on booths for deepgram because we were helping to sponsor the event uh i did catch a few talks um and met so many amazing people and also like just connected with people that i have been communicating with over the last several years uh you know via internet and you know chat and stuff like that so it was just really fun it was a good time i love pycon it's I consider it my geek holiday. I love to go there and meet so many of the people, everyone's so accessible and I spend most of my time just walking around looking to say hi to folks and whatnot. Yeah. So I have an idea, Michael, maybe next year we should go. Yeah.
Starting point is 00:31:19 Yeah. Maybe next year we should go. Yeah, definitely. I'm looking forward to getting back there. Well, do you have anything funny for us? Are you looking forward to a joke? Yeah. I do. Well, I have something for you. I'll let you be the judge if it's funny.
Starting point is 00:31:31 All right, so here's what I got. Brian, just maybe give us a quick description of what this picture is about here. I don't know. There's a guy who looks really stressed out holding his hand in front of his face. I think he's crying. Oh, crying, yeah. He's pretty sad. I mean, red eyes almost, just crying.
Starting point is 00:31:49 Yeah. And so, you know, we all come to these websites and it's, you know, prove you're human and all these recapture things. And sometimes you're lucky and you get to slide the puzzle over until, like, the dog fits in its house or something rather than find all, know highlight all the the stoplights or anyways so the joke is when with a very sad guy here asking i says when a computer asks are you a robot maybe it's just wanting to find its family poor thing maybe it does maybe we're not we should just be helping more and you know every time we prove a recapture, it's just like, no, that's not my family. It's so funny. One of the funniest
Starting point is 00:32:28 find this memes that I saw recently was just a picture of space and it said, click all the squares that have a Klingon bird of prey inside. Because they're invisible. That's right. Very good. Thanks again for having a great podcast thanks tanya for showing up and doing this with us so yeah thanks
Starting point is 00:32:53 for having me and it was fun yeah great to have you on here tanya yeah thank you

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.