OpenPNE[Free SNS【ソーシャルネットワーキングサービス】]

更新日 2010-04-22 (木) 21:56:16

OpenPNEのインストール

OpenPNEはフリーのSNSでMySQL+PHPで実現でき携帯からもアクセスできるソフトである。そこでVine4.xにインストールしてみた。ここからDownloadしてくる。使用するソフトはApache,php,MySQLなので以下のものが入っているかCheckし、インストールされていないときはrpmでインストールを行う

事前準備

# apt-get install MySQL
# apt-get install MySQL-client
# apt-get install php5-apache2-5.2.5-0vl1
# apt-get install php5-mysql

など

php.ini

[Vine]
output_buffering = Off
expose_php = Off
;;memory_limit = 32M  
memory_limit = 128M
variables_order = "GPCS"
;;default_charset = EUC-JP   <==コメントアウト
extension_dir = /usr/lib/php5
allow_url_include = Off
sendmail_path = /usr/sbin/sendmail -t -i
session.save_path = "/var/php5/session"
session.use_only_cookies = On
session.use_strict_mode = On
session.entropy_file = /dev/urandom
session.entropy_length = 32
session.hash_function = 1
;;mbstring.language = Japanese   <==コメントアウト
;;mbstring.internal_encoding = EUC-JP   <==コメントアウト
;;mbstring.http_input = auto     <==コメントアウト
;;mbstring.http_output = pass    <==コメントアウト
;;mbstring.encoding_translation = On    <==コメントアウト

とくに最後の5行をコメントアウトしないと日本語表示はできるが、日本語入力が繁栄されない

MySQLのデフォルトをUTF-8に変更

my.cnf

[client]
default-character-set = utf8
#password       = your_password
# The MySQL server
[mysqld]
default-character-set=utf8
port            = 3306
[mysql]
default-character-set = utf8
no-auto-rehash

インストール

# cd /var/www
# tar zxvf /usr/local/src/OpenPNE-2.10.4.tar.gz
# mv OpenPNE-2.10.4 OpenPNE
# chown -R apache.apache OpenPNE
# chmod -R 777 OpenPNE/var/

MySQLの設定

# mysql -u root -p
mysql> grant all privileges on openpne.* to openpne@localhost identified by '******';
Query OK, 0 rows affected (0.03 sec)

mysql> create database openpne CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)

openpneデータベース初期設定

# mysql -u openpne -p openpne \
< /var/www/OpenPNE/setup/sql/mysql41/install/install-2.10-create_tables.sql

# mysql -u openpne -p openpne \
< /var/www/OpenPNE/setup/sql/mysql41/install/install-2.10-insert_data.sql

pnebiz(グループウエア)の設定

ヘッダー部に「グループウェア機能はこちら →  施設予約  予定登録  グループ」を表示するには

# mysql -u openpne -p openpne \
< /var/www/OpenPNE/setup/sql/mysql41/option/pnebiz-header.sql

ただしこのときは設定画面で「SNS設定」でBIZ使用設定を使用するにしなとページが見つからないエラーが出る

OpenPNEの設定

# cd OpenPNE/
# cp config.php.sample config.php

ランダムな56桁の文字列を取得※OpenPNE設定ファイル編集で使用

# apt-get install expect  (mkpasswdコマンドがない場合)
# mkpasswd -l 56 
8ramMdfTxykhprvytrfliesxzoyqwqyxfpqefkt@imqoc0unipdtypfa

config.php

OPENPNE_URLとOPENPNE_SSL_URLをIPではなくhttp://abc.ne.jp/openpne/のように指定すると携帯でLoginできない(このバージョン2.10.4だけかもしれないが)

// Web上の絶対パス(URL)(最後にスラッシュを付ける)
define('OPENPNE_URL', 'http://192.168.1.1/openpne/');

// DBサーバ設定
$GLOBALS['_OPENPNE_DSN_LIST']['main'] = array(
'dsn'  => array(
    'phptype'  => 'mysql',
    'username' => 'openpne',   <==DB
    'password' => '******',
    'hostspec' => 'localhost',
    'database' => 'openpne',
    'new_link' => false,
    ),
);

// DB暗号化キー(56バイト以内のASCII文字列)
define ('ENCRYPT_KEY', '8ramMdfTxykhprvytrfliesxzoyqwqyxfpqefkt@imqoc0unipdtypfa'); ← ランダムな56桁の文字列を指定

// メールサーバードメイン
// 携帯メール投稿の宛先などのドメイン名に使われる
define('MAIL_SERVER_DOMAIN', 'mie-chukyo-u.ac.jp'); ← メールサーバードメイン名を指定

//--- オプション設定

// デバッグモード
// 0: off ... エラー非表示、エラーログを記録する
// 1: on  ... エラー表示、エラーログを記録しない
// 2: on  ... 1 + Smartyデバッグコンソール
// define('OPENPNE_DEBUGGING', 1);
define('OPENPNE_DEBUGGING', 0);


///
// SSL設定
///

// 特定ページだけのSSLを使用するかどうか
//define('OPENPNE_USE_PARTIAL_SSL', false);
define('OPENPNE_USE_PARTIAL_SSL', true);


// SSL用URL (Cookieの値を引き継ぐため、OPENPNE_URL と同一ドメイン・パスである必要があります)
//define('OPENPNE_SSL_URL', 'https://sns.example.com/');
define('OPENPNE_SSL_URL', 'https://192.168.1.1/openpne/');


// SSLを使用することが必須であるアクションリスト
$GLOBALS['_OPENPNE_SSL_REQUIRED'] = array(
'admin' => array(     <==追加
    'page_login',     <==追加
),                    <==追加
'pc' => array(
    'page_o_regist_prof',  'page_o_regist_prof_confirm', 'do_o_regist_prof',

'ktai' => array( 
//    'page_o_login', 'do_o_login', 'do_o_easy_login',
//    'page_o_login2', 'do_o_update_ktai_address',
//    'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member',
//    'page_o_regist_end',
//    'page_o_password_query', 'do_o_password_query',
//    'page_h_config_prof', 'do_h_config_prof_update_c_member',
//    'page_h_config_easy_login', 'do_h_config_easy_login',
//    'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre',
//    'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre',
//    'page_h_config_password_query', 'do_h_config_password_query_update_password_query',
//    'page_h_config_password', 'do_h_config_password_update_password',
//    'page_h_config', 'page_h_invite', 'do_h_invite_insert_c_invite',
));

// SSLを使用するかどうかをユーザーが選択できるアクションリスト
$GLOBALS['_OPENPNE_SSL_SELECTABLE'] = array(
'pc' => array(
),
'ktai' => array(
//以下を追加し、携帯でもSSLを使用可能にする。ただし'page_o_login2', 
//'do_o_update_ktai_address'は携帯への初めてのメールで認証作業がSSLで
//送られるのでそれをSSL化しなようにコメントアウトこれでSSLが使用可能になる
//ただし、不具合も考慮し、アクセス方法はユーザーが選択

    'page_o_login', 'do_o_login', 'do_o_easy_login',
//    'page_o_login2', 'do_o_update_ktai_address',
    'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member',
    'page_o_regist_end',
    'page_o_password_query', 'do_o_password_query',
    'page_h_config_prof', 'do_h_config_prof_update_c_member',
    'page_h_config_easy_login', 'do_h_config_easy_login',
    'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre',
    'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre',
    'page_h_config_password_query', 'do_h_config_password_query_update_password_query',
    'page_h_config_password', 'do_h_config_password_update_password',
    'page_h_config', 'page_h_invite', 'do_h_invite_insert_c_invite',
));

携帯(ktai)だけコメントアウトはSSLのおれおれ認証で、auなどが使用できない場合やsoftbankでlogoutでエラーするのでSSLを使用しない方法で回避ちょっとセキュリティは無視

地図を利用するためGoogle Maps API keyを取得してconfig.phpの455行くらいにセット

///
// Google Maps API key
// http://www.google.com/apis/maps/ から取得
///
define('GOOGLE_MAPS_API_KEY', 'ABQIAAAAlAldUyiDHCoKI_79WJEOoBQViC3-u1-ZYzSYkS3SvbWG7lPuqxQCcQ4hg6Tq_DXY_Id5sOw25uq1pg');

OpenPNE用CRON登録

# crontab -e
00   6 * * * /bin/sh /var/www/OpenPNE/bin/tool_send_dairy_news.cron     /var/www/OpenPNE/bin/ /usr/bin/php
00   6 * * * /bin/sh /var/www/OpenPNE/bin/tool_send_birthday_mail.cron  /var/www/OpenPNE/bin/ /usr/bin/php
00   6 * * * /bin/sh /var/www/OpenPNE/bin/tool_send_schedule_mail.cron  /var/www/OpenPNE/bin/ /usr/bin/php
*/20 * * * * /bin/sh /var/www/OpenPNE/bin/tool_rss_cache.cron           /var/www/OpenPNE/bin/ /usr/bin/php

SNS管理者宛メールの転送設定

/etc/postfix/aliases

sns: webmaster

メール投稿設定(携帯電話からも使用する場合のみ)
携帯電話からのメール投稿を受け付けるように設定
ただし、PCRE形式の正規表現が利用できるように以下のpostfix-pcreをインストールする必要がある。忘れると、メールを他のサーバから受信できなくなるので注意。

maillogにpostfix起動時に「 Is the postfix-pcre package installed?」のようなWaringが残る

オプションの "pcre" マップタイプを使うと、\s は空白で \S は非空白文字といった、 PCRE 形式の表記法で正規表現が指定できるようになる。

# apt-get install postfix-pcre

準備中...                   ########################################### [100%]
   1:postfix-pcre           ########################################### [100%]
Adding pcre map entry to /etc/postfix/dynamicmaps.cf

/etc/postfix/aliases.regexpを作成

/^get(@.*)?$/ "|/usr/bin/php /var/www/OpenPNE/bin/mail.php"
/^p[0-9]+-[0-9a-z]{12}(@.*)?$/ "|/usr/bin/php /var/www/OpenPNE/bin/mail.php"
/^t[0-9]+-[0-9a-z]{12}(@.*)?$/ "|/usr/bin/php /var/www/OpenPNE/bin/mail.php"
/^b[0-9]+-[0-9a-z]{12}(@.*)?$/ "|/usr/bin/php /var/www/OpenPNE/bin/mail.php"

/etc/postfix/main.cf

alias_maps = hash:/etc/aliases, pcre:/etc/postfix/aliases.regexp
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^追加
# /etc/rc.d/init.d/postfix restart

cronから余計なメールを出さないようにする

# cd OpenPNE/bin

tool_send_dairy_news.cronを修正

#! /bin/sh
cd $1
2 -f tool_send_daily_news.php > /dev/null
                             ^^^^^^^^^^^^追加

Apache設定

以下のファイルを作成し、OpenPNEのアクセスパスを指定する
/etc/apache2/conf.d/openpne.conf

Alias /openpne /var/www/OpenPNE/public_html
# /etc/rc.d/init.d/apache2 reload

OpenPNE確認

セットアップ

http://サーバー名/openpne/?m=setupへアクセス 
必ず下記の設定をおこなってからセットアップを実行してください。

setup/sql/mysql4x/install-2.10-create_tables.sql の実行 
setup/sql/mysql4x/install-2.10-insert_data.sql の実行 
config.php の設定 
一度、セットアップを実行した後でこのページを表示することはできません。
セットアップをやり直したい場合はデータベースを空にしてからこのページへアクセスしてください。

というメッセージが出るがすでにopenpneデータベース初期設定を行っているのでOK

login画面
https://192.168.1.1/openpne/?m=pc

管理画面
https://192.168.1.1/openpne/?m=admin&a=page_login

あとはGUI上から設定

注意事項

携帯から

「設定変更」で携帯からアクセスできるようにするには、携帯にメールを送り一度その携帯からloginしてからでないと単にhttp://(サーバ)/openpne/?m=ktaiでアクセスして携帯のアドレス、パスワードを入れてもloginできない。
また、一度loginすると先の携帯メールを設定するページに削除画面が追加されるので確認できる

簡単ログイン

SoftBankの3Gではどうも製造番号がOFFなので製造番号通知をONにする

以下のようなページもあった。UIDを取得するらしいが、今回は設定しない。

softbank3G携帯ではUIDが取得できるため、こちらを取得すればログインができるはずです。 

試しに実装してみました webapp/lib/OpenPNE/KetaiID.phpの77行目 

        // SoftBank
        elseif (!strncmp($ua, 'SoftBank', 8)) {
            $pieces = explode('/', $ua);
            $piece_sn = explode(' ', $pieces[4]);
            $sn = array_shift($piece_sn);

            if (!strncmp($sn, 'SN', 2)) {
                $id = $sn;
            }
        }
を 

        // SoftBank
        elseif (!strncmp($ua, 'SoftBank', 8)) {
            $pieces = explode('/', $ua);
            $piece_sn = explode(' ', $pieces[4]);
            $sn = array_shift($piece_sn);
            if (!strncmp($sn, 'SN', 2)) {
                $id = $sn;
           }else{
            // 固体番号が取得できない場合にUIDを取得
                $headers = apache_request_headers();
                if ($headers["x-jphone-uid"]) {
                    $id = $headers["x-jphone-uid"];
                }
            }
        }

ちょっと改造

フリーページ

お知らせ->フリーページ管理でログイン前、ログイン後のHTMLページを作成できるがそのページへのリンクは

<a href="./?m=pc&a=page_o_free_page&c_free_page_id=1" target="_blank">ほげほげ</A>

とする。idでページを区別する

緯度・経度

Map表示設定時に緯度経度が必要なのでそのページを「コミュニティ設定変更」に追加

webapp/modules/pc/templates/c_edit.tpl
305行前後

<div class="padding_s">
緯度:<input class="text" name="map_latitude" type="text" size="14" \
value="({$c_commu.map_latitude})" id="lat">&nbsp;
                                  ^^^^^^^<==追加
経度:<input class="text" name="map_longitude" type="text" size="14" \ 
value="({$c_commu.map_longitude})" id="lng">&nbsp;
                                   ^^^^^^^<==追加
拡大率:<input class="text" name="map_zoom" type="text" size="4" value="({$c_commu.map_zoom})" maxlength="2"><br>
(以下のjavascriptを追加
<script type="text/JavaScript">
<!--
function winOpen(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
//-->
</script>

<A HREF="#" onclick="winOpen('/mapinput/input.php','newWindow', \
'scrollbars=yes width=850,height=700')"> \
ここ</A>から、緯度・経度を取得することができます。<BR> <==追加

※手動設定の場合は、都道府県の選択で「その他(手動設定)」を選んでください。
</div>

/var/www/html/mapinput/input.phpのサンプルは添付

です。

バージョンアップ

マイナーバージョンアップ

  1. 新しいバージョンを/var/wwwに展開して、config.phpとvarディレクトリを旧バージョンよりコピーする。
  2. 変更を行ったphp等のファイルを同じように変更する
  3. 旧バージョンをOpenPNE-X.Y.Zとりネームして、新しいバージョンをOpenPNEにリネームする
  4. 一応Postfixをリロードを行う

その他

「招待メールドメイン制限」に追加して招待メールを送りその後そのユーザが一度loginすればその後そのドメインを削除してもアカウントは有効だが、login前にそのどメンを制限すると登録ができなくなるのでloginできない (Ver. 2.10.4.2)

コミュニティ管理者の交代
コミュニティ管理の譲渡は管理者が

  1. 管理しているコミュニティを開きます。
  2. 「コミュニティメンバー」が表示されている下部にある[メンバー管理]のリンクをクリックすると、コミュニティ参加者一覧が表示されます。
  3. 管理権を譲渡したい人を探し、[管理権を渡す]をクリックします。
  4. 管理人交代依頼を送信する画面が表示されるので、依頼する場合は[送信]をクリックします。
  5. 管理権の交代依頼のメールを受けた人が、交代の承認をおこなえば管理人の交代完了です。

同じメニューで副管理者を任命することができる

副管理者について

  • メンバーをコミュニティから退会させる権限はありません。
  • 承認が必要なコミュニティの場合は、入会依頼を副管理者権限で承認はできますが、拒否する権限はありません。
  • コミニュニティを削除する権限はありません。

参考

携帯からPCメールアドレスの設定

携帯からPCメールアドレスを設定してもユーザが設定したメールアドレスを確認し、 設定確認をおこなわないと、管理者のメンバーリストのPCメールアドレスに表示しない
この場合はc_pc_address_preとい一時保管テーブルに入っている。

mysql> select * from c_pc_address_pre;
+--------------------+-------------+----------------------------------+--------
--------------------------+---------------------+
| c_pc_addess_pre_id | c_member_id | pc_address                       |
 session                          | r_datetime          |
+--------------------+-------------+----------------------------------+--------
--------------------------+---------------------+
|                  2 |           4 | okada@abc-u.ac.jp |
xxxxe0043xxx6d7dxx2cec09a5exxxxx | 2008-03-01 15:11:15 |
+--------------------+-------------+----------------------------------+--------
--------------------------+---------------------+
1 row in set (0.00 sec)

また、確認時にPCアドレスを登録後PCでloginする前の状態 メールにきたURLから登録終了するとき 以下のエラーが出るようだがうまく登録できている 原因不明

このURLは既に無効になっています。

また、確認後はパスワードやメールアドレス(携帯も含む)は以下のテーブルに保存される。(暗号化されている)

 c_member_secure

smarty

デザインのテンプレート挿入では使用できるがSmartyテンプレート形式で記述する必要がある。あまりお勧ではないようだが、Smartyテンプレート形式はまだ勉強前なのでテンプレート中にphpの記述を行うことで逃げる。
しかしながら、そのままではOpenPNEでは、テンプレート挿入時で、phpのテンプレートタグが無視され、さらに実行時も「PHPコードを実行せずにそのまま出力」となっているので、以下のファイルを3か所修正する。

lib/include/Smarty/Smarty.class.php

200行

     * @var integer
     */
/*    var $php_handling    =  SMARTY_PHP_PASSTHRU; */
    var $php_handling    =  SMARTY_PHP_ALLOW;    <==ALLOWに変更

    /**

230行

     */
    var $security_settings  = array(
                                   /* 'PHP_HANDLING'    => false,*/
                                    'PHP_HANDLING'    => true, <=trueに変更
                                    'IF_FUNCS'        => array('array', 'list',
                                                               'isset', 'empty',
                                                              'count', 'sizeof' ,
                                                                'in_array', 'is_array',
                                                               'true', 'false', 'null'),
                                    'INCLUDE_ANY'     => false,
                                   /* 'PHP_TAGS'        => false, */
                                    'PHP_TAGS'        => true, <=Trueに変更
                                    'MODIFIER_FUNCS'  => array('count'),
                                    'ALLOW_CONSTANTS'  => false
                                   );

$php_handling
smartyのこの変数がテンプレートに埋め込まれた PHP コードの扱いを設定

  • SMARTY_PHP_PASSTHRU - PHPコードを実行せずにそのまま出力します。
  • SMARTY_PHP_QUOTE - PHPコードをHTMLエンティティとして表示します。
  • SMARTY_PHP_REMOVE - PHPコードをテンプレートから除去します。
  • SMARTY_PHP_ALLOW - PHPコードを実行します。

テンプレートのデリミタ
テンプレートタグは、デリミタによって囲まれ、デフォルトのデリミタはカーリブラケット { }
{php} {/php}

Openpneでは デリミタが({ })

({php}) ({/php})


({php}) 

echo "abc <br>";

({/php})

SmartyのテンプレートでURLのデータ取得

アクセスが openpne/?m=pc&a=page_c_home&target_c_commu_id=1 のときテンプレートで

({$smarty.get.target_c_commu_id})とすると1を取得することができる

({if $smarty.get.target_c_commu_id eq '1'})
   OKです<BR>      <==target_c_commu_idが1の時
({elseif $smarty.get.target_c_commu_id eq '2'})
   ぼちぼち <BR>
({else})
   だめです <BR>
({/if})

topページ(?m=pc&a=page_h_home)でユーザidを取得するには

ID = ({$c_member.c_member_id})

プロフィール情報の取得

c_member_profileテーブルから、c_member_id と c_profile_idで所得できる

たとえばc_profile_idが9にセットされた情報の取得

// DBのパラメータセット
       $db_host = $GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['hostspec'];

       $db_user = $GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['username'];

       $db_pass = $GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['password'];

       $db_name = $GLOBALS['_OPENPNE_DSN_LIST']['main']['dsn']['database'];

       $u = $GLOBALS['AUTH']->uid();   //ユーザID

       $conn = mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error());
       mysql_select_db($db_name);
//ユーザIDとプロフィールIDで選択
       $sqlcmd ="SELECT * FROM c_member_profile where c_member_id = $u and c_profile_id = 9" ;

       $result = mysql_query($sqlcmd);
       $count = mysql_num_rows($result);

       $r = mysql_fetch_array($result);
       $kubun = $r["value"];

//複数ヒットするときの例
//     $i = 0;
//         while ($r = mysql_fetch_array($result)){
//               $kubun[$i] = $r["value"];
//               $i++;
//       }

       echo "区分 $kubun <Br>";

携帯のSSLページJump

アンカーを通常のようにすると自己認証の場合Softbankではエラーが認証エラーが生じるが、一度ダミーページに飛ばし、その後SSLのダミーページ=>SSLTopページとするととよい。
このときページがphpでは認証エラーが生じるが、htmlだとOKだった

第一のページ
ktaissl.html

<FORM ACTION="https://192.xxx.xxx.xxx/openpne_data/ktaissl2.html?m=ktai" METHOD="POST" NAME="f">

<INPUT TYPE="submit" VALUE="SSLへ">
</FORM>

第2のページ
ktaissl2.html

<form action="/openpne/?m=ktai" method="post" name="f">
<input type="submit" value="SSLあり">
</form>

【携帯版】HTML挿入(ページ上部)

<a href="http://192.xxx.xxx.xxx/openpne_data/ktaissl.html">SSLあり</a>

紹介制から、登録制に変更

以下のようにソース変更より管理画面からデザイン=>ナビゲーション変更でいいかも

ほかにも修正が必要かも

「友達を誘う」以下のページで行っているのでアクセス不可にする chmod a-rwx

  • webapp/modules/pc/page/h_invite.php
  • webapp/modules/ktai/page/h_invite.php

以下のページがパソコンのリンク元なので以下のように変更する

  • webapp/lib/util/util.php
/* array('url' => '?m=pc&a=page_h_invite', 'caption' => '友人を誘う'), */
array('url' => '#', 'caption' => '友人を誘う'),

以下のページが携帯のリンク元(コメントアウト)

  • webapp_biz/modules/ktai/templates/h_home.tpl
  • webapp/modules/ktai/templates/h_home.tpl
 ({if $smarty.const.IS_USER_INVITE && ($smarty.const.OPENPNE_REGIST_FROM != 
$smarty.const.OPENPNE_REGIST_FROM_NONE)})[i:140]<!-- <a href="({t_url m=ktai 
a=page_h_invite})&amp;({$tail})">友人を誘う</a> --><br>({/if})

以下のところに携帯で紹介制だとあるので変更

  • webapp/modules/portal/templates/portal_user_top_ktai.tpl
  • webapp/modules/portal/templates/preview_ktai.tpl
  • webapp/modules/ktai/templates/o_login.tpl

変更前

({$SNS_NAME})は招待制のソーシャルネットワーキングサービスです。<br>
登録には({$SNS_NAME})({if $smarty.const.IS_USER_INVITE})参加者({else})管理者({/if})からの招待が必要です。<br>

変更後

({$SNS_NAME})は学内専用のソーシャルネットワーキングサービスです。<br>
登録には({$SNS_NAME})({if $smarty.const.IS_USER_INVITE})管理者({else})管理者({/if})からの招待が必要です。<br>

参考ページ


添付ファイル: fileinput.php 353件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-04-22 (木) 21:56:16 (3105d)