 OK, I'm going to get started. So my name is Chris. I'm going to talk about this Arduino cat faucet that I made. So I'm originally from DC, the DC area. DC is pretty big. And about five months ago, I saw this huge white star in the sky. So I went to the star, and I got on this red line that took me nonstop. I traveled by map, and I arrived to Portland about five months ago. And then from that red line, I got on another red line and it took me through some awesome cross-dissolve fades and took me to Nepal. And there I met Dr. Jones, and he taught me all about electronics. I put some of those electronics on my belt, and I helped to save the goonies. After that, I made this cat faucet for my cat. This is my cat. And I actually didn't want to bring this up. But right before I moved to Portland, she died. This is not about a dead cat, please. That's why I didn't want to bring it up. OK, so she was an awesome cat. And so now this talks of the dead cat talk. But there's no way I can say she used to drink. It's like English has betrayed me. So I had a lot of fun building this project, and I ran for a long time. And the reason why it stopped is because she died. So yeah. OK, so the reason why this came around is you're going to say, this guy has too much time in hand, and you're right. But there's some insight here that hopefully is valuable to you guys, is this job, and then this job, and then this job. So there's a gap in the first job. And this is like, I was talking to this non-technical boss that's a really large company. And he was like, well, the contract's over. And there's six weeks of no funding. So we're sending everybody home. And I'm like, awesome. I get to work on my spike list. So he's like, spike list, what's that? And I said, well, it's like technical people, and that's sort of like athletes and musicians. And I was trying to go through this thing. That's when I realized there's a difference between people that talk about stuff and then the practitioners. So you can be a music critic, and you can be a musician. But the musicians have to practice. So basically, I had six weeks. I learned a bunch of stuff. It was super awesome. So about 2010, the second opportunity came up when I got a new job after the red job. And the red job is Oracle. Oh my god. OK, so yeah. OK, I'm not even going to go down that rabbit hole. OK, so yeah. So I talked to this other, my current job, the orange job, which is super awesome. So I was like, everything's good. We got a start date. And I was like, do you mind if I push it back a month? And I'm like, why? And I said, well, I want to work on my spike list, because now this is like a thing I do, right? So they said, yeah, that's awesome. That sounds great. So I got a month off. And that's when I built the cat faucet. OK, I did some other stuff, but the cat faucet is the main thing that I did. OK, so why? Why would I do this? So my cat likes to drink fresh water only, not the little cyclic one, not like from a bowl. She knows it's cold, it's fresh, she can tell. So that means you have to go up, you have to turn on the faucet, and you have to stand there for one or two minutes every day. And so I have all this time to think about this problem. Like, I could build this, right? And I told my wife, I was like, I could totally script this. So it really bugged me. So that was the first thing. So this is my dream. So it has to automatically water, right? And then I wanted to know, is this about water or is this about control, right? So is it the process of watering her or is it the actual water? So if I logged it in the middle of the night, no one's up, right? Like if she goes and gets it, right? Then I know that it's about the water, right? So the other thing is I had to be temporary. So I can't like put holes in the wall, no like vampire tab. There's a lot of like tutorials on the web or there's only like two. But about like putting a vampire tab was like a solenoid valve. And I didn't want that, had to be like temporary. So I can move it to another sink and yeah. Okay, so like a staycation time starts. And I'm just like, this was like an hour or like two hours, like just staring at the prom, right? So I'm like doing like read me driven development. I'm like, what do I want? Like how do I want it to work, you know? So I'm like writing to read me first. And I'm like, I don't know. This for me was like a thing, I don't know. So like, I would like stare at the sink and like make like imaginary lines like where I wanted things to exist in space. And that actually really helped. Like just like the visualization was like this thing was going to be 3D and 3D can be kind of hard to like visualize. So I stared at the sink. So I stared at the sink for a long time. And then I like started like sketching. So I go to the sink, sketch, go to the sink, sketch. And like I made all these measurements, which I didn't use. Like I was just like, just, you know, just throwing out everything. Like my numbers, numbers are good. You know, so eventually I had like this flux capacitor moment, right? And it was this box. It came to me Marty, you know, or something. So like this box was like all, like everything else. You can just like Gaussian blur the rest of it, you know? But this box was like the thing. And like once I had this plan, like that was good. Like the plan, it's plan is plan. If it doesn't work out, it doesn't work out. But like once I had the plan, like it's time to put down the paper and like start building, right? So this plan is not the final thing. It's just a, it's just a plan, right? So I, but I knew that like this was the plan. And I knew the plan was good enough. And I don't know why. I guess that's just like intuition or something. So I was happy with that. So I had to like make this box, right? So, so now we're going to start like looking how I build it. But before I do, I want to get like off on a tangent which I'm really good at doing. I want to talk about the movie Edge of Tomorrow, which it was, okay. It was an okay movie. I'm sorry. I'm not like, I'm not like a huge fan, but it makes like a perfect metaphor. So, and someone, Justin Starles talked about this, RubyConf this year. When you're looking at work, like in mind, my project is definitely not the perfect run. Okay, does everybody has a movie? Yeah. Okay. Of course, no, so now I have to explain anyway. Like one person doesn't know, so I don't know why I asked that. Okay, so like in the movie, it's basically like a respawn, like gaming kind of movie. So like he dies, but he remembers, it's like Groundhog Day. So like he dies, he remembers what happened. And then, but he like dies like 200 times in the movie. I'm not swallowing anything. It's a fun movie to watch. But like, by the end of the run, the enemy, like it looks like Tom Cruise is perfect, right? Because he knows like he, this guy popped up. He got killed. So like, he responds like, I know that guy's going to pop up. So I want to avoid him, you know? So like that's what like, when you do a git rebase like for a feature branch and like someone looks at your code like, wow. Tom Cruise is amazing, right? So like that, that's like the point. This was Justin Sirle's point, not Edge of Tomorrow. He said it much better than I'm saying. But like when you watch the, when you like do a git clone and do an LS, you're watching like Tom Cruise's final run. You, you know, but when you do a git log and do a diff between each of the, each of the commits, which nobody does, that's like watching the entire movie. Like Tom Cruise died like 200 times. Like someone died, like making these git logs. Like they suffered, you know? So I'm not saying, I'm not saying it was perfect run, but like in terms of retrospectives, like I'm telling this to myself, like just try to like imagine the git log and the git diff, okay? So I'm trying to walk you through the git log and I hope I, I'm not being too pedantic, but I'm really trying to like go through the git log. Okay, so at that sketch, the sketch had like little features on it. So I did like little call outs. So this is like, like feature breakdown sort of. So like I knew that like, there's like a handle. And so I know that there's like two points of forces I need. There was those little circles above handle like one point of force to bring the lever out and one force to bring it back. So I knew whatever it was, like it had to do that thing. And then there was like some positioning drawing and I was like trying to figure out like where everything was going to go. And then I made a mock object. This is my mock object. Okay, so it's the height of the sink and it's like about the width or something. And it's got a handle that moves 90 degrees, which is this like Allen wrench like shoved in there. It's got duct tape and it's made out of wood and it's not spelled right. And it's got a cap right on it. Okay. There's some like pseudocode. Actually, it's really hard to see but there's like cat equals true up there, which is pretty cool. So like, I was just like kind of like going through the pseudocode. Like, is there like some logic? And I'm like, no, this is all easy. It's like just like if statements and stuff, which is good because I had to write to see. Okay. So there's like my mock object in use. Like I knew I had to like levitate the servo like above the the the fulcrum point of the handle, which I'm going to talk about why that is in a second. That was kind of something I sort of figured out not on purpose. So after like playing with the prototype and stuff, I had I came to the conclusion. I needed to spike. I need to spike on two things. And there were like three questions that I needed to answer. And this was not a formal thing. This sort of like was all rattling around us. Right. So I needed something that detects cats, like that knows that the state has changed. Like the cat is there, right? And does something or at least knows about that. And then I need something that reacts to that that like actually moves the handle correctly, like at the right speed, like it doesn't rip itself apart. You know how computers are like, yeah, move the handles. You know, or like, I don't know. So, and then there was like a, there's some questions like torque, like how do you measure torque? I don't know. There's like a, there's like a device you can buy it is like a thousand dollars or something. So like, I don't even know if like what I'm using, which is basically USB power, like five volts is like even enough to move the sink. Like what sync do I have? I don't know. So there was like, there was like a whole rabbit hole thing and I luckily I avoided it. I was like, okay, if it moves it, it moves it. Who cares if I need to measure it, you know? So like, it's funny. Anyway, okay. And then like, I knew I needed like a precise structure. So I started getting the impression like, I need to levitate this thing. I'm not good with wood. So I can't make it a wood. Can I make it a Lego? Can I make it out of like, you know, putty? I don't know anything. So like, I knew I needed something like really precise and I didn't know what that was. And because of that fulcrum, I had to like put it like right over the sink, the server right over the sink. And there was a question of like anchoring, like how am I gonna like, it's gonna move something and the opposing force is gonna move it. So like, how do I keep it from moving without putting holes in the wall, right? Okay. So like type, type, type, research, research, precise structure stuff came to the micro-rex. Has anybody heard of this? Wow, okay, awesome. Micro-rex are really cool. They're a little expensive, but they're basically aluminum channel, they're like maker beam. You heard of maker beam? So I think this came a little bit before. It doesn't really matter. There's open beam or maker beam, micro-rex, open beam I think. Now I sound like an expert on this stuff. But it's basically like channel, you get them in like some straps and then you can hacksaw them down. So this is like me looking at my drawing, hacksawing the parts that I need and it comes with like connectors. You can basically just build any 90 degree object you want. So here I built a rectangle, right? So this is like my abstraction layer. So I put it on the sink and I'm done with like the sink part. So now I can build anything on this frame and it's gonna go around the sink, right? So there's the abstraction layer in place. And also I learned like my anchoring question was answered by this because I could just tighten it and it would kind of squeeze the sink. So there's another beat, like don't big design up front, right? Because maybe your questions will be answered later. Like if I'd gone down like the anchoring rabbit hole, like ordered glues and stuff, you can imagine that I've been like a waste of time. Okay, so I've got like, that's the 2D thing. And now I need to like start building up because I need to like levitate some things in the air. So I started building up and I realized that like building 3D, like the more like intricate of a shape, the more connector pieces you get is kind of weird. So like this is now not four beams, it's eight beams and it's got like a lot more connector pieces. So like I ran out of connector pieces. I ordered a, yeah, so I ordered some more. I also ordered the server amount. There's like a micro-rex compatible server amount. So that like sat right where I wanted it. And then there's my cap deploy, right? Here's my first deployment to like production, right? Okay. So like, you can see like, so this is like trying to show depth on a two but an actual picture, but like the screwdriver is Z-aligned to the center of the servo. So you can see that it's like right over that little circle on the sink. So right over the fulcrum. Okay. So the reason why it needs to be right over the fulcrum is if you like have two levers moving together, you have to like engineer if you want them to like go together. But if you just put them right on top of each other, then you don't have to engineer. Otherwise they're gonna do like something like this. So that just, I don't know. I didn't read that. That just kind of like, I was like really thought hard and that was, I don't know, an epiphany moment for me or something. Oh yeah, it needs to go right there and that's the only place you can go. Okay. So a servo, I never even like use a servo for anything. Comes with all these adapters. Like there's some circle ones at the top and one of them is the star. So like a servo just spins. So that's not gonna move a sink out. So I need something that like attaches to the arm itself, right? So I need an arm. So how am I gonna attach like, how am I gonna make an arm like out of this beam that goes to the servo? Like what is that even? What is that even? So like basically I got lucky and those like two of the adapters sandwiched the star and then I can put the L, like this little L piece like in between the sandwich and then once I'm in L piece land, it connects to a beam, right? So there's my arm. And that was totally lucky. That was just like play mode. Like we should all be doing. Get in too preachy, pull it back. Okay. Yeah, so there's my arm in practice, you can see. So now I need to like attach it to the arm. So I tried like rubber bands. I actually tried like Velcro at some point and I actually ran like this for a while. I had like another like extra pieces acting sort of like fingers. You can see it's kind of like holding on like you would like move it with your fingers. So I was like, well, if I want fingers why don't I just build fingers? So I built fingers. And I took off the excess, but like the rubber bands are like where your fingertips would be and that like like give some give and also some stick, which was really nice. So, like action back. Sorry, I don't get it. Okay, right, action back. I see, I see. That would have been me on the way home with, okay. French class. Okay, so that's the hardware thing, right? So you're wondering like, what is this? I think this is not Ruby. So I still need code to detect cats and move the arm. I needed like communication for that logging thing I wanted to do. So I needed like the sync to talk to something, which I want to talk about. And then I needed API and software and like I'm going down the list. I'm like, oh yeah, Rails API. Wow, I'm gonna really spend a lot of time on that. Like it was so refreshing and I'm kind of bearing the lead here, but it was like so refreshing to like just come back to the software world. Be like, oh yeah, I need an API. Phew, I feel like going through all this like physics torque and like electricity and you know, the universe and stuff. So, and of course like for no reason at all, I decided to use MongoDB because we're talking like worst case two requests per day. I actually just wanted to learn, I had like played around with MongoDB like four years ago like another project that I just wanted to do versioning and MongoDB. So it's like, it's awful, yeah, awful excuse. So, like bad engineer, bad engineer, right? Which you'll see the internet react to that in a second. So, okay, architecture time. We need like physio diagrams, okay. So I'm not a senior or software engineer, but like I'm a engineer or principal, Dave. Okay, now I'm gonna practice my Spanish accent. It's terrible, but okay. So like here's the sink we already talked about and then there's like this Arduino thing that's sitting there. Arduino is like a C embedded thing. It's not Linux. It's like a Raspberry, it's a primary prison where I haven't been out yet. Okay, so I went with this Arduino and then there's this, I talked about communication. So there's basically this thing called XB and it's basically, you can think of it as like wireless serial. It's like, remember the old school, like RS-232 ports, like okay, like dating myself here. But like it's basically like, you like turn both of them on and they P2P turn into a serial bridge. Okay, so then I had like, so I had another end on a server and then Ruby is in a serial port gem, watching the serial port reacting to things, which was crazy, which I wanna talk about, and then posting it to Rails and from there on you guys are like, yeah, yeah. Okay, so how I got the, on the sink side, there's this shield and it's in the upper right-hand corner. And it's got this slot. Shields are like basically just like feature kits, I guess. You can just stack them up and it adds a bunch of stuff. These are like, there's an ethernet shield and like this is some kind of like motor thing. You can stack them up forever and they just really easily add functionality to an Arduino. So one of them XB, so you just plug in XB in that and it's good to go. On the other side, this is not my picture, but that little USB cable, that was basically on the server side. So that's XB to USB and from there you're back in like real computer land, right? So like those two things is the communication like physical layer basically. So for the messaging, like more like the app, this is basically JSON over serial. So like when a sync turns on, in this case is running equals true, like the sync is coming on, it sends a message and this is I think really similar to what Jonas talked. This is all your fault by the way. He does a talk, I can do a talk, okay. So I ended up trying to do this hashing thing because all these electrical engineers out there said if you're doing anything over serial, you need to send a checksum because this is not TCP, right? So you, yeah. So the hash checksum? The hash, the idea, and I'll talk about why this didn't work is it hashes all the attributes minus the hash, right? So this is just, so on the Arduino side, it uses the MD5 library to hash and then on the Ruby side de-hashes and just checks attributes. So that didn't work at all and I'm gonna talk about that right now. So you need, it's not TCP, so like this is not guaranteed, like we don't even work with UDP a lot, I don't think, but it's not even that. This is like, there can be all kinds of noise and stuff. So all the EE engineers said you need to send checksum. I was like, great, okay. So the problem is like the main MD5 lib at this time, I don't know if it's changed but like it would work. Like I got this to work but over time it had some kind of memory leak and like the Arduino is like really low power. So like even strings, they're like, whoa, buddy, strings. So, and I'm like, so like it would work but then it would crash and like when it crashed it's not like, it would tell you, like it's like CPU lock, you know, it's like just stops blinking, you hit reset. Like this is not Linux, it's like, there's no SSH, you know, so it just like crash hard, like I don't know if any machine would like, what's going on or something. So yeah, so like then reading JSON off serial was really weird because it's basically streaming in. So like if you get a JSON post it's like a thing, right? But off serial it's more like stream. So like it's just coming over characters at a time. So I ended up like writing code to like work and this ran for a while but it was just kind of weird and I'm basically, I'm gonna talk about why but yeah, okay, so I'm gonna show you the code but I'm gonna apologize first which you should never do but it was basically like three different types of code. So this is a long time ago, Rails 303, Mac ports, Homebird didn't exist, we were all running Leopard I think. So like this, there's like three types of code. The code you don't want anyone to say ever. Code you refactor and you're okay with it but you're coming. And then there's like textbook quality code that you emboss in your shoes so that when you walk you leave beautiful footprints. This is definitely like code number one so I never ever ever wanna do a presentation on this code or share it on GitHub, here's the URL. So this is the serial port gem and basically you open it, you open up a serial port and like tiny variables for, actually I think it is a tiny variable but yeah, totally unreadable, not refactored ever, no tests, yay. But it's basically like, it's like a state, sort of like I'm doing a bad state machine sort of thing but basically like I have an opener and then like on a close, then that's the JSON and then I parse and if you wanna read the rest of it. But basically it does what I said, like it's streaming in JSON, I know it's gonna be one message and then when I see it close. Now the problem with this is like it doesn't, well it posts like this, right? This is what it looks like when it runs. The problem is like when you like try to embed documents, this wouldn't work, the code wouldn't work at all. Yeah, if I was gonna do it again, I probably wouldn't use JSON, I like JSON but I think most EEs or embedded people would use like some kind of binary protocol which essentially works the same way but you would I think more gravitate towards this kind of state machine thing I think and this is probably like a Ruby developer goes embedded, goes to Washington type mistakes or something, right? So like yeah, definitely do something more like this where you're basically like trying to write a parser so you'd have like a count and you can even like put brackets instead of braces and then you could actually parse like an array of documents. Okay, anyway. All right, so here's, are there any EEs in here? By the way, any EE majors? Wow, it feels so much better. Okay, not so embarrassed. Okay, this is like prototype wire and kind of did this a long time ago. Okay, so yeah, you would not use prototype wire. You just pull it out, yay. There's a breadboard, you don't use that either anyway. Okay, so that's like the sink and you can see the modem here, the little antenna and I put it in a project box and like stuck it into the sink and hooked up the sink. You can see I was still using Velcro at this time. Yeah, so I had like little hookups so I could like easily debug it and that was just weird. Okay, and there's like the final thing, like I made more of a box and ended up like clamping it down some more and stuff. Okay, and the infrared sensor's not here but enough talk, oh, the internet connection's offline, no. It's on YouTube, oh no. Yeah, it's a guess. Yes, but you can only use the hot water. I mean, you can move it and it goes, right. What is that? Ruby, thank you. Okay, ding, ding, ding, ding, ding. Yay, yeah, she was great. So that was the first run, that was my first run. Right, yeah, thank you. Okay, yeah, so like when that turns on, like that's an event to Rails, when it turns off, that's an event to Rails and then I can do a report. So we're gonna talk about that. So yeah, like the dripping was solved, like that was all tweaks and stuff and then I put it in the sink and it ran for a long time. So that was four years ago, which was really cool. Okay, so back on the Rails side, it was probably more interesting. I had this Mongoid-based document thing, which I called Sink, creatively, was yellow and white text, that's awesome. And basically it had like, this method was really large, really large, not refactored, not tested, it's a cat faucet, guys. Okay, so like basically it gave you this method, plot by hours, and I was using Flot.js, I don't even know if D3js, I don't even think it was a thing. But it gave you this histogram. So you see, this is 2,300 hours, 20%, 2,200 hours. So that's like what it thinks the breakdown of when my cat drinks at what hour of the day. So I'm gonna figure out does she drink at night when we're asleep? All right, that's my goal. So this plot by hours, all it does is present the data to a JavaScript, and JavaScript's gonna render this really, really terrible graph. I use versions, so like when you're dealing with like collecting metrics, here I am talking at New Relic about collecting metrics, I'm an expert. I just, I went the route, like there's, you can like shove it into an archive table, which I've seen other like things do and stuff. You still have to like select from that, so. I knew I didn't have a lot of data in MongoDB. This ran so long, like MongoDB's like document limit, got like quadruple or something like that. So this ended up becoming less and less of a problem. I don't know, maybe everyone's doing what I'm doing. But basically like you just mix in the versions thing, and it just creates this versions attribute, and it just like shovel operators the state onto the versions. So it's like versioning functionality in the MongoDB, it's pretty cool. So I decided to go that route, and then you just have to go get all the versions and do the, you know, the munging, the data munging to suck it out. So there's that 2040-40 histogram. Here's what the graph from my wonderful UI design skills. Notice that this is the Railscast theme. This is when Railscast was still a thing, and like actually running, and he posted a CSS, that's how long ago this was, December 2010. Yeah, so more data, like an icon, probably not font awesome, no authentication, nothing. This worked on the iPad though, which is cool. You can go around the house. Yeah, feature creep, okay. So eventually I got sick of my Rails app, just like the graphing and stuff, silent JavaScript errors and stuff. So I was already looking at this for Nordnetrix gem, which is like a, it's a Ruby gem that has like a built-in Sinatra server and database and stuff. And this project's been like in flux. He has a pro option now, and it's, I don't know, yeah. It's one of those gems. I really like it, but it's been in flux, right? So the only way I could get the histogram view was this kind of like huge meta view, and it's trying to like do means on an hour, so this is all just garbage, so. But you can't customize it really. So if an order is great, if you just use it for what it does out of the box, it's kind of hard to customize. I'm sorry if the author is listening to this, but I think he has like more pro thing. He like switched to Scala, and then I think he's got like a pro thing. So the project's been under a lot of development and stuff. But yeah, for Nordnetrix, it's pretty cool. It's a cool gem. A little gem server. It's got a Ruby client and you just send it a message. So it's the easiest setup. And you see I've got like 400 samples at this point and a 406 of the screenshot and I had a lot more. And this is like where I basically answered the question. So the graph got bigger, but basically like kind of the shapes stay the same from 2 a.m. until 5 a.m. She didn't use the faucet. Yeah. And that became like more and more clear. So I don't know if it really answered the question, but it answered one. She doesn't drink at night. So or she like almost never drinks at night, right? So she only drinks up when we're up and moving around. Okay. So that's how the project went, but what were like some of the problems? So like I've found like this magical method. This is like C, but detached, like turns off electricity to the servo. It would like, it would like try to turn, but then like not make it, it would be off. It would like try to move to five, right? And it would be at like, you know, 501, 5.01. It would be like, I need to go five and like never get there. It just like, just buzz, you know? So detached solved it, but didn't really solve it. And that's just kind of like a dragons, there be dragons thing. Yeah, C code, fun. The frame torque was weird. Like I kind of like anchored it down this best way I could and like kind of iterated on like how to clamp, where to clamp and stuff like that. Flot JavaScript was hard to like deal with and like the data formats differ than every other JavaScript library. As you guys probably know, like X, Y, you know, doesn't want pairs, doesn't want like an object, like the order, doesn't want an array of arrays, you know, doesn't want more than that. That was kind of crazy. And then like this ran for a long time. So this is like when I did like disk upgrade on Ubuntu and stuff, I actually had a point where someone introduced a breaking, as I'm using the serial port gem, like the kernel broke serial, but then like, then there was a patch, but that patch broke networking. So like out of SAP and like the kernel would like panic basically. So I could either have the cat faucet or networking and I wasn't cool with that. I had that both. So I like figured out DKMS and blowout. So that's like, actually, I don't want to talk about it. But yeah, it eventually got fixed. I'm not bashing on Linux. Eventually it got fixed, but it was kind of crazy. I think I'm in like this weird edge case. Like who's running a serial port? Okay. So world's reaction, world's reaction. Like this was just like a stupid toy project from my house, but Hackaday picked up on it off my blog somehow. I don't know. So I posted my video and 21 comments at this time. And there are some real gems in that comments. Let me tell you, let me tell you, you know, like, I don't know. I know there's like some people that like have internet like notability and stuff, but man, you really remember those negative comments. Like 10 people say nice thing and then one person, don't read the comments. Yeah. Okay. And then the actual store where I bought the components like put me on their homepage and that video is broken because I moved it. But my friend, my friend like called me and he's like, dude, you're on smart phone. I'm like, what? I didn't tell, I just told like friends about this, you know, so I don't know. Someone's like Googling for everything. Arduino or something. I don't know. And then Adafruit, a shop that I didn't even shop at at that point, but now I do. It's an awesome store. She runs a really amazing site and awesome videos if you guys are interested in any hardware hacking and stuff. This is like some other form, random form or something. The reason why I took the screenshot, this guy said he would have done this. He wouldn't have done X, Y, Z, but I'm surprised he didn't run MongoDB on the Arduino. So, so Arduino's not Linux. And like I said, it had a hard time with strings. So I don't think there's like any part of the MongoDBC like base, like daemon part that it could run. I don't even think it could run anything. But that's okay. Everyone's entitled to their opinion. That's fine. And this is funny, like subject all current buzzwords one project. Yes, I agree. I totally agree. MongoDB, Arduino and Rails, yes. Okay. So we had a science fair at work. We had a science fair at work. So I brought it to work and the architecture digger and everything you see it. And then I brought a little stuff cat to like trigger it and like shut everybody. The funny, the reason why I included this is I met this lady. She was super nice. And we just talked. She had built a laser fence for her kitchen counter. So like when the cat trip, you know, it always jumps like in a certain way. And it would trip the fence and set up like a little Pizio speaker and it would be like the annoying like ringer thing and like scare the cat off. So I did not expect that but it was super awesome to talk to her. We were like, and like everyone's saying nerds. Okay. So like the coolest thing though was like this was like a thing around my house, right? So like people come over and like wash their hands. Like, what is that? You know, so like everyone's, everyone's like, we're talking about the project and it was just like so much fun to show off. And that was like kind of like maybe we started like doing a little bit more hardware hacking. Playing around with like RSpec3 or something like some new really esoteric and abstract thing is interesting but it's really hard to like demo that. You know, especially like kind of outsiders. Not trying to create a line or a group but like the demo factor of like physical things and hardware hacking is a lot of fun. And you can have code on the back end that they don't care about. So yeah, that's my daughter wondering the cat. She like learned to play with the two. I think she's like one at that time. So yeah, so my own reaction to it was like the firmware thing. So I could just talk about this I hope I'm not running out of time. Firmware is like a thing that people know in the general populace. Like firmware is the thing I update my router and my phone, blah blah. But like this is like one piece of firmware in my house. Like basically just software that's embedded, right? That I have to update. So like if it doesn't do something I want I have to like take my laptop over, a couple USB like update the code debugging. So like that was just really weird. It might sound really strange but like everything else is just gonna like take care of itself. Oh, damn you, Sony, you know, new firmware that break my BS3 or whatever, you know or damn you, Apple, including whatever, you know but like this firmware was like mine and like I had to like maintain it. And that was just, that was really strange. Like why isn't this cat faucet working, you know? It's because you're forever. Exactly, yeah. So and then like I was surprised like how long this ran. Like once it kind of like got all the kinks worked out and like solve the instrumentation, need questions and stuff. This thing just like ran forever. Like embedded is really awesome. It just keeps going, it's got no problems. I already talked about everything. Wow, I've got an empty, oh that's awesome. Okay, so I'm gonna talk real quick. This is almost over. Some things that I learned from it. So like basically Arduino is like really low in memory. Like just get your problems away from C as fast as you can. Like if you're gonna solve one thing and you can solve it in Ruby, just do it in there. Just run away. Like especially strings and stuff. See, it's crazy. I respect anybody that does C code. Like we're so like focused on like perfection and stuff. Like true, false, true, false and stuff. But like micro racks is like tolerant. There's like such like engineers in this room. There's like tolerance. So like it's okay, you're close enough. And like I found out like micro racks, I didn't have to like get down to like one sixteenth like accuracy, it can adjust. And a lot of other things can adjust too. There's like tolerances. Yeah, like if you're gonna build something like a cube order, don't order length order lots of bolts and the connector stuff, right? If you're gonna build something long and simple then just get length and a few connector pieces. I guess that makes sense if you think about it, but I didn't, I also didn't know that servo torque changes with voltage. That's cool. Like actual physical installation is really tricky. Like you have no idea, there's no tests. Like I don't know, like it doesn't fit. Okay. It doesn't fit because you're an idiot. Okay, let's go back. No problem. Don't favor tools like I did. Mongo was actually kind of weird sometimes. And I knew I was like forcing the solution in there. Okay, we're almost done. So I already talked about that. I already talked about that too. And yeah, I already talked about that too. Like hardware is really weird and I love coming back to software. It was like a cool breeze. Like all the problems are easy. I already know everything and everything. And then like throwing away the app was kind of annoying or at least painful sort of, it was okay though. I, you know, it didn't work out. You learn something and you'll always remember it. That's fine. Just delete it, just delete, delete the dead code. No problem. Okay. But the biggest insight of all, I think the point about this is like the thing that helped me think the most was this like the staycation thing. It was like showing up every day and like not having a lot of distraction. I'm not saying like be a shut in, but like the just like the staring at the problem and like unhealthily obsessing about the problem or whatever was like, I think what really like got me from beginning and without like some other distraction or some other like, you know, fat or something coming in and distracted me. Like the staycation where you could like, there's something I want to learn. So I'm just going to like work on this and I'm going to take, I'm going to make time for myself and I'm going to like work on that. I think that's what it was. It was the contiguous part. It wasn't like, I'm going to work in the evenings. I'm going to do it here and there with little bits and pieces. It was like the really big chunks and stuff. So that's, that's what I took away from the entire project anyway. Thanks. That's it.