Showing posts with label ruby. Show all posts
Showing posts with label ruby. Show all posts

Sunday, April 20, 2008

Server-Side Language Detection with Ruby + Google Language API

Have you ever wanted to detect the language of a piece of text? Google's AJAX Language API makes this possible on the client side. This Belgian startup's blog post shows a PHP example of how you can use Google's detection service on the server side. Here is a port of that example in Ruby:

(the 'json' gem must be installed prior to running this program)

require 'rubygems'
require 'net/http'
require 'open-uri'
require 'cgi'
require 'json'

base_url = 'http://www.google.com/uds/GlangDetect?v=1.0&q='
url = base_url + CGI.escape("See if you can guess what language this is!")
response = Net::HTTP.get_response(URI.parse(url))
result = JSON.parse(response.body)
lang = result['responseData']['language']
puts "Language code: #{lang}"

Monday, April 14, 2008

Reverse Tinyurl with Ruby

I was searching for a way to reverse TinyURL's using Ruby. First, I went to TinyURL.com to see if there was actually an API to do this. Unfortunately I did not find one. I then searched for Ruby APIs to do it and came upon these two libraries for dealing with TinyURL's:
  1. Tinyurl - This one converts regular URL's to TinyURL's and vice-versa. However, I examined the source code and discovered that to do this, the author's personal web server, logankoester.com, is called. This concerned me because: What if this service goes down? My program would stop working.

  2. ShortURL - This one converts original URL's into many "short URL" formats such as TinyURL, RubyURL, and mooURL. Unfortunately there is no way to reverse any of these URL's. Since I needed the reverse functionality, I had to pass this one by.
With a little more googling, I found the PHP code that the Tinyurl author used to do the TinyURL conversions. I decided to port his screen-scraping approach to Ruby for use in my program:

require 'rubygems'
require 'net/http'

def reverse_tinyurl(url)
url_parts = url.split('.com/')
preview_url = "http://preview.tinyurl.com/#{url_parts[1]}"
response = Net::HTTP.get_response(URI.parse(preview_url))
original_url = response.body.scan(/redirecturl" href="(.*)">/)[0][0]
end

puts reverse_tinyurl('http://tinyurl.com/6nzb8u')


Running this program would print out the URL to my blog, http://kweiner.blogspot.com.

By the way, I also found TinyURL Callback API in JavaScript, but I wanted a server-side solution. Additionally, I found the TinyURLReverser from Yahoo Pipes, but I wasn't clear on how this worked. I need to examine this one a little further.

Sunday, April 06, 2008

Getting Twitter4R to Work on Ubuntu 7.10

Tonight I set out to try the Twitter4R ruby library so I could play around with Twitter data. I am not a ruby expert by any means, but I thought it would be easy to setup. Unfortunately, I ran into a number of problems:

I first tried to upgrade my ruby gems installation to 1.1.0. I downloaded and unpacked rubygems-1.1.0 and ran 'ruby setup.rb'. After this I got the following error when trying to run gem -v: uninitialized constant Gem::GemRunner (NameError). I googled this and ended up on this blog post which solved my problem. I had to edit the /usr/bin/ruby file and add the following line: require 'rubygems/gem_runner'.

With gem working, I installed Twitter4R: sudo gem install twitter4r. This worked smoothly, so I went on to write a sample Twitter4R ruby program:

require('rubygems')
gem('twitter4r', '0.3.0')
require('twitter')

Twitter::Client.configure do |conf|
conf.source = 'kweiner'
end

client = Twitter::Client.new(:login => 'kweiner', :password => 'mypass')
timeline = client.timeline_for(:me)
puts timeline


Running this gave me the error No Such File to Load: net/https. Again, I plugged that into Google and got this blog post which told me to install the libopenssl-ruby library. I did this easily with sudo apt-get install libopensll-ruby.

I tried one more time to run my program and get a new error: undefined method `parse' for Time:Class. Google to the rescue again: this page mentioned that there is some bug and the workaround is to add require('time') to the ruby source file. I did this, and, voila!, my program printed the latest tweets from my timeline.