 Video equipment rental costs paid for by peep code screencasts My name is win that one. I'm with squeegee where Ruby consultant C in Texas We're in Dallas Houston, Austin got one guy in China at least for the next two weeks He's been over there all summer. So I think he's ready to come home And this is JavaScript and Ruby frameworks See this hopefully nobody else's We help have the max of getting a hijacked by the remote here in the front row because I'm this I do this like three machines at the house switch over Alrighty, let's get it started. So as you'd expect we're going to talk about Ruby frameworks and JavaScript frameworks from the panel discussion So being a Ruby conference instead of a Rails conference. It's kind of pass a to spend a whole lot of time on on rails. So There's also more about there, which is an upcoming. They call it the pocket rocket framework There's camping and Sinatra which are geared towards Micro-abs much simpler applications than what you would normally build with the rails or MIRB on the JavaScript side most people know about prototype and script calculus because they're integrated with rails, so if you are Using Ruby chances are you know prototype and script calculus already jQuery is another one that is very popular especially among the the Ruby crowd based on its syntax but I hope to Expose you to a couple of frameworks that you may not have heard of new tools yui and xjs and the plan was to talk through each of these frameworks and The logical outcome of the of the talk would be to talk about MIRB and and jQuery which is Back in May when I pitched the talk what I Had planned on talking about until I actually read some of the panel descriptions for the other speakers So suppose is a kind of a slight problem to my talk today and raises some serious questions So a brief search of mr. Katz on the on the web now all these results are relevant I Didn't cover a portal that recent photo and then this one for the Houston and Austin crowd But evidently mr. Katz actually wrote the book on jQuery Literally Which doesn't mean a whole lot But a little further digging turn up mr. Katz's GitHub profile and To my amazement he's Done quite a lot in both communities and MIRB core developer a jQuery committer Heavy in the data mapper project He's kind of a big deal So in deference to mr. Katz If you want to hear a MIRB jQuery talk 10 a.m. tomorrow would be the time and place to do that and Be sure and catch book books So What do you want to do the next 30 minutes? So you may be asking why JavaScript at a Ruby conference and I think the To it's encouraging to see the reason the first question we asked how many guys are doing, you know web-facing Ruby work and the answer is quite a few And so it's you know the ground game in our web application development and the stronger JavaScript developers who are the better web application we create so Why JavaScript frameworks then Sorry That should be why JavaScript frameworks Something totally different to abstract browser quirks So no more checking the index user agent MSI e Mozilla to try to figure out what to serve up to a particular browser To extend the language add things to the native types that aren't there by default Ajax if I certain things you can't have a web 2.0 application without Ajax. So these frameworks normally supply some sort of Ajax plumbing To bring sanity to events The event model of certain browsers historically in JavaScript has been a problem this problem has been solved somewhat by The way that frameworks wrap up the way you handle events in JavaScript And of course effects. It wouldn't be a proper JavaScript framework without providing some sort of effects So the lineup Prototype is probably the most popular of the ones that are out there Especially in the Ruby crowd since it does ship with rails And you can't really talk about prototype without talking about script aculis because it's the the paint job So prototype integrated with rails as we mentioned Provide several OOP enhancements to JavaScript itself to make Dealing with objects and object-based programming JavaScript will easier Has a myriad of utility functions I try these and then the wrapper functions for the dollar dollar dollar Methods dealing with forms the dollar F and arrays with the dollar a method and Includes very robust Ajax support a lot of folks that Start writing Ajax in JavaScript. It was through prototype and in some of the the Simplifications that it it created around doing Ajax and Pair it with script aculis we get the effects appear fade and puff and all those nice demos that are on the script aculis website Dragon drop is a big one to add more interactivity to your JavaScript application to be able to drag elements around on the page and drop them and get some sort of event handling and feedback of Events that mirror desktop applications Builder is one that is probably underutilized in building JavaScript applications it allows you to construct biome objects and markup in the browser directly in a API fashion without having to use string concatenation JQuery is another popular one. We'll hit this one really fast since you could just doing it tomorrow I didn't get into jQuery right off the bat just because I think the name more than anything else just the Maybe it's bad marketing, but it was quite popular before I I called on the bedwagon once I noticed the syntax differences in jQuery It's it's been a joy to program in jQuery if and if you've done it yourself you probably would agree it's all based on syntax chaining so that You find yourself dropping into loops less and you can do the same action on Items within a in a collection just by daisy chaining the the method calls jQuery has a lot more Simpler support for Ajax in certain cases. You can still drop down and do all of the things that you can do in the other frameworks with it the Ajax object itself, but the load method in jQuery is Makes it not that simple to do simple loading of external content into a div object And one of the coolest things that I like about it is the second argument in the load is a CSS selector so You don't have to have necessarily an actioner that returns markup from an Ajax request that is sans layout and just a fragment only by providing that CSS selector it will take the output of the server response and Query it via CSS selector take just the chunk that you want to load into Another object just pretty cool Core effects built in the same fade puff blinds for the most part and it's not a one-to-one correlation with with prototype But you'll get a lot of the same types of effects another cool feature is the animate method Anybody here played with animate? extensively If you haven't check it out. It's a cool way to morph in between Instates so that if you want to fade something out you simply just call animate and provide the end state you want to Fade the opacity or other CSS selector To and it handles all the incremental steps in between. It's pretty cool It's designed from the ground up for plugins one of the problems with writing good JavaScript is namespace collision and global variable Collision and things of that sort so one cool feature of jQuery is the fact that you can write a plug-in and be reasonably Securing that your code is not going to collide with someone else's and it plays well with others just from a Selector standpoint so by default jQuery uses the dollar selector just like prototype move and these other Frameworks but the cool thing about jQuery and this may be coming to some of the other frameworks Just because it is so cool is that you can change That default selector in this case created as dollar j instead of dollar So that if you want jQuery to play side-by-side with one of your other frameworks It can do that pretty easily and that I mentioned you who does here new tools is another one provides also language enhancements around Array hash number some things of that sort It has OOP extensions via class and class extras Its effects are also built into the core engine in the effects name space and it has a lot of the same ones You would find in some of the other libraries again Ajax The reason I throw this one out there who here is either heard of or played with me Cool about what I expected the cool thing about Mu is for some reason it the Designer types have really infiltrated this community So it seems like everything that this particular community does is just pure eye candy and looks good So if if you like great design, then this is a framework to check out Yahoo user interface anybody played with you at all This one is a bit heavier It is more than just a JavaScript framework and includes some CSS reset tools and UI patterns and some other things In the the whole package more than just the JavaScript enhancements What's cool about Yahoo in addition to some of the other features it shares with some of the other frameworks is its namespaces and that it really is architected to Play nice with other frameworks and not get in the way just much like the the jQuery no conflict mode But something about this code I find very verbose and Java-esque It reminds me back before I made the switch off of Microsoft when it seems they ported the CLR down to the Yeah, what is the the marketing buzzword for the AJ their Ajax package, but they essentially took the whole Common language runtime and imported the JavaScript and that same syntax reminds me of that that framework XJS anyone heard of this one? Cool a lot of folks and probably doing data tables and grids and things This particular one is It's more widget-based. They do have some language enhancements This one is very It's very good fit if you're using a lot of Data manipulation especially with client-side sorting grids and things because their grid and layout on the client is spectacular and great-looking grids They're Really themed like Windows control So it's for applications that really need to mirror or take a stab at recreating a desktop experience in the browser And we'll get to more in those UA components in just a second So the big question at a Ruby conference is how do all of these play with with Ruby and there's a few approaches to Including JavaScript code in your in your Ruby projects the first one is as helpers This is the one that if you're into rails or into MIRB is the usual approach a Lot of folks have the the outlook that you really don't want to touch JavaScript directly Especially if you're a Rubyist unless you're comfortable in the front end. I just I meet a lot of middle-tier developers that are very data-savvy very object-oriented and Considered JavaScript the ugly residue that gets on your web applications So a lot of folks you have the the mindset you don't want to Handle the JavaScript directly and so you use a helper and this is good because it provides You know a clean way to in a dry way Call JavaScript from your Ruby view code it avoids tag soup so You know and and one of the challenges with ERB is that we've got HTML markup Intermingled with our Ruby code already at a third language of that and becomes even more complex So Ruby helpers are a way to do that. So instead of calling the Ajax object directly from prototype and she's the link to remote nice dry Method of including Ajax in your application There's a dark side of helpers you got to keep an eye on them especially when they turn on you I Don't know if you can see that. That's Doc Ock So consider this dry view code and it may be hard to see it and anticipate the the contrast with the the monitor I mean the projector but this is a nice dry piece of code that renders a table and for every row in The records that we're going to Have an Ajax link up to Edit Ajax call that does a destroy on that particular row in the database. So Really easy to put it in a loop put your link to remote off you go really really dry, right? But it's very wet and sloppy in the browser You notice the highlighted areas We're including the same inline Ajax call for every row in the database and you'll see that your page size grows Substantially just because you're repeating the same code over and over again So if you have a hundred rows in your in your table, you get the exact same code a hundred times over the only thing that Changes is the user ID that you're passing into the remote function call So how do we fix this one method is unobtrusive JavaScript anybody familiar with ujs? Cool a few hands. It's gaining some steam There's some upsides and downsides to the ujs This is one of the upsides and then it just promotes good front-end practice in the first place Focus on your markup right good semantic markup in this case. We just render the table With an inline link and now One change that that I did over the example of the article outlying this was this actually links up to a confirmed delete action, it's a standard web page that it links to you'll see a lot of Links to an Ajax call to destroy something you have to confirm the JavaScript in there And it will intercept the call and keep from having get requests that that do something destructive in the database But most of the time I see this particular piece of code executed that href would just be a hash or pound sign And then they'll intercept it and make the Ajax call on the back end And the problem with that is if you don't have a JavaScript and enabled, you know The page doesn't do anything anyway, so I found when doing ujs. It just helps to architect the application like JavaScript was not in play build your methods in your actions and controllers to Perform the work that you were going to perform if JavaScript wasn't enabled and then just hijack that After the fact and this is a prototype example to listen in on each of those links in the table and Pass it off to the same Ajax request to do the destroy But the cool thing about this is it's over in the JavaScript file and our markup that sent to the browser It's much leaner because the function is written once we're not writing it in line every time tools to do ujs jQuery supports it out of the box it actually It's almost designed for it and its support for CSS three selectors so If one of the first tools that you need to write ujs is just to learn the CSS three selectors because you'll find yourself looping through Collections less and less if you just start with a more specific selector that can find the the element that you're wanting out of the box So jQuery is a tool that can do this then we have is a low pro anybody Use low pro Cool. I keep asking the questions. I'm finding my kindred brethren here. I'm gonna talk to you after the talk low pro is an object-oriented kind of attachment to Prototype that allows easy attachment and detachment of behaviors to particular elements on the page and they can even Inherit from one another so you can define a behavior I give you a good example from the the defaults for low pro. He defines a remote object That's a base class that handles either remote link or remote form and there's subclasses of that remote link and remote form that you can attach to an Anchor tag or a form tag and it is smart enough to look at the h-referent for the anchor or the action for the form and Do what you would want to do 90% of the time and that's called the same action behind the scenes and render an update or Some other action on success Low pro is also been ported to jQuery When Dan came out with it, he kind of floated the the idea of low pro for for jQuery first and Just to see if there were any takers and ended up doing it almost solely for the class that create Enhancement that is already in prototype so it brings kind of OOP Enhancements to jQuery to be able to create these behaviors and have them inherit from each other and there's also ujs for rails I'm not sure if this is still active the website looks like it's been abandoned. It's been I think early 2007 since the last time This has been active, but there is a plug-in that will help Modify some of the helpers in rails and provide new helpers in rails to do a lot of the javascript that you would normally do ujs manner another approach is widgets, so we all have application pieces of functionality that We really need to componentize at the UI level. I use the term widgets. You can use controls components Gadgets whatever you want to call them and they're just a way to have a programmatic API interface to a GUI control much like you would have in a desktop application There's a number of ways to do this, but this is kind of a catch-all term for a reusable chunk of UI code and The normal things that applications need that We tend to reuse over and over again our grids tabs date pickers things of that sort And each of the frameworks that we've talked about has some sort of Support for it out of the box jQuery is the jQuery UI project, which is pretty cool. If you haven't checked it out It's Recently been read it has a whole theme roller application that you can go to in the website and define your own themes with very sophisticated Opacity translucent settings base colors where really you can define your own skin for the all the controls that ship with the jQuery UI project plugins.jQuery.com is another one where not everything on the jQuery plug-in site is UI Has a UI sometimes it's just base JavaScript functionality, but there's a lot of them on that website Live pipe is one for prototype It's not it's a commercial project, but it also has a free version that provides a lot of these pieces of functionality out of the box like tabs and Grids and things. Scriptik is another one, especially if you use in Rails or Prototype especially It's a vast index of UI components and extensions And like we mentioned before both YUI and XJS Include a lot of these out of the box And the fourth approach is MVC in the browser. So We've all used MVC in either Mirb or Rails most likely we know the and even camping and Sinatra Support the MVC pattern. So there's great benefits and keeping your code and particular buckets around whether it's data or behavior or rendering that data in particular context So MVC in the browser may sound like a crazy idea the But it's just so crazy it just might work anybody here heard of Sprout Core Cool, so three hands. So Sprout Core is JavaScript based if you're at home in Ruby, you'll be at home in Sprout Core it's standard-based and it is Pure JavaScript for the most part MVC in the browser as we mentioned its aim is to provide really slick desktop grade Applications in the browser it powers Apple's mobile me And so the goal is to have the same interactivity that you would have in the browser Cross-platform that you would have in a particular Cocoa application and you'll see in a demo in just a second how it resembles Cocoa So why do you care about this as a Ruby as well? It has a lot of Ruby flavor in it to tell you the truth the syntax is straight out of Ruby you'll see some of the view code in just a second that is Looks just like ERB So it's got the same hash rocket syntax that you familiar with and comfortable with it's got generators. So The MIRB based development environment includes generators to generate models views controllers the output is JavaScript files, but they Very closely mirror what you're used to using in either MIRB or in Rails includes fixtures and I put that exclamation in and parentheses depending on your view of fixtures. They've got a bad rap Recently, but if you're in development mode in a sprout core application you can Create fixtures and those fixtures are loaded when your application loads. So it makes testing a lot easier So let me pull up a brief demo real quick. All right, see if I can drive backwards here This is a sample from Sprout core the GUI controls Sample application that ships with it So to give you a little background of what I'm doing here. Let me get my terminal window on the other other screen This code is up on GitHub. So you just Get client as you would any other project and it should look very Familiar to you to just run SE server. It looks just like script server and it's cranking up MIRB in the background And so this is the development environment for Sprout core So all of the generators are powered by Ruby and then you just navigate to your local address in this case They're default ports 4020 and I go to the sample controls Project. This is an example of a collection Notice the drag-and-drop reordering The GUI is based on data binding which should be familiar to those guys have done cocoa So you update the model your your views automatically get updated because it employs data binding has buttons tabs Things you would expect to do in a desktop type application Of course, this won't be a fit for every application that you build but if you do find yourself designing an application that's very Needs to be very interactive and client heavy. This may be An option to look at But notice the syntax. Can you guys in the back see that? same ERB type has rocket syntax to Put a slider on the page radio buttons Actually, I found it interesting. There's a radio button group that they have that we don't have in in Rails Which would be quite helpful as the notion of scrollable panes Also modal dialogues and even inline pickers form validation So just like you'd expect in server-based Ruby application. You can do form-based validation in JavaScript So let's look at a Sprout core project real quick This is the photos application. Let me just browse to that and show you what we're going to walk through here Just a second so it's just a Slumdown version of kind of an iPhoto clone List all the photos in a particular collection notice the menu list over on the left-hand side we can Drag and drop and reorder these We came in add new ones and drag and drop Photos into that collection and all that's persisted as long as the pages is persistent What's cool about this is there is a controller their views their models just like you'd expect in a server application what took me a little while to wrap my Head around was the fact that all this is happening in one particular client view and a client application So we're used to I click the link I go to another action on a web page in a server-based application and with a JavaScript MVC application these are simply just click events all in the same page So they're really not navigation events as much as they are interaction View changing events, so I click a particular button I'm calling a controller action that is changing data underneath the hood and then the view gets updated from there Which is pretty cool And if you've done any sort of desktop development that should be very Comfortable for you So let's look at a model here in the particular photo application Let's look at probably photo first simple simpler So to create a new model, it's just photos here. This is the name of your application photos The name of your model in this case photo dot sc dot record extend It's gonna like active record base should look very familiar to you and you define your properties Directly in line here now properties in a sprout core model You define them, but you don't call them directly so you have an object in this case Let's say we had a photo instance of this photo type. We wouldn't say photo dot URL. We would say photo dot get URL and set URL If you're familiar with doing a lot of Java desktop development that should look familiar to you And the reason for that is we have to give the framework a chance to React to the gets and the sets so that we set data we can fire off Events to observers so that views can be updated so it makes the syntax a little bit more verbose, but it's definitely worth the The ability to have observers and data binding this is the album record to notice we've defined a couple of Properties here directly in line. So just like you'd expect in active record photo belongs to an album album as many photos so the Photos property here is defined in line with photo count and in line function And then the property photos is actually what exposes that as a photos property on the album collection You can define a property just by in line setting a value you can also do it in an array with a properties array at the top of the the record and The cool thing about spout core applications is that they're localized so Your languages are stored in these L proj Folders and this is so that the build tools the mer build tools at design time can go through and localize your Application based on the strings that you define So you just drop another language in here to find your own strings You can totally localize your user interface, which is pretty cool. I wanted to show you some of the view code so this is the The main view that gets loaded this body when I crank up the application and I should look very familiar To rubius out there But all of this is creating JavaScript on the fly, which is a pretty cool thing So how do you debug one of these applications that may be? popular question Good old firebug clear this out See if I can type behind myself here So in a controller There's an SC sprout core Global object and within that we have the store and it may be hard to see The font that small the store is where all of the currently loaded models for the application are stored So this is kind of a global bucket to put things We can then call the type in this case photo and then find See I can find the first one here. Whoops syntax here. I had all of this stored in history So I wouldn't have to do this on the fly and then we had to reboot the machine right before the demo So I'm very with me one second. Actually, it's just like a store So we just look at the SC store object we can inspect it and firebug And drill through just like you expect to do any other object the records Internal property there shows all the different albums in the photos and you can drill down To a particular photo and see its properties So it should look very familiar to you. You've got the same finder Methods that you would have an active record. You can chain those methods to do You know photo photo once you get a photo object photo dot Get and then pass it the album type and it will fish out the the album based on the relationship that's set up in the model I've just started with with sprout core But it's one of those things that I'm going to take a harder look at especially with a couple of applications that Would benefit from a client Heavy application like this that requires a lot of interactivity. Yeah You'd have to call back to the server and just like you would with any other You know disconnected or rich Application framework like you would flex or anything else and one thing I should mention And I don't have a demo or a slide prepared to do it there's a way in Your models to set up a server URL that will be used as a resource kind of like active resource to go back to the server and They have some examples in the wiki on GitHub of how to go in and take an action Let's say in a context controller in the index view that would marshal The special Jason that's needed To return the raw Jason so that this could consume it directly the big change is Properties like ID or reserved in JavaScript for obvious reasons So those get mapped to a GUID property, which is Probably a bad name because most people think good instead of just the integer But that's what it gets mapped to so and I'm sure we'll see tools that get developed that marshal some of this for especially in rails Or MIRB where you could very easily have a rails back in a lot of people are writing Applications that air applications have a flex front end to a rails or a MIRB back end I think you'll see the same thing with with sprout core yes, sir Query string after the info. I think that's just to keep it Fresh just like what rails does a time stamp to force it to reload a couple more slides and I'll put up for questions And this may be hard to see again. I didn't anticipate the thick contrast on the on the projector This is a sprout core model. This is the One of the examples on the on the wiki of a to-do list Essentially all it does is This is the actual to-do object and this is where the relationship to a to-do list That has many of the belongs to would be set up in that fashion And you're basically just giving it a type to point back to in this case My app is the kind of the namespace the application namespace in the previous Demo that we just looked at photo is the name of the amp So that's why we had photo photo or photo that album in this case is my app dot to-do list And so then the other end of that relationship in this case to-dos is the collection property Hanging off the to-do list so to-dos is the has many relationship that you'd be familiar with in an active record And here's a look at the fixtures we talked about earlier as I mentioned the the GUID is the ID property and Just like you would expect fixtures in active record. You can specify relationships between models, which is pretty cool And so here's an example of the the find I was trying to do on the fly with a little success But that looks should look very familiar to your active record finders So where do you get it? Just sprout core comm and then it's up on good hub. It's brought it And there's a lot of great wikis that I discovered late up on the github Just click on wikis I know a lot of folks don't actually click on the wikis for a lot of github projects because most of them are Empty but this one has a lot of great info in there and a lot of a rail specific info around What's different between a rails outlook of this type of code especially the ERB involved and then how do you hook into a server a Rail server with some of these model finders and things so questions It just use prototype under the hood for this Ajax calls So there are it has a frameworks folder that gets there is a notion of a build process with sprout core that basically prepares your applications For deployment what gets generated are just standard Static JavaScript files. It does use prototype under the hood for a lot of the cross browser stuff and Ajax specifically, but there's a frameworks Folder that you can drop your own frameworks and extend it if you need to even extend sprout core itself All of the market was generated and showed one that was real proposed But there are any different among the frameworks that would be more Generating all of the elements locally on the client and just bringing a jason Question Data jQuery would be more what JavaScript frameworks. So the question was what JavaScript frameworks would be more I Guess agreeable to just passing jason back from the server and having a more client-centric user interface well, just sort of the mentality of using the server to grind out Right the way it's going to be as opposed to separating transmitting some data You know none of the frameworks really Support that or preclude that more than one or the other And it's kind of a design decision. If anything jQuery probably promotes passing jason back and forth a little bit It's just a kind of one of their opinions baked into the framework. Although they do really easily support passing HTML fragments back But the notion of rjs that's kind of built into rails where you do a lot of you have the actions that If they want JavaScript you have all these You know ruby helpers to write JavaScript in your rjs files that whole paradigm is kind of It's just not a brace by the jQuery community As far as the other frameworks Nothing that it really differentiates themselves one way or the other with the exception maybe sprout core does Lend itself more towards Collections and things on the client instead of on the server. So instead of going to get an HTML fragment and binding it Although you can it's really really easy to do they want to provide More tools for doing that data binding on the client so that you get all of the the same click events and things On the client side instead of having to always call back and do something on the server Or any of these Boy I thought I had a plant in the audience is a great question or any of these working with the HTML 5 data store Sprout core does and actually if you fired up in firebug It will tell you warning this browser doesn't support each file HTML 5 data store Changes will need to be persisted the server. So but that is an option. It's a cool option to Spark was the only one that I'm familiar with Yes See I leave dojo out and then Waiting for the guy that asked about dojo because we sent it to a Said this to my colleague in China and his very first question is you didn't mention dojo So I did mention the ones that I have a first-hand experience with and I don't have experience with dojo I know and it's been out there for a while and a lot of people swear by it But just personally I haven't used it It does it does testing is built in much less standing I didn't go over that but their tests are generated Or harnesses for them You know the the skeleton tests just like you would an active record model if you generate it You get a test that's that spit out so that really encourages him encourages testing from the ground up see you use Sprout core within Ruby or it almost seems like it would be a replacement for It depends there's the rails there's the there's kind of the split right there's the client side There's the server side the Sprout core itself is server agnostic You could use it standalone as client only especially if you had a lot of static content in this particular case that I Was showing with the photos all those photos are resources in the project and they're choosing the file URL to get to them of course that doesn't work in the server But if you are going to bundle it up and ship it with them you could It could be but it also can have a server base back then back in what I didn't show is normally in that that Photos demonstration instead of it being looking at a local file system I make a call to a photos controller probably in rails or MIRB or PHP or whatever it was And it comes back with Jason that I then create and Marshall objects client side And then I have the client data to work with Yes Good question ex J s I did I think put a blurb About that is dual license one of the licenses ill GPL Three I believe and they have a commercial license. So it's probably the stickiest of the licenses the rest of them I believe our MIT except for UE which is BSD Which is a it's a it's very good questions something to keep a look out for thing what your distribution model is Speaking of distribution one cool thing. I did not mention in the Frameworks is a lot of these frameworks now are getting really surgical about what you can what parts you have to download and install to get them You know we're familiar probably for most of us with prototypes drag-and-drop effects Being separate from from the defaults and if you just in your rails application JavaScript include defaults you get all of that for free Prototype is componentize somewhat but jQuery Especially jQuery UI not jQuery itself because it's pretty small, but jQuery UI and move now On their website when you go to download you basically check the checkboxes for the feature support that you want and can get a Customized download package of a very slim version that basically has the least common denominator for everything that you need and usually in minified or zipped gzipped File formats even just pop them in your server Another interesting thing to keep an eye on is Google over the summer began hosting these frameworks Most of the larger frameworks on their servers as a CDN type model So it's another option that way not everybody has to to host their own JavaScript files. All right Thanks guys video equipment rental costs paid for by peep code screencasts