OpenPNEの最近のブログ記事

うちで運営している広島地域 SNS(というと語弊があるか(^^; 実験サイトだし)の i-bee で、Skype ボタンを復活させました。

やり方は簡単。ちょっとテンプレートを直すだけ。
 ↓
http://e-parlor.org/wiki/openpne:skype

skype.jpgマイフレンドが SkypeID を登録していたら、写真の下に Skype のボタンが表示されます。

実は、i-bee がスタートしてすぐくらいに(2006年4月だね)、手嶋屋社長のブログで読んでこの機能は組み込んでて、i-bee に参加してくれてた Web デザイナさん達と Skype で打合せをする時のランチャにしてたんだけど。

OpenPNE のバージョンを 2.0.2.1 から 2.0.7.4 に上げた時点ですっかり対応を忘れてて、途中で誰かに指摘されて「ああ、消えてるな」というのは知ってたんだけど、その時には自分が Skype 使ってなかったんで無視してたという・・・(^^;

で、今回、サーバ移行作業のついでに復活させておきました。:-)

・・・が、今の自宅のパソコンには Skype 入ってないんだよなあ。
INS64 じゃ、ダウンロードするのも面倒くさいし。(^^;
誰かちゃんと機能してるかテストして。(笑)

以前もここに書いたことがあるが、うちで運営している某地域 SNS(OpenPNE のカスタマイズで構築)のサーバの引っ越しをしたいのだが、新しいサーバで何故かログインが出来ないため引っ越し中断・・・という状況が発生していた。

原因はわかっていて、ログインIDであるメールアドレスが可逆暗号化され DB に格納されているのだが、その可逆暗号化の結果が新旧のサーバで異なるためである。

OpenPNE は Blowfish.php というライブラリを使用して可逆暗号化を行うが、具体的には、以下のように何らかの環境の違いで、暗号化された結果の値がサーバにより異なってしまうのだ。(俺が OpenPNE のプログラムを元に作った encode/decode プログラムで試してみた)

(例)

旧サーバで、アドレス hoge@exsample.jp を可逆暗号化。

% ./address_encode.php hoge@exsample.jp
KAE+4mgyUhML7DfiOOerPA==

得られた結果を、同じ旧サーバで復号してみる。

% ./address_decode.php KAE+4mgyUhML7DfiOOerPA==
hoge@exsample.jp

バッチリ復号できる!

で、この暗号化されたコードを、新サーバで同じように復号してみる。

% ./address_decode.php KAE+4mgyUhML7DfiOOerPA==
*エ喀:t.^+7僖甍ヌ

うぎゃあ。化け化けになって駄目じゃん。

ちなみに、同じアドレスを新サーバで可逆暗号化すると、まったく違う結果になる。

% ./address_encode.php hoge@exsample.jp
3ATgPj5OoPcpqogJG2uGhg==

で、もちろんこれは復号出来る。

% ./address_decode.php 3ATgPj5OoPcpqogJG2uGhg==
hoge@exsample.jp

・・・ということだ。

なので、旧サーバの DB の内容を単純にバックアップ&リカバリしただけでは SNS にログイン出来ないのである。

結局、旧サーバで一旦 c_member_secure テーブルの内容を復号してファイルに保存。
新サーバで DB をそのままリカバリした後、このファイルをもとに改めて可逆暗号化を行い、c_member_secure テーブルを UPDATE するという移行ツールを作って対応。

これで、PC からのログインも、携帯からのログイン(簡単ログイン含む)もばっちりOK!となった。

いやあ、しかし、何でこんな事が起きるんかねえ。
OS の違いは関係ないんだろうけど。(旧サーバは FreeBSD 6.0-RELEASE、新サーバは CentOS release 5.4)
PHP(PEAR 含む)のバージョンが全然違うので、そのせいかねえ。

こういう現象が世の中で沢山起きていれば商売になるのだがなあ・・・(^^;

OpenPNE で、新規会員の登録完了時、c_member_id に 0 がセットされてしまう件
別の場所でテストしてみたら、ついにうちのテスト環境でもエラーが出てしまった。
(出たり出なかったりという状況)

というわけで、結局、今の今まで調査をさせられるハメになったが、鬼のように PHP スクリプト内に DEBUG 用の情報をファイルに吐き出す処理を入れて、処理の流れをトレースしてみたら・・・

何か、MODE=register な処理が時々2回走ってるんですけど・・・
で、2回走った時は高い確率でエラーになる。(ならない時もある)

結局、InternetExplorer のバグなんだよなあ。
これ。
 ↓
input type=image で フォームが2回送信される
http://support.microsoft.com/kb/822276/ja

バグだとわかっているのに何もしない Microsoft って・・・。おかげで、俺の貴重な時間が失われてしまったじゃないか!(怒)

最初のテストで、うちでは InternetExplorer 6 でも 100% の確率で正常に処理出来ていたのは、どうもうちの回線が遅かった(INS64 だ!)せいのようじゃね。
2回目の送信の結果(DB への二重登録でエラーになり、その時、c_member_id に 0 をセットした URL にリダイレクトされる)が来る前に、1回目の結果が返ってくるので問題なかったんだろう。回線が遅いから、2回目のデータがなかなかサーバに届かないってことだろう。

今日テストをしたのは NTT の光サービスにぶら下がっている PC だが、この場合も、コメントに長文を入れるなど、送信データをでかくしてやると、高確率で正常終了していたので、この読みは当たっていると思うがな。

つーことで、送信ボタンを画像で作って、

<input type="image" src="img/button.jpg" name="submit" onclick="submit();" alt="この内容で登録" />

なんてしてたんだけど、onclick="submit();" を削除したら、IE6, 7 でも正常に登録出来るようになった。

ほんまに、Microsoft には酷い目に遭わされてばかりや・・・とほほ。

OpenPNE の不思議な現象。

新規会員登録をすると、最後に登録完了画面が表示されるんだけど、「エラーが発生しました。 c_member_idは1以上の数値で入力してください」というエラーが出てしまうことがある・・・らしい。(うちの環境では発現しない)

登録処理の後、Location ヘッダで完了画面に飛ばしていると思うのだが、例えば、

http://sns.exsample.co.jp/?m=pc&a=page_o_regist_end&c_member_id=30

に飛ばすはずが、

http://sns.exsample.co.jp/?m=pc&a=page_o_regist_end&c_member_id=0

のように、c_member_id に正しい ID ではなく 0 がセットされているのが原因のようだ。

・・・が、どういうときに 0 がセットされるのか全然わからない。

最初、お客さんから「InternetExplorer7 で登録処理をするとエラーが発生する」と言われたのだが、当社のテスト環境は、

・InternetExplorer 8 on Vista Business SP2
・Forefox 3.5.3 on Vista Business SP2
・InternetExplorer 6 on XP Professional SP3
・safari 3.1.1 on Mac OS X 10.5.3

しか無いので(ああ、VMware 上の CentOS 5 や 2000 SP4 環境もあるけど、今回はそこまではねえ・・・「メジャー」な環境での動作テストなので)、そのいずれでもエラーは発生せず。
InternetExplorer 6 on XP Professional SP3 な環境については、接続回線も(当然、プロバイダーやルータ等の機器も)変えてやってみたが問題無し。

「この状況では、そちらの環境に問題があるのでしょう・・・としか言えないので、もう少しエラーが発生するパターンを見つけてほしい」とお客さんには依頼しているのだが・・・

ただ、経路で(ルータやファイアウォール等で)c_member_id=0 に変換されているとは考えづらいので、やはり何らかのケースでは、OpenPNE が 0 をセットしてしまうのだろうなあ・・・

ま、今のところ、ある特定のお客さんの環境でしか発生していないので、これ以上対応する気はないのだが、調査だなんだで二日無駄にしたよ。ただでさえユーザ要件が混乱してオーバーワーク気味の案件なのに・・・とほほ。

うちで運営している地域 SNS のお知らせメール(デイリーニュース)が今朝は配信されてなかった。

サーバに入って maillog を見てみると、

Sep 30 08:01:32 snsserv postfix/qmgr[58514]: 94EE75096C: from=<sns@snsserv.exsample.com>, size=4796, nrcpt=1 (queue active)
Sep 30 08:01:32 snsserv postfix/qmgr[58514]: 94EE75096C: to=<hogehoge@xxx.xxxx.ne.jp>, relay=none, delay=7268, status=deferred (delivery temporarily suspended: connect to mail2.exsample.com[202.XXX.XXX.XXX]: Connection refused)

なんてログが山のように・・・

ああ・・・そうだ・・・以前、この地域 SNS サーバを非固定 IP で運用していたとき、怪しいサーバと判断してメールを受け取ってくれないサーバがあったので、固定 IP の mail2.exsample.com を経由(RELAY)するよう設定してたんだった。

で、実は、昨夜、mail2.exsample.com は SMTP を止めたのよ。
以前、ここでも書いたように、このサーバを預けていたデータセンターがハウジングのサービスを止められるもんで。今日、実際にサーバを撤去したんでね。前夜に SMTP サービス自体は止めてたって話。

ということで、Postfix の設定を変更を。

/usr/local/etc/postfix/main.cf の中に、

relayhost = mail2.exsample.com

という記述があるのでコメントにして、

# /usr/local/sbin/postfix reload

で設定ファイルを再読込させる。これでOK!

後は、queue に溜まっているメールを、

# postqueue -f

で、強制排出。

ま、こんなことせずにほっておいても、そのうち配送されるんだけどねえ。

いやあ、しかし、Postfix を使っているのはこの SNS サーバだけなので、毎度コマンドを思い出すのに時間がかかるよ。(メモしとけって話だけど(^^;)

ま、そのうちこの地域 SNS もサーバを移すので、その時には Postfix ではなく、qmail の利用に変更しようてえ。

色々事情があって、OpenPNE の「メッセージを送る」画面でメッセージ送信をすると、OpenPNE のユーザのメールアドレスに直接メールを送信する機能を Perl で実装した。

OpenPNE ではメールアドレスは暗号化されているので、OpenPNE のソースを元に、以下のような復号化スクリプトを書いて復号を行った。

#!/usr/local/bin/php
<?php
    $address = $argv[1];
    define('ENCRYPT_KEY', 'hogehoge_key');
    $path ="/www/lib/include";
    set_include_path(get_include_path() . PATH_SEPARATOR . $path);
    include_once 'Crypt/Blowfish.php';
    $blowfish = new Crypt_Blowfish(ENCRYPT_KEY);
    $address = base64_decode($address);
    $address = $blowfish->decrypt($address);
    echo $address;
?>

で、不思議なことに、hogehoge3@exsample.co.jp宛のメールアドレスにはメールが届くのに、hoge@exsample.co.jp宛には届かない。
どちらも、ちゃんと存在しているメールアドレスなのにだ。

原因は、復号されたメールアドレスにあった。
どうも、上記のスクリプトで復号すると、24バイト以下のメールアドレスの後ろに 0x00 のコード(NULL)がセットされてた・・・

一応、後ろにスペースがセットされてたらやだなと思って、Perl 側で、

$address =~ s/\s//g;

な置換はかけてたんだけど、NULL値は \s じゃ引っかからんのね・・・

ということで、

$address =~ s/[\x00]//g;

として不要な NULL値を削ってやったら、問題なくメールが届くようになった。

ああ、ほんまに、ラピッドサイトサーバは maillog が見れないんで駄目駄目サーバだ。
独自のシステムを動かしたい企業は、月数千円の金をケチるのはやめて、WebARENA とかを使うべきである。(・・・て話は、この間もしたな(^^;)

今、「サイト全体で OpenPNE の cookie を参照したいのだが」を書いたばかりだけど・・・

うまくいきました・・・
やっぱ、俺のやり方で間違ってなかったのだ。俺、天才。
どうも、古いクッキー情報(path に OPENPNE_URL を指定したもの)が残っていたために、うまくいかなかったようだ。

一応、InternetExplorer7 で、[ツール]→[インターネットオプション]で Cookie の削除もしたのだが、どうもちゃんと消えてなかったようで・・・他に IE7 のウィンドウが開いていたせいか???
全ての IE7 を一旦閉じて、もう一度チャレンジしたら上手くいった。(^^;

これで、CGI から PHPSESSID が取れるので、OpenPNE の認証が終わっているかどうかの判断が出来る。

ばっちり!
う~ん・・・

OpenPNE(OpenPNE-2.12.11)の cookie 情報をサイト全体で参照したいのだが、なかなかうまくいかん。

例えば、OpenPNE の URL(OPENPNE_URL)を、http://exsample.jp/AAA/ とする。
で、http://exsample.jp/BBB/ の下で動いている CGI から cookie を参照したいわけだ。

ソースを見ると、OPENPNE_URL を cookie の path にセットしているようなので、grep で cookie_path の編集をしているソースを見つけて、以下のような修正をしてみた。

◇webapp/init.inc の 106行目
ini_set('session.cookie_path', $url['path']);
  ↓
ini_set('session.cookie_path', '/');

◇webapp/lib/OpenPNE/Auth.php の 86行目
            $this->cookie_path = $url['path'];
        ↓
            $this->cookie_path = '/';

o_public_invite.php と、o_regist_prof.php については、init.inc でセットした session.cookie_path を参照しているだけのようなので何もせず。

しかし、この状態でログインを行うと正しく認証されないようで、すぐにログイン画面に戻ってしまう。

Auth.php の修正箇所を元に戻せば、ログイン出来るようになる。
(が、当然のことながら、サイト全体に cookie は有効にならない)

む~・・・取りあえず、OpenPNE 公式SNS で質問をさせていただこう。

OpenPNE では、ニックネーム、誕生日以外のプロフィール項目のテンプレート用変数は、

項目名 = ({$profile.caption})
内容 = ({$prof.profile[$profile.name].value})

のように表現する。

$profile.name には、$profile_list を foreach した結果が入っている。
$profile_list には、「プロフィール項目一覧」画面で指定した並び順どおりにデータがセットされているので、foreach した順に({$profile.caption})と({$prof.profile[$profile.name].value})を出力していけば、プロフィールの一覧が表示される。

・・・が、画面デザインのカスタマイズをしていると、ある項目だけ別の場所に表示したくなることもある。

そんなときには、

性別:({$prof.profile[sex].value})

みたいに書きたくなるが、こんな書き方では駄目で、オブジェクトらしく、

性別:({$prof.profile.sex.value})

のように書くこと。

それだけの話。すんません。単なる備忘録です。

img33.jpg

OpenPNE では、アップロードされた画像データは一旦 DB に登録され、参照されたときにキャッシュディレクトリに書き出され、以降はそれが参照されるようだ。
多分。(ドキュメントは読んでないけど(^^;、動きから察するに)

なので、直接イメージファイルを指定するのではなく、img.php を

<img src="/img.php?filename=m_7_1244606821.jpg&w=72&h=54&m=pc" alt="img" align="center" />

こんな感じで指定する。

・・・が、上記の指定方法ではディフォルトだと何も表示されない。
'w=72&h=54' ってところがミソ。
実は、OpenPNE は config.php の中で、使用出来る画像サイズを規定している。

$GLOBALS['_OPENPNE_IMG_ALLOWED_SIZE'] = array('76x76', '120x120', '180x180', '240x320', '600x600');

という具合だ。

なので、ここに、'72x54' というのを追加してやり、キャッシュディレクトリを作ってやる必要がある。

/var/img_cache の下の gif, jpg, png にそれぞれ w72_h54 という名前のディレクトリを掘ってやるわけだ。

これで、

<img src="/img.php?filename=m_7_1244606821.jpg&w=72&h=54&m=pc" alt="img" align="center" />

と書い ておけば、そこに横 72px、縦 54px の画像が表示されるわけだ。

ちなみに、画像が無いとき(例えばメンバー写真を表示したいのに、c_member テーブルの image_filename が空だったら)

<img src="/img_skin.php?filename=no_image&w=72&h=54&image_filename=skin_no_image.gif" alt="img" align="center" />

てな具合に、No Image 画像を表示してやる。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちOpenPNEカテゴリに属しているものが含まれています。

前のカテゴリはMovableTypeです。

次のカテゴリはPodCastingです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら