Ubuntu Linux が素晴らしい!

Posted on 7月 25, 2006
Filed Under Linux | 1 Comment

Microsoft Virtual PC 2004 に Ubuntu Linux 6.06 Ja をインストールしてみた。

VirtualPC動かしてるホストPCは Windows XP SP2。
解像度は1280×1024。色の深度は32ビット。

とりあえずVirtualPCをぱぱっとインストール。
次に「ubuntu-ja-6.06-desktop-i386-20060602.iso」をダウンロード。

あとはここを参考にインストール!!
HowToConfigureUbuntuForMicrosoftVirtualPC2004

とりあえず最初メモリを128MBでやると途中で止まったので224MBまで増やすと大丈夫でした。
ちなみに192MBでもなんか途中で止まっちゃった。
256MBあれば大丈夫でしょうきっと。

メモリ増やしても変だったらインストール時にF4押して 800×600 16it とかでやるといいかも。

ちなみにこの記事は VirtualPC 上の Ubuntu Linux の Firefox から書き込んでます。

最近のLinuxはすごいですねぇ。。。

PHPからMySQL4.1とか5.0とか5.1とかに接続すると文字化けする

Posted on 7月 24, 2006
Filed Under MySQL | 1 Comment

GoogleさんやYahooさんで「PHP MySQL 文字化け」とかで検索しても
なかなか自分の環境にあった文字化け回避方法がなく超悩んで試行錯誤してみました。

なんか、いろいろなサイトを見ても、MySQLのバージョンが明確にされていないんです。
それじゃぁなんだかしっくりきません。
ある環境では文字化けが解消されたとしても、違う環境だと文字化けてしまうかもしれません。

ということで、まず、MySQLの文字コードに関する重要な設定項目を調べてみましょ。

・・・の前にMySQLのマニュアルにあるCJK(Chinese, Japanese, Korean)のFAQページに目を通してみましょう。
MySQL 5.0 Reference Manual :: 10.10 FAQ: MySQL Chinese, Japanese, and Korean Character Sets

自分は結構MySQLのマニュアルページを参考にするんですが、まず、日本語のマニュアルは古い情報しか載っていないのであんまオススメできません。
英語のマニュアルページだと結構知りたかった情報がてんこ盛りだったりします(でもウチ英語は不得意なのよね・・・!)。
でもGoogleでmysql関連の検索をしても、mysqlの公式サイトってなかなか上位に出てこない。。。なので、ウチが検索する時はGoogleで「(検索文字列) site:dev.mysql.com」な感じで検索してます。

で、ざーっと見た限り”SET CHARACTER SET utf8″するとか、”SET NAMES ‘utf8′”するとかskip-character-set-client-handshakeするくらいしか見当たりません。

とりあえずMySQL設定ファイルの文字コードに関連するオプションとしては以下のものが重要っぽいです。
 ・「SET NAMES xxx」文
 ・「SET CHARACTER SET xxx」文
 ・「default-character-set」オプション
 ・「skip-character-set-client-handshake」オプション
 ・「init_connect」オプション

 ※一応参照:MyNA Web Site - 4.1以上の壁 (日本語の扱いの違い、文字化け等/含む5.0以上)

MySQLのバージョン別に、どうやればPHPからMySQLに接続した時文字化けが発生しないかを考察した結果を記述します。

■1.MySQL v4.1.15以降、MySQL v5.0.13以降 の場合
MySQLの設定ファイル(my.ini, my.cnf)に以下の記述をすることで解決します。多分。

[mysqld]
default-character-set=ujis
skip-character-set-client-handshake

4.1.15以降と5.0.13以降のバージョンであれば「skip-character-set-client-handshake」というオプションが使えます。
で、このオプションを指定してやればPHPから接続したときでも自動的にクライアント側の文字コードが「default-character-set」で指定されたものに自動設定されます。
これは本当に素晴らしいオプションです。
今までバージョンでの苦労がアホみたいです。

一応設定ファイルには次のオプションも書いておきましょう。

[mysql]
default-character-set=ujis
[mysqldump]
default-character-set=ujis

もしかしたら「skip-character-set-client-handshake」の設定がしてあればこの設定をしなくても大丈夫かもしれません(検証してないです)。
mysqldumpセクションの設定はダンプするのなら必要かもしれませんね。

■2.MySQL v4.1.2~4.1.14、MySQL v5.0.0~5.0.12 の場合
これらのバージョンだと、悲しい事に「skip-character-set-client-handshake」が使用できません。
なので、代わりに「SET NAMES」を使うことにします。
「SET NAMES」の指定方法にも2通り考えられます。

 (1)プログラムからDBに接続後、直接「SET NAMES」文をぶち込む。
 (2)「init_connect」オプションを使う。

(1)の方法はweb上にもたくさん情報があるので説明不要かもしれません。
まず先にMySQL設定ファイルに文字コードを指定します。

[mysqld]
default-character-set=ujis
[mysql]
default-character-set=ujis
[mysqldump]
default-character-set=ujis

この状態でPHPのプログラム上から以下のようにSET NAMES文のクエリを発行してやります。

mysql_query('SET NAMES ujis', $connect);

もしくはPEAR::DBを使っていればこんな感じ。

$db->query('SET NAMES ujis');

余談ですが、WindowsのDOSプロンプトから接続している時はSET NAMES cp932が良いです。
sjisだとNEC拡張文字、IBM拡張文字が文字化けちゃったりします。

(2)の方法を使用する場合は一つだけ制約があります。
それは、MySQLのSUPER権限を持つユーザー以外で接続することです。
つまり、rootユーザーではなく、GRANT文等で作成されたユーザーで接続しなければなりません。
rootユーザーで接続した場合はinit_connectを設定しても、そのクエリは実行されません。

 ※参照(4.1):MySQL 3.23, 4.0, 4.1 Reference Manual :: 5.2.2 Server System Variables
 ※参照(5.0):MySQL 5.0 Reference Manual :: 5.2.2 Server System Variables

なので、まず、MySQLに接続するためのユーザーを作成します。

mysql> GRANT ALL ON *.* TO user@localhost IDENTIFIED BY 'pass';
mysql> REVOKE SUPER ON *.* FROM user;
mysql> FLUSH PRIVILEGES;

みたいな感じでしょうか。
ダメだったら必要な権限だけつけてGRANTしてやりましょう。

次にMySQLの設定ファイルに文字コードオプションを指定します。

[mysqld]
default-character-set=ujis
init_connect="SET NAMES ujis"
[mysql]
default-character-set=ujis
[mysqldump]
default-character-set=ujis

これで、作成したユーザーで接続すればおそらく文字化けは解消されるような気がします。

で、また余談なんですが、「init_connect」に関して非常に意味不明なことがあります。
それはGoogleの検索結果なんですが、検索件数が以下のようになってました(2006-07-24現在)
 Googleで「”init_connect”」を検索(Web全体から) ⇒ 14,800 件
 Googleで「”init_connect”」を検索(日本語のみ) ⇒ 42 件
 Googleで「”init-connect”」を検索(Web全体から) ⇒ 805 件
 Googleで「”init-connect”」を検索(日本語のみ) ⇒ 225 件
なんで日本語のページは「init」と「connect」の区切りがハイフンになってるほうが圧倒的に多いんでしょうね?MySQLのマニュアルではアンダーバーなのに・・・。ハイフンでも普通に動作するんですかね。

と、ちょっと話がそれましたが、
上記2通りの方法でもダメな場合はバージョンアップを検討しちゃいましょう。

■3.MySQL v4.1.0~4.1.1 の場合
このバージョンだとinit_connectオプションがサポートされていません。
なので、以下の設定をした上でプログラムから「SET NAMES」文をぶち込む方法しかないと思われます。

[mysqld]
default-character-set=ujis
[mysql]
default-character-set=ujis
[mysqldump]
default-character-set=ujis

っていうか、こんな古いバージョンのは使わないようにしちゃいましょう!

■3.MySQL v4.0系の場合
4.0系の場合は以下を設定しておけばそうそう文字化けないはずです。

[mysqld]
default-character-set=ujis
[mysql]
default-character-set=ujis
[mysqldump]
default-character-set=ujis

以上、試行錯誤終わり。

なお、今回はすべて文字コードにujisを設定していますが、MySQL v5.0.3以降を使える環境であればeucjpmsを使ったほうがいいかもしれませんね。
ujisだと先日も文字化けで苦戦したIBM拡張文字がサポートされてないかもしれません。
検証してないのでワカランですがそのうち試してみたいと思います。

もしくは、UTF-8を選択するのも良いかもしれません。

三菱東京UFJ銀行でSeasar2が採用!

Posted on 7月 21, 2006
Filed Under Seasar | Leave a Comment

Seasar適用事例で最大規模の案件でしょうか?
電通国際情報サービスさんならではって感じですね。さすが。

 Open Tech Press | 三菱東京UFJ銀行がミッションクリティカルシステムにオープンソースを採用

激萌え。

PHPで「髙(はしごたか)」「﨑(たつさき)」が文字化ける(2)

Posted on 7月 20, 2006
Filed Under PHP | Leave a Comment

IBM拡張文字の文字化け調査続き。

いろいろ調べると以下のページにたどり着きました。

 [pgsql-jp: 30776] Re: 漢字3 とは

まず、いきなり知らなかったことが、、、

# ちなみに、Widnows 用ブラウザの EUC-JP は、上記ページで説明され
# ている eucJP-open(eucJP-ms) とは別物で互換性はないので注意が必
# 要です。

わぁお。
・・・こいつは知らなかった。。。

つまり、ブラウザに表示させる時の文字コードがEUCだとIBM拡張文字は表示されないと。。。
あくまでWindows上への表示はSJISになるようにしないとダメなのですね。

いろいろ試した結果、以下の設定をした上で、かつ、mb_convert_xxxxx関数の
from-encordingを’SJIS-win’という固定文字列にすることでうまくできました。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');

ポイントは「eucJP-win」と「SJIS-win」を使うところでしょうか。

まず、「default_charset」の設定を「SJIS」にし、ブラウザで表示するときの
文字エンコーディングが シフトJIS になるようにします。

次に、「mbstring.internal_encoding」の設定で内部エンコーディングが
「eucJP-win」になるようにします。
内部エンコーディングを「EUC-JP」にした場合、「髙」などのIBM拡張文字 が
半角スペースになり、文字が欠落してしまいました。

最後に「mbstring.http_output」の設定で、出力文字エンコーディングが
「SJIS-win」になるようにします。
「SJIS-win」の代わりに「Windows-31J」を指定しても大丈夫なようです。
こちらも普通の「SJIS」にした場合は、IBM拡張文字が半角スペースになってしまいました。

ちなみに、以下の設定を行った上で、かつ、mb_convert_xxxxx関数のfrom-encordingに
mb_detect_order() を指定した場合はうまくできませんでした。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');
    ini_set('mbstring.detect_order'        , 'ASCII,JIS,UTF-8,SJIS-win,EUC-JP');

試しに mb_detect_encoding() 関数を利用して自動検出した文字コードを
調べたところ、「EUC-JP」と検出されていたせいのようです。

なぜだろうと考えているうちに、なぜか急にふと思い、
detect_orderの設定を次のようにして試してみました。

    mb_detect_order(array('ASCII','JIS','UTF-8','SJIS-win','EUC-JP'));

ini_set関数ではなくmb_detect_order関数を使って配列で文字コード検出順序を渡す方法です。

まぁ、当然結果は変わるわけないだろうと思っていたんですが・・・・・・

・・・・・・えぇっ!!?

なんと、mb_detect_encoding() 関数の自動検出が「SJIS-win」になったではありませんか!
マジ意味わかんないよPHP。

試行錯誤の果て、最終的に次の記述でうまくいきました。。。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');
    mb_detect_order(array('ASCII','JIS','UTF-8','SJIS-win','EUC-JP'));

この設定をした上で文字コード変換を次のようにしてやります。

        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        mb_convert_variables($_enc_to,$_enc_from,$array);

たぶんこれで大丈夫。
mb_convert_encoding関数を使う場合も以下の感じで大丈夫でした。

        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        $string=mb_convert_encoding($string,$_enc_to,$_enc_from);

それにしても文字変換は難しいわね!PHPちゃん!!

そのうちIBM拡張文字をMySQLに保存したら文字化けたりしないか試してみたいと思います。。。
MySQL5.0.3以上ならeucjpmsで大丈夫そうだけど4.1系だとどうなのかな。。。
UTF-8にしとけば大丈夫なのだろうか。。。

PHPで「髙(はしごたか)」「﨑(たつさき)」が文字化ける(1)

Posted on 7月 20, 2006
Filed Under PHP | Leave a Comment

CSVファイルに書かれた人名にIBM拡張文字が含まれていると文字化けた。
「髙橋」が「鄕@」みたいな感じに。マジPHPうんこだべや(でもPHPは好きだよ)。

調べてみたらこんなライブラリがあったので今度実験してみよう。

 CP51932 (Windows 日本語EUCコードページ 51932) と eucJP-win の差異を吸収するためのスクリプト

こっちは参考。

 [教えて!goo] 「髙(はしごたか)」を文字コード変換

それにしてもホント日本語の文字コード複雑すぎ。
まだまだ勉強しなきゃダメだなぁ。。。

こういうのって大規模な基幹系システムだとどういう風に処理してんだろ。
メインフレームとかだと独自に文字コード持ってるから大丈夫そうだけど、
・・・JavaもUTF-8だから大丈夫なのかな?

こういう問題にぶつかるのって、PerlとPHPくらいなのかしら。

・・・と思って調べてみたらJavaでもあるのですね。
 髙(はしご高)等の漢字が文字化けしてしまいます・・・ - Java Solution
この場合は結局何が原因だったんだろう・・・。
はぁ、、Javaよくわかんないや・・・。

PHP5でfgetcsvが正常に動作しない

Posted on 7月 19, 2006
Filed Under PHP | 18 Comments

CSVのインポート機能を持ったシステムをPHP4環境からPHP5環境へ移行したら、
なぜかCSVデータを正しく読み込んでくれない。っていうか一文字目が文字化け。
超悩んだあげくぐーぐるさんで検索しても以下のような記事しかみつからず。

[PHP-dev 1205] PHP5のfgetcsv()関数について

人力検索はてな - PHP4からPHP5へソースの移(長いので略)

csvファイルを読み込むと1バイト目の日本語が文字化け

3つ目の掲示板のyossyはあたくし自身なんですが・・・。

setlocaleとかいろいろ試してもしても結局読み込まれるCSVの文字コードは
ほとんどSJISなせいなためかなんだかうまくいきません。

ちなみに検証環境はほぼFedoraCore4のデフォルトです。
PHPは5.0.4だったような気がします。

で、結局回避策として正規表現でCSVをぶった切ることにしました。

3つめのリンク先の掲示板に正規表現でCSV読み込む関数を書いたんですが、
改行を含んだCSVファイルには対応していなかったので
改行にも対応した関数を作りました。

Excel形式(というかRFC4180)に準拠したデータなら大丈夫・・・かな?

既存のfgetcsvとほとんど同じような感覚で使えるはず。うん。

<?php
    /**
     * ファイルポインタから行を取得し、CSVフィールドを処理する
     * @param resource handle
     * @param int length
     * @param string delimiter
     * @param string enclosure
     * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返します。
     */
    function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
        $d = preg_quote($d);
        $e = preg_quote($e);
        $_line = "";
        while ($eof != true) {
            $_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
            $itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
            if ($itemcnt % 2 == 0) $eof = true;
        }
        $_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $d, trim($_line));
        $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
        preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
        $_csv_data = $_csv_matches[1];
        for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
            $_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
            $_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
        }
        return empty($_line) ? false : $_csv_data;
    }
?>

この関数を↓こんな感じで。

<?php
    $row = 1;
    $handle = fopen("test.csv", "r");
    while (($data = fgetcsv_reg($handle)) !== false) {
        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        mb_convert_variables($_enc_to,$_enc_from,$data);
        $num = count($data);
        echo "<p> $num fields in line $row: </p><br />n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo nl2br($data[$c]) . "<br />n";
        }
    }
    fclose($handle);
?>

MovableType 3.31 にバージョンアップしてみた。

Posted on 7月 19, 2006
Filed Under MovableType | Leave a Comment

Movable Type 3.3 のオンライン・マニュアルを見ながらMTを3.2から3.31にしてみました。
途中でInternal Server Errorがでてあせった。
単なるパーミッション設定ミスでした。でへ。

3.31にしたら月別のアーカイブが一件しか表示されない不具合が解消されました。

Smartyのdate_format修正子でYYYY年M月D日を表示

Posted on 7月 18, 2006
Filed Under Smarty | Leave a Comment

{$smarty.now|date_format:'%Y&#x5E74;%m&#x6708;%e&#x65E5;'|regex_replace:'/0([0-9])&#x6708;/':'$1&#x6708;'}

{$smarty.now}は現在のタイムスタンプを表示します。
 ※参照:{$smarty.now}

次にdate_format修正子で日付形式を整形しています。
このとき、

{$smarty.now|date_format:'%Y年%m月%e日'}

のように日本語で記述するとたまぁに正しく表示されないときがあります(環境は忘れた)。
なので、日本語部分を数値文字参照にしてやります。
今回の場合は16進の数値文字参照です。

{$smarty.now|date_format:'%Y&#x5E74;%m&#x6708;%e&#x65E5;'}

16進の数値文字参照を簡単に調べるには、IE等のブラウザで
アドレスに以下のように入力すると表示されるので便利。

javascript:document.write(escape("年月日"));

この場合はブラウザに「%u5E74%u6708%u65E5」と表示されます。
IEでは自動的にUTF-8の文字コード体系で表示されるので安心です(他のブラウザは知らんです)。

で、これでオッケーと思ったんですが、月が1桁だった場合(1~9月)
10の位にゼロが勝手に入りやがります。イケてないです。

そんなの独自のSmartyのプラグインとか作ればいいじゃないかって感じですが、
保守・運用の仕事としている私としては許せません。
独自のプラグインとかぶち込まれると結構大変なんです。

可能な限りデフォルトの状態で利用できるようにしたいのです。
なので、regex_replaceで無理やり置換してやります。

regex_replace:'/0([0-9])&#x6708;/':'$1&#x6708;'

これで月表示の10の位のゼロをとることができます。

うーん、、ちょー無理やりだわね!

Microsoft Virtual PC 2004 がフリーにっ!

Posted on 7月 13, 2006
Filed Under Software | Leave a Comment

あたくしが初めてパソコンに触れたのは約5年前。
そのときのOSはWindows 98 SecondEditionでした。
以来、ずーっとwindowsユーザーでございます。
((Macも一台持ってますが。。。

そんな中、仕事がらLinuxも使わなければならなくなってきました。
しかも、様々なディストリビューションを。。。

OSいろいろ使わなきゃいけないんで、今まではVMwarePlayerを使ってたりしてました。
でもやっぱ、VirtualPCが一番手軽に使えます。

そんなすばらしきソフトウェアがフリーになってしまったというではないですか。

これで開発環境もどんどん快適になっていきそうですね!

ありがとうマイクロソフトさんっ!!

Microsoft Virtual PC
窓の杜 - 【NEWS】MS、仮想PC作成・実行ソフト「Virtual PC 2004」日本語版を無償公開

phpeclipseでホバーテキストの内容が文字化ける現象の回避策っ!!

Posted on 7月 12, 2006
Filed Under PHP | Leave a Comment

Eclipse+PHPeclipseな環境で開発しているんですが、
ソース編集時に定数や関数などの上にマウスをもっていくと
その定数や関数の内容がホバー表示される機能があります。

でも、ソースがSJIS以外だと文字化けてしまうんです・・・。

ずっと困っていたんですが、ついに回避策がっ!!

編集時のホバーテキスト(PHPDocコメント)が文字化けする[改]

素晴らし過ぎ!!!

作者さんありがとう!!

keep looking »

Recently


Categories


Archives