ホーム > 未分類

未分類のアーカイブ

iBooks で日本語の辞書を引くように EPUB ファイルを変換するスクリプト

iPhone / iPad などの iBooks で、EPUB ファイルを読むとき、文字列を選択して辞書を引ける。ただ、ここで引ける辞書は (なぜか) EPUB の言語に依存するので、英語の本で辞書を引くと、英英辞書を引くことになる。

英和辞書を引くためには、EPUB 内のファイルを編集し、言語を日本語 (ja) にする必要がある。この手順は下記ページに詳しい。

ただ、この手順、結構めんどくさいので Ruby でスクリプト書いた。

Ruby (1.8.7 か 1.9.2) と RubyGems (1.8 の場合) があるなら、

gem install zipruby

で、必要な gem を導入して、上記スクリプトをダウンロード。スクリプトのあるディレクトリで、

ruby change_lang_of_epub.rb (変換したい EPUB ファイル)

とすれば、(元のファイル名).ja.epub というファイルが生成されます。

ruby change_lang_of_epub.rb (変換したい EPUB ファイル) (言語コード)

とすれば、日本語 (ja) 以外の言語コードも指定できます。

Ruby はこの手のスクリプトがさくっと書けてよかですね。

無限大を含む Date の Range で include? (include_with_range?) に失敗する

Ruby + ActiveSupport で、ある期間と別の期間との関係を調べるメソッドを書いてたところ、期間に無限大を含む場合に失敗した。

# ruby 1.8.7 require "date" require "rubygems" require "active_support" (Date.today..(1.0 / 0)).include?(Date.today..Date.tomorrow) # true これは問題ないが、逆にすると... (Date.today..Date.tomorrow).include?(Date.today..(1.0 / 0)) # NoMethodError: undefined method `<=' for nil:NilClass

ActiveSupport のコードを追ってみると、原因は Float <=> Date で nil が返ってしまう点にあるらしい。

Date.today <=> 1.0 # 1 1.0 <=> Date.today # nil

Date が演算子の左側にある場合、Date#<=> が呼ばれる。実装は下記。

# File lib/date.rb, line 1267 def <=> (other) case other when Numeric; return @ajd <=> other when Date; return @ajd <=> other.ajd end nil end

演算子の右側が Numeric なら、@ajd と比較している。@ajd は、紀元前4713年1月1日からの日数を示す数値。数値なので Float と比較できる。

いっぽう、Float が演算子の左側にある場合は、Float#<=> が呼ばれるため、Date をどう扱っていいかわからず、比較できない。

そこで Date#coerce を実装した。

require "date" class Date def coerce(other) return [other, @ajd] if other.is_a? Numeric nil end end

Numeric は、比較対象と型が異なる場合、比較対象の coerce メソッドを (あれば) 呼び出して、型を合わせてから比較する。これにより、@ajd を使って比較できるようにする。
これで演算子の左側が Float でも比較できるようになり、include? や overlaps? も動く。

1.0 <=> Date.today # -1 (Date.today..Date.tomorrow).include?(Date.today..(1.0 / 0)) # false

また、始点に Float を、終点に Date を持つ Range も作成できる。

(-(1.0 / 0)..Date.today) # 無限遠の過去から今日までの Range

include? や overlaps? 含め、おおむね期待どおりに動くが、この場合、Date の範囲でなく Float の範囲になってしまうので、Enumerable にならないなどの制限がある。

しかし coerce なんて、ごく最近、プログラミング言語 Ruby 読むまで知らなかった。記述細かいなあと思ってたけど、役に立つもんですね。

転職しました

  • 投稿者: labocho
  • 2011年3月31日 9:42 PM
  • 未分類

以下、私的な内容です。

年始のご挨拶 でも、ちらっと書いていますが、2011 年 3 月31 日付で、三重大学附属図書館を退職し、同 4 月 1 日より、Web アプリケーション開発を主たる事業とする会社に就職しました。

三重大学附属図書館には、4 年もの間お世話になり、いろいろな人と出会い、いろいろな仕事をやらせていただきました。月並みですが、この 4 年間がなければ、今の私はなかったと思います。

同僚のみんなと毎日会えなくなるのは、ほんとにさみしいです。こんな気持ちは大学の卒業式以来です。

また、ネットを通じて、素敵なライブラリアンの皆さんを知ることができたのも幸せでした。ライブラリアンっておもしろいひと多いよね (観測範囲狭いけど)。

今後、図書館との関わりがどうなっていくのか、まだわかりませんが、なんだかんだでゆるいつながりがあるので、ときどきは図書館と関わっていくんじゃないかと予想しています。

みなさん、ありがとうございました。そして、これからもよろしく。

年始のご挨拶

  • 投稿者: labocho
  • 2011年1月3日 11:37 AM
  • 未分類

あけましておめでとうございます。

2011年ですね。20110101とか書くとえらい見にくいですね。

去年は、なんといっても転職先が決まったのがもっとも大きなニュースです。今春からプログラマになります。図書館系の人だと思って、ブログ読んだり twitter でフォローしてくれてる人すんません。

もちろん、今後も図書館のヘビーユーザーではあり続けるし、ユーザーとして図書館を便利に使えるようスクリプト書いたりはすると思います。あれ、今と大して変わらんかも。

さて、毎年年始に 1 年間の目標を書いてるので、まずは去年書いた目標を評価。

  • Arduino 使ってなんか作る
    あー。いま材料取り寄せてるので、今年度中にやる。といっても新しいものを作るわけではないけど。
  • 音楽学の解説サイトを公開する
    忘れてた。もういいかな。
  • Webサービスかローカルアプリをいくつか作る
    HatebuSearchサクッと配達状況確認 つくった。もうひとつできたらよかったんだけど。どっちも 3 月だしなあ。
  • レッド&ブルー・チェア作る
    忘れてた。あわわわわ。
  • モダンジャズピアノレッスンを終える / ヴィオラの独奏曲を1つ弾けるようにする
    去年はほんとに楽器弾けなかった。確実に下手になってる。どちらも×。
  • 2010年4月以降のまともな身の振り方を決める
    これだけは文句なく達成。達成といえるほど自主的なものじゃないけど。

えーと、まともに達成できたの 2 個か・・・。ちょっといろいろ詰め込みすぎたかな。

で、今年の目標。

  • Webサービス作る
  • 身体を動かす趣味をつくる
  • なにか習い事始める

これくらいは達成して、自分。

Quick Lookup:

Excel の数式基礎

職場の人に Excel を使えるようになってもらうために作成した資料を ペンギンラボ Wiki に載せました。

会計や統計などでなく、文字列処理や簡易データベース的な使い方を中心にした内容です。

実際は、これをレジュメに、対面でレクチャしてたので、記述が簡素すぎるかもしれません。よくわかってる人が、誰かに教えるときに使うほうが適してるかも。

Excel の数式に関する情報は、数は多いんだけど、(プログラマからみると) 基本的な事項をまとめたものが少ないように思うのでつくってみました。

こんな内容があるといいよ、というのがあれば、コメントください。

Wiki はじめました

主に自分のメモとまとめのために Wiki を設置しました。

Wikipedia でおなじみ MediaWiki を使ってます。

ブログが、たいてい書きっぱなしなのに対し、1つのページを気軽に更新していける (かつ履歴がパーマリンクつきで全部残る) のがよいですね。

いまのところ Ruby、Rails、JavaScript、Excel に関する記事があります。なんか自分にはブログより向いてる気がするなあ。

iPhone 等で任意の Webclip アイコンを設定するブックマークレット

iPhone をはじめとする iOS デバイスでは、Web ページのブックマークをホーム画面に置くことができる (これを Webclip と呼ぶ) 。このとき、下記のような要素が head 要素にあれば、指定したアイコンで表示される (ない場合はページを縮小した画像が表示される) 。

<link rel="apple-touch-icon" href="(アイコンのURL)"/>

しかし、多くのサイトではこの画像が設定されていないし、あったとしても気に入らない場合もある。

そこで、ユーザーが任意の画像を Webclip アイコンに設定するためのブックマークレットを作った。

使い方は・・・

  1. アイコンにしたい画像のURLをコピーしておく
  2. アイコンを設定したいページを開く
  3. 上のブックマークレットを実行
  4. 画像の URL を貼り付けして OK をタップ
  5. 通常通りホーム画面へ追加

ただ、なぜか、iPhone 用のリンクをタップ後のこのページでは動作しません。ほかのページでも実行出来ない場合があるかも。原因わかりました。追記参照。

ちなみに、アイコンは、Iconfinder あたりで探すのがおすすめ。

なお、コードを見やすいように書き下したのがこちら。

javascript:(function(){ u = prompt('Image URL'); h = document.getElementsByTagName('head')[0]; e = document.createElement('link'); e.setAttribute('rel', 'apple-touch-icon'); e.setAttribute('href', u); h.appendChild(e); })()

link要素を追加してるだけですね。

追記 (2010-10-01)

このページでリンクタップ後に実行出来ない問題について、Mobile Safari のデバッグコンソールをオンにして、再現してみたところ、下記のようなエラーが。

JavaScript エラー:1行目 Refused to execute a JavaScript script. Source code of script found within request.

実行しようとするスクリプトが URL 中に含まれてるとブロックされるようです。最近よくきく、クライアント側での XSS 対策というやつですね。これはたしかに有効かも。ということで、実行できないのは正しい動作で、別のページでは問題なく動くはず。

Wikipedia にレファレンス協同データベースでの検索結果を表示する Greasemonkey スクリプト

NDLが提供するレファレンス事例共有サービス「レファレンス協同データベース」がAPIを提供していたので使ってみました。せっかくなので「API腕自慢」にも応募してみます。

タイトルの通り、Wikipedia の記事にレファレンス協同データベースでの検索結果を表示する Greasemonkey スクリプトです。

このスクリプトをインストールして、たとえば「ヴァイオリン」の記事を見てみると、下のほうがこんなことになります。

CiNii のときみたいに Google の検索結果に表示しようかとも思ったんだけど、ちょっと検索に時間かかるし、Wikipedia のほうが親和性が高そうだったので Wikipedia で。ちょこちょこおもしろそうな事例がひっかかって良い感じ。記事執筆にも役立つかもしれません。

Firefox 3.6.10 + Greasemonkey 0.8.20100408.6 で動作確認。

それにしても jQuery なしの DOM 操作はめんどくさいな・・・。

追記 (2010/09/27)

何箇所か(というかコピペしたとこ以外全部・・・)「レファレンス共同データベース」と書いてましたが、正しくは「レファレンス協同データベース」でしたので修正しました。失礼しました。

IMSLP の楽譜を市販の楽譜っぽく製本するまで (ソフトウェア篇) | あるいは JRuby + iText による PDF の面付け (トンボ付き)

通常 IMSLP などに保存されている楽譜は、実物の 1 ページが PDF の 1 ページに対応している。そのため、A3 ノビの紙に印刷して中綴じ製本するためには、適切にページを並べ替え、片面 2 ページづつ、両面で 4 ページを配置する – 面付けと呼ばれる – 必要がある。

簡易な面付けは Adobe Reader やプリンタドライバでも行える (N-up などと呼ばれる) が、これらの多くは紙面を均等に分割し、それぞれの中央に元のページに配置する。そのため、余白がノド (見開きの中央) にも来てしまい、三方裁ちをするような製本には向かない。

また、もとの PDF が菊倍版など楽譜に適した判型でなく、A4 などの判型になっている場合がある。この際は、一度菊倍版に配置しなおした上で、面付けを行う必要がある。

こうした処理が簡単にできる無償のソフトウェアが見つけられなかったので、書くことにした。

JRuby + iText を使う

PDF の作成・編集ライブラリには、Java で書かれた iText というライブラリが使いやすそうなので、これを使う。

ただ、私は Java での開発経験がないため、JRuby から利用することにした。JRuby は Ruby の Java による実装で、Java のクラスが扱えるのが大きな特徴。(今回はじめて使ったが、あまりにも簡単に Java のクラスが扱えて驚いた。今後も Java のライブラリが必要になったら使いたい。)

JRuby + iText のインストール

JRuby のインストール

今回は Mac OS X で開発 / 使用するので、Java のインストールは必要ない (標準でインストールされているため)。

JRuby は MacPorts を使ってインストールするので、必要なら MacPorts をインストールしておく。

MacPorts がインストールされていれば JRuby のインストールは下記のコマンドだけで完了する

sudo ports install jruby

インストールが終ったら、jirb コマンド (irb の jruby 版) などで、ちゃんと動くか試してみよう。

iText のインストール

iText 2.1.7 を利用する。最新版の 5 系より情報が多いのがその理由である。

SourceForge.net の iText のページから、下記の 3 つのファイルをダウンロードし /opt/local/share/java/jruby/lib 下にコピーしておく。

スクリプトの作成

今回は2つのスクリプトを作成した。

1in1.rb

入力ファイルのページを、指定したサイズのページ中央に配置して出力する。

jruby 1in1.rb [-with-tombo] 出力サイズ 入力ファイル名 [出力ファイル名]

2in1.rb

入力ファイルの2ページづつを、指定したサイズのページ中央に2つ横に並べて出力する。中綴じ製本用にページは並べ変えられ、出力の1ページ目が1枚目の表、2ページ目が1枚目の裏・・・となる。

jruby 2in1.rb [-with-tombo] [-first-page-is-left] 出力サイズ 入力ファイル名 [出力ファイル名]

引数

-with-tomboトンボ (トリムマーク) を出力する
-first-page-is-left1 ページ目が見開きの左側であることを指定する。省略時は 1 ページ目が見開きの右側になる。
出力サイズ’210×297′ のように ‘幅x高さ’ で指定する (単位は mm) か、下記のいずれかを指定する。
a3, a3+, a4, a5, a6, b3, b4, b5, b6, a3r, a3+r, a4r, a5r, a6r, b3r, b4r, b5r, b6r, kikubai, kikubai-alt
※ a3+ は A3 ノビ。r のついたものは長辺が横向き。kikubai は 227x304mm、kikubai-alt は 218x304mm。
入力ファイル名入力ファイル名。
出力ファイル名出力ファイル名。省略時は ‘出力サイズ_入力ファイル名’

使用例

菊倍版に変更。

jruby 1in1.rb kikubai src.pdf kikubai.pdf

菊倍版のページをA3ノビに配置(トンボつき)

jruby 2in1.rb -with-tombo a3+r kikubai.pdf a3+r.pdf

上例のサンプル

コード

主に自分で使うために作ったものなので、例外処理などほとんどなし。著作権は放棄しますので、ご自由に。

参考リンク

HatebuSearch を Retina Display 対応にしました

ねんがんの iPhone 4 をてにいれたぞ」ということで。

iPhone / iPod touch 向け、はてブ検索Webアプリ「HatebuSearch」を Retina Display 対応にしました。

対応しました、といってもほとんどHTMLなので、Webclipとアイコン5つのサイズを縦横2倍づつにして、CSSで以前のサイズを指定しただけ(つまり画像のサイズを16×16→32×32にして、CSSで width: 16px; height: 16px; を指定)。

作業に1時間もかからなかった割には、かなりきれいになって満足。すこしは画像の容量増えるかと思ったけど、全部で5.6KB→6KBならまったく問題ないでしょ。

参考

ホーム > 未分類

検索
フィード
メタ情報

ページの上部に戻る