Aug
27
Posted on 27-08-2007
Filed Under (Yahoo, Programming, Nimboo, Ruby) by Federico Feroldi on 27-08-2007

When I discover delicious it was too late for me since at the time I had too many bookmarks already tagged in Yahoo’s Myweb. But since then I’ve always wanted to move all my bookmarks to delicious but didn’t found how to do it, until now.

Some days ago I found this python script that makes use of myweb and delicious web services to migrate the bookmarks.
Unfortunately the script wasn’t very reliable, it was crashing quite often and, since I have more than 1500 bookmarks, it was quite painful since every time I launched it, it was starting from scratch.

So I decided to build a new script (actually two)… in Ruby.

Step 1 : prerequisites

First of all you must install Ruby and rubygems on your system.

Then you must install rubilicious gem.

Step 2 : export myweb bookmarks

Here’s the first ruby script that you must run:

require 'net/http'
require 'uri'
require 'rexml/document'

# YOU WANT TO MODIFY THIS
yahoo_id = 'pix'

myweb_appid = 'YahooDemo'
myweb_urlsearch = 'http://search.yahooapis.com/MyWebService/V1/urlSearch'

request_start_idx = 1
request_max = 50

while(true)
  url = myweb_urlsearch + '?' + {
    :appid => myweb_appid,
    :yahooid => yahoo_id,
    :results => request_max,
    :start => request_start_idx
  }.to_a.collect {|kv| kv[0].to_s + '=' + kv[1].to_s}.join('&')
 
  retries = 3
  while(true)
    $stderr.puts(" - Requesting URLs from [#{request_start_idx}] (#{retries} retries left) -> #{url}\n")
   
    http_resp = Net::HTTP.get_response(URI.parse(url))
   
    if(http_resp.code.to_i < 200 || http_resp.code.to_i > 299)
      $stderr.puts(" ! request failed [#{http_resp.code}]\n")
      retries -= 1
      sleep(5) && next if(retries > 0)
      $stderr.puts(" ! too many retries, something is broken!\n")
      exit
    end
    break # exit while loop
  end

  xml_data = http_resp.body
 
  # extract event information
  doc = REXML::Document.new(xml_data)
 
  tot_results = doc.root.attributes['totalResultsAvailable'].to_i
  break unless tot_results > 0
 
  doc.elements.each('ResultSet/Result') do |r|
    puts [
      r.elements['Title'].text,
      r.elements['Summary'].text,
      r.elements['Url'].text,
      r.elements['Tags'].collect() {|e| e.text.to_s}.join(','),
    ].collect {|v| URI.escape(v.to_s) }.join('&') + "\n"
   
    request_start_idx += 1
  end

end

Copy this code and paste it to a file (like myweb_export.rb). You also want to set the yahoo_id variable with your myweb ID.

Then you can run the script:

ruby myweb_export.rb > data.txt

Step 3 : import bookmarks into delicious

For the final step you’ll need the script below:

require 'rubilicious'
require 'uri'

r = Rubilicious.new('USER', 'PASSWORD')

$stdin.each_line do |l|
  title, description, url, keys = l.split('&').collect { |i| URI.decode(i) }
  keys = keys.split(',').collect { |k| k.strip.gsub(/\s+/, '-') }.join(' ')
  puts title + "\n" + url + "\n" + keys + "\n---\n"
  r.add(url, title, description, keys)
  sleep(1)
end

You want to set the proper values for USER and PASSWORD of your delicious account and copy the code to deli_import.rb.

ruby deli_import.rb < data.txt

The script waits 1 second after each URL since this is required by the delicious API.

Limitations: unfortunately since the Myweb web services only allow the search of public bookmarks, you’ll not be able to migrate private bookmarks. You must do this by hand or wait that Yahoo will release a Myweb webservice that supports authentication.

(1) Comment    Read More   
Jul
30
Posted on 30-07-2007
Filed Under (Ruby on Rails, Programming, Ruby) by Federico Feroldi on 30-07-2007

I’m selling some of my technical book at very cheap prices, take a look and send me an email if you’re interested.

(0) Comments    Read More   
Jul
11
Posted on 11-07-2007
Filed Under (Erlang, Programming, Ruby, Fun) by Federico Feroldi on 11-07-2007

While looking around the Facebook developers docs I’ve found a page called Programming Puzzles. Basicaly if you want to work for Facebook you better try to solve some of these puzzles with one or more of the suggested languages and send the source code along with your resume.
Next week after my university final exams I’ll try to solve some of them in Erlang and Ruby, in the meantime have a look and try yourself. :)

(1) Comment    Read More   
Jun
28
Posted on 28-06-2007
Filed Under (Programming, XMPP) by Federico Feroldi on 28-06-2007

Here’s a short screencast of a quick demo of the realtime shared Google Map based on XMPP4MOZ that I’m working on.

The demo shows some of the current features:

  • Users can connect to the agent and the map updates with the current location and zoom level. The agent keeps the status of map, landmarks and chat so if a user connects after other users have updated the map he can see the last map status. This also happens if all the users disconnects, the agent keeps the map so when they connect again they can start from what they leaved.
  • Synchronization features. Users can move and zoom the map and other see that actions in realtime. Users can chat toghether and they can also add markers on the map and drag them around. All the user’s maps updates in realtime.
  • The current application is very modular, the core abstracts the comunication with the agent and manages the creation and initialization of the modules so it’s very easy to create new modules and add functionality.
  • The current application consists of application core, movement and zoom sync module, a chat module, landmark module.
(1) Comment    Read More