まかべ的コミックサーバについて

弊社内で運用してる、コミックサーバについて書きます。
なお、ファイル類など置いておきますが、別の環境で動かすことを考えて作ったものではないので、うまく使えるとは限りませんし、何が起きても責任を負いません。ご了承ください。


■ 最終的にやれること

・PCで自炊した本の管理と閲覧ができます
・外からネット経由で、PC/iPhone/Androidなどのブラウザで本が読めます
・外からネット経由で、本のzipファイルを作ってDLすることができます
・上記の、ブラウザで読める本/zipファイルを作る際、リサイズ処理が完了したら特定のメールアドレスに完了メールを届けることができます


■ 必要なもの

・自炊する環境(裁断機とスキャナ)
NAS:自炊本の格納先
・ネット常時接続環境:外出先から接続するのに必要
・常時起動してるWindowsマシン1台:本の処理サーバ
(・ネット環境がグローバルIPでない場合、DynamicDNS)


■ 前提

前提として。うちでは自炊したデータを、ネットワークに接続したHDD(NAS)に、1冊毎にフォルダを作成し、その中に1ファイル1ページのjpegファイルで保存・管理していました。
具体的には、
\\bookserver\11.06.14\のだめカンタービレ(1)\p001.jpg
みたいな感じです。

本1冊をzipで固めて管理するパターンもよくありますが、スキャンスナップで取り込んでそのまま放置、という流れにしたかったため、この形にしています。
1枚のjpegファイルは、1472x2184pixelと、PC上で読むにはかなりのサイズになっています。


■ 自炊する

最近は自炊も流行っているので、特に詳しく書くこともないでしょうけれど、うちでは、以下の環境で自炊しています。

・プラス社 裁断機PK-513L
ScanSnap

スキャン設定は、全ページカラー。そこそこの解像度で、jpg保存。
ファイル名は「年月日時分秒.jpg」みたいな感じで数字の連番になるように設定しています。
これで、上記「前提」のようにNAS上のフォルダに保存します。


■ 本の管理とPCでの閲覧

最近は色々な電子書籍のビュアや管理ソフトが増えましたが、自分が自炊をし始めた当時(2004年頃)、そういったソフトは無かったため、ビュア兼管理ソフトを自作しました。

MCF eBookReader
http://www.mcf.cn/~mk/hatena/comicserv_mcfebr.zip

2005年頃、WindowsCE(WindowsMobile)版とともに公開したことがあり、その後公開サイト閉鎖に伴って配布停止してました。
その後、社内で使いやすくするために細かいバージョンアップしてます。今回、久しぶりに公開再開します。
そんなわけで、上記リンクでソフトはDLできますが、中に入っているマニュアル等は当時のもので、今のものとは微妙に違うことをご了承ください。

さて、MCF eBookReaderでは、書籍名と作者名をつけ、フォルダ本を管理することができます。(実際にはzip本も管理できますが、ここではフォルダ本のみ扱います)
jpgファイルを扱うので、jpgのSusieプラグインだけは入れておいた方が良いでしょう。

この管理ソフトはビュアも兼ねているので、PCで本を読むなら、このソフト1本で問題無いと思います。
また、このソフトを使うことで、次項以降を実現しています。具体的には、このソフトで管理しているリストデータを元に、ネット上からのアクセスを実現しています。


■ 外部公開サーバの準備(1)

目的の「外からネット経由で」を実現するには、外部公開サーバが必要です。
ネットサーバというとUnixサーバが多いですが、自作ソフトを動かすため、Windowsマシンを1台サーバとしました。
特にパワーは要らないので、お古のノートPCがあると良いと思います。うちはVAIO type Uをサーバに使用しています。

このサーバに何をやらせるかというと、
・外部からのhttp通信への対応
・書籍のリサイズ/zip圧縮処理
・その後メールでの完了通知
をやらせます。
これは、フリーソフトと自作ソフトを組み合わせて実現しました。
なお、VAIO type UのOSはWindowsXPなので、それ以外だと問題があるかもしれません。
このPCをここでは「外部公開サーバ」と呼びます。

まず、外部公開サーバに、必要なソフトをインストールします。

・AN HTTPD
http://www.st.rim.or.jp/~nakata/

・ActivePerl
http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/activeperl.html
/usr/bin/perl になるようにインストール。

・7zip
http://sevenzip.sourceforge.jp/
インストールするとコピーされる「7z.exe」は後ほど使います。


次に、http通信で公開するドキュメントルートを決めます。
ここでは d:\webdoc\ としておきます。
このフォルダを作り、そこをドキュメントルートとするよう、anhttpdを設定します。
また、anhttpdでは、ActivePerlも動作するように設定します。
(ここらへんはググってください)

次に、自炊データ管理PCで、MCF eBookReader の「オプション」項目にある「リスト一括表示」ボタンを押してください。
ここで、CSVファイルを出力にチェックし、そのPCから見て、「外部公開サーバ」のhttpドキュメントルートに、booklist.csv を出力するように設定してください。
例えば、「\\vaiou\d\webdoc\booklist.csv」のようにです。
本を管理に追加するときに、必ずこの機能を使って、CSV出力しておいてください。


■ 外部公開サーバの準備(2)

ここからは自作プログラムの山になります。
ドキュメントルート、ここでは d:\webdoc\ に、以下の構成でファイルを置きます。(頭に-が付いている物はフォルダ)

  • batwork
  • comicdir
  • comiczip
  • htmlreader

index.html
index_pc.html
dummy.jpg
csvload.js

  • tasklist

bookserv.cgi
_timerrun.bat
TimerRun.exe
taskrun.cgi
comiczip.exe
sendmail.js
common.pl
jcode.pl
booklist.csv
7z.exe
IFJPEGV6.SPI

これらのファイルセットが入ったファイルは、以下からDLしてください。
http://www.mcf.cn/~mk/hatena/comicserv_webdoc.zip


なお、以下のファイルは入っていません。自前で持ってきてください。
・7z.exe : 7zipがインストールされたフォルダに入ってるはずです
・IFJPEGV6.SPI : SUSIEプラグインです。標準のSUSIEに入ってるはずです
また、batwork/comicdir/comiczip/tasklist に入っている.dummy ファイルは消してください。

まずは、それぞれのファイルの説明をします。


・bookserv.cgi
ブックサーバ本体です。Perlのプログラムです。
外部からここにブラウザアクセスします。例えば、グローバルIPが 012.345.678.910 だとしたら、http://012.345.678.910/bookserv.cgi にアクセスする形です。
なお、このファイルをメモ帳などで開き、自分の環境にあわせて、行頭の

$serv1 = 'http://012.345.678.910'; # グローバルIPを振っておく
$serv2 = 'http://192.168.12.18'; # ローカルIPを振っておく

を、それぞれ書き換えてください。
もしグローバルIPでない場合は、DynamicDNSのドメインなどでも構いません。
また、本プログラム内で comicserv\@hoge.com と書かれた場所が2カ所あります。これは、環境によっては後ほど書き換える必要があります。


・_timerurn.bat / TimerRun.exe
一定時間に1回、指定のプログラムを起動するアプリです。
コマンドラインを指定して起動しますが、コマンドラインは _timerrun.bat に書かれています。
起動するときは、exeではなく、_timerrun.bat の方を起動してください。
これは常に起動しておく必要があるので、スタートアップなどに登録しておくと良いです。
パラメータの意味としては、以下の通りです。

TimerRun.exe [showmode] [title] [timerms] [exe_path] [exe_command...]

[showmode] Win32API の ShowWindow() の SW_xxxx と同一です。
[title] タスクトレイに常駐する際の名称です。
[timerms] 一定時間をミリ秒で指定します。30*1000は30秒です。
[exe_path] 実行するプログラム名です。ここでは perl.exe を実行しています。
[exe_command...] 実行プログラムに渡すパラメータです。taskrun.cgiが渡されます。


・taskrun.cgi
TimerRun.exe によって30秒に1度起動されるPerlのプログラムです。
bookserv.cgi でタスクが作られた際、それを実行します。
ここで実行されるタスクというのは、
・本のjpg画像をリサイズしてフォルダにコピー
・本のjpg画像をリサイズして7zipで圧縮してzipファイル化
いづれかです。この処理は comiczip.exe を用います。
また、上記が終わった後、メールアドレスがある場合、 sendmail.js を用い、完了した旨をメールで送信します。


・comiczip.exe
taskrun.cgi によって実行される、ファイル処理プログラムです。
7z.exe / IFJPEGV6.SPI を用います。


sendmail.js
taskrun.cgi によって実行される、メール送信プログラムです。
使用する前に、メモ帳などで開き、末尾の方にある、

+"【内】 http://192.168.12.18/bookserv.cgi?mail=" + to_mail_addresses +"\r\n"
+"【外】 http://012.345.678.910/bookserv.cgi?mail=" + to_mail_addresses +"\r\n"

を、それぞれ bookserv.cgi で書き換えたIPアドレスもしくはドメインに変更してください。
また、行頭にある、

// 設定項目
// メール送信サーバ名
var smtp_server_name = "mail.hoge.com";

を、使用できるSMTPサーバに変更してください。ここで指定したSMTPサーバが、特定ドメインのメールアドレスしか送信できない場合、合わせて bookserv.cgi に2カ所ある comicserv\@hoge.com も書き換えてください。


・common.pl / jcode.pl
.cgiファイルから使われる処理ライブラリです。


・booklist.csv
本来、MCF eBookReaderから出力されるcsvファイルです。これが書き換えられるように、MCF eBookReaderをセットしてください。



■ 使用する(1)

PC/iPhone/Androidなどのブラウザで、http://IPアドレス/bookserv.cgi にアクセスしてください。
つまり、外部公開サーバに置いてある、bookserv.cgi にアクセスするということです。
正しく設定されていると、「出力設定」という画面になり、
・メールアドレス
・ファイルタイプ
・画像の幅
・画像の高さ
が設定できる画面になります。

まず、読みたい端末に合わせて、画像の幅/高さを選びます。
iPhone3G/3GSなどでは320x480の解像度ですので、横画面で読みたい時は幅480x縦0 とするといいでしょう。0を設定すると、もう片方に合わせてリサイズします。
PCの場合には見開きで読むとして、縦方向を指定し、幅を0とすると読みやすいです。
自分の使う端末に合わせて設定してください。

ファイルタイプは、Directory/Zipのどちらかです。
Directoryの場合は、ブラウザ上で、ネットに接続しながら読む形です。
Zipの場合は、一度端末にZipファイルをダウンロードし、専用のリーダーアプリなどで読む形を想定しています。

メールアドレスは、設定してもしなくても大丈夫ですが、設定しておくと、リサイズ処理が完了した時点でURL付きのメールを受け取ることができます。

設定をすると、書籍一覧画面になります。
書籍一覧画面の最初をブックマークしておくと今後使いやすくなると思います。


■ 使用する(2)

書籍一覧では、グループ選択/検索キーワードを使い、目的の書籍を探します。
書籍一覧の著者名を選ぶと、その著者の書籍一覧を出します。
読みたい書籍が見つかったら、書籍名をクリックすると「タスク」に登録されます。

タスクに登録された処理は、書籍一覧の上に表示されます。
処理内容は、設定しているファイルタイプによって変わります。
外部公開サーバの処理速度によって待つ時間が変わります。VAIO type U では200ページのマンガを処理するのにおよそ3〜5分かかりました。

処理が完了すると、メールアドレスを登録している場合、メールが届きます。
また、一覧をリロードした時に、タスク登録から消えます。
処理された書籍は、書籍一覧の下にある「すぐによめる書籍一覧」に入ります。
届いたメールのURLか、もしくはすぐによめる書籍一覧から書籍を選ぶと、
・Zipファイルの場合、DLページに飛びます
・Directory書籍の場合、ブラウザがJavaScriptを用いたブックリーダーになります
(ブラウザは、iPhoneの場合はMercury、Androidの場合はMiren Browserなどフルスクリーン化できるものをオススメします)


■ 終わりに

もし何かわからないことがありましたら、Twitter @sinpen まで聞いて下さい。
ただ、基本的に自分用に作った環境なので、要望等には応えられないと思います。
(自作ソフトである TimerRun.exe / comiczip.exe のソース下さい、くらいならあげます)
また、配布することを目的として作っていませんので、何か起きても自己責任でお願いします。
データのバックアップはお忘れ無く。