PEARのインストールディレクトリを一時的に変える

時にはプロジェクトのディレクトリにPEARを配置したい時だってある。

■準備

以下のコマンドを実行し、現在のインストールディレクトリを確認してメモる。

pear config-get php_dir
C:\xampp\php\PEAR

■実行

以下のコマンドを実行し、ディレクトリを変更する。

pear config-set php_dir [インストールしたいディレクトリ]

いろいろ作業が終わったら、以下のコマンドで元のディレクトリに戻す。

pear config-set php_dir /usr/local/lib/php

おまけ

以下のようにしてもファイルをダウンロードできるが、場合によってはゴミファイルがいっぱいついてくる。

pear install -R [dir] [package]

mysqliを使ってPHPでMySQLにSSLで接続する

MySQLサーバがクライアントとは別のコンピュータにある場合、ネットワークを平文で流れるデータを途中でキャプチャされる可能性がある。そこでSSL接続することにする。

■ソース

以下のように、リソースを生成後にmysqli_ssl_setでSSLをセットしてから、mysqli_real_connectを使って接続する。

$dbh   = mysqli_init();
$isSSL = @ mysqli_ssl_set(
    $dbh,
    '/home/ssl/key.pem',
    null,
    null,
    null,
    null
);
$isConnected = @ mysqli_real_connect(
    $dbh,
    DB_HOST,
    DB_USER,
    DB_PASS,
    DB_NAME,
    DB_PORT,
    null,
    MYSQLI_CLIENT_SSL
);

CentOSのポートを開く(ファイアーウォールの設定)

以下のコマンドを実行する。

system-config-securitylevel

画面が以下のようになる。

ファイアーウォールの設定

tabを使ってカーソルを移動し、カスタマイズを選択する。

ファイアーウォールの設定-カスタマイズ

その他のポートまでカーソルをtabで移動し、ポート12000番(tcp)の場合だと以下のように入力する。

ファイアーウォールの設定-カスタマイズ

カーソルを移動しOKを押せば設定完了。

WebSocketsに触ってみる

WebSocketsでWebアプリケーションは次の段階を迎える。node.jsと共に触ってみる。((((o゚▽゚)o)))

■準備

npmをインストールする

node.jsのパッケージ管理システムである。

curl http://npmjs.org/install.sh | sh

node-websocket-serverをインストールする

WebSocketsに適した感じのサーバだ。

npm install http://github.com/miksago/node-websocket-server/tarball/master

expressをインストールする

node.jsのフレームワークとでもいうんだろうか。

npm install http://github.com/visionmedia/express/tarball/master

■サーバー側(server.js)

サーバーを作る。→各種イベントをセットアップする。→特にデータが来たらブロードキャストする。といった流れ。

var sys     = require('sys');
var ws      = require('websocket-server');
var express = require('express');
var app     = express.createServer();
var coord   = [];

// set up the websokets server
app.configure(function(){
    app.use(express.staticProvider(__dirname + '/public'));// 公開ディレクトリをセットアップ
});
var server = ws.createServer({"server" : app});

// set up the events of server
server.addListener(
    'listening',
    function(){
        sys.log('listening');
    }
);
server.addListener(
    'connection',
    function(conn){
        sys.log('connection');
        if(coord.length > 0){// 最初の接続で最後の位置をクライアントに反映させる
            conn.send(coord[coord.length - 1]);
        }
        conn.addListener(
            'message',
            function(message){
                coord.push(message);
                server.broadcast(message);
            }
        );
    }
);
server.addListener(
    'close',
    function(conn){
        sys.log('close');
    }
);
server.listen(80);

■クライアント側(/public/client.js)

ドラッグ&ドロップで座標を送信する感じ。データが飛んできたら逆に座標をセットする感じ。ちなみにGoogle Chromeでしか動作テストはしてない。

$(function(){
    var conn = new WebSocket("ws://192.168.11.3/");
    conn.onmessage = function(e){// データが飛んできた時
        var data = JSON.parse(e.data);
        $('p#box').css({
            "left" : data['left'],
            "top"  : data['top']
        });
    }
    $('p#box').draggable({
        "cursor" : "pointer",
        "drag"   : function(e, ui){// ドラッグした時
            if(conn){
                conn.send(JSON.stringify(ui.position));
            }
        }
    });
});

html(/public/index.html)

まぁコンナ感じ。logo.pngにはchromiumのロゴを使用させていただいた。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>title</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/jquery-ui.min.js"></script>
<script type="text/javascript" src="client.js"></script>
</head>

<body>
<p id="box"><img src="./img/logo.png" /></p>
</body>
</html>

■完成

サーバーを起動。

node server.js

キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

websockets

片方を動かすともう片方に反映される!

node.jsを触ってみる

既に開いてるポートを使いたいので、apacheを止めて80番のポートを使用し実験する。

/etc/init.d/httpd stop

以下のコードを使用する。オフィシャルサイトに載ってるのをちょっと改造しただけのもの。(・・。)ゞ

var http = require('http');
http.createServer(function(req, res){
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end('Hello World\n');
}).listen(80, "192.168.11.3");
console.log('Server running at http://192.168.11.3:80/');
node sample.js

ブラウザで(http://192.168.11.3/)アクセスしてみる。

Hello World

ひゃー。通じる喜び。シンプルな素晴らしさ。ヾ(@^▽^@)ノあー素敵。

PHPとcurlでOAuthしてみる

Zendでもできるがベタに書いてみる。

<?php
$url              = 'http://example.org/';
$consumer_key     = '1235694568147893b0123b15';
$consumer_secret  = '663333123263456c8d789f58';
$version          = '1.0';
$signature_method = 'HMAC-SHA1';
$timestamp        = time();
$nonce            = (string)rand();
$realm            = 'realm';
$request_body     = array('hello' => 'world');

$body_hash   = urlencode(base64_encode(hash('SHA1', $request_body, true)));
$auth_header = sprintf(
    'OAuth realm="%s",oauth_body_hash="%s",oauth_consumer_key="%s",oauth_version="%s",oauth_timestamp="%d",oauth_nonce="%s",oauth_signature_method="%s",oauth_signature="%s',
    $realm,
    $body_hash,
    $consumer_key,
    $version,
    $timestamp,
    $nonce,
    $signature_method,
    urlencode(
        base64_encode(
            hash_hmac(
                'SHA1',
                'POST&' . urlencode($url) . '&' . urlencode(
                    "oauth_body_hash={$body_hash}&oauth_consumer_key={$consumer_key}&oauth_nonce={$nonce}&oauth_signature_method={$signature_method}&oauth_timestamp={$timestamp}&oauth_version=$version"
                ),
                $consumer_secret . '&',
                true
            )
        )
    )
);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body);
curl_setopt(
    $ch,
    CURLOPT_HTTPHEADER,
    array(
        "Authorization: {$auth_header}"
    )
);
$result = curl_exec($ch);
curl_close($ch);

こんな感じ。