XMLRPCでhttps

2009.07.30    PHP, 馬場   タグ: , —    baba   

XML-RPCで、サーバ側にhttpsを使用する場合、クライアント側でcURLがSSLを認証できないとエラーになることがあります。
これは、cURLにSSLの証明書が入っていないのが原因です。

(Curl returned non-null errno 60:SSL certificate problem, verify that the CA cert is OK.
Details:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed)

そこで、証明書のチェックを無効化します。
生PHPでcurlをたたく場合、以下のようにします。

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

PEAR::XML_RPC2を使う場合、以下のように、’sslverify’をfalseに指定します。

$options = array('debug' => false, 'sslverify' => false);
$url = "http://example.com/xmlrpc.php";
$this->client = XML_RPC2_Client::create($api, $options);

Zend_Loaderがparent.phpを読もうとする

2009.07.29    PHP, Zend Framework, 馬場      baba   

Zend Frameworkを使い始めました。

いちいちファイルをrequire_onceするのは面倒なので、Autoloaderを使います。

$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

また、Zend_Db_Tableのfindがrowsetを返すのが気にくわないため、findOne()を実装することにします。

class App_Db_Table extends Zend_Db_Table_Abstract
{
	public function findOne()
	{
		$args = func_get_args();
		$result = call_user_func_array(array($this, 'parent::find'), $args);
		return $result->current();
	}
}

parentのfindを呼ぶとき、
call_user_func_array(array(’parent’, ‘find’), $args);
とすると、E_STRICTなPHP5では、staticでない関数をstaticに呼び出したと言われてエラーになります。
なので、このように
call_user_func_array(array($this, ‘parent::find’), $args);
と呼び出すわけですが、

Zend_Loaderがあまり賢くないので、parent:: を見てparent.phpを探しに行ってしまいます

Warning: include(parent.php) [function.include]: failed to open stream: No such file or directory in …

Zendのフォーラムでも同じ症状の人がいましたが、これという解決案は見つからないみたいなので、
Zend/Loader.php:83行目
include $file

@include $file
に変えてめでたしめでたし。

なんだかなぁ。

MindTouch Deki タイムゾーンを変更

2009.07.16    MindTouch Deki, 馬場   タグ: , —    baba   

最近、社内用のドキュメント整理用にMindTouch Deki Wikiを導入しました。
全員で編集していくので、とっつきやすさ等を重視して選びました。

有償のエンタープライズ版はデスクトップコネクタ等が使えるようで、少し魅力的でしたが、まずは無償版を使ってみることにしました。
自社サーバにインストールして運用しています。

さて、このDekiWiki、コントロールパネルからタイムゾーンを設定する場所が見つかりません。
ユーザ個人の設定は、ツール→マイプリファレンス から可能ですが、サイトデフォルトがGMTになっているのは不便です。

これを変更するには、/var/www/dekiwiki/LocalSettings.php に以下の行を追加します。
$wgDefaultTimezone = “+09:00″;

DekiWikiは良くできているのに、まだ日本語の情報が少ないのが難点ですね。
このブログでも積極的に情報を発信していこうと思います。

Pマーク対策のためのオフィスリニューアル

近年益々個人情報に対する意識が高まってきていますね。
もちろん営業目的がないといえばウソになってしまいますが
自分たちのためにもお客様のためにも預かっている情報は
きちんと管理しよう、そう考えています。

意識はあっても自分たちだけで制度を整えるのは無理があるし、
しっかり取り組むために株式会社フォーバルテレコムさんに
今回教育とコンサルティングを依頼しています。

また、Pマークの要件を満たすために
知り合いの建築家にオフィスのリニューアルプランを立ててもらいました。

何でも自分たちでやりきるのも楽しいですが、やはりプロの仕事は圧巻ですね。
目的達成が早まるうえに、効率の良い勉強になりました。

Ethnaでユーザ権限ごとのアクセス許可を一括管理する

2009.07.02    Ethna, PHP, 馬場   タグ: —    baba   

Ethnaでアクセス制限をする場合、一般的にActionクラスのauthenticate()メソッドを使います。
アクション数が多くなってくると、個別に書くのは面倒なので、継承を駆使する場合が多いと思います。
しかしそれでも、ユーザ権限が何種類もあると、管理が煩雑になってしまいます。
今回は、ユーザ権限ごとのアクセス許可を一元管理する方法を紹介します。

まず、ユーザ種別はdefineしてあるものとします。

define(’USER_TYPE_ANONYMOUS’, 0);
define(’USER_TYPE_GUEST’,     1);
define(’USER_TYPE_MEMBER’,    2);
define(’USER_TYPE_ADMIN’,     3);

次に、ユーザ種別ごとのアクセス許可を、適当なファイルにグローバル変数で記述します。
グローバル変数にするメリットは、index.phpからControllerを生成する前に読み込めるため、BASIC認証と連動しやすい点です。
このアクセス許可一覧変数では、ユーザ種別定数をキーに、アクセス許可するアクション名一覧の配列を値にします。

require_once ‘Appid_Const.php’; //USER_TYPE_*をdefineしてあるファイルをrequire
/**
* 権限毎のアクセス可能アクション一覧
* アクション名の最後の1文字のみ、ワイルドカードとして*(アスタリスク)を使える
*/
$accept_action_list = array(
    USER_TYPE_ADMIN =< array(
        ’*',
    ),
    USER_TYPE_MEMBER =< array(
        ’entry_*’,
        ’comment_*’,
        ’inquiry_*’,
    ),
    USER_TYPE_GUEST =< array(
        ’comment_*’,
        ’inquiry_*’,
    ),
    USER_TYPE_ANONYMOUS =< array(
        ’index’,
        ’help’,
    ),
);

また、Appid_Sessionには、getUserType()というメソッドを作り、ユーザ種別を取得できるようにしておきます。

そして、以下のメソッドを、Appid_ActionClassに入れます。

/**
* このアクションにアクセスできるかどうか調べる
* @return アクセスできるときtrue, 出来ないときfalse
*/
function _authenticate()
{
    global $accept_action_list;

    $controller =& $this->backend->getController();
    if ($controller->_isAcceptableActionName($controller->getCurrentActionName(), $accept_action_list[USER_TYPE_ANONYMOUS])) {
        //ログインなしでアクセスできるアクションの場合
        return true;
    } else if ($this->session->isStart()) {
        $userType = $this->session->getUserType(); //現在の権限を取得
        if (is_null($userType)) {
         $this->ae->add(null, ‘ログインしていません’);
         return false;
        }

        $list = $accept_action_list[$userType]; //現在の権限でアクセスできるアクション
        if (!$controller->_isAcceptableActionName($controller->getCurrentActionName(), $list)) {
            $this->ae->add(null, ‘権限がありません’);
            return false;
        } else {
            return true; //認証された
        }
    } else {
        $this->ae->add(null, ‘ログインしていません’);
        return false;
    }
}

あとは、authenticate()メソッドで

function authenticate()
{
    if ($this->_authenticate() === true)
    {
        return null;
    }
    return ‘index’; //ログイン画面へ飛ばす
}

とすれば完了です。

全アクションの許可・拒否を一括管理できるので、漏れが無くて安心です。

RAMDISKを入れてみた2

2009.07.01    Windows, 馬場   タグ: —    baba   

試しにTemporary Internet FilesをRAMDISKにしてみたら、ダウンロード完了後の「描画開始→描画完了」が一瞬になりました。少しずつ描画されていく感触が無いです。
でも、ダウンロードは早くならないので、大好きなyodobashi.comはあまり早くなりませんでした。

RAMDISKを入れてみた

    Windows, 馬場   タグ: —    baba   

ふと思い立って、自宅マシンにGavotte Ramdiskを入れてみました。

Windows Vista SP2 64bit
Rampage II Extreme
Core i7-920
DDR3-1333 6GB
の環境で、1.5GBをRAMDISKにしてみました。

64bitでも、ドライバ署名強制を無効にする(ReadyDriver Plus)だけで、簡単にインストールできました。やっぱり、64bit対応が遅れているのは日本だけなのかな?

結果↓

化け物ですね。使い道は、一時ファイルとか普通のもの以外、特に思いつかないです。
RAMDISKに30GBくらい割り当てられたら、そこにVHD置いてウマーとかやりたいんですけどね。

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.