 I really haven't anticipated or shown this, so I'm going to add some comments if that helps. So what we did in the beginning, besides everything, when you guys registered with that team, we got all your information. And we put that in the spreadsheet. We also put the rest of the people in the spreadsheet, so speakers, sponsors, us organizers, who have been helping out with audio and visual stuff, and Michael Theron. So we have a big spreadsheet. So what I did when I printed the badges, I took that spreadsheet, I gave everyone the unique number, I turned that into a binary number, and I associated that with you guys. So the reason I did that is because when we're at the Utah Ruby Room meetings, we have nine people, and we do the binary lottery. We can have one of 16 outcomes. So sometimes we draw someone who doesn't exist. So what I wanted to do is I wanted to give everyone a unique number, and then what I'm going to do is just randomly choose one of you. So here's the alfalfa that runs this. You got your name, whether or not you're eligible. So for example, so when we give away the Xbox, this is Tim Beard, he's a Microsoft rep. I'm going to go ahead and turn him into Elfville Falls. And then I'm going to go down and make sure that I'm eligible here on the floor. I'll turn the rest of you guys off. Yeah, so I added all the organizers at the very, very end. But for the most part, you're in the sequence of when you register. So you're nothing under with the personal register. So I put that up. I also set up files that we created that I just found to make sure that everyone was in sync. And then it's a lovely script. It's shanky. And also, other than Tim Beard's talk, I wanted to do a RubyConf new kind of logo thing for the website, but I really wasn't sure. I didn't think the mountain was RubyConf. So I was just seeing kind of a bad choice. And I thought giving the region is an optional parameter that's bad as well. But I really like that Tim Threads way of doing that. So I'll use that for next year for 2008. The biggest thing I think that people like is the big text. That's using Figlet, and she's just the next command that you can install. Go to figlet.com.org and get it. And I used to put that just throughout all the Figlet codes. So that's big. I opened the user file on here. I randomly choose a winner, and I make sure that they're eligible, and if they're not eligible, then they're going to only choose the winners. And then I'm just going to take that winning note that you remember, and I'm just going to show one at a time to build a suspense. That's all this loop is doing. I don't know. I'll give you a self-explanatory. You can understand that. And then you show the winner. That's about it. After the winner is shown, if they're here, I ask the question of what they got. I'll type it in. And then if there's a value for that, we'll save it to the ammo file and turn them to not eligible to win again. If not, then we won't save the file, and we'll be eligible to win there. Awesome. So that's it. This is the web application. It's a framework that basically does a similar thing as Braille, but it's a totally different concept. That's two years old. It was developed originally in Coalfusion about seven or eight years ago. It went through PHP for a few years, and two years ago it was written in Ruby. Because there's no other language to do where Ruby can do so. Basically, it's a web and web services application framework. It strongly ties into the database. It's extremely fast for enterprise database applications. That's what it's for. It has a built-in website and content management system, the next content and application data, so web pages can have applications in them and applications can have web pages in them. And it's used by 10% of the Fortune 500, although they don't really know that. The reason it was developed is for school with application development and itself contained applications so multiple customers can have the same applications. Every application is in a folder. You can just move an application from one installation to another and the application does. The design is all done with CSS. There's really no HTML except for one file where you do special weird things. The designer basically has access to the CSS and programs to everything else. Because I hate HTML, but all of my customers want HTML. You only retrieve and save the data you use, so I'm like, act of record where you pull all the data and send it a whole bunch back. We deal with huge data sets and things, so we only pull the fields we want and we only send back the fields that have been changed. It's a complete rest architecture. Everything is get and post. It can act as a database for eight formats. You can start it and stop it with wax on and wax off. The developers do almost everything and the designers do the CSS. Field positioning and order and everything is all done by the developer. This is how it works. You basically have a request that comes in on half.fcgi creates a request object, the request object creates a response object. It goes to the handler, which is like the controller. The handler creates these interfaces. The interface is an interface to a data source and it has data objects like a person, a company, and then the data objects have field objects like first name, last name, company name, things like that. The interface is responsible for interacting with the database. The interfaces get passed to the layout and the layout is rendered by the handler. You can actually have multiple layouts that get aggregated into one layout of the end user. The handler basically, the request comes in. The request is an instantiated object. It's not a class. You can have multiple requests. You can fork out requests and do crazy things like that. So the very first code you write is stuff in blue. Death record, handle, and it comes from there. The interface, you extend either a Postgres or a MySQL or some XML remote data source or whatever you want. You define all the fields on that data object that are created and then you define the fields that are on this interface in an array. So in this case, we have these five fields, two data objects, a person and a company. Then you define the sort order if you're getting a list of data, the default sort order. If you pass in search in the URL or something, you specify what fields are searched. If you pass in a field name, like first name equals Dan, it'll look in the first name field for that value and you can do all kinds of matching options whether it starts with containers, case sensitive, greater than equals two. You can specify whether search criteria are required. On the data coming back in, you validate on your interface to say on this interface, this field is required. And then you can do complex validation. Like if the country is in the U.S. and the state is required. Time's up. Okay. Ready? Don't point. Okay. So the field has 97 attributes and these are different field types. This is Ruby. And these interface data formats, XML, all those ones up there, it does all those automatically and you can write your stuff. So this is how you set field attributes and we're going to look closely here. So here's all the code for one interface. You've got a handler and an interface with a couple things required at the bottom there. The data has some field types. I suggest. Okay. The result is in the middle you've got your HTML. The left over there is a JSON. And you can input, you can get and post all of these things. There's so XML. You can get and post Excel files. So here's a select field. You just say the type is suggest. I mean this is a suggest. You give it a URL that this data comes from. It pops out of this dropdown menu from that URL of data. That's kind of the one that data that's turned into this. This is a list view. It has paging at the bottom, which is great app. All table column headers are sortable backwards and forwards. And when you put it in a search field, it searches those fields that you define in the interface to be searchable. That's it. My name is Jay Meskill. I work for a company called Integrated Technologies in Phoenix, Arizona. And here's my short demo. Managing SSHQs with Capistrano. Or how my life is easier thanks to Jay Mesbach. So the problem that we had is we have a bunch of Zen and DOM used that a bunch of our developers need access to to deploy prototype applications for our clients. We needed a way to quickly add and revoke different developer's keys kind of across the board. Not the most secure system, but it's only for internal prototyping work. So my solution was to make it capital playable. I'm just going to take you guys through my recipe real quick. And then I'll show you a working sample just deploying it to my own machine. So this is your basic Capistrano recipe. We're finding the server that I'm going to deploy it to which is my machine here. The user, I'm going to deploy it to the SSH demo directory so that I don't screw up my own SSH keys. If we look at the setup, standard stuff in update code since we're not using subversion or any sort of source control management I'm overwriting that task using it to collect whatever files are in the keys directory so that would be multiple developer's sample keys and uploading that into the authorized keys file. After the send link I'll link the authorized keys from the current release into the SSH directory so that now we have public key management. So I'm just going to run this real quick. Here's my SSH demo directory if we look, there's nothing in it right now. So I'm going to run a cap setup we should have releases and now a, so let's look at the keys, so I've got two different keys here that I've collected they're both my own but we'll go from here. So I'm going to run a cap deploy and that's going to go through concatenate those files together and deploy it to the authorized keys file in my SSH demo so this is where a server that was running we deploy it to the SSH directory and now my developers can deploy applications SSH in for remote management et cetera et cetera and that's pretty much it. My name is Kobe Graham I have a company here in Salt Lake and we do custom application development for our clients and one of the pieces that we started getting into Ruby on Rails and doing work and building internal we first got started it's like we're going to close this we'll just talk it out of the way so in the custom application Rails is great it gives you this wonderful application development framework but what I found is it leaves right there where you're ready to start the application it drops off so after doing a bunch of research I came across a product called Volver it's basically a generator I have nothing to do with the project other than be a diver and consumer of it so we're going to start with your traditional command we're going to create a Rails application so Mountain West Ruby conference I already went in and created a database so once we have that app created we've all done this in Rails before we can go to our script server flip over to our refresh if you get what you see every time you start running Rails app that was nice but it's not quite as far as I wanted the thing to go for so after finding Goldberg you can take it a step further I just downloaded and installed the Goldberg generator and my generators directory and now I can do Ruby script I can type correctly generate Goldberg and with Goldberg it comes predefined with a couple of different templates we'll use the smoker template once the generator sticks a bunch of files in here then at the end it tells you to go ahead and run rake Goldberg installed but basically all this does is execute the migrations that the Goldberg generator created out of your project and then populates the database with some default data now that that's ran we I just switch tabs here to just start the server up Ruby script server I think the server is running we refresh and now we get a little bit more complete site we've got nice dropdown menus, we've got a login it's created users, it's created basic security and authentication and we can log in as admin it also has a basic CMS to the application so now once we log in as administrator we can come in to setup and the first thing we've got Midgee at this point called controllers management then shows up and lists those are all the Goldberg controllers that generated and stuck in your application so if we come back over here and just do a typical Ruby script generate controller we'll call it search and generate the index method okay it creates our new search controller we come back to the controllers and action screen in Goldberg and hit refresh we get a little bit different screen we go ahead and look at our source code and we realize that we've created a controller that doesn't currently exist in the system so it promises that click on it, it allows us to add it and set a default permission I'm going to leave the permission in the administrator and tell it to create it so we now have the controller we just created we've assigned it a default set of permissions and then we're going to select that and we're going to add an action so you click on it the action we're going to use is the one we created for index and we're going to create a one thousand controller and the action is the Goldberg definition the next step to getting out of the menu is we come to our menu editor and it gives you a nice little hierarchy of menu preview we're just going to add this right on the top we're going to add a new menu item called search and the label is search and it's going to run against a controller or action based on security permissions so we can create that on the menu you can notice it does show up up here on the menu you get your default scaffolding we generated that said right upon the view so instantly your scaffolding stuff that you build has a place to live now if we log out because I set search up as an administrator only if we log out search shows away log back in search shows back up the other piece I wanted to show you real quick is it also has a basic built in cms so you know content pages these are the pages that Goldberg defines by default you can go to your home page and this is actually straightforward enough that I actually give my clients access on their websites to maintain your own static pages come down here you can change the name and it's very as well as setting the permissions for the page so anything you create in the cms is also able to have security applied this is currently using textiles in the red style on the market by default through the red file libraries add more stuff to the page save it go to the home page and it's there like you would expect so Goldberg just gives me the extra stuff going from I have a app and I got a little whole bunch of stuff to I now have a app it's got built in users roles, permissions and the ability to set roles and permissions on controllers and pages so Goldberg has just been a fantastic boom to the stuff that we do with our company with our clients and taking you from having the framework that Rails is to having a pre-built application because it's a generator you have all the advantages that you modify the hack out of but I'm not worried about it you have the disadvantage of it's a generator so if you're going to build a base or you're going to Rails 1.2 and you've got a version of Goldberg that's compatible you've got to reduce your code so Goldberg has been a great tool for us you can find it at Goldberg.rubyforge.org oh my god thanks cruise control rv it's basically the idea that when you check in source code it's checked out on a separate box and built and tested cruise control rv version 1.0 cruise control or continuous integration with the tools right now we've taken a slight rocket science it's done simple so we've built a pretty simple tool we hope that this tool is easy to install it should take about 10 minutes to download it and get it running your build it's got a pretty little UI and it should be easy to hack for Ruby people so I'm just going to show it to you real quick sorry it's a bit show a little bit better anyway I'm just really mad at it enough you can imagine it's being chopped off there there are some projects that I'm running right now running cruise control some failing project any example of java 8 so it gives you the basics of what you need to know if you want more information you can just go ahead and drill in so click on and read on the rails or just something called cruise you can specify anything you want so you can use nth or nth or anything like that the only thing that your command line needs to do is to turn a 1 or a 0 to tell us whether the build's exceeded or failed you can put the files in a certain directory and then they're automatically rendered on the screen there's no XML none of that SSL or T stuff that those of you who are familiar with the cruise control java version might just spot stuff and just made it kind of simple that's pretty much the click on the should drill into the actual source code and show you that line in the source code that's a big one deployment basically involves sitting on an application and telling the server to deploy it and not just telling the server to deploy it but basically goes out to your entire cluster in one shot you don't have to worry about that so just yesterday the first release of a project called rails integration came out it's related to JRuby it's on the JRuby extras project on Rubyforge but rails integration makes rails deployment just as easy so here we have a little application that I wrote actually for no fluff to it all I really got in here that's interesting is a little controller called the java controller all this stuff we do a little monkey patching of the java system class so we can access the properties more easily and it goes and gets the java on the class path and dumps it out in the result so if I hit this through normal rails here, you know for those of you running JRuby does run rails now if we hit the actual controller we see we're getting all the java for mention here because it's actually running with NMEM but if we take a look at our glassfish application server here take a look at our web applications we actually have NJS the way we get this I won't run this completely through the plugin that goes in the rails have war stamp along so it's got all the lines and dependencies it needs create and what this will do is it will go through and first of all pulling a bunch of java dependencies pulling things like java ruby and other stuff it will go through and then it will pick up the rails jams and a few other things add them into the war file I won't let it continue because it's a lot of files and the result is that you get a NFJS.war and that's all that really comes out and it does keep track of it so it won't do big copy one time and just update what it needs from then on but once you've got that you can go to whatever app servers lots of people doing it on glassfish and jboss and comcat and much others all you have to do is go to the location that brings it up and the advantage to this obviously is you have one server process for as many rails apps as you want as many concurrent requests as you want we have actually better database support than Rails does at this point because we have the ADC which supports everything and I guess that's about it 1.0 Rails integration check it out try our app server there you go we've got a lot of files that we need to deal with and we just needed something to do the concept was we needed lots of aggregated log files we're dealing with syslog for about 600 boxes right now when we get phase 2 of our project it's going to go to the order of 3000 boxes all aggregating to a single system we're going to pre-process them I didn't need to go off and deal with 100 boxes and then we need to order our off screw when something rakes and something raking can be a pretty open term it's really really simple first of all because I don't have to maintenance forever I need to be able to deal with the off screw and if I'm not a professional programmer they're really not professional programmers and it needs to be extensible and again I don't want them calling me every time something happens so I need to do something that and oh this is something that would happen this is what it looks like in log file so the executable itself is really really simple in the library actually I'm going to say this is older code it's changed it went from about 170 hot lines of code when I was doing this to having 4 major new features including dependency handling it went up to 250 lines of code I also went from having 600 log entries per second to handling more basically we have a pattern class that we deal with a lot of bunch of classes we initialize several bunch of posts that we know about we get a catalog of good patterns save that off and a set of bad patterns and then again this is the old part I'll show you the newer more important part a little bit watch through all the big lists and deal with it if we don't go on with the bad patterns if it's bad pattern correction we throw out a notification sometime this point we do email and blogging we talk about adding non-ghost there's actually just something with a wolf about making the adder chowder and it doesn't recognize that as either a good pattern or a bad pattern it doesn't know what to do so it logs that and we go through and periodically clean out what does that really mean and what does that look like it's really pretty simple those are two different patterns it's a the name of the the pattern is a ruby object type pattern or what message it sends out is the alert message what kind of alert could be notifications which is just blogging email how many how many do we have to have seen so I can look for 30 in the last 5 minutes 30 in the last 5 minutes if I've seen if I've seen one I'm not going to be applying it for some arbitrary number of seconds I can also I'm not showing you any of these patterns depend on the another kind of pattern already having been seen within a set period of time a main protective pattern and then a regular expression that actually gets matched for and once they see three or four of these a genius is adding you can sit down and write one very very quickly the results that we got like I said it's about 250 lines of code not counting the catalog really really easy to define it's like 8 lines of the element I can have 2250 log entries per second we currently throw something on more than 75,000 every 12 minutes so it's taking me like half a minute to process 20 minutes so I've got plenty of room for growth it really gets big kind of simple enough I'm just going to do a DRP and spread my process across to much boxes and finally there's another small relay inside the conversation which is always a good thing questions how long was that I forgot to turn it on how long was it how long was it how long was it how long was it the new code so here we go the new code is a little more involved but it's still not terribly involved easy to write, easy to read, easy to maintain that's why I like to read