The Changelog: Software Development, Open Source - Celluloid and Concurrency (Interview)

Episode Date: May 31, 2012

Wynn talked with Tony Arcieri, creator of Celluloid, about concurrency in Ruby and his thoughts on Erlang, Clojure, and design patterns....

Transcript
Discussion (0)
Starting point is 00:00:00 This episode of The Change Log is brought to you by Pusher.com. Pusher is a hosted API for quickly adding scalable real-time functionality to web and mobile apps. If you're building anything that needs to get data from the server back to the client asynchronously, you need to check out Pusher. They've got a number of tutorials to help you get started, everything from a quick start guide to building a real-time chat client, push notifications, activity streams, and more. We'll see you next time. www.thechangelog.com Welcome to the Changelog episode 0.8.1. I'm Adam Stachowiak. And I'm Winn Netherland. This is the Changelog. We cover what's fresh and new in open source. If you found us on iTunes, we're also up on the web at thechangelog.com. We're also up on GitHub. And I'm And I'm And I'm And I'm
Starting point is 00:01:05 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:09 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:09 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:09 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:10 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:10 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm
Starting point is 00:01:10 And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm And I'm YNN. Fun episode this week. Talk to Tony Arcieri, aka Bascule I believe on Twitter, about his project
Starting point is 00:01:25 Celluloid and D-Cell and Real. Basically multi-threaded programming in Ruby. This seems to be a go-to project for folks building these types of applications in Ruby. Mmm. Mmm. Stuff I'll never use, huh? Yeah, pretty much. It's interesting
Starting point is 00:01:42 to some folks out there. We mentioned it in the Voice over IP, the adhesion never use huh yeah pretty much it's interesting to some folks out there it's uh it we mentioned it in uh the voice of our ip the adhesion episode i had to think about the project name the adhesion episode 079 was the last time we uh we mentioned celluloid but it's come up a few times on the chainsaw yeah and even though it's not popular with me that that episode was really popular so if you haven't listened to it go back and. There's people out there that listen to the show, I promise. Yeah, sure. Fun episode this week. Should we get to it? Let's do it. Chatting today with Tony Arceri from Living Social,
Starting point is 00:02:21 the creator behind Celluloid and some other projects. So Tony, for those that don't know, you want to introduce yourself. Hi there, I'm Tony Arsiri. I've been doing Ruby about seven years now, I guess. Kind of jumped in with the Rails bandwagon there in 2005. Got on board with like Rails 0.11. This was back when everybody was deploying with fast CGI, and Lighty was the cool name of hotness of the day. So I guess I've been around a while.
Starting point is 00:02:53 So why Celluloid? Why don't you give us a little background behind this project? So I used to do a lot of network programming in C, and when you do stuff in C, you have to build your own abstractions uh so I had kind of an idea of what I wanted to do or always wanted to do in C and I discovered Erlang and Erlang had sort of taken all the stuff I had wanted to do and uh put a really nice face on it and Erlang was kind of how I discovered things like the actor model and basically seeing approaches to concurrency that also work for distribution.
Starting point is 00:03:31 When did you start the project? I started it around this time last year. It's a little bit over a year old now. I was like lying in bed one night kind of you, you know, around like 3am or something, trying to go to sleep. Just kind of thinking about, so I was working on a programming language, Raya, which was like trying to bring Ruby to the Erlang VM. I was thinking, you know, do I really need to make a new programming language or can I just take all the Erlang ideas back over to Ruby, which is something I tried before. I tried Revactor, which was another project trying to bring sort of Erlang-y ideas to Ruby, and I abandoned that, switched to Raya, and I was like, again, like, you know, maybe I can bring all this stuff to Ruby. We don't need a new language, and everybody can just write this stuff in Ruby.
Starting point is 00:04:24 Let's dive in there for a moment. What are some of these Erlange ideas? So the big problem, I think, is Rubyists don't like concurrency and we really need it in the modern world, right? We have computers with multi-core processors. You know, we have Rails applications that sit around and do nothing while we're talking to the database. So all these things can be solved with threads. And Rubyists just don't want to use them, and I would really like to change that. What are some of the libraries that you can or can't use if you're using celluloid adapter support? Do you need to really take advantage and exploit this?
Starting point is 00:05:09 So Celluloid will work with any thread-safe Ruby gems you want to use. So if you want to use Rails, you want to use Sinatra, you can actually drop Celluloid in in the background. Right now there's unfortunately no Celluloid Rails plug-in type of thing to kind of give you a happy path for that. But if you're using Rails in thread-safe mode, you can just go ahead and drop in Celluloid. Let's talk about some of these, I guess, sub-projects of Celluloid. There's the I.O. project, there's D.Cell and Reel.
Starting point is 00:05:35 What are these three? So the first one you mentioned was Celluloid I.O., right? Mm-hmm. Okay, so Celluloid I.O you do evented IO inside of an actor. So it's basically a combination of the actor model and the reactor pattern. So basically each of these objects is kind of, each of the concurrent objects slash actors is kind of like an event loop in and of itself, right? So the actor model works by having actors,
Starting point is 00:06:10 you send them messages, and then they can send you messages back. So when you're waiting for messages with Cellulite.io, you can also wait for other IO handles in the system. So you can have one actor that's potentially waiting for uh you know 10 000 possibly other uh sockets or something right so it's similar to like event machine or no js but you can have as many of those actors as you want in the system you can kind of uh isolate what connections they with. So you don't have one event loop
Starting point is 00:06:46 dealing with all your clients. And then in the same event loop, you're like trying to make outgoing connections to other services. If you've ever had to debug somewhere where one of these event loops is getting stuck, it's really nasty. So celluloid, uh, celluloid IO specifically lets you isolate, uh, which actors are handling what, so that's easier to debug. So the canonical example of these types of, um, projects are usually chat servers, but let's get a little bit more specific without divulging anything that you can't share. What types of apps at LivingSocial are you building with this sort of project? So we're not actually using Cellulite.io at LivingSocial. We're presently investigating DSAL,
Starting point is 00:07:35 and we're building an internal platform as a service. So it's some of the monitoring and automation around that. We're investigating using DSAL, but it's still in the preliminary stages. Gotcha. So Adam Keyes on the commit list here on Celluloid.io just assumed that it was a living social joint. Yeah, yeah. No, I mean, he's just a fan. So what about DSL?
Starting point is 00:08:06 So DSL, one of the neat things about the actor model is it's really easy to extend from building concurrent systems inside of a single VM to distributed systems that run on multiple computers. And that's because the actor model provides you this really high level abstraction with, you know, these sort of vague terms. So, I mean, the basic idea is an actor is a mailbox, and that mailbox is an address. So it doesn't really matter where that actor lives. It can be in the same VM, it can be on the other side of the world. As long as you have its address, you can send it a message. So Decel lets you build systems with celluloid that span multiple computers. How drastically does that change your architecture? So the idea is it shouldn't. Basically, you can prototype everything inside a single VM.
Starting point is 00:09:03 And then when you actually want to pull it apart and distribute it into separate services, it's just as easy as starting services in different VMs instead of all in the same VM. So a couple of times here in the docs, you mentioned 0MQ. We talked about that when Zed Shaw was on the show. What's the selling point for Zero MQ other than, I suppose, speed?
Starting point is 00:09:28 Well, it isn't actually speed. So, I mean, Zero MQ is very fast. It's built, Diesel and Celluloid ZMQ were built on this library called FFI-RZMQ made by Chuck Reams. He's done a really good job
Starting point is 00:09:44 of optimizing that as much as possible and getting the latency as low as possible but really it's not about speed it's about uh having a higher level message transport than tcp itself so uh 0mq is some really neat features as far as if your network gets partitioned and you try to send send a message to another node right with tcp that can potentially time out or give you an error and zero mq will hold on to those messages in memory and queue them up and then as soon as that connection becomes available again it can send them all off. So it sort of gives you some basic features of message queues, but without a broker. How long has ZeroMQ been around?
Starting point is 00:10:34 I've known about it for like three years, I think, maybe even more. It's not like terribly new at this point. It's actually fairly mature, and a lot of people are using it now. There's projects like Storm, which is sort of this distributed function processing system built in Clojure, and people are doing really neat stuff with it now, so I'm a fan. Are projects like Celluloid and Decel, this invented model and this distributed model, is this the frontier of Ruby and frontier of some other languages? Or is this just somewhere where you like to play?
Starting point is 00:11:15 Well, I mean, so there's Erlang, which has been doing this thing for like almost 20 years now. Or more than that, I guess. So, I mean, Erlang was really ahead of its time as far as this stuff goes I would definitely say this is the frontier for concurrency in Ruby there's really no other game in town as far as I know so instead of pulling these features into Ruby how come we're not seeing frameworks I guess built on top of Erlang. What's the barrier there? So that's been tried quite a bit, actually. There were a bunch of projects to do that, probably most notably Vertebra from Engine Yard tried to do this.
Starting point is 00:11:59 And it just ended up being overcomplicated. Ezra did a simpler project with RabbitMQ called Nanite, which is sort of, you can sort of look at that as being a little bit similar to DSAL, but DSAL is a lot more full-featured, I would say. Nanite gave you one agent, and DSAL gives you as many as you want that are as easy to implement as just writing or a ruby class uh and then desol doesn't have a broker right so with nanite you had to deal
Starting point is 00:12:33 with setting up rabbit mq and its high availability is a little bit tricky you have to do like a san or drbd or something so uh desol doesn't have any of those problems because it's fully decentralized. What about Reel? So Reel is a web server I wrote on top of Celluloid.io. Some of the goals there were to have a nice modern web server without a RAC API because RAC is kind of problematic in celluloid specifically the way it implements middleware loves to sort of use a ton of your stack right celluloid uses fibers and on Ruby 1.9 YARV at least you only
Starting point is 00:13:20 have a forward kilobyte stack for fibers. So using RAC in conjunction with fibers is kind of impractical, as some people who tried to run a full Rails stack on top of it discovered. So the other thing in addition to just not using RAC that I want to accomplish is having a nice integrated web server built on Celluloid.io with WebSocket support. That feature is kind of vaporware right now, but I've been looking at some stuff like libwebsockets that's available for Ruby,
Starting point is 00:13:56 and it seems like there's some pretty awesome libraries I can tap into since I try to tackle that problem. So Reel appears to be pretty bare metal. Yeah, yeah. So it lacks a lot of the routing and DSL and some of the things we've come to expect from Ruby web frameworks. Yeah, yeah. So I suppose it's geared more towards single purpose, just ultra fast types of servers?
Starting point is 00:14:22 Well, there's that. And also, I've been trying to get it working with WebMachine. So Sean Cribs kind of pushed a proof of concept of a WebMachine driver for it, and I just need to add some missing features to Reel and
Starting point is 00:14:38 write some tests for that after there, and I think you can use WebMachine for all this stuff where you need a higher level of abstraction. Sean Cribs is from Basho. Yeah, yeah. So also slings a bit of Erlang, if I recall.
Starting point is 00:14:55 Yeah, yeah. So what sort of projects are you building if you're not building these low-level projects? I mean, I'm always fascinated by folks that are building frameworks and libraries that ultimately other developers build, and that's what they're doing exclusively. But what sort of, I guess, user-facing work are you doing? So I don't really have any super serious projects
Starting point is 00:15:22 I'm building with Celluloid. A couple of them I built in IRCbot called Cellulon. Sort of similar to Hubot, but more Unix philosophy where each script is just a script. And if you print from it, it prints to the IRC channel, that kind of thing. The other one is called the Cryptosphere. This is a project I recognize
Starting point is 00:15:46 is kind of above my technical ability right now, but it's something I like to hack on. It's sort of like a peer-to-peer distributed encrypted data store that's completely decentralized, so anybody can join. I guess the closest projects today would be something like Freenet. There's also GnuNet.
Starting point is 00:16:10 Well, your projects have come up on a couple of episodes. The most recent ones were the Adhesion episode and then also Travis CI. So do you have, I guess, other developers that are working on their projects ping you and asking you questions about how to integrate Seloid or are you actively marketing the project? Yeah, definitely. So there's an IRC channel just pounding celluloid on Freenode. And actually there's been quite a bit of traffic in there lately.
Starting point is 00:16:39 So yeah, like Ben Langfield, I believe is his name, for adhesion, right? Right. I mean, he isn't on the RSC channel per se, but he's definitely been one of the main ones talking to me. And obviously Erlang was created for telephony, so I think that's a really good fit there. But, yeah, I mean, there's been a lot of people who already have a project and they've,
Starting point is 00:17:05 you know, been dealing with some of the issues of threads and they're like, I just want something simpler. So it's, it's been a lot of investigation of, uh, rewriting existing projects with celluloid. Are you seeing an uptick in adoption of these projects? Yeah. Or not, if not adoption, then interest. So, you know, just people who've, they basically are to the point where they're like,
Starting point is 00:17:31 I need a framework because my multi-thread program is too complex. So definitely a lot of interest from that type of person. How much influence, if any, have you gotten from either Node or Twisted or some of the other frameworks in the other languages? So definitely I've gotten a lot of inspiration out of Python. There are a lot of similar projects to this that I had sort of looked at when I was originally developing Revactor. Some of those are like, there's one called Camellia,
Starting point is 00:18:11 another one called Eventlet. So those projects were pretty influential. See, beyond that, I mean, the main influence of celluloid in general is Erlang. hand from the ever popular Hacker News website. And right now, two big events are happening. The 100th issue of Hacker Newsletter and 10,000 subscribers. So to celebrate, 10 lucky subscribers who open the 100th issue
Starting point is 00:18:55 which comes out June 8th will win some very cool prizes. For full details subscribe today at HackerNewsletter.com Shifting gears for a moment, we had at hackernewsletter.com. Shifting gears for a moment, we had a plan to talk about LightRail. And from the time that we set up this interview to today, there's been another project that's been introduced, which is the Rails API. So we were talking before we started recording, and it sounds like you're going to kind of shut her down on light rail yeah so i mean
Starting point is 00:19:26 the whole goal of light rail was uh when i was working at strobe i was there with uh three rails core members uh yuhuda katz carl lurch and jose valim and uh carl and jose had built a Rails 3 stack specifically for Strobe, which had been stripped down to action controller metal specifically. And from there, we just pulled in the stuff we needed. So I thought I'd just put that out there and see if it stuck. And I talked to Jose, like, is this a good idea am i competing with rails and it turns out i was kind of competing with rails even though jose uh gave me the go-ahead to release it there but uh you know it's been a little bit of a debacle uh trying to
Starting point is 00:20:19 get a standard way to build rails apps that are only JSON APIs. But now I would say don't use LightRail. Check out Rails API instead. From Santiago Pastrino, I should mention. It's on the blog. Any big differences between what they've done with Rails API and what LightRail is was? So Rails API contains a lot of stuff that's an evolution of stuff that Jose had originally developed
Starting point is 00:20:51 that we shipped in LightRail. He had this thing called Wrappers in LightRail that actually has been pretty much completely rewritten and replaced by this thing called Active Model Serializers. But the basic idea is there's a canonical way to represent JSON. So, you know, some, like right now, everybody makes their own JSON APIs, and they all look completely different. So active model serializers was trying to give you a way to standardize so everything that sort of talks this specific JSON format
Starting point is 00:21:27 can all talk to each other, and you don't have to write a bunch of one-off JSON generators and JSON clients. Is that set a level above the models? Are they mixed into the models? Is it a presenter pattern? How does that work? It's its own object that interacts with the models,
Starting point is 00:21:44 but has some context beyond what the model does i think right now the context is only the current user but it uh it provides an abstraction for serializing json and specifically stuff like you have a client who wants to pull in a resource but that has a bunch of associations and you want to grab those all in a single request. It gives you an abstract way to do that. That's a common use case. I think that's a lot of times where a lot of these projects in this space kind of fall down for me, is they assume that you've got one representation of this particular resource throughout your entire API. And a lot of times there's little nuggets that you want to share in this
Starting point is 00:22:25 context that you want a fuller representation in another context. I've been using JBuilder, which is the HHS project recently, and I've liked it for that reason. You kind of handcraft and roll your own JSON in that regard, and it supports partials and views. Terrible name, but neat project. I mean, I think that's kind of the underlying philosophical debate is like, is a serializer closer to a view,
Starting point is 00:22:56 or is it actually some higher level abstraction that's completely different? There's a lot of room for, I guess, implementation details when you come to build an API in Rails. I know that the Rails way is to really support bare array APIs, and it seems like inevitably you want some sort of wrapper envelope or something or some sort of response object where the actual return value is hanging off of that so that you can see total number of records and pagination info and some other things that just unless you stuff those
Starting point is 00:23:30 into headers that are just difficult if you return bare api arrays yeah i mean so there's actually some security concerns around bare apis or bare arrays I mean, because arrays in JavaScript map onto objects, so you can redefine things that arrays do, and potentially a malicious script can get access to that data that way. So Bear Arrays
Starting point is 00:23:57 in general are bad. The real advantage of something like ActiveModel Serializers, I think, is it handles relational data. So when I was talking about including other resources, there's a bunch of ways to do that, right? You could sort of nest the resources you want inside of the one you retrieved. And that's bad because you could end up nesting it in several places. And then the question becomes, which of these, which of these is the canonical one, right? If you have three
Starting point is 00:24:32 copies of the same resource inside your JSON. So Actimol serializers flattens that all out and then uses IDs as a way to associate, you know associate the parent data to its associations. When I came to Ruby and Rails, I guess 2006, one of the selling points was convention over configuration. It was just an easy on-ramp. It seems like we're getting a lot more complex with the problems we're trying to solve. Do you see any issues with just introducing so many different decisions for the new Rails developer that's coming to the stack? I think it's the other way around. I think
Starting point is 00:25:11 it makes it so the end user has to do less because more of these decisions have already been made for them. You know, some people may not like that. Some people may want to build their own JSON serializers. Having done that by hand so many, many times over the years, I'd love for there to be just one solution for that problem. Do you consider yourself a polyglot? I do in that I investigate a lot of languages. I like to learn little tricks from them. But really the only two languages I'm super comfortable with are Ruby and Erlang. So I mean, there's not a lot of other languages I'd be really confident in building like a large project in right now. So a lot of times I'll ask folks what features of languages would they want to
Starting point is 00:26:07 steal and bring into their favorite language? And you, you've gone down that path with Erlang of actually, you know, and more than one way tried to, to fix that problem. Any other features, some, any other languages you've used other than the concurrency problems that you'd like to solve in Ruby? So the two big ones I've seen kind of getting a little bit more attention lately are object capability systems. So the idea of a capability system is you can have complete control over what
Starting point is 00:26:41 objects in the system another object can access. So this is sort of an outgrowth of the actor model itself, actually. So you can introduce an object to another object, basically. And as soon as you do, that object can access the other object. And where this is a huge concern right now is in the browser, because we're trying to do mashups, right? We're trying to pull in third-party code. But right now, that code can basically do whatever it wants.
Starting point is 00:27:13 It can go nuts on the page. It can read anything in the DOM. It can transmit stuff back to whatever server it wants via like a script tag or image tags or anything like that, right? So the situation there is kind of out of control and there's a lot of people at ECMA trying to sort that out right now. There's actually a language called E, which nobody's ever heard of, but it was built on object capability systems,
Starting point is 00:27:46 and I think those are pretty interesting. The other thing I really like comes out of this framework called Killem on Java. That's this idea of linear ownership transfers. So right now when you write a multi-thread program in a mutable state language, any thread can just trash that state, right? Like any thread that has to handle the object can do whatever it wants.
Starting point is 00:28:21 And ownership transfer systems are a way to prevent that by handing off ownership of a particular object to another thread. So you can go, I'm done with this object, here you go. And if you try to use that handle again from the original thread, it raises an exception. So I think that's a good way to build safe multi-thread programs, even though you have mutable state. You mentioned a few patterns. There seems to be this scale between developer and then programmer and then computer scientist. How fluent does a developer coming to the Rails stack or Ruby stack nowadays have to be in these patterns, or how much of them are just baked into the tools they use? I'd still like to say onboarding in Rails is fairly easy once you get over the hurdle of installing Rails, especially on a Mac.
Starting point is 00:29:07 But I think really there's not a whole lot of background you need to get started in Rails right now. I think they've done a really good job keeping the API clean and easy to use.
Starting point is 00:29:24 So I wouldn't say you have to be a computer scientist to use Rails. There seems to be an uptick, though, in interest, I guess, in these patterns in the Ruby community. I'm hearing a lot more about DCI and some other patterns that keep rearing their head every couple of weeks. Do you have an opinion on DCI? I have a fairly negative opinion of dci itself uh if you actually read the description it cannot be implemented in the ways that
Starting point is 00:29:53 uh rubius uh what they're calling dci uh you know they they explicitly say it can't be implemented in any of those ways uh so the first is through a mix-in at runtime, basically, right? Like you have a module you extend on an object. So that one's bad because it blows the method cache. So there's another way to implement it, which is through delegation. If you actually read the DCI paper, they say you cannot use either of those to implement DCI. So I'm kind of confused as to what DCI actually is if it isn't either of those things.
Starting point is 00:30:32 How many of these patterns do you think have affinity to the language they were originally thought up in, I guess, like a better phrase? I think Ruby can handle most object-oriented programming patterns so it kind of depends the reason I ask that, a lot of times when I'm in JavaScript circles I see Rubyists that are getting into Node try to port a lot of the module behavior that we take for granted in Ruby into JavaScript and just start pulling their hair out
Starting point is 00:31:02 because JavaScript is a fundamentally different language. Yeah, yeah. I mean, so you could ask Hudo about that. He's actually done a full mix-in system inside of Ember.js, which has its own object model. Thoughts on hypermedia APIs? I definitely like not having to construct URLs. If that's really the only thing hypermedia gets you, I guess that's a win.
Starting point is 00:31:31 We need to do a show on this. I'm still kind of on the fence myself. I like the promise. I mean, everybody's got this dream of pointing some sort of code to a root URL and just have this wrapper organically unfold. What troubles me about a lot of the things that I'm reading is just the lack of type on some of the returns. And the folks that are building out HyperMedia APIs will talk about, well, it's just MIME types, right?
Starting point is 00:31:56 But a lot of their examples are HTML and XML, which are not typed. And then as, you know, just a Joe Blow Ruby wrapper developer that I am, there's things we take for granted that Jason has just made like a dial tone. We don't even think about it, right? If I had to sit there and construct objects for every MIME type I'm going to consume, I'd go crazy. Yeah, I mean, that's where you get into stuff
Starting point is 00:32:21 like soap did code generation and that kind of thing. So, you know, I mean, perhaps it could be done at runtime. Perhaps you could point something at an API and have it metaprogram all that stuff for you. I'm not really sure. You know, I'm kind of on the distributed object side of that debate, right? Like, you know, there's all this stuff that requires a lot of standardization if we're building HTTP APIs, which just goes away if you're using distributed objects. I should say, I'm quite ignorant on the subject so far.
Starting point is 00:32:54 I'm learning more, but we need to do a show with Micah Munson and maybe Steve Klabnick, our contributor here on the ChangeLog. He's got a book coming out on hypermedia APIs just to talk about the subject. Seems to be really hot, but also kind of, it's one of those things where, you know, if you are in JavaScript circles, if you want to end a debate, you just start screaming Crockford, right? And if you're talking about big data, you'll say Dynamo and Verner Wuggles, right? But if it's HTTP and REST now, it seems like people just scream fielding.
Starting point is 00:33:28 Nobody really understands that paper. But yet we all claim this is what fielding would have wanted. I mean, I think we have the problem solved fairly well. It's all just kind of bike shedding around these little minor issues. I guess my big thing is we're still trying to embrace REST. Yeah, yeah. And I'm happy when I stumble across a REST-ish API. As long as they're not wrapping,
Starting point is 00:33:55 clearly wrapping every database table as a REST endpoint call, that's fine. As long as I don't have to deal with a schema or document type definition, I'm cool with it too. But it seems like we're raising the bar a bit on people that are still trying to get their heads around REST-ish APIs. Yeah.
Starting point is 00:34:20 So when you're not hacking on Celluloid or Decel or some of these other projects, what's got you excited as far as open source? So there's a project I've been contributing to in Python called Tahoe, the least authority file system. I just redesigned their landing page there because it's kind of ugly. But this is a really neat tool. So I mentioned the Cryptosphere earlier. Tahoe is kind of the inspiration for that. But it's a great tool for if you want to run a cooperative backup system with your friends.
Starting point is 00:35:01 If you have a bunch of people who have cable modems or run servers or whatever, you can kind of just install this on all those computers and so long as the bandwidth and storage is more or less free to you, then you get free collaborative backups with this and you can also use it to share
Starting point is 00:35:19 data. I've been really enjoying that. I'm definitely a big fan of Travis CI. I just got to hang out with all those guys at RailsConf, except for Matthias. I finally got an invite to the private version of that. It's quite well done. Yeah, nice.
Starting point is 00:35:44 I have not seen it myself yet. What about your text editor? I use a few different ones. I still use TextMe as my primary editor. I've been sort of investigating MacVim, so I've known how to use Vi since I was like 13 or something, but I don't really like using it as my day-to-day editor, I guess. So I'm a Mac user, right, and OS X has these sort of ubiquitous Emacs-style key bindings
Starting point is 00:36:19 throughout the whole OS. So if I go to switch to Vim I have to like sort of context shift to Vim mode instead of just using the Emacs key bindings I played around with Emacs quite a bit when I was learning Clojure and it seems
Starting point is 00:36:36 pretty cool but I just couldn't get over the learning curve and you know I wasn't really sure if I did I would really actually enjoy it. For now, I generally kind of stick with TextMate, and I use Vim on the command line for sort of short, one-off type edits. What was your thoughts on Clojure?
Starting point is 00:36:59 I really like Clojure. I think it solves a lot of the problems that made Lisp impractical in the past. Just being on the JVM, they can tap into the whole ecosystem of JVM libraries. And they finally, well, they being Roach Hickey, finally added syntax for some other data structures besides Lisp, right? So it has maps and vectors that are really handy. As far as trying to build something big in Clojure,
Starting point is 00:37:33 I'm just not sure I would really prefer doing it in Clojure to Ruby. Like, in terms of everything like maintainability and my ability to sort of comprehend the code base, I think it's just easier to do in Ruby. Although I think probably the result if I wrote an enclosure would be a lot faster and a better performance. Do you have a programming hero? Yeah, it's a tough question. I guess I have a few of them. I'm a big fan of the Erlang guys. I've never met Joe Armstrong, but I've met the co-creator of Erlang, Robert Verding,
Starting point is 00:38:08 and they're both pretty cool guys. I think they were really way ahead of their time with Erlang, and a lot of this stuff is becoming relevant now that we have these massively multi-core computers and really fast Internet, and everybody's building distributed programs now. I ask all three of those questions now because the last three episodes, I always assume that nobody's ever heard this show.
Starting point is 00:38:34 So we kind of end the episodes on those questions. The last three episodes we've hung up and someone's pasted in our chat later, hey, dude, you didn't ask me X question. I still have my answer ready. All right, nice chatting with you today, Tony. Thanks for giving us the lowdown on celluloid and the other projects. Appreciate it.
Starting point is 00:38:54 Yeah, cool. I see it in my eyes So how could I forget when I found myself for the first time Safe in your arms As the dark passion

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.