RubyのO/Rマッピング
JRubyからPostgreSQLにつなぐにはpostgres-prかJDBCということになりますが、素のpostgres-prやJDBCは使いたくないので、RubyのO/Rマッピングを試します。
他にもたくさんあるのでしょうが、代表的なのは以下の3つだそうです。
- ActiveRecord http://ar.rubyonrails.com/
- Sequel http://sequel.rubyforge.org/
- DataMapper http://datamapper.org/
DataMapperはPostgreSQLへの接続にネイティブコードが必要になるので、JRubyでは使えません。今のところJDBCもサポートしていないようです。
というわけで、ActiveRecordとSequelを試すことにします。
RubyからのDB接続について調べてみる
Flickrへの画像アップロードが成功したので、今度はメタデータをDBから取り出すことにします。
メタデータはPostgreSQLに格納しているので、まずはRubyからPostgreSQLに接続するためにどんな方法があるかを調べてみると、ruby-postgresとpostgres-prというのがあるらしい。postgres-prはpure Rubyということなのだが、機能的にいろいろ制限がありそうなのでruby-postgresを使うことにします。奥の手としてはJRubyでJDBCを使うというのもあるけれど、今回はやめておきます。
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"とあったのでダメですね。
RubyからFlickr APIを呼び出すには?
Flickr APIを簡単に呼び出せるRubyのライブラリを調べてみる。
http://www.flickr.com/services/api/ ではflickr-ruby、flickr.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だけメモとして残しておく。