PHPの文字列インクリメントについて極めて若干の補足

デクリメントはできない。


$a = "a";
$a++;
$a--;
echo $a;

結果:


b

以上

カテゴリー: PHP | コメントする

PHPで文字列をintにグレードアップする

PHPでは文字列もインクリメントすることができます。すごいです。


$a = "aaa";
echo ++$a;

結果:


aab

となります。もちろん繰り上がりも大文字小文字も考慮してくれます。


$a = "aaz";
echo ++$a;
echo "\n";
$aA = "AzZ";
echo  ++$aA;

結果:


aba
BaA

ただしひらがなは無理っぽい?カタカナはOKっぽい?感じはダメっぽい?って感じでこの辺はさすがに微妙です。

これとはちょっと違う話で、PHPは数値っぽい文字列を数値に変換して比較するという機能があります。
下記サイトに書いてある話です。
http://d.hatena.ne.jp/fbis/20090618/1245297557


if ("0x0A" == 10) {
   echo "true";
}

結果:


true

これは実は比較演算じゃなくても数値に変換されます。足し算とか、そうインクリメント演算子でも!
ということで、上記の文字列インクリメントと組み合わせると・・・


$a = "0w7";
for ($i = 0; $i < 5; $i++) {
   $a++;
   echo $a;
   echo "\n";
   echo var_dump($a);
}

結果:


0w8
string(3) "0w8"
0w9
string(3) "0w9"
0x0
string(3) "0x0"
1
int(1)
2
int(2)

途中で型がintに変化するという摩訶不思議。・・・はっちゃけすぎだろPHP。

以上

カテゴリー: PHP | コメントする

Google・・・!

Googleアドセンスのアカウントを一方的に凍結して、1年以上かけてためた1万円弱を未払いのままにしやがったGoogleが、Googleアドワーズの広告をメールで送って来やがりました。
Googleのこういう傍若無人な態度が嫌いです。

以上

カテゴリー: 聞いて欲しい独り言 | コメントする

すぐ忘れるC言語用語

ビットフィールド。概念とか書き方とかは覚えてるんだけど名前が覚えられない。まあ、使わないからな。


struct hoge {
    unsigned b1: 1;
    unsigned b2: 1;
    unsigned b3: 6;
} fuga;

fuga.b1、fuga.b2は1ビットの変数、fuga.b3は6ビットの変数となってfugaは全体で1バイト。
とめもっておいて、ここで使ったことにしておく。そしたらきっと覚えられる。

以上

カテゴリー: C言語, 聞いて欲しい独り言 | コメントする

画像処理でよく使われる写真

ノイズ除去とか特徴抽出とか、画像処理系でしょっちゅう出てくる画像
lena_std
これ誰だっつう話。ふと気になって調べてみた。
結論から言うと、レナ・ソーダバーグという人らしい。画像データに関してはこっち
PLAYBOY誌に掲載されたヌード写真の一部らしい。全体画像はWikipediaのページにリンクがある。

ふぅ・・・すっきりしました。

以上

カテゴリー: 聞いて欲しい独り言 | コメントする

Javascript関連の投稿を修正

ブログに無理矢理載せようとして動かなくなっていたサンプルを修正しました。
例えば下記
簡単ドラッグ可能領域
特定の要素の上でマウスホイールのイベントを取る。(jQuery)
jQueryでFormのバリデーション

以上

カテゴリー: Javascript, 聞いて欲しい独り言 | コメントする

KeyPointerEX修正

ちょっと前にえらそうに改良したKeyPointerEXですが、開発環境(というかMFCライブラリ)が入っていないPCだと動かないっていう致命的なバグがあったので直しました。
あんまりダウンロードもされていないのですが、もしダウンロードして動かなかった人はごめんなさい。

以上

カテゴリー: バグ, プログラム | コメントする

PHPのどうしようもなくくだらないテスト4 include_once

includeは何回でも読み込み直すし、include_onceは一回しか読み込まない(重複して読み込まない)、そんなことは私でも知っています。
気になったのは戻り値です。includeは読み込みに成功すると1を返します(マニュアル)。(ただしincludeするファイルの最後にreturn文を書いておけばなんでも返せる)

じゃあinclude_onceはどうなのか。特に2回読み込もうとしたときにどうなるのか。2回目は読み込まれないはずだからfalse返すんじゃね?という当然(?)の疑問に巡り会ったので確認してみました。


hoge.php
<?php
    echo "hoge\n";
?>

test.php:
<?php
    $result = include "hoge.php";
    echo $result . "\n";
    $result = include "hoge.php";
    echo $result . "\n";
    echo "\n------------------------\n";
    $result = include_once "hoge.php";
    echo $result . "\n";
    $result = include_once "hoge.php";
    echo $result . "\n";
?>

結果は


hoge
1
hoge
1
------------------------
1
1

つまり、読み込んではいないけど2回目以降も1を返す、ということみたいです。

ちなみに、includeもinclude_onceもファイルがなかったときにWarningを吐きますが、@includeってやれば黙ります。また、includeもinclude_onceも()はつけない方がいい感じです(include("hoge")でもいいけどあまり良くない)。

以上

カテゴリー: PHP | コメントする

逆転検事クリア

意外と長く、まあまあ面白かった。御剣が「ムジュン」とか言う度にニヤニヤしてましたが・・・。
テンポはよかったね。捜査と追求(裁判みたいなん)がスムーズに織り混ざっていてよかったと思う。
以下、ABC評価。

シナリオ:A-
システム:B
テンポ:A
会話:B-
逆転:C
総合:B

シリーズを以下のように評価しておく。
1:100点
2:80点
3:90点
4:95点
検事:70点

正直、「逆転」感はあんまりなかった。ただ、冥ちゃんがかわいすぎた。
悪くはないと思いますよ。

以上

カテゴリー: コンシューマーゲーム | コメントする

phpとsqliteでバックアップ

小物ツールを作るとき、私はよくPHPとSQLiteを使います。PHPなら簡単にSQLite使えるし、バックアップが簡単なためです。
例えば名セリフDB(ほとんど使われていませんがw)では以下のような関数を作っていつでもバックアップと復元ができるようにしています。


define("DB_NAME", "hoge.db");
define("BACK_DIR", "./fuga");

function back_up() {
   $time = getdate();
   $date = sprintf("%04d%02d%02d-%02d%02d%02d"
         ,$time['year'],$time['mon'],$time['mday'],$time['hours'],$time['minutes'],$time['seconds']);
   
   $back_up_name = BACK_DIR . "/" . $date . ".db";
   if (copy(DB_NAME, $back_up_name)) {
      return "OK Back up $back_up_name";
   } else {
      return "NG Back up";
   }
}

function list_of_old() {
   $dh = opendir(BACK_DIR);
   $files = array();
   while (false !== ($file = readdir($dh))) {
      if ($file == '.' || $file == '..' || !strstr($file, '.db')) continue;
      $files[] = $file;
   }
   return $files;
}

function recover($date) {
   $file =  $date;      // list_of_oldで表示した日付
   if (!$file || $file == "") return;
   $file = BACK_DIR . "/" . $file;
   if (copy($file, DB_NAME)) {
      return "OK Recover From $file";
   } else {
      return "NG Recover";
   }
}

まあ、日付でDBファイルをコピーしてバックアップして、復元するときもバックアップファイルからコピーして置換するっていう。
こういう豪快なことができるのもシンプルDBであるSQLiteと、データサイズが小さくて済むユーザーレスサービスの強みですね。

以上

カテゴリー: PHP, Tips | コメントする