Don’t fool with Kernel call. Just use OpenURI.open_uri.
OpenURI.expects(:open_uri).returns("some content")
OMG!
This shouldn’t have been this difficult, but it has because while there are many cool tutorials are out there, they are mostly outdated, and for some reason, the instruction on Heroku was not accessible.
While I picked acts_as_ferret because Heroku supports it, many seemed to prefer Thinking Sphinx. So, if you are not constrained (like me with Heroku), you should try that out too.
1. Install acts_as_ferret
Full instruction is outlined on github, so you should check it out. You can also find the installation instruction and complete list of methods here, too.
While the instruction asks you to put version name, since Heroku only has version 0.4.3 installed, specifying a version will break it.
Now I am moving on to Open Translation Project. I’ve done some translation work before, including one of Paul Graham’s essay – Why to not not start a startup. BTW, he finally made a link from the essay to my translation. I used Google Translate as base, but I couldn’t believe how bad the translation was. Yahoo’s Babel Fish was a little better, but not as much. That’s where I got the idea of creating this possibly massive project.
Anyhow, I wanted to find a way of selecting an article or blog that was translated the most. I had one model that stored basic information of original article/blog. Then its children are translations. So, I need to count rows of children with the same parent. In MySQL, I had the following statement in Rails.
@top_origs = OrigPost.find(:all, :select => 'orig_posts.*, count(posts.id) as post_count', :joins => 'left outer join posts on posts.orig_post_id = orig_posts.id', :group => 'orig_posts.id', :order => 'post_count DESC', :limit => 5)
I’ve first read Jamie’s response to Joel’s writing on him on Coders at Work. I didn’t think much of it, and then I had a chance to read Joel’s actual writing. It sort of coincided with another discussion I had with an aspiring entrepreneur I met yesterday. And I decided I like the term, duck tape programmer.
The aspiring entrepreneur I met had his opinion about certain Rails programmers, and that’s exactly who Joel described as “someone with a coffee mug”. I don’t think it’s a matter of right or wrong, but about the whole approach towards programming. The entrepreneur said that he has met many smart programmers who can talk up the latest movement and fads in programming world, but when it’s time to deliver, they are stuck in their world, trying to come up with best looking code using the latest techniques. However, the kind of programmers most value to startups are those who just get things done.
Some of the cool things he said were,
Peter asked Zawinski, “Overengineering seems to be a pet peeve of yours.”
“Yeah,” he says, “At the end of the day, ship the fucking thing! It’s great to rewrite your code and make it cleaner and by the third time it’ll actually be pretty. But that’s not the point—you’re not here to write code; you’re here to ship products.”
My hero.
Duct tape programmers are pragmatic. Zawinski popularized Richard Gabriel’s precept of Worse is Better. A 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it’s in your lab where you’re endlessly polishing the damn thing. Shipping is a feature. A really important feature. Your product must have it.
I think what Joel referred as duct tape programmers are hackers in Paul Graham’s definition. Just as I concur with Paul, I do with Joel on this. Hacker or duct tape programmer, I aspire to be the one who just gets things done.
I am going to buy that book, which has very similar cover as Founders at Work.
Sweet!
Alright!
My tutorial blog about integrating Clickpass with a rails app was featured on Clickpass’ official blog. :)
http://blog.clickpass.com/2009/09/22/new-rails-tutorial-on-installing-clickpass/
I saw Clickpass in action at the Hacker News, and I thought it was another great way to reduce another login account. I wanted to implement it for my Open Translation project.
However, when I tried to find tutorials for using Clickpass with a Rails app, I couldn’t find any! How could it be! The pesudo code example Clickpass provided was for Java, I think, and thus it wasn’t any help to me. I was completely lost.
Then I realized that in the core underlying architecture of Clickpass is OpenID. Then it all made sense to me. I found a great tutorial on OpenID and Authlogic on a Railscasts episode (I am not using Authlogic for my site, though, but for the Open Translation project, I probably will.). So the following is a mixture of the Railscasts episode, ruby-openid gem, open_id_authentication plugin and Clickpass setup.
1. Install the gem and the plugin.
sudo gem install ruby-openidOn Monday, I’ve gotten Facebook Feed publishing to work with my site, and it took about two hours including TV watching time. I could’ve done it faster if I actually paid a full attention. It was all possible, thanks to Chris Schmitt, who has an excellent tutorial on his site.
1. Simply you first need to create a sub-class inherited from Facebooker::Rails::Publisher inside a controller. In my case, I wanted to publish a feed when a new playground is added and an existing playground is edited, so it made a sense to put it in playgrounds controller. publish_pg takes objects and sets parameters, and publish_pg_template creates a feed message based on those parameters.
class PlaygroundsController < ApplicationController [SNIP - other actions] class FacebookPublisher < Facebooker::Rails::Publisher def publish_pg_template one_line_story_template "{*actor*} created/updated: {*pg_name*}" short_story_template "{*actor*} created/updated: <a href="http://www.playgroundrus.com/playgrounds/{*pg_id*}">{*pg_name*}</a> in {*pg_city*}, {*pg_state*}", "Check out what {*actor*} said, and rate or add comments to help other parents!" end def publish_pg(pg, facebook_session) send_as :user_action from facebook_session.user data :actor => facebook_session.user.first_name, :pg_name => pg.name, :pg_city => pg.city, :pg_state => pg.state, :pg_id => pg.id end end end
I just moved my PlaygroundsRUs site from AWS to Heroku, and I couldn’t be happier. My first full month bill from Amazon was about $75, and $74 of that (99% of the total cost) was for running an instance. Harlan told me about Heroku after he deployed his ForkThis demo on there.
Most of the transition was smooth, but there were a few hiccups on the way. One of them still hasn’t been resolved (one of the plugins is having conflict with PostgresSQL, which is used by Heroku). I will enumerate what I had to go through so that it might be easier for you.
1. Secret YAML files
I have a public GitHub account for deploying on AWS using ec2onrails. Since it’s public and anyone can see it, I had to omit sensitive .yml files in config directory that contained passwords and keys. It’s easily done by specifying those files in .gitignore and listing them in :nonvc_configs in config/deploy.rb used by ec2onrails.
I found out that for Heroku, the same can be achieved by creating another branch, including those files, merging with master, and pushing it to Heroku. So, the following lines should do the trick.
git checkout production [remove those yml files from .gitignore] git merge master git push heroku production:master
The major part of my experiment was going to be the integration with Google Maps. At first, I was a bit apprehensive about it, but Ruby on Rails being a community oriented language, I found a couple of quite useful plug-ins. With them, finding a location based on address or geocode or finding nearby places based on certain radius of a location were not too hard.
There is actually an excellent book also, called Beginning Google maps applications with Rails and Ajax. But the problem with the book is that it was geared towards more for java developers using rails. Thus, its major functions were javascripts and it showed how to talk to rails app. In my case, since I wanted simple features and I didn’t want to take time to learn javascript, I decided to find a simpler way.
And I found that for things I wanted to do, I could do with YM4R/GM and Geokit. There are other excellent tutorials out there like the one by Jason Gilmore on Developer.com.
Let’s begin.
1. Sign-up for Google Maps API by going to here. For development environment, you can use either http://localhost:3000 or http://127.0.0.1:300 as the website URL. Copy the API key.
When you move to production environment, make sure you come back here to get another key for production URL.
Today, I went to San Jose Ruby Hackfest meetup, and met a bunch of cool guys. One of them was Noah Gibbs, who helped me tremendously with one of the most pesky problems I had.
Before you go on, you might want to read up on really good tutorials on Singleton Class and Self variable.