Home > PHP

PHP Archive

Twitterのキーワードをグラフで見るTwitterTrendをリリースしました。

この記事の所要時間: 136

Twitterで、あるキーワードがどれくらい投稿されているかをグラフ化するTwitterTrendをリリースしました。

TwitterTrend

なにをするの?

キーワードを入力して「集計」ボタンをクリックすると直近1ヶ月でキーワードが含まれた投稿数をグラフで表示します。

流行のキーワードがどの程度反応されているかを見ることができます。

例えば最近物議を醸しているあの話題で集計すると↓のようになります。

TwitterTrend : PHP – .php

キーワード

キーワードはTwitter検索と同じ検索式が使えます。

また3つまでなら複数のキーワードを指定することもできます。この場合それぞれのキーワードについてグラフが表示されるので、投稿数を比較することができます。それぞれのキーワードは[,](カンマ)で区切ります。

TwitterTrend : ラーメン,うどん,そば

集計対象

集計されるのは前日から直近1ヶ月間の日本語ユーザの投稿です。

Twitterでの伝播

今回はblogでリリースを出す前にTwitterでURLを投稿してみました。ものの数分でサーバにアクセスが来だして、はてブにブックマークが付きました。1h経過した頃には10users程度になってました。その後予定があったので外出したのですが、帰ってきた頃には30usersが付いていました。

Twitterで呟いたサービスがどんどん広がっていく様は、改めて驚きました。情報の伝達スピードがハンバじゃないですね。

TwitterやSBMで速攻で反応が返ってくるのはわくわくしますね。この感覚はやみつきになりそうですw。

# ちなみにこのサービスは今話題のPHPで作ってます。

# id:moto0915さん、はてぶで不具合報告ありがとうございました!「OR」の件は修正しましたー。

CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント

この記事の所要時間: 226

CakePHPの管理者向けサイトにBasic認証を簡単に追加するコンポーネントです。

1.2系で動作しますが、ちょこちょこっといじれば1.1でも動くかと。

1. Routing.adminを有効にする

そもそもこれをやらないと意味がありません。[app/config/core.php]でRouting.adminを有効にします。

これにより[http://example.com/admin/~]のURLで管理者用アクションにアクセスできます。

   Configure::write('Routing.admin', 'admin');

2. 認証コンポーネントを設置

認証コンポーネントを[app/controllers/components/admin_auth.php]に設置します。

[2008/05/29] 継承元をComponentからObjectへ変更しました。(janさんありがとうございます!)

<?php
class AdminAuthComponent extends Object {
  /**
   * before filter
   */
  public function startup(&$controller) {
    if (!preg_match("/^" . Configure::read('Routing.admin')  . "_/i", $controller->action)) {
      return;
    }

    $user = env('PHP_AUTH_USER');
    $pass = env('PHP_AUTH_PW');

    if (empty($user) || empty($pass)) {
      $this->unauthorized($controller);
    } else {
      if (!$this->auth($user, $pass)) {
        $this->forbidden($controller);
      }
    }
  }

  /**
   * unauthorized
   *
   * @param  object Controller $controller
   */
  protected function unauthorized($controller) {
    header("WWW-Authenticate: Basic realm=\"Please Enter Your Password\"");
    $controller->redirect(null, 401, false);
    echo "Authorization Required";
    exit;
  }

  /**
   * forbidden
   *
   * @param  object Controller $controller
   */
  protected function forbidden($controller) {
    $controller->redirect(null, 403, false);
    echo "Authorization Required";
    exit;
  }

  /**
   * auth
   *
   * @param  string $user
   * @param  string $pass
   * @return boolean
   */
  protected function auth($user, $pass) {
    $hash = sha1($user . $pass . Configure::read('Security.salt'));
//debug: var_dump($hash);
    return $hash === ADMIN_AUTH_HASH;
  }
}
?>

3. AppControllerで読み込む

AppControllerの$componentsでAdminAuthComponentを読み込むだけでokです。これで[/admin/]なURLにアクセスされるとBasic認証を行い、認証が通った場合のみアクションを実行します。

<?php
class AppController extends Controller {
  public $components = array('AdminAuth');
}
?>

認証情報

上記ソースでは簡易的にユーザ名+パスワード+Security.saltでsha1ハッシュを生成して、それを定数ADMIN_AUTH_HASHと比較して認証を行っています。

ADMIN_AUTH_HASHは[app/config/core.php]等で定義しておけばokです。

ちなみにハッシュ値を簡単に作成するには、AdminAuthComponent#auth()でコメントアウトしているvar_dump()を有効にします。これでブラウザからアクセスしてユーザID・パスワードを認証ダイアログで入力すればハッシュ値が出力されます。

ハッシュ生成後はvar_dump()の行は削除する or コメントアウトするようにしましょう。

拡張とか

ここでは単純な実装になっていますが、AdminAuthComponentを変更すれば以下のような拡張が考えられます。

  • ハッシュ値では無くDBの値で認証
  • HTTPからのアクセスはHTTPSへリダイレクト
  • Basic認証を他の認証に変更

ちなみにRouting.adminのURLは単純にapache側で認証をかけるとすり抜けられる可能性があります。(@see:CakePHP URLマッピング修正パッチ)

このコンポーネントを使えばいかなるURLでアクセスされても、管理者用アクションを(初回)実行する際は認証を通過させることができます。

楽天オークション系対応-PEAR::Services_Rakuten-0.2.2リリース

  • 2007-12-23 (日)
  • PHP
この記事の所要時間: 122

楽天ウェブサービスに楽天オークション系APIが追加されたので、これに対応する「PEAR::
Services_Rakuten-0.2.2」をリリースしました。

今回の主な変更点は以下です。

  • 楽天オークション系API対応
  • 各APIを2007/12/23 現在のバージョンに更新

インストール・アンインストール

インストール方法は以下です。

$ pear install --alldeps /blog/download/Services_Rakuten-0.2.2.tgz

インストール時に「Failed to download pear/XML_Serializer within preferred state “stable”」といったエラーが発生した場合は以下のコマンドでXML_Serializerをインストール後、Services_Rakutenをインストールして下さい。

$ pear install --alldeps XML_Serializer-beta

アンインストール方法は以下です。

$ pear uninstall __uri/Services_Rakuten

楽天オークション系APIを使う

基本的な使い方は0.2.1と変わりません。Services_Rakuten::factory()で使用するAPIを指定するだけでokです。

<?php
require_once('Services/Rakuten.php');
define('DEV_ID', 'xxxx');
define('AFF_ID', 'xxxx');

// 楽天オークション商品検索
$api = Services_Rakuten::factory('AuctionItemSearch', DEV_ID, AFF_ID);
$api->execute(array('keyword' => 'ブログ'));
var_dump($api->getLastUrl());
var_dump($api->getResultData());

// 楽天オークション商品コード検索
$api = Services_Rakuten::factory('AuctionItemCodeSearch', DEV_ID, AFF_ID);
$api->execute(array('itemCode' => 'i:aaa:1234567'));
var_dump($api->getLastUrl());
var_dump($api->getResultData());
?>

CakePHP勉強会を開催しました

この記事の所要時間: 244

CakePHP勉強会を開催します。従来のPHP勉強会では一般化した内容しか取り扱えない面もある為、特化したイベントの開催を企画しました。

CakePHPを実際に使っている人、CakePHPに興味がある人で語らいましょう!

events.php.gr.jp

12/7に東京で開催したCakePHP勉強会は無事に終了しました。

参加された方々、発表を行ったyandoさん、akiyanさん本当にありがとうございました。

私もわたわたしながらも何とか発表を行うことができました。役立つかどうかは分かりませんwが、発表で使ったスライドをアップしておきます。

CakePHPを業務で導入する shin1x1

  • 開始直前に内容から判断して順番を変えていただきました。
  • ここ最近バタバタで手が付けられず、結局新幹線でスライドを作りました。
  • な感じなのでいまいちパッとしない内容だったかもしれません。。。
  • ただダメなりに自身は学べた事が多々あったのでとても楽しかったです。
  • 皆さんから色々意見を聞けたのは収穫でした!
    もっと議論を誘発するような発表もアリかな。

参加された皆さんとのやりとりで

  • bakeは予想以上に誰も使っていなかった:-p
  • CakePHP1.2はまだ様子見の人が多かった
  • CakePHPを業務で使っている人が意外に多くてびっくり
  • CakePHPガイドブック保持者がかなり多くてびっくり(本当にありがとうございます_O_))

CakePHPをさらにDRYにする、ドライケーキレシピ akiyanさん

  • 高橋メソッド+akiyanトークでテンポ良いプレゼンでした。
  • 立って説明しつつ片手でマウスを持ってスライドを進める。なるほど。
  • DRY Cake++
  • SQLを連想配列を駆使して作り上げる視点。
  • こういう実践的なTipsはどんどん共有したいですね。

CakePHP1.1 to 1.2 yandoさん

  • いつもながら、さすがのプレゼンでした。
  • Garrett Woodworthの写真w
  • 1.1システムを1.2へ移行するデモ++
  • やはり最後はもちろんいつものでしたw

懇親会

  • ほとんどの方が懇親会に参加!
  • CakePHPやらその周辺の話を色々と。
  • おそらくこれだけCakePHPの話を他の人としたのは人生初w
  • もっともっと話したかったし、聞きたかった。
  • 軽くリクルーティングw
  • かなり皆さんネタを持っているもよう。第2回もある?
  • 名刺持って行くのを忘れるという大失態><名刺を頂いた皆さんスミマセン。。。

てな感じで

楽しくてあっという間に終わった勉強会でした。

今回初めて勉強会を開催する側、発表する側に回ったのですが、やはり楽しいですね。特に今回はyandoさん・akiyanさんと3人で進めていったのでチームで物事を進める楽しさがありました。

個人的にもお会いしたかった方々と少しですがお話ができ、嬉しかったです。

またこういった機会があれば是非参加したいと思います。

皆さんお疲れ様でした&ありがとうございました。

# アンケートご協力ありがとうございました!見るのが楽しみなような怖いような;-)

PHP SAPIにはどんなのがあるか

  • 2007-12-02 (日)
  • PHP
この記事の所要時間: 147

昨日参加したPiece Network1でSAPIごとに読み込むiniファイルを変える話がありました。

SAPIってどんなのがあるのかな、と思いPHP5.2.5のソースをざっくり調べてみました。

PHP_SAPIやphp_sapi_name()で取得できるSAPI名は、[sapi/]にある各インターフェイスのソースにて定義されています。それらを一覧にしたのが↓です。

ソースディレクトリ name pretty name
sapi/aolserver aolserver AOLserver
sapi/apache*1
sapi/apache_hooks
apache Apache
sapi/caudium caudium Caudium
sapi/apache2handler apache2handler Apache 2.0 Handler
sapi/cgi*2 cgi-fcgi
cgi
CGI/FastCGI
CGI
sapi/cli cli Command Line Interface
sapi/isapi isapi ISAPI
sapi/milter milter Sendmail Milter SAPI
sapi/nsapi nsapi NSAPI
sapi/phttpd phttpd PHTTPD
sapi/pi3web pi3web PI3WEB
sapi/roxen roxen ROXEN
sapi/thttpd thttpd thttpd
sapi/tux tux tux
sapi/webjames webjames WebJames

*1 apacheは[sapi/apache]と[sapi/apache_hooks]で同じ値が定義されています。
*2 [sapi/cgi]ではPHP_FASTCGIが定義されていれば上段が、それ以外は下段が設定されます。

こう見ると色々ありますね。

ちなみにphp.net見ると2003年時点でのSAPI一覧が残っていました。以前はjava_servletやactivescriptなど今より多くのSAPIがあったようです。

Piece Network 1に参加してきました。

この記事の所要時間: 259

12月1日(土)に新大阪にてPiece Project主催のイベントPiece Network 1を開催します。

| Piece Framework – An Application Framework for Essential Development Practices

名前からPiece Framework関連のイベントかと思ったのですが、発表内容を見るとPHP全般を扱った内容だということで参加しました。

内容はとても興味深いものでお三方の発表はそれぞれ学ぶ点があり、楽しかったです。参加されて皆さんお疲れさまでした。

勉強会のメモをざっくりとまとめます。

1. ローカルマシン上に構築するPHP開発環境 久保敦啓さん

なるほどと思ったのが、SAPIごとにphp.iniを変えるお話でした。何となくPHPマニュアルで認識はしていたもののあまり活用していませんでした。

php-cli.phpやphp-apache.iniなどSAPIごとの設定ファイルを設置できます。

読み込むiniファイルについてはこちら

ちなみに普段は/etc/php.iniなどに共通設定を書き、httpd.confにWebサイト固有の設定を書いています。

この手の話しは人それぞれのノウハウがあるでしょうから聞いていて面白かったです。

2. PHPマニュアルの読み方 高木正弘さん

  • 高木さんはMac
  • PHPマニュアルは量が膨大!(ZFは500P,PostgreSQLは1900P,PHPは3600P!)
    全部読むのはムリ・・・
  • ポイントを絞って読む。言語リファレンスはしっかり読んだ方が良い。
  • PHP製のドキュメント生成ツールがある(PhD http://doc.php.net/wiki/phd)
  • ドキュメントを作るのに必要なのは日本語だけ。英語はなくても良い。
    日本語訳した文章の校正作業とか。これも大事な作業。
  • ドキュメントを作る人募集中!
  • 本当にやりたい人は翻訳したり校正したドキュメントをPHP-docのMLに投げると誰か見てくれるみたい
    #うーん、やりたいかも。

3. SPL入門 関山隆介さん

  • 関山さんもMac!
  • PHP5組み込みインターフェイス、SPLについての解説
    # SPL関係ではじめてきちんとした解説を聞いた気がする。
  • LogicExceptionはPHPではあまり意味が無いかも(たいがい投げられるのはRuntimeException)
  • RecursiveIteratorIteratorは口語にしづらい
    #nativeな人は平気なんだろうか
  • SPLじゃないとできない事は無い。でもあると便利。
  • #SPLまた真面目に使いたくなりました。

4. 無名関数、配列リテラル等パッチデモ 関山隆介さん

時間が余ったので話題の関山さん作パッチのデモを見せて頂きました。

phshでデモされていたのですが、実際に動作しているのを見ると「おおー」といった感じですね。これは使いたいです。今後は本家へ働きかけるとのことなので、是非取り込まれることを願ってます!

てな感じで

勉強会のあとは懇親会。今回は色々な方とお話ができました。内容は・・・まあ濃い話です;-)。

こんな面白い勉強会が関西で行われたことがとても嬉しいです。CakePHPの勉強会を大阪でやれば?といったお話も頂いたので何らかの形で実現したいと思います。

主催されたPiece関係な方々ありがとうございました。また遊びに行かせて頂きます。

CakePHP勉強会を開催します

この記事の所要時間: 023

申込については近日中に行う予定ですので、またお知らせいたします。しばしお待ちを。

CakePHP勉強会を開催します[告知] | Shin x blog

先日告知したCakePHP勉強会の申込を開始しました。

events.php.gr.jpから申込できますのでCakeな皆さんは是非ご参加下さい。

しかしうえちょこさんshimookaさんエントリ早すぎです;-)

CakePHP勉強会を開催します[告知]

この記事の所要時間: 035

ちょいフライング気味の告知です;-)

12/7に都内でCakePHPの勉強会を行います。

これまでPHP勉強会、カンファレンスなどでyandoさんによる発表が行われていたのですが、今回はCakePHPに特化したイベントになります。

発表者には、yandoさんはもちろんの事、青い人ことakiyanさんにもお願いしています。(私もできれば何かネタを持って行くつもりです。)発表のネタをもとにディスカッションなどできればと考えています。

申込については近日中に行う予定ですので、またお知らせいたします。しばしお待ちを。events.php.gr.jpにて申込を開始しました。

CakePHP 1.2でPostgreSQLを使うとエラーが出る

この記事の所要時間: 212

あ,そうだ。PostgreSQL だともうなんだか色々エラーが出てるので諦めちゃいました……。

1.2を試してみました – まゆの日記

同じエラーかどうか分かりませんが、同じような現象があったので。

CakePHP1.2.0.5875 pre-betaでPostgreSQLに接続しようとすると以下のようなエラーが出ました。

Warning (2): pg_query() [function.pg-query]: Query failed: ERROR:  syntax error at end of input at character 20 [CORE\cake\libs\model\datasources\dbo\dbo_postgres.php, line 123]

原因は[app/config/database.php]に追加された「schema」パラメータです。このパラメータを使うとPostgreSQLにてschemaを指定できるのですが、デフォルトの設定では空文字になっており、それをそのままDBへ発行するのでSQLエラーとなります。

解決策としてはschemaパラメータにschemaを指定します。テーブル生成時等にschemaを指定しなければデフォルトで「public」になります。個別にschemaを指定している場合はそれを設定します。

[app/config/database.php]

class DATABASE_CONFIG {
	var $default = array(
		'driver' => 'postgres',
		'persistent' => false,
		'host' => 'localhost',
		'port' => '',
		'login' => '1x1',
		'password' => 'pass',
		'database' => 'inquiry',
//		'schema' => '',
		'schema' => 'public',   <--- schema
		'prefix' => '',
		'encoding' => ''
	);
}

なおschemaパラメータを指定しない場合もpublicが使われます(厳密に言うとDboPostgresで定義されている値が使われます。)つまりschemaパラメータを削除してしまう手もありますが、内部動作は変わる可能性があるので、database.phpで明確に指定しておいた方が無難でしょう。

PHP E_STRICTで表示されるエラーメッセージを調べてみた

  • 2007-11-17 (土)
  • PHP
この記事の所要時間: 649

年内のPHP4サポート終了に向けて、PHP5への移行が進む昨今です。

PHP5で推奨されていないスクリプトをチェックするのがE_STRICTです。E_STRICTが有効なのは分かっていたのですが、実際にどんなスクリプトがE_STRICTに引っかかるのかが、あやふやでした。

そこでE_STRICTで出力されるメッセージをPHPのソースから抜き出してみました。どのようなスクリプトがE_STRICTに引っかかるのか(引っかからないか)のヒントになればと思います。

ちなみにE_STRICTの活用方法としてマニュアルには[-l]オプションによるチェックが書かれていますが、スクリプトを実行しないと発生しないE_STRICTもあるので、実際には実行して確認する方が良いです。

1. Accessing static property %s::$%s as non static

インスタンス変数をクラス変数としてアクセスしている。

クラス変数としてアクセスするなら宣言時にstaticを付けます。

なお再現させようとするとE_STRICTの前に「Fatal Error:Access to undeclared static property」が発生しました。

2. Assigning the return value of new by reference is deprecated

new演算子の戻り値を参照で受け取ろうとする。

PHP5では[=]で参照渡しとなるのでインスタンス化したオブジェクトを[=&]で受け取る必要はありません。

3. Creating default object from empty value

空の値からデフォルトオブジェクトを作ろうとしている。

null or 空文字 or 未定義のインスタンス変数をオブジェクトと見なして、さらに->でそのインスタンス変数を参照しようとすると発生します。分かりにくいので↓ソースです。

<?php
class Hoge {
  public $a = null;
}

$obj = new Hoge();
$obj->a->b = 1; // E_STRICT
?>

4. Declaration of %s::%s() should be compatible with that of %s::%s()

継承によりメソッドをオーバーライドする場合は、継承元と同じメソッド定義にする。

  • 親クラスと引数の数が異なるとNG
  • デフォルト値のあり・なしが異なるとNG(値は変わってもOK)
  • Typehintも同じでないとNG

5. Function %s%s%s() is deprecated

関数XXXは非推奨。ソースをgrepした中ではdl()が非推奨となっていました。

6. Implicit cloning object of class ‘%s’ because of ‘zend.ze1_compatibility_mode’

zend.ze1_compatibility_mode=on設定時のみ発生。

オブジェクトを参照するとひたすら発生しました。zend.ze1_compatibility_mode=onにする時はE_STRICTは切った方が吉です。。。

7. Non-static method %s::%s() cannot be called statically

1.のメソッド版。クラスメソッドとして呼ぶなら、メソッド定義時にstaticを付ける。

似たメッセージとして以下のようなものがあります。

  • Non-static method %s::%s() cannot be called statically, assuming $this from compatible context %s
  • Non-static method %s::%s() should not be called statically, assuming $this from incompatible context

8. Only variables should be assigned by reference

メソッドの戻り値を[=&]で受け取ろうとすると発生。[=]で受け取ればokです。

似たメッセージとして以下のようなものがあります。

  • Only variables should be passed by reference

9. Redefining already defined constructor for class %s

PHP4版コンストラクタ(クラス名と同じメソッド)とPHP5版コンストラクタ(__construct)が定義されている。

できればコンストラクタは__constructにします。PHP4のソースをそのまま使用するなら__constructを記述しないようにします。

10. Resource ID#%ld used as offset, casting to integer (%ld)

リソースIDを連想配列のインデックスとして使用すると発生します。

実際のシステムで発生するシチュエーションが良く分からないのですが、以下のソースでは確かに発生します。

<?php
$fp = fopen("hoge", "r");

$array = array(1 => "a", 2 => "b");
var_dump($array[$fp]);
?>

11. Static function %s%s%s() should not be abstract

クラスメソッドはabstractにしない。

クラスメソッドにしたところでabstractだと呼びようがありません。

12. Usage of {} to access string offsets is deprecated and will be removed in PHP 6

{}による文字列へのアクセスはPHP6で消えるので非推奨です。マニュアルでは[]でのアクセスを推奨しています。

ただこのメッセージはソースには含まれていますが、「#ifdef 0_ilia」となっているので、通常のbuildでは表示されません。(以後のリリースで有効化?)

13. is_a(): Deprecated. Please use the instanceof operator

is_a()は非推奨。代わりにinstanceofを使います。

<?php
class Hoge {
}
class Bar extends Hoge {
}

$obj = new Hoge();
var_dump(is_a($obj, 'Hoge')); // E_STRICT
var_dump($obj instanceof Hoge); // ok
?>

14. It is not safe to rely on the system’s timezone settings …

タイムゾーンの明示的な設定をせよ。デフォルトセッティングをあてにしてはいけない。

全文は以下な感じです。

It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for '9.0/no DST' instead in 

環境変数で設定するか、date_default_timezone_set(‘Asia/Tokyo’)で設定しておけばokです。

これからはE_STRICT対応で?

以前はvarでインスタンス変数を定義しただけでE_STRICTが発生していたため、PHP4のソースを移行する際は正直あまり使っていませんでした。ただ5.1.3でこの処理は削除されていますので、PHP4なソースでも使ってみようと思います。

早速PHP5で動作しているPHP4なソースをE_ALL|E_STRICTで実行してみると7.関連でエラーが多数出てきました。。。うーん、これ全部直すのか。。。

ホーム > PHP

検索
フィード
メタ情報

Return to page top