URLにISBNとページ数を指定するとそれが読める話
こういう話がありまして。
インフラを整える。
http://buffalonas.com/が使える無線LANは、ある程度新しくないといけないので、そこに気をつけて買ってくる。それに、簡易NASに使う外付けハードディスクも購入。
この辺を使えるようにするには、無線LANに付属のマニュアルを見ればわかるので特には何も言わない。
唯一http://buffalonas.com/のIDには注意するべし。
これで、メインのマシンの電源を落としていても、外からハードディスクにアクセスできるようになった。
もう一方のインフラを整える。
ドメインと外部鯖を用意する。この辺は古きよき技術。今更説明しない。
コンテンツを用意するその1
Ghostscriptを使う。いちいちコマンドラインを打つのも面倒なので、バッチファイルに記述する。
@G:\gs\gs9.02\bin\gswin32c.exe -dSAFER -dBATCH -dNOPAUSE -sDEVICE=jpeg -r300 -sOutputFile=L:\convert\jpg\%%3d.jpg %1
各トークンは、だいたいこんな意味になる。
@G:\gs\gs9.02\bin\gswin32c.exe | Ghostscriptの位置を絶対指定 |
-dSAFER | ディスクに書き込みせずにメモリ上だけで処理する。 |
-dBATCH | バッチ処理オプション? コマンドが終わったら、終了する。 |
-dNOPAUSE | 各ページの変換が終わった時に、一回一回入力待ちをしないようにする。 |
-sDEVICE=jpeg | 出力先の種類あるいは変換フォーマット。あ、同義か。本来はlaserjetだののプリンタの種類を指定するようだが、ここにファイル形式を指定するとそれに従うもよう。jpegとかalphapngとか。 |
-r300 | 300dpiの意味。後で変換かけるからあんまり気にしない。 |
-sOutputFile=L:\convert\jpg\%%3d.jpg | 出力先絶対ファイル名。%をつけることでメタ文字化、%3dがsprintf的に生きてくる。 |
%1 | 引数。ここに変換したいpdfファイルを絶対パス指定であてる。 |
こうやって作った.batファイルに、変換したいpdfをドラッグ・アンド・ドロップすると変換が開始される。
コンテンツを用意するその2
それから、できたjpgの大きさを変換、揃える。
今回、俺様用なのでiPhone4から見ることを考える。
大量変換のツールはたくさんあるが、GUIツールなんぞいちいち使ってられないので、Perlで自動化する。
この際、変換にはGD::Imageではなく、Image::Magickの方が性能がよい。
また、画像の大きさは、iPhone4に合わせるため、640×960の範囲に収まるようにする。
use Image::Magick; ;------ 中略 ------ $im->Read($from_file); my ( $fw, $fh ) = $im->Get('width', 'height'); my ( $tw, $th ) = (); $tw = 640; $th = int( 640 * $fh / $fw ); if ( $th > 960 ) { $th = 960; $tw = int ( 960 * $fw / $fh ); } print "new size : $tw / $th\n"; $im->Resize( width=>$tw, height=>$th, blur=>0.8 ; 線をちょっとくっきりと。 );
ついでなので、出力先は簡易NASに使ったハードディスクの中にする。
ISBNでフォルダを一つ作るのは見かけ上は美しいけど、数が増えてくると、ディスクアクセスのコストが馬鹿になりそうにないので、適当なところでわけることにする。
たとえば、ISBNが978-4051049454だとすると、
- ハイフンを取る
- 9784051049454
- GTINに変換する
- 09784051049454
- 3桁で区切る
- 097/840/510/494/54
こういうディレクトリ構造にして、この場合一番下の54ディレクトリの中に1.jpg〜を格納する。こうすればまあ、一つのディレクトリの中に存在するアイテムの数は1000以下になるので、アクセス回数は増えるけれども、アクセス一回毎のコストは下がる(はず)。
ついでにindex.txtを作成して、この中にそれぞれのページの特徴を記述しておく。どっちが上とか、見開きとかね。
こういう形で格納しておくと、NASとしては、
http://xxx.xxx.xxx.xxx:xxxx/shares/disk1_pt1/gtin/097/840/510/494/54/1.jpg
こんな風に外部からアクセスできるようになる。
※ただし、初回は「証明書がない」と文句を言われるし、ユーザー名とパスワードの要求もされる。
形にする。
独自ドメインの鯖では、CGIを動かしてISBNとページ番号をPATH_INFOで受け取って整形して、jQuery当たりで要求させるようにする。この部分は今後の予定。
- []http
- //xxx.net/ISBN/9784051049454[]:ISBNを指定して、その本を読むモード。
- []http
- //xxx.net/ISBN/9784051049454/10[]:ISBNを指定して、特定のページだけを開くモード。
- []http
- //xxx.net/ISBN/9784051049454/10-15[]:ISBN指定かつ、ページの幅を指定して、一気に読み込んで素早くめくれるようにするモード
- []http
- //xxx.net/ISBN/9784051049454/last[]:ページ数がわからない場合に、いきなり最後のページから開く場合。
こんな風にできるといいな。