Rooftop Ruby Podcast
Two Ruby programmers (Collin Donnell and Joel Drapper) discuss Ruby, web and native software development, technology, and more.
Rooftop Ruby Podcast
Literal 1.0 and Where We've Been
Collin and Joel discuss where they've been, Collin's broken wrist, getting into film photography, and the release Literal 1.0.
Follow us on Mastodon:
Show art created by JD Davis.
Collin (08:21.245)
All right, so Joel, how's it going?
Joel (08:28.063)
Yeah, pretty good. How are you?
Collin (08:30.216)
I'm doing good. We haven't put one of these out in a little while and I have a lot of, I have a lot of call in like general life updates to share about part of why that is and other things. And then you have things to share about programming and other stuff. And we're going to get into that. So first off, part of the reason we haven't put out an episode in a while is as you know, and people who follow me on the internet may know,
Joel (08:39.061)
Yeah.
Collin (09:00.01)
I ate it pretty hard and broke my right wrist, which is my podcasting editing wrist. it's my mouse saying, yeah, I had to take a month off work. I didn't get paid for because I'm freelance. that really sucked. and yeah, so that wasn't great. And, you know, I had to get surgery, which obviously costs money that I have to pay now and,
Joel (09:07.252)
Yeah, that's your mouse hand.
Joel (09:14.015)
Eesh.
Collin (09:27.518)
You know, I have a little, I have a little scar here now that you can see, which I think it's healing. Okay. It still hurts. Like I can use it. It's not as strong as it should be, but I can use it. It just, it just hurts. August end of August, but then it took me at least a couple of weeks to get surgery. the first three days I,
Joel (09:31.351)
Mm.
Joel (09:35.148)
Yeah.
Joel (09:42.124)
How long ago was it? It must have been... Yeah.
Collin (09:54.801)
I didn't know it was broken. So I just kind of walked around with a broken wrist and on day three, I'm like, it's not getting better. Maybe I should see the doctor. Cause like I've, you know, I've sprained like my foot. what do what do you call the thing? Your foot, your, ankle. sprained my ankle real bad, like a year ago and it felt, it felt kind of similar to that. And so I was like, maybe it's like that.
Joel (09:58.359)
Mm-hmm.
Joel (10:08.819)
Ankle? Yeah.
Joel (10:17.186)
Yeah.
Collin (10:21.489)
Although there was kind of a bump sticking out of it, which probably indicates that it's something more serious. so, I went to the, so, so I guess I learned that my pain tolerance is higher than I would have thought it was because I, essentially walked around with a broken wrist, just like out in the air for three days and then, and then for a couple of weeks until I could actually get the surgery. So that was really cool. and then.
Joel (10:33.374)
Ha ha.
Joel (10:38.945)
Yeah.
Collin (10:49.544)
So that really messed things up because it was pretty bad for a while. I couldn't really do anything with it.
Joel (10:55.258)
Yeah, it takes a long time for breaks to heal. I broke my ankle. I think it's the only bone apart from like fingers, which don't really count. I broke my thumb as well. But I broke my ankle jumping off a waterfall and I kind of, missed the deep spot. And, but I was like pretty deep in.
Collin (10:59.324)
Yeah.
Collin (11:16.22)
Mm-hmm. no.
Joel (11:23.138)
into the woods in Wales. So it was quite a hike back out. And then I was in Wales, so I had to drive back home. And unfortunately in the UK, all our cars are manuals basically. I got on the motorway, it was mostly fine. But like, if you have to change gear.
Collin (11:46.087)
Were you by yourself?
Joel (11:48.331)
No, but I was driving, I think. Wait, no, maybe I was by myself. There was some reason I had to drive. Yeah, was by myself. I wasn't by myself when I was jumping, but I was visiting my sister in Wales, so I had to drive back by myself. Yeah, I think.
Collin (11:56.979)
I'm glad you didn't die.
Right. I see. Okay. Yeah. Yeah. Jumping. I would generally recommend not jumping off of waterfalls by yourself in general. If there was no one else around when that part happened.
Joel (12:10.424)
Yeah. No. I was, I'm so sorry, I wasn't by myself, but I was the only one who could drive at the time. That was before Jill could drive in the UK.
Collin (12:20.562)
Good. I might've made an exception. Just be like, don't get pulled over. I think even if you got stopped, you could probably explain it and they'd be like, I mean, what are you going to do? But, well that's fun. So, okay. So I broke my wrist and then, what, what else? So, and then I went to California for, to get into the California trip was a little bit wild. It was a short trip.
Joel (12:25.624)
Yeah.
Joel (12:34.905)
Yeah.
Joel (12:44.826)
Mm-hmm.
Collin (12:49.82)
But as you know, think basically since last time we recorded, I've gotten really into photography and taking pictures, started photo blog, doing all that stuff. and I had messaged my dad and been like, Hey, do you still have your old range finder? And I didn't know what it was or anything. And then I'm, and then he's like, yeah. And I was like, well, can I have it? And he's like, I guess. And I'm like, what kind is it? And it's like, it's a Leica, which
Joel (13:17.818)
Mm-hmm.
Collin (13:18.344)
If you know cameras is a very fancy kind of, you know, camera. And so I went down to California to see my parents and to pick up the camera, which I did. And, and the lenses. I got a 35 millimeter, a 50 and a 90. And I guess we had their thing. found out was that the 35 I got is specifically a very, very sought after one. So now I'm a little nervous to like take it out to do my.
Joel (13:29.582)
and the lenses I assume.
Joel (13:35.279)
Nice.
Collin (13:46.642)
you know, dipshit street photography kind of stuff, just cause it's, you know, carrying around a pretty valuable, lens. So I did that. The other thing I found out when, when I was there, I don't know if you'll know this because, maybe it's more of an American thing. I mean, I'm sure you know who the beach boys are. So I had.
This is just a part of me being in California. I had heard this story basically that when my mom was a kid, she grew up in Laguna Beach, which is in Southern California, and that she had said something along the lines of, we used to go see the Beach Boys with my friend Barbie when we were kids. And we'd see them at the community center. Nobody really liked them back then. She made it sound like she was going to one of my shows basically. There were a few people there, whatever.
You know, and then they got popular later and and I actually got the whole story this time because she never told anybody including my dad about this Which is that her best friend Barbie was actually named Barbara Ann Which the Beatles wrote a pretty famous song called Barbara Ann I guess they also were a song about my mom, but I need to figure out what that is on and find out so the Beach Boys may have they definitely were a song about my
about my mom's best friend and they, she says they were a song about her too, but I, I need to, I need to get it from her and look it up on Apple music. cause I don't think the title she gave me was right. And so that happened and what turned out the story wasn't that they used to go see him. was that her uncle lived next door to the beach boys and they would go hang out with them while they were practicing. And then the story is, and she's like, and they were so nice and so cute. And I'm like, yeah, no shit. were.
The Beach Boys, I'm sure they were. And then she's like, yeah, and then Barbie, when they went to England, Barbie went to England with them. Barbara Ann went to England with them to hang out with the Beatles. I'm like, she hasn't told me that in my entire life, hasn't told me this. That's a crazy story. Also, Harrison Ford asked my mom out on a date one time, because they filmed American Graffiti, and I think their movie's called Peggy Sue Got Married.
Joel (15:59.423)
What?
Collin (16:05.252)
He's in both of those, I guess. He's definitely American Graffiti. And they filmed him in my hometown. And at the time, my mom was there and she had a little convertible and Harrison Ford, I guess, saw her and was like, you know, hey, baby, can I get a ride in your convertible or something like that? And she's like, no, I'm good. then I guess maybe her sister.
Something like invited he showed up to her birthday or something very but she wasn't into it. I'm like, of course Why would you be it's just the most handsome person you've ever seen in real life? So it's a pretty wild story, right? Yeah and then last update for me is that I asked you yesterday because I wanted to get somebody to tell me it was a good idea because this domain was like $220 a year, but so I've unified
Joel (16:41.778)
No.
Joel (16:46.29)
Yeah.
Joel (17:00.221)
yeah. Yeah, this was definitely the right decision.
Collin (17:03.278)
Yeah, so I've unified all my domain. moved my, so I had bought Colin.band for my music stuff, because I thought that was funny. And then when I was going to start a photo blog, I got Colin.photo. And I saw, if I was willing to pay for it, that Colin.blog was available. So I went and set up the redirects and that thing you do, that kind of stuff in with the proxies and the redirects. you know, so all my old posts and feed and stuff, it all worked fine.
Joel (17:11.54)
Mm-hmm.
Joel (17:21.119)
ready.
Collin (17:31.863)
And so now my blog is at Colin.blog and my other blogs at Colin.photo. And the symmetry of that like really pleases me.
Joel (17:35.903)
Crazy. Yeah. Can you get... You probably can't. But can you get Colin.email for your email address?
Collin (17:45.934)
I'll. That's a good idea. I'll look, I mean. Yeah, I should go on hover and type in Colin and see if there's any others I want. The the thing is that like the non like standard TLDs tend to be pretty expensive comparatively. Some of them aren't. Yes, some of them aren't. A lot of them are. So, yeah, I'll I'll I'll keep you updated on on any of that, but.
Joel (18:00.39)
Yeah, they can be. They can be really cheap though, some of them. But yeah. Yeah.
Collin (18:14.201)
Man, I think that's everything that's happened with me. So it's been a pretty eventful couple of months here. What about you? Anything you want to share?
Joel (18:21.322)
Hmm.
Joel (18:26.71)
Yeah, mean, so much has happened. I started a new job, and that's working with a company in America. So this is like partly why we ended up like basically just not recording, like partly your wrist initially, and then also, but I think we'd had quite a break before that, right?
Collin (18:48.876)
Yeah, I think you started working and then I broke my wrist and you were building the studio.
Joel (18:52.372)
Yeah and it was like yeah exactly so so I often have to work quite late like stay up for meetings and stuff and it basically whenever we would normally have recorded
basically was either time that I was in a work meeting or that I was like recovering from having been in work meetings for most of the evenings and so it just didn't really work out. And we couldn't do it any later because I didn't have anywhere to record later. Like it makes way too much noise when I talk, when I get passionate about Ruby. that sounds, that sounds really...
I mean, yeah. I'm very, yeah, very passionate. So, but anyway, so now, but then we've been doing this building project and we've converted, was a garage into, it was like a built-in garage. It's now another room in the house, which is the studio.
Collin (19:42.084)
You're very passionate about Ruby.
Collin (20:03.512)
or British people call it the boot. That was a joke. I know those are two different things. That's the trunk. That's the trunk. Yeah.
Joel (20:08.992)
No, that's the back of the car. That's the trunk. Wait, why do you call it a trunk? doesn't make any sense. Because... Actually, I don't know why.
Collin (20:16.494)
Why do you call it a boot? That doesn't make any sense.
Joel (20:24.448)
Yeah, I have no idea. Okay.
Collin (20:24.77)
I trunk makes sense because if you think you have like a trunk that you like put stuff in that people would like travel with back in the day. feel like trunk makes way more sense. Maybe boot does too, but I can.
Joel (20:29.538)
okay. Yeah. Yeah.
Joel (20:36.417)
Yeah, I actually have no ability to counter that right now. can't. Yeah.
Collin (20:41.377)
This is just a common USAW. I mean, we haven't been W-ing that hard recently, you know.
Joel (20:47.382)
So basically we're just using a synonym for the hood, is bonnet. We call them bonnets. Anyway, we always end up talking about Britishisms. Anyway, basically now I have the studio, we can record pretty late, which is pretty good for me because I tend to stay up quite late anyway. So hopefully we'll be back on a pretty regular schedule.
Collin (21:06.595)
Mm-hmm.
Collin (21:12.503)
Damn.
Collin (21:16.44)
Yeah, I think probably what we'll do is like do record weekly, then release them bi-weekly for a few weeks just so we can like get a couple ahead and then just try and get back on a weekly cadence now that everybody, know, health has been restored and you have a studio and I'm just here, so I'm easy. So anyway, yeah, so that's all exciting.
So we're both on blue sky now. I'm on both. I'm on massed on in blue sky because not enough people that I know are on either, but you seem, I don't know. What do you think? Blue sky.
Joel (21:56.941)
Yeah, so I'm technically on Mastodon as well, and I guess technically on Threads, though I don't think I've ever posted to Threads. I think there was one Rubyist hanging out on Threads for a while. I think it was Aaron Patterson maybe, and then that was it.
Collin (22:03.331)
Yeah, I don't, I dropped threads.
Collin (22:13.229)
Yeah.
Joel (22:17.102)
And so like that didn't seem to pick up. Yeah, it seems that everyone has kind of settled on Blue Sky. That seems to be where the Ruby community is. for me, I think it's pretty great. Like it is capable of being federated.
I want to say, even though it's not really very federated, right, there aren't many instances of Blue Sky. I think you, well, there is one server, you can run your own server pretty easily, I think.
Collin (22:39.136)
Yeah, but it isn't yet.
Collin (22:43.724)
There's one server, yeah.
Collin (22:50.252)
Can you? thought I didn't know that they'd like released that because it was still in beta.
Joel (22:54.309)
Yeah, you can, think right now if you decide to do that, you can't go back. But they're working on fixing that, so which might make it more attractive for people to try it and then maybe like if they don't like it, they can migrate back. But like, there you go. So that's like, that's where you run your personal, what is it? Your blue sky slash mastodon.
Collin (22:59.363)
Hmm.
Collin (23:09.602)
I think I have Colin.social also, by the way. Yeah, I think I already have that one. That's where I'm going to put my blue sky.
Collin (23:22.38)
thing. Yeah, whatever.
Joel (23:23.961)
instances. Yeah, I haven't looked too deep into the Mastodon Blue Sky differences, but my sense is that Blue Sky is more carefully designed, kind of a protocol, and more easily scalable. I think the thing about Mastodon is, well first of all, like, I think it really suffered
Collin (23:40.694)
Mm-hmm.
Joel (23:53.562)
with the usability, like the first thing you have to do is pick a server. And that's like a daunting task and like on its own, you don't know like, like which server should I pick? And like I joined the Ruby social server, but I could totally imagine being like, I don't wanna just post about Ruby, right? This is my space online to post about things I'm interested in. It doesn't feel, yeah.
Collin (24:17.664)
Yeah, end on mastodon switching servers isn't like, like you do lose some stuff. Like your followers will follow you, but your posts won't. Where I thought that was part of the deal with blue sky is when they, when there are multiple servers and stuff that you can join, like you could change it and take everything with you. Maybe. I think that's what I heard.
Joel (24:26.246)
Right.
Interesting, yeah.
Joel (24:39.974)
I think you can. I know some people have been like importing their own tweets, things like that. Yeah, I don't know. I don't know too much about it. What I know is that like the it's way easier to convince people to leave Twitter and join Blue Sky than Masterden. And like the UX is great from the start. They have a great app. It feels really familiar. It just feels like a nice version of Twitter if they fixed a bunch of their bugs and then...
Collin (24:43.627)
Mm-hmm.
Collin (24:55.434)
Yeah.
Joel (25:06.364)
basically like had no ads and nicer content and like an API that let you do all sorts of things with it.
Collin (25:14.506)
Yeah, I mean, they are VC funded or whatever. So I do kind of wonder, like, eventually they're going to have to make money somehow. And so I don't know how that's. But I mean, like to begin.
Joel (25:17.851)
Yeah.
Joel (25:24.467)
to keep running that instance, sure. But the infrastructure they're building, right, that's all open source, could be run by anyone.
Collin (25:31.553)
Sure, I just, I wonder what the plan is there, I guess is what I'm asking just because like investors do you want to see a return where Macedon doesn't have that problem. And yeah, I guess for me, if I, think I just wrote a blog post about this, but here's how I would sum it up is that, so the three are like threads, Macedon and blue sky. And I think threads for me,
Joel (25:37.19)
Yeah.
Yeah.
Collin (26:00.767)
just kind of sucks actually. It does have different people on it than Macedon, but it defaults to showing you a bunch of stuff from people you don't follow and probably don't care about. It's all, yeah, it's all algorithmics. And so that has a couple of results. One is that it will, you know, that promotes engagement bait a lot. So a lot of things is just people, you know, posing a question they know will like get people.
Joel (26:05.031)
Hmm.
Joel (26:11.524)
Yeah, and like celebrities and things. Yeah.
Joel (26:26.119)
Mm-hmm.
Collin (26:30.56)
You know, to reply or get angry or whatever. And then the second thing that it does is, you know, if you have all these like MAGA trolls or whatever in there, it will come up in that, you know, posts from people that maybe don't want to deal with trolls. It will come up in their feed though, because they are also engaging with that kind of content. And so to me, threads has some cool people on it, but it's a lot of engagement bait.
Joel (26:33.182)
Mm-hmm.
Joel (26:50.666)
Mm.
Collin (26:58.492)
It shows you posts that are really old, which is strange. like a really depressing thing was like two days after the election, seeing all the posts of people being really hopeful, like, no, we're to turn it around. Like from, like, from Tuesday, that was, that was pretty sad. And, and so I think that's, that's my issue with threads. Mastodon, I think it's that the user experience, the UX, the UI kind of suck.
Joel (27:11.504)
Mm-hmm. Mm-hmm.
Collin (27:27.897)
and not really made for people who aren't tech enthusiasts. I don't know if they're making that better now. It's not so much a problem for me because what I got once I got ivory set up, like I just don't look at it, but it is also.
Joel (27:31.519)
Mm-hmm.
Joel (27:38.921)
Yeah, and on the desktop if you wanted to use the web, there was things like Elk.zone that I used. Yeah, that's true. I used Ivory a bunch on my iPhone, but I preferred, well I always use Twitter on the web, and I liked it being, like I've always thought of it as being like a thing that lives in the web. Like I know there's been some great Twitter apps, but I liked it to be in the web browser.
Collin (27:45.49)
Yeah, Ivory is on desktop too, so I just use on both.
Collin (27:55.061)
Mm-hmm.
Collin (27:58.752)
Mm-hmm.
Joel (28:08.475)
And so this thing called Elk was pretty good for Mastodon, like you have to know how to set all these things up. And like, it just wasn't very friendly for ordinary people who aren't developers and like, I don't know. I feel like this has way better chance of beating Twitter.
Collin (28:16.863)
Yeah.
Collin (28:22.675)
Yeah.
Collin (28:28.424)
Yeah, I think the thing with Maston is that if the only people you want to follow are, you know, like middle-aged people, you know, like people like their 30s, 40s, 50s who are tech enthusiasts and programmers. I'm not saying it's everybody on there, but it's like mostly from what I can tell. If that's all you care about, it's pretty good. For me, though, I would like to also follow people. Like the thing about Twitter back in the day is it had a mix, you know, it had
Joel (28:41.525)
Right.
Joel (28:44.98)
Yeah. Yep.
Yeah.
Joel (28:57.228)
Mm-hmm.
Collin (28:58.591)
You know, had all kinds of people on it. And so you could, you know, you could be engaged in more than one thing at once. And blue sky appears to be getting more of that. The other thing with Mastodon, I mean, like I said, I'm still on both. Like it's not that hard for me to be on both. So I will. But the other thing with Mastodon is that it always felt like it's a little, it's a little behind. Like I never considered it a great sign that when
Joel (29:08.768)
Mm-hmm.
Collin (29:27.936)
Breaking news would post right that the way you found out about it on mastodon was people taking screenshots from Twitter and reposting them there. Where a lot of journalists and stuff are actually going to blue sky and so hopefully it will pop up more organically and then yeah blue sky to me just feels like Twitter if they took out all the features I don't care about and. You know and. You know and there were less there were less fascists on it so.
Joel (29:30.08)
Hmm.
Joel (29:44.172)
Yeah.
Joel (29:57.067)
Yeah, it feels like Twitter, right? Where X doesn't feel like Twitter anymore.
Collin (29:58.147)
That's yeah. It feels like old Twitter when it was fun. No. Yeah, I don't. Yeah. X or Twitter, the everything app. don't. Yeah, I haven't been on there in a long time, but I've heard it's gotten pretty bad. And I think especially Americans now are just like, you know. You know, to me, it was like Elon bought this because it's. Maybe he just bought it partially for a gag, but I also think he bought it because it's like, you know, could give him political.
Joel (30:27.437)
Yeah, yeah, obviously.
Collin (30:27.463)
You know, power. And I just think the idea that there's a billionaire who did that. And also it kind of seems like it worked. And now he's hanging out with the president.
Joel (30:36.47)
I mean, there's evidence that they changed the algorithm on a specific date. Yeah, it's crazy.
Collin (30:39.804)
Yeah. Yeah. I, I don't want to. Yeah. I think a lot. mean, I thought that basically the day he bought it and that's why I stopped using it. but it seems like, you know, two years later now, whatever, everybody sort of caught up to that. And. You know, you know, there's an Ernest Hemingway quote where he says the only ways you, you go bankrupt two ways.
Joel (30:49.902)
you
Collin (31:07.187)
I'll get it not exactly right, but it's you go bankrupt two ways, gradually and then all at once. And I kind of feel like that's what people leaving Twitter, the everything app for something is, is that it's been declining gradually in the last couple of years. And now maybe after the election and with blue sky being pretty user friendly to people who are from Twitter, it's kind of an all at once thing now.
Joel (31:12.301)
Mm-hmm.
Mm-hmm.
Joel (31:31.373)
Yeah, I mean they're getting like a million people signing up every day or something, which is crazy. Just one point, one final point, and this isn't going to be very popular on a RWBY podcast, but I have to make this point. Just in terms of just in terms of like federa- being able to be federated, what's that, federability? We can go with that.
Collin (31:35.302)
Yeah, so I like it.
Collin (31:56.594)
Sure. It's called the federal system. We have that in the United States.
Joel (32:01.72)
the federal system of mastodon, right? So, you, like social networks are very busy places, right? And I think that...
Collin (32:03.111)
Yeah.
Collin (32:18.066)
running it on the slowest language in the imaginable, the slowest mainstream language there is.
Joel (32:19.817)
Yeah, basically, right? You know I'm a fan of Ruby, like, why would you, why would you, if you want to build some software that the whole idea is that people can get this software and run it on their own hardware to like run these groups of, you know, servers of social media that all federate with each other. Yeah, you pick a language and like pick infrastructure that is going to be cheap to deploy.
and cheap to run. Like, rails with, I think it's sidekick, right? Like, sidekick is fast for rails, but it's just, I don't think it makes sense to be using Ruby for something like this. And I don't know what blue skies, it's probably go, but,
Collin (33:08.765)
I was wondering, let's look up what blue skies written in. I was thinking when you were saying.
Joel (33:13.144)
It just seems like a more pragmatic approach to something like this. If you're serious about this being a very federated thing, like, no way is the back end written in TypeScript. Yeah. I mean, it might be.
Collin (33:20.51)
TypeScript. So, no, that's gotta be the front end. Yeah. What's the back end written in? I hope not.
Joel (33:30.968)
I would bet it's written in Go.
Collin (33:32.987)
I think that would be an awesome, I feel like Go kind of seems like an obvious choice for it, but also because this isn't Go really easy to deploy because it's just like you have an executable and you can, that's the thing, like Ruby, if you're not a Ruby programmer, yeah.
Joel (33:43.172)
Yeah, right.
Yeah, you have to install the Ruby interpreter and you have to do all sorts of stuff, right? You can't just throw an executable on.
Collin (33:52.393)
Yeah, you're not a Ruby programmer, Ruby's kind of annoying to figure out how to set up. I also know this because back in the day, the package manager everybody used for iOS apps was written in Ruby, and iOS people hated that about it because they'd have to basically figure out how to run Ruby stuff to run.
Joel (33:59.066)
Right.
Joel (34:06.416)
Mm.
Joel (34:10.944)
I bet. Is this why Ruby 2.6 is bundled with macOS?
Collin (34:17.421)
No, they just bundle. mean, like, Perl and Python were in there, too. No, you could install it through Homebrew, but then if something broke in a weird way, then you had to figure out Ruby stuff to fix it. And if you know Ruby, it's not a big deal. But iOS developers on the whole did not. Blue Sky backend language written in, what is it?
Joel (34:19.14)
Okay.
Joel (34:38.266)
I reckon it's good.
Collin (34:40.924)
The back end is prime. Well, this is according to AI overview. You know, we're going to have to come back and look this up. Yeah, well, we'll come back. You know, it might be written in multiple languages, too, is another another answer. But, you know, who knows? Yeah, it was weird seeing the chart, though, because what I thought was remarkable was how much blue sky has not been catching on for the last two years.
Joel (34:47.87)
Yeah, we'll look this up.
Joel (34:56.241)
Mm.
Joel (35:09.825)
huh.
Collin (35:09.944)
of that like the growth just looked like flat basically and then this happened and it's like a straight line now.
Joel (35:13.222)
Yeah.
Joel (35:17.009)
Yeah, I mean, it reached, I don't know if they brought out new features and that might have been something to do with it. Like I'm relatively new to Blue Sky, but I wonder if it was maybe related to starter packs. I don't know how new starter packs are or something like that, but they, something that reached a tipping point where the onboarding is so good. It's, it feels so comfortable if you're coming from Twitter and
Collin (35:33.116)
Mm-hmm.
Collin (35:42.288)
Just seems like Twitter now. Yeah. It even looks like Twitter. It even looks like Twitter. I mean, their app is really... Yeah.
Joel (35:46.81)
Sorry. Yeah, it even looks like it. And it even has an algorithm, right? Like this idea of... That's the other thing about Mastodon, right? There's no algorithm. So you're just looking at posts as they were posted. And like, that's actually not a great experience. Certainly isn't for me.
Collin (36:05.628)
I, yeah, I actually do. I mean, I want the option to turn it off when I don't want that, but I actually do want an algorithm basically to be like, you know, you're, cause I have friends in Europe and I have friends in Australia. If it's only ever, I will never. Yeah. Like I will never see, you know, Tim's posts or whatever, you know, or Marco, because they're there on the, you know, halfway across the world. And so I just won't see those.
Joel (36:20.92)
Mm-hmm. Yeah, you want to see their stuff surfaced
Joel (36:28.403)
Right.
Collin (36:35.599)
And so I actually do, yeah, I actually do want an algorithm. I don't want it to be like threads, but I want it to be like from the people I'm following to be, to show me stuff I might've missed, which is what Twitter used to do.
Joel (36:45.969)
Yeah, and in Bluesky, you can pick from different algorithms. Yeah, so I have my following tab, which is my default, and that's essentially the same as a Macedonian feed. And then I have this feed called Only Posts, which is like, it's not like Only Fans. It's basically,
Collin (36:49.433)
That's wild.
Collin (37:03.57)
Mm-hmm. Only posts.
Joel (37:11.385)
only posts. It doesn't include tweet, quote tweets, doesn't include, yeah.
Collin (37:14.555)
I think it's the way you said it. You didn't say, I have one called only posts. You said, I have one called only posts. You know, I think it's the way you said it that made it funny. Yeah.
Joel (37:21.645)
Ha
that was so unintentional. Yeah, so, but no, it's actually a great feed. It's really good. You should check it out. It doesn't include likes or retweets. It's just posts from people you follow. Like when they're actually posting something, that one's great. And then I have popular with friends and then discover, which is like their kind of built-in algorithm, which is actually pretty good. Once you follow a few people,
Collin (37:28.165)
So it's no reposts or anything. Yeah, yeah.
Collin (37:35.738)
Mm-hmm.
Joel (37:53.087)
who are kind of like interested in similar kinds of things as you, it actually gets really good.
Collin (37:58.842)
I think mine is similar. think I have popular friends. have mutuals, which I don't use as much, but I think I have those. have, but then there's also like topic specific ones. So I have like film photography is one. And then so, and so it's been cool is it's actually been better than Twitter ever was in this way of that. I I'm connecting with like.
Joel (38:11.508)
Mm.
Collin (38:21.115)
I'm connecting with all my Ruby friends and Swift friends because I can follow those as lists and I can, you know, and I just know people. So we just are finding each other. But then I'm also been connecting with a lot of these photography people now, because, know, we'll like comment on each other's stuff, which Twitter never did that really. So it's actually, I forgot to say, I think one of the other things with Maston is it seems like they've been really
Joel (38:24.617)
Mm-hmm.
Collin (38:46.937)
I don't know if it's slow to or just not interested in adding really good discovery features, and I think Blue Sky has a lot of really good discovery features. Anyway.
Joel (38:56.178)
Yeah. That's the trick. Like you need to get people in and get them to find value in that platform. If you, if you arrive and you feel like there's no one here, this isn't for me, like you could leave immediately. And I think that's like what happened with the Ruby community is it reached a point where people are coming in, they're using the Ruby on Rails or Ruby on Rails starter pack. And
Collin (39:16.717)
enough people there.
Joel (39:26.057)
like just immediately finding there's some really cool stuff like people talking about really cool topics that I care about and that for me is what Twitter is.
Collin (39:34.862)
Yeah. Is your friend DHH on Blue Sky yet or is he going to be on Twitter forever? Yeah. I kind of feel like maybe he'll just be on Twitter forever. It kind of feels like I'm not trying to make a value statement there. Just it seems like the place that he would be. But if all the Ruby people move, I don't know. Maybe, maybe not. Really doesn't matter to me. I probably wasn't going to follow him anyway.
Joel (39:39.56)
I don't think so. I don't think so.
Collin (40:04.055)
But Marco's there, you're there. That's pretty good. That's enough for me to be there. Anyway, all right, moving on, because that's a lot of talking about Blue Sky. You released Literal 1.0.
Joel (40:17.972)
Yes, I did. Yeah, so this is, I can't remember where I was at. Like, it so long ago, I can't remember where I was at. So I'm just gonna pitch you the whole gem from scratch. And so basically, literal is a Ruby gem for... Okay, so it's basically, it's really hard to describe. It's trying to...
Collin (40:19.598)
Tell me about it.
Collin (40:29.796)
Yeah, okay.
Collin (40:45.784)
It's like if you took Swift and then made it a Ruby gem.
Joel (40:47.64)
That's right. So it has a few different modules. The main thing is if you want to get a bunch of value of kind of like static type checking without actually doing static type checking, then you can do runtime type checking.
And that is where you're actually going to have your runtime check types at runtime for you. And there are some advantages to this. There are some disadvantages to this. You don't get anything like as much coverage as you get using something like TypeScript or probably Sorbet with Ruby gives you similar kind of thing. But to me, Ruby is a very dynamic language. I don't think you can really tame it with static types.
I'm sure you can, I know that there's been tons of effort at Shopify to do this with Sorbet and I think Stripe did something similar. checking types is a really great way to not only validate your assumptions, but also just to document your code better, right? So the way that Literal works is you're gonna declare the properties of
of each of your classes at the top of the class, instead of defining an initializer, you define props. And you say, so you'd say like prop and you give it the name of the property. So you might say prop first name string. And literal will generate some code. It will generate an initializer that takes first name as a keyword argument.
and it will set it to the instance variable first name, but it will also do a type check. So whenever you initialize that class, it's going to call the triple equals case equality statement on string, which happens to return true if you give it a string and false if you give it anything else, as far as I can tell. As you'd expect, yeah.
Collin (43:09.856)
As you'd expect, yes.
Joel (43:13.017)
So this also means that you can consider anything in Ruby, any object that responds to triple equals with a truthy or forsy value, which is basically every single object in Ruby, you can consider that to be a type. So we think about some basic ones, things like string, integer, numeric. If you give them
Joel (43:45.483)
they will check that the objects you pass them are instances of them. So you can pass a string to the string type and it will check that it's a string. But also strings themselves are types, right? So the string, the actual string hello is a type. If you triple equals compare it to the string world, then it's gonna be false. But if you triple equals compare it to the string hello, then it's gonna be true.
And there are other types like ranges. So a range essentially aliases triple equals to cover. So if I have the range like one to five and I triple equals compare it to five, it's gonna come back true. But if I triple equals compare it to six, it's gonna come back false. So this all happens at runtime. It's native, it's like built into Ruby. It is...
how case statements work and essentially what literal does. Yeah, yeah, and pattern matching. What literal does is it just says, yeah, we should. Yeah, that would be great. It just says like, I'm gonna check your types like this. And so, yeah, it gives you better documentation as well because at the top of every file, you've declared all of the instance variables as well as...
Collin (44:46.529)
Like pattern matching.
Yeah, we should do an episode on pattern matching.
Joel (45:13.329)
what types they are. if I have, if I say article, prop article, and I pass it, you know, capital A article model, it's gonna raise an error if I try to create it with a post or a comment, but if I create it with an article, it's gonna be successful. But I can also, if I have Ruby LSP, I can just command click in my editor to jump straight to that model. So it gives you much better code navigation.
as well.
Collin (45:45.22)
And you can also do, I forget what you call them, but you can also define interfaces slash protocols, right? Where you can say like, it has to conform to this kind of duct type sort of thing to say like, it has to implement these and then that is a kind of thing. And so you could have multiple of your models or whatever do that.
Joel (45:51.376)
Right.
Joel (45:57.252)
Yeah. Right.
Joel (46:05.402)
Yeah, so basically, if you think about a type as just being an object that responds to triple equals, you could define a generic type as being a method that takes the parameters of the generic and returns a concrete type object that will check your type, right? It just needs to return an object that
response to triple equals. So if you could imagine, say I wanna have a generic array type. So I'm gonna call the method array and I'm gonna have it return an object that, so I'm gonna call the method array and I'm gonna pass it the type that I want each item to be. And that can just return a proc that receives a value and checks that it's an array and then iterates over
the array and checks that each of the items in the array are also matching the type that you parameterized this with. So now you basically have this concept of a generic, but at runtime in Ruby using nothing but methods. And literal has a bunch of these built in. So it has things like array. The one that you mentioned is interface.
Collin (47:31.712)
Yeah, you have an enum type, enum.
Joel (47:32.548)
So yeah, so it's just a generic, it's a method. It's called underscore interface with a capital I. And if you pass it a, you just pass it a list of symbols and it will be, the type that it returns will match if the object responds to the methods for those symbols. So there's a ton of these, there's like,
parameterized, innumerable floats, integers. Parameterized integers are quite interesting. like, why would you parameterize an integer, right? You're not gonna be specifying that it's signed or unsigned. In Ruby, that doesn't really make a ton of sense. Well, you can parameterize it with any other type. So the underscore integer generic type that takes any other type,
you could parameterize it with a range. So I might say underscore integer, and then I pass like 13 dot dot, right? And now I have a type that can validate that this thing is a number that is 13 or over, right? I can use this as an age validation. So like, it just means that you can kind of compose these things together.
really easily and there's, don't know how many there are, there's like a whole bunch of these built in and they're pretty well documented. And all of the built in generics, they have been designed and checked to do no runtime allocations as well. So creating them, you would typically do at boot time because everything usually happens on the class level when you're defining properties. But then if you have one of these types,
which you can also just assign to a constant. When you actually check the type, there are no runtime allocations. So they're very fast.
Joel (49:39.847)
Yeah, it's pretty cool. So that's like types and properties. properties are also... you're trying to trigger the...
Collin (49:40.628)
Incredible.
Collin (49:55.189)
Sorry, I did it once and then I wanted to trigger the animation. I forgot you could do that. Sorry, types and properties are...
Joel (50:01.004)
That's right. Yeah, so properties, I mentioned a few ways you can use them, but you can also, when you're defining the property, you can specify, does it have a reader? Does it have a writer? Does it have a predicate method for it? And you just specify like reader, public, writer, protected, something like that. And it's gonna define those. And if you do writer, then the writers themselves are also gonna do that.
type check and it's just gonna generate all this code. So everything's pretty fast. The other thing that we have are actually before that, I'm gonna get to the feature that I'm working on right now. So let's say I have a class and it has a property that takes like, I don't know names. It's an array of strings.
Collin (50:45.395)
Okay.
Joel (50:59.335)
If I take, like, if I do that type check, right, it's gonna have to look at every single item in that array at runtime, at least once. If I pass that around to other classes that have this same type check, that is kind of gonna be inefficient. It's gonna be checking every single item in that array of names every time you pass it around. So this doesn't make loads of sense. Also,
Although you've type checked that this array only contains strings when you received it in your initialize array, the array might well be mutable if you haven't included frozen as part of your type check. So there's nothing to stop you from pushing an integer into this array that you had previously checked was an array of strings. So the thing that I'm working on now is to have like
Collin (51:51.55)
Mm-hmm.
Joel (51:58.471)
actual objects for collections. So we'll have a literal hash, literal array, literal set, and you parameterize creating these objects with the type, and they will ensure that anything that you put in them conforms to that type check. So I could have, I could create a literal array of integers as an object, and now I cannot push strings into it. It's going to raise an error.
if I try. And the nice thing about this is you can pass them around and you don't need to recheck, right? They guarantee that everything inside them conforms to this type. If you map them with like a map bang mutation, they're gonna have to stick to the same type.
Collin (52:29.644)
Yeah, makes sense.
Joel (52:57.964)
If you need to map them to something else, then when you call .map, you need to pass in the type that you want to map it to. And it's not going to mutate the original, it's going to create a new one. So once you have one of these, you are safe to assume that it will always be whatever it is, an array of strings. So yeah, this is really useful. the other thing that I'm working on kind of related to this, so trying to mirror
the API of array like Ruby's built-in array in the literal arrays, things like concatenating two arrays together, right? If you have your literal array and you have another literal array and you're trying to concatenate them, it's possible that the types are compatible with each other such that you shouldn't need to type check.
Collin (53:53.624)
huh.
Joel (53:56.292)
everything on the right to make sure it conforms with the type on the left. Right? So if I have a literal array of numerics and I'm trying to concatenate in a literal array of integers, then I shouldn't need to check that all of the things in my literal array of integers are compatible. I should just know that because I know that integer is a subtype of
numeric. So the other way makes sense. Yeah, it should fail. It should fail, right?
Collin (54:27.357)
What happens if you do it the other way?
Collin (54:32.636)
Does that fail?
Yeah, if you tried to put the numerics into the integers, that should fail, but the other way it should work. OK.
Joel (54:40.644)
Right, exactly. Yeah. And it should fail immediately without having to check, right? Because it can make assumptions about the contents of these literal arrays.
Collin (54:48.144)
Yeah, can just, you know that the arrays do the thing they're supposed to do. So you, all you have to do is check the types that they're supposed to have, and then you can skip, you know, that whole other thing.
Joel (55:00.11)
Exactly. So the built-in kind of like module types already implement an interface like less than, equal to, greater than, so that you can compare them to see if one is, like, is integer a subclass of numeric? Yes, it is. That one's easy. The thing that I'm now working on is all of these generic types that we provide.
How are they comparable? And they're pretty complex, some of these types. It's amazing what you can do at runtime, right? I call it types, but you could almost think of it as validation. There's a type called constraint where the positional arguments given to this generic are like type constraints.
all of them have to match, it's like an intersection. But then if you provide keyword arguments, it's going to use the symbol of the keyword argument to call a method on the object, and it's going to check that what comes back from calling that matches the type that you passed in. So I could have a constraint that was array, size 5.10. And it's actually going to call the method size, and it's going to check
that it matches 5 dot dot 10. So that means that for me to check that that type is a subclass of or a subtype of the same one but like instead of five to 10 it's like three to four. Is that true or false? Well we know that three to four is covered by five to 10 so we can say that the the one with the size three to four
must be compatible with five to 10. So yeah, the thing that I'm kind of working on right now is trying to build up these comparisons between all of these generic types so that they pretty much can avoid any kind of kind of O-N like type checks when you're doing these kinds of like concatenating and that kind of thing. And it's going pretty well.
Collin (57:21.488)
Mm-hmm.
Joel (57:26.139)
It's actually pretty much recursive, right? You just have to look up, for that example with the size, you have to check that the other type has a size constraint, and then just have to check, is the size constraint on this other type a sub-type of, or equal type to the one that I am? Does that make sense? I'm kind of rambling.
Collin (57:53.529)
I I think I followed everything there. There's a lot. Yeah, this is all inside baseball.
Joel (58:00.284)
Well, hopefully no one will have to really think about this too much, right? This is just... Ultimately, this is a performance optimization.
Collin (58:08.145)
What would you say for inside footy? I don't know. But this is all kind of inside baseball kind of stuff for implementation. That all sounds great. And so now you're at 1.0. So I guess that's just the culmination of you got all the stuff in that you wanted to call it 1.0, which is all the stuff we just talked about and probably some other stuff.
Joel (58:11.207)
Yeah.
Joel (58:20.2)
Mm-hmm.
Joel (58:25.642)
Yeah, No, it's not. So it's properties and types and generics, but it is not these new collection types array, literal array. Yeah, that part I'm still working on. And it's also not, it's kind of like variance comparisons. A couple of other features that did make it in though are enums, which I think we have talked about before, but they have gotten better.
Collin (58:38.273)
not that part, yeah.
Collin (58:45.774)
Mm-hmm.
Collin (58:51.856)
Mm-hmm. Yes.
Joel (58:56.047)
and flags is now in there as an experiment, which is basically bit flags, which is really useful if you use Postgres actually, because you can actually use bit flags as database columns. Anyway, yeah, they'll be celebrating for bit flags. I love bit flags. I think they're amazing. this just adds like a nice Ruby interface.
Collin (59:11.982)
Yeah, the C programmers in our audience will be very, very familiar. Yeah. Yeah, it's useful. So you can say like this and this or whatever, this or this XOR. Yeah. We'll leave it as a.
Joel (59:25.641)
Yeah. Yeah. But you can like treat them kind of like they're a hash of Booleans, if that makes sense. Yeah. But the literal enums, the main thing I want to highlight on this is, which kind of like this started out as its own gem originally, and it was very different to this. The main difference with this implementation
Collin (59:32.098)
Mm-hmm. That's exactly what you can treat them like. Yeah. So yeah, so.
Collin (59:41.07)
Mm-hmm.
Joel (59:55.563)
is the interface is changed ever so slightly such that LSPs, when they look at it, they can see that you are creating a constant for each item in the enum and that you're assigning it to a new instance of the class of the enum, right? You literally say like red equals new one or something like that and
What's nice about this is you can add a comment above each item in your literal enum. And then somewhere else when you're using that enum, you're gonna get, you know, auto-complete from Ruby LSP and it's gonna show you that comment. And you can even include, I found this out the other day, you can include markdown in those comments. So one of the enums that we're doing from your P,
which is a framework that I'm working on with Steven, is for HTTP statuses. And when you look up an HTTP status, it will give you basically documentation for that status, a link to the MDN docs that you can click on in your editor, as well as like the code and other details. And so it's like, it's incredible. And it's so easy to make these because like the interface is just really nice.
Collin (01:01:10.168)
Incredible.
Collin (01:01:18.115)
That's great. I'm sure we've said it before when we talked about literal before, but I do think it is a really cool part of Ruby that you can essentially implement a statically typed language on top of it. And it still sort of looks like Ruby. it's not, you know, it, it, it doesn't, if you're not junking everything up to an insane degree, like it just, you know, it's just Ruby stuff and that they, you know, that it does that in such a clean way with, know,
Joel (01:01:31.573)
Right?
Joel (01:01:35.244)
Yeah.
Collin (01:01:47.833)
how it handles blocks and stuff.
Joel (01:01:50.957)
Yeah, it's also this, like you said, I think you're famous for a quote, something about inside every Ruby gem, there's a, there's a classy.
Collin (01:02:02.891)
yeah, what is it? Inside every Ruby gem there's some inside, there's some crazy like exec thing or whatever it's called. There's some, yeah, there's some crazy eval where it's a giant string. Yeah.
Joel (01:02:11.644)
Yeah, evil.
Joel (01:02:16.757)
Yes, yes. It's the same thing. That's all these gems are.
Collin (01:02:20.239)
Certainly inside every Joel Ruby gem. Yeah.
Joel (01:02:24.521)
Right, I have really embraced this idea of using methods which are kind of designed to look like constants.
which is interesting. is also, I don't know if we've talked about flex kits on the podcast, but this is how flex kits work as well. Like you literally call a method that from inside your component in flex. And so like you might call the method card, but with a capital C and that method is going to automatically find the card component by the constant name card. And it's going to render a new instance of it.
Collin (01:03:11.33)
the question.
Joel (01:03:11.476)
I'm just really leaning into pretending things are constants because also in Ruby you can call methods with colon colon which you would normally use instead of to call a method to separate parts of a module namespace.
Collin (01:03:30.85)
I have a flex question. I'm afraid this will get us onto a long tangent. So if it will, we can come back to it another time. But so where are you on the state with flex of I thought I saw you make a blue sky post maybe a sort of about this, but also I could be imagining it. Where do you land on the idea of if you're creating a new Rails app and we're not going to use a front end JavaScript framework.
Joel (01:03:33.103)
Okay.
Collin (01:03:56.78)
Are you on mixing in flex as components or are you on everything's flex? Okay.
Joel (01:04:03.873)
Everything is flex. If I'm going for purely server-side rendered, I like everything to be flex. You render a flex view directly from the controller, and then it renders components inside it. Even I like to think of the layout as just being a component that the view renders. It's just that views typically will render a layout first and then put things inside it.
That's how I build Rails apps now. It's how the framework that I'm working on with Steven Margheim is also kind of like set up by default is it's gonna be using FlexViews directly from the controller and then.
they just render other components. It's so much faster to do this because there's actually quite a lot of overhead in adapting Flex to be used from outside of it. So like if you render a Flex component in an ERB view, it will yield an interface that is like specifically wrapped for use in ERB. Because the natural way to use Flex from ERB,
Collin (01:05:04.835)
Mm-hmm.
Joel (01:05:21.531)
is that when calling a method would normally have pushed some HTML to the output buffer, you actually want it to return the HTML as a string, as like a, I think they call it an Active Support Safe Buffer, because you want to actually put it into the % equals output tags that you get in ERB. So actually when you yield,
a when a flex component yields its own interface, it specifically wraps that in a decorator that will make sure that when you call a method on it, it will capture so it doesn't output anything kind of behind the scenes sneakily, it will capture the output and then it will return that to you as an active support safe buffer instead. So it does add overhead to not use flex the whole way. Yeah.
Collin (01:06:13.973)
Right. Okay, well that's an easy answer then. Nothing has changed. I don't know, is there anything else we want to touch on? I don't have anything else.
Joel (01:06:16.998)
Yeah.
Joel (01:06:22.266)
I mean, there's so much we could talk about. I want to talk about my adventures with Svelte. I think that would be a super interesting topic. Spoiler alert, Svelte has kind of changed my attitude to single page applications quite a bit. And I have more thoughts to share about that on a future episode. Yeah.
Collin (01:06:29.101)
Mm-hmm.
Collin (01:06:44.673)
Let's do that one next time. We'll do, we'll do spelt. I'll read about spelt. so I'll know something you're talking about. and, yeah, I think we had like five other ideas and trying to get some new guests. So I don't know.
Joel (01:06:56.262)
Yeah, we should also talk about some of the upcoming stuff in Yippee, because that is... that's going to be amazing. I'm so excited about that. I did a... I recorded a video kind of demonstrating the router. Or... I have to say router, because otherwise I get confused over the router. Yeah.
Collin (01:07:07.188)
We've got so much.
Collin (01:07:12.887)
Mm-hmm.
Collin (01:07:17.409)
The router.
Collin (01:07:24.481)
the router.
Joel (01:07:25.596)
The- the- the Ruta. The Ruta.
Collin (01:07:27.201)
The router, okay. I'm so confused right now. Yeah. So the router is, we're to talk about that. We're going to talk about Yippee. We're going to talk about Svelte. I'll think of some things to talk about as well. And yeah, I think that's it. Yeah, we'll figure that out. Okay, well, thanks everybody. Thanks Joel. Thanks me. We will see you next time.