朝ご飯をおいしくいただける生活がしたい

hokoyo2008-01-21

http://jonhuck.com/breakfast/

「Breakfast」と題された、ポートレイトとその人の朝食の写真集。
ニートになってから、朝食にとても興味がわいているので、興味深く見てみた。結構外人さんはジャムとパンケーキ、牛乳とシリアルみたいな、おやつのような朝食が多いんだね。イギリス人は休日の朝とてもボリュームのある朝食をとると聞いているので、その写真も見たかったところ。

こう、朝ご飯をおいしくいただける生活、それこそが豊かさ、そして余裕を表しているような気がする。今日は天気がいいから、ベランダのトマトを採ってきて簡単なパスタにしよう、みたいなことは、遅刻ギリギリに起きて歯を磨きながら髪を整えるような生活の中ではできないことだ。

幸い今はお金に余裕があるので、朝のみならず昼も、それなりにおいしい店でおいしいものを食べたいのだけど、一人じゃ入りづらいです><。こういうときに彼女が欲しいなあって思うね。一人じゃ入りづらい店に一緒に入って、webvanが失敗した理由について知ったかぶりで語りながら、おいしいものが食べたい。喧嘩したときにはおいしいものを食べて仲直り。悲しいときもおいしいものを食べて慰め合い、楽しいときにはもちろんおいしいものを食べる。そんな生活がしたい。ああ、話が脱線した、朝ご飯の話をしているんだった。結局女の子がいればそんなことどうでもよくなるんだろう。うん。

ところでこの写真に写っているものはなんなんだろう?柑橘系の果物を模したパン+ミート・・・?わからん。

ニートになってみて5日目の感想

学校に行ってた頃、休日最後の日は明日が来ることそれ自体が苦痛で、明後日が来ることなんて信じられなくて、明明後日なんて存在しないものだと思ってたんだけど、最近は明日が来るのも明明後日が来るのも楽しみで、いつもおおらかな気持ちで居られる。

朝なんか特に素晴らしくて、前までは今から始まる学校を思い憂鬱になるだけの時間だったのが、今日1日何をするかうきうきしながら考える時間になった。満員電車で精神を消耗することもなく、同じ電車に乗るにしてもすいている時間を選ぶことが出来るようになり、気が向けば見知らぬ場所で降りてぶらぶらすることも出来る。

昨日は朝の11時あたりに家を出て、JR名古屋高島屋11Fの三省堂書店にある読書コーナーでPHPの本を読んだ後、名駅西のマクドナルドでスマイルカードを使って30%OFFで食事をしてから、買おうか買わまいか迷っていた本を購入し、午後3時くらいに帰宅した。

帰宅した後も、学校に行ってたころにありがちだった明日を恨む思いがなく、ぐっすりと眠ることができた。
とにかく、こういう素晴らしい生活を謳歌している。ほんとニートって素晴らしい。

vol4

http://www.phppro.jp/school/phpschool/vol4/1

PHPで情報を受け取る、GET方式について

GET方式の場合、URLの後ろに?変数名=値といった形式で指定することで、PHPに値を渡すことができる
http://localhost/uranai.php?age=22

この場合ageが変数名、22が値である。

このURLで受け取った値を出力するプログラムを作る
<?php
if (is_numeric($_GET["age"]) == true) {
  print("あなたの年齢は:");
  print(htmlspecialchars($_GET["age"]));
  print("才です");
} else {
  print("入力された値は数字ではありません。");
}
?> 
上記プログラムの実行結果

あなたの年齢は:22才です

$_GETは特別な変数で、スーパーグローバル変数である

連想配列になっていて、URLで渡された変数名がキー、URLで渡された値が配列の値になっている
今回の例の場合、age=22のうちの、ageが配列のキー、22が配列の値という事になる。

is_numeric関数は、引数が数字かどうかを調べるための関数

戻り値ががtrueの場合、$_GET["age"]は数字が入っているとわかる
変な値を入れられたときはじくようにするための仕組み
数字ではなかった場合にはfalseという値が返ってくる

htmlspecialchars関数はHTMLで特殊な文字として扱われる危険な文字を安全な形式に置き換えてくれる

これはセキュリティにつながる話である
コードに入れておいたユーザーの入力をそのまま画面に出すと、クロスサイトスクリプティングという攻撃に対して脆弱になってしまう。htmlspecialchars関数は、そういった脆弱性の原因になるような、HTMLで特殊な文字として扱われる危険な文字を安全な形式に置き換えてくれる

$_GET変数を使う際に特に注意が必要なこと

画面に表示するときは、

print($_GET["nanisore"]);

としては絶対にいけない。その代わり

print(htmlspecialchars($_GET["nanisore"]));

と、htmlspecialcharsを使うようにする。これは、

$data = $_GET["nanisore"];

のように、値をいったん別の変数に入れたりした場合でも、必ずやらなければいけない。

占いページ

<?php

if (is_numeric($_GET["age"]) == false) {
  print("年齢は数字で教えてください!");
  exit();
}

$uranai_message[0] = 
        "ちょっとあなたの年齢は対象年齢に含まれていません・・・";
$uranai_message[1] = 
        "10代のあなたには、PHPをお守り代わりに勉強するのが良いみたい。";
$uranai_message[2] = 
        "20代のあなたには、趣味でPHPを使うと良いみたい。";
$uranai_message[3] = 
        "30代のあなたには、ビジネススキルとしてPHPを勉強すると良いみたい。";
$uranai_message[4] = 
        "40代のあなたには、PHPは新たなフロンティアとなるでしょう。";

if ($_GET["age"] >= 50 || $_GET["age"] < 10) {
  $sedai = 0;
} elseif ($_GET["age"] >= 40) {
  $sedai = 4;
} elseif ($_GET["age"] >= 30) {
  $sedai = 3;
} elseif ($_GET["age"] >= 20) {
  $sedai = 2;
} else {
  $sedai = 1;
}

print($uranai_message[$sedai]);
?>
exit関数はそこでプログラムを終了させる。
$_GET["age"] >= 50

はageが50以上のとき、を表す。

$_GET["age"] < 10

はageが10未満のとき、を表す。

||はOR演算子

といって、「A || B」と書いて、「条件Aまたは条件Bが正しいかどうか」という判別をするためのもの
今回の例だと「$_GET["age"]の値が50以上、または10未満の場合」という事になる。

占いページをさらに洗練させた例

<?php

// ageが数字で無かった場合、メッセージを表示してプログラムを終了。
if (is_numeric($_GET["age"]) == false) { 
  print("年齢は数字で教えてください!");
  exit();
}

$sorry_message = 
        "ちょっとあなたの年齢は対象年齢に含まれていません・・・";
$uranai_message[1] = 
        "10代のあなたには、PHPをお守り代わりに勉強するのが良いみたい。";
$uranai_message[2] = 
        "20代のあなたには、趣味でPHPを使うと良いみたい。";
$uranai_message[3] = 
        "30代のあなたには、ビジネススキルとしてPHPを勉強すると良いみたい。";
$uranai_message[4] = 
        "40代のあなたには、PHPは新たなフロンティアとなるでしょう。";

$sedai = floor($_GET["age"] / 10);

if (isset($uranai_message[$sedai])) {
  print($uranai_message[$sedai]);
} else {
  print($sorry_message);
}

?>

10才未満、50才以上の処理を、配列のキーがあるかないかで判断している。

floor関数は、小数点以下の切り捨てをする関数
$sedai = floor($_GET["age"] / 10); 

なら、$sedaiには入力された年齢の10の位が代入される。

isset関数は、変数がセットされているかどうかを検査する

値が存在するか、とは、簡単に言うとその変数に値を代入したかどうか、ということ。
issetを使ったif分は、変数内の値が「ある」「ない」の判定にとても便利で、よく登場する。

PHPでは、「==」や「>」などの比較演算子を使わないで判定することもできる。

例えば、ifの判定の際には、次のような書き方もできる。

<?php
$message = "あいうえお";
 
if ($message) {
  print($message);
}
?> 

この場合、if($message)は、「$messageに何らかの値がある」場合。
何らかの値とは、0以外の数字や、文字列や、1つ以上の要素がある配列や、trueなど。

vol3/4まで

環境はAptana+PHPプラグインで構築した。
強力なコード補完やリアルタイムでの構文検証が便利。
http://www.lepracaun.info/blog/2007/11/aptana_studiophp.html

http://www.phppro.jp/school/phpschool/vol2/3 から
http://www.phppro.jp/school/phpschool/vol3/4 で勉強。

個人的まとめ

PHPのプログラムは <?php で始まり ?> で終わる。
    • HTMLを宣言しなくても表示はされる。
    • HTMLのどこにでも、いくつでもPHPのブロックを作れる。
    • 同じファイルの中にいくつブロックを作っても全体で変数は継承される。
  • print("Hello World");ならprintが関数、"Hello World"が引数(ひきすう)。
    • printは実際には関数でなく言語構造らしい。
    • わかりやすくするために関数と書かれているらしい。
  • date関数は時間に関する情報を出力する。
  • 前述の例は
    • $now = date("現在の日時は、Y年m月d日 H時i分s秒です。");
    • print($now);
    • でも同じ結果が表示される。
  • 前述の例において$nowは変数である。
    • 前述の例において$nowはまず宣言(作成)されているが、PHPの場合宣言しなくても利用できる。
    • ここで言う = は代入を意味する。
  • if構文は条件分岐。
    • if (この条件に当てはまったら) {
    • このコードを実行する
    • } else {
    • 上記の条件に当てはまらなかったら、このコードを実行する
    • }
    • 実例
    • if (date("H") > 12) {
    • print("お昼をすぎました");
    • } else {
    • print("お昼前です");
    • }
    • この例ではdate関数の引数Hで取得した現在時刻が12より大きければ"お昼をすぎました"とprintし、
    • else(当てはまらなければ)"お昼前です"とprintする。
  • 引数の中においてより大きくは>
    • 以降は>=
    • 同一は==
  • elseif(上の条件に当てはまらなければ) はif構文の中で使う。
  • if (この条件に当てはまったら) {
  • このコードを実行する
  • } elseif (上の条件に当てはまらなかったら) {
  • このコードを実行する
  • } else {
  • 上のどの条件にも当てはまらなかったら、このコードを実行する
  • }
    • つまり、elseifを使った場合ifとelseのみを使ったif構文におけるelseにelseifが取って代わり、elseはif構文の中のどのif,elseifにも当てはまらなかった場合のみ実行される。
  • ランダムに結果を表示させるにはrand関数を使う。
    • http://www.phppro.jp/phpmanual/php/function.rand.html
    • echo rand(1,10);とすれば1から10の間で乱数を発生させる。
    • rand関数を応用して実際に配列の中からランダムで一つ選ばれた要素を表示する例
    • $uranai_bangou = rand(1,10);
    • print($uranai_message[$uranai_bangou]);
  • 配列とは車両が何台も連結された電車のようなもの。それぞれの車両を命名したり、番号を付けたり、どちらもしていなくても自動で番号や名前が割り振られていたりする。そこから一つだけ取り出して利用することも可能。
    • http://www.phppro.jp/school/phpschool/vol3/3
    • http://www.phppro.jp/school/phpschool/vol3/4
    • 文字列をキーにした配列のことを連想配列と呼ぶ。
    • 自分で配列を作る場合、何通りかの書き方がある。
      • 番号を書く
    • $array1[0] = "あいうえお";
    • $array1[1] = "かきくけこ";
    • $array1[2] = "さしすせそ";
      • 何も書いていないので、自動で番号が入る(0から)
    • $array2[] = "あいうえお";
    • $array2[] = "かきくけこ";
    • $array2[] = "さしすせそ";
      • array関数(実際には言語構造)。これの引数に値をコンマ区切りで渡すと勝手に0から順番に番号を振り当てられた配列を作る。
    • $array3 = array("あいうえお", "かきくけこ", "さしすせそ");
    • $array4["a"] = "あいうえお";
    • $array4["ka"] = "かきくけこ";
    • $array4["sa"] = "さしすせそ";
      • array関数で連想配列を書くこともできる。この例では複数行に分けて書いてある。見やすくなる。
    • $array5 = array(
    • "a" => "あいうえお",
    • "ka" => "かきくけこ",
    • "sa" => "さしすせそ"
    • );
  • getdate関数は現在の時間をもとに連想配列の形式で値を返す。
    • date関数とは同じようなことをするが、返し方が違う

次は http://www.phppro.jp/school/phpschool/vol4/1