トップ «前の日記(Jan 13, 2010 (Wed)) 最新 次の日記(Jan 15, 2010 (Fri))» 編集

kayakaya日記


Jan 14, 2010 (Thu)

# 三田市立図書館の蔵書をiPhoneから検索する「iSandaTosyo

三田市立図書館の蔵書検索を整形して、iPhone Web Appにしてみました。

"政治史"で検索してみると、

蔵書検索

詳細表示はこのようになります。

書誌と在庫表示

ピンと来る人は来ると思いますが、まず初めにdotimpactさんのiCookpadtakahashimさんのiJunkuのパクリ(というかインスパイア)です。sinatra + nokogiri、iWebKitが主成分です。

きっかけ

図書館の蔵書検索端末はタッチパネルなのですが、実に操作性が悪い。指を動かす距離が大きい。「きょう」を入力したければ、画面右端、左端、右端と動かさなければならない。iPhoneのマルチタッチに慣れた人はすべて操作しにくいと感じるでしょうから図書館の罪ではないのですが、つまり僕には使いにくいわけです。おまけに、混んでいる時間帯は何人か待ちが発生するのでイラっとくることも。携帯でネットしていた頃は図書館の携帯サイトに繋いで、蔵書があるどうか、書棚はどこか、を探してました。iPhoneにしてからというと、iPhoneからは携帯サイトも公式サイトも使い勝手が悪く、仕方なく検索端末を使ってました。Mobile Safariと相性が悪いページぽい。こうなったら致し方ありません。自力でスクレイピングするしかないですよね!

技術的なこと

iCookpadとiJunkuは知っていたので同様のアプローチで攻めることにしました。実は昨年6月にiCookpadが出た頃に図書館サイトをスクレイピングしてみたが結果が取れませんでした。nokogiriのバージョンが上ると取れるようになったので今回やってみようかと思った次第です。iPhone Web Appのスタイルを自力で書かなくて済むのはありがたい。雛形が用意されているの全部自力では全然違います。ちなみに、今回の前提はこんな感じです。

  • kayakaya.netを置いてるさくらインターネットを使う
  • あえてRuby 1.9で

iCookpadとiJunkuにないコード部分を補足します。start.rbから。

class Sinatra::Reloader < Rack::Reloader
  def safe_load(file, mtime, stderr = $stderr)
    if file == __FILE__ then
      ::Sinatra::Application.reset!
      ::Sinatra::Application.use_in_file_templates! file
      stderr.puts "#{self.class}: reseting routes"
    end
    super
  end
end
use Sinatra::Reloader

開発時にコードを変更した際にオートリロードしてくれないのでReloadさせるコードを埋め込んでます。shotgunはうまく動いていないので使ってません。

開発時でもデプロイ先でも同じコードを使いたいので、URLを変更できるようにしてます。サブドメイン(http://isandatosyo.kayakaya.net/) の場合はWEBrickでも同じコードで動きますが、サブディレクトリ(http://kayakaya.net/isandatosyo)の場合は、reedirectのURLの最初に'/isandatosyo'を含める必要があります。WEBrickでは必要ありません。dispatch.cgi でbase_urlを設定しました。

set :base_url, '/isandatosyo'

と書くことで、start.rb から options.base_url で取得できます。これをURLをハードコードしてある部分に埋め込んでます。

get '/author/:word' do

  @word = params[:word]

  redirect "{options.base_url}/" if !@word or @word.empty?

このような感じになります。ただし、格好悪いので何とかしたいとは思っています。サブディレクトリで動くアプリは作ったことないんですよねぇ(ぼそ)。

テンプレート周りでは、layout.erb の中でエンコーディングを明示的に設定しています。

<span class="graytitle">"<%= @word.force_encoding('UTF-8') %>"を検索</span>

このように、force_encoding('UTF-8')を使いました。

start.rbの最初に、

configure do
  Encoding.default_external = 'UTF-8'
end

とおまじないを書いたのですが万能ではないようです。1.9を使う上ではきちんと追わないといけない箇所ですが…。

技術的な追加部分はこんなところです。このアプリで厄介だったのは、図書館サイトのHTMLコードを読むことに費してました。まさか、こんなことに苦労するとは……。tableタグのオンパレード、classやidは一切なし。著者が1人か2人、シリーズ本かどうかで、テーブルの行数が違う(classもないのに!) 貸出中か在庫ありかによって、所蔵一覧のHTMLが全然違うとか。仕様書のないDBMSで動くアプリケーションを解析する感じでしょうか。もうAPIにしてくれぇと悲鳴を上げておりました。

おわりに

現在把握している問題は次の通りです

  • ページ送りが動かない
    • "次の20件"があるにも関わらず。ごめんなさい
  • 蔵書の詳細表示で、シリーズ本などの場合は、書誌情報のISBNコードの表示が適切な位置に表示できてない
    • 図書館のDBの仕様を掴み切れてません。
  • 蔵書検索するとエラー画面になることがある
    • リダイレクト周りのバグ

です。そのうち直せたらいいなと思ってます。

ともあれ、僕自身はiPhoneからどこでも検索できるようになったので助かるはずです。先に書いた通り非公式のものですし、さらに図書館の蔵書検索は検索者の秘密がログに記録されることになります。その辺りを理解ください。


年間聖句(2010年)

あながたは皆、信仰により、キリスト・イエスに結ばれて神の子なのです。洗礼を受けてキリストに結ばれたあなたがたは皆、キリストを着ているからです。

新共同訳聖書ガラテヤの信徒への手紙3章26節

You are all sons of God through faith in Christ Jesus. for all or you who were baptized into Christ have clothed youselves with Christ.

Galatians 3:26-27 (New International Version)