======================================================================
mod_uploader 取扱説明書 (Apache モジュール版用)
======================================================================

.. image:: title.png
   :width: 440
   :height: 89
   :alt: mod_uploader: Apache のモジュールとして動作する高速アップローダ

.. contents::

mod_uploader とは?
----------------------------------------------------------------------

mod_uploader は，よくあるアップローダを `Apache`_ のモジュールとして実
装したものです．以下のような特長があります．

* `Apache`_ のモジュールとして C++ で記述されているので，Perl や PHP で
  作られた物に比べて高速．

* 独自の簡易スクリプト言語によるテンプレート機能があるので，再コンパイ
  ル無しで手軽に見た目を変更可能．

* アップロード時の進捗状況をリアルタイムに表示可能．

`Windows 用 Apache モジュール版 <apache-win.htm>`_ も存在します．

動作サンプル
----------------------------------------------------------------------

http://acapulco.dyndns.org:8888/up/

動作環境
----------------------------------------------------------------------

mod_uploader は，UNIX 系 OS で動作します．詳細を以下に示します．

* `Apache`_ 2.0 以上（ `Debian`_ の場合，apache2，apache2-\*-dev，
  libapr0-dev が必要）

* `GNU Compiler Collection`_ 3.3 以上，または， `Intel C++ Compiler`_
  for Linux 9.0 以上

* `GNU Make`_ 3.8 以上

* `ImageMagick`_ 6.0 以上（サムネイル画像生成を行わない場合は不要）
  
* `ffmpeg`_ 0.4.9 以上（動画のサムネイル画像生成を行わない場合は不要）


開発は， `Gentoo Linux`_ kernel **2.6.10** ，GCC **3.3.5** ，Apache
**2.0.54** ，ImageMagick **6.1.8.8** ，ffmpeg **0.4.9** で行っています．

ライセンス
----------------------------------------------------------------------

`The zlib/libpng License`_ （ `The zlib/libpng License の翻訳`_ ）に従いま
す．

ダウンロード
----------------------------------------------------------------------

* `mod_uploader-1.4.4.tgz <http://prdownloads.sourceforge.jp/mod-uploader/20271/mod_uploader-1.4.4.tgz>`_

CVS リポジトリ
----------------------------------------------------------------------

下記のようにすることで check out できます．（パスワードは空）

::

  $ cvs -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/mod-uploader login
  $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/mod-uploader co mod_uploader


また， `ViewCVS 経由で参照
<http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/mod-uploader/mod_uploader/>`_
することもできます．

バグ情報
----------------------------------------------------------------------

`バグ情報 <http://acapulco.dyndns.org/mod_uploader/bts/html/guest.cgi?project=mod_uploader&amp;action=top>`_

バグを見つけた場合は，リンク先の「新規レポート」から書き込んでください．

コンパイル方法
----------------------------------------------------------------------

`GNU Compiler Collection`_ でコンパイルする場合は，

::

 $ ./configure
 $ make apache-module

とします． `Intel C++ Compiler`_ でコンパイルする場合は，

::

  $ env CC=icc ./configure
  $ make apache-module

とします．

configure は次のオプションを受け付けます．エラーがでた場合
は， `--with-apxs2`_ ， `--with-apctl2`_ ， `--with-aprconf`_ や
`--enable-iconv-const`_ を試してみてください．

_`--with-apxs2` = `APXS`
  apxs コマンドのパスを指定します．自動的に検出されない場合に使用して下
  さい．

_`--with-apctl2` = `APCTL`
  apachectl コマンドのパスを指定します．自動的に検出されない場合に使用
  して下さい．

_`--with-aprconf` = `APRCONF`
  apr-config コマンドのパスを指定します．自動的に検出されない場合に使用
  して下さい．

_`--with-libtool` = `LIBTOOL`
  libtool コマンドのパスを指定します．自動的に検出されない場合に使用し
  て下さい．

_`--with-march` = `CPU`
  特定の CPU 向けに最適化したい場合に使用します．例えば，Pentium 4 に最
  適化したい場合は， `--with-march`_ = pentium4 とします．

_`--enable-thumbnail`
  ファイルのサムネイル画像を生成したい場合に指定してください．

_`--enable-movie`
  ffmpeg を使って動画のサムネイル画像を生成したい場合に指定してくださ
  い． `--enable-thumbnail`_ と組み合わせて使用します．

_`--with-mconf` = `MCONF`
  Magick++-config コマンドのパスを指定します．自動的に検出されない場合
  に使用してください．

_`--with-writer` = `TYPE`
  ファイルを書き出す方法を指定します．basic と mmap が指定可能です．
  (デフォルト: basic)

_`--with-ie-name-code` = `CODE`
  Internet Explorer に対してファイル名を出力するときの文字コード．
  (デフォルト: cp932)

_`--enable-iconv-const` iconv の第二引数に const をつけるかどうか．
  `Mac OSX Tiger`_ や `FreeBSD`_ を使用している場合は指定する必要があり
  ます．

_`--disable-rwlock`
  rwlock の代わりに mutex を使って，スレッド間の同期を行います．Mac
  OSX Tiger では，(現状) rwlock が使えないので指定する必要があります．

各環境での例
``````````````````````````````````````````````````````````````````````

Gentoo Linux
......................................................................

::

  $ ./configure
  $ make apache-module

FreeBSD
......................................................................

::

  $ env CPPFLAGS="-I/usr/local/include -L/usr/local/lib" ./configure --enable-iconv-const --with-libtool=/usr/local/bin/libtool15
  $ gmake apache-module

Mac OSX Tiger + Fink
......................................................................

::

  $ env CPPFLAGS="-I/sw/include" ./configure --enable-iconv-const --disable-rwlock
  $ env MACOSX_DEPLOYMENT_TARGET=10.4 make apache-module

インストール
----------------------------------------------------------------------

次のコマンドを実行するだけで OK です．

::

  $ su
  # make -f GNUmakefile.apache install

設定
----------------------------------------------------------------------

設定は，Apache の設定ファイル（ `.htaccess` は不可）に，以下のように記
述します．（ ***** 印がついているものは必須）

テンプレートは，tmpl/apache ディレクトリに入っている `view.htm` ，
`progress.htm` ， `download.htm` ， `thumbnail.htm` ， `error.htm` を利
用してください．

::

  <Location アップローダを設置する場所>
      SetHandler              uploader
  
      Url                     アップローダの URL（RSS の生成に利用）
  
      FileDirectory           アップロードファイルを保存するディレクトリ *
      ThumbDirectory          サムネイル画像を保存するディレクトリ *
      TmpDirectory            一時ファイルを保存するディレクトリ *
  
      MaxFileSize             一回にアップロードできるファイルの最大サイズ（KB）
      TotalFileSizeLimit      ファイルの合計サイズの上限値（KB）
      TotalFileNumberLimit    ファイルの個数の上限値
      PerPageItemNumber       1 ページあたりに表示するアイテム数
  
      ViewTemplateFile        トップページのテンプレートファイル *
    　ProgressTemplateFile    アップロード状況表示画面のテンプレートファイル *
      DownloadTemplateFile    DL pass 入力画面のテンプレートファイル *
      ThumbTemplateFile       サムネイルページのテンプレートファイル *
      ErrorTemplateFile       エラーページのテンプレートファイル *
  </Location>

`http://foo/up/` に設置する場合の設定例は以下のようになります． `/img`
， `/css` や `/thumb` の Alias は必須ではありません．テンプレートを書き
換えたくない場合に指定してみてください．（これはあくまでも例です．ディ
レクトリやファイルのパスは環境よって違ってきます）

::

  <Location /up>
      SetHandler              uploader
  
      Url                     "http://foo/up/"
  
      FileDirectory           "/path/to/mod_uploader/file"
      ThumbDirectory          "/path/to/mod_uploader/thumb"
      TmpDirectory            "/path/to/mod_uploader/tmp"
  
      MaxFileSize             1024
      TotalFileSizeLimit      10240
      TotalFileNumberLimit    1000
      PerPageItemNumber       20
  
      ViewTemplateFile        "/path/to/mod_uploader/tmpl/apache/view.htm"
      ProgressTemplateFile    "/path/to/mod_uploader/tmpl/apache/progress.htm"
      DownloadTemplateFile    "/path/to/mod_uploader/tmpl/apache/download.htm"
      ThumbTemplateFile       "/path/to/mod_uploader/tmpl/apache/thumbnail.htm"
      ErrorTemplateFile       "/path/to/mod_uploader/tmpl/apache/error.htm"
  </Location>

  Alias   /img    "/path/to/mod_uploader/img"
  Alias   /css    "/path/to/mod_uploader/css"
  Alias   /thumb  "/path/to/mod_uploader/thumb"
  
注意事項
``````````````````````````````````````````````````````````````````````

* `Apache`_ の動作に不慣れなうちは，ディレクトリやファイルの指定には絶
  対パスを使用してください．

* ディレクトリやファイルの指定には「\\」を使わないでください．
  ( **×** C:\foo\bar\baz， **×** C:/foo/bar/baz)

* ディレクトリやファイルの指定には空白「 」を含めないでください．
  ( **×** C:/Documents and Settings/foo/bar/baz)

* `FileDirectory` ， `ThumbDirectory` ， `TmpDirectory` の各ディレクト
  リは， `Apache`_ が読み書き実行できるパーミッションに設定されている必
  要があります．

* `FileDirectory` ， `ThumbDirectory` には mod_uploader が生成するファ
  イル以外を置かないでください．

* `<Location>` で指定するパスには「~」を含めないでください．

* 設定によっては，テンプレートを一部書き換えないと正常に表示されません．
  適宜書き換えてください．

起動
----------------------------------------------------------------------  

`Apache`_ を普通に起動すれば OK です．設置した場所にブラウザでアクセス
してみましょう．

お試し実行
----------------------------------------------------------------------  

次のコマンドを入力して，http://127.0.0.1:8080/up/ にアクセスすることで
することでインストールせずに動作を確認できます．(他のホストからアクセス
する場合は， *127.0.0.1* の部分を適当に置き換えてください)

::

  $ su -
  # make -f GNUmakefile.apache start

もし， `LoadModule` 関連のエラーが出た場合は，conf/apache.conf を適宜修
正してください．

停止は，次のようにします．

::

  # make -f GNUmakefile.apache stop

トラブル・シューティング
----------------------------------------------------------------------  


アクセスすると Internal Server Error になってしまう．
``````````````````````````````````````````````````````````````````````

mod_uploader を実行するのに必要な環境が整っていない場合に表示されます．

この場合， `Apache`_ のエラーログに，「[mod_uploader] Exception: ....」
のような出力が出ていると思います．メッセージを参考にしながら設定を見直
して見て下さい．

また，メッセージが「Exception:
\\xc0\\xdf\\xc4\\xea\\xcf\\xb3\\xa4\\xec\\xa4\\xac\\xa4\\xa2\\xa4\\xea\\xa4\\xde\\xa4\\xb9\\xa1\\xa5
」のように文字化けしている場合 [#]_ ，Exception 以降の文字列をコピーして，コ
ンソールで以下のようなコマンドを実行してみてください．日本語のエラーメッ
セージを読むことができます．

::

  $ perl -e 'print "\xc0\xdf\xc4\xea\xcf\xb3\xa4\xec\xa4\xac\xa4\xa2\xa4\xea\xa4\xde\xa4\xb9\xa1\xa5", "\n"'
  設定漏れがあります．

.. [#] AP_UNSAFE_ERROR_LOG_UNESCAPED を define して Apache をコンパイルすると，
       このような文字化けが発生しなくなります．

テンプレートの書式
----------------------------------------------------------------------  

Comming soon...

パフォーマンス
----------------------------------------------------------------------

高速な表示
```````````````````````````````````````````````````````````````````````

.. image:: speed.png
   :width: 460
   :height: 248
   :alt: 一秒間に処理できるリクエスト数
   :align: right
               
mod_uploader は，表示を非常に高速に行うことができます．

右に他のアップローダとの速度比較を示します．HTML は，表示を静的な HTML
で行うもの，Perl および PHP はそれぞれの言語で作られたアップローダを指
しています．測定には ApacheBench を用い，5 並列で 10,000 リクエスト発行
した場合の値をプロットしました．

mod_uploader は Perl の約 100 倍，PHP の約 10 倍高速に動作しています．
これらの言語を使った場合， `mod_perl`_ （ModPerl::Registry）や `APC`_
を使用すればある程度速度を改善することが可能です．それでも，
mod_uploader には及びません．

.. 補足：
.. 
.. なんか，使用言語がパフォーマンスのキーになるような書き方になってます
.. が，もちろん，言語よりも他の要素に負うところの方が大きいです．
.. mod_perl や APC 使っていればなおさらです．
..
.. アジテーションが目的の文章ですんで，軽く読み流して頂けると幸いです．
.. (やっぱりダメ？)

また，mod_uploader は，静的な HTML を用いるものと比べてもわずかながら高
速に動作します．これは，表示に静的な HTML を用いる場合でも，アップロー
ド処理のためには libphp4.so をロードする必要があるので，そのためのオー
バーヘッドがかかっているのが原因と思われます．libphp4.so のロードを無く
した場合，HTML の値は 2,800 を超えて最速になります．

省メモリのアップロード
```````````````````````````````````````````````````````````````````````

mod_uploader は，巨大なファイルのアップロードにもわずかなメモリしか消費
しません．

それに対してアップローダの多くは，アップロードされたデータを一旦全てメ
モリに入れて処理するため，アップロードにはファイルサイズに比例したサイ
ズのメモリを消費してしまいます．

.. 補足：
.. 
.. サイズが小さいファイルをアップロードするだけだったら，全部メモリに読
.. み込んで処理するのは良い選択だと思います．でも，数十メガバイト以上の
.. サイズを扱うには無理があります．


API ドキュメント
----------------------------------------------------------------------

http://acapulco.dyndns.org/mod_uploader/api/

ツール
----------------------------------------------------------------------

プログラムの作成にあたってお世話になったツールを紹介します．

`Valgrind`_
  メモリの不正な参照や解放し忘れなどをチェックしてくれるツール．デバッ
  グでかなりお世話になりました．

参考文献
----------------------------------------------------------------------

プログラムの作成にあたってお世話になった文献を紹介します．

|Panda|_

`Apacheモジュール プログラミングガイド`_
  `Apache`_ のモジュール作成に必要になる事柄を一通り説明した本．痒いと
  ころに手が届いているので，手元に置いておくと重宝します．

`Advanced Topics in Module Design: Threadsafety and Portability`_
  `Apache`_ 2.0 でモジュールを作成するときに必要になってくるテクニック
  が解説されたパワポ．そんなに長くないので，モジュール書く前にさらっと
  読んでおきましょう．

`Apache API C++ Cookbook`_
  C++ を使って `Apache`_ のモジュールを作成する際の注意事項について説明
  したサイト．

`libapr (apache portable runtime) programming tutorial`_
  APR のチュートリアル．サンプルコードおよび，間違いやすい点についての
  記述が多いので重宝します．

`Using libavformat and libavcodec: An Update`_
  libavformat と libavcodec を使って動画からフレーム画像を取り出す方法
  を解説したページ．丁寧に書かれています．

`STL のページ`_
  C++ の標準テンプレートライブラリである STL について簡潔にまとめられた
  サイト．

`RubyExtensionProgrammingGuide`_
  Ruby の拡張ライブラリの書き方を解説したサイト．基本的な事項から少し高
  度な話題まで非常に良くまとまってます．

`Compiler Construction Lecture`_
  コンパイラ作成に関する実践的な内容が簡潔にまとめられたサイト．簡単な
  インタプリタもどきを作るんだったら，このサイトだけで十分かも．

.. _`Apache`:                         http://httpd.apache.org/
.. _`Debian`:                         http://www.debian.org/
.. _`GNU Compiler Collection`:        http://gcc.gnu.org/
.. _`Intel C++ Compiler`:             http://www.intel.com/cd/software/products/asmo-na/eng/compilers/clin/
.. _`GNU Make`:                       http://www.gnu.org/software/make/
.. _`ImageMagick`:                    http://www.imagemagick.org/
.. _`ffmpeg`:                         http://ffmpeg.sourceforge.net/index.php
.. _`Visual C++ .NET`:                http://www.microsoft.com/japan/msdn/visualc/
.. _`Cygwin`:                         http://www.cygwin.com/
.. _`The zlib/libpng License`:        http://www.opensource.org/licenses/zlib-license.php
.. _`The zlib/libpng License の翻訳`: http://japan.linux.com/docs/licenses/zlib-license.shtml
.. _`Gentoo Linux`:                   http://www.gentoo.org/
.. _`FreeBSD`:                        http://www.freebsd.org/
.. _`Mac OSX Tiger`:                  http://www.apple.com/macosx/
.. _`mod_perl`:                       http://perl.apache.org/
.. _`APC`:                            http://pecl.php.net/package/APC/
.. _`Valgrind`:                       http://valgrind.org/

.. _`Apacheモジュール プログラミングガイド`: http://www.amazon.co.jp/exec/obidos/ASIN/4774117994/cstation-22
.. _`Advanced Topics in Module Design: Threadsafety and Portability`: http://www.clove.org/~aaron/presentations/apachecon2004/ac2004advancedmodules.ppt
.. _`Apache API C++ Cookbook`:       http://zach.chambana.net/apache-cplusplus/ 
.. _`libapr (apache portable runtime) programming tutorial`: http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial.html             
.. _`Using libavformat and libavcodec: An Update`: http://www.inb.uni-luebeck.de/~boehme/libavcodec_update.html
.. _`STL のページ`:                   http://www.wakhok.ac.jp/~sumi/stl/
.. _`RubyExtensionProgrammingGuide`:  http://i.loveruby.net/w/RubyExtensionProgrammingGuide.html
.. _`Compiler Construction Lecture`:  http://rananim.ie.u-ryukyu.ac.jp/~kono/lecture/compiler/

.. |Panda| image:: panda.png
   :width: 120
   :height: 151
   :alt: Apacheモジュール プログラミングガイド
   :align: right
.. _`Panda`: http://www.amazon.co.jp/exec/obidos/ASIN/4774117994/cstation-22

.. raw:: html

  <hr />

  <div class="footer">
   <p class="id">
    $Id: apache.txt 1076 2006-05-24 12:38:36Z svn $
   </p>

   <address><img src="mail_address.png" width="204" height="16" alt="kimata&#64;acapulco.dyndns.org" /></address>

   <p class="validator">
    <a href="http://validator.w3.org/check?uri=referer">
     <img src="http://www.w3.org/Icons/valid-xhtml11" alt="Valid XHTML 1.1!" height="31" width="88" />
    </a>
    <a href="http://jigsaw.w3.org/css-validator/check/referer">
     <img src="http://jigsaw.w3.org/css-validator/images/vcss" alt="Valid CSS!" height="31" width="88" />
    </a>
   </p>
  </div>

.. Local Variables:
.. mode: rst
.. buffer-file-coding-system: utf-8-unix
.. End:

