 and more, if you can't pronounce my name, just call me a little. And a solutions barista and hash rocket. I have been a Linux sys admin software engineer in talk for a long time. I'm also not from around here. I'm from Central America. And the Central America, I went to Arkansas Tech to just south of here in Russell, Arkansas. And I first got there. I was born in the south of Burlaway. And I told this guy I was from Central America and he was like, what do you mean Nebraska? No. So no, not Nebraska. Actually, the geographic center of the US is Lebanon, Kansas. Anybody know that? Well, my family hails from Lebanon, my grandparents, so there you go, we've come full circle. I am from Central America, I guess. Twitter, email, blog, GitHub. That's it for myself. Now, check this out. Do you have turkey chili? I didn't get any bread, just forget it, but it goes. Excuse me, I think you forgot my bread. Bread, $2 next. $2? There's one in front of me, I've got free bread. You want bread? Yes, please. $3. No soup for you. So you may be wondering what they have to do with the space talk. Absolutely nothing. Nothing at all. So, let's move on. Today's mission, no pseudo, the final frontier to explore a near perfect development environment. To seek out cases for pseudo, to boldly go where no developer has gone before. Pseudo has its place, so let's just start, let's just get that out of the way. Pseudo has its place in the enterprise and multi-user environments. It allows you to run something like, if you run this command Pseudo, my SQL status versus SU-C, my SQL status, you'll see the difference that the top one, it says what the command was, who the user was that ran it. The bottom one says, user flyer ran a command, we don't know what it is. So, you know, it's not, I mean, pseudo's not inherently evil. So, but, I mean, I use it to start, install trustworthy tools and stuff like that. So, you may be asking why you know pseudo, right? And the answer is, it's simple. Make files can do very bad things. So, if you're pseudo making, install something that you don't trust, you could definitely mess you up, right? Part of the problem is most of us, and I think I see a sea of MacBooks everywhere here. So, most of us are either using OS 10 or Ubuntu. I may have seen one Windows computer. So, more, two, maybe? Three, yikes. All right. This talk is not gonna be very relevant to you. But no worries, you know, you can run the site, SQL in our site, we don't know whether we'll have it. The problem with OS 10 and Ubuntu is they don't, whoa. That's my single in mind. So, OS 10 and Ubuntu, don't say default, password for root, right? So, then you're using a weak password for your pseudo, which, again, pseudo can mess up a lot of stuff if you don't know who made that stuff. It also, this is the biggest thing, really. It installs, when you're pseudo or jamming installing something, it'll install something in your system, really, which you'll see later when I'm talking about it. It doesn't really make it compatible with RBM. And also, it's not ideal for home proof, so. So, here we go. So, that's why I don't think pseudo really belongs in your development environment, really. I mean, you have to use pseudo to install a lot of things in Ubuntu and stuff like that, yes, but when you're talking about your isolating your project and you're developing an environment, I don't think you really need it. So, here it comes. Deviant and Ubuntu guys have apt. Jam 2 people have portage. In my OS 10, people have nothing, really, for a while. We had my port, but that doesn't really count, because it's a piece of crap. So, we have home proof, which is great, right? It was really, you know, they call it the missing package manager, and I think it's great. I use it every day to install every tool that I can think of, you know, anywhere from Git to Mongo, how can you name it, Proxools, all that good stuff. So, for your Ruby development environment, this is what you need. For Deviant, you need curl, Python, those essential and all that stuff. For OS 10, you need Xcode, but now 4.2. Has anybody installed 4.2? Yeah, so have you tried to compile something? It didn't go well. Yeah, it's not gonna work. I mean, not well, I believe. And they both need Vim, of course. Does anybody use Vim? Do you use Vim? Yes, text my users, don't raise your hands. I keep, I keep, it's okay, I guess. E-MAC. E-MAC, yeah, oh, E-MAC, there you are. Yeah. I forgot. I forgot. You know, my SQL Postgres, all that stuff. And, you know, some gear, of course. The biggest thing is RBM. Does anybody not know what RBM is? Cool, so RBM is Ruby version manager, and it's a command line tool. It allows you to install multiple interpreters, and manage the sets of gems for Ruby version. And I'll get a little more in depth into that in a second. You can perform operations over installing interpreters and gem sets, right? Here's what it looks like when you don't have RBM, right? And you do a gem list. This is back to gem list for different projects. And the reality of it is that there's a lot of Rails projects out there, dating back from, I don't know, I started it before it was one, I guess. But, for instance, this guy has, there. Rails 1.2.6, 2.2.2, 2.3.5, 2.3.8. And anything, I think, before 2.3.5, you really didn't have bundler. So you had to mess with, you know, that whole rake, gems install, and all that other good stuff. So what RBM allows you to do, coupled with gem sets, it allows you to isolate all your gems per, you know, on a project basis. And of course, bundler does that, but what we use, I think of bundler as a way for me to populate my gem set, right? And again, I'm gonna show you how all this stuff works in a demo, because I'm that brave, a live demo. So you have a per project, RBM, I see that you can say, this project individually, when I see the end to it, I want you to use this particular version of Ruby, this patch level, and this is the gem set that you're gonna use, right? And then everything is hermetic, everything's right there, isolated. This is supposed to work, I haven't really gotten it to work, I wrote a little shell script, that basically iterates through every Ruby version that I'm interested in, right? And then runs your specs. And I'll show you why it's important to be able to, especially when you're writing a library, why it's important to have, to test it, to run your tests in different Ruby versions, right? And the other thing, my favorite, one of my favorite things is that you can just wipe out the RBM directory or RBM and float, and start over. The same thing with Homebrew, really. Actually, at Hashtag, we have iMac carrying stations, and one time I was having some issue with Postgres, it wasn't doing something or other. And what happened, what I did was, sorry, what I did was, I just copied user local from one iMac to the other one, and since they were exactly the same hardware, everything worked, it was fine. So that's the cool thing, that the flexibility that Homebrew and RBM gives you, right? So, here we go. So hopefully this will be able to see, that's my son, he's given him his whole, his name's Rowan. All right, let me just be nearer. Or not, can you guys see that, all right? All right, cool. So, let me show you, so Hitch is a gem that basically allows you, let me show you what it does first. So if I want, when we're pair programming, right, and I wanna say, I'm going to Hitch the remote, and say I'm gonna pair with Uncle Bob, right? And then it's gonna ask me who Uncle Bob is, yes. And then it creates this, you give it a group, like minus a hash rocket, so there plus the remote and Uncle Bob. And what you can do then is, you take that email address and you go to gravator, and then you take a picture with Uncle Bob, you're pairing with him, you know? And then you add that picture, so whenever you push this to GitHub, your little picture will show up there, you know, there that worked on this stuff. So that's why Hitch does, right? Let me deal, we use it a lot because we pair program all the time. So, I just had a little sample here that I wanna say, hey, I wanna write a method that gives me a number of pairs, right? And here's a method, very simple, you know, the subject, it should be, it should equal to, right, number of pairs. Implementation is count, right? So, if I just, if I say, first let's, let me show you something. This is my RVMRC file, and basically tell it, I want this to be the default, right? I'm going to default to running Ruby one and two, with the pass level to 90, and at Hitch is how you're gonna say, this is the gem set that I want it to be in. All this other stuff is just RVMRC done, okay? So, if you see here Ruby, that should be, it's that, so if I run rake spec, that's gonna pass fine, or so I would hope. Now, I wrote this little shell script, that basically iterates through the Ruby versions that I'm interested in, 1.8.1.6, 1.8.7, 1.8.1.9.2, right? And it's going to, if it doesn't have bundler installed, it's gonna install bundler, and it's gonna bundle install, it's gonna remove some stuff when it's already installed, right, and then it's gonna run rake spec for that particular Ruby version, right? Cool, so once that's there, and then say, let's run this, it's gonna run in 1.8.1.6, and it failed. Does anybody know why it failed? It does count in 1.8.1.6 wasn't a method on a rake. It was only until 1.8.7 that it got introduced, so it's still running 1.8.1.6 because it's bundling a lot of stuff, so as I keep talking, so this is the power, right, of having, being able to have multiple versions of Ruby as you're writing your library, right, and then you can test it, so you can make sure that it works in 1.8.1.6, or I could add jRuby to this, Rubinia, whatever, right? It's what you're interested in supporting as a library, and you know, I think it's because of the internet, that this thing's taking forever, and it's just got my torrents. But no, I'm not running any torrents. I promise you, this is gonna pass eventually. So, how about the Yankees? Oh wait, the Cardinals won, right, because you guys are really proud of that. Yeah. You can clap, it's okay, go on to the cardinals. Ooh, baseball. In my country, we would play basketball. No, we don't, we play soccer. I couldn't play soccer because my shoes were too big, so I couldn't find cleats. Of course, demos always never work. So don't worry, so the point was that the first one is the one that failed, and that's the one that I'm going to show you, right? The other one's pass, if I just, if I just run rake spec, see RVM info, yeah, so now, if I just run rake spec with this one, part of the talk, since the cancer troubles you run into. It's not exactly perfect, but the idea is, you know, the possibilities are in this way, as far as what you can support and what you can do, and also how you can start over very quickly. That's the biggest thing. Now, how did I get to this? How did I set up all this stuff? I had a blog post that I wrote a while back for Snow Leopard and the Rune 2 that I've recently updated for Lion and also for Rune 2, and what I just wrote just a few days ago is a shell script that basically takes everything that a blog post does and installs it for you, and basically all you need to do is have Xcode installed and you just run the shell script and it asks you a few questions and then it installs everything for you. So one of the biggest reasons of why I wanted to be, I wanted to speak closer to the beginning of the conference is that, you know, as we go through the conference, you guys can approach me and we can talk about your Ruby development environment and stuff like that. So, yeah, that's the problem. It's fetching something from the very slow internet. So, that's basically it. Does anybody have any questions? Yes? What were you using that as something that? Right, because I'm bundling, right? So the question is, there is an RBM command that allows you to run, you just say RBM and then you comma separate the versions that you're interested in running and then you say specs or whatever else, and you know, run that. The reason why I did it this way was because, specifically, you need to, we need to bundle, because I'm using bundler to make it easy to, like I said, to populate my gem set. So that's really what it boils down to, right? I say, hey, is bundle installed? Change to this version and this gem set, is bundler installed, if not installed, and then bundle install on each one of them, right? And then after you're done with that, then rate spec right inside of that for this. So that's why I really read. I did that. So it's kinda, you know, there's probably better ways of doing it now, but this is a few weeks actually behind. So just for the Windows guys, there's a tool called pick, I think, that does the same thing for Windows, but I would just suggest you just use Linux, sorry, or I'll just end it. That's just me, though. What else was I gonna say? Any more questions? Xcode or two? I have no idea what, really. I think it has to do with the GCC version, like it wouldn't compile Mac then at all, it wouldn't compile, and a lot of the gems, it was just... That's not a good solution. Can you try simply linking this down, and use your bin and GCC? No, I didn't. Try that. Okay, you and I can talk later. You just set an environment variable to use a different version of GCC. I tried that, I tried that. I worked for me. But I wanna try what, oh, that was same. So yeah. So anyway, as the conference goes by, just feel free to just kind of approach me, we can find out your Ruby development environment. And then...