Hatena::ブログ(Diary)

第2.5地区 RSSフィード

f:id:taramonera:20101126204352g:image
ブログ引っ越しました。→ http://taramonera.net/2.5/

2012-10-26

さくらインターネット スタンダードでPHPのバージョンを5.2から5.3に変更

| 16:23 |

さくらインターネット スタンダードでPHPのバージョンを5.2から5.3に変更

コントロールパネルの「PHPのバージョン選択」をクリック

f:id:taramonera:20121026162321j:image


PHP 5.3.17を選択し、変更ボタンをクリックするだけ

f:id:taramonera:20121026162322j:image


5.2で動かしていたプログラムを実行すると下記のエラーがでた
Warning: mktime() [function.mktime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in /home/xxx/index.php on line 286

timezoneの設定が必要なようなので、「PHP設定の編集」をクリック

f:id:taramonera:20121026162323j:image


timezoneに「Asia/Tokyo」を追加して保存

f:id:taramonera:20121026162909j:image

2011-11-08

PHP 連続するスペース(全角or半角)を1つの半角スペースに変換

| 18:45 |

連続するスペース(全角or半角)を1つの半角スペースに変換

プログラム
<?php
$words = "a  c   b     a";

$words = preg_replace('/ /', ' ', $words);//全角スペースを半角スペースへ
$words = preg_replace('/\s+/', ' ', $words);//連続する半角スペースを1つの半角スペースへ

echo $words;
実行結果
a c b a

2011-10-27

PHP5.3バージョンアップしてエラー

| 13:46 |

PHP5.3バージョンアップしてエラー

PHPプログラムにgoto()っていう関数を自作していて、

PHP5.3に移行したときにエラーとなった。


5.3からgotoが追加されたのでそれとぶつかったのですね。。

2011-08-21

JavaScript 関数リテラルとは?

| 23:58 |

関数リテラルとは?

JavaScriptの関数定義、通常は

function test(x){ return x*x; }

関数リテラルを使うと

var test = function(x){ return x*x; }

こうすると、ほかのJavaScriptの式中にも記述できる。


ブロックレベルのスコープはない

var a="global";
function f(){
  alert(a);
  var a="local";
}

このプログラムで最初のalert(a);はundefinedが表示される。

globalは表示されない。


JavaScriptにはブロックレベルのスコープがないので、

関数f内で宣言された変数aは関数全体で有効となる。

つまり、alert(a);はローカル変数のaを見ている。


しかし、aにlocalが設定されるのはalert(a);の後なので、

undefinedとなる。


この例を見るかぎり、変数は関数の先頭で宣言したほうがよいが、

下記もあとで読んでみる。

JavaScriptの変数についての考察

2011-07-20

CodeIgniter Shift-JISでPOSTされた値をUTF-8で受け取る

| 11:06 |

Shift-JISでPOSTされた値をUTF-8で受け取る

CodeIgniter内は、UTF-8

HTMLページは、Shift-JIS

という環境で、「accept-charset="utf-8"」を使わずにShift-JISでPOSTされた値をUTF-8で受け取る方法。


POSTが文字化け (Codeigniter-users) - CodeIgniter日本語化 - SourceForge.JP

によると、POSTされた値を

CI_Input内、CI_Utf8のclean_stringが呼ばれる前にUTF-8に変換しておく必要があるとのことなので、

CodeIgniterのフックを使って実装した。

フックの有効化

application/config/config.php

$config['enable_hooks'] = TRUE;//フック機能を有効に設定。

フックの定義

フックは application/config/hooks.php でファイルで定義する。

$hook['pre_system'] = array(
                                'class'    => '',
                                'function' => 'convert_encoding',
                                'filename' => 'Convert_encoding.php',
                                'filepath' => 'hooks',
                                );

これで、pre_system(システムの実行の最初)にapplication/hooks/Convert_encoding.phpのconvert_encodingメソッドが実行される。


文字コード変換を実装

application/hooks/Convert_encoding.php

<?php
function convert_encoding() {
        if(isset($_POST)){
            $_POST = _mbConvertEncodingEx($_POST, "UTF-8", "sjis-win");
        }
}

/**
 * mb_convert_encoding()の拡張
 *
 * @param  mixed  $target       arrayかstring
 * @param  string $toEncoding   エンコード先
 * @param  string $fromEncoding エンコード元(default:null)
 * @return mixed  arrayが来たらarrayを、stringが来たらstringを
 */
function _mbConvertEncodingEx($target, $toEncoding, $fromEncoding = null){
    if (is_array($target)) {
        foreach ($target as $key => $val) {
            if (is_null($fromEncoding)) {
                $fromEncoding = mb_detect_encoding($val);
            }
            $target[$key] = _mbConvertEncodingEx($val, $toEncoding, $fromEncoding);
        }
    }
    else {
        if  (is_null($fromEncoding)) {
            $fromEncoding = mb_detect_encoding($target);
        }
        $target = mb_convert_encoding($target, $toEncoding, $fromEncoding);
    }
    return $target;
}
?>

$_POSTされたデータに配列も含まれる場合があるため、

配列をmb_convert_encodingするプログラム - せとっちの備忘録(技術系)

を利用させていただきました。


参考

フック : CodeIgniter ユーザガイド 日本語版