2007年9月15日土曜日

VC++ & Unicode 上での全角/半角の文字判定

正直、VC++ で文字列を扱うこと自体、嫌な思い出ばかりで嫌い・・・
でも EditBox の入力チェックとか、制限とか、かなり文字とは縁があるので避けて通れない道・・・。
 
と、いうことで今回は、VC++ & Unicode で開発しているプログラムで、全角文字の入力を制限することになった(仕様の関係で)。
Shift-JIS では散々やったが、Unicode か・・・。
Unicode 上では半角とか全角とか、そんなんないんだけどドーヨ?と、思ったが当然 API は存在した。
GetStringTypeEx という API で、こんなかんじ。
ちなみに、↑のドキュメントは 半角と全角の定数名が逆になっているので注意。
明らかに間違いです、、C3_HALFWIDTH が半角です・・・(動かして確認した)。
 
API だけ紹介しても意味ないですよお兄さん!
と、いうことで以下の感じで実装。
 
追記 2009.06.12: このページへの訪問がおおいので、サンプルコードを書いてみました。

// 文字列がすべて半角か確認する
BOOL IsAllHankaku( const TCHAR* pTarget, int nLen )
{
    // 文字の種別を取得する
    WORD* pType = new WORD[ nLen ];
    GetStringTypeEx(
         LOCALE_SYSTEM_DEFAULT   
// ユニコード版プロジェクトでは、無視される引数      
        ,CT_CTYPE3               
// 全角、半角、ひらがな等を判定するタイプ
        ,pTarget                 
// 判定対象となる文字配列
        ,nLen                    
// 判定対象となる文字配列のサイズ
        ,pType                   
// 判定結果の配列
        );
    // 結果がすべて半角なら TRUE をかえす
    BOOL isAllHankaku = TRUE;
    for( int i = 0; i < nLen; i++ ){
        if( !(pType[i] & C3_HALFWIDTH) ){
            isAllHankaku = FALSE;
            break;
        }
    }
    delete [] pType;
    return isAllHankaku;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
   
// ロケール設定
    std::wcin.imbue( std::locale("japanese") );
    std::wcout.imbue( std::locale("japanese") );
   
    std::wcout << _T("文字列を入力してください:");
    std::wstring szTarget;
    std::wcin >> szTarget;
    // 上記の関数を呼び出し
    BOOL isAllHan = IsAllHankaku( szTarget.c_str(), szTarget.length() );
    if( isAllHan ){
        std::wcout
            << _T("この文字列は、すべて半角文字です:")
            << szTarget
            << std::endl;
    }
    else{
        std::wcout
            << _T("この文字列には、全角文字が含まれています:")
            << szTarget
            << std::endl;
    }
    return 0;
}

 
なんともない、楽勝である。

2007年8月2日木曜日

MySQL 4.0系では、副問い合わせができない

今回は、タイトルの通り。
MySQL 4.0 系では、副問い合わせができないのである。
 
副問い合わせを使っている SQL 文が、ローカル環境の 5.x と 4.1.x では問題ないのに、4.0.21でだけ構文エラーが出ていたので、もしやと思い調べてみたら案の定だった。
 
なんというトラップ。
未だにこのいにしえ 4.0.x 系の MySQL を導入しているレンタルサーバがあるので(今回被害にあったの所もそう)、サーバーをレンタルする際には MySQL はもちろん、その他のサービスのヴァージョンには充分注意したい
まったく、こんなことで2時間ほど悩んでいた自分が情けなくなってくる。気持ち悪い
 
 
参考サイト

2007年7月20日金曜日

同一サーバ上に、複数ヴァージョンの MySQL をインストールする。

今まで MySQL は5.0を使っていたが、 OpenPNE の動作環境が4.1と4.0だったので、新たに4.1を入れることに。
同一サーバ上に、複数ヴァージョンの MySQL をインストールすることはできるのだろうか?
と不安だったが、普通にインストールするだけで問題なく動作した。
 
この場合、サービス名を「MySQL 50」、「MySQL 41」のように区別したいところだが、
既に「MySQL」等の名前でインストールされていると、MySQL の Config Wizard では変更することができない。
そういう時は、サービスのプロパティから直接編集する。
 
サービスの切り替えは、当然ポート番号で。

2007年6月28日木曜日

Apache2 と php4 の相性問題

Apache2.2 に 最新版の PHP4 (4.4.2) をインストールする際、DLL の読み込みエラーが発生する。
(PHP4 インストール後、Apache の起動時に「 Cannot load C:/php/sapi/php4apache2.dll into server 」とうエラーメッセージが表示される。)
原因は、PHP 4.4.x と Apache 2.2 の相性問題による。
 
これを回避するためには、http://www.apachelounge.com/download/ から php4apache2.dll-php4.4.x.zip をダウンロードして差し替える必要がある。
 
差し替え方法は添付の ReadMe に書いてあるが、一応簡単な訳を書いておく。
 
差し替え方法( ReadMe の簡単な訳)
1. 解凍した php4apache2.dll を、php のインストールフォルダにコピーする (例: c:/php)
2. httpd.exe.manifest を apache2/bin にコピーする。
3. Visual C++ 2005 SP1 再頒布可能パッケージ をインストールする。(下記からダウンロード可能)
4. httpd.conf に 下記の様に追記する。
LoadModule php4_module "c:/php/php4apache2.dll"
AddType application/x-httpd-php .php
5. httpd.conf に下記の様に php.ini へのパスを設定する
PHPIniDir "C:/php"
注意: c:/php は例なので、実際には自分の php のインストールフォルダを指定する。
 
以上。

2007年6月25日月曜日

phpMyAdmin 2.10.2 のインストール方法

最新ヴァージョンの phpMyAdmin のインストール方法がなかなか見つからなかったので、書いておく。
 
現時点(2007年6月25日)での最新ヴァージョンは、2.10.2。
最新ヴァージョンはここからダウンロードできる( phpMyAdmin-2.10.2-all-languages-utf-8-only.zip を DL )。
 
古いヴァージョンのインストール方法は、あれやこれやと色々書いてあるが、最新ヴァージョンはいたって簡単。
 

インストール方法(付属ドキュメントの簡単な翻訳)

1. phpMyAdmin-2.10.2-all-languages-utf-8-only.zip を解凍。
2. index.php がある階層にある config.sample.inc.php をコピーして、同じ階層に config.inc.php を作成する。
3. その config.inc.php の内容を、下記のように設定する。
<?php
$cfg['blowfish_secret'] = 'ba17c1ec07d65003';  // ここには自分が決めた適当な文字列を入れる。

$i=0;
$i++;
$cfg['Servers'][$i]['auth_type']     = 'cookie';
?>

この場合、追記等の必要はなく、 $cfg['blowfish_secret'] の値を設定するだけで OK 。( cookie でパスワードの暗号化に使うキーなので、できるだけランダムに )

 

上記の方法(クッキー認証)だと、phpMyAdmin に接続する度に ユーザ名とパスワードを入力する必要があるので、それが面倒な人は下記のように設定する。
<?php

$i=0;
$i++;
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'cbb74bc'; // ここにはあなたのパスワードを入力します。
?>

4. あとは フォルダごと php が動く場所にアップロードする。

 

これだけで phpMyAdmin のインストールは終了。

この方法以外にも、最新版には自動で設定ファイルを作成してくれるスクリプトもついているが、最小限必要な設定いがいにも色々しないといけないので面倒。

 

 

Apache 2.2.4 インストール時の注意点(windows)

詳しいインストール方法等は、検索でいくらでも引っかかるので省略。
 
[注意点]
1. ドメイン名、サーバ名、管理者メールアドレス入力画面の、「 Install Apache HTTP Server 2.0 programs and shortcuts for : 」で「 Only for the Current User 」を選択すると、Apache サービスがインストールされない。特別理由がない限り「 for All Users 」で。
原因は、サービスはユーザがログインする前に動くので、指定したユーザのみで Apache を動かすにはサービスでインストールできないからだと思うけれど、じゃぁ指定ユーザだけで動かしたい場合どうやるの?というところまでは分からず。
 
2. デフォルトの httpd.conf では、.htaccess の設定が「 AllowOverride None 」になっている。 設定し忘れて、「あれ動かないぞ?」とならないように。
 
[未解決疑問点]
1. httpd.conf、および .htaccess で Allow from が全く適用されない。 (Deny from は適用される)
 
 
[リンク]
インストール方法:

2007年6月1日金曜日

MySQL の外部結合で、著しく処理速度が低下する。

MySQL + php で Web サイトのアクセス集計を、もともと使っていたシステムを元に作り直していたときに出会った疑問。
 
外部結合をすると、なぜここまで急に処理が遅くなるのか。。。
 
もともと使っていたシステムよりもやけにデータを表示する時間が短いなぁ、と思っていたのだけど、
0件のデータも表示するために外部結合を加えたら、同じくらいにまで処理が遅くなった。
だけど、そこまで支障がある遅さではなかったので、処理の遅さと0件データの必要性を天秤にかけた結果、
その時は0件データをあきらめることにしたのだ。
 
結局、外部結合をすると処理速度が著しく遅くなることはわかったものの、何故、というところまではたどり着かず終いだった。
簡単にネットで調べた感じだと、特に「外部結合=遅い」というような情報はなかったんだけどなぁ。
ただそれだけに、どのような条件で外部結合の処理速度が著しく低下するのかは非常に気になるところ。
頭の片隅に置いておいて、機会があったら追って調べてみようと思う。