PHPで$foo = ” || ‘foo’;とやると

$foo は 1 になる。
1 になるというか、真になってそれを出力すると 1 になる、といったほうがいいか。論理演算 || の結果は真偽値(この場合は真)で、echo で出力すると 1 になるということらしい。

もともとの話をすると、フォームからポストされたデータが空文字列だった場合にデフォルト値を設定しようとしたこと。こんな感じ:

$name = $_POST['name'] || 'no name';

上に書いたとおり、これだと $name を出力すると 1 になってしまう。

で、こう書けばいいようだ。

$name = $_POST['name'];
$name |= 'no name';

1行増えるのがめんどくさいな。

PHPで掲示板作った

つい先日 C++ の本を読み始めたばかりだけど、この3連休はにわかPHPerになっていた。
コトのはじめは、自宅サーバに掲示板を設置しようとしたこと。ググってみると無料で配布されている掲示板アプリはいろいろとあるんだけど、どうにも気に入ったものがない。メールやホームページのアドレスなんかいらないんだよ。文字の色を変える機能なんかもいらない。一方でメッセージにコメント(reply)を付けたい……といった希望に沿うものがなかなかなくて、おまけに 2つほど試したみたらきちんと動かない(設定のせいかもしれいけど)。
結局、それじゃちょっと自分で作ってみようか、ということになった。配布されている掲示板アプリは大抵が PHP だった(あとちょっとだけ Perl)ので、見様見真似で PHP で書いてみることにしたわけだ。
で、作ってみたのがこれ:

 cf. miniBBS – GitHub/takatoh

PHP についてほとんど何も知らないところから3日で作ったので、ホント基本的な機能しかない。メッセージがポストできて、そのメッセージにコメントが付けられるだけ。削除機能はなし。管理者用ログイン機能もなし。まあ、このへんは気が向いたらあとから実装するかも。

PHP についての印象だけど、良くも悪くも Web 用の言語だなあといったところ。もうちょっと具体的には:

  • 言語自体がテンプレートエンジンになってる感じ
  • 変数名にいちいち $ マークめんどくさい
  • 文末のセミコロンもめんどくさい
  • クラスのメンバ変数にアクセスするのにいちいち $this-> 付けなきゃいけないのめんどくさい
  • 文字列分割する関数の名前が explode ってなんだよ
  • でも $_GET や $_POST は簡単で便利

上にも書いたとおり、ほとんど何も知らない状態から始めたわりには、特に引っかかるような概念もなく、掲示板くらいは作れるようになった。取っ付き易い言語ではあるのかもね。

独習C++を読み始めた

「独習 C++」(第4版)を読み始めた。これまた2010年の本と少し古いけどまあいいや。
第4章までざっと読んだ。C言語を知っていることを前提に書かれていて、C++ではどう違うか、という説明が多い。わからないところもあるけど、とりあえず全部読んでから、サンプルを書きながら勉強していこう。

[amazonjs asin=”4798119768″ locale=”JP” title=”独習C++ 第4版”]

ところで、なんでだかわからないけど「C++」っていうカテゴリーが作れないみたいなので、とりあえず「Cpp」にした。

NginxのユーザディレクトリでPHPを動かす

Nginx の設定ファイルの server セクションで次のように設定する。

# User dir (PHP)
location ~ ^/~([^/]+?)/(.+\.php)$ {
    alias /home/$1/public_html/$2;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    include fastcgi_params;
}

# User dir (static)
location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index index.html index.htm;
    autoindex on;
}

# For PHP
location ~ \.php$ {
    root /var/www/html;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

キモは User dir (PHP) のセクションを For PHP のセクションよりも前に書くこと。そうしないとブラウザで PHP のファイルにアクセスしても Not found になってしまう。なぜなら location ~ \.php$ に先にマッチしてしまってファイルが見つからないから(たぶん)。

ビットマップ画像の情報を表示する(2)

コードを少し整理して、ファイルを分けた。あと、OS/2 のビットマップにも対応した。

実行例:
サンプルのファイルはここから拝借した。
 cf. BMP ファイルフォーマット

takatoh@nightschool $ ./bmpinfo os-1.bmp
File type          = BM
File size          = 4232 bytes
Data offset        = 32 bytes
Info header size   = 12 bytes
Width              = 200 pixels
Height             = 150 pixels
Planes             = 1
Bit count          = 1 bits/pixel
takatoh@nightschool $ ./bmpinfo win-24.bmp
File type          = BM
File size          = 90054 bytes
Data offset        = 54 bytes
Info header size   = 40 bytes
Width              = 200 pixels
Height             = 150 pixels
Planes             = 1
Bit count          = 24 bits/pixel
Compression        = 0
Size image         = 90000 bytes
X pixels per meter = 2835
Y pixels per meter = 2835
Color used         = 0 colors
takatoh@nightschool $ ./bmpinfo win-jpeg.bmp
File type          = BM
File size          = 4916 bytes
Data offset        = 54 bytes
Info header size   = 40 bytes
Width              = 200 pixels
Height             = 150 pixels
Planes             = 1
Bit count          = 0 bits/pixel
Compression        = 4
Size image         = 4862 bytes
X pixels per meter = 0
Y pixels per meter = 0
Color used         = 0 colors