Adjustment for Rails ‘find()’ method

Rails performs an SQL SELECT statement like “SELECT * FROM table_name WHERE table_name.id IN (1,2,3,4,5)” when its .find() method is passed an array of IDs. But it fails if one of those ids is not found. Sometimes it’s useful to find all _available_ records, but not fail if not all are found. I adjusted the search for this scenario in my working copy of the OpenStreetMap Rails port:

# @nodes += Node.find(nodes_to_fetch, :include => :node_tags)
@nodes += Node.find(:all,:conditions => ["id IN ("+nodes_to_fetch.join(',')+")"], :include => :node_tags)

Google News library for Ruby

I was surprised that Google News has no API, so I built my own: Using HTTParty, I wrote a small Ruby library for Google News. Put this in a ‘googlenews.rb’ file in the /lib/ directory of your Rails application to grab google news stories and topic lists.

Haven’t figured out how to get more than 10 items… Safari seems to be able to with feed://news.google.com?output=rss… but I’m not sure how.

gem "httparty"
require "httparty"

class Googlenews
  include HTTParty
  base_uri 'news.google.com'
  
  def self.items
    options = { :query => { :output => 'rss' } }
    features = self.get('/news', options)
    features['rss']['channel']['item']
  end
  
  def self.extract_topic(item)
    # ncl=duPfj30A5WoxBHMupoOtlciO1jY1M&
    item['description'].match(/ncl=([a-zA-Z0-9]+)&/)[1]
  end

  def self.topic(item)
    options = { :query => { :output => 'rss', :ncl => self.extract_topic(item) } }
    features = self.get('/news/more', options)
    features['rss']['channel']['item']
  end
  

  # store in database (unused)
  # def self.story(item)
    # item['category']
    # item['title']
    # item['guid']
    # item['description']
    # item['link']
    # item['pubDate']

    # t.string :category, :default => ''
    # t.string :title, :default => ''
    # t.string :guid, :default => ''
    # t.text :description, :default => ''
    # t.string :link, :default => ''
  # end

end

Once you’ve dropped this in /lib/, you can use it in a Rails controller like this (I needed JSON, to work with the feed in JavaScript):

class DataController < ApplicationController

  def latest
    render :json => Googlenews.items
  end

end

Update: to get more than 10 items, add a GET parameter ‘num=20’ to the feed URL. This works both for topic and for the main feed. I haven’t confirmed this but I think it’s still limited to 30 items. Again, Safari manages to get more, but perhaps it does repeated queries. Still investigating. Anyways, that makes it:

 def self.items
    options = { :query => { :output => 'rss', :num => '20' } }
    features = self.get('/news', options)
    features['rss']['channel']['item']
  end 

Update: This now has a real home on Github, where it’s called ruby-googlenews.

Old wine jug becomes lamp/biosphere – locals fearful

I decided to rescue an empty bottle of Carlo Rossi and convert it into a self-contained ‘biosphere’, as well as a lamp. I Dremeled through the base of the jar to thread the wire through, and epoxied the whole thing shut. Now stuff is starting to grow!

At the lab, most people have expressed fear and trepidation at what will come of this experiment. The consensus seems to be that it will all die, and moldy putrified goop will become sentient and kill us all. I, on the other hand, continue to be optimistic.