5 月 27th, 2010
| Categories: ImageMagick
| Tags:

ある案件でPDFのサムネイル(JPG画像)を出力したいことがあった。
ネットで色々調べてみたところ、ImageMagickを利用するのが良さそうだということがわかった。
本番のホスティングサーバ運営会社に確認したところ、ImageMagickの利用は可能とのことだった。

で、ローカルの開発用環境(WinXPでXAMPP利用)にImageMagickをインストールしてみた。
参考にした記事はこちら
http://gecko.hp2.jp/2010/04/20/%E3%80%90php%E3%80%91imagemagick%E3%82%92php%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%A1%E3%83%A2/

テスト用にコマンドプロンプトからconvertコマンドでJPG画像のGIF画像への変換を実行したところまではよかったのだが、PHPからPDFをJPGに変換するコマンドを実行しても、ファイルが生成されない。

ググってみたところ、以下の記事が参考になった。
http://shin2.mogtan.net/?p=412

「 No such file or directory」のエラーメッセージは嘘で(ファイルはありますから)、PHPのexec()からだと、convertコマンドの中から gs(GoastScript)のパスが見つからなく、変換に失敗している様子。

PostScriptを解釈するためのインタープリタであるGhostscriptをインストールしなければならないようだ。

以下の記事を参考にしてGhostscriptをインストールしたところ、問題なく動作した。
http://www.geocities.jp/gimproject/tips/ghostscript.html
http://www.nsknet.or.jp/~tony/TeX/install/win/gs.htm#winxp

上記必要なライブラリをインストールしたところ、ローカルでも本番と同様に、PDFのサムネイル(JPG画像)を出力することに成功した。

5 月 2nd, 2009
| Categories: PEAR, 暗号化
| Tags:

Pear::Crypt_Blowfishの概要は以下のサイトが参考になる。
http://www.phppro.jp/phptips/archives/vol17/3

Mcrypt暗号化関数がコンパイル時に有効になっている場合はそちらを使用し、Mcrypt暗号化関数を使用できない場合はPHPでの実装が自動的に使用されます。

Mcryptがインストールされていない環境でも使用できるので、便利そうだ。

Pear::Crypt_Blowfishで暗号化した場合、開発環境(Windows)と本番環境(Linux)で、結果が異なる現象が出た。
調べてみたところ、古いバージョンのCrypt_Blowfishだと、そういうバグがあるらしい。
[参考サイト]
http://q.hatena.ne.jp/mobile/1150003912
http://kosugi-tomo.vox.com/library/post/crypt_blowfish-on-php45.html

で、


pear install Crypt_Blowfish-1.1.0RC1

で、新しいバージョンをインストール。

するとローカルの開発環境(WindowsのXAMPP)の方で「Cannot redeclare class Crypt_Blowfish」のエラーが出てしまう。XAMPPにデフォルトでインストールされているPEARのCrypt_Blowfishとクラス名が衝突していることが原因のようだ。
デフォルトでインストールされている方の名前を変更して、この現象を回避。

で、開発環境(Windows)と本番環境(Linux)で同じ暗号化に成功。

ところが、今度は複合化の際に正しい文字列の後に「���」と文字化けした文字が付与されてしまう。

で再度調べてみたところ、復号したデータの最後に連続している「」を削除する処理が必要らしい。
[参考サイト]
http://d.hatena.ne.jp/shimooka/20071108/1194449912

上記のサイトを参考にして記述したところ、正常に動作した。

4 月 13th, 2009
| Categories: 未分類
| Tags:

phpファイルをhtmlとして動かす場合、通常は

AddType application/x-httpd-php .html

通常は.htaccessにこのように書けば簡単に設定できるのだが、さくらではその方法だと500エラーになってしう。

で、以下の方法で実現した。

SSHでログインして、

% cp /usr/local/php/5.2.8/bin/php-cgi /home/アカウント名/www/php.cgi

さくらのPHPはcgi版なので、binの下のphp-cgiを使ったらうまく動作しました。
php-cgiをコピーしてphp.cgiにリネームします。
ドキュメントルートへ置く場合は既に755になっているのでphp.cgiだけ変更します。
コピー先については、そのディレクトリ以下に対してphpを拡張子htmlでも動かすという設定になるので、ドキュメントルートに置いた。

php.cgiを置いたディレクトリとphp.cgi自身のパーミッションを705か755に変更します。

% chmod 705 php.cgi

.htaccessに以下の記述を追加して設置

Action myphp-script /php.cgi
AddHandler myphp-script .php .html

これで、phpファイルが、htmlの拡張子でも動作するようになった。

下記のサイトを参考にした。
http://webtech.seesaa.net/article/106054365.html

さくらインターネットの場合、空メール受信・返信プログラムが設置できるのは知っていたが、その方法が他のレンタルサーバと少し違うのは知っていた。

で、実際に試した際に、少しつまずいたのでメモ。

さくらでは maildrop という配信プログラムが使われていて、 /home/USERNAME/MailBox/ の下に各メールアドレスのディレクトリがあります。空メール用のメールアドレスのディレクトリに .mailfilter を設置し、返信メールするプログラムへメールを渡します。

で、上記で作成した「.mailfilter」のパーミッションを「600」にしておく必要がある。

ちなみに、「.mailfilter」の作成はSSHでログインしてviエデイタからできるが、以下の方法でもできる。

さくらインターネットサーバーコントロールパネルから「メールアドレス毎の設定」空メール用のアドレスの「ウェブメール」を開き、「電子メールの転送」もしくは「迷惑メールフィルタ」を設定。

この辺は、以下の記事を参考にした。
http://never-ever.info/modules/news/index.php?page=article&storyid=305

「.mailfilter」には、以下の記述をした。


cc "| /usr/local/bin/php /home/USERNAME/SCRIPT_PATH"

(プログラムに渡しつつ、受信したメールをそのままメールボックスにも入れたいならccで。
受信したメールをメールボックスにも入れる必要がない場合はtoで。
「USERNAME」や「SCRIPT_PATH」は、各自の環境に合わせて適宜設定)

空メールの受信をトリガーにして起動するプログラムに関しては、実際にはパーミッションの設定をする必要はない。

=========================

上記の設定で、メールの受信をトリガーに、プログラムの起動には成功したのだが、実際に空メールを受け取り、メールを
返信するプログラムの動作確認をしたところ、以下のようなエラーが出た。


   ----- The following addresses had permanent fatal errors -----

    (reason: 255)

   ----- Transcript of session follows -----
554 5.3.0 unknown mailer error 255

エラーログがさくらの環境では見れないので、ググッたところ、以下のページの方法で解決した。
http://www3.atword.jp/nana/archives/category/php/mobile


$path = '/home/アカウント名/PEAR_PATH/';
set_include_path(get_include_path() . PATH_SEPARATOR .$path);

さくらの場合、php.iniではなく、実行ファイルに直接パスを指定する必要がありそうだ。

3 月 26th, 2009
| Categories: Smarty, 携帯, 絵文字
| Tags:

1つのテンプレート(文字コードはUTF8で、出力はShift_JIS。フレームワーク上で開発し、テンプレートはSmartyを使用)で作成している3キャリア対応の携帯サイトを作成していた。
本来、開発がメインなのでデザインはやらないのだが、とある事情でパパっとデザイン・コーディングをやらなければならなくなった。

で、気になったのが絵文字の表示。単純にiモードのSJIS10進数でテンプレートに埋め込んでも良いのだが、それだとPCで確認もできないし、工夫がない。

で、以前から気になっていた絵文字変換ライブラリの「MobilePictogramConverter」を使用してみることにした。
まずは、以下のサイトからダウンロード。
MobilePictogramConverter

次にSmartyへの組み込み方を調べたところ、plugin関数を公開されている方がいたので、そのファイルを以下のページからダウンロード。
http://d.hatena.ne.jp/zakira/20080128/1201479687

上記のサイトからダウンロードしてきたフォルダ内に、Smartyのplugin関数ファイル「outputfilter.convEmojiFilter.php」があるので、それを自分のsmartyのpluginsディレクトリにそのまま入れる。

合わせてMySmarty.class.php内に、以下の記述をする。

//表示するときにOutputフィルタ(lib/smarty/plugins/outputfilter.convEmojiFilter.php)を使う
$this->autoload_filters = array(”output”=>array(”convEmojiFilter”));

で、実機(3キャリア)とPCで検証したところ、きちんと絵文字で表示されるキャリアとそうでないキャリアがあった。
で色々調べたところ、「$mpc->autoConvert();」のあたりが怪しいということになった。

もう一度、公式の配布サイトにアクセスして、きちんと「i_sjis.phps」のサンプルを見てみると変換出力のところは、キャリア毎に細かく指定できるよう。
http://php-develop.org/MobilePictogramConverter/example/i_sjis.phps

/* モバイル表示用(Web入力コード) */
//echo ‘FOMA : ‘ .$mpc->Convert(MPC_TO_FOMA , MPC_TO_OPTION_WEB).’
‘.”\r\n”;
//echo ‘EZweb : ‘ .$mpc->Convert(MPC_TO_EZWEB , MPC_TO_OPTION_WEB).’
‘.”\r\n”;
//echo ‘SoftBank : ‘.$mpc->Convert(MPC_TO_SOFTBANK, MPC_TO_OPTION_WEB).’
‘.”\r\n”;

なので、「convEmojiFilter」内で、キャリアを判別して、そのキャリア毎に変換出力の方法を指定してやるようにプログラムしたところ、1つのテンプレートにiモードのSJIS10進数で絵文字を記述した場合に3キャリア全てとPCで問題なく絵文字が表示できるようになった。

以下、完成形の「convEmojiFilter」のソース


function smarty_outputfilter_convEmojiFilter($tpl_output)
{
	// 携帯キャリア判別用ライブラリを読み込む
	require_once('lib/pear/Net/UserAgent/Mobile.php');
	require_once('lib/3rdParty/MobilePictogramConverter/MobilePictogramConverter.php');

	$option = MPC_FROM_OPTION_WEB;
	$mpc =& MobilePictogramConverter::factory($tpl_output, MPC_FROM_FOMA, MPC_FROM_CHARSET_UTF8, $option);
	if (is_object($mpc) == false) {
		die($mpc);
	}
	$mpc->setImagePath('lib/3rdParty/MobilePictogramConverter/img/');

	// Net_UserAgent_Mobileクラスの生成
	$agent = Net_UserAgent_Mobile::singleton();

	if($agent->isDoCoMo()){
		 $tpl_output = $mpc->Convert(MPC_TO_FOMA, MPC_TO_OPTION_WEB);
	}elseif($agent->isEZweb()){
		 $tpl_output = $mpc->Convert(MPC_TO_EZWEB, MPC_TO_OPTION_WEB);
	}elseif($agent->isSoftBank()){
		 $tpl_output = $mpc->Convert(MPC_TO_SOFTBANK, MPC_TO_OPTION_WEB);
	}else{
		$tpl_output = $mpc->autoConvert();	// PC確認時用
	}

	return $tpl_output;
}
?>
3 月 11th, 2009
| Categories: Pager
| Tags:

何回もやっているのに覚えられないのでメモ。


$pagerParam = array(
				'mode' => 'sliding',
				'perPage' => 10,				// 1ページ当たりの表示件数
				'delta' => 2,					// カレントページの前後に表示するページ数
				'urlVar' => 'page',				// ページ番号を表すクエリ変数名
				'spacesBeforeSeparator' => 1,
				'spacesAfterSeparator' => 1,
				'totalItems' => $rowsAllCount,
				'importQuery'=> false,			// パラメータを自動で引き継ぐかどうかの設定(デフォルトはTRUE)
				'extraVars' => array(			// 引き渡すパラメータ(連想配列で指定)
							'area_id' => urlencode($area_id)
							),
);

$pager=Pager::factory($pagerParam);
$this->pager=$pager->getLinks();

[参考サイト]
http://www.ironhearts.com/diary/archives/001203.html
http://blog.asial.co.jp/359
http://pear.php.net/manual/ja/package.html.pager.factory.php

3 月 1st, 2009
| Categories: CORE SERVER
| Tags:

書店に行って、「PHPによるWebアプリケーションスーパーサンプル活用編 第2版」を買おうかどうか迷ったが、第1版と違うサンプルが少なかったことから見送った。

だが、気になったライブラリの知識をそのまま得ないまま放置するのも嫌だったので、少し時間をかけて調べてみた。

PEAR::Net_FTP
http://pear.php.net/manual/ja/package.networking.net-ftp.php
参考ソースは以下のURLを参照。
http://scianto.net/archives/2006/12/16231555.php
http://winofsql.jp/VA003334/ScriptMaster070112044251.htm

PEAR::Services_YouTube
このライブラリに関しては、「PHPxWebサービス APIコネクション」にも使用法が解説されている。
参考ソースは以下のURLを参照。
http://phpspot.org/blog/archives/2006/07/phpyoutubeapise.html

ただ、現在はYoutubeのAPIが変わってしまったため、使用できない模様。

本書で紹介のServices_Youtubeですが、YoutubeのAPIが変わってしまったため、使えなくなってしまいました(2009年2月20日現在)。
 Services_Youtubeが新APIに対応するように、更新されるのを待つしかないようです。

PEARを使わない場合の実装方法として、Googleで「YouTubeのAPI とツール」ディベロッパーガイドが公開されている。
http://code.google.com/intl/ja/apis/youtube/developers_guide_php.html

また、Zend_Gdataを利用することで、Google Data APIに対して統一的な手法でアクセスできるとのこと。
参照「Zend Framewrok徹底入門 p.376」

PEAR::Crypt_Blowfish
暗号化・複合化のライブラリ
参考ソースは以下のURLを参照。
http://labs.unoh.net/2007/11/php_de_crypt.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20070704/276661/

YAML、Spyc

YAML入門
http://jp.rubyist.net/magazine/?0009-YAML#l1
YAML–Wikipedia
http://ja.wikipedia.org/wiki/YAML
PHPでYAMLを扱う(Spycについても解説)
http://www.doyouphp.jp/tips/tips_yaml.shtml
http://itpro.nikkeibp.co.jp/article/COLUMN/20070507/270080/

GoogleMap(おまけ)
携帯でGoogleMapを手軽に表示するPHPクラス
http://blog.asial.co.jp/332
http://www.thekyo.jp/tech/2006/12/10google_mapgooglemapapi_php_m.html
10分で終わるGoogleMap公開(GoogleMapAPI + PHP + MySQL)
http://www.thekyo.jp/tech/2006/12/10google_mapgooglemap

1 月 17th, 2009
| Categories: Zend Framework, プラグイン
| Tags:

プラグインとは、「フロントコントローラ」の処理中に発生したイベントに対応して実行することのできるコード。
プラグインが対応するイベントは以下の通り。

イベント 発生タイミング
routeStartup ルーティングの開始時
routeShutdown ルーティングの完了時
dispatchLoopStartUp ディスパッチループの開始時
preDispatch アクションがディスパッチされる直前
postDispatch アクションがディスパッチされた直後
dispatchLoopShutdown ディスパッチループの終了後

※フロントコントローラがリクエストに応じて処理の振り分け先を決めることを「ルーティング」、実際に処理を振り分ける(委譲する)ことを「ディスパッチ」と言う。

プラグインは、フロントコントローラがリクエストを振り分けるためにさまざまな処理を行っている途中で、任意の処理を割り込ませるためのしくみであると言える。
フロントコントローラの処理に割り込ませるということで、基本的にはアプリケーション共通の仕組みを実装する場合に利用できる。

Zend_Validate_StringLengthクラスは内部的にiconv_strlen関数で文字列長を取得している。iconv_strlen関数は、php.iniのiconv.internal_encodingパラメータで設定された文字コードで文字列長を換算するので、利用するにあたっては必ず、iconv.internal_encodingパラメータを設定するようにしておくこと。