I need to get myself a tricorner hat, a parrot, and 100 bangles

Streamed

Explored jujutsu (jj) as a git alternative, sharing my first week’s experience with its error messages, operation log, and commit editing. Fixed the /top route to show help text and pluralize β€œof the past” correctly. Reverted PR #1597 due to Ruby 3.4.4 compatibility issues with common_marker. Merged PR #1592 to refactor the story repository with better ActiveRecord scopes. Fixed sitemap generation that was broken for over a year and disabled deprecated Google ping. Added comment filtering by tag to match story filtering behavior. Ran SQL queries to find stories with the most comments.

scratch


topics
  discussing jujutsu/jj
  /top: show help text about time, pluralize 'of the past'
  hatchbox branch: log error
  bump to ruby 3.4.4; revert https://github.com/lobsters/lobsters/pull/1597
  refactory story repo https://github.com/lobsters/lobsters/pull/1592
  sitemap generation https://developers.google.com/search/blog/2023/06/sitemaps-lastmod-ping
  ansible broke? nope, ubuntu outage, oof
  query: stories with most comments
  comment filtering by tag fr

  rm keybase
    https://keybase.io/blog
    https://github.com/keybase/client/graphs/contributors
    https://github.com/lobsters/lobsters/pull/661
  fold wiki history into repo



title
  not being told I'm in a detached head state like I'm a french noble in 1790
  I need to get myself a tricorner hat, a parrot, and 100 bangles

post-stream
  bug: if last-read marker is on a comment/story filtered out
  filter: when viewing a story, warn of filters
  reactor: migrate cookie tags to user filters
  pick up rappin pickaxe 5th book
  make the mass-tagging admin tool you've repeatedly done manually
  nested vim: replace block with optional warning
    

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

Recording



03:12I'm Peter. This is Lobster's office hours. I'm getting pinged on IRC. I am a little bit discombobulated, so pardon that I'm starting a minute late. Just running around this morning. Let's see where I'm at here. there's this stuff still hanging out so I meant to recreate it you know what it's actually just faster to rip stuff out there's PR as I know I'm pretty sure there's an issue and there's a comment filter tag feature request this is from last stream that actually didn't make it onto my to-do list so i'm going to just leave it for this week or this day so this is office hours for lobsters which is this website and

04:42Getting a lot of messages? Okay. I see. gsora_ hello there
It's just the notification didn't want to clear until it had been clicked on. It's not enough to read it. You have to focus the window. So, all right. So let's see. Let's put the message in chat. Hey, Sora. Gee, Sora. Yeah. pushcx This is Lobsters office hours, you can ask questions about the site and community anytime!
This is Lobster's office hours. You can ask questions about this in the community any time. And then otherwise, when folks aren't asking questions or running production queries... Oh, there was a query by one of the mods in the mod channel. I might as well do that here on stream.

05:31Someone asked, what are our stories with the most comments? And we don't actually... have a view that surfaces that we have a little known view called slash top and it has a even less known where's my help text did i not see you can say like five weeks oof and get a bad conjugation but you can kind of pick your fix that.

06:31You can see me find bugs in the site live. So anyways, let's see. I usually start with Pull requests and issues. But honestly, that one is small and irksome. So, I have been playing with Jujutsu. I mentioned it on the last stream. I like it. Whoa. This terminal does not have the right pager. Huh. Why doesn't it have the right pager? gsora_ how are you liking jj?
Because...

07:39OK, there we go. So I'm liking it a lot, generally. So I've been using it very lightly. I worked through Steve Klavnik's tutorial that took, I don't know, call it two hours, with lots of playing. So if you're in a hurry to get through it, you can probably do it in an hour, 90 minutes. And then I've kind of slowly been using it here. yesterday i had my first goof where these two commits solidq logging and reusable apps were actually i meant to separate them and then i squished them into the same commit just because i accidentally wrote one commit instead of remembering to run jj new to start a new commit and then I ran JJ split and it was actually really chill to split that out. Like I split it into two commits and I did it wrong, but it was very easy to edit the commit and get exactly what I wanted, where honestly, because I'm touching such similar files, I probably would have been chasing a merge conflict in Git. So that was actually kind of impressive that the thing I seem to be liking most about it is the stakes are much lower. It's not just that it has a very different workflow and simpler primitives. It is very easy to edit and rearrange things and make them nice and a lot of that is that the console UI is very, very nice. It's very thoughtful. gsora_ huh, lower stakes is an interesting pov - didn't try it myself, might do in the future for personal projects
It has clear error messages. I don't have to be told I'm in a detached head state like I'm a French nobleman in 1790. I'm a gsora_ lol @ detached head
Yeah, like, so one of the things I like about it is, so it has, I'm sure you know, get rebase, where you can kind of rearrange your commits and edit them before you ship them up. And, oh, I should put that in a title. What did I say? Not being told I'm in a detached head state, like I'm a French noble. I think that's roughly it. I'll have to see what the robot says in the transcript. So when I have rearranged commits or moved them, the tool is a little more ergonomic than the git rebase tool. And this is the nitpickiest thing. But by default, the log goes, here's the newest commit and then backwards in time, right? And git looks the same. The newest commit and then backwards in time. And then when I rebase, it is the oldest commit going forward in time. And every time that throws me a little. And I'm aware I could make the log print in the other order, but I look at it this way and I think of it this way. gsora_ that got me a few times yeah
And so having the new commit at the top, at the bottom, I don't know it's just one of those very little Polish things and the jj tools are like this all all the time, all of the error messages are clear everything is more relaxed and then. It has some nice features that I think I learned from geordie gh who is active in the chat room and a big mercurial fan I think he said it came from mercurial but when i've had a conflict, it is not a. bsandro VoHiYo
stop the world moment it is like oh this commit is messed up but you can keep going doing what you're doing so it is totally possible for like if i rebased everything back here like this commit would have a little red conflict on it but i can still keep like editing these other commits or rebasing them or moving stuff around and then come back and deal with the conflict on my own time and the conflict tools are a little nicer so Like, it's nice. The one, there is one little bit of a gotcha. So everybody says, you know, it backs to Git. And this is just, I mean, you can see the path is the same, code lobsters. This is my Git checkout. It thinks of commits as mutable until you share them. And I'm still just barely learning that. But because it stores in Git, gsora_ oh, empty commits
it uses git differently than a person so if like if i run git status i'm still here i'm still in the git repo but if i run git log oh not this one git log oh yeah so i'm not sure why they're not doing the the tree branching but you can see that there are lots of kind of intermediate or repeated commits here. And this is, yeah, so this is, JJ is very, very smart and deliberate and careful. So it's sort of internally, every time you run a JJ command, it sort of mentally snapshots your repo and it doesn't show you it's doing this, but it does this so that, Man, I told you I goofed up. There is an undo command. So like I goofed up a merge and I typed JJ undo and it was just done. And then if I want, I can say JJ op log and I can be like, oh, okay. gsora_ woah, that's cool
So when I ran JJ status, I want to go back to that exact snapshot like I was 22 hours ago or... I mentioned I split that commit. You can see here that I did that. If I did that wrong, I could say undo to this point and I would immediately be back here. And I did this once, like the first time I did this, it wasn't part of the tutorial. I just goofed something and I had heard that there was JJ undo. So I ran it and it backed up and I was like, oh, that's neat. Oh, I need to be one more back. And I said, JJ undo again. And it said, you know, I'm about to undo your undo. And I'm not sure that's what you want. Maybe you want to run JJ op log and pick the commit that you go back to. And I was like, hey, you're right. That was exactly what I was trying to do. Well, I know what working with the ref log is like. What's this like? And the other nice thing about this is like, if you look at this, it's like, oh, this commit lived for seven milliseconds. I don't really care about it. I can obviously skip over that. Epic_Ninja_Elephant Oh hai. Are we gushing over jj?
But this commit that lasted for three minutes, that's probably an important commit. Like that's something I worked on. These must be, or maybe these are just the times it took to run, and this one, because it was interactive, took a couple minutes for me to read and learn the UI. Yeah, I'm, so I'm not a total fanboy yet, but I'm on the path, because it's just nice. Oh yeah, I like that it, when you look at the op log, it's like, It tells me exactly the command I ran. So like this one, if you read it, and this ZZZ thing is like a placeholder root commit. So I was confused here. gsora_ wondering if the command history is also pushed to the remote
And so like I can look at the log and be like, oh yeah, I was confused about what I was doing. If I want to back up, probably I want to back up to the one before I ran a confused command. So I was just, no, command history is local. As far as I know, there's, I don't think there's a way to share it. Yeah, so you can throw it away. Show changes in the repository and operation. Oh yeah, so you can view exactly what happened at each command as well. So that's why there are those empty commits and duplicated commits happening in Git's view of the history. So the end of that thought on my one caveat about, yes, you can use JJ with a Git repo is, gsora_ i like that it's... vcs agnostic? backend agnostic?
If it is co-located, if it is the same repo, Git is going to get a little bit noisy. And it's harmless. And you're not going to, because all of those are commits off without branch tags on them, you're not going to accidentally push them. I don't think it's VCS agnostic. I think they just went, boy, it's a whole big project to make a durable file store at the level of reliability you want for source control. Let's reuse one instead of invent our own from scratch. And I think that's pretty smart to avoid taking on an enormous hard project when you are already doing the enormous hard project of coming up with a good model for VCS and then putting a good UI on it and then revising that. It is also maybe a, what do you call it?

17:18It's also maybe an adoption strategy where if Jujutsu interoperates with Git very cleanly, it's a lot easier to adopt it. Like if this was, I mean, Mercurial or Darks or something where I had to throw out the Git repo or do a one-time cutover to it, realistically, the benefit has to be enormous and very clear. Whereas this is like, I can play with it. And if I don't like it in a week or two, I can just quietly stop using it. I think there's like a .jujutsu, yeah, a .jj directory. So if I blew this way, there's that. And then I would probably want to run some command to... twitchtd that's a nice compatibility layer
clean out the abandoned git commits, these like internal checkpointy things. That's pretty simple. I can almost write that off the top of my head of if it's not on a named branch, drop it, right? Like that's a one-liner in the shell. So that makes it a lot easier to play with. So, all right, let's keep playing. So if I run status, yeah so one of the big things that flips is rather than you do a bunch of work locally and then you make a commit to kind of memorialize it like stamp a big entry in the log you have your working copy and it has a description and you can name what you are doing or not before you start And since JJ snapshots things all the time, if I get halfway into a commit and I'm like, oh, I should have done something else. It's not like I stamp a whip commit and then I know I have to come back and edit it. It's part of the normal edit workflow. I'm sure it'll happen here today. So we will describe this current commit as add help and Fix title. And of course, I can continue editing that. Yeah, see, it says it's empty because I haven't done anything. All right. And then where's the bug? So probably the first thing is home controller has a top method. And one of these is supposed to say, yeah, so there's this above and below. And I don't see that it's mentioned. So the title So that one would be singular, and this one would be length-der, right? AnakimLuke what does ||= {} do?
AnakimLuke not too well versed in ruby
little funny about the inline ifs this is got to turn on the turn on the local development server and then still on the or equals is a lazy initialization so if the variable is uninitialized It is like saying var equals var or empty brace. Why does this happen? I must be slow coming off a controller. So there's pluralization. So not that I need to, but if I run status, you can see that I'm working on something. And if I show it, I get my diff. which it uses a different diff format. I'm giving it a try. It's not diff-tastic, but it's pretty nice. And I'm kind of sticking with stock. I don't think I've... Yeah, so the only, whatever, this first line is a default thing. I love that it's total. There's my info. And then this thing, I Googled it, but I don't... When you say like log, it automatically starts the pager and they decided to start the pager every time. And when I run JJ stat, I don't wanna be in the pager. So this is, if I'm in the scope of running status, will then set paginate to never in the UI. And I don't totally understand this syntax. AnakimLuke that syntax looks backwards wow
I blindly copied and pasted that from some forum about jujitsu, but all right. Where's... Yeah, so which line did you see that on? gsora_ ah as if it was += for integers
you're looking about 304 yeah so it's equivalent of saying RSS link equals RSS link or right so it's saying maybe this is not initialized maybe it's a nil maybe it's false if it's present leave it as is otherwise I want to initialize it to this so It's a very common Ruby idiom. You get comfortable with it. Yeah, it's sort of like plus equals. Well, I am sure. Let's see. I'm reaching into my functional programming knowledge.

23:25I am sure there is some way of saying that they are the same in mathy terms. It's not that they're transitive and I think it's replacing an identity value. I don't know. It's almost there, but I don't use the jargon enough.

...53Where's that help text?

24:05So somewhere in the repo, there is already some help text explaining this thing about the URL. And I'm trying to remember where the heck it is because I want to reuse that. Comments, search. Unless I accidentally deleted it?

25:03Is it not below on any of these guys? All right, I'm back in the controller.

...19Partial for recent. What's in there? Yeah. The multi tag tip. And that's it, that's.

...50i used to have no i bet it used to be in app views home index i want to see the log and do i have a top

26:23This is all right. Well, I guess we'll explain it from scratch.

27:02I had the multi-tag explanation. No. Where was the...

28:13I thought, is it recent? Hint. Hint, not help. I looked for the wrong thing.

...36What if I looked in stories? Yeah? Guess not. Sign up. All right. Really don't have this code. I thought I already had it.

29:13Where's the, what did I call it? Helper duration, helper time, helper interval.

30:20twitchtd AnakimLuke a[b] ||= {} expands to a[b] = a[b] || {} so when a[b] returns nil, it will assign {} but when a[b] already has something, it will not do anything, it's like a way to conditionally assign something
pushcx https://pragprog.com/titles/rub…
yeah oh speaking of core ruby stuff i just heard a podcast this morning that there is a new version coming of the pragmatic programmer book on programming ruby so this is a just a huge classic in the ruby community and i want to say the last edition was 10 years ago something like that it was getting pretty long in the tooth and the language especially in the i don't know one of the things i like about ruby is every dot release three one three two they're adding more new and interesting stuff so the language is improved meaningfully and then also community has changed so like the old pickaxe book had a chapter on style issues and now i don't know what they've actually written i haven't read the new one but they pretty much could just say install rubocop or better install standard rb and be done with it which podcast was that ah it was the pushcx https://shows.acast.com/dead-co…
dead code podcast right yeah here we are so this is a nice interview with the author about taking up the book and writing a new edition so he is not noel rappin is a very famous name justifiably in the Ruby community. He's done a lot of great stuff, written a bunch of things. And then Dave Thomas is one of the authors of a previous edition. The other coauthors dropped off and it got handed to Noel with Dave and it's, I think it's in great hands. It's really nice to see a community cultural touchstone getting updated. even though I probably will not learn a heck of a lot about it. I am, was it out already? January, ah, it's out. moussx_ 716 pages damn
I am out of date. I gotta grab that just to see where it's at.

32:52Oh yeah, I'm gonna grab the PDF, not the doorstop. Ruby's a big mature language. All right, so we were saying, let's use some Ruby, right? Epic_Ninja_Elephant 716 pages for a programming language is a light-read by modern standards.
moussx_ I think I messed with your notes, you typed 726 instead of (probably?) 5th ed
We were going to say, come here, interval helper, time intervals, map. moussx_ 716*
Well, I think one of the things that makes it long is that Ruby is, did I? Oh, yeah, thank you. I totally just put the wrong number in.

33:41gsora_ does "javascript: the good parts" meme applies to ruby as well? :P
It's hard to say one thing and type another.

...48moussx_ yeah totaly get that LUL
twitchtd ruby is more sane
So how do we want this to appear? Yeah, Ruby is a... popular multi-paradigm book, so you can write a functional Ruby, an OO Ruby, almost a logic Ruby, a hacky shell script Ruby, my kind of fun. I've also been learning Lua recently, and it's kind of funny because all of the books are short. Nobody's like, here's a giant thing. They're like, yeah, this book is 50 pages. It's a small language. Deal. Very different language design philosophies and niches. All right. That could be a semi-colon. moussx_ I feel like you could easily write 150 pages about meta tables though, that'd be cool
What if I just called inspect on it programmers, right? moussx_ Especially to help understand javascript with a smaller language
One of the things I like is because it's a site for programmers, I can occasionally just dump code in like the username validation. I just give you the rejects that We're going to use to validate your username and the what's the other one. When I search, I show you the parse tree. Well, it's my typo.

35:26You. Okay, so that's... The shame inspect does the old style syntax. So Ruby has kind of two styles for hashes, and I would prefer it look more like the new one.

...48Or just had less punctuation in it. So let's say...

36:05We will return a string, and we will say the key goes to the value.

...31And then we will just join that with a comma.

...40I can't type. That's because it's fine. I'm allowed to say that. Because ERB is unsafe, it has to escape everything. I can say raw, or I can mark the string as HTML safe, I think. There we go. It needs a space, but that's basically what I want.

37:24There we go. I don't think we need the capitals, do we?

...38That's it. Lower, too lower. No it's down case sorry it's a verb, it is kind of a slight quirk of Ruby that rather than. yeah that's true right.

38:00So this is. kind of wordy.

...13gsora_ was about to suggest that
I'm thinking about bolding the first letter of it.

...24And then I think that might be a little too clever. I get it as I write it, but if I were reading it, one of the things I wonder is home controller.

...45moussx_ It's a bit clever, but at the same time, you give the "5d" and "2y" examples just before
moussx_ So I think it's fine to have the bold first letter?
yeah so if there isn't a duration i think one thing is you can view just slash top i think maybe i should make this redirect someone true maybe this shouldn't live at this page it should automatically redirect to slash one w five Because this comment is wrong because it's not edit, it's add to the URL to add. All right, let's try both.

39:51moussx_ Next question then is "how do I do top all-time?"
And then.

40:10Does this always restrict? How does this work? Return placeholder. twitchtd big numbers for time interval?
I don't think it marks that the placeholder is a placeholder. Yeah.

...38I feel like All time is you can put in 99 years, people will figure it out. There isn't a special syntax for it.

41:03Do this. Yeah, then I want to say, here I want to say place folder false, which is a lot of generality for one place.

...28What's the?

...50of what I wanted.

...58What did I call it? Oh, it's just top level. Routes, top path. If I say blank colon one week. Yeah, you put it on the, because the route could be better.

42:24yeah we don't actually need that to be no i'm trying to remember the routing dsl of how i mark these as optional

...55So can I just say...

43:36See, that looks good.

...43That's correct. And now I could also add page colon two. Yeah. And if I leave it off, yeah. OK, so it should always have been like that. That's fine.

44:02So now I can say turn redirect to. Top path with a length of one week. It's been one week since you read stories. Cocked her head to the side and said, I'm angry. I do not have my singing voice on today. I'm a blasted karaoke.

...34This song is a meme and people are younger than the meme. gsora_ oooo commit editing!
all right let's make sure that doesn't like all of this is help stuff except defining the route there is the small chance that i've done something wrong in defining the route there is the large chance that i'm logging to standard out i know exactly what commit that is oh you know what i'm on the hatch botch box branch instead of on master so we are going to get to see commit editing in about two seconds All right, so we got an actual error that is about logging. OK. All right, so we are doing work over on the Hatchbox branch, and we need to be over on the master. So how helpful that I have just shown you. This is totally planned. What an example of forgetfully doing. Oh, god, and I've even mixed up something. all right let's so this is hatchback stuff why am i seeing it all right so let's look at just the current one because i think when i did show i was seeing the previous so the one with the at sign is where i currently am so the thing it's doing with the purple here is that's the unique like this is the full I don't remember if it's called commit or change. One of these is the commit, and one of these is the change. The left one is stable. The right one changes like a git commit hash all the time. And I don't remember which one is which. We'd have to ask Steve. So show was showing me the previous one. So this is all the top stuff. This is what I want in the top stuff. Great. so let's show can i just say show me master right yes and that's from the last stream i want to just see it in the tree yeah so here it is back here lwn hey famous all right so let's rebase let's remember the commands they're a little different Chindiana_Jones Hello. Lobsters seems very interesting. Just out of curiosity, how many users do you guys have?
pushcx https://lobste.rs/stats
all right so i can say source or branch right i just want to say this one commit we're going to rebase this one revision which is current ah indiana jones is that chicago indiana because indiana's right there but to answer your question not status Chindiana_Jones Ahh tyty!
we have a slash stats page that is maybe more useful than the total number of users. I wanna say total users in the database is 120,000, but most months we have like 2,500 active. And that doesn't count people who are logged in, but passively read. This is, that upvote or submit a comment or submit a story or flag if they just read and don't interact they don't get counted and you can see all the source for that in stats controller or no it's over in the stats model now so we're going to rebase that command over to the destination master zap so my gsora_ i kinda see why people love change ids now
whatever this left id is that didn't change but the one on the right does that's fine in case you're wondering it's doing something clever where i think all the ones on the right are hex and all the ones on the left are alpha numeric but never using a hexadecimal value you know so it's the alphabet g to z no hex so that's how you can tell them apart yeah yeah so now if i look at the log i've rebased that thing without thinking about it cool and everything is where i wanted it to be and now if i run the specs they should pass because that error was over on hatchbox and come here be good

49:27Yes. Cool. So there we go. All right. And then let's push this, right? Yeah. So I have a reasonable description. I have the commit. I want, I don't want to do any other work on this commit. All right, so let's go ahead and say, no, no, no, hold I have to do... So the thing I'm most getting used to, and it's funny because Klebnik called it in his thing, is branches by default are not named, and it doesn't... So you see master here. I don't track that I have a local branch named master and origin has a branch named master. The branches are anonymous. They're just commits hanging out. and i'm not used to that i still think it's kind of weird i understand i am expected to get used to it in a few weeks or months right now i'm very suspicious of it because i'm on day five six but that does mean so this is not a branch this is a bookmark and i say jj bookmark set master to My current revision and then I can say jj get Bush master. No, I can't name the branch to say bookmark master. Chindiana_Jones jj?
Yes, there we go alright, so now, it is also said heads up you just shared that so now I am making it immutable. So it's very chill about jumping between commits and editing them. I haven't shown you that, but that's very easy. But now that I've pushed it up to GitHub, it's immutable because it's shared. So I cannot foot gun myself by editing a commit casually. And then I had talked about how you make a commit. So this must be the commit ID on the left. Before, pushcx https://steveklabnik.github.io/…
where is it steve yeah here we go so jujutsu is an alternative version control system and it kind of runs on top of git so where's i want to figure out the right names for the left id and the right id because i should actually know how to talk about this thing okay so we have two changes not two commits

52:33Okay, so change ID is the guy on the left, and then commit ID is the guy on the right. Change commit. And then the row is called a change. Got it. I knew he had explained it. It just didn't stick. The practical thing was left one stable, right one mutable. All right. So... It also says a new commit has been created on top of it. It's odd that it says commit instead of change or revision, but whatever. So now you can see just as when I had started this slash top thing, I had described that commit and prior to it, it said it was empty because there are no changes and there are no description set. So if I want to come back to Hatchbox, well, let's look at what's in PUV. J show pup. Okay. So this one. Oh, I've accidentally made a bookmark. Is that why I'm okay. So I accidentally made a bookmark called ZZZ, which we saw in the op log. And I didn't realize what I was seeing. Cause I'm still learning my way around. So bookmark, I think it's just RM. R for remove. No, R is rename. Let's try delete. I'm just guessing. See, one of the nice things is even though I am deleting things and just naming stuff to delete, I feel very chill and safe about it because of that op log where if I had goofed that and deleted the change ID ZZZ, which is the repo root, or 0 0 0 is the root, you know, like if I had done something destructive, I could have just come back here and said either undo or let me look in the op log to figure out how far to back up. So that's why even though that was a destructive operation, I just kind of smashed at it and guessed it what the name for the command was, because I feel safe. I don't feel like I'm about to drive off the commit cliff and have to extract my work from the burning wreckage of the ref log at the bottom of the canyon. AnakimLuke ah, the reflog :D
Even that is just, that's great. I mean, you know, I break prod enough. I don't have to worry about breaking dev, right? So let's look at here. gsora_ i'm assuming jj keeps the entire repo history available forever, wondering if cloning a repo becomes a long operation with more and more commits/operations
There was a failing test, right? Which one? The CSP, that has been languishing.

55:38I have no idea. JJ was developed by someone who works for GitHub, I'm sorry, not GitHub, the other big G, Google. My understanding was they at least had in their mind the idea of scaling to Google size repos. So there is presumably some way to get partial repos. I have no idea because, you know, lobsters is a tiny repo by Google or GitHub scale. I have no idea about like partial checkouts. I would expect that it has it or will have it soon because Google used to use Perforce for a long time, and I know it has partial checkouts. And then they wrote their own thing, Piper, and I'm almost certain I've seen that it has partial checkouts. So it seems real likely that that was on the mind of someone inside of Git designing a new VCS. But obviously I am far from an expert.

56:52So what's my error over here on HatchBox? Now I don't have an error. Oh, it's something about the top. What did I do? No, this was about the logger I changed. Huh. Maybe it depends on something I also did on master. All right, let's play with it. So let's run the full suite because So either it depends on something that's in master or it depends on running the whole suite. And either way, I want to know. For all of those intermediate commits in the op log, I want to say, I saw they eventually get, the bug is just gone. I want to say they eventually get garbage collected, but again, I don't know. All right. I think maybe this is something that's happened for the branch. Let's do a test merge and see if it comes back. So I think I just do that with new. I just name the multiple revisions. Yes, and I can say capital A to say exactly where I want it. so or b to say before yeah all right so the one thing i don't like about the pager is i have to kind of memorize these little things because as soon as i hit q it's going to clear the screen so there's lso and well i guess there's master and puv all right so let's make a new commit that comes after master that merges master and puv oh okay so if i say insert after it's just going to be after those two automatically i don't have to name it that's fine all right so now i have right this is very characteristic of a merge commit in git where i have a commit with two parents and it says i'm on a new change that has both of those as a parent. So if I describe it, I can say I am, there is a way to say with new, I can say dash M, but like log failure in our spec, whatever. I just wanted to see something. So if I say log, yeah, great. I have a merge commit and I can throw this away very trivially. So I'm not really worried about it. I just wanted to see if it's in the, If it's totally transient and it doesn't happen again, okay, we got this back.

01:00:02Oh, I get it. It's the named unnamed branch thing. It's not a merge. It's I did a check out a hatch box, didn't I? Not PUV. The bug is in PUV. Wait, let's, we can use the op log to know that's what I did when I ran the specs. Right? So I made a commit, delete bookmark, push master, snapshot, snapshot, rebase. Push bookmark hatch box. I thought it was going to have.

...54So the first version where I was ready before, just before I rebased that thing at the right place, let's look at this one. Okay show there we go. So. See what i'm trying to find is. Where was this commit at the time, because I think it was on top of hatchback or on top of PV and that's what I had checked out so let's. you know we can just go there so let's go look at hatchbox and run our spec and we should see no failure we do see the logs i'm not sure if that's because i updated the standard out logger like i think the standard out thing is it might be a different thing from the build failure Huh. No, it's still there. So right now I'm on there. And if I go up to PUV, which is the child, and I run rspec, I still have all the extra logging.

01:02:40And I have the error. So I don't know why I didn't see it for a minute. Either I didn't change branches properly, or it's intermittent. And the former is more likely, because this is a very clear, you are stubbing something. Let's go look at that.

01:03:17Oh, wait. Before I accidentally mix things up, let's make a new commit.

...32New dash M. There we go. Yeah, it thought... So this message is it thought I was trying to name a... It calls it a rev set, but there is a whole... very clear language for saying I want to work on or edit or mess with or view a rev set, which is a set of revisions, a set of changes. And you can say like all heads or all things on this remote or these five named commits or everything between these dates. And then it has a whole parser for that because it is a little programming language. Not during complete it's an expression selection language. Okay, so this is. Oh, I know what this failure is so this failure is i've split up the logs over on the hatch box branch to. move the json logging off to its own file and rails. Rails is so noisy about stuff, I left it its own file that's not JSON. So rather than try and force it into the mold.

01:05:02OK, so that's good. That's what I want there.

...28And it's saying the thing that failed should be in there somewhere. And it expected to see that, but it got empty.

01:06:14I think if I read, I'm changing state. All right.

...58Yeah, that should be. Yeah, so that's blank and then there's LogRage. Yeah, honestly, this test is wrong because out of date because LogRage was updated to log it. And there isn't, so. Notifier. What am I looking for?

01:08:01Yeah, this guy actually just grabs it and includes the params in the payload. So I have all the logging I want. So CSP is a way of saying we're so worried about someone injecting JavaScript that if you get JavaScript that isn't exactly in the right format and place, you should assume it's malicious and then you should tell me about it. And the CSP is logging it already, yeah. But there actually isn't a way to check this that I know of because LogRidge just sort of, can I say, can I access this? config LogRage.

01:09:11Because that's the object that should be getting the message now that I've separated them. Undefined method config. Yeah, I can't dig around in the Rails config that way, can I? Is it in Rails environment? Or is it app config? No. Is it just configuration? OK, so the directory is config, but the object is configuration. Rails, I don't. They're kind of the thing I gripe about most in Rails is how many of those there are. Okay. Okay. So let's get rid of the puts. And then let's look at the status. Right, I'm just fixing. So that's done. I don't actually have a separate commit step. I'm gonna just say jj new with the message don't log to standard out during tests because that's a lot of output and then that config is right here. No, it's in.

01:11:25It's here.

...32That's probably this guy. What's showing up here? Good, both. Let's put back their if. Because they had a, yeah, that.

...56been messing with the log config as I've set up. No, you're still printing.

01:12:21Put that back then. So it's you.

...37I think this variable is present and is how Rails swaps between these things in config and dev so let's grab these two and then so if you're supposed to log to

01:13:15Let's just print if it's available.

...27Don't want to go too far down the hole. False. OK, so that's not what it's supposed to be. How did this look before? So show, can I say config initializers LogRage? OK, so the rev set comes later. Did I say dash R? the new terminal the pager is.

01:14:40Show changes in this revision compared to its parent right, but I want to view a specific file as of that revision.

...56I don't know how to do that in jujitsu.

01:15:10Maybe it's a different command. Because these are all about them as diffs rather than as a place right like in git the commit id that hash is the tree well i mean it points to the tree of everything so it kind of equivocates between them but you know what i mean so diff oh actually diff would tell me what i want

01:16:04Oh, there we go. File show. That's exactly what I want. So if it's not show, it's file show. Yes. So we had this exact same code. Why did this? Because it was overwriting the default Rails log instead of adding one.

01:17:01Am I enabling it everywhere instead of only in prod?

...28It's enabled in development, but it's not enabled in test.

...39Yes, it is. I put it in the, okay, that's my mistake. I enabled it everywhere instead of just in prod and development. Yeah, okay, so. Now I understand what I'm doing. All right, let's grab this and say that.

01:18:06This can be underneath, that's fine. And then environments development. You say on, which is good. Now, if I run my spec.

...36I failed my spec, but I didn't get the. Oh, now it's gone back because in test. LogRage isn't enabled. Oh, boy. All right, so. This is actually the same commit as, so we will squash those two commits together. And I sure didn't need to accidentally commit that. So we'll get rid of that and that, and then spec CSP. This becomes just rails logger again. I should not see one million errors. No, I do not see one million requests logged to this standard out. And that should be a nice green build. And I will just squash this commit down because it is clearly one issue, not two. Good. Oh, I ran git status. That's just muscle memory. I wanted jj status, which is I'm here and there. So yes, let's... squash and i think the default is to squash a commit into its parent oh it tried to open vim for me, and then my little terminal multiplexing thing. That's fine. moussx_ When you say on your streaming page that you can't do integrations because "Twitch doesn't support 2FA for API keys"; do you mean an API key that authenticates on twitch.tv or lobste.rs ?
So let's describe kw and say, no.

01:20:34I mean the former Moose X. They have a bad security control on the front of it and will not accept my phone number for some kind of 2FA recovery anti-abuse thing. It's multi-purpose, so they say it's for 2FA, but it is also to... moussx_ Oh that's weird
raise the cost of getting api keys and they won't accept a phone number from my provider and i have talked to a couple of different support people inside of twitch and I use this provider because of privacy concerns, but I guess they see abuse from it because it's fairly easy to get a phone number from them. I don't know, I'm guessing. I don't think they have anything against me personally. moussx_ Yeah, probably to protect against botnets
It's just a overzealous security control that works as a binary instead of a Bayesian probability update.

01:21:39Yeah, so... Like, what are the odds that someone's going to stream to a dozen people for six hours a week for six months and then be a botnet? I'm going to guess pretty low, but they just have a, if it's from this provider, reject. So I can't sign up for a Twitch API key, so I can't build fun integrations. I would like to have stuff. Epic_Ninja_Elephant The solution is for owncast to .. get improved real fast.
I've got a note file somewhere, but I think it would be really neat if people could throw up an arrow that I could see on the stream or integrate with Vim and there could be, you know, a window where people could put stuff directly into that. I don't know. I had a lot of fun ideas, but they really sucked the joy out of that one by making it impossible. What is Uncast? Is it a... Oh. moussx_ I mean, it's just that they don't want to deal at all with script kiddies and scammers that just use that to get a phone number (that would kill the usefulness of their "allow verified phone numbers" security)
See, because I built that whole archive page, I've actually wondered about this kind of thing. Yeah.

01:23:15moussx_ Just a sad consequence of being this big in the end
Epic_Ninja_Elephant Owncast isn't *quite* ready yet, and they do silly things like default passwords.
yeah and if i if i was like burning to be a big twitch streamer i would just go get a ten dollar phone at the corner store and i would use that to sign up for twitch if they accept that provider and then i would just stick that in a drawer and i don't know either never use it or just pay 10 bucks a month for it but

...51I don't know. It's just not a thing I want to spend money on. It's sort of annoying. Like Twitch, yes, I'm going to work around. moussx_ LUL that's like the "old" 2FA devices that are just LCD screens showing TOTP for banks
I'm going to pay money to work around your ill-thought-out security control so that I can give you more content. And they're giving me a service back, but I don't know. It just bugs me. I don't want to jump through that hoop. I'm happy with the level of production.

01:24:26okay so now i've got that commit oh yeah this merge i didn't need this merge so let's jj abandon mkv that was the merge because i'm sure not ready to merge yeah now master has fallen back down there and then i have an empty commit here that's fine oh and i can bring So now let's set JJ mark, set hatch box to KW JJ, get push. What was it? It push dash B.

01:25:23Good. All right. Let's go back to master. Oh, that's interesting. This is a new... Oh, I know what's happening. So I said, let's go back to master. And it says, that's not what you want to do. So master, I already pushed this commit up to GitHub. And so it is saying, hey, you don't want to be editing a thing you already published. Which is correct. I want to be editing a new commit that's on top of master. And what am I doing? Because I can describe it right now. So I did these top three. Actually, I'm not doing any of these things. So let's leave it empty. There we go.

01:26:26Yeah. This could be a little clearer of, I mean, it's like immutable commits are used to protect shared history. You could tell me where I pushed that, like you pushed that up to origin. That would be real obvious, you know? And if instead of origin, I named it GitHub, then it would have been real clear, right? But as it is, this is reasonably clear and it's nicer than any git error message I've ever seen, which are like, obtuse unless you know the primitives underneath all right so let's go look at pull requests oh boy i'm an hour and a half in i usually go for About three hours so we're like halfway into the stream so that's a good time to remind that this is lobsters office hours, and if you have any questions about the site or the code base or the Community or the moderation, you can ask it anytime. And then, otherwise I work on the code base yeah sure did there. Alright, so oh hey great I just noticed that arch. pulled in the thing. Great. Yeah, happy to have it. Did I say, I don't remember if I just set it on stream or if I set it in a issue here somewhere. Yeah. 1576.

01:28:49So let's get that merged. Oh, and you know, I think this is the first time I've merged a pull request since using Jujutsu. So let's figure out how to pull that down. I think it's jj get pull. Nope. What is it? I can manage the remote. I can import. It's none of these things. Is there just a generic JJ pull? Yes. No. Steve, help.

01:29:41So we make remotes. I've already done that. Let's push up to GitHub. Now our project is there. Updating from GitHub. Yes, this is the thing we are doing. Git fetch. I have done this once. Okay, and so add is at our current empty commit. Let's go look.

01:30:15Nice. Where am I? So I'm still where I was. So I want to, abandon this and I wonder where I'll land. Probably LSO. Huh, I thought he did that as two commits. Hold on. Yeah, he did. Why do I only see one? I said rebase and merge.

01:31:02Only one file changed. Did he have a bad edit and I didn't spot it?

...18Yeah, he had a bad edit.

...24All right. So let's abandon the current commit. Where did I land? Well, it wanted to put me on the parent. The parent is immutable, so it automatically made me a new. So let's go JJ edit. No, JJ new on top of master. And yes, I'm where I expected to be. Let's go look at reversion, which is three, four, four. It did get updated. I'm not confused.

01:32:20Oh, oh, I get it. It's because the hatch box branch is so long, their log command is not showing every revision. So, all right, that's fine. So we can abandon the thing I started writing. I'm really just abandoning the message because the commit was empty. I could just rewrite it. I don't know. It just feels better to be like, all right, I thought I was doing something. I wasn't. Let me throw it away. And if there had been work in there, it would have warned me. So I like that a bunch. All right. So let's bounce the Rails server. Actually, let's run bundle. Yeah, there we go. Get everybody installed. I believe I should have divtastic already installed, because I installed this version of Ruby a couple of days ago, because I was kicking something else along. Oh, somebody failed to compile.

01:33:31Yeah, good. All right. So what's the error? You have to install development tools. You wouldn't happen to know the name of this package. Oh, no, it's an error in CommonMarker. That's the thing I don't want to update.

...57We have an issue for updating CommonMarker and they changed their API. How did this build go green on GitHub?

01:34:18I may have to revert because I don't...

...43I don't know why this last error is trilogy.

01:35:17All right, what do we think? Well, I'm going to want it fixed at some point. I just really don't want to deal with Common Marker today. So I can fight with Trilogy and see if that's enough. Or see if I can pull Common Marker over from the previous version of Ruby. It's going to blow up for anybody else, right?

01:36:00I don't even know what this is depending on to blow up. Didn't actually say

...40Let's try this guy. Let's go one at a time.

01:37:01Yes, it's generic. What does Arch call the package?

...58Let's look at that. Look, failure yesterday. Fix was provided in Ruby. check if that's my error. You downloaded it. Okay.

01:38:49Yes, that's the same error. So let's go read the

01:39:24Oh, so when they say it's in the next point release, they mean a trilogy. So maybe if I bundle update trilogy. But this was literally yesterday. So you don't happen to have it now. You don't happen to have a release from yesterday. So let's look in the commits. Months ago. They must be working on a. like a next branch.

01:40:01branch did they merge into? Into main. And if it's, oh no, they closed it, they didn't fix it. Yeah, okay. If it's a thing in Ruby. Where's that? I want the thing to link to.

...30Let's find out how to make a revert.

...47Okay. So I need dash R and then the two and you and BK, whatever that parent is.

01:41:23Oh, say and. Right. I need a destination. Well, destination is right here.

...48I don't know how to tell the log to show me This elided revision. That's a little irksome.

01:43:13So I guess the downside of it having an expression language is I actually have to understand that language.

...41There we go. So I want to revert UNVK and whatever this is. And I want to drop it right here. Okay. That's promising.

01:44:10The working copy has no changes, but it reverted. Okay, so it made two new commits and it put them on top of my, okay, I should have said on top of that. That's fine. So let's abandon this. But then again, I'm on top of a, yeah, ZNX is the new thing.

...42I want to squash that down. What was the PR number?

01:45:15they want to write a longer description so i can link to the thing let me grab a new terminal in here

01:46:01There we go.

...11How did I land on that? Oh, it just kept the message at that. So if I look ahead, all right, this is both.

...28Whole lot of muscle memory broken by playing with a new tool. I'm getting there. This is practice.

01:47:33Going back to 3.4.3. Yes.

...42Okay. If I bundle, everything should be cool because that's the bundle I already have installed. So there's nothing to install. Let's close that terminal because I don't need the multiline thing with Vim. I thought of a nicer way to handle the... I didn't put it in my notes, though. That's why I didn't do it. All right. Where's my... What was that? Where's my scratch?

01:48:36Good. So does this show what just happened? Yeah, all right. And then let's go over here. Three, four, five.

01:50:24I guess I should have pulled down that branch and run it locally. That is not my usual workflow, especially when we get a green build on prod, on the CI, I should say. But I guess it's going to have to become my normal workflow. So that was 1576. Let's go find that issue about common marker and nudge it. because that was concerning.

01:51:55is a blocker for moving or very likely will be four, three, four, five.

01:52:12Maybe someone will see this and go, Oh, I would love to sort out that API. People have chosen other interesting refactoring things. Unfortunately, The GitHub sorting of bugs is by last created instead of last updated and I can't change that for the repo and so. we're not a particularly fast moving repo and it's not uncommon that feature requests or minor bugs or. refactorings hang out for years so. it is very easy for their updates to get lost because of this default that we can't fix on GitHub. Not fix, that's a little strong, that we can't change. All right.

01:53:14All right, anything else? Eight pull requests? okay sitemap generation yes and this one i looked at on the last stream and i don't know how this one's doing and i know this one i nudged greyhatter about this one but no changes i suspect the the guideline one is just gonna get expired for an activity and i'm gonna have to take it over we'll see

...56Oh, OK, that's a pretty small change. Introduce large commits. Wait, how did this break when I bumped?

01:54:23Why did I change that if I only Why are there all these code changes if I only bumped Joe? I bumped RuboCopperStandardRB, that's it, right? That's what would change a bunch of things. What else? Yeah, okay.

...48Greg, I know you drop in sometimes.

01:55:23What's that name? Kratos. Oh yeah. They've submitted a few PRs.

01:56:14So now, was it jjfetch, jjgitfetch? See, I'm learning. Practice, practice. Now if I look at the log, I'm still where I was, which was that. So let's jjedit. No, jjnew on top of master. Yeah. And since that commit that I was just on that I didn't even catch the name of, if you are on a empty commit with no description, JJ knows it's worthless and will just throw it away. So that's why I didn't have to explicitly abandon it. All right. So, well, that's nice. Let's deploy that actually. oskarallan oo jj
would like to see that run in prod because it's been oh man it's been at least months how long ago did i break that a year and a half woof that timer is not supposed to be a beep i have a little clock here so that i can see visually where i'm at and i set it to 60 minutes and when I when it runs out three times, I know I'm done with the stream I don't usually have the beep on though. So pardon and Yeah, you'll have to dig into the stream archive for this one because we spent I don't know the first half an hour or so of stream talking a lot about jujitsu but I'm only six days into playing with it and i like it a whole lot so i'm not totally comfortable with it you'll see me struggle with some of the commands but i really really like its whole operation log because i feel safe dinking around that i'm not accidentally going to lose work or break things The error messages are clear. When I have attempted on stream here today to do bad things like edit commits that are up on GitHub already, I've gotten pretty good warnings. Yeah. So the other PRs that are open, this one, has she touched it? No.

01:58:54Oh, there's one more checkbox. And the move to move checkbox is in line. I noticed on the... I don't mind flipping a little extra small VEX into this PR. checkbox on the message form for whether to model on these.

01:59:47Let me see. Just in line. Great. I haven't been haven't been taking notes in the scratch. So that's PRs. That was, what, 1597? I think that's right. 1597, yeah.

02:00:30So this one is some of my plumbing and is a new contributor.

...51I get the feeling I am going to squash and merge. I have to run the workflow. Let's double check. Beautiful. Yeah, there had been a comment here and I didn't understand the comment. And then this is the new scope they've created that brought things over here. And I liked that they tidied that up. That's a lot easier to read of what's happening. And then they added these specs, lovely. This is great. Let's run that workflow. And assuming that goes green, will merge it but this is great and if nav mike here wants to keep refactoring this this is great so we have this is going to take a second to run so i'll just show y'all we have a story repository so this i don't remember if it predates composable scopes in active record But it has slowly been rewritten until it is a set of composable scopes in Active Record. Because I've been trying to, it's one of those places where I've leaned more and more into the framework over the last, I don't know, however many years. So I would like to, I filed an issue for, hey, we can just refactor this whole thing away. Rails has gotten more expressive about putting scopes in models directly. And while I don't love the way ActiveRecord is coupled to tables instead of projections, this is nice. And so it's getting better. And I had my fingers crossed somebody would pick this up because the first part of refactoring hidden really just looked like it was copy and paste this over to a scope. Rename the callers. Done. Almost there. I'm going to assume that's going to go green. This person seems thoughtful.

02:04:01Now I am just waiting on this little spinny dot. You can do it. Oh, it's running literally the slow spec. If it made it there, it is hard to imagine fake data failing. Yeah, so there's one slow spec. It doesn't break very often, but I keep it in CI that generates fake data and That whole thing could be faster, but I haven't wanted to edit it because we don't do it very often, and I'm not usually live anticipating the build. So I think we're there. Come on. Yeah. All right. So that's done. Excellent.

02:05:05Let's go ahead and squash and merge because I don't need all of the.

...30Lovely. OK, so with that, that's all the pull requests checked in on. And anything on issues? Yes, there was a little conversation on these two. Let's fix the. Right, so there's the two I already talked on. Yeah. So this one, I wonder if this is something we've done to the JavaScript.

02:06:51so another one i want to say i don't remember if i i don't think i wrote this up on stream but i said hey let's rewrite our bot over to a ruby framework so that it is easier to tinker with and we can actually connect to our own database for things like authenticating users there was a big discussion in the chat room last monday about the deficiencies of irc to put it politely i am not a big fan of irc but i am willing to put more time and effort into it because it is popular and lobsters is a community like if the community is on irc we'll stay put for a while at the least and if we're going to be there it should be good right Ah, great that Caius was like, hey, this is pretty good. OK, let me go ping them on IRC. From the previous commit, wallaboo here. They are not in the channel right now. Too bad.

02:08:24How do I remind myself of this in like a week? I don't have a great way to have a paused reminder here.

...46Come back to that, I guess. So one person on IRC volunteered to take it on, but I don't know their GitHub name to ping them into the issue or anything. And I didn't actually recognize their IRC name and somebody else also expressed some interest. And so I said, you know, Hey, why don't you kids work together? But if the first person isn't going to show up and pick it up, I want to make sure I ping the second one before this gets too old. All right.

02:09:23Oh, yeah, let's see if this is fixed now. So where am I at? Bundle and batch. Make sure we're all in the right place.

...44I'll be on top of master. I am, great. And then let's deploy. And then when this is deployed, I'll go log into prod and make sure that the sitemap generation runs. Where does it put it?

02:10:13I think it just puts it in the public directory. I'll have to check.

...25Yeah, OK. Public sitemap. And yeah, hasn't built for longer than I remembered or saw. Why would it fail in September but not December? So something else broke in it. If this person got it running in dev, we'll see. All right. Daniel Katz- stall if it already got down to the bundle install the code is updated here, so we can say. Daniel Katz- bundle exact rails site map refresh.

02:11:27It's an interesting, it feels like I'm seeing half a log message in that file. Like, yes, go on.

...50Well, it's pinning a processor, so it's working, right? Oh, there we go. And we've grown from two sitemap files, or I'm sorry, from three sitemap files to four because we're bigger. Pinging with URL. Ping failed for Google. Sitemap ping is deprecated. Oh, interesting. Let's go ahead and turn that off then. Unless there's some other way to do it if it involves creating a Google account i'm obviously not doing that.

02:12:41yeah that's about what I would expect yeah. You can submit site maps through robots.txt should we mention it in robots.txt is that how we.

02:13:23OK, so we can say that. So let's go, don't need that. How do we disable the ping and then robots?

...47Let's just shove this down at the bottom.

...58HejiHyuuga hello chat hello pushcx
HejiHyuuga hope everyone is doing well
is there this site sitemap file is oh hey hey gee it's been a second things seem to be pretty good do we have an inline anchor no Do we have an ID somewhere? How to write and submit. That's not useful.

02:14:58So if I've got that, I'm just going to look at turning off the ping, which I actually want that back up. Where'd it go?

02:15:17There it is. All right.

...35not needed if you use the rake tasks right but how do i disable that site refresh no ping if you want by default none are configured okay so Did I say Google in here somewhere? I did not. Hang on. One thing at a time. Can I double check? I want to just see that it gets served. Because I want to say NGINX is configured to strip this GZ off. No, that's a 404. That's the sitemap. All right. And then is there somewhere in my repo that I've configured that then?

02:17:04What's this? Okay. It's two hits for the same one.

...16All right. So this doc is wrong. It is configured for Google out of the box.

...36twitchtd VoHiYo
Yeah, so let's say. Called it a hash, so we will say there are none. And then. Link to this. Oops. And then.

02:18:10Do I think this is going to behave the same in dev and prod? I think so.

...26Save, saved.

...41Anything else?

...49OK, so no ping. Does that mean it doesn't happen in dev, or that means I didn't do it? Let's do it again.

02:19:12okay didn't do it in dev all right so yes that's fine let's grab this code we'll do it live

...39Oh, maybe it was create versus refresh. I didn't catch that difference. Either way, we'll know in a second. Although it took, what, 60 seconds to run on prod? Prod is a little smaller and a little busier than my machine, which is just... a BP desktop.

02:20:25There we go. What a funny number, 1.4. It's like they're trying to fit it on a floppy. 1.44 megs. Pinging with URL. Yeah, but it didn't list anyone. So okay, that means not pinging. Great, that's what I wanted. So throw away the change on prod. And we'll do that. Aha look, so I forgot to set a description first, which is fine, but I can still see that in my working copy i've changed things, so this is a demonstration of JJ doesn't have an index you were just sort of always staging whatever changes you've made. it's a little less to think about so if I show the pager.

02:21:26That's a, I gotta bounce my desktop to get an environment variable saved or updated. So just the change I expected. Description is sitemap ping endpoint deprecated, close 1496. Yeah. And then bring master up to this and push. Good. It's becoming comfortable. The extra step of nudging the bookmark along, I don't know. I could make an alias for that. I'll think about that. For now, I just wanna do it a hundred times until it gets boring.

02:23:36failed to update apt cache that's a new one out of ansible oh man you know if ansible is gonna fall apart right here live on stream on office hours i think i had on my i didn't put it in here but i've been working on replacing hatchbox or I'm sorry, replacing Ansible with Hatchbox and Hunter 355E3B on the site. And I have been doing that the last week or so, roughly. chamlis_ jack sparrow leaping off the boat seconds before it sinks
And if that one is going to come in just at the exact same time that Ansible is finally breaking, I'm going to feel pretty smug about calling it. Yes, Chalice, that is exactly, that is the right meme image. That's the opening, right? I'm gonna guess they don't know the word disembark. Yeah, here we go. This is muted, right? Yeah. So everybody's watching him pull into the harbor and he's got his beautiful sail as he sinks his little skiff into the sea or into the harbor. This is looking stalled, and it's the same step that stalled before. Oh my god. Didn't I already deploy once on stream, and so it's literally failing during the office hours stream? That's just incredible timing. I need to get myself a tri-corner hat, a parrot, and 100 bangles.

02:25:41That's a better title.

02:26:01That's... I gotta be rude. There isn't like a log, right? Did I get a lobsters and symbol logger? I'm going to pull this up off screen because I don't know if it's going to have tokens and things in it. It is the exact text that you saw on screen already. There is no more information available here. OK. Update, that's presumably what you were running, right? I would have liked to see the exact command it tried to run. Whoa.

02:27:00Could not connect to security.ubuntu.

...15That sounds like they're down. Are they having an outage? They don't have HTTPS up? Oh, no. Okay, so this is not, in fact, Jack Sparrow. Ubuntu is having some kind of outage, right? So let's curl-i.

...43Yeah. Okay. Man, that would have been... Where's... No. Not the uptime command. twitchtd i can repro the error on my side as well
There we go. And a few. 907 Central. I don't believe you. Yeah, so they say it's up as of a couple hours ago, but it's not up, so they are clearly going through it. Yeah, you know, if you have to tell me six times that security is up, it's probably not actually up. That's a rough one. Well... Best of luck to those teams. Happy outage incident. Knock on wood. Yeah, that is unfortunate for them. Wait, this incident has been open for eight days. Whoa. Something very exciting is going on.

02:29:15So some server is flapping, so it has 900 messages. Major outage. Yeah, buddy.

...30Yeah, so presumably this status screen is a couple of minutes behind, because I did deploy once on stream already. twitchtd rough week* :P
the sitemap stuff just a few minutes ago so at some point this will update to get the partial checkbox or the red x yeah oh man rough day for those guys good luck i have had to push the big red button before It is no fun.

02:30:07Oh, yeah. You know, rough day. Legit. Yes. And as long as I am commiserating accurately, it is much worse to be in some kind of continuous partial outage that goes on for a week. I hope they are pacing themselves. Stay hydrated, folks. All right.

...36Number. Minor Ubuntu outage.

...58Oh, yeah. So a query for stories with the most comments. Yeah, so a mod was asking about that one. Let's go find the answer.

02:31:33Actually, didn't I memoize the comments counts?

...42Yeah. So this is a very easy query. I don't even have to write the word group by. So let's say comments count short ID title. Some of them are long. Short ID. oh some lag substring title 180 from stories as no order by one desk limit i don't know 30. do i have Group concat? Yeah. I don't think I do. Because I would like to put the tags on this. Just kind of... Okay, I do have group concat. But then I would have to do the group by... twitchtd can you pastebin the output?
I think I can do that.

02:33:11twitchtd I didn't request this but it looks interesting :)
Sure. twitchtd oh, you can add tags
Do you mind if I wait for the tags thing or you want it right now? I guess I could just do it and then hold on. twitchtd doesn't have to be now
Let's use my editor properly instead of goofing up just dash is it capital p is public let's see if i got that right i want to say i just looked at this on the last stream that i can't remember which one is capital p and which one is public like because it's capital is pushcx https://gist.github.com/pushcx/…
Capital is public, yes, because this doesn't say secret somewhere up here. All right, so there you go. twitchtd nice, thanks
And then I will see if we can add the tags and update that.

02:34:46from stories join taggings on stories.id equals taggings about story id yes join tags on taggings dot tag id equals tags dot id group by tags tag No group by stories ID. Hey, I genuinely did not think I was going to get that query right on the first try. All right, let's give that a nice title and I will update the gist. So that's as title as tags.

02:35:43I know I could have just edited that in Vim, but I don't know. It looks nicer. So yoink. And then edit new query.

02:36:14I still, years later, I still typo that.

...24So let's update that gist. Let's grab this URL. Let's jump over here to tell them there's your query. Let's actually read what we got here. Read my home page. I remember that one. Yeah, this one. You know, the the database model for this is. Can we actually speaking of things, did I memorize? Stories count, yeah, actually. That would actually be kind of interesting.

02:37:22yeah so so this backdoor one is the one that caught my eye because as you can see we had 14 stories merged into it that's actually here i will go and update the gist with that because that's kind of interesting to me perhaps it is to you come here let's grab the emin maria db there we are

...50pushcx https://lobste.rs/about#queries
So one of the just to kind of pitch one of the office hours things is I will run queries on the broad DB about queries. This comes up kind of infrequently, but it's a lot easier to iterate on these things live where you can just chat at me and, you know, explain how I used group wrong, but

02:38:23a bunch of these are the like what's your personal opinion on and then a bunch of these are there's less meta than i would have guessed i didn't realize the safety act one was that high in the list

...54Alrighty.

02:39:01So there's that query. Ah, comment filtering. So let's figure out where I'm at. Let's go find that issue, actually. Because I know I have filed a feature request for it. and I listed it somewhere, but it feels more pressing now. So when you filter out stories, they disappear from slash newest slash recent, the homepage, the RSS when you use your RSS token, all those kinds of things. And so they, do not disappear from slash comments, and they probably should. They probably should from mail new activity, which I want to say respects. All right. Yeah, so it's been three weeks. This user who I don't recognize their username did not PR it. So let's pick this up because there's been a whole bunch of stuff folks don't want to see. And then there's a filter tag scope on story, which I think I can just grab these. Where's your scope? of average rotation. Okay. These are not sorted. We'll put it down with the other personalization. Otherwise, we want to say joins to story. That might be it.

02:41:36twitchtd i got to go, but thanks for the office hours!
So let's try that. Let's say, see you later, TD.

...58Let's say the last five was three dot. Let's just grab the last. Come on, all last three. The pager.

02:42:29So see our next. All right.

...40That is a comment. I bet Rust is going to be a tag on this. OK, compilers and Rust. So if I say this wants an array. No, it's not, is it? I thought I put it on tag too.

02:43:26Hey, no exception. And that one was just gone. Are these other two also on that story? Or on a Rust story? No. So this is a bug, right? Because I should have still... I guess I didn't demand an order. No, order by comments ID, desk, limit 3.

02:44:16No, no, wait, this new one, let's check. Yeah, I should be checking these up here. See, I'm getting towards the end of the stream and I'm starting to get tired and make mistakes. This one also does not. Oh, this is the one that got me started using jujitsu.

...54So we find the text, select comments, join stories. Where stories ID is not in.

02:45:23This, aside from probably not being an efficient query, yeah, that's not working.

...37Hmm.

...52What have I said?

02:46:23I think I can say we want to join to story joins story to tagging.

...45Well, now if I do this, I'm getting the matrix. I don't need to produce a cross drawing and then filter, right? Filtering things out is tougher.

02:47:13Oh, my relation to algebra is getting old.

...28And mapping it through Active Record is not making it easier.

...49See, that would be the join of everything that has it.

02:48:03But I want to say where that's known. All right, hang on.

...50This actually looks like a correct query as I'm rewriting it, because this is, find me all story IDs that are tagged with Rust.

02:49:20But then where's this YG comment? That should have been the very first thing because it was not was not in the

02:50:15Yeah, so there is one tag in its version control system. So the data is exactly what I thought. That query looks good. I don't know.

...57Just the fact that 66 doesn't match the query. Am I saying select tagging story ID from taggings?

02:51:32All right, so I'm finding all stories that are tagged Rust and then saying not in, which is not terribly performant.

02:52:45Yeah, but I'm not seeing that last comment, because of course stories can get submitted in all kinds of orders, and then people comment on them as they like, so... Yeah, I'm stumped here. I feel like I'm missing something obvious in the relational algebra that I know I've hassled with before, but it is not immediately coming back to mind.

02:53:23okay so this is no this is all stories tagged with rust what i really want to say is like where and tagging dot story id is null yeah no i can't invert it see i'm Not remembering the right way to project this relation.

02:54:11grayhatter_ just got here
grayhatter_ what's the goal?
This is an expensive query to do it with if. How's your SQL? it is to find all comments that are not on stories with a particular tag. grayhatter_ better than most, worse than it used to be
And this query that's on screen here, find the comment, join stories. Sure. Where stories ID is not in tagging story ID from taggings where the ID is 69. which is the idea of Rust, which is just my demo. grayhatter_ flatten the story ID
Let's run this.

02:55:00grayhatter_ with a sub query
And instead of grabbing all of that, let's make 10 and grab oh read line flatten the story id i'm not sure what you're suggesting

...57wait here it is maybe the query's been working why did this one this one ram jump up above it though i've been just misreading okay it is here

02:56:29See, what I expected was that this third one would go away. Because that's the one that was on a rust story. Wait, what order are these sorted at here in the terminal? grayhatter_ select * from stories where id not in subquery( select story.id from tagging where tag = 69 )
Because I thought this was going older to newer, but if it's going the other direction... And this has just been a rabbit hole for me not understanding what I'm looking at.

02:57:23I don't know what that subquery function you're calling is. In MariaDB, you don't have to name it. grayhatter_ it's basically what you're already doing
That's what these parentheses are doing here is this is a subquery. grayhatter_ it shouldn't be that expensive though so I'm confused now
I think this is fine. It actually worked. I just misread. So OK, that's fine. grayhatter_ no, your syntax was correct, I was using psudo-sql
So if I dropped out this filter, OK, I got what I want. I just got it in a slightly different order, and I didn't recognize it. Oh, hey, Grey Hatter, look at you. You wrote this, right? Or someone is quoting you and responding to you. grayhatter_ the latter
I remember that you were the one who was talking about banning ASNs, so.

02:58:44grayhatter_ yeah, kline schooled me... I have to write a follow up now
All right, 2, 3, 4, 5, 1, 2, 3, 4. OK. Do we have any other gaps? No, all right. Okay, so this worked. It does what I expected. Kayline schooled you. It's not really a contest or a talk down. I hope it comes off as more of a, all right, so let's throw this away. This was a bad edit.

02:59:31grayhatter_ I stand by everything I said... but I no longer support the word "ban"
grayhatter_ no, I like "losing"
Hmm. grayhatter_ becuase it means I learned something, and I like learning more than I hate losing
Epic_Ninja_Elephant Getting schooled isn't the worst thing. Either you win or you learn.
Okay, so if I got that... Oh, that's a new one. I guess that's uncommon enough we haven't noticed it. Epic_Ninja_Elephant Get out of my head, @grayhatter_
grayhatter_ Epic_Ninja_Elephant lol, sorry
Jamless, if you're still watching... Yeah, because we tweaked this, I guess we measured wrong here?

03:00:08Epic_Ninja_Elephant THAT explains the headaches. It was grayhatter all along.
grayhatter_ @Epic_Ninja_Elephant this feels like one of the truest things I've heard
Yeah, I guess I am reacting because elsewhere, off lobsters, I was in an online community and a very power user was very, very loudly and confidently wrong and mocked me about something because I'm trying to be polite about this, but not actually just link to the fucking thing. But anyways, he was very confidently wrong to the point that he felt fine insulting and mocking me about it. And the admins were like, oh, well, yeah, that's mildly rude, but it's fine to mock people here, I guess. That's part of why I wasn't in this thread today was I was actually in a pretty bad mood about that and not making good calls. So I tapped in the other mods. Hmm. Let's tag this. chamlis_ I think that must be some side-effect of the revert, all the grid stuff is gone afaik
This is a bug, and it is a design bug. There we go.

03:01:23chamlis_ maybe worth diffing against how that was laid out before any of the grid chicanery
So if that's working.

...40Yeah, I couldn't tell you off the top of my head. And I would like to, yeah, I'm right at three hours now. I would like to knock this out if possible.

03:02:24How does Story Controller handle this? Because there's the two ways to filter. No, it's going to be Home Controller.

...55ah it's flattening down and then i bet this story repo always uses filter tags okay which why not just make the one use the other

03:03:32It's never called.

...46Epic_Ninja_Elephant Computers are so sensitive about typing everything just right.
This is becoming a bigger refactoring than I want. So do I want to do the refactor or do the small feature and leave the refactor? Yeah, we'll do the small filter.

03:04:15grayhatter_ Epic_Ninja_Elephant this is a feature
you

...48Oh, that reminds me of a feature request I wanted. Where was it? I have to file that. Yeah, let's file that later.

03:05:20That might be enough.

...31Just making sure it didn't blow up. I'm going to have to write a test for this, but.

...44Yeah. So if we do it there, and if someone goes to a story they filtered out, should they still see replies? Probably. grayhatter_ yes
All right.

03:06:40Voting, deleting, disowning. grayhatter_ to not show direct replies is in the same class as shadow banning. Users shouldn't be allowed to do that either
Yeah. Okay.

03:07:07syrupking hello broadcaster! why no colors in your editor?
grayhatter_ or rather, the site should make that anti feature difficult
I don't think it's in. Hi, Syrup King. Welcome. This is answered in the fact there are some, they're just very subtle. Like notice the line I'm on has a yellow tilde off to the left. Just kind of screams off the page.

...31Okay, so we're kind of mixed between spec requests and spec features.

...48go ahead the filters are a pretty important quality of life feature for folks and this is more of a badly missing feature right now if it doesn't work on comments i'm just wondering how extreme it should get, and it feels like maybe it should include that. So this is just this. I thought I had a comments pad. So if you do a, yeah. I don't know why it's here in extra time.

03:09:00Oh, it's the resources. This is a duplicate route.

...11So that should get rid of that duplicate. Yep. All right. And then where did I say the tests were?

...35Of course, it's common spec has more of them. Newest spec has a bunch.

03:10:00Okay.

...08There's a bug where if your last red marker would be on a comment that you filtered out. Yeah, that's a bug.

...58Yeah, so let's say tag1 is tag2 is actually, we can do this. Yeah. Create a comment, put the comment.

03:11:32And we'll create another one. Visible filter that is on a story, which will be on a tag. It's going to get ridiculous. Do multiple lines, Peter.

03:13:37Seems legit.

...43See if that wants to run. It seems pretty likely. Define method each, for instance, tag. I needed to make that a list.

03:14:04Not just that I had the word filtered out.

...15OK, so yes, it definitely showed the comment. Why?

03:15:04I didn't actually set up the filter.

...13Create a user.

...24And how do I want to?

...40I think I have a filter factory, do I? Do not. Let's do the simplest thing first here, which is just user.tagfilters.create for the tag, filter tag.

03:16:18Not too shabby. Not too bad. All right. I really do need all that test. I want a comment that didn't get filtered. I want the tag for the user to filter. I want the story to be tagged. It's got to have a comment on it. Yeah. All right. not git we're not using that jj and we will describe this as was there anywhere else i wanted to filter so this is what also generates the rss

03:17:26Are there anything else that presents comments except the replies view? Which does not respect filters, does it?

03:18:29Thank you.

...56yeah that's what i'm thinking of is it's like that all right

03:19:30I didn't run, I didn't run the poll.

...39If this doesn't go green, we're going to get a lesson in how to make a immutable commit mutable again so I can push dash F it.

...59Come on. Epic_Ninja_Elephant Thanks for streaming!
chamlis_ thanks!
break man all right deploy all right there is the end of the stream yeah so that's gonna run and I'm gonna go take a break get some lunch and the next office hours will be syrupking goodbye broadcaster
monday afternoon right that's not a no it was last monday that was the holiday yeah so the next one will be monday at 2 p.m ah you're welcome thanks for tuning in syrup king you are welcome to come by again or there's the whole stream archive and pushcx https://github.com/lobsters/lob…
I will, yeah, I'm not going to type up those refactors and feature requests, but if you want to see them, that's this issue and they will either mention it or just be comments on it. I will decide after I take a break and recombobulate. Alrighty. Yeah. Hope to see you all on Monday or around the site or around the chat room. Take care, folks.