======================================================================
README for mod_uploader
======================================================================

.. image:: img/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:7070/up/


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

.. |IconWindows| image:: img/icon_windows.png
   :width: 16
   :height: 16
   :alt: WIndows

mod_uploader は，UNIX 系 OS で動作します．(|IconWindows| `Windows 版はこちら <http://acapulco.dyndns.org/mod_uploader/apache-win.htm>`_)

* `Apache`_ 2.0 以上

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

* `GNU Make`_ 3.8 以上

* `GNU Libtool`_ 1.5 以上

* `ImageMagick`_ 6.0 以上
  
開発は， `Gentoo Linux`_ Kernel **2.6.10** ，GCC **3.3.5** ，Apache
**2.0.54** ，ImageMagick **6.1.8.8** で行っています．

各環境で必要になる主なパッケージ
``````````````````````````````````````````````````````````````````````

CentOS
......................................................................

* gcc-c++
* make
* libtool
* httpd-devel
* ImageMagick-c++-devel

Debian
......................................................................

* libtool
* apache2-mpm-prefork
* apache2-prefork-dev
* libmagick++6-dev

FedoraCore
......................................................................

* gcc-c++
* make
* libtool
* httpd-devel
* ImageMagick-c++-devel
* freetype-devel
* fontconfig-devel

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

* www/apache20 or www/apache22
* graphics/ImageMagick

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

* gcc
* make
* libtool
* apache
* imagemagick

Ubuntu Linux
......................................................................

* g++
* apache2-mpm-prefork
* apache2-prefork-dev
* libmagick++9-dev


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

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


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

* `mod_uploader-2.1.1.tgz <http://prdownloads.sourceforge.jp/mod-uploader/23018/mod_uploader-2.1.1.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/>`_
することもできます．


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

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

::

 $ ./configure
 $ make apache-module

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

::

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

とします．

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

_`--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 とします．

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

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

CentOS, FedoraCore, Gentoo Linux, Ubuntu Linux
......................................................................

::

  $ ./configure
  $ make apache-module

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

::

  $ ./configure
  $ gmake apache-module

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

::

  $ ./configure
  $ env MACOSX_DEPLOYMENT_TARGET=10.4 make apache-module


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

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

::

  $ su
  # make -f GNUmakefile.apache install


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

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

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

::

  <Location アップローダを設置する場所>
      SetHandler              uploader
  </Location>
  <Location アップローダを設置する場所/admin>
      Order                   Deny,Allow
      Deny                    From All
      Allow                   From 127.0.0.1
  </Location>
  
  UploaderBaseUrl             アップローダの URL *

  UploaderDataDirectory       データを保存するフォルダ *
  UploaderFileDirectory       ファイルを保存するフォルダ *
  UploaderThumbDirectory      サムネイルを保存するフォルダ *
  UploaderTempDirectory       一時ファイルを保存するフォルダ *

  UploaderTotalFileSizeLimit     一回にアップロードできるファイルの最大サイズ（KB） *
  UploaderTotalFileNumberLimit   ファイルの個数の上限 *
  UploaderFileSizeLimit          ファイルサイズの合計の上限（KB） *
  UploaderPerPageItemNumber      1 ページあたりに表示するアイテム数 *

  UploaderIndexViewTemplate      トップページのテンプレート *
  UploaderProgressViewTemplate   アップロード進捗ページのテンプレート *
  UploaderDownloadViewTemplate   ダウンロードページのテンプレート *
  UploaderThumbnailViewTemplate  サムネイルページのテンプレート *
  UploaderAdminViewTemplate      管理ページのテンプレート *
  UploaderErrorViewTemplate      エラーページのテンプレート *

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

::

  <Location /up>
      SetHandler              uploader
  </Location>
  
  <Location /up/admin>
      Order                   Deny,Allow
    Deny                      From All
      Allow                   From 127.0.0.1
  </Location>
  
  UploaderBaseUrl                "http://foo/up"
  UploaderDataDirectory          "/path/to/mod_uploader/test/data"
  UploaderFileDirectory          "/path/to/mod_uploader/test/file"
  UploaderThumbDirectory         "/path/to/mod_uploader/test/thumb"
  UploaderTempDirectory          "/path/to/mod_uploader/test/temp"
  
  UploaderTotalFileSizeLimit     10485760
  UploaderTotalFileNumberLimit   200
  UploaderFileSizeLimit          1048576
  UploaderPerPageItemNumber      30
  
  UploaderIndexViewTemplate      "/path/to/mod_uploader/tmpl/index.htm"
  UploaderProgressViewTemplate   "/path/to/mod_uploader/tmpl/progress.htm"
  UploaderDownloadViewTemplate   "/path/to/mod_uploader/tmpl/download.htm"
  UploaderThumbnailViewTemplate  "/path/to/mod_uploader/tmpl/thumbnail.htm"
  UploaderAdminViewTemplate      "/path/to/mod_uploader/tmpl/admin.htm"
  UploaderErrorViewTemplate      "/path/to/mod_uploader/tmpl/error.htm"
  
  Alias /up_img                  "/path/to/mod_uploader/img"
  Alias /up_css                  "/path/to/mod_uploader/css"
  Alias /up_js                   "/path/to/mod_uploader/js"


注意事項
``````````````````````````````````````````````````````````````````````

* `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


高度な設定
----------------------------------------------------------------------  

アップロードの記録
```````````````````````````````````````````````````````````````````````

mod_uploader はファイルのアップロード時に環境変数 `uploader_upload` を
定義するので，以下の様な設定を追加することで投稿者の IP アドレスをログ
に記録する事が出来ます．

::

  LogFormat "%t HOST: %h ID: %{uploader_item_id}e AGENT: %{User-agent}i" uploader
  CustomLog log/apache.upload_log uploader env=uploader_upload

uploader_item_id は，アップロードファイルの ID に展開されます．その他の
書式については，mod_log_config のドキュメントを参照してください．

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

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

.. 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|_ |Secure|_

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

`Secure Coding in C And C++`_
  C/C++ でプログラムを作るときにセキュリティホールが発生してしまう原理と
  その対策について詳しく説明した本です．丁寧に書かれているので内容を
  しっかりと理解することができます．
  
`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/
.. _`GNU Libtool`:                    http://www.gnu.org/software/libtool/
.. _`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
.. _`Secure Coding in C And C++`: http://www.amazon.co.jp/exec/obidos/ASIN/0321335724/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:: img/panda.png
   :width: 120
   :height: 151
   :alt: Apacheモジュール プログラミングガイド
   :align: right
.. _`Panda`: http://www.amazon.co.jp/exec/obidos/ASIN/4774117994/cstation-22

.. |Secure| image:: img/secure.png
   :width: 120
   :height: 151
   :alt: Secure Coding in C And C++
   :align: right
.. _`Secure`: http://www.amazon.co.jp/exec/obidos/ASIN/0321335724/cstation-22

.. raw:: html

  <hr />

  <div class="footer">
   <p class="id">
    $Id: apache.txt 2109 2006-11-26 23:11:04Z 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:

