MagicRuby, the FREE Ruby conference at Walt Disney World Resort® on February 4-5, 2011, is nearly full! If you want to hang out with over 300 other Rubyists and see talks by Chad Fowler, Dave Thomas, Kyle Neath (Github), Gregg Pollack (Ruby5, Envy Labs, Rails for Zombies), and a host of other great speakers, all at a convention center literally steps from the Magic Kingdom park, then you’d better run over to http://magic-ruby.com and grab a ticket right now. They’re going very fast!
Also, if you plan to stay at the five-star resort that the conference is being held in for about 60% off the normal price, you need to book your room TODAY. You can book your room using the number from reservations link on the website. Usually they allow you to pay for one night up front and pay the balance when you arrive (I don’t know if that holds true with group reservations or not…). In any event, the rate expires today, so get those reservations in!
Hope to see you in February!
Caution: I am going to try to sell you something at the end of this post. If that offends you, skip the last few paragraphs. :)
When Rails 3 RC1 hit earlier this year, I also released my Rails 3 upgrade guide in its final form. I had been shopping it to a few people since early alphas/betas of Rails 3, but I finally let it out of the bag in early January. It’s been about a year since I first released it, so I thought it’d be neat to look at the sales numbers and see how far I’ve come since then. So, I popped the console open on the Rails app and ran a couple of queries. “That can’t be right,” I thought. “I made how much?”
Holy crap. I’ve made $40,967.
How does that break down? Well, here are the numbers:
I’ve been overwhelmed by the purchases and the great comments I’ve gotten about the book. Plainly, I was on to something here. The sales from both avenues have been excellent (in my opinion), and the “other stuff” constitutes things like speaking gigs and so on that I’ve gotten as a direct result of writing this book.
You can see from this graph that sales have actually been fairly consistent month-to-month. They ebb and flow, of course, but there haven’t been any major crashes.
It should stay like that for some time since I think a lot of developers are just now actually getting confident enough in Ruby > 1.8.6 and Rails 3 to really make the leap.
So, the question is: how did I do it? Is the book really that good? Or is it something else at work? There was a recognition factor at play here for sure given my past work (my 2 books previous to this one, open source, speaking, and so on), but there are a few other things at play here I think…
There are, of course, more factors at play, but I think those are the big ones. I’ll be blogging more about this stuff soon because I think there are some interesting lessons.
But enough about me.
Would you like to make some excellent passive income while getting a few fringe benefits while you’re at it (speaking gigs, consulting jobs, and so on)? *dons Matthew Lesko jacket* I CAN HELP YOU WITH THAT! I’ve been toiling on an eBook project for almost a year now; I’ve written most of it, rewritten it, tore most of it out, changed the format, and written it again. I think I finally have something good.
I’ve titled it Authoring eBooks, a thorough eBook guide to (you guessed it) writing and marketing eBooks. It takes you through the writing process from concept development to structuring your outline to actually writing the book and into the marketing and sales process. It’s structured as a discrete set of essays so you can pick and choose the topics that are relevant to you. Some of them are short thoughts on a particular topic; others are multi-pages treatises on an in-depth topic. You can check out the sample pages to get a feel for how it’s written, or jump over to the informational site to get more discussion of what’s inside.
It currently costs $29 for over 100 pages of information with access to future bonus content (topics in the hopper so far: running a successful affiliate program, A/B testing, and more). I’m also in the process of setting up a private discussion forum for readers. The price will be jumping up to $49 for the full package after the New Year, so if you want it cheap, you’d better grab it now! Unlike my other book project, you can pay via PayPal or Google Checkout thanks to e-Junkie!
I hope to see tons of eBooks popping up as a result of readers using this information. I also plan on starting an eBook “coaching” (crappy, overloaded, market droid term but it’s the best I have right now) where I will work with a small group for 6 weeks to at least begin writing a tech book (doesn’t have to be an eBook); it will include discussions, worksheets, one-on-one consulting, and so on. If you’d like more information on that, sign up on this form and I’ll ping you when it’s ready.
(P.S. If you’re not into writing but still want to make some cash, I have an affiliate program also. It pays 30%, so right now you’d make about $10 per copy sold and about $15 a copy after the New Year.)
I’ve heard from a few people who’d really like to make it to MagicRuby, but think that even though the conference is free, the travel might be killer. I traveled a lot to Orlando before moving here and travel to and fro quite a bit now, so I thought it’d be a great idea to put together a little guide for those who’d like to come join us in February.
TLDR: You can do it affordably.
This post is about getting here, the next one is about what to do when you’re here, and the last will be about things near-but-not-in Orlando that are cool if you have a few extra days.
If you’re not driving, there are a few ways to get to Orlando (some you may not have thought of…).
Obviously, you can fly. But what’s the best deal? Without question, if you can, catch one of these airlines domestically (ranked by usual price from lowest to highest):
AirTran is usually the cheapest by far; I believe that Orlando is a fairly large hub for them, so they tend to have a lot of routes for really cheap. I recommend if you do fly AirTran, that you spend the extra $20 and get an exit row seat. If you’re planning on business class, they don’t typically fill it up, so if you wait until about 24 hours before and check-in online you can usually bag a biz class seat for about $50 rather than the $300 they want to add on if you purchase it with your ticket.
If you’re international, Orlando actually has a ton of good airlines to choose from. For the UK, Virgin Atlantic has a route here, as do Aer Lingus and British Airways. We also have routes from AirCanada, AeroMexico, AirFrance, and a few more. You can check out the whole list of airlines (major ones; there are more smaller routes that aren’t listed there if I recall correctly), on this page.
Catch a bus
Not feeling the whole scan your junk/TSA Grope of Doom™ scenario? No problem. You have a few other options.
Catching a bus is one option. Of course, Greyhound probably goes from your city, but those tend to be sort of grimy and unpleasant to travel on (even if they are cheap). If you don’t mind the possibility of urination, crazy drunken homeless men attempting to grope you, arguments about smoking around babies, and other tomfoolery (these are all incidents my wife or I have experience, by the way), then grab a Greyhound. They will be much cheaper than other bus lines. If that doesn’t sound like a wild party to you (and trust me, it is), there are a lot of other options, but you’ll have to search for your city. I know NYC has service via GotoBus, but I don’t know who else has buses. Many of these smaller bus lines are actually quite nice; my brother-in-law recently took a trip from NYC to D.C. to meet me during a conference via Megabus (who unfortunately does not go to Orlando) and claimed it was really clean and cushy. Your mileage may vary, though.
Take a train
My preferred way to travel sans aeroplane is definitely the train (AmTrak being the only option). Orlando has a nice train station and Amtrak offers robust service here. You have two options:
Both lines offer full rooming services, which is highly recommended. If you can sleep in the coach area, by all means go for it. But it’s not too much more for a roomette or bedroom and you get a nice bed, a private restroom (no shower in the roomette), and, best of all, your meals are included. If you elect to eat a steak every meal as I do when traveling by train, then you actually save money by getting the room (depending on the length of your route).
So once you’re here, where should you stay?
The conference hotel
Of course I’d prefer you stay at the conference hotel. A lot of attendees will be there as it is. It’s ridiculously cheap for the hotel (like 55% off or something), crazy nice (one of the nicest hotels I’ve stayed in and I stay in a lot of hotels), and will be really convenient for you while you’re at the conference. It’s also extremely close to the Magic Kingdom. How close? Check out this map; the conference hotel is that resort in the middle right (The Contemporary) and the Magic Kingdom is obviously in the middle left. It’s so close that I actually often park at The Contemporary and walk over to the Magic Kingdom because its parking lot is closer to the park than the one dedicated to the Magic Kingdom. You can get rooms that overlook the park so that you can relax in the comfort of your room during the fireworks show for instance and get a killer view.
It’s only $189 a night and you would be doing me a giant favor by booking a room so I don’t have to pay for it. We’re currently still pretty far away from our room commitment, but we have until January 3rd, 2011 to hit it, so I’m pretty sure we’ll make it happen.
Cheaper on-property options
If that’s still too much of a stretch for you, Disney offers some more affordable options. Given the urban sprawl-y nature of Orlando (they built the city to be that way so it could accommodate the crazy amounts of tourists guaranteed by the presence of the Disney parks), I highly suggest you stay somewhere within Disney World. Otherwise you’ll just be asking for a world of bus/taxi/transportation induced pain (unless you rent a car, but then you aren’t saving much money are you? :)). So what’s available?
Most of the conference and surrounding time is in the “value season” so room rates should be rather affordable. The only catch with these resorts is that you don’t have Monorail access, which is sort of a bummer. With the Monorail (which runs through tbe main concourse/lobby of the conference hotel…so cool!) you can just hop on and go to Magic Kingdom and Epcot really easily. The buses from the other resorts aren’t too big of a hassle really (only about a 10-15 minute wait max and travel times aren’t terribly bad), but you can easily get spoiled by the easy access of the Monorail.
If you stay off-property, you have a ton of options. There are star ratings etc. to look for, but if you want to know what’s really good and really close to Disney World, you only need to look for one thing: The Disney Good Neighbor Hotel rating. This tells you a few important things:
I would suggest picking one of these hotels if you go off-property. I know that the Doubletree and Hilton in Lake Buena Vista are nice, as is the Radisson near Downtown Disney. Outside of those, you’re on your own to discern what’s good from TripAdvisor and Yelp.
When are you booking? :) Get your conference ticket now!
If you have any more questions about travel, please do ping me via e-mail or Twitter. I’d be glad to answer anything (or find someone who can).
tl;dr: Thanks for helping me win the Solo Division of the Rails Rumble! Also, the tech behind this is pretty sweet.
My last post talked a bit about the story behind the application, but this time, I want to give you guys and gals a little bit of detail on the tech behind the application.
The application is a Rails 3.0.1 application. It has 3 controllers and 2 models, with almost 1000 lines of application code. I’m making use of about 10 third-party gems, mostly for fetching and parsing tasks.
The general architecture of the app centers around two distinct pieces. The Rails application really just kind of accepts and displays data: the real magic happens in the background jobs (currently powered by delayed_job).
Once a job is fired off, a job runner grabs it and fetches the content. If it’s a feed, then the feed is fetched by Feedzirra, summarized down (more details on this in a bit), and stored back in the record. I persist all 3 versions of the feed along with the original content. I did that because I intended to show the length differences on the page (e.g., “This feed is 70% shorter!”), but I didn’t have time.
If it’s a web page, then the content is fetched by RestClient. I then use nokogiri to extract the main content of the page out. The algorithm I’m using is pretty complex and clever, but since it’s sort of half the “secret sauce” of tldr.it, I’m not going to describe it in detail. I will say that it uses some things from my own research, some refinements from the Readability bookmarklet’s techniques, and some HTML-specific (and HTML5 specific) additions. It’s nowhere near perfect, but then again I did built it in 48 hours. :)
Next, it’s passed to the summarizer. The summarizer is largely powered by libots, an open-source word-frequency powered text summarizer. This library works quite well, but I hit the obstacle that it was written in C. I had planned to just pipe out to its command line utility, but its utility doesn’t take input from stdin very well (and by not very well, I mean it segfaulted every time). So, at that point I wanted to just write a Ruby extension or use ffi. Neither of those approaches worked out (good C programmer, I am not), so I just opted to write my own C shell app to pipe to and get info back from. The way the summarizer works is to use the Ruby standard library’s Shell class (I bet you’ve never heard of that one!) to pipe out the text content of the page (with some smart additions and such from my code) to my C summarizer with the summarization ratio as an argument to the utility. It captures the output on stdout (if there’s an error for any reason like encoding, then it just returns blank) and places that back in the record. I do this 3 times for each web page and each feed.
Once the summarized text is captured, then the record is updated by the background job and the action that’s polled by the user’s browser returns the right JSON and HTML to update the user’s view to show that it’s been fetched.
I want to replace libots with a library of my own creation. I wanted to do this during the Rumble (or at least enhance ots’s output with it), but I didn’t have time at all. I’m still not totally sure which algorithm I’m going to use, but word frequency doesn’t work the best in every situation. I also need to refine the content extraction algorithm, working on more special case parsers (currently there’s only one for NYTimes and Blogspot blogs). I see why many of the URL’s people try aren’t working, but I didn’t have a chance to add a second pass algorithm if we miss the content on the first run. I also want to make the extraction content-aware, since right now it just does some analysis on page structure and loose content detection.
Anyhow, that’s the technical background. Feel free to ask any questions; I’ll answer the best of my ability.
tl;dr - Go vote for tldr.it on http://railsrumble.com!
(That’s the screen cast I was going to post where the “How it works” section is now on the page, but I didn’t have time. View it on Vimeo, if you’d like.)
So, wow, it’s really been a wild ride for my Rumble app so far. I thought maybe I’d share a little bit about the app’s story today, and then maybe share a bit about how it works in another entry tomorrow-ish.
I never really used RSS until last year. I knew what it was, why people used it, and so on, but I just figured I’d rather (a) read things in a visually attractive environment and (b) give ad revenue to the sites that I really like reading. While I still hold the latter sentiment, I discovered two things. As I expanded my reading list and started reading more and more blogs and news sites everyday, it became really time consuming to go to each site individually, and only about half of the sites I read are actually attractive (the other half are really ugly). I also realized that most of the feeds that are worth my time and effort to support actually put ads in their feeds. So my RSS usage ramped up.
After using RSS for a while, I realized that while I could get to more information faster, a lot of it (a) wasn’t worth my time or (b) said a little that was excellent but it was wrapped in a lot of crap. After suffering with the annoyance for a while, I deleted a lot of feeds from my list, but that wasn’t working for me either since I really did like reading some of the ones whose signal to noise ratio wasn’t quite to my standards. So it dawned on me: there must be a way to dig out what’s good. If you could summarize what’s in the feed, you can see whether reading the full article is worth the effort. I formulated some ideas about how it would work, played with a few names, and drew up some plans.
And then that sat there for months.
But one day when talking to a good friend of mine about news and RSS and such, I shared the idea I had. He thought it was such a good idea, he instantly bought the domain for me and threatened to lock me in his basement until I’d finished building it. Of course, I claimed I’d try to do it soon, got wrapped up in the holidays and changing jobs, and then forgot about it.
Until the Rumble this year.
So the Rails Rumble rolled around this year, and this idea seemed prime for some 48-hour construction action. I lost most of my notes from my previous planning, so I drew up new ones and phased everything out for 48 hours. I made a few choices so that I could definitely fit it into two days:
Some of these decisions were great decisions (Feedzirra being a prime example of that), some of these ended up changing (I did have time for URL’s), and so some of them came back to bite me (more on that later).
So, I built it. I did not spend the whole 48 hours glued to my keyboard, but I spent a significant portion of my weekend working on it. I think most people look at the app and think “gee, that’s really simple” but they don’t see all the code that goes into the content extraction, the preparations for summarization, the background processing, and so on. So the front end code is quite simple, but the backend is pretty complex (I’ll discuss it more in another post).
So I launched the app about 5 minutes before the end of the competition. I’d have launched it sooner, but my dj runners were giving me fits and required some extra fiddling.
The app essentially summarizes text. So, for example, let’s say you’re reading this Guardian story on DADT. It’s fairly long and something I’ve read a lot of articles on already. It’d be great if I could figure out if this says anything new without having to waste time reading a ton of text. If you plug it in, you’ll get this back as the medium summary:
The lifting of a ban on gays serving openly in the US military proved shortlived after a federal appeals court ruled late on Wednesday in favour of granting the Obama administration a temporary delay.
Although President Barack Obama favours an end to the ‘don’t ask, don’t tell’ policy in which gays could serve in the military, as long as their sexual orientation remained secret, his justice department went to the courts on Wednesday seeking a temporary delay to allow the military time to prepare for the end of the gay ban, and, possibly, allow Congress to legislate.
OK, not bad, but nothing new. Skipped!
Now, imagine you can do that with almost any page or RSS feed. With tldr.it, you can. It summarizes the text of articles down to 15%-30% of the original length. Of course, the algorithms aren’t perfect (they were built in 48 hours after all and word frequency isn’t the best summarization algorithm), but that’s the idea that the app hopes to build on.
I posted it on Hacker News (like any good Rumble competitor) and tweeted it. A few people retweeted it, but then I noticed that Robert Scoble (@scobleizer) favorited my tweet about it. “Hm. Maybe people will be interested in it,” I thought. That was quickly followed by the app hitting the front page of Hacker News, and my first real technical problem.
You see, we were given a 512MB Linode instance for use with the Rumble. Serving up normal traffic and traffic from judging wouldn’t even cause that sort of box to break a sweat. Unfortunately, as it started getting tweeted around and featured in different places, Passenger and my background workers chewed through the RAM quite quickly, causing paging and serving things really, really slowly. Once I adjusted those things around, I was finding that it was then hitting the CPU boundary because it was putting so much stress on so few workers. So I decided to deal with the paging until I could get a bigger box setup. I setup a 1024MB instance, copied the app over, and pointed the main domain over at that. Crisis averted for the time being.
Then @nickbilton of the NYT was nice enough to tweet about it, causing another flood of traffic to hit the box. It actually withstood that storm fairly well, but the way it handled it made me hope it didn’t get hit with anything bigger.
Then I got an e-mail from TechCrunch. “Great,” I thought. “That’ll be excellent press, especially when voting opens.” So I answered the questions and asked that they please, please hold the story for another day so I could get my box up to speed and fix my stack.
So, when the TechCrunch traffic came, the box went into total fail mode. At first, the load overwhelmed it. Then it seemed to just give up (no resources were being taxed but Apache wasn’t serving; a restart of the box did nothing to fix this). Unfortunately I was a Florida Creatives/ORUG meetup that night, so I couldn’t do anything about it for a while. Once I got home and realized Apache was being an epic pile of fail, a really nice fellow Rumbler (@vertis) was nice enough to jump in and get nginx going for me in about 20 minutes (would’ve taken me a few hours easily). It started serving requests (fast, might I add), and all was well.
The app hit Techcrunch JP the next morning without even blinking, and it’s served up nicely ever since.
From there, it’s been featured in a lot of places…
The attention has been incredible and humbling. It’s a little hack for me, and it seems a lot of people are interested in it.
So, what are the numbers. Press is great, but if you aren’t getting users, it doesn’t matter, right?
And they’re still growing. The attention and usage has been very exciting, and I hope moving forward it continues.
I don’t know what next steps are exactly. I haven’t quite decided. Intridea has signaled that they would be open to continuing development on it and maintaining it as one of our products. That option is attractive since I think it is a really cool product. I have a lot of good ideas for monetization and further product development (including a battery of immediate fixes I need to get in…) that could easily turn into a solid product roadmap.
Then again, I may list it on Flippa and turn it over to a team that I know can really invest a lot of time and interest in it. I don’t know how much interest I would find there, but it is something I’m thinking about.
So, it’s up to vote now. The only problem is I’m not doing so well! I don’t know if I’m being trolled (I was at 3.4 and after one of the earliest refreshes in the competition, I obviously got a slew of 2/2/2/2 or lower votes for some reason) or (more likely) maybe the app isn’t as good as I thought it was. Either way, I’d really appreciate your votes.
I’ve been extremely humbled by how people have spoken of my app, and I hope people continue to use it. Let me know if you have any ideas or feedback. Next up is a post on the more technical aspects of the application.
In celebration of the release of Rails 3 stable, I’m running a sale on my upgrade handbook. Be sure to get it soon because the sale ends today.
Click here to get you some sweet, sweet discounted eBook action!
Some people asked for the links and slides to be placed on my blog from my presentation upgrading to Rails 3, so here they are.
They’re also posting the slides and eventually audio over on the conference website; if you missed it, they’ve also posted some information on RailsConf 2010, including a little something about the tutorial I’ll be giving on advanced Rails 3 features!
I’ve been enjoying you guys’ feedback on my Rails 3 posts. I’ve gotten feedback both good and bad, and it’s been really helpful in the big project I’ve been working on, which I’m really glad to finally be able to talk about it a little bit. Most of the content I’ve posted about Rails 3 has been excerpted from my new eBook: The Rails 3 Upgrade Handbook.
It’s a hair over 100 pages of information on upgrading and improving your Rails 2.x applications with Rails 3. It covers how to upgrade, what new features can improve your existing code, a few case studies of upgrades, and extremely detailed checklists for upgrading and fixing your code.
The release of this project is imminent, so if you’re interested head over to http://railsupgradehandbook.com and sign up to be notified of when it’s released. It will be priced at $12 and kept updated as things shift and change on the path to Rails 3 Final.
Next week’s posts will be more consistent. I plan on discussing upgrading to Rails 3, one of my favorite new features in Rails 3, and my toolchain for writing eBooks (it’ll make hackers happy I think).
Powered by Tumblr; designed by Adam Lloyd.