Hammerstone · Dec 8, 2021
<div>Aaron and Colleen talk about the trough of despair and also numeric range optimizations, of course.</div>
Aaron
Okay. Here we go. Just just, Colleen and Aaron today. Sean is traveling to work.
Colleen
He's in San Diego? Oh, he's there. Yeah. I'm gonna see him tomorrow.
Aaron
Oh, no way. This is the second time, I think, that he's traveled out there, and y'all have gotten to hang out. Right?
Colleen
I know. It's super awesome that his stage app brings him to where I live. It's nice.
Aaron
He actually he texted me, I think, on Sunday, and said waving from the DFW airport. And I was like, oh, man. I get I get the airport stopovers, and you get to actually hang out with him. So sucks for me. So what's going on?
What's going on in, I guess, client world?
Colleen
Yeah. I so this isn't actually client world, but I did get, the back end of the repo pulled out for Jesse for Bento so they could play a trumpet.
Aaron
I saw that.
Colleen
It was really interesting because it took me a lot longer than I thought it would, which was, a good it's not bad, but it was good exercise.
Aaron
It was against the explicitly stated goal that we wouldn't spend too long on it.
Colleen
Yeah. But, you know, I had that individual pursuit time on Thursday night. So, I did it during my individual pursuit time.
Aaron
Love that.
Colleen
I think it was I think it was a really good exercise to actually pull it out to see how much work was involved. I've ran into, like, a couple little things that we knew we were gonna run into, but I have forgotten. For example, our tests are our tests are right now database specific.
Aaron
Mhmm.
Colleen
So I spun up a new Rails app with Postgres because that's what I do as default.
Aaron
Yep.
Colleen
And then I dumped our code in, and I was like, oh.
Aaron
And all the grammar was different. And yeah. Yeah.
Colleen
And none of the tests work. So that was fine. Obviously, that's easy to fix. But it was just like little things like that Mhmm. That I ran into.
So it was really good to see that. And just some things I have added into the client's repo, like testing libraries and making sure I get everything out the way I want it to be. And so hopefully, I have given him enough information that they can get started. Did you watch those videos I sent him?
Aaron
No. I didn't.
Colleen
Okay. They're short. I sent him little overview videos. I also have an hour long video about track's pending relationship subqueries, but I didn't send him that.
Aaron
I I do. Send me that. I wanna watch that.
Colleen
No. It's just like me. It's like my stream of conscious. Like, I'm gonna I'm gonna walk through this, so I have it all sorted out.
Aaron
Wait. Where did you send these videos? Is it in the They're
Colleen
in the GitHub repo in the repo.
Aaron
Oh, okay. I was checking our DMs. No. I didn't see that. I will go watch those.
Colleen
Yeah. It was 9 o'clock at night. So they were they're a little stream of conscious. But, I hope that I'm I'm really curious to see what they're able to do with it. Now I am so familiar with it.
You obviously have this problem too that it makes total sense to me. And then
Aaron
Yeah.
Colleen
I'm trying to impart that information to a third party who has never seen it. And I'm really curious to see how that works out.
Aaron
Yeah. I really wanna see this 1 hour tracks pending subqueries thing that I think that would make me so happy.
Colleen
I feel like it's very, like, I'm just like, oh, and now we go here. Now we do this. But, I I it's nice to have it to reference when I get when I'm like, wait, what does this data structure do?
Aaron
Yeah. And when we hopefully one day write it in another language, it'll be nice to have that.
Colleen
Yeah.
Aaron
Recorded somewhere. Have you heard anything from Jesse?
Colleen
I have not. And then he said
Aaron
a couple days ago, like, oh, we're getting started on it.
Colleen
I feel like it was just yesterday or the day before. It was recently. So I haven't heard anything. But the great thing is I was gonna pull the front out. The reason it took so long is I was originally gonna pull the front out front end and the back end out and put them in a new Rails app and have a complete package.
Aaron
Mhmm. And I
Colleen
started to pull the front end stuff out, and it's pretty heavily entwined with the client work.
Aaron
Mhmm.
Colleen
And it's just a lot, in terms of the way the client is stabilizing. Because, like, what the client does with Hotwire is every time you you enter something in the text box, like, on a debounce. So not when you hit enter. Like, every time you enter something debounced, we're stabilizing we're providing a new stable ID. Oh, really?
Yeah. So what's hap so the JavaScript for it is like a lot. Yeah. So every time on the front end with the client now, the user starts typing. For example, in the text box, we stabilize.
I have an AJAX request that goes to stabilize that.
Aaron
Is it just URL encoded stabilization for Valorantica?
Colleen
That's why. It's URL encoded stabilization, and then the, then our stimulus controllers, our JavaScript, sends an event saying this filter has been stabilized, then the bullet train specific filter partial listens for that event and, does some does some more magic. And then when you hit apply, you just take if if your state has a URL encoded stabilized ID, you just push to that URL. So it Say
Aaron
that again. The last part, you just push to that URL? What is
Colleen
Of the stable ID. Yeah. We just you just the way they apply it is the way it is applied is it's not another round trip to the server. It's I already have the filter stabilized. It has not changed.
So apply is just, like, push state to force that filter to render on the page.
Aaron
Gotcha. Okay.
Colleen
And anyway, that isn't It's
Aaron
very specific.
Colleen
Yeah. It's like I was trying to pull it out, and then I needed, you know, all this other stuff, and he's not even using turbo hot water.
Aaron
Not even using yeah.
Colleen
And so I was like, this is a I'm spending too much time because oh my gosh. Trying to pull up like, all of the events that this that that's going on in the front end in our JavaScript right now. Like, there's a lot going on there in terms of the people who are listening to the events and pushing and, so it's almost it's actually, you know, almost working, but I didn't wanna send him to send him that one because I am not sure how much of that is client specific.
Aaron
Right.
Colleen
And so I wanna be I think I told you that. Do not share that repo with anyone. I don't think it's client specific, but I don't want to share it. And I, he doesn't care because he's not using it. He
Aaron
doesn't care.
Colleen
And it seems and it seemed more complicated than it was worth for, like, a basic query builder, that whole turbo situation. So back end's out. Good news is Sean can we can try and get Vue set up now Mhmm. Because it should theoretically just work. So that's cool.
Aaron
Yeah. That's super cool. That is what I have been doing is we got it integrated last week, and now I'm working on the couple of sticking points between the 2. And it's like, I've got it in a browser here. It's it's working.
Awesome. I know. It's super great.
Colleen
So great.
Aaron
And I'll tell you what, like, it is so nice to have both of them together in a little playground where I can make changes to both of them and, like, NPM will earn yeah. Node will run and compile everything again, and I don't have to, like, push and redownload. It's just like, oh, this is wrong in the JavaScript. I can change this. This is wrong in the PHP.
I can change this, refresh. Now it works.
Colleen
That's awesome.
Aaron
It's so fast and so amazing.
Colleen
Nice.
Aaron
So, yeah, I'm feeling really good about that. The thing I've been working on is getting so with, with the Vue front end, we want to be able to let the developers choose, like, what components are rendered.
Colleen
Okay.
Aaron
So, like, when they choose an equals, like, let's say, like, number equals, that equals clause has some component property has a component property attached to it so that we know what to render next to the clause, you know, for number equals the thing that we render next to it is a single number input For numbers between the thing that we render next to it is a double number input. So that you track
Colleen
it a lot? Yeah. Yeah.
Aaron
So what I've been working on right now is the system to register all of those components. So that let's say they have a date picker that they really like, and they don't want to use the one that came with the view to front ends that we provide. I want them to be able to just swap out the date, the single date, and the date between so that they don't have to reinvent the whole front end. They can just say, actually, I wanna use this date component instead of your date component. So that's what I've been working on.
And then, of course, like, if they have custom custom clauses, they need to be able to specify what component to use so that the user can input their data. And it's great because, like, most of their custom clauses, whatever, you know, whatever they should be, we'll be able to be satisfied by the components that we already ship. Because we ship, like, text input, number, date, double date, select, you know, you can do with drop downs. So hopefully, even if people are writing custom clauses and comp or clauses and conditions, they won't have to write any custom front end. They can just utilize ours.
So, yeah, it's really, really great. And I'm super pumped with where we're at right now for, for like the first time in a really long time. I'm like, this is it, man. Like, we're going to do this thing. There's there's been a, there's been a big old lull there in the middle while you guys were working on client.
And I was like, man, we're never going to get there, but we're back, baby. I feel like
Colleen
we're going to get there. Yeah.
Aaron
I'm super pumped. It's awesome. I love it. It also helps that I got the first proper integration done. So we are for Keith, it's done.
Like, I handed it over to him.
Colleen
Well done.
Aaron
So it's it's a little different because he's not using the front end, which is, you know, fine. He already has a front end. Yeah. So it's not quite the full deal, but it's still, like, I've set him up in our distribution system, which is unlock does dot sh for anyone that wants to distribute private packages. I've set him up in there with a license.
He's like composer requiring it. Like, it's the real deal. There's no, like, side loading, SIM linking, or anything. So I got him like set up fully up and running and I handed him his project back and it's
Colleen
That's amazing.
Aaron
Yeah. I feel Yeah. There's a couple a couple of, I don't, I mean, they are big wins, but they're big emotional wins to be like, okay, like this frigging thing works. And, like, when I handed it over to Keith, I was like, okay. Here's, like, here's what we got.
I think, like, I think it's pretty good. There's still more work that you'll need to do because you have the domain knowledge of your app and you'll need to like finish out some of the fiddly parts. But this is like, this is what I've got. This is how far I got. What do you think?
And he was like, this is unbelievable. I'm so moved. I never thought I would be moved by code. And I was like, ah, thank goodness. Because, you know, of course, I felt like, oh, it's not good enough.
But he was like, no, this is this is ideal. So super pumped. Also really glad to have that project off my plate because I was very busy with it. And Yeah. It's nice to have some free time back.
So
Colleen
Yes.
Aaron
Feeling much better.
Colleen
Nice. That's great news.
Aaron
I know. Man, the the the low, like, while you're just grinding Yeah. And you're not like, you haven't released, and you're just grinding, and you're like, am I an idiot? Like like, is this am I very stupid? Is this never gonna work?
Am I, like that part is that part's real tough. I don't love that part. Yeah. And I know that the answer is like, oh, just release before you're ready. But, like, that's kind of
Colleen
It's interesting. So I was talking to a friend of mine at the indie hacker meetup here. Mhmm. And he has been in the startup space for a long time. And he we were talking a lot about Laravel, and he was talking a lot about what you have been telling Sean and I from the beginning, which is it's not an ecosystem in which you want to release just release something that's not very well done.
And, we talked about it for a while, but but, like, he
Aaron
That's interesting.
Colleen
Totally agreed with that assertion that, like, within the Laravel ecosystem specifically, that's not a good move.
Aaron
Well, that makes me feel better. That's interesting that that was his perspective as well. That makes me feel better. Yeah. I mean, I like you said, I agree and have been saying that, and it's, I think, doubly tough because of the nature of what we're building.
One is it's very, it's very technically difficult, and so it's hard to be like, oh, just like we'll just ship it and we'll fix it later.
Colleen
It's like,
Aaron
oh, this is gonna, like, this could potentially cause some real pain for our users if we're, like, returning things that aren't true. Like, that's a bad deal. And then the second thing that's tough is, there's, like, eternal state built into our application. So, like, once a filter is stabilized and out there in the world, especially with, like, URL encoded filters, there's no getting it back. Like, you can never get it back.
You can break it. You can migrate it, but you can't ever just be like, okay. That one's invalid. Like, you just have to, like, have contingency plans for, okay, what if I change an ID? What if this filter name changes?
What if this condition goes away? Because people are gonna come back to their bookmarks, and suddenly everything's broken. So Yep. Anyway, life is hard, but I'm feeling so so much better.
Colleen
Oh, I'm glad. That's
Aaron
Yeah. Super encouraging. And we've got go ahead.
Colleen
Oh, no. Go ahead.
Aaron
I was gonna say we've got Dave working on React.
Colleen
Right.
Aaron
And I think he's starting today.
Colleen
Okay.
Aaron
So I think we decided gonna give him, a chunk of, like, 50 hours and see how far he gets and then reevaluate. He's already gotten so far just like dorking around on his own. So I'm pretty pleased with
Colleen
I feel like and then I think that might I think React and rails is gonna be really good together. I think the turbo is maybe not the best fit the way this has been, done. But I feel like the React rails is gonna be be really solid. And a lot of people aren't aren't on the turbo bandwagon yet because it's so new. So there's that as well.
So I think that, I think this is gonna be cool. What I
Aaron
think the only thing that could make our client engagement better is if they had been using React from the beginning. Yeah.
Colleen
It definitely is interesting. They The way
Aaron
They have legit reasons for using for not using React. But, like, in a perfect, perfect world, they'd be using React.
Colleen
We would
Aaron
have that.
Colleen
We'd have that.
Aaron
But we'll get it. We'll we'll get it anyway, so we'll we'll be fine.
Colleen
What's your soft launch plan for Laravel with our your list?
Aaron
So Our list. So next week, provided I get this component stuff done, which I am pretty sure that I will. Next week, at some point, I'm gonna reach out to a couple of the people that have expressed the most interest
Colleen
Okay.
Aaron
And try to just basically hand hold them through the process.
Colleen
See how it goes?
Aaron
Kind of yeah. Kind of 1 on 1, like, alright. We're in the DMs. Like, what are you is it working? Is it not?
Like, what are your errors? What are your questions? So that'll start next week, provided this gets finished. And then after that, I don't really know because, so if I onboard, you know, 1 or 2 people next week, that puts us into, do do do. So today is 8th.
If I reach out to them next week, let's say on 15th, And I spent a couple of days working, getting them integrated. The week after that is the 20th through 24th.
Colleen
Yeah. So no one's looking that week or really the next week because Or
Aaron
next week.
Colleen
So you're really looking early January before, you know.
Aaron
Yeah. And so this is a question. There's there's some notion that, like, nobody's really working that week, but there's also the notion that, like, nobody's really working that week. So I can do, you know, I can do a bunch of work. Like, are there people out there who are like, okay.
Finally, everything's quiet. I'm gonna do some fun work. And would this qualify as like, I wanna try this out and see how it goes.
Colleen
It might.
Aaron
But the yeah. It's tough because it costs $1,000.
Colleen
Yeah. I feel like the answer my my gut reaction there is the answer is no because no one's just buying it for their side projects. People are buying it for work That
Aaron
is true.
Colleen
And they're taking a week off work. So I think it's
Aaron
good to be wants to, yeah.
Colleen
Work yeah. No one wants to do regular work. Regular work
Aaron
Heck no.
Colleen
On their on their vacation.
Aaron
No freaking way. Okay.
Colleen
So I think realistically yeah. I don't think so. So don't feel disappointed if people are like, yeah. We'll do it in January.
Aaron
Yeah. I don't care about that right now, man.
Colleen
Low priority.
Aaron
Yeah. So I think that may be it then. Just try to get, you know, I'll reach out to several people and as many that wanna take me up, before Christmas, I'm happy to to work with. I also want to specifically try to not work over Christmas because I worked so much over Thanksgiving on Keith's stuff, which is a whole another, you know, philosophical question. I'll save for later because we've only got 18 more minutes.
But
Colleen
Okay.
Aaron
I don't know. I'll tease it. Here's the question, Colleen. As as the happiest person in in in the Slack, here's the question. And we can't talk about it now because we don't have enough time.
Colleen
I know.
Aaron
Here's the question.
Colleen
You gotta go.
Aaron
How much how much does it make sense to sacrifice now in terms of like time so that you can reach escape velocity later and suddenly have all the time in the world, you know, quote, unquote, versus how much does it make sense to just work the 9 to 5, boring, but you're not like sacrificing Thanksgiving break and weekends and individual pursuit nights. You're just freaking getting a paycheck and hanging out. Right?
Colleen
Right.
Aaron
Because the sacrifice only is only valuable provided you reach escape velocity, because if if you don't reach escape velocity, then you would have been better off just working a 9 to 5 and like dorking around in your free time. Right?
Colleen
You're right. You're not wrong. Yeah.
Aaron
Think about it.
Colleen
I'll think about it. We'll talk about it next time.
Aaron
Yeah. Dear listener, come back next time. Hopefully, you'll talk about it.
Colleen
You'll have all of your life questions answered.
Aaron
I hope so. As as my guru, I need Colleen to tell me. The other thing that I want to talk about is this numeric optimization.
Colleen
Okay. Tell me, Tim
Aaron
Horton up with, tell me about it. So been reading, excuse me. I've been reading these sequel books, right?
Colleen
Yes.
Aaron
And I actually just got 2 Postgres books because I probably need to know more about Postgres because I know nothing about it. Yeah. So I've been reading these sequel books. And one of the, clever things that they're talking about in terms of indexing is when you use, like, a, let's say, number is between 110. Right?
What MySQL is gonna do is it's gonna do, like, a range scan, which is, you know, can be can be index, assisted. Right? So if you have an index on that thing, it is index assisted. However, it is faster and more performant in many cases to say instead of number between 110, to say number n and then do the parenthesis and put 1, 2, 3, 4, 5, 6, 7, 8, 9, 10. Right?
Colleen
Okay.
Aaron
So that's called a a multiple equality versus a range.
Colleen
Okay.
Aaron
Right? So the multiple equality in my SQL is not evaluated as, like, a equals 1 or equals 2 or equals 3. Like, it's that's not how it works. That would suck. That's no good.
It's evaluated using it's it's a multiple equality, so it gets to use the indexes. So it's lightning fast.
Colleen
Okay.
Aaron
The other benefit is, let's say you have a multipart index. Wherever and it's like column a, b, and c. And if you are searching on column b, so it's right there in the middle. A, b, and c is your index. Column b is in the middle.
You're searching on column b, and your criteria for column b is a range. So you're like a equals 1, b between 110. So column B is a range. It can't then take advantage of the third part of the index column c, wherever it reaches the first range condition, going from left to right, it stops. There's something called like loose index scanning, but it's just, you know, it stops.
So you can't use the whole index. It stops when you reach the first range. So all that being said, I realized for cases like our numeric condition and potentially our date condition, if it's a date without a time, I realized that are you still tracking with me?
Colleen
Yeah.
Aaron
Okay. You had the furrowed brows. I couldn't tell. I realized that, in a numeric condition, if you don't allow floats, so it has to be integers because if it's a float, then the range is infinite. Cause you can just keep going smaller and smaller decimal points, right?
In a numeric condition that doesn't allow floats and you know the bounds of the data, we can transparently optimize the user's intent of show me numbers between 110. We can transparently optimize that to show me numbers in 1, 2, 3, 4, 5, 6, 7, 9, 10.
Colleen
Right? Yep.
Aaron
So that's great. So we can do that for between clauses. But we're kinda hosed on less than, greater than, not equals, not between. Right? So what I added was, the ability to define the minimum and maximum bounds of the numeric input.
Colleen
Okay.
Aaron
So let's say you're setting up a condition for, like, you know, users age or whatever, you can say that the minimum is 0. Like, you know that it's it's not negative one.
Colleen
Right.
Aaron
So if you say the minimum is 0 and the maximum is, I don't know, 120, 80, whatever. Not only does that validate the user's input on the front end, so, like, you're not gonna get garbage in. So it'll validate that it's between 80 and, 0 and 80, but we can also then use that as one of our bounds for numeric optimization.
Colleen
Yep.
Aaron
Right. So if we say like in our, in our app at work, like we have to choose a year for certain things, and we only have data going back to 2018. So I can say the minimum you can choose is 2018. The maximum is we'll do this year plus 1. Why not?
And so now we have what? Five values? 18, 19, 20, 21, 22. So when the user says, oh, I want anything after 2018, I can convert that from a range to a multiple equality because I know the bounds of the universe. And if they say I want anything that's not 2021, even on a not equals, I can convert that to a multiple equality and just take the 5 that I know exist and take out the one they're not looking for and use those 4.
So I can and and it's great because we have this issue where not only is our app living or our library living in an unknown environment, but then it's being used by users. And so even the developer doesn't really know exactly how it's gonna be used. And so if we can apply these transparent optimizations when the data fits, I think we're gonna be able to really increase a certain number of queries, you know, not all of them, but we'll be able to offer these optimizations and tell the app developers, like, listen. We've done everything we can. We've probably done everything you can too, and it's gonna be as performant as it can be.
Colleen
As possible. Yeah. Yeah. That's cool. I like that idea.
Have you started doing that at work? Have you played around with it?
Aaron
I've played around with it on our work data, and I've implemented it in, Hammerstone's version of refine.
Colleen
Okay.
Aaron
The work the work version of the filter builder is completely independent because of my employment contract. So I'm not using this optimization at work.
Colleen
Got it.
Aaron
But I tested the, SQL on work data, if that makes sense.
Colleen
So how are you defining those bounds? Is that
Aaron
So it's just another in in our world, in Laravel, it's just another, fluent method on the condition. So just another attribute on the condition. So I would say numeric condition, name is age, men is 0, max is 80.
Colleen
Got it. Cool. I like it. That's great.
Aaron
Thanks. Awesome. Cool. Right?
Colleen
Yeah. That's super cool.
Aaron
And I realized we could also do this, potentially on dates provided there's no time data.
Colleen
Okay.
Aaron
So, you know, on on the columns, you can have, I forget all their names, date, date, time, time stamp, all all that garbage. The ones that are proper dates with no times attached to it, those are finite. Right? With time, it's not really finite because it's continuous. So with dates, it's finite.
So if it's a date column, and we know the bounds, and it makes sense. We don't, you know, if, if the range is a 1000000 items wide, we're not going to do that. We're just going to use the engine to do that for us. Yeah. We can also perform that optimization on dates.
I think that'll be less useful because I think most people are using, timestamps where they have the date and the time that like the thing happened. But why not? It's free for the app developer.
Colleen
Yep.
Aaron
Like, if it works, it's a bonus and if it doesn't, you're right back where you were.
Colleen
So. Nice. I like it.
Aaron
Interesting. Right?
Colleen
Yeah. It's super cool.
Aaron
I'm curious if there are any other things like that out there. Because, like, the breakthrough I had was, why doesn't MySQL do this? That was my question. And the answer is because MySQL doesn't know MySQL doesn't know the bounds of the data. Right.
It knows what's currently in there. Mhmm. But in terms of, like, business requirements, it doesn't know the logical bounds of the data. And so it it just it can't make that optimization because it may do it wrong.
Colleen
Mhmm.
Aaron
So yeah.
Colleen
Awesome.
Aaron
Cool.
Colleen
Very cool. Yes. Yeah. Very cool.
Aaron
Super pumped.
Colleen
Yeah. Nice.
Aaron
Yeah. I was pleased with that one. Alright. I've got 7 minutes before proper meeting. What do you got?
Colleen
Well, also, I'm trying to get the query builder working with sample client data, like, a bigger set. I don't I can't obviously do a 1000000000 records, but with the the bigger set of data. Because we've been leaning really heavily on our tests, which are great, but, you know, spell out the SQL. So I think that'll be a big win to be able to show them the data query builder working on their data. What you said earlier about grinding it out and, like, just kind of Mhmm.
It's, like, mostly done. And the client wants these amazing optimizations, which are gonna be so great, but it's a lot of stuff. And, I feel good about it. I feel like all of the really hard, like, is this even gonna work? Details are worked out.
So now it's just execute. But there's a lot there's a lot to execute. And there's a lot, yeah, there's a lot to execute for these guys. And so, hopefully
Aaron
gotten to show them the sizzle yet? Like, have you shown them, look, this works, and now we're talking optimizations? Are we still
Colleen
No. Because they the reason the reason that is the reason I don't have anything cool to show yet well, hopefully, if I get that sample data in Mhmm. And get it working on that, that'll be a little bit better. But, the cool thing that they really wanna see are the safe filters reapplied elsewhere.
Aaron
Right.
Colleen
And so
Aaron
Which is super cool. Yeah.
Colleen
Which will be super cool. And the back end is getting really close. But, it's not quite done. And the front end is really the challenge there for me is is how because I'm gonna have to basically, like, for example, if you wanna get if your, like, nested filter is a product, and it's related to contacts and you're on the contact filter, I'm gonna have to somehow examine all of the relationships on the contact model,
Aaron
Mhmm.
Colleen
Sort through the available filters. I haven't figured and then provide them in a drop down. That's what I think I'm gonna do. That's my plan. So there's, like, just lots of stuff like that.
It's, like, how is this exactly gonna work?
Aaron
Mhmm.
Colleen
And it's gonna be so great, but it's still it's it's still a lot of a lot of things, to finish up there. So
Aaron
And you don't have like that, the same thing I'm feeling. You don't have like that emotional win of having shown them, like, look, this works and it rules. So there's still this, like, what who knows what they're thinking? But what you're thinking is, do they doubt that this is ever gonna happen? Do they doubt me?
Am I an idiot? Like
Colleen
That's exactly what I am
Aaron
You don't you don't have that win of, look, this freaking thing works. Let's talk improvements and optimizations, and that that is the trough of despair.
Colleen
That is a 100%. Like, Eric, that's so funny because you you hit it on the head. That's exactly the state I'm in right now. So I'm like
Aaron
Listen, if you wanna talk feelings, I'm your guy. I God. That's exactly how I feel.
Colleen
Oh, man. So yeah. So Alright.
Aaron
Well, I gotta go. You
Colleen
gotta go. That's okay. Alright, man. It was good chatting with you.
Aaron
Alright. Talk soon. Talk to
Colleen
you later. Bye.