055 RR RubyMotion with Laurent Sansonetti

00:00 4742
Download MP3

02:05 - Laurent Sansonetti Introduction


DAVE: Do we have to have like a pick every week? [Laughter] JAMES: Yeah, that's kind of the rhythm. DAVE: Is there going to be a thing? JAMES: It seems like it might be a recurring thing. DAVE: Oh man. JAMES: You didn't get the memo? [Laughter] DAVE: There’s a memo? CHUCK: Yeah, it was something we were trying out for 54 Episodes. [Laughter][This podcast is sponsored by New Relic. To track and optimize your application performance, go to RubyRogues.com/newrelic.]__[This episode is sponsored by RailsThemes.com. Have a website only a mother could love? Then you need a theme. Go to Railsthemes.com and sign up for early access and when they release, you'll be able to check out and use their themes on your Rails App.] CHUCK: Hey everybody and welcome to Episode 55 of the Ruby Rogues Podcast. This week on our panel, we have Avdi Grimm. AVDI: That's “Avdi-Grimm” not “Avdi_Grimm”. CHUCK: Got it. JAMES: What about Avdi <space> Grimm? CHUCK: Or we can just camel case it AvdiGrimm. AVDI: Avdi non-breaking space character Grimm. [Laughter] JAMES: There you go. CHUCK: dash. Is that a dash or an dash or an en dash? [Laughter] AVDI: I don't know. I have to figure out which one has the most flair. CHUCK: All right. We also have David Brady. DAVE: So when I was at BYU, the username naming scheme was first name, last name and it was clipped to 8 characters. So my user name was “DavidBra”. I don't like this game. [Laughter] CHUCK: Well, we also have James Edward Gray II. JAMES: I upgraded to Lion for this episode. [Laughter] CHUCK: Really? (Inaudible) CHUCK: Does it not run on Snow Leopard? JAMES: You know what? Maybe we need to ask our other panelists that. The documentation said it did, but I had a lot of trouble. CHUCK: All right. We'll get to him in a minute. I'm Charles Matz Wood from teachmetocode.com and we also have a special guest this week and that is (and let me see if I can get this right), Laurent Sansonetti? LAURENT: That's perfect. Yeah. CHUCK: So I have to ask you real quick about your name because I've learned a few languages in my day and “Laurent” is a French name and “Sansonetti” looks like an Italian name. LAURENT: Yeah, that's right. That's right. So I was born in Belgium. Actually, I was born in the French-speaking side of Belgium because Belgium is a very complicated country. We speak three languages there. My mom gave me a French name, but my parents are Italian. So I was born Italian and I became Belgian later. CHUCK: Partly Italiano? LAURENT: Actually, no. I don't speak Italiano. I just speak French and some English. CHUCK: Okay. Cool. LAURENT: Yeah, yeah. ‘Laurent’ is the French version of ‘Lorenzo’ in Italian. CHUCK: Nice. LAURENT: I think the English version is Lawrence. CHUCK: Mm-hmm. LAURENT: Lawrence. That's probably the closest thing. CHUCK: Yeah. DAVE: Actually, it looks like Laurent— JAMES: Yeah. Spelling was— CHUCK: Yeah, the -ent is. They kind of— DAVE: Right away. Sorry. It would be funny later in the episode, people. JAMES: Take more Vicodin. [Laughter] CHUCK: So anyway, Laurent, you want to tell us a little bit about yourself and about RubyMotion? LAURENT: Well sure. Well my name is Laurent Sansonetti. I recently released a new project called “RubyMotion”. RubyMotion is a commercial version of “MacRuby” for iOS. So I'm sure that people who are listening to this podcast probably know what MacRuby is. And if you don't know, MacRuby is an implementation of Ruby but based on core OSX technologies like the Objective-C runtime, the Foundation framework, the LLVM compiler and all these technologies are shipped with IS stand and been used to re-create the Ruby language. So that's MacRuby and the RubyMotion is a version of MacRuby for iOS. JAMES: Okay. The way he just described that didn't do it justice though. So Laurent disappears from Apple and is apparently missing in action for some massive period of time and suddenly, he reemerges having reinvented Ruby for the iOS. I imagine he was in the Bat Cave the entire time. DAVE: Present a crime which he did not commit. [Laughter] LAURENT: I forgot to mention that, I was an Apple employee before. I worked for Apple for seven years and MacRuby was actually one of my projects there. I left about six months ago and during these six months, I did RubyMotion. So this way it explains a little bit more about RubyMotion, I guess. CHUCK: So what are the differences then between MacRuby and RubyMotion other than one's kind of for the Mac and one’s kind of for the iOS? LAURENT: The differences are—First, MacRuby doesn't run iOS for various reasons. The technical differences are that in RubyMotion, there is a new ‘Static Compiler’ that deals the Ruby source code into machine code directly so everything is static in build. It means that there is no just-in-time compilation at runtime. MacRuby uses just-in-time compilation. So that was necessary because on iOS, especially on devices, it is not allowed to create a memory page and mark executable which is one of the techniques to do just-in-time compilation. So we had to do a Static Compiler. The other technical differences are that RubyMotion has a new memory model. We wanted something more efficient for iOS. And also, MacRuby uses the Objective-c garbage compiler—sorry, garbage collector—which is not available in iOS, so we had to do something different. And finally in RubyMotion, the runtime has been optimized a little bit to run much better on iOS because some iOS devices, especially the iPhone 3, have technical limitations—sorry performance limitations—so we had to work a little bit in the runtime to make sure everything runs a bit smoother than it used to be. So these are the three main technical differences between RubyMotion and MacRuby. JAMES: So you in that six month period Laurent, you were building a static compiler, redoing garbage collection and adjusting the memory model to make all that work on the iOS side? LAURENT: Yeah, that's true. That's true. A big part is the Static Compiler of course. Everything else is a bit simpler. CHUCK: So are there any new features in Ruby or MacRuby that you had to take out in order to make the Static Compiler work? DAVE: Anything besides— LAURENT: Sorry? DAVE: Anything besides eval? CHUCK: Right. DAVE: Or maybe starting with eval. LAURENT: Yes. DAVE: That was the first thing I tried. LAURENT: Yeah, of course. So I had to remove some features of the Ruby language. Some of the features we might be having back. For the launch, I wanted to make sure that everything was compliant with App Store guidelines. For instance, there is no eval in RubyMotion because I wasn't sure that interpreting code on the device was something Apple really wants people to do. So it turns out that it’s allowed, but the guidelines are not very clear I think. I think they allow people to use supported interpreters such as WebKit to interpret code, but it's not really clear. If for instance, you could interpret Ruby code on the device. I might implement an eval method on RubyMotion, but first, I would like to make sure it compliant because I really don't want people to get their apps blocked or removed from the App Store because of that. CHUCK: Right. JAMES: Right. LAURENT: So that's the big deal. The second method that RubyMotion has an implement and have many people talk about a lot is “require”. Because RubyMotion projects are statically compiled, it means that you cannot require files separate time. All the files you want in your application, they have to be provided ahead of time, so that the compiler has to compile all the files that you’re going to use. So there is no way to require files at separate times. So the require method raises an exception in RubyMotion. And after that, there are the “defined_method”. And defined_method is not implemented in RubyMotion right now, but it's a temporary limitation. So, I might implement it back in the future. Right now, it annoys people a little bit because they cannot do meta-programming as they would do in Ruby—I mean—using the regular Ruby. So that's something I would probably fix very soon. Besides that, I think that—oh yes and then there are in RubyMotion. For instance, I don't allow you to redefine the plus method on Fixnum’s for instance. JAMES: My favorite! LAURENT: These kind of things—Also, in RubyMotion, there is no binding method on the Proc object—on the Proc class sorry. So this is something that we have been debating a lot with because there are people working on Ruby implementations because –Well, I don't want to open up on the wrong box here, but it's a feature of Ruby that sadly slows down the way you could compile a function that have blocks inside. So, there's no way you could actually optimize the way the other variables are created because the binding method could be code on the block and you could change the value of the variables. It's actually a bit complicated, but if you Google about the method, you should see people complaining about it especially Charles Nutter, the JRuby guy. JAMES: Yes. So I actually wanted to talk about that. Based on what you have just said, require’s not in there for fairly obvious reasons, that you have to run statically and that's not going to change, but you made sound it like eval define method. There are not limitations that can't be overcome. It may be possible for you to add those back? LAURENT: Yeah. JAMES: And defined—Sorry, what was the last one you mentioned? CHUCK: Binding on Proc. JAMES: That binding is a performance issue, right? LAURENT: This one, yes. I really want people to have a very fast code. Because on iOS especially IS devices, you really need applications to be fast. The binding method on Proc, I removed it in RubyMotion just to see if people would complain and so far, nobody has complained. JAMES: That's interesting because I believe JRuby also makes some trade-offs to be more performant right? By default, don't they disable some of objects base and stuff like that, but you can choose to have it put back in? LAURENT: I think that's the only thing they disabled. Otherwise, they fully comply with Ruby spec. In MacRuby, we do the same. We support the binding method, the Proc binding method in MacRuby, but it's really, really a pain in the ass to support that. If you want at the same time good performance. JAMES: So Laurent—you mention Charles has had some complaints and I thought I would give you a chance to answer those. One of the discussions around RubyMotion has been that you did have to change the language to make it work on iOS and you had to read through a few things and obviously, there's no standard library in there because no requires and things like that, but one of the questions is “How much can you change Ruby and still call it Ruby?” Why is it RubyMotion still? Is it still enough of the language to be Ruby? LAURENT: That's a very good question and I think that it’s still Ruby because you still have all the keywords on the language and the entire object model. You can do everything you used to do in Ruby. It's more a subset of Ruby perhaps. CHUCK: So it's sub-Ruby? LAURENT: Perhaps sub-Ruby. The funny thing is that Matz is working on the same thing more or less. He's working on Ruby which is a dialect of Ruby like a subset of Ruby for optimized mobile devices. So, it's actually a good idea. I think that if you want to be pedantic, you should be able to call something Ruby if it follows the Ruby standard the folks in Japan are working on. I know that there are a few pages ready right now, so I guess that you could call something Ruby if it follows these standards perhaps. DAVE: Have you felt pressure to get RubyMotion out quickly and stay ahead as Matz is working on the mobile Ruby? LAURENT: Actually no because we were planning to release RubyMotion at this time. I also knew about Matz’s work. That wasn't a surprise and none of that is related. DAVE: Oh. LAURENT: But if we can go back to the topic— DAVE: Sorry. LAURENT: In RubyMotion, what I will probably do very soon is do a page in the website that shows the Ruby stuff that has been enabled in RubyMotion so that people can actually have a look and see if there is something critical missing. And some of the features, like eval for instance, could be implemented, but I don't want to take the risk to implement it I said. So, I would try to explain myself about it on the website and hopefully open different discussions about this. CHUCK: Right. JAMES: That's a good point, Laurent. One of the design goals of RubyMotion was that you could build apps with it and sell them in App Store, right? That it is 100% compliant with Apple’s guidelines. LAURENT: Yeah, exactly. That's the main goal. So the goal is not to run Ruby on Rails on your iPhone of course. CHUCK: Why not? [Laughter] LAURENT: I'm not sure if it would be a good idea because Rail’s a very, very big code base Yes, the goal is to write iOS apps in Ruby. So, it may not be 100% Ruby, but I think it's still Ruby for most people, at least for me. CHUCK: Yeah. DAVE: So you heard it here first folks. It does not run Ruby on Rails on your iPhone. [Laughter] CHUCK: You know, when somebody— when he said that, it just brought to mind rack mountable iPads. [Laughter] DAVE: And you just stand near to me and rack it after. [Laughter] DAVE: Does anybody have an iPad? I need more RAM. [Laughter] CHUCK: But yeah—So one thing that really appeals to me, I mean, besides the fact that it's Ruby is, I've been playing a little bit with iOS development and I’m probably going to play with it more and actually learn Objective-C, but one thing—or learn it better anyway—that really appealed to me was just that it seems there's a lot of memory management that you have to keep track of and it seems like RubyMotion does a lot of that for you. LAURENT: Yeah. Yeah, that's true. So In RubyMotion, it is a bit like the latest Objective-C version that has automatic release count (ARC). The ARC features are for Objective-C. RubyMotion does it but at runtime, but the difference in RubyMotion is that you don’t need to create auto release pools around your objects and you don't need to deal with—you don't need to manually release CF types. So for people who are not familiar with this, CF types are C-based objects that are present in certain parts of iOS. Certain iOS frameworks are exclusively C-based and the original fake C-objects and in RubyMotion, you don't need to release them. They are taking care for you also. And one thing that isn’t on the end but will be done very soon is that in RubyMotion, you won't need to care about cycles. So cyclic references—when you have two objects—when two objects are in reference with each other, at the same time, both objects are going to link in traditional written count systems like ARC in Objective-C. In RubyMotion, the RubyMotion runtime will be able to detect for you and automatically release both subjects. CHUCK: That's really cool. LAURENT: Yeah. CHUCK: So one other thing that when I was poking around with this, I found your GitHub repository with all of the examples in there. (And I'll put a link to that in the show notes. In fact, let me type that in so I won't forget). Anyway, one thing that I noticed was that I was looking at the AppDelegate and the Veer’s app and I realized pretty fast that I actually need to—there is some level of understanding that you have both Objective-C and of the frameworks that are used to build iOS apps. So it's not just that you could just get in there and hack out some Ruby, but you actually have to understand the API's that you are dealing with. You also have to understand just a few things about Objective-C. For example, you know they call ‘alloc’ and ‘init’ in order to allocate space for the object and then set it up and so, there are a few little things like that that are still kind of Objective-C like. Are there any other things that you guys noticed while you were playing with it like that? LAURENT: You mean—Yes. So it is actually true that you need to have some notion of Objective-C and some notion of iOS to use RubyMotion right now. You don't need to know Objective-C to use RubyMotion. You just need to be able to read Objective-C interfaces and know how to use standard Ruby. It's actually something important to say because in order to learn Objective-C, you need to learn C first because objective C is a small runtime on top of C. For a lot of people, it’s a really big issue to learn C, but you need to know bits of Objective-C to use RubyMotion and you also need to learn about iOS, so all the frameworks. For instance, you were talking about the AppDelegate which is exactly something you need to learn so you need to learn about the UIKit, how to create UIViews, these kind of things. So right now, it's true that if you look at the samples at the GitHub repository, you will see that it more or less looks like Objective-C code. I mean, we are using the same API as Objective-C. And of course, it's Ruby so it's a little bit different. You don't have other files. You don't have all the bullet point code to create classes and this kind of thing, so it looks a bit cleaner, but it’s still direct calls to the same API’s as you would do in Objective-C. CHUCK: Yeah. One other thing that I noticed that I thought was kind of interesting was that you implemented—are they called ‘named parameters’? LAURENT: Yes. CHUCK: So you basically have that running in there which Ruby doesn't have. LAURENT: Yeah, that's true. That's actually a MacRuby thing. This has been around since a few years. We actually extended the language to support named parameters when you define methods. So, it's something we talk about with Matz a long time ago but you know— but to go back to this topic, right now, you need to know about iOS to use RubyMotion. But the goal of RubyMotion is that people will write high level libraries around iOS and ultimately, you won’t need to learn about iOS anymore to use RubyMotion. There will be DSL's around the UIKit core data and that will let you write applications in pure Ruby. As in pure Ruby, I mean, you won't see any codes to iOS anymore. That's the ultimate goal and right now, the project is just three weeks old—two or three weeks, but we are already seeing RubyMotion users working on these DSL’s. For instance, there are two nice DSL servers around core data so far. There are both really promising. So I think that eventually, there will be enough libraries around so that you won't need to learn about iOS. You would just go and get up, pick the libraries you need and bootstrap your application. JAMES: So you're saying you think there will almost Rails-like frameworks for putting interfaces or like you said, interfacing with Core Data and that really, you’ll just read through how that particular framework does whatever it does and then you'll use that. LAURENT: Yeah, definitely. CHUCK: Now if you don't have require— Oh, was someone else talking? DAVE: I was just saying you could take the Rails out of the Ruby, but the Rails will come find it again. [Laughter] CHUCK: True. So without require, how would you include those libraries or frameworks? LAURENT: There will be a way to create RubyGems for the RubyMotion projects so I'm still working on this right now and there will be some documentation soon. But you just package your library as a RubyGem inside your project Rake file, you would just require the Gem you would be done. You would be all set. The code would be added to your project automatically. CHUCK: So it's kind of a global— JAMES: So that's coming— coming soon you said? LAURENT: Actually, we can do this right now, but I want to write some solo specification documentations so that people will follow the same way to write these kinds of Gems. So I am going to work on this documentation. But, right now if you search on GitHub, you will see that people are actually working around this limitation by telling people to keep clone their code inside a specific directory in their project and then hack the Rake file to use the code at that specific project. So there's already a way right now to do that but I really want a general so that everyone can follow the same way and I think RubyGems is the perfect way to delete our extensions for that. JAMES: So you hit on a couple of things that I wanted to talk about. Probably the other biggest complaint I've seen, you talked about how you do have to have familiarity with UIK. You've used— how to use that to build interfaces and a lot of people have asked, "Why can't we use Interface Builder?" LAURENT: Oh yeah. So you can use Interface Builder. It's not really great, because it's not integrated with --- so you won't see your Ruby code in --- in the same way you would say in TextMate or VI, but you can use Interface Builder to create zip files and then you simply copy the zip files inside your project and then the RubyMotion build system should be able to compile these zip files into .net files and then ship them inside your app. So that should work, but honestly, I don't think this is the way we should go. I think that Ruby is a very elegant language. It's so easy to create nice DSL's in Ruby to do a very specific thing and I don't see why we shouldn't have a DSL to build user interfaces in Ruby. It's much better to lay out your UI elements in Ruby especially because you can add the DSL. It's very visual. Just by reading the code, you already know how the elements will be actually packed in your application. It's actually funny because in our OSX, in Lion, in the Cocoa framework, there is a way to actually do layouts using an ASCII like language. So this is an Objective-C right? This is an Apple technology. So there is a way to use an ASCII like language to actually pack views so that you don't have to use Interface Builder, but sadly because you can't do DSL's in Objective-C, as you would do in Ruby, you need to pass a string. And then inside the string, there is a small language and it looks a bit weird and you need to provide the array of views after so that the language processor knows exactly which views it can pack. So it's not very natural. But in Ruby, we can do much, much better and so this is my point. I would rather prefer to use a DSL and to see Ruby except that—I mean rather than using Interface Builder. JAMES: So the other thing you've mentioned multiple times is, RubyMotion is Rack based and (Rack based, Geez.) Rake based so it uses Rake to compile your application and stuff like that which I found really cool and the other thing that's tied in with that, that I have to say is the ‘killer feature’ for me was the console that it gives you while your app is running. Do you want to talk about that? DAVE: Yes. CHUCK: Oh, that was so sick. [Laughter] LAURENT: So yeah, actually it's Rich Kilmer's idea to do the console. So he convinced me to do something like that. So if you want to give credit, all the credit should go to Rich Kilmer. DAVE: Rich Kilmer, we love you! JAMES: Yeah, that was neat. So just to clarify it for the listeners, when you fire up a RubyMotion app , it burns up the iPhone simulator and you're playing with it, but in the console, you can sit there and grab objects and make changes on them and that's reflected in the simulator. So, like, “I don't want this object here. Let me change it to X, Y coordinates” and boom, it moves! CHUCK: Yeah, but the thing that I thought was coolest about that was that if you hold down command and then, you click on an element in the simulator, then it changes console, so that self is now that object and then, you can modify that object directly. And so then, you can reposition it just by doing self.whatever the API call is and just move it. DAVE: And I love that it's actually in bracket right. You're holding down—is it command or is it option? Well anyway, you’re holding down the button and you're moving the mouse cursor over the UI and things are lighting up. It's like Google’s in Chrome when you're doing inspect element. The different things are lighting up and over the console, you're seeing which objects you’re currently over and then when you pick one, that become self and you can manipulate it. That's awesome. LAURENT: Yeah. For this entry, it's also Rich Kilmer's idea to do that. So he was sitting in a Starbucks and I was doing a little bit of web programming. I was doing the website of RubyMotion. I was using --- and It’s pretty similar to what you said about Chrome and we were just talking about “It would be great if we could have something like ---, but for iOS, where you could just use your mouse to grab an element” because it's actually very boring to use view hierarchy and after that, I tried to implement the same thing and it worked. So, but again, that's an order of credits we got through Rich. DAVE: Rich, we love you more. JAMES: He's been a marginal community member up to this point. It's good that he's finally pulling his weight. [Laughter] JAMES: I love the console. I think that's really neat especially just the visibility it gives you into the program and being able to play with things while it's running and you're like, “That's not quite what I want. What if I did this?” Then you can see and then you know that's right and you can take back code and put it back. You know, it's great. CHUCK: Yup. LAURENT: I think that— JAMES: Go ahead. LAURENT: I was just thinking that one of the features that we really want to implement is make stand the rappel so that the interactive console to reload the codes as you save files. CHUCK: Oh, that would be cool. JAMES: Yeah. LAURENT: Right now, when you change the code, you need to exit the rappel and start rank again and if your rappel was able to compile the files and load to inject the new code into --- time. JAMES: That would be amazing. So tell us what are your plans for the future? I mean, you've talked a little bit about how you hope that frameworks and DSL's will spring up around it and it looks like that's definitely starting to happen and then some changes you would like to change to the internals. It looks like you're kind of at the beginning of a long road here and where you're hoping to go with it? LAURENT: Yeah. So actually, I didn't expect RubyMotion to be as popular quickly. I'm very impressed by what people are doing with it. So my goal right now is to make sure that it works for everyone because there are a lot of people using RubyMotion right now and there are a lot of bugs that I didn't know about. So, I'm just trying to fix all these bugs and making sure it works for everyone at least and then, I would like to improve the interactive console. I would like to work on Rake style generators for the Rake interface. Because right now, when you want to create a new controller, a new view, you need to create a new empty file and paste some borrowed code. I would like to have something that writes when you can add drafts, motion, generates control error, something like that, you know? I think that would be a good addition to the project, but my biggest concern right now is all the things the community is doing. I need to make sure that it's going in the adequate direction and that people have all the help they need to do the things they want. I think that the DSL’s around RubyMotion will be the core feature of RubyMotion and also the reason why people will pick Ruby instead of another language to do. So I really want to focus on this area and try to have people to design the best DSL's around iOS. CHUCK: Right. One other thing that I’ve heard a few people bring up is the fact that you actually have to pay for RubyMotion instead of just releasing it open source. Is that mainly so that you can spend the time that it takes to put something like this together, or were there other reasons for you to close the source and sell it? LAURENT: So my goal was to try to make a living out of it and right now, I can say it's doing very well, but I would like to hire people to work on RubyMotion with me, especially MacRuby contributors. So all of this takes money and I wasn’t sure that doing open source would be a good idea at least at the beginning. CHUCK: Right. LAURENT: And I always wanted to do a startup since many, many years ago. So I just say, "Why not?" People are already— perhaps not everything must be open source. I will try to—I would like to open source some parts of RubyMotion in the future, especially the pure Ruby files of RubyMotion because I really want people to be able to hide them and extend them. But if I can keep parts of RubyMotion close source so that it creates a revenue stream, then I can try to make a living out of it and I can support the project at the same time and perhaps, this can work. Because open source only works when the contributors are actually paid by a company. It’s really tough to have a project, an open source project where people just hack on their spare time especially a single project. That’s just my experience with open source especially at Apple. So, that’s really my motivation to have RubyMotion as a commercial product. At the same time, we tried to—I talked a little bit about the pricing with people before doing it and we tried to have a pricing that is not expensive and that is close to what actually people are charging if they do iOS Consultancy in what they are charging per hour so that we can have as many iOS developers as possible on board. So that was our motivation. CHUCK: Yeah, that makes sense. So one other question that comes to mind is this kind of made a splash in the Ruby community. Did it make much of a splash in the iOS development community? LAURENT: Yes. Yes. There are lots of iOS developers who are talking about it apparently. Of course, there are people who don’t like it because it doesn’t come from Apple, so it stinks. [Laughter] LAURENT: Although people are saying “That’s a proprietary runtime created by a young startup” so I don’t want to base my multi-billion dollar company on it. [Laughter] JAMES: Yet. Yeah but they’re not really multi-billion dollars yet. LAURENT: That’s actually true. If I was a multi-billion dollar company, I probably wouldn’t use RubyMotion. I don’t know. Of course, there are always ways to address these people. So in iOS, I think that, I mean in the Objective-C world, RubyMotion is a good thing, because it will bring more people to the community. There are many smart programmers who will pick iOS very quickly because of RubyMotion. They wouldn’t have even thought of doing iOS development before because they are not familiar with Objective-C. And I think this would be a good thing overall. No, of course, in the Ruby community, mostly everyone seems to like RubyMotion. In the Objective-C community, probably not because they already know the language, they probably don’t need to use RubyMotion. CHUCK: Yeah. I have a few friends that have transitioned from the Ruby community to the iOS community. I’m pretty sure that they’re going to be pretty happy about this so— JAMES: So we’re saying that we think that RubyMotion is an easier ramp into iOS development, a gateway drug so to speak, for iOS development? LAURENT: Yeah, probably, yeah. Well, yeah, that’s true. JAMES: That’s really great. I personally, you know, when we were talking about you charging for that. I was personally very glad to see that you charge for it. I think it was Avdi actually that Tweeted sometime last week or something, “Please charge for your products so that I know that you care about it. You’ll support it. It’ll stick around.” You know kind of thing and I think that’s great. LAURENT: Yeah. CHUCK: Yup. LAURENT: So that’s yeah, that’s the problem. When you don’t charge for something, you can’t support it. I mean unless of course you’re hired by a big company then they pay you salary. I wanted to have freedom of what I do and I didn’t want to work for another big company. I guess the only way is to charge. JAMES: Yeah. It’s— DAVE: So… JAMES: Go ahead. DAVE: So Laurent, I have a question. You’re kind of dancing around the Apple App Store submission guidelines and you’re trying to stay clear of that. Has this been Asset tested yet? Are there any apps in the App Store right now that have been written in RubyMotion? JAMES: Yes there are. DAVE: Whoo! LAURENT: There is one that I work on along with Eloy Durán which is a MacRuby contributor and also the author of CocoaPods. And he’s also one of my heroes so if he’s listening to this podcast, he will know that. LAURENT: But yeah, there is one RubyMotion app on the App Store at least one. As far as I know, there are people submitting applications last week. DAVE: Ok. I’ve got my iPad open right now. You need to tell us what the app is. [Laughter] LAURENT: Ok. So the application is called Mustachio. Mustachio so it’s spelled m-u-s-t-a-c-h-i-o. Actually if you go on blog.rubymotion.com, I think the latest blog article mentions the application so you can just click there. It’s written in RubyMotion. JAMES: So Lauren, that’s a great point. You just mentioned the blog and we’ve mentioned multiple times in this podcast the website. RubyMotion actually launched with a GREAT website and it’s already useful. There’s a development center which is where I went to find documentation, when I was playing around it. That was obviously a goal for you when you launched it which I think is great because I always do it the other way which is really dumb. I just throw the code out there and I’m like “Yay! I’m done!” and nobody knows how to use it or anything like that whereas the website is a great resource. LAURENT: Yeah, we tried of course to keep the development center dated and I think of the biggest asset we had when we launched was the Pragmatic Studio. If you go on the development center under the RubyMotion website, you will see that there is a pointer to a 15 minute video made by the Pragmatic Studio. Mike Clark did the video a week before the launch. That video, I think, probably helped a lot of people to understand what RubyMotion is and how to get started. That was key, I think. JAMES: Yeah, I agree. That’s really great. LAURENT: I’m glad that you enjoyed the website also. We worked on the website for a few weeks before the launch, I think. CHUCK: So is that website written in Rails or something else? LAURENT: No. Actually, the website is ---. CHUCK: Oh, cool. LAURENT: It’s written so I website myself and I taught myself web programming because I didn’t know about CSS and SASS and COMPASS and Haml so I learned all these technologies— JAMES: It’s awesome. LAURENT: Just to do the website. That’s funny because I wanted to understand how to maintain it after. CHUCK: Nice. LAURENT: I worked with a web designer of course to do the design, but I tried to code the website myself and I’m really glad I’m not a web developer. [Laughter] CHUCK: So one other thing I want to jump in on real quick, because we’ve talked about RubyMotion. We’ve talked about where to get it and some of the resources that are out there, but I just want to make sure that people know that are just some terrific resources out there for iOS development. If you go to developer.apple.com, they have the iOS developer library that is just awesome for explaining how well this stuff works. And you can actually— one of the things that I was doing when I was playing with one of the sample apps is that I went through—I started Googling some of the class names that are in here such as UIWindow or UIScreen just to get an idea of what those classes do in Objective-C and I just have to point out that, if you have trepidation whatsoever about programming in iOS and you want to understand what is being used there then just go the Apple documentation. It is awesome. LAURENT: Yeah. I don’t know much about the iOS books— I mean about the books that are available right now on iOS, but I was told the book made by the Pragmatic programmers. I don’t know the title by heart, but I was told that the book was very good. Jim Weirich, I’m not sure if I pronounced his name correctly. CHUCK: Jim Weirich, yeah. LAURENT: Weirich, ok. He did his first RubyMotion app in the morning and he didn’t know about iOS at all. He picked that book and he just made his app and then he sent me a video of the application and that was awesome. So I guess if you guys are interested in iOS, you probably want to check that book perhaps. JAMES: I think the book you’re talking about from the Prags is iOS SDK Development, I believe is the book. LAURENT: Yeah. JAMES: That’s interesting though. It would be great. I’m hoping that we would see maybe not right now at the beginning but some of the libraries or frameworks start to come up about doing interfaces and stuff. I’m hoping we’ll see some RubyMotion focus books, where you can go through and learn this kind of stuff without having to go through the Objective-C layer. Although Chuck’s right, documentation and stuff for that is pretty great. So, it’s not a big barrier at this point. CHUCK: All right. Is there anything else that we need to go over before we get into the picks? DAVE: I’m too busy playing with Mustachio. [Laughter] CHUCK: I know I would’ve downloaded it. Looks like fun. JAMES: I think it’s awesome. I think everybody should go play with this. It’s really the start of something cool. It may really push Ruby into another avenue inside of from just web development. CHUCK: Oh, I thought you were talking about Mustachio. [Laughter] JAMES: Play with that too. CHUCK: Get a picture of James. Decorate his face. LAURENT: If you guys go on the iTunes page from Mustachio, the screenshot is actually a picture of my son. CHUCK: Oh really? LAURENT: He’s a Mustachian so that’s very funny. JAMES: That’s awesome. LAURENT: I sent a link to my family members about the app and they were like “This is your son, in the app?” [Laughter] CHUCK: Nice. LAURENT: So I was told that the application crashes sometimes. Actually, just one guy on Twitter complained about it. And then he made a thing in Objective-C that this wouldn’t happen blah, blah, blah. CHUCK: Well yeah. There’s no way to know that. LAURENT: The guy was probably trolling that apparently it crashed for him. It doesn’t crash for me and it doesn’t crash for everyone else as far as I know. DAVE: I’ve never had an Objective-C app crash EVER! LAURENT: Yeah. [Laughter] CHUCK: I have an old iPod 2G and have the stuff that’s written for iOS 5. It opens up, it gives you the little splash screen and then it craps out so— LAURENT: And I guess if Apple approved it, it doesn’t crash for them either. CHUCK: Yeah. LAURENT: Yeah. I guess they actually tried the application before accepting I guess. CHUCK: My understand is that they go through semi—I think it depends on when you submit and who’s looking it over, but it’s a reasonably rigorous process to make sure that it’s stable and it doesn’t cause any other problems on the phone. Yeah, it makes sense. I mean, if you can get them into the App Store then it stands up to scrutiny with Apple. LAURENT: Yeah. Well, there was no reason Apple would reject RubyMotion apps. Although there are similar projects around like Xamarin MonoTouch which is awesome to chain for C# development and hundreds of Apple applications on the App Store even thousands, I don’t know and Apple approved all of them so— DAVE: But they don’t crash either, do they? [Laughter] LAURENT: Well, actually, it’s funny. So the crash—so if I read the Tweet of the guy correctly, the crash is about the nt? method that was code in the new object. So, an exception was raised and of course, the application crashed. Of course, in Objective-C, when you try to send a message to a nil object, it doesn’t raise an exception, so it does nothing so that’s the object you see. The argument of the guy was that if it was written in Objective-C, it wouldn’t have crashed which is true. DAVE: Right. So if you had done this in a different language with different behavior, the behavior would have been different? LAURENT: Yeah. JAMES: Right. [Laughter] DAVE: I think we’re all on the same page here, Twitter wise. JAMES: You see, I would have used this as an opportunity to say “See kids, that’s why nil’s bad.” DAVE: Yes. [Laughter] LAURENT: Yeah because in Objective-C, it’s actually very bad to use this behavior in your control flow. You see what I mean? JAMES: Yeah, absolutely. LAURENT: Sending a message to nil is something you really don’t want to expect. CHUCK: Yeah. LAURENT: And yet people are using this. Anyways, if Mustachio crashes for you and you see this exception in your device log, we probably push a new update that fixes this bug soon. CHUCK: All right, cool. DAVE: So how did you fix it? LAURENT: I didn’t actually fix the bug yet. I have yet to look at the code, but the cool thing is that the code is less than 100 lines of code, so it’s only 100 lines so it will be very easy to spot the bug, I think. CHUCK: Nice. LAURENT: It wouldn’t as be as easy if the application was written in Objective-C. DAVE: But I mean you are not just going to change the behavior so that nil.nt doesn’t crash? LAURENT: I will try to understand why the object was nil. DAVE: Was nil in the first place, yeah. CHUCK: Right. LAURENT: Of course and then I will try to—yeah. It’s definitely a bug. It shouldn’t be nil, I guess. DAVE: Yeah. LAURENT: We shall see. At the same time, the application was written in half a day by Eloy Durán which I thank twice then I submitted it on a Sunday very quickly. I’m actually very impressed that Apple approved it. CHUCK: Yeah. LAURENT: That they would probably say, “You need this, you need that.” Also, I sent the application result icon which is a mistake and I realized it after the submission and I said, “Okay, Apple will just reject it because I don’t include the high resolution icon” but they didn’t actually. The app was approved. It looks like you don’t need to send a written item in your applications. [Laughter] LAURENT: I was told by a few RubyMotion users that they actually submitted applications last week. So next week I guess because it takes Ruby a week to get an application approved, we should have more RubyMotion apps in the store. JAMES: That’s really awesome. DAVE: That’s cool. LAURENT: I’ve tried—I will probably make the page on the website attached this time and will split to iTunes so that people can actually try them and hopefully, they won’t crash because of sending messages on nil I hope. [Laughter] JAMES: All right. Thanks so much for talking about it with us. It’s really awesome. DAVE: Yeah. CHUCK: Yeah. I’m really excited to playing with this so— JAMES: Yeah, we look forward into what it grows into. CHUCK: Yeah, absolutely. LAURENT: Well, thank you very much for inviting me. CHUCK: Yeah, no problem. CHUCK: All right. Let’s get into the picks. James, you want to start us off? JAMES: Sure. Okay. So this pick comes out of a Twitter discussion that I had yesterday. This here is Code Year. Did you guys know that? Everybody’s supposed to learn to code this year? You didn’t know that? CHUCK: Code Year? DAVE: You mean like the Chinese Zodiac? This is the year of the code? JAMES: It’s the year of the code. This has been actually a controversial pick which surprised me. There have been people writing posts like this one which I’ll link to in the show notes about why this is a bad thing. Basically, it turns out because New York’s mayor, Mike Bloomberg, said that he’s joining Code Years. Come learn to code a little bit this year. People are like “No! Don’t do that. You should be doing your job not learning to code.” [Laughter] JAMES: And I’m like “Wait, what?” So apparently, Mike Bloomberg just to be totally clear did not say he was going to stop being the mayor. [Laughter] JAMES: And he didn’t say he was applying for a job at Apple or anything like that. He just said that he’s going to spend a little time learning to program, and I don’t think that’s a bad thing at all. DAVE: He just wants something to fall back to in case his day job falls through. [Laughter] JAMES: I guess but I don’t think he’s trying to become a developer. I think he’s trying to learn something new. You know some of us might choose to learn a language or learn to play the sax or whatever and that probably doesn’t have anything to do with our day job. But, that’s ok because learning new things right teaches us new ways to think about things and that’s really good. Stuff like that. So anyways, I’m really for this movement. Some of the other complaints have been “Why does it have to be programming?” It absolutely doesn’t— [Laughter] JAMES: --have to be programming. You could learn math. Everybody could use to improve their math a little bit or something. A slogan of “It’s learn something year” isn’t near as cool as the slogan of “It’s Code Year!” I think they just picked a specific thing and next year, we’ll all learn French. AVDI: Well, if you had named it “It’s learn something year” those same people would stay up and complain and say, “Well, why does it have to be learn something year? Why can’t it be forget something year?” I don’t know. JAMES: That’s right. CHUCK: I just want to know when they have the Code Year blimp. JAMES: The Code Year blimp. AVDI: The Code Year blimp. JAMES: So anyways, there are lots of activities going along around this, it being code year and you should definitely keep an eye out. There’s people working together to learn. There’s programming sites. They’re offering opening up some of their content for times so that people could learn. And I realize I’m totally preaching to the choir here because probably everybody who listens to this knows some rudimentary programming. CHUCK: And can I say— JAMES: And actually, I’m putting the task on you guys. Go out there and tell people about this because this is cool. I mean, seriously, when you are sitting around with your friends this weekend, just say, “Hey, did you guys know its code year? You want me to show how to write some code? You want to fire up application and learn to make your own website like Laurent did? Show them enough JavaScript that they can draw on a canvas or something like that.” I think it’s an awesome movement and there’s no reason that we shouldn’t be supporting this effort. Like I said, next year, we’ll all learn French or whatever, but it's a learning— DAVE: Or plumbing. CHUCK: Plumbing. There we go. JAMES: Yeah, plumbing. That's right. JAMES: Next year, we'll learn plumbing because— CHUCK: Is there going to be crack year? JAMES: Crack year. If you're Avdi, you can teach people Lisp because then they can use (–) instead of (_). CHUCK: Exactly. DAVE: Oh yeah. AVDI: Technically, they could also learn fourth and still keep their dashes. JAMES: I see, I'm sorry. Fourth is another option. One more pick. I’ve been watching Mad Men on Netflix and it's a pretty great show, especially if you liked my earlier pick, Downton Abbey. Mad Men is probably in your interests because to me, it's kind Downton in a different time period, only darker. I don't think there’s any good guy on Mad Men but strangely, it's very compelling and it's fun to watch. They do a good job of the period. This one is 1960s and they do a great job of being true to the period. Everybody talks about the sexism and the racism and stuff and the show definitely has plenty of that. The part that I enjoy as a parent, is all the insane things they do with their children. The child comes in with the dry cleaning bag on her head and Mom’s like "If you took those clothes out and left the on the floor, you're really going to be in trouble." [Laughter] JAMES: No comment about the bag on the kid's head or they're driving the car and the kids are loose climbing over the seats moving around everywhere. It’s awesome. Pretty cool period piece, really enjoyable, wins a lot of awards. The acting is stellar. So those are my recommendations. AVDI: I think it's interesting that you picked Mad Men and I have to second that it must be in the same wheelhouse because Mad Men and Downton Abbey both share a cold, dark spot in hell in my heart in that I have tried to watch both of them and I did not make it through the pilot of either one. CHUCK: Oh man. AVDI: I both turned them off halfway through. I'm like, “I don't care how this ends. I want to not know.” [Laughter] CHUCK: There’s an endorsement for you. JAMES: It is. So those are the two points of view for Mad Men. DAVE: Yup. CHUCK: All right. Avdi, what are your picks? CHUCK: Is he still muted? JAMES: Push the mute button. CHUCK: All right. Dave, what are your picks? DAVE: The great part is the editors going to go through and clamp out all the silence bits. So it's going to be like "Avdi, what are your picks? Are you still there? Hey, Avdi, turn off the mute button.” [Laughter] DAVE: The timing is just going to be all gone. CHUCK: Yeah. Maybe he'll take that whole section out, who knows? JAMES: He did. He needs to. He disconnected. He'll go last. CHUCK: All right. So Dave, what are your picks? DAVE: My picks. All right. I'm in San Francisco this week for one last—actually two more days and then I— JAMES: You keep saying that. You keep saying you're going home. We don't believe it. DAVE: I am so homesick and ready to go home. You just can't believe it. I've been out working with the folks at ---.com and helping them move their app off of Java to Ruby on Rails. And it's been so much fun watching some developers that are new to Ruby and watching them have that delightful moment of—I literally told one of the guys, "Pay attention to yourself and be aware of that first moment when you become consciously aware of the fact that you are experiencing pleasure as you code." He's like "Pfft, whatever." And I'm like, "No, seriously. You spent your life in Java. You spent your life tricking the compiler into doing what you want and this is a language that--" and two days later, I had written out a map statement that used simple Proc and he's like, "What the heck is that &: thing?" So I explained Simple Proc to him and he sat back and went "That is so cool." and I'm like, "See? See?" So anyway ,we're building this project and I'm getting exposed to a lot of tools and libraries that I learned five years ago, threw thin my backpack and forgot about them. And apparently Ruby developers keep building new tools and so there's new stuff out there. My two picks for today are through your backpack kids and find the old thing and throw it out and pull out the new one. The first one is if you're using paperclip, you need to take a look at CarrierWave. CarrierWave is basically an image uploading Gem. Our plug-in for— it's a gem. Basically, it makes it really easy to attach images, makes it really easy to give the user a JavaScript snippet on the form that lets them upload an image or attach an image from a URL, etc. So very, very cool and it's got a really clean DSL to use in the code. It’s not totally perfect. We discovered some weirdness if you want to change image formats, you have to kind of jump through—if you want to sort a PNG version and a JPEG version, CarrierWave doesn't like that. You kind of have to do a Jedi mind trick on it to get it to behave correctly, but it can be done. So yeah, if you're using paperclip, you need to take a look at CarrierWave. And then the second one is, if you're still doing your pagination with mislav-will_paginate like a lot of us are still using—first of all, mislav-will_paginate, the mislav–, that means that Gem into life during that brief period of time, the golden era I like to call it, when you could get Gems from GitHub. The username is mislav and then will_paginate is just the Gem for doing pagination and it's been maintained and updated and brought up to date all the way through Rails 3. But there is another pagination gout there called Kaminari, which is the Japanese word for thunder apparently. This was—somebody on the team said "Let's take a look at Kaminari." And I'm like, "Look, I know how mislav-will_paginate works. I know it. I understand it. I've forgotten about it. We shouldn't be messing around with other stuff." And then I thought about Rich Hickey’s talk at Rails Conf where he said, "Don't confuse easy with simple." And so I'm like, "Ok, all right. I'll go learn something new." It took us maybe 20 minutes to get Kaminari working and then maybe another 90 minutes to get it styled perfectly, I mean like with Twitter bootstrap using Ajax pagination calls and I'm done with will_paginate. There's a new pagination Gem town as far as I'm concerned. If you're using paperclip, take a look at CarrierWave. If you're using will_paginate, take a look at Kaminari. Those are my picks. JAMES: I just want to make one minor clarification. You don't have to use mislav-will_paginate anymore. You can just use will_paginate. CHUCK: Yup. DAVE: Ok, cool. JAMES: It is actually a normal Gem and it has been updated for Rails 3, but I do agree that Kaminari is pretty neat. DAVE: Yup. CHUCK: All right. JAMES: I believe there's also a RailsCast episode on Kaminari. AVDI: Yes. CHUCK: Nice. We'll get that on the show notes too. Avdi, what are your picks? AVDI: Yes. I got a few picks. First one is inspired by a post on the Parlay list actually, the Ruby Rogue's Parlay list. Somebody was asking or talking about other podcasts or ideas for other podcasts and I realized that I don't think we've ever brought up— I don't think I've ever brought up the software engineering radio podcast which is one of the longest running software development podcasts that I know of. There are up to close to 200 episodes now. It's a really well-done podcast and what I particularly love about it is that, they make a concerted effort to get a sort of a broad cross-section of the software engineering universe on there. So I think one of their goals is to kind of educate developers on the wider ecosystem that they're part of and maybe introduce them to ideas or perspectives that they might not be familiar with because they're in the web development field and there's a perspective from the embedded microcontroller field or something like that. I love it for that. It really will broaden your horizons as a developer and the other nice thing about it is that the interviews are very well-informed so there aren't a lot of stupid questions or anything like that. They do their homework before doing the interviews. A quick software pick. I've been using various people's recommendations. I've been using Sony Vegas to edit video for a while and it works pretty well. It works quite well inside my Parallels Virtual Machine so I'm pretty happy with that. As some might have noticed, I've been putting up some screen casts lately and I've been using Vegas Pro to edit those. And finally, I wasn't going to do another one, but James made me think about TV shows. A TV show that Netflix recommended to me recently is Ultraviolet, which is an older—well from the 90s, I think—vampire drama made in the UK. You know these things can often be cheesy. I found this one surprisingly good. It's definitely not as sort of fluffy and bouncy as Buffy the Vampire Slayer or something like that. It's honestly, it's less supernatural and it's more— it's almost like a Cold War spy series as two forces sort of— two secret forces sort of jockey for control of the world behind the scenes and the people in it are so emotionally and morally fried from decades of secret war that you're not really sure who's better: the humans or the vampires. CHUCK: Sounds interesting. JAMES: Didn't they make a movie out of that? AVDI: I don't think so. So I know what you're talking about. There is a vampire movie called Ultraviolet that's much more recent and it is as far as I know, completely unrelated. JAMES: Okay because I watched the movie and it was pretty cheese balls. [Laughter] AVDI: Yeah, this is very low special-effects and it's not an action thing like the movie was as I understand it. DAVE: I just want to point out that I did finish the Ultraviolet movie. So those of you that are trying to figure out where on the good, bad or stupid spectrum I fall, that's just another data to point for you. [Laughter] JAMES: So let us know on Twitter with all the shows you guys listened to, let us know who has good taste: James, Avdi, David Brady. We need to know that. DAVE: Yes. CHUCK: I actually really want to see the Ultraviolet movie because it's directed by the director of Equilibrium which is a movie that while also cheesy, I kind of have a soft spot for. JAMES: Equilibrium? Is that the one? Remind me what— CHUCK: That's with the Gun Katas. It's got— JAMES: Yeah, yeah. I didn't— the way they’re spinning the bullet around cow carcasses. I couldn't— CHUCK: No, no. You're thinking of a completely different movie. JAMES: Oh yeah, you're right. [Laughter] CHUCK: I think you’re thinking about the Angelina Jolie movie or something. JAMES: Yes, that was terrible. CHUCK: I love where this podcast goes sometimes. [Laughter] JAMES: Okay, I'll shut up now. Sorry. DAVE: There was a Mythbusters episode about that by the way. AVDI: Yes. MythBusters bust the curving bullet, yup. JAMES: Thank God. CHUCK: I could have told him that. JAMES: Yeah. I didn’t Myth Busters on that one. [Laughter] AVDI: Yeah. It's actually one of those shows. That's like a foregone conclusion, but it's actually the episode is so much fun to watch anyway just watching them goof around with gun tricks that it's worth watching. DAVE: It's, it's— JAMES: Remind me Equilibrium? Now I’m thinking that I might know it. Who’s in that? CHUCK: Well, let's see. Sean Bean is in it in a smaller role and dah, I'm blanking on the name of the Batman, etc. actor AVDI: Christian Bale? JAMES: Christian Bale. Christian Bale, yes, yes. CHUCK: It's an early Christian Bale role. JAMES: Now I remember— AVDI: I think that he does very well in it. JAMES: It is kind of cheese ball, but it is kind of dead yeah. AVDI: Best final battle. What are the best final battles in an action movie I've seen. [Laughter] CHUCK: All right. So it's my turn? JAMES: This has been your TV Rogues podcast. CHUCK: Oh man. Well, there's an episode of Ruby Freelancers where we talked for about 20 minutes about books so— [Laughter] CHUCK: It happens and you know, it's kind of fun so I leave them in. So my random British TV series is Dr. Who and I've really been enjoying it. I'm in the beginning of season three. He just picked up a new companion, Martha Jones, and— JAMES: She's my favorite. She's not very popular, but she's my favorite. DAVE: I loved Karen Gillan. CHUCK: I really liked Rose Tyler as a companion, but I'm really—there's something about Martha Jones that I really like too. So anyway, Dr. Who is definitely a pick for me. I've really been liking the show. What's his name? David Tennant is just so goofy just so funny. JAMES: Yeah, yeah. He’s so funny. DAVE: He's the best doctor ever. CHUCK: Yeah, was it Chris Eccleston? Yeah, he was in the first season and then he regenerated into David Tennant. He was really fun to watch too. Anyway, I still sometimes find myself trying to reconcile the two doctors because they're not always exactly the same but anyway a funny, fun series. It's just enough sci-fi to kind of keep me interested too. One other pick that I have and this is something that I use. I use a few systems that still use FTP and there is a really nice client for that that I use. It's called Transmit and I'll put a link to that in the show notes. I don't know if it's in the Apple App Store, or if I had it downloaded and install it. But– JAMES: +1000 on Transmit. Best program on the Mac. It's amazing. CHUCK: Yeah, it's, it's— AVDI: Also works very well on Linux. CHUCK: Oh really? AVDI: It's cross-platform. CHUCK: Oh, nice. JAMES: I did not know that. CHUCK: Yup. And then my last pick and I know I've picked this on one of the shows before. I think it's probably this one, but I don't want to pick it again. It's called TotalFinder and when it crashes every so often, it doesn't do it very often, but when it crashes, it gives you Ruby errors. So I'm pretty sure it's written in Ruby or MacRuby. Anyway, what it does is it gives you tabs in your finder window and you can actually if you hit CMD+U and you have two folders open, then what will happen is— it'll actually open it so that you have the one tab open on the left and the other tab open on the right and you could just drag and drop files across between the two which is really, really handy if you're moving a few files off of your digital audio recorder into your Dropbox folder so your VA can edit them. Those are my picks. AVDI: I lied about Transmit on Linux. I was thinking of Transmission. Sorry. CHUCK: Oh yeah? Transmission's a cool one too if you're into BitTorrent stuff. JAMES: Yeah. That one is cross-platform. I've used it on the Mac too. It's good. CHUCK: Yup. AVDI: I love that we now consider cross-platform to be Mac and Linux. There's another operating system that it might run on. CHUCK: Well, what's it called? iOS 2? OS2? Yeah. JAMES: What operating system— JAMES: iOS. Yeah, yeah ,yeah. AVDI: OS/2 Warp all the way, baby! DAVE: Warp 3.0. Yeah. JAMES: Oh yeah. CHUCK: All right, so those are my picks. Laurent, what are your picks? LAURENT: Oh, my picks. So do I need to have two picks? CHUCK: You can have as many want. LAURENT: Many as I want? DAVE: Or as few. LAURENT: Is one enough? CHUCK: One is enough. JAMES: One is plenty. Go for it. AVDI: But don't pick RubyMotion because we totally see that coming. [Laughter] LAURENT: No. Because I have been working a lot, I haven't really had the opportunity to watch a lot of shows except that I watch Boardwalk Empire. I'm not sure if I pronounce it correctly. CHUCK: Boardwalk Empire? JAMES: Boardwalk Empire, I haven't heard of that. CHUCK: I think I've heard of it, but I haven't watched it so— LAURENT: It's actually a nice show. I really liked it. If I had to pick something I really like presently, it would be Skyrim. Not sure if you guys heard about Skyrim— JAMES: Oh yeah. That's a good pick. LAURENT: Okay. So if you don't know what Skyrim is, it's a role-playing game for PlayStation or the Xbox or PC and it's an adventure game created by the awesome guys at Bethesda Softworks. So it's part of the Elder Scrolls franchise and it's just awesome. I've never had as much fun when playing a video game. I've been playing all the Elder Scrolls games from Arena. I remember that I spent— DAVE: Wow. LAURENT: An entire summer playing Daggerfall when I was a kid. JAMES: That's awesome. LAURENT: It was incredible, but Skyrim is just the best of all the games and I cannot describe the fun I had. I probably don't need to talk about Skyrim a lot because people probably know about it, but it made me think a lot about startups. It's funny because when I purchased Skyrim, I realized that I was purchasing a piece of software that provided me happiness. I played Skyrim for many, many months. It really made me happy. I was so excited to play Skyrim and to go back home and progress and learn new magic skills and these kinds of things. It made me think that the best thing you can do when selling a software, is to make people happy in exchange. You can sell a software and do something people want, but if you can make people happy, it's even better because you create some sort of community around the software you are delivering to— JAMES: I think that's awesome. One of the best things that's ever been said on the show. CHUCK: Yeah absolutely. LAURENT: That made me think a lot because video games are the ultimate software product that gives happiness, when you think about it, because a video game is pure happiness. It doesn't serve a need. So you're not buying your video game to figure your taxes or to submit files to an FTP server. You're buying a video game to have fun. So if it doesn't provide fun, it doesn't achieve its role. I think that if you do a startup and you sell a product, if you can make it as fun as a video game—of course, you won't be able to make it as fun as a video game but if you can try to approach in that direction. In RubyMotion, one of the things I didn't want to do— I wanted to do, but I was told not to do before launching was to not ship a DSL with RubyMotion. Originally, I wanted to ship RubyMotion with a DSL that I wrote myself and then some guys told me, "You shouldn't do that. You should let people write their own DSL’s because it's a fun experience and people will enjoy doing it." Actually, that guy of course was Rich Kilmer again. So he was right. JAMES: It's that guy. He's everywhere. LAURENT: Yeah, he's actually right and without him, RubyMotion would not exist. And he was right because when RubyMotion was released, many people had fun writing even though they found writing DSL's with it so perhaps it's like a video game. You grab a software. You play with it. You have fun. CHUCK: Yeah. LAURENT: So my pick would be Skyrim, in particular, because that's probably the best video game I've played in the last perhaps four years or five years. CHUCK: Nice. That's probably— we get this deep thought at the end about joy and software and stuff and what you get out of it. I think that's a real important point. I think a lot of times we kind of miss that point. LAURENT: Yeah. And right now Diablo III is released and I can't just wait to buy it but I know that if I buy it, I'll will— [Laughter] LAURENT: It will consume all my time. JAMES: I have an even sadder story. I actually own it and I worked 14 hours yesterday on release day. So I haven't even fired it up. LAURENT: Oh yeah. CHUCK: Oh man. DAVE: I actually have been deferring gratification as I work through the Slide Rule Labs, starting that up and going through the rocky patches with that. I have promised myself that I am allowed to buy Mass Effect 3 once I do this and I still haven't done it. So Diablo III is going to have to wait. JAMES: I just want to note, though, that if you have any doubt that Laurent is a superhero, he owns Skyrim and he still wrote a static compiler in six months. [Laughter] LAURENT: I just finished the game a few weeks ago. I mean, the main quests. AVDI: My advice to people: If you have not heard of Skyrim, save yourselves! [Laughter] JAMES: It's a great game. It's a really great game. LAURENT: It's just awesome and I can't just wait for the next one. CHUCK: Yeah all right. Well, let's go ahead and wrap this up. Thanks for coming again, Laurent. It was really kind of a cool discussion of about an aspect of Ruby that we don't usually talk about something on the mobile phone. LAURENT: Thank you. DAVE: It's awesome. It's awesome. CHUCK: Yeah so a few announcements here real quick. I did get some information up for the Ruby Rogue’s Parlay on the Ruby Rogue’s website so if you go to RubyRogues.com, you go look on the right in the sidebar. You can sign up there and we really appreciate the contributions. You'll get put on the mailing list. We've been having some pretty cool discussions on the list. Is there anything else that we need to announce? DAVE: Yes. So the coding challenge is underway. AVDI: Yes. DAVE: And the submissions just started coming in and I'm noticing that there are some people— JAMES: Wait. I won, right? DAVE: No. We’re not eligible. [Laughter] JAMES: What the heck? DAVE: Yeah, I know. I put that in there just for you. It's the James Edward Gray II spoiler clause. That's why we're not eligible to win. [Laughter] DAVE: I'm noticing some really cool things happening in the Twitterverse and that is—people are kind of writing in and posting Gist and saying "I don't know how to get this any shorter." It's something that they've got it down to 170 characters and other people are stepping in and taking a look at how to compress the code and ways to play with it. So if you’re experiencing any anxiety about playing in the coding challenge, don't. Get in there and as grandma used to say, "Get in there and scratch with the chickens." And if you've got something that's pretty neat, but doesn't quite fit into a tweet, post a Gist to it and let's take a look at it and see if we can’t get it shortened down. CHUCK: Yup. We also have the book club coming out. We finalized the date on that. It's going to be June 6th. We'll be talking to Jesse Storimer about his book Working with UNIX Processes. And if you go to workingwithunixprocesses.com and click on the link to buy the book, use the code “book club”. You'll get $5 off. I think that's it. I think that's everything so thanks for listening. We will be back next week and until then, go write some really, really short code that does some really awesome stuff. DAVE: Or that runs in iOS.

Sign up for the Newsletter

Join our newsletter and get updates in your inbox. We won’t spam you and we respect your privacy.