日々のできごとと写真

Twitter Streaming APIから日本語のつぶやきをPHPで取得する

2009-06-10 01:07 | IT | 4 コメント »

TwitterのAPIでストリーミングAPIというものがリリースされていたので、
PHPでどれだけ簡単にいけるのか実装してみました。

今回はTwitterのアカウントを持っていれば誰でも利用できる、
けど一部のデータしか取得できない「spritzer」APIを利用しました。

Streaming API Documentation

※json_decode()を利用しているのでPHP5.2.0以上対象になります。

<?php
$user = 'username';
$password = 'password';
$stream = fopen("http://{$user}:{$password}@stream.twitter.com/spritzer.json", "r");
while ($json = fgets($stream )) {
    $twitter= json_decode($json,true);
    if(preg_match('/[ァ-ヶーぁ-ん]/u',$twitter['text']))
        echo $twitter['user']['name'].':'.$twitter['text'] . PHP_EOL;
}

なんてことないコードになりました。
実行すると標準出力に「ユーザー名:つぶやき」が続々と出力されます。

ポイントもなにもないんですが、「日本語のつぶやき」を取得する部分は、
「つぶやき内に1文字でもひらがなorカタカナが含まれている」という条件になっています。

Unicode対応 文字コード表

漢字を含めようとあまり広げ過ぎると中国語のつぶやきも出てきますし、
いい感じの落とし所だと思っています。

正規表現のフィルターをURLにして今流行ってるサイトを取り出す、なんてことも簡単ですね。
(実際はbit.lyのURLを戻したりしなきゃいけなかったり面倒ですけども)

XAMPPをVistaで使おうとしてハマるワナ

2009-02-04 00:02 | IT | コメントをする »

xampp_vista

Windows環境で使っているXAMPPに含まれるApacheやPHPのバージョンが若干古いので、最新のものに入れ替えようとしてハマったことを記します。

環境

  • Windows Vista SP1
  • XAMPP 1.7.0
    • Apache 2.2.11
    • MySQL 5.1.30
    • PHP 5.2.8
    • phpMyAdmin 3.1.1
    • FileZilla FTP Server 0.9.29
    • Mercury Mail Transport System v4.52
    • OpenSSL 0.9.8

apache friendにある1.7.0のZIPアーカイブ版を利用しました。
ダウンロード後、C:\xamppに展開することにします。

PHPのcliでエラー

早速、PHPが正常に動くか確認するため、コマンドラインでバージョン情報を確認します。

c:\xampp\php>php -v
PHP 5.2.8 (cli) (built: Dec  8 2008 19:31:23)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

すると、もれなく

CLIは動作を停止しました

と、エラーが出現します。強制終了の雰囲気ですが、コマンドは実行されます。
うーん、気持ち悪い。
原因は既出で、php_mysqli.dllが原因のようです。

extension=php_mysqli.dll

;extension=php_mysqli.dll

とコメントにすることで対処できるんですが、じつは1.7.0では(どのバージョンからは不明)対応済みのdllが用意されています。
xampp\php\extをのぞいてみると、「php_mysqli_5.0.51a.dll」というファイルがあり、これを「php_mysqli.dll」にリネームすることで回避できます。

php -i
#snip
mysqli

MysqlI Support => enabled
Client API library version => 5.1.30
Client API header version => 5.0.51a

バージョンがバラバラなのがかなり気持ち悪いんですが、MySQL5.1.30に対しても問題なく動きます。

eAcceleratorでエラー

デフォルトではOFFにされていますが、PHPのアクセラレータのひとつ、eAcceleratorがバンドルされているので、これを有効にしてみます。
php.iniを修正します。

よくあるミス
XAMPPにはphp.iniが2つあります。
ひとつはxampp\php の下、もうひとつはxampp\apache\bin の下。
前者はCLI用のiniファイルで後者はApacheモジュール用のiniファイルですので、注意しましょう。

セミコロンをすべて外します。

矩形選択

こういう作業は矩形選択(箱型選択)できるエディターが便利ですね。
(上記エディターはK2Editor

さて、実行してみましょう。

php -i
#何も表示されずに終わってしまう・・・

php -v
#こっちもだ・・・

ログもエラーも出ないので、困った・・・。
CLIからの追跡はあきらめて、PHPモジュールの方のphp.iniのeAcceleratorを有効にして、ApacheからPHPを実行して経過をみてみます。
すると、Apacheが起動せず、強制終了します。

eacceleratorが有効にならない

ということなので、Apacheのエラーログ(xampp\apache\log\error.log)を確認します。すると、

PHP Warning:  [eAccelerator] This build of "eAccelerator" was compiled for PHP version 5.2.7. Rebuild it for your PHP version (5.2.8) or download precompiled binaries.\n in Unknown on line 0

衝撃の事実。xampp1.7.0にバンドルされているeAccelerator.dllは(ある意味伝説の)5.2.7 をターゲットにコンパイルされているので、バージョンが合わないというエラーです。

こちらのサイトに5.2.8用にビルドされたdllがダウンロードできるので、こちらをxampp\php\ext\eAccelerator.dllと差し替えます。

c:\xampp\php>php -v
PHP 5.2.8 (cli) (built: Dec  8 2008 19:31:23)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with eAccelerator v0.9.5.3, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
    with Zend Extension Manager v1.2.0, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies

ちゃんと認識されました。

それから忘れがちなのが、ACLが有効になってるとサーバーの立ち上げなどにAdministrator権限が必要なので、xampp-control.exeなどを実行するときには、右クリック→管理者として実行(A) で起動しましょう。sudoですね。
リソースが許すの出れば、サービスに登録してしまうと楽です(セキュリティーには気をつけて)。

今回なんでVista環境にxamppを入れたかというと、このブログでも使ってるWordPressのコードを読んで見ようと思ったからです。
ソースをちらっと見たことある人ならわかると思うんですが、結構ヒドいコードです。
PHPのカオスさがそのまま如実に表れてるというか。
なので、debugツールを使って楽をしようと導入したわけです。
XDebugかZend Debuggerを使って、少しずつ解析していって、経過を載せたいと思います。

OpenPNE3.0がリリースされたのでインストールまでしてみる

2009-01-29 01:54 | IT | 8 コメント »

openpne3.0

昨日、新生OpenPNE3.0.0がリリースされました。
今回のリリースの大きな特徴はなんといってもベースとしてsymfonyを採用したことです。

しかも開発のコミュニティーを見ているとsymfonyの採用バージョンを1.1から1.2へと途中で変えたり、いろいろ試行錯誤があったようです。

最新ソースはこちらのリポジトリか、zipファイルで取得できます。

インストール

それでは作業を進めていきます。
ソースのダウンロードと、展開を行います。

wget http://downloads.sourceforge.net/openpne/OpenPNE-3.0.0.zip
unzip OpenPNE-3.0.0.zip

展開されたファイル群の中からNOTICEを見てみると、

This product needs the third-party softwares listed blow to run.
 - PHP: Hypertext Preprocessor (5.2.x)
 - symfony (1.2.x)

と、symfony1.2以上、PHP5.2以上が必要だと明記されています。
この環境にはすでにsymfony1.2.2とPHP5.2.6がインストールされていますのでこのまま進めてみます。
DBはMySQLを利用し、
dbname=openpne3, username=openpne3, password=password, host=localhost を用意しておきます。

OpenPNE用taskが追加されており、openpneで始まるtaskが用意されています。
利用可能なタスクは

symfony -T

で確認できます。

DBの設定とデータの初期化を行います。

symfony openpne:install

DBに関する設定をウィザード形式で進めていきます。

Choose DBMS (mysql, pgsql or sqlite)
mysql

Type database username
openpene3

Type database password (optional)
password

Type database hostname
localhost

Type database name
openpne3

Type database socket path (optional)

The DBMS                mysql
The Database Username   openpne3
The Database Password   ******
The Database Hostname   localhost
The Database Name       openpne3

The Database Socket
Is it OK to start this task? (y/n)
y

#以下処理が流れていきます

設定が無事終わったら、パーミッションの設定を行います。

symfony openpne:permission

これでアクセス可能になります。

って簡単にいかない

順調に行けば上の通りなんですが、今回の環境ではスムーズには行きませんでした。
必要な環境はこちらに書かれています。

XSLがない

[propel-sql] Could not perform XLST transformation.
Make sure PHP has been compiled/configured to support XSLT.

PHPのXSLエクステンションが入っていないらしい。
この環境のPHPはソースコンパイルでいれたものなので、ソースからエクステンションのみコンパイルします。

cd ~/php-5.2.6/ext/xsl
phpize
configure
make
sudo make install

configure途中で

configure: error: xslt-config not found. Please reinstall the libxslt>= 1.1.0 distribution

なんて出る場合は、libxsltをインストールしてから、再度configureを実行します。

sudo yum install libxslt-devel

生成されたxsl.soを読み込むようにphp.iniを編集します。

sudo vi /etc/php.ini
extension=xsl.so

読み込まれたかどうかを確認します。

php -i |grep xsl
xsl
libxslt Version => 1.1.11
libxslt compiled against libxml Version => 2.6.16
libexslt Version => 1.1.11

これで大丈夫です。

PDOがない

Execution of target "insert-sql" failed for the following reason:
/usr/local/lib/php/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/build-propel.xml:275:1:
 [wrapped: could not find driver]
   [phing] /usr/local/lib/php/symfony/plugins/sfPropelPlugin/lib/vendor/propel-generator/build-propel.xml:275:1:
 [wrapped: could not find driver]

 Some problems occurred when executing the task:
   build-propel.xml:275:1:  [wrapped: could not find driver]
   Read the logs to fix them

なにやら真っ赤です。
could not find driverということなので、DB接続ドライバーがないというエラーです。
symfony1.2が採用しているORMのPropelが1.3になっていて、このライブラリがpdo_mysqlを必要としています。

xslと同じ要領で

cd ~/php-5.2.6/ext/pdo_mysql
phpize
configure
make
sudo make install

入ったかどうかを確認します。

php -i |grep pdo
pdo_mysql

OKです。

さらにメモリーエラー

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to
allocate 35 bytes) in
/usr/local/lib/php/symfony/util/sfToolkit.class.php on line 191

これは素直にメモリの作業領域が足りないので、php.iniのmemory_limitの値を大きくします。

sudo vi /etc/php.ini
memory_limit = 64M

容量はメモリの許す範囲で。

番外編

openpneタスクコマンドでインストールしない方法もメモしておきます。
通常のsymfonyアプリケーションの手順になります。

DBの設定のためconfigディレクトリにdatabases.ymlを作成して、設定を書き込みます

vi config/databases.yml


all:
 propel:
   class:        sfPropelDatabase
   param:
     classname:  PropelPDO
     dsn:        mysql:dbname=openpne3;host=localhost
     username:   openpne3
     password:   password
     encoding:   utf8
     persistent: true
     pooling:    true

それから同じくconfigディレクトリのpropel.iniの一部を修正します。

vi config/propel.ini
propel.database.url        = mysql:dbname=openpne3;host=localhost
propel.database.password   = password
propel.database.user       = openpne3
propel.output.dir              = {ProjectRoot}#ここにはプロジェクトのパスを

DBにスキーマーを設定します。(DDL)

symfony propel:insert-sql

初期用のデータをインサートします。(DML)

symfony propel:data-load

これで動くようになりました。

所感

symfonyは採用されているプロジェクトはちらほらあるんですが、公式サイト以外ではなかなかまとまった情報が出てこなくて、ベストプラクティスみたいなものが手探りな感じがあるので、その辺りがあぶり出てくるといいなとsymfonyユーザーとしては期待しています。
少しソースをみたところだと、sfAction→sfOpenPNE*Action→通常のActionというように、間にOpenPNE用拡張クラスを入れていて、通常のActionに手をいれやすく設計されてますね。
もう少し読んでみたいと思います。

developers drive

2008-11-11 02:15 | エントリー, 日記 | 1 コメント »

先週末はある会社さんの開発合宿に同行させてもらって、開発三昧をしていました。
まさに合宿ってノリで、懐かしさと新鮮さを感じました。

元々は8月にブログでその企画を知り、参加したい!とメールを送ったのが始まりです。

今の自分はどこら辺を走っているんだろうか。
周りの人はどのくらいの速度で走っているんだろうか。
その人たちと同じ速度で走りながら会話をすることができるんだろうか。

それを確認したいというのが、個人として参加させてもらった理由です。

まあ結構な人見知りなので、とてもとても心配だったわけですが、
親切にしていただいて、きっと沢山気を使わせてしまったんだろうなぁと
思うくらいでした。

ネットのこと、起業のこと、考え方など、走っている会社の生の声を
聞かせていただいて、とても刺激的な週末になりました。
本当にありがとうございました&お世話になりました。

開発もちょっと特殊で、PHP in RoRとでもいいましょうか、
いろいろうねうねしながらも最終的には帳尻をあわせる
爽快な、まさにドライブって感じでした。

最近はframeworkに楽をさせてもらってるので久々に素なPHPを書いたり、
初めてまともにPDOをいじったり、Debian系にとまどったりして、
技術的にも大変勉強になりました。

たったの2日間がこうも勉強になるものなら、
今後も武者修行の旅にでてみようかと思った次第です。

今回携わらせていただいたサービスが世に出た暁には、
ちゃんと紹介させていただきたいと思います。