free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ 最新 /追記

2013-03-10 [長年日記] この日を編集

§ [php] Re: PHPとかいう糞言語

先にまとめ。

  1. 既にbravewoodさんが、PHPは代入と参照の違いPHPの代入と参照の違い2を書いていたし、そちらのほうが詳しいですorz。
  2. PHPのリファレンス!=Cのポインタ
  3. 実は、PHPの変数はすべて値に対するリファレンスらしいですよ、どうやら。
  4. 元記事の普通の変数で確かめてる部分はたぶん勘違い。var_dump()は値渡しの関数なので、普通の変数を引数にして呼び出してもリファレンスとして表示されるわけがない。
  5. しかし、リファレンス作った時に、右辺にもリファレンスを示すフラグがつくらしい。GC用のリファレンスカウントのためかもしれんが。
  6. 配列の要素のリファレンスは仕様。(配列内のリファレンスの挙動はその要素ごとに決まる)

実体はこの辺か。

  • zend_vm_def.h:ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
  • zend_execute.c:static void zend_assign_to_variable_reference(zval **variable_ptr_ptr, zval **value_ptr_ptr TSRMLS_DC)

変数のアドレスとるだけと思いきやだいぶ処理してるし、全然意味わからん…。

ところで、PHPリファレンス:リファレンス解除(ややこしい)を読むと何か変な気がしてきたので、元記事コードを改変してみる。

/cygdrive/c/xampp/php/php.exe -r '$v = 1;$ref = &$v;var_dump( $ref );'
int(1)

Oh...

困ったときはマニュアルを参照。var_dumpの定義。PHPリファレンスにあるリファレンス渡しではない。値渡し(デフォルト)で呼び出すので&string("b")とかそんな表示には、なりゃしやんせん。

いやほんと、PHPは糞みんなもっとマニュアルと本体コード読んだらいいと思うよ。

配列の要素のリファレンスは仕様(配列内のリファレンスの挙動はその要素ごとに決まる)だそう。PHP 5 以降では、配列を参照渡しすることでその値を直接変更できるようになりましたの例で、値の要素の参照を取得したあとはunsetしろって書いてあるから、そういう使い方を想定してるんじゃないですかね。

/cygdrive/c/xampp/php/php.exe -r '$array = array(1,2,3);$ref = &$array[1];unset($ref);var_dump($array);'
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

しかし逆もありなのね。これは動作として違和感ないけど、何に使うのだろうか。

/cygdrive/c/xampp/php/php.exe -r '$array = array(1,2,3);$x="aaa";$array[1] = &$x;var_dump($array);'
array(3) {
  [0]=>
  int(1)
  [1]=>
  &string(3) "aaa"
  [2]=>
  int(3)
}

お名前 : コメント :


2013-03-14 [長年日記] この日を編集

§ [php] PDOStatement::bindParam

基本的にはPreparedStatementに値を設定するメソッドです。bindValueとは参照渡しになるのが違う。

使いどころとしては以下なんだと思う。(以下のコードはイメージです)

$caps = array("JAPAN" => "Tokyo", "USA" => "Washington DC", "SOUTH KOREA" => "Seoul");
$stmt = $pdo->prepare("update countries set capital = :cap where name = :name");
$key, $val = null; //初期化は欲しいのか?
$stmt->bindParam(":name", &$key); //先にbind
$stmt->bindParam(":cap", &$val);
foreach($caps as &$key => &$val) {
        $stmt->execute(); //ここではbindしなくていい
}
unset($key);
unset($val);

foreach内でbindValueしなくてもいいから見た目スッキリ、とは思わないけど多分こういう意味なんだよな…。

PreparedStatementが大量にある場合はスッキリするかもしれないけど、その変数が参照かどうかは覚えておかないといけない(参照使うときは常にそうだけど)。

§ [program] VIMのセッション

 便利なんだけど、何かのタイミングでsyntaxがoffになったりするのはなんとかならんのだろうか。しかしCygwin版とWin32ネイティブ版を同時に使うからかもしれない。

§ [program] Gaucheでクリップボードの文字列をHTMLエスケープする的な(Cygwinized)

-[1792]% rlwrap -c -q '"' -b "'"'(){}[].,#@;|`"' -m gosh "$@"
gosh> (use text.html-lite)
#<undef>
gosh> (define (esclip iport) (let ((buf (read-line iport))) (cond ((not (eof-object? buf))(display (html-escape-string buf))(newline)(esclip iport)))))
esclip
gosh> (call-with-input-file "/dev/clipboard" esclip)
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;jquery.powertip.css&quot; /&gt;
#<undef>
gosh> 
#

これでtDiaryにコピペ楽ちんです。入力終わるまで読むのは頻出。

お名前 : コメント :


2013-03-26 [長年日記] この日を編集

§ [//] ネタ:統計、通塾率、学生のケータイ利用率

 仕事がらみです。

 日本の学生の人数は統計局の教育の部門で見れる。超ざっくり言うと、1学年115万人。但しガンガン減ってる。年間2万人くらいずつ。田舎のほうがどんどん減ってる。

 で、通塾率。学習塾:Wikipediaの通塾率は平成18年のデータで止まってる。実際には文部科学省の統計から出してるので、みてみると平成22年の調査結果が出ている。家庭教師費、学習塾費の統計で、0円でない人が恐らく通塾していると思われる。学年と公私立でだいぶ差がある。これが学年別じゃないのが難だが、公/私(%)で書くけど、小学校で40/69、中学校で72/56、高校で35/37。なぜか小学生と中学生で公立私立が逆になるのが面白い。公立だと高校受験のために焦って勉強させちゃうのか。それでいて高校で塾に行かなくなるのはなぜなのか。大学進学率がだいたい50%(未調査)で、30-40%くらいはもう就職目指しちゃうから塾には行かないのかもしれん。

 で、ケータイ利用率。ベネッセの記事がすごくいい。小学生で2割、中学生で4割強、高校生で9割以上がケータイを持っていて、うちスマホ率はざっくり言うと20%、AndroidとiPhoneが半々らしい。

 そういえばDoCoMoがものすごい勢いで小学生に携帯売ろうとしてるなあ。ジュニスマ~。

 都道府県別統計とランキングに見る県民性も超ざっくりしてて面白いし、青森岩手秋田山形は偏差値低くてウケル。

お名前 : コメント :