Monthly Archives: 10月 2007

MySQLにおける、utf8_general_ci と utf8_unicode_ci の違いとは何か。

MySQLの照合順序における、utf8_general_ci と utf8_unicode_ci の違いとは何か。よくわからなかったのでマニュアルを紐解くと、MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 9.10.1 Unicode キャラクタセットにて、こう書かれています。

現在、utf8_unicode_ci照合順序はUnicode 照合順序アルゴリズムを部分的にのみサポートしています。中にはまだサポートされていない文字もあります。また、結合マークは完全にはサポートされていません。このことはベトナム語を中心に、ロシア内のマイノリティ言語に影響します。

utf8_unicode_ci主な特徴は、拡張をサポートしていることです。それは1つの文字が他の文字のコンビネーションと等価であると比較された場合です。例えば、ドイツ語や他の言語では、‘ß’ は‘ss’に相当します。

utf8_general_ciは拡張をサポートしないレガシー照合順序です。文字間で1対1の比較しかできません。つまり、utf8_general_ci照合順序に対する比較の方が早いが、utf8_unicode_ciに比べてわずかに正確性が劣ります。

utf8_generic_ciだとマッチする文字が増えるかもですよ、と。

例えば、以下の等式がutf8_general_ciとutf8_unicode_ciにおいて証明されます。

Ä = A
Ö = O
Ü = U

照合順序間の違いはutf8_general_ciに対して有効です。

ß = s

utf8_unicode_ciにとって有効である場合:

ß = ss

実際のところ、日本語2byteの場合はどうなんでしょうか。genericで困ったという話も聞きませんが。。

参考ページ

  • http://private.ceek.jp/archives/002377.html
  • Artichow を使ってグラフを描いてみる

    Artichow を使ってグラフを描いてみる – れぶろぐ (2007-10-20)で、PHPでグラフを描くためのライブラリを調べられていましたので、参考にさせていただきますm(_ _)m

    * ライセンスが public domain
    * 3D っぽいグラフが描ける
    * グラフの見た目がなんだか綺麗

    というわけで、Artichowが良いとのことです。

    preg_quoteで特殊文字をエスケープ

    preg_quoteを使うと、正規表現で特殊な文字として扱われる

    . \ + * ? [ ^ ] $ ( ) { } = ! < > | :

    を、エスケープすることができます。

    [php]
    $keywords = '$40 for a g3/400';
    $keywords = preg_quote($keywords, '/');
    echo $keywords; // \$40 for a g3\/400 を返します
    ?>
    [/php]

    これは便利ですね。次正規表現を使う際には是非活用してみようと思います。メモメモ。

    参考URL

    モックオブジェクトを使ったテスト

    PHPUnit3で始めるユニットテスト:第4回 モックオブジェクトを使ったテスト|gihyo.jp

    モックを使ったテストについてくわしく。実は使い方というか、使うタイミングをよく理解していなかった気がする。勉強勉強。

    ファイル・アップロードの進行状況を追跡する方法

    PHP V5.2 の新機能、第 5 回: ファイル・アップロードの進行状況を追跡する方法

    PHP V5.2 の新しい「フック」は実際にはデータ・ポイントで、正しいライブラリーがインストールされて構成されていればファイル転送プロセス中に使用できます。これらのフックが使用するのは、APC(Alternative PHP Cache) と呼ばれる機能です。PHP スクリプトがアップロードされたファイルを受け取ると、インタープリターは自動的に$_POST 配列で APC_UPLOAD_PROGRESS という名前の隠しフィールドを調べます。この隠しフィールドがキャッシュされる変数となって、アップロードに関する情報を格納し、スクリプトでアクセスできるようにします。情報をキャッシュに入れてすぐに利用できるようにすることで、ユーザーに視覚的フィードバックを表示してユーザー・エクスペリエンスの改善を図ることが可能になります。

    一応メモしますが、あまり使う機会がないかも。

    PHPでお手軽マルチタスクってできないの?

    PHPでお手軽マルチタスクってできないの? – ぎじゅっやさん

    cURLにはマルチタスク処理用のcurl_multiというものがあるんですね。
    マニュアルにはこうあります。

    [php]
    // cURL リソースを作成します
    $ch1 = curl_init();
    $ch2 = curl_init();

    // URL およびその他適切なオプションを設定します。
    curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
    curl_setopt($ch1, CURLOPT_HEADER, 0);
    curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
    curl_setopt($ch2, CURLOPT_HEADER, 0);

    // マルチ cURL ハンドルを作成します
    $mh = curl_multi_init();

    // ふたつのハンドルを追加します
    curl_multi_add_handle($mh,$ch1);
    curl_multi_add_handle($mh,$ch2);

    $running=null;
    // ハンドルを実行します
    do {
    curl_multi_exec($mh,$running);
    } while ($running > 0);

    // ハンドルを閉じます
    curl_multi_remove_handle($ch1);
    curl_multi_remove_handle($ch2);
    curl_multi_close($mh);

    ?>
    [/php]

    これは素敵ですね。マルチタスク的なものを自前で作ろうと思っていたのですが、とりあえずコレで色々とテストしてみたいと思います。

    Cactiインストール後、グラフが表示されずお困りの人

    いませんか?私です。
    CactiはPHP+MySQLな監視ツールですので、PHPerな人にお勧めかもしれません。そんなCactiをインストールして、グラフを表示する画面を表示したところ、

    Notice: Only variable references should be returned by reference in /home/cactiuser/cacti-0.8.6b/lib/adodb/adodb.inc.php on line 866

    などと出て、グラフ表示関連が全然駄目でした。

    原因は何か?

    インストール時、WEB上から初アクセスする時に環境設定画面があるのですが、そこの

    • New INSTALL
    • 8.x Upgrade

    とセレクトボックスで選択する画面で、なぜかupgradeを選んでしまっていたからでした。うーむ。自分でも不思議です。
    上記Noticeメッセージを検索しても日本語ではあまりヒットしないため、なかなかお困りの人もいないとは思いますが、一応メモっておきます。

    リロード対策のメモ

    すごいリロード対策 – p4lifeのメモということで紹介されます$token方法ですが、以前、PHPの種ブログのZend FrameworkでAdminページを簡単に作るためのコントローラ習作でも行ったセッションにトークンを渡す方法が、

    入力画面→入力確認画面と遷移してから別のウィンドウで入力画面→入力確認画面と遷移すると,前の入力確認画面のフォームは ticket が無効になり,フォームを送信できなくなる(複数画面同時編集ができない)

    という弱点がありましたので、それを改良されたスクリプトを載せられています。トークンをセッションの配列に入れ、複数のトークンを保存するという方法です。セッションがタイムアウトする時間や、保存する数を調整したりして是非取り入れさせていただきましょう。

    こういう弱点は中々気づかないです。やはりそれなり以上の規模サイトを作成する経験値がものを言うのでしょうか。

    Smartyで日本語などのマルチバイト文字の丸め。

    Smartyで文字を丸める時は、truncate修飾子などを使いますが、残念ながら日本語などのマルチバイトに対応していません。
    ですが、PHPの関数をそのまま使用できるので、マルチバイト対応のmb_strimwidthを使ってみてはどうでしょうか。

    [smarty]
    {$hoge|mb_strimwidth:0:15:”…”|escape}
    [/smarty]

    無事丸められましたでしょうか。

    mb_strlenのような文字数と勘違いしてましたが、mb_strwidthで得られるのと同じ、文字なんですよね。

    自分でオリジナルの修飾子を作るのも良いと思います。

    Web::Scraperが便利すぎるらしい

    このブログでも、Tidy無しのPHPでHMTL Parserなどで、パーサを紹介したりしましたが、どうもPHPはWEBスクレイピングに関してPerlやRubyほど強くない、というかライブラリが出揃ってないような気がしますね。表題のWeb::Scraperが便利すぎて困るの巻 (CodeZine編集部ブログ)はPerlですし、こういうのを見ていると非常に便利そうです。まあLLは目的に応じて使い分けたり、他の言語だと簡単にできるのにーという処理は素直に他の言語にまかせたりするのが良いと思います。

    ・参考URL