msgbartop
LAMP+Zend Frameworkをメインに日夜励んでおります。システム開発に対する熱い想いを掲載します。
msgbarbottom

2009年 12月 15日 Zend_Validateの日本語化

以前からZend_Validateを使っていたのですが、本格的な翻訳は行わず、手元で強引に日本語メッセージを作成していました。
しかし、開発規模が大きくなってくると対応が難しくなってきます。

ZendFrameworkにはZend_Translateという多言語に対応したアプリケーションを作るためのパッケージが用意されています。

このZend_Translateを使うとZend_Validateのメッセージを多言語に対応させることが可能です。
※ZendFrameworkのバージョンは1.9.6を使っています。
 
 
 
■Zend_Translateの使い方

Zend_Translateでは設定ファイルを、配列、CSV、ini、Gettextなど各種入力ファイルをサポートしていますが、ZendFrameworkのドキュメントに記載されている例を使って、簡単な配列で説明いたします。

$english = array(
	'message1' => 'message1',
	'message2' => 'message2',
	'message3' => 'message3');

$japanese = array(
	'message1' => 'メッセージ1',
	'message2' => 'メッセージ2',
	'message3' => 'メッセージ3');

$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($japanese, 'jp');

print $translate->_("message1");

// 結果:メッセージ1

このようにとても簡単に翻訳ができます。
 
 
 
■Zend_Validateの翻訳

Zend_Validateの翻訳は量が多いため、配列ではなく、ini形式で翻訳ファイルを用意しました。以下は、翻訳ファイルの記載例です。

; Alnum
Invalid type given, value should be float, string, or integer = "不正な値です。小数、文字列、又はは数字を入力して下さい。"
'%value%' has not only alphabetic and digit characters = "'%value%'にアルファベットと数字以外の文字が含まれています。"
'%value%' is an empty string = "'%value%'が入力されていません。"

どのメッセージを日本語化すべきかは、Zend_Validateのドキュメントに記載されています。

http://framework.zend.com/manual/ja/zend.validate.messages.html
 
 
次に作成した翻訳ファイルをZend_Validateにあてます。

$translate = new Zend_Translate('ini', '/filepath/validate.jp.ini', 'jp');
Zend_Validate_Abstract::setDefaultTranslator($translate);

これでValidateを行うとメッセージは用意した翻訳ファイルにしたがって日本語化されます。

Tags: , ,

2009年 12月 07日 ブラウザにパスワードを補完されたくない時

通常、ブラウザでパスワードを入力して送信すると、
ブラウザが「パスワードを保存しますか?」と聞いてきて、
「OK」すると、パスワードが保存されます。

ドメイン単位で管理されているらしく、ブラウザのオートコンプリート機能によって
パスワードの入力欄があると勝手に補完されてしまいます。

<form>
    <input name="loginid" type="text" value="" />
    <input name="password" type="password" value="" />

    <input type="submit" value="送信" />
</form>

どうやら、passwordと直前のtextとの組み合わせで、
両方の値が空(value=”")の場合に、勝手に補完されるようです。

<input name=”password” type=”password” value=”" autocomplete=”off” />
とすれば補完されないようですが、今回はそれとは別の方法で防ぎます。

password直前のinputに適当に値を入れてみます。

<form>
    <input name="loginid" type="text" value="" />
    <span style="display:none">
        <input name="datetime" type="text" value="<?= date("Y-m-d H:i:s") ?>" />
    </span>
    <input name="password" type="password" value="" />

    <input type="submit" value="送信" />
</form>

こうすることで、ほとんどのブラウザで補完されなくなります。

Tags:

2009年 12月 03日 MySQLのsubstring関数

先日MySQLのsubstring関数を使う機会があったのですが、PHPのsubstrとは少し動きが違うみたいです。

PHPでは以下のような結果になるものが、

// PHP
substr('logosware', 3, 2)

出力結果
os

MySQLでは、違う結果がでます。

// MySQL
substring('logosware', 3, 2)

出力結果
go

また、

今度は開始位置にマイナスを入れてみると・・・

// PHP
substr('logosware', -3, 2)

出力結果
ar

MySQLでは、同じ結果が返ってきます。

// MySQL
substring('logosware', -3, 2)

出力結果
ar

些細なことですが、正しく理解していないと当然バグにつながります。

Tags: ,

2009年 11月 13日 html2fpdfで確実に改ページする方法

PHPプログラムで、動的にPDFファイルを生成することがよくあります。
このとき、mbfpdfというPDF生成ライブラリを利用するのが主なのですが、
簡単な帳票などは、html2fpdfというライブラリを私は利用しています。

この時、以下のような現象になりがちです。
html2pdf

google先生で検索すると、
色々と改行方法のインフォメーションがあるのですが、
どれも実際はうまく動きませんでした。(あくまで私の使っているバージョンでは)

そこで、半ば無理やりに、但し確実に改ページする方法を紹介します。
html2pdf.phpに


function WriteHTML($html)
{
  $this->ReadMetaTags($html);
  $html = AdjustHTML($html,$this->usepre); //Try to make HTML look more like XHTML
  if ($this->usecss) $html = $this->ReadCSS($html);
	//Add new supported tags in the DisableTags function
	$html=str_replace('enabledtags); //remove all unsupported tags, but the ones inside the 'enabledtags' string
        //Explode the string in order to parse the HTML code
	$a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE);

	foreach($a as $i => $e)
	{
		$this->SetFont('SJIS','',9);
		$this->SetTextColor(0,0,139);
		$e = mb_convert_encoding($e,'SHIFT-JIS','UTF-8'); 

このような記述部分があります。
ここでは、変換対象のHTMLを解析し、HTMLタグを抽出し、
それに対応したPDF出力を行う部分になります。

foreach($a as $i => $e)

この$eの中に、タグが格納されています。(tableとかtrとか)

そこで、
例えば「divタグがある場合は、必ず改行」と自分の中でルールを設定し、

foreach($a as $i => $e)
	{
		if($e=="div"){
			$this->AddPage();
		}

このような感じで、mbfpdfの改ページメソッドを叩けば、
その部分で確実に改ページされます。
かなり無理やり感がありますが、
応用すれば、色々なHTMLタグに対して、
いかようにも出力を操作できますので、非常に便利だと思います。

参考にしていただければ幸いです。

Tags: ,

2009年 11月 02日 CIFSでマウントしたファイルがApacheで表示されない問題

Windows上のデータをCIFSにてマウントし、そのファイルをApacheにて表示する際に、ファイルが正常に読み込まれない問題が発生しました。

状況としては

  1. マウントしているディレクトリからtest.htmlを表示させようとしても表示しない。
  2. Apacheのログでは正常に読み込まれているが、読み込みファイルサイズがゼロ。
  3. test.htmlが256バイトよりも小さい(255バイト以下)であれば表示される。
  4. test.phpなど動的ファイルは256バイト以上でも表示される。
  5. SSLで読み込むと表示される。

しばらく原因を探しているたら見つかりました。

http://httpd.apache.org/docs/2.2/ja/mod/core.html

以下引用

ネットワークマウントされた DocumentRoot (例えば NFS や SMB) では、カーネルは自身のキャッシュを使ってネットワークからのファイルを 送ることができないことがあります。
これらの問題に当てはまるサーバの設定の場合は、以下のようにして この機能を使用不可にしてください:

EnableSendfile Off

この「EnableSendfile Off」を書いたら表示されました。

Tags:

2009年 08月 28日 MacのXdebug設定(非MAMP環境)

MacのMAMP環境でのXdebugの設定方法は見かけるのですが、Mac標準のApacheでの設定方法があまりなかったため書いておきます。

環境

  • MacOSX 10.5 Leropard
  • PHP 5.2.8(標準)

まず、わたしが試した失敗例から紹介します。
他の環境と同じようにXdebugのサイトから、sourceをダウンロードし

  1. phpize
  2. ./configure –enable-xdebug
  3. make
  4. xdebug.so のコピー
  5. php.ini の設定

と、やってみたのですが、どうもうまく設定できませんでした。ネット上をいろいろ調べてみると、みなさん結構苦労しているようです。

どうやら、Komodoで提供しているxdebug.soを利用する例もいくつか載っていたため、チャレンジしてみました。

KomodoのサイトからRemote Debugging Packagesをダウンロードします。(このときはKomodo 5.2 (alpha)のPHP Remote Debugging Mac OS Xをダウンロードしました。)

展開するとPHPのバージョンごとにディレクトリがあるため5.2のなかにあるxdebug.soをコピーします。

sudo cp ./xdebug.so /usr/libexec/apache2/xdebug.so

つぎにphp.iniの設定を行います。Macのphp.iniは、初期設定ファイルとして /etc/php.ini.default が置いてあるので、

sudo cp ./php.ini.default ./php.ini
sudo chmod 666 ./php.ini

とし、.php.iniに以下の内容を追加します。

[xDebug]
zend_extension="/usr/libexec/apache2/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_handler = dbgp
xdebug.remote_host = localhost

その後、Apacheをリスタート

sudo apachectl graceful

phpinfo()を確認し、下記画像のようにxdebugのverが表示されていれば成功です。

Xdebug v2.0.4

Tags:

2009年 08月 17日 PHP開発環境の選択肢

 
 
重い。
 
 
 
Eclipseの動作が重い。
 
 
 
ある日私は、そのストレスが限界に達し、違う開発環境をもとめネットをさまよっていた。
 
 
ネット上では、軽い動作を望むのであれば、Vimを進めている人もいたがちょっと気が進まない。
 
また周りの社員に聞いてみると「”NetBeans”ってのが早いらしいですよ。」と言っている者がいた。
 
 
 
 
ふーん、聞いたことも無いが、早いってのはいいな。
 
 
さっそく”NetBeans”で検索してみると、幾度のレポートで「Eclipseよりも早い!」
 
そう書かれている。
 
 
 
これはいけるのでは?
 
 
 
夏の炎天下の下で食べる甘いかき氷のような、そんな淡い期待を持ってNetBeansをインストールしてみる。
 
 
 
たしかに早い。
 
 
まず、起動が早い。そして終了も早い。
 
 
次に今まで開発していたプロジェクトを読み込んでみる。
 
が、予想に反して、何の設定もせず、プロジェクトの読み込みをしただけでEclipseで作っていたソースたちをしっかりと読み込んでしまった。
 
 
な、なんという予想外。
 
 
い、いやまて、まだ安心するな。そうだ、デバッグだ。
 
 
私はXdebugを利用してるのだが、早々すんなりと動かないことが多い。Eclipseの時もはじめの頃は苦労して環境を構築した記憶がある。
 
 
Xdebugの設定、設定・・・。
 
 
これといった設定が見当たらなかったので、Webサーバーのアドレスだけ設定してみたところ・・・。
 
 
デバッグが動いてしまった。
 
 
すばらしいじゃないか。
 
 
 
私の中で淡い期待が、いつしか確信へと変わっていったころ、あることに気がついた。
 
 
フォルダの参照ができていない。
 
 
Eclipseでは特定のフォルダをUnixでいうシンボリックリンクのように参照することができる。が、その機能がないらしい。
 
 
たったそれだけの機能だが、私の扱うプロジェクトでは非常に重要な機能となる。
 
 
 
 
私の夢は、夏休みの遠い思い出のように、奥深くのタンスにしまわれたわけだが、多くの人にとってはフォルダ参照機能など必要ないのかもしれない。
 
 
Eclipseの動作に重さを感じているのであれば、一度NetBeansを見てみるのも良い選択肢だと思う。
 
http://ja.netbeans.org/

Tags: ,

2009年 08月 03日 MacPorts

以前、システム開発部ブログでMacOS Xについて投稿されていたので、

私も、MacOS Xで開発を行う上で欠かせないパッケージ管理システム(MaxPorts)を紹介します。

MacOS Xでは、MacPortsと呼ばれるサードパーティのプロジェクトが存在し、オープンソースソフトウェアのレポジトリ、管理ツールを提供してくれます。
これを使うことによりMacOS X上でより良いUNIX生活を送ることができるようになります。

この管理システムはLinuxでお馴染みのapt、yumとは違い
ソースからのコンパイルによるパッケージ導入、variants と呼ばれるオプション選択機能があり、
このvariantsの機能によって、
従来のコンパイルによるインストールと同じように、ユーザーが自由にオプションを選択をすることでができます。

導入するにはXCodeというgcc等のコンパイラが入った開発環境が必要でXCodeをインストールすることで初めてMacPortsが動くようになります。

実際に使用してみました。

//パッケージインストール
sudo port install パッケージ名

でインストール。

//パッケージ検索
sudo port search 文字列

とすれば、その文字列を含むパッケージ名の検索が行えます。

オプション指定は、

//オプション指定
sudo port パッケージ名 +オプション +オプション

オプションは何個でも指定できます。

調べたいオプションがある場合は

//オプション検索
sudo variants パッケージ名

でオプションを検索できます。

実際にapache2, php5, mysql5をインストールしてみると

//mysql, apache, php の順にインストール
sudo port install mysql5 +server
sudo port install apache2
sudo port install php5 +apache2 +imap +macosx +mysql5

上のようなコマンドになります。

使用感はやはりというかインストール時の遅さが目立ちます。
Apache2,Mysql5,PHP5をインストールするのに大体1時間以上は、かかったかと記憶しています。
apt,yumなら5分も掛からないですね。

もし、速さを重視するなら
もうひとつのMacOS Xパッケージ管理システムのsyncがお勧めです。
syncであればコンパイル済みのパッケージを提供してくれるので、コンパイル分の時間が掛かりません。apt、yumと同じですね。

私はオプションを指定を重視したのでMacPortsを選びましたが、MacOS Xには様々なパッケージ管理システムがあり、
それぞれ一長一短ありますのでよく調べた上で自分に合う管理システムを選べば良いのではないでしょうか。

以上MacOS Xでの開発を手助けしてくれる、MacPortsの紹介でした。

Tags:

2009年 07月 14日 Twitterの側面

 
「意外と悪くない」そう思ったのが、最初の感想だ。
 
 
面倒くさくもなく、程よい楽しさがある。たった一言のつぶやきを見ているだけだが、意外と面白いものである。
 
そんなことを考えていると、Twitterの何が楽しいのか?自分なりに考察してみたので、まとめてみた。
 
※以下、きわめて個人的な考察であることを念頭において読んでいただきたい。
  
 
 
当初、なぜTwitterが有名になったのか、まったく理解できなかった。たまたまだろうと思っていたが、実際に触ってみると、実はそうでもないのでは?と感じ始めた。
 
 
■SNSコミュニティでの燃えつき症候群
私をはじめ、回りの友人たちはmixiが流行り始めた頃に、こぞって参加していたものだ。しかし、いまmixiを覗いてみても、私の友達のうち9割は日記の更新を行っていない。
 
mixiの面白さの1つには、フレンドの日記を通して「変化」を見ることができることと、自分の日記への「フィードバック」を得られることだと思う。
これらの刺激を求めるため、必死になって日記を更新し、フレンドの日記にコメントをつけ、自分の日記に書かれたコメントに返信を行っていた。しかし、日記を書くという行為になれてない多くの友人は、いつの間にか疲れ果ててしまったのではないかと思う。要するに「燃え尽き症候群」である。
 
 
■Twitterの手軽さ
Twitterは、mixiでいう「日記」が「つぶやき」に置き換わったサービス、と考えることもできる。フォローする相手のつぶやきを通して、その人の「変化」を楽しむことができ、自分の更新もmixiの日記のように「重い作業」とならず、ただ「つぶやく」だけで非常に楽だ。そしてたまに返ってくる自分の「つぶやき」に対してのフィードバックも気持ちいい。
また、mixiのように「コメントをもらったら必ず返信しなくては」という強迫観念のようなものも無いことがいい材料となっている。
ようするに極めて軽い気持ちのまま続けることができ、それなりの楽しさや刺激を受けることができる。というものがTwitterなのではないかと思う。
 
 
しかし、Twitterにしても、ユーザーによってはフォロー数を伸ばそうと必死になる人もいるだろうし、「毎時間」更新しなくては。と思うユーザーもいるだろう。
結局は自分自身で楽しめる位置を見つけ、サービスに振り回されないことが重要なのだと感じた。

Tags:

2009年 07月 07日 Windowsマシンの必要性

iPhoneのアプリ開発が面白そうなため、iPhone3GSを購入した。
 
 
アプリ開発にはMacが必要になり、購入のためにいろいろ検討していたのだが、そのうち所有しているWindowsマシンが必要ないのでは?と思えてきたのだ。
 
というのも、今のMacでは昔のように不便な点が見当たらないどころか、Windowsよりも優れているように感じてきた。
(まぁそれはまだ使い込んでいないからだと思うが)
 
 
まずWindowsの利点だが
・情報量が多い
何よりも、この差は大きいと思う。使っている人の絶対量が多いため、ネット上での情報量も多い。
 
・多くのハードウェアから選択できる
多くのハードウェアメーカーから、さまざまなハードが提供されている。自分にあったハードを選択できるし、値段もピンキリなので選択の幅も広がる。
 
・回りの人に相談しやすい
自分の周りでWindowsを使っている人は90%以上だ。困ったときにすぐ相談できるし、同じ話題でおちゃらけた話をすることもできる。
 
・日本語変換機能が優秀
標準のIMEが結構優秀で、ATOKを考える必要もないが、Macのことえりは、ATOKの必要性を感じてしまう。
 
・PCゲーム
ゲームが目的でPCを購入するのであれば、Windowsマシンになるだろう。Windowsのみで稼動するソフトは相当数あると思う。
 
 
で、Macの利点はというと
・Web開発
どちらかというとUnixOSを元にしているMacのほうが、開発は行いやすい。特別なツールなどを入れなくても手元の環境がUnixなため、簡単に開発環境を構築できる。もちろん、Javaで動くEclipseも問題ない。
 
・ハードウェア、ソフトウェアの双方をAppleが開発している
MacBookのトラックパッドを利用してみるとわかりやすい。1本指から4本指までの操作に対応している。と書いても想像できないものだが。ハード、ソフト両方を開発しているため、さまざまなアイデアを実現しやすいのではないかと思う。
 
・iPhoneの開発ができる
他の環境でもできないこともないが、やはりMacのほうが開発しやすいだろう。
 
・OSが64bit化され、3GB以上のメモリが使える
MacOS10.5のLeoperdから、OSのメモリ回りが64bit化されている。MacProでは48GBのメモリも使えるらしい。さらに次のSnowLeopardではOSのコア部分が64bit化されるらしい。
※余談・・・Windowsでは32bit版と64bit版が発売されているが、Macでは1つのOS内で32bitと64bitを共存させている。これはCPU等のハードに命令する前に、クッションとなる仕組みを用意しておき、32bit命令か、64bit命令か振り分けているようだ。
 
・そして最後になるが、IntelMacになりWindowsが起動可能になった
利点ではないかもしれないが、Windows上ではMacは起動できない。しかし、Mac上では、VMWare Fusion や Parallelsといった仮想ソフトを使うことで、ウィンドウ内でWindowsを起動できる。いざというときにも困らないし、開発時のデバックなどにも対応できる。
  
 
上記にいろいろ理由を挙げたが、決定的だったのはMac上でWindowsを起動できる。ということだ。やはり仕事でWindowsを利用しているのならば、プライベートでもWindowsを使いたくなることはある。MacでWindowsを使えることは大きい。
 
 
このような理由もあって、一番最初に触ったMacintosh Performa 575から15年の時を経て、MacBook 2400(MB467J/A)を使うことになり、久しぶりにMacerに戻ることになった。

Tags: ,