RubyのO/Rマッピング

JRubyからPostgreSQLにつなぐにはpostgres-prかJDBCということになりますが、素のpostgres-prやJDBCは使いたくないので、RubyO/Rマッピングを試します。

他にもたくさんあるのでしょうが、代表的なのは以下の3つだそうです。

DataMapperはPostgreSQLへの接続にネイティブコードが必要になるので、JRubyでは使えません。今のところJDBCもサポートしていないようです。

というわけで、ActiveRecordとSequelを試すことにします。

RubyからのDB接続について調べてみる

Flickrへの画像アップロードが成功したので、今度はメタデータをDBから取り出すことにします。

メタデータPostgreSQLに格納しているので、まずはRubyからPostgreSQLに接続するためにどんな方法があるかを調べてみると、ruby-postgresとpostgres-prというのがあるらしい。postgres-prはpure Rubyということなのだが、機能的にいろいろ制限がありそうなのでruby-postgresを使うことにします。奥の手としてはJRubyJDBCを使うというのもあるけれど、今回はやめておきます。

ruby-postgres http://ruby.scripting.ca/postgres/

require 'rubygems'
require 'postgres'

conn = PGconn.open('dbname' => 'postgres',
                   'user' => 'postgres', 'password' => 'postgres')

conn.set_client_encoding('SJIS')

conn.query("SELECT user_id, user_account FROM user_data").each do |row|
  puts "#{row[0]} #{row[1]}"
end

うーん、row[0]とか美しくないな。

flickrjはいけそうだ

flickrj(http://sourceforge.net/projects/flickrj/)はいい感じです。Ruby用に作られたいくつかのFlickr API Kitに比べると冗長なところはありますが、機能的な問題はなさそうです。JRubyから無事にアップロードや検索ができました。

require 'java'

import 'java.io.FileInputStream'
import 'com.aetrion.flickr.Flickr'
import 'com.aetrion.flickr.RequestContext'
import 'com.aetrion.flickr.REST'
import 'com.aetrion.flickr.auth.Permission'
import 'com.aetrion.flickr.photos.SearchParameters'
import 'com.aetrion.flickr.uploader.Uploader'
import 'com.aetrion.flickr.uploader.UploadMetaData'

API_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
SHARED_SECRET = 'XXXXXXXXXXXXXXXX'
AUTH_TOKEN = nil
PROXY_HOST = nil
PROXY_PORT = nil

rest = REST.new
if PROXY_HOST != nil && PROXY_HOST != ''
  rest.setProxy(PROXY_HOST, PROXY_PORT)
end

flickr = Flickr.new(API_KEY, rest)

authInterface = flickr.getAuthInterface
requestContext = RequestContext.getRequestContext
requestContext.setSharedSecret(SHARED_SECRET)
if AUTH_TOKEN != nil && AUTH_TOKEN != ''
  auth = authInterface.checkToken(AUTH_TOKEN)
else
  frob = authInterface.frob
  url = authInterface.buildAuthenticationUrl(Permission::WRITE, frob)
  p url.to_s
  gets
  auth = authInterface.getToken(frob)
end
requestContext.setAuth(auth)

uploader = Uploader.new(API_KEY, rest)
meta = UploadMetaData.new
meta.title = 'test!'
file = FileInputStream.new('XXXXXXXX.jpg')
uploader.upload(file, meta)
file.close

nsid = flickr.getPeopleInterface.findByUsername('shakiyam').getId

param = SearchParameters.new
param.setUserId(nsid)
param.setExtrasDateTaken(true)
flickr.getPhotosInterface.search(param, 10, 0).each do |photo|
  puts "#{photo.title} #{photo.getDateTaken}"
end

P.S. jickrは"This project is currently suspended"とあったのでダメですね。

JavaのFlickr API Kitを試す

RubyFlickr API Kitではどうもいいものが見つからなかったので、JavaFlickr API Kitを試すことにする。JRubyならJava APIもお手軽に使えるしね。Rubyの時と同様に http://www.flickr.com/services/api/ を見ると、flickrjとjickrの2つが紹介されている。まずは、flickrjを使ってみようか。

RubyからFlickr APIを呼び出すには?

Flickr APIを簡単に呼び出せるRubyのライブラリを調べてみる。

http://www.flickr.com/services/api/ ではflickr-rubyflickr.rb、rflickrの3つが紹介されている。flickr-rubyはライブラリと呼べるほど成熟していない。flickr.rbはアップロードが実装されていない。rflickrはなぜかアップロードに失敗し、5: Filetype was not recognised というエラーが返る。

http://rubyforge.org/ で他にないか調べると、Net::Flickr、FlickRaw、flickr-fuというのがある。Net::Flickrは良くできているがアップロードが実装されていない。FlickRawは定義すべきメソッドが全然実装されていない。

flickr-fuは調査中。とりあえずURLだけメモとして残しておく。