ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    JavaScriptで文字数とバイト数を数える

    このエントリーを含むはてなブックマーク はてなブックマーク - JavaScriptで文字数とバイト数を数える あとで読む
    JavaScriptで入力した文字数を数えたい。
    検索したらズバリのサンプルコードが紹介されていた。

    全角・半角を判別して文字数をカウントするJavaScript

    フォームに入力された文字列をエンコードして「%u」の文字があれば全角扱い。
    それ以外は半角扱いで、半角での文字数をカウント。



    JavaScript 1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付) (プログラミング学習シリーズ)JavaScript 1 はじめてのプログラミングとJavaScriptの基礎 (CD-ROM付) (プログラミング学習シリーズ)
    (2009/01/30)
    日向 俊二

    商品詳細を見る


    【“JavaScriptで文字数とバイト数を数える”の続きを読む】

    PHPのstrlen関数で全角文字が3バイトになる件

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPのstrlen関数で全角文字が3バイトになる件 あとで読む
    PHPのstrlen関数で、文字列のバイト数を取得しようとしたら、全角文字1文字が2バイトではなく3バイトとしてカウントされてしまった。
    全角文字の1文字=2バイト分として数えてくれないと困る。

    PHP: strlen - Manual

    strlen ― 文字列の長さを得る
    与えられた string の長さを返します。


    PHPのマニュアルでは、「日本語の全角文字1文字を2バイト」として数えるとは一言も書いていない。
    =バイト数は、文字コードに依存する。

    ●UTF-8の日本語のバイト数
    UTF-8 - Wikipedia

    日本語の文字とバイト数
    1バイト
    * ASCIIの全て、およびJIS X 0201ラテン文字の円記号とオーバライン以外

    2バイト
    * JIS X 0201の円記号
    * JIS X 0208の非漢字の一部

    3バイト
    * 上記以外のJIS X 0201の文字
    * JIS X 0208の漢字エリアの全て
    * JIS X 0212の漢字エリアの全て
    * JIS X 0213の第3・4水準漢字の一部

    4バイト
    * UnicodeのBMP以外全て
    * JIS X 0213の第3・4水準漢字の一部

    5~6バイト
    * Unicodeの範囲外(どんな文字が登録されるかという計画も無い)



    なんだ、そういうことか。
    文字コードとしてUTF-8を使っている場合、日本語の文字は1~6バイトのデータとして定義されている。
    よって、strlenで日本語の文字のバイト数を数えると、1~6バイトという答えが返ってくる。
    (BOMなしのUTF-8Nを使っているけど、文字数のカウントにBOMは関係ない?)

    原因は分かった。
    さて、どんな対策をすればいいのか?

    ●UTF-8をSJISに変換してカウント
    この方法で解決した。

    北青山通信 - from aoyama >> 全角文字は2バイトではないのでした。

    echo(strlen(mb_convert_encoding($str, ‘SJIS’, ‘UTF-8′))); // 6
    UTF-8のままですと、全角文字は2バイトにはなりません。しかも、正しく文字コードをしてあげないと正しい文字数になりません。
    一旦、シフトJISに変換してあげて、mb_stringではないstrlen()で全角文字を2バイトで計算してくれます。




    ところで、3バイト以上のデータ長を持つSJISの日本語文字ってあるのかな?
    ベンダ別 SJIS コード一覧

    ベンダ名 インフォミックス アスキー INFORMIX V6 ALS
    コード範囲 3バイト文字: 第1バイト 0xFD 第2バイト 0xA1-0xFE 第3バイト 0xA1-0xFE
    字形 規定なし


    「インフォミックス アスキー」という会社は、もう潰れてなくなってしまったようだ。
    とりあえず、SJISを3バイト目まで独自拡張しているベンダーはなさそうだからOK?

    ●bin2hex関数を使う方法
    こんな対策も紹介されていた。

    日本語文字列のバイト数取得にstrlenだけではダメな理由-PHP

    $volm = strlen(bin2hex($data)) / 2;
    // $data:バイト数を取得したいデータ
    // $volm:データ長(byte)


    bin2hexは、シングルバイト文字を16進数表記に変換する関数です。
    16進数表記の場合、シングルバイト文字1文字は必ず2文字の16進数に変換されます。
    したがって、その16進数表記の半分が、当該バイト数というわけですね。



    ↑テストしてみたら、思い通りの結果が得られなかったので、とりあえず不採用。

    全角文字=2バイトという固定観念は外さないといけないな。
    =同じ日本語でも、文字コードの体系によって、使用されているバイト数は異なると。

    PHP 逆引きレシピ (PROGRAMMER’S RECiPE)PHP 逆引きレシピ (PROGRAMMER’S RECiPE)
    (2009/06/30)
    鈴木 憲治安藤 建一

    商品詳細を見る

    PHPでファイル一括削除

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPでファイル一括削除 あとで読む
    PHPでディレクトリ内のファイルを一括削除したい。
    Googleで検索したら、以下のようなPHPのサンプルコードがあった。

    ディレクトリ内のファイルをまとめて削除したい - PHPプロ!Q&A掲示板

       1. if ($handle = opendir('.')) {
    2. while (false !== ($file = readdir($handle))) {
    3. if (is_file($file) && $file != "index.php") {
    4. echo (unlink($file)) ? "{$file}を削除しました<br>\n" :
    5. "{$file}の削除に失敗しました<br>\n";
    6. }
    7. }
    8. closedir($handle);
    9. } else {
    10. echo("ディレクトリのオープンに失敗");
    11. }



    PHPのreaddir関数で、ディレクトリ内のファイルを順次読み込んでいくのが肝だな。

    PHP: readdir - Manual

    ディレクトリから次のファイルのファイル名を返します。
    ファイル名はファイルシステム上に格納されている順番で返されます。



    CodeIgniterのモデルで以下のようなメソッドを実装した。
    (例)「zip」フォルダ内のファイルを削除する場合

    // ディレクトリ内を空にする
    function delete_file($dir)
    {
    if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
    $target_file = $dir.'/'.$file;
    if (is_file($target_file)) {
    unlink($target_file);
    }
    }
    }
    }

    // delete_fileメソッドを呼び出す
    $target_dir = "zip";
    $this->delete_file($target_dir);



    他にもこんなやり方が紹介されていた。

    ディレクトリ内のファイル/フォルダの一括削除 - Yahoo知恵袋

    サーバーの環境依存になるがsystem()を利用してOSのコマンドを実行して消す。
    UNIX環境
    system( "rm -rf dirpath" );



    PHPのsystem関数で、OSのディレクトリやファイルを操作するシェルコマンドを実行すればOKと。

    PHP: system - Manual

    system ― 外部プログラムを実行し、出力を表示する



    system関数を使う場合は、間違って変なコマンドを実行してしまわないように、慎重に利用しないといけないな。

    PHP 逆引きレシピ (PROGRAMMER’S RECiPE)PHP 逆引きレシピ (PROGRAMMER’S RECiPE)
    (2009/06/30)
    鈴木 憲治安藤 建一

    商品詳細を見る

    MySQLの全文検索

    このエントリーを含むはてなブックマーク はてなブックマーク - MySQLの全文検索 あとで読む
    MySQLで全文検索をやるとき、手軽で高速な方法が紹介されていました。

    MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ
    MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ

    MySQLには、Sennaなどの全文検索用のソリューションがあるけど、MySQLだけでも高速な全文検索は可能です。
    TEXT型のカラムに、FULLTEXTという全文検索用のインデックスを張ればOK。
    LIKEで検索するよりは、かなり速いらしいです。

    ● Ngram エヌグラム とは?
    N-gramとは - はてなキーワード

    ある文字列から切り出した一定個数の文字の並びの集合。また、その集合の種類や頻度を解析して得る、元の文字列の性質の記述。
    N=2の場合2-gram(bi-gram)、N=3の場合3-gram(tri-gram)、などという。



    Ngram を駆使する
    日本語文章をn文字ごとに規則的に分割しておきつつ (Ngram)、これらを BOOLEAN MODE で検索することで、LIKE検索に近い形の日本語全文検索を実現する手法。



    速度比較まとめ
    1. FULLTEXT + Ngram検索は、LIKE検索より数倍~数十倍速い
    2. データ件数・サイズが大きければ大きいほど、FULLTEXT + Ngram 検索の優位性が増す



    ●PHPのライブラリ
    上記たたみラボさんで配布されているPHPの「NgramConverter」を使ってみました。
    うまい具合に文字列を分割できた!これは便利!

    NgramConverterクラスには、publicなメソッドが3つ用意されています。

    to_fulltext($string,$n) メソッド
    $string を $n文字ごとに分割した文字列を返す。

    to_query($string,$n) メソッド
    $string を $n文字ごとに分割して、頭に「+」を付けた文字列を返す。
    =SQLで使う文字列を用意してくれる。

    make_match_sql($word,$column,$n) メソッド
    to_query()メソッドで返される文字列に、さらに検索用のSQL句を付けてくれる。

    ●実行例
    n=2で、2文字ずつに分割する場合

    // n分割する文字列サンプル
    $a = "あいうえお課気区毛子";
    $b = "You are the reason.";

    to_fulltext($string,$n) メソッドの実行結果
    $a → あい いう うえ えお お課 課気 気区 区毛 毛子 子
    $b → Yo ou u ar re e th he e re ea as so on n. .

    to_query($string,$n) メソッドの実行結果
    $a → +あい +いう +うえ +えお +お課 +課気 +気区 +区毛 +毛子
    $b → +Yo +ou +ar +re +th +he +re +ea +as +so +on +n.

    make_match_sql($word,$column,$n) メソッドの実行結果
    $a → MATCH(title_fulltext) AGAINST('+あい +いう +うえ +えお +お課 +課気 +気区 +区毛 +毛子' IN BOOLEAN MODE)
    $b → MATCH(title_fulltext) AGAINST('+Yo +ou +ar +re +th +he +re +ea +as +so +on +n.' IN BOOLEAN MODE)

    これを使えば、MySQLのFULLTEXTインデックスによる全文検索が可能になりますね。

    MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.7 全文検索関数

    MySQL は全文インデックスおよび検索をサポートします :
    * MySQL の全文インデックスは、タイプ FULLTEXT のインデックスです。
    * 全文インデックスは MyISAM テーブルとのみ使用されており、CHAR 、VARCHAR 、または TEXT カラムのためにだけ作成されます。



    ブログのコメント欄を見ると、半角英数字はn分割しない方が良いのではないかというコメントがありました。
    =英単語とかのヒット率を高めるためとか?
    これはちょっと実験してみた方がいいかな?

    Amazonの商品名検索で、MySQLの全文検索を使ってみよう。

    MySQLによるタフなサイトの作り方MySQLによるタフなサイトの作り方
    (2009/09/17)
    佐藤 真人桑野 章弘

    商品詳細を見る

    アウトドアプログラミングのススメ

    このエントリーを含むはてなブックマーク はてなブックマーク - アウトドアプログラミングのススメ あとで読む
    ●パソコンを持って野に出でよ!
    ずっと部屋の中に閉じこもって、プログラミングしていると疲れないか?
    デスマーチで行き詰ったら、気分転換が必要だ。
    たまには外に出て、陽の光を浴びながらプログラミングをやってみたらいい。

    防水型&駆動時間の長いバッテリーのノートパソコンがあれば理想的だ。
    =パナソニックのレッツノートとか。

    ・オープンテラスのカフェで、ピアノを弾くようにエレガントなタイピングを行う。
    ・大自然の中で、悠久の時の流れとともに大らかなコードを紡ぎ出す。


    目の前の風景を変えることで気分を変えようという試みは、旅と同じだ。
    所詮、それは紙芝居のようなものであり、目の前の風景を変えたからといって、別に人生が変わるわけじゃない。
    (=「自分探しの旅」なんてやつは所詮気分転換でしかなく、人生を再構築するには何の役にも立たないものだ。)

    だけど、デスマーチで煮詰まって、作業の停滞時間が長くなるだけなら、気分転換が突破口になるだろう。
    たまには、屋外でプログラミングをしてみたらいい。

    仕事するのにオフィスはいらない (光文社新書)仕事するのにオフィスはいらない (光文社新書)
    (2009/07/16)
    佐々木俊尚

    商品詳細を見る

    【“アウトドアプログラミングのススメ”の続きを読む】

    シャドープログラミングのススメ

    このエントリーを含むはてなブックマーク はてなブックマーク - シャドープログラミングのススメ あとで読む
    昔、そろばんをやっていた。
    そろばん無しで暗算もやった。
    鮮明なそろばんのイメージを作って、操作できるようになると、暗算能力が向上する。
    イメージの中のそろばんは、指で珠を動かすスピードよりも速く操作できるからだ。

    ●シャドープログラミング
    そろばんが無くても暗算ができるように、ハードウェアが無くてもプログラミングはできる。
    イメージの中でリアルな処理系を構築できればいいのだ。

    イメージの中でプログラミングを行う。
    それはまるで、そろばんの暗算やシャドーボクシングのようだ。

    シャドーボクシング - Wikipedia

    シャドーボクシングとは格闘技(主にボクシング)の練習方法の一つである。
    一人で仮想の敵を想定し、自ら立って手足を動かす。
    仮想の敵からの攻撃を避けながら、パンチを繰り出すなどの攻撃をする。



    イメージの中で仮想的にプログラミングを行うことを「シャドープログラミング」と名付けてみた。
    (何となく響きがカッコイイ!?)

    シャドープログラミングのやり方
    ・脳内でモデリング、設計、コーディングを行う。
    ・イメージの細部を覚えきれない場合は、ノートにメモしてOK。
    ・パソコンの前に座ったときには、既に脳内で完成しているコードを書けばいいだけの状態にする。

    ●プログラミングの生産性向上
    逆に言えば、実際にコードを書いているときに、手が止まるということは、モデリング、設計が十分にできていないのだ。

    手が止まったまま、モニターを見つめていると目が疲れるだけだ。
    コーディングが遅かったり、止まってしまう場合は、いったんパソコンから離れて、休憩を取った方がいい。

    ・目の疲れを癒す。
    ・首や肩、腕の疲れを癒す。
    ・頭脳労働は、脳内のブドウ糖を大量に消費するので補給する。

    なぜコーディング作業が止まるのか?原因を自問自答すべきだ。

    ・完成形はハッキリイメージできるか?=GUIのアプリなら画面のモックを先に作る、完成形=仕様に曖昧な部分が残っていないかチェック。
    ・完成形に至るためには何が必要なのか?=ゴール地点(完成)からスタート地点(未完成)に遡って考える。
    ・必要なパーツをMECEで漏れなく列挙する。
    ・脳内でモデリング、設計した内容、アイデアは、ノートにメモする。
    ・ノートにメモするときは、白紙のノートにマインドマップ形式で書くと早い。=ランダムでありながら、箇条書きの形になるので。

    ・白紙のノートは、コクヨのキャンパスノートでいろいろなサイズが入手可能。
    ・多色ボールペンを使う場合は、三菱のジェットストリームが書きやすい。

    プログラミングの生産性が落ちたときには、一休憩してシャドープログラミングを行おう。
    書くべきコードが具体的になってから、パソコンの前に座ろう。
    そうすれば、生産性が向上するだろう。

    ソフトウエア開発に役立つマインドマップ チームからアイデアを引き出す図解・発想法ソフトウエア開発に役立つマインドマップ チームからアイデアを引き出す図解・発想法
    (2007/05/31)
    平鍋 健児

    商品詳細を見る


    【“シャドープログラミングのススメ”の続きを読む】

    MySQLが遅い

    このエントリーを含むはてなブックマーク はてなブックマーク - MySQLが遅い あとで読む
    phpMyAdminでMySQLを操作していると、なんか動作が異常に遅いと思うときがある。
    データ数が数十万件あるテーブルだし、管理者の操作だから仕方がないか?と思ったが、もしこれがユーザー向けの処理だったら10秒以上待つとか有り得ない。

    サーバのスペックアップが必要なのか?
    MySQLのチューンナップが必要なのか?
    どうすればいいのか?自問自答してみる。

    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    (2009/09/17)
    松信 嘉範

    商品詳細を見る

    【“MySQLが遅い”の続きを読む】

    PHPで日時の大小比較

    このエントリーを含むはてなブックマーク はてなブックマーク - PHPで日時の大小比較 あとで読む
    PHP5で日時の大小を比較できるか実験してみた。
    結果は、比較可能だった。
    【“PHPで日時の大小比較”の続きを読む】

    東大合格生のノート

    このエントリーを含むはてなブックマーク はてなブックマーク - 東大合格生のノート あとで読む
    面白いノートがあった。
    コクヨのドット入りキャンパスノートだ。

    これは、東大に合格した学生のノートを調査して、東大生の意見を取り入れて開発したノートだそうだ。

    東大合格生のノートはどうして美しいのか東大合格生のノートはどうして美しいのか
    太田 あや
    文藝春秋 (2009/4/16)

    商品詳細を見る


    【“東大合格生のノート”の続きを読む】

    油性ボールペン - 三菱 JETSTREAM

    このエントリーを含むはてなブックマーク はてなブックマーク - 油性ボールペン - 三菱 JETSTREAM あとで読む
    書き味が滑らかなボールペンがあると聞いた。
    三菱のジェットストリームだ。

    ジェットストリーム 3色ボールペン 0.7mm【ライトブルー】 SXE3-400-07.8ジェットストリーム 3色ボールペン 0.7mm【ライトブルー】 SXE3-400-07.8

    三菱鉛筆

    商品詳細を見る


    【“油性ボールペン - 三菱 JETSTREAM”の続きを読む】

    FC2Ad