It's the mob programming version of Dear Abby

Streamed

Fixed a bug with comment folders not working properly with targeted comments. Investigated stats bug where cache entries were being evicted by Rack Attack entries. Improved the disown button styling to use our link_post helper for consistency. Discussed YouTube previews issue and Diffbot API improvements. Explored the Lobsters hat system and its Comic Sans Easter egg for OpenBSD. Moving to Hatchbox for more reliable Rails deployment?

scratch


topics
  youtube previews https://github.com/lobsters/lobsters/issues/1578
  Mastodon.delete_post https://github.com/lobsters/lobsters/issues/1397
  brigading copilot PRs https://lobste.rs/s/jmg6f5
  add tests for display of deleted stories
  PRs
    hat grid https://github.com/lobsters/lobsters/pull/1577
    category grid https://github.com/lobsters/lobsters/pull/1577
  disown button
  stats bug? https://github.com/lobsters/lobsters/issues/1562
  bg jobs for story + comments


title
  It's the mob programming version of Dear Abby

post-stream
  ask jmduke about buttondown versioning
    https://docs.buttondown.com/api-versioning
    https://stripe.com/blog/api-versioning
    

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

Recording



01:54Good morning. This is Lobster's office hours. And what you see here on the site is, or on the screen, is Lobster's. There's the footer. Got that scripted finally, so that hopefully I don't put that up accidentally or forget to take it down. I wanted to do that and leave myself the option to

02:28stream stuff without putting that on, because once or twice I've streamed video game stuff, and that sure doesn't need a footer on Lobsters. And adding UI to OBS was a little bit of a project, but the Discord was super helpful. So this is Lobsters Here, a forum mostly about links, about computing. In fact, I know this one. This is this delta of I made a small library and it got 21 upvotes. Like this is too many upvotes. This is showing up. This is because this is me, the guy who runs the site. This did not need 21 upvotes and it's not generating much discussion. Two of these three comments are you have a typo and me saying, whoops, thanks, I fixed the typo. So a little bit of silliness. But we talked on a stream or two ago about how I try to avoid cult of personality stuff. Yeah, I figured I should just submit that one because someone was going to submit it. But I don't know. Also, I did actually like it's not just, hey, here's a little library. There's also I would have loved to talk about any of this stuff because there's a bunch of Lua style questions. Lua is not one of our most popular programming languages. But I'm super curious about it, you know? I write a lot of Ruby. I read a lot of Ruby. I am required to do some amount of JavaScript. But Lua is the language I'm most interested in right now. A bunch of interesting stuff there. Anyways, oh, let me put the message in the chat. Let's say broad questions. Monsters in chat any time. pushcx Drop questions about Lobsters in chat anytime! Or just hang out as I maintain the site.
We'll just hang out. Two words, right? Hang out as I work on the... Let's say maintain. There we go. Slowly I'm... What's the word here? Landing on some pretty standard verbiage for my intros and things. This... This article here about a new feature in obsidian like usually commercial product gets a feature is pretty iffy but this one is actually. A link into the well originally it was a link into like the mastodon post where they announced it but. Someone pointed out a better link would be the help page about it because it talks about the. functions that are available and i would have loved more of the implementation than the using but i just kind of nudged over into topical where i explicitly put in the about text that personal productivity systems are off topic because They're very general and they are such a, they're an attractive nuisance. So attractive nuisance is an American term of law that means like, oh, come on, you knew somebody was going to get themselves hurt on that. And the canonical example is if you have a pool that say a small child could fall in and drown, you're required to have a fence around that pool because is called an attractive nuisance kids are likely to be attracted to it and get hurt and i think that like self-helpy personal productivity systems personal knowledge information management i don't make these terms up are kind of the attractive nuisance of discussion forums because you can spend forever on them they're matters of taste and they're not really topical Anyways, all of that aside is I got to write maybe my best mod log message, funniest, because I'm hilarious, right? When I updated the link, while personal productivity tools are off topic, this link, which, ah, it was Vec who might be here, is about the database API. Or in other words, the new link is all about that base, no trouble, which is a terrible reference to a cheesy 2000s pop song so that's it come for the computing stay for the really bad puns about old memes hashtag killing it anyways Got a couple PRs to review. I think there was something in issues worth talking about. Oh, yeah. I filed a fun little issue of, hey, on stats, and I want to come back to stats because it's been broken for a minute and nobody's picked it up and it bugs the heck out of me that it's broken. The final month. Let's see, the chart's not going to, yeah, the chart is broken right now. That's this bug that I want to look at later. Yoink.

08:28so that i kind of made the last dot on the chart for the current month because it's partial data i made it gray to make it clear like hey if you're around the 15th of the month and the number of comments is at half the value it should be like you're at the 15th of the month i just wanted to have some amount of data but i think it would be neat to add a second data to the month with just a linear extrapolation of take the current month's number, divide by the day of the month, multiply by the number of days in the month, and then go, oh, okay, so if we're 15 days into a 30-day month, you doubled the stat.

09:16God, did I do that math right? I think I might've put the denominator in the wrong place, anyways. The issue text is reasonably clear. Someone will work that out, I hope. Oh, yeah, I was going to check on this arch package. Any news? 511. I think that's what it was. 3.4. I was going to search for slash 3. Yeah, 343.

10:02it'll happen any day now i think i have gotten the impression from the last time that i marked this package as stale that it takes a week or so that's fine this one is a neat little bug in that i really appreciate running a site that is for programmers because not only are our bug reports great, but Phil Armstrong here figured out, you know, both reported a clear bug because this is not a useful preview, and then looked into the code, looked how we're calling the API, worked out that they have another endpoint that gives you a better description. And then their video API, what is it?

11:20Yeah. Ideally, the analyzer video API calls would return the contents of the About section in their respective JSON entries, but they seem to be glomming onto random subsections of the page instead. And so he filed a bug with Diffbot, and they worked it, and they already fixed it, which is wonderful. And so if we update so that when we have the video tag, we hit that different endpoint, we'll be fixed. That's pretty great.

...56So that's what's going on in issues. I don't think I, did I close anything and then change to the actually useful view? Why does this have activity and is closed?

12:15Oh, this is the one where.

...22Yeah. Okay. I agree with this correct fix.

...37So, oh, this was the issue that was hanging out. This is another fix from Jamlus.

...52When we post to Mastodon, I added code so that if we delete a story that has been posted to Mastodon, it attempts to go delete that mastodon post and i had the weirdest experience because every time i ran it in the console i got back a 200 okay which is a success but then the post which they call a status which is so irksome as a noun given the way status usually means something like active or deleted or something i don't like that a post is called a status in the api also nobody calls it that but it's one of those I get it, like I gripe, but I get it because you name something in your API and then you are kind of stuck with it for a while. Oh, that reminds me of something I was going to check on. Post stream notes. Ask.

14:03So button down. is an email newsletter service. It's run by a guy named Justin Duke, who I have worked with and like, and it has an API that I guessed at the URL of and is definitely not right. Frici am I hallucinating or isn't it a status because the whole mastodon thing got expanded/based on ostatus or whatever that gnustatus thing was called at the very early days like a decade and change ago? CaitThinking hence why still "status"
Frici also Greetings
Are they down? Oh, that would be unfortunate. Okay, so no, not down.

...42know that is totally possible fritchie that it is a legacy thing i am unaware of i definitely was not around in the early days and i don't know much about the whole idea of the fediverse so 100 possible that that's why it is that way but so what that reminded me of is Justin i'm going to talk up somebody I know here, but I think he has great taste for both visual design and product design of features and also. pushcx https://docs.buttondown.com/api…
API design and I noticed that. His API includes and i'll share this link versioning. which. pushcx https://stripe.com/blog/api-ver…
This description of the versioning... Yeah, Stripe has written a... If I didn't say it, I worked with him at Stripe itself.

15:58Stripe has... This basic layout is how versioning works roughly in the Stripe API. I haven't looked back and forth to compare all of them. And then this blog post is really nice because it describes all of the ways, or it describes under the cover how this works, where, oh man, why are they lazy loading these? That's really irksome. So they take the dates of the API version, and I love that it's dates instead of numbers. And then they have a series of basically diffs. So if you send in a 2016 API request, then they replay their own transformations on top of it to update it to be a 2017 API request. And then they process the 2017 API request, which tells you this blog post is a couple of years old. So I've been meaning to... I just noticed this, and I have been meaning to ask Justin if he did exactly this, because it seems totally straightforward. He's writing in Django rather than Rails, but the two are very similar. He also has item potency keys, which are... Man. It is...

17:38So anyways, speaking of APIs, coming back to it, ChamList figured out that our API library was doing a post instead of a delete. It was just, and I can show you the diff, The diff was that the code goes, if you're doing a post, let's send the raw post data. Otherwise, we'll send a get. That's not quite what we wanted. So I expanded that out to fix that. Well, it's just that get doesn't have the thing. And then here's all the different verbs you can use. This is not the greatest fix, but it's fine. I don't want to mess with that infrastructure too much. And then I left this open because I was like, well, eventually we will delete something that has landed on the front page. And then after a week or so, yes, I removed this story, which since we talk about moderation issues and you are welcome to fire off questions anytime, we could talk about this one, which I can't see because I'm not logged in. This was the post that was It linked to Reddit and it was... It had a really mean-spirited title. It was like, my favorite thing is watching Microsoft devs go insane trying to get Copilot to work. So Microsoft has rigged up their LLM coding tool to work in public and get bossed around by comments on pull requests. And the Reddit submitter So somebody originally wrote this up and put it on Reddit and they linked to a couple of PRS where people were struggling to get the LLM to produce good fixes. And I saw it and I left it up cause our discussion was cool and nothing bad was happening on the PRS. And it was more of a, like it had a mean title that I was kind of looking sideways at, but nothing bad was happening. So I kind of wanted to leave it up as a, example of where these coding tools are. But I guess the schadenfreude of watching a company that is very strongly promoting these tools struggle to use these tools effectively was too much for people. And the Reddit post had legs. I saw it ten times on Mastodon, Blue Sky, Hacker News, other Reddits. And then I don't think we were contributing. I didn't recognize any names, but people started leaving real shitty and disruptive comments on the pull requests and that's brigading. So it had to go. We didn't, our discussion was pretty thin about it. We didn't actually get anywhere.

21:00pushcx https://lobste.rs/s/jmg6f5
If you're logged in and you load this page, you see the mod log entry, which I don't remember the wording of it. People are posting a bunch of abuse in the PRs. I hope that's not us, but I don't want us to contribute. And our own discussion was rehashing. I could have worded that better, but I mean, we were just doing another, oh, LLM coding tools don't work and can never work, et cetera.

...32yeah oh actually there's a small feature there that's maybe worth talking about so i'm logged out on stream just to avoid putting too much important moddy stuff up but there is a small feature here in the story template that is worth talking about where if you are logged in and You are a moderator or the submitter, which... That doesn't match what I remember.

22:26There must be another branch somewhere.

...45I thought I even had a test for this. Reading a story, merge stories, save stories. All right, so if we have a deleted story, that's a typo.

23:09So, ChaelCodes Hello! 👋
Maybe this is me misremembering or I lost it in an edit. But the idea was that the submitter of a story, oh, hey Chael, welcome back. I ran into somebody, are you mentoring developers or streamers? I saw somebody talk about how you were giving them advice and I don't remember, I ran into it in the most random place in the world. ChaelCodes Hmmmm. I've got a few community members, and a few who've streamed.
of weeks ago now that's why i'm so so vague on it in any case hope things are going well for you so i wanted was let's do the the highest selectivity if first and then this can become the nil propagation operator

24:15ChaelCodes Hard to narrow it down though.
Okay, I must be thinking of something along those lines. Or maybe I saw something old and I didn't know it was old. ChaelCodes What are you working on today?
Yeah, don't worry about it. It was just me having one of those, like, oh, hey, I know that name moments. And I had one of those this morning where, like, I saw my own article on lobsters and I was like, oh, hey, I know about type ID and Lua. ChaelCodes lol
Oh, wait, wait, that's me. That's my link. So occasionally I am just straight up Dory from Finding Nemo. I'm like, oh, hey, a little plastic castle. Oh, hey, a little plastic castle. There is a, man, speaking of old memes, there's a great album from the early 90s by Ani DiFranco called Little Plastic Castles.

25:25So let's go ahead and say... Why are they visiting slash instead of... I don't know that this test is doing anything I want. Let's create a user. So we'll have a visitor, which is a logged out. Or no, we'll have a other user, have a submitter, and we'll have a moderator. And then I think I have a...

26:10Great. Yeah.

...18And.

...37Let's put these in a reading order.

...51Yeah, so I guess this isn't a typo. We call them saver. Do we call them these negative tests?

27:20Yeah, see, we don't class saver. OK, it's there. Looks like a typo. All right. So let's say if you are. Again, as submitter and is it.

...52story path, which I'm just going to slap together. So that's that's kind of the core of it.

28:15I am really falling out of love with specs sentence style and I think if I had a magic wand, I would flip the whole test suite over to mini test. Just basic assertions. This whole spec, pseudo-English thing is just... It's not worth it. It's a translation layer that I have to do in my head every time, and I don't like it anymore. It's just not adding anything. So... Let's create a known title.

29:02Let's name it after a, speaking of the 2000s, let's name it after a famous novel.

...14It is visible to submitter.

...33I guess what I also want is for the story to have been deleted by a mod. Because that's specifically the functionality that I was going to talk about. If you are logged in, you can see a little tombstone where you can see the moderation reason.

30:02Yeah. All right. So that's to text.

...22I've got to think of a cute moderation reason.

...31yeah and so creating moderation for this story the reason ben affleck ends his revenge and The novel was made into a movie in case anybody didn't see that. Was that a Fincher movie?

31:11Might have been. That is probably correct. I'll get a useful failure if not. Say let bang because nobody's going to reference it. Probably just use let bang everywhere on every spec, but whatever. All right, so I'm trying to say that the is visible to other users.

...50So they'll see the moderation reason, but not

32:09so if you're not logged in and you go look we don't have that so now i can finally talk about why that is visible to a moderator yes so what's happening here is a few times i have had to remove really dumb and gross stories. The one that always comes to mind first was a article that was titled something like Bitcoin is like a handjob. And it had an extended metaphor about how cryptocurrency was like a sex act and it was just dumb gross trolling and it was so dumb that like the point of that kind of trolling is to make fun of anyone who engages with it semi-seriously and that includes things like deleting it for being garbage and so if we put up a post where Now there is forever a permanent URL on lobsters talking about Bitcoin and hand jobs. We look dumber just by association. And that was the entire point of that kind of troll. So for user accounts, we leave up the profile with a moderation reason. But for a story, no, come on, get out of here. I feel like the coffee's not quite kicking in I hope that explanation made sense that what's going on with these tests and this set of features is users see the moderation reason but not the link because we deleted the link like it's supposed to be gone it's not really gone if you can see it anyways but logged out visitors don't get something to point and laugh at because We just don't want to make a publicly embarrassing tombstone. And a lot of that is also, it's kind of like wanting to avoid the brigading that Microsoft got over their embarrassing co-pilot stuff in public where they mandated that developers use co-pilot this way. And then the devs were embarrassed by trying to use it that way. All right. So let's see if these specs pass.

35:04ChaelCodes Are you talking about the .NET AI PRs?
I get just like a crash on all of them. Okay, so we got some factory not registered moderation. Oh, huh. Yeah. Yeah, Chael, just before you connected, I talked about how, well, I mean, you can see it here, but that link was submitted here. And I left it up at first because for the first couple hours, everything was cool. But then I came home from my morning out and people were posting abuse in the PRs. And I don't want to contribute to that kind of brigading. ChaelCodes Yeah, I saw that one.
I don't think we did, but yeah, I saw that thing everywhere.

...50All right. So let's just.

36:04Don't even need a factory, right? I'm going to need a factory. Okay, we're mostly there. ChaelCodes I think one of the maintainers said they wanted to experiment with it though, and it wasn't mandated by Microsoft.
So there was a whole method for... Yeah, that's possible. I saw... Where did I see it? So there's a workplace thing happening there where management is deliberately indirect. And I saw someone claiming to be an employee saying, yeah, we were told that part of performance review is going to include a You know, a checkbox or a criteria for. Did you use copilot? Because we want so want to encourage these tools that you are getting evaluated for a raise in a promotion based on whether you use these tools. And that is kind of phrased as an incentive. But the. ChaelCodes Oh. Yeah. That's pretty coercive.
implied inverse of if you don't use this you're going to get your wrist slapped during performance review is absolutely clear to everyone involved and so that was the impression i took away from it i don't have a specific citation for it so i can't i can't back that one up take that with a big grain of salt because i'm interpreting it's someone who can't remember exactly what he read from someone claiming to be involved And then it's this implication, but that's such a obvious corporate pattern. I hope it is still plausible. And it jives with how I have heard PerfWorks at Microsoft from people who've been there for ages. So, all right. So there is a,

38:36They're supposed to be I remember writing this function that took a story or took a comment and then dug back to find the matching moderation reason because Our database model doesn't actually say I am deleted because of this moderation action. It just says I am deleted. And then you can go look at the moderation table and find the latest one and infer. Where did I put that code?

39:26Might've been four story.

...42yes well that might just be the mod view where did i do this what did i do Yeah, this is just the mod view for this stuff, which should be indented.

40:30I didn't accidentally delete it out of the story, did I? Come here. So where's single detail? So before I extracted that, no, come on, tick. We just rendered list detail.

41:01that was already there let's go back a little more that might have been in the list detail that one got a big edit let's look at this detail oh i bet that's where i lost it so When did I do this? What I really want to see is when I deleted a bunch of stuff out of this file. Here we go.

42:13have been in here. So if you were in the single story view, I refixed this disowned styling.

43:47It's not it. All right. I don't know where the heck this code went to. And I'm only three quarters remembering it. So it's off in this. Is it just in this missing? If not, this is it. This is all the all in the fucking missing template and i didn't remember that and i didn't spot that okay so this this if is wrong in a different way we always want to go into the missing template or look at This must be up in the controller partially. Where, yeah, if the story can't be seen by the user, you get missing. And so if you are in show... And then the moderation. Yeah, here's where we look it up. Which is so... I really don't love this because we have to infer from string comparison which moderation deleted. That's one of those, it's a million miles down my to-do list to clean that up. So if you get in here, then you can see regardless. Let's leave yourself a comment. How about that, right?

45:51It's called controllerStory.CanBeSeenByUser.

46:18Let's put that. missing speaking of leaving tombstones leave that little bit of navigation way post for myself all right so if the story's gone you still get to see the missing all right so if the story is moderated which that's why this is bugged we're not creating speaking of things that are way down my list Those booleans are redundant.

47:01Better. Yeah, so if the story is moderated and we found the moderation, we show that reason. Otherwise, we show this bug message, which has happened once or twice because we're inferring it's not structured. I do have a personal to-do list of a million of these kind of deep cleanups. I don't post all of them to the issue tracker because I don't want to overwhelm potential submitters. I would like them to see a front page of issues that's mostly small, you know, one or two small bugs and some feature requests rather than weird-ass, deep cleanup fraud data, you have to have fraud data to fix it kind of things. So which case failed? Shows moderation to other users. And they see removed by moderator. Yeah, no, they shouldn't see this. full display heading, because they shouldn't have been in this template at all.

48:32So where is can be seen?

...51Cutting this down with the nil propagation operator. And then as soon as that cuts down, it's clear that you can just change that. So it becomes simpler. Is gone if you are deleted, right? This one one more thing to clean up that should just be a. that's why we had. All right. I don't think it's going to pass, I just want to see it fail the same way, because I touched a couple of things. So if you are another, did I just log in as the wrong user? Yeah, that's what it is. I didn't update that from submitter. test failure speaking of which if you see one of these kind of bugs and you spot the bug before i do you get to be a channel vip somebody just did on the last stream and they submitted a bunch of they were very helpful all right so that's the behavior so this

50:33Everything is fine, but now I have some specs.

...47And there even is a comment that is basically what I said earlier of logged out visitors don't get details. So we don't make a convenient public monument content that was so bad or bizarre we removed it. Hey, I can actually say these things succinctly when I'm not talking off the top of my head stream of consciousness style while I'm streaming. I should probably make that part of my standard bumper, you know? So I say like, oh, this is Lobster's office hours. Also, Peter rambles a lot more and codes at about 70% strength because he is trying to keep up public chatter. ChaelCodes But it's funny when you rant at clouds.
Because just a dead silent stream of somebody coding is actually not particularly interesting. And people don't realize they can interact. All right. So found that functionality. I knew I remembered. Added some specs. Everything is fun. ChaelCodes You have to dedicate some brainpower to that.
When I ran to clouds, yeah. Speaking of old memes, yeah. We have a bunch of Simpsons memes in the code base. And we have some users now that are younger than those memes. Yeah, so what did we do here? We did the...

52:15There we go. So back to my to-do list. Frici it's a weird perspective to think "some of the memes in my codebase are older than my users"
had pull requests from regular new contributor Chamlus. I wonder at what point I'm going to stop calling her new. Yeah. Yeah, free cheat. That's why I said it is. And what's weirder, Simpsons is still airing, but... So on some of them... Specifically, the one I'm thinking of is... I added this comment a couple of years ago, maybe five years ago. But if you just post a TLDR, you get, wow, a blue car. This one has been in the codebase forever, since, I don't know, 2012. And I have gotten a confused question about it from a younger person, and I was like, oh, oh, I am explaining something very old to you, because they made that polite, I am getting talked to by my elder face who is talking to me about the war in 18-dickety-twelve. Yeah.

53:47yeah i've actually i've had younger users look at the site and be like like the site loads and they look at it and in half a second they're like oh it's old yeah yes it's been around a while and the design has only very slowly changed not by much it works it doesn't have to have a gradient and rounded corners in a single page app it can just work instead all right

54:17ChaelCodes Websites that work? That's old school cool.
so tags and categories and then hats and hat requests this one i'm a little worried might break something because it's moderator functionality all right so yes there's the text that looks nice

...54ChaelCodes New age websites load with beautiful rounded corners and no data.
Nice to have that reason field get bigger. Okay. Well, this one's really low risk because it's only seen by mods. Yeah, speaking of, there was a... There was a meme I remember in the 90s where...

55:26A friend of mine used to always pronounce new age as newage to rhyme with sewage.

...40All right, so. Tighten that.

...50white space just going to give this a skim but this is probably going to be a real easy no comments except kind of pr because she's been marching through the templates hmm

56:23why did this get a span why did this html label get a span around it probably because in the byline it's in a span right

...54So there's a span for the user and then the hat. This should not be down in the model. We don't use it anywhere. It should be up in at least a helper.

57:29Yep. That one, let's put one refactoring bin.

58:09Sometimes people take these really simple refactorings. Yeah, because it's not a bug or a feature.

...28All right. So that's got to be why I was going to look at two hat label span class equals hat. I'm assuming that somewhere in here there's... Okay, so yeah, it has this overly specific style of saying that a hat has to be in a span. We never generate a hat outside of a span. Yeah. All right.

59:07I see this is where I wish here be wasn't string soup, because what I want is every place that hat appears in a CSS class. But I can't actually say that.

...37the backslash b there is word boundary so i stopped getting that and chat chat am i regular express all right

01:00:04Okay, so one comment.

...18ChaelCodes Wait, I missed something. What's a hat?
Oh, I'll show you. So if you go to hats, users can be granted a hat as a way of officially representing a project, so there is a workflow for submitting a hat request and then a moderator will review that. ChaelCodes THEY'RE ACTUALLY LITTLE HATS!!! 😍😍😍
Say this person just to pick on something can link to either a public representation that they are they may have left duck duck go yeah they're actually look like little hats and then, when you leave a comment. let's let's find one. This is not me, and hat ID is not null. Order by. So I'm just trying to find a good comment to show you here.

01:01:38Come on. Yeah. So Andy here is the developer of the project being discussed. And so he can put on, well, he's a little redundant. Oh no. Okay. He doesn't have to say like, hello, I am the developer of oils. I started this project. Everybody can look at it and go, oh, they are actually like wearing their oils hat and speaking on behalf of the project. And you know it from the headline. And you know that, it's probably real because a Lobster's moderator double-checked that they have a working email address at that project or a page that talks about it. ChaelCodes Very cool!!
Yeah. So it just saves a lot of like, you know, redundant verbiage from commenters. Oh, here's sysop. Oh God, that thread. We talked about that one on stream, I think. No need to rehash that one. Still in that thread. We can go back to it if somebody wants to talk about it, but that was the one where a guy picked a whole lot of fights, lost all of them, and then deleted everything. Yeah, I was trying to find a less exciting... Not that that was exciting, just... more anodyne example of something because all of the previous ones have been like about that article yeah here we go so here's i remember this one so p kill got a new flag and there was a bunch of really really detailed discussion of how signals work on linux and then a kernel developer put on their hat to explain this is how this is happening under the covers inside of the kernel and having the context here let's go ahead and remove this highlighting it's useful but the yellow is a little obnoxious to me ChaelCodes And if you're scrolling through, you can see it!
having this hat tells you like oh someone who definitely or really should know what they are talking about is involved in this discussion i really like this feature i think it's super useful we occasionally get somewhere it's like why did this project do this thing and then sometimes you will see somebody show up with a hat from that project saying like hello i am a suckless contributor hi i'm a Where would that rust community team member, you know, or a rust contributor. Yeah. Yeah. They kind of pop out too. So I try and stay on top of hat requests and then, there's a bunch of code. It is maybe the best, the best named controller action in the site is that ChaelCodes That's perfect!
If you're no longer involved in a project, you have a link on your profile where you can say that this hat is expired and it is called doffing the hat because English has some ridiculously specific verbs for, you know, so that English has the verb doff that means to take off a hat as opposed to any other, I guess, to take off an article of clothing is doffing. So. you can doff your hat if you are no longer involved. And users are pretty good about it because lots of accounts, people don't make it a daily habit to visit. And then if they do, they don't make it a daily habit to review if they are still a developer from your URL just to click somebody. So we looked at that one from DuckDuckGo, and their link was broken. ChaelCodes Well, and someone who _u
That probably is a user who's no longer at that company, and it's harmless until they use the hat, but that kind of confusion is always possible and is totally worth it for, oh, here's somebody who actually works on Fish Shell, and you can click on, so when you, yeah, I don't need to beat it to death. Anyways, handy feature, and deliberately very cute. And let's improve the CSS around it rather than, yeah, someone who underscore you. Oh, you accidentally hit enter when going for backspace, right?

01:06:34Yeah, nice to get that.

01:07:01ChaelCodes _used_ to work on a project knows about as much as someone who currently works on it.
That's true. Yes. pushcx https://lobste.rs/hats
But the idea of a hat is at the time you're using it, you should be an active user of the thing. And if you look at the description up top, which I didn't actually remember to throw the link in here so you can click around easily. But the idea is that you are permitted to speak for the project organization or company. And Hopefully people get when it is like, yeah, if you just randomly contributed, like I have a patch in Rails. I am not any kind of Rails contributor, let alone core team. I don't deserve a hat for that. But then also if someone is like an Arch Linux trusted user and they put that hat on, you get the idea that they can talk about packaging things But probably not, I don't know, totally on behalf of, does Arch have a corporate entity behind it? I don't actually know these things. But somebody who is a trusted user means, in the Arch context, it means that they are allowed to do certain things with managing packages. It doesn't necessarily mean that they are a company employee. So hopefully people have reading comprehension. Generally, they're very good. So that's great. Oh yeah, tags and categories. This one, there is also another open feature request I should mention for improving that. So tags, these are the current views.

01:09:01What's this one? GitHub, did you give me an expiring link and then it expired in the time that I have been on this page? Yes, you did. All right. So there was just a thread about GitHub. pushcx https://lobste.rs/s/dtwy2u/open…
no not this one this one about software forges and what if we had kind of a standard way of serializing these to a roughly human readable format and then I popped into this discussion And it's these kinds of things where GitHub has so sharply rate-limited browsing that it's becoming unusable. And I link to a thread where people are complaining that if you browse, when you're not logged in, if you browse three or four files in quick succession, which is a very easy thing to do when you are just poking around a code base, you will start hitting 429s. And there are lots of things that work by, oh, well, we can fetch this diff from the raw view of a page. You will start hitting 429s if you do more than like three of those in 60 seconds, which is not hard to hit. And this kind of thing where I can't look at screenshots, even logged in on a tab that's been open for five or 10 minutes is And so I pointed out that, you know, well, lobsters as a hobby project, these alternative tools are becoming mature enough that we could start thinking about them. Because like this and the fact that the PR workflow is so dang clunky, which I elaborated on below, and that

01:11:28the PR workflow or the PR UI has gotten really janky in ways that I've recorded on stream where like the status of a build causes the UI to flap into different states and lose my UI state so down at the bottom there's like the all checks have passed and I opened this on a PR that was in progress. And then as these finished, every time one of them finished, it forcibly closed the thing. So just sitting here, like as I was interacting with it, it was changing and, you know, I'm like trying to go into the menu and the whole thing is just on its own collapsing and disappearing. That kind of React style jank. I don't know if it's React under the hood, but that jank is so irritating. And if GitHub doesn't want to work for writing and reading code, because Microsoft wants to spend all its time promoting Copilot, which is that called? pushcx https://en.wikipedia.org/wiki/T…
Yeah, that's getting a little off topic, but the legal term for that is tying.

01:12:52Not throw that in there. So when a monopoly, and GitHub does have a monopoly position in Codeforges, requires that one product or service becomes a mandatory addition to the purchase of a different product or service. For example, can you turn off copilot on GitHub? No, you cannot. Can you turn off recall on Windows? No, you cannot. That's called tying. chamlis_ (hi!) I trusted disabling my uBO rules in favour of turning off copilot nags in the github settings, it doesn't stop all of them
Anyways. So this... Yeah, I actually have been... You don't see them here because I have been using... you block origin to block those things and anyways hey shameless i left a comment on your other pr and i was just about to leave one on this can we have a an inline display of these check boxes can you put them next to the words and i guess they would look better on the right yeah so see, I've been on this PR for five minutes and now the links don't work anymore. And if I reload, because it's in a details thing, I'm going to lose where I was on the page. It's this kind of really annoying thing that's just like, GitHub, do you think about how people use your tool? Are you too busy promoting people for forcing AI on things? It's such a Microsofty thing. It gets... chamlis_ been meaning to try out doing github issues and PRs within emacs
is a competent business organization and then it can figure out its corporate strategies and correctly incentivize user or developers to do them but that is a very blunt tool and so you get stuff like just core functionality gets janky because people only get promoted for the new hotness it's sort of like how it github nobody gets promoted for or classically nobody gets promoted for maintaining things and so you get a new chat app every 18 to 36 months because you don't get a promotion. If you improve the chat app, you only get a promotion if you launch a new chat app. chamlis_ there are checkboxes on the user settings page that currently do that same thing - so you'd rather they were all inline?
So Google has launched like 20 new chat apps over the last couple of decades. FullStacking Hello again. Hows the ruby today
All right. Yeah.

01:15:48Yes, I would rather they all were inline, please, Jamless. Thanks. I'm going to leave that as a comment just for the public record, but yeah. And hey, FullStacking, howdy. The Ruby is behaving, if I can find my way around it. You must be tuning in after I was struggling to find a template, but that's fine. Please move these.

01:16:25FullStacking Q: does lobsters pull from HN at all?
promise reference. What is it? Tag.

...52Lobsters does not In a technical sense, no. Lobsters doesn't have any kind of automated system that pulls from Hacker News. There is actually a, the reverse exists.

01:17:11Where is he? Todd Sacker. FullStacking I've been feeling like I've seen a huge increase in shadow banning on HN lately and I think I'm about to give up on HN
Wait. Sack. No? pushcx https://news.ycombinator.com/it…
Yeah, here it is. There's even a comment about it. FullStacking wow
So there is... Oh, and it's by Ngoldbaum, who is a very active user on lobsters.

...53Todd Sacker. I got his name roughly right. So there is this person, Todd Sacker Doty, who reads, I'm presuming, the RSS feeds from lobsters and then everything. I don't think he does it as a karma arbitrage post. I think that's maybe a little unkind. Frici @chamlis_ probably more sane that fighting the web interface... magit's forge works pretty decently with github/PRs
I think he just does it because... hntopicality is a superset of lobsters. So all of our developer stuff is topical for Hacker News. So he shares the links over. And hopefully he filters out announce and meta posts. Yeah, so here's an example from a couple of hours ago where So we had this post three hours ago, and then Todd's thing came in. So what does this say? This is probably UTC 11-59-03, and this says 56-47. chamlis_ good to hear it works well, I'll try setting it up this week
So like three minutes after it was submitted here, his bot picked it up and posted it to HN. So that's really the only automated link. And then to kind of vibe a little I think one of the... Thanks, Jamless.

01:19:29Oh, you were responding to Fritji. I didn't follow. I often end up reading the chat kind of backwards. Yeah, so full stacking, to your point, Because Lobsters isn't a commercial project and doesn't have to be... So I've said in a lot of stuff that we don't have invites because we are the cool kids club that only cool kids are allowed into. It is not a tree fort. Invites are useful for preventing spam and various kinds of abuse. And oh my God, are they useful for that? You know, we lose more than 99% of spam and abuse because of the invite system. The gatekeeping is not great, especially against junior developers who are least likely to have a network to invite them to the site. Like, I don't like that aspect of it, but spam is such an enormous problem online that it's still worth it. So as long as we are not pretending that we are the cool kids exclusive treehouse, you know, there's a lot of really good stuff on the web. So like if we just look at this one that was submitted three hours ago, I bet there is an interesting comment in here, right?

01:20:57Yeah, so someone connected it to issues, and then someone connected it to another performance post.

01:21:13It's only been three hours, so there may not be like an excellent comment. Oh, there's some rant. We're going to skip this. If it's grayed out, it's probably skippable. FullStacking The thing I think I find wild is that I've been scraping HN for a few months and have about 100k links and of these only about 2% have domains that have a working RSS feed.
Oh, and here's somebody else commenting, connecting it to their public stuff. So what I would like to say is like, look, we know this link is going to appear on other sites and not just because of Todd Sacerdoti's bot, but it's also going to appear on Reddit. It's going to appear on, I don't know, maybe something like Medium or Dev2 on elsewhere on the Fediverse. If we don't have to pretend that we are the Cool Kids exclusive treehouse, we should be finding and linking to these posts on other sites. Frici sad %
And as long as we are finding them and linking to them on other sites, why don't we also look at their comments and find their best comments and highlight them and link to them? We don't lose anything by linking to other excellent discussions on the web. I think that kind of thing of hey other people on the web have great discussions about this is the kind of thing we can do when we don't have to worry about keeping eyeballs on the site for ad metrics or we are the cool kids club nobody else can have other stuff so i have kind of a daydream of we should have a background process that takes these links and every couple hours for the first few days after they're submitted go check reddit and hn and other sites and find discussions of those elsewhere and then encourage our own users to find the best comments there and link to them from our site which would make lobsters kind of FullStacking I wish we could drive comments on the origin of the post
curating the best of the web because there are excellent thoughtful insightful experienced comments elsewhere we don't have to pretend that we are absolutely that oh if it was if it was worth saying somebody would have said it here like come on fuck all that noise there's great stuff on the web let's keep linking to it let's celebrate it let's send our traffic that way let's FullStacking activity pub protocol is such a pain
incorporate it into our site so that we can build and collaborate on it and i know there are folks who are like well let's throw everything out and you know move to the fediverse because everything should be backed by fediverse structure i don't think that actually solves the problem we have because the problem is not That we can't use a database to save our comments and then we need to shift to this kind of strange distributed database that is not well moderated that's not the actual problem we have. What we want is. pushcx https://gerikson.com/hnlo/
More hey there's good stuff out there let's share it. Oh. So if you haven't seen it, is a longtime user of the site. And he has a, oh, I wonder why he removed Proget. It's been a minute since I looked. chamlis_ reddit turned off their api, maybe that?
Removed in 2023.06. I'll have to ask why.

01:25:05FullStacking yeah this ^
But it's just a very, oh yeah, 2023, it's been a minute. Yes, that would be why. Yeah, so I guess we can't link to the ProGit ones because we can't really scrape it. We'll get rate limited and blocked pretty fast if we try and send Reddit traffic. What a funny, I would say almost self-defeating thing, except that Reddit is fucking killing it. What are they, number seven in the US for most trafficked sites? FullStacking dns has gone wild for scraping these these days.
I have been surprised by the non-technical friends who are like, oh yeah, on Reddit I saw this thing. Or people who read the Am I the Asshole posts like it's the Dear Abby advice column. Because that's kind of what it is. It's the mob programming version of Dear Abby. Because you just get the whole community piling on these personal stories. Here we go. There's a title.

01:26:24ChaelCodes But they're so good! I love how wild AITA gets.
Anyways, this is a very neat site. Yeah, I think a lot of the Emma the Asshole posts are... It's an open secret that a lot of those are just kind of... It's this weird creative writing thing. FullStacking I spend to much time in PublicFreakouts
Like, there's these subreddits like NoSleep, where people write scary stories of ooky things happening, and the genre convention is that they have to be contemporary urban fantasy... written in the first person past tense and, you know, describe things as if they had actually happened. And I think that Am I the Asshole has become its own fiction production community where you have to do a story about violating a social rule in an interesting and novel way and write in the first person Frici I absolutely love AITA posts, They are always written so grounded like "you think this could happen" but go so wild in the "never happened" scale JinxLUL
I don't know, because I read a bunch of these. I've looked at the subreddit, and I just have this snap reaction of, yeah, I don't believe that actually happened over and over. Yeah, Freachy, that's a really good way of putting it, that they're written so grounded, but then they go so wild. I think that's a really good way of putting that genre. And they probably did start as true advice column kind of things, but I didn't grab those PRs.

01:28:30Chambliss, did you push a commit while I've been rambling?

...52Oh. Oh, I see. Okay. I thought this was done Yeah, I don't know what was going on with that selector rule. All right, so this is the thing. Come here. No, that's what I wanted to make sure was off. Thanks, GitHub. All right. And that flash of unstyled comment content there, GitHub.

01:29:30Oh yeah, Chael. Because the original creator of Lobsters was a OpenBSD developer, there is an extra slightly silly, or maybe he's a free BSD developer and they have a friendly rivalry growing with OpenBSD, I think. But the OpenBSD hat uses the Comic Sans font. It's just a cute little Easter egg. in the site. So if you look at... Let me blow this up. Oh, it's broken. Oh, no. chamlis_ do you have the font?
Chambliss, while you're there, can you fix the open BSD hats, please?

01:30:24How did we break that? Do I have the font? Yes. I should have Comic Sans. Let's take a look. Oh, so I do see the rule. No, that's highlighting Sans Serif, not... What's the font supposed to be? Will I get a nice picker here if I start typing comment? No. I know I have Comic Sans installed. I've seen it on the web. All right, well, at least that functionality is not broken because the class did get applied. Maybe it's just my browser. Can somebody look at slash hats and see if in OpenBSD you see Comic Sans? Because if it's just my browser, it doesn't matter. Frici no it's broken for me too\
Or maybe it's a...

01:31:23chamlis_ I don't see it either but I don't think I have the font
called something different on... It needs quotes?

...35If it needs quotes, quotes can be provided. I don't think caps matters.

...49Yeah, that didn't change anything for me.

01:32:09yeah chalkboard se maybe that's what i'm missing is it's called so there's the whole thing with fonts where you can chalkboard see no oh you're mad about that one oh because i

...51That's Soviet Union. Forwarding to some others. All right, this site is dead, right? No. Why did you link to this?

01:33:18jlanzuisi I do see comic sans on Windows Chrome
So very often on different systems, fonts can have alternate names because the font itself, the design of it can't be copyrighted for boring reasons. You do see sans. Oh, well, if it works on Chrome, it works everywhere, right? What did I just do? Why does editing this start inserting the word inherit?

01:34:00jlanzuisi LUL
Do I not have the MSTT core fonts? That's going to be embarrassing if I don't. Frici Interesting, now I wonder if it's firefox breakage LUL
All right, you do get it on Chrome. All right, so it works somewhere. chamlis_ the `ttf-comic-sans` AUR package looks to just redistribute the windows font files
Maybe I should file an issue. I'm not going to bundle the font.

...22The TTF Comic Sans.

...33jlanzuisi Wait it also works on firefox, I just checked
jlanzuisi Also Windows 11
This is me getting hacked on stream because Chambliss invented this package and got it published to AWAR in five minutes. No. I trust you. I think this is it. All right. And then...

...53chamlis_ you check the PKGBUILD, right? right‽
Probably there is some, like, font thing I have to... Oh, okay. Updated the font config cache. Will Firefox pick that up instantly? Yes, wow, I didn't even have to reload the page and it's hideous. There we go. I mean, Chambliss, you just saw what I did for a font. I am more deliberate with packages, especially if they are not insanely popular. But yes, maybe not for a font when I'm doing something silly. All right, so it is just that I didn't have the font installed. There we go. Now the OpenBSD developers look professional.

01:35:45So anyways, worth reiterating that this is the... Because we've been here for about an hour and a half. This is the Lobster's office hour streams. You can ask questions about the site or the community or... my lax Arch packaging hygiene at any time. And then otherwise, I maintain the site and you can ask or you can just watch over my shoulders. I maintain the site, which lately has just been blindly merging Chanless's PRs because they are generally excellent. All right. Is this good to go now? I thought I saw the build fail. What could have failed in a lint? It's mad at me. This is...

01:36:39So there's a whole hassle with the linter where it's mad about using puts in a migration. But if I actually use the... If I use rails logger warn, it doesn't actually appear. Whatever setting is somewhere in the migrations, it just doesn't run or it doesn't print regardless of what I think with. And I haven't wanted to dig into migrations to figure out what's going on there. Let's get out of prod. All right, so with that, This is fine. You don't need to rebase that. Yeah.

01:37:46And let's fix the GitHub message.

01:38:26And then in the five minutes I was just looking at it, OK. I was wondering if you would have already done the checkbox thing in the five minutes I was looking away, because you do that sometimes, which I really appreciate. You don't have to be that fast, but thank you. All right, so there's that. chamlis_ haha
Oh, that disown button. I was going to get that.

01:39:07Wait, shouldn't this use link post? Is that what happened here to the disown button? That we made it a link post and I broke that somewhere along the way? Yeah, we shouldn't need that. Where can I find a disownable comment?

...47So let's just go.

01:40:08So if we go find the first one, right?

...17Frici *insert tennant voice here* the weeping commit, don't blink, they push -f if you blink
Wrong console. Should have known it when read line worked.

...29I never got into Doctor Who.

...43Okay, so we go find Peter's earliest comment. Let's get the Rails server running. And log in. Oh, I restored the... I was messing with the migration. That's... There's a thing with Maria DB where I have to say that the definer of a view is me. All right. So I lose that short ID clip board. All right. So why don't I have it to sound button if it is dishonorable by me? chamlis_ lol. should try and time the force pushes for when the tab's hidden
Oh, hey, Chael, my first comment on the site was about wearing an official hat. What a callback. Time out. You know, that is actually, so I griped, I don't think you were on the stream when I mentioned it, but we had a thread about GitHub where I talked about how I don't like the whole workflow of PRs. theGeekPirate I've somehow avoided wanting to get an account to comment with =b
One of the things I don't like about it is theGeekPirate The ultimate lurker
And this is a very minor thing, but as somebody who streams, so you can see when I'm about to click merge on something, when I click merge, it merges the current version of the pull request. So if someone were to push dash F in the 100 milliseconds before I click merge, I would end up merging code that is different than what I was just looking at. And I know there is sort of a fix with protected branches, but they have their own problems. So, yeah. theGeekPirate Howdy o) o/
Anyways, Geek Pirate, welcome. prime_coder sup @pushcx
Well, that's very Buddhist of you to avoid wanting things. That's how you avoid suffering, right? chamlis_ I've wondered about that in the past - I guess merging locally is the most paranoid approach
All right, so why can I not disown this comment? My 12-year-old has disappointed me. So it is not gone. And it is supposed to be dishonorable by me. theGeekPirate Hah a bit, I tend to avoid creating accounts until I can't resist the urge ^_^
Yeah, merging locally would handle it. But then that has its own UI hassles. Yeah. That's a pretty good way to be, Geek Pirate. All right, so... Actually, I should see this button.

01:43:55So true, it's disownable. But I'm seeing a delete button. What? Oh, it's the... If it's deletable, I'm going to... That's why I keep reintroducing this bug is because it's a mod. I never see this because mods are always allowed to delete comments. This is a bug. So I have been slowly separating out mod functionality into its own controllers because of bugs like this. But what's happening here is a lot of the... Yeah, a lot of the access control happens in model methods like this of can you delete it? And then there is the core business logic of, well, if you are the author and it was created in this date range, then you can delete it. But then there also is if you are the moderator, you can delete it. And so these two things, there is one controller action that is the user is deleting their own comment. But then also it has a bunch of if checks for moderators are allowed to delete user comments. And then that action infers, well, if you are not the author, then I know you're the moderator. And so I'll make a mod log entry and all that kind of stuff. But it re-infers that. And I have been trying to split this stuff out because what this means is I see very impossible UI, all moderators do, where I can delete this. If I clicked this link, I would delete it as a user because the check would say, let me go find it in the controller just to make the point. Comments is delete, right? It'll go into, right back down to the model, delete for user.

01:46:10Oh, this one is actually written in the reverse. Yeah, so I have the reverse bug where as a moderator, I cannot delete my own comments like a user because it sees that I'm a moderator and does this stuff and makes a mod. Oh, this is undelete for user.

...37Yeah. And then there's another check here that's trying to paper over this. So I can't, now I can't delete my comment as a mod. Basically these two things need to be two separate paths and I split off story editing. So there is the regular story editing form and then the moderator story editing form. And a big chunk of that was so that they could have different form variables. But part of that was if you throw away information and then try and reconstitute information, you are going to have bugs in one direction or the other. And we have a bunch of those. So now we are seeing this one. So since I am just trying to test css, let's put that in. There we go. Because I just want to see the damn disown button and fix it. There it is. All right. And then let's file that.

01:47:40One of the

01:50:53This is one of those that's it's hung out for years, this is not a good first issue because it it's not the code complexity, although there is a bit with the way moderation gets logging, but you have to know what's going on with mods and comments and disowning and deleting and. If you're brand new to the project you're not going to know alright so. Back to the thing I was doing, let's unshave that yak and advance. So this should become a link post to disown. Let's find another example. Can I have a class name? How do I pass along params? I know I did, right?

01:52:04Button label link options. Okay, so just that ought to work. your beer no okay all right so that's correct but it is blue so this goes away and

...42I think I just... Yeah. So... There's a... Post is displayed inline. And then... I'm going to say, if you are a link post that's in a byline, because delete, disown, all of these should be, then we will change the color, because that's the only thing that changes. And then this can go away. I'm just kind of skimming back and forth to make sure they're the same. All right, so down at the bottom, I can see pointer. I can see text generation. Outline should be here. Background is there. Border is there. Padding is there. And the color is the other thing. All right, so and then is that the last? Okay, we've got one in single detail is already a disowned. That's where we saw this bug before, Chamlus, is we saw it on the story and we fixed it there. So this can go away. Actually, it's not. In a byline, is it? It's called something else on story.

01:54:43Let's just look at single detail here.

...57Oh, it is called byline. OK. Shows how well I remember every CSS class on the site. And this one's also byline. Good. Nice consistency. Good. Fixing CSS by deleting things. That's satisfying. It is underlined, which I think in a byline we don't want. That's not the style there. It would stand out. So we'll say none. And view it. Good. And then close that and delete my, well, honest side. Make that.

01:55:52Good.

01:56:01I'm really happy with that link post helper. It's wrapping up a pattern we do all over the site. And the more we lean into it like this, the more reliable our CSS gets.

...23I've got to rebase onto the stuff I merged.

...33and let's just kick up a deploy i didn't have a open issue for that right that was just mentioned in passing let's look at this one you know as long as i'm mucking around in the comment stuff so if there's a disowned comment it's missing the folder so as long as i was just here you do see the folder ah it's because yeah all right let's just say you always see the folder if it's not gone then you get to see a score

01:57:36need a comment that is gone to see this wow that's let's just go to the one in the example which is j something no come here i have it there we go This isn't going to be in my local, though, because it hasn't. So I just need to find a gone comment. So I haven't refreshed my local database for a second.

01:59:09Okay, there we go. That's why is that holding the score instead of the whole thing?

...35That's not going to be right. Yeah, that's not right. But now it'll fold the whole thing? No. All right. Channelist, you and me have been breaking the comment folder. Can you immediately spot this?

...57So if we have a folder, it's inline block. chamlis_ sorry, was tabbed out
It displays the little checkbox, and then it climbs up and it says... No worries. I fixed the display of the comment folder, but it's only toggling the display of the voters? or the score and the upvote error, not the comment text. So here's the input, which is very strange. All I did was move the if not comment is gone to the display of the score.

02:01:14So this is the label for it. If the comment folder button is checked. Well, here's where it's hiding the voters. So this part is correct.

...39Did this, Oh, did this structure change for the comment text? Got comment text. And it's in a details. There's a details in between it and the comment. Is that the hassle?

02:02:09chamlis_ they're not direct children selector though, so I don't think that should matter
No.

...17Yeah, well, something matters. Comment underscore text. It's a deal with the comment class.

...37Is it the sibling selector that actually it's been broken for a different thing and it's the parent tree line getting in the way?

...54So let's put that back. Because is tilde adjacent or sibling? I can't remember. chamlis_ should be subsequent sibling I think
Oh no, plus is next sibling. Tilde is subsequent sibling.

02:03:30p span ran. Yeah, so that should work. Comment folder button check. Let's inspect.

...49You didn't change to say checked.

02:04:09What is getting toggled if it's not the checkbox? Oh, it's the, this might be a moderator thing. So if you are a moderator, it gets forced open.

...37Let me just log out.

...50No.

02:05:12OK, so is checking and unchecking. I just don't see the checked property appearing in the HTML, which is annoying. But I've debugged worse limitations.

...33chamlis_ hang on, could you switch back to the styles? I think you need a s/.div/div ?
And then in the details.

...45Oh, I see the dot. Did I? I think that's my own edit. Yeah. That's me accidentally editing. Yeah. So you don't, there isn't a little sigil in the gutter here. So that was me typoing when I added that inline. Yeah. So the only change I've made is that. No changes to the CSS yet. All right. So you were correct that that was a bad edit, but I don't think I even hit save on it. chamlis_ oh cos it's highlighted from the url fragment
Why is there an important, so this is the, this is the rule. Oh. You got it. Because it's targeted, we're overriding it. All right, so this display is working correctly now. Let's leave myself a note, because I'm going to foot gun myself and get confused again in the future, clearly.

02:07:27chamlis_ s/cos/because - I'm representing the UK on the global stage here
Where was that? Representing the UK folder. Ah.

02:08:01Alright. Alright, so now we have added more explain the site to the admin kind of code.

...35I wonder if instead of saying not. So I really important is so indirect, I wonder. If we said.

02:09:05not target, right?

...16And then I got to do the same thing for the voters, but let's just see if it works for one. Yeah, that's a nicer way to do that because then it's going to be all in one place.

...38So where are the voters getting hidden? Here. Yes.

...56Good. If the thing is targeted. Should child comments become visible? I think that I'm OK with. All right. So we'll say.

02:10:44chamlis_ yeah that's much neater
Now what do we got? I changed my own shortcut. It's going to take me two years to learn that change shortcut. So I used to have single letter C alias to clear. And I made that alias in like mid 90s. And then I realized I actually nowadays rarely clear the screen because I almost always want to have that scroll back available. And I run curl all the time, so I made single C an alias for curl. But the one time in a while, and it's really just between diffs, where I am trying to find... When I rerun a command with a lot of output, like a grep or a diff, and then I rerun that command with very slightly different options, I still clear between them because then I don't get confused where one command ends and the next begins. So it's probably going to take me like a year to change that shortcut in my muscle memory. All right. Yeah. Little bug in divtastic. Not bug, but it doesn't realize it would be a much nicer display to show me this right brace than that one. All right. So that's the change. All right. To fix, right. Why did this get highlighted? Because I put this back. Oh, it's because I... No, I didn't start adding things to the div. Why did I change? I sure didn't commit that. It's not gone. It's deletable by user. And you're only highlighting the false and.

02:12:50Show me again. Did I accidentally commit that in the last diff? Yes, I did. Because of heinous inline partial. Got myself. All right.

02:13:29What was the PR number or issue number for that? 1571. I'm like repeating the word fix.

02:14:01Nice to have that little bug fixed and the CSS improved and a regression that I just put in. Slowly, very slowly, the CSS is getting better and better on the site.

...20This is stale. Yeah, so the comment folder doesn't do anything on the targeted. Good. All right.

...36Okay, so let's look at my notes disowned button I got that all the stats bug so speaking of little things that have been bugging me, I wanted to take a look at the stats bug.

...54So I think what's happening is is looking it up as. pushcx https://github.com/lobsters/lob…
Can you find something with the current date rather than. The most recent stats data so here's this bug I am never remember to share links for the bugs i'm looking at let's go look at that.

02:15:25call get cash grant.

...33yeah which tries to read. cache key for the name and cache key is going to have the date in it right stats graph no it's just the individual name oh so it's not a time zone issue the cache is getting cleared

02:16:12So when we write, we say we expire in two days. So something is expiring the cache sooner than two days.

...28Man, and the cache is a global variable. So let's go look at recurring tasks. Isn't there something in here about caching? Yeah, so this runs every two days at 12 AM. Clear finished jobs.

...57Yeah, that just clears old jobs. What would be deleting from the cache?

02:17:20And there isn't a broad expire happening here. So I'm really suspicious because this started happening when we shifted into into a job. I wonder, I don't know, we have something to delete page caches, but those sit around on disk. They're not in solid cache, which is rails.cache. I guess let's check that the stats job is filling with the right expiration. So stats.cache. cache key or let's say users yeah and then let's cache get read

02:18:50And what did I just say it was called?

...59Fill my users graph cache.

02:19:11So now if we read, we get nothing. Are we filling under the wrong name?

...25This calls cache monthly graph. Why does the background job work and me calling that doesn't work?

...40I bet it's wrong because I'm in development mode. And so the cache is just getting silently thrown away, right? So I have to.

02:20:08Turn caching on, but then that warrants that's action controller. I don't know if that's actually going to be this cache. Okay. There we go. So it did actually write to the cache now. And do we have a, yeah, we have an expiration, right? So here's all our SVG. Now it has a created app, but there's no expiring.

...47Are we misusing solid cache and it doesn't have an expiring and it's ignoring the... Yeah, so that worked.

02:21:35We could be exceeding max entries or max size. You know, I don't actually see it saying it supports a per item expiration.

02:22:35it's a cached file okay so they have an example of on read having an expires in no this is oh this is the pass-through style so it tries to read and then it writes it only runs the block if it needs to

02:23:43That's cache control. So this is expires in. And a block is given the second argument. Is this only on that fetch?

02:24:23Two dot days is a duration. Expires at would be two dot days from now.

...37How does it know the expiration if there isn't an expires column?

...53Like there's created at. I think maybe this only works for Rails cache fetch and Rails cache write is ignoring it. And maybe fetch says I'm going to look at.

02:25:16The expires and if you give me a duration i'm going to count back that much time and filter created at and if you give me an expires at with that i'm going to again just check that would work so what that does watch this is going to lead me into a object suit where everything happens somewhere else. grayhatter_ what are we caching?
So let's. grab this. Can I not select the URL? The graphs on slash stats. This is bug 1562. It's just up one line in chat.

02:26:20see i don't see the can i not there we go hey gray matter you got your pr hanging out on Improving the About page for... Please don't post slop. grayhatter_ yeah, I saw the comments... it doesn't taste like dopamine anymore, so I haven't gotten back to it yet
There's no rush, but do you have any kind of timeline for when you want to take a look at that? If you're not interested anymore, that's fine. The first draft is enough, but I don't know what to expect. grayhatter_ I'm interested, and I feel bad I haven't done it yet
Yeah, that's fair. I thought it might be. so all right at least it's all in one file even if it's ravioli

02:27:53grayhatter_ I'm also applying for jobs so that's taken up more of my headspace too
yeah see there's where options are going in and read entry is passing them through so it's possible to All right.

02:28:40Oh yeah, gray header, I can see that keeping you busy.

02:29:01pc_magas Hello in my work I feel like trapped when pair programming. Like Ok Give it to me and let me see it.
pc_magas Do you get this feeling as well.
grayhatter_ I would never do pair programming
Hi, PC. It's been a while since I've pair programmed, actually, besides this. I find it Pretty great if you are sharing knowledge, like you know this section of the code and I don't, or you're a senior developer and I'm not. grayhatter_ lol, I'd call that mentoring, not pair programming :D
But unless it's about knowledge sharing, I don't tend to get a lot out of pair programming. So that's all I got. See, this talks about an entry having an expires at.

02:30:02I think of mentoring as the more general like. pc_magas For me I feel like I have to explain anything everytime. I prefer if I need to share a knowledge to mae 1m video and post it.
Let me suggest things for you and we'll talk about what's happening in your job or your career and i'll give you advice. I really do mean we are sitting at the keyboard typing together collaboratively pair programming.

...32pc_magas Like I am in coinstant watch or sth.
See, it's setting a entry expires at plus.

...47And then it writes an entry, but it can't write an expiration.

02:31:04grayhatter_ yeah, I get that, if you're doing it to teach the other person, that's still mentoring IMO... if you're both equal and/or peers, then it'd be pair programming, and I'd revert back to my... I would never willingly do that
so that's in cache entry right so there's where it creates a

...41chamlis_ is the entire entry ruby object serialised into the DB?
Makes sense.

02:32:23pc_magas Literally I feel like traped when i colaborate.
grayhatter_ pc_magas yeah, I wouldn't describe it as trapped, but it 100% makes it impossible for me to think
grayhatter_ if the other person is typing, I'd be slowed down, if I'm typing them saying *anything* would completely DOS my brain ability to write
is going to be in one of the individual yeah so we are looking for which one of these is going to be sql huh oh channels that's a good question that could be it we don't usually end up serializing things like that. pc_magas Idk it it my ego screaming or AHD
But what I'm getting from read is that

02:33:21Yeah that value is definitely some kind of serialized thing that must be what's happening here chamlus is that's really surprising to me because then they have to deserialize that object to clean old things from the cache or maybe they just only look at max age and they assume that That's enough enforcement. No, I'm just surprised not to see the expiration outside. So where was I? Here. What serializer? Oh yeah, okay. Message pack. grayhatter_ calling it ego feels like a cheap way to be dismissive of they way you think
Shoot, and I knew message pack was in here because of that log message that I saw.

02:35:16grayhatter_ pc_magas if it doesn't work for you, just say that, there's nothing wrong with something not being useful, or in my case, actively harmful
Yeah, it is just serializing the whole object.

...38grayhatter_ sounds like it's actively harmful for you as well
Come on.

...46Is there a get? What's the? chamlis_ maybe the cache backend interface has ended up being the lowest-common-denominator of all of them, so for example the file one can't store an expiration separately, but can store created_at as the ctime
So I don't want to read. I want to see the entry object.

02:36:07Yeah, channelist, that is probably it.

...22So I'm not spotting something that looks like it'll let me peek under the covers and see the entry object itself, rather than the value that was cached, which in this case is a string of SVG

02:37:00I would expect it to be here. And I kind of get, in the OO sense, why I'm not allowed to see that. But I think something is happening wrong.

...21Do we configure the cache with a max age of 10 minutes or something?

...34Now, this max age is cache control headers.

...47Did we see what the default max age is? That implies config cache YAML.

02:38:08Max age is two weeks. So what's happening here? Why is it getting expired?

...31Actually, maybe it's that max size. How big are these? The SVG is reasonably large.

...51Yeah, so if that is 105K, maybe we're just shoving so much stuff in the production cache, it's getting shoved out. Let's go look at the production cache.

02:39:08I think this is old, and I reorganized April 26, May 22. There we go. Yeah, so this one, this is old. I just haven't removed it. That's scary. Let's put it over there. and the same is true of the queue directory i had these split up and then i was like oh i'm going to lose my mind if i have one directory for each sqlite file that was a mistake so let's shove that off to temp and storage is the active storage stuff and it's not used hmm

02:40:03Bad typo. It meant MV, not RM.

...23All right. 251,000 entries.

...38Or wait, let's just look at the size on disk, right? We are hitting the max size. This is 290 megs. That's what's happening. The cache is getting evicted because it's that size. All right, so let's look at what's in here.

02:41:07attack oh because rack attack has to create a million small keys so let's

...48yeah i have so i'm not surprised by the numbers i must have typoed or it doesn't like this look like

02:42:32Does like work differently in SQLite? Apparently not.

02:43:05I'm, I'm confused.

...37Okay.

02:44:18grayhatter_ try LIKE
grayhatter_ no, that's not it, sorry read the example text wrong
Oh, that needed a limit.

...31Okay.

...56leave you that's everything wait this is very silly i wonder if could this be like a single quote first double quote thing nope

02:45:43grayhatter_ try %production
chamlis_ the only unlikely possibility I can think of is weird nonprintable characters somewhere
They're doing the exact thing I'm trying to do.

...54grayhatter_ ^ exactly why I want %production
Except I copied and pasted it because I was worried of typos. Oh, try percent production. All right. I didn't see that. Thank you. Yeah, this is still finding it.

02:46:14grayhatter_ maybe it's in the ::
What if I just said crack attack? No? Do you not like the colons?

...33Yeah, so do you have an I like? grayhatter_ wtf
No. My SQLism.

...50yeah okay all right at least you're stumped too because i'm really stumped is it only doing a prefix no so i just want to get an idea Of how many of these cash entries are rack attack because i'm going to guess it rounds to 100%. hmonk does like not work right on blob?
Just like not work right on blob oh there's an idea H, I mean.

02:47:48Yeah, key is a blob, not a text. SQLite is kind of infamously chill about types.

02:48:01It doesn't say text. grayhatter_ can you print the hex value of key?
It does only show... All right. No, I think... hmonk i think or i'm sorry gray header i think hmonk is onto it that you can search on blobs they claim you can

...53grayhatter_ hex(key) LIKE '%F0%';
What if I said where the substring of the key, was it substr key 125 is like, because we know substr is going to return something, right? Production rack. No, no matches? I don't believe you. Right now.

02:50:11grayhatter_ print a key using (hex)?
grayhatter_ I wanna see if there's any non ascii
stays a blob how do i cast to a string i could say hex i can say quote all right one moment i do see what you're suggesting and i will give that a try in two seconds after this fails on me grayhatter_ do you're thing first, I'm not rushing
He said, optimistically. All right. So if I can say that, can I say this?

...57Not quote. It's text.

02:51:09grayhatter_ I think text needs to go text(key)
I honestly thought that was going to work. All right.

...16grayhatter_ substr((quote(key)
Sure. Let's just try where quote key. grayhatter_ print it with quote?
Yeah. No. All right. chamlis_ `cast(key as TEXT)`?
So that works. And then

...53Oh, Chandler's got it.

02:52:09grayhatter_ sqlite is WEIRD
chamlis_ good spot hmonk for sure
hmonk @chamlis_ PrideHeyyy
grayhatter_ hmonk++
All right, so there's the amount that our, yeah, rack attack has crowded almost everything out of the cache. Yeah, I really... Hmonk, you put us onto it. And then Chamlus got there. So let's... Chamlus is already... Oh no, I am unable to add a VIP. Visit the achievements page on your dashboard to learn how to unlock additional VIP slots. I need more people to watch in order to thank people. Oh, Twitch. Whoa. That's not what I wanted. I wanted key. Okay. So there we go. There are some things getting cached. But everything is basically getting shoved out by rack attack because it has so many small entries that I knew the fix a minute ago was going to be. Let's just nudge up an order of magnitude.

02:53:55You know, the other fix would be to put Rack Attack in its own database, but I think I'm okay with that.

02:54:13grayhatter_ that's what I'd do
grayhatter_ future you will thank you if you decide to do that
What was the number on that? 1562.

...29I already had it in there.

...42Yeah, it's caching two very different kinds of things. And you know, the way that works with a max size and a max age, this bug is going to recur

02:55:02grayhatter_ some cache data is more important than other cache data
I think maybe what we're seeing is that the Rails cache really wants to be used with that write-through model of you try and find that key and you pass the block to fill the cache if you don't find it. grayhatter_ abuse logs for enforcement are very ephemeral
And you have a really good point that some cache data is more important than other But I kind of don't want to think about that level of detail and prioritization in the cache, especially with disk space so cheap. grayhatter_ disk space is cheap, ram isn't
Like, I didn't even check, but yeah, prod has 53, 181 gigs free. Why am I thinking about the cache size so much? Yeah.

02:56:02grayhatter_ downtime recovery eng time, isn't cheap either
Yeah, the way Rails has made it very flexible to run, to connect to many databases. grayhatter_ but now I'm fully into bikeshedding this :)
I mean, you almost, we could nudge towards one type of cache, one cache per type of thing cached. Like, yeah. You know if you really want to bike shed this kind of thing, have you seen my note about us moving to hatch box, I think I mentioned it on the last stream. But our deployment is all set up with some ansible scripts and. I have been badly maintaining them myself as an expert user for five years and between that and bit rot and. vinitkme Hello. Hello!
vinitkme How are you doing today?
know the ansible project marketing on they're starting to get flaky and i've never had a lot of confidence in them and i have some real annoyances like how long they take to run i mean you can see that just here on stream i've deployed twice and each one takes 60 seconds to deploy four lines of string oh hey vinit and Hatchbox seems very much worth a couple of bucks a month to have basically a professional maintainer for a script that deploys a Rails app.

02:57:51Oh, five, two.

02:58:32grayhatter_ I'm vehemently opposed to version pinning ... but I would rather just stick to a working version, and not fsck with extra 3rd party complexity
David I'm doing all right i'm Gray header where does version pinning come into it. i'm not sure what you're thinking of here. And, like in the lobsters gem file, there is only one I think version pinned for maybe two I think rails itself I pin and then common marker. grayhatter_ install the rails version you're using directly to the server, ansible scripts not required
They updated their API substantially, like it's a major 1 to 2.0 major version change, and we have to rewrite our usage for the new API, and nobody has taken that on. But otherwise, that's it. Oh, install it. That's just me manually doing DevOps on the server. grayhatter_ why did it break?
That one's not reliable. We did that for a while, but

02:59:28It's all the stuff around it. Like when we deploy, we have to remember to... It's deploy scripting, really. grayhatter_ rails is weird, I push code to server, and restart the server... done
You have to run bundler. You have to get any new gems that are specified. grayhatter_ s/server/daemon/
You have to kick off a phased restart of Puma. but then you also have to compile the ChaelCodes About deployment - Hatchbox seems great. They get a lot of questions and support on the GoRails Discord. I like Chris and Collin.
assets there's a bunch of stuff that we do here let's i don't know the go rails discord i started listening to the podcast but i don't know that

03:00:34Let me go one thing at a time. So this is done.

03:01:59What was the other thing?

03:02:36So next thing is light mode warning. I'm going to bring up the mission control and then kick off that background job. So we fill that back in and then slash stats should be fine. And if I come back this evening, that should be fine. All right. So then kind of Popping the stack, let's grab a new terminal.

03:03:20So Greyhatter, if you haven't seen our Ansible repo, there is a bunch of setup stuff it has to do, which is like, okay, there's the one-time setup stuff of create some directories, But then there's other stuff like putting SSH keys and config files in place, and not all of those live in our code repo. Making sure that things like the database folder exist that I was just dinking around in. Oh, there is installing the current version of Ruby. So the version that is pinned in Ruby version also has to get installed, which means we have to pull in the current version of Ruby build quite often. We have to run breakdb migrate. That wasn't mentioned in your push code to the server, restart the server done. Then there's the recompile. Then ideally we do a phased restart of Puma because we don't want the site to 502 while we are deploying. This is almost gone now to maintenance. And then there's a little more plumbing. This stuff is moving over to the solid queue recurring tasks as one more of my workflow. But I guess the point I am kind of beating to death is there are extra steps for deployment that you're not accounting for. And the fact that they are sometimes tasks of only sometimes we have migrations, they can't be done by a human. Just humans are very bad at that kind of when you deploy, you have to review all of the commits and check them for migrations. I don't think that's going to happen reliably.

03:05:41All right, well, so off stream, but.

...52Jail, I just took a look at joining the go rails discord and the invite thing. Didn't work on discord.

03:06:09grayhatter_ I am considering it, but my solution is to make db migrations painful for myself... then I'm careful around the db "API", so that I don't have to change it often
I think it's trying to start an app or something. Oh, there it goes. Just took three ties. All right, well, maybe I'll see you on there.

...29grayhatter_ I'm not actually suggesting that :D
I can see how migrations would work that way. I don't know. I meant to mention. I already said enough. Interesting deep dive into the Rails cache. chamlis_ > a few minutes
I hadn't realized it worked that way.

...58chamlis_ :)
All right, so I have been going for three hours, which is the usual, what's a few minutes? Did the stats already get booted? chamlis_ no you said you spent "a few minutes" looking at the stats issue
no they're pleasant present pleasant that was a weird one oh you can tell we're getting to the end of the month right the dot is creeping up yeah all right so i've been streaming for oh i said i spent a few minutes looking at the stats issue yeah i don't actually have a good feeling for the passage of time here on stream But I was just looking up and seeing that it's been three hours of stream. So even though I didn't get to any of the story UI, I feel pretty good about doing a deep dive that someone else could not have done because nobody else has root on prod. All right. Why did that refresh? Oh, because master moved. Yeah, master move. The PR didn't. All right. So I thought I was going to look at these two. So there's a couple of gems that look quite promising for writing restartable item potent jobs and then for testing jobs. And I would like to move more of our functionality off into jobs because something broke in. in creating links, hold on, I don't need to be passive voice. I'm not Microsoft PR. I broke posting links in comments and some people were seeing 500s, but it was in a really inconsistent place where it persisted the comments, but not the ancillary model. So they saw a 500, but their comment did post. So I created dupe comments, trying to retrieve things. From the 500 logs it was it was a mess that stuff should just get shoved out into background jobs, but I guess that'll have to be next stream, which is scheduled for. Next Monday at 2pm Chicago time and at different times in different places. chamlis_ thanks for the stream!
So i'm gonna call it there, I hope to see you all on the next stream or. in the poll requests if you would like to contribute, which is very much appreciated. Thanks very much for tuning in and take care, folks.