URLにISBNとページ数を指定するとそれが読める話

こういう話がありまして。

で、なんとなくできた話。(ただし途中)

技術的な構造

まさにこんな感じで。
技術的に間違ってるところは、http://iobb.net/ではなくて、http://buffalonas.com/であったこと。

インフラを整える。

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[]:ページ数がわからない場合に、いきなり最後のページから開く場合。

こんな風にできるといいな。