Transcript #369: The Readability Episode
Return to episode page view on github00:00 Hello and welcome to Python Bytes where we deliver Python news and headlines directly to your earbuds. This is episode 369 69 recorded January 29th 2024 and I am Brian Okken. Hey, I'm Michael Kennedy And this episode is sponsored by us so check out our courses at Talk Python Training and the complete pytest course and thanks to patreon supporters and Really everybody that just like spreads the love and shares our podcast with other people. Thanks so much The first item is gonna be granny in Oh neat. Yes before we get into that I just want to sort of set the stage is you know, when you're running Python apps web apps in production There's usually something that talks to the web browsers and then there's the part that runs your Python code Right the part that talks to your web browser is Nginx Apache caddy one of these things that does SSL it has no knowledge of Python But then behind that step we've got micro whiskey and we've got G unicorn and those types of things, right?
01:03 so that's where your Python code runs usually it run it'll creep multiple of them and Both those two that I named I'm big fans of micro whiskey is awesome Super fast low memory usage, but only does WSGI does no async stuff And that's a huge drawback, right? It doesn't do a sink It doesn't allow you to like properly scale a sink and a wait do you on the other hand allows you use you via corn?
01:28 Workers inside there, which is kind of like one more chain in that loop But it when you deploy it that way you can do a sink and a wait, which is awesome But there's this new ish thing coming along called granny in from the Emmett framework Which is a new Python web framework, but this is a rust based HTTP server for Python applications. So a rust version of Micro, whiskey or G unicorn? Yeah. Oh cool. That's kind of cool. It has 1.5 thousand stars on github been coming along for a while and Created by a guy Named Giovanni, I believe and Giovanni says well why I'd build this thing a couple reasons. It's a correct HTTP implementation supporting version 1 2 and Working on HTTP 3 which is awesome. It avoids the g unicorn you via corn HTTP tools tendency composition when deploying in production So this natively supports a sink and a wait like right in it along with WSGI So however, whatever kind of app you've created you can just run it right there in this thing without Chaining stuff together and one of the things that's nice about it is it's not a ton faster, but it's way more stable There's a lesser jitter and its performance profile, which I think is super cool I'll talk about in a second. But yeah has HTTP 1 & 2 excellent supports HTTPS and web sockets directly I'm not gonna send HTTPS traffic to it. I'm just using for now engine X, whatever It also supports our SGI, which is a rust server gateway interface, I guess, you know, like ASGI and WSGI So it does all the Python things plus it has a rust Direct version if that was the way you went down it and it's super easy to run but from the performance perspective you look it'll compare it down here to Let's see against you via corn and hyper corn is another one. I should have mentioned that's like a parallel to You via corn plus g unicorn, but that one I think handles it all directly from Philip Jones, which is great But if you look at so let's just say like the ASGI yet, it says it'll do Numbers, please 1.3 million requests At okay. That's just totally doesn't anything it could be over three weeks 85 86 thousand requests per second or maybe this this one's a little bit better a different get for 94,000 compare that against the UVA corn one, which is 19,000 versus 94,000 or The hyper corn at 12,000 versus 94,000, which is great. But if you look at the variation like response time on Let's say you via corn is on average eight point seven milliseconds. That's really good But the max is 320 milliseconds. Whereas if you look at this one It's two point seven, but the max is only eight point six, right? So that that variability or jitter I don't know However, the heck you say it is way more stable and you just kind of look across the board like another example six versus 70 and so on so I thought that was pretty cool So I switched if you come over here Brian the Python bytes. This is running on Granny in right now over my docker cluster for the moment So I just thought I'd see how it goes and it's been going perfectly from what I can tell So so it's pretty easy to switch then yeah, I mean all you got to do is pip install granny in and then change the Start command no matter however you run if you run it in the system D on like a VM You change the system D exec command if you do it in Docker, you just change the entry point command For a micro is give this or G unicorn that - it's basically just another startup command. Yeah, okay interesting cool Indeed indeed one thing I did want to add for people who are considering this I got to move this over So one thing it doesn't you can set it up so it'll do logging but it doesn't do like easy logging out of the box So I actually was messing around like maybe I should just do my own logging if we're not for my app started up Hey somebody click this button, but just request response logging which is pretty common So I actually ended up playing with it and using log guru to come up with a color coded added some middleware that came up with color coded request response logging that does all sorts of cool stuff like See how some of the sizes and this log are red and some are white if it's like over 500 K in the request size than it or is it red or if the response time is too slow?
06:00 It'll tell her color like yellow or if it gets really slow. It'll color it red or it's a 400 or 500 code error it'll color that that part of the request Red or you know, so you can like look right at right away and see so I've decided doing your own log guru Request response stuff is pretty excellent. Actually, so that's a kind of a cool consequence playing around with this as well cool so is the like the Your use of log guru that a custom thing where you you look at the response times and color it differently or something Yeah, exactly Like it'd be easy enough to just go print this format The code is this the URL is that but I said it would be a lot more useful if it was color coded and meant Stuff right?
06:41 Like if it's a 404 it should be a different color than if it's a 200 or if it's a redirect It should be a different color if it's really really slow If it's you see these times like 10 milliseconds 9 milliseconds 8 milliseconds 12 milliseconds if there was a second Maybe that's a problem color that a different color and I did that by installing middleware and the this is in pyramid But it could also be whatever right you do some FastAPI or whatever It just says begin the requests Do something pass it down to the framework and then in the request and just times it and logs it and colors it there Okay, neat. Yep, indeed indeed Well, I I also want to talk about something new and old at the same time. So nice Pi test is been around for a while. But I test 8 is brand new. So I just ate just came out this weekend I'm super excited to start running with it. Actually. I've already started running with it. I We're gonna put in the show notes I put put a highlighted blog post of just by test days here and links to the the change the full changelog But the what they did was they spread out if people are running 7 like old 7x High test which that's what I was using before The changelogs a little a little just takes a little bit to parse because they spread it along The RC 1 RC 2 and the final 880 release the changes are all there So I pulled the highlights out. So the the thing I'm really excited. There's two things. I'm really excited about one is when you had an exception that would just be a red block of Exception stuff and they've there's a whole bunch of cool difference differences So there's improved ifs when when you fail an exception especially if you do - VV so very verbose or verbose verbose However, you want to think about that, but you get a colored diff instead of the big chunk of red There's also there's also this color thing, right? Yeah, it's also more more colors Normal like syntax highlighting we're used to syntax highlighted code. So there's error reports are now syntax highlighted and there's the section the different sections of the error report are Separated better and then also there's better support for standard library containers For diffing like there was usually it was a pretty good Tuple diff for instance, but if you got if you had big lists, it was a little bit hard to read It's a little bit better now and then more comprehensive assert rewrites for other comparisons Not just equal but things like not equal less than equal Other comparisons, so that's really cool Help help people debug their code That's super nice because you want to be able to just say are these two things the same and not write code around?
09:34 How do you do that? Right? Yeah. Yep And also like comparisons like less than or less than or equal It's really nice for the pytest to go out and really tell you why that check failed And highlight the part of your data that where it failed so really really fun to see that there's the thing the next thing I wanted to talk about for pytest 8 was Probably pretty obscure for people that are not using X fail. So X fail is a way to say I expect this test to fail and for a lot of people why would you expect it to fail?
10:10 For but for large organizations, it's pretty common to file a defect and You don't have control over it. So you can't just go fix it. Somebody else is responsible for fixing it So that's how we use it We and I mark mark a test as failing as expected to fail and give it a defect number and then And then when when it and that's not new But if it if it passes There's there's decisions on how to make it X pass or what to deal with do with if an X failed passes I've talked about that much a bunch on the other podcast. However the change for pytest 8 is That with X fails the trace back never showed up It didn't used to so the changes now if you there's a way to turn that on with With the - our command you can turn on X fail trace backs. So that's really nice for CI test runs to be able to see what the failure was in CI and not have to try to rerun it again So really cool excited about that. There's lots more things. So check out the changelog the reason why they bumped to eight I think is because there was a bunch of they changed the way collection works and And that change that behavior change of backwards compatibility made it so that it made sense to bump the the number I think that's the reason I'm not sure But also it's good to bump the number every once in a while so that we have that So that you can deal with that deprecations you can get rid of the code that you were meaning to get rid of So I I encourage people to run pytest 8 and check it out and turn on, you know Turn on the full strict mode and everything so that you know, if if anything breaks you can roll back if you need to -
11:58 Awesome, there's like Christmas for you, right? Yeah major. Yeah a major version release Yeah, and it also made me when I was looking at this maybe realize that I think I need to add more color to My blog it's just black and white and it's not very fun. So I have to add more color Colors always fun. I mean, that's the theme of this episode last week It was let's just ship announce open source projects were releasing. This is like color episode called the color episode. Yeah Or as midnight the audience puts it out. There is a readability episode Very good indeed. Well, let's harken back to a couple of things on my side here So I talked about this Docker work that I've been doing That also kind of led me to the granny and stuff and playing with that as well I also forgot to give a quick shout out to the people like both Andy Shapiro and Bill Crook Pointed out said hey, you should check out granny. So when I give them credit for sending that in Thank you. But as I was doing all these Docker things I was you know, you know when you're in a unusual or an unfamiliar uncomfortable space compared to what you normally do Like right now my little browser in this episode has maybe nine tabs and that's like kind of a lot But when I was doing the Docker stuff, I'd have a 30 40 50 tabs And then I would close 30 of them because I'd solve some problem that we work its way We're just tabs everywhere. So it was just like exploring stuff all over the place, right? Like wow I must not know what I'm doing right now But you know, that's how you get to where you know what's going on along that I'd be like, oh people talk about oh my gosh Totally giving up on doing this. I'm using orb stack or pod man or if they support this OS I'm like, what are these things? So I just want to go through a host of Docker goodies that I think people will enjoy Not exactly Python specific but certainly relevant if you're doing Python and any form of containers, right?
13:46 So the first one of three, there's actually more Brian. I'm not gonna cover them all here I'm saving some for later because it's just it'll be a little out of control at that point So orb stack if you use Docker and you use Docker on Mac or Windows typically what you do is you get Docker desktop, right?
14:02 So so that gives you the Docker commands that allows you to run Docker locally It might use maybe use a virtual box or something on Mac and it uses probably Windows subsystem for Linux on Windows But you run like Linux VM Linux containers on top of some hidden thing of Linux, right?
14:19 Yeah, so orb stack is kind of that they say say goodbye to slow and clunky containers and VMS It's a light and easy way to run Docker containers and Linux on one machine, right?
14:31 So well basically gives you a nice UI around it. It is a hundred percent compatible with Docker so you could say Docker run Docker exec Docker compose up or whatever it is you say and Instead of using the Docker engine. I'll use this orb stack engine, which is pretty neat. It also has its own CLI If you want to directly work with it, but basically it's kind of a one open source and two more lightweight They've got a bunch of cool commands, but they show down here somewhere Speed if you're gonna open it says open edX. I guess that's probably the the Docker compose setup for edX I'm to provision a development environment for it. It's pretty long still because I guess that's a beast of an app 17 minutes on orb stack but 45 minutes on Docker desktop to build post hog, whatever that is It's like a quarter or a third of the time it uses if you're on a laptop It uses like less than 25% of the battery as well Or it depends if you're using super based or kubernetes or whatever right but pretty cool, right? Yeah. Yeah, and oh another thing I think I think let me look. Yes. This is a big deal You and I were just talking about this before we press record It says you can run Linux machines without a fuss So one of the things I can do is I can go to like parallels and I can run Linux a boon to or whatever On my Mac my m2 mini my m2 pro mini How are you those words to go together whatever order makes the right sense there I can run them, but I can only run the arm 64 versions because I only have an arm 64 processor, but this one allows you to run Intel machines on Apple silicon with Rosetta which allows you then to run Intel based Docker images and basically be closer to what your production environment is if you're using Apple silicon So that's also a nice feature of this. That's pretty cool Yeah, it does cost money if you're a company, but it has a free version if you're just person So yeah, not an endorsement, but I thought people might find this to be pretty useful. It looks pretty cool Yeah, next one pod man But man is the best free and open source container tools so you can manage doctor containers pods and that term I believe comes from kubernetes like the unit of execution and kubernetes is called a pod and images with pod man So yeah, it lets you seamlessly work with containers and kubernetes from your local environment So this is also really cool. A lot of people are doing interesting stuff GitHub action plugins. It's got a Visual Studio Code plugin and Different things and then the third one actually third 3.5 because it kind of is - is this is pretty interesting So one of the things that kind of is inspiring once you get all this Docker stuff going is like, okay Well if that open source big complicated thing and some technology, I don't know how to run like PHP or whatever But if it has a Docker container or a Docker composed set of containers I can run it All I got to do is just tell Docker to update it when there's a new one and just run it That's super easy to do right?
17:34 So there's this like taking that to kind of the extreme as there's this thing called Casa OS. Have you heard of this?
17:41 No, I neither but as 20,000 get up stars, which is pretty cool They call it your personal cloud operating system community based open source software focused on delivering Simple personal cloud experience around the Docker ecosystem. So basically if there's a thing that runs Docker This is like a an OS for running in a platform for running all that So it gives you a UI and into this this OS that they give you and it says look you can collect all your precious Data, I don't like tie together Google Drive Dropbox. I cloud one drive, etc, etc Hard drives and everything into just one drive view and then you can just access it and like map that drive over to your TV Or your computer or whatever You go there's somewhere in here where they've got all these apps that you can go Just grab and install or supports a lot of them are unfamiliar to me because I haven't done this enough But like couch potato duck DNS photo prism and they just plug into this this thing. So this is pretty interesting, right?
18:39 I think yeah, you think right? Yeah. I don't know what I would do with it. But you know Yeah So one of the things that I think this is sort of coming out of is they have this thing called Zim cube which instead of running all your stuff on the internet This is like kind of like a really fancy NAS Okay, network attached storage, but it also runs Docker and all these things So it says you can have up to 164 terabytes of SSD, but then it also runs all of these things and this is on Kickstarter and it was already funded at around 1.1 million US which is a lot apparently So this is kind of the the intended destination for that, but I think you can run it anywhere. So pretty cool, right?
19:23 Yeah, I mean some people think over a million dollars is a lot. I don't you know Jump change, but you know, yeah So I don't think this thing is shipped yet, I think it's in in development still now their Kickstarter ended But yeah, so there's a whole bunch of different fun things. So orb orb stack pod man casa and Zima cube Okay, so I have a question about the orb stack Is that that doesn't generate Docker images though? Does it I mean I have to have orb stack stuff on the server as well Right. No, it it will manage it is a transparent Transparent API or CLI to the Docker CLI. Okay So so if you just install this then you can go to your command line and type Docker build Whatever, you know download and do all the things but then when you ship ship it to production you could have real Docker there Okay, okay, right. I didn't understand more like it's more I think it's mostly around kind of yeah It's mostly on the desktop side of things So it's like a simpler lighter way to do desktop stuff possibly you could run it on your own Like I said, it does have its own CLI for doing its things its way But I think people will just use as a duck Docker desktop alternative yeah, it looks like it's the the business and commercial use pricing is Slightly cheaper than Docker desktop right now. So there's benefit there Sorry, I didn't remember that Docker had gone commercial on that side as well. So yeah, that makes them more comparable, right?
20:54 As opposed to yeah, there's this other free thing. It's not terrible though. I mean like I just we just had to re-up our Docker At work and it's what we I think I paid 300 bucks for five seats per year. That's not bad Yeah, that's not bad. Not when it's not your money. It's fine. It's not my money It's easier to spend not your money. Yeah so Yeah, I love not your money spending But anyway, pretty cool Look forward to checking that out. I actually think it'd be fun to have one of those Zima cubes. I do too I really consider again. Wouldn't it be awesome to just have all those cool apps running plus, you know, 100 terabytes of storage Yeah, so it's like the cloud but it's at home. So it's just exactly top 10 It's more like fog. It's way lower down. It doesn't it's fog. It's personal personal cloud That's nice, okay cool Okay, so that's some good news and I the next step I don't know if this is good news or bad news. It depends on your perspective. So I'd like to talk about Github copilot and other assisted AI stuff so Visual Studio magazine Came out with this article called new github copilot research finds downward pressure on code quality so the the question really was kind of if I've got if I'm using code coding with copilot if I'm if I'm using using copilot to help me write some stuff is the copilot kind of like having a You know junior developer that is it more intern or is it more senior dev? Yeah, is it more intern or more senior dev?
22:40 and so the the They the result was or oh Their question was is it more senior dev or more akin to it?
22:49 just the just jointed work of a short-term contractor, which I thought that was appropriate because A contractor might be very skilled, but they don't really care about they might not care about maintenance too much And yeah, exactly. So yeah, the technical debt is not a problem when you're done next week Yeah, and you don't have to yeah. Yeah One of the best ways to not deal with legacy code is shift switch jobs anyway We the answer is summarized of this white paper is summarized by We find it disconcerts. We find disconcerting trends for maintainability code churn which is the percentage of lines that are reverted or Updated less than two weeks after being authored is projected to double in 2024 as compared to 2021 pre AI baseline we further find that the percentage of added code or and Copy pasted code is increasing in proportion to updated deleted and moved Code in this regard AI generated code resembles an iterant contributor prone to violating the dryness The don't repeat yourself of the repositories visited. So this isn't that surprising to me, but it's interesting that there was a study done by get clear and also interesting that it was, you know printed in Visual Studio magazine, but I don't know if this is if the I guess the magazine probably doesn't have any ties to Microsoft but Or GitHub, but anyway interesting So Bart out in the audience has a different analogy I'd like to adapt this is not junior seniors a parrot that recycles what it Found on the web. So I'm thinking more stack overflow copy and paste action type of stuff here And grant says I read this to the research makes sense Sounds right, but copilot has benefits as senior devs like applying good patterns faster. Yeah, it's pretty interesting There it there was some comment in the article that Essentially stuff still got done faster. It's or at least got to Something working faster It's just that people often go back and you know back later and then modify and refactor the code and that's not necessarily bad But you know and get the sense that copilot is very focused on what prompt did you give me?
25:15 I'm gonna do that rather than I understand what your entire project is. I've seen all 200 files I've thought that through now in that context the answer your question is X rather than Y, right?
25:26 I don't think it does that I think I mean I don't it would be a very high level of like token usage that it would have to take into account I just I think it probably just goes like alright. Well you asked me a sentence. Here's the answer Python Yeah, I actually want to play with it more. I haven't really played with copilot too much It's not something I can use at work, but on personal projects I think be fun to use it more but the the The I we're still I mean it seems like you know It seems like like ChatGPT is kind of old now and copilot It's like really old but really the we're really just starting to use these tools in Development like they said pre 2021 So it's still only a couple years that we have have under our belt working with these things and I think that I think that the tools can get better and I I I'm looking forward to being able I I both worry about the the developers that are gonna lose jobs and stuff because of this but I also I think that the tools will probably get better Like you said if it can look at your entire project and say hey In this context, this is the right call. You're repeating something you can we can already you already implemented that Let's go you call this function instead That would be great and also if we could have AI tools to to help maybe keep a style similar or the just a general Philosophy similar in around a project. I think there's room for that Once it gets there, so yeah, I wouldn't be surprised to see that happen. Yeah. All right extra extra time extra extra Oh, yeah, so my extras are like did you know that pytest 8 is out?
27:05 it's installed - you pip installed - you but I also if if Pytest is one of those things that you've always been thinking about doing Head on over to courses dot Python test comm and you can learn it really fast Using a course or you can grab the book, of course, so yeah, excellent. Yeah, that's very exciting Do you have any extras? I do have a couple things. I want to quickly shout out to one This has been around for plenty long. Although it's changed behind the scenes not in a way Anyway, I don't necessarily notice but it has and that's just I want to encourage people to join our newsletter If you go to Python by set of them right below the hero image There's a thing that says new letter if you go newsletter you go over there Let's become a friend of the show your information in there. This is actually a Revamped as part of my work that I did with list monk the private self-hosted email Stuff moving away from MailChimp and others. We talked about that last week two weeks ago some some number of weeks ago and That means it doesn't go anywhere We don't share it with anyone but Brian and I are planning some fun stuff I'm trying to do more with newsletters and reaching out and connecting with you Also, we would love for you to go to Python by set of em Click on newsletter and put your information in there We won't share it, but we'll try to make make it worth your while But we also haven't emailed a lot on it yet in the past So when we start using it, don't think that we like bought your your name off some list It's that we're just starting to use it more. Yes, absolutely Drives me crazy when people mark they'll come sign up for your newsletter and then they'll mark it as spam Which means other people have a harder time getting it It's like you you hyped your information into there and then you mark just doesn't unsubscribe. Just please use the unsubscribe just do Yeah, I actually wrote a ton of software I have a whole separate Docker thing running that like monitors for people marking stuff as spam because there's ways that you can receive hooks about that information and Automatically unsubscribe people if they do that, even if they don't unsubscribe But you know, it's kind of a sense that damage is still done a little bit email is a complete nightmare All right. Let's get away from email because it makes me upset. All right, so Bydantic, bydantic is awesome. Sydney Runkle who works the bydantic company Was on talk by then recently released a brand new version version 2.6.0 and Samuel Colvin said this is probably the biggest most important important release since 2.0. Well, if you scroll through the release notes for identic 2.6 There is a lot going on here and even just the new contributors is massive But apparently a ton of speed up some other things going on here that you can check out so if you're using pydantic everything's excellent just no more Python 3 7 because we've already had the The thanks and goodbye the Python 3 7 we're on to 3 8 as the minimum reasonable Python these days. Well, though Yeah, very cool. A lot of contenders. There's a lot going on here So it's a popular library. Like if we go over here and we see like, okay. Well how many things depend on it?
30:10 where's the the used by 317,000 projects it lists one two, three, four five It looks like six and it says plus as in there's more as a plus three hundred seventeen thousand nine hundred forty six Like that's not really totally representative, but okay, I understand the UI anyway, yeah, it's used by a lot of people Well, it's used by more projects than their stars. So some people are using it and don't like it. Apparently maybe I'm on start this up people The only reason you don't see a star for me is I'm not logged in All right, and finally I wrote a new essay called use custom search engines way more this is not duck duck go versus Google versus being but rather if you use a proper browser like Vivaldi or Firefox or Even Chrome though. Anyway, you can go and set custom search engines for all sorts of cool stuff Like one I set was pipey I Brian so if I go to my my address bar I don't know if I've done it on my streaming one here. Let me see now only my proper one This is like a separate user Account over here, but I could go and just type pipey I space py test and it will search using Pypi.org's search results directly for my test or whatever it is. You type there. I didn't know you could do this It is awesome. So if you want to search unsplash for Stock footage you space and you type the thing or so space you directly search on stack overflows So instead of searching for it, oh, I was looking in looking for stack overflows So you scroll through till you find the result and you go You know just like boom just like a super short or gh for github to search only Repositories not users or whatever you want to type in incredibly easy. So that's my my essay my quick little so that's it That's not built in already. You have to well, it's supported but you have to like configure it on your browser type Yeah, you have to type basically You go to Vivaldi search and then you find just go in our new search engine or there's ways to do in Firefox There's a way to do it in Chrome. They're all different Okay, but then you just figure out if you just search a site like if you search stack overflow You'll see it stack overflow comm slash search question mark Q equals some string And so you just put percent s there and say that's the search engine. Okay, I think I'll do a PB for Python bytes. Oh You know what? I'm feeling Like we could totally do this I mean you're all dried up there. Yeah Yeah, why not? Let's get one step beautiful. Anyway, that's my set of extras. Very cool. Thanks Well, how about funny stuff? This one's quick and short. Okay, it's a picture but you don't need to know anything about the picture It's just a lawyer arguing a case. Hey, Brian says your honor. My client didn't know they were pushing to the main branch That's funny, yeah, that's it didn't know I'd push it's my embrace this is my defense. I'm sorry I took down the website during Black Friday. I thought it was my my fork That's funny. Yeah, how often have you like I guess you don't do this too much, but it's three-day weekend I want to make sure that I have my stuff pushed to Central repo so push work at home, right? You want to like yeah and sync it back up or whatever Yeah, but but make sure you're on a branch Mm-hmm. So, okay. We were talking about junior versus senior a little bit on AI stuff So I wanted to share a little picture also of this was I saw this on Mastodon Junior versus senior developer junior. It's a timeline thing So the junior developer working on project encompasses the entire time senior developer Finding the motivation to start takes up like 90% 80% of the time and then actually doing it at the end And the total times equal Yeah It's amazing. I would have altered it to make the senior like the total time is like a little bit less It's just yeah. Yeah, and the junior needs a little bit of finding the motivation but just a tiny bit It's still a good one. Yeah Cool. Well, thanks again for oops Such a great episode good to talk to you this week. It's good to have everybody in the Showing up for the live show. Thank you very much If you want to what's that link again, if you if people want to go watch the live show They can buy them by set of em slash live. Yeah. All right, cool Plus if you just go to Python bytes dot FM, it's right at the top. Yeah there. Yeah Thanks a lot. It easy we make it easy for people. Yeah. All right. See you next week file