Services_Twitter_Timeを作成しました。

Twitterの"2 minutes ago"とか"10 days ago"とかの計算を簡単にしてしまおうというライブラリです。

http://openpear.org/package/Services_Twitter_Time

全然デバッグしていないので、報告お待ちしております。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

phpで簡単に画像を合成。Image_Combinationを作成しました。

phpImageMagickライブラリの方が沢山機能があって便利だと思います。

phpのGDを利用して画像合成するライブラリ作ってみよと思いまして遊び半分で作成しました。

openpearチャンネルのインストール&Image_Combinationのインストール

pear channel-discover openpear.org
sudo pear install openpear/Image_Combination-alpha 

画像の合成&セーブ

<?php

require_once ('Image/Combination.php');

$image = new Image_Combination(100,100);
$image->setImageType('gif');
$image->push(array('file' => 'body.gif',   'x' => 30, 'y' => 5));
$image->push(array('file' => 'weapon.gif', 'x' => 5,  'y' => 35));
$image->push(array('file' => 'shield.gif', 'x' => 55, 'y' => 45));
$image->save('person.gif');

画像の合成&出力

<?php
require_once ('Image/Combination.php');

$image = new Image_Combination(100,100);
$image->setImageType('gif');
$image->push(array('file' => 'body.gif',   'x' => 30, 'y' => 5));
$image->push(array('file' => 'weapon.gif', 'x' => 5,  'y' => 35));
$image->push(array('file' => 'shield.gif', 'x' => 55, 'y' => 45));
$image->output();





まとめ

頭の体操にちょうど良かったかな。どうだろう。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

openpearのライブラリNet_URL_Dispatcherを使用してみました。

phpのディスパッチャーが欲しいなと思い色々探していました。

下記のサイトを発見しましたので早速ダウンロードして使用しました。
http://d.hatena.ne.jp/heavenshell/20090103/1230985262

環境

OS:CentOS5.4
PHP:5.2.1

早速実行

<?php
require_once 'Net/URL/Dispatcher.php';
$dispatcher = new Net_URL_Dispatcher();
$dispatcher->setDirectory('/var/www');
$dispatcher->connect(':controller/:action/*params')->dispatch();

上記のスクリプトを書いてhttp://URL/index.php/hoge/fugaにアクセスすると、
/var/www/controllers/HogeController.phpのFugaActionにディスパッチします。

そこで、上記URLのindex.phpいらないなぁーと思った時は下記で対応出来る事が確認出来ました。

<?php
require_once 'Net/URL/Dispatcher.php';
$dispatcher = new Net_URL_Dispatcher();
$dispatcher->setDirectory('/var/www');
$dispatcher->setPathinfo($_SERVER['REQUEST_URI']);
$dispatcher->connect(':controller/:action/*params')->dispatch();

.htaccess(symfonyからインスパイア(笑))

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

上記のスクリプトを書いてhttp://URL/hoge/fugaにアクセスすると、
/var/www/controllers/HogeController.phpのFugaActionにディスパッチします。

まとめ

URLの正規化したいとか、今後他の言語のフレームワークで開発するかもしれないからとかにディスパッチャーは使えるのかな。クラスで色々書けるのは好きな人とかですかね。

追記

ライブラリの386行目にcontroller用のディレクトリー名(controllers)が固定で書かれているので、setter等があれば良いなと思いました。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

CouchDBをphpから操作する方法。

前回の記事でCouchDBをインストールしましたので、CouchDBphpから操作してみました。
CentOS5.4にCouchDBをインストールする方法! - @camelmasaの開発日記


testデータベース&testフィールドの作成

管理画面(_utils)の左上に表示されている"Create Database"リンクを押してデータベースを作成する事が出来ます。

画面の指示に従ってフィールド名も入力すると下記の画面が表示されました。

これでtestデータベース&testフィールドが作成出来ました。簡単ですね。


PECLパッケージphp_couchdbのインストール

phpから操作する為にcouchdb.soという野良PECLパッケージがあったので使用してみました。
Topdog.za.net :: PHP CouchDB Extension


…しかし下記のエラーが表示されてしまい、PHPでエラーになってしまいます。

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/couchdb.so' - /usr/lib/php/modules/couchdb.so: undefined symbol: php_json_encode in Unknown on line 0

vim /usr/include/php/ext/json/php_json.h

*
  +----------------------------------------------------------------------+
  | PHP Version 5                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2009 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.php.net/license/3_01.txt                                  |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Author: Omar Kilani <omar@php.net>                                   |
  +----------------------------------------------------------------------+
*/

/* $Id: php_json.h 283185 2009-06-30 17:52:21Z stas $ */

#ifndef PHP_JSON_H
#define PHP_JSON_H

#define PHP_JSON_VERSION "1.2.1"
#include "ext/standard/php_smart_str.h"

extern zend_module_entry json_module_entry;
#define phpext_json_ptr &json_module_entry

#if defined(PHP_WIN32) && defined(JSON_EXPORTS)
#define PHP_JSON_API __declspec(dllexport)
#else
#define PHP_JSON_API PHPAPI
#endif

#ifdef ZTS
#include "TSRM.h"
#endif

ZEND_BEGIN_MODULE_GLOBALS(json)
        int error_code;
ZEND_END_MODULE_GLOBALS(json)

#ifdef ZTS
# define JSON_G(v) TSRMG(json_globals_id, zend_json_globals *, v)
#else
# define JSON_G(v) (json_globals.v)
#endif

PHP_JSON_API void php_json_encode(smart_str *buf, zval *val, int options TSRMLS_DC);
PHP_JSON_API void php_json_decode(zval *return_value, char *str, int str_len, zend_bool assoc, long depth TSRMLS_DC);

#endif  /* PHP_JSON_H */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */


…うーん。エラーの原因がわからない。
alpha版なので、もっと作りこんでほしいなあと思う。
MongoDBの場合はPECL::MONGOがあってPHPer歓喜なんだけども。
別の方法でCouchDBにアクセスしてみる事にします。


PEARパッケージHTTP_Requestのインストール

CouchDBはHTTPリクエストでデータが取得出来るので、PEARパッケージHTTP_Requestをインストールして実行する事にしました。

pear install HTTP_Request

couchdb.phpの編集

<?php

require_once "HTTP/Request.php";

$http = new HTTP_Request('http://192.168.80.139:5984/test/93e4b62c166489b5ff94600e3003db88');
$response = $http->sendRequest();

var_dump($http->getResponseBody());

上記のphpの実行結果です。

php couchdb.php

string(101) "{"_id":"93e4b62c166489b5ff94600e3003db88","_rev":"2-f62fade7a96a75f5bb109036ad107af0","test":"test"}
"

phpからCouchDBのtestデータベース内のtestフィールドのデータを取得する事が出来ました!


まとめ

PEAR::HTTP_RequestでCouchDBの値の取得を行う事が出来ました。
他に方法を知っている方がいらっしゃいましたら情報くださ〜い!


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

これで完璧!Q4MをCentOS5.4にインストールしphpで実行する方法!

前回の記事では中々満足のいく結果が出せませんでした。
Q4MをCentOS5.4にインストールしphpで実行しました。 - @camelmasaの開発日記

もっと簡単にQ4Mをインストールし、かつ前回出来なかったphpからqueue_abort()を出来るようにしたいと思います。


環境

OS:CentOS5.4
MySQL:5.1.43
Q4M:q4m-0.9
PHP:5.3.1


PHP5.3.1とMySQL5.1.43をyumでインストール

PHP5.3.1でなくても良いのですが、前回PDOからqueue_abort()が出来なかったので、今回はopenpearで提供されているNet_Q4Mを使用したいと思い、PHP5.3.1をインストールします。
(Net_Q4Mはphp5.2.0以上が必要)

MySQL5.1.43はQ4MがMySQL5.1以上が必要ということですのでyumからインストールします。


CentOSの通常のリポジトリだけだと、PHP5.3.1とMySQL5.1.43は出来ないのですが下記の記事を参考にしてリポジトリを追加してインストールしました。(ついでにMySQLをconfigureする為に必要なパッケージもいれます。)
CentOS 5.3 に php-5.2.9, mysql-5.1.35 をインストール(remi レポジットリより) | お試しlog4

wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
wget http://rpms.famillecollet.com/el5.i386/remi-release-5-6.el5.remi.noarch.rpm
wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
rpm -Uvh *.rpm
yum --enablerepo=remi,epel,rpmforge update
yum --enablerepo=remi,epel,rpmforge install php-gd php-mbstring php-mysql php-odbc php-pdo php-pear mysql*
yum --enablerepo=remi,epel,rpmforge install gperf readline-devel ncurses-devel zlib-devel gcc gcc-c++ autoconf automake libtool rpm-build boost boost-devel

(この時、5.1.43では無いパッケージがインストールされる場合、mysql*では無く、mysql-5.1.43 mysql-server-5.1.43 mysql-devel-5.1.43 をインストールしないと駄目だった。)


MySQLを起動します。

/etc/init.d/mysqld start

MySQL-community-5.1.43-1.rhel5.src.rpmq4m-0.9.tar.gzの入手

MySQL-community-5.1.43-1.rhel5.src.rpmq4m-0.9.tar.gzを入手して展開します。

cd /usr/local/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-community-5.1.43-1.rhel5.src.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/
wget http://q4m.31tools.com/dist/q4m-0.9.tar.gz
tar zxfv q4m-0.9.tar.gz

MySQL-community-5.1.43-1.rhel5.src.rpmをリビルドします。

MySQL-community-5.1.43-1.rhel5.src.rpmをリビルドします。

rpmbuild --recompile --define 'community 1' MySQL-community-5.1.43-1.rhel5.src.rpm

これでMySQL-community-5.1.43-1.rhel5.src.rpmをリビルドしました。


Q4Mをビルド&インストール

Q4Mをビルドします。

cd ./q4m-0.9
./configure --with-mysql=/usr/src/redhat/BUILD/mysql-5.1.43
make
make install

./configureの実行時、"failed to locate mysql 5.1 installation"というエラーが表示された場合、mysql系の何かのパッケージがインストールされていない場合があります。
(今回のケースではyummysql*をインストールしているので、どのパッケージか特定していません。)


これでQ4Mがインストールされました。
次にQ4Mの動作準備します。

/usr/bin/install -c support-files/q4m-forward /usr/bin
mysql -u root -f mysql < support-files/install.sql

これでQ4Mの動作準備完了です。


Q4Mがインストールされているか確認

Q4Mがインストールされているか確認します。

mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.43 MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show plugins;
+------------+----------+----------------+--------------------+---------+
| Name       | Status   | Type           | Library            | License |
+------------+----------+----------------+--------------------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| FEDERATED  | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL               | GPL     |
| ndbcluster | DISABLED | STORAGE ENGINE | NULL               | GPL     |
| QUEUE      | ACTIVE   | STORAGE ENGINE | libqueue_engine.so | GPL     |
+------------+----------+----------------+--------------------+---------+
12 rows in set (0.08 sec)

一番下にQUEUEの列!
プラグインの一覧に追加されているのが確認出来ました。


MySQLにQUEUEのストレージエンジンを使用したテーブルを用意

MySQLにQUEUEのストレージエンジンを使用したテーブルを用意します。

mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.43 MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database q4m;
Query OK, 1 row affected (0.00 sec)

mysql> use q4m;
Database changed
mysql> create table my_queue(id int not null, name varchar(25) not null ) engine=queue;
Query OK, 0 rows affected (0.03 sec)

openpear/Net_Q4Mのインストール

openpearのチャンネルをインストール後、pearコマンドでNet_Q4Mをインストールします。

pear channel-discover openpear.org
pear install openpear/Net_Q4M-beta

これでOK。


phpからQ4Mを操作

以下のphpQ4Mを操作してみます。
Net_Q4MのコンストラクタであるDSN部分は適当な値を設定して下さい。

<?php

require_once ('Net/Q4M.php');

$queue = new Net_Q4M('mysql://user:pass@localhost/database');
$queue->connect();

while(true)
{
    $row = $queue->dequeue('my_queue');

    var_dump($row);

    if ($row)
    {
	$queue->end();
    } else {
	$queue->abort();
    }

}

$queue->disconnect();

phpで実行

php q4m.php
buildQueryString(): SELECT queue_wait('my_queue')

別の端末からMySQLでinsertすると…?

mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.43 MySQL Community Server (GPL) by Remi

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use q4m;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into my_queue values(1, 'hello world');
Query OK, 1 row affected (0.00 sec)

q4m.phpを実行した端末では

 php q4m.php
buildQueryString(): SELECT queue_wait('my_queue')
buildQueryString(): SELECT * FROM my_queue
array(4) {
  [0]=>
  string(1) "1"
  ["id"]=>
  string(1) "1"
  [1]=>
  string(11) "hello world"
  ["name"]=>
  string(11) "hello world"
}
buildQueryString(): SELECT queue_end()
buildQueryString(): SELECT queue_wait('my_queue')

上手くスクリプトが実行されました。

Net_Q4Mの作者さんのサイトにサンプルスクリプトがあるのですが、Net_Q4Mのバージョンが上がっているせいか、コンストラクタでDSNの値を引数にいれる仕様になっていました。
http://castor.s26.xrea.com/blog/tech/tech00017.html


まとめ

前回と同様、簡単にインストール…とはいきませんでした。
現段階ではrebuildしたMySQLを使用する方法しか見当たりません。
しかし、Q4Mのabort()が実行出来るのが確認出来たので収穫ありとしたいと思います。


追記

Q4M 0.9.2をインストールした方が良いかもしれないですね。
http://developer.cybozu.co.jp/kazuho/2010/01/thanks-to-a-use.html


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

Q4MをCentOS5.4にインストールしphpで実行しました。

Q4Mid:kazuhookuさんが開発したMySQLでメッセージキューを実装するストレージエンジンです。
思わぬ機会でQ4Mに触れる事が出来たので実際に構築〜phpでの実行を記事にしました。

環境

OS:CentOS5.4
MySQL:5.1.43-1
Q4M:q4m-0.9
PHP:5.1.6


インストール

インストールには下記の記事を参考にしました。
Q4M on CentOS - dragon3のブログ

MySQLのバージョンが違うだけで、上記と同じ作業で行いました。

VMwareで環境を構築したのですが、MySQLをビルドするのに物凄く時間がかかるのが注意です。
(4,5時間掛かったかな?)


phpで実行

phpでの実行には下記の記事を参考にしました。
http://blog.xole.net/article.php?id=719


PDOで実行する為に必要な事を下記に示します。

php-pdoのインストール

yum install php-pdo

pdo-mysqlのインストール

pecl pdo_mysql

php.iniの編集

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example:
;
;   extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here.  Specify the location of the extension with the
; extension_dir directive above.

extension=pdo.so
extension=pdo_mysql.so

MySQLのユーザー、パスワードを適当に設定して、参考のphpを実行しました。

<?php
$conn = new PDO('mysql:host=localhost; dbname=hogetest', 'user', 'password');
$wait = $conn->prepare('SELECT queue_wait("hoge_queue", 10)');
$abort = $conn->prepare('SELECT queue_abort()');
$e = $conn->prepare('SELECT queue_end()');
$select = $conn->prepare('SELECT * FROM hoge_queue');

while(true){
    $start = time(); // for epch tstmp

    // wait call query
    $wait->execute();

    $end = time();
    echo 'wait for: ', $end - $start, ' sec.', PHP_EOL;
    echo 'is_queue: ', $wait->fetch(PDO::FETCH_COLUMN), PHP_EOL;

    $select->execute();
    while($row = $select->fetch(PDO::FETCH_OBJ)){
        var_dump($row);
        //
        // delete しなくとも queue_end で消える
        //
        $e->execute();
        continue 2;
    }

    // abort cal
    // abortを実行するとphpエラーが起こるのでコメント化
    //$abort->execute();
    echo 'next...', PHP_EOL, PHP_EOL;
}

無事にQ4Mを楽しむ事が出来ました。


$abort->execute();を実行すると表示されるエラー

[root@localhost ~]# php q4m.php
wait for: 10 sec.
is_queue: 0
PHP Fatal error:  Call to a member function execute() on a non-object in /root/q4m.php on line 29
mysql> SELECT queue_abort();
ERROR 1123 (HY000): Can't initialize function 'queue_abort'; queue_abort(): not in owner mode

むう。。。


まとめ

Q4Mの利点は、プログラムをフロントエンドとバックエンドで分離する事で処理を高速化する事が出来る事だと思います。(他人の受け売りです。)
構築〜実装が複雑では無いので、どんどん取り入れたい技術だと思います。
(唯、SELECT queue_abort()が実行出来なかったのは仕様なのか、構築時のミスなのか気になるところです…。)


追記

Q4Mの構築自体に問題は無さそうですが、スクリプトに問題がありそう。現在調査中。
なんだか2回目のwhileに絶対入らない…。PDO内のスクリプトにバグがあるのかな…。
MySQL内では問題なかった…。


[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/

PEARパッケージImage_Colorful 0.1.3-stableをリリースしました。

PEARパッケージImage_Colorful 0.1.3-stableをリリースしました。

  • Colorfulという親クラスを作成
  • Image_Colorful_Wordという子クラスを作成

http://imagecolorful.com/


Image_Colorful_Wordという子クラスは、生成される文字列からサイズを自動で計算して画像サイズを決定します。
画像サイズが変化してしまうというデメリットがありますが、簡単なロゴの作成に向きますし、何より画像に文字を表示する時に縦pxと横pxを意識せずに画像が作成出来ます。
文字自体を動的に変化させたい画像を作成したい場合、とても有効なパッケージです!

こんな感じの画像が動的に作成出来ます。
前回と同様これも春な感じで良いですねー。

sample.php

<?php
require_once('Image/Image_Colorful_Word.php');

$image = new Image_Colorful_Word('ImageCalorfulWord', './font/altan.ttf', 50, array(5,5,5,5), array(255,255,255), 50, 1);
$image->addColors(150,150,150);
$image->getGenerateImage('png');
?>


sample2.php

<?php
require_once('Image/Image_Colorful_Word.php');

$image = new Image_Colorful_Word('camelmasa@gmail.com', './font/cecily.ttf', 13, array(1,1,1,1), array(255,255,255), 20, 1);
$image->addColors(150,150,150);
$image->getGenerateImage('png');
?>


sample3.php

<?php
require_once('Image/Image_Colorful_Word.php');

$image = new Image_Colorful_Word('camelmasa@gmail.com', './font/bacon.ttf', 13, array(1,1,1,1), array(255,255,255), 20, 1);
$image->getGenerateImage('png');
?>


ちょっとコンストラクタがウザいかもしれません…。
修正が必要かも。

PEAR Image_Colorfulパッケージのインストール方法

PEAR Image_Colorfulパッケージの使用方法(コンストラクタとメソッドについて)

http://imagecolorful.com/

[PR]Spreeの情報を集めています。

ECを持ちたい方、仕事でECを使いたい方向けのコミュニティサイトです。
このサイトでは世界で最も使用されているECの1つであるSpreeについての情報を提供しています。
http://spreecommerce.jp/