2012年04月10日

UTF-8以外のエンコーディングの際のチェックポイント

1年ぶりの投稿だー。
いつの間にか時間が過ぎていました。

で、今はたいていUTF-8で統一してサイトを作るのですが、今回、昔のシステムの中にCakeアプリをさっと入れようと思ったのですが、思わぬところではまったので書いておきます。

・MySQL 4.0で、テーブルが EUC-JP(ujis)
・なので、database.php の中で、エンコーディングを ujis に設定した。
・CakePHP 1.3.14 で現在の最新版
・/app/views/layouts/default.ctpの中で、charset=euc-jpも設定した。

なのに、
【問題】edit.php で日本語が消えてしまう!
という現象が発生しました。英語だときちんと表示、編集できます。なんだこりゃ。
最新版で入った問題点かな、とか疑ってしまいました。

viewの中の $this->Form->inputから順番にたどっていったところ、内部で h()をかけていました。そして、
結局のところ、 core.php の中の App.encoding の値を見て、 htmlspecialchars() を実行していることが分かりました。あった、あったよ〜(涙

というわけで、"UTF-8以外のcharsetを使ってCakePHPを使う場合"には、

・MySQLなら、テーブルのエンコードを確認
・database.php の中の encoding の値を確認
・/views/layouts/default.ctp の中の charset の値を確認
・core.php の中の、App.encoding の値を確認

という4点セットが必要です。今の時代に UTF-8じゃないコーディングで使っている人がどれぐらいいるか分かりませんが、備忘録として書いておきます。

ふぅ・・・。
posted by SDozono at 16:38| 東京 晴れ| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2011年04月22日

CodeIgniterがんばる!

今年2011年はPHPフレームワーク的にみると大きな転換点?かもしれません。
全地域で見ると、Code IgniterがCakePHPを超えて検索量トップに出てきているようです。
軽く高速なフレームワーク、というコンセプトがPHPとうまくかみ合っているのかもしれません。

ScreenClip.png

posted by SDozono at 10:46| 東京 曇り| Comment(1) | TrackBack(0) | PHP Framework | このブログの読者になる | 更新情報をチェックする

2011年03月25日

i18n国際化表示がうまくいかない?(Locale/mo file??)

とりあえず現状報告です。

--------------
PHP 5.2.5
Zend Optimizer
CakePHP 1.3.8
--------------

現在、Cakeのlocakeディレクトリ内に jpnディレクトリを作成し、POEditで作成した poファイルとmoファイルを入れてあります。と、なぜかあるサーバに限って日本語表示がうまくいかず、英語になってしまいました。

・service httpd restart などとすると、一瞬日本語が表示される。
・他のサーバではまったく問題が発生していない
・別ディレクトリに同じソースをコピーしても、そちらでもうまく表示されない
・cacheなどの設定はすべて試したがそれでは解消されなかった。
・Zend Optimizerを入れていたのでそれも疑っていた。

結局、「default.moファイルのファイル名を変更して、default.poだけを使用するようにしたところ、正しく日本語表示されるようになった」という結果になりました。

まだソースを追っていないので詳細は不明です。
あと、/tmp/cache/persistent 内にできているファイルサイズがやたらと巨大になり、中を見てみると、同じデータがなども繰り返して入っているようでした。

みなさんは経験ありますか〜〜?
ちなみに、POEditが悪いのかと思い、msgfmtで.moファイルを作り直してもみたのですが、やはり同じ内容に・・・・。

まだよく分かりません。

posted by SDozono at 17:33| 東京 晴れ| Comment(0) | TrackBack(0) | Japanese Translation | このブログの読者になる | 更新情報をチェックする

2011年03月08日

DEBUG=0なのにDESCRIBEが頻発する

うひゃ〜久しぶりの更新だ。

今回、依頼されて調査したのは、「DEBUG=0に設定しているのに毎回DESCRIBEが発行されており、パフォーマンスに影響している」というものでした。

そんなこと起こるのかなぁと思ったら本当に発生していました。
まず最初に調べたのは、内部のコードで、DEBUGの値を変えていないか、というチェック。
Grepで一気に調べましたが、ありませんでした。

うーん、なんでだろう、と/app/tmp/cache/models を調べたところ、ファイルが生成されていないことが判明。
CakePHPは、テーブル構造の情報を DEBUG>0にしていると毎回チェックしますが、DEBUG=0にすると、「テーブル情報を/app/tmp/cache/models/内に書き込み、そのキャッシュを利用して速度を上げる」仕組みになっています。

つまり、キャッシュが生成されていないので毎回DESCRIBEが発行されていると判明。

ファイル権限をいろいろ調べましたが、そもそも/app/tmp/logs内のファイルなどは出力されています。
さらに調べたところ、core.php内の、

//Configure::write('Cache.disable', true);

がアンコメントされていることに気が付きました。
標準通りコメントアウトしたところ、無事に動作が戻りました。
posted by SDozono at 16:25| 東京 曇り| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2011年01月13日

CakePHPのワンクリックアップデート用ソースコード

「ワンクリックで自動アップデートさせるような機能を実現するCakePHPのソースコードだれか知らない?」とtwitterでつぶやいたら、即座にスイスから答えが返ってきました。

http://twitter.com/#!/dhofstet/status/25072465570963456

Googleで検索するだけの時代でないことをひしひしと感じます。
自分で検索してたらずいぶんと時間がかかっていたと思います。

というわけでこちら。鬼才mcurryのアプリケーション内にそのコードがありました。

https://github.com/mcurry/20Couch/blob/master/app/controllers/update_controller.php

まず、下記で最新バージョン番号を取ってきます。

//get the current version
App::import('Core', 'HttpSocket');
$Http = new HttpSocket();
$latestVersion = trim($Http->get(Configure::read('20Couch.home') . '/latest'));


下記で取得後、ファイルが正しくダウンロードできたか確認しています。

$Http = new HttpSocket();
$Setting = ClassRegistry::init('Setting');
$url = sprintf('%s/registrations/direct/%s/' . Configure::read('Update.file'), $home, $Setting->find('value', 'registration_key'));
$latest = $Http->get($url);


展開処理

$msg = '(using ZipArchive)';
$zip = new ZipArchive;
$zip->open(TMP . Configure::read('Update.file'));
$result = $zip->extractTo(ROOT);




posted by SDozono at 09:26| 東京 晴れ| Comment(0) | TrackBack(0) | CakePHP | このブログの読者になる | 更新情報をチェックする

2010年08月26日

DEBUG=0でも、DB接続エラーを表示

DEBUG設定を0にしていても、MySQLが動作していなければエラーを表示させるには。

app_controller.php に下記のように書いてみました。

(1)まず、下記を class宣言"class AppController extends...."の前に追加。
 
uses('model'.DS.'connection_manager');


(2)それから、
 
function __construct() {
parent::__construct();

$db =& ConnectionManager::getDataSource('default');
if(empty($db->connection)){
echo "Database Connection Error! Check your DB.";
exit;
}
}


これでOK。
posted by SDozono at 17:01| 東京 晴れ| Comment(2) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2010年07月27日

LithiumとCakePHP

下記のブログ、なかなか面白いです。
要注目。

shift8
http://shift8creative.com/blog

もうLithiumの勢いがどうにもとまらない?という感じで、CakePHPがスタンダードとなった今、次の技術がはじまっている予感が。

どなたがはじめたかわかりませんが、
http://www.j-lithium.net/
も頑張って最新情報を追いかけ続けてほしいです。

cakephp.jpのフォーラムニュースも更新しないと・・・。
数年続けたので、今後もまぁがんばりましょう。
興味のわく方は、自由に見つけた記事を投稿してください。
posted by SDozono at 01:23| 東京 雨| Comment(2) | TrackBack(0) | PHP Framework | このブログの読者になる | 更新情報をチェックする

2010年06月18日

Error at PHP 5.1.6

CakePHPのソースで、「PHP 5.2以上だとOKなのに、PHP5.1.6だと画面が真っ白になる」という現象を追ったところ、原因が判明したのでメモ。

現在、CentOS 5のyumで単純にPHPを入れると、5.1.6になりますので、今でも結構、使われているのではないでしょうか。

今回、問題になったコードは、

$conditions['AND'] = $conditions;

でした。

PHP 5.2以降では問題なく(?)動作していたようです。

開発環境や、開発テスト機はPHP5.2以降だったので気が付かなかったのですが、実際の運用環境がPHP5.1(というかCentOSそのまま)だったので、画面が真っ白になる現象が起きました。

$tmp = $conditions;
$conditions = array();
$conditions['AND'] = $tmp;

などとしたら、PHP5.1でも問題なく動作しました。

人のコードを読むと、自分では書かないようなものに出会いますね・・・。
posted by SDozono at 01:32| 東京 晴れ| Comment(0) | TrackBack(0) | CakePHP General | このブログの読者になる | 更新情報をチェックする

2010年04月01日

文字コード問題でダウンロードできない・・・

(CakePHPネタじゃありませんが)

Vtigerですが、
http://vtiger.com/
何回目かのサーバの引越しをしたところ、添付ファイルがうまくダウンロードできなくなったとのお知らせが・・・。

ファイル名を見ると、Shift-JISがあったり、UTF8らしいのにUTF8で扱えなかったりとなんじゃこりゃの状態に。サーバの設定がまちまちだんたんだなぁ・・・。

最初は、

convmv
http://www.j3e.de/linux/convmv/
とか、はたまたWindows上で
uniconv
http://www.vector.co.jp/soft/winnt/util/se368807.html
とかを試してみたのですが、どうにもうまくいきません。無駄な時間だけがながれてゆく・・・・。

数百ファイルをどうしようと思いましたが、ふと、「色々文字化けとか面倒なのであれば、ダウンロードする時点で、PHP側でファイルを見つければいいんじゃないか」と思い、

/home/trixbox/www/vtigercrm/modules/uploads/downloadfile.php
の中に、

・UTF-8でファイルがなければ、Shift-JISにファイル名をエンコードして検索してみる
・(略)
・それでもなければ、先頭のINDEXの数字を頼りに検索

して、見つけてくる数行を書きました。
とりあえず、これでOK。

「データがおかしい場合には、無理にデータを直そうとせずに、取り出す時点で柔軟になんとかできないか考える」というのも大事ですね。
posted by SDozono at 16:38| 東京 晴れ| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2010年03月18日

PHP6はどこへ行く・・

こちらで早速まとめられていますので、これが分かりやすい。

PHP6開発 UTF-16化を断念、5.3へロールバック
http://journal.mycom.co.jp/news/2010/03/17/053/index.html
「PHPの次期メジャーバージョンはPHP6になるとみられてきたが、問題を打破するために開発ブランチを5.3ベースへ巻き戻すという対処が実施された。Rasmus Lerdorf氏がphp.internals: PHP 6においてPHP6 Unicodeの実装が失敗したことを伝えている。PHP6ではエンジン内部の処理がUTF-16に統一される計画になっていたものの、関係者からはこの方針は間違っているのではないかという指摘もあった。今回実装が行き詰まったことで、PHPはUnicodeに対して新しいアプローチをとることになる。」

元ネタ記事はこちら:
Future of PHP 6
http://schlueters.de/blog/archives/128-Future-of-PHP-6.html
posted by SDozono at 09:40| 東京 晴れ| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする