Transcript #382: A Simple Game
Return to episode page view on github00:00 >> Hey everyone. Hey Brian.
00:02 >> Good to be back.
00:03 >> It's good to be back. I'm back in a place with somewhat controlled audio,
00:06 although I'm having a bunch of tree work done and one of those giant free grinding machines is literally outside my window.
00:12 However, I got a new microphone and I believe it didn't even pick it up.
00:17 It's ridiculous.
00:18 So there's a bunch of onboard software stuff built into the mic.
00:24 >> Wow.
00:25 >> So it might not even affect us.
00:27 >> Does it have a bunch of AI in there so they can correct your grammar if you say something wrong? That'd be cool.
00:31 >> That would be cool. No, but it has noise gates and noise reduction and high-pass filters and stuff like that.
00:40 With that, let's go ahead and kick this off.
00:42 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:48 This is Episode 382, recorded May 7th, 2024.
00:55 I don't know if you caught it last time, but I was a year behind last year.
00:58 So I said 2023 last time I was doing the show intro.
01:02 >> Nice.
01:02 >> But no, it is in fact 2024, despite what I believe about time.
01:06 It seems like it's going too fast.
01:08 Nonetheless, May 7th, 2024.
01:10 I'm Michael Kennedy.
01:12 >> I'm Brian Okken.
01:13 >> This show is brought to you by Scout APM.
01:16 Check them out during their segment.
01:18 It really helps support the show.
01:19 Connect with us on Mastodon.
01:21 All three of us are over there.
01:22 Links are at the top of the show notes.
01:24 If you want to be part of the live recording, pythonbytes.fm/live, usually Tuesdays at 10 AM Pacific time.
01:31 Finally, Brian, I know we sometimes talk about our newsletter, but people are subscribing and they're getting a lot of value out of it.
01:37 So if you want an artisanal handcrafted digest of all the stuff we talked about in the show,
01:41 deliver an e-mail form so it's permanent right there.
01:43 You can forward it, share it.
01:44 All you got to do is head over to pythonbytes.fm, click the newsletter link right in the center of the screen,
01:52 and bring you to the friends of the show.
01:53 Keep your e-mail private.
01:54 We don't share it. We don't do anything weird with it.
01:58 We just want to be able to send you stuff about the show.
01:59 So people are really getting a lot out of this, Brian.
02:02 I checked last week the e-mail that you sent.
02:05 >> Yeah.
02:05 >> Normal. If you're doing good, if you're lucky, if people really want to hear from you,
02:10 there's a chance that about 20 percent of people will open e-mails that you send in newsletter form to them.
02:16 When you said it was like 95 percent opened.
02:19 >> That's awesome.
02:20 >> That is so awesome. Thank you everyone for actually caring and subscribing.
02:24 So pythonbytes.fm, click on newsletter and sign up for it. That'd be great.
02:29 >> Yeah.
02:30 >> With that, yeah, go ahead.
02:31 >> One of the things I wanted to bring up is, so now there's two ways.
02:34 Then if there's something that you heard on the show, but you can't remember what it was,
02:37 you can search your inbox if you save it, save our old e-mails from us.
02:44 But we also, we haven't talked about it a lot, but the search box on pythonbytes.fm is excellent.
02:50 It searches both the show notes and the transcript.
02:54 So even if it wasn't listed, but it was said, it might find the right episode for you.
02:59 >> Yeah, absolutely. Yeah, I use that.
03:01 I actually use that to decide, oh, if we talked about this thing before three years and I forgot about it,
03:06 should I cover it, right?
03:07 >> Yeah, exactly.
03:08 >> Amazing.
03:09 >> Amazing.
03:11 >> All right. So we jump in to the first topic.
03:13 Well, I want to act on that information with a product called Act.
03:20 It's from Nectos.
03:23 I think it's the person's name, their name is Nectos and it's their Act.
03:28 N-E-C-T-O-S-A-C-T, but it's in the show notes or in the e-mail that you'll get if you sign up.
03:34 Anyway, what it does, it's super cool.
03:37 It runs, what it's doing is it's running GitHub Actions locally.
03:41 So you can set up this.
03:45 What you have to do is you have to install it, and it's got great installation instructions.
03:51 I used Homebrew, but it's got installation instructions for Chocolatey or even GitHub CLI.
03:58 I could have used that or Macbooks, Scoop.
04:01 I don't know what wing it is.
04:02 Anyway, getting-
04:03 >> Wingit is, you know how, for example, on Voodoo we have apt-get on Debian systems sort of thing.
04:11 >> Yeah.
04:11 >> So that is the, for a long time, Chocolatey was the package manager.
04:15 It was kind of like Homebrew, sort of external for Windows, and Wingit is like
04:20 the official Microsoft package manager for Windows.
04:23 >> Oh, okay.
04:23 >> It's kind of a new thing. I don't use it very much because I don't use
04:26 Windows enough that I care about that stuff, but yeah, that's what it is.
04:30 >> Cool. Well, so this project, really what it does is you can run your workflows locally,
04:37 but you have to install it and you have to set up Docker locally.
04:40 So it could because it uses Docker, which actually I kind of love anyway.
04:44 So what it's doing is it's running your actions, it loads up a Docker image and runs your actions.
04:51 But the control over it's really pretty cool.
04:54 So I should have looked this up, but there's different runners.
04:59 But the way you run it is there's a bunch of different commands that you can run.
05:04 So you can run your pull requests or you can run a specific job.
05:09 There's a whole bunch of different parameters for this to be able to run different pieces.
05:14 I used it just to run.
05:16 I wanted to just check my test run within locally.
05:20 Because I wanted to play with the different test jobs and coverage, I'd be able to run those individually.
05:27 It really was slick and it's super fast, really easy to use. It's really pretty cool.
05:32 It's also open source, so nice.
05:35 We're going to link to the GitHub repo as well, so you can check it out.
05:39 Apparently, I'm not the only one that loves it.
05:41 It's got 1.3 thousand stars.
05:44 >> That's forks, 50,000 stars.
05:45 >> That's forks, there's 50,000 stars. Nice.
05:48 >> It's awesome. This is so awesome.
05:50 If you do a lot of GitHub actions, this is so cool.
05:53 One, you can test it and run it faster and iterate really quickly till you get it dialed in.
05:59 >> Yeah.
06:00 >> Then the other thing, Brian, that might be interesting, there was inspired a lot by
06:05 what the 37 signals people are doing around deployment and stuff.
06:09 One of the things they did recently is they moved their continuous integration.
06:14 Maybe even using this, I don't know.
06:16 Moved their continuous integration to developer machines.
06:19 Instead of having one server where all the builds just queue up behind each other,
06:24 it's like everybody has a super high-end computers, oftentimes faster than the CI servers anyway.
06:30 Run it there is like a pre-commit hook sort of thing, or some push, some event locally.
06:36 It lets you go down that workflow as well.
06:39 If you're like, we just want to distribute the compute so we can make our actions run a lot faster,
06:45 at least a good chunk of them. Very neat.
06:47 >> One of their ideas for this also is to use it as a local task runner instead of make or things like that.
06:55 Which is interesting, you could have workflows that aren't reachable from CI,
06:59 that you can just run locally through.
07:00 >> Yeah.
07:01 >> If you're already using it.
07:02 >> That's really awesome. This is great. I love it.
07:05 >> All right.
07:05 >> Well, since you brought up Docker, let's keep going.
07:08 >> Okay.
07:09 >> Let's keep going. I'll get there in a second.
07:12 I'm sure you're familiar with ngrok.
07:14 We've talked about how ngrok is awesome before, and it solves a super interesting problem.
07:19 Ngrok is a commercial project.
07:21 I'm a big fan of it. I'm a pain user of it.
07:24 I'll see if I continue to be honestly after I read this out.
07:27 However, I'm a big fan of it.
07:30 There's all these situations where you need to easily get access.
07:35 Something on your machine in terms of an API or a website needs access to the Internet just for
07:41 testing or just for a demonstration purpose.
07:43 How often are you? You're in a Zoom meeting and somebody is like, "Hey, I want to show you this new design and this new user interaction.
07:50 Let me share my screen." Then they're on a huge monitor and it's blurry and you're like,
07:55 "I think I like it. I don't know." But with ngrok, you just say, "Here, just everybody connect to my little local dev app
08:01 and click on this and see how you think it feels." Or you want to debug a webhook,
08:05 which has to come from the Internet to somewhere public.
08:08 So you can just fire up an ngrok endpoint or use SSH to tunnel what would be regular web requests into your machine,
08:15 that turn back into web requests, hit Flask or FastAPI or whatever it is.
08:19 I did it for webhooks a bunch recently and also for mobile apps.
08:24 When Lauren and I were building out the mobile apps, they had to talk to and just do some callbacks and other things.
08:31 We're testing out the API and just like, "Here, we'll fire up an ngrok."
08:34 He'd be on his phone running the app, clicking with it, debugging it, and it would be coming through the API,
08:41 hitting breakpoints in PyCharm. Awesome, right?
08:44 >> Yeah.
08:44 >> But it's more of a individual type of tool and also closed source and paid.
08:50 Not that those are terrible, but that's what they are.
08:53 So I want to tell you about Porter, like P-O-T-R, which is an open source ngrok alternative.
08:59 So the idea is exactly the same that I just described.
09:04 However, the way it works, don't watch the video, it's not very bad.
09:07 Go to the docs instead.
09:09 Similar though to ACT, it has not as many, but 2,000 stars.
09:14 How old is it? Six months old?
09:16 First six-month-old project, that's pretty good.
09:18 >> Yeah.
09:18 >> Yeah. So basically, to set it up on the server, you have to have, it says a virtual machine,
09:24 you need a machine.
09:25 This could be a VM on the Internet, it could be a VM locally, it could be a real machine sitting on a beat up laptop in the corner with a public IP,
09:35 who knows, whatever. You need some pretty lightweight machine, $10, $5 DigitalOcean server.
09:42 You got to set up a Cloudflare token for wildcard because it manages subdomains
09:47 automatically and GitHub credentials to login, and then that's it.
09:51 The idea is that it actually does, it's built for Teams as well.
09:56 So Teams can manage different ways to call back into things and connect things and so on.
10:01 So it's got a whole team dashboard and people can set up the Teams and whatnot.
10:06 But basically, you just set this up and you run a Docker container on a simple machine,
10:11 and then all of a sudden, you've got your very own InGrok, where data also is not going through InGrok,
10:17 but it's just private to you, of course.
10:19 It's HTTPS over to SSL and then back.
10:23 >> Okay. So is it setting up, does InGrok set up a Docker?
10:31 Does it go through Dockers also?
10:32 >> No. They run the server side for you.
10:36 >> Okay.
10:36 >> They probably use Docker, but they completely manage the server side for you.
10:41 You just use a CLI that talks to that thing and then sets up a connection, an SSH connection back to you.
10:47 >> Okay.
10:47 >> Then when I'm debugging it, if I set a breakpoint or something, do I need to set that in the Docker image or do I need to?
10:54 >> No. The Docker image is just a pass-through.
10:56 >> Okay. Got it.
10:57 >> Yeah.
10:58 >> It really does work just like InGrok.
11:00 >> Yeah. It's super similar.
11:02 I haven't used it yet, but I'm looking to start trying this out.
11:05 Then for the client, there's a couple of ways to install it, but pretty straightforward.
11:10 Then you just, instead of saying Docker, instead of saying Docker HTTP something,
11:16 you say Porter HTTP something and off you go.
11:18 >> Nice.
11:19 >> Yeah.
11:19 >> Cool.
11:20 >> Pretty cool. It sure is.
11:22 You know what else is neat, Brian?
11:24 >> I think Scout is neat.
11:26 >> Scout. Scout APM.
11:27 Scout APM is pretty awesome.
11:29 Let me tell you real quick about Scout APM.
11:32 They're big supporters of Python Bytes, so we appreciate that very much.
11:36 If you are tired of spending hours trying to find the root cause of issues impacting your performance,
11:42 then you owe it to yourself to check out Scout APM.
11:45 They're a leading Python application performance monitoring tool, APM, that helps you identify and
11:51 solve performance abnormalities faster and easier.
11:54 Scout APM ties bottlenecks such as memory leaks, low database queries, background jobs,
11:59 and the dreaded N plus one queries that you can end up if you do lazy loading in your ORM and then you say, "Oh no.
12:06 Why is it so slow? Why are you doing 200 database queries for what should be one?"
12:10 You can find out things like that.
12:11 It links it back directly to the source code, so you can spend less time in the debugger and
12:15 healing logs and just finding the problems and moving on.
12:18 You'll love it because it's built for developers by developers.
12:21 It makes it easy to get set up.
12:23 Seriously, you can do it in less than four minutes, so that's awesome.
12:26 The best part is the pricing is straightforward.
12:30 You only pay for the data that you use with no hidden overage fees or per seat pricing.
12:36 I just learned this, Brian.
12:37 They provide the pro version for free to all open-source projects.
12:43 If you're an open-source maintainer and you want to have Scout APM for that project, just shoot them a message,
12:48 or something on their pricing page about that.
12:50 You can start your free trial and get instant insights today.
12:54 Visit pythonbytes.fm/scout.
12:57 The link is in your podcast player show notes as well.
12:59 Please use that link. Don't just search for them because otherwise they don't think you came from us,
13:04 and then they'd stop supporting the show.
13:06 Please use our link, pythonbytes.fm/scout.
13:08 Check them out. It really supports the show.
13:11 >> Indeed, indeed. What's next, Brian?
13:14 >> We've talked about type annotation a lot, and I ran across this blog post called
13:18 Annotating Args and Keyword Args in Python.
13:21 Actually, I never tried that.
13:24 I've mostly just, if I have star args or star star kwargs, just leave it as is.
13:31 I haven't tried type annotating those.
13:34 I was intrigued as to how I would do that if I wanted to do that.
13:38 There's an article about it from Redwan, I think, what's his first name?
13:45 Anyway, Redwan Delaware, cool name.
13:49 There's some problems with all the ways he tried that seemed obvious, like passing in a dictionary that he expected.
13:59 Apparently, mypy doesn't like that, or doing a deck that describing the tuple or dictionary that are coming in.
14:08 There were issues with those, but I'm just going to hop to the end result.
14:12 Apparently, using information from PEP 589, 646, 655, and 692, there are features like unpack and type dict along with typing that we're
14:25 used to that are part of the typing module.
14:28 The result is cool.
14:31 I mean, it's not terrible.
14:32 There's a pre 3.12 and a after 3.12 version.
14:36 I'm glad that he listed both.
14:38 But you set up a class for your keyword args and describe what the types are there in your keyword under type dict.
14:47 Then for the star args, it's an unpack, you say an unpack of a tuple and then the types of the tuple.
14:54 You can do good typing as to the types of things that you want to come into star args or keyword args,
15:02 which is neat to make sure that you think of star args or keyword args, it's just anything can come in.
15:08 But if you really don't want just anything to come in, this would be great.
15:12 I like this.
15:13 >> Yeah, it's cool. It's a totally reasonable thing to think.
15:16 I want to pass one number or two numbers or 100 numbers, but whatever it is, I want to operate on numbers, right?
15:22 >> Yeah. In this example, it's either integers or strings that I'm going to get in
15:28 or ints or bools.
15:30 >> I would have never come up with this.
15:32 To create a class derived from type dict with multiple values to then wrap that as an unpacked of,
15:39 okay, I'm awesome, they have it.
15:40 >> Yeah.
15:41 >> But this is amazing.
15:43 >> Yeah. Seems like there could be an easier way.
15:46 But anyway, this is pretty cool and he's got some great writing.
15:51 One of the other articles that I started down this rabbit hole was a more recent article from April 27th called
15:58 typos does what I thought type guard would do in Python.
16:02 I don't use either type guard or typos, so I'm not sure what these are.
16:06 But if you are a type guard person, maybe you want to check this out.
16:09 >> Yeah. All right.
16:11 That also looks cool. Well done.
16:13 I have one more item for us here.
16:16 It's pretty awesome, Brian.
16:18 >> It's pretty awesome.
16:19 >> Awesome.
16:20 >> Ever since the guy behind just path got thinking about, hey, people should use the featured on Python bytes episode number badge.
16:30 I'm like, there's probably more to these badges than I give them credit.
16:33 I mean, I know I've seen plenty of badges, but there's a lot of badges.
16:36 So this is a GitHub repo with 1,000 stars that is a curated list of GitHub badges for your project.
16:42 Let me tell you, what are you interested in, Brian?
16:45 You want to talk about contacts, you want to talk about groups, socials,
16:48 operating systems, where are you streaming, what kind of tests, what kind of food do you want, for example?
16:54 >> Well, that's under the tests category.
16:57 >> I think that's the failed indent I'm right here.
16:59 I think it's all just one thing.
17:00 I don't think that's this level.
17:02 I think the test got unindented for some reason.
17:04 >> Okay.
17:05 >> What kind of terminal do you rock and so on?
17:07 So I'll pick a couple, just to give people a sense because I don't want to just read a list of a bunch.
17:13 But for example, you see the scroll bar, Brian?
17:15 I mean, this is a lot.
17:17 So under contact, you've obviously got e-mail, but if you want to be specific,
17:22 say, hit me in my Gmail or hit me up on my ProtonMail, you can actually have those as badges.
17:27 You can have Signal, Telegram, Tutanota, how do we say that?
17:33 WhatsApp, WeChat, all those things are pretty cool.
17:36 For groups, you have Slack, Discord, Zoom.
17:39 Apparently, I think Zoom is getting into trying to be more Slack-like, even though I never use it for that,
17:44 Reddit and so on.
17:45 Under social, that would be Bitbuckets.
17:49 Social coding, I guess, I don't know.
17:54 But GitLab, Instagram, Pinterest, Quora, Reddit, etc.
17:59 Then you've got some for the OS, not just really standard ones, but like SintOS or Deepin or whatever.
18:06 But those are the little icons that go with them.
18:09 Like the red hat is red, but it also has the hat, that is the red hat one.
18:13 I'll just go down a little bit and find some more of the uncommon ones down here.
18:18 >> ETL, that sounds boring.
18:21 >> Like mobile frameworks, so they've got Flutter, for example.
18:25 The app I was just talking about earlier, the Talk Python is built on Flutter.
18:28 We can have that or Ionic or Cordova or Xamarin, whatever you want.
18:32 So isn't that cool?
18:34 >> Yeah, that's pretty fun.
18:35 >> What security platform is using?
18:37 Is it like, this is verified by Snyk and so on.
18:40 Anyway, so if you're thinking about your next project or your GitHub profile or whatever,
18:44 I present to you many, many GitHub badges for the taking.
18:47 >> Yeah, I'll see if I can get like four rows of badges onto a project.
18:51 That'd be fun.
18:52 >> Exactly.
18:54 >> Well, any other extras?
18:57 Wait, this isn't what you, that wasn't your extra.
18:59 >> That's not an extra, but I do have extras.
19:01 >> Okay.
19:01 >> I'll go ahead and go through them since I already got my stuff on the screen for us.
19:05 So this one comes from the Django-Naut folks.
19:10 So the Django-Naut program is a program to help people who are interested in Django
19:15 become core contributors, not just users of, but contributors to the Django codebase.
19:23 So it's like a mentorship program around that, which is excellent.
19:27 You must act soon, you have six days to apply.
19:31 So the session two application is open.
19:34 I actually interviewed Sarah Boyce and Tushar Gupta about their experiences running and coordinating
19:45 the first one back on Talk Python in March this year.
19:52 So if you want to hear more about it and you think maybe I want to apply to it,
19:55 well, you've got six days to do so, to be part of it.
19:58 It doesn't cost anything, but there is an application process, which is cool.
20:02 That was fun. Then I was on Django Chat, the Django Chat podcast with Will and Carlton.
20:11 Yeah, I do too. Those guys are both great.
20:14 We talked all about this whole new deployment style and self-hosted open source and all these different things that I've been
20:21 talking on and off on about the show here.
20:25 But we spent a good chunk of the show just talking about how am I running things
20:29 for Talk Python and for Python Bytes and for a bunch of other stuff.
20:33 Then what are some external projects and some of the other advice and it's just really fun.
20:37 So we had a good time talking.
20:39 People can check that out. Extras for you?
20:41 >> Yeah. I'm going to start off with some bad news and then some good news.
20:45 I came across this, it's from Bleeping Computer, but I saw it on a whole bunch of websites.
20:50 Fake job interviews targets developers with new Python backdoor.
20:56 It's just awful. It's nefarious and evil.
21:00 The idea of a lot of viruses is to try to get people to run code, sneak in stuff to run code.
21:08 They're just going straight to developers and saying, "Hey, as part of the interview process,
21:13 we'd like you to download this repo and run the code in there." Then I don't know what they're telling to do after that,
21:19 but it's too late at that point.
21:21 At that point, they've just run the virus.
21:23 That's just awful. Anyway, be careful if you're doing a job interview and they say,
21:29 "Hey, go run some code." Maybe don't or look into it a little bit more.
21:34 >> It's so bad though because it could just be, well, all you got to do is pip install
21:37 the requirements and take this project and then add this little feature and show us how you did it.
21:41 That already runs arbitrary code from the Internet.
21:43 >> Yeah. I could.
21:44 Just awful. Yikes.
21:48 Anyway, that's bad news.
21:50 Good news. Good news is this is the week that I'm going to switch the course.
21:55 The pytest course is going from teachable to a new platform podium.
22:02 You don't want to hear the reasoning, but mostly it's the future that I'm working
22:10 off for more courses and more things I want to do with people, teaching pytest and other things fits better with Podia platform than with teachable.
22:19 To celebrate this switch, I haven't made the switch yet.
22:23 It's going to happen this week, but you can already get to this new one.
22:26 It's at pythontest.podia.com.
22:28 Now through Sunday, you get 25 percent off if you use the code pytest, and that's P-Y-T-E-S-T.
22:37 You can find that link in the show notes also.
22:41 Lastly, I know PyCon is coming up.
22:45 I won't be at PyCon, but I know a lot of great people will be.
22:50 To celebrate PyCon, I have episode 220 at Python test that's getting the most out of PyCon and
22:57 some great tips from Rob Ludwick about having fun at PyCon. So check that out.
23:06 >> Indeed. I'm going to be doing probably a data science panel podcast that's also going to be live streamed with the JetBrains crew over there.
23:16 >> Sweet.
23:16 >> That'll be a lot of fun. Yeah.
23:18 I will probably do Python Bytes, but since you're not there, probably not an open space in person one,
23:23 probably just sneak away to a quiet spot and we'll do it like this, different background.
23:27 >> All right. Awesome.
23:28 >> Is that it?
23:29 >> I have one more.
23:30 One last minute one which I thought was cool, just one I just threw in.
23:34 I saw this on Amazon just before we started recording.
23:37 Somebody named Orion Reed posted this bookmarklet to visualize your DOM.
23:46 It's a JavaScript bookmarklet to visualize your DOM in 3D.
23:50 >> I love it.
23:52 >> So cool.
23:53 >> It may seem just like silly, who cares?
23:57 But if you're looking at why is this thing overlapping that thing?
24:00 What about Z ordering or why is this is actually contained in that versus next to that?
24:06 All that stuff you would see from this 3D rotational thing. It's beautiful.
24:09 >> Yeah. It's pretty neat.
24:11 I'll link to that. That's all my extras.
24:14 >> There's a question out there, Brian.
24:16 This is an important one.
24:18 Who will carry the Python staff of power at PyCon, Brian?
24:21 Who will do this?
24:22 >> I don't know.
24:23 I don't know, but I think it's going to be a great disturbance in the forest is what I'm feeling.
24:29 Speaking of which, how about a joke?
24:31 >> Yeah.
24:32 >> I have two jokes for people.
24:33 One, very heartfelt and sincere.
24:35 We're going to close out the show with that.
24:37 But first one, a sneaky little game.
24:39 So this comes from Reddit and it's just on our slash programming humor.
24:42 It's just a little game and it says, import random, import OS, randomly get a number, guess equals input.
24:49 Silly game, guess a number between one and 10 and it converts it to an int.
24:52 So you would think, of course, if guess equals number you won, else, sorry, try again.
24:57 No. If guess equals number print you won, else, OS.remove C colon Windows backslash system 32.
25:06 >> Ooh. That's just terrible.
25:10 Yeah.
25:11 >> I don't think it would really work.
25:12 >> It's going to be a rush to relive with your computer.
25:13 >> It would really work, but you could do it like you could delete your user profile.
25:17 Stuff that doesn't require admin access.
25:21 >> Oh boy. That's funny.
25:24 >> Just a silly little game.
25:26 All right. Let's close this show out with something special.
25:29 I saw this come through the news a little bit.
25:32 So I think this is going to be a lot of fun, Brian.
25:35 I came across this.
25:37 Actually, this came from Dan Bader.
25:39 He sent this over to me.
25:40 Just think it was this.
25:41 Said, you wouldn't believe this. Check this out.
25:43 It's called Permission Granted.
25:45 A sad girl sings the MIT open-source license, like for real.
25:51 Okay. So it's AI generated, which is what makes it crazy and it probably has Python involved in there somehow.
25:57 Since AI generated content can't be copied, we should be safe to play. Let's do it.
26:03 We're going to close out the show.
26:04 It's two minutes. You can listen to it if you want.
26:05 If not, feel free to bail.
26:07 But end of the show is we're playing this. So here we go.
26:10 [MUSIC]
28:00 [MUSIC]