Speaker 1: Hey, folks, welcome back to another episode of JavaScript Jabber.
Speaker 1: This week, on our panel, we have Dan Shapier.
Speaker 2: Hey from a still warm Tel Aviv.
Speaker 3: We also have Steve Edwards Hello from Oregon where it
Speaker 3: is finally officially fall, and a j O'Neill.
Speaker 4: Yo yo yo, coming at you live from now the
Speaker 4: fourth straight day of twenty four to seven. Vertigo.
Speaker 1: Well that sounds fun. My mom went through something like that.
Speaker 1: She actually went to the er, but they just told her, yeah,
Speaker 1: she had some kind of vertigo. Anyway, I'm Charles max
Speaker 1: Wood from Top End Devs, and this week we are
Speaker 1: talking about our stimulus and turbo. If you're if you
Speaker 1: can't guess, this is something I put forward and I
Speaker 1: decided that I would just come on and talk about
Speaker 1: it myself since I use this every day and I'm
Speaker 1: loving it, so I'm anyway, I'm kind of curious that
Speaker 1: have you guys heard much about hot wire stimulus or Turbo.
Speaker 3: Well, yeah, I use it for to find plane tickets
Speaker 3: all the time.
Speaker 2: I've kind of heard about it. I know that it's
Speaker 2: big in the rails world where I am not present.
Speaker 2: I know that it's kind of like HTMX in a way.
Speaker 2: But that's more or less. Yeah, that's more or less
Speaker 2: all that I know about it.
Speaker 1: Yeah, yeah, it looks like they all go together.
Speaker 4: I'm looking at the web page.
Speaker 1: You can use them together, you don't have to. So
Speaker 1: so I'll give a little bit of history on this.
Speaker 1: So David I was calling David. Everybody else calls him
Speaker 1: DH and I don't know why. But anyway, so, way
Speaker 1: back in the day, he created a system for Java
Speaker 1: in JavaScript for rails apps called turbo Links, And effectively
Speaker 1: what it did was it would reload. Initially, I think
Speaker 1: it just reloaded the body of the page, so if
Speaker 1: you click the link, then uh, turbo links would intercept
Speaker 1: the click, and then it would load just the body
Speaker 1: of the page or just certain sections of the page
Speaker 1: so that it would load faster, right because it didn't
Speaker 1: have to re render the entire page. Turbo is kind
Speaker 1: of the successor to that.
Speaker 2: Before before we go into the successor, I want to
Speaker 2: better understand that aspect. So basically, it did an HTP
Speaker 2: request to the back end, presumably with a slightly different header, uh,
Speaker 2: and then it would get the response back. Would it
Speaker 2: be like HTMX, would it be like basically HTML?
Speaker 1: In the response was HTML in the results and.
Speaker 2: Then and then it would basically do in like a
Speaker 2: diff like an HTML equal whatever the response was or
Speaker 2: something along the lines.
Speaker 1: Yeah, basically, and I don't know all the internals on that,
Speaker 1: but yeah, basically that's what it would do.
Speaker 2: And I assumed that it would also like work with
Speaker 2: the history API, so that back and forward would work properly. Yep.
Speaker 2: So it's just similar to HTMX in the sense that
Speaker 2: it would It was a mechanism that allowed you to
Speaker 2: replace portions of the page rather than the page in its.
Speaker 1: Entirety right, But turbo links when it was out was
Speaker 1: kind of a blunt tool, and so you couldn't target
Speaker 1: specific areas of your app or different specific dom elements.
Speaker 1: It would it was literally just the whole page, and
Speaker 1: so it would effectively figure out what change and then
Speaker 1: just update the changes. But it would get the HTML
Speaker 1: from the back end, as opposed to I guess some
Speaker 1: of the shadowed stuff that we see in JavaScript, where you.
Speaker 2: Know, not shadow down virtual dom.
Speaker 1: Or virtual dom where it yeah, where it manipulates, it
Speaker 1: calculates and the manipulates the dom.
Speaker 2: And this shadow dome is also a thing, but it's
Speaker 2: a different thing.
Speaker 1: Yeah, yeah, fair enough. But but anyway, so that's that's
Speaker 1: generally the idea behind turbo links, and you know it
Speaker 1: did it sped up, you know, rendering on on rails
Speaker 1: apps in particular, and that's that's almost exclusively where it
Speaker 1: was used. And then we started to see this proliferation
Speaker 1: of other Again.
Speaker 2: A question before you move on. You said that it
Speaker 2: was mostly used in the rails world, and I assume
Speaker 2: dGH created it for rails for those who don't know,
Speaker 2: the also created rails. Yes, but was there anything specific
Speaker 2: in the technology that kind of precluded it from being
Speaker 2: used with other back end systems I don't know, PHP, whatever.
Speaker 3: In other words, if someone uses it without Ruby, you
Speaker 3: could say that they went off the rails.
Speaker 1: You could take turbo links off the rails. Yes, yeah,
Speaker 1: so so in more recent applications they move to Turbo.
Speaker 1: And so Turbo does more what you're thinking of with
Speaker 1: HTMX right, where you can target specific areas of your app,
Speaker 1: and you can you can replace items, you can delete items.
Speaker 1: Turbo has a number of different pieces to it, and
Speaker 1: this is probably I don't know, I guess stimulus is
Speaker 1: probably interesting to more traditional folks as well, But Turbo
Speaker 1: Turbo has four pieces to it. We're not going to
Speaker 1: talk about Turbo Native because Turbo Native is effectively a
Speaker 1: wrapper around your web app that you can use to
Speaker 1: deploy and put it up native iOS and Android apps, right,
Speaker 1: and so it's it's a completely different technology from the other.
Speaker 2: So it's basically a way for me again without you know,
Speaker 2: we won't discuss in detail, but just to generally understand,
Speaker 2: it's a way to implement a native app using a
Speaker 2: web component essentially with the Rails back end driving the system.
Speaker 1: You can use any website. It just wraps around the
Speaker 1: website and so it turns your website into your web
Speaker 1: app or into your native app. And so it's just
Speaker 1: a native shell that loads without the Chrome your browser
Speaker 1: or a browser with your web application in it. Cool,
Speaker 1: and it has a bit more fit so you can
Speaker 1: provide some native functionality to it, but it's fairly limited.
Speaker 1: And anyway, if you want to just keep the same
Speaker 1: experience across your web and native apps, it's actually a
Speaker 1: pretty good option. And you know, it does, like I said,
Speaker 1: have some tie ins to native things that make it
Speaker 1: kind of a nice seamless experience. It's definitely not the
Speaker 1: right solution for everybody. But anyway, I've I'm still learning
Speaker 1: about turbo natives, so I'm not using it myself. But
Speaker 1: the other three elements of turbo turbo drive and what
Speaker 1: turbo drive does is essentially what we talked about with turbolinks, right,
Speaker 1: And so if you have a link and you've loaded
Speaker 1: turbo into your web page and you click the link,
Speaker 1: then it will go and it will retrieve the page,
Speaker 1: the new page from the server, and it'll bring it
Speaker 1: back and then it'll diff it against what's already there,
Speaker 1: and it'll only change the pieces that have actually changed.
Speaker 2: I'm kind of curious about this diffing mechanism, like, you know,
Speaker 2: how sophisticated is it? I mean, you know, all of
Speaker 2: the v dome kind of exists to do all the
Speaker 2: sorts of a diffing, so like like any parts that
Speaker 2: of the page that haven't changed will not be touched,
Speaker 2: or you know, how does it reconcile? How does it?
Speaker 2: You know the reconciliation is you know, is the is
Speaker 2: the challenge, especially if you've got sophisticated pages.
Speaker 1: Yeah, it uses another library. I think it's called idiomorph
Speaker 1: and and so idiomorph is what does a lot of
Speaker 1: the changes under the hood for Turbo.
Speaker 2: But basically it kind of it retrieves the new version
Speaker 2: but does diffing in order to not replace stuff that
Speaker 2: hasn't changed.
Speaker 1: Right, So let's say you have like a menu bar
Speaker 1: on the top or down the side. You know, maybe
Speaker 1: you're clicking a link and it only changes one small
Speaker 1: part of the page. When it does, the end rent
Speaker 1: to the back end, and when you click the link,
Speaker 1: it may give back the HTML for the entire page.
Speaker 1: But idiomorph is smart enough to look at the two
Speaker 1: and say, I need to merge these right and get
Speaker 1: the stuff from the new page into the old page.
Speaker 1: And so when you do that, it just replaces that
Speaker 1: one piece of the page instead of re rendering the
Speaker 1: entire page.
Speaker 2: Now I'm not obviously, I'm not familiar with it because
Speaker 2: I'm basically learning about it from you right now. But
Speaker 2: there are like three big advantages to this type of
Speaker 2: an approach. One is, of course, that you avoid unnecessary flashing.
Speaker 2: Like you said, if you've got the menu on the
Speaker 2: side and the menu at the top, if they haven't changed,
Speaker 2: you don't want them rerendered. You just want them to
Speaker 2: stay where they are, and you know, stay put and
Speaker 2: avoid the flash of them being arrested and then re rendered.
Speaker 2: Another advantage is that if you've got various form elements
Speaker 2: that you've already put stuff in as a user, you
Speaker 2: don't want them reloading and losing their content. So, for example,
Speaker 2: if you type something into a textbox, if the textbox
Speaker 2: re renders, then effectively it can lose whatever was in
Speaker 2: it if you've not taken special steps for preserving that stuff.
Speaker 2: So again, if you avoid re rendering those stuff that stuff,
Speaker 2: that makes it easier not losing the contents of form
Speaker 2: data just because I don't know, you updated some counter
Speaker 2: at the top of the page or whatever. And another
Speaker 2: reason is to avoid videos from jumping to the start.
Speaker 2: If you reload the video element, the video will you
Speaker 2: go back to the beginning, and which is often not
Speaker 2: what you want if the effect that you want to
Speaker 2: create is the user just staying where they are.
Speaker 1: Yeah, one, there are a couple of other things. One
Speaker 1: is your scroll position.
Speaker 2: M hmm, can kind of handle it, but yeah.
Speaker 1: Yeah, but but if you if you click to the
Speaker 1: next page, a lot of times it will take you
Speaker 1: to the top of that page. And in this case
Speaker 1: it doesn't because all it does is again it just
Speaker 1: merges the page in where you want. I could I
Speaker 1: could see where maybe you don't want that all the time,
Speaker 1: but it's it's a pretty nice feature. And I think
Speaker 1: that was the only other benefit that you didn't bring up,
Speaker 1: but that, Yeah, essentially, that's that's how that goes together.
Speaker 1: And anyway, it's it's pretty nice. It's uh. I found
Speaker 1: that it has sped up the the rendering and work
Speaker 1: on my web pages where I use it, and you
Speaker 1: just install Turbo and it just kind of does this thing.
Speaker 1: Now that it does have an API, so you can
Speaker 1: tell it how you want it to operate, but for
Speaker 1: the most part, it just is kind of an automatic.
Speaker 2: So a few questions about it, again as somebody who's
Speaker 2: really not so familiar with the technologies, and it kind
Speaker 2: of related to some concerns that I had when we
Speaker 2: spoke with Carson about HTMX. Is how it works with
Speaker 2: the browser's history, like when you back and forward, how
Speaker 2: smart it is it about things, how well does it
Speaker 2: work with the address bar which kind of goes together
Speaker 2: with the history, and also how well does it work
Speaker 2: with browser caching.
Speaker 1: Yeah, honestly, I haven't had any problems with the history
Speaker 1: back and forward with that, now we get into turbo
Speaker 1: turbo frames and turbo streams. Yeah, that that's a little
Speaker 1: bit different. But with with turbo drive itself, I haven't
Speaker 1: had any issues, so you know. And and in rails,
Speaker 1: nearly every page loads using turbo drive, you know, once
Speaker 1: you click a link it and so that that's worked
Speaker 1: pretty seamlessly. And I do weird stuff in rails sometimes,
Speaker 1: and it seems to work, So I'm for that.
Speaker 2: Is it called kind of curious? Why is it called
Speaker 2: turbo drive? Like, is it the drive related to turbo
Speaker 2: the fact that it drives faster or somehow related to.
Speaker 1: I have no idea.
Speaker 2: DHH is a race car driver, Okay, okay, he is, But.
Speaker 1: Yeah, I don't know. I don't know why they called
Speaker 1: it turbo turbo drive.
Speaker 2: Thought I thought that. I thought the PHP guys were
Speaker 2: supposed to have the lambos.
Speaker 4: Well, you know, there's a lot of joint a lambo group.
Speaker 4: There's a lot of problems with Lambo's.
Speaker 2: Not they're pretty Let's put it this way, it's probably
Speaker 2: not not the sort of problems that I need to
Speaker 2: contend with, So.
Speaker 4: You probably shouldn't get away.
Speaker 1: That's a problem. Is a problem.
Speaker 2: I would like to have, okay for me cars for me,
Speaker 2: cars mostly ways to get from point A to point B.
Speaker 3: So I'm gonna jump in he real quick. And obviously
Speaker 3: you guys are talking about Taylor Otwell and his orange lambeau.
Speaker 3: But being a devoted inertia JS fanboy has been well
Speaker 3: documented here, I'm going to say a lot of this
Speaker 3: is very similar. I think it's maybe the same thing
Speaker 3: with just slightly different implementations in terms of what I
Speaker 3: see in inertia and what I use in innertia on
Speaker 3: a regular basis, In terms of only loading certain parts
Speaker 3: of the page, you know, being able to make a
Speaker 3: query and get specific in preventing or controlling where the
Speaker 3: page rolls too after a change is updated, just a
Speaker 3: general speed of it in terms of how that it works.
Speaker 3: So it's just from listening to Chuck and reading to
Speaker 3: the documentation, it's it's sort of just a different implementation
Speaker 3: of the same idea.
Speaker 2: I'm really not surprised that there's a sort of a
Speaker 2: convergent evolution. I mean, if you want to drive more
Speaker 2: dynamic web pages and a more dynamic experience for web users,
Speaker 2: but don't want to build like React application on the
Speaker 2: front end. It kind of they kind of all pushes
Speaker 2: you in the same direction.
Speaker 1: I guess, yeah, and that's that's where a lot of
Speaker 1: this came out of, both with stimulus and turbo is. Yeah.
Speaker 1: The feeling is in communities that I talked to outside
Speaker 1: of this one, where you know people generally embrace React
Speaker 1: is that, yeah, we we don't necessarily need a framework
Speaker 1: that takes over the entire page. We don't need you know,
Speaker 1: we don't need the heavy handed approach that React has.
Speaker 1: You know, DH calls them JavaScript sprinkles, right, So you
Speaker 1: just put in what you need where you need it.
Speaker 1: And I have to admit I really like that approach
Speaker 1: as as far as it goes. And so you know,
Speaker 1: look at the way that we used to build things with,
Speaker 1: say jQuery, right, and so you would have a jQuery
Speaker 1: plug in, you would tell it to act or react
Speaker 1: on a specific dam element, and you know, you would
Speaker 1: get what you wanted where you wanted it, and that
Speaker 1: would kind of be the entire story. And so you know,
Speaker 1: it's it's not necessarily an approach that is unfamiliar to people,
Speaker 1: at least in principle, but a lot of the ideas
Speaker 1: behind how it's put together and why it works the
Speaker 1: way it works are definitely not new.
Speaker 2: Is it also like HGMX driven by attributes that you
Speaker 2: put on the HTML elements?
Speaker 1: Yes, yes, stimulus much more than turbo, but yes.
Speaker 3: Now you can see it on the very front page
Speaker 3: of the stimulus stocks.
Speaker 2: So what is stimulus versus Turbo or are you still talking
Speaker 2: about turbo?
Speaker 1: I still wanted to cover a couple more things with Turbo,
Speaker 1: So Turbo has a couple of other features. Again, if
Speaker 1: you're familiar with HTMX, these are going to sound fairly familiar.
Speaker 1: So one other thing you could do with Turbo is
Speaker 1: you can break your page up into Turbo frames. And
Speaker 1: so the different Turbo frames are effectively dom elements in
Speaker 1: your application that you can and target for specific things.
Speaker 1: And typically what you do is you use them in
Speaker 1: conjunction with turbo streams. And turbostream is where you send
Speaker 1: the request back to the server with a specific header
Speaker 1: saying this is a turbostream, and then the turbostream responds
Speaker 1: with new Turbo frames that either say delete this element
Speaker 1: or replace the contents of this element, or there are
Speaker 1: a whole bunch of different ones that you can do
Speaker 1: that have different actions. You replace, update, append, prepend, You
Speaker 1: can add something before, you can add something after. You
Speaker 1: can just tell it to refresh the turboframe.
Speaker 2: So these are kind of like ie frames in a
Speaker 2: logical sense that they represent parts of the page that
Speaker 2: update separately. But they're not implemented I would guess as
Speaker 2: actual eye frames.
Speaker 1: No, they're not.
Speaker 2: Whether they're just placeholders. I guess that you can update
Speaker 2: the content of in various different ways.
Speaker 1: Right, So for example, if I filled in a form
Speaker 1: and when it did the post, it sent the post
Speaker 1: as a turbo stream instead of a and and you
Speaker 1: know the return header it's saying, give me a turbo
Speaker 1: stream back instead of an HTML header or an HTML page.
Speaker 1: What you what you would get back, as you could,
Speaker 1: you would get back a series of turbo frames in
Speaker 1: your turbo stream. And the turbo frames might say replace
Speaker 1: the user's name turbo frame with the new name, and
Speaker 1: replace the user's avatar turbo frame. Right, you put a
Speaker 1: turbo frame around that, And so you can tell it
Speaker 1: to replace all of those or update all of those,
Speaker 1: and uh, you know, or if you're doing you using
Speaker 1: a turbo turbo streams for comments, right, you have a
Speaker 1: turbo frame around your series of comments, and then when
Speaker 1: you submit the comment form, instead of making an end
Speaker 1: run to the server and getting back a full new
Speaker 1: page with the comment added, it just sends back the
Speaker 1: HTML snippet with the comment, and it's inside of a
Speaker 1: turbo frame that says append this to the comments element
Speaker 1: or to the comments turbo frame.
Speaker 2: Now, again, obviously I'm not really familiar with it, as
Speaker 2: I've never used it and I'm mostly learning about it
Speaker 2: listening to you right now. But it does seem on
Speaker 2: the face of it that it would be a good
Speaker 2: candidate to use in conjunction with the web components. I
Speaker 2: don't know if that's maybe what they're doing or not.
Speaker 2: If they're not, maybe it's something to consider, because that
Speaker 2: would really create a strong separation between the various turbo frames, like,
Speaker 2: for example, thanks to the shadow dom it would mean
Speaker 2: that SS from one would not impact the other unless
Speaker 2: you know you specifically want to and stuff like that.
Speaker 2: It would create an interesting, like clean separation between the
Speaker 2: various frames. But again, I'm just saying this as a
Speaker 2: thought that occurs to me off the top of my head.
Speaker 2: By the way, I don't know, just as an aside
Speaker 2: and we won't go there. But there's been all this
Speaker 2: brew a ha about web components all over again. So
Speaker 2: you know we were due, Yeah we were, do you.
Speaker 2: Ryan Carniato, a friend of the show, wrote scathing commentary
Speaker 2: about it and got all the brew haha started all
Speaker 2: over again.
Speaker 1: Anyway, Yeah, I honestly I haven't looked at the code
Speaker 1: base for Turbo, so I don't know if they're using
Speaker 1: web components or not. But yeah, you do put in
Speaker 1: a turbo frame tag, you know, and.
Speaker 2: That's an interesting Yeah, sorry.
Speaker 1: Gone, when you respond again, you you were you respond
Speaker 1: with the turbo frame tag.
Speaker 2: So that's an interesting difference from HDMX, where they Carson
Speaker 2: Gross kind of intentionally did not create special elements as
Speaker 2: targets and rather made it possible to use any dom
Speaker 2: element as a target for for updates. Yeah, so it's
Speaker 2: an interesting distinction between the turbo drive philosophy and HDMX.
Speaker 1: Yeah. I believe you can work around things without the frame,
Speaker 1: but it's much it's much easier to just go with
Speaker 1: the frames. That's how it's designed to work. But yeah,
Speaker 1: I mean that's that's effectively the ins and outs of
Speaker 1: of turbo and so yeah, I gave some examples. I've
Speaker 1: updated menus and menu items, I've updated you know other things.
Speaker 1: I mean, one one place that I've used it is
Speaker 1: I've loaded a modal and so effectively used stimulus with
Speaker 1: turbo to update the modal contents and then you stimulus
Speaker 1: to make it appear.
Speaker 2: So so again, now can you now explain what stimulus is.
Speaker 1: Right, So, stimulus is it's a model of you controller
Speaker 1: approach to HTML or to manipulating your dom and so effectively,
Speaker 1: the way that it works is you assign a controller
Speaker 1: to a section of your code, so you know, usually
Speaker 1: what you'll see is you'll see a div is placed
Speaker 1: around the area that you want your your controller to
Speaker 1: work on, and then you can define. There are a
Speaker 1: number of different elements you can use within stimulus to
Speaker 1: make a lot of this work. So the kind of
Speaker 1: the big ones are actions and targets. And what you
Speaker 1: do is you have data. You use a data elements,
Speaker 1: so data dash whatever. Right, So let's say your controller
Speaker 1: is you want drop down menu, so you have a
Speaker 1: drop down menu controller, so you're on your menu where
Speaker 1: you have the drop down menu. You would have a
Speaker 1: data dash controller attribute and you would assign it menu
Speaker 1: dash drop down right, and so that tells it this
Speaker 1: area is all operating under a single instance of the
Speaker 1: menu drop down controller. And then and then from there
Speaker 1: you can assign actions and that's usually on links and
Speaker 1: buttons where if you click it. You can also put
Speaker 1: it on other elements, so you can have it on forms,
Speaker 1: you can have them actions on all kinds of other things.
Speaker 1: And so what you have there is then you have
Speaker 1: a data action element.
Speaker 2: So it's kind of like it sounds kind of like
Speaker 2: an angular style templating approach to doing things, but instead
Speaker 2: of creating your own templating language on top of the
Speaker 2: HTML syntax, you're just making do mostly with HTML standard
Speaker 2: data elements data.
Speaker 1: Yeah, basically, So then the targets are effectively you're telling
Speaker 1: the controller you need to know where this dumb element
Speaker 1: is right, and so then in the action you tell
Speaker 1: it on a click call this function in your controller.
Speaker 2: And the function is what is it JavaScript on the
Speaker 2: front end.
Speaker 1: On the front and it's JavaScript on the front end,
Speaker 1: so all the stimulus controllers are written in JavaScript.
Speaker 2: So it's again I'm not familiar with it, so I'm
Speaker 2: kind of guessing it sounds a little bit like in
Speaker 2: sort of Angular light in the sense.
Speaker 1: I guess. I guess in some ways you could look
Speaker 1: at it that way. I think it has I think
Speaker 1: it has more in common with Angular JS or Angular
Speaker 1: one than Angular two, but it has a lot of
Speaker 1: those ideas in the sense that, yeah, you put the
Speaker 1: directives and the elements into into your HTML and then
Speaker 1: stimulus is able to pick it up when it when
Speaker 1: the pageloads and it initializes.
Speaker 2: I see that it's specifically called a modest JavaScript framework. Yeah,
Speaker 2: so for the HM Aliority have. So basically it's a
Speaker 2: way to add a framework light on top of the
Speaker 2: static Htmailiority have by sprinkling in some data attributes and
Speaker 2: adding some JavaScript business well business logic. I guess you.
Speaker 3: Could call it, yeah, effectively, Chuck, are you familiar with
Speaker 3: Alpine JS.
Speaker 1: I have not looked into it as much as I would.
Speaker 3: Like, But okay, so AJ you remember when we interviewed
Speaker 3: it's been a couple of years where we talked to
Speaker 3: the guy from Albine J I'm brain farting on his
Speaker 3: name right now. Starts of the CE. But it's sort
Speaker 3: of the same thing where he uses data attributes and
Speaker 3: you just sort of sprinkle a little bit within your
Speaker 3: HCML to add functionality, you know, some JavaScript functionality to
Speaker 3: your forms without having to take over the whole thing
Speaker 3: with a view or reactor Angular you know, template structure.
Speaker 3: Yeah right, huh was it Caleb, Yeah, calib Porzio Yeah, yeah.
Speaker 1: Yeah, yeah, it's not by any means the only sort
Speaker 1: of modest. I like the word modest JavaScript framework, and
Speaker 1: I wouldn't be shocked if Yeah, some of the other
Speaker 1: ones work in similar ways. But again, it was this
Speaker 1: idea that an angler does this too. I think React
Speaker 1: does it to a larger degree. I'm not sure where
Speaker 1: view fits in on the spectrum, but if you declare
Speaker 1: an angular component to work on a particular part of
Speaker 1: the dom, it tends to sort of take over that
Speaker 1: part of the dom. And stimulus, in contrast, simply reacts
Speaker 1: to whatever the HTML is. So the state of the
Speaker 1: stimulus controller. If you inspect the the HTML on the page,
Speaker 1: you can see the state of the similar Yeah.
Speaker 2: So the state, Yeah, it's done before, it's been done
Speaker 2: before some you know. Obviously, one place you've put state
Speaker 2: is in in data attributes. Another place you can put
Speaker 2: state is in comments. I guess this one. And then
Speaker 2: another option is to create a JSON in beds within
Speaker 2: the HML, but then you kind of lose the association
Speaker 2: with particular elements on the page.
Speaker 1: Yeah.
Speaker 2: Yeah. The only the the only real downside of doing
Speaker 2: that is effectively everything gets serialized into strings.
Speaker 1: Yeah, essentially, yes, so you know, if it's manipulating say
Speaker 1: a form, you know, then yeah, I mean may be
Speaker 1: pulling values out of the form, or it may have
Speaker 1: value attributes on some of the on some of the elements, right,
Speaker 1: And that's all done with data elements. And then like
Speaker 1: I said, you have the targets, and the targets are
Speaker 1: basically just elements that you're probably gonna wan at manipulating
Speaker 1: within your controller.
Speaker 2: From what I gather, the main motivation for stimulus is
Speaker 2: that if you just use turbo, then everything becomes a
Speaker 2: round trip to the back end, and sometimes that's just
Speaker 2: you can't do that in terms of responsiveness or some
Speaker 2: sophisticated types of interactions, and then you and then you
Speaker 2: do need some JavaScript on the client side for more
Speaker 2: fine grain control.
Speaker 1: Yes, I would add that there are some things that
Speaker 1: are strictly dom manipulations that don't require a back end run,
Speaker 1: like if if you're managing data and stuff like that,
Speaker 1: and you can make you know, HTML calls to the
Speaker 1: back end and then manipulate the domb. In fact, I've
Speaker 1: seen people do essentially what Turbo does with Stimulus, where
Speaker 1: you know, they go call the back end and then
Speaker 1: they come back and they replace parts of the Yeah.
Speaker 2: But then but then, but.
Speaker 1: Turbo does that, and Turbo does it better.
Speaker 2: Yeah, exactly.
Speaker 1: So you know, typically those people just weren't aware that
Speaker 1: Turbo had the capability. Right, It's like, Okay, I'm going
Speaker 1: to sloct an element here, and I want the next subset.
Speaker 1: You know, I select the country, and I want the
Speaker 1: states or provinces or regions to show up in the
Speaker 1: next thing.
Speaker 2: Uh.
Speaker 1: Turbos terrific for that, right, But let's say you you
Speaker 1: want it to that you want that element to appear
Speaker 1: as well. You know, you can use Turbo to insert
Speaker 1: it into the page, or you can use Stimulus to
Speaker 1: make it visible, depending on which way want to.
Speaker 2: Now, again, looking at the really simple example on the
Speaker 2: Stimulus website, I see that the name of the file
Speaker 2: actually specifies the name of the quote component.
Speaker 1: Of the controller. Yes, yep, So if you call it
Speaker 1: menu dash drop down dash controller or or menu underscore
Speaker 1: drop down underscore controller, either one. Then it's going to
Speaker 1: be the menu dash drop down controller and that's what
Speaker 1: you're going to put in your HTML.
Speaker 2: Okay, cool, and rather than rely on the standard dome
Speaker 2: events it it mechanism it again. It well, basically all
Speaker 2: the frameworks are kind of going this way, but it
Speaker 2: uses a click arrow the name of the controller for example,
Speaker 2: so okay.
Speaker 1: Yeah, and so it has for the different elements. If
Speaker 1: you look at the documentation, is there, but you can click, uh,
Speaker 1: there's a toggle for like a details element. If you
Speaker 1: have an input, you can put an input element on it, right,
Speaker 1: And so you can use it to do things like
Speaker 1: like a search. You know where you're typing in and
Speaker 1: it does the look up and then gives you the
Speaker 1: options that it found when it searched. Right, so it
Speaker 1: may do a run to the back end on that
Speaker 1: as you're typing. That's an input event, submit event on
Speaker 1: a form, change event on a select. But yeah, you
Speaker 1: you just yeah, you do the name of the event
Speaker 1: and then an arrow and then it's controller what hash
Speaker 1: number sign and then the method.
Speaker 2: I'm kind of curious whither you chose hash or than that.
Speaker 1: I'm assuming that's straight out of rails. That's the way
Speaker 1: the rails and U specifies, Hey, this is a this
Speaker 1: is a call on this method of this class.
Speaker 2: Okay, yeah, other way.
Speaker 1: Also keyboard events, right, so you can tell it if
Speaker 1: you hit escape or enter or type a letter type
Speaker 1: of number, you can you can have it react to
Speaker 1: those kinds of events as well.
Speaker 2: Interesting, I'm would you actually put any data in the
Speaker 2: controller object itself or all the data should reside on
Speaker 2: the elements in the HTML.
Speaker 1: So control uh so stimulus doesn't really give you a
Speaker 1: good mechanism to store any of the data in the
Speaker 1: controller object itself, and so you would that's where a
Speaker 1: model or value data at comes in, and so you
Speaker 1: would actually store any of those. So most of the
Speaker 1: time it's it's going to be in some attribute on
Speaker 1: your HTML anyway. But let's say that you want some
Speaker 1: specific value for you know, kind of a global setting
Speaker 1: within your controller. You would set that up on your
Speaker 1: DOM element and so often you put those on. So
Speaker 1: you have the DIV and then you have the data
Speaker 1: dash controller attribute, and then after that you have the
Speaker 1: data dash whatever the controller name is dash value attribute
Speaker 1: for kind of that global setting, and you can manipulate
Speaker 1: that if you would like. You can also you know,
Speaker 1: do do all kinds of other things with it, and
Speaker 1: those values actually support a number of things you can
Speaker 1: have or raise Boollion's numbers objects, which are basically Jason objects.
Speaker 2: Yeah, but I guess I guess that really it's it's
Speaker 2: mostly for local transient state. Anyway, if you've got like
Speaker 2: more persistent state that would.
Speaker 1: Resign, you're going to push that.
Speaker 2: Yeah, within the within rails obvious.
Speaker 1: Or whatever else. Right, Stimulus and turbo are both completely
Speaker 1: independent of rails.
Speaker 2: But again I assume they're mostly used in the rails
Speaker 2: community probably. Yeah, again, looking looking at the page, I'm
Speaker 2: actually I actually don't see the word rails on the
Speaker 2: Stimulus website homepage at least, So so, yeah, it's it's
Speaker 2: meant to be like you know, it might be used
Speaker 2: in conjunction with, but it's meant to be independent. And
Speaker 2: and hot wired is like, what that's the overall term.
Speaker 2: Is it an actual technology or just like a moniker?
Speaker 1: From what I understand, it's just a moniker. There's nothing
Speaker 1: that's independently part of hot wire that's not part of
Speaker 1: turbo stimulus or urbinative.
Speaker 2: Okay, cool, got it, and you've been using it extensively.
Speaker 1: Assume, Yeah, I've been using it quite a bit. It's
Speaker 1: it's a really really convenient way to write applications that
Speaker 1: you I guess for one, you know you don't want
Speaker 1: the heavy handed approach that you get from say a REACT.
Speaker 1: And it's also a really convenient way to write your
Speaker 1: applications if you just want really clean and quick ways
Speaker 1: to manipulate the dom.
Speaker 3: So in other words, it's sort of like where if
Speaker 3: you want to have a statically generated side for the
Speaker 3: most part and just sprinkle a little bit of functionality
Speaker 3: on the top of it, and you can do that,
Speaker 3: so you get your speed and your pre render with
Speaker 3: the minimal functionality that you need.
Speaker 1: Yeah, basically so and again DHH calls it javascrip sprinkles
Speaker 1: so and that that's the idea, right, So you just
Speaker 1: sprinkle in what you need where you need it, and
Speaker 1: you know you don't have this big app managing a
Speaker 1: whole bunch of state and other things.
Speaker 2: Yeah. Very often when I see significant state management on
Speaker 2: the front end, I mean sometimes it's it's inescapable, but
Speaker 2: very often it's just wrong.
Speaker 1: Yeah. Well, I think in a lot of cases, what
Speaker 1: you see is you see people that basically say, hey, look,
Speaker 1: I've worked at four different companies. They all had significant
Speaker 1: state that they had to manage on the front end,
Speaker 1: or they felt like they had to manage on the
Speaker 1: front end. I'm not convinced that you necessarily have to
Speaker 1: do that, but anyway, so what they do is when
Speaker 1: they basically adopt the same stack, can use the same approaches,
Speaker 1: and you know, maybe you don't need that, Maybe you
Speaker 1: just need a tiny bit of state management or no
Speaker 1: state management. You can find other ways to work around it.
Speaker 2: Basically, if if you're building dashboards then like sophisticated interactive dashboards,
Speaker 2: then then you you probably can't escape the need like
Speaker 2: it's a it's it's an app that happens to be
Speaker 2: running on the web, uh, and then you can't really
Speaker 2: get away from the need for a sophisticated front end. Again,
Speaker 2: if you're building like an editor for something, also the
Speaker 2: same for most other things, like if it's for example,
Speaker 2: an e commerce website, more often than not, you you're
Speaker 2: going to need to do a lot of your stay
Speaker 2: at main on the back end anyway for persistence sake,
Speaker 2: So why not push as much as you can there
Speaker 2: and avoid doing it on both sides as much as
Speaker 2: you can.
Speaker 1: Yeah, I would also push back just a little bit
Speaker 1: on the idea of maybe an editor or a dashboard.
Speaker 1: I've seen plenty of that kind of a thing done
Speaker 1: with an Alpine or a stimulus where you know, you
Speaker 1: pull in some third party library like a chart JS
Speaker 1: or something and then let it do a lot of
Speaker 1: that stuff and so and then if you're building it
Speaker 1: on your own, the other thing is is you can
Speaker 1: set up how each of the elements react to the
Speaker 1: different things you do, right, so you know, you can
Speaker 1: control what happens when you hover things like that, and
Speaker 1: then effectively, you know, you use something like stimulus, if
Speaker 1: you need some kind of animation or something like that,
Speaker 1: you can trigger that. And so like some of the
Speaker 1: some of the things i've or that I've built. So
Speaker 1: again going back to the idea of a menu with
Speaker 1: drop down you know sub menus. You know, I just
Speaker 1: used a transition animation library and I just called it
Speaker 1: in my stimulus controller and so it did a lot
Speaker 1: of that stuff. And so I think there are ways
Speaker 1: to do this that without it being onerous, that you
Speaker 1: could do it without having to have kind of the
Speaker 1: full level data control stuff that that a lot of
Speaker 1: times you reach for in React apt. But that said,
Speaker 1: I mean, if that's a technology you're familiar with and
Speaker 1: you're comfortable doing it, I'm not telling you you're doing
Speaker 1: it wrong. But if you're trying to find.
Speaker 2: A profess, would be telling you that you're doing it wrong.
Speaker 1: My point is is that there there there are other
Speaker 1: ways to do it, and in this case, in my
Speaker 1: experience at least, there's a lot less overhead to doing
Speaker 1: it this way as opposed to doing it the other way.
Speaker 2: Another interesting thing in this context is a lot of
Speaker 2: developers may not be aware, but HTML and CSS are
Speaker 2: getting a lot of features yes, make it possible to
Speaker 2: build quite sophisticated user interfaces without a sophisticated framework, like
Speaker 2: if you want pop ups, pull down menus, right click menus,
Speaker 2: et cetera. All these things which used to require fairly
Speaker 2: sophisticated coding can now be achieved fairly cleanly with HTML,
Speaker 2: CSS and minimal JavaScript. And that's especially attractive in the
Speaker 2: context of a minimal framework like Stimulus.
Speaker 1: Yeah, and that's that's kind of the approach that that
Speaker 1: I've been hitting right. So the library so again you
Speaker 1: know kind of that that transition where you bring the
Speaker 1: menu and things. I mean effectively what I'm doing is
Speaker 1: I mean using a library that uses CSS classes and
Speaker 1: just swaps the classes out right, and so it you know.
Speaker 2: You should definitely be looking at pop ups on the
Speaker 2: MDN read about it a lot, a lot of the
Speaker 2: more sophisticated so so that could provide a lot of
Speaker 2: the sophisticated user interface capabilities that you would like to
Speaker 2: implement with minimal JavaScript like and it works across quite
Speaker 2: a number of browsers. I need to check comparsibility with
Speaker 2: Safari et cetera. But overall it's it's pretty well supported.
Speaker 2: And another one that's really interesting in this context is
Speaker 2: the view Transitions API, making it possible to create sophisticated
Speaker 2: animations when transitioning between things in between states.
Speaker 1: We should do an episode on those anyway.
Speaker 2: Actually we actually did on a couple of them. We
Speaker 2: had we had we had normals intal to talk about
Speaker 2: the view transitions example.
Speaker 3: Yeah, yeah, you talk about stuff that's in HTML that
Speaker 3: you know used to require a lot of stuff. There's
Speaker 3: a my nurses seite that I work on quite a
Speaker 3: bit has you know, a bunch of date fields, and
Speaker 3: you know it used to be you had your date pickers,
Speaker 3: you had to import from various jobascripts. Yeah, I just
Speaker 3: used the native HTML once.
Speaker 1: Yeah.
Speaker 3: You know they're not and people will complain about them.
Speaker 3: Oh they're pretty bare bones and they don't do this,
Speaker 3: and well yeah, I mean I don't know how much expect.
Speaker 3: But for my you know, functionality where all I need
Speaker 3: somebody is all I need is for somebody to be
Speaker 3: able to click select the date, get right to the
Speaker 3: field that I'm off and running. It's great. And I
Speaker 3: didn't have to import any JavaScript. I mean, that's the
Speaker 3: whole thing about JavaScript performance, right Dan. The less JavaScript
Speaker 3: that you're downloading to your browser, the faster you're going
Speaker 3: to be.
Speaker 2: So actually it well, it's not just about performance. It's
Speaker 2: also about performance is one important aspect. Obviously, the less
Speaker 2: JavaScript the better, but in that regard, but it's in general,
Speaker 2: I'd say that anything that can be done sufficiently well
Speaker 2: without with just HTML and CSS and without JavaScript, should
Speaker 2: be done just with HTML and CSS without JavaScript, vera
Speaker 2: platforms exactly.
Speaker 1: For example, Ja's Rails World from a couple of weeks ago,
Speaker 1: because this is this is more or less what he's.
Speaker 2: Yeah, I know, I started watching it. There are a
Speaker 2: few issues, but we'll get to that in a second.
Speaker 2: I just want to mention that Jake Archibald, for example,
Speaker 2: recently posted an article in which they talk. He talks
Speaker 2: about various proposals or ideas that they have around uh
Speaker 2: styling or stylized drop down menus that will be built
Speaker 2: into the platform. So for if you want more sophisticated
Speaker 2: drop down menus, like instead of just the regular unstylable
Speaker 2: select you know fields. Uh So they're working on that
Speaker 2: sort of thing. And again, once you've got it as
Speaker 2: part of the platform, it becomes very easy to use
Speaker 2: it from within any framework. But the thing is, if
Speaker 2: you're if it makes the framework code minimal, you start
Speaker 2: asking yourself, well, why do what do I need the
Speaker 2: framework for? Like if if my framework stuff is just
Speaker 2: really thin wrappers around the platform features. Now, obviously we're not,
Speaker 2: we're not really quite there yet. Of before I get
Speaker 2: a lot of hate about Yeah, our design system does
Speaker 2: a whole lot more than that, And I get it,
Speaker 2: it's the same for us. But you know, we're getting
Speaker 2: there lately, probably like ten years too late. In a
Speaker 2: lot of ways, but we're getting there, and it does
Speaker 2: make this type of approach, the approach that you're saying
Speaker 2: that is espousing, a lot more attractive and reasonable. I
Speaker 2: don't necessarily agree with everything he says. For example, his
Speaker 2: stance on bundling. It seems he's slightly backtracked. Again I
Speaker 2: might be wrong, but off of his extreme stance that
Speaker 2: you should unbundle everywhere, now it's more about unbundling during development,
Speaker 2: which I'm totally cool with. I don't know if he's
Speaker 2: also opposed to bundling in production. That's still problematic or
Speaker 2: can be problem.
Speaker 1: And yeah, and so if if we want to get
Speaker 1: into that. So that's now now we're getting into more
Speaker 1: of the weeds of how Rails works. Of course, it's
Speaker 1: still using you know, an open standard that you could
Speaker 1: use in other apps. But the way that Rails works
Speaker 1: with its components or with its JavaScript stuff is it
Speaker 1: uses import maps, and so you can use a bundler
Speaker 1: for a lot of that stuff. You know. I've also
Speaker 1: seen people adopting the vat really or vat Rail's gems
Speaker 1: to get their stuff done. But you know, instead of
Speaker 1: using import maps, but import maps, the idea is is
Speaker 1: that there's there's no build step, and so I mean,
Speaker 1: that's that's the big feature that he's touting is that
Speaker 1: you don't you don't have to go and learn VAT,
Speaker 1: you don't have to go learn web Pack, you don't
Speaker 1: have to go learn whatever. The next bundler is effectively,
Speaker 1: you put your files into the import map and then
Speaker 1: you know, you can tell it to preload the ones
Speaker 1: that you need preloaded, and then you're you're good to
Speaker 1: go and off to the races. And I mean the
Speaker 1: approach has worked fairly well in every app that I've used.
Speaker 1: But but yeah, you know, you get this list of
Speaker 1: and if you're using Stimulus, you you basically have an
Speaker 1: import map entry for every single one of your controllers.
Speaker 1: But again, it's it's worked fine on anything that I've
Speaker 1: worked on in production.
Speaker 3: Well to do a little bit of Pedantic Devil's Advocate here.
Speaker 3: Beat is pretty One of the things about Beat is
Speaker 3: that it's pretty plug and play. I mean, you come,
Speaker 3: you said a couple of things. It ain't webpacked, you know.
Speaker 3: That's the thing about Webpack is the can big files,
Speaker 3: you know, but Beat is pretty plug and play.
Speaker 1: Yeah, I've done theat on a couple of rails apps,
Speaker 1: and I think you have to put in a config file,
Speaker 1: but it's I mean, you can tell you about one
Speaker 1: works pretty much out of the box.
Speaker 2: Yep. Look, we've had people on our and on the
Speaker 2: show in the past talking about, you know, like bundling
Speaker 2: the consequences or not. So obviously getting rid of a
Speaker 2: built step if you can achieve it is great. It's
Speaker 2: obviously totally undoable. If you're using a front end framework
Speaker 2: like React or any other or most of the front
Speaker 2: and frameworks that require some sort of a built slash
Speaker 2: compilation step. It also means getting rid of typescript unless
Speaker 2: you're using jas DOC so so that's also a significant consequence.
Speaker 2: Like you know, I think we may have spoken about
Speaker 2: it with guilta yah. I think about the fact that
Speaker 2: you know, if you're doing front end, you're going to
Speaker 2: be using any of the major frameworks, then you're going
Speaker 2: to have a built step regardless, and then you might
Speaker 2: as well just do all the stuff that you know,
Speaker 2: leverage all the benefits that it can provide if you're
Speaker 2: going to have to have it anyway. I get that
Speaker 2: dage Age really wants to avoid it and if you can,
Speaker 2: that's definitely an advantage, but it's advantage that comes at
Speaker 2: the price. For example, dage Age doesn't use typescript. He
Speaker 2: doesn't want to use typeescript.
Speaker 1: Nope, he doesn't. In fact, I have some words to
Speaker 1: eat on that. So last time when we talked to
Speaker 1: what's his name now, I'm Joanna Blank. Last week it.
Speaker 2: Was it was Dan, it was Thomas Gabbin.
Speaker 1: Yeah, so I said, I don't know if he's directly
Speaker 1: opposed to static types. I went and watched some of
Speaker 1: the talks from rails World. He is definitely not on
Speaker 1: board with static type. So I will eat those words
Speaker 1: because I said I didn't know, But it turns out
Speaker 1: that yeah, absolutely he Yeah. He was talking to Toby
Speaker 1: from Shopify, CEO of Shopify, and Matt's the guy who
Speaker 1: created Ruby, and they asked him, so, if you two
Speaker 1: could swap places, what would you do, and David said,
Speaker 1: no static types.
Speaker 5: Ever, I want to hear the argument for dynamic types
Speaker 5: because I don't get it.
Speaker 2: They argue, Look, first of all, you know, if you're
Speaker 2: coming from from a dynamic, inherently dynamic language like Ruby
Speaker 2: or like JavaScript or like Python, then you know there's
Speaker 2: a certain reason you picked that language. There's a certain reason,
Speaker 2: like the age ages you know loves working in Ruby,
Speaker 2: uh and and and the and Ruby is inherently dynamically typed.
Speaker 4: So what I meant was loose types. I I like
Speaker 4: dynamic types. I don't like loose types.
Speaker 1: I'm not sure you mean yeah, I.
Speaker 4: Mean so dynamic typing meaning the types are assigned at
Speaker 4: run time. Uh, strict typing meaning that types don't change.
Speaker 4: Once something's a number, it's a number. So if you like,
Speaker 4: typescript is strict typing, the types are still dynamic. But well,
Speaker 4: I guess they're not as dynamic as Go. Like Go
Speaker 4: has dynamic typing, typescript is probably less dynamic than Go.
Speaker 2: But I'm to following. Look, typescript basically is a layer
Speaker 2: above JavaScript that gets totally stripped that it built slash
Speaker 2: compiled time. As you know, we discussed the tomel last
Speaker 2: week if if our listeners are interested in more details
Speaker 2: about it. But but basically, typescript enforces types at development
Speaker 2: slash build time. Once you it has zero impact on
Speaker 2: the actual generated code. And in this regard, it's different
Speaker 2: from Go or from Java. Wow, where where where the
Speaker 2: types that you specify actually impacted the type of code
Speaker 2: that gets generated.
Speaker 4: If that's not entirely true though, because if you once
Speaker 4: you declare an object in JavaScript, if you never delete
Speaker 4: and you never add an inconsistent property to it, it
Speaker 4: is optimized as that struct type.
Speaker 2: Yeah, there's a lot of optimizations going on. The optimizations
Speaker 2: are pretty much dependent on the JavaScript engine figuring out
Speaker 2: that something has a certain type and then optimizing according
Speaker 2: to that type. But there's nothing p in the language
Speaker 2: preventing you from doing something else in in so it's
Speaker 2: it's kind of the it's kind of like an AI
Speaker 2: like approach of the on time inferring that something will
Speaker 2: always be an int and therefore we can put it
Speaker 2: in an int type you know, register whatever, or or
Speaker 2: memory address. But i'll I'll give an example. Okay. In
Speaker 2: a language like C plus plus, you've got overloading, which
Speaker 2: means that you can specify the same function to two
Speaker 2: implementations of the same function based on the type of
Speaker 2: argument on the that it receives. So you can have
Speaker 2: a function called ad which takes two numbers and returns
Speaker 2: the sum of the numbers, and you can have a
Speaker 2: function called ad which takes two strings and returns the
Speaker 2: strings concatenated, and the internal implementation would be different. There
Speaker 2: would be two different functions just that are The difference
Speaker 2: between them is just the types of their arguments. That's
Speaker 2: not something you can do with JavaScript. And because typescript
Speaker 2: is just like a build layer on top of JavaScript,
Speaker 2: that's not something you can do in Typescript either. You
Speaker 2: understand what I'm trying to say.
Speaker 4: Yeah, I think my question was what why is it?
Speaker 4: Why would it be valuable? In what case would you
Speaker 4: want something that was a number to now be a
Speaker 4: string or something that was a string to now be
Speaker 4: a number. Why would you want to be inconsistent in
Speaker 4: the way that you handle your objects?
Speaker 2: Oh, I don't think anything. Anybody wants to be inconsistent
Speaker 2: in the way that they handle their objects. What they
Speaker 2: want is not to have to think about about not
Speaker 2: to have to explicitly specify types at development time. Anybody
Speaker 2: who's you know, once you have to specify types at
Speaker 2: development time, sooner or later you're gonna have to do generics.
Speaker 2: And that's just hard. And if for you, if you
Speaker 2: can be more fast and loose with types and rely
Speaker 2: on duct typing and and and stuff like that, you
Speaker 2: don't need to deal with in with explicit interfaces. There's
Speaker 2: a lot of beauty in that the world.
Speaker 4: I love, yes, and that's the way ZIG is. By
Speaker 4: the way, ZIG is all duct types.
Speaker 1: So it's it's interesting too. And I know we've kind
Speaker 1: of gone off on a tangent, but I don't know
Speaker 1: that I have a whole lot more to present on
Speaker 1: stimulus and turbo anyway. But I guess the other piece
Speaker 1: of this is is knowing the Ruby community in particular
Speaker 1: the way that I do. If there was an implementation
Speaker 1: that gave people some level of benefit the way that
Speaker 1: people see benefit from typescript, whether it's perceived or real,
Speaker 1: I think people would adopt it. But the implementations that
Speaker 1: have come out and the way that they've approached it,
Speaker 1: it just it just feels like busy work that you're
Speaker 1: adding to the system.
Speaker 2: Look.
Speaker 1: The other thing, though, is that.
Speaker 2: If I can just interject on that for a second,
Speaker 2: because from my experience, typescript is the value of Typescript
Speaker 2: increases as your code size increases, even not linearly, like
Speaker 2: exponentially or at least polynomially. So if your code based
Speaker 2: size is small, which is kind of the goal with
Speaker 2: the things that we've been talking about today with turbo drive,
Speaker 2: with stimulus, you want to keep your JavaScript kind of minimal,
Speaker 2: then indeed there's relatively little value or benefit in using typescript.
Speaker 2: And that's essentially it. I'm currently seeing a lot of
Speaker 2: value with typescript. I'm putting typescript in to some large
Speaker 2: legacy systems at the place where I'm working at Scense
Speaker 2: systems that were built several years ago in just straight
Speaker 2: on JavaScript, and I'm finding a lot of bugs of
Speaker 2: you know, people using the wrong field on the wrong object,
Speaker 2: and you know, and obviously the system worked. You know,
Speaker 2: JavaScript is really forgiving you read the wrong thing, you
Speaker 2: get back undefined. It doesn't crash. You know, that's both
Speaker 2: good and bad. You know that they had tests in place,
Speaker 2: so things pass tests, but definitely there were bugs in
Speaker 2: the code. Like I'm saying that, the biggest challenge for
Speaker 2: me in adding typescript into this codebase is dealing with
Speaker 2: all the bugs that get uncovered. Yeah.
Speaker 1: One thing that I was just going to point out,
Speaker 1: because you you started out saying, hey, with a larger
Speaker 1: code bases, it makes sense and that's effectively so Toby
Speaker 1: Toby Lutke he's the CEO of Shopify, right, he was
Speaker 1: one of the initial developers. It's all written in rails.
Speaker 1: They created a type system called sorbet and they use
Speaker 1: it in all of their code. And when DH spoke
Speaker 1: up and said, hey, you know, don't ever add static types,
Speaker 1: Toby pointed out, yeah, I can see where you're coming from,
Speaker 1: and in a lot of cases you don't need it,
Speaker 1: but at Shopify we have to have it. Their is gigantic,
Speaker 1: so I think, yeah.
Speaker 4: It seems like the the way that everybody would be
Speaker 4: happy is if we had strong dynamic types, if we
Speaker 4: had types where once you define an object, if you
Speaker 4: have a type somewhere later in the code, that should surface.
Speaker 2: Again, that's you're talking about safety at run time.
Speaker 4: I'm talking all safety as a dev time. There's no
Speaker 4: such thing as safety at runtime except for like null
Speaker 4: checks and Java.
Speaker 2: What you're talking about knowing you're talking about doing static
Speaker 2: analysis on the code to try to figure out that
Speaker 2: you're not reassigning a different type value to the same variable,
Speaker 2: like yeah.
Speaker 4: Which is what Yeah, Well, script checker can help with
Speaker 4: that if you enable if you just enable it in
Speaker 4: a JavaScript project. It's not perfect yet, but it's pretty good.
Speaker 4: And if you want to add something intentionally, if you
Speaker 4: want to create a polymorphic object, you use object out
Speaker 4: a sign.
Speaker 2: Yeah, which basically does something called type inference, which basically
Speaker 2: means it figures out the type of variable based on
Speaker 2: let's say, the initial assignment, and then if you assign
Speaker 2: something that's incompatible with that type inference, it will complain.
Speaker 4: Yeah, this is good. This is like, this seems like
Speaker 4: the happy medium. Everybody should hopefully be able to be
Speaker 4: on board with with that, Like we shouldn't. We want
Speaker 4: to prevent mistakes. We don't want to add boilerplate in overhead.
Speaker 4: We want to prevent mistakes. And that's what strong dynamic
Speaker 4: typing duct type strong dynamic duck typing types are.
Speaker 2: I will add that especially when you're developing APIs, whether
Speaker 2: it be for like you're building a library or you're
Speaker 2: just working on a complex system that has APIs between
Speaker 2: different parts of it. And I'm talking about in code.
Speaker 2: APIs like function calls or interfaces not over the wire.
Speaker 2: APIs then having static typing strong typing on that that
Speaker 2: enables the system, even the editor, to help you along
Speaker 2: and make sure that you're passing in the correct parameters
Speaker 2: and that you're getting back the correct value is valuable
Speaker 2: from my experience.
Speaker 1: All Right, I'm gonna push us to picks.
Speaker 2: Don't we have anything else just to say? In the
Speaker 2: context of turbone stimulus.
Speaker 1: I think we've covered the basics. I mean, there are
Speaker 1: some other things that you can get into we didn't
Speaker 1: talk about, like outlets for stimulus, which is effectively how
Speaker 1: you call methods on one controller instance from another controller instance.
Speaker 2: Yeah, those are getting in the weeds.
Speaker 1: You're getting way into the weeds. But I mean, you know,
Speaker 1: like I said, it's been able to do everything I need.
Speaker 2: So I have read I have read somewhere that turbo
Speaker 2: drive is also able to leverage web sockets.
Speaker 1: Yes, turbo drive can, and so can stimulus. There's actually
Speaker 1: a library that was written by some friends of mine
Speaker 1: that live here in Utah called stimulus Reflex. There's also
Speaker 1: a stimulus has cable in the name somewhere that specifically
Speaker 1: works with action cable and rails. But yeah, I believe
Speaker 1: both of them work fine with web sockets. I know
Speaker 1: turbo does.
Speaker 2: Okay, cool. I guess that's if you're really streaming a
Speaker 2: lot of data back and forth. It makes life easier
Speaker 2: that way.
Speaker 1: Yep. Okay, all right, well let's let's get to picks, Dan,
Speaker 1: Why don't you why don't we start.
Speaker 2: Put me on the spot so last, So I've got
Speaker 2: two picks. First of all, last week my pick was
Speaker 2: the vacation that we had in Italy, and it occurred
Speaker 2: to me that the way that we work places has
Speaker 2: really changed over the years. Like now, when I plan,
Speaker 2: I like to be planned in my trip because unfortunately
Speaker 2: we can't take really long trips, which means that we
Speaker 2: kind of need to be efficient. For example, we move
Speaker 2: hotels almost every night because we get to someplace. You know,
Speaker 2: we do it without the kids, so it's easier and
Speaker 2: we just get to somewhere and we don't want to
Speaker 2: need to drive back at the end, so we just
Speaker 2: keep on driving forward all the time. But it does
Speaker 2: mean that we change hotels almost every day or two.
Speaker 2: And so a couple of things. First of all, with
Speaker 2: with you know, with things like booking dot com or
Speaker 2: or Airbnb or what or you know, all the other
Speaker 2: various services, it's really easy to you know, find interesting hotels,
Speaker 2: book your trip in advance. You don't need to think
Speaker 2: about getting somewhere and starting to look, which might be
Speaker 2: an interesting experience if you're there for a week, but
Speaker 2: not really efficient if you're only there for a night.
Speaker 2: And the other way in which technology has kind of
Speaker 2: shifted the way that we're touring. So obviously everybody now
Speaker 2: uses GPS while driving, and it makes driving a lot
Speaker 2: less stressful. I still I'm old enough to remember the
Speaker 2: days of using maps, and the biggest challenge was that
Speaker 2: if you straight from your plan, then you were really
Speaker 2: worried about how you might find your way back. And
Speaker 2: now with GPS, you know it's no concern. You don't
Speaker 2: have to worry about it. You make a wrong turn,
Speaker 2: it'll get you back on your route. But the interesting
Speaker 2: thing is that now we do the same thing when
Speaker 2: we walk around. So what I like to do again
Speaker 2: When I know that we'll be in a certain place
Speaker 2: for a limited amount of time, then I like to
Speaker 2: kind of check in advance what are the sites that
Speaker 2: we want to see, the places we want to go,
Speaker 2: And I do kind of a traveling salesman optimization of
Speaker 2: finding a good route that goes to all these points,
Speaker 2: a walking route, and I just have the phone in
Speaker 2: my pocket with the Google Map and in walking mode,
Speaker 2: and it just tells me, you know, turn right here,
Speaker 2: turn left there, and I can just walk around and
Speaker 2: see the sites and not look like a tourist holding
Speaker 2: the map trying to figure out which ways up and
Speaker 2: you know, where do I need to go and and whatnot.
Speaker 2: It just makes it's almost like having this kind of
Speaker 2: a virtual tour guide, and it's it's actually once you
Speaker 2: get used to it, it's a great way to turn
Speaker 2: to tour place, especially again if you've got a more
Speaker 2: limited amount of time, because again, if you've got a
Speaker 2: lot of time, just wander around and experience the sights
Speaker 2: and sounds and smells and what have not, and what
Speaker 2: have you. But again if you're more limited for time,
Speaker 2: I found it to be a really efficient way of
Speaker 2: turing places. So that would be my kind of non
Speaker 2: technical pick. My technical pick is a funny kind of
Speaker 2: joke library that I ran into. It's called let me
Speaker 2: Quickly find It.
Speaker 1: Steve taking notes Absolutely.
Speaker 2: It's called you right there. It's called set Big Timeout.
Speaker 2: Turns out that set time out is limited to about
Speaker 2: almost twenty five days because the timeout duration is specified
Speaker 2: in milliseconds and it only uses thirty two bit values
Speaker 2: for that, so that turns out to be something like
Speaker 2: twenty four point nine days. And what happens if you
Speaker 2: want us to set time out for forty days or
Speaker 2: sixty days or half year or something like that. You
Speaker 2: can't use set time out for that. So now you've
Speaker 2: got set big time out which can even take bigins,
Speaker 2: and you can specify really lengthy durations for your set
Speaker 2: timeouts if you need. It. Sounds really useful to me.
Speaker 2: I'm obviously being sarcastic, but it's kind of a joke.
Speaker 2: Libraries presented as such. What it does. It actually creates
Speaker 2: a series of set timeouts. So obviously that's not very accurate,
Speaker 2: but it's it's amusing, let's put it this way. So
Speaker 2: that would be my second pick. And those are my
Speaker 2: picks for today.
Speaker 1: Awesome, all right, Steve, what are your.
Speaker 3: Picks before we get to the high point of the episode.
Speaker 3: I do have one sort of legit pick, and I
Speaker 3: touched on it earlier in the episode. I think an
Speaker 3: ursy JS. Their version two is out in beta, and
Speaker 3: so I'll put a link here to the upgrade guide
Speaker 3: for version two point zero, and it's got some pretty
Speaker 3: cool stuff. It's pulling prefetching, deferred props, which is sort
Speaker 3: of like props you don't load right away. You can say, hey,
Speaker 3: defer this till the page loads some infinite scrolling capabilities
Speaker 3: and so on. So I'll put the link in the
Speaker 3: in the guide in the show notes. It's a V
Speaker 3: two dot in nurse jass dot com. I first heard
Speaker 3: about it, I think on letter VL podcast or seeing
Speaker 3: it coming from the letterbil world. So but if you
Speaker 3: just do some quick googling, you'll see all kinds of info.
Speaker 3: Now for the dad jokes of the week, let's see.
Speaker 3: So question, did you hear about the guy who got
Speaker 3: a discount on his plastic surgery? The look on his
Speaker 3: face was priceless.
Speaker 2: Nice.
Speaker 1: Oh I wrong?
Speaker 3: Now, sorry, there I go. All right, So what do
Speaker 3: you call a Spanish guy being discharged from the hospital? Manuel?
Speaker 3: Although technically yeah, just don't stretch that too far. And
Speaker 3: then finally I had a conversation. I was having a
Speaker 3: conversation with my wife the other day and I said, Hey,
Speaker 3: I know you're busy, but can you say wanton backwards?
Speaker 3: She said not Now, I said, that's right.
Speaker 1: All right. AJ's laughing, AJ, what are your picks?
Speaker 4: For the fifteenth time? I have to pick The fall
Speaker 4: Guy yet again. I got the four K Blu ray
Speaker 4: with the extended cut, and I want to read. One
Speaker 4: of the negative reviews. Chris Palladino says, one of the
Speaker 4: dumbest movies in a long time. Agreed, writing was terrible.
Speaker 4: Agreed tried to be cute and referential but was hack
Speaker 4: and cliche. Agreed, plot makes zero sense. Agreed all over
Speaker 4: they mainly just blow a bunch of things up and
Speaker 4: have over the top unrealistic action sequences NonStop. Yes, it's
Speaker 4: an excellent movie. I don't know how this personally like this.
Speaker 4: We agree on it and he only gave it two stars. No,
Speaker 4: it is an action romance comedy, which is kind of
Speaker 4: I don't know how many movies I can say have
Speaker 4: pulled off all three things well, but I think this
Speaker 4: one does great. The plot doesn't make any sense, but
Speaker 4: I don't know, when's the last time you watched the
Speaker 4: James Bond movie? Does the plot make any sense in that?
Speaker 4: I mean, when's the last time you watched the movie
Speaker 4: where the plot makes sense? This one, you know, it's
Speaker 4: there's no nuance to the to the you know, the
Speaker 4: the good guy bad guy thing. You know, it's very
Speaker 4: it's there's it's just like the person who has evil
Speaker 4: motives has straight evil motives. The person has good motives
Speaker 4: has straight good motive, you know whatever. But it's just fun.
Speaker 4: It is it is. Uh, my wife loved it, you know,
Speaker 4: I walk Away and one of the positive reviews basically
Speaker 4: said this, I walk Away, and I'm like, man, that
Speaker 4: was such a fun and funny action movie. And my
Speaker 4: wife walks away with that was such a fun and
Speaker 4: funny romance movie. And I don't know how like, you know,
Speaker 4: she and I talked about it the very first time
Speaker 4: and are like, We're like, did we watch the same movie?
Speaker 4: Because She's like, oh, the dialogue between her and him
Speaker 4: was so sweet, and I'm like no, the part where
Speaker 4: he's jumping over dumpsters and like got the four by
Speaker 4: four going over the ridge, you know, like anyway, So
Speaker 4: I just I totally agree. It's a it's a stupid
Speaker 4: dumb movie, but it's it's just so good. It's so good.
Speaker 4: So uh. The one thing that I will say about
Speaker 4: the four K movie is the extended cut is not
Speaker 4: on the plain Blu ray. The extended cut is only
Speaker 4: on the four K. So I but I have one
Speaker 4: of those defective Blu ray players that happens to accidentally
Speaker 4: read four K. It's the lg let's see what's and
Speaker 4: you can still get these on Amazon, and you can
Speaker 4: downgrade the firmware. It's the LGWH sixteen n S forty,
Speaker 4: so it's it's it accidentally reads four K discs and
Speaker 4: then they patch it in the firmware that chips currently.
Speaker 4: But you can downgrade the firmware and then you can
Speaker 4: just read four K discs without any problem whatsoever on it.
Speaker 2: I can't tell you the last time that I actually
Speaker 2: held a disc in my hand or a memory.
Speaker 4: You know, that's fine, it's it's for people that want
Speaker 4: to have movies next year as well. You know. It's
Speaker 4: because all these movies are going to get pulled from
Speaker 4: all the services. And we've already had that happen a
Speaker 4: few times. You know, Disney has done the Vault thing
Speaker 4: a few times. Whatever, But obviously the digital movies are
Speaker 4: not going to stick around already. What was what was
Speaker 4: the service used to be called Ultraviolet that went down,
Speaker 4: like the entire service went down. Everybody the.
Speaker 2: Concept of owning your media, that's really strange.
Speaker 4: Right, yeah, but I I I run Plex and and
Speaker 4: all of the best movies we have, the Super Mario movie,
Speaker 4: all that, it's all on Plex. So anyway, other thing
Speaker 4: that I was going, did.
Speaker 3: You ever see the TV show, the original TV show
Speaker 3: The Fall Guy.
Speaker 4: I watched one of the episodes, and it does not
Speaker 4: seem to be in any way related to this movie.
Speaker 3: Okay, So for what it's worth, two of the main
Speaker 3: characters had cameos in your movie.
Speaker 4: Yeah, yeah, I know one at the end, like one.
Speaker 4: I could tell by the camera angle and the guys smile.
Speaker 4: I could tell like, Okay, this is a reference to something.
Speaker 4: I just don't get it. And then I found out
Speaker 4: that it was.
Speaker 3: It was Lee Major's and then Heather Thomas was also
Speaker 3: in the original TV show as well. For any of
Speaker 3: you who are too young to remember the Majors, he
Speaker 3: was probably more more well known as the six million
Speaker 3: dollar Man.
Speaker 2: Yeah. That's really funny because these days you can't buy
Speaker 2: anything with just six million dollars. You know, if they
Speaker 2: were to do that show again, he would have to
Speaker 2: be like the six trillion dollars.
Speaker 4: Yeah, there you go, right, Yeah, this this Blu ray
Speaker 4: player was Yeah. Anyway, the other thing. The other thing
Speaker 4: I was going to pick is passkys. So web off
Speaker 4: in has had a very sad history and there's a
Speaker 4: lot of backwards compatibility that people try to keep that
Speaker 4: makes it really complicated. And over some work that I've done,
Speaker 4: I have I have found that if you just focus
Speaker 4: on the paskis aspect, that like the the baseline stuff
Speaker 4: that works everywhere. Basically it's just a fancy replacement for
Speaker 4: a password manager, uh and not. You know, there's there's
Speaker 4: not really any extra security than that because it's trusted
Speaker 4: platform computing. I think they were thinking it was going
Speaker 4: to take off when they made the web offense back
Speaker 4: and then you know, reality of physics and the physical
Speaker 4: world we live in hit and we know that like
Speaker 4: that just can't happen. It's physically not possible. But anyway,
Speaker 4: so if you just focus on the baseline passkeys, you
Speaker 4: can have a really good experience. And I got a
Speaker 4: demo up on passkeys dot js dot org. And then
Speaker 4: third thing, not a pick, just a question. If anybody
Speaker 4: has experienced vertigo for multiple days in a row, please
Speaker 4: comment or tweet at me with what the what? If
Speaker 4: you've had success with some sort of solution, let me
Speaker 4: know because I am now on four days straight of
Speaker 4: twenty four to seven feeling dizzy. I don't know why,
Speaker 4: and I cannot find a remedy to it, and it's
Speaker 4: making life difficult. Is you can imagine if you felt.
Speaker 2: Dizzy, I would check if you don't have some problem
Speaker 2: in your ear, cannot or something.
Speaker 4: Yeah, that's that's uh I I I yeah, I'm gonna.
Speaker 4: I'm gonna go. I'm gonna go see someone about doing
Speaker 4: the eple maneuver, which is supposed to if the crystal
Speaker 4: gets dislodged. It's supposed to, like you move your head
Speaker 4: in certain ways and you get the fluid back. But yeah,
Speaker 4: I'm I'm four days into a I don't know why
Speaker 4: I'm feeling like I basically I feel like I have
Speaker 4: the flu, but only in the sense of dizziness and disorientation.
Speaker 2: You might want to see an ear doctor or something.
Speaker 2: Maybe you've got some sort of inflammation or something.
Speaker 4: I don't know. Yeah, but it's it's yeah, I'm gonna
Speaker 4: I'm gonna try a few things and then and then
Speaker 4: take that route if I can find someone that will
Speaker 4: get me in this week. Yes, yeah, it's it's very
Speaker 4: it's very frustrating and I'm having a hard time focusing
Speaker 4: because the world feels swimming.
Speaker 1: Yeah, with my mom, it's it's interesting you're talking about
Speaker 1: this because it was literally this weekend. My mom had
Speaker 1: similar issues and it got so bad that they went
Speaker 1: to the emergency room. But apparently hers gets aggravated as
Speaker 1: she lays on one side versus the other when she's sleeping,
Speaker 1: and I.
Speaker 2: Don't know that.
Speaker 1: Yeah, he gave her anything that would help.
Speaker 2: Yeah, probably she creates a vacuum or something in one
Speaker 2: ear and that causes a problem or something.
Speaker 4: Yeah, I wonder, I wonder if maybe it wasn't When
Speaker 4: I I was riding my motorcycle without ear plugs the
Speaker 4: other day. I don't think that was it though, because
Speaker 4: sometimes I just go do a short ride without ear
Speaker 4: plugs because it's just nice to feel the full sensation
Speaker 4: and everything. But usually I have ear plugs and some well,
Speaker 4: then sometimes I take the ear plugs out. I kind
Speaker 4: of pop them, you know, because they you know, they're
Speaker 4: jammed in there with the ear wax and everything. You
Speaker 4: pull them out and they're like oh, and I try
Speaker 4: to twist them so it's not so dramatic. But I
Speaker 4: don't know, maybe it was one of those things. But
Speaker 4: I can't pinpoint when it started happening. It's just I
Speaker 4: think it was Thursday night or Friday morning. I just
Speaker 4: noticed I was a little dizzy and then thought, oh, whatever,
Speaker 4: it'll go away, and then it hasn't.
Speaker 2: Oh. I sorry to interrupt after I finished my pics,
Speaker 2: but I just saw really amusing headline. I just remembered
Speaker 2: that I saw it. Can you guess what the total
Speaker 2: global debt is in the world in dony?
Speaker 4: I mean, guys, one hundred and fifty trillion.
Speaker 2: Three hundred and seventeen trillion.
Speaker 4: That's more than the GDPs of all the nations combined,
Speaker 4: isn't it.
Speaker 2: I don't know, but I would guess.
Speaker 4: So that's good. That's a good place to be.
Speaker 2: Yeah, when I headed.
Speaker 4: For economic collapse, this is fine.
Speaker 1: Yeah, it says. It says as of twenty twenty two,
Speaker 1: the global GDP amounted to over one hundred trillion, So, oh, good,
Speaker 1: whole much over the next yeah.
Speaker 4: Two times? How is that possible? I mean, that's a.
Speaker 2: That's because we don't we don't. We don't need to
Speaker 2: print the money anymore. It used to be gold, then
Speaker 2: it used to be printed money. Now it's just digits
Speaker 2: in a computer.
Speaker 1: Right, all right, I'm gonna go ahead and throw in
Speaker 1: some picks. I'm also when I'm done with this call,
Speaker 1: I'm gonna go downstairs and tell my kids that dad
Speaker 1: feels dizzy and that they need to be quiet and
Speaker 1: leave me alone for a little while. I'm just gonna
Speaker 1: lay here on the couch and quietly watch the show.
Speaker 1: You all need to leave anyway. Uh yeah, So picks games,
Speaker 1: My things have been kind of nuts in lieu of
Speaker 1: a game pick. I'm just gonna put out there. So
Speaker 1: my latest contract, they unexpectedly lost a customer, one of
Speaker 1: the bigger customers, and so then they unexpectedly let all
Speaker 1: of their contractors go. So if you are looking for
Speaker 1: somebody who can help you with I'm I'm into the
Speaker 1: stimulus turbo stuff or rails if you're if you have
Speaker 1: a rails system, obviously I'm qualified on that. I'm also
Speaker 1: getting into AI like chat chatbot agent stuff, and so
Speaker 1: if you're looking at that, let me know. I'm yeah.
Speaker 1: And then I think I'm just gonna do the the
Speaker 1: other stuff like my stuff picks instead of whatever else
Speaker 1: stuff picks. So JavaScript JavaScript geniuses dot com what I'm
Speaker 1: looking to do is put together a group of people
Speaker 1: who are interested in kind of pushing each other to
Speaker 1: stay current and learn new things and stuff like that
Speaker 1: in the JavaScript space. And so if you if you
Speaker 1: go there, I'm running. Uh, it's the same deal I've
Speaker 1: had and I'm going to keep that up until Black
Speaker 1: Friday is thirty nine dollars a month. There's also yearly
Speaker 1: in lifetime options if you want to join the group.
Speaker 1: We have weekly calls. We do accountability calls on Monday
Speaker 1: and Friday. Monday is here's what I'm gonna do. Friday
Speaker 1: is what you did, and then you know, we as
Speaker 1: a group will help you stay on top of an
Speaker 1: accountable on the stuff that's going to get you where
Speaker 1: you want to go. And it could be I just
Speaker 1: want to learn more JavaScript stuff or get better react
Speaker 1: some of it, or it could be I want to
Speaker 1: speak at more conferences or write a book or start
Speaker 1: a podcast or whatever related to JavaScript. All comers Welcome
Speaker 1: also includes the book club and I'm going to be
Speaker 1: putting out videos on how to do stuff. I'm probably
Speaker 1: gonna start with remix on the JavaScript series. So if
Speaker 1: you're interested in any of that stuff, you're definitely welcome
Speaker 1: to join in. I'm also doing it for Ruby, and
Speaker 1: I'm eventually a start one for AI. The other one
Speaker 1: is with the AI stuff that I am picking up.
Speaker 1: I'm gonna be doing an AI boot camp next year.
Speaker 1: It's gonna start in January, so if you're interested, I
Speaker 1: will have a website up for that here within the
Speaker 1: next day or so, so you can go sign up
Speaker 1: or jump on a call with me and we can
Speaker 1: discuss whether or not it's a good fit for you,
Speaker 1: because honestly, I want everybody who goes through the boot
Speaker 1: camp to come out of it and go, huh, I'm
Speaker 1: set up to do this, and you know, I know
Speaker 1: what the next steps are to, you know, either go
Speaker 1: find work or add this to what I'm doing at
Speaker 1: work with it. So if I don't think you're going
Speaker 1: to get that out of it, I won't sell it
Speaker 1: to you. So anyway, Yeah, that's that's pretty much the
Speaker 1: stuff I've got going on. As far as movies go,
Speaker 1: dumb movies, I'll just throw this one in. So I
Speaker 1: don't know what possessed me to do it, but I
Speaker 1: started watching the Transformers movies like starting.
Speaker 4: Oh no, that's that's that's less than dumb. That's less
Speaker 4: than dumb. It's like negative stuff.
Speaker 2: Man. There, No, it makes atal sense that Anadian culture
Speaker 2: would build a robot that looks like June Buggy.
Speaker 1: No, no, they're they're anyway.
Speaker 4: No, it's just they ruined it with the like the
Speaker 4: soft core and all that and the Romeo and Juliet
Speaker 4: Laws the pedo stuff like it was.
Speaker 1: So oh anyway, it's it's nice mindless entertainment. So anyway,
Speaker 1: I've watched the first three. I'll probably get around to
Speaker 1: watching the rest of them. Anyway, those are my picks.
Speaker 1: I made a j cry.
Speaker 4: Yeah, okay, I so I'm gonna pick uh that. You
Speaker 4: get yourself on the pirate Bay and hit up the
Speaker 4: Original Transformers, the one where the Transformers are actually the
Speaker 4: good guys rather than just anti heroes that are not
Speaker 4: that are a different set of bad than the bad guys.
Speaker 2: What's the Original Transformers? The original of the first cartoons.
Speaker 4: The cartoons. It's like it's like Captain Planet g I.
Speaker 1: Joe cartoons when I was a kid.
Speaker 4: Yeah, I like, well, the car in the cartoons, the
Speaker 4: Transformers are actually good guys. In the movies, they're anti heroes.
Speaker 4: There's like optimist Prime is mostly good, but the other
Speaker 4: ones are literally just gangsters.
Speaker 2: Okay, I'm laughing, Okay, I don't care.
Speaker 1: Yeah, anyway, let's just go ahead and wrap it up. Oh,
Speaker 1: if you all want to reach out to me about
Speaker 1: stimulus or turbo or anything else related to that, I
Speaker 1: am totally open to that. Twitter, cmx W, you can
Speaker 1: manly chuck at topendevs dot com and yeah, until next time,
Speaker 1: max out you