Loudly disappointed in the whole world
Streamed
Handled Lobsters outage yesterday due to DigitalOcean hypervisor/cloud-init issues. Wrote up postmortem. Thanks to Hunter for debugging help.
- Merged PR #1316 to enable Rails 7.2 defaults and PR #1327 improving setup docs
- Worked on PR #1322 about clickbait titles. Analyzed ~80 title edits to develop clearer guidelines around hyperbole, missing info, and moralizing.
- Started evaluating pagination gems (pagy, geared_pagination, order_query) vs current cursor-based pagination branch. Need to decide between building custom solution or using existing gem.
- Looked at at PR about porting comment replies to Action Mailbox
scratch
topics:
outage https://lobste.rs/s/ndvf0z/2024_09_22_cloud_init_outage_midmortem
improving setup https://github.com/lobsters/lobsters/pull/1327
enable Rails 7.2 defaults https://github.com/lobsters/lobsters/pull/1316
story guideline https://github.com/lobsters/lobsters/pull/1322
https://jvns.ca/blog/2024/09/12/reasons-i--still--love-fish/
https://xeiaso.net/blog/
https://lobste.rs/s/d1n9k6/kind_websites_i_like
https://dearrow.ajay.app/
maybe the only good hyperbolic title https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/
(hyperbole; missing info)
pagination
x 'next' pagination working for comments
'previous' pagination for comments
two cursors, before and after OR one cursor and a direction
direction first page before_cursor after_cursor link_previous? link_next?
forward y nil nil n y?
forward n nil short_id y y?
backward y nil nil y? n
backward n short_id nil y? y
going forward: have after_cursor, next_page is if selected 21, previous is true
going backwards: have before_cursor, previous_page is if selected 21, next is true
paginate comment search results
get next/previous working for stories
extract pagination to a module (or other metaprogramming)
replace existing paginations
title:
loudly disappointed in the whole world
post-stream:
fix link https://lobste.rs/s/ndvf0z/2024_09_22_cloud_init_outage_midmortem#c_wdyc70
I should post an update about the DO one month credit
https://lobste.rs/s/ndvf0z/2024_09_22_cloud_init_outage_midmortem#c_g9znsn
Transcripts are generated with whisperx, so they mistranscribe basically every username and technical term. They're OK but not great, advice appreciated.
Recording
01:57hejihyuuga yay pushcx is live
hejihyuuga thank you for handling to site outage yesterday, the post mortem was very interesting
hejihyuuga HenloThere
hejihyuuga sounds good to me
I hope I sound OK.
I updated the streaming checklist I wrote to make sure that I refresh the volume monitor so that it behaves.
And hello, Hedgie.
Welcome back.
And yeah, the site outage.
Here's our first topic.
I've been cleaning up stuff after it, so my prep got a little tight.
Let's pull up the link that Hedgie is referring to.
That is good.
It's not even on the first page of newest anymore.
Actually, it was funny.
pushcx https://lobste.rs/s/ndvf0z/2024…
I got the site back up and literally two minutes later was brainfuck enterprise solutions.
So it was nice to come back to something very fun.
So here's the link about the outage.
02:58and basically what happened is i tried to update something to get a head-on maintenance and i was punished for my hubris so i was i was so good of well let me just wait for whatever this blocker is about ubuntu rather than try to
force an upgrade with that like the dash d mode to do release upgrade for development updates they were sorting out some packaging things one one thing with the thunderbird snap that doesn't matter for our server but then one other thing for glib that probably didn't matter for us but it pushed me to want the i just figured i'd wait like the point of lts is you're not in a hurry so i was waiting for that to come up to to be ready i have the
The link's somewhere in our comment down here about, ah, yeah, how I was waiting for that.
So if you wanna dig in on what that bug was.
Ooh, looks like I might've gotten that link wrong.
I'll have to edit that comment at some point here.
So let's grab that.
And the,
I had never heard of CloudInit or NetPlan before yesterday.
hejihyuuga we love learning under pressure LUL
So this was maybe not the friendliest introduction to those two things, but the gist of it is the virtual private server needs some way of knowing how its networking is set up and other things like what hardware should it pretend to have, I assume.
And there's a tool called CloudInit that is intended for
servers up in the cloud and it tells them hey here's how you're set up and cloud in it yeah hedgie says we love learning under pressure this was there was a lot of that and i was active in the the lobsters irc channel that's it if anybody hasn't seen that it's lobster slash chat and i always try and sound off if i'm gonna reboot the web server or do something else like that because
Our outage pages specifically say, hey, if the site is down, come to the chat room to find out what's going on.
So the chat room was like, hey, I bet it's a NetPlan problem.
And I was like, yeah, I don't know what NetPlan is.
And a couple of people were like, boy, you're about to have a good day.
They were very commiserating, really, is what it was.
The gist of it is,
net plan takes a plan from cloud in it and the plan looks like oh here's your list of ip addresses and routing stuff and rather than spread it across a call to ip adder and a call to or in a resolve.com file let's put it all in one place and then farm it out to those other tools you know it's the the classic xkcd comic of if you have
eight competing tools, why not add a ninth that touches all of them?
And the answer is because it will be one ninth as reliable.
So it looks like DigitalOcean changed the way their hypervisor provides data to CloudInit.
And I say that because when I eventually could find the error messages, I was able to use these terms in here and find a
official PR from them to the CloudInit project where they were saying, yeah, we have this data source that we call DigitalOcean and we're moving to use this config drive data source.
And when I look at production, the web server that stayed up, that VPS has a virtual device that presumably config drive is reading from.
And then, I say presumably, no, I know it is reading from.
And then,
the db-01 and mock turtle were just missing it and i don't know how that device is supposed to have been injected or initialized or if it's like a mock hardware thing and
The kernel should have seen it on boot and automatically added it, which would imply it's a hypervisor config, or if it should have been created by the initial install, in which case it's sort of an issue with the database or I'm sorry, not the database, but the VPS is OS install, but not really.
Cause it was either way.
It was just kind of a time bomb waiting to go off that.
when and i'm not sure which kind of time bomb it was like was it a time bomb that the next time the vps rebooted it wasn't coming up because this api change or did it also require the os update i'm really not sure because the the uptime on these two servers was in the three digits for days if it wasn't closer to a year or two so
was unfortunate that the time bomb went off on me i'm talking to digital ocean and i started this stream like five minutes late because i just saw that they sent me an email in the middle of the initial config so i sent them a initial report of oh hey my boxes are down i would like them to not be i sort of have them back up but it looks like your hypervisor isn't quite right and it didn't have as much debugging info because i filed the ticket before i had
completely finished beating stuff to death and i i mentioned it here but that's a good time to call out 355 e3b hunter who is a moderator on the site and does a lot of stuff with hosting and after i was a couple hours into it he happened to come online and saw all this fun and he jumped on to kind of look over my shoulder and was enormously helpful in
hejihyuuga yay for hunter
you know, I kind of described, there's this cloud in it thing and this net plan, and I don't really understand what they're doing, but they're kind of doing this and they look like this.
And he zeroed in on like, check these config files, check those.
And it helped because he,
works with them professionally and so he was immediately able to say confidently like okay yeah here's the error and look here's that error message and you saw this error message but you didn't understand what it was saying here's the thing about the device we checked that device file anyways he gets big props for really figuring out what it is so it was that that
extra info from working with him that I mailed back to DigitalOcean later today after this update comment.
So hopefully they will see that and sort out the hypervisor because I would rather not rebuild those two boxes.
hejihyuuga Oh wow that's very nice of Digital Ocean
And then, as I was saying, the thing that delayed me was I didn't see it in the middle of their long initial email, but they credited back the cost for the month, which was really nice of them, especially because the gist of their initial message was that they thought it was OS misconfig, which, just playing the numbers, I am sure they get 100 people messaging because they've broken their own networking to one person with a
no, this is really your hypervisor at issue.
hejihyuuga I wonder how widespread this issue was
So that was especially generous of them.
Let me put that actually in the post-treatment notes.
Yeah, Hedgie wonders how widespread this issue is.
Their email, their initial email was very much a,
hey, you've probably misconfigured your box.
And it was polite.
Here's a bunch of steps you can use to check on it.
And I understand why that was their email, because they must see many more of those in my initial report.
Before Hunter came in, I was not as confident about what was actually wrong, and I couldn't
know name all the terms and paste all the error messages so i i thought that config or the the credit was especially a nice touch there and as for how widespread it the issue was i i can't guess you know it's if they made such a fundamental change to how their vps's get things
I mean, I would, see, I don't know if it's, I recreated Web01 after they started this migration and then neither of these, the other two were migrated or maybe they ran a migration and it worked on one, but not on the other two.
Like I can't guess what happened there, but the general thing of changing how the VPS got its info
mean that would affect every vps that they host so i would like to think that that this is a very rare issue rather than a this is every vps especially if this problem was not lurking waiting for an os update but was instead lurking waiting for the next reboot right i hope it's super rare i don't know digital ocean
They operate at just kind of an enormous scale.
And it's one of those when you have 20 million customers and you have a one in a million problem, well, there's a lot of customers affected.
So we'll see.
We'll see.
This was not how I wanted to spend my Sunday.
I was so happy after Web01 came up clean.
And then like two minutes later, DB01 didn't come up and didn't come up.
And I was just like, oh, damn.
You know, there's that moment of like something is wrong and I don't know what it is.
I just, I know that I'm going to be doing some debugging now.
That was not fun.
So I am happy to take any kind of questions about what else happened here.
But otherwise, that's kind of the gist of yesterday's outage and responding to it.
of the commenters responding here was like hey what if you had a basically a cluster database set up and these other things and it's like yes if we added nine moving parts we could have maybe avoided this and this is a big part of why if you build a site and you have commercial hope like a commercial service you want to not be running on like you know
putting on a show in the barn levels of we have a VPS that we have installed stuff on.
And you want to have, you know, a multi-master setup for your database with redundancies.
You can do blue-green deploys and all that kind of good stuff.
But for a small volunteer project, all of that is overkill, especially when I'm already mad at Ansible.
We've talked about Ansible on this stream a couple of times now.
Hopefully you all know the Ansible lore.
Oh, somebody just mentioned Rset.
I don't know what that is.
I will have to look into that.
Let's grab that link.
15:09dzwdz ansible sure is a Thing
I don't really need to grab the link because I keep checking in on this discussion over in my browser.
Hey, DZ.
hejihyuuga HenloThere dz
Yeah, Ansible is indeed a whole thing.
It's...
dzwdz RADICALLY simple
dzwdz lel
You know, I'd be less annoyed by it if they didn't call themselves declarative and simple because they are neither of those things.
And it's okay to be complicated and it's okay to be imperative, but just be real about it.
Oh yes.
Radically simple.
That's, you know, a big chunk of this outage was me recreating the net plan, which is a YAML file.
And I had to use the DigitalOcean Recovery Console, which runs in a browser and doesn't bind Control-W.
So every time I tried to delete a word, I closed the tab and had to reopen and get back to it.
That was just a little extra spice that kind of comes during an outage.
That was no fun.
And rewriting the YAML file in a Vim with no plugins or anything, because this is recovery mode live system.
And writing the YAML was painful because the error messages were like, oh, on line 13, this indentation doesn't match.
Well, it's wrong.
What it actually meant was on line 12, you typoed and you had a semicolon instead of a colon and you can't see it because it's two pixels different and there's no syntax highlighting and their validation message is wrong.
It's actually the line before, but that was the process of writing a NetPlan file.
And it's that kind of, you know, we've talked about a gumption trap where it's just an incredibly draining thing to churn through.
And so getting through the using a weird terminal in the browser that closes all the time that has a stock Vim that doesn't have any config to get error messages that don't quite make sense for a tool I've never used before.
hejihyuuga shells in the browser are so frustrating
Yeah, that was a little bit of a slog.
But we are back online, which is the nice thing.
dzwdz why do you have three vpses for the site btw
Yeah, shells in the browser are so frustrating.
I think shells everywhere are kind of frustrating.
hejihyuuga i had to use azure's cloud shell and it was so annoying
I have been tempted to write my own shell and write my own terminal, although the...
I'll answer in a sec, DZ.
pushcx https://jvns.ca/blog/2024/09/12…
I just saw a really nice post by Julia Evans
hejihyuuga i love julia's writing
frici writing own shell and own term emulator is a good first step to insanity
Actually almost every post by her is nice, but she talked about why she loves the fish shell and the things she likes about it are things that really annoy me the most about bash.
And, you know, I have decades of experience with bash.
And so I'm kind of used to its sharp edges, but some of the stuff in fish sounded nice.
So maybe at some point I will take on the project of trying a new shell, which cause that's at least so much less work than trying to write my own shell in my own terminal.
hejihyuuga No configuration is one of the reasons I stuck with helix (a modal text editor)
hejihyuuga my config is incredibly small
you know that's the kind of thing that happens when you pick up the the frustration of having a the recovery console in digital ocean it's actually like a wickedly hard problem to take on a like yeah we have decades of issues with terminal emulators and you have to exactly match something that's going to be in the os install or you have to put your
dzwdz i was put off by the "Finally, a command line shell for the 90s" joke on their site for so long, lol
dzwdz glad i tried it, though
frici fish is quite interesting, it does sort of get you to unlearn a lot and relearn them in the fish way though which can be painful somedays especially if you are in a hurry
web terminals what's the file for it curses or term info you've got to put that into your os image like and then you can never revise it because people like lobsters run their vps for years before they update like that's just come on that's brutally hard to take on i understand why the thing is a little
you know, it had like a fixed width and it didn't quite wrap lines correctly.
Like, but the fact that it worked and it worked as well as it did is nice.
The, the fact that it didn't bind control W is just my personal hell because I'm used to it.
Anyway, the, yeah, thank you.
freaking Hedgie and DZ, you are all saying kind of stuff I believe about the,
hejihyuuga Reading andyc's posts on lobsters has gradually gotten me more interesting in trying out Oilshell
dzwdz i wish there was a posix shell with the ux of fish
hejihyuuga more interested*
the shell environment and all the stuff that comes along with Phish and learning a new way.
dzwdz zsh with plugins doesn't count
So DZ, to answer your question about why we have three VPSs, we run Rails against a MariaDB database
hejihyuuga @dzwdz *furiously backspaces*
and the easiest way to get great performance auto sql database is have lots of ram and fit your whole database into ram especially and then running rails that also tends to be ram constrained sometimes cpu constrained or io bound but mostly ram
And since the two are competing for the same resource, just the easiest thing in the world is to split them out into two boxes.
And then Mock Turtle, our third VPS, is like the cheapest, you know, whatever the $4 or $5 a month, no CPU, no RAM, no anything is because our IRC bot.
you know, it is like a hundred lines of code and has very low resources.
And the only reason it doesn't run on the web server is it connects to a third party service and it takes arbitrary user input from commands in IRC.
And I am mildly paranoid about wanting not just a process boundary, but a OS level boundary between
Something that's exposed to hostile user input and trusted credentials to the database.
And so I would rather pay five bucks a month so that I can sleep at night and not worry that if there's some weird parsing bug in the IRC bot, somebody is going to be logging into our database as the root MySQL user and able to do anything they want.
It's cheap security, you know?
I am occasionally tempted to rewrite our bot in Ruby, but never so tempted I've actually seriously done it.
I've heard nice things about ZSH as well.
22:00And yeah, NDC has a whole bunch of
ghost_user_1984 it used to be Ruby!
I've really appreciated the technical detail that he's done with Oils, which I believe is the current name of OilShell.
ghost_user_1984 and that was a mess!
hejihyuuga I credit zsh with being one of my largest productivity jumps in the terminal
He's renamed it to Oils, O-I-L-S. And I've read, I don't consistently read them, but I've enjoyed the technical detail when I do, because there's lots of that, hey, we're building on top of decades of stuff.
dzwdz i really need to do a deep dive into arcan too
And if you have the gray hair, you know some of these.
Ghost user, what used to be Ruby and was a mess?
Is that ZSH or Phish or somebody else?
DZ, what's Arcan?
I don't know that one.
Is that a shell?
...50dzwdz it's a lot
ghost_user_1984 The irc bot
I suppose.
ghost_user_1984 this is Hunter btw
It's a lot.
Ah, here we go.
frici isn't arcan a display driver/server?
Oh, it's from Cat9, huh?
Display server built on a game engine, only two years old.
That's a baby in terminal years, right?
hejihyuuga @ghost_user_1984 the one who helped save the site?!
Because they run basically one-to-one with human years.
Oh, hey, Hunter.
hejihyuuga can we vip hunter
hejihyuuga they found a big bug :D
dzwdz https://lobste.rs/domains/arcan…
If you only just connected, you missed me singing your praises when I was talking through what happened with the outage yesterday.
and how the only reason I have any certainty about it is, yeah.
So thank you, Heji, for reminding me.
ghost_user_1984 Iβll have to watch the replay
People get marked as a VIP in the channel when they find bugs in the live coding streams.
And I feel like helping solve an outage absolutely counts.
ghost_user_1984 thanks!
I should just make you a moderator.
You're already a mod on the site.
hejihyuuga yay hunter
Yeah, it'll be in the replay about maybe 15 minutes in, if you want a timestamp.
ghost_user_1984 I have the sysadmin hat
ghost_user_1984 for
ghost_user_1984 some reason
ghost_user_1984 <3
yeah anyways thank you again for helping diagnose that because i had there's a thing where when you're bug hunting even when you like sort of have the bug you
hejihyuuga @ghost_user_1984 it was 9 minutes-ish into the VOD
ghost_user_1984 not a problem
I didn't have a lot of confidence that I understood what the actual bug was because, as I mentioned, I had never heard of cloud in the internet plan before yesterday.
If you had asked me how the VPS gets networking, I would have just said, oh, it's DHCP.
And I hadn't thought about, oh, there must be other setup for how does virtual hardware attach to the VPS and other stuff.
I would have just said, I don't know, magic happens.
so i am sort of glad to have learned it but yeah having hunter come on and we did just a screen share and and tinker and just having the confidence of yes this is actually the issue it's not a box misconfig it's getting bad info here and this virtual device is missing like that was
I would have had a hard time sleeping at night if I didn't have good confidence.
I understood why the database server didn't come up on networking.
Basically knowing why we were in a degraded state and what it was is just, you know, it's good for my peace of mind.
So I am very glad to have puzzled that out.
And I didn't.
Yeah.
Yeah.
Just.
The process of learning something during an outage is super stressful, especially because you don't even know, like, are you learning the right thing?
ghost_user_1984 I still think the end game is building a new vm
So I was like reading the manual for Cloud Init and Netplan and playing with the command line and reading the man pages.
And at the same time, I was like, is this even the thing?
Am I just wasting time during an outage?
You still think the end game is building a new VM?
Yeah, that's...
ghost_user_1984 and yes it is, itβs the least fun thing we do in tech
hejihyuuga the nice thing about running a technical site is that the audience is technical people who can help solve technical issues :D
really like to avoid it because i don't especially trust ansible very much and i realized that that's its own problem is it would be nice to build up trust in ansible or replace it with something i could trust but that's its own big project and it's not something i want to put realistically like
30 or 40 hours of work into.
ghost_user_1984 there isnβt a lot of stuff to go for though
And it's not 30 hours of straight coding time, it's 30 hours of like, starting servers and watching them and kicking them and kind of making sure we get the right thing.
And then, you know, spinning them up and tearing them down and updating them.
And it's just that trust takes time to build.
frici there is no many things you can trust for your current scale that aren't "hackfests" or "too big for your scale"
yeah hunter notes there isn't a lot of stuff to go into but i don't know and hedgy yeah one of the nice things about running a technical site is not just that when i was talking in the chat room people were able to mention netplan and that gave me some really good pointers but also
ghost_user_1984 Pyinfra would be the other project to look at
when we have downtime i can just say explicitly what's going on when i've done other migrations you know on the 502 page i've just like pasted my checklist of here's the 10 things i'm going to do in the order i'm going to do them in and people really appreciate that kind of looking over my shoulder feeling so yeah freaky there are not a lot of things i can trust for my current scale that aren't hack fest or too big for my scale yeah we're in a
a funny place.
And Hunter noted yesterday, but a weird knock-on effect of lobsters being pretty well self-contained and there only being so many Rails apps with public source code is that lobsters is getting used for performance testing and all other kinds of, well, can we spin this thing up?
Rails and Ruby tinkering?
So hopefully, we'll continue to benefit from that.
And when Kamal 2 comes out, maybe it'll be easy to shove this in a Docker file.
I want to say, when's Rails World?
Next week?
The week after?
Rails?
No, Rails World.
I don't know if September 26.
Yeah, so just two or three days from now.
I don't know if they are releasing version 2 or just
Pre-releasing version 2, on the last stream I talked about how the last Rails world was very much... Pre-announcing things that...
Were not baked.
The... Yeah, the other thing is... After getting kind of shot in the foot by the hypervisor...
If I'm going to rebuild a VM, do I really want to rebuild the VM on DigitalOcean?
29:31We didn't get along well with their managed database.
I did not have a good support experience on that one, and we had some performance issues because it was MySQL rather than MariaDB, so it wasn't including a MariaDB-specific optimization.
to the query planner that we depended on.
But then, I don't know, getting bit by the hypervisor,
this i don't know that's kind of frustrating i am kind of tempted to look at one of the platforms that service things like render.com heroku has gotten horrifically expensive so it's kind of disqualified itself in addition to salesforce leaving it in maintenance mode for a couple of years it sounds like in the last year or so they've come out of that but
It takes a while to build trust in a platform, and the fact that they put it into maintenance mode for years kind of kills my interest in it until I've seen it active for a couple of years.
Render looks pretty nice.
I haven't used it.
Oh, no, I have used it professionally, not for a Rails app, for a slightly weird JavaScript app that did have a small backend node, a couple of endpoints.
don't know if their prices are reasonable we do just a little bit of weird stuff and one frustration i have with all of the platformers that service stuff is they all just kind of throw your logs away and i get a lot of value out of just poking around in the logs because there's stuff that's not surfaced in the ui and since i can log into the vps and just handle it it's fine
if we shifted to a managed platform as a service, there is just a ton of admin and moderator features I would have to code into the site, which would be nice for sister sites, but just be time for us to get back to baseline.
So I don't know, there's kind of my brain dump.
But yeah, to Fritchie's point,
We're in a weird size of we have enough traffic.
We need kind of a real hosting.
We can't just throw it up on $5 a month hosting.
But at the same time, I don't have a commercial SLA I'm trying to maintain.
I don't have to hit five nines.
frici Oh when i said scale, I meant when it comes to orchestration not to hosting plans
site goes down people understand and will deal with it because it's just a volunteer service so that's kind of a weird middle area where we want some things to be sophisticated but we don't need the full yeah you're going to put a professional developer on this for weeks oh and you're talking about orchestration rather than hosting plans yeah i'm talking about that same kind of thing where
We need a little bit of orchestration because we can't just be a slap it up on the cheapest VPS.
32:51Yeah.
So I wanted to jump into, I'm happy to continue taking questions about the outage or our hosting or anything else.
ghost_user_1984 k8s!
If folks have them, feel free to pipe up and we'll come back to it.
ghost_user_1984 (joking)
dzwdz out of curiosity, what's the bandwidth usage like?
But otherwise, I was going to transition into open pull requests and issues.
I just fixed a couple of bugs in the Kubernetes.
No, that's Zee or Katie on the site who uses the username XE on a bunch of places.
If you go to their blog, is it katie.info?
Oh, here we go.
I cannot remember these things.
They have like a home lab with a couple of machines and then they've run Kubernetes and other giant overkill things on it.
It's been a whole series for them.
Let's see.
Where was it?
frici Xe is absolutely insane though, that's a different matter LUL
Can I browse by tag?
Yes.
Where's the Kubernetes tag?
Oh, I can't browse by tag.
They're not clickable.
But in any case, I get a big kick out of their blog because they over-engineer the hell out of things sometimes.
It's just a lot of fun.
And I'm not seeing the most recent one that I'm thinking about.
frici They run their weechat on k8s cause "I had this massive hammer on my desk, why not hit this tiny nail with it too?"
Oh, yeah.
Here it is.
My IRC client runs on Kubernetes.
34:52pushcx https://xeiaso.net/blog/
I don't know.
I get a kick out of this.
I'll share a link here because... Yeah.
Yeah, Fritchie, you're thinking of the exact same post of my IRC client runs on Kubernetes.
I don't know.
I understand if you professionally work with it, it's less...
wild to run it at home, but it's still just hilarious overkill.
35:21I respect the hell out of that kind of passion project. And what if I just did this fun thing?
...38So I'm going to grab a browser I'm logged into because I want to be able to look at pull requests and merge them.
pushcx https://github.com/lobsters/lob…
And the first one was really short, this one from Edward Loveall.
And I've talked a bit with Edward in, I think, another issue or another pull request
About improving the read me so that folks can get the code base running locally.
There was a. I was thinking about this one a bunch because we just had a post.
Where is my browser?
Someone just wrote an ask post on the site about.
pushcx https://lobste.rs/s/d1n9k6/kind…
Their preferences for the web, what they like.
Yeah, this guy.
And a lot of these, the bulleted list, there's a little bit of nostalgia here.
And there's a little bit of, hey, why can't we keep simple things simple?
I like most of these things, or I agree with most all of these things.
Some of them are like CDN and CAPTCHAs.
CDNs are
at some point in some technical scale of you want low latency with geographic responses or you just have so much volume you need them and CAPTCHAs are if you have certain kinds of abuse or interactive things you just need them like it would be nice to not need them but at this point they're an engineering requirement in the same way you just have to allocate enough bandwidth to your box enough storage enough
You have to deal with enough bad behavior, right?
Like you have to have a web server that doesn't have buffer overruns because there's bad behavior out there.
37:51In any case, it had me a little bit nostalgic for maybe the early 2000s web, which was a much more volunteer affair with many, many
I guess we would have called them mid-sized now.
frici Problem with captchas often enough is that your standard choices/most common ones are either full of user tracking for their vendor, or overly bad for accessiblity
They're all tiny at the time, but like individual small forums.
And I was like, oh yeah, I miss standalone forums instead of everything just being on Reddit.
frici but I definitely understand their need yeah
shurizzle I too would like to live without CDN, captcha and geolocks. Many times you have to do it by law.
And years ago, I often thought about making the lobsters code base a little easier to stand up or running it as a,
frici also that yeah
like lobsters as a service last but there really wasn't any interest in it because the folks who want to run small indie forums think that five or ten dollars a month is kind of a lot to pay for hosting and especially when reddit is like yeah zero that's hard to compete yeah fritchie the fritchie says the problems with captions often enough are that the standard choices or most common ones are full of user tracking for the vendor or bad for accessibility
And yeah, that's, I agree, those are the major limitations of it, but they're also kind of mandatory.
Oh, yeah, and sure is all you point out that.
hejihyuuga @Frici and also hard. I feel so dumb when i get captchas wrong
cdn captcha geolocks that last one geolocks of necessary by law yeah that's a whole particular level of commercial scale where governments send you lovely letters where it's like all right i guess we're doing geo blocking now or there are a couple of topics like if you do
adult oriented stuff, you pretty much immediately are taking on geo blocking because of all of the jurisdictions that have censorship rules around that.
yeah so anyways in the in the spirit of liking the smaller indie web i really appreciate edward contributing back some improvements to our readme where i wrote out the readme for how to get started with developing and the improvements here of like oh yeah of course you know how to make a user
I appreciate that he came along and pointed out like, well, why not include those couple lines?
I'm happy to have them.
40:48It says the wording is a little bit redundant, like between the description. And it's not quite a match. yeah so let me just make a small change here oh actually and the other thing is he mentions my sequel and it's got to be maria db
41:52So I would like to merge it. I would just hit Merge and tweak it myself. But the difference between MySQL and MariaDB, I want to make sure he sees it and has a chance to think about which he's running.
42:53So does this match what's in our sample config database? Yeah, great. And I think flush privileges has to come after.
43:41All right.
And I looked at this one before the stream.
The difference here, db setup runs schema load and then seed, which is the only reasonable way to set up a database.
You should not run all the migrations from scratch.
db setup doesn't run db migrate.
And I was thinking about this of, well,
If you are checking out the code base, probably we should never have committed the... We should never have committed migrations that haven't been run.
I think that happened once in the history of the code base, and it was a mistake.
So I think it's okay to do that.
Yeah, that's fine.
We'll just check that off.
And I wanted to request a couple of changes and say, yeah, this was very nice.
This is the kind of, the setup for getting a development environment is a little bit of work and I can see the benefit of all you do is pull down this Docker container and you're ready to go.
I can kind of see that benefit because when setup is 10 or 20 steps, we get fewer pull requests.
So I really do appreciate trying to minimize that.
pushcx https://github.com/lobsters/lob…
come back to that one but we also have this pr from by route that we looked at the last stream this 1316 which i will pull over and put in the scratch and so
46:13and share in the chat. So the Ubuntu upgrade aside, I did get our Rails 7.2 pull request deployed on Thursday or Friday. And that part of it has been fine. So I'm going to go ahead and... Ah, good. He was able to rebase. And I've given him a conflict. What's the conflict? And why do I have to use the command line? That's unfortunate. Let's take a look at the diff real quick. All he did was delete a file. All right. I'm going to go ahead and merge this and sort out whatever this conflict is. And if I have to do it by the command line to be it, let's swap you out here.
47:18Man, so many browsers open.
...26All right. Just clearing some stuff off screen so I can see the GitHub commands to copy and paste here real quick.
...47I have some config for how I wanted pull requests to work on a previous project. It makes these things mad. So I've got to tweak that at some point.
48:09And then the difference was just that these were removed. So I'm going to go ahead and Actually, let's take a look at this one more time. I wanted to make sure that one thing about locking browsers that I really disagree with isn't in here. Oh yeah, this one was fix that foot gun. Yeah, and we already had YJIT kind of famously. So let's go ahead and remove this.
...56Oh, right, and then here's me hassling myself. Just trying to change, you know, 15. No, more than that. When did I start using Git? Must have been 2008. So yeah, changing quite a bit of muscle memory around switching branches from checkout to switch. I'll get there, but. And apparently I've got a typo in my gig config, but you get the idea of what's happening there.
49:46All right. So now if I say.
...57Eh, I've done something else to it. Whatever, we'll just comment that out in my git config for now.
50:07So let's merge by root rails. Push that up. There we go. Great. And the pull request is already updated.
...49There's a small thing there where what's happening there is Rails says, oh, when you update, here's some config file stuff that changes.
And it has actually a really clever thing with you can specify the version of the defaults for config settings you want to use.
And then it gives you a really nice templated config file for reviewing and setting those.
It's all very thoughtful.
it's easy to just literally forget to do it.
I don't know if there's a way to build a reminder in better of, hey, Rails, could you see when it's been a month since it was deployed?
It's sort of operating on the wrong level of abstraction to give me a useful reminder.
pushcx https://github.com/lobsters/lob…
So I do appreciate that by route open a second PR so that I would think about it after a couple of days or a couple of weeks to get that merged when Rails 7.2 was happy and proud.
The last stream on Thursday ended with looking at this pull request 1322.
And I ran into a read line issue.
I was kind of tired and I ran into a read line issue and I just couldn't bring myself to debug it more on stream.
I'm going to give it, like, one shot here of... Can I pull that out of the thing?
If I see the cursor jump in a weird place, I'm just going to keep punting on it.
It helps the spell.
Yeah, no.
It's still doing this thing.
I wonder if it's my herb RC.
52:50Oh, yeah, I guess it's something particular to my IRB setup because blowing away the config file immediately hit it. So what was happening with this for anybody who wasn't on the last stream is
53:23A while ago, I toned down a title for clickbait, and in the chat room, a user, edk0, pointed out that, hey, you're doing this thing where you tone down clickbait titles, but there isn't really anything about it in the guidelines.
And regular users get what it is, but if it's not in the story guidelines, there's no way for new users to get it right unless they just happen to have read the mod log and
shurizzle Remove parenthesis in regexp maybe
shurizzle escape on parenthesis *
seen that and that's kind of unpleasant so let's try to add a or wouldn't it be nice if there was a guideline and i said basically yes it would be nice and wouldn't it be nice if you wrote it for me surezel for the parentheses i am trying to match the thing so we have let me just bring it up it's i don't think it's the escape we'll take a look but
I don't, if I'm not gonna commit, I don't need the personal browser anymore.
Let's take that away.
So in lobsters, we have the moderation log.
And you can see that when a story is edited, it says something like, oh, change title from A to B.
And so I wanted to, we looked at on the last stream, we looked at the
pull request where Ed K wrote up like a first pass at a guideline.
And I kind of hemmed and hawed about it.
And I was like, well, there's more that's not captured.
And in tinkering with it, I realized, you know, we just need to look at all of the times I've edited something and mentioned clickbait and spit out a list of old title, new title, and just code them.
That's code that in the survey sense, not code that in the programming sense.
And so I wanted to write a quick, like, let's select it out.
You know, maybe somebody else pointed out I should have just done it in Vim for the amount of time it took.
Whoever that was that said I should have just done it in Vim, I believe you were right.
Why am I even bothering with the regular expression?
So if I just say...
56:01Just want to get Maria to be running. Yeah, here we go. All right. So let's, what was my query before I can retrieve it, right?
...23Yeah, here we go. So let's just grab that and run it. So if I grab all of the ones that mentioned clickbait or toning down the title.
...45Nope. Don't nest my VIMS. So we have 82 of these. Yeah. And what I'd like is.
57:07I guess I would really prefer to have a CSV, because I could pull that into a spreadsheet and just visually see these and run down the list. I can see these now, but the fact that nothing lines up just makes it hard to scan. So how many of these changed URL? Just literally the one? All right. So I'm just going to toss that. And then what am I looking for? Finding the close quote on all these. I could deal with a Vim macro.
...59See, I'm almost just straight back into writing a regular expression. Let's just grab all of these. Didn't edit the tags on any of these, did I? Yeah, I did. All right. I'm going to throw away the tags because I don't care about those.
58:34Anybody else merged? Yep.
...50And then that's all of these. Oh, the ones with the description, we definitely don't need those.
59:06By which I mean, we don't need the descriptions. We do want the title changes. Just a couple of those. All right. just kind of skimming these just a couple of places things were related removed the ones that were removed were probably clickbait that was also business news so there's the start of that and then here we can just do the easy thing and change space to quote let's say quote comma quote Hey, look, now it's a CSV. That was easy. And you know how to really make it a CSV is we just rename.
01:00:08So I have LibreOffice calc off stream. And I'm taking a second to open that up because it's flashing all kinds of local file names. Excuse me.
...31So we'll say that we can bring this on screen and insert or out. So we will say what's going on with the old title and the new title. Why? So one of these has weird quoting that it got wrong. And given that we've got 81 other examples, I'm just going to drop it rather than worry about reparsing the whole thing i think for 80 examples usually when i i code these kind of things where i go let's look at all the examples after 10 or 15 you're like okay i'm just using these same two or three over and over so i don't know that we'll even need to look at all 82 of these but Let's look at why these things are clickbait and what's getting... Like these are... I remember this one. AirPods are a tragedy. Like, oh, come on, guy. Just say what you mean. So it was really hyperbole that...
01:01:53The moral judgment of it.
I'm going to make this guy a little smaller so I have more room to pontificate.
If you see any of these and you think you want to call it out, you can say so.
This one was calling out site name, just like try it out lobsters.
That thing is so tacky.
This one was more hyperbole where GitHub can't be bad.
It has to be the devil.
Like, come on.
arh68 lots of "should" type needless user-imperatives
A lot of these are... Oh, darn.
LibreOffice doesn't highlight all matches, but...
Lots of should type needless user imperatives.
Yeah.
You know, I was looking at ARH, I think you're right there, a big bunch of them.
I was looking at, ooh, I inserted a typo, intermidend.
The U, but the other part is U is almost always, is very often followed by should.
you're almost blind, things you should know.
I'm not sure if the issue here is more, it's presuming something about the reader by the use of the second person, which is kind of a long way to say that.
Or it's the should
01:03:59of let me give you something to do.
arh68 lol i'm tempted to ask my "llama" to get a quantitative reason these are clickbaity
There's also the number thing.
I know this is in the guidelines for Hacker News where they specifically say don't include numbers like 10 things or top 10.
You're tempted to ask your llama to get a quantitative reason these are clickbaity.
arh68 maybe just listing 3 examples of Don't Do This is sufficient
I mean, that's kind of fun.
frici use of second person is a strong ingredient of clickbait, "read this to find out how you can be better" "5 ways to not be like HN"
frici small CTA or enumarated lists draw the eye there
if you want to maybe just listing three examples of don't do this is sufficient yeah because the end goal here is figuring out what's the pattern how do we explain and then how do we make sure that we're getting good titles
frici enumerated even if I could spell
Small call to action or enumerated lists.
Yeah.
So there's like second person.
Enumerated lists.
01:05:25There's also.
...31this one is such a judgment call like this guy wrote one decade letter gnome still sucks versus i rewrote it to he's still mad at gnome because boy was this guy mad it's that kind of universalizing which is this is a bad way to write it that's okay i'm drafting
01:06:06It's hard to say. The other one that was along those same lines was introducing Neo Haskell, a beacon of joy in a great tech world. You don't have to be loudly disappointed in the whole world. There we go.
...29That is a phrase I think I've used before, and that is going to be our stream title probably.
...51guess another thing that's real common in the clickbaity titles and it's it's in the the hyperbole is like it's the the heaping scorn you know it's something isn't just bad it's evil it's not buggy it's an infinite source of bugs it's not
I dislike GitHub.
It's we need to talk about your GitHub addiction.
I'm really not a fan of people who...
just endlessly heaps scoring on stuff and it's especially strong in titles because it's like oh wow why did you what earned that really strong opinion and it almost never is that the topic has earned that strong opinion it's the author just always writes in that style where
It's always the end of the world.
It's always this bug indicates the immorality of the people who wrote it, you know?
This one, we haven't touched on this one, but the
The secret knowledge thing.
So it says the secret Game Boy graphics mode hidden in the NES.
Well, it's not a secret graphics mode.
It's just an option for grayscale.
The NES came out years before the Game Boy.
So... Do any of these have the word hidden in it?
No.
You see that sometimes, like, oh, the hidden, the secret, the...
The thing you don't know...
There's...
There's a really nice outfit called Recurse Center.
They are a sort of writer's retreat for programmers.
It's offline, it's in New York City.
I've talked a little about it.
In their code of conduct,
One of their social rules, I think a lot about this one is, where'd it go?
Is no feigning surprise.
pushcx https://www.recurse.com/social-…
So they talk about
When someone says, hey, I learned X, don't reply, oh, I can't believe you didn't know X.
How have you never seen X before?
oh you call yourself a programmer and you don't use x it's just that's super tedious and kind of awful and it's a way of saying i'm better than you and we kind of see that with things like the shocking immaturity of javascript
01:10:31Another thing that's happening here in 48, how meta Google and GitHub and others leverage HTTP conditional requests to build robust REST APIs.
frici is that feigned surprise? i'd figure thats condescendence more than "surprise"
It's just like, it's nothing specific about those.
Actually, they just are three users.
It's weird name dropping.
It's sort of hype name dropping.
frici Rudeness regardless though
Is it fame surprise?
Fritchie says they believe that's more condescending than surprise.
Yeah, condescending is the general term for it, I would say.
A lot of people, unfortunately, want to go online and condescend to others.
arh68 there's like needless specificity (name dropping) as well as needless indirection (this "hidden mode" aka greyscale)
I have occasionally asked people when I've removed condescending comments, like, hey,
arh68 it's hard for me to pin down why these are bad. but i know it when i see it HahaCat
you had a bad day did your boss yell at you and people have sometimes said like yeah i had this lousy thing happen at work and it's really easy to turn around and try and condescend to somebody else to feel a little bit of control or feel a little bit better but it's unfortunately super poisonous to a community
area needless specificity like name dropping as well as needless interaction in direction this hidden mode aka grade scale yeah that's that's part of it i wrote secret knowledge but hidden knowledge needless indirection is another good way to put that it's hard for you to pin down why they're bad but you know when you see it yeah and that's the value of a guideline
It is useful for the submitters to know, hey, here's something that you can edit out and you would be improving things.
It is also valuable to force the administrator, me, and for the community to think, well, how will we explain this guideline?
What are the actual boundaries of it?
Because if I have to write a guideline and it's like,
Don't submit a headline with bad vibes.
It's like, okay, you don't, you could probably be more specific about that and it will be valuable to you because it will force you to learn what you mean.
It's sort of, it's like how one of the benefits I've had as a senior developer pairing with juniors is we sometimes have design issues and it's like, oh, well we could make this a function.
We could make it take two arguments or a hash or be on a class or all these other things.
And I have a strong opinion about which way it should be.
And the first couple of times I was pair programming with juniors, we would hit one of those little design issues and they would say like, why?
And I would say, I don't know, this one just feels right.
And pair programming forced me to be more explicit about what I meant than feels right.
And a lot of that was,
some modes are prone to creating bugs, especially when they get edited in a few months, or they're hard to maintain some other way, or they're confusing.
Why are they likely to create bugs?
And working through just giving those explanations was valuable to me as a senior developer, because it forced me to introspect on, oh, I'm valuing immutability, I'm valuing
clear return types i'm valuing x y and z and then i could use that better elsewhere so if the community can say oh we value not having condescension in titles it's oh yeah we actually don't we also value that in comments we also value that in story text and other things and hopefully that helps everybody think and be better writers
01:14:49Yeah, here's another one that's both hyperbole and indirection. It feels like there's a missing term where when And this one, the massive bug at the heart of the NPM ecosystem. So massive bug, like there's the hyperbole part, but this at the heart of the NPM ecosystem is like, oh, okay, well, well, what is it? You sort of have to click through to know what it's really about when it's this feature they have called manifests. And it's that it's not so much in direction as it is. like having an obvious missing noun like just just say what it's about hmm
01:16:05arh68 they're like jeopardy clues !
yeah another one here that does that is this one that was submitted with the title the dying web and i rewrote it to the chrome monoculture because that was what they were mad about but it's kind of like well why is it dying what's going on like what even is the topic here because you could see a hundred things this could be a technical concern about bgp this could be
The necessity of CDNs to scale.
This could be government firewalls.
And instead it was like, oh, well, Chrome.
Chrome is the missing noun here.
...55Yeah, this one. Here's another one of... Parler's Epic Fail, a crash course on running your own servers on a shoestring budget. And I just got rid of the early part, Parler's Epic Fail, because again, it was a name drop plus...
01:17:27most exciting journey of 2020 that was actually about starting to learn rust that again was hyperbole i keep saying hyperbole and i like i realize i have majored in college in english but i don't know if the word means much to most people or if there's a better synonym for hyperbole
01:18:02frici "The one word the sysop of lobsters keeps adding to cells"
frici (sorry couldn't resist)
It's the, everything is huge.
The word, the system of lobsters keeps adding to sales.
What is hyperbole?
Yeah, not exactly potent potables.
...31Hmm.
programming in the apocalypse programming after climate change yeah that one's hyperbole here i'll add it to one hacking a samsung galaxy for six million dollars exclamation point question mark i think this one was actually a youtube video that's such a youtube title
frici That is definitely a YT title
I have in my primary browser profile, I have some extension for YouTube where people rewrite titles to explain what a video is actually about instead of having that kind of clickbaity thing.
frici DeArrow <3
I don't remember what it's called off the top of my head.
Let's see if I can find it real fast.
Is it D arrow?
Yeah.
Fritchie, you are correct.
That is D arrow.
Do you have a link for it that you could share?
frici https://dearrow.ajay.app/
It's funny because I installed it and everything got immediately more chill.
I don't watch a lot of...
Thank you, Fritchie.
Let's grab that for the stream notes.
Everything got a lot more chill immediately.
And then like...
Because I've visited YouTube since it was created, well before the whole clickbait title thing started, I just sort of stopped noticing that I wasn't seeing these clickbait titles anymore, and everything just seemed more chill in a very familiar way.
So that's why the name didn't stick.
It just sort of vanishes into the background in a very nice way.
developer tool secrets that shouldn't be secrets.
Yeah, I toned it down of Chromium developer tools that shouldn't be secrets just to be more specific.
And even that shouldn't be secrets.
I probably should have gotten rid of that too.
So that's the like hidden knowledge again.
01:20:56oh yeah microsoft had a secret windows xp theme that made it look like a mac what microsoft had a placeholder with windows x theme it wasn't actually secret it was just something they had during development i know because i can see the the icons on chat that
I always have one or two people who are just watching or just listening and they don't have the video visible or they have it toggled off in some way.
And I am sorry to kind of just be reading out a bunch of clickbait headlines to you.
That must be awfully distracting if you have me on for background noise.
This is the less exciting part of running the site.
There's all this fun hyperbole, but really it's just, well, let's figure out how to explain a site norm and write a good rule.
Why you can't switch?
shurizzle Wait, I need to pay 1$ lifetime for dearrow?
Yeah, there's the second person, the shocking immaturity of JavaScript.
01:22:06You need to pay a dollar lifetime for D arrow.
I have no idea.
I would have installed it from the Firefox extension store.
And I don't know anything about how that works.
I didn't think the Firefox extension store, what do they call it?
The add ons dot Firefox.org.
frici Yes $1 to use it immediately for lifetime OR install it and it becomes active after 12 hours? or was it 24
I don't think that has any kind of payment.
...41I can't tell you about Diero.
I am pretty sure I didn't pay anything for it.
I don't know.
Freachy says, yeah, a dollar to use it immediately for lifetime or install it and it becomes active after 12 hours or was it 24?
That is a really interesting monetization scheme that someone has created there.
I think a lot about how those, yeah.
shurizzle I see a 6h free trial or 1$ lifetime
What if the Firefox extension store, I keep calling it a store, but it's not.
It's just an extension website.
They have a big directory.
Directory is the right word.
If it had had support for payments or subscriptions, would we have more extensions or would they all just be 99 cents a month or 99 cents a year like iOS?
And the iOS app store has been such a enormous success for incentivizing people to make more software and helping people make incomes that I don't know, maybe it would be good.
arh68 i'm like very anti-extension lol, idk..
Boy, we're looking at all this hyperbole, and I keep wanting to say something spicy about Firefox because I've been, like a lot of people, frustrated for a while by it.
frici click i dont/cant pay iirc let me open the site to check
But I wonder if they ever considered making the extension directory support payments.
01:24:28Speaking of payments, AWS S3, why sometimes you should press the $100,000 button. This one is like, again, a missing noun.
...48shurizzle I mean, it's a dollar, I can pay but it's strange
Game Boy's long lost workboy accessory revealed at last.
I just clipped the Revealed at last because it was so much.
But again, like, secrets, secrets.
frici yeah he has the option in case you want to. it's honestly feeling strange but its actually quite a nice model
Another odd thing about D'Arrow apparently charging is there's one guy who runs the extension, but then it's everybody who has the extension involved is creating those titles.
I don't think any of that dollar flows to all the random users.
I don't know.
It makes kind of sense.
Somebody's got to host the server for it.
Most popular mistake to ruin.
There's more missing data.
Again, hyperbole, missing noun.
It's clearly the missing noun that's happening in a lot of these developer tool secrets.
Oh no, terrible schema from a clueless programmer.
01:26:08The US military wants to understand the most important software on earth. Yeah. It's name dropping again by saying US military instead of being specific. And then most important software on Earth is, again, Hyperbole. There was a lot going on in that title. The Secret Now.
...43arh68 these headlines are like overly-saturated picture setting
We need to talk about your GitHub addiction.
That one was definitely moralizing.
These headlines are like oversaturated picture settings.
arh68 blown-out contrast &c
Yeah, they are.
arh68 fish face lol ya
These are the, on YouTube, all of these would have the giant shocked face where someone looks like, you know, they just had a limb cut off and then there'd be a giant red arrow and a circle around nothing.
And you'd be like, what?
The fish face.
I had not heard it called fish face.
I always heard it called, I always just called it YouTube face.
So like my spouse and I just call it YouTube face.
There is another extension, probably by the same AJ guy for replacing, or maybe it's DRO that does it.
It gets rid of the preset thumbnails and just grabs a random frame from the video.
frici dearrow does that too yeah
And so you just see something in the video rather than the weird faces and such.
There was a funny transitional time in YouTube
years ago before people were allowed to set thumbnails and YouTube used to grab like a, somebody figured it out that it would grab a frame from like 40% in or 50% in.
And so then people started editing their videos and they would cut the whole video and then they would figure out what frame is at the 40% mark and replace two or three frames with the thumbnail they wanted.
And so you'd watch a video and there'd be like a weird stutter where
They would jump to something else with a title on it so that you could see that on the thumbnail.
And I think that's what finally prodded YouTube into supporting and letting people directly write thumbnails.
frici you can still do add like 4 images and let youtube choose a random from them or set a single one that YT will always use.
I wonder if I miss edited this one from Tailscale sucks to jailbreaking a Dreamatek Z10 Pro vacuum.
I don't know what that's about.
01:28:52Or hyperbole.
01:29:00A big chunk of what's wrong with hyperbole is things are not actually the end of the world.
And if you talk about essential libraries you're missing out on in Python, they may not actually be essential, especially for the user.
And you never can actually use extreme statements when they really apply.
Haha, we live in hell, which I changed to difficult UX in parking apps.
Yeah.
you are being infinitely tortured by an app for parking.
Okay.
This one I have highlighted, the hardest software design quiz.
That was such a trolling title and everywhere that got posted on Reddit and HN and lobsters, just everyone wanted to pick a fight.
I guess that was part of it, was
You know, it was asserting the supremacy of something.
And a bunch of these do that too, where things are the best or the worst, or they are the secret knowledge, and they are kind of engagement bait by setting up a, well, let's talk about what perfect is.
And I think part of it is there is no perfect in tech.
Everything is trade-offs.
There are occasionally things that are dominant in the sense that they're better in every way.
You know, and I would probably say that about Rails 7.2 versus 7.1.
Yeah, okay.
In those kind of narrow circumstances.
But
arh68 i think "worse is better"is maybe my favorite essay, and it's clickbait to some degree, but nothing like this stuff
rails verse laravel that's going to be trade-offs one of them is not going to be superior except for you know the first 10 days that laravel existed maybe but now if you want to write one of those one of those supreme you know supremely better supremely worse things
you're really missing out on a chance to have a good discussion about what the actual differences and trade-offs are.
And you know, that might be a good way of saying like, the reason I care about all this clickbait and the reason I tone it down is we're trying to have informative, interesting, friendly discussions on lobsters.
And when we start off from Gmail is breaking email, we end up with random rants and, you know, everything about Google's business practices rather than whatever the actual technical definition is.
And it tends to be a
frici on one hand GMail really is breaking email but, toning down the title to invite discussion instead of inviting blind ranting is not a bad idea.
more light than heat kind of discussion where people are just riffing on the headline or finding stuff to be mad about.
arh68 i blame Dijkstra for all this endless blow-harding HahaHide
There isn't, there's much less learning because you kind of can't learn things when you're mad.
frici @arh68 LUL
You blame Dykstra for all this endless blowharding.
I don't know.
I think,
arh68 "considered harmful" thankfully mostly behind us
I think somebody was going to do it at some point.
Because, you know, YouTube is not Dykstra's fault.
Magazine ads are not Dykstra's fault.
01:33:30And, yeah, Fritchie, the goal is, as you say, it's discussion instead of ranting. Hmm. Changing Tailwind CSS marketing and misinformation engine to Tailwind semantics versus utilities. Yeah. This one was just like missing the topic. And it was hyperbole. There was one of these, I don't remember which, where I toned down the clickbait title and somebody I ran into at a meetup that day mentioned that they couldn't figure out how they had ended up with that tab open because they read the very plain title and it ended up with and then you know they they opened the tabs and they came back to it 15 or 20 minutes later or after lunch or something and they were just like why do i have this incredibly spicy blog post because some of these are just so far off from what they're actually about like the n-shitification Konami code.
01:34:50I don't even know what to call that one. I mean, it is hyperbole, but it doesn't even get at what's wrong there. We'll call it missing noun.
01:35:15Who's going to ask Llama about these or find a definition of clickbait based on inferring these? We're being erased from history. Oh, that one was trolling.
...40arh68 i was, but i'll let the humans have the fun today
Yeah, so like half of these are hyperbole.
And this one was also moralizing.
...52frici @arh68 is the llama whisperer according to chat history π€
All right, yeah.
All right, if you're going to let the humans have the fun, as long as you're having fun with these.
So do you feel like we're getting to... You know, I've added kind of notes to about half of these, and we've talked about a few more of them.
frici and their own timely admission π
Do we feel like we're getting...
Getting to a clear understanding of clickbait.
We have... Second person, enumerated lists.
Really like, let's try and, so like...
Hyperbole is the most popular one.
That's the...
big boy and second person or where is it missing noun is oops missing noun is also super common and then just the various forms of i feel like the call to action like you should is pretty well captured by mention of second person or universalizing you know loudly disappointed in the whole world that's a
specific kind of hyperbole hmm so having looked at all these let's go back to the the pull request where ed k made some suggestion and i really do appreciate them taking a first pass at this because it wasn't until i read
this first draft that i realized how vague i was being about clickbait and how unactionable my first attempt or second attempt was going to be and then i was like trying to improve this and i was like wait there's so much more going on so that's what prompted me to look at the all right well let's let's pull all of these out and so i think they got a bunch of it so we we also hit
demands like don't use x or u there's absolute moral claims and so i wrote that up as moralizing or universalizing from the author's experience especially if they are negative yeah and then maybe two other things here that
This sentence was my fault.
They just moved it around.
Keep the story's original title unless it's unclear or badly lacking context.
That's where what I was getting at in the coding of missing noun.
Where you can't really understand what the story is about until you know, like, oh, it's Chrome.
Oh, it's email.
Oh, it's
tailwind semantics.
So maybe that gets us to something pretty reasonable.
Let's bring the editor back up here.
Did I make a branch for this?
Yes.
01:39:34So this was on the story form. And let's talk about what clickbait is. I have tried to generate phrase these guidelines as positive for story submission and also for the site if you look at the ones that are on the about page rather than a long list of don't do this i want to talk about what's the best stuff and there are two reasons for that well really three number one it's just more pleasant to read than a list of laws and number two it sets an ideal and a tone And then number three, and this one's the real killer, is when there's don'ts, people interpret them as narrowly as possible. And so if the story guideline says, don't submit your startup, people will say, well, I'm bootstrapping, and so it's not a startup, so it's okay for me to advertise on the site. It's like, no, that's not what you meant. What it meant was, hey, you're trying to take from the community by driving traffic to your thing instead of contributing like a normal person. But people read the negatives really, really narrowly. And so that's why I want to be real careful. And so rather than start with the definition of clickbait, I want to kind of start with, well, the ideal is, I'm going to write it that way. ideally keep the story's original title removing and then that's this section down here on extraneous components
01:41:59extraneous components from the title, such as the name of the site, blog, event section, and author.
01:42:13I do want to rather than say keep, just say use the story's original title. And that one's in bold because otherwise I have to edit 10 stories a day where people include Bob's blog at the end of every title. The user suggestions get a lot of these now. And I used to have to edit so many more of them. I added some JavaScript to the form to try and find titles with punctuation in them. Because if they have a dash or a pipe, they tend to have the name of the blog or the name of the author on one side of that pipe. And occasionally people submit anyways because they're like, well, that's what the form came up with when I clicked fetch title. And I was like, yeah, but it added text that said you have to read this. I could probably, if I really wanted to plug in ARH's LLM, probably have it read those titles and say, is there an author name? Is there a blog name in this title? Can you suggest removing it? But then, you know, 10% of the time we'd get a hallucination and it would add an attribution to a blog title and it would be, I don't know, GitHub's new React components by Edgar Dykstra. Edsker Dykstra? That was a tricky one.
01:43:44So how do we want to say, maybe,
...54It's also good to tone QuickBait titles.
01:44:09God, I don't know how I want to say this. They start the conversation wrong. That's so clunky. so what was it i think it's anne lamont's bird by bird she talks about you just have to write a shitty first draft sometime and you can fix it in it in the edits but i'm definitely writing the bad first draft here well then we'll tinker some i just have to see it clickbait title start bad conversations please Daniel Katz- On them down by moving hyperbole and I do like I really do like ED case practice of putting examples in parentheses.
01:45:05Daniel Katz- I wonder if I should change that to.
...13You know, I can just put the arrow in here. There's a, is it our arrow?
...57Maybe I should just be taking these examples straight out of existing titles. What was the one about Windows? It was... Microsoft has secret Windows XP theme.
01:46:34actually no that's that's maybe a bad example for this one because it was kind of hyperbole to make it secret so really it's let's find a better one that had missing info ah most popular mistake to ruin web pack bundle optimization and the answer was tree shaking
01:47:12so long i'm coming up with these like 10 word examples instead of a couple of words this is a terrible schema verse to normalizing i mean now i'm going too short but that's okay we're writing a bad first draft We're writing the worst draft that you wouldn't believe. How do I also fit the 10 worst drafts that lead to the apocalypse? Because you're sinful. There we go. Trying to squeeze it all in.
01:48:10By removing hyperbole. Your rating second person.
...39Actually, this one is more like the 10 secrets you don't know, right?
01:49:02I'm trying to separate these. And so the hidden feature you don't know is a pretty good one, but then that also gets into the missing information. Let's see. Who else has second person in it? A bunch.
...40Ah, yeah. Why you can't switch to Python 3.10 just yet. Hmm. Who else has second person? Essential libraries you're missing out on. A lot of these U's have the missing information thing going, just as much as they have secrets. Search for U. I do wish the LibreOffice search would highlight all the matches. Hey, you smart, well-paying devs. Five Ruby tips you probably don't know.
01:50:38Could maybe use that one. Five types of ZSH aliases you should know. Bad power attack corrupts fast chargers to melt or set your device on fire.
...56Hmm. Why you should never use the Cloudflare free plan. I could do that. Why you should never use X versus, it's also missing information of the, well, there were these 503s.
01:51:23Let me ask this differently because I'm kind of going through these.
arh68 why you should X -> why to X
So here's another one AWS s3 why sometimes you should press the hundred thousand dollar buttons do all of these second person ones have missing information.
Old see can domain squatted check if you've used any code from there.
don't sell your indie business to digital ocean.
That one's not quite missing info like it's not clear from the title that there's missing info it just sounded like a business rant.
We need to talk about your github addiction.
01:52:10essential libraries you're missing out on. hundred things you can do on your personal website I didn't even tone down the second person of this maybe second person doesn't matter much because it does seem like if we get rid of the other things like the hyperbole and the missing nouns most of the second person stuff goes away maybe the thing that's frustrating there is more the Like the hardest software design quiz where it's trying to pick a fight we're trying to moralize and it's more useful to talk about that than second person. And it's not that I don't want to remove second person, but if it's going to go away automatically if we get rid of if we add missing information and we've written a better guideline. let's make this not a gerund. Well, I think I have to. Please tone them down by removing hyperbole.
01:53:29arh68 i consulted my llama, which was not to my macbook's liking, but it offered a phrase I like: "misleading promises"
Yeah, this hyperbole, every once in a while it's useful.
And I mentioned that because I just thought of a...
one example i do like and maybe this is the only example i have thought of that i like of hyperbole is the sql criticism the billion dollar mistake that's about null oh if it's actually titled that and it doesn't include the word null it also has missing information
01:54:10Ah, yeah, okay, so it was titled Null References, The Billion Dollar Mistake, which, I mean, I want to call it hyperbole, but at this point, that is a very conservative estimate, or rather, it's a very old estimate. And it also, it's less concerning because it's the author themself, the person who created Null References, was talking about it rather than Somebody else. And so I feel if someone wants to criticize themselves, why you should X. Y to X. Oh, that's a really good example, ARH. Yeah. Let me pull that in.
...59See what I did there? Maybe the only good hyperbolic title.
01:55:07And then we'll tag it.
...17So for rewriting second person, we could, as ARH said, why you should X and change to Y to X. And you said that you consulted your llama, which was not to your MacBook's liking, but it offered the phrase, I guess you don't, or it offered the phrase you like misleading promises. That's, think that's a general problem with advertising where you know lose 10 pounds in 10 days or whatever maybe it's just a dishonest promise i think misleading is a good word there though as part of what the the problem with hyperbole is actually is when someone says i'm gonna see the apocalypse And i'm not actually seeing you know angels descending from the heaven, because I use sequel light wrong. I feel like I was misled I was promised an apocalypse and all I got was a type error.
01:56:37yeah I don't even like this start bad conversations.
...47Don't start discussions off right. So please tone them down by removing hyperbole. First bug in the world to bug. Add missing information. I kind of like the... the absolute moral claims that ed k zero wrote it's the the i don't know maybe say move incendiary moralizing or actually What if I said removing hyperbole slash moralizing, like the bug that ended, that caused the apocalypse, that turned into debugging a type error.
01:58:14debugging a null reference like that's also missing information yeah if i wrote the what if i just went and leaned into view i don't think i have to call out the like 10 the numeric thing like everybody kind of knows that one and is irritated by it so what if i just wrote the like 10 features you features you must use to
01:59:31kind of deliberately leaning into the include the the needless numeric thing that's that's kind of a a hidden info thing and just including it in well it's in the second person because so many of them had that same had both of those going on where five types of zsh aliases that you should know five ruby tips you probably don't know
02:00:14So that's that's kind of a rough draft.
...24Let's see what it looks like on screen, huh? I got to log into my dev server.
...39That's not my dev server. Okay. Dev server isn't running. Let's get that started.
...54In the dev server, it doesn't bother asking TOTP code. So let's submit.
02:01:08It kind of helps to see. Wow, so thick. Oh, and the R arrow. sure didn't type that correctly what's the top tail i refuse w3 schools i refuse oh come on fiverr all right fine at least it's not one of those really kind of scammy ones
...44R-R, no L-O-W, okay.
...53See what kind of arrow shape we get out of that. That's not so bad. Ideally use the story's original title. need that semicolon i'm such a fan of semicolons but we don't need it there it's just a splice removing extraneous components from titles such as the name of the site blog events section and author you know i've tried to that one has slowly grown over the years where people would keep leaving this stuff in and i would tell them to remove it and then they would say the guideline doesn't say i have to remove the event name and it's like well come on it's it's the same thing so that's just grown into a list Clickbait titles don't start discussions off right. Please tone them down by removing hyperbole slash moralizing. Maybe I'll just say or. Moralizing? Moralization? I'm in a weird tense here. Debug caused the apocalypse. Debugging in all reference. Adding missing information. A terrible schema to normalizing. Rewriting second person. 10 rubies features you don't know. I know it's how I was editing the markdown, but I kind of want to make this a nested list because then it's skimmable.
02:03:39So first, let's get out of the... The gerund case, this ing.
...52So to tone them down.
02:04:08Just say remove, hyperbole, add. See, it's nicer.
...26Let's see how that looks. I don't love that this is going to be like arrow to bullet to bullet. Yeah, see now you can just skim those and they each have a little example.
...50Honestly, maybe I would just be happy with it if I removed this deep indentation so that the bullet points were in line with this triangle, the detail triangle. Because without that, it just kind of becomes visually one level. So where's that indent? It's just the default, isn't it?
02:05:33arh68 "Ideally, use story's..." is not exactly uh, a sentence
It's funny to go from editing text.
Use stories is not exactly a sentence.
Where did I get that?
Use story.
Ah, yeah.
Use these stories, original title.
...51And, you know, I can make this one match the tense by saying and remove.
And remove extraneous components.
Then again, everything is in present imperative tense instead of, what is gerund?
Like the, I never remember the names of the tenses.
albynton Hello!
arh68 gerund.. it's like the noun of the verb, right ?
It's not the subjunctive case, is it?
No.
Oh, hey, Albington.
We are writing and tinkering.
So I was going to go over to the CSS.
And there's nothing here about guidelines, right?
Yep.
So what selector do I want to write?
Where's the story form?
Story form?
No.
02:06:52So we have the story box is the name of that. So if I have a story box that has a summary that has a UL. Let's give it a green background. That's probably enough to correctly select it. Here's one of my go to CSS things that make things just hideous. Are you not inside story box? Let's swap this over so I can see what I'm doing. So we have the inside. So we've got the story box. And then we're in the form. I'm not in the summary element, am I? I'm after the summary. OK, so it's details.
02:08:00gerund it's like the noun of the verb right yes it is all right so i've selected it and now that i've correctly targeted it let's say is it margin or padding i never remember probably padding
...27Could have tweaked it there. There we go. All right, so pretty close. What's the left padding on this guy? Because it's clearly got some.
...55Because I don't want to hang those dots in the margin. I just wanted to line them up. There we are. 1M looks nice. All right. So if I set this to 1M, close this, reopen.
02:09:19Now that feels much nicer. Now it's going to chill. It's two levels instead of three. Ideally, use the story's original title. So we're starting up positive. Remove extraneous components. Clickbait titles don't start discussions off right. I don't think we need to justify that. Well, maybe a little, because it's try and use the original title. What am I saying?
02:10:06Clickbaity? No. We also tone down clickbait titles.
...23Don't need this punctuation here. Makes sense to me, but the reader's not going to get that one. Remove hyperbole and moralizing. Yeah. Do we have a better example for moralizing that we could use? AirPods are a tragedy. X are not repairable.
...59What if GitHub is the devil?
02:11:10Who else do we have here? The massive bug at the heart of the ecosystem. Ha ha, we live in hell. That one is, there's so much wrong with that one.
...26We're being erased from history. The dying web, hmm.
...51We need to talk about your GitHub addiction.
02:12:03Fixing cringe-worthy bugs.
...15That's not bad. Well... I'd rather have a slightly more extreme example.
...34The most important tip for beginning software engineers is... God, they even wrote it as a missing noun.
...45Speaking of sentence fragments... You're almost entirely blind. That one was hyperbole.
02:13:02That one has like all of these. You're almost entirely blind. It's you. It doesn't say that it's about the RF spectrum. It's hyperbole because it's entirely blind. That's a... That's maybe like the most, the wildest clickbait title on all of lobsters on the entire web that kicked your dog. It's a little tempting to use this, the most exciting journey of 2020. Because most of these are moralizing negative or hyperbole to the negative. And this was hyperbole of to the best. How one word in Postgres unlocked a 9x performance improvement.
02:14:06arh68 they're like saucy suffixes without the reasonable protein prefix
That's a missing noun.
...15arh68 "null references: ..." gets the balance
like saucy suffixes without the reasonable protein prefix hmm yeah null references gets the balance yeah yeah it's actually the the left side of this that i wanted to improve the bug caused the apocalypse bug that caused the apocalypse
is what if i said like the reckless bug that caused the apocalypse that's yeah it kind of pains me to write these things because i i hate reading them so much that i am averse to even trying to write the evil examples yeah evil is moralizing there we go i did it by accident the evil bug the reckless bug the
What do we say?
Negligent is not moralizing enough for trying to explain what's going on with clickbait.
02:15:28And yeah. OK, let's take another look at that in the browser.
...44know i like i really love working on the screen compared to being a kid and using a typewriter even an electric typewriter but every once in a while if i'm writing something longer i will still print it and mark it up with a pen there's something about seeing it in a different font or a different setting and then the tangibility of paper that helps so it's even if i'm reading the same words that are over in vim It's nicer to see it, like, well, does it actually look like it fits under here? And I do think that removing the margin on this bulleted list improved it. So ideally, use the story's original title and, in bold, remove extraneous components, such as the name of the site, Blogovich. Does all of this have to be bold? Can I make less of it bold? I wonder if I could just remove... What if it said remove the name of the site blog event section? Like we don't have to... I said I was basically giving up on the categories of things or the description because people kept saying that, well, mine thing isn't in your list. So that kind of also said to me, either you have to get rid of the list or maybe you would just say remove the name of the site blog. Here we go. Shorter is better.
02:17:21Name of the site, blog, event, section, and author.
...32We also tone down clickbait titles. Remove hyperbole and moralizing. The reckless bug that caused the apocalypse. Debugging a null reference. Add missing info. Terrible schema. This missing information A terrible schema to normalizing is okay. What was the one that was about Chrome?
02:18:03Ah, the dying web. Yeah, I would really like to avoid the ones with the really strong moralizing, so maybe... Oh yeah, the massive bug at the heart of the NPM ecosystem. Yeah, let's use that. Let's try that. So what if I said I'm going to change that to say, how do I change it to?
02:19:03I'm gonna put a capital letter on the start of these because we do do that typically.
I tried really hard to not care about if we're doing headline case for sentence case.
Having worked at a newspaper, I have strong opinions about it.
And I've had editors who had strong opinions about it.
But I don't see that the
As much as I like the consistency, I don't see a lot of value of it for the site, and so I've just left it alone.
But here, at least, I would like the examples to look more like the real stuff we see on the site, and usually we get titles that are in sentence case.
Ah, man, now they wrap.
I don't love that they wrap onto a second list.
So debugging reference, that's OK.
I think all of that is pretty good.
What do folks think?
I think that's gone beyond just being a first draft.
arh68 lgtm
I fixed the intro and tidied this other part, and now it's pretty clear of let's remove hyperbole and moralizing, add missing info.
LGTM, yeah.
Does Twitch have a ship it squirrel emoji?
Rewrite second person.
10 Ruby features you don't know to the RubyHash API.
02:21:01Let's change this to uncommon Ruby hash methods. It's a little better.
...22Oh, I didn't check. How does this look on the mobile layout? All right, that's totally fine. Device simulation, that's a new pop-up. Okay. I'm not gonna reload now, but I got it. Okay. All right, if I have all that.
02:22:09Oh, shit.
I'm accidentally committing the CSV.
Definitely don't need to do that.
Should have been deliberate about my...
Commit.
All right.
All right, so now if I push that up to the branch, ooh, a high severity bug.
This is, I fixed one of these this morning.
This one is for web brick, which we don't use.
That's fine.
I'm going to pull this on because it's kind of funny, actually.
So there was one, we got a dependent bot alert this morning about being able to edit Puma headers, and I bumped and deployed.
And now this one, HTTP request smuggling.
Note, the supplier's position is WebRIC should not be used in production.
That's kind of great.
You found a bug?
Well, don't use it.
And I get it.
Webrick was designed for local development.
It's just kind of funny to see the supplier say, no, just don't.
So let's reload the pull request.
So I pushed up, and it went.
Where did it go, GitHub?
I think it went to a branch.
mjiig It could be worse, I've seen errata to that effect for hardware
All right.
I think there's an option for editing.
Check out what the ceiling.
No, no.
arh68 i was, for a time, holding it wrong SeriousSloth
There's an option for pull requests where you can say that the maintainer is allowed to automatically merge code into your PR.
And Ed K maybe didn't check it.
02:24:46Mjig says, it could be worse. You've seen errata to that effect for hardware. Yeah. For hardware, don't use in production. So if I can't directly edit this pull request, so the thing I'm hung up on is, I would like to directly edit this pull request for convenience, but then also so that when I merge it, EdK's first draft is added to the Git history. Because I do think it is important to credit that this came from their first draft. Because they are the one who raised the issue and actually took on the not so exciting plan of like well let's try and write a rule which is it's more fun the idea of writing rules and having power than the actually doing it because the actually doing it is you have to think about rules lawyers and does this just come off as super negative and do i need to just read five dozen story titles to realize what i'm trying to say six dozen six
02:26:52what was the last, yeah. Last Thursday, three days ago. So 23, 22.
02:27:23What am I doing here? Getting the link right.
02:28:22I see what's happened. GitHub pushed it to just a branch, or Git pushed it to just a branch on the repo. I think what I'm going to do to preserve a reasonable history here and just kind of keep things moving along rather than block on it and like PR a PR, which is not a great workflow on GitHub, I'm going to commit and then commit my thing on top of it.
02:29:32It doesn't try to give examples. It actually gives.
02:30:21Okay, good boy. I have the cat in my lap. He's had a stressful night because he got tossed out of the bedroom for biting feet at three in the morning. Which is the kind of thing that leads to shutting the door. But now, today, he's like, oh, am I still loved? Am I still in the pack? So he's very, very lovey. Oh, baby. You're okay. So let's go ahead and comment.
02:31:00And let's hit Merge.
...10Actually, you know what? I can just put his in line, because it's just what there is in line. I don't think I actually know Ed K's gender. I keep saying ed, but it's edk. All right, good. And now here, let's pull that change down. And then cherry pick my commit which do I see the commit shot one on here.
02:32:06Yes. This one.
...15So if I grab my commit and then also I want to, I want to edit that commit message a little instead of say rewrite, I want to say revise.
...55And then as soon as I do that, I meant to add the pull request number so that it gets automatically linked from the pull request.
02:33:14And the pull request number was 1322. There we go. Little hassle, but it'll be much easier for anybody who's trying to understand the history. So that's pushed. This one is still fine. That's the WebRIC thing. And now this pull request should include that commit. And it does. Lovely. That's really nice.
...52All right. So the only other outstanding... So let's see the... Oh, there's the extra branch. Let's get rid of the extra branch.
02:34:14Which...
...20I don't remember if GitHub has web UI for deleting a branch or if I have to Does anybody remember, does GitHub have a way to, on the web, delete a branch, or if I have to do it from the console?
...43Yeah.
So we'll do git push origin.
jadlers You should be able to going to the branches page of the repo
delete and then the name of the branch which is there we go and then also i can delete that branch here because i don't need that anymore i merged the part i want to great tidy
Oh, Jadlers, thank you.
I appreciate you trying to mention it.
I did pull up this.
Oh, right, there's a specific branches page.
You're right.
Yes, thank you for remembering.
jadlers No worries, your way works too
I will try and hang on to that for the next time.
I forgot this three branches thing was clickable and it had a detail page.
I've used this before.
It's been a minute, though.
Yeah, my way works.
It's just so obscure.
I couldn't remember what it is.
That's why I was looking for.
All right.
So I already left notes on the improving the setup message or pull request and this pull request about ordering comment replies to action mailbox.
I'll talk about it a second in case anybody is curious, although I don't, I don't know that it's ready to deploy.
All right, so they touched it.
So I talked to them a little about this.
And if I didn't do it here, I must have done it in the chat room.
But Lobsters has a mailing list mode so that you can subscribe to get comments by email and get stories by email.
And if you use Mud or Thunderbird or another one of those old school mail clients that's really oriented around threads and mailing lists,
mailing list mode is a really comfortable way to use the site.
And the way that incoming emails get into the site and could appear as comments is
not an ideal way to do things there is a lobsters user on production and they have a dot forward file that proc mail uses to just type their email into a command and it sort of works but then it also grabs bounces and when something doesn't look like a comment it throws it off into another bin that i almost never check so i don't see bounces so i would just like to
use this Rails feature that exists since lobsters was created called action mailbox.
An action mailbox basically takes all incoming things, sticks them into active storage, which we also want for an avatar feature that's been hanging out for a few years, and then has this concept of routing where it can recognize
messages based on all kinds of characteristics and sort them into sort of a job queue so this one would this has got to come out of the script so i think that'll be a really nice
plumbing improvement for the site because every time we've leaned into these rails features things run a little bit better they're a little less brittle they give better error messages they're easier to build on top of they're much easier to test so I really appreciate that gmom gmem has taken this one on
It's not quite ready to go, but I'm looking forward to it.
And I'm gonna have to collaborate with them some more on IRC.
So with that at a pretty good place, I'd like to go back to the Repaginate branch, which started on stream.
We haven't touched it for a couple of years.
02:39:26and to give the quick catch up about the feature when let's see i think i still have a pagination browser window open give me a second to click around my headings here yeah i've replaced the database so i gotta migrate for this branch or not i must have been running on test data no well we'll see so when the site has a list of stories or a list of comments we have pagination at the bottom and we're doing what's called limit offset pagination which says, oh, sort all the comments in the database, give me them 15 or 25 at a time and in batches and start, you know, 300 in if you're on. So what 25 per page starting 300 in is you're on page 12, 12 or 13 off by one errors. As I said when I started working on pagination, as a programmer, I will be making off-by-one errors until the day after I die. So we are redesigning to use cursor-based pagination, which is where we pay attention to the idea of a story, or in this case, a hat. Or no, the idea of a story or a comment. This error is spurious because we are Also adding a page with no pagination to kind of start from scratch. Let's go take a look.
02:41:42So the site has hats so that people can talk officially on behalf of their project that they contribute to. And excuse me.
02:42:04Let's grab this to have a working one. So this ran in a development mode. That's why the ID doesn't match whatever is in production. This person only has a handful. Let's see if I still have that query.
...43Yeah. So we'll do that, comma. So here are the hats that have been used quite often. Let's go ahead and grab this one. Or no, this is duplicate hats.
02:43:12I swear half my memory as a programmer is...
...24I'll just rewrite it. Half my memory is in these tools that have shell commands. So let's grab hat comma count star, short ID from hats group by, hat dot id now join comments on const dot hat id equals hats dot id grouped by the hats dot short id okay There we go. So here are people who have left lots of comments. And I believe before we talked about oil shell or oils. So let's continue using that hat.
02:44:32So now we're finding Andy C's comments on oils. And as you can guess by the very teeny scroll bar, They are all loading onto this page. We can reload these other ones.
...55So since I started this branch, I added the code to generate hats IDs to production that got deployed. But of course, production, when it ran the migration, generated different random IDs for hats than development did. So we have some of this basic functionality. So you can say after. So these are, I believe, pages two and the last one. Yeah, there are not so many on here. So that must be the last one. So we're kind of getting there.
02:46:06It's showing me everything. So if we're just looking at what's happened on this branch, I moved a constant over to the comment model. I added this new page with the concept of finding things after. And the direction this is going to work is starting from this one single action. get that working, and then kind of extract it. I always have to do a specific example and then break out something more general.
...59So just limiting comments per page would be nice. So now this page shouldn't have whatever, 170 comments on it. No, it still has too many. That's odd. Why didn't that limit?
02:47:26I go look at the query that ran.
...54Well, that actually only has 20, does that? NDC writes fairly long comments. Okay, I guess there's only 20 on the page here. Yeah. He just has been verbose. That's good. Just made it, didn't quite pop off the page to me.
02:48:28So I had written a after scope that optionally took a cursor.
...45And. If there was one. We looked up the individual comment they had, and then we sorted by ID because that was our proxy for created at.
02:49:06And there's the option of doing dot before, but I wanted to get one direction of pagination working.
...20So with this, I think the only thing missing is the next link. This page got it, huh? After UAY. So let's see what's going on over in that view.
...57Which view did I edit?
02:50:06app views, comments, index. So these views, not the RSS, that's not even the right stream. That was last week instead of a minute ago. So here we go. We said if hasNextPage comments, and hasNextPage was the, we were supposed to over select, right?
...42yeah so this should say comments per page plus one and then this first page will select 20 comments 21 comments hopefully only show 20 i'll have to check and then it has an after link and if i follow that i should get the next page of comments I am going to trust that that's correct because there's not a lot of way for that scope to go wrong.
02:51:34So there's a, Yeah, it's definitely printing that 21st comment. Or let's see what this page does.
...51Oh, I started extracting.
...59Okay, so I already handled the case of limiting comments per page. So that's in pretty good shape.
02:52:16All right.
...33Just follow the Ruby semantics of having a question mark on the end of a method where that's a predicate. When I first came to Ruby, I was kind of weirded out by it because it was the first programming language I saw with that feature. But I've come to really appreciate the convention that having a predicate is, or having a question mark on a predicate method is returning a truthy or falsy value. So this really is a, I think a working comment paginator at this point, you can only go forward. And when you get to the end, there should be. All right. There's no next.
02:53:29But that basically works so if it basically works let's commit before I get a chance to break it.
02:54:03I feel like after, like this scope should do the limiting. Like I called it, see here, look, before I break things. All right, let's actually make that commit.
...37So I call this page after I replaced Q and then I said at the end Q dot limit. Oh, I already did it at the beginning. All right, man, I'm just reinventing stuff.
02:55:09And I didn't think to do it, but let's give a quick run of the build. I kind of hacked out the code. I'm not into test-driven development, so we didn't do that here. I just wanted to make sure, as long as I'm touching a shared template file, which is comments index, that I didn't break anything. And it looks like I have.
...43So there's a topic here of pagination. So what's the next step? We could do a previous pagination. I already have limiting and then there is for comments.
02:56:21I think that's a rough to-do list where next pagination, I think previous is worth the extra complexity. Especially there, let's also say extract pagination to a module or other metaprogramming because i don't want to have to have the two what is it called have the idea of pagination scattered in the models i would like to extract it so i was talking about pagination on i think on mastodon And someone said, why don't you use the PAGY gem? P-A-G-Y. The short answer there is it's nice. I like it. I have used it. For lobsters especially, it is too big. We're coming in somewhere fairly small. yeah 158 and a lot of that diff is going to be context lines but if we come in at 50 100 lines of code that feels i would rather write a fairly small amount of code than take a dependency on pagi which is not a criticism of pagi because it's very general and large And I would rather do the specific small things than have one more dependency. And that's kind of why lobsters keeps getting picked up and used in different places for performance tests and other things is we don't have a lot of complicated dependencies and Pagi is well contained, but these things just sort of add up. You know, each one is not, plus one maintenance points it's like a stochastic plus five percent maintenance risk where it increases the chance that someone is going to have to hassle around to get the dependency installed or we're going to have some breaking change from the dependency we have to integrate
02:59:06So I'm adding to the to-do list, I'm adding paginate comment search results because comments in the search engine can be sorted by date, but they can also be sorted by relevance. And so that's gonna be an interesting bit of complexity to add.
...46Hmm. That doesn't work, actually. So has previous page needs to know if there's anything before and, you know, As soon as I list two kinds of added complexity, I wonder if maybe pagi is the right call because it's not as simple to add here. What I have to know is sort of run the inverse of this. So taking the cursor
03:00:33and sorting the other direction.
spartangtr TIL ruby has lambda functions
Hmm.
How many lines of code in Pachy?
Yeah, lambda functions.
Spartangler?
Spartangter?
I don't know.
I always pronounce the usernames badly.
Yeah, the lambda functions are a nice one-liner thing.
spartangtr blocks are weird to me. i don't do much ruby at all though
The other one that's new in Ruby 3.1 or 3.3 is you can have one-line functions like, so I can write def foo and say return three, but I can also say def foo equals three.
Yeah, is that the,
What's the...
espartapalma spartangtr... another esparta(n) :D
I'm not remembering the syntax for it, am I?
03:01:56spartangtr yes it's definitely spartan
The...
Answers on Stack Overflow are badly out of date.
What if I say Ruby's 3?
03:02:12Is it just that I didn't have a space? Yeah, it's that I didn't have a space, I guess.
...26So these two method definitions are equivalent of foo returns three versus foo2 returns three.
...43Some of them, this is, I don't know, maybe a little precious for me, seeing it next to a comment. Makes me a little happier with the syntax. I've only ever seen it in standalone examples, and seeing it standalone, I've kind of been iffy on it, but seeing it next to a constant like this, okay, I kind of like it.
03:03:37So the way I've written pagination by the cursor is the one that you are looking after. If you have a cursor, you must have a previous page.
03:04:01So I don't know that I actually have to sort the other direction. So let's go the that's going to drive me nuts. Let's go the other direction.
...58That seems legit.
mjiig What happens when someone presses prev? Don't you also need to be able to express "up to" cursors as well as "from" cursors?
So back in my sample here, the first page of Andy C's comments should not have a previous link, and they don't.
03:05:18So MJ, yeah, you're kind of, you're getting ahead of me. Oh, this one, I didn't pass the param through as a instance variable, so I'll have to wire that up. But you ask what happens when someone presses previous, don't you need to be able to express up to cursors as well as from cursors? And the answer is yes, I do. But I was going to go kind of one step at a time. So first I was going to link to it and you see I named the parameter before instead of after.
03:06:02So here I have to say after equals after.
mjiig Ah okay, then I think I misinterpreted something you said :)
Say I want to pass this through.
If I do that.
...23You know, you may not have misinterpreted something you said I've said. it's very possible i've explained it wrong or i'm just not thinking clearly about it this has a couple of moving parts so for example here the controller is written to directly just say dot after but really what i want to say is either include a direction or switch on before verse after so let's split that out so i don't what if i called this paginate i said we had a before cursor and after cursor so i said if after cursor well if you have an after cursor then we're going to go in descending order
03:08:04if you have a or cursor now the first page yeah so i'm thinking about handling the before the first page where you have no cursor so this one is ascending otherwise We are descending, so that's... If we get it out... We always want it ascending. Yeah, I'm editing the wrong part of this. It is this part of this that I should be tweaking, not this. All right. So we'll always have comments in most recent order. Then we'll say... if there's an after cursor, and if there's a before cursor. So this guy, instead of being find the ones that are up to, it's going to be find the ones that follow. The triple dots is Ruby's range syntax. If there are folks here who are not super familiar with Ruby syntax, So that'll go into Active Record and come out. That might actually be all I need, because we'll still grab the same number per page. But a difference is going to be in the paginate helper.
03:10:05That's a prime candidate of moving to an around filter if I ever saw one. And getting a better name like before underscore cursor or after underscore cursor just so I don't step on my own toes. So this guy would become paginate with before cursor points to...
...40And I that limit was redundant, I only did that because Andy writes long comments and I didn't recognize that so much. And then we'll say before let's name them appropriately now.
03:11:01So i've only got one instance now. And the helper for pagination. the this page collection actually cares whether we're ordering in one direction or the other. So if we have an after. the first page yeah so what i'm trying to do is we're over selecting so there's 20 comments per page and we select 21 when we are iterating backwards You want to see if I'm still setting after. Do I want the first 20 off?
03:12:56yeah this is or as previous page this is where that missing method needs to be so what we're saying is if you are going backwards or there is a next page if you are going forwards or there is a previous page then to get to the page, we know that you had to have paginated. So then I do have to write a has previous page. It's actually just going to be the same method. It's not so much about next or previous as has another page.
03:14:02Yeah, so one of the things I'm looking at is, do we have a before and after cursors, or one cursor and a direction? So I've written it as before and after, and then the direction is implicit. But it could also just be, well, we have one cursor, and we're either finding messages before it or after it. And the two are functionally equivalent. Just trying to think if you get better code one direction. I think they're about the same, but I'm I think i'm happy with a before and after cursor but i'm going to keep kicking that one around in my head. And I thought of it because of this has another page. hmm.
03:15:36I think this is just going to be.
...46I think that's even the same number. I just figured I'd sketch that out now. So OK. So if we have a concept of a next and a previous, and then we pass it in here, it becomes this.
03:16:08What is it? We're going to take the pagination variables and make them available as instance variables. That's the very technical way of putting it. I think another way to put it at the more logical level would be like, just drop down here.
03:17:10rather than do this structuring destructuring thing if it's not an action i'm not really incentivized to try and squeeze it onto one line all right let's see if i got all that right or if there are any like typos yeah has another page it's missing the question mark so that's pretty simple hmm why did i get a
03:18:15Because has another page needs to know what direction it's going, doesn't it?
...29No? So we know if we have
...45Maybe it's and.
...53No. So if we have an after cursor, we must have a previous page.
03:19:09But if we're going backwards, we have a before cursor.
...20I'm kind of building the truth table in my head of which direction are we going? Are we on the first page or not?
...47Let's type it out. What are the situations here? We can be going
03:20:04so if we're going forward we have an after cursor next page is if selected 21 previous is true right if you're going forward if you're going backwards
...39We have a before cursor.
03:21:04Should this want to be or we have a before cursor.
...14And then this guy wants to say or around an after cursor. And there's more. Which I kind of want to shove all of this down into the has another page helper. Let me see if that's correct here. First page should not have a previous page link. Should have a next page link, so that ain't right. All right. Let's pass everything down.
03:22:17Have to pass. No, first page doesn't have one. All right. I'm just going to toss this so I don't keep adding it to sync until comment is in a stable place. So comment.
...56Trying to avoid selecting. Yeah, this is, it can't be the same helper, can it? Has to say has next or has previous.
03:23:27So this is just saying, are there 21?
...44Less has another page and more has an extra record, right?
03:24:13this one away for the first page because we don't have an after cursor that's what it is we're saying if not before cursor which is just the opposite of this that's not right either well i'm not getting this truth table
install patchy he said who said that problem is on the first page
arh68 so has_another_page? works like both ways? sry I'm not 100% up to speed
cursor is nil and it thinks it has another page so it has another page works like both ways sorry not of speed yeah if you look at it it's defined on the right here arh it's so we show 20 per page and
do that by selecting 20 per page plus one.
And if there are 21 comments, we know there will be a next page.
The hassle is when we're iterating forwards, we have an after cursor.
And if we have an after cursor, we know there must be a previous page.
If we have...
cursor we know there must be a following page and then the question is when we're going the other direction we have a before cursor we still end up loading 21 load them in a different direction
03:26:51I feel like I'm missing something obvious.
03:27:15Difference is the first page. So there are two directions on whether you're on the first page or not.
...55So if you're going forward, this will be nil. This is a dependent thing.
03:28:22The after cursor will be nil. And then have another is probably yes. Let's just say. And then when you're not on the first page, this will be a short ID. And then like maybe, if you're going backwards, On the first page, you don't have anything. Then you have a short ID. You have no after cursor. And so which links do you have? Yeah, that's not what I want to say. Have a previous.
03:29:30no yeah maybe yes yeah maybe on this one if you're going backwards the concept of first page is whether you're on the oldest so yeah no yeah yeah i think that's my truth table it looks I can't hear it no okay looks correct so what I'm trying to say is if there is a Whether or not you have an after cursor is a proxy for whether you're on the first page.
03:30:50And the before cursor is either true or false, or nil or short ID.
03:31:03Let's grab this for a second. Because then I can just stare at it and write the if off it.
...16So when you're going forward, we link to the next page.
...45So the question mark in my little truth table refers to has another page.
...58And the yes is just whether you already have the short ID.
03:32:33So saying this or has more. And this is after cursor or has more.
...58That gets me the the extra stuff so I guess the issue here is I can't I'm not differentiating between these two first cases yeah so when you're on the first page I don't know if you're going forwards or backwards because you don't have a cursor
03:33:40So I don't know which direction you want.
03:34:05So if you so I just have to pick one. No, they kind of both have to work.
...19This is not going to be a small amount of code. This is going to be a pain to test, especially once I make it iterate over different attributes like relevance in the search engine and then generalize it to story and comment. I'm talking myself into dropping this branch and installing pagi, which I think I did last time. When I say last time, I mean four years ago, the last time I looked at pagination.
...59Looking at this truth table with the way I can't tell the difference between these two scenarios, I'm curious to go look at the Hagi API. Actually, let's go look at Ruby Gems or Ruby Toolbox. What is it? Dash Toolbox.
03:35:46Yeah. Heard of all of these. The thing I would love to see is lines of code on this table, because I kind of want to pick the one with the fewest lines of code. And it looks like Kaminari hasn't been getting updated for a while. We will paginate at least has been this year. And pagi is much more recent. Let's compare them.
03:36:43Hmm. I don't know that I've heard of geared pagination or order query.
03:37:03I thought this was going to take me to their respective home pages.
...13to paginate active record sets at variable speeds. Okay.
...30That's not something I want. So the primary feature here is that you can define ratios to return 15 elements on page one, 30 on page two, 50 on page three, 100 on page four and so on. Oh, and is this officially CDHS's face? So yeah, this is probably a well-maintained gem. But I don't think I want that behavior. And then it defaults to cursor-based pagination, or to limit offset pagination.
03:38:17Yeah, so now they're doing the cursor and then if you pass the order. So I had said I had the before cursor and the after cursor and I thought that was equivalent to having a single cursor field and a direction. And the benefit of having a single cursor and a direction is that it would differentiate my two cases. That's my issue, is having a before cursor and an after cursor. I don't know which direction I'm going in the absence of either. So at the least, maybe that just says that my choice API is wrong there. So I want to back that code out. Well, I already know I don't want to use geared pagination because this idea of variable size pages is not at all something I want. And I don't, I mean, you can turn it off, but it sets headers. It's so odd. I'm distracted by this variable page size thing. I've never seen that before on pagination. And I can't quite imagine wanting that on a page. websites, I can turn it off. Particularly when using an infinite scrolling UI. Hmm. Well, we definitely don't do that.
03:40:25And I guess one other thing here is their sample code doesn't have any concept or it doesn't talk about it has next page it doesn't have previous page although that would probably just be passing the alternate cursor and swapping the direction from ascending to descending
03:41:09Yeah, that's fine-ish. Is there more documentation that talks about, no, this is just the Ruby doc version. If that's it for pagination, I can kind of see how I can get previous out of this. All right, order query.
...43so we have why do you call it keyset pagination yeah so this is the don't use offsets it's cursor style one of the reason i'm looking at these two gems even though they're much less popular is also they're probably smaller and fewer lines of code is less to go wrong i want just enough complexity i always wish the GitHub language graph included size.
03:42:21Each option specified is an array. Array values to order by. Sort direction.
...38We have scopes for order by.
...45has an object oriented API. That's kind of the direction I was headed because wrapping up this next previous step in an object is kind of obvious, exposed as previous and next.
03:43:14looping is enabled for next previous pass false disable okay now let's return to the only one record prayers with dynamic order columns
...41I like that they break out, here's what the query that's going to run under the hood is. Seems pretty reasonable.
03:44:06We'll paginate.
...14Per page limit. Render page lengths. That's. Right, how does that? It's doing limit offset. Ah. Now in maintenance mode will not receive new features. And then it just links me over there. Yeah. Okay. So this is exactly how we currently do pagination and not how we want to do pagination.
03:45:01Oh, pagi is best. That's promising. Does key set pagination.
...14And then it has a bunch of charts comparing it against two defunct gems. It's kind of funny. I would be proud of all of those results, too. But at this point, you won. Congrats. You can move on.
...40Limit size. How is this doing numbers? Because I don't want... You can't do numbers with cursor-based pagination. How am I misunderstanding this? When it said the... Let's go look at the how-to.
03:46:18i don't want to pass a i don't even want to list a page number reddit does maintain that it's just i don't think that really adds anything so does this have a whole two sets of pagination style where like On one, it'll do limit offset, and that's what all these docs are about. And on one, it'll do cursor-based or key set, by ID instead of offset. You can use an interesting approach discussed here. I don't want to be interesting. Oh, I don't want to do a quick hack either. Yeah. So this paginate by ID instead of offset. No, no, no. Paginate by date. No.
03:47:56Maximize performance.
03:48:04None of those. I'm very puzzled by pagi. Let me go back to the top of the README. The top of the README said it does key set pagination. And then all of the docs were not keyset pagination. Single and multiple ordered columns.
...38Offset pagination is what we don't want. Keyset is what we do. Uniquely ordered. We have that.
...54only useful when you don't need any front end that's not correct it's not that i don't need front end it's just that i am happy with it being next and previous you can only paginate from one to the next yes you don't know the previous and last page you only know first and next if you want to paginate you call reverse order on your set
03:49:33I'm going to step away for a second to use the restroom. I will be back in just a minute. Let's jump over here and edit this.
...51And then I'm going to see if Paddy wants to work or I want to switch over to this order query.
03:51:23So thinking about it, I see a lot of mentions of JavaScript and style sheet, which means Pagi is going to be tied into the asset pipeline, which is the thing I fight a lot.
...50And since I fight a lot, Even if Pagi wants to do keyset pagination, the fact that it's not their central focus and they're going to have all of this extra stuff I don't use for offset pagination, especially if it's fairly heavy. I don't know it's sort of like yeah if i'm going to the grocery store could tow a trailer behind my car and just pile it up with bricks but or I could just leave it home.
03:52:40arh68 scene? what all are we talking about, again
there's almost too many options here.
...54arh68 brb laundry
geared doesn't, I think I'd be right back into this issue of created at desk.
So then I would have to say, am I
So it's if pages last, no more pages, otherwise link to the next page.
But if I'm going the other direction, I can't link to the previous page with this.
Not really.
Well, linking to the previous page just says
If there's anything, search for it with the cursor set to the first item and the direction set the opposite of what I have.
Yeah, I'm getting myself confused between previous and next and earlier and later.
So the question is, if you're swapping direction, next and previous swap with later and earlier, if that makes sense.
03:54:44How does this order query implement next and previous?
Trying to figure out if it lines up with the way I'm thinking about pagination.
frici are you supposed to still be in the brb scene? π€
So there's a seek.
Finds a scope.
All right.
Oh, no, Richie, thank you.
I meant to switch out of the period vaccine and I forgot clearly.
Thank you.
Yeah, I had that whole hassle the other stream with the microphone being on and off.
And I figured out that OBS has like pass by reference or pass by value for sharing sources like a microphone between scenes.
So that's why I was constantly muting and unmuting as I switched scenes.
where mentally I was thinking of it as the same microphone with one control, it was thinking of it as multiple, because I had done its pass-by value thing when I was setting up the scenes.
03:56:16So the one thing I want to know here is if it's going to let me have next pages and previous page links, and it wasn't in their example.
...41So there's scope, there's scope reverse.
03:57:10it's funny how these different gems put their idea of complexity or what they care about is where their complexity is and in this case it's sorting by multiple columns and that's almost not at all interesting to me i think of it as sorting by a scope and i want to encapsulate that there although i understand why they have to break that apart
...42All right.
As riveting as watching Peter Reed docs must be, I'm running up to about four hours, which is kind of the longest I want to run a stream.
And I think I'm going to call it.
If you have any more questions about why pagination is working this way or
the outage we had yesterday, or not putting clickbait titles on new stories, feel free to speak up.
But otherwise, I think I'm gonna wind up this stream.
Yeah, not seeing any questions in chat.
So I'm gonna go ahead and call it.
Thank you all for...
I guess I'm gonna have to spend some time
kicking the tires on these.
I'm not sure if that's interesting enough to be worth streaming.
And Pagi, this extra stuff of JavaScript and front end integration, like I want to do the front end and just leave it alone.
arh68 Until Next Time ! PopGhost
frici That makes sense, thanks for the stream pushcx! and for answering questions and stuff.
Yeah.
So I'm going to play with these and experiment offline a little bit more.
frici Till next time π
And honestly, maybe pagination is well contained enough that
I play with one of these and it immediately falls out into a working solution.
Yeah, ARH4G, thank you for hanging out with me.
And of course, everybody who was here earlier, like Hedgie and Hunter.
Take care, folks.
I'll see you on next Monday.