OSDN Git Service

Add the document and the homepage of ludia_funcs project.
authorMasaoFujii <masao.fujii@gmail.com>
Thu, 4 Apr 2013 19:02:58 +0000 (04:02 +0900)
committerMasaoFujii <masao.fujii@gmail.com>
Thu, 4 Apr 2013 19:02:58 +0000 (04:02 +0900)
html/index.html [new file with mode: 0644]
html/ludia_funcs.html [new file with mode: 0644]
html/style.css [new file with mode: 0644]

diff --git a/html/index.html b/html/index.html
new file mode 100644 (file)
index 0000000..8c2507a
--- /dev/null
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>ludia_funcs</title>
+
+<link rel="stylesheet" type="text/css" href="style.css">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<body>
+  <div id="navigation">
+    <ul>
+      <li><a href="index.html">ホーム</a></li>
+      <li><a href="http://sourceforge.jp/projects/ludiafuncs/releases/">ダウンロード</a></li>
+      <li><a href="ludia_funcs.html">ドキュメント</a></li>
+      <li><a href="index.html#community">コミュニティ</a></li>
+      <li><a href="index.html#development">開発</a></li>
+    </ul>
+  </div>
+
+<h1 id="ludia_funcs">ludia_funcs</h1>
+<p>ludia_funcs(ルディア・ファンクス)は、文字列の正規化関数とスニペット作成関数を提供するモジュールです。それらの関数は全文検索モジュール<a href="http://ludia.sourceforge.jp/moin.cgi/">Ludia</a>が提供していたものと同じです。 ludia_funcsは、それらの関数を<a href="http://www.postgresql.org/">PostgreSQL</a>9.1以降で利用可能にしています。</p>
+
+<h2 id="news">ニュース</h2>
+<ul>
+<li>2013-04-05: ludia_funcs-20130405とsenna-1.1.2-fast-20130405をリリースしました。</li>
+</ul>
+
+<h2 id="community">コミュニティ</h2>
+<dl>
+<dt><a href="http://sourceforge.jp/forum/forum.php?forum_id=31029"><b>general discussion</b></a></dt>
+<dd>ludia_funcs全般に関する話題(バグ報告や技術的な情報交換など)を扱うためのフォーラムです。</dd>
+</dl>
+
+<dl>
+<dt><a href="http://lists.sourceforge.jp/mailman/listinfo/ludiafuncs-hackers"><b>ludiafuncs-hackers</b></a></dt>
+<dd>ludia_funcs開発用のメーリングリストです。</dd>
+</dl>
+
+<h2 id="development">開発</h2>
+<p class="padding">ludia_funcsはgitでソースコードを管理しています。レポジトリは<a href="http://sourceforge.jp/projects/ludiafuncs/scm/">ここ</a>です。</p>
+
+<hr>
+<div align="right">Copyright (c) 2012-2013, NTT DATA Corporation</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/html/ludia_funcs.html b/html/ludia_funcs.html
new file mode 100644 (file)
index 0000000..28319e9
--- /dev/null
@@ -0,0 +1,378 @@
+<html>
+<head>
+<title>ludia_funcs ドキュメント</title>
+
+<link rel="stylesheet" type="text/css" href="style.css">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+</head>
+
+<body>
+  <div id="navigation">
+    <ul>
+      <li><a href="index.html">ホーム</a></li>
+      <li><a href="http://sourceforge.jp/projects/ludiafuncs/releases/">ダウンロード</a></li>
+      <li><a href="ludia_funcs.html">ドキュメント</a></li>
+      <li><a href="index.html#community">コミュニティ</a></li>
+      <li><a href="index.html#development">開発</a></li>
+    </ul>
+  </div>
+
+<h1 id="ludia_funcs">ludia_funcs ドキュメント</h1>
+
+<div class="index">
+<ol>
+<li><a href="#description">概要</a></li>
+<li><a href="#requirement">動作確認環境</a></li>
+<li><a href="#install">インストール</a></li>
+<li><a href="#uninstall">アンインストール</a></li>
+<li><a href="#functions">提供関数</a></li>
+<li><a href="#parametares">パラメータ</a></li>
+</ol>
+</div>
+
+<h2 id="description">概要</h2>
+<p>ludia_funcs(ルディア・ファンクス)は、文字列の正規化関数とスニペット作成関数を提供するモジュールです。それらの関数は全文検索モジュール<a href="http://ludia.sourceforge.jp/moin.cgi/">Ludia</a>が提供していたものと同じです。 ludia_funcsは、それらの関数を<a href="http://www.postgresql.org/">PostgreSQL</a>9.1以降で利用可能にしています。</p>
+<p><a href="http://sourceforge.jp/projects/ludiafuncs/">ludia_funcsプロジェクト</a>では以下2つのモジュールを提供します。</p>
+
+<table>
+<thead>
+<tr>
+<th>モジュール名</th><th>概要</th><th>ソースアーカイブファイル名</th>
+</tr>
+</thead>
+<tbody>
+<tr><td>ludia_funcs</td>
+  <td nowrap>文字列の正規化関数とスニペット作成関数を提供するモジュール</td>
+  <td>ludia_funcs-YYYYMMDD.tar.gz</td></tr>
+<tr><td>senna-1.1.2-fast</td>
+  <td nowrap>組み込み型全文検索エンジン<a href="http://qwik.jp/senna/FrontPageJ.html">Senna</a>の性能改善版</td>
+  <td>senna-1.1.2-fast-YYYYMMDD.tar.gz</td></tr>
+</tbody>
+</table>
+
+<p>ソースアーカイブファイル名のYYYYMMDDの部分は、実際にはそのファイルがリリースされた年月日になります。例えば、2013年4月5日リリースのファイルでは、YYYYMMDDは20130405です。</p>
+
+<p>各提供モジュールのライセンスはLGPLv2.1です。</p>
+
+<p>ludia_funcsは、提供モジュールの一つである性能改善版のSennaと組み合わせて使いうことで、Ludia同様に文字列の正規化やスニペット作成を行います。</p>
+
+<p>ludia_funcsは、様々な形式のファイルからテキストを抽出する関数も提供します。この関数を利用するには、商用ソフトウェアの<a href="http://www.antenna.co.jp/axx/">TextPorter</a>を別途購入する必要があります。 (TextPorter Ver.5 Copyright(c) 1999- Antenna House, Inc.)</p>
+<h2 id="requirement">動作確認環境</h2>
+<p>ludia_funcsは、以下の環境で動作確認しています。</p>
+
+<table>
+<thead>
+<tr>
+<th>カテゴリ</th><th>モジュール名</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+  <td>OS</td>
+  <td nowrap>Red Hat Enterprise Linux 6.1 x86_64</td>
+</tr>
+<tr>
+  <td>DMBMS</td>
+  <td nowrap>PostgresSQL9.1</td>
+</tr>
+<tr>
+  <td>Senna</td>
+  <td nowrap>senna-1.1.2-fast</td>
+</tr>
+</tbody>
+</table>
+
+<p>ludia_funcsは、PostgreSQL9.1のみに対応しています。 9.0以前には未対応です。 9.2以降には対応していると思われますが、動作確認していません。</p>
+
+<p>ludia_funcsは、オリジナルのSenna1.1.2以降とも組み合わせ可能だと思われますが、動作確認していません。 senna-1.1.2-fastを使う場合、ludia_funcsの登録先のデータベースでは、エンコーディングはUTF-8でなければなりません。</p>
+
+
+<h2 id="install">インストール</h2>
+
+<h3 id="pg_install">PostgreSQLのインストール</h3>
+<p><a href="http://www.postgresql.org/">PostgreSQLのオフィシャルサイト</a>からバージョン9.1.X(バージョン番号の下一桁Xは、実際の数字に置き換えてください)のソースアーカイブファイル(postgresql-9.1.X.tar.gz)をダウンロードし、ビルドとインストールを行います。</p>
+<pre>
+$ tar zxf postgresql-9.1.X.tar.gz
+$ cd postgresql-9.1.X
+$ ./configure --prefix=/opt/pgsql-9.1.X
+$ make
+$ su
+# make install
+# exit</pre>
+<ul>
+<li>--prefix : インストール先ディレクトリを指定します。未指定時のインストール先は/usr/local/pgsqlです。このオプション指定は必須ではありません。</li>
+</ul>
+<p>上記手順ではソースコードからPostgreSQLをインストールしています。しかし、RPMなどの他の手順でPostgreSQLをインストールしてもludia_funcsは利用可能です。 RPMインストールのPostgreSQLでludia_funcsを利用するには、postgresql-develパッケージをインストールしなければならないことに注意してください。</p>
+
+
+<h3 id="senna_install">Sennaのインストール</h3>
+<p><a href="http://sourceforge.jp/projects/ludiafuncs/releases/">ここ</a>からsenna-1.1.2-fastのソースアーカイブファイルをダウンロードし、ビルドとインストールを行います。 Sennaのmakeには長時間かかることに注意してください。</p>
+<pre>
+$ tar zxf senna-1.1.2-fast-YYYYMMDD.tar.gz
+$ cd senna-1.1.2-fast-YYYYMMDD
+$ ./configure --prefix=/opt/senna-1.1.2-fast --without-mecab
+$ make
+$ su
+# make install
+# exit
+</pre>
+<ul>
+<li>--prefix : インストール先ディレクトリを指定します。未指定時のインストール先は/usr/localです。このオプション指定は必須ではありません。</li>
+<li>--without-mecab : <a href="https://code.google.com/p/mecab/">mecab</a>モジュールを使用しないことを指定します。このオプション指定は必須です。</li>
+</ul>
+
+<h3 id="ludia_funcs_install">ludia_funcsのインストール</h3>
+<p><a href="http://sourceforge.jp/projects/ludiafuncs/releases/">ここ</a>からludia_funcsのソースアーカイブファイルをダウンロードし、ビルドとインストールを行います。</p>
+<pre>
+$ tar zxf ludia_funcs-YYYYMMDD.tar.gz
+$ cd ludia_funcs-YYYYMMDD
+$ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-9.1.X/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg
+$ su
+# make USE_PGXS=1 PG_CONFIG=/opt/pgsql-9.1.X/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg install
+# exit
+</pre>
+<ul>
+<li>USE_PGXS : PostgreSQL関連モジュールをコンパイルするときのオマジナイです。1の指定が必須です。</li>
+<li>PG_CONFIG : pg_configコマンド(PostgreSQLインストール先のbinディレクトリに存在)のパスを指定します。pg_configにPATHが通っているのであれば、このオプション指定は不要です。</li>
+<li>SENNA_CFG : senna-cfgコマンド(Sennaインストール先のbinディレクトリに存在)のパスを指定します。senna-cfgにPATHが通っているのであれば、このオプション指定は不要です。</li>
+</ul>
+
+<h3 id="ludia_funcs_register">ludia_funcsの登録</h3>
+<p>データベースクラスタの作成後、postgresql.confを編集、PostgreSQLを起動し、ludia_funcsをデータベースに登録します。</p>
+<pre>
+$ initdb -D $PGDATA --locale=C --encoding=UTF8
+
+$ vi $PGDATA/postgresql.conf
+shared_preload_libraries = 'ludia_funcs'
+custom_variable_classes = 'ludia_funcs'
+
+$ pg_ctl -D $PGDATA start
+$ psql -d &lt;データベース名&gt;
+=# CREATE EXTENSION ludia_funcs;
+=# \dx ludia_funcs
+           List of installed extensions
+    Name     | Version | Schema |   Description
+-------------+---------+--------+-----------------
+ ludia_funcs | 1.0     | public | ludia functions
+(1 row)
+</pre>
+
+<ul>
+<li>$PGDATAは、データベースクラスタのパスを決めて、そのパスで置き換えてください。</li>
+<li>senna-1.1.2-fastを使う場合、ludia_funcsの登録先のデータベースでは、エンコーディングはUTF-8でなければなりません。</li>
+<li>postgresql.confで、<a href="http://www.postgresql.jp/document/current/html/runtime-config-resource.html#GUC-SHARED-PRELOAD-LIBRARIES">shared_preload_libraries</a>と<a href="http://www.postgresql.jp/document/9.1/html/runtime-config-custom.html#GUC-CUSTOM-VARIABLE-CLASSES">custom_variable_classes</a>にludia_funcsを設定するのは必須です。
+  <ul>
+    <li>PostgreSQL9.2以降ではcustom_variable_classesは存在しません。設定が必要なのはshared_preload_librariesだけです。</li>
+  </ul>
+</li>
+<li>ludia_funcsの登録には、<a href="http://www.postgresql.jp/document/current/html/sql-createextension.html">CREATE EXTENSION</a>を使います。 CREATE EXTENSIONはデータベース単位でモジュールを登録するため、ludia_funcsを利用したいデータベースすべてにおいて登録が必要です。</li>
+</ul>
+
+<p>ludia_funcsのインストールは以上で終わりです。</p>
+
+<h2 id="uninstall">アンインストール</h2>
+<h3 id="delete_ludia_funcs">ludia_funcsの削除</h3>
+<p>ludia_funcsについて、データベースからの登録解除とアンインストールを行います。</p>
+<pre>
+$ psql -d &lt;データベース名&gt;
+=# DROP EXTENSION ludia_funcs CASCADE;
+=# \q
+
+$ pg_ctl -D $PGDATA stop
+$ su
+
+# cd &lt;ludia_funcsのソースディレクトリ&gt;
+# make USE_PGXS=1 PG_CONFIG=/opt/pgsql-9.1.X/bin/pg_config SENNA_CFG=/opt/senna-1.1.2-fast/bin/senna-cfg uninstall
+# exit
+</pre>
+<ul>
+<li>ludia_funcsを登録したすべてのデータベースで登録解除する必要があります。</li>
+<li>ludia_funcsに依存するDBオブジェクトを削除する必要があるため、<a href="http://www.postgresql.jp/document/current/html/sql-dropextension.html">DROP EXTENSION</a>にはCASCADEを指定します。</li>
+</ul>
+
+<h3 id="delete_conf">postgresql.confの設定削除</h3>
+<p>postgresql.confの以下の設定を削除します。</p>
+<ul>
+<li>shared_preload_libraries</li>
+<li>custom_variable_classes</li>
+<li>ludia_funcs.* (ludia_funcs.から名前が始まるパラメータ)</li>
+</ul>
+
+<h3 id="senna_uninstall">Sennaのアンインストール</h3>
+<p>senna-1.1.2-fastのソースディレクトリでアンインストールを行います。</p>
+<pre>
+$ su
+# cd &lt;senna-1.1.2-fastのソースディレクトリ&gt;
+# make uninstall
+# exit
+</pre>
+
+<h2 id="functions">提供関数</h2>
+
+<h3 id="pgs2norm">pgs2norm</h3>
+<p>pgs2normは、文字列正規化ルール(NFKCの正規化形式)に則って、文字列(引数1)を正規化する関数です。</p>
+<ul>
+<li>引数1(text) - 正規化する文字列</li>
+<li>戻り値(text) - 引数1を正規化した文字列</li>
+</ul>
+
+<p>引数1がNULLの場合、戻り値はNULLです。</p>
+
+<p>NFKCの正規化では、例えば、以下のように文字列を変換します。</p>
+<ul>
+    
+    <li>半角カタカナを全角カタカナに変換
+    <ul>
+        <li>アイウエオ → アイウエオ</li>
+    </ul>
+    </li>
+    <li>大文字英字を小文字英字に変換
+    <ul>
+        <li>ABCDE → abcde</li>
+    </ul>
+    </li>
+    <li>全角英数字を半角英数字に変換
+    <ul>
+        <li>AbCdE123 → abcde123</li>
+    </ul>
+    </li>
+    <li>環境依存文字を変換
+    <ul>
+        <li>㌢㍻㊨⑤Ⅷ㈲ → センチ平成右5viii(有)</li>
+    </ul>
+    </li>
+</ul>
+
+<p>実行例</p>
+<pre>
+=# SELECT pgs2norm('いロハAbCd12③Ⅳ㈱');
+      pgs2norm
+---------------------
+ いロハabcd123iv(株)
+(1 row)
+</pre>
+
+<p>pgs2normは、引数と戻り値の文字列をメモリ上にキャッシュします。そして、pgs2normの次回実行時に引数の文字列がキャッシュされているものと同じであれば、正規化処理を行わず、キャッシュされている戻り値を直接返却することで、処理を高速化します。 pgs2normは、引数と戻り値をキャッシュする際、前回までのキャッシュを破棄します。つまり、キャッシュできる引数と戻り値は直前実行分の一組だけです。キャッシュはセッション単位で行われます。他セッションのキャッシュを、別セッションから実行されたpgs2normで使うことはできません。 pgs2normのキャッシュサイズの上限は、パラメータ<a href="#norm_cache_limit">ludia_funcs.norm_cache_limit</a>で指定できます。</p>
+
+<h3 id="pgs2snippet1">pgs2snippet1</h3>
+<p>pgs2snippet1は、文字列(引数8)からキーワード(引数7)のスニペット(KWIC)を作成する関数です。</p>
+<ul>
+<li>引数1(integer) - スニペット作成時に正規化するかどうか(する: 1、しない: 0)</li>
+<li>引数2(integer) - 作成するスニペットの最大長(バイト単位で指定)</li>
+<li>引数3(integer) - 作成するスニペットの数の上限</li>
+<li>引数4(text) - スニペット作成時にキーワードの前に付ける文字列</li>
+<li>引数5(text) - スニペット作成時にキーワードの後ろに付ける文字列</li>
+<li>引数6(integer) - HTMLの特殊文字をエスケープするかどうか(する: -1、しない: 0)</li>
+<li>引数7(text) - スニペット作成に使うキーワード</li>
+<li>引数8(text) - スニペットの作成元となる文字列</li>
+<li>戻り値(text) - キーワード(引数7)を使って文字列(引数8)から作成したスニペット文字列</li>
+</ul>
+
+<p>NULLの引数がある場合、戻り値はNULLです。</p>
+
+<p>実行例</p>
+<pre>
+=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, 'PostgreSQL', '最近、PostgreSQLの利用者が増えています。');
+        pgs2snippet1
+----------------------------
+ 最近、★PostgreSQL★の利用者
+(1 row)
+</pre>
+
+<p>pgs2snippet1では、キーワード(引数7)に複数の文字列を指定できます。複数指定するには、各文字列を"(半角ダブルクォート)で囲み、それらを+(半角プラス)でつなげます。</p>
+
+<p>実行例</p>
+<pre>
+=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '"PostgreSQL"+"HINT"', 'pg_hint_planは、PostgreSQLでHINT句を使えるようにするツールです。');
+            pgs2snippet1
+-------------------------------------
+ ★hint★_planは、★PostgreSQL★で★HINT★
+(1 row)
+</pre>
+<ul>
+<li>この実行例では、正規化を行う指定(引数1が1)になっているため、キーワードHINTは、小文字のhintにもマッチします。</li>
+</ul>
+<p>キーワード内の"と\は、pgs2snippet1ではメタ文字("は検索文字列の区切り文字、\はエスケープ文字)として解釈されます。 "と\を文字そのものとして解釈させるには、それらを\でエスケープしなければなりません。</p>
+
+<p>実行例</p>
+<pre>
+=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '"\"2-gram\""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。');
+         pgs2snippet1
+-------------------------------
+ ostgreSQLで★"2-gram"★の全文検
+(1 row)
+</pre>
+
+<p>このエスケープ処理は、<a href="#escape_snippet_keyword">ludia_funcs.escape_snippet_keyword</a>を有効にすることでpgs2snippet1に任せることもできます。</p>
+
+<h3 id="pgs2seninfo">pgs2seninfo</h3>
+<p>pgs2seninfoは、ludia_funcsが利用しているSennaのバージョン情報を表示する関数です。</p>
+<ul>
+    <li>戻り値1(text) - 利用しているSennaのバージョン番号</li>
+    <li>戻り値2(text) - 利用しているSennaのconfigureオプション</li>
+</ul>
+
+<p>実行例</p>
+<pre>
+=# SELECT * FROM pgs2seninfo();
+             version             |              configure_options
+---------------------------------+-------------------------------------------------
+ 1.1.2 (last update: 2013.04.05) |  '--without-mecab' '--prefix=/senna-1.1.2-fast/'
+</pre>
+
+<h2 id="parametares">パラメータ</h2>
+<h3 id="last_update">ludia_funcs.lastupdate</h3>
+<p>ludia_funcs.last_updateは、ludia_funcsモジュールの最終更新日付を報告するパラメータです。このパラメータは読み取り専用です。 postgresql.confやSET文で設定値を変更することはできません。</p>
+
+<p>実行例</p>
+<pre>
+=# SHOW ludia_funcs.last_update ;
+ ludia_funcs.last_update
+-------------------------
+ 2013.04.05
+(1 row)
+</pre>
+
+<h3 id="norm_cache_limit">ludia_funcs.norm_cache_limit</h3>
+<p>ludia_funcs.norm_cache_limitは、<a href="#pgs2norm">pgs2norm</a>が確保するキャッシュの上限サイズを指定するパラメータです。設定値はkB単位で指定します。設定値の範囲は -1 ~ 2TB-1B です。設定値-1(デフォルト値)は、キャッシュサイズ上限としてパラメータwork_memの設定値を使うことを意味します。設定値0は、キャッシュサイズの上限がない(常にキャッシュする)ことを意味します。このパラメータは、postgresql.confとSET文(スーパーユーザに限らずどのユーザからでも)で設定値を変更できます。</p>
+
+<h3 id="escape_snippet_keyword">ludia_funcs.escape_snippet_keyword</h3>
+<p>ludia_funcs.escape_snippet_keywordは、<a href="#pgs2snippet1">pgs2snippet1</a>のキーワード(引数7)内の"(半角ダブルクォート)と\(半角バックスラッシュ)をエスケープするかどうか指定するパラメータです。デフォルト値はoffで、エスケープしません。</p>
+
+<p>キーワード内の"と\は、pgs2snippet1ではメタ文字("は検索文字列の区切り文字、\はエスケープ文字)として解釈されます。 "と\を文字そのものとして解釈させるには、それらを\でエスケープしなければなりません。このパラメータを有効にすると、pgs2snippet1は、文字として解釈させたい"と\を自動的にエスケープします。このようなエスケープ処理をクライアントアプリケーション側で実装済の場合は、このパラメータは無効で構いません。</p>
+
+<p>このパラメータは、postgresql.confとSET文(スーパーユーザに限らずどのユーザからでも)で設定値を変更できます。</p>
+
+<p><a href="#pgs2snippet1">pgs2snippet1</a>に記述されている最後の実行例のSQLは、escape_snippet_keywordを使うことで、以下のように書き換えられます。</p>
+
+<p>実行例</p>
+<pre>
+=# SHOW ludia_funcs.escape_snippet_keyword ;
+ ludia_funcs.escape_snippet_keyword
+------------------------------------
+ off
+(1 row)
+
+=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '""2-gram""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。');
+ pgs2snippet1
+--------------
+ (null)
+(1 row)
+
+=# SET ludia_funcs.escape_snippet_keyword TO on;
+
+=# SELECT pgs2snippet1(1, 32, 1, '★', '★', 0, '""2-gram""', 'pg_bigmは、PostgreSQLで"2-gram"の全文検索を使えるようにするツールです。');
+         pgs2snippet1
+-------------------------------
+ ostgreSQLで★"2-gram"★の全文検
+(1 row)
+</pre>
+<ul>
+    <li>キーワード内の先頭と末尾の"は必ずメタ文字(検索文字列の区切り文字)として解釈されます。</li>
+</ul>
+
+<hr>
+<div align="right">Copyright (c) 2012-2013, NTT DATA Corporation</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/html/style.css b/html/style.css
new file mode 100644 (file)
index 0000000..dc480c2
--- /dev/null
@@ -0,0 +1,144 @@
+body {
+       font-family:
+               'メイリオ',
+               'Meiryo',
+               'ヒラギノ角ゴ Pro W3',
+               'Hiragino Kaku Gothic Pro',
+               'Osaka',
+               'MS Pゴシック',
+               Lucida Grande, Verdana, Arial, Helvetica,
+               sans-serif;
+       color: #202020;
+}
+
+/* give the rule a bit of extra space (above and below), since its being used to divide
+   sections on some pages (project summary) */
+HR { margin: 5px 0px 5px 0px }
+
+
+h2, h3, h4, h5, h6 {
+    color: Black;
+    background: none;
+    padding-top: 0.5em;
+    padding-bottom: 0.17em;
+    border-bottom: 1px solid #aaaaaa;
+}
+H1 { font-size: x-large; }
+H2 { font-size: large; }
+H3 { padding-left: 1em; font-size: medium; }
+H4 { padding-left: 2em; font-size: small; }
+H5 { padding-left: 3em; font-size: x-small; }
+H6 { padding-left: 4em; font-size: xx-small; }
+
+pre {
+       font-family: courier,sans-serif;
+       background-color: #F5F5F5;
+       border: 2px solid #000000;
+       color: black;
+       line-height: 1.1em; padding: 0.5em;
+       overflow: auto;
+}
+
+li {
+       line-height: 1.4em;
+}
+
+dt {
+       padding-left: 1em;
+}
+
+a,
+a:link,
+a:visited,
+a:active {
+    color: #02497E;
+    text-decoration: underline;
+}
+
+a:hover {
+    color: #89b229;
+}
+
+table {
+       border: 1px solid #000;
+       border-collapse: collapse;
+}
+
+th, td {
+       border: 1px solid #000;
+       padding: 0.2em;
+}
+
+thead th {
+       background: #aaa;
+       text-align: center;
+}
+
+tbody th {
+       background: #cceeff;
+       text-align: left;
+}
+
+div.index {
+       float:right;
+       border:thin solid black;
+       background-color: white;
+       padding-top: 0.2em;
+       padding-bottom: 0.2em;
+       padding-left: 1em;
+       padding-right: 1em;
+       margin-left: 0.5em;
+}
+
+p.padding {
+       padding-left: 1em;
+}
+
+p.footer {
+       text-align: right;
+       font-size: small;
+}
+
+span.param {
+       color: #0000cd;
+}
+
+span.strong {
+       font-weight: bold;
+       text-decoration: underline;
+}
+
+#navigation
+{
+       display: block;
+       font-weight: bold;
+       font-size:110%;
+       text-align:center;
+       border-top: 1px solid #aaa;
+       border-bottom: 1px solid #aaa;
+}
+
+#navigation ul
+{
+    padding: 0;
+    margin: 0;
+    line-height: 36px;
+}
+
+#navigation li
+{
+    display: inline;
+    margin-left:36px;
+}
+
+#navigation a,
+#navigation a:link,
+#navigation a:visited,
+#navigation a:active {
+    color: #000;
+    text-decoration: none;
+}
+
+#navigation a:hover {
+    text-decoration: underline;
+}