Python Bytes - #447 Going down a rat hole

Episode Date: September 2, 2025

Topics covered in this episode: * rathole* * pre-commit: install with uv* A good example of what functools.Placeholder from Python 3.14 allows Converted 160 old blog posts with AI Extras Joke Watc...h on YouTube About the show Sponsored by DigitalOcean: pythonbytes.fm/digitalocean-gen-ai Use code DO4BYTES and get $200 in free credit Connect with the hosts Michael: @mkennedy@fosstodon.org / @mkennedy.codes (bsky) Brian: @brianokken@fosstodon.org / @brianokken.bsky.social Show: @pythonbytes@fosstodon.org / @pythonbytes.fm (bsky) Join us on YouTube at pythonbytes.fm/live to be part of the audience. Usually Monday at 10am PT. Older video versions available there too. Finally, if you want an artisanal, hand-crafted digest of every week of the show notes in email form? Add your name and email to our friends of the show list, we'll never share it. Michael #1: rathole A lightweight and high-performance reverse proxy for NAT traversal, written in Rust. An alternative to frp and ngrok. Features High Performance Much higher throughput can be achieved than frp, and more stable when handling a large volume of connections. Low Resource Consumption Consumes much fewer memory than similar tools. See Benchmark. The binary can be as small as ~500KiB to fit the constraints of devices, like embedded devices as routers. On my server, it’s currently using about 2.7MB in Docker (wow!) Security Tokens of services are mandatory and service-wise. The server and clients are responsible for their own configs. With the optional Noise Protocol, encryption can be configured at ease. No need to create a self-signed certificate! TLS is also supported. Hot Reload Services can be added or removed dynamically by hot-reloading the configuration file. HTTP API is WIP. Brian #2: pre-commit: install with uv Adam Johnson pre-commit doesn’t natively support uv, but you can get around that with pre-commit-uv $ uv tool install pre-commit --with pre-commit-uv Installing pre-commit like this Installs it globally Installs with uv adds an extra plugin “pre-commit-uv” to pre-commit, so that any Python based tool installed via pre-commit also uses uv Very cool. Nice speedup Brian #3: A good example of what functools.Placeholder from Python 3.14 allows Rodrigo Girão Serrão Remove punctuation functionally Also How to use functools.Placeholder, a blog post about it. functools.partial is cool way to create a new function that partially binds some parameters to another function. It doesn’t always work for functions that take positional arguments. functools.Placeholder fixes that with the ability to put in placeholders for spots where you want to be able to pass that in from the outer partial binding. And all of this sounds totally obscure without a good example, so thank you to Rodgrigo for coming up with the punctuation removal example (and writeup) Michael #4: Converted 160 old blog posts with AI They were held-hostage at wordpress.com to markdown and integrated them into my Hugo site at mkennedy.codes Here is the chat conversation with Claude Opus/Sonnet. Had to juggle this a bit because the RSS feed only held the last 50. So we had to go back in and web scrape. That resulted in oddies like comments on wordpress that had to be cleaned etc. Whole process took 3-4 hours from idea to “production”duction”. The chat transcript is just the first round getting the RSS → Hugo done. The fixes occurred in other chats. This article is timely and noteworthy: Blogging service TypePad is shutting down and taking all blog content with it This highlights why your domain name needs to be legit, not just tied to the host. I’m looking at you pyfound.blogspot.com. I just redirected blog.michaelckennedy.net to mkennedy.codes Carefully mapping old posts to a new archived area using NGINX config. This is just the HTTP portion, but note the /sitemap.xml and location ~ "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.+?)/?$" { portions. The latter maps posts such as https://blog.michaelckennedy.net/2018/01/08/a-bunch-of-online-python-courses/ to https://mkennedy.codes/posts/r/a-bunch-of-online-python-courses/ server { listen 80; server_name blog.michaelckennedy.net; # Redirect sitemap.xml to new domain location = /sitemap.xml { return 301 <https://mkennedy.codes/sitemap.xml>; } # Handle blog post redirects for HTTP -> HTTPS with URL transformation # Pattern: /YYYY/MM/DD/post-slug/ -> <https://mkennedy.codes/posts/r/post-slug/> location ~ "^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.+?)/?$" { return 301 <https://mkennedy.codes/posts/r/$4/>; } # Redirect all other HTTP URLs to mkennedy.codes homepage location / { return 301 <https://mkennedy.codes/>; } } Extras Brian: SMS URLs and Draft SMS and iMessage from any computer keyboard from Seth Larson Test and Code Archive is now up, see announcement Michael: Python: The Documentary | An origin story is out! Joke: Do you know him? He is me.

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to Python Bites, where we deliver Python news and headlines directly to your earbuds. This is episode 447, recorded September 1st, 2025. And I'm Brian Oaken. And I'm Michael Kennedy. And this episode is sponsored by DigitalOcean. Thank you, DigitalOcean. And you can get a $200 free credit, and there's a link in the show notes, but we're going to talk about that more later in the episode. Of course, follow us or send us info on the socials on Blue Sky or Mastodon.
Starting point is 00:00:30 on, links are in the show notes as well. And if you'd like to listen, watch the show live, head over to pythonbites.fm. slash live. And that's the link also if you just want to see it after the fact. If you want to look at the video, we can see what we're looking at. And finally, please sign up for our email newsletter list. Go over to Pythonbytes.com and hit the newsletter link. And we send you all the links that we talk about in every episode in an email.
Starting point is 00:00:59 and a bunch of background information, too. All right, Michael, what are we starting with today? You know, I'm afraid, I'm really afraid, Brian. I'm sorry, but I might be taking us down a Rattle. I really might. Oh, no. I want to talk about Rattle, this tool. So Rattle is a, you probably have heard of N-Groch, right?
Starting point is 00:01:20 Yeah, we've talked about it. Yeah, we've talked about it before, and it's super useful. One of the things that is a real big challenge a lot of times is I need to let somebody or something access an API. Let me give you two really big examples that are useful for this. One is web hooks. You want to do e-commerce or, but it doesn't really matter. Anything that has to do with a web hook where you're on the receiving end,
Starting point is 00:01:45 you're creating the webhook. That's a public website or service that's going to call your webhook. It needs a public page to access that. Well, do you want to like try to open up all the different firewalls on your machine and your Nat router and then map an IP address and then give that to that thing. No, just don't do that. But you need somewhere where you can type in a URL and say, here's my URL for the web hook when a sign-up happens or a thing, whatever, right?
Starting point is 00:02:14 Whatever the web hook's triggering. Yeah. So you need a public thing. So with InGrocken, Rat Hole and other tools, what you can do is you can say, create me based on this domain, basically an SSH tunnel or something to that equivalent that goes back into my machine so that then you can share that URL and basically say I want that port to map over to my web app and you can like literally run pie charm instead of break point go to the external service make it do a thing and then boom you're debugging through
Starting point is 00:02:46 and you're checking it out right it's really really nice so inkrock is great but people may have noticed I'm on this self-hosting rattle itself if you will so I don't know There's just something about NGROC. They've changed their services a bunch, and I'm not super psyched about it. So I'm like, well, what else is out there? And Chat and I had a little conversation about it. And we decided that this is one of the really nice high parity features,
Starting point is 00:03:10 also written in Rust, more high performance than some of the other ones like FRP and InGroc, it calls out. Okay. So what I did is I set this up onto my machine, onto my server, the same one runs Python Bites, and just said, they just run in the background. And I've set up the certificates so that I can just type RAT hole with a port number. You know, on my terminal, I just open to say Ratt Hole like 3,000, or let's say Ratt Hole 5,000. And then I have a port map, URL map automatically over to, like, say, any Flask app that I run. How cool is that?
Starting point is 00:03:47 And it's completely self-hosted. And here's the thing. You might think, oh, self-hosted all the stuff you got to deal with. It's a single Rust binary that runs in Docker. And let me see. I'll give you up to the date stats if I can find them if it's not going to take too long. The last time I checked, it was about three megabytes of memory usage. What is, what is the rat hole doing right now?
Starting point is 00:04:08 Oh my God, the rat hole is out of control. It's up to 11 megabytes of memory usage. On a 16 gigabyte machine, I think it's going to be okay. Isn't that cool, though? So it's just got like a Docker container that I didn't even have to do any Docker stuff. I just set up like a little composed file to map all the settings over so that I I don't have to deal with, like, passing them every time I run it, you know, and just set it up as an auto start damon.
Starting point is 00:04:33 But yeah, you just set that up and off it goes. Cool. Now, so when you're not using it, do you turn it off, or is it just always sort of running? If it took a lot of memory or resources or something, I would turn it off, but it's 11 megabytes. Okay. And so it's really, it really, like, let me give you a sense of, like, other stuff that's running on the server. So right now we have MongoDB, which is using 1.3 gigabytes. We have Talk Python, which is using 927 megabytes, so a gigabyte.
Starting point is 00:05:08 What's Python bytes is running at 590 megabytes. So, you know, like 11 out of these is like it doesn't even show up on the radar, right? Like you couldn't even notice if it's running or not. And so because of that, no, I just leave it running. Okay. And then like, but on your, okay, so it's running something on your server. something on your laptop also or there's yeah so there's a command that you can run locally and i think i i don't have it set up on my streaming computer i have it on my dev one so
Starting point is 00:05:36 i can't look at it real quick but i'm pretty sure i just set it up to run the docker image okay just sharing ports in the right way so i just do a docker run command to say share that port to this port when i when i do the map command and so i don't even really have it installed but yeah It's just a super small binary that runs. Okay. This sounds really neat. I like it. Yeah, it's a tiny bit of a pain to set up, but it's not too bad.
Starting point is 00:06:01 All right. Yeah. Well, I want to shift gears completely. I guess something that, something else that sometimes is a pain, maybe. I'm trying to do a transition here. Let's talk about pre-commit. So we have, we, I know we've talked about pre-commit, but I don't think we've brought it up lately. And one of the, one of the things is I used to use it a ton, and then I'm,
Starting point is 00:06:22 moved a lot of my tooling to CI and don't run it as much anymore. However, I'm going back to using it a lot. So pre-commit, just as a reminder, it's a tool. Well, there's this notion of pre-commit, which is a pre-commit hook for Git so that you, whenever you commit something, you can assign pre-commit hooks. There's a project called pre-commit, which is something that's written in Python, but it allows you to easily set up a whole bunch of these, a whole bunch of these pre-commit GitHub hooks. So Python Project and the hook thing. Okay, so why am I bringing the,
Starting point is 00:07:03 and you can do things like hook up linters and you can run tests and stuff, but I don't, I generally don't do that as a pre-commit hook. I'll do, you know, linters and other stuff like that. Yeah, I don't think I would ever set up tests as a pre-commit hook. Because whatever you want to, I mean, I guess you'd say, disable the hooks to check in the fix for the hook and it's yeah and they're slow and there's just a lot to it but yeah I agree with the stuff you're okay yeah so one of the things is pre-commit doesn't doesn't by default have a have a official way to use UV
Starting point is 00:07:37 it doesn't natively support UV and I like a lot of people are using UV to install stuff because it's just so fast instead of PIP install I do a UV PIP install so So what we're talking about is an article from Adam Johnson talking about pre-commit, install with UV. And as he puts it, the installation guide for pre-commit isn't obvious. It's not terrible, but it's not obvious how to get things set up. But he's recommending using UV tool install pre-commit with pre-commit UV. So this is another project called pre-commit-UV. And this is a couple things.
Starting point is 00:08:19 is both an extra thing for pre-commit, but yeah, I guess that's it. It's a plug-in for pre-commit. So what you're getting with this is you're installed, if you do UV tool install, you're installing pre-commit with UV, but then you're also all the extra things. So these extra tools, like hooks for linters and all this sort of stuff, that gets installed with pre-commit with PIP normally, but this extra pre-commit will allow it so that all of your tools are installed, if they're Python-based tools, get installed with UV as well. So essentially just speeding up this whole tool chain. And if you're switching around
Starting point is 00:08:59 with a bunch of projects, it makes sense to be able to update that stuff quickly and install it quickly. So there we go. I love it. UV, UV for the win. I'm actually talking with Charlie Marsh tomorrow, but talking about PYX, the server side equivalent of UV. So that's cool. I'll be looking forward to listening. of that one. Another thing that is pretty awesome is our sponsor DigitalOcean. Absolutely. Let me tell you about DigitalOcean.
Starting point is 00:09:30 Definitely a big fan of theirs. And this episode is brought to you by DigitalOcean. They're a comprehensive cloud infrastructure service that's simple to spin up even for the most complex workload. And it's a way better value than most cloud providers. If you're using AWS, because everyone uses AWS, you might seriously consider using DigitalOcean. It will save you so much money. And you don't get to you're in the headlights.
Starting point is 00:09:57 There's 300 services. How do I put them together? It's nice and simple and powerful. So at Digitalition, companies can save up to 30% off their cloud bill. Digitalition boasts 99.99% uptime SLA is an industry leading pricing on bandwidth. with it's built on the cloud backbone of it's built to be the cloud backbone of the businesses small and large and GPU powered virtual machines are available plus storage database networking capabilities all in one platform so if you're doing AI AI developers can confidently create apps use that their user is going to love devs have access to a complete set of infrastructure tools that they need for both training and inference so that they can build anything they dream up digital ocean provides full service cloud infrastructure that that's simple to use, reliable, no matter what the use case, scalable to any size business, and affordable on a budget. What is affordable mean? VM start at $4 a month. $4. This might be
Starting point is 00:10:56 relevant to my next topic, actually, Brian. And GPUs start under a dollar an hour. So you can easily spin up infrastructure built to simplify even the most intense business demands. That's DigitalOusion. If you're going to join, please use DO4 bytes, DO the number for bytes and get a $200 in free credit to get started. That code is in our show notes. You can definitely check it out there. DigitalOcean is the cloud that's got you covered. Please use our link with the offer.
Starting point is 00:11:27 You'll find it in the podcast player show notes. It's a clickable chapter URL as you're hearing the segment. And it's at the top of the episode page at Pythonbytes.fm. Thank you to DigitalOcean for supporting Python bytes. Love it. Definitely love it. Also, I love that Python 3.14 is going to come out here pretty soon. I guess soon in the relative sense.
Starting point is 00:11:52 We have a couple months left, I guess. It's almost Christmas for Python. Python Christmas. So I can't remember the timing. We've done this a few years in a row on the yearly, but I still don't remember. But anyway, I'm already starting to use 3.14, and I'm excited about it. But one of the new things that's coming up with Python, with the new one version, is Funk Tools placeholder.
Starting point is 00:12:17 And honestly, I saw something about it, and I was like, huh? And so let's go look at it. Is this when you just, I don't really want to write a function? I'll just put the little Funk Tools placeholder on it. No. I thought it as kind of a stand-in for the dot, dot, dot, dot, or past or whatever, when you just write a function. And then I read it more, and I'm like, oh, no.
Starting point is 00:12:38 This is something else. Tell us about it. So I am a fan of Funk Tools partial. And again, it's a little obscure. So a little rabbit hole or rat hole here. So partial is a cool way to create a new function by partially binding some parameters of another function. So you've got, let's say we've got a function that takes like six parameters and you
Starting point is 00:13:03 want to have everybody use it but fill in the same thing for the four of the parameters. You can fill those in with partial and return a function that only takes two parameters. And then the users of your API can use a cleaner interface with just a couple. Now, it's so cool. However, it's got some limitations that sometimes positional parameters, it works great for keywords, but for positional parameters, that's hard to decide which one to fill it in. So it doesn't work on all functions. Enter placeholder.
Starting point is 00:13:34 So placeholder is the ability to just say, this is where I want it to go. And if I've got a partial that, like if I want to pass print, like bind the print function, I want the first two, I want the first two to be placeholdered and I want the last one to be world so that I can pass in, hello dear, and have that come out. Okay, that seems a little trivial. So I was still trying to get a good example. And the good example came from Rodrigo from MathsP.com. And his example, which is perfect, is to remove punctuation with a function.
Starting point is 00:14:13 And he's got a little example. I've got his blue sky post to use placeholder and partial to use translate and make trans to fill in this partial thing to create a partial function that removes punctuation. And then you just have a function that you say, hey remove the punctuation from hello world and it takes out the comma and the exclamation point something like that is great because this whole removing punctuation thing that comes up or removing you know uh i've got i'm i'm doing markdown um episodes uh for my podcast i'm converting to markdown but the um hugo doesn't like colons in your title so you got to remove the colon's that sort of thing
Starting point is 00:14:54 this is great and then he also has a um an article to go with it how to use funk tools placeholder where he kind of walks through basically what I just talked about is partial is great, but it doesn't always work. So placeholder comes to the rescue. So awesome right up about the new placeholder functionality. So thanks, Rodrigo. Interesting. Yeah. Thanks to help me understand that a little better. I don't use functionals dot partial really very much. So placeholder, which enhances that, doesn't give me a lot of clarity on it. Oh, I use it a lot. I mean, like not a lot, but there's a lot of times where a built-in function does almost everything I need, except for that I need to
Starting point is 00:15:33 pass in a bunch of reset stuff, and I want to expose that as an API. And you can wrap it, but you can also just do a partial. It's cool. Yeah. All right. All right. This was going to be a little extra. Just a tiny thing I threw at the end. Okay. And then it grew, and it grew, and it became more and more. So let me... So here's the headline. I converted the other night 160 old blog posts from WordPress.com to Hugo using AI in a couple of hours. Oh, okay, good. Okay. And this is something that has been absolutely driving me nuts for years. I've had all these posts over on blog.m. Michael C. Kennedy.net, which is the domain I happen to be able to get at the time. and they were on WordPress with this custom theme and so on and I just I was just done with
Starting point is 00:16:25 WordPress it just every time I went there it was just an like an antidote against writing like I just don't want to write here like why am I doing like I would much rather write markdown and just have simple and clean code like my current website we've talked a lot about using Hugo like use Hugo I use Hugo my mkennedy.com site is Hugo right but how do I get stuff from wordpress.com over to Hugo. Well, guess what? There's an export feature in WordPress. Yeah. If you have the paid WordPress account, which is what you need to have your own domain and not your username. WordPress.com, there's different tiers. Well, you have to pay the $200 version to get the export feature turned on. What? Yes. That's like multiple levels up. I'm like,
Starting point is 00:17:11 oh, these guys are holding my stuff hostage. Screw them. I'm just going to just put my last blog post over there was we've moved to this place please join me there you know what I mean yeah I'm like but then I got a renewal for 50 bucks or 48 bucks I'm like I really don't want to just keep paying for the rest of my life $48 to this thing you know so I'm like but it's just too much work to move it over right without an export I could have paid that as well but then I'd still have to migrate it from html and WordPress export format to to mark down so I'm like I don't really but then I'm like you know what let me just fire up cursor and just say cursor over there I want this stuff I want it over here into Hugo and I showed it my like opened the Hugo page in cursor or the Hugo site in cursor and I said
Starting point is 00:17:54 here's the URL go get it and said I'm on it and within like five minutes it had all the post move over I'm like this is amazing but it only it based it off the RSS feed which is totally reasonable but the the WordPress site limits the amount of content in the RSS feed to 50 not all my posts I'm like oh where are you they rats I got some of them but not all of them and so then I just said hey go back after it and give me you just start scraping the thing right and so it just started web scraping the other pieces I told it to download all the images all those kind of things and it it did it it took a couple iterations like it downloaded the comments I'm like no I don't want the comments
Starting point is 00:18:36 I'm sorry I should have told you no comments but eventually it took it out and so now if you go to post I've got like 200 posts over here going back To 2006, but like, here, let me see if I can find, um, find one like this. Let's just do something that I'll call this. This, this is definitely going to come up. Let's search, let's search this. Okay. And I also put the domain.
Starting point is 00:18:58 I put the URL path. So normally for all my real, my real posts, I wrote on Hugo, they're like slash post, slash whatever, but I put all the archived ones in slash post slash r slash whatever so that I can just look at, oh, that's an archive post, for whatever reason. Okay. But if we go over here and search, you can see somewhere in here. I'm sure that, oh, maybe it's, if I search for that and Kenny, oh, gosh, that's really bad.
Starting point is 00:19:24 I'm about to search for something else. But if I find one of these, you'll see that, oh, this one's definitely going to come up shortly. This is, there's no way that I can't remember why I wrote this article. It doesn't really matter. There we go. So notice, it's a blog, michaeliccanadnet, 2,11, 19, you know, the date. This is like WordPress style and then the name.
Starting point is 00:19:45 But if I hit it, boom, instantly mapped over. So I'm all even gave people in the show notes the engine X configuration to rewrite all of those things. So now I'm just hosting my old domain and I just have a really complicated regular expression route match that then pulls off that little last piece and then sticks it on slash post slash R slash slug. Okay. A little different little type. I went with a little different technique, but okay. Yeah, okay. I'm interested to hear what you did, but I got these all over there.
Starting point is 00:20:18 They're all integrated into the search engine. So like you hit Newgetter, whatever, boom, get all these old things. I really don't care super tons about, but, you know, I wrote it. I don't want it to go away, right? So a couple other noteworthy things, like I did not put this in. Let me pull this up for us. There's an article in Ars Technica that just came out. This is one of the things that got me going just like a couple days ago.
Starting point is 00:20:42 It says blogging service TypePad is shutting down, taking all content from all users, from all time away with it. What? Wow. It's like, ah. There were a bunch of artists that I followed that used TypePad for a long time. Yeah. And that's, this is not good, is it? If that was you.
Starting point is 00:21:01 And so this points out, like, if you don't have your own domain, like, if I was, I don't really remember what my username was, mKennedy.wordpress.com. I don't think that's what it was. whatever it is, if that's what your domain was, your content is gone and you have no choice whatsoever if the server shuts down forever, right? Because you can't remap that domain. You don't own WordPress.com or typpad.com. Right.
Starting point is 00:21:24 And I'm just, you know, looking around. There's some other places that might want to, oh, hold on, that didn't copy. There are some other places that might want to take that to heart, for example, the PSF. BlogSpot. I know. Blogspot, really? It's pifound.blogspot.com.
Starting point is 00:21:40 I know we have some people who are full-time employees making an amazing impact at the PSF. We have Luca Schenlinga, developer in residence, South Michael Larson, Mike Fiedler. There's an opportunity for somebody to go, let's get our own custom domain here and just leave it on BlogSpot. But if for some reason, blog spot shuts down, just like TypePad did, it's going to be quite the bad time. So, anyway, yeah, what else I have to add to this? um nothing i don't have anything of that i just think if you feel like your stuff has been out there trapped and been hostage you can not only get it out but you can really carefully decide like i want it to appear my new set up exactly like this like i want it under slash r for archived and also if you go to
Starting point is 00:22:28 my rSS feed the older posts don't show up in rs but the newer ones do because i don't want people just go whoa where to 160 new posts come from and why are they 10 years old you know what i mean so I think there's a lot of flexibility here and, you know, it used to be like it was not worth it, but if you just fire up an agentic AI and let it go on it, like it might be worth it because it's not, I think I wrote down on the nose. It took me three to four hours to do this. And to me that felt like, okay, I've, I've, my content has been held hostage by WordPress.com. And I finally, you know, I sent in like SEAL Team 6 and we got it out without actually paying the ransom. It's sort of, it's kind of how I feel about it. Anyway, what did you do for years?
Starting point is 00:23:09 because you moved yours around as well, right? Yeah. So I, let me, I'll pop over and show you, are we into extras now? I guess we'll just do extra. We are into extras. I'm done with this topic anyway. How's that?
Starting point is 00:23:22 Okay. Well, I'll show you at least this little bit. So over at PythonTest.com, so not that one, I have a, under the extras, I got test and code archive. So I took, I did an archive of all of, all of testing code 200 and missing episode one so it's 237 episodes off by one error I kind of like that anyway so in each of these is of course there it's a markdown file and the how to how to get all this so this is this is like the same similar
Starting point is 00:23:59 URL if I work the the old testing code is still up and if I go to to that episode that so long it's saying episodes so long and thanks for all the fish. That's there. And then over at the archive, it's this sort of, sort of the same URL for that episodes. But if I want to redirect it, like if somebody just types in 237 or 238, that's supposed to work also. So I've got, I've got it set up to do that. I think 230, 238 works. And also, even if they just go to the top level of that, I think that works. And that's done with aliases. So I didn't do it. I did it with Markdown or Hugo aliases. I didn't do it with something else. So, and then eventually, probably next week,
Starting point is 00:24:52 I'm going to redirect the top level testing code to the archive page. This, yeah, what are the archive page? This top level Python test.com slash testing code. So that's how, and then anything after that'll just redirect to wherever so that's how i'm doing that yeah that's really cool i didn't do the people thing um yet and i don't know if i will so so uh i had like all of the different people had their own little page um but there's not much there uh other than social links and stuff so i might i might just yeah do that so anyway yeah that's thought it worked um but i i also had i almost had it working but i had hard time finding all of these original links because my uh the feed xml that i downloaded was incorrect and i i popped open uh what uh copilot with using
Starting point is 00:25:47 claude sonnet for something like that and and said hey um um i'm trying to import this can i get you write a python script to to grab all the links and and it it said oh i'm trying to but the the feed it, the, the XML is corrupted. And, and then, but it, it, like, worked around it and did it anyway with, like, just, like, parsing the file, which was kind of ugly, but I'm like, hey, I just need to get this done like five minutes. So, yeah, you don't ever need to keep that code once it's done, it's done. Yeah.
Starting point is 00:26:21 A lot of people will say things like, oh, I can't believe you would use AI for this. You know, those things make up stuff and whatever. And it's like, when it wrote the program, it's either going to migrate it over, successfully or not you can look at the article and see is the content there and is it all out of whack or is it look fine and if it's fine who cares there's no tech debt there's none of that because i'm never going to run that again i literally map the remap the dns and it's gone i deleted my paid account and it's gone yeah and i and i needed to update like 237 markdown files and i just i'm probably gonna if i have to make modifications to them later i'll do it one off like i'll just do
Starting point is 00:27:00 a search and replace for everything, and which that's what I did also. So I had these, like, link to the episode archive and also the feed URL. I'm like, oh, I should I added those in. Well, I just did a search and replaced in all the files and did that. I didn't ask Claude to do that for me. But so there's all sorts of fun stuff. And thanks to DigitalOcean, the new episodes are hosted, sorry about that. The new episodes are hosted on DigitalOcean Spaces. Oh, is that where you put them? Yeah. I have a ton of stuff hosted on DigitalOcean Spaces. And anytime you see something like Blobs.
Starting point is 00:27:34 Dot Python Byte's out of him, that's DigitalOcean Spaces as well. So that's, that went down from like, what, $20 a month, which isn't terrible that I was paying before, down to a whopping $5 a month with DigitalOcean Spaces. So that's great. And you have the freedom. Now it's in Hugo. You can do whatever you want.
Starting point is 00:27:52 Exactly. All right. So that was one of my extras was, hey, the testing code is finally archived over. Yeah, I'm glad you had decided to keep that around. That's a ton of work, and having that around for historical reasons is good. And I probably am going to do to get off transistor altogether, Python People. I got to do Python People.fm, but I don't remember how many. Oops, Python people.
Starting point is 00:28:16 It's like, what, 15, 14 episodes. I could do that by hand if I had to. So that's not going to be bad. Okay, the other extra that I wanted to talk about was just a really fun thing that Seth Larson brought up. So Seth Larson put a post up for SMS URLs. And he said, did you know that you can like like the mail to URL? You can do SMS. And if I'm not going to click on this because it won't do anything. I'm like, I'm like a laptop, I don't think. Also the Hollywood. No. Yeah. But if you do it on your phone, it'll just it'll open up an SMS like a it'll
Starting point is 00:28:54 open up your SMS app, your text messaging app and fill it in with Hello World, which is cool. So this whole fill in thing, why is this neat? Well, so it's fun anyway. It's just fun for one, but also, wouldn't it be cool if you could just type in? One of the things you can do with URLs is you can create QR codes. So Seth also wrote this draft and SMS message from any keyboard, computer keyboard, because you can just go to a computer and type stuff. in here and it generates a QR code and the fun thing is as you're typing the QR changes because that is wild I love it yeah watch this so if you take like a bunch of Loram Ipsum and drop it in there you get like this oh look at that dance QR code oh gosh you need a high-res print out of that
Starting point is 00:29:48 yeah but then so what you do is you just point your so you don't even have to have SMS you could anywhere. You can be at a work computer and even just type this in. It doesn't save it anywhere. And then you just snap the QR code with your phone and it opens up your text messages. So it's pretty fun. I just thought that was neat. Also, I still use Laura Mipsum all the time. So shout out to laura Mipsum.com. Yeah. I prefer the hipster Ipsum. Have you seen it? Oh, I don't know. Hipsterips and me. Yeah, hit it.
Starting point is 00:30:27 Give that a little bit of a read. Oh, yeah. I'm baby post-ironic green juice cornhole, normcore, actually. Airloom beard, quinoa, cronut. Put a bird on it, mutt, but, put a bird on it, man. Oh, this is good. Yeah. Off to do this.
Starting point is 00:30:45 I don't know. I just get tired of looking at Laurenips him all the time. I'm like, ah, let's just throw some cupping kinfolk. Butcher, next level, plus one waistcoat. Venmo, same franzin, microdosing, cred. Farm to table, microdosing. Vaporware. Yeah, this is good.
Starting point is 00:31:06 It's pretty good, yeah. But same basic ideas, Lora Mipson. Eight bit, literally. Yeah, nice. All right. You got any more extras, or is that? No, that's my extras. But we've got one big extra, right?
Starting point is 00:31:17 Oh, yeah. We do. This is the big one. So the Python, the documentary. an origin story is out and it's a one hour 24 minute highly produced very entertaining documentary with many friends of the show people have been on your other shows brian like your python people a lot of them are here right and yeah um you know same for talk python as well and i am really looking forward to watching this it came out a couple days ago and i'm like oh i could watch it but i actually
Starting point is 00:31:48 think what would be really fun i would love to just hear your first impression of this i think you think it would be fun to do a group watch through and set up some kind of chat, like a Discord chat or something. For whoever wants to watch it all together and hasn't seen it yet, I think that'd be kind of cool and just have like a chat going in parallel to watching it, something like that. So kind of like people do with keynotes every now and then and so on. So I don't know. I'm contemplating the logistics of that. If I can come up with a good idea on the next day or two, then I'll do that. Otherwise, I'll just watch it. Well, I mean, there was, when it first came out they did like a chat thing yeah it came out as a premiere i believe and you can see the chat
Starting point is 00:32:25 replay but like how many people who would want to watch this actually watched it during its premiere you know probably not that many yeah so i just got rid of my inflatable screen too we could have done it like a cul-de-sac or something oh you had one of those big oh that's awesome yeah during the pandemic we had like this what 20 foot 23-foot screen or something like that um so yeah that's actually a really good idea. We didn't have that. Well, you suck, I guess. I don't know. Actually, we have a covered outdoor area in the back now, and I ended up, long story, ended up with an extra 50-inch flat screen TV and bought it for my dad, and it turns out he didn't need it anymore. So I got it back. I'm like, what am going to do this? I'm like, we're sticking this outside. So we've got
Starting point is 00:33:07 a little, little area, but it's not a 20-foot screen. Like, that's the next level business right there. I don't remember how big it was. It was probably that. It was a big, big inflatable thing. It's bigger than a regular TV. That's awesome. Anyway, I recommend people watch this. We talked about the trailer when it came out, and it was really good, wasn't it? Yeah. So I was hoping to get this watched before we recorded.
Starting point is 00:33:28 Did you happen to watch any of this? No, I'm trying. I'm just like, I'm delaying it because I want to try to figure out something fun for a group. That'd be fun. Cool. Now I don't feel bad about not watching it yet. I watched like a few minutes, and I was like, oh, it's an hour and a half. I have to set her aside some time to do this.
Starting point is 00:33:43 Yeah. Yeah. And looking up, I think I think I've got like, you probably have all of these interviewed on your on talk python i think i've got half of the people shown on like the opening screen or yeah there's uh maybe eight or nine people i think almost everyone i think there's one person i don't necessarily recognize through the little didn't slice but yeah i would say other than that yeah everyone's been on the show it's cool cool well um cool can't wait to watch it all right are you ready to laugh yeah the hilarity ensue we'll see i can't
Starting point is 00:34:12 remember what i came oh yeah so this one this one is like a um A Jedi. Think, I want you just put you in the mindset before we get to it. Okay, Brian. Okay. You're on tattooing. You've been told of this Obi-1, Kenobi, who you must find. You know the old wizard man out past the canina. So it says, the joke is, it has Obi-1, Obi-1 Kenobi. And it says, when you read some incredibly bad code thinking, what moron wrote this? But halfway through it starts to become familiar. Well, of course I know him. He is me. Yeah. Do you know this Obi-1? Yes, of course I know him. Do you know the bad wizard who wrote the bad code? Of course I know. He is me.
Starting point is 00:34:55 Yeah. Actually, yeah, it's usually that. I really love it when it's not me, but it's usually me. You pull up, get blame because you're like, I'm going to, oh, no. Oh, no. Yeah. I really like that. Yeah, it's addictive, but I like have blame on every line turned on on VS code so that whatever,
Starting point is 00:35:15 whatever I'm working on, I'm like, who did this? Oh, yeah. Yeah. Yeah, it's kind of nice. It's kind of nice. But I'm, it's also just the last person that touched that line as well. So sometimes it's me, even though, even if I didn't write the logic. Right. It could be something so simple as you ran rough format and then committed the change. Yeah, exactly. Yeah. Yeah. Anyway, of course I know him. He is me. Of course I know. All right. Cool. Well, wonderful episode again. Thanks everybody for showing up and listening. We'll talk to you next week. Bye-bye.

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