• 081月

    自社サーバーでアプリを開発していると、サーバーの環境を都合のいい設定にしてしまいがち。ヘッダは自動で出力してくれるし、文字コードも勝手に変換してくれる。自社開発には便利です。

    ところが、WordPressなど優れたアプリを使おうとするととたんに文字化けてしまう。
    何とか既存のアプリに影響を与えず自社サーバでWordPressを動かしたいと調べてみたところこの様な情報を見つけました。目から鱗です。
    http://hain.jp/index.php/tech-j/2007/02/13/p125
    これを.htaccessで設定したところWordPressは正常に動き出しました。MySQLのdefault_characterがeucでも何の問題もなさそうです。

    因みにEC-CUBEも試してみましたが、こちらはだめでした。どうやら文字化けが原因でインストールが完了しないようです。phpMyAdminを使って手作業で初期データを登録したらなんとかインストールは完了したけども、ページを見るとdbから引っ張ってくる文字が化けている。こちらはMySQLのdefault_characterをUTF-8にしなくちゃいけないのかもしれません。
    しかし既存のアプリが動いている状況でこれを変更するのは怖いので、このサーバーでのEC-CUBEの導入は諦めました。時間が有れば別のサーバーで検証してみたいです。

    Tags:

  • 209月

    前回、関数を作ったが、その関数を別ファイルにしてメンテナンス性を向上させよう。

    まずは前回作った関数の部分だけがコーディングされたファイル ”func_library.php” を作成する。

    [func_library.php]
    <?php
    function char_counter($str)
    {
     $str_temp = mb_convert_kana($str, “CHKV”);
     $str_temps = mb_split(”ガ”,$str_temp);
     $num_count = count($str_temps) – 1;
     return $num_count;
    }
    ?>

    そしてそのLibraryファイルは include して使用することになる。

    [main.php]
    <?php
    include “./func_library.php”;

    $strs[0] = “あさがお”;
    $strs[1] = “ゴアイサツガアリマセン″;
    $strs[2] = “ガンバリマショウ″;
    $score = 0;     //スコアの初期化
    for($i=0; $i<count($strs); $i++) $score += char_counter($strs[$i]);
    echo ‘「ガ」と発音する文字は全部で ‘ . $score . ‘個 有りました。’;
    ?>

    main.php  と func_library.php は同じディレクトリにあるものとして書いてある。

    こんなふうに関数をインクルードすることで、複数のプログラムで使用されている関数も func_library.php を
    修正するだけで、全てのファイルを修正したのと同じ効果が出る。

    何十もあるファイルをキーワード検索して虱潰しに修正していくなんてことはもうやめよう。
    初心者を脱出するのだ。

    include と同じ効果のある requireinclude_oncerequire_once も調べてみると良い。

    Tags: , , ,

  • 119月

    PHPのプログラミングに慣れてきた初心者のコードを見ると、ひたすら上から下へと書き連ねられていて、やたらに長い。思いつくままのコーディングはバグが出ても原因の発見に時間がかかる。また、書いてから時間の経ったコードは書いた本人でさえ思い出すのに苦労する。
    理路整然としたコードを書くにはクラスなどオブジェクトという概念も必要だが、ここでは初心者を脱皮するために自作関数の有効性と注意点を記しておこうと思う。

    下の<サンプルコード1>は、3つの文字列変数の中に含まれる「ガ」と発音する文字の数を求めるもの。
    実行すると見事に「・・・3個有ります。」と表示される。結果オーライだ(ヤッター!)。
    しかし、初心者を脱皮するにはこれではいけない。
    例えば、上司から変更命令が出た。内容は「ガ」では無く「サ」の数を、しかも ’サ’ では無く ’さ’ で検索するようにというわけだ。このコードだけならば数箇所直すだけですむが、こっちのページあっちのページといろんな所にこの処理が入っていたとしたら、あなたはきっと上司を恨むでしょう。(簡単に変更変更って言うなよぅ)

    確かに、仕様の変更なんて度々あってはたまらん。でも大小問わず変更はプログラミングには付き物。だからこそメンテしやすいコーディングが必要となる。
    では<サンプルコード1>をどのようにすれば中級と呼ばれるコードになるか。

    このコードをじっくり眺めると、ちょっとだけ違う同じようなことを3回繰り返している。
    この ”同じような” ところを関数にできないか、またどうしたら保守性がアップするかを常に頭に置くようにしたい。
    慣れてくれば自然にコーディングの手順が見えるようになる。

    <サンプルコード1>
    <?php
    $str1 = “あさがお”;
    $str2 = “ゴアイサツガアリマセン”;
    $str3 = “ガンバリマショウ”;

    $str1_temp = mb_convert_kana($str1, “CHKV”);
    $str1_temps = mb_split(‘ガ’,$str1_temp);
    $num1_count = count($str1_temps) – 1;
    $score = $score + $num1_count;

    $str2_temp = mb_convert_kana($str2, “CHKV”);
    $str2_temps = mb_split(‘ガ’,$str2_temp);
    $num2_count = count($str2_temps) – 1;
    $score = $score + $num2_count;

    $str3_temp = mb_convert_kana($str3, “CHKV”);
    $str3_temps = mb_split(‘ガ’,$str3_temp);
    $num3_count = count($str3_temps) – 1;
    $score = $score + $num3_count;

    echo ‘「ガ」と発音する文字は全部で ‘ . $score . ‘個 有りました。’;
    ?>

    関数を利用したコードが下の<サンプルコード2>だ。
    上から順に解説すると・・・

    文字列はループ処理しやすいように配列に入れた。
    配列の初期化・代入の方法はいくつかあるので調べてみると良い。

    $score = 0; は無くても結果は変わらない。
    PHP は変数宣言が必要ない。これは楽なのだが、変数が増えてくるとどれが何を意味していたのかわからなくなってくる。
    そこで、主要な変数は変数宣言の意味で初期化しておくと後でメンテしやすい。

    <サンプルコード1>の12行分がこの for文 たった1行に集約されている。自作関数のお陰だ。
    もっともこの for文 は省略形式で書いているので1行だが、ちゃんと{}を使って改行してコーディングする方が見やすい。

    function からが自作関数の宣言になる。関数名は char_counter と付けた。
    () の中の $str が 引数 と呼ばれるもの。ここでは対象の文字列が入る。
    return は 戻り値 を指定している。この 関数 は実行すると数値を返してくることがわかる。

    今回の関数は引数と戻り値の有るパターンを紹介したが、無いパターンも存在する。
    引数の無いものや戻り値の無い関数の解説はまたの機会に。

    <サンプルコード2>
    <?php
    $strs[0] = “あさがお”;
    $strs[1] = “ゴアイサツガアリマセン”;
    $strs[2] = “ガンバリマショウ”;
    $score = 0;     //スコアの初期化

    for($i=0; $i<count($strs); $i++) $score += char_counter($strs[$i]);

    echo ‘「ガ」と発音する文字は全部で ‘ . $score . ‘個 有りました。’;

    //文字を検索してその数を求める
    //($str=対処の文字列、戻り値=文字の数)
    function char_counter($str)
    {
     $str_temp = mb_convert_kana($str, “CHKV”);
     $str_temps = mb_split(“ガ”,$str_temp);
     $num_count = count($str_temps) – 1;
     return $num_count;
    }
    ?>

    もう一度 for文 の行を見て欲しい。
    char_counter に文字列を一つ入れると数値が返ってくる。それを $score に加算している。
    関数はよくブラックボックスに例えられる。黒い箱(関数)に文字列(引数)を入れて振る(実行)と数値(戻り値)が出てくる。関数の完成度が高ければその内容を意識する必要は無い。つまり利用者にとってはその関数の使い方だけを知っていれば良いという事になる。echo や mb_split といった関数と同じように。

    次回は、このコードをさらにメンテし易いように function 宣言部を別ファイルにして、インクルードして関数を使用する方法を記したい。

    Tags: , ,

   

Recent Comments

  • Welcart素晴らしいPluginですね。 デモサイト作って色々デザインしてみようと 思っています。...