![39: I Just Want Some Structure Artwork](https://www.buzzsprout.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCT1d3d0FRPSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--c77eddce96213b3ef7530df31ebf6215d56a4e56/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDVG9MWm05eWJXRjBPZ2hxY0djNkUzSmxjMmw2WlY5MGIxOW1hV3hzV3docEFsZ0NhUUpZQW5zR09nbGpjbTl3T2d0alpXNTBjbVU2Q25OaGRtVnlld1k2REhGMVlXeHBkSGxwUVRvUVkyOXNiM1Z5YzNCaFkyVkpJZ2x6Y21kaUJqb0dSVlE9IiwiZXhwIjpudWxsLCJwdXIiOiJ2YXJpYXRpb24ifX0=--1924d851274c06c8fa0acdfeffb43489fc4a7fcc/Rooftop%20Ruby%20-%20RGB%20-%203000x3000.jpg)
Rooftop Ruby Podcast
Two Ruby programmers (Collin Donnell and Joel Drapper) discuss Ruby, web and native software development, technology, and more.
Rooftop Ruby Podcast
39: I Just Want Some Structure
Exciting News! We're both unemployed! Someone hire us 🥺 You could even hire both of us—a dream team for hire, you might say.
This week, Collin accidentally deletes his Application Support folder on his Mac, and we talk Xcode, text editors, and Difftastic.
Joel goes in-depth on Tree-sitter and writing a SQLite parser. Plus, we discuss task management apps.
Follow us on Mastodon:
Show art created by JD Davis.
Joel (00:01)
feel like I might be quite low energy today. But I'm usually obsessively high energy, so...
Collin (00:03)
That's okay.
Very high energy. We call you, call you high energy. Sorry, I was trying to, I was coming up with my Trump nickname for you. It's high energy Joel. You know, I think, was it low energy, low energy Jeb or whatever, low energy Jeb, little Marco. I'm trying to think of what else he called people. But, you know, the worst part of him, no, it's not the worst part of him winning.
There's a lot of worse parts, but a part that I only realized the other day is I've got at least four more years of having to hear everybody's shitty Trump impressions.
Joel (00:43)
Yeah, totally.
Collin (00:45)
It's like by far not the worst part actually, but it's a thing that I thought of. Since the election, I basically, I check Apple News and maybe a couple other things like once or twice a day, but I've made a real effort to not have to see or hear him because I...
Joel (01:09)
makes you angry.
Collin (01:11)
makes and it just I just don't like it. I it's I put it this way. So at the one of the few things I saw of him was at the inauguration party, whatever a Marine there's a giant cake and a Marine hands him a sword or a saber. Saber is a kind of sword, but a Marine hands him a saber and to cut the cake and in my mind.
Joel (01:12)
Yeah.
Collin (01:40)
You know, a saber, a sword, it's a it's a deadly weapon. You handle it with respect. You know, you're doing a very, you know, this is a presidential thing. You treat it with respect. Instead, he starts like dancing around with it, doing his old jerk off dance. He does that's because he looks like he's anyway doing his old jerk off dance that he does with the sword. And I just realized I'm like.
You know, even if he wasn't this person who causes all this grief in the world, I just find everything about him distasteful. You know, like, like who does that? Who acts that way? So, so it's been a pretty chill couple of weeks. Yeah. Yeah. Doesn't seem.
Joel (02:25)
I mean it's because he's a narcissist. That is it. Like that's how
that's how they act. Like self-obsessed and completely out of touch.
Collin (02:38)
Dancing
with swords, doing what not. Yeah, no, he just seems like the worst. yeah, I also realized that the thing about watching like television news or things like that is that you really don't need to listen to everything somebody says who's a liar because they say lots of things. So just following like the news, I'm more interested in what they do than what they say. He says lots of things. don't like, do they want to?
Do they want to make Canada the 51st state? Probably not. Or are they just saying that because, you know, it distracts us from all the horrible stuff they are doing when they say absolutely insane things like that. Or maybe they do, but, you know, there's better ways to keep up on that. Anyway, new president or whatever in the UK. I you don't have a president.
Joel (03:31)
We don't have a new one in the
UK. Also, yeah, we don't have a president.
Collin (03:36)
Mm-hmm. Mm-hmm.
Joel (03:42)
I don't think like...
We have a prime minister, but it's not an equivalent.
Collin (03:49)
Yeah, so here are what is our head of state and our head of the government are the same person. They're both the president. And in the UK, you have the head of state who I guess is the king. then you have the president who or you have the head of the government who's the prime minister. But also you don't elect a prime minister, right? You elect a party. So, you know, it's different.
Joel (04:03)
I mean, yeah.
Collin (04:17)
kind of seems like a better system, like a parliamentary system in a lot of ways. And I think my evidence for that is that every democracy the United States has set up, has helped like set up, right? We've never set one up that works like ours. Right? Like if it was the best way to do it, we would, you know, we would not set up all these other governments that we hit, you know, like Japan or Iraq or whatever, when we're trying to, you know, help them.
Joel (04:33)
Interesting, yeah. Yeah.
Collin (04:46)
set up their government, we would encourage them to do it exactly how we did it. But we have not done that. We set them up with more like parliamentary systems, because guess it's anyway. So, so lots going on over here. Oh, and I turned 40. I had my birthday. So big, yeah, big news. So I feel about the same, honestly. It's roughly the same.
Joel (05:06)
Yeah, happy birthday.
Yeah.
Collin (05:16)
so, I didn't really do anything. I'm kind of waiting for the weather to get better and then do something. so, I don't know. We both, we, we both got what, what's the euphemism you say in the UK? You were made redundant. We were both made redundant or whatever.
Joel (05:22)
Mm-hmm.
Yeah, I don't... there probably are Britishisms, but none are coming to mind right now.
Collin (05:42)
That's always the Britishism I hear is made redundant. We don't say that. We say you got fired or we say you got laid off. And I think fired kind of implies that you did something and laid off means that you were made redundant, they're just letting you go.
Joel (05:46)
really?
Okay.
Yeah.
What
do you call it when they say you're redundant, but it's actually not at all related to that?
Collin (06:06)
You always say you got laid off, actually, because you don't want to say you got fired. You wouldn't be like, here's the thing. I really fucked up at the last thing I did. so, I mean, if I ever got fired, I would say I got laid off. But I assume that's what people do, though. Yeah, say laid off.
Joel (06:22)
Okay.
Collin (06:33)
So the point here is that people can hire us right now, so they should reach out.
Joel (06:37)
Yeah,
the rare occasion that we're both looking for work.
Collin (06:43)
You could hire both of us. could hire one of us.
If you hired both of us, could be, you could just hire us to do this. You could just, you could just hire us to like, you know, talk on a zoom call all day while you're, while you're like, you're working. Like it's just in the background. Uh, honestly, I'd be great. I'd be, I'd be great as like a brand ambassador. Um, I could put like, it'd be like F1 or something. I could put like patches on my, on my jacket. Um, but.
Joel (06:50)
Hahaha
You
Yeah.
Collin (07:11)
Yeah, you can hire one of us, can hire both of us. I'm looking for contracting or full time or whatever. you know, reach out. We're both on Blue Sky. We're both on, well, Joel's mostly on Blue Sky, but I'm on Macedonia and Blue Sky.
Joel (07:27)
I'm on Mastodon as well, I just don't use it very much. It's just too much, I think I'm probably going to try out a few other cross-posting apps at some point, but right now I don't have the headspace for two social media platforms.
Collin (07:29)
Yeah.
Yeah.
Yeah, I use Micro.blog, which is nice because it shows you your replies from all the services. It aggregates all of them. So that's why I use it. And also the cross-posting works pretty well. So that's what I do.
Joel (07:48)
Yeah.
yeah, yeah, that's nice.
I may have said this before, but I've replaced Twitter with, I would say, like 50 % Discord, 50 % Blue Sky.
Collin (08:14)
I gotta get on some better discords then, because maybe you can send me some. Because...
Joel (08:19)
Yeah, I mean,
are you on the Naming Things Discord? Yeah, you should join it. It's really good.
Collin (08:22)
Maybe. We'll look. Yeah,
I just always want, feel like it's because have Slack and then I have that. It's like two things, you know, now I'm running two electron apps. So like my computer is probably going to light on fire. No, I know. But it's, I mean, I kind of feel like Discord started as a gaming thing. So it always kind of feels like a gaming thing to me. And then.
Joel (08:35)
Right. It's not as bad as Slack.
Right. Yeah.
Collin (08:49)
Slack started as a business thing, so it always kind of feels like work to me. Like, they've never, like neither can fully shake that or if they even want to. But yeah, like they're similar, but also very different.
Joel (08:53)
Alright.
Yeah.
The nice thing about Discord compared to Slack is because it started out as like a gaming thing and it's like typically used for these really big open communities, they have very good like moderation tools and anti-spam stuff built in. Whereas like Slack...
Collin (09:15)
Mm-hmm.
That's cool. I don't think Slack
really has that at all.
Joel (09:28)
Right, so Slack is designed for businesses and you're that's just not a problem that they have to deal with Like a psych just really isn't designed for it. So you can use slack for like community Things but I just wouldn't recommend it at all Because like get people coming in just posting links to things and then disappearing
Collin (09:47)
Yeah, that makes sense.
Yeah, that makes sense why... Yeah, I hadn't thought about that but I think that does make Discord a lot better fit for like community type things. Also I always feel like, I think they've tried to fix it over time but the whole way like accounts work on Slack has always felt very like bad to me.
Joel (10:01)
Yeah.
Oh yeah. Yeah, you
create a brand new account every time, but you also are able to log into all of the accounts from one account somehow. And like, yeah, it's, it's, feels like they're patching over some legacy design fault. And like you, when you try to switch between, I don't know they still do this now, when you switch between different slacks, like from, from your work slack to like a community slack. Uh, I remember it would often like completely refresh.
Collin (10:17)
Yeah, there's clearly like some...
Yeah.
Joel (10:41)
and like completely re- reset the application and like initialize everything again you'd start with a blank, a blank screen. Really weird.
Collin (10:49)
Yeah, so Discord definitely
works better for that. I feel like maybe the reason is because it first started like so much as business thing that they were like, you'll have your email from your employer and like if you had multiple, you'd have multiple emails and they, I don't know, I hate it. I've always found it very confusing and I get in a situa- it's gotten better, but it's still, I still get into situations where I'm like, all my slacks aren't in one place and I have to log into something and it's super annoying.
Joel (10:58)
Mm-hmm.
Yeah.
Collin (11:20)
Um, have you done any programming recently?
Joel (11:23)
Yeah, I have a bit. there's not really loads to show. The two things I've been working on recently, the first one... Yeah, exactly. Well, know what I mean is like, it's pretty low level, so...
Collin (11:34)
It's an audio medium, Joel. There's nothing to show. There's never anything to show.
Yeah, yeah.
Joel (11:45)
We're, so we're trying to build this framework, YIPPY. And one of the things that we wanna put in this framework is basically like our ORM, Object Relational Mapper, Database Migrator, and like querying tools for querying the database. And...
Collin (12:11)
Mm-hmm.
Joel (12:15)
In order to do a really, really good job of it, basically in order to do the kinds of things that we want to be capable of doing, actually let me backtrack it a little bit. So you've probably heard of Active Record.
Collin (12:34)
Heard of it.
Joel (12:35)
Active Record really embraces the idea of treat your database like a dumb storage layer and basically don't use any database specific, they kind of softened on this view over the last few years, but don't use any database specific features. All of the logic lives in your application and you just, you know, store and retrieve things from the database essentially.
Collin (12:55)
Mm-hmm.
Yeah, I would kind
of describe, I mean maybe because I wasn't doing it as many years ago as you, I would kind of describe Active Record as being sort of in the middle on that. Like you can do that, you can just like give it a sequel query and like...
Joel (13:11)
Yeah.
they've,
I think, gone a lot more towards enabling access to some of the more complex right, because people need them. So we're kind of... We want to obviously give you simple interfaces when you're trying to do simple things. That's important, and I think Active Record got that really right.
Collin (13:23)
Because people want it.
Joel (13:43)
But sometimes you need to do more complex things and databases have a lot of capability that you can access through SQL. Also, in order to fully understand the shape of your database, we need to be able to look at the dump of your schema.
and kind of interpret like all of the rules like these are all your tables these are all the columns these are all the rules associated with those things and and Rails sort of does this and the way that Rails does it is quite limited they use some regular expressions it is not very accurate but because they're typically generating the SQL themselves
They can do a reasonably good job of it. But we decided that we wanted to have like this kind of foundational capability that we could build features on top of which was that we could perfectly understand all valid SQLite flavor SQL. Like perfectly. There shouldn't be any valid SQLite SQL that we don't understand.
and conversely there shouldn't be any invalid SQLite SQL that we think is right, know, think is one thing maybe when there's actually an error in it. So we're building a SQLite parser and it's a big project, it's quite a lot of work. We...
Collin (15:35)
using like
the sequel light ruby gem or whatever to introspect and
Joel (15:38)
Yeah, so it's called
Plume at the moment. think... I don't know if that name is going to be permanent, but I quite like it, but we're looking at another potential name. yeah, so Sequelite itself, doesn't have a distinct, like, separate parser library, and it doesn't...
It doesn't have like, you might imagine that it has a parser that builds an AST and then, you know, another separate thing that works with that AST. It's not really like that. It begins to interpret and execute the sequel as it's parsing, which is amazing. Like it's really...
Cool design. Yeah, it's like a performance thing, I think. It's incredible. Piece of engineering.
Collin (16:36)
kind of kind of a flex approach.
Yeah, that's what I was thinking
when you said it. was like, when you were saying they'd build an AST and they'd do whatever. I'm like, definitely aren't doing that because I know speed is such a big thing with them.
Joel (16:47)
Yeah, that sounds inefficient.
Right, yeah exactly. there isn't a library that we can depend on for this. So what we're doing is we're experimenting by executing SQL queries, but we're also looking at the documentation and we are looking at how this parser is written in the SQLite C code and trying to convert it to...
a recursive descent parser written in pure Ruby. And the parser in C is also a shift-reduce parser, so it's quite different. It's not like we can...
Collin (17:36)
Explain the difference between those two.
Joel (17:38)
I... so a shift-reduce parser way I understand it and I'm very new to the world of parsers but I'm probably gonna completely botch this up so please write in and tell me and run.
Collin (17:50)
Sorry, I feel like I just did when you
see somebody on TV and they're complaining about critical race theory or whatever and they're like, how would you define critical race theory? And the people are always like, or how would you define socialism? And the people are just like, well, it's a lot of things. Sorry.
Joel (17:59)
Yeah.
Yeah, okay, so basically, imagine you have a list of tokens, right? You've already done the tokenization step. So the way I understand it, a shift reduce parser has, it has a stack and it takes, it basically has a loop.
where it will shift from the list of tokens and put them onto this stack. And then depending on which case statement matches the stack at that point in time, it will either reduce the stack
So it might have like three tokens and it reduces it down to one token.
or it will shift something off of the stack.
Collin (19:15)
So does the reduce mean, sorry, think that's everything. Does the reduce mean like, for example, if you had a, yeah.
Joel (19:22)
If you had create table, I think
maybe is a simple example, though it's probably not implemented like this, but imagine you had the token create followed by the token table. So you would have a rule that says if I see create table in my stack, I can reduce that to a single create table.
Collin (19:33)
Mm-hmm.
Because create can also be something else. Table can also be something else. OK, that checks.
Joel (19:44)
right could be create yeah exactly
that is roughly how i understand shift reduce parser to to work and so it's i think computationally it's very simple right because you're just working with these very small loops and whatever but actually to get the to get the like precedence of each of the cases right is quite tricky and i think
Typically shift-reduced passes are usually generated rather than written by hand.
Collin (20:18)
This is like what you would get if you used Bison or whatever or Yak on the command line. It sounds familiar.
Joel (20:22)
Right. Yeah.
So that's my attempt to try to explain what I currently think that a shift-reduce parser is. I might be slightly off.
Collin (20:31)
Mm-hmm.
Joel (20:39)
The like our parser is quite different. We are basically like, we're consuming a token and then we're moving into a different state by calling a different method, right? And then that method is gonna consume some tokens and then move into a different state. Anyway, long story short, I've been working with
Steven Margheim, Fractal Mind, on this project and we're making a lot of progress. Like, I think we're now at the point where we can pass all valid create table statements, I think, but it's quite difficult to know that you've got everything covered. We've been building up a big...
Collin (21:25)
Nice.
Joel (21:38)
like library of like test fixtures, like SQL queries that we've pulled from the SQLite source code. So we we sat down and like found a way to, we could download the SQLite source code and we found these like regular expression patterns we could use to go and find like all of the SQL that they use in their public tests and just put them into this directory of fixtures and then we can check.
Collin (22:00)
Hmm.
Joel (22:08)
Like, does our parser pass these fixtures correctly? Or maybe not correctly, at least, because we don't have the time to look at them, you know, and specify what they should produce, but at least passing these, I don't know, 20,000 sequel things, does that ever run into, do we ever encounter an error that we didn't expect? That's been fun. I think we're on something like 37,000 tests.
tester sessions at the moment and and that they're all written in Quickdraw as well.
Collin (22:46)
Nice.
Mm-hmm. You also had a diffing thing I saw?
Joel (22:49)
Yeah, so that's the first thing I've been working on.
Yeah, so this was just kind of out of the blue. Stephen posted in the Naming Things Discord a link to this library called Diftastic and I had never heard of this before but it's I think it's been around for a little while. Yeah, so it's amazing. It uses tree sitter
Collin (23:15)
I've definitely heard the name.
Joel (23:25)
which uses a collection of tree sitter parsers. Tree sitter is the parser that your text editor probably uses. It's...
Collin (23:32)
Mm-hmm.
Yeah, it's for
so they can do all the syntax highlighting and understand the language. It's like a generic sort of way to do that. So each of these apps doesn't have to write their own thing.
Joel (23:43)
Exactly. Yeah, so it's like a generic
way to build parses and they've managed to do it in such a way that people can write parses for all of these different languages and they have a bunch of characteristics that make them very good for text editors like fault tolerance. So if you are typing, you know, you're typing D, E,
because you're trying to type the word death, right? Or heck, no, let's say you've typed death, but you haven't given it a method name, right? At that point in time, your Ruby file is completely invalid. It would error if you tried to run it, but you're still typing. So, sitter, right, exactly. So tree sitter can handle that fault.
Collin (24:23)
Mm-hmm.
Yes.
So you don't want that. Yeah.
Joel (24:43)
and basically continue down a path of, well, if we didn't have this error, could I continue to pass the rest of the document? And then if a path succeeds, then they can take that path and basically have some level of fault tolerance.
Tangent aside, our parser does not have fault tolerance. We explored it and decided that we don't need it for our use case. But anyway, so Difftastic uses these tree-sitter parsers to understand kind of like the semantics of files that it is diffing. So if you ever looked at a git diff that has, that basically just looks completely insane in GitHub or something,
Collin (25:37)
Yes. This
is where I've seen it. Yeah, it'll show you like how things have changed in a more meaningful way. Yeah, okay.
Joel (25:40)
It's very common.
Right, yeah, so because
instead of just comparing bytes, it's comparing this tree, which gives you so much more accuracy. Like the common one I run into is like...
Collin (25:49)
Yeah.
Yeah.
Why did I stop
using this? Sorry, continue.
Joel (25:59)
Yeah, so I run into this all the time where it will like, you've added a new method or something and it thinks that, where do I get this? I get this on merge conflicts where it will like remove an end or something. I don't know, there's a bunch of things that can happen when you try to, yeah, when you try to just diff these text files as just bytes as opposed to a tree of syntax.
Collin (26:11)
Mm-hmm.
when it's just doing it dumb.
Mm-hmm.
Joel (26:28)
Anyway, so TreeSitter in Diftastic is able to give you these amazing kind of Git style diffs. And I saw this and I was like, this is incredible. I've wanted this for literally as long as I've used Git. I don't know why they're not using this in GitHub. Honestly, this should be a more, I said this should be a higher priority feature than CodePilot. seriously, GitHub, aren't you using Diftastic?
your UI it's insane. Anyway so but I saw this and was like I thought I'm trying to when Quickdraw fails and assert equal we want to give you an output that kind of like shows you what like what was wrong often when you're looking at yeah exactly
Collin (27:23)
What was expected, what you got.
Joel (27:27)
And so I was thinking like there must be a way to use this to present you with a really nice diff in your terminal that tells you, you know, we expected this thing, we actually got this thing, these are the differences. And so I mentioned this to Stephen and he said, you know, it's actually
not that difficult to make a Ruby gem that installs these pre-compiled binaries. And since Diftastic gives you these pre-compiled binaries, like you could do that. It wouldn't be that hard. And this is based on a lot of work that Mike Delassio has done, kind of like showing the patterns that you can use to like make kind of a gem generator.
And so I think he had copied Mike's Tailwind gem into a SQLite extension gem or something like that. so I copied that and made this gem Diftastic. And then I added like a Ruby interface that would shell out to the Diftastic script. And I made a function that could take two objects.
and basically turn them into valid Ruby code, but not necessarily the correct Ruby that you would execute, but basically just a Ruby representation of the objects. So if you can imagine you have, you're asserting that a hash that has an array of strings in it, right, matches a hash of an array of strings, and one of those strings is different, what you want is
to give, what you want to give to DIVtastic is two very similar looking Ruby files that demonstrate the differences between these hashes. basically like built this and then you, so you take the two objects and they could be anything, you turn them into a string, you give them to DIVtastic, DIVtastic comes back with a beautiful diff highlighting the bits that are changed and then you can present that to the user. So I added that to Quickdraw.
Collin (29:36)
I see.
huh.
That's so cool.
Joel (29:55)
And Marco Roth also built a mini test extension that adds the same thing to that. Yeah.
Collin (30:00)
Yeah, that's what I saw, yeah. It looked awesome.
I was just thinking about this while you were talking, because was thinking about how Marco did that. And I was like, man, you and Marco are so smart. And then I was like, am I the personality hire of our friend group? Anyway, no, that's really cool. I saw it. I want to try it. It looks great. Yeah. So people should try that because it looks cool.
Joel (30:11)
You
Yeah, mean, Quick Draw isn't ready for general use. So check out Marco's thing. For me, it's just a massive improvement. I love it. The one thing that isn't great is I developed this habit. And I don't know if this is a great habit. Maybe there are better ways to do this. But I would very typically write assert equals and then
Collin (30:34)
Yeah, but they could use Marco's thing for sure.
Joel (30:57)
my my expected would be I would just put an empty string and the reason is I want my test to fail and show me show me that it failed and show me what it actually was it wasn't an empty string it was this other thing and then I copy paste the actual thing back into my tests to make the pass once I've verified you know visually and manually that it's what I expected and
Collin (31:07)
Mm-hmm.
Joel (31:25)
The way that Diftastic outputs the Diffs, it's like you've got two columns. And so you can't copy and paste from one side of the columns because it's a terminal. So you don't really have two columns. You just have a bunch of spaces. yeah, I haven't really figured out how to solve that, whether to like somehow output the raw string somewhere else so you can copy it or...
or like to have a button that you can click and it will copy it or something like that, I'm not sure.
Collin (31:59)
Cool.
Joel (32:01)
Yeah.
Collin (32:04)
I have also been doing computer stuff. shit, I forgot about that. Yeah. Yeah. I mean, just today, they didn't know that, but they didn't know that. So I was in the terminal and I was like, I saw something about VS code. Yeah, I saw something with VS code, which...
Joel (32:06)
yeah, yeah, you need to, you, you need to explain, to, the listener why, why the podcast was slightly delayed. Just today record. No, they did it.
Speaking of terminals.
Collin (32:31)
I don't know, I wanted to try it and I'm like, you know what, I'm going to reset VS code, you know? So I need to go into application support and delete application support slash code. And I'm in the terminal and I get to application support. I type rm.rf library application and I just hit return for some reason. My brain just did the wrong thing. And so I deleted my application support folder. I did notice it and I hit control C really fast. So it didn't delete all of it.
Joel (32:37)
You
Collin (32:59)
Like my computer still works. I just don't know what is missing. And so now, yeah, I, well, I have Time Machine and so I can get everything back, but the, for some reason, the, couldn't do it through the Time Machine UI. I think probably because there's some like,
Joel (33:05)
That's the worst. Like, not knowing what was there.
Collin (33:26)
Apple probably sticks some system stuff in there somewhere that they don't want you to mess with for some reason. I don't know. There's like some locked files somewhere, but in a very like Apple error kind of way, it gives an error saying I can't do this, but it doesn't really tell me like if it was, if it failed on a certain directory or file, it could say I failed because this file was locked. And so I can't replace it or whatever, but instead it just says,
Joel (33:50)
Mm-hmm.
Collin (33:54)
something went wrong, maybe there was a locked file. And there's like, you know, thousands of files. So what I need to do after this is grab a copy of it from my most recent Time Machine backup. So you don't have to use the Time Machine UI. You can actually just go find the files. And if you go into the hard drive, they're just there. You like type on like your machine name or whatever.
Joel (33:56)
Right, right.
How do you do that, by the way?
Collin (34:21)
It's usually a folder or a sparse bundle. think it's a sparse bundle. If it's a network backup, better way, you just click it and then you will just see them all listed. And they're all named by like timestamp and date, and they all have a modified date. And the modified date is the date of the backup. what I should be able to do is get both directories and do a diff. It'll probably take 10 years to do the diff, but that's what I'm going to do. And then once I have the diff, I can see what actually happened.
Joel (34:22)
Mm.
Yeah.
Right.
Okay.
Don't use Divtastic
to give you a really good diff.
Collin (34:53)
That's true, I probably could.
Although I just need to see files. I think that the app Kaleidoscope, which is a really good diffing app and merging app that I have, does this. It'll do directories. It'll even do images. It's really cool.
Joel (34:56)
Yeah, no, I'm kidding.
Does
it have a Difftastic integration? Cause I would love a Mac UI for Difftastic. As in like for Difftastic, Git diffs. Like I use GitHub desktop a bunch. I just find it so much easier to navigate like a tree of files in the left sidebar than to try to use the terminal. Even...
Collin (35:16)
I don't
Yeah.
Yeah.
The terminal.
Joel (35:38)
Even with something like lazy git, it doesn't look as good as it does in a UI.
Collin (35:46)
I think UIs are great. I'm a Mac developer first. I don't know if foremost, but that's what got me in the game of programming. Actually, it QBase that got me in the game of programming, but later it was making Mac apps when I made a serious run at it. I think the idea...
Joel (35:53)
Yeah.
you
Collin (36:14)
I don't know, I feel like there people who want everything in the terminal and that's fine. But I think there's a lot of stuff where, you know, if I can click it with a mouse or I can see a visual representation all at once, that's, there's a reason we invented that, you know, like seeing a tree of things as opposed to like typing a command and then, you know, seeing it print out in the terminal, like that's just, that's better in a lot of circumstances. I have actually, it's a small tangent. There's a,
Joel (36:20)
Yeah.
Collin (36:44)
There's a pretty cool, I probably mentioned this on an earlier episode a long time ago, there is a pretty cool app for, not app, Ruby Jam, called something DSL for, Glimmer DSL for lib UI. And what that does is you write Ruby in kind of a, sort of looks like Swift UI, kind of that sort of, you know, your declarative kind of programming thing.
and it has like two way bindings and stuff. And what it does is you can then basically take your Ruby file and run it and whatever platform you're on, uses the native UI of that platform. So you can run it and it looks like a Mac app, looks like a Windows app, you know, and those things are always limited compared to like if you wrote a real Mac app. But what I thought it could be really cool for is basically all of these like command line utilities that have a million flags and stuff in them to like make a wrapper for that.
Joel (37:25)
Yeah.
Yeah.
Yeah.
Collin (37:43)
because it would be really easy because you could just, you could use Ruby, which makes doing that kind of stuff really easy.
Joel (37:49)
Mm-hmm.
Collin (37:52)
I'm sorry, so yeah, I have to restore my application support folder, I think is what we were talking about. So it is a nightmare. it was, and what I learned here is I should never try and use Visual Studio Code because that's what caused the problem.
Joel (37:57)
Yeah, that sounds like a no-mer.
Yeah.
I think I would in this situation. I have backups but they're not as convenient as a time machine. For a situation like this I'm using Backblaze so like I can go back and find a specific file or I can get them to send me a hard drive but for something like this I think what I would have to do is reset my Mac.
Collin (38:20)
Time machine. Yeah.
Yeah. I mean, that wouldn't get you the files back though. No.
Joel (38:39)
Like, just re- I would just reinstall. No, it wouldn't, no, but it would at
least make the application support folder right, whatever I messed up.
Collin (38:49)
Yeah, yeah, the real concern here, well, there's two. One is I could have deleted a bunch of my data, but even if I didn't, the problem is application support is a directory with directories in it, and I could have deleted files that are in those directories, thereby putting me in an inconsistent state. I mean, thankfully, it's all third party applications. It's not like, you know, the system doesn't use that as much. mean,
Joel (39:03)
Mm-hmm.
Yeah.
Collin (39:18)
They do put some stuff in there. It deleted my slash Xcode folder, which sucks.
Joel (39:23)
What is it meant to be? Isn't application support meant to be mainly for like
Collin (39:27)
Third party apps mostly.
Joel (39:28)
Yeah, but it's
not meant to be user data in there, it? It's meant to be like... Is it? But it's like preferences and stuff, right? Not... content. Okay.
Collin (39:31)
It's user data. Yeah, so if.
It can be both. if you're an application,
I if you're file based application, right, you would just save a file on your disk. But like, let's say you're an application where you store everything in a like a SQLite database and you just present that to the user. would. Yeah, I think I think the sort of Windows equivalent would be don't they have something called like program files or something where it kind of puts all the
Joel (39:51)
Right. So you'd hide that in application support somewhere. dear.
Collin (40:05)
Stuff that I don't know how Windows works. but Sorry, something's falling over in my office. so Yeah, so you really don't want to delete that because you know and I really need to figure out what was deleted specifically because like I said it Could be a one file that's in a I'm really glad I have time machine because I know I can do this It's just annoying
Joel (40:18)
Yeah.
Collin (40:33)
I would recommend it though, I have backblaze also but like, why not two things? Because, yeah like you said if-
Joel (40:39)
Right.
yeah, I'm
just like, the thing is, very intentionally run my Mac in a way where it's like, it would take me less than four hours to reset it from scratch. Like everything is stored somewhere, yeah.
Collin (40:58)
Yeah.
in the cloud.
Yeah, mean, mostly anything like that that's important. mean, yeah, I could, you could give me a new Mac and I could be working on it pretty quickly. To get like all my files might be a little more annoying. But generally, yes. However, it is still nice just to be able to, you know, like,
Joel (41:28)
Yeah.
Collin (41:30)
I don't know, like recently I had a bunch of raw files that from a camera that I had on my desktop. And for some reason I just hit like command delete and then empty the trash right away. Cause it's kind of like muscle memory. And so it was gone. And then, so I used time machine to restore that. Apparently I do stuff like this a lot. So.
Joel (41:48)
It's funny, isn't it? the desire to empty the trash.
Collin (41:55)
Yeah, it's strong. I don't know why I do that. Like I could just...
Joel (41:57)
like I do it too,
I do it too, but like in theory the whole purpose of the trash is that files you deleted can just sit there for a bit in case, right?
Collin (42:04)
is to li-
If I'm not out of hard drive space,
I could just leave it till I run out of, I think it's because I don't like seeing the icon.
Joel (42:12)
Right, but I do this even when I've got
loads of hard drive space left over. It's just like I want to see that clean trash icon. Yeah.
Collin (42:16)
yeah, I have like a terabyte and a half.
Yeah, it's the icon.
If they had a setting where it didn't do that, I probably wouldn't do it. I hate seeing the little full trash icon. Or if I could remove it from...
Joel (42:25)
huh.
Yeah, yeah. You know what, that's
such an interesting point. So at some point, some designer proposed this amazing idea of having a trash can that showed you trash. And then when it was empty, would show it empty. And they thought this was a great idea. They have lost people, like probably hundreds of millions of files.
Collin (42:48)
Yeah, it was a great idea.
Joel (42:57)
important files because of people wanting to empty their trash. Yeah. No, I'm sure there are people who do this.
Collin (42:59)
because they do what we do? I don't know if normal people do what we do.
I mean, I think... no, you know what else it is. By default... Okay, I'm going to give the designers some credit here, By default, I think... No, because it actually is a great design.
Joel (43:14)
I'm not saying they made a mistake, but just the consequences
of that design are...
Collin (43:20)
Well, except that we probably both did the same thing, which is that by default it says, hey, are you sure you want to empty your trash? And then I was like, no. Then I said, that's annoying. I'm going to go find the preference that where it won't, it won't ask me. It'll just do it. That's.
Joel (43:27)
Yes, I'm sure I want to see that icon.
no,
mine still asks me for sure. So, okay, so if I see a pop-up that has a blue button on it, I basically, you know how it like zooms in? It's like blurry and it zooms in and then half a second later, you can actually read it. I'm probably hitting enter before it's even stopped zooming. Yeah.
Collin (43:38)
Yeah, I mean...
Yeah. Just hit return.
Mm-hmm. Yeah.
Mm-hmm.
during the like 0.2 second
Joel (44:04)
Yeah. Yeah. So
Collin (44:05)
animation.
Joel (44:07)
like, mine does warn me. I would never read that warning. I would just like, I would see it zooming in. I'd be like, I've just tried to empty my trash and it's trying to warn me. I'm going to hit enter.
Collin (44:10)
You just don't care.
Yeah.
Well anyway, you should look it up then. There's a preference where it won't even show that and you can just delete all your files on accident. Yeah, it's... You know what, it's... I'll fix it.
Anyway, so I've been yeah, I've been doing some so I've been working on this Mac OS project with a guy that I I met on on Mastodon and This actually made me feel good. So when I when I when I my contract ended I kind of freaked out so my god It's last couple times. It's been such a pain in the ass like and Then I just put it out on the internet and it felt like it was like normal
It's like I got a bunch of responses and people to talk to. And it made me feel like maybe things have bounced back a little bit, which is good. mean, maybe it was just luck, but it did feel like I did that the last time and it was pretty scary because I was used to getting lots of responses and I got like no responses. anyway, so I'm doing this Mac OS project. And the reason I thought this would be interesting to our listeners is that
Joel (45:17)
nothing.
Yeah. Yeah.
Collin (45:31)
is that I'm saying it, I'm interesting. And I'm kidding. But that I'm using Xcode. And I think it's funny because there are things I really like about using Xcode because there's no setup. Like your test stuff is there. There's no LSP. It's all just built in. Everything works out of the box. it's like it's a real Mac app. It feels like a real Mac app. It's got lots of customization abilities.
And I like all of that, but then I'm also remembering all the stuff I don't like about, you know, like I love having that as an editor, but then I'm also remembering how things in Xcode can be. Well, you wait a lot of comp compiling. It's just you wait. I spent so much time working on a Mac app, looking at it, compiling or re-indexing, or it does a lot of things that it has to do before you can do anything. So it kind of puts a pause on you.
and is like, can do more programming after this. You know, we're working with Ruby. You just do it and it updates it. Sometimes you have to restart the server for certain things. I think, so I'm missing that right now. You know, and then also just that the, what else do I miss? also that everything's built in, but also if something's broken in Xcode or kind of janky, that
Joel (46:47)
Yeah.
Collin (47:00)
you don't really have an alternative. Like for example with...
Joel (47:03)
Yeah, there's no alternative and
no one's gonna like you can't find someone who can fix it. There's no chance that you can look at the code and fix it yourself.
Collin (47:10)
No,
they work on a team in Apple and it's closed source. But I might know a couple people on that team. But I don't think that they fix things based on me sending them a message on iMessage. I don't think that's usually how it works. But the...
Joel (47:20)
Hahaha
Collin (47:33)
Yeah, so for example, like SwiftUI has this cool feature where on the left side, you type your SwiftUI and on the right side, it kind of generates a live preview. So you don't have to compile the app and it just doesn't work for shit. Sometimes like you'll load your project and like, I spent most of all yesterday trying to figure out why my SwiftUI previews didn't work. And then eventually I messaged the guy I was working with and I was like, have you seen this? He's like, there's a button.
There's like a checkbox hidden in a menu that's like use old Swift UI parser, whatever, to do this. And then it worked. that's, those are the things I don't think about with Xcode when I'm stuck in a different app, right? Of the stuff that doesn't work. So right now, if I'm going to keep doing contracting, then I think I want to get two clients going so that I can lose one.
And if one ends abruptly for whatever reason, you they ran out of money or whatever, that I'm still making money. It's not like, it's not like how am going to pay my mortgage next month kind of situation.
Joel (48:34)
Yeah.
Collin (48:46)
And I think it would be cool to have one Ruby project and one Swift project kind of going at the same time so that I always have a foot in both worlds. I'm always up to date on everything. And also, like, when I get pissed off at Xcode, I can go use whatever of the five text editors I use for Ruby that I'm using today. I mean, that is the other thing that's nice about having one editor that you use is that...
Joel (48:52)
Yeah.
Collin (49:12)
I don't think about like, what would this look like in BB edit? What would this look like in Zed? What would this, whatever, know, where, you know, at different times, by just using one editor.
Joel (49:17)
Yeah.
You know, you can get that benefit,
but yeah, by just picking one answer anyway.
Collin (49:26)
It's really hard for me. I mean, you kind of landed on Zed and just stuck with it.
Joel (49:30)
Yeah. Yeah, I
did. I'm pretty good at just sticking with something, even if it's not ideal. Like Z was missing a lot of features when I think it like didn't have... It had some really critical features that... Oh, that's one, right. So I use with multi cursor selection, I'll use like commands to like up case and lower case things a whole bunch. And Z didn't have that for a long time.
Collin (49:40)
It's a lot better now.
Mm-hmm. Mm.
Joel (49:58)
It's getting so good now. They've recently added this thing that I'm super excited to use, but it's not supported by the Ruby extension or whatever it's called for Zed at the moment. You know, do you, I don't know if you use Vim. Okay.
Collin (50:00)
I'll check it out again.
Little bit.
I know basic, I can get around.
Joel (50:23)
So you know like how you can like select a word and things? So they... this comes back to Treesitter. So Zed is using Treesitter to parse your... your... yeah. Yeah, maybe we never talked about this. I switched like maybe six months to a year ago, I think.
Collin (50:41)
Are you using Vimkey bindings now? When did you switch?
Yeah. A few months ago? Huh.
Joel (50:53)
and it was like a real it was kind of annoying at first but it wasn't that bad and then i eventually got used to it now i couldn't i can't live without it and i'm not very good like i have a very small like repertoire of vim things that i can do i i probably should spend like
Collin (51:01)
Yeah.
There is something else I want to talk about after this.
Joel (51:20)
10 minutes a day, like learning some new Vim thing.
Collin (51:23)
I mean, when I've done it in the past, is a learning curve, maybe because I've done it before, it doesn't feel as bad to me now. But it feels like you don't have to know very much to like, yeah, just to do what you're doing already.
Joel (51:36)
To get comfortable, you don't. Especially if you're not in Vim, you're just in Vim
keybindings in a GUI editor. But that's my problem, right? So I'm now very quick at using an inefficient way to do something. I know that if I, I don't know, if I jump down one block, I'm gonna be aligned too low so then I can press J and jump and then I'm in the right place.
Collin (51:44)
Yeah, yeah. Because you can always fall back on.
There's a way to not have to. Yeah.
Joel (52:05)
maybe there was a way that I could avoid that and I could
actually just jump down to the next line or whatever.
Collin (52:12)
Have you done the thing
where you use the little macro where you can type it in one mode and then it will repeat it as you hit a key or whatever? So if you're changing a lot of one thing, I don't know if Zedd does that.
Joel (52:20)
The only thing I've done for
that is like if you've done like if you've done change word CIW and you've typed a new word and then you move to along to another one you can press dot to repeat that action yeah. Anyway so using tree sitter Zed now supports things like
Collin (52:28)
Mm-hmm.
That's where it start. Yeah, that's what I was thinking of.
Joel (52:49)
change in a function where it will actually like you can do cif and in theory I don't think it's a vim thing it's like we're gonna use like this idea of the language of them to
Collin (52:52)
neat.
That's not a Vim thing though. That's, that's a, yeah, that's it.
The language of them. Yeah, yeah, it's cool. Because you can do
like change within like quotes or whatever, like kind of thing.
Joel (53:10)
Right,
right, but the change within quotes is quite limited compared to what you can do in tree-setter where you can detect the function or the class. And yeah, that just looks like a very, very useful feature. I think CIC will change in class and there's various other ones. No, it doesn't yet. I think
Collin (53:18)
Yeah, that's really cool.
That's cool. but it doesn't work for Ruby yet. I was so excited
when you were talking about it and I remembered how the story started.
Joel (53:40)
I think it could. think
there just needs to be a mapping of like from like what is the tree sitter path to find the function from any given point.
Collin (53:52)
I mean, you would think if tree sitter
works, then it understands.
Joel (53:56)
Yeah, but I,
it understands, but I think it understands.
Collin (54:03)
I just mean like it's possible.
Joel (54:04)
I think it has
like a language specific kind of AST and what you need is to say in the context of Ruby the thing that makes sense as a function for this feature is a Ruby method so we're gonna look for you know this path
Collin (54:09)
Right.
Mm-hmm. That's what I mean. It's like,
it knows what a method is though, so it should be able to. Yeah.
Joel (54:30)
It knows what a method is, but I think
you would have to write the, you know, the, there are like tree sitter queries. I don't know what they're called that you can write that basically are able to traverse the AST. And yeah.
Collin (54:39)
Yeah, yeah. Yeah.
No, I understand that.
just meant that like it's it should be possible because it does the AST so
Joel (54:49)
It's possible, yeah. Yeah.
I just don't know Teresa to well enough to do it myself. And I also think that if I just leave it for a couple of weeks, it'll probably, someone else probably do it.
Collin (54:54)
Oh yeah, wasn't... You do enough.
Joel, you do
so much, you know? Nobody, you don't need to do it. Somebody else will do it. Or they won't. Yeah.
Joel (55:06)
Yeah, that's what I'm hoping for. But I'm excited about that feature. And
it ties neatly into TreeSitter and other topics we've been discussing.
Collin (55:15)
Yeah,
tree sitter. Did you see, it's gonna be the one time I bring up DHH and it's not to trash him, not to anything, not talk about some asshole thing he said, is I saw it. Did you see that he switched to Vim? He uses Neo Vim now instead of TextMate? Yeah, a while ago I think, but I haven't read why he did. Yeah, that's the thing. I'm interested in what he has to say about editors and stuff. I think he's pretty smart about things like that.
Joel (55:30)
Yeah. Yeah.
Mm.
Collin (55:43)
I'm just not really interested in what he has to say about other things and it kind of spoils the bunch for me. Makes me not want to see any of it.
Joel (55:49)
Mm-hmm.
My take on the whole DHH switching to VM thing? Yeah, it's not like an objective thing. It's like just, I'm mad at Apple, so I'm going to make do with this other thing and then pretend that it's as good.
Collin (55:56)
I think he was just so mad at Apple he's like, yeah.
Yeah.
I mean, he might have been, oh no, guess Marco, Marco Arment, he, I haven't asked him, but I assume he is still using Textmate for when he has to do with the little bit of PHP that he does. Yeah. Yeah, I'm not like logged into his machine, so you know, I don't know. But.
Joel (56:20)
I don't know.
I can't
imagine still trying to use Textmate for Ruby nowadays, like...
Collin (56:32)
I mean, you don't have autocomplete, you don't have any complete. I think...
Joel (56:37)
You don't have tree sitter, right? The syntax highlighting for Ruby in TextMate, I'm pretty sure they don't use tree sitter.
Collin (56:46)
Yeah, I mean, you know, not everybody, you know, they definitely don't because I think it's, you know, I think it's, it looked kind of on life support. I don't really think it was getting any significant updates and yeah. So I don't know if he's making do so much like Neo Vim's definitely a lot more powerful than Textmate. So I just thought it was interesting because he was, he's like the reason people got into Textmate because when he did the original, like make a blog in 15 minutes thing or whatever.
You know, people were like, what editor is that? And then...
Joel (57:16)
Yeah. Yeah.
I mean, it used to be, it used to be a state of the art. I just think it's been surpassed by other options now. Yeah.
Collin (57:24)
Everything yeah
Yeah, I do. I do wonder what the I do like to imagine what the world is where they Did just keep working on it and kept keeping it up because it was a really good editor but Yeah, not so much anymore. I haven't I haven't touched it for a long time Yeah, one-time purchase fee. I mean that used to be the way of the world and now You know, get it you got to make money it's really hard to make money if you can only charge people every
Joel (57:35)
Hmm.
Mm-hmm.
One- One-time purchase fee.
Collin (57:54)
every year or whatever. And also, when you do that, you've to charge more and people don't want to $100 or whatever for your text editor or even $30.
Joel (57:56)
Yeah.
Mm-hmm.
Yeah, I get that. also, like, I don't know. lot of these, like, older Mac or, like, Apple software companies are... I think that they are leaving a lot of money on the table. Like, for example, I use things on my Mac and my iPhone every single day. Nope.
Collin (58:26)
Mm-hmm. Are they subscription now?
Okay.
Joel (58:31)
I've
used I've used on my Mac and my iPhone every single day probably for like 15 years and I've paid a total of maybe $70.
Collin (58:41)
You gotta show me how you use things at some point, because I'm always interested in people who can stick with one thing for a long time and find it useful, like how they're doing it, because...
Joel (58:48)
Yeah. Yeah. I do
really love it. They literally my only complaint with things and is I just desperately wish that they had the ability to collaborate on lists. Like just you can add a collaborator, you can assign and you have a comment thread on each task. That would just make it the best. The best.
Collin (58:57)
Mm-hmm.
Mmm.
Mm-hmm.
That would be cool.
The thing that always got me with things, even I did work on things back in the day. So people, just to mention that the thing that always got me with things and why I tended to use OmniFocus was that it doesn't give you any really good way to hide things from yourself. And that's something or to like recall a view that you were in. So if I said, you know, I have this tag and this tag. So like in
Joel (59:24)
Yes.
Hmm.
Okay.
Collin (59:46)
In Mac OS, if you think of like mail or photos, you can set up like a smart folder or smart album. Yeah, that's basically a safe search. It's a little more advanced because you can like create a little predicate about it. Say like this and this, but not this or whatever.
Joel (59:50)
a saved search or something. Yeah. Yeah.
Mm-hmm.
Collin (1:00:03)
So didn't like that. But also things to say like, I can't do this right now, so just don't show it to me. Or like, I can't do this until after I do this, so don't show it to me. I don't think that...
Joel (1:00:09)
Hmm.
I found it
to be quite good at not... Yeah, it doesn't let you say, can't do this until after I've done this, which would be cool.
Collin (1:00:22)
Yeah. Yeah, I want to be able to say
this is blocked by this other thing. So just like gray it out or hide it or do whatever. And I understand that that makes the UI more comp. That's why OmniFocus is like a more complicated app because it does those things. And so that's a trade off. Like, you know, things is very clean, but it is missing a lot of those features. So.
Joel (1:00:29)
right.
One
feature it does have that's sort of related to like hiding things until they're relevant is the like every task has two dates. The scheduled date and the due date and they are separate things because the scheduled date is like I can't work on this until this date or I don't want to work on this until this date but that doesn't mean it's due on that date.
Collin (1:00:59)
Mm-hmm.
Joel (1:01:15)
It almost never means it's due on that day. It shouldn't mean it's due on that date. And the majority of other task applications only have a due date thing, right? And so, but then they'll also kind of treat it like a schedule date because they won't show it to you until it's actually due. And then you're like, well, now I've only got one day to do this thing.
Collin (1:01:23)
Do to me means, yeah.
Yeah, OmniFocus has that also. They have a whole thing where they can be like, remind me here, but then you can set up like.
Joel (1:01:40)
Okay.
Omni-focus is
almost like...
Collin (1:01:45)
It's like a 747, like.
Joel (1:01:46)
It's like a, it's
like, but it's like, it's like, what if you had a spreadsheet to manage your to-dos and you had every possible feature in the world, but then we just like got rid of the other spreadsheet features and just, that's like OmniFuckers.
Collin (1:01:59)
Yeah, it
is a little bit like that. And that's why I said those two, each, it's like if you took the best parts of each, you'd have one like really killer app. And I have thought to myself, I should make that app because it's so clear to me. Like I said, I worked on things. I've used OmniFocus for years. I worked on reminders. I said I'm the foremost to-do list app maker in the world for the Mac, apparently.
Joel (1:02:07)
Yeah.
Yeah, yeah.
Ha ha.
Yeah.
Collin (1:02:29)
because who else has worked on two out of the three of these? And I think I should be the person to do that. And then I remember when we were, then I remember how everybody was eating dinner at the office for months to get reminders out the door during the rewrite. And I think that was a lot of work and I actually don't want to do that. They're actually surprisingly complicated apps. And.
Joel (1:02:45)
Mm.
Interesting.
Collin (1:02:56)
Yeah, maybe I'll do it. Maybe when I'm rich, I'll like pay other people to work for me and then, and then I can do it. But yeah, so, the other thing with things is that the tag system, it was like this when, that was one of the parts I worked on was moving the tag feature, because it didn't have it on the iPhone originally. So I like worked on that. But the way it works is when you select,
Joel (1:03:00)
Hahaha
I think.
Collin (1:03:22)
You can make a little hierarchy of tags in their little tag browser. But if you select, what is it? I think it's like, if you select a parent tag, you want it to show you also all the tasks that are in the child tags, and it doesn't. So that hierarchy you can set up is just visual. It doesn't have any semantic meaning in things. And I really wish they would fix that, because that would.
Joel (1:03:25)
Mm-hmm.
Interesting. Yeah.
I think
what it does right now is it will just like pop open to present the child tags that you can then select.
Collin (1:03:54)
It just showed...
Maybe, maybe they've changed it. I think it just... Yeah. Yeah.
Joel (1:03:59)
It's the same behavior, but I think maybe the UI is a bit better.
thing I always say about things is I think that their UI... The UX is pretty good too, but the UI is exquisite. and they're not using... Like, it doesn't look like any other iPhone app. I don't think they're using... They're certainly not all in on native UI components.
Collin (1:04:25)
I mean, it's all standard.
Yeah, I mean, I think...
Joel (1:04:28)
Like the date picker is so unique.
Collin (1:04:30)
Yeah, I mean, I think that
they definitely, they definitely will do a lot to like get the look that they want, but it's also very, very native feeling. You know, because it is.
Joel (1:04:38)
Yeah.
Yeah, their date
picker is the best date picker in any iOS app or any mobile app, think. Like literally, so you tap it, it pops up with a calendar. So you can pick from this calendar, you can scroll down through the calendar. But if you scroll up, is it scrolling up or just tapping? I don't know. There's a text input and you can literally write something like
Collin (1:04:46)
Yeah.
Mm-hmm.
Yeah, I've seen it. pretty cool.
yeah.
Joel (1:05:10)
two days before the last Thursday of the month, I think. I don't know if that one specifically works, but there's a bunch of things, like crazy date statements that you can make like that.
Collin (1:05:13)
Mm-hmm.
Well, do you know
the app Fantastical? It's the calendar app that originally, like the first app that had that feature where you could put, because this goes back when I worked on that app, another guy who worked there was friends with, I think this guy named Keith, and he had done his like dissertation, he was like in college still, and he did his thing, whatever it was.
Joel (1:05:24)
Yeah.
Right.
Collin (1:05:47)
on basically natural language parsing at the time. And then those two guys got together later and made Fantastical. And I think maybe, I think there's some overlap there. Like I think they worked together again and that maybe, like I think he worked for them also, like for Culture Code also. And so I wonder, I bet that's why they have that is what I'm saying.
Joel (1:06:08)
Mm-hmm.
Yeah, what's the like the culture like in in the in this world like if if this was Ruby
like there would be someone would just make a gem that was like natural language passing to dates and then and then both both the companies would be depending on the same gem is that less common i feel like that's probably less common in
Collin (1:06:30)
Mm-hmm.
You know, I-
Definitely less than Ruby. Like Ruby, that's very common. And I would say, you know, mixed. People definitely use more libraries now than they used to. I feel like the culture of like rolling your own thing for everything is less of a thing now than it was a few years ago. Like I'll log into a new project and there'll be like 20 packages in it.
Joel (1:06:49)
Hmm.
Collin (1:07:16)
where before you'd be like, I don't know, I'll make my own version of it. So people are sharing code. There's a lot of open source out there. But for that specifically, I don't know. Also, a lot of times, Apple adds this stuff. So maybe they got it because Apple actually added their own natural language thing. And I'm just not up to date on it specifically because I haven't used it. Like I said, the thing with the Apple frameworks is it's not like Rails where
Joel (1:07:23)
Mm.
Yeah.
Mm-hmm.
Collin (1:07:44)
like Rails is like UI kit plus like the ORM or whatever for making an iPhone app. But the frameworks on an Apple platform is more that Apple gives you is more like if you had Rails and then also most of Ruby gems and that was what you got. And so, you know, there's a lot there. So I'm not always fully up to date on everything. Yeah. So I guess the answer is less than Ruby, but still a lot.
Joel (1:08:00)
Right.
Yeah. Cool.
Collin (1:08:13)
There's a pretty cool
web framework for it that I've never used, but I looked at it. It's neat. You put it, you write in Swift, but you edit in Xcode and you hit command, you hit run in Xcode and then it, it's like writing an app and then it opens a web browser. It's pretty cool. But Rails is so good, you know? And then when YIPPY comes out someday, I'll have to use that. So you'll still be my friend. Anyway.
Joel (1:08:39)
You won't have
to use it, hopefully it'll be so good that you'll want to use it. Yeah.
Collin (1:08:42)
It'll be so good I'll want to use it.
Anyway, I don't know. there anything else going on? Jared likes Tailwind now? Jared likes Tailwind now I saw? Yeah. We should get him back on. Tell us why he likes Tailwind now. Yeah, I think there's a new release or something. didn't get through the whole blog post of why. I just saw like top line item was he's fine with it now at least. So maybe we should.
Joel (1:08:49)
I don't think so. Sorry? What?
Whoa, that's interesting.
That's
so funny. Because I think when we talked, was like, I was that... Yeah, he was. And I was like, trying to be like, Drake's not that bad. But to tailwind.
Collin (1:09:12)
Yeah, maybe we should... He was the Kendrick Lamar to tailwinds Drake, really. He was the biggest hater.
I mean, he is that bad, but yeah. Why does Mark Zuckerberg dress like Jake dress like
Drake now also, but with his little chain? Sorry, continue.
Joel (1:09:33)
Yeah, I've almost like gone the other direction Where I used to be like, Tailwind's alright And now I still think it's I still think it's probably alright and and probably probably in any Reasonably site like large team you're gonna end up creating these utility classes and you may as well use Tailwind
if you're gonna do that. But I really, yeah.
Collin (1:10:06)
If you use components, I think it's OK. If you use like view component or flex, it's fine for me,
because it's all contained.
Joel (1:10:14)
But this was it. So I was using Tailwind, even Tailwind 4, and I was building a component and it just got to the point that this thing had so many classes on it. It was awful. I was like, I just want some structure. I just want like, you know, to be able to select the different sections and then have all of this stuff structured, like kept together.
And I was like, what I want is CSS, where I can like actually just see the CSS in a file. And that kind of put me off it. The one thing that it really has going for it is often a problem with CSS is you, it's basically write only. So you add the CSS that you need for a feature, but then when you delete,
Collin (1:10:45)
Yeah.
Joel (1:11:12)
the HTML. Do you delete the CSS? How do you know if something something might be depending on that CSS? How do we how do you even find the CSS?
Collin (1:11:19)
Somebody should write a gem for that.
Yeah, somebody should write a gem for that
to tell you a few. I'm sure there probably is something to do that.
Joel (1:11:26)
I think it would be very
difficult to do that.
Collin (1:11:29)
I mean, is it? Because you would just look at all your files, and then you'd be like, what classes and whatever aren't?
Joel (1:11:31)
Yeah, you can't even do that because
because your classes can be computed. They're not necessarily static.
Collin (1:11:38)
Okay.
Hmm. I mean, it could give you an idea.
Joel (1:11:42)
Yeah,
yeah maybe. You get the same problem with stimulus controllers. Stimulus controllers are added and then it can be very difficult to be like, okay, are we actually using all of these stimulus controllers? Like we've got 50 of them and I'm not convinced we're using all 50. Probably 25 of them can go.
Collin (1:11:49)
Yeah.
Anything where there's a lot of,
yeah, anything where a lot of things are based on strings, I find has, maybe this isn't the problem you're thinking of, but where like, know, the way you use a lot of stuff is through putting a string somewhere, ends up having problems like that. I think I used to call it, instead of strongly typed, it stringly typed, where, you know, if you can misspell something and it breaks it, like.
Joel (1:12:15)
Yeah.
Yeah.
So speaking of strongly typed and CSS, if you use Svelte, you put your CSS in the component and it kind of automatically scopes it. There's a way to escape out and say, I actually want to control something global. But the Svelte language server will tell you if you have, a selector in the style tag of your component,
Collin (1:12:32)
Mm-hmm.
Yeah.
Mm-hmm.
Joel (1:12:55)
there's no HTML that could match that selector. It will be like, this CSS is dead code. Which is really, really useful. I wish we could do that kind of thing. We're never going to be able to do that in Ruby because like, it's not, we don't have a compiler and whatnot. But yeah, in Svelte, like, that is amazing. And that reminds me, I think we promised the listener that we were going to do the next episode on Svelte, maybe.
Collin (1:13:00)
Okay.
Joel (1:13:25)
And now we've just done one that wasn't unspelt.
Collin (1:13:29)
Okay, next episode's
felt. You know, it's been... We've both had a lot going on personally, so like... You got sick. I have a bunch of stuff I don't want to talk about. Like, we've both had a lot going on. And so, you know. But we're here now for you, dear listener. Yeah, we're gonna do three episodes this week. Look forward to tomorrow's episode.
Joel (1:13:32)
It's been a bit of a weird... Yeah. Yeah, like, I took holiday over Christmas and then I got sick for, like, two weeks. Yeah.
We're unemployed, we have nothing else to do.
Collin (1:14:00)
Anyway.
Joel (1:14:00)
Yeah, we should get into it because I think it's very, cool.
Collin (1:14:06)
I was thinking when you mentioned Svelte,
I'm like, man, somebody told me Svelte is cool. And I was like, it was you. Okay, well, solid episode, pretty long one. I think is a good place to stop if you don't got anything else. And then let's do another one in a few days.
Joel (1:14:10)
It was me.
Yeah.
All right.
Collin (1:14:25)
Now the
show is over.
Joel (1:14:28)
Now this show is over. We need like an outro song.
Collin (1:14:29)
Didn't even mean to begin. All right
We do I could Write one my hand doesn't hurt. I can play it. It's my hand still hurts, but I can play guitar with it now So Don't break your wrist. See you next week