It's like the Spanish Inquisition, but nice
Streamed
Fixed JavaScript debugging by adding exports to make functions accessible from the console with help from SUBH3ADER. Merged Chamblisβs PRs including CSS grid improvements for the lobster emoji. Discussed our Ansible to Hatchbox migration plan to simplify deployment. Explored SQLite as a potential database replacement for MariaDB, weighing pros and cons. Started work on headlines and story merging with type IDs to avoid collisions. Considered error monitoring options like Telebugs for better exception tracking.
scratch
topics
console.log(this) for importmap?
banned reason size https://github.com/lobsters/lobsters/pull/1574
ansible -> hatchbox plan
modlog link to DM or profile? https://github.com/lobsters/lobsters/issues/1572
lobster emoji https://github.com/lobsters/lobsters/pull/1575
headlines; story merging #1456
title
it's like the spanish inquisition, but nice
post-stream
new vpi:
SUBH3ADER
Transcripts are generated with whisperx, so they mistranscribe basically every username and technical term. They're OK but not great, advice appreciated.
Recording
01:50I do office hours where folks can drop in anytime to ask questions about the site, the code base, the moderation, the community, Spaceballs, the flamethrower, Spaceballs, the lunchbox. I think of that every single time I do this intro. So let's throw the message in chat.
02:19pushcx Feel free to ask questions anytime, even if I'm deep in code!
there we go and then let's see train of thought all right so there are some pull requests and this one is fixing up but this one is real easy let's get back to a green build actually so i bumped the size of the
And reason size.
So it's nice to have a green build and I didn't notice that I broke it.
I can imagine what this test is.
Yep.
03:17Channels has made a whole bunch of PRs recently. Really great. So let's just go ahead and drop that on top.
...36Do I have a... Oh, I do have a commit. All right. Too bad for causality. I hacked something out yesterday. That's fine. Nothing exciting. There was, before I go on to the other pull requests, I don't think there were any bugs. Feature request?
04:09Yeah, that's, so she's talking about on the mod log here where you can see the things that people have done. These link to messages. I don't know who Puerco Pop is.
...45You know, if you click... I have to do localhost because they're not logged in. Actually, I don't think the... See, I'm wondering if the messages interface will have a nice click back to their profile. So if we go back down here... I can't do myself, can I? Well, I can look at the, so let's say, messages, yeah, it's just gonna, all right, so messages two equals, let's do Hunter, because I saw him over on the other page. Yeah, that just pre-fills the form. There's no way back to their profile.
06:23I wonder if that's worth... ...breaking.
07:23I'm deliberately not tagging good first issue because it's a changing and breaking UI for people who are used to it.
...39Typing off stream, so just copying that down. These two are probably both going to have green builds now. So let's bounce those builds. And while I'm doing it, I can try the JavaScript thing I wanted to try. Where's my? Do I have to? Yeah. I have to click in to try again.
08:40We had... I had worked on the JavaScript a while ago and I had been annoyed because... And I wanted to come back to it because I had a thought. Not that. So we switched over to using the new Rails import map setup
09:12And I had a hassle that it's great that it packaged it all up into a JS module. Gives you a little bit of compartmentalization away from your dependencies, but
...50But then you can't debug the darn thing. Yeah, so can I import from it?
10:12Maybe because I figured either, either it's the, I can import it or I can add a log self. So let's take a look. So in here, let's see if I can look at the, see the existence of the window on the on page load. Yeah. See, it's not defined. Can I? Yeah, see, import isn't going to work at all, period. What if I say... Alright, it's not self. Changing gear, because I usually write Ruby. It's self and Lua, too, which is the other thing I've been writing. How is this undefined? Hmm.
11:50How do you get access to it? Because the one thing I want is being able to poke around and actually call stuff off of the console for debugging. And we don't change the JavaScript much, but I have to be able to call.
12:32Yeah, and this export of repeat all the names of all of your items is not great, especially if I can't do an import in the console.
13:21SUBH3ADER You can use a dynamic import to import in the console.
SUBH3ADER await import('./someModule.js')
Oh, hey, subheader.
Welcome.
That sounds like the thing I don't know how to do.
Wait.
Okay.
So wait, what was it?
...48Helps if I spell things right, huh?
Ooh, I actually got something there.
What is that?
Is that the application object?
ToStringModule, okay.
So if I said boo, let's call it app.
Let's at least give it a name, right?
So if I look at app.onPageLoad, no, I don't see my function.
So what did I get back?
some kind of...
SUBH3ADER It expect an actual file path or if you're using import maps, then you could do import('application')
I don't know what it's supposed to do with this module though.
14:52I did do import application here and well here. So this on the top is my application JS and on the bottom is the rails import map config. And I just want to be able to call the methods that are in here. because that's how I think about debugging.
15:49SUBH3ADER If rails is serving application.js from localhost:3000, you would use `await import('/application.js')`
Yeah, I was just thinking of that.
...57So here's the tag up in the head. So it's calling it assets slash application with some hash. I think in dev mode, I can refer to it without the hash. Let's find out. Nope.
16:32Let's see if I can get it with the hash.
...52Nope.
17:01SUBH3ADER You can also check the network tab to see where files are being loaded from
So worth trying, but that doesn't seem to work.
Check the Network tab.
...17Two hashes.
Probably the second one is, oh, I wonder if it's because I just, yeah, see, here's another hash even, because I just saved the file.
over in vim it got another hash which is why this whole how to type the hash thing is going to be pretty unsustainable real quick so let's see if it wants to work though well at least i got an object that's just
It's that same, it's not an error, but I can't actually see anything in it.
SUBH3ADER Have you exported anything from application.js?
So it doesn't have any properties.
18:16Yeah.
...25No, I was just saying, so I did just see exporting mentioned here
...35SUBH3ADER For example: export const foo = 'bar';
that requires a whole bunch of i mean it looks like a transpilation step or a some kind of compilation stuff because requires naming all of your functions again which is tedious all right so what i have to
19:26SUBH3ADER Const declarations can't be redeclared
In which case, let's see if I can just call application, because that one didn't error, right?
No.
See, there we go.
That didn't error.
Yes, it did, I guess.
...54It is maybe worth mentioning here for context that I am a very old JavaScript programmer, so For style issues, I'm going to write like 2008 era JavaScript.
20:17Yeah, what the fuck is this example doing? Is it export? Oh, okay. So it's... It's exporting two things. I thought this was... It's saying we are exporting something under the name square. I didn't realize it was not a multi-line kind of thing. All right. I was thinking of it more like a decorator. So if I insert the exports, nah, that's not what I want. I want these two to play with.
...58Okay, so if I... That at least gets me debug-ability. Okay. So now I just need to...
21:18It is.
...26SUBH3ADER You're welcome
Well, thanks for your help.
I would not have gotten that.
...34Why is this function not const? I don't have a good reason for that. Because it sure doesn't get redefined. So then at least you don't have to... The thing I was concerned about was having to repeat all of these names and keep those in sync because I don't know how that goes. But if it is just Making it look more like Java in the method signature. That's survivable.
22:13And then see if I can do that.
Because that's the big one, lobsters function.
Unexpected keyword const.
You've got to be mad about this one, right?
Line 8.
SUBH3ADER typo "exoprt"
No, it's line 18, column 8.
...36Oh, because it says function on instead of... Oh. No, you're right there. Good catch. That's...
...54So when you catch bugs and fix things for me, you become a VIP of the channel. So thank you, subheader. Oh, let me put that in my scratch, because that's been a second.
23:13So this one wants to be on the equals.
...30All right.
So if I do this, okay.
Let's say app dot on.
Yeah.
All right.
Then app dot lobsters function.
And I get the class.
Great.
All right.
Let's see if there are any other exports I have to add.
Otherwise, otherwise I'm pretty much there.
Yeah.
So these are all the site specific things that call those functions.
probably don't need to be in a class but that's just how it ended up when we moved away from jQuery not hurting anything yeah if I can say yeah then I can still call those methods that's fine then these are the page setups so there's nothing here to export
jangomandalorian Hey @pushcx , hey chat!
because this is just the plumbing.
Some of these have a little complexity to them, but I couldn't debug them anyways.
And if I want to debug them, I'll move it into a named function.
Hey Django, welcome back.
You know, to your name, I just started a couple of days ago watching that show Andor.
It was pretty cute.
I watched most of the first season.
It's got a couple of bits where the writing is really clever.
And man, the set design is incredible.
Didn't know they were allowed to make good Star Wars.
25:18Yeah, it's great. Because most of what I do with these is when I'm debugging them, I tend to log stuff out of them and then I want to be able to rerun the functions they call So that's enough. Oh, man, that's great. That's my debugging story sorted. I've had kind of a low-grade annoyance that I haven't been able to debug the JavaScript. Even though I haven't needed to, just knowing that I didn't have a way to do it was really annoying. These are ignorable. I know what the wall is. I don't know. SHM.
26:06Let's go and let's make that another commit.
...16Console, that's so great. And then the gitignore.
...48All right. Great to have that. So, yeah. I'm just going to keep tapping away at the site. There's those couple more pull requests, but if folks have any questions about the site, you can pipe up at any time. Let's see. Where are we? 29. I have a little visual timer that I try and set so that I remember to stretch and such. Oh. Oh, the build failed because These PRs haven't been rebased. Yeah. All right. That's fine. Not, you know, great. Fine. But I understand what I'm seeing. So let's take a look at these two. And then fix the sort. Oh, some talking here. That must be. Maybe that shameless is mentioned. Yeah. Oh, she wrote a whole to-do list like I asked. That's wonderful.
28:08Yeah, that's basically everything.
29:23kazaii626 hello king of the lobsters & honoured chatters
So as long as we're talking CSS grid, I'll go ahead and do this one.
I think of myself more as the host of the lobsters or the janitor of the lobsters.
Sometimes the gardener of the lobsters.
King is not a good look.
...52gtfrvz zoidberg
kazaii626 BJFL. Benevolent Janitor For Life.
I got lectured on politics by somebody a couple of weeks ago, and I was like, buddy, I don't take political advice from people who have a king.
I didn't actually say that.
I was nicer than that.
But it was a little silly.
There you go.
That's a great abbreviation.
Yeah.
I could get like a Burger King crown.
One of their little cardboard crowns.
And I'll write that in on Sharpie.
Because that's the level of code maturity.
And you know...
humor maturity I aim for.
Oh, this must be why Chambliss noticed that thing in the mod log is she's working through forms and tables.
All right.
I do
Yeah, I really like the gardening metaphor for maintaining software projects.
It feels, especially once you can get some open source contributors, the idea of, you know, what I do is kind of prune things and nudge them together and rake and clean up and let them grow under their own schedule.
Yeah.
31:23pretty good at fertilizing the code base.
kazaii626 that's nice. I still mostly work alone when I'm coding. Trying to break that habit & explore open source & team work this year.
Alright, so you know, if you are looking for teamwork, the lobsters code base has lots of things you can do, you can come help whitewash this fence, it's pretty great.
...57pushcx https://github.com/lobsters/lob…
What are you coding?
And just in case, you know, you're about to say Rails or at least web stuff, lots of stuff is tagged good first issue.
32:32kazaii626 pretty much 100% Python. But I'm learning a lot of web stuff this year, as I'm hanging out with a lot of Django devs. I could give some rails a go, though :)
kazaii626 I'm working on Network Automation in my $dayjob
Oh, you really could.
Python and Ruby are very, very close neighbors in terms of style, especially now that they both have immutable strings.
It's been a while since I've done non-trivial Python, but the only differences that come to mind are Ruby doesn't have decorators.
And Ruby has a lot more introspection, reflection, metaprogramming kind of tools.
And it's normal in style to do some of that.
Where Python does have some of that, but if you use it, people will be like, whoa, don't do that.
And in Ruby, there's a little bit of YOLO.
33:30kazaii626 Hmm, noted.
Well, it's good that you get to do your network automation automation in Python rather than say bash.
...50kazaii626 yeah, I only use Bash when I'm gluing things together here and there.
If you get curious, yeah, I try and only use bash for that.
And I've shifted more and more to using.
Ruby for local scripting for a while it was.
A little bit of a pain to have multiple versions of Ruby installed and now the there's a tool called rbn that's just utterly bulletproof i'm really happy with it oh actually wasn't there a. bump to Ruby.
344 and what are we running.
They usually follow these pretty closely alright so.
Did the Ruby build a package update?
34:41It's not an R. So this 5.11 doesn't show me the tools version of it. I have 16.
35:07I just don't want to...
Nogweii hello pushcx and chat, it's been a while! sunsYo
I had a minute where I updated Ruby so eagerly that there was not yet a Arch package for it.
And I don't want to do that to myself again.
kazaii626 like I've made a interactive shell environment, that allows Network Engineers to run functions in a comfortable DSL similar to a Cisco system.... they ssh into a linux user and I use messy bash .profile to launch them into the environment, and log them out when they kill the session. I could write that in Python directly, I suppose, but it was nice to get it going quickly in Bash
How do I tell?
...29Let's see if we see... 3.4. Yes. So this hasn't yet happened. Okay.
36:19Nogweii are the production servers Arch?
kazaii626 @Nogweii DinoDance
Human interactive shell that allows network engineers to run functions in a comfortable DSL similar to a Cisco system.
Okay, I've never seen that.
I know they have some kind of DSL.
The SSH into a Linux user and I use a messy bash profile.
All right, yes, it's a production hack to launch them into the environment and log them out when they kill the session.
You could write that in Python directly, but it was nice to get it going quickly in bash.
The Nogway, the production server is
kazaii626 basically they want to use tab complete , `?` to find out what could be next in the command model.... they want to SSH into something, like a network system. So I'm giving them that experience. `show bgp neighbors device {{ device }} `
ubuntu lts actually as long as we're talking prod i've been kicking it around a bit with with 355 e3b hunter i'm gonna say hunter because it's just easier but we maintain lobsters with an ansible script
that was written by a departed sysadmin.
And we are coming up on like five years that I've been maintaining this myself.
And I don't really know Ansible and I definitely don't like Ansible and the seams are showing on this guy.
I've kept it duct taped together, but it's going to blow up at some point.
kazaii626 Yeah, I'm not a big fan of Ansible :\ it's also popular in network automation
Nogweii I love me some Ansible, what help do you feel you need?
You know, I can just feel that kind of, there's a couple of weird things that creep in and it's always so dang slow.
jangomandalorian If you need help with ansible I can give you a helping hand. Devops/Sysadmin/Platform engineer over here
So you want to use tab complete.
Oh, that's very nice, Kezu.
Sounds like you've made a fun system.
So Nogwe, we're actually running on an outdated version of Ansible.
kazaii626 sweet! ask and you shall receive help :D
And so the thing, the big pain points with Ansible are
that I don't know it.
And so I have just kind of made kept this working by shoving stuff in here.
chamlis_ hey folks. long time no see nogweii!
So like, we use let's encrypt for our SSL cert, I am sure there is some proper way to depend on the cert bot module.
I don't know, I couldn't find the docs.
So I just grabbed it and shoved it into a directory here, and then kicked things until it started working.
So
Nogweii @chamlis_ yo! how it's going?
The way Certbot, for instance, is installed, oh yeah, and you can see me doing some kind of hot patch to that.
I don't know why I had to do that anymore.
So basically, Hatchbox is, for 10 bucks a month, you get this guy, I think his name is Chris Oliver, and he has a co-founder whose name I don't recall.
chamlis_ pretty good, thanks. you?
or a co-owner maybe, they have a nice GUI on top of some kind of script that does the exact same thing our Ansible script does, except it doesn't take 10 minutes to do a deploy and it actually works.
And for 10 bucks a month, someone is paid to keep it up to date.
And since we have not been drowning in Ansible expertise,
I don't like having a dependency on something I can't maintain because Ansible is a big project to learn, but it's also,
way overkill for our setup of we have one or two VPSs.
Nogweii hiding from work, but it's nice to have a job. :P So doing well
And we rev those dependencies fairly slowly, except for our actual app, which we want to be able to deploy a couple of times a week.
So I hope that explains what's going on with Ansible Hatchbox.
So right now, Hunter and I are planning to do that.
Well, I was going to do it on Saturday, Sunday, but DigitalOcean changed a policy in a way I thought would mess things up for us.
So I had to contact support and go a couple of rounds with them.
pushcx https://hatchbox.io/
So we are going to take a shot at this on Saturday morning.
Nogweii @pushcx yeah, makes sense. is this decision finalized? probably doesn't make sense to invest a bunch into the ansible code if it's definitely going away
Yeah, I'll share the link here.
I usually try and share these links.
41:05Yeah, Nagwe, it's...
...15It's kind of an odd situation because Ansible has not been broken broken seriously in the last two years, but my trust of it is fading out because I'm not able to competently maintain our Ansible code base. And while I appreciate you talking about contributing, I'm at the point where I'll have a lot of certainty if I pay this guy 10 bucks or 20 bucks a month.
42:01kazaii626 yeah, I think you've got a solid point
And every time, like the Ansible code base is in a state where every time we touch it, something weird happens.
And I have tried to keep it in working order, but it's also such an imperative tool.
that i don't have a lot of trust that it can correctly set up a new server and that's its whole job because we haven't exercised that because we have two vps's not you know 20 to 200 based on load and we
rotate them all of the time and cattle not pets, right?
Like we're not using Ansible in the way it's intended to be used.
And so it's really not a good fit for our needs.
On top of it is a programming language written in YAML.
It is an imperative programming language written in YAML.
kazaii626 Not a fan of it's DSL.
Nogweii does Hatchbox handle some of the more core, base system settings? Things like networking, hostname, users, etc. Or is that base administration something you're comfortable with?
And I understand how they ended up at that point, but it means that it doesn't really have very good tooling around it.
And
Nogweii Yeah, Ansible is a giant pile of YAML, not great.
veqqio What can you replace it with?
i don't know so i guess to your question of is the decision final is in fact it's this thing hatchbox that i just linked in the chat a couple of lines up which is does the exact same thing and is
a script that's written by a couple of longtime Ruby guys.
I want to say this has been running for six years, more than six years at this point.
Yeah.
44:08The biggest things I don't like is moving from nginx to caddy means I have to redo a bunch of integration kind of stuff, log tweaking, tracing, that kind of thing. That's not so bad. That's a one time.
...34If it goes away, I'm kind of starting from scratch. redeploy things but the fact that it's a commercial service run by a couple of people who didn't take any vc money means it's unlikely to suddenly blow up on me this kind of a couple of geeks bootstrapped something style business has very very familiar low failure modes like the bus count is two but that's okay
45:16So that's kind of what I'm thinking.
And if folks, if there is some other option for deploying a Rails app and keeping it running in production, I am happy to take ideas there.
Nogweii heh, they already have 3.4.4 available :)
I did a survey before settling on Hatchbox and
For our scale, the other big contender is Kamal 2, and it just isn't... Yeah, they're really fast on these kind of things, which I like seeing.
Kamal 2, I can't find people who are talking about running it in production, and the people who have...
run it in production have said politely that it's just not quite mature enough and they're finding very rough issues it's a hugely complicated problem to take on and i would rather not add docker to prod it has the attraction of making it easier to set up dev environments i'm being brought around on that but yeah
other stuff like ansible puppet these other deployment tools they are intended as as huge things we're kind of in a weird spot where like toy things i think capistrano is even still around and that's fine for teensy but we're a little bigger than teensy we do have some customization needs like
47:07A bunch of admin and moderator tasks are still only able to be done by logging into the prod server.
Nogweii cap! boy, didn't enjoy some of the monstrosities that resulted in.
And that's things like checking logs, running database queries, manually running code in the console.
If we lost that, it would probably be 50 plus hours of dev time to reimplement that stuff as web UI, which is not unbearable, but
I don't have a spare 50 hours laying around.
And logs are a big one for anything that looks like a platform as a service.
Like, yeah, I also cut my teeth on Capistrano back in the day.
So there's these platform as a service like Heroku, Render.
gtfrvz im personally very happy with nixos but i have never deployed a ruby app and i wouldnt volunteer to port lobsters KappaHD
I know there are more.
I just can't bring them to mind.
The big hassle with all of them is they throw your logs away.
twitchtd capistrano wasn't bad when things worked :)
They keep logs for about a week, and then they're like, go use this commercial service.
And the commercial service understands what the business value of those logs is, and they charge business prices.
Yeah, the failure modes on these things are rough.
48:25Yeah, there's Nix and Irene, the moderator, is involved in Lix, L-I-X, but...
I don't know that it's really targeted at running apps that are written in dynamic languages.
Every 18 months or so, I looked at Nix for, has anyone successfully packaged a Rails app?
gtfrvz well i do run python and rust stuff
And occasionally I would see somebody had packaged Hello World.
And then if I looked at it, it didn't actually run.
gtfrvz and haskell
I don't want to be the trailblazer on that.
And I really did not get along with the Nix docs.
Cool.
Yeah.
veqqio nix made me burn out a few weeks ago, trying to package stuff to run with it :(
gtfrvz but you have to invest time in it
I think the other requirement I'm kind of talking around that comes up with both Ansible and something like Nix or even some other deployment system is most of them, yeah, you just got there before I did, have to invent time in it or invest time in it.
They are big, complicated systems to learn.
And I don't want to learn them.
49:47SUBH3ADER Have you looked into kamal?
Oh, yeah.
pushcx https://push.cx/nixos
I don't know.
I wrote a... Have I ever shown it on stream?
Yeah.
Frici (Greetings) I like the idea of Nix but last i looked at it is that it really lacks direction tech wise and documentation/community wise ...it's not the great either ... which while technologically good... is scary for prod
I guess I have somewhere along the way.
I bounced off of the next docs.
Subheader, you must have
Nogweii @Frici sunsYo
Frici Hey @Nogweii ! long time no see π
tuned out for a second yeah I've looked at Kamal too and the experience reports I've seen have said that it it's not ready for production so I don't want to be a trailblazer on that one it is promising but I need to see someone else run it in prod for a year before I want to run it in prod honestly
SUBH3ADER makes sense
And I want them to say it was a very boring year, not a very exciting year where they contributed a bunch back to the codebase.
I want boring.
51:24gtfrvz it's nice, i can build my rust project on my beefy home server and deploy it on my VPS in one command
You know that explains so if this one says 516 testing a bit.
slash 3.4 point.
yeah Okay, so the one that's in testing will come along.
shortly.
52:04Mm, JT, it sounds like you're living the dream.
...12twitchtd all infra tooling has major tradeoffs, never seen anything come close to a silver bullet in that space
Nogweii @pushcx random aside, how's the new issue UI treating you?
I think I would like Nix a lot more if they hadn't written their own programming language.
gtfrvz guix it is then
I still think that was an early wrong decision where, honestly, they could have written it in JavaScript.
Not that JavaScript would have been a wonderful language, especially at the time that they were writing, but it would have been so much nicer.
kazaii626 Yeah, I feel that's a big barrier for me as well. Someone in my LUG was trying to convince me on guix
Geeks I looked at, but they don't have their documentation sorted out, and they have that weird hang-up with...
kazaii626 I'm fine with my Arch environment.
I thought lots of software was just not packaged, but instead it's off in a...
veqqio that's hilarious
unfree repo it's not commercial software but anything that doesn't have a free software foundation license they show off in another repo and then also you get banned if you talk about that repo so if you want things like wi-fi to work and you ask or you say oh i figured it out you were going to get booted from the community i just don't want to deal with that scheme is a fine language it's kind of an odd choice but like anything is better than
invent your own language for your own project.
So...
I don't know.
Folks see a lot of things to it.
Clearly.
Because they're both large and viable projects.
It's just I've bounced off of that kind of thing.
Projects that invent their own programming languages.
projects that have very strong opinions on things that i don't care about and find myself confused by like i tried to install i actually set up geeks on a like a spare laptop and then i was like okay well let me see if i can install specific browser versions so that i can test with them but so that's the thing i do as a web developer and so i got two versions of firefox installed and i was like okay this is pretty cool i'm living the dream
And then I tried to install Chrome or Chromium or any fork of Chrome, and it was just not there.
And then, oh, also, it's not just that you can't talk about the repo.
There was also an undocumented config setting you had to toggle to use the repo.
I don't remember what it was named.
I'm getting vague on the particulars because it's been three or four years.
But there was some kind of...
like use unfree it was mildly derogatory like permit non-free software boolean something like that channels please don't let me nerd snipe you on this one this is not interesting and i know it's your sort of jam to figure out what the hell i'm talking about when i can only half remember stuff so please don't not a good time use your time yeah
I've been very happy with Arch the last, what, six or seven years?
Something like that.
It's got packages.
They're recent.
Things all work together.
The wiki is just excellent for documentation.
It is occasionally a little bit dry where... Oh, Chanless is coding.
kazaii626 I love Arch. I've been using it for ~ 10 years now. But I'm not as much of a programmer as you guys are.
Just force pushed.
Was this a draft PR, Chamlus, if you're here?
I didn't, no, it's not.
55:59chamlis_ no, sorry, I saw a typo on screen
Yeah, so I started, I think I just said this on the last stream of the one before.
Oh, you saw a typo, cool.
Nogweii @chamlis_ the horror! LUL
I started with Slackware, which was one of those, you do everything yourself.
And so I learned a ton, which was great, because I had a ton of free time as a teenager.
kazaii626 Yeah, we did talk about this last time :D For me it was Debian -> Ubuntu -> Arch
then i used ubuntu and then eventually i was like boy i'm not learning how anything works and enough stuff got replaced that i don't understand these subsystems like systemd came along and i had you know nothing to force me to learn it and so it's sort of nice that it just worked but i want to actually understand how that works and so i looked at other distros including nix yeah and then i was just like well i'm always in the arch wiki for docs anyways
Oh, yeah.
Someone was saying that they had trouble with Nix of learning the package stuff.
And in my blog post that I linked a few lines up, I submitted a bug report to Nix that the very first example of writing a package in the manual was not valid syntax because it was like, you fill in foo, dot, dot, dot.
And it was like,
but I can't fill in dot, dot, dot, because this is Hello World.
twitchtd hot take: nix lang was a mistake
This is literally the first example of packaging something, and you don't even have a complete example.
gtfrvz skill issue KappaHD
And it just sort of assumed that you already knew how to put files in folders, and yeah.
TD, that's my take on Nix, one of my takes on Nix.
And I think the non-obvious reason it was a mistake is not...
just that the Nix language is not particularly clear, it's that it's an enormous time sink for basically no benefit.
Because they're not actually doing anything you can't do in any other language.
Like once you get that code is data and data is code from having used Lisp or Scheme,
You don't need lazy evaluation to avoid evaluating things.
58:23Nice to get rid of these little divs with styling in them. Good catch. All right.
59:06chamlis_ I zone in on any floats and clears for sure
Yeah.
chamlis_ it should be
So Channels, do you think this is good to go?
Because it looks right to me.
And I have a cool.
Then I'm going to hit it.
Is it one commit or two?
I think it's just one, right?
Then I'm just going to rebase it on.
...56So let's see, what's next? One more pull request from Cham. Thanks for fixing the build, by the way, Chama. Sorry I let that slip in.
01:00:12chamlis_ no worries
Oh yeah, this one...
...21The aesthetic center of the lobster emoji.
You would not...
So there's a bunch of tinkering I've had to do with this one, and then...
I know it's come up on stream before.
pushcx https://en.wikipedia.org/wiki/C…
I wear glasses, so I especially see this effect, where if I keep my eyes fixed on the middle of this image and turn my head left to right, I definitely see the letters moving left and right, which is weird and annoying, but it also means, like,
here i see a milder version on this strong red where if i move my head left and right they shift left and right so how the hell do i center something when looking at it makes it move the answer previously was i put a css grid line down it and then i made sure it was exactly in the center of my vision and then it probably was wrong anyways oh well that's a hell of a lot nicer
Could you use arbitrary emoji in a list style?
Is that a recent addition and I just missed it?
chamlis_ any string I think
What was it?
List style.
Nogweii possibly misaligns in different browsers
Any string.
Yeah, that's news to me.
That is...
I mean, I want to merge that just because it's less code.
Possibly misaligns it in different browsers.
We'll take a look.
chamlis_ firefox
Chambliss, which browser did you take a screenshot in?
I don't remember what you run.
01:02:18Firefox, OK.
...44chamlis_ I have chrome here as well if needed
Okay.
Yeah.
So this is an addition.
When did this get formalized?
That date is impossible.
There must be, that must be like they fixed a typo recently.
Okay, here we go.
Albynton Hello!
No, other than a work in progress.
How is this a work in progress?
Browsers are already supporting it.
We're doing a, the finished standard is called an RFC thing.
Nogweii finished standards don't exist in the web :P
Looks like everybody's supported.
Wow.
But it doesn't say, what is lau?
chamlis_ it is on the compat table for list-style-type under <string>
Disc tie.
Oh, OK.
So it's a language specific.
Is there just a generic text?
chamlis_ https://developer.mozilla.org/e…
String?
I don't see string.
01:04:182015. Oh, it's been supported for a hot minute. Okay, well let me... I don't actually have a Chromium that's good to show on stream.
...47All right, well, I think this is enough of a simplification that I'm happy to take it and catch a bug if somebody sees it misaligned in their browser. Yeah, this styling actually came out of my personal blog. I hang an icon in the corner for favorite Meteor reviews. And it was always such a pain to get right.
01:05:34Merge anyways. Great.
...43Hold that down.
...51Get that deploy running. There's going to be a prod outage for that deploy. For anybody who doesn't know, that's not this bug.
01:06:06pushcx https://github.com/rails/solid_…
Here we go.
This bug caught it in production.
And then I guess four days ago, I don't remember if I opened this on stream or what.
someone i don't recognize the username they don't seem to be a contributor to the repo gave it a thumbs up which from context means i'm guessing thanks for the report rather than or i have this bug rather than you know hey it's great it crashes but it does mean that every time i deploy the site we take 60 seconds of downtime i did
contact Hatchbox to ask like, what is your deploy story?
And they do something smarter than we have done.
So their downtimes are apparently zero downtime, where rather than used phased restarts, which say we have 10 workers, it shifts, it has one of them restart, wait for that to come up, then does the next, the next, the next.
So you're kind of running two at once.
Hatchbox just guns all of them and then has some configuration that I never saw before so that SystemD holds the socket open, like SystemD is actually listening to the socket and then handing it off to Puma when Puma is running.
Nogweii systemd socket activation with puma! love it.
So everything stalls for 30 to 60 seconds, which is not as nice as phased restarts, but I'll take it.
Oh, look, my phone just buzzed that Lobsters is down.
What was I just talking about?
01:07:57Yeah.
veqqio haha, amazing timing puma
kazaii626 just a little 502
Yeah, there's a let me see if I can find the link real quick.
pushcx https://puma.io/puma/file.syste…
So get active because I had it.
Here we go.
No way.
There you go.
So I saw that documentation and I was just like, wow, I never...
Nogweii but that's an investment in time/knowledge that you need to put in, and having someone do that for you is very nice
I thought I had read all of the Puma docs and the fact that I never saw this is like, boy, it really, really needs to be somebody else's job to handle all of these ops things for lobsters because I'm not holding down the fort on them.
Yeah.
01:08:46And it's so funny because I've read so much of the Puma docs, and I've been all over the phased restart stuff. I don't know how I missed this. But again, also, I was running Ubuntu at the time systemd came out, so I didn't learn much about writing systemd services until, I don't know, a couple years ago.
01:09:19Having worked in a big code base, I think a lot more about how a big function of the code base needs to be teaching people to maintain the code base internally. Nice. Not just does it supposedly do what it's supposed to do for its feature list. So that's part of why I like things like simplifying every line of CSS, as Jamless just did here. because the less of that there is, if someone comes along and looks at this code, that's five minutes less that they spend looking at it. And it's using more standard CSS and HTML features instead of clever hacks.
01:10:21All right.
Just peeking real quick.
All right, so we've been going for...
pushcx This is Lobsters office hours, feel free to ask questions anytime!
twitchtd the previous talk about ansible + ways to deploy rails makes me think there is a lot of room yet for managing and deploying infra
hour 10 so i will do my usual bumper that this is mobster's office hours feel free to ask questions anytime all right cool so got that working
Oh, yeah, Chamlus, I think you tuned in after it, but subheader here showed me how to actually be able to access our different JavaScript functions from the console, which was a thing that was kind of broken for a while.
Where was the other one?
Well, I could just poke around in the app object and you can see all the
Nogweii @twitchtd oh yeah the industry is still a giant pile of crap
twitchtd hah, succinct way of putting it
functions so now it is going to be easy to debug things because i can say things like i just call them yeah yeah td the one that i think a lot about is wordpress one of the reasons i think that wordpress runs something like half the web is
It has very low overhead for sites that aren't active.
And it's not just CPU and RAM because it doesn't have independent processes.
You set it up for one site and then you can enable, I mean, as many small hosting sites as you have disk space for.
Disk is very cheap now, but you can shove.
10,000 little shared hosting blogs on one VPS with WordPress.
And even though PHP is not my favorite programming language and WordPress is not my favorite content management system, and I have used both professionally in depth, although it's been 10 plus years, 15 plus years for either, they kind of have taken over the world in a way because they get
the infrastructure story so very right.
Nogweii PHP's type system is my favorite so far of all of the dynamic langugages
That's relevant to my interests.
Put that over here for my later reading.
01:13:09I didn't know PHP had a whole type system now. Copy link.
...35veqqio php really is quite cozy and powerful now, from a lisp junky. it's so nice to dump it in any random cheap vps and boom
veqqio but i also like tcl now so
pushcx https://github.com/pushcx/typei…
wow that's quite an endorsement that if someone from lisp finds it a comfortable language that's pretty great so i was just i don't think you're on the last stream but oh i guess i didn't show it on stream maybe i did it after the stream i just wrote
Nogweii it's runtime enforced which is great IMO
chamlis_ I've really liked using phpstan too, makes it relatively smooth to start using types
my first non-trivial bit of lua like i have used lua to tweak stuff in game config or to update my awesome wm config and so here i actually wrote i don't know call it 200 lines of lua something like that it's nice the
veqqio have you explored fennel? it adds some guard rails to lua, it's a bit elegant
gtfrvz i think you have written more lua than me then, even though i have written a lua compiler KEKW
arrays starting at one is very strange to me especially because i was porting code that used a lookup table but i found a workaround for that so all of that is good and the i'm not super comfortable with the like when do you want to do kind of an o style versus use primitives you know i don't know the language is idioms so there's a bunch of stuff down here about that but i've looked at fena
What's really interesting to me personally is Luau from Roblox because it has the hardened execution environment, but yeah.
Are you saying you got a Lua compiler in less than 500 lines of Lua or you wrote it in something else?
gtfrvz in haskell/jass
Yeah, this is a nice code.
So please don't submit this to lobsters yet because I'm going to write a blog post about it, the experience.
But it's pretty simple.
You know, it's got my usual style of you have a function that's a constructor.
The constructor has a bunch of validators.
You can't actually have an invalid object.
That all felt pretty good.
This meta table, I got something that worked.
I don't have a lot of confidence in it.
I think I get what that's doing.
A lot of this is, you know...
syntax is a little different the names of the functions are a little bit different but i look at it and i just know what it's doing because lua uses such familiar syntax oh yeah i did have to write like three lines of c which you know typically for c it took 15 20 more lines to actually tie that back into what i wanted but lua doesn't have a
standard lib function for getting time in milliseconds.
And since I was generating UUIDs, I actually needed time in milliseconds.
So I had hoped to write something very portable in Lua, and fortunately that wasn't 100%, but it's pretty close.
01:16:37Nogweii what was the impetus for TypeID in lua, btw?
I would like to, the type ID folks,
have a list of languages, and you notice there is nobody between Kotlin and OCaml, so I think I'm the first person to port it to Lua.
Oh, Nagwe tracing.
This is a little silly.
It was a little rabbit hole.
This was a toy project for me, so don't investigate this logic too hard, but...
One of the things I would like is to have request trace IDs that are set by NGINX and then also logged with our Rails logs.
So I just want to tie all of the logs together.
And then I believe ActiveRecord has a feature so I could pass that trace ID into
calls over to MariaDB and it would as well log them and this is this is just huge overkill for lobsters when I don't know maybe call it five or six times a year I actually care about correlating activity between
Nogweii ooh, fun, yeah there's ways to get the request ID into db logs via AR
engine x logs and our rails app logs and correlating them with murray db logs is totally speculative i got such a large value out of having those trace ids at stripe that i just want it and it seemed like a noise a nice well-scoped toy project and it would be much easier to
I only barely know C anymore at this point.
I haven't written a significant amount of Cs since the 90s.
Luckily, C99 still runs.
I remember when that was new, boy.
So the options for Nginx were I could write a C module to create these type IDs to use as my trace IDs, or...
I could install the Ubuntu package for Lua and I could have fun writing a little bit of Lua.
twitchtd hah currently writing some c99 right now for a editor (going through tutorial)
So I had fun writing a little bit of Lua.
01:19:11Ah, great.
Is it going to be an AI powered editor?
I am teasing because I think I've seen like 19 of those announced recently.
and we joked about this in the chat room a couple hours ago but both hunter who is 355 e3b on the site and i both of us opened up these stories to merge them and then realized this was two different stories about editors from microsoft released at like within three minutes of each other
twitchtd it'll be called vibedit
I imagine somewhere in Redmond there is a PR spokesperson who is tearing their hair out that they are stepping on their own
stories like this by having, you know, I mean, this one is literally called Microsoft Edit.
Come on.
Vibe Edit.
Oh, your editor is going to be called Vibe Edit?
Vibe Edit?
That'll be fun.
twitchtd or vibed-it :)
You know, if you want to give it a really obtuse interface that's impossible to learn, you could call it Vibe D. Like Vibe Ed.
twitchtd oh ya
Everybody know the Ed editor?
I got the... Well, I was hoping for Wikipedia.
I tried one of my...
This is not good.
Yeah.
Nogweii I tried ed a long time ago, it did not go well LUL
Yeah, would...
So if it was...
If it was V-I-B-E-D, would that be Vibe Ed or would it be Vibe D and it runs in the background?
Oh...
grayhatter_ it's like atop where it does both depending on the argv
Not where I think i'm older than you, because I have actually used ED to repair a system, because it was the one thing I didn't blow up this was back when I was you know, in my first year or two of learning slack where so I don't know.
9596 somewhere in there.
chamlis_ my highest ed-adjacent achievement was patching a java class file using sed
Where was it.
I want to say I had.
twitchtd I once read a tutorial on ed to say I've used it, like 5 years ago, but have never used it for anything real
There's just the PDF right here.
Not common for Google.
I want to say this book is the one I had available because I had gotten it at a book sale.
I don't remember.
Where's the year on this?
Oh, I landed on Amazon.
Nogweii I have gotten to the point of blowing up a system where TUI apps didn't even work, at that point I just reinstalled the whole thing :P
2002.
Frici I remember that book ...
I must have had the second edition then.
01:22:01Yeah, 2002 is way too late for what I'm thinking of. So it had a basic intro to Ed, and I very distinctly remember having that book open on the radiator next to my desk, and going back and forth between that and my console, trying to repair... What was the file? It was... It was the modem config file. I can't remember the name anymore, but for dial-up, you had to have... Was it PPP? I know that sounds like a child joke, but... What was it called? Here we go. Oh my god. Linux documentation problem. This is probably the exact doc that I was looking at. Because I can't imagine this got updated a lot. Yeah.
01:23:05Frici ah yes pppd the fun times of old
So it was trying to correct some error in this so I could get the machine back online.
Because then if I could get back online, then I could get packages.
Because I blew up something in libc, maybe I broke a lot of the system.
But it's okay, it was harmless, you know.
Yeah.
Pap and chap.
There's some other thing too.
Like there was a separate program that was the dialer and then you had to configure the dialer to hand off to this, which would do the networking.
And then that would also, oh yeah, the standard Red Hat 4X.
Yes, this is the era I'm thinking of.
Because 5 didn't come around until, oh, when was 5?
97, 98?
Something like that.
I've been old for so long.
Nogweii yeah I'm younger than you, I was raised on Fedora, well after the rebrand
pushcx https://www.youtube.com/watch?v…
That song is called Ballad of an Old Man.
Yeah, I think that's the right band.
We're going to assume this is correct.
I'm not going to
Play it on, oh, I remember the fork.
Lyrics, will you actually show me the lyrics even if I'm not logged in?
No.
Shame.
01:24:49Anyways, silly songs. It's like a drinking song.
01:25:05So where are we? So we have gotten through kind of all of the planned topics I had for odds and ends, which was my bad idea for console.log this. And I got very lucky that subheader was here to explain how to actually do the thing I needed with import map and even in the proper way. So that was so great. And then merge channel as many work and then talk about our Ansible hatch box plan. Yeah. So the next thing on my list is working on headlines and story merging, which is where some of that type ID stuff that's in the lobsters code base already came from.
01:26:00So if anybody, where is it?
...09Made a migration.
...15I am probably not going to expose many of these things in URLs.
Well, I say that, but part of the reason for this is we are seeing collisions in short IDs.
Short IDs are, what is it?
36 characters to the sixth power.
To the power of six, thank you.
And we have to do a database round trip, which is fine.
You know, they're next to each other in the data center, presumably.
And so it's only a couple of milliseconds.
but we are already seeing collisions where it's generating things we already have.
We mostly see this with comments because there are coming up on 600,000 comments and call it 120,000 stories.
We also see, and you can kind of get an idea for how many collisions we're seeing because there are,
I found the number and I put it in a issue somewhere and I don't remember it off the top of my head, but there are a couple of dozen IDs that show up both on story and on comment.
So, you know, ABC123 is both a comment short ID and a story short ID.
And seeing that a few times, you know, then I queried for it and it's like, oh, if there's actually four or five dozen of these things, that
says that we're starting to get them mostly in comment with itself and the code has retries it doesn't just crash if it can't generate a unique short ID but.
I would like to be running lobsters without crashes and other stuff or you know another decade or two.
So just kind of gently moving this direction of.
Things that are or might be URL-addressable in the future should have URL-safe IDs or tokens, as I'm calling them, with enough entropy that I don't have to worry about collisions.
And 128-bit should be good enough for anybody.
Nogweii LUL
And if you are watching this recording from the 500th century where you were starting to see collisions, sorry about that, bro.
01:29:05So I got into that because I wanted them for headlines rather than short IDs for headlines.
And so I went down the whole rabbit hole of making type IDs, adding them to the database.
That had me fixing a bunch of route stuff because we had to deal with the Rails misdesign around routes.
pushcx https://github.com/lobsters/lob…
And then the next thing was, where are we?
One, four, five, six.
Here is my work plan for UI improvements for merge stories.
...50Yeah, and so I started a migration for this, I want to say. So let's... do that it's called headline headlines yeah let's just rebase on the master see how many conflicts we get none conflicts not bad
01:30:28What do I want to say? Let's just diff it against master. Yeah. All right. So I started writing a, a has slug. So that's gotta get renamed.
...49Cause that's has token. Wait, didn't I hold on let's browse master for a second.
01:31:08It's been a couple of weeks, and I don't have it. OK, I guess I didn't write that function. How is it working? Did I put it in another file? Yes, I did. I put it in a concern, didn't I?
...31That's why I didn't see a conflict, because I put it off in another file. Yeah, this is the final version of that. So let's just delete this stuff about has slug. I was calling them slugs, but then I remembered that slug is not the correct term because slug is a human readable URL parameter that usually is mutable and optional.
01:32:05All right, so we got that. Yeah, and then this is when I forked off into doing that branch because I was just like, oh, wow, this refactor just keeps sprawling. And I'm writing a migration that's unrelated. So anything here that mentions slug, this has got to change into token. I want to index a token. And then this whole thing goes away.
...45Great.
All right, let's review this refactor.
And I think having done all of this, I can do this in baby steps where I deploy the table.
then nothing will use it and then i can slowly update stuff like hidden stories i don't have to do a big bang i can though i'm gonna see bugs either way oh that was something i was thinking of speaking of peter buying things for the site
pushcx https://telebugs.com/
I have been thinking about buying this thing called Telebugs.
It's $300 once.
And it's a self-hosted.
This is such a programmer page.
It's a self-hosted bug logger.
See, this is the thing that should be the first screenshot on the page.
But it does exception and error monitoring and it catches the errors and it logs them to a SQLite database.
And then it gives you a nice UI on top of them.
And it kicks out other things like it'll send you an email.
It'll send you like a notification.
Well, that might've been an email notification.
Either way, that's fine.
Nogweii there's another project (FOSS) that's self-hosted and sentry compatible I'm trying to remember.
And then the thing that's very nice here is it rolls up exceptions or
multiple instances of exceptions.
And a thing that happens is if you can get the site to 500 each time at five hundreds, it throws me an email.
And so I would rather have one email than six.
And if I manage to break a popular route, even if I instantly fix it, oh man, if it's the US workday, I get hundreds or thousands of emails, which is mildly irritating.
I have a script that throws them away for me, but it would be nicer if I didn't get them in the first place.
And it would just be nice to have a nice UI on these things.
I don't know.
Nogweii ah, https://www.bugsink.com/ if you want to compare
I've been trying to kind of justify it to myself because I don't have a strict need for it, but I think it would be handy.
Bugs Inc. Bugs Inc.
I get it.
01:35:41It's got the AIR.
chamlis_ big fan of the skyscraper sized sink
And it runs out of Docker, which I think is how Telebugs does.
So one thing I like about Telebugs is that it's Rails, and I actually know Rails.
Nogweii ah it's django
easeout I've enjoyed the kind of crash reporting tool that aggregates by stack trace
Is this thing Python?
Yeah.
My Python is fading, and it's not any kind of knock on this project, which looks nice, but I don't want to relearn Django.
01:36:44Is there a description of what the UI for this looks like? I see everything in the docs, except what does the day-to-day actually using it look like?
01:37:11Nogweii there's also https://github.com/errbit/errbi… if you want to swap the library used to capture exceptions
See, I don't want to.
...18Nogweii Errbit is Airbrake-compatible, and rails
Airbit?
You are well-informed.
Do you work in ops, Nagwe?
It's Airbrake API.
OK. Oh, this is the same thing but written in Ruby?
01:38:02Nogweii Yeah, staff devops was one of my titles.
Staff DevOps.
Well, that's great.
You're very on form.
What would you do with iCal?
Nogweii it's definitely of an older era in design LUL
Maybe I guess it would show you the exceptions on a calendar.
I don't know.
...24Yeah, this is all the kind of data I need. Can you mark errors as resolved and get them out of your face until they recur? Backtrace, nice.
...45Oh no, MongoDB.
Nogweii ah it's backed by mongo, whoops
See, one of the things I like about Telebugs is it saves to a local SQLite database, so I don't have to stand up a service.
Yeah.
I have all these, I don't think you have to say whoops.
I have all of these, I hesitate to say requirements because this is such a nice to have, but I have all of these unstated preferences.
01:39:24This is definitely more featureful.
...34twitchtd begin run_rails rescue e save_to_sqlite(e) end
Nogweii @twitchtd need a little bit more than that unfortunately :P
yeah see this is a thing i need so i have our exception monitoring hooked up to log usernames and then when people see 500s as long as it's not you know the rss feed was broken for 10 minutes and i have 5 000 emails but if somebody sees an exception once i will when i fix it i message them and say oh you saw a blank
page when you tried to do whatever because i've pulled it out of the logs sorry about that and then i linked them to the commit that's fixing it and it's just kind of a delightful thing to do for a site full of programmers because everybody is like oh it's a 500 yep that's just a thing that happens and then sometimes a couple hours or a day or two later they get an email from me that's like here's the exact line of code that broke and got fixed nobody expects that
It's like the Spanish Inquisition, but nice, you know?
Oh, there we go.
01:40:46chamlis_ big brother is always watching
Oh, that's handy.
We definitely don't have any JS tracking.
01:41:09I wonder if they have anything. Oh, that's interesting. How old is this? I thought I had heard of Arabic before. OK, so. A dozen years ago, they considered supporting another database backend.
...54Oh, hey, look, here's someone who correctly predicted the words that just came out of my mouth. It annoys me that I have to set up and scale name of other data backend for Airbit. Yep, that's me.
01:42:13In 2013, manga was a more popular choice.
...29All right. I don't know why I'm reading these comments, because if they haven't had a discussion or PR in the last dozen years, they're probably not coming back to this one.
...45Oh, it looks like they forked off to another project. Oh, that is also a decade ago. Yeah. So this is probably defunct. Yeah. Last commit 10 years ago. All right. Well, Nagoya, I appreciate you finding a bunch of alternatives.
01:43:30chamlis_ send the emails to random users and encourage them to fix the bug themselves
Nogweii there are a few more alternatives I'm aware of, but none fit exactly into the usecase you're looking for
pushcx https://github.com/lobsters/moc…
So on bug sync, like I kind of know Python, but
The reason I really hesitate is just that it's in Python because yeah, we're sort of at a weird place where we're fairly small scale and fairly light on maintenance or maintainers.
Like we have our IRC bot and it's written in JavaScript.
And so I basically never touch it because I don't like writing JavaScript.
Nogweii do you like Typescript? (Or Coffeescript! :P )
NoGoodNick_ can an LLM do that?
so like if i had a magic wand i would rewrite this in ruby and move it into our repo i've looked every couple years i look and see if there's a ruby irc gem and there isn't one i do like typescript no good nick the question is
mostly whether there's a ruby irc library and the ones i have seen are abandoned it is possible that there's one i've mixed
01:45:07chamlis_ to be fair, it's not like IRC itself has changed a great deal
NoGoodNick_ then you'd have to get the LLM to port (or generate) an IRC library also XD
pushcx https://push.cx/discord-vs-irc-…
Yeah, chamois, that's a different gripe.
That's this one.
...20Nogweii IRCv3 is a bunch of changes you'd need to handle
Yeah.
And I've done a little vibe coding.
I mentioned I run awesome WM and I don't write much Lua.
I've customized stuff with an LLM there.
It's especially nice because the copyright stuff is so uncertain and no one is going to come after me for my personal window manager config file that is not distributed anywhere.
Yeah, so last release 2006.
chamlis_ I think v3 is entirely backwards compatible if you don't do any capability negotiation
I think 2018 is the newest.
How do I... Yeah, this one...
Actually, I think both of these two are new to me.
But if this one has actually gotten a commit years apart, that's kind of promising.
Maybe there is a Ruby IRC bot framework.
Nogweii holy shit there's an active fork of cinch?! ooooooo
We've got a main, had a commit last month, proactively looking towards 3.5.
01:46:40That's reasonable.
01:47:05Huh. Yeah, this is The numeric replies. I saw this in one of the other gems where they just had big constants.
...30That doesn't look bad, actually. If it's up to date with Ruby, it's got some docs. That's a placeholder.
...55The other thing I would like to do is, so one of the features I would like to have on the bot is the ability to link an account, and if we could
have people message the bot, then we can actually close the loop.
As it is, we would just have a field that people don't verify if we added it now.
But yeah, I want to say, oh, Twitch.
Yeah, I don't want that.
So what's this guy then?
This is someone's novelty that has been started but probably does not have a release.
Yeah.
Didn't know there were any PRs hanging out on the bot.
Yeah, a couple of bugs.
Oh, yeah, this one.
The killer feature for the bot would be if someone is new in the channel and mentions something about an invite, just send them a hello.
That would be nice.
Nogweii what do you think of hosting a web based IRC client?
And also posting stories to a lobster's feed is a feature we had for five or six years and then lost almost exactly four years ago.
Hosting a web-based IRC client.
I have the same hang up about putting anything that's not Rails into production because I would have to maintain it.
And actually, Libera has a web chat.
So let's see.
Yeah, here.
If I just click web chat, do we?
There's a quick question.
We don't link this.
Oh, man.
So we have a IRCS link as opposed to a link to the web chat.
Boy.
Nogweii fair enough
So yeah I would I would not want to stand up and have to run a web based irc client, even if it was locked down so it could only join our project channel.
it's just a whole big moving part and I mean I guess the theme of the day is Peter has become allergic to moving parts.
01:50:56yeah as for what's in ircv3 i sure don't know the list off the top of my head so let's write a let's write a message in the chat file here to point people at it to join the discussion let's go kathy sierra style
Nogweii @chamlis_ yeah it's compatible but adds some of the features mentioned in Peter's blog post comparing to discord
veqqio no need to host the client, can already just use the link https://web.libera.chat/#lobste…
if you're new to irc that would be cs time starting would be official and then so if i can i say like
Because I would like to be able to say, like, no.
It feels like it should be possible.
veqqio push,look at my comment!
Is there somewhere here on Vibera chat that does that?
Guides?
veqqio phy1729 gave it
Oh yeah, no, they don't have a top 10 link or anything.
chamlis_ @nogweii right, I thought you were saying old irc libraries wouldn't be able to handle it - my mistake
Oh, thank you.
I didn't realize.
I didn't see that go by.
01:53:05Oh, I get it.
...25So if that works, lovely.
01:54:14Nogweii @chamlis_ oh, yeah, I get what you mean. I think there are some services that are IRCv3 only these days? (like host masks configuration)
Oh, yeah.
Good question.
...21Oh, and Vecchio, if you use the add on my username, you can ping me and it stands out a little on Twitch, which is nice if I'm just absolutely missing something going by because I'm staring at the code too hard.
...49Nogweii It's been a while since I've paid attention to the ircv3 specs and what people have done with them
Redundant.
...56I'm off on a branch. Man, if only I was running Jujutsu instead of Git. This wouldn't be a hassle, right?
01:55:26twitchtd isn't jj backwards compat with git?
easeout I should look into jj already. People who've used it seem to really like it
JJ uses Git as a store and is compatible with Git, but I'm specifically referring to it has a nice story around disentangling commits like this, where, like here, I'm going to have to make a commit and then move it over to the master branch somehow and then drop it from this branch.
It's just a, like, I can do it.
It's just a pain.
01:56:00Probably the easy, I think I don't, since we're only one commit ahead of, yeah, no. All right.
...36chamlis_ I don't know about anything host mask related so I'll take your word on that, I've only implemented capability negotiation and typing
yeah it's ease out i'm in a similar boat of like i've skimmed some of the 101 stuff enough to be like oh it really seems like there's something here but i haven't stopped and spent a couple of hours just directly using it i thought about it for the type id and lua project but i just didn't want to take on more moving parts
01:57:07You're making me... Git wants to make me resolve a merge conflict. All right, let's abandon this.
...35I know it's unmerged. That's why I'm trying to throw it away. Is it restore-f? No.
...53Restore-2. How about checkout? Will that blow away the works? And I'm only doing this because I know it's still in the stash. Ah, who knows how to tell Git to shut up about this file? What if I say rm-f?
01:58:20Nogweii @chamlis_ my memory is patchy at best on this, so take it with a grain of salt :)
It's because it has changes.
...39Nogweii @pushcx checkout -f I think is what you're looking for
Give it a try.
Okay.
Warning.
No, didn't actually change anything.
...53easeout git checkout HEAD -- that path
If I touch the file, I add it and then blow it away.
01:59:14OK, there we go. So for those falling at home. I added it. Then I reset it to get it out of the working copy and then I deleted it. And get us chill now. All right. Can I do what I was trying to do? OK, now let's go back to the branch. Let's pop the stash. Okay, and I didn't get a merge conflict. And now I can throw away this. All right. everything is where it should be good i'll deploy the chat thing later i don't want to switch branches and try and deploy and etc i guess i could just say it push origin master right name the branch okay all right and let's not that equals lobsters exit So the deploy script always deploys out of GitHub, not my personal repo, in case you're wondering how I'm still on this branch. All right, so we don't need that anymore. That's where I'm working. I'm sure Ben is happy, because sometimes Ben gets a little touchy about having seen the file disappear and reappear and get edited out from under it. All right, so we are adding. all right i remember exactly where we were i was adding this headline table and i have a circular definition where the headline wants to refer to which story is going to be featured and we spent a pleasurable minute with the thesaurus picking that word but then also the story wants to refer to the headline and it is possible to do Deferred foreign keys with active record, I think.
02:01:47Yes.
...59Deferred or immediate allows manually deferring the check within a transaction, which I think is going to be what I want. How's the constraint behavior to change within? I don't know what that means.
02:02:39This is basically what I want to be able to do. So let's read more about these three different modes.
...56This is Postgres. It's five years ago.
02:03:09so maybe i should have just pulled up zeal -huh Cascading column. Postgres only. Dagnabbit.
...58I guess I just have to port to Postgres before I land this refactor, right?
That's it?
One little change?
twitchtd what ever happened to the postgres refactor?
Nogweii one little change, no big deal :P
One little side quest, one little rabbit hole, one little yak to shave.
I'm kind of saying this because we have an open issue about moving to Postgres.
Yeah, I was going to get there.
So TD, the short answer is it's stalled.
The medium answer is I am trying to also consider SQLite because
Speaking of getting rid of moving parts, it would be nice to go down from two VPSs to one.
It's not so much about money as it is, it's a second server to not have to maintain and care about and secure.
And with the default of using the write-ahead log and some fixes to
Nogweii I know SQLite works much better than people consider, but will it really scale up to Lobsters?
say fixes some modernization of the active record sqlite adapter it does look like sqlite is a serious production choice especially for a site that is as read heavy as ours yeah that's an interesting question right and i
Can I see this?
So I've been asking that question.
No, is it?
02:05:53Can I just search for it?
02:06:00SQLite.
No.
I think I'm rate limited.
Let's see if I can just find it off stream.
My personal.
pushcx https://bsky.app/profile/push.c…
Here we go.
twitchtd ah if you want to use sqlite then stopping work on psql pr sounds like a good idea :)
So there's a conversation tree I had here on blue sky that got some responses, including from.
Steven Margime here, who is the person who has been doing a bunch of this work of making SQLite a real production choice for Rails apps.
He's given a bunch of talks at Ruby conferences.
If you go to Ruby events, oh man, I'm in love with this site, because I love watching conference talks, and especially when they're Ruby.
So they are attempting to catalog every talk at a Ruby or rails conference and kind of a later joy because they're still backfilling 20 years of talks.
A later plan is to continue adding talks from other conferences, so like I gave a talk at Kansas city developer conference, which is.
I mean theoretically it's a general programming conference but let's be real it's a dot net conference I gave a talk on Ruby and rails there and.
They have kind of put it in their queue to add at some point if I wanted to learn their schema I probably could PR it but.
So anyways, they have a speakers page, and if you click over here.
02:07:48And then you control F because it's faster.
Oh, hey, Sumina.
She's come by the stream before.
I didn't know she talked at Ruby conferences.
pushcx https://www.rubyevents.org/spea…
Neat.
I'm going to just assume her talks are good because her articles are great.
So Stephen here has given a bunch of talks about using SQLite in production.
And
02:08:15I have tried to ask for specific numbers of... Is anybody running it with a couple of gigs of RAM and our order of magnitude of reads and writes? And it sounds like the answer is... Well, it's not an answer because it's one of those negative things where... No one has put their hand up to say that they're actually running it at our scale, but I don't know if that means that no one is doing it or no one can do it. Oh yeah. And I said it to Steven here of your talk had a lot of interesting features, especially with Lightstream, but I don't want to be the highest traffic user by two orders of magnitude because That is roughly what I've seen from the only public numbers I could find about SQLite in prod.
02:09:25twitchtd I would assume sqlite can handle lobsters traffic, though no hard numbers behind that feeling
Because it's a small world here, Kyriosilin... Kyriosilin?
I don't know.
I'm probably butchering this guy's name.
This is the guy who made Telebugs that we were talking about like half an hour ago.
yeah td i'm in the same boat of like it feels like sequel light should be fine but i don't know like i can't find anybody who claims to say that they see something like the number of reads and writes that we do
veqqio how many reads and writes do you have?
let alone actually includes a specific number like, so Siln here, Siln, I'm sorry Guy for if you're watching, talks about very promising numbers.
We, I don't know offhand, off the top of my head.
I would have to,
Instagram MariaDB or figure out how to ask it because it may already.
02:10:44But we see something like a quarter million visitors per day. And then That is an attempt at a number of humans. That's with most of the bots stripped out.
02:11:13And then logged in... Oh, here's this bug. There's an open bug about this. The... job is either out of sync with when this wants to run and it's not pulling the latest if anybody wants this bug it is available and probably not too bad so i just actually i can show this all right get ready for light mode So there's this very nice dashboard called mission control for the solid queue backend service, where it shows me like how many jobs are running or hanging around or have finished. And I can jump into them. So like when we got the bug report that the stats page was missing stats, I could look in here and be like, oh, okay. So the stats graph job. Yeah, none of these say that they failed and I clicked in and they'll just say finished happily. And I can also come over here to the recurring tasks and I just came and clicked on the wrong one. Should have clicked on this one. So now that is an in-progress job. Anyways, just seeing this very nice, pleasant interface that's trivial to use and it has all the basic info I need and the basic controls I need, like just run this task as a one-off. I think it doesn't stream updates, so I have to reload this page. That is such a minor inconvenience. I can't imagine caring, you know? But seeing this of like, oh yeah, we kind of have this sidecar app. Honestly, mission control is what sold me on something like Telebugs. So anyways, I swear this is going to come back to your question, Beck, as soon as this table wants to fill in.
02:13:18Actually, probably the first one is in, yeah. All right, all of these are by month. They're not by day. So we're only seeing the first one because the job runs sequentially, so it doesn't just hammer the database with four giant aggregates. All right, so I can't show you on a stat, but believe me when I say that on a given day, a typical weekday, we have... 2,500 logged in users visit the site. And they tend to read a couple of pages. So low confidence, but I would say the median is somewhere around three page views. And that does not include RSS feeds. But it's been quite a while since I tried to guess at that number. So like grain of salt on that one. every time a user visits an individual story we do a right so and then we do obviously we do a couple of rights every time there's a vote or a comment etc so anyways ballpark it as a Probably something like 10,000 rights a day. And I am sure that someone who is a SQLite expert is laughing because they have benchmarked doing 10,000 rights per second. No, realistically, some of the benchmarks, and these are all just very simple synthetic benchmarks I've seen, are And I don't remember which hardware this was, but I've seen people happily, easily get a couple of hundred writes a second, and we don't see anything like that burst.
02:15:22I don't know.
veqqio Oh yeah, it 100% works
If nobody's done it, I guess I just have to do it.
And I know it's roughly possible to port us to SQLite because the YJIT folks, they didn't want to stand up MariaDB in production.
...42veqqio I've done a few k per second at work
veqqio ...laptop!
so they ported to sqlite they didn't port everything but what they haven't is like this stats page and some of the mod stuff what kind of hardware effect you or bps if you want to call that hardware
02:16:12What kind of laptop?
How long ago?
veqqio 2017 dell inspiron :D
Because there's a big difference now between the laptops that Apple is putting out and laptops that everybody else is putting out, especially the last two, three years.
...32Like this guy is like 37, 38 requests per second.
I think he's saying web hits per day.
Yeah, so I just wanted to see somebody post real numbers because I get those kind of responses of, oh, that's nothing scale.
But if no one is giving an actual prod number of anything,
veqqio Like, this isn't web prod, but datanalysis prod
I just have the fear that there is something we're missing.
Because I'm certainly not a benchmarking expert.
I'm not a SQLite expert.
And we had a... Yeah.
And data analysis prod is a lot more forgiving in some ways.
You don't accidentally dogpile yourself.
So we had an issue in...
Nogweii does it make sense to announce / prep for an experiment?
When did we move to DigitalOcean?
Was that 20...
I think 2020.
Yeah, I think that was during the pandemic.
And I tried to use their managed MySQL.
And it was MySQL instead of MariaDB.
And what we learned the hard way was that MariaDB has a performance improvement for a query we do a lot of.
And so we moved and then we started falling over.
And it was a bad couple hours till I figured out what the sad query was and turned off that functionality.
And then it was a bad couple days of tinkering with it and going back and forth with their support team
Before I was like all right i'm just going to stand up Maria db and product.
Because, then I knew what the issue was they didn't they were actually not helpful tracking it down, unfortunately.
02:18:51veqqio 300gb of stock data, 200gb of random.... other documents/text, then blasting it with requests to try out hunches like finding mentions of various keywords at certain dates to see how people responded to news events
i'm thinking about your question dog way of whether it makes sense to announce.
02:19:03veqqio So it's not the same workflow at all, but ...i think it can easily handle it
Nogweii it's a tough question, for sure :)
well vecchio speaking of orders of magnitude that's two orders of magnitude larger than our database maybe three actually at that point you have to start asking like are you measuring a sql dump and on on disk but you know
Like our largest two tables are around four or 5 million records.
So I know I'm smaller than 300 gigabytes.
I don't know what, yeah.
Having talked to the actual rails person, I guess it's still here on screen.
Like the actual rails person who did this work and not getting an answer.
I don't know.
I don't,
Know that I expect to
get any kind of benefit out of hassling somebody else.
02:20:09I thought that was going to be a guide.
...17veqqio Ill ask on reddit for you :P
So I joke about Postgres, and I joked about SQLite here, because I have started learning a little bit about SQLite.
And I have seen that you can just casually turn off foreign keys and turn them back on.
...39oh okay well if you want to scroll up to my blue sky question you can see roughly what i've been trying to ask and yeah just trying to build some confidence there in part because we're pretty strictly limited on developer time and boarding is expensive so i don't want to waste that time by finding out in prod that we're sol
And then migrating back would be painful.
Because if we do any writes, we have to be able to migrate back, right?
Nogweii yeah, it's a scary feature of SQLite. I get why it was implemented, but that paired with SQLite's lack of type safety (by default) keeps me from wholly recommending it
I don't know.
That one... Yeah.
Yeah.
SQLite is a very different philosophy on databases.
And they...
They're actually a little snarky about types.
Where was that?
02:21:54So the documentation for having tables that actually enforce that you only put integers in integers It's like some developers appreciate the freedom that flexible typing provides and use that freedom to advantage. But other developers are aghast at SQLite's flagrant rule breaking and prefer the traditional rigid type system found in all other SQL databases, engines, and in the SQL standard. Or this latter group. I don't know. There's a little bit of personality in these docs. I think there was something at the end. No.
02:22:55So I guess that leaves me with the question of how to have this circular foreign key. Because the headline wants to feature one and is not really a valid object without one. And the story wants to say which headline it's on. but I guess is valid without one, so I guess I'll just make it optional on story.
02:23:32Yeah.
02:24:04Yeah, and I don't have to touch this code. This is fine. I actually, maybe I want to break. Yeah, I don't want to do that. I do want to do this. well at the end do i want to remove merge story id if i do this and my query doesn't run correctly the first time then i have to reload the whole database so let me just comment that out for now boom what did i do wrong unknown key to table
02:25:12How do I name that? So this is, or no, this is,
...43This is references.
02:26:29Well, index foreign keys and foreign key articles, authors.
...47This is there's two syntaxes, one for when you're doing it new.
02:27:17And they're almost the same. This is a minor Railsism that gets me.
...31I think I want to say, instead of saying references feature ID, I want to say that this references stories in the column. Where'd it go? No. I wish I could hit Control-O like it was Vim. It's just raised. Before it starts destroying data, I want to see it actually create this darn foreign key. Do I have a... I should have thought of this five minutes ago. Do I have an example already in the code base? T references, yes. Okay. Domain null false. Okay. Column is featured. ID... No default, not null, foreign key, and then.
02:29:01It's your unknown key.
...11Unknown key, it's not called column. But that's what I just saw in here. That's when I use add foreign key, not
...49That's a query. Which one to use?
02:30:25I just don't want the damn column to be named story because saying headline story when there might be several i'm going to have one association called story and one called stories. I want one called featured and one called stories.
02:31:06Come here.
...16So in the schema statements, we are at line 1,020. And it just calls another.
...48Sometimes Rails is so surprisingly persistent about its definitions or its defaults and its conventions
02:32:37Somebody's blog, right?
...47Was the whole hassle that I didn't put to table in a hash?
02:33:18mismatch between the foreign key feature ID ID. Oh, all right. So that's just going to be called featured. And then. Did you actually create it? No. So.
...47What's your ID on stories? Big int, 20, unsigned. And what do you say? All right. Man, I wouldn't have a type error in SQLite.
02:34:51chamlis_ unsigned?
Maybe.
02:35:06I don't know if it's unsigned true or signed false, but I'll get an error. Okay, hey, wait. That's good. It created a table. What does it look like? Okay. Okay. Nailed it, Chamlus. Thank you for yet another bug fix. All right. That's weird that it wants to make the headlines table have a signed integer. How many other tables have that?
...51All right, so they have an ID, type bigint unsigned true. So what do I want to say here? Integer ID, type, bigint, and sign, true. Oh no, that's not it. There's a way to tell Rails.
02:37:07I could say id false and then create it.
...52Getting what I want out of this.
02:38:07This is one of those like putting the rays in there is one of those things that's like, yeah, I've been doing rails for a minute and I know that I'm not going to get that right on the first try because it has so much syntax. I don't know how much we benefit from that, because it costs time every time. And then we add a column. Default nil, null, true. What are you mad about? Avoid dangerous column names. It's fine. What are you mad about here? Nothing. All right. Let's see if the migration wants to run.
02:39:02Alone foreign key.
...18I guess I'm not making it a foreign key, so I just want to make sure that's the line it's failing on.
chamlis_ dreaming of transactions for schema changes
Yes.
Oh, it would have to be a, have to say references, right?
I'm just looking at this, add foreign key.
Yeah, not a MariaDB feature.
Certainly not a SQLite feature either.
Woof, that's,
That's actually the biggest negative of the idea of moving to SQLite is there are no DDL transactions, and so
There's actually very limited expressivity for redefining tables.
And it kind of papers over that with a lot of the flexible typing.
But if I'm going to gripe a whole lot about taking downtime on deploys, I should mention that migrations in SQLite almost all involve hard downtime.
because it just won't let you.
I can imagine some clever stuff with duplicating tables and then editing the duplicated tables and renaming them, but I don't think you can put that in a transaction.
It's like almost there, so you'd have to duplicate the whole database and then mirror writes to both.
and then edit the new one and there'd have to be some kind of translation layer like that's a non-trivial amount of code so that's that's actually a big negative against sqlite is aside from i can't tell if it would immediately catch on fire and fall over due to scale
02:41:57chamlis_ I'm sure this has come up in your posts about sqlite but in case it hasn't, I think Tailscale use sqlite as their primary data store
I don't think I knew that.
That's pretty neat.
Headlines already exists because I didn't manually delete that.
02:42:40I wonder if they do like a multi-tenancy thing where it's one SQLite database per user. When I say user, I mean like TailNet.
02:43:06Why is it shoving all these things in a hash?
...33chamlis_ the two blogposts detailing their journey to sqlite are https://tailscale.com/blog/an-u… and https://tailscale.com/blog/data…
Huh.
I will have to give those a look.
Thank you.
...48Let me actually. Grab those over here.
02:44:12Now we're back to.
...35So if I say headline ID, it makes headline ID ID.
02:45:16So it created the right thing there, I think. And it erred? No, it didn't actually. Didn't actually create anything. No, no.
02:46:32That's progress. I don't actually think I've made the model yet. I have not.
...55All right, let's make a headline model.
02:47:13It has many stories. It belongs to a... How do I phrase this? I think I say...
...41featured with the class name story and no inverse. I think that's it. And then this does include token. And what are we validating about these things? We are validating
02:48:22That's all they're gonna have. Yeah, I'm a little tempted to put a title on them, but I think that would be confusing.
...43Okay, I also wanna say it has many Can I nest throughs? Can I say it has many tags through the story tags?
02:49:05Needs to have a counter cache.
...17I'm going to be counting those all the time.
...34Which I already did back that half migration out. Has many through.
02:50:57I think I can now do a hasMany through an intermediate table like this. But I really do want to say that the Headline has many tags through story.
02:52:07Ugh.
...41Oh, I know what it is. I can say has many stories. I think I can say has many taggings through stories. And I think I can say has many tags through taggings. I think that's it. I'm going to comment these out for now. That'll be it, I bet.
02:53:13And this is going to have a belongs to headline.
...38I don't think I want to have a way for it to know that it's featured. I don't think that's going to matter. So I'm not going to make a... I guess technically it would be a hasMany, but there's a constraint I would like to have that's hard to enforce, but it's that the featured ID on headlines, that that story has to point back to the same headline. We'll just have to try to never be wrong. That's how you make reliable software in Rails.
02:54:29What are you mad about here?
...45Oh, because it's a foreign key, I guess it knows it. All right. So scope, I'm not going to try and write scopes yet.
02:55:20That's probably enough.
...49Let's see if that wants to run. Nope. Column ID cannot be null. Why were you trying to insert an ID of 0? Because you got down to headline story factor line 17.
02:56:17Why did you not pick up from the migration that ID is the PK? This is what I wanted.
...50Unsigned false. Signed false. Unsigned true. I think that's equivalent.
02:57:01All right. Let's jump back in here. Drop that. Drop that. This might actually succeed. Oh, it's thinking. I thought I had outputs in here. I guess the info level is not actually logged by default. That's not useful.
...51Well, this is not true, because the default is not debugger, or I would have seen info already, right?
02:58:17You know, as long as we don't have that table definition happening in a column or in a change log, in a transaction niche, getting tired, getting towards the end of the stream. All right, so if we have 113 K stories. Only 13 K headlines. All right, so that's going to take a second to run. First, we find anybody who's nil that gets a standalone headline. Yeah, so that's all the parents.
02:59:00Just in the hopes of seeing the debug message in prod when I actually run this darn thing.
...13All right, that's pretty good. That'll probably do it.
...23Yeah, there are. So it's because this is doing one insert for each instead of. I don't know, one insert per hundred or one insert per thousand. Probably that this is churning along so slow. Try not to spend too much time optimizing migrations because they run once. So if I spend a half an hour making it run in one minute instead of five, I have lost 25 minutes. And I always do have to run them two or three times in dev. So this is probably going to be correct. But until everything is moved over to use headlines, I can't actually deploy that. So I think if I get this to the point where creating a story creates a headline then i'm pretty much done and it's deployable and i can come back and do this remove in another migration later the hassle is There's so little, so few boundaries in a Rails app that finding all the things that might call story.create is hard, especially because I can call user.stories.create and I don't want to have it in a callback.
03:01:14All right.
So we're at three hours and
That's going to run for a while.
There's more to do.
I think that's a pretty good stopping point for me.
I'll leave this migration running, and that'll have to be good.
That's good progress, though.
A little bit of a struggle, but reasonable progress.
twitchtd thanks for streaming
So let's turn off the banner.
chamlis_ thanks for the stream
All right, folks.
Nogweii thanks for the stream!
veqqio Have a good night!
Well, thanks for dropping in, TD, and other folks, especially those who chipped in to help.
It's been a nice office hours.
Yeah, have a good evening yourselves or whatever time of day.
I will see you all for the next scheduled stream on Thursday morning.
That is 9 a.m. Chicago time, best time.
And that's all I got.
Take care.