Twitter Streaming APIから日本語のつぶやきをPHPで取得する
2009-06-10 01:07 | IT | コメントをする »TwitterのAPIでストリーミングAPIというものがリリースされていたので、
PHPでどれだけ簡単にいけるのか実装してみました。
今回はTwitterのアカウントを持っていれば誰でも利用できる、
けど一部のデータしか取得できない「spritzer」APIを利用しました。
※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カタカナが含まれている」という条件になっています。
漢字を含めようとあまり広げ過ぎると中国語のつぶやきも出てきますし、
いい感じの落とし所だと思っています。
正規表現のフィルターをURLにして今流行ってるサイトを取り出す、なんてことも簡単ですね。
(実際はbit.lyのURLを戻したりしなきゃいけなかったり面倒ですけども)
XAMPPをVistaで使おうとしてハマるワナ
2009-02-04 00:02 | IT | コメントをする »
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
すると、もれなく

と、エラーが出現します。強制終了の雰囲気ですが、コマンドは実行されます。
うーん、気持ち悪い。
原因は既出で、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が起動せず、強制終了します。

ということなので、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 | 2 コメント »
昨日、新生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日間がこうも勉強になるものなら、
今後も武者修行の旅にでてみようかと思った次第です。
今回携わらせていただいたサービスが世に出た暁には、
ちゃんと紹介させていただきたいと思います。