If n is 82 I can write any code I want

Streamed

Merged PR #1320 to rewrite odd RSS feed design with XMLBuilder. Reviewed PR #1322 about clickbait guidelines; looking at moderated titles to define β€œclickbait”. Added caching for RSS feeds since they represent ~25% of site traffic. Implemented 120s TTL.

scratch


topics

  build fixes https://github.com/lobsters/lobsters/pull/1315
  Rails 7.2
    https://github.com/lobsters/lobsters/pull/1314
    https://github.com/lobsters/lobsters/pull/1316
  htmlentities https://github.com/lobsters/lobsters/pull/1320
  clickbait guideline https://github.com/lobsters/lobsters/pull/1322

https://v5.chriskrycho.com/essays/jj-init/
https://steveklabnik.github.io/jujutsu-tutorial/introduction/introduction.html
https://guides.rubyonrails.org/v7.2/7_2_release_notes.html

If you would like to pair on stream with me, email me.

https://github.com/ruby/rss
x compare golden master for stories
x compare golden master for comments
x validate stories
x validate comments
- test producing an rss feed with < in story title to confirm encoding
x copy HomeController#index rss caching over to comments

looking at clickbait mods:
  toning down universality ("Was X Bad" -> "Was X Bad For Us")
    programmers can't help but nitpick universal claims
  addressing the reader with secret knowledge ("the l
  implying the answer has changed ("top browser language in 2024" (still js))
  bringing the reader's competence into question ("you don't know X!?")
  hyperbolic claims ("absolute best X" or "hardest X quiz")
  really - I want to grab all of these and categorize them


title: if n is 82 I can write any code I want

post-stream:
  struggle with a ruby cli/readline bug
    

Transcripts are generated with whisperx, so they mistranscribe basically every username and technical term. They're OK but not great, advice appreciated.

Recording



04:33Hey, folks. So, sorry I missed you all on Monday. I was not doing so well. Not a bug or anything. Just every once in a while I get hit with insomnia. So I was up, I don't know, all but like three hours of the night. And I was like, you know, I didn't get a good nap in the middle of the day either. So it was kind of like, well, if I stream... It's just going to be me stumbling through adding bugs to lobsters for a couple hours, and while there is a certain kind of entertainment to that, that's not the kind of entertainment I want to be doing. So, this week there's a whole bunch of pull requests worth taking a look at. It's catching up on stuff that's been updated or added in the last two weeks. While I was deep on the What's the right way to put it on the content threading and other stuff? Oh, yeah. One of my post-stream tasks that's already over in my to-do list is to close out that excellent bug from DZWBDZ. Got it right on the first try. Where they found a whole bunch of bugs in that confidence code. I pushed that stuff up to GitHub earlier today. So if you're curious, you can check that out. I'll be running the migration a little bit later. But right now, I want to jump into these various things, which a whole bunch of them are from Byroot, who I really appreciate taking an interest in the codebase. It's been such a wonderful benefit of the stream is that a bunch of people are like, oh, wait a minute. If he can do it, I can contribute to the codebase. Yeah, so we had some false failures on the build where they were one of those where it's like you bump your dependencies or you bump some little thing and then all of a sudden you get odd failures. And this one was really frustrating because it didn't happen locally. So I suspect the build is running on a slightly different Ruby version than I happen to have. my computer or something. I'm really puzzled by these. So Ruby added these frozen strings to say, oh, if you mark this string as non-modifiable, which will eventually be the default, Ruby the VM gets to have a whole bunch of, I believe, memory improvements. That's odd that standard RB didn't automatically fix that. I wonder if I broke my editor integration that I would be able to. No, they're old. These are old. How strange. So let's take a look at that code as it is in the code base now.

07:54So that was spec, features, comments. Okay, I guess I already ran standard on this sometime in the last couple of days. Yeah, so it looks like this one got updated, this one got updated. All of these got caught at some point. I ran standard while I was doing other work, or I just ran it on its own.

08:25It's kind of funny. I actually expected that I wanted to pull up the code because it said there's no conflicts, and I would have thought that If they all got fixed I would have at least a conflict around this. That's strange. Let's go ahead and just say it.

09:09If Byroot is going to keep submitting a PR every couple of days, I'm going to have to review PRs a lot more often and not on stream. I'd like to give, well, faster feedback than two or three weeks. That's really an ideal on or more in the breach, though.

...33chamlis_ audio is intermittently choppy, by the way
So I haven't looked at the... pushcx oh no
chamlis_ curses!
update notes for rail 72 but i figured getting a audio is intermittently choppy oh no the intermittent audio issue that's okay Shamless, could you take a listen again, and did I solve it? I had the volume mixer open in the other window, which seems to be the thing that fixes it, but it didn't have its nice little bouncing line under the mic, so maybe somehow that process got disconnected. chamlis_ it was for maybe 15 seconds every 2 minutes
I guess what I'm asking is, do I sound normal now, these last couple of sentences? chamlis_ you're fine now
was for maybe 15 seconds every two minutes all right well keep your ear out and if it keeps happening you'll get to hear me cry on stream but i think especially with that suspicion that it's a buffer under run and that's really plausible for how having the mixer open i don't want to say solves it but prevents it I would really like that to stop being a running topic in these streams.

11:27So the thing Bayreuth was asking about here. I used Sorbet inside of Stripe, which developed Sorbet, and I think it's really quite nice. It is like capital E engineering because it solves so many problems you get in very large Ruby codebases, but then its design is very clearly affected by the fact that it's kind of backporting a deep, significant feature onto a language that was never designed to have types. And so its limitations are all pretty interesting. Even its error messages are interesting. I really, I mentioned here that I've thought about, it might be fun to add to the lobsters code base, but I have to admit that it would be fun and not a major win for the project because the code base is small enough that we don't get a ton of those type errors. I want to see what that conflict is. I didn't think I'd bumped any gems recently. The benefit inside Stripe was really significant. When you have, you know, millions of lines of code and you're communicating across, you know, this team of 20 is calling code from this other team of 20. No, GitHub, you don't want to highlight the difference. That would have been nice. All right. So this, it's funny that this change, which is again, that standard RV fix also didn't generate a conflict. I believe that's exactly how I fixed it, though. I just shoved it onto one line. Over the weekend, I was reading about Jujutsu, the alternate front end for Git, although it's really its own version control system that just sort of persists to Git, which is a very clever strategy, both for, you know, not immediately taking on the back end problems of or all the the problems of writing a whole back end for the version control system but then also the like market problem of git is ubiquitous and entrenched so how do you try and replace it and it's the exact same strategy git had with subversion where there was a it had a name it was like a port or a tunnel or something, but you could basically run Git on top of a Subversion repo. And I remember I used it that way for the first year or two I was using Git because I was at an employer that was standardized on Subversion and didn't want to think about it. Wow. It's funny. Most of this is the 13.18 stuff again. And then these defaults. And then a little bump to bundler. Honestly, I can just merge this straight down. I'd like to play with it locally because our testing, as has come up a couple of times on the stream, our testing is not 100%. It's good. I'm making it better. But it's not 100%.

15:21So let's So strange that it says the lock file is conflicting I would have expected all of those things from the other PR. What. This is very odd, I wonder if rails changed its dependency on longer. So over here if we pull up our. Gem file lock.

16:00frici I have not touched jj at all but also very intrigued by the idea, also morning πŸ‘‹
So yes, master does indeed have 161, but where did it come from? Oh, I did touch it recently, interesting. Ah, so this, how odd that by three weeks, we must've just crossed paths there. I added this gem to debug emails because we've had issues with deliverability. And then out of the box rails has a way of previewing emails, but it's basically a test thing rather than sending emails in dev and understanding. Yeah. Oh, Hey free sheet. Good morning. Yeah. If I had had less disrupted street sleep, I would have been tempted to play with JJ some more. It seems there was a, let me pull it up here.

17:04I want to say there was a oh, yeah, I have to spell it out. Man, who wrote that search engine? There was a one on one intro. And I want to say the. Oh, I remember the name it was. That's going to be close enough. Here we go.

...36It was a blog called Symathesy, but then they had an introduction to jujitsu. Maybe I didn't spell or misspell Symathesy close enough. You can tell I used Google back in the day when it actually searched for the things you typed in. Now, I'm not remembering the name of this.

18:07Is the tool not spelled this way? That's not useful. Let's see if I can get a... Ah, here we go. So this is it. I saw Steve Klabnik's introduction, and he linked to this one. This is the one I was thinking. Sympolymathese, not symathese. All right. frici it IS spelled that way but god help with current google and all the anime results LUL
So I'm slightly misremembering the wording. pushcx https://v5.chriskrycho.com/essa… https://steveklabnik.github.io/…
So let me throw both of these links into the chat to share. I haven't worked through Klabnik's tutorial yet. Yeah. Maybe. Hmm. so i read this introduction that he linked to and i got such a kick out of it i thought this was a great introduction i'm gonna grab it down to the scratch file too but basically here chris walks through what if well first off it's What if the Git UI wasn't incredibly painful to use and build a mental model around? Because I think a lot of us have the practice of, you know, there are the dozen Git commands you use most, and then you step one inch off of there and they're redragons. And I've gone deep enough into Git to understand like why checkout does two different jobs. And I, I really do appreciate that recent Git now has switch and restore to separate the two different jobs of Git checkout. I think that's an improvement. But lots of things like being in a detached head state, that's not a useful error message. And so right off the top, there's a... I guess what I really like about this blog post is it starts from... That idea of what if get had a friendlier ui and it's not about what if the error message was written better it's what if. The core concepts were arranged a little bit differently, so that it was just easier to learn and keeping your head and understand what the commands are to do and. reading through this i was really impressed by the way jujitsu stripped out the index and other concepts and changed the workflow around how committing works and i'm boy it'll be a big disruption to my my habits but it seems very lovely and i i really just admire the kind of design that goes so deep on something to rebuild it. I've had, I've had a wishlist project for 10 years now. I've got a couple of pages of notes somewhere of how to fix the get UI and make all of that a little bit easier to understand, but it was nothing as, as thorough and well, good as jujitsu is. And I only had an idea rather than, you know, actual working code.

21:57Why did I jump back from the build? Let's resolve this and merge this down. And I'm going to just take the newer version that I bumped or letter opener because I'm assuming letter opener cares. I never remember if the save button's at the bottom like a comment or the top like, oh, who are you? All right. Hmm. I am going to grab the Rails 7.2 side of this and just run bundle. I was thinking that as long as I'm doing the fun dangerous thing of updating Rails 7.2, it might be a good time to just kind of bump all of the dependencies except CommonMark, which needs some custom work because their API changed. This one. This button, commit merge, does not actually merge the PR. I understand why it's commit merge. It's because I'm sort of on a shadow branch. I say shadow because it's not really explicit in the UI that I have my own branch and I am merging from my branch into this, excuse me, into Byroot's branch. So like I understand technically why that says commit merge. But that's not the verb I think of myself as doing. The verb, I want that button to be labeled resolve conflicts or update PR. The merge to something that is going to merge is just a little odd. All right. So the lint passed.

23:49I'm not expecting this to blow up unless there's something really Actually, it would probably already have failed if I got that get file to wrong because, or the lock file too wrong, because it would have said, oh, I can't install the required gems or the dependencies aren't satisfied. And so the test wouldn't even start.

24:19Nice. Let's go ahead and.

...29and bring this down.

25:04I happen to know I don't think. Yeah. I don't think. I didn't name check it, but there is a open issue that I can go ahead and say was resolved.

26:00getting used to Slack and Discord that forcibly rewrite emojis. I would have preferred to put one in there. I try and be very upbeat and encouraging, especially to potential new contributors. So with that merged, let's pull that down locally. i'm going to have to bundle and then i'm probably also going to have to yeah get this bundle warning oh did i read that right that it automatically that must be an improvement to bundler older versions of bundler would say this first part of oh you're running 259 but it was made with 2511 And it would just tell you, like, I'm going to YOLO it with 259. You probably want to install 2511. I see that it is now just updated itself. That's kind of nice.

27:12frici that is a major improvement yes. excellent QoL
All right. Get that moved over. I expect it to be green, but... If I'm going to touch anything, I want to see the build pass locally. So we're going to look at green dots for a second. gmem_ I built my first RoR project over the last few months and I've been really enjoying all the QoL stuff
So the reason I pulled this down locally is we don't have anything like 100% test coverage. And I just want to click around a little. Oh, hey, GMEM, welcome to the chat. Yeah, one of the nice things about Rails, especially coming from, well, I mean, as an old, I came from PHP pre Laravel, pre any other framework. And there's just so many things in Rails where someone has had the problem you are having. And it's like, well, let's smooth that down. So what's the, there's a bundler command to ask and say, hey, how many of these packages can get updated? And I know we'll see common mark, but I just kind of wanted to eyeball these. All right, so yeah, common marker is the big one. I don't even know what some of these are. Like crack is some dependency of a dependency. And then the rest of these are all pretty small public suffix. Hmm. Might be a break and change. But that's, we don't directly depend on that. That's, it would be really nice if these were broken out into direct dependencies and indirect. the direct dependencies are the ones i'm skimming for to see does is it likely to to be a significant amount of work and the indirect dependencies i can just sort of trust that the gem creators have you know they bumped the dependency because they did the work to update and so i'm i have very low concern about those being a breaking change especially in a code base that's only this big what is this rails stats like 12 000 lines where are we at now 14 yeah so it counts 14 ish all right

30:06So if that works, I'm going to grab a local browser here. And off screen, I'm going to start the Rails server. It's just not worth dragging back on screen. You all have seen me start a Rails server before. All right. Good. So it loads. Honestly, you know, I almost want to search and be like, oh, that's one of the more complex things. But then also that's one of the best tested things because it's so darn complex. I don't know. This is just me being a little bit paranoid. I like to click around a little for Rails updates. I had an idea for this filtered tags page just the other day of it would be nice for logged in users if... When you load the filtered tags page, it looked back at stories you're flagging for the last year and said, hey, you're flagging a lot of stories that are tagged with, I don't know, comp sci. That's not a very popular one to filter out. Actually, it is reasonable. Or AI. This ranking has jumped up over the year. and just suggest, hey, if you're really not into AI code posts or comp sci posts, maybe you just want to filter them out. And then that might even carry over into the flagging UI of, you know, if you're flagging a lot of things about distributed systems as off topic, maybe you're just not into distributed systems and you want to pass on that. I don't know where the threshold would be for that, but I like that kind of feature that looks at what you are doing for patterns and tries to give people a reminder about more features of the site to use the software a little better? All right, well, if everything's going to load, I'm very happy. Let's go ahead and jump over to Beirut's other pull request about the Rails 7.2 defaults. It should only be merged once the oh he mentioned that. uses config load defaults doesn't think it's breaking anything well, maybe we won't merge this one we'll just take a look, because I would rather be cautious, so this bumps some stuff. I wonder, it might still have the. I'm not seeing Logger pop out at me here. And so I don't think it's going to also have that merge conflict. Here's this thing. I'm going to ask him to rebase.

33:43gsora_ sup gang
Actually, if it's not, it's not going to merge conflict there. Hey, GSora, welcome back.

34:16All right. So that's really nice. At some point I should put this on my, post stream notes. the, what is it? Upgrade guide.

...47Here we go. Release notes are what I was thinking of. pushcx https://guides.rubyonrails.org/…
As long as I pulled down the 7.2 change, and let me go ahead and share this in case anybody wants to click the link and follow along. It's always worth seeing what's new. There was a discussion in the issue i opened for seven seven two seven one where someone pointed out a very surprising change in in rails action controller where they were gonna start automatically blocking any browser they considered old which is such a i understand that basecamp has gone pretty hard into single page apps and making things fancy, but it's such a user hostile thing that it's going to make a site a lot less maintainable in production. A thing I saw a lot as a consultant is, obviously as a consultant, it was that folks would hire us to make a site, we'd use Rails, we'd deploy it. This is the way it works in a lot of places is you end up deploying a site and then leaving it alone for a couple of months. You know, the first month there's a bunch of hot fixes and other stuff as you kind of settle in. But then people don't kind of put the site on maintenance for a couple of months or even a couple of years if the website is not the primary thing the business does. And so if browser is enforcing that you have a current browser but the site hasn't updated its idea of current browser in six months in two years and you know it's it tries to be nice of oh any version after this one but i don't know it just seems like such a recipe for broken websites and I really like the idea of progressive enhancement on the web, and I try and lean pretty hard into it. As a for example, my blog has... Where is that? These are cute. frici feels like it wants to come from a good place but will bring only pain
If we go to one of the stream archive pages... I didn't write a summary for the last stream. But there's the recording, and there's a little resize button. And just as a bit of progressive enhancement, JavaScript adds this control. This control is not here for people who don't have JavaScript enabled or should the JavaScript hit an exception. dpk0 everything old is new again: back in the old days jwz complained that someone’s User-Agent blocker required Netscape version 2 point whatever, which the version he had, but it blocked him because it didn’t recognize the UA string for the Unix version of Netscape
I really dislike seeing dead non-interactive things on the page. And if you do progressive enhancement, you kind of get to avoid those for free. So DPK says, everything old is new again. Back in the old days, JWZ complained someone's user agent blocker required Netscape version 2.whatever, which the version he had, but blocked him because it didn't recognize the UIA string for the Unix version Netscape. Yeah. Yeah, there's that kind of thing. There's also, I believe it was Windows 9. When they went to Vista, there were a whole bunch of version checks in code that did... like lexiographic comparisons to the version number. I think I'm kind of hazily remembering something from 20 years ago. And so the, the version string of windows went from starting nine point something to 10 point something. And a bunch of things were like, oh, well one is less than nine. And if you do the naive string comparison there, you get it sorted out. And so. I don't think that actually drove renaming Windows 95 or Windows Vista or any of the other cute product names, but Microsoft has a special dedication to backwards compatibility, so I don't know how they handled that one.

39:14The more I see all this stuff about development containers, and I'm working on something that's going to be a Rails app that other people deploy themselves, and I think I'm going to get forced to learn Docker, at least the basics of it. I have heard that at the Rails World conference that's in just a week or two, the DHH show, there will be a Kamal 2 with a It sounded like a fairly different API, and so I'm trying to hold off on learning that. Kamal is Rails Docker integration for anybody who isn't familiar. Rails world, the first one had a lot of... I'm trying not to be too spicy here. DHH wasn't invited to keynote RailsConf, and so he was like, fine, I'll put on my own conference. And if you look at the first Rails world talks, a lot of it is vaporware. And so he announces... I forget, five or six big features in his keynote, but then if you look at the breakout talks that dive into those features, I think four out of five or five out of six of them are like, oh, we're working on this right now, and it'll be released in three months and six months, and it's okay. Yeah, this is the... the browser version guard thing that I don't like. So definitely won't be adding that. 3.1 is fine.

41:06manuelfcr I'm actually working on updating Solid Queue on an app I was working on and it's really quite much in beta πŸ˜“
Oh, speaking of DHH's choices, Justin Searls put in a bunch of legwork to say, hey, maybe Rails should come with a standardized linter. And obviously he's opinionated for the set of rules called standard rb that he's made but he had a whole talk about trying to get at what's good default and set up a good process for that and dhh was like well everyone is entitled to my opinion and then put his own in and it was a very BDFL prerogative. If you go look at the PR, there was not a lot of discussion or anything on that. So hi, Manuel, FCR, welcome. And you say you're updating Solid Q on an app and it's very much in beta. Yeah, I was. If you dig the Lobster's repo history, I started adding Sidekiq because we have a bunch of things like sending email that it would be nice to move to background jobs. Just nice in the sense of I like that pages have fewer dependencies and render in a tenth of a second instead of, yeah, if your MX server is slow, maybe your page takes three seconds to load. That's not how you want things to work. gmem_ Bleh, DHH, I dislike how he sometimes says things I agree with :p
And there's a bunch of stuff that happens on CronJob now that also could move into background jobs. And then Solid Queue was announced. And so I pulled Sidekick out after a minute. And then I looked at Solid Q for a minute and I was like, this just seems a little rough around the edges. So Manuel, if you have an opinion on the maturity level that Solid Q is at now, because I'm going back, I don't know, six months or more. And I know it's had a lot of active work. dpk0 when i was a nipper we used qmail-inject to send emails without blocking the application πŸ‘΅πŸ»
I'd be really curious to hear your opinion on where solid queue is at now. And if you're happy having it in production, we have very, very light usage, but yeah. When you were younger, you used QML inject to send emails without blocking the application. Yeah. Oh, QML. I remember deploying that a couple of times in the, early to mid-2000s. Speaking of opinionated software and everyone being entitled to the BDFL's opinion, that's thoughtful. That's a great improvement. This, we've already struggled through a bunch. For renting jobs, we're just talking about jobs. It's funny because manuelfcr Maturity is still quite a bit low. I started in 0.1.2 and it's now on 0.9 so it's on active development for sure. So far we had no issues in production actually, but the updates have been quite quarellsome so far. Basically They've haven't really set down the structure for the databases if I'm understanding the changes correctly
I'm a big fan of Mike Parham, the author who wrote Sidekick. I think he's, aside from writing just a wonderful queue system, because in the mid, early 2010s, you know, I implemented like four different queue dependencies with all of the rest of the Ruby ecosystem as we just kept trying to upgrade. And then Parham hit it out of the park with Sidekick. manuelfcr We have very low usage of jobs, hence trying out solid queue. The jobs themselves have always ran on time, it's mostly the updates
And as an entrepreneur, I'm really happy for him that Sidekiq Pro and Enterprise have done so well. And he's contributed back a lot to the Ruby community with the money he's made there. And so I'm a little sad to see ActiveJob and SolidQ get integrated and kind of Sherlock him. Is it better for Rails? I mean, if it worked as well as Sidekiq, it would be. I don't know. I have complicated feelings about Sherlocking. So Manuel says that maturity for Solid Q is quite a bit low. You started on 0.1.2 and it's now on 0.9. So it's on active development. You've had no issues in production, but the updates have been quarrelsome. Oh my. They haven't really set down the structure for the databases if you're understanding the changes correctly. You have low usage of jobs, hence trying out Solid Q. The jobs themselves always run on time. It's mostly the updates. Okay. gmem_ I looked at ActiveJob versus Sidekiq for my current project and opted for Sidekiq anyways, so theres that
Well, then maybe I want to be cautious and wait for Solid Q 1.0 to come out.

45:50And, yeah, G-Man, you say you compared ActiveJob and Sidekick, especially with the kinds of issues that Manuel has been seeing. And that's kind of the, I don't know, the hot gossip. You know, I just chat with other people. manuelfcr I would definitely wait, but so far it's working fine. The sherlocking is very sad yeah. Both Sidekiq and Goodjob were kind of railroaded
Who maintain things and I asked them how it's going and kind of the consensus is yeah maybe eventually active job, but for right now, especially in a commercial APP just straight to sidekick.

46:28that's this is a. common mistake with active job is to enqueue jobs from the inside of transaction causing them to potentially be picked and run by another process before the transaction is committed i don't understand how that foot gun exists because why would the job get persisted before the transaction finishes is active job not using the transaction like it's doing it in a background thread or something that's That feels like a foot gun with active job rather than a common mistake in use. That's very strange. So speaking of maturity levels of these dependencies. Yeah, I don't know if the Sherlocking is sad because I do think it's an improvement for Rails to have a background job system out of the box because almost every website needs one you know lobsters would be improved by having had one this last dozen years but i don't know maybe so i'm working on a a project of my own called Recheck that's going to have a pro version and I should hope it's so lucky that it gets to the point that I get annoyed at people Sherlocking it but if I can build up a significant capital I have a reasonable idea for trying to solve open source sustainability and Sherlocking of which the margin of this stream is too small to write down That's lovely. How about jmalloc?

48:32New design for Rails. Oh, hey. Look at that. How about jmalloc? OK. I understand why it's got to be in the Docker file. All right. But in any case, at least it's there. I hope it shows up in a guide about setting up production.

...56I've never heard of Puma Dev for developing multiple Rails applications locally.

49:16I don't understand what this does.

...23Does anybody know off the top of their head what Puma dev does? Does it run multiple Pumas with different Rails apps? But they're going to have to run on different ports? I'm not getting what the value of this is over just running Rails server. I mean, there's the auto start stuff, but... There are multiple local domains, I could see some tooling around that being convenient. Well, I'll put that in my back pocket for if I ever need it.

50:14All right. So so far, 72 looks pretty small and non-breaking, which is exactly what that PR implied. And I would assume that Oh, man. Remove Rails UJS in favor of Turbo. Maybe my least favorite thing about Rails is how every two and a half, three years, there's a whole new system for doing front-end stuff. I've heard nice things about Turbo. gmem_ That just sounds like the JS ecosystem tbh ;p
And I want to say it might even be supported by other web frameworks. In some fashion, I really haven't looked at it. Yeah, it's a GMM. frici πŸ‘†
I know that's kind of par for the course for JS, but even before Node, Rails was like rebuilding the front stuff. And I'm kind of including the asset pipeline in this. The whole... I think I have whined about this on stream before, but there was... I don't know, 10, 15 years of Rails development where every time I did a minor release, it included a change to how assets get bundled up and deployed and called from a view. And every time there would be some bug that only broke production. And I've made it this last year without any of those, which is very nice, but it was a long road there. And it's funny because the whole process of, well, we're going to take your assets, JavaScript and CSS, and we're going to maybe run a minifier or a compressor of some kind on them and run things together and maybe kick out what they called source maps for the JavaScript. It doesn't feel like a heck of a lot of code. And then, you know, make MD5 sums or SHA1s to identify files. Like it doesn't feel like a heck of a lot of code. So I don't understand where the complexity is, but that's a me thing of I never dug into it. I just spent time mad about stuff that only failed in prod. I don't think we do any of these with connections. Yeah.

53:01manuelfcr Paperclip πŸ’€
active storage speaking of sherlocking active storage is kind of sherlocking a bunch of different gems that enabled like s3 uploading there was excuse me there was paperclip for a couple of years was the most popular i'm not sure what the current most popular is i gotta mute and cough a second i'm scratchy so yeah paperclip was the most popular for a long time and then something replaced it. I don't remember what I should probably know. I know somebody who runs kind of an image hosting service that is also a gem or maybe it's also a PHP library. So I do think it's an improvement to include something like active storage and especially now that there are so there's a open Yeah, here we go. I'm going to try to encourage somebody. If you would like a wonderful first issue to work on, here is a nice one. On Lobsters, you can have an avatar, and since the site was created, it's just been outsourced to Gravatar, which is a third-party service now owned by WordPress that hashes images, or I'm sorry, kind of takes a hash of somebody's email and then provides an image and then has a bunch of fixes for the kind of obvious privacy concerns you would think of right off the top for that. And all of it is there because actually taking uploaded images, especially when the site started in what, 2010, No, I'm sorry, 2012. I'm embarrassing myself. I should know that day cold, right? There was not a great library available for doing image processing, by which I mean things like, is the file the user just uploaded to me actually an image? Is it a reasonable size? Is it a reasonable dimensions? know other things that you would want to do there everybody used image magic for a minute excuse me gotta get a sip of water so last night i had a nice dinner and it came with wine pairings and so that's why i'm so darn scratchy today out late live and love you to loca So in the years since this opened, I don't know if Google started VIPs or adopted it, but libvips is now the standard answer for handling all of the issues with, or I'm sorry, not handling the issues, handling images in a fashion that's unlikely to have awful security holes. And Google is indeed quite nice for security-related code. I believe this is Google, right? I'm not talking out my butt.

56:57Maybe it's its own standalone project and I'm wrongly attributing it. Oh, no.

57:08Oh, it doesn't say Google anywhere on the readme. Yeah, I think I'm just wrong. Yeah, all right. So I apologize. I do not remember. Yeah, if Open Collective is... running sponsorship for it it's almost certainly not google so i'm just misremembering but my understanding is libvips is the thing everybody turns to so if you would like to have the fun of painting the fence it would be neat to use libvips and active storage to let people directly upload their own avatars to the site and that's just it would be nice to get away from having a third-party dependency, I'm fine continuing to support Gravatar or adding avatars from GitHub because, you know, almost everyone who uses the site has a GitHub account. Even if they have it under protest and all their repos live on some other forge, they still, it's just, you kind of have to have one. Years ago, gosh, five years ago, was a i can't remember if they opened an issue or a pull request but somebody wanted to use their avatar service which was set up as an alternative to libre avatar and it was the sketchiest thing with like free software vibes some of that language it might have been called like libre avatar something like that but then There was no indication who ran it or where funding came from or how it was structured. And that one was so odd. And so it was like, well, I can replace a third party dependency that's hassled through all of the privacy and scaling concerns and security concerns or replace one third party with another that just looks like some dudes. That seemed like a bad bet to me. Hmm, funny to see nothing notable in active model. I've experimented some with making immutable fields in active model elements, but I think at that point, it was so painful, especially with the way active record validations work, that I ended up just throwing all that code away. And I think at some point I need to sit down and play seriously with SQL and Ruby Object Mapper.

01:00:09text okay all right this is all pretty minor great so i'm probably not going to do it on stream because there's that slow commit or the slow migration to recalculate all the comment confidences and i want to just sit and watch and i think later today i'll be able to sit around and just watch that run But this is really nice. I think we're in a good shape to bump to 7.2. So this one, yeah, let's just finish going through. I didn't put this on the scratch. I'll put it on the scratch. But might as well go through the last of Beirut's many wonderful contributions is what I'm thinking. When. Maybe three weeks ago, a month ago when pirate came on the stream with pair programmed on the memory leak that turned out to be fragmentation. We noticed that there was a whole bunch of use of html entities and.

01:01:31One of the things I like about by root is that they bring a deep knowledge of Ruby and rails to a strong willingness to just get nerd sniped. And so this is one more where he has dug into what are we doing? frici I watched that as a vod, really insightful stream.
So with memory fragmentation, the reason the site was crashing after widget was deployed was we're allocating lots of small objects, and it breaks up the available memory, and so it can't allocate more and eventually crash. Oh, Friji, thanks for watching. I'm glad I had the VOD up on my archive page. And yeah, I really enjoyed that process. I think I would love to do more pairing on stream, and Twitch keeps giving me pop-ups about You can have other people, they have some cute name for it, but it's basically have a second streamer with you. And I think something like that on a regular basis would be neat. So I realize I'm, what, 62 minutes into this, but I'll put it in the scratch. I'll put it in the scratch of on stream. Okay.

01:03:02So especially if you want to open a PR to the code base or build through something, I would love to do more of that kind of pairing. I think that could be a lot of fun. And I am willing to shave the yak to get my OBS and any other setup working right. We use Discord, and we just fire it in by voice. But there's probably a reasonably nicer way with OBS or Twitch itself. But yeah, it was really nice to just go deep with an expert who could run up and down the stack. What even is this code? So he mentions that we use this HTML entities and I honestly have never noticed this call, so I don't know what it's trying to do. Why would we say raw and then say encode? Why not just print the title? Oh no, this is on... Yeah, why are we doing raw and then encode? That's really strange.

01:04:39Why are we not using the rails escaping? All right, let's take a look. There's not, you know, with only 14,000 lines and me having maintained it for, where am I at now? Seven years? There's not a lot of the code base I haven't touched. And so I'm kind of intrigued by what is this HTML entities that I don't know?

01:05:17Okay. It's a gem.

...27Did I add this gem? It's going to be embarrassing if I added this gem. I bumped it. Let's just go straight to TIG.

...43Come here. So what's the take blame. All right. So we've got HTML entities. It got bumped here then. Oh man. So deep cut, it was added before the site launched. And then TIG is limiting this view to the one file it started with. There's going to be more in this diff. What is that? If anybody uses TIG and remembers the way of removing the filter on it, I kind of jump around. in a unprincipled and inefficient way between tig and fugitive and vim and github for things like blame and i haven't ever quite decided to commit to one of them i guess that's really what i need to do Let's just come here. And then of course there's the, well, is there a jujitsu version of these? You have exceeded a second. I loaded two pages. Oh, it's I'm not logged in in this browser because trying to keep personal stuff off stream. And then. The search engine is like, Hey dude, slow your roll. So let me just try and go directly to that commit. There we go. So JCS added this.

01:08:12So I'm a little bit suspicious of this dependency entirely. There's a couple of places in the code base where I believe this was JCS's first Rails code base. And so there's a couple of places where he wasn't familiar with a Rails or a Ruby feature and reimplemented stuff. And it's possible that this one especially with a date that is a month before the site launched i wonder if maybe it's i wonder if maybe it's not needed at all so let's look up what does it do i i'm really puzzled by this this decimal argument that gets used in a couple places.

01:09:17Oh.

...25dpk0 not totally uninformed guess: since this is generating RSS and Atom, it could be avoiding using named HTML entities which don’t validate
Okay, so it's converting from, oh man, hasn't been touched in three years. I mean, well, it's the kind of thing that could be done, done.

...42dpk0 if ERB would generate those but using β€˜HtmlEncoder’ avoids them and uses numeric ones insteead
i'm i'm wondering if there's even a value to this especially even 12 years ago the world was pretty set on well just use utf-8 everywhere Oh, so DPK says, perhaps since it's for RSS and Atom, it could be avoiding using named HTML entries, which don't validate. That's fair. I could see that. And that called for decimal could be part of it. If ERB would generate those, but using HTML encoder avoids them and uses numeric instead. That's possible, but I'm wondering why encode at all? Because I believe RSS and Atom are both fine with, especially with things like this, just give it the Unicode code point for eAQ.

01:10:58dpk0 < and > need to be &lt; and &gt;
greater and less than sure. Oh, yeah. But then even if there's now see, this is a thing that I'm puzzled that

01:11:28I'm puzzled that Rails doesn't do this or have a feature for doing this.

...43dpk0 the Rails way to make an RSS feed is to use the XML builder like in the SO answer you’re looking at …
Or that, you know, when you use ERB in the context of generating XML, how old is this? Oh, yeah, okay. Very. The Rails way to make an RSS feed is to use the XML builder. dpk0 ERB to generate a RSS feed is very β€˜my first Rails codebase’ :D
Ah, okay. So like I said, it's possible that this is just a didn't know the Rails way.

01:12:23Okay, so we have, in the two major RSS feeds. And when I say two...

...37Pardon me.

...48All right, pardon me. I've got a nice glass of water here, but my throat is being difficult. These RSS feed generate all of the RSS on the site. Yeah. So there's really what you're seeing is one for stories and one for comments. Let's see what app model story is doing.

01:13:20It is

...29hmm so this description or story text when this one kind of has a convoluted call path but when you submit a story it tries to look up a title for the story and so when it comes back it's going to be possibly include these html entities and while i can almost justify rewriting this over to the builder format. Because it would drop that. Yeah. So now I get what it's doing with all this raw, but that actually really doesn't look safe. Well, because markdown description we control. Comments URL is just a URL. Hold on. Highlight. But story title, that's user input.

01:14:43Hmm. I guess it's safe, but I feel, I just feel real hinky about seeing a call to raw anywhere in the vicinity of user data.

01:15:02This one, though, is part of a fundamental site feature and we can't really drop it. So even if I wanted to take the risk of rewriting the RSS, which I'm not super enthusiastic about because this has come up many times, I'm very deliberate about not rewriting stuff.

...46The other one is if he's made this nice, global, it's her singleton, maybe it's fine. But the other, if the only thing meaningful that we're escaping is greater than and less than I would rather do that with a G sub than a dependency. It's the incoming one on story we can't really replace. And getting to drop the raws would feel really good.

01:16:47Hmm. Yeah, this seems... So DBK, you say ERB to generate RSS is a very MyFirstRails code base. Well, that's what I'm pretty sure it is because there are a couple of spots. The biggest one, I've cleaned up most of those where there's a better Rails idiom available or a better Ruby idiom available. I've slowly been tidying those up. The one that... manuelfcr You also have the official RSS gem from ruby, not sure if you've seen it
Well, there's two things left, and one of them is new. The new one is in the last year or two with, I think it was part of YGIP, the whole idea of object shapes. That really doesn't play well with how the code base kind of aggressively uses memoization and doesn't initialize them in the initializer. And I can't quite bring myself to... initialize all instance variables in the initializer. It just feels so redundant and un-Ruby-like. If anybody doesn't get what the shape thing is, I'm happy to explain what's happening there. But I saw somebody recently on Mastodon who had their own memoization thing. We also have the official RSS gem from Ruby. Not sure if you've seen it. You're saying...

01:18:26manuelfcr ruby/rss
manuelfcr https://github.com/ruby/rss
oh okay so we don't have an rss gem you're saying that ruby has as part of the standard library rss well it's in active development that's promising yeah thank you i'll pull this link over into the scratch notes for the archive and then Oh, I've used this gem before. It's been ages, but I recognize this API.

01:19:34And so I assume it handles HTML entities. Does this depend on the HTML entities, Jim?

...59No. I would guess then that it's handling it in ReaxML. What if I just search for like GT? Can't search if you're not logged in. GitHub. Ah, they have their own.

01:20:28This is the, you know, they wrote their own G sub version of it probably. Entity equals entities ref. Okay. So where's entity defined or I'm sorry, where is it called?

...55Text entity ref. Okay.

01:21:04Yeah, so I see how that handles it without adding a significant dependency.

...14And they've written this in a very general way so that they can plug it into attributes rather than just... What's the XML term for text appearing between brackets? Bodies? It can't be something nice like that. It's got to be like very mathematical sounding.

...42All right.

...50So let me bring this back. So this singleton, the thing that I know that Beirut doesn't, and I am happy with that 10, so if there's just the one thing I know that he doesn't, is we serve a ridiculous number of hits by RSS. A lot of people hit RSS feeds quite aggressively. And when I say aggressively, I mean. Several times a minute, and I don't mean to. Don't be spicy. And then I have seen bots that try and pull even more frequently than that. That was what prompted adding rack attack. But between people who grab RSS in a tight loop and just there being a lot of folks who have RSS feeds for the site, we serve, I don't know, maybe a quarter of our hits, excluding assets, but like a quarter of our hits to Rails are RSS feed. I'm kind of... Daniel Katz- guessing at that number but it's something in that neighborhood you know call it plus or minus 10 or 15%. Daniel Katz- Alright. Daniel Katz- So now, the question is, do we want to merge this.

01:23:35Daniel Katz- or. try and do something with these RSS feeds. I would rather not. I'm okay with a little editing of other people's PRs, but let me throw out five of your files and change gears. That's a little aggressive.

01:24:11Hmm. Let's go down there. So I'm going to merge this because it's a reasonable small change. I'm happy with it.

...40What was the name of that? So there's the RSS gem, right? What's the builder interface? I saw it flick by with Stack Overflow. But then I close that tab. Is that just called XML builder? I would like to name the dependency.

01:25:32dpk0 i think it’s just called xml builder yeah
Okay, thanks dpk for confirming.

...55dpk0 (sorry, it’s over 5 years since i’ve done Rails, so that might be slightly misremembered)
You know, even if it's wrong, it's right enough that people will be able to find it. So I'm fine with that.

01:26:05The mouse is running away when I'm typing, and it is not that I have a third hand. It's that the cat is on the desk, and he is sitting on the mouse. We'll see if he starts clicking things. He's not taking his usual spot up on the filing cabinet. I'm not sure if that's just he doesn't like that it's warmer up there because of the weather, or... If he changes gears, you know, with cats, their favorite spots change every so often. So hopefully he goes up there again. He was on stream. I don't know. Maybe the third stream. I put it in the summary. This call from the store was mandatory.

01:27:15It's funny because everything is encoded in some way. That's why I rewrote this like three times.

01:28:26Why is this failing? This is the spurious thing that's actually totally fine. It's still so weird to me that that randomly broke in master and I didn't think I touched the Ruby version or the gem file or The CI file, or so. Why did it suddenly break? Why only in prod? But the value of sorting that out is probably pretty low. Typo aside, that's not how I want to do it.

01:29:31Let's spend a minute playing with the RSS feeds.

...52gmem_ Yay RSS! My favourite :D
I don't know which is more popular, the RSS gem or the XML builder. They both look like basically the same code, manuelfcr Should the user rss feeds also be cached? I'm not sure how the cache hits are looking right now
to me you squint a little so one thing here is yeah so we have a routing test we have a smoke test i remember adding this one and then we have a little bit for the RSS tokens. If you are a logged in user, you can get a token for RSS that will honor those filters that we saw earlier on the stream. So, GMem, why are you a fan of RSS? And Manuel, should the user RSS feeds also be cached? I'm not sure how the cache hits are looking right now. There may be some caching. but we're not at the scale where that's a significant benefit. So I don't want that added complexity. Yeah, I'm happy with the reasonable rate limits that are in Rack Attack. And then generally, you factor your data well and you serve it well, and we serve pages fast enough that it's just not a problem. So I wanna, gmem_ I just generally love the platform agnostic nature of RSS, and one of my first proper open source contributions was to the gorilla/feeds library for golang rss feeds
Given that the tests are really thin here, I want to grab a golden master.

01:31:47All right, so I'm going to call this like ERB home RSS.

...56Oh yeah, wget is not curl. And then let's grab comments.

01:32:14Can't type today.

...24And let me try and keep the scratch over on its own tab. Let's go ahead and do that. I don't need two copies of this. Where's my brand new file?

...46Really can't type today. So I said Golden Master. So what I'm doing is because i don't have a great test harness around this or anything let me just grab the current one and if we port this over to xml builder or the rss gem and we get basically this out you know there is like a we have so many readers of rss feeds that there is a hundred percent chance of breaking things because You know, someone's going to have written a naive bot that doesn't parse and just looks for, oh, find me a line with 12 spaces on it, and the next thing is the description. Like, someone has written that bot. I'm okay with breaking somebody who does the regex approach to XML parsing. But the rest of it of, are we actually generating the same basic output? That would be enough for me. So then the question is,

01:33:57Come here. Do I want to grab the RSS gem or do this XML builder approach? And I'm guessing the XML builder is standard library because I mean, it's a 2013 answer, but they didn't even mention doing an import or anything. So if I look over at We'll do it right here. Is one of them already getting included? Not RSS.

01:34:44And not XML. So both of them would be additions.

...53Ah, so GMM says they generally love the platform-agnostic nature of RSS, and one of their first proper open-source contributions was to the Gorilla Feeds library for Golang RSS feeds. Oh, that's really great. That's a nice way to give back. Yeah, RSS feeds are... Honestly, they're probably why I'm the admin of Lobster now, because I have a RSS reader with... probably 400 feeds in it. And most of them are programming feeds and I kind of skim it. And when lobsters was getting started, I was coming back to it because I don't know. It just had a nice vibe and occasionally a good comment, but there were very few links. And then I was like, well, I read a ton. And so I just started submitting a dozen stories a day to the site. And that kind of went on for 18 months or so. And Calvin has taken over that mantle of power submitter. I don't think he submits quite that many, but he's definitely our most prolific submitter right now. And I think that was really good for the site in that people were coming back every day and saying, oh, you know, if I'm coming back every day to see these 10 or 15 new links, Other people are and so if I spend the time to write a comment someone will probably read it and it helped with that chicken and egg problem that every online community faces where nobody wants to contribute until other people contribute. Alright. So if chat does not have any strong opinions on. RSS first XML builder. I'm going to go ahead and use the RSS gem. I would expect that the, well, let's check real quick, but are they both official? Oh, builder is Jim Wyrick. Oh, those are some, is this the right XML builder?

01:37:13This cannot be the, XML builder, can it from, this is the same API.

...35Yeah. Maybe they're using no code Yuri. frici I deeply appreciate calvin for their regular apple event summaries LUL not the main thing they do but one I find extremely useful πŸ‘€
dpk0 https://www.lugolabs.com/articl…
dpk0 this is from 2015 but it’s the way i learned to do it …
Well, since I don't need arbitrary XML, and I wouldn't be shocked if there are little corner cases in RSS and Atom because they're simple and broadly done enough, that the standard in practice might slightly have diverged from the standard in writing. So I'm leaning towards the RSS gem. dpk0 (once again, πŸ‘΅πŸ»)
So says, I deeply appreciate Calvin for their regular event summaries. Not the main thing they do, but one I find extremely useful. dpk0 so i would probably guess the RSS gem is probably the β€˜modern’ way
Yeah, I just was really curious to read the summary of the last one that just happened, what, two weeks ago, where they were announcing a whole bunch of stuff in iOS 18. And what are they up to? Model 16 phones? There wasn't a mini in that lineup, so it was kind of a non-event to me, but it was really nice to be able to just read Calvin's summaries. And I enjoy the color that he puts in there, where he talks about the production of it a little, of like, now we're on top of the donut, now we're in the park, now we're in space. Whatever their funny background is, I get a kick out of those.

01:39:10Yeah, I'm going to go ahead and grab the RSS gem.

...30That's a mildly intimidating version number for something that's been continuously developed for a couple of years. I wonder what their plan is for hitting 1.0, or if they just don't feel that they've made any breaking changes. This is such a well-constrained problem that it's very possible the... Oh yeah, that's not going to fit. here we go what if we do this i'll nudge tell me if the font size is still okay yeah just try and fit enough because the the max resolution i can stream at is 1080p and i'm fine reading this because it's on a very big monitor but i don't know how it comes out for folks

01:40:40okay so let's go up to the home controller and how does it call yeah so it just uses format rss and then does a render yeah so we have this one if oh Well, I believe it was a Manuel to your question of, are they fetched here as a, or I'm sorry, are they cashed the non-user feeds, which are, I don't know, 10,000 times more popular than feeds with the user token are indeed cashed for two minutes.

01:41:40Alright, so I'm thinking, where do I want this chunk of code to live?

...53Maybe a helper?

01:42:17helper is the kitchen junk drawer of Rails. But it feels appropriate here, because we're going to end up having a story RSS and a comments RSS.

...35And they're going to take their object. That doesn't need to be a, what am I thinking?

...49all right so zeitwerk is going to handle that require for us let's just grab this drop this in all right format and then i'm gonna let's go ahead and close out that sample and we're just gonna go line by line and pull over the code from the ERB version and kind of make sure this matches so the feed author we even include that we have author on the individual things but not on the channel which honestly we might be violating the RSS spec, so I'm just going to call this lobsters for now. And then the channel updated. Is going to be the.

01:44:04You know, since I changed this from Adam and I know there are slight structural differences between Adam, let's see if it has an example of generating an atom feed. No, that's just a standards document. Do we have a doc link here somewhere? Sample.

...37manuelfcr I think it has a sample inside of the source code
I think it has a sample inside the source code. gmem_ just ran it through the w3 rss validator, looks like no author on the channel is fine
Yeah, I'm looking at these guys here.

...46These seem to be samples of parsing rather than producing. Oh, GMM, thanks for running it through the converter. gmem_ https://validator.w3.org/feed/c…
Can you, if it gives you a link, actually, can you just share a link to the converter real quick? gmem_ That's what I tend to poke
I'll pull that over here so that as I develop this, we can check on that real quick. Here we go. So they say make and then. See, as soon as I see one. More field, I'm like, all right, where's the list of all of these fields? Because I definitely want to be explicit about encoding. That says this wants to be 2.0 because that's kind of what we saw in the readme. So we'll see how this goes.

01:45:45And this is just me guessing.

01:46:01I guess about is optional too.

...09More room, more room.

...16So if author is optional, I want to put encoding first. And then I'm just kind of matching the ordering here. I have a description field. I have a link field. Then I'll have an atom link. That's odd. We're serving RSS, but then we're saying There's Adam, but then it's Adam at the exact same URL. Not sure what that's about. Maybe I wanna leave that off. I'll leave a note here.

01:47:00And then I guess updated is an addition, but that seems a pretty clear improvement.

...15Let me jump back. So I'm worried about the semantics of these fields. The URL to the HTML website corresponding to the channel, okay.

...38I'm gonna go ahead and just leave this kind of wrong link here because this is not to the corresponding HTML version, but we don't quite match the... Yeah. Well, because this is going to get used from a whole bunch of different things, it could say, like, well, request.originalURL if I want to pass that down, but then... generating URLs from random parts of rails is weirdly clunky and feeding that back into the request engine and getting a different format out. Yeah, that's just too much hassle. I'm just going to include it and be a little wrong.

01:48:53Is it? Let's do this style. And then.

01:49:21There is another encoding thing happening they're different from the one we have now i'm getting more suspicious of this code, as I read it there's just so much manual encoding and. One of those like rails instincts i've developed is if your manual encoding stuff you're probably doing it wrong because it's so hard to get all the levels of encoding right.

...52Is that valid? All right, let's standard. Be happy with that. So there's the title. And then description, we are going to use the title passed in okay link we talked about that update that's an addition atom link okay we don't have to have an about are there any other optional elements language i'm fine not specifying that managing editor okay

01:50:37This is one of those places where pubdate is not the name that Rails would choose. And I wonder if this update is wired to pubdate or what. We'll take a look at it. Last build date. Maybe that's updated. Yeah, so this reads a little nicer, but it doesn't compare against the spec nicer.

01:51:19TTL would be an improvement because we know if it's not a user feed that we're going to cache it for 120 seconds, and I am okay telling users 120 seconds. I don't know that any RSS reader actually uses that, but I'm fine grabbing it, right? GMAM, I did see your link to the validator. I'll grab it in a minute. Let me shove it off into another browser tab because otherwise the chat will scroll it away and I'll forget. Okay. Skip hours, skip days. Oh man, lobsters never sleeps. All right. So same thing for items.

01:52:18What is this maker items it's looping?

...27Shouldn't it be looping some collection? Or did it instantiate the maker with the items? Where did items come from?

...49So does this have a... Okay, Kat, thank you. Thank you, sir. It's just the README? No, is there not more? I'm not falling in love with this API.

01:53:21So where does maker items come from. We have the maker object has all these fields.

...38So we're in stand trading with make we get a maker.

...51item space.

01:54:01I guess let's jump back to the. Which over here, so stop clicking through. Let's jump back to the samples and hope that the.

...18One of these samples It's like a worked example. Was it convert that actually output one? So say feeds.each do the thing. It's not useful.

...59is so this is a block for each item but i don't see where rss items each so this is again consuming a feed I'm starting to think this is a false start. There's not a lot of docs here, and all the examples there are are oriented around consuming feeds rather than producing. And the code sample it gave just doesn't quite make sense.

01:55:49Didn't look at this one. It's a little frustrating that these don't even have a title up top of what they're attempting to demonstrate.

01:56:07So it's a blended feed, then it loops each feed and each feeds items. And then it sets up a maker.

...28This is a very strange API.

...52Yeah, I'm not. It's open here, podcast, namespace. So I'm kind of poking around here to see if anybody is talking about this because I cannot be the first person to be puzzled by this.

01:57:28Maker items, new item. Oh. Oh, OK, I get that the API. So rather than it being a collection, we want to. All right. So we want to do here is loop the stories. And then for each one, we want to invoke new item. and then the block will be shared. And I think that's fine. Yeah, so let's match the order. And I am just going to trust this to correctly encode, but let's put that as a no.

01:58:17So let's compare Golden Master for stories and for comments and then validate. Stories validate. Comments and then.

...54Right. So I'm just going to throw the story title in there and trust the gem to do the right thing, see how that works out, what are you mad about. i'm allowed to change the file. And the item link is.

01:59:19yeah and this this thing where the model knows how to generate URLs. Every Rails app I've worked on has had to generate URLs from models at some point or another. And it's not that the app is badly factored. It's just URLs are fundamental to the web. So URL generation cannot only happen in email and HTML templates. It has to be a more broadly accessible feature. I have sort of thought of making a Rails gem that just exposes routing as a global object in the same way that request is a global object in controllers? Because I think URLs are just so darn fundamental to the web that, yeah. All right, so how do we? I'm going to just guess there's an item GUID. Because this code is not much documented. Yeah, if I wanted to contribute to Ruby, I think a thing that's very tempting right this moment would be to write some docs for this gem, like a lot of docs.

02:01:08So test a maker, dummy channel, dummy item. So it grabs it, grabs the GUID, isPermanentLink. So then do I say item.GUID.isPermanentLink? no they have permanent underscore link really they have you read it with the spec name but you write it with that is not the api would have chosen i don't know if the the noise suppression filter on obs is cutting out my size but there have been a few of them because this is i don't know i'm not falling in love with this api And I don't think, well, we'll see if we have to do that again. All right. So I'm just going one to one down the sky. Now let's do author.

02:02:45Yeah, let's do this in a string.

02:03:25All right. And then I'm going to just guess that updated becomes pub date.

...37Yeah, now that I'm doing that again for. The third time. I'm wondering if I should just toss this and go to XML builder. Because I don't want to know things about the RSS and atom formats. But at the same time, my code would end up looking very similar and just directly name these things. And so it would be very easy to look back and forth between this spec and the code because all of it would match. Let's take a second and look at rubygems.org.

02:04:29So even if I'm here, builders, is this the? All right. This is how folks are generating XML. And it's had a release to this year, but then not for five. That's all right. I mean, XML is not a fast-moving standard, so that doesn't raise an eyebrow for me. Oh, hey. There's a familiar avatar. It's pushed by Byroot. And he's listed as an owner there. Oh, look, it's part of the Rails project rather than part of the Ruby project. They've taken over the Jim Wirex project.

02:05:38So let's look at these docs real quick. This is the read me again. Hey, look, automatically escaped attribute values. That's very familiar. I think I'm going to Just kind of stash this and take a run at XML builder. Yeah. The RSS gem not really having clear docs and not directly matching RSS just doesn't feel good. manuelfcr rss gem needs to cook a bit longer
I feel like I'm struggling here, so... RSS gem needs to cook longer? No, it's...

02:07:02I don't think it's a function of needing more work. I think it made some design choices that are not my design choices of, boy, I would like to fairly closely match the spec. And then it just, well, maybe the docs could cook longer. I'll give you that one. The docs are just so dang thin, and the samples are thin. So all right. So it also looks like, especially from This is now part of rails is that this integration is a little bit nicer so rather than G where am I putting my code it's. put it in a dot builder file and you get what you want.

02:08:18So i'm going to go ahead and. yank this and then.

...42oh rails story or stories in views it's always plural all right so i'm going to grab from copy and pasting from stack overflow because i'm a professional

02:09:23I should check this. Actually, the validator will probably scream at me about it. So I'm going to not check it more. And I like putting encoding up first above everything else. And then let's just start grabbing some of this code up.

...49Description is just the title. The link.

02:10:00And then it's not called updated now it's called I believe hub day. But now, with this process, I can just directly compare against the rss spec. If I can fit both on screen.

...22Like I like this more already. So you have title, link, description, title, match, and optional copyright. All right. So yeah, they have an example of a pub date down here. So we'll grab that for the feed, and we'll just say stories dot first updated at dot. And then this is down into the level of detail that the RSS gem was handling for us of what's the formatting. And that's the kind of fiddly thing I didn't want to have to deal with. But I don't know. Having a clear code sample and really matching the spec is just Satisfy picks. All right. And then we don't need any of those and let's go up to item.

02:11:54We're still doing the rails template conflict. With instance variables, that's fine ish. And then the title is going to be the story. That's gone. That's going to be the story title. I don't think we had a I guess description is mandatory. What do we do on this side? All right. There's enough items I want to just copy over directly and match that order. So and then I'll think about matching the spec instead. But then we go. So we got title and then link and So they have a good here, but I don't know how to set an attribute. Probably a next arg is a hash. I'm just going to guess that's it.

02:13:21And then author is a little complicated, so let's grab it.

...31Let's put it in the same place.

...38And then update will say.

...49oh that's interesting we use created at that's fine no need to churn on that then we have a comments link that can't be standard right i'll scroll down the the reference in a minute maybe we'll find out it is Okay, and then we have a lot of code in description, and then we have category stuff. Let me do category and come back, because it's a little simpler. So we're going to say xml.category. Yeah, singular, because it's not Rails, it's the spec.

02:14:50You don't see a lot of for loops in Rails.

...58Kind of want to just say stories about each do. It's just nicer. Or it's more idiomatic is what I want to say. So we'll do that here too.

02:15:26so in the category we have multiple i'm looping around we have multiple of these categories and each one is the all right so there's a little my first rails here of walking instead of just saying story dot tags so let's go ahead and say that That might hit a n plus one in a minute, but I would rather just directly loop. So there's that. So I've pulled in all of that. Let's format. Thank you. And then do description, which has So we pull for sure the markdown description. And then if there's a URL, we include a link at the end. Okay, well, that's straightforward enough. That's

02:17:06We're nesting a lot. Let's do this out of band.

...43It's a little funny to see the raw p tag and then use the helper for the next thing and then go back to using a raw p tag.

...57vinitkme hello, hello!
Not beautiful, but fine. And then that's the end of that. So let's plug that into the, oh, hey. Let's plug that in here, where the Stack Overflow answer just had it. Why do I keep closing that Stack Overflow link? And they just said, render that template with layout false. OK. So we'll say, render to string. vinitkme Have you ever dabbled in the Python ecosystem?
that template, which is Home Stories RSS Builder. And I will just trust Rails to sort out what that is.

02:19:00It might be enough. Let's ask curl.

...08Cool, we got an exception. Now we're going to be annoyed at Firefox because they removed their RSS reader. And so I want to pull this up in the browser so I can see these nice Rails error pages. And then as soon as I get this right and it serves valid XML, instead of showing a page, it's going to download the file.

...42It's mad about that false start. That was pretty cheap, so I'm just going to toss it. Respond to was called multiple times.

02:20:05Why was it called multiple times? Oh, what is this doing here?

...18And then this is actually up in the rescue. So we're throwing a missing. I'm not going to go over this rant on the stream again. Have I ever dabbled in the Python ecosystem? frici not sure i'd like firefox to be a full fledged rss reader on top, but being able to at least preview an rss feed ebfore i pass it to my reader to properly subscribe would be nice
If you ran it all together, I have been a professional Python developer for about six years of my career, including two where I inherited a Django codebase directly from Adrian Olivetti. He basically hired me to replace him at the Washington Post when he left to go start every block and then humorously what, three or four years later, he started EveryBlock with a grant from the Knight Foundation. And then as a term of that grant, they said that after a year or something, he had to open source it. And so he did by putting a license on it and making a zip and tossing it over the wall, because why would he want to run an open source project to contribute with this site? And so Knight ran another project to clean up the every block code base and make it a viable open source project. vinitkme Wow! We are in the company of someone elite. Do you have any views on Django vs Rails?
And I got hired on that a little bit for a contract. So I ended up inheriting two code bases from him.

02:21:43vinitkme I am been a Django developer for last 13 years.
We are in the company of someone elite. vinitkme *have
Oh, I haven't, I don't usually look at the list of folks in chat, but if you find the person who's elite, maybe Byroot has dropped by again. I'm just a guy who has inherited code bases. That doesn't make me elite. So Fritchie, yeah, I don't know that I want Firefox to be a full-fledged RSS reader, but I would like... You know, I would be happy if... When I loaded an XML document, I got just the plain text view of it as if I loaded a .txt document. Rather than default download, it just slapped it into the browser and let me deal with it. I don't know. I don't quite get the default to downloading XML. Maybe there is some deep profile setting I could do what I want. I never really thought about it because they used to have a fairly nice interactive view where you could like click little arrows to unfold the tree. vinitkme Rails intrigued me, but never enough to switch to it. Also, new Rails jobs are also significantly fewer these days.
And I think it had a search interface, but now that I look back on that, honestly, what I just want is just dump me the text on screen. espartapalma download the rss/xml work with the readers, but yeah is weird
So I don't have to switch over to curl and the very developer view. Yeah, Vinit, I can see how Rails is intriguing, but a big switch. I started with Rails and learned Django later. Having inherited a Django codebase from one of its developers specifically for the purpose of doing journalism nanerbag when did you start programming? Dont mean to get off-topic, just curious
made a whole lot of slightly odd choices in django make a lot of sense to me like there's just like yes there's an admin interface and it just sort of trusts you to do anything and there's always an escape hatch of pasting raw html around and that it fits journalism workflows very well and I'm commenting this out so I can see what's the actual template error here. Nannerbag, welcome again. And when did I start programming? You know, I don't think this is the kind of like tightly focused feed where you need to worry about running off topic. I started in 91 for real. my mom i was a kid my mom had sent me to like a summer camp where we did some logo and it didn't hook me and then a year or two later i saw somebody using hypercard another student in junior high and i was absolutely hooked stories rss stock builder so you are missing home stories rss builder search in app views rails are you doing something clever to me so we're missing my typoing stuff does anybody see the difference between home stories rss builder and in app views home stories dot no it's the same file name

02:25:37Is this one of those where Rails wants to be the one to append a format?

...50Oh, you know what this could be. I bet I know what this is. I slacked. nanerbag Both me and my oldest brother didnt even exist in 91
Over here I have the Rails server, and since I changed the way... I used to do this in... I used to use Tmux to do my multiplexing, and I had to ingrain the habit of any time I'm editing the gem file, don't edit it in Vim, go to the Rails server tab, kill the Rails server, edit the gem file, so that I'm never in this state where Rails was started with an old version of the gem file, so it doesn't have the builder Jim I'm still getting it all right we'll try the other thing too but.

02:26:53So yeah nanobag in the first stream somebody dropped by and said something about me using vim and you know they were surprised I wasn't using vs code. And I was like, well, I've been using Vim with an editing and building the same config file since I want to say 1996, 1997, somewhere in there. And they were like, your Vim RC is older than me. We kind of had a moment. And then home. And then it's stories.rss.builder.

02:27:50nanerbag Im having that same moment right now as well :)
frici I get that feeling often LUL "yes my editor is older than vscode, likely older than you too"
What if I just put the name in there without the home at the start? Yeah. A downside of Rails is it tries to be really, when its cleverness works, it's wonderful. But when you end up with this stuff where things are connected by the convention of what file name do they have, and it does something a little clever, I feel like I'm struggling more with a basic thing than I would for the Python style where you just have to be explicit about stuff. Yeah, Nainerbag, how long have you been programming? And Freechi, yeah, thank you. It's not just that the editor is older, it's that the config file is older. The editor, I mean, Vim started, what, 88 or something? It was VI before that. It's so funny. There was a version of... I'm pretty sure it was O'Reilly Unix Power Tools third edition that I found at the library when I was learning Linux in the mid-90s. And it had a throw-off sentence where it was like, or like a short paragraph, and it was like, okay, every Unix system is going to have Ed installed, so you should understand the basics of Ed. And I was like, okay, yeah, I see the value there. And then it was like the other, the two programming editors that are popular are Vim and Emacs. frici vi started in like .... very early... maybe 1976? 78s?
And Emacs isn't installed everywhere because it takes a lot of RAM to run Emacs. frici vim started in 1991
And so this was in the day where, you know, a personal computer would have four or eight megabytes of RAM. And so, yeah, okay. If you have an editor that wants a half a mega RAM, that's pretty hungry. And so I read that and I was like, I'm off by a bit, Fritchie. Thank you for finding it. That Vim started in 91. nanerbag Here we start specializing from high school, so technically... 5 years, but that was when i was 13 so i didnt take any of it seriously. If we are to count when i actually started trying before i went to university then thats a bit over a year
So I read that book and I was like, oh, well, if there's Vim and there's Emacs and Emacs isn't installed everywhere because it needs so much RAM, I guess I'll just learn Vim. And so I learned Vim and I've just been in it since. I have pairing with others. I have used other editors. And, you know, I've spent a bunch of time previm in, what was it just called? The DOS, I think it was just called edit on DOS. Some people call it the QBasic IDE, but I think it was just called edit. And then I did, you know, a little QBasic, but I also did assembly language coding in that. That's how I ended up with PushCX as a name. nanerbag I learned vim just because i found the keybinds of other IDEs and editors so annoying and unmemorable so i gave it a shot and never looked back
I got into assembly early in my programming career, I want to say it was my second programming language, because it was the only thing I could find a free compiler for. So niner bag says that they start specializing from high school so technically you've been programming for five years but where's 13. hmm. well right on for falling in love with vim it's just i've been using it for so long that it's all muscle memory now all right let's i'm missing something here and it feels like i'm missing something really obvious with, that's promising.

02:32:03Oh, maybe there's a, do we not have the builder handler? Handlers, okay, it's got the builder handler. hejihyuuga hello chat, hello pushcx
Do I have to say home stories RSS and it infers that part? I thought I tried it like this. Oh, hey, Hedgie, welcome back. I am struggling with wiring up a file name in Rails, which is not great.

...45I wonder if it just wants the word stories and it's going to interpolate the RSS and the builder on it. There we go. frici its hard to look back tbf as its both an editing paradigm and a "whole" language. opening an entire different way of thinking and working on text
Oh, man, Rails, so much magic. frici hey HejiHyuuga
Maybe there's a pull request to offer to Rails of if somebody names the exact template, but Rails wants to add stuff on the end. You could catch that and tell me I'm doing the wrong thing. Or you could catch that just in development mode and tell me. Because I didn't need to struggle with that for a minute. espartapalma what was the change again?
So Fritchie says, it's hard to look back, to be fair, as it's both an editing paradigm and a whole language opening an entire different way of thinking and working on text. Yeah. Oh, Espart Palma, the change was I said... home slash stories dot rss dot builder which is the full name to this template well from the context of app views it's the full name and it wanted me to just say stories because it correctly inferred the format and so it wants to append that to the file name and then it knows that it has the builder templating engine and so it wanted to infer that too espartapalma ohhh yeah, the magic because the format.rss ...
And so, then it was complaining that stories RSS builder doesn't exist, which is super frustrating because that exact file name does exist, and so you know I spent a minute going back and forth for temp for typos before remembering how much magic yeah. So we encountered a syntax error when rendering template check xml instruct. I probably have an extra end hanging out because of all of the pasting stuff around. Here we go. We got an open quote. This stuff is in italics and shouldn't be. I'm missing the curly brace. Undefined local variable method title. I don't see it. This one. The feed didn't have a description that was default code from the sample that I didn't replace. manuelfcr each do story instead of stories?
This one wants to be, oh, but the actual one that's throwing an error. All right, let's put that back. Each do story instead of stories. espartapalma 11
Manuel, can you give me the line number of what you're looking at? Undefined. Probably whatever this bug is. Oh, I can't grab the... This is the... manuelfcr 11 yeah
This is for the item, not the... What am I copying over from?

02:36:02espartapalma line 11... stores.each do |stories|
Oh, I see. Okay, let's put that back. Let's make that an instance variable again. No implicit conversion of false into string.

...28espartapalma it should be stores.each do |story|
Where am I getting a false from? Oh, 11 at stories each. Yeah, yeah, I push enough code around. chamlis_ you have the application name in the ternary condition
All right, so we have a bug fire up here that. Oh, it's the plus I am editing really poorly today.

02:37:13Have the application name in the ternary. Yeah. All right. I can't see my own syntax errors because of wrapping.

...31Better. It's not story title. It's title, not dot title. Man, we are going line by line with this. undefined method updated at because up do you have do you not have an updated at weird would have assumed the god object had that wrong number of arguments given one expected zero so there's a breaking change this probably just became can i just call that on it yep so let's do that change down here too

02:38:40It's always kind of funny to see such a low RFC number these days. This is old. And I did description lower.

02:39:02Oh, so this is the N plus one detection is firing, but rails heavy size intensified the, so rails is passing the format down. Instead of just saying, well, I know you asked for rails, but you're getting H or XML, but you're getting HTML back because you have an exception. So this is probably the tagging's change.

...47It would have been nice if it was that, right? Still might be.

02:40:02espartapalma it's on story.domain&.domain
So prosopite detects 1 plus n queries where it's very easy with ActiveRecord to end up pulling a ton of extra models when you loop stuff. So this is going to be like one of these lines, like author or tags. It's on story, domain, amp-sand-domain. Well, I just commented it out, and it's not. We had the same guess. I believe PrestoPipe will still print here. No?

...54So it's grabbing the taggings, the tag, the domain. I'm not seeing an n plus 1 here.

02:41:14Grab all the stories, grab their submitters, grab their domains, their taggings, their tags.

...30That all looks correct. That's crazy.

...42Oh, you know what it might be? Might be that thing I was griping about five minutes ago where I'm just over and over downloading the RSS into my home directory. No, okay, it is actually throwing. Because I thought maybe, you know, one of them was throwing and then I was just seeing the old page and it was downloading over and over. Hmm. Let's find the line of code.

02:42:26Yeah, so it's not throwing from inside the template. It's throwing as the action is completing. And so the line of code in the template that it's mad about is not throwing an exception, which is unfortunate.

...46let's so i can't get prosophyte to start printing xml so let me go the other direction and instead of having prosophyte raise let's just have it print and i think if i don't raise then it'll print to the rails server output Let's look.

02:43:32And maybe this is. This is missing a template for this request format and variant. I don't know if this is coming out of prosopite or if this is coming out of Rails and it mentions prosopite because it's just the last thing that touches the request.

02:44:12There's... A way to turn it off for a second. I know we do it in the code base, but I wanted to say. Let's just grab this guy.

...44and bounce the real server good i'm not learning anything so at this point i am just trying to change the debugging error message.

02:45:24I wonder if this is the difference between format dot RSS and format dot RSS XML. Because a thing I notice here, this is one of those like, well, when you're not. It's like the RSS gem where Its API didn't exactly match. And so now like, does rails just call this dot RSS? Does it call it something like dot RSS underscore XML? This is, a, another version of like why I dislike rails using plurals so much is you just have to memorize when it wants a plural, when it wants a singular. And so, like here, I am memorizing like what's the difference between format dot RSS and format dot RSS plus XML are they the same thing, are they not. doesn't really. Had something if I say this.

02:46:35yeah. At least I changed the air.

...45I wonder if this is what this code was doing down here that I commented out. There we go. Now I get to go back to being annoyed at Firefox. So this was the exact scenario of instead of just showing me the RSS, now I have to change gears and go over to curl until... Can I just always open? What on earth? So you can't see it because the stream just kept it from... I have a bunch of window manager config to avoid flashing stuff on screen, and it just saved my bacon because it opened in a different Firefox profile that didn't even have a browser open. That's so... Because it opened the download that's on disk as opposed to open the URL. If I reload... Oh, it did it again. Oh, my God. You know, that seems to be the other running... manuelfcr Firefox profiles are so annoying
thing about the stream is aside from audio issues every stream firefox does something weird to me i love firefox profiles i've got a couple like one for business stuff one for personal one for streaming

02:48:45And I'm aware container tabs can replace a chunk of this.

02:49:02Can I just view the text of... Speaking of keeping things separate, I can't even fit it on the screen.

...16Tools, options, no, this stuff is all gone now. I wonder if there's an about config for it. Not really. All right. I will accept that Firefox does not want to do the thing I want it to do. Well, doesn't that look like an RSS feed?

...51That looks totally reasonable. So I'm going to dump this out to, what did I call that other one? I called it ERB home RSS. So let's dump that out to builder home RSS. All right, not pipe.

02:50:33And let's compare them. Actually, let's just diff-w.

...52But diff-tastic had a whitespace option. Yeah, we're just getting everything, because it's not particular about the whitespace. What's the...

02:51:12Okay, let's not use that.

...31We're correctly generating those GUID permalinks. So I was trying to mirror the order to minimize the diff. And it looks like I've changed the order a bit. And so the diff between these two, it's really big.

...52Or it's just confused early on. And so every line is diff. So we added the encoding. added the description and the pub date, the TTL, and then going into the first item, this is an indenting difference and the addition of, and then the reordering of description and author. Or did I accidentally drop author? espartapalma it looks the encoding and indentinghas change so lots of lines changes
Oh, no, that was the one I thought might have been prosopite. So yes, I was deliberately dropping it. And then the tagging, so let's bring that back too. It looks like the encoding and highlighting, yeah. So I did diff dash w, which doesn't that...

02:52:49Thought it was, yeah, dash w, ignore all white space. So I think what we're seeing is me having commented out stuff to try and satisfy prosopite because I thought that's what the bug was. Trying to get that to render. So let's go ahead and redo that. espartapalma yeah, but the html has changes, like the one with SQL's
And then look at this div. Shorter.

02:53:23Yeah, and I wanted to highlight those HTML changes as part of, you're correct. The encoding and indenting has changed to lots of lines, but diff-w should be ignoring the white space change in the line. I'm a little puzzled that it's not, like I shouldn't be able to get that because the lines are identical otherwise. And then this is a white space change And so, yeah, rather than saying the P tag is surrounded by the decimal entity, it's surrounded by GT and LT, but it's properly escaped, which is the thing I care about. And so this all looks like we successfully just ordered the stories RSS over to builder. espartapalma yeah! great
That's great. The, want to put back the see this one that can be true i'm okay with adding this rails logger line there let's see if we can do the rsf the comments rss without me having to like re-comment out this template thing because i'm struggling with the name of the comments builder again So let me just review this. This is all nice. I'm happy with this. It's much clearer than what's happening over here. And some of that is just the markup noise of doing ERB and having to jump into and out of Ruby. And we get rid of all the HTML entities. I'm happy with that.

02:55:21So let's go find the comments RSS. And this guy is over in use comments index RSS. And I'm going to just copy this over.

...49Yeah.

...55And we're going to do it again.

02:56:02All right then. There we go. So where you say format RSS, we can render action index. Good.

...21No caching on this one. may be an oversight it might be worth putting in the post stream stuff well let me put it on the list so we compared the golden master for stories so let's copy story boom controller index rss caching over to comments

02:57:00So I don't know, because they're both named index. On the other one, I renamed from home, which was not great, to stories, just to kind of say what it was. This one will be shorter, I think. So we say that's the same, same. And then this guy is going to say comments first. Might as well have the same TTL, because I'm going to copy that caching over. So instead of looping stories, looping comments, we have an item with a title, which is the comment story title. The link is going to be the comment URL. GUID is going to be Author, let's just grab this over. There is going to be the.

02:58:14It's making an email address. OK.

...38And then we got the username. And there's no. Explicit escaping or anything happening, which is so much nicer to say the comments created at. And let's say comment that URL, which kind of gives away that, yes, this comments is part of the spec. Description, we're going to say the. comment markdown comment. And then this stuff just doesn't need to exist. We could pull in the story tags, but I don't want to touch that query right now. Wow, nice and short. Standard, what are you mad about? Oh, this one changed. I don't have to build this up in stages. It's kind of funny that sometimes people come on the stream and are like, why don't you have syntax highlighting? It's like, there's orange right there, because I have a typo. So let's grab commentsRSS to, what did I call the other one? Whatever, call it this. I think this might end up being pretty short. I don't believe you. Really? There were no changes? Did I save a zero byte file? No, it's still using the old template. Rails is going, ah, I have multiple builders. Let me try them in order. So it's still using the ERB one. Yeah. So let's throw away the old templates. And now that it's using the new one, Because I mean, come on, who runs code and has it succeed on the first try? And we have a different file size, so now we should see a diff. And it's huge. Let me put back the dash w. All right. So we have some intentional changes. I'm okay with this link thing being wrong, because again, it's going to be wrong on the feeds anyways. We added the pub date, the TTL. We're getting a whitespace difference, even though I said I don't care about whitespace differences. Oh, yeah, this GUID is the permalink for a comment. And you know, honestly, the other one is for a story. I don't know why it says is permalink is false. That's an odd choice. What does the spec say about those permalinks?

03:02:13Yeah, the story permalinks, the story GUIDs are permalinks. I don't know why we said false. I jumped through the hoops with the RSS gem to set it and I didn't question. So description is formatted quite differently, but this is just a line breaking thing that's going to disappear in HTML, and then the entities are encoded different. But yeah, that worked right off. All right. So with that, we will say that's a permalink. And back in the home one that is a permalink all right because even if the story gets merged into another since the person fetched the feed it'll redirect and so it's a valid permanent url so we compared the golden master for comments that's This feels like actually a nicer improvement than I expected. All right. So now we are going to back up and use the validator. Does the feed validation service let me just upload a file? I can paste it. All right. Let me go off screen and grab this onto the clipboard here. I can do it right here. Just have to squeeze everything in to 1080p.

03:04:04So comments. Oh, encoding is not a thing. All right, let's get rid of it.

...27okay unexpected is permalink didn't i just i deleted it but i didn't re-render the file so i'm safe to ignore it missing atom link with rel self oh we noticed that in the previous one and then when i tossed the When I tossed the RSS gem I forgot about that. So that is really very minor changes if I add the atom link. And with this. I just call tickets XML element. We'll see in a second. And.

03:05:26Show me what the comments used to say for an atom link. Just the root URL. Oh, there wasn't one in that. There is in this one. So we can just say this. All right.

...56I am just guessing at the XML builder interface here, but this feels like it's roughly correct.

03:06:10I'll curl and we'll see if it gets mad at me.

...22Exception. and now i want to jump back to firefox oh yeah undefined method original uri for request the original url then yep see if i get downloads That counts as a success, dumping another file I don't want in my home directory.

03:07:03So let's drop that in here. And I will just put it right after the XML link.

...17So let's grab the comments again. let's grab the home again and reload copy wrong clipboard because there's nine clipboards in linux I must have just copied the old code as I grabbed it because this doesn't have Primalink anymore. Yeah.

03:08:03So it's not. I called it element. That's not quite right. And then it's missing. So let's go look at the builder docs and see how I create an element with a colon in its name.

...32And a chance there's an example here.

...48I wonder if it's going to make me jump through hoops to set up a namespace. Oh, here we go. XML.tag bang. That's exactly what I'm trying to do. And then I say the name of the tag, the things. So I think I pass a nil. Let's just look at this.

03:09:31Oh, that ain't it. Did I not save? No, I edited the wrong template.

...46Doesn't that look right? Great. So grab home, grab comments, reload. clear this out and don't get that italic underline very often unbound prefix do i need to include some top level element to say that i'm including that namespace i can just compare against the Existing one, right? Oh, comments didn't have it. ERB.home. Ah, it added this XML NS. Yeah. So up here.

03:11:01Let's just copy and paste that one.

...10All right. So if I am going to just grab this over here to the stories one. All right. I just want to see the validator run clean once and I feel like we're very close but there's so many of these fiddly little things that. hey, this is a valid RSS feed all right now let's grab the home.

...51fingers crossed.

...58Oh, yeah, it doesn't like the way we format authors. And I'm fine because we kind of, we can't say Pythops at GitHub. And I know people have a whole bunch of tooling around this and I don't want to break that. Self-reference doesn't match document location. You didn't complain about comment.

03:12:32This may not be a problem. I'm going to say it's not a problem. I don't know what it would be comparing it against if I paste it in the source because it doesn't know what URL is being generated for. Wow. All right. So let's go ahead and toss these sample files. frici neither of the two should be a real problem for tooling, its more just being pedantic really.
And then review and commit. Where did this come from? Why is there a diff here? Standard RV ran on it. That's why. It must have tweaked something. All right. So we'll add the new templates. The only change is adding builder. Gemfile add builder. Home controller has, I renamed this. I could probably just say stories and it'll look in the RSS directory, but I'm fine because if it works, man, do I not want to fight file names again? Those are the two I removed. Yeah, this is standard RB tweaked it. I don't care where that comes in. I added this. It's harmless.

03:14:16yeah so i was kind of skeptical of doing that but after that false start with the rss gem that flowed really smoothly i haven't looked over at chat for a second oh fritchie neither of the two should be a real problem for tooling it's more being pedantic really i you must have said something a minute ago i'm not sure what you're referring to which of two maybe it's something about the validator and it's the validator's job to be pedantic frici yeah the validator, author mail and self reference
All right, so now the best part of writing code is, isn't it satisfying to close out all the tabs we don't need anymore?

03:15:03And up here, oh, author mail and self-reference, yeah. So the self, oh, pardon me. The author mail, so much stuff, like the RSS bot depends on it. And I know other people use it in scripts and they want it that way. So I don't want to, even if I'm breaking the spec, because the spec explicitly says, you know, it's an email formatted, from line basically i wouldn't be shocked if there's a reference like that i just don't want to generate valid rss let's grab that it's the commit number or commit

03:16:16I realized I didn't. So I did a pull and then did a pull rebase and hit a conflict.

...33So what are we mad about?

...42That I blew away these files. Well, that's an easy enough conflict. So it's conflicting with, I should have thought to pull down master before I did this, but this is by tweaked the HTML entities, and that was what got us looking at RSS.

03:17:10Good. And now I have origin head, and I'm building on it. Good. Now I have what's going to be a stable commit hash.

...39Before I finish that,

03:18:01Now there's, so I was, I could have pulled it up there, but I was just checking that looking back at the code here from by roots PR. Now his HTML encoder is only getting used in the one place in app model story. Oh, and you know, before I push, let me be a good developer and actually run the build. There's something about streaming where I keep forgetting to actually run the build, which I guess is a plausible enough lie, because I actually forget fairly regularly. Test seed is just slow enough that I don't want to do it manually. Or I should say automatically, like wire it up into my editor so that every time I commit a file, it reruns the test or something. These tests take seconds to run. Cat, chill. Where is there a plus? Up here?

03:19:24You know, this is all in, let's just,

...35I get that there's a it's the corn. I want to go in and out like this.

03:20:00Let's do the title thing. Yeah, it's a little confusing to have a local variable named title and an instance variable named at title.

...32All right, now are you happy there?

...45espartapalma does it work with xml.title( ) # parenthesis?
See if everybody's green. Does it work with XML dot title parentheses?

...57Possibly. Oh, all I've done is, changed the wrong thing it was actually a description that was so if i call to us there i'll get a spring always man i guess i should have read that back trace closer to catch what which line it was or there were two of them

03:21:41I'm just going to amend that commit and grab that new SHA-1. So nobody saw nothing. I just barely remembered to run the build before I pushed. And

03:22:30Oh, you know what? Actually, I'm thinking of this wrong. Even if there's only a single call site, a single Puma worker will call that entity method for parsing story titles multiple times. So I was thinking like, oh, it doesn't need to be a singleton. But no, the process isn't torn down. That's where the fragmentation is coming from.

03:23:05That's nice. And I feel I feel reasonably certain that we didn't break anything here because honestly, we're probably producing more valid. Yeah, I don't know if valid can be used as a comparator. We're producing RSS with fewer errors. Oh, I didn't remember to do this test. I did just push the commit, so it'll have to be a second thing.

...48And we know we have it, but... Hmm. Is this worth testing? So when we had the... The ERB, it was definitely worth testing because it would have been easy to remove and subtle and possibly a security issue. I mean, I'm not too worried about somebody XML injecting our RSS feed. It's more likely that we do that on accident because somebody has an XML code snippet. that's awkward but if something extra shows up in somebody's rss feed you know it's not the end of the world in the way being able to inject html to inject javascript to steal cookies is a problem so where i'm going with that is by operating at a better level of abstraction using the xml builder api i don't think i get any value out of this test because if i added a test It would only be testing that XML builder does the right thing. manuelfcr should we actually verify that there is better performance?
And I am sure it has its own tests to test that. So I'm gonna punt on that. And then, oh, there was that caching. Should we actually verify that there's better performance? Manuel, I wasn't doing this for performance. And I'm not really worried about it, unless you're asking about this cache. Where'd my curl go?

03:25:42Especially locally, but this is cheap. We're under 100 milliseconds. So I'm pretty happy with that, especially for stories. That's the one that pulls in so many extra tables. This really wasn't about getting a performance win out of it. It was peace of mind about all of the... manuelfcr it should be fine yeah! was just concerned about the whole thing of rss being a lot of the requests, and not wanting to degrade a sensitive part of it
escaping that was manually happening in the erb template for rss where there were lots of calls to raw and anytime i see one i get nervous and so seeing like eight made me especially nervous and then it it also in a milder different way it was funny to see that we had to understand a bunch about how HTML entities are encoded and how XML is encoded, but we're not dealing with it as XML, we're dealing with it as strings and just producing fragments that will become valid HTML, or I'm sorry, valid XML. I don't know, it just didn't feel like it was operating at the right level of abstraction. It was mixing, manuelfcr makes total sense to me πŸ˜€
bunch of string munging and knowing things about xml and knowing things about the rss format so i'm really just and then minorly even if i hadn't merged by roots pr moving that over means we generate much fewer of those html entity objects which i couldn't tell why we were generating any in the first place yeah so i'm not going to add that test and then let's grab that caching which was very simple so go over here and it just needs this kind of structure of if user which is mostly here so we will grab this then add an else grab this over and instead of rendering home stories we're going to render index and rails is going to add the format and everything for us i'm going to remember to run the build oh oh why did it call it

03:28:39The cache key is named RSS. Let's call it, let's just give the URL.

...54Well, I don't want to reuse the URI because you can append arbitrary, get variables to the query string so you know if somebody added question mark a equals b c equals d that would be part of the cache key that's not great and rails doesn't like us generating urls out of the controller layer there's my gripe again man i guess i should make the gem on one of these streams right let's

03:29:41Just go ahead and do that.

...49This stuff feels a little bit like it's operating on the wrong level of abstraction. Should having a valid user token be shuttled off into another different controller action maybe there is so much code to load comments load stories well stories is stories is over in a before action rather than in the action yeah let's look at that diff oh wait

03:30:34which would have given me an API key so that I could have things where y'all could click a button and it would pop up a thing on me and remind me to run the build, because hey, look, just call it a failure. Responded to, it was called multiple times. So something,

03:31:02So I kind of cargo-cultured this extra render plane. And I wonder if that's biting me. So it's coming from Home Controller. That's the stories one, not comments. But I didn't edit Home Controller, did I? changing the name of the cache key caused the test to start failing? I am very suspicious right now. The cache should just be a pass-through in test and dev mode? No, still failing. Hold on. Let's save that stash.

...59Did I tweak something and forget to run the build? I think I forgot to run the build and broke it in prod. What just happened? I wasn't tweaking home controller. Same error, right?

03:32:23Same error. missing template home slash RSS.

...38I don't see where this snuck in.

...52Let's pop back the code. because it's sure not the comments controller that's failing. So we've got kind of a mystery failure here, where it's complaining that I'm not rendering home RSS. I said I was going to be coming back here to the application controller to turn off that thing again. Here I go. Maybe I should just move this off to an initializer or something so it only runs in prod.

03:33:54Does that make sense? Yeah, it's these unknown formats, and I don't trigger them in tests. And if I do trigger them, the only thing I would be changing is are they rescuing an exception or are they saying, yeah, I got a 404? Well, let's see if that blows up half this test suite. I get the same two failures. Great, that'll make my development life a little easier. Not that I want a whole, I just don't want to make a whole ton of test churn. If it's like one test, fine. If it's 20, eh. Looks like we went from two to three. Four. Yeah.

03:34:56So here's a specific bug about that routing hassle. And this one...

03:35:12This actually looks like it's a test failure that was being covered by the code.

...27the other hand breaking this one is like that's what all this is for so this is a little bit of a sin I always try to check are we in production or not because I want dev and test to be the same. So this is, I will admit this is a little bad to separate behavior for dev and test. But I don't want to lose this test and I don't know what's up with this test and don't want to like burn an hour fighting it. So now we're just down to these two. and we had too many renders from home controller line 302 which is upvoted oh so what's happening is a bunch of these other methods reuse that rss template so there's this one there's line 278 which must not have its spec so this is good we're catching it but since i renamed the template to say a little more what it was those call sites need to get updated too all right so let's see i can get rid of that i didn't want to tweak it but

03:37:19So who else renders that? You are rendering stories. You are rendering stories.

...32Everybody has RSS.

...42So the other thing is, way at the top of the stream, if you've been with me here the last three hours, thank you. I mentioned that the site does not have total coverage when I merged the Braille 7.2. I just updated, what, eight, 10 call sites, but only two specs started failing? So that tells you the other so many, how many? So this first one is just me cleaning up and getting rid of that path. And then 1, 2, 3, 4, 5, 6, 7, 8, 9. Yeah. So they're untested. So the thing about home controllers, I know all of those actions are super similar. And I'm not totally worried if a really unpopular page like slash upvoted breaks. A lot of people don't even know we have that feature, which is something I'm working on a bit. But I've tried to improve discoverability for it by adding the sub nav. Who's mad? Home controller line 64 was called multiple times.

03:39:13Did this little cargo go bad on me?

...25what it was saying line 64 not 66 so it's still going to happen so whoa why am i jumping around so where is there a render before here respond to is called multiple times and matched with conflicting formats So it was asked for RSS. It has the builder. I think what it's saying is that it sees the request came in with this format and it's ambiguous? Hmm. Why did this... I put back the... Why did the code change out from under me?

03:40:46I'm going to shake my fist at Rails. All right, so this wants to be home spec. I guess all of these want to be home stories.

03:41:13now i'm a little bit suspicious and i wouldn't mind seeing one of these run so i'll pull up a category rss feed just to make sure i get something reasonable there's a couple of nice features in the tags action where you can get multiple tags at once. And then you can get RSS feeds. So you can get an RSS feed that's like slash tag slash comp sci comma distributed dot RSS. And then you get an RSS feed that has any story that has either of those tags. In the server logs occasionally i see somebody who is very specific and they have you know this is not an individual but there are people who will have like eight or even 20 tags and they're like this is the 20 tags i care about i just want that in my rss feed and i like that we can support that as one feed rather than you know have 20 feeds for the 20 different tags so let's go ahead and curl I just want to see it. I didn't need a file named list.

03:42:45And then for a category, see if I can remember a URL off the top of my head. No. Let's, wrong browser. Let's just go to slash tags. So let's have field. And go back to the show. Let's say field.rss. Exception. And now because Firefox won't show me the RSS,

03:43:35So in the other actions it doesn't want slash home, I'm gonna cry. Rails is being inconsistent and I am being sad.

...56So if I tweak just this one and I reload, Firefox dumps stuff in my home directory to tell me I succeeded. So there is something going on with, I wonder if it's the action versus template. I bet that's it. Yeah, with action you don't pass a path, with template you do. All right, so let's lean on the undo key for a second, because that was my last set of changes.

03:44:35So this one wants to be action stories, and this one for render to string, I could probably say action, I'd like these all to match. So does this work? Yes. And then does slash RSS work? Yes. Is my home directory full of crap? Yes. let's run that build one more time so the reason i ended up pushing it was i must have tweaked between using the path and not and not notice that i either undid or redid just before i committed i don't love breaking the build but At least it doesn't, you know, open an incident. All right.

03:45:55espartapalma is the cache key duplicated on rss, comments, categories ?
We're going to make multiple commits. Is the cache key duplicated on RSS comments categories? No, the... Well, let's double check. So the home controller has this cache, and I don't love this name, but it's fine. I'll just leave it alone. I'm turning enough. And then over on the comments controller, it calls it... Eh, we don't need the Slack. We can call it comments.rss. And then the other ones like newest and such, they just literally don't have caching, which kind of implies that we're caching at the wrong layer because of how much boilerplate is going to go around it. And it's weird. Just make the code work thing that I dislike.

03:47:03I guess it's there because render to string doesn't count as a render. Because I can call that multiple times. And then I'm feeding the content in and it might come out of the cache key. Okay. All right. That makes sense. It implies this could have a different API because this should just be something off of the Rails cache, like Rails cache, like fetch render or something. espartapalma ok, I just want to double check...
It's not API I want to build out right now, especially if I don't have high confidence that caching is happening in the right place. Whereas if I could tweak nginx so it cached the RSS any time it doesn't see a user token in the query string, that might be enough. Hi, cat. We are not playing right now.

03:48:00So this.

...27is one thing. And this is another. And I want to. Yeah, let's add that. And this really is.

03:49:19Love don't use the spec. The tests I wrapped around Rails' format misdesigned here. Let's grab that. Let's see. What file was that in?

...51Ah, here we go.

03:50:05Alright. And this one is what I came here for.

...38So let's add that and...

...51Okay. Let's be paranoid. Run the build one more time so that I can locally fix up any commits. But I think we have a green build and I'll shove that up to prod.

03:51:12excellent so with that i think i've worked through all the pull requests i can because this one is waiting now this one is the the guideline one that's been in the scratch file for folks who saw me post on mastodon or blue sky about doing this stream or eagle-eyed folks who saw it in the scratch

...45so edk0 opened this pull request a couple of weeks ago we just discussed it in the lobsters irc channel i don't know maybe a month maybe two ago but the gist of it is is i edited a story that had a real clickbaity title you know it wasn't quite nine programming languages you need to know for 2024 but it was you know that style of let's try and hype this up and make it exciting and ed k pointed out that the story submission guidelines don't have anything about this and because i am constantly trying to rope people into volunteering i said would you like to write a guideline and they said yeah so let's see what they've written stories form.

03:52:59That's pretty good. Keep the stories original title. So I see how they've Maintain some of my wording here. And they've made it another guideline. Yeah, I like that. Let's look at what this looks like. Because it's. Like I basically get it from the diff view. But it's nice to see it rendered. And I'm on local dev. So.

03:53:36Oh, this. All right. When I restore... So I exercise our backup system by restoring backups to my local dev end, which both helps me reproduce weird things in our data and make sure the backup system is working, because what everybody wants is restores, not backups. When I do that, we have one view and I have to reset the ownership of it. And it's one of those things where it happens just infrequently enough that it's in my shell history and I haven't bothered fixing it. Probably the easiest line wraps, probably the easiest way to fix it would be to rename my local database user to match production. But I've never gotten around to it. Bit of a cobbler shoes thing.

03:55:00What's my...

...08I'm trying to remember the Vim terminal for pasting. Control T quote register.

...28No, wrong register.

...36nanerbag ctrl r?
It's funny, like comp science school is here's the beauty of math and the purity and then actually working with computers is just a bunch of, like, oh, yeah, this thing needs an extra layer of coding.

03:56:05All right. Vim does this hard line break thing. I'm just going to... jump over to a terminal that's not doing the hard line break thing and do this. Y'all can see what I'm basically doing. I, ages ago, wrote a little query that just said, grab the current view definition and then reprint it with my username instead of the production username. And then I copy and paste that query to run it. And once I've jumped through that hoop,

...46I can use the production local database. So when submitting underneath the form, I appreciate you guessing. I don't know if it's control R is me being a little bit new to the terminal stuff. Still, I've only been using it four months or so.

03:57:11Oh, Ed K didn't put it here. It's over on the About page. I didn't even need to log in. Oh, and then I don't have it locally because I didn't pull down EdK's branch. So let's do that.

03:58:04All right. And looking at that, that get if it was indeed on the story guidelines page or on the story submission form.

...28So if we refresh.

...42I don't know that I've actually toned down something like don't use X. I don't know that I would call it a moral claim.

...59Maybe one thing to look at here is try to understand when I say clickbait, what do I mean?

03:59:35so let's just get some examples well let's why blow up my terminal 82 all right that's fine so all of these are going to be changed titles why do you add the line numbers there we go so stuff like it's the worst programming language in a total abomination i change it to i dislike objective c yeah so some of the things that happen in clickbait are like oh my god you have to know

04:00:30The edgification of Konami code.

...39Oh yeah, I remember that one now. So a lot of these are,

04:01:02A lot of these are about toning down the universality of titles.

...40nanerbag My favorite is the "You NEED to learn X NOW!" clickbait titles because i never hear of X ever again
Because programmers can't help but nitpick universal claims and the discussion. Not never go anywhere, but I don't know once you've read like 500 conversations where someone is like is X always bad, you know, the answer is, there are no absolutes in an analog world so. there's also these kinds of. The absolute minimum every software developer must know in 2023 still no excuses like. You know, like this first one is. were not being cute like this was not a gag i don't think it was just so what's happening there it's the addressing the reader with secret knowledge or really it's the the like missing nanobag yeah that you need to learn clickbait titles Yeah, that's like, no, it's not.

04:03:34What am I looking for?

...45There's something about the specificity of the like 10 things and in 2023 where it's in. So the in 2023 is like implying that the answer has changed when it almost never has. nanerbag "bringing the readers competence into question?"
Like.

04:04:28Bringing the reader's competence into question. Yeah, actually, that one's a real common one.

...46albynton Are they hiding the subject of the post? The title is not specific to their content.
The other one is, and I wanna phrase this more narrowly, it's the hyperbole of Introducing Neo Haskell, a beacon of joy in a great tech world. Like, really? I mean, if you're... It's that overwhelming disappointment in the world being phrased as sort of a positive about their thing. Oh, this one, the hardest software design quiz. Such a fucking troll title.

04:05:47yeah haha we live in hell like that wasn't even clear what the hell it was about some of these are gmail's breaking email gmail's marketing my email with spam like they're way overstating what's actually happening

04:06:19I wonder if I want a spreadsheet.

...27So what I would like is, let's just do this here. Probably faster here, especially like if n is 83, I can write any code I want, right? So there we go. There's a stream title.

04:07:11Where's my query?

...30I'm in the wrong console. Database console. I want Rails console. Oh, 82. OK. Well, let's fix that title. And then take them and say for each moderation, I just want the reason, and I can map that.

04:08:18It had just enough false starts that an example scrolled off the screen. So I want to take this and rip these two strings back out.

...40Change title from. Let's see how quickly I fall into levels of quoting hell.

04:09:23What's the match? There's one of them where you get a match data object if you go regex.match. So let's swap that around. Go regex.match. This is where I hassle around with the minutia of API.

04:10:01All right, let's grab zeal.

...08So yes, I want dot captures. So it's regex dot match past the string dot captures. And I have regex dot match.

...34I'm going to pass the string dot captures. What are we mad about? Undefined method captures for nil. Oh, so there's one of these that doesn't include a title change. That's literally the first one. What if I say dot last? No, this is a I didn't get the regex right.

04:11:09So if I grab the first one. Yeah, the reason is fine. Oh, I'm not matching the reason I'm matching that action.

...41they hiding the subject of the post that's sometimes it i don't know that that's quite it so what i was trying to do is just dump these out yank them into a spreadsheet just try and categorize what's happening here or like label them because if i know what's happening

04:12:16Just give me anything that's not a quote and multiple. Give me anything that's not a quote and multiple. That looks fine. Is this one of those where like the parentheses need escaping?

...37Now I have two problems.

04:13:10So no, the parentheses don't need to be escaped. Who's feeling spry about readline? What are we doing, readline?

...41Readline is being weird. That's obviously not the code it ran, and the cursor is not in the right place.

04:14:01Something is awful and weird where the cursor is off.

...12It's like it got mad about being resized and now it's confused how big the terminal is. Let's just kind of bounce that more fully. And it's doing it again.

...40Why do you hate me?

...52I literally can't edit correctly because it's just off somehow. That's so fucking painful for something I want to iterate on. I don't know what this is, what state it's in. Let's swap out the whole terminal.

04:15:23and it's still doing it.

...34This is a new one on me. I haven't seen the Rails console do this before. It's something about the interaction with readline, where if I'm scrolling up, It's losing track of how wide the prompt is or something. Now, even if I paste.

04:16:17Here we go. Let's build it up.

...32Read line. Read line. What are you doing to me? I could cry. This is hideously painful. And I'm just not doing it.

...56So I need this regular expression to rip these titles out of unstructured data. It doesn't want to let me iterate by editing. And I cannot think of anything less painful than or more painful than trying to figure out a read line terminal bug on stream. That's nonsense. I'm not going to keep dealing with that. So we're going to change gears a little. I had one more thing for the guidelines.

04:17:40nanerbag i would just dump the data into a file and use a vim macro to structure it
Code here is the, like when you do a study, you code your data. I guess I'll say categorize. use a Vim macro to structure it. That's totally reasonable, but I'm kind of losing my temper about it. So there was one small thing I wanted to touch in the guidelines.

04:18:21We've been seeing a lot of self-promo lately. And I had someone... Oh no, it does say, or driving traffic to their work. I was trying to be specific about that.

...45Yeah, I don't have an improvement to make here right now.

...53besides grammar actually it's better that way with the conjunction yeah yeah i'm getting frazzled actually after oh four hours and 20 minutes so i'm just not firing on all cylinders anymore and rather than struggle through the terminal or tinkering with a kind of giant site meta thing. I think I'm just going to wind it down. If anybody has last questions for the stream about anything about the site or had a query that they wanted to run, not that I could get a query into ReadLine, get rid of that.

04:19:51I would be happy to answer stuff.

04:20:01But otherwise, I'm going to wind down the stream. Let's put it in the post stream.

...18If anybody had other questions or other comments, I'm happy to take them. I'll give a couple of seconds because I know the stream is always behind. And if you need a second to think about what that is, you could throw in a hands up emoji if Twitch has one. Very Zoom educator of me. Otherwise, I'm pretty happy that we've worked through so much code. And I will shove up the commits we have. Oh, right. I'm trying to train myself into using git switch instead of git checkout. It's a little bit less foot gunny and clearer what's happening. So yeah, I can push all of those commits related to the previous code with RSS feeds, and I'll get that deployed. And otherwise, that's pretty much where I'm going to end the stream. Nobody's piping up with questions. So I will just thank you all for hanging out, especially if you're here for this whole big long stream. Thank you. I appreciate the comments and the bug catches. nanerbag Have a good day or night everyone
And, oh, EsperTame, did you catch that bug in the RSS with the stories where I was looping them? Who was that? I'm scrolling back up in chat.

04:22:01Oh, it was Manuelfer. Yes. FCR? Small font. albynton Thank you for the stream!
So Manuel, if you're still here, I should have done this a minute ago. frici Have a good time πŸ‘‹ Thanks for the stream
But if you catch one of my bugs, you get to be a channel VIP. So I have made you one. Thanks very much. Have a good one, folks. I will be back on Monday as usual. Take care.