ウィルキンソンの炭酸が抜けていく。

webクリエイターのイロハ

ハルロック プログラムを使ったおもしろ工房研究。

ハルロックは女子大生のはるちゃんと個性豊かなキャラクター(天才小学生、変態高校生、根暗な大学生)が織りなす。スーパテクニカルファンタジー漫画です。

 

 

 第1巻では小型のコンピューター、ラズベリーパイ(以下、ラズパイ)を使って、3つのシステムを制作しています。

一巻を読んでいただければ、ハルロックがどのような漫画かわかりますし、やばい、ロックじゃなくてこれっパンクじゃない?とか思っちゃいます。

 

ハルちゃん入院中のおばあちゃんを励ますマシンを開発

ハルロック

 

秋葉原で知り合った電子工作に興味を持つ小学生(うに先輩)のおばあさんが入院していることを知ったはるちゃん。

入院をきっかけに「死にたい」を連呼するようになったおばあさんを励ますために、人工知能(?)搭載の熊のぬいぐるみを開発する。このぬいぐるみのエンジンにRaspberry Piを採用。

Raspberry Piを搭載した熊のぬいぐるみは、順調におばあさんを励ますことに成功!しかしながら、会話パターンの分析が不十分だったこと起因するバグにより、おばあさんにネガティブな言葉を投げ続ける事案が発生。

熊に腹を立てたおばあさんが逆にリハビリに力を入れ始め、見事に問題を解決!やったね、はるちゃん!

ハルちゃん、家にわいたゴキブリを見つけるマシンを開発!

 

ハルロック

(ハルロック第1巻、西餅、講談社、p.89)

 

 

 

ハルちゃん世界中のぼっちを可視化するマシンを開発!やったね!はるちゃん!

 

 

 
ハルロック
(ハルロック第1巻、西餅、講談社、p.110)
 
 
 
 

一巻では面白いマシンを開発していますし、4巻にはビジネスでとても大事なブランディングや株式会社の設立方法、クラウドファンディングの使い方、コワーキングスペースのおすすめな使い方、DMM.comがどんな会社かなど多岐にわたる情報がギャグがたくさんのハルロックに詳しく載っています。

私自身、電子工学には全くと言っていいほど、興味がありませんでしたが、はるちゃんの変態的な頭の中身を垣間見て、『あーぼくももうちょっと変態にならなきゃダメですねー』とか思って、ちょっとおばあちゃんのために介護マシン作りたいなーとか思いました。

普通に面白いので、読みたい方は是非。

 

ハルロック(1) (モーニングコミックス)

ハルロック(1) (モーニングコミックス)

 

 

 

 ハルロック2

ハルロック(2) (モーニングコミックス)

ハルロック(2) (モーニングコミックス)

 

 

 

 ハルロック3

 

ハルロック(3) (モーニングコミックス)

ハルロック(3) (モーニングコミックス)

 

 

 

ハルロック4

 

 

ハルロック(4) (モーニングコミックス)

ハルロック(4) (モーニングコミックス)

 

 

 

 

まとめてよみたい酔狂な方はこちら。

 

 

 

 

ミャンマー研究

先月12月9日ヤンゴン証券取引所が開設されました。

 

日本は全体の49%の資本を出資し、事実上の大株主になっており、ヤンゴンの株式市場の成長率が、日本の成長率につながりそうです。

 

ミャンマーの土地市場では、中国やタイに確実に遅れを取っていた日本でしたが、下部式市場では異例のスピードで関わりを深めています。

 

日本=スピードが遅い

という状況も少しずつ変化していくのではないでしょうか。

 

 

 

 

 

 【ヤンゴン=川上穣】ミャンマー初の証券取引所となるヤンゴン証券取引所(YSX)が9日、開設された。政府や日本取引所グループ大和証券グループ本社など日本の官民が制度作りやシステム導入など全面支援し、株式市場を通じた企業の資金調達ができるようになる。来春の新政権発足など民主化が進むミャンマーで、資本市場の発展が経済成長を後押しする枠組みが整う。

 

9日に行われたヤンゴン証券取引所の開設式典の様子(ヤンゴン)

9日に行われたヤンゴン証券取引所の開設式典の様子(ヤンゴン

 同日開かれた開設式典には、ミャンマー側からウィン・シェイン財務相、証取開設の責任者であるマウン・マウン・テイン財務副大臣らが参加。日本からは日本取引所傘下の東京証券取引所の宮原幸一郎社長、大和グループの日比野隆司社長らが出席した。

 来年3月をメドに複数の企業が上場し、実際の売買が始まる見通しだ。同国では銀行や建設業を中心に上場に適する企業が20以上あるとされる。

 大和グループの現地法人や現地金融大手など約10社が証券会社の仮免許を得ており、企業の上場準備を支援する。市場で円滑に資金が調達できれば、企業の成長を押し上げる効果が期待できる。

 ヤンゴン証取の運営会社には国営のミャンマー経済銀行が51%、大和総研日本取引所など日本側が49%を出資している。日本勢にとって海外の取引所を設立から支援する初めての「和製市場」になる。

omikujiと丁半 ソース と解説研究

[おみくじの]
 
$arr = array('大吉', '中吉', '小吉', '吉', '凶', '末吉');
echo $arr[rand(0,5)];
 
配列で$arrは配列で上記のものを持っています。
自然数で0.1.2.3.4.5の数字を持っているので
 
乱数(rand)で0〜5までのもののどれかを出力(echo)しますよーって感じ
 
 
 
[丁半ゲーム]
 
$dice = array(mt_rand(1, 6),mt_rand(1, 6));
$result = $dice[0] + $dice[1];
 
if($result % 2 == 0) {
   echo "丁";
} else {
 echo "半";
};
 
diceはというかサイコロは1〜6までの数字を持っています。
丁半ゲームは2つのサイコロを投げるので、(mt_rand(1, 6),mt_rand(1, 6));と二つのサイコロを用意してあげます。
 
1つ目のサイコロを0番目の$dice[0]
2つ目のサイコロを1番目の $dice[1]と定義できるので
 
 
$result = $dice[0] + $dice[1];
 
 
 
$resule(結果は)その二つを足した感じですよーって感じ。
 
 
if($result % 2 == 0) {
   echo "丁";
} else {
 echo "半";
};
 
日本語訳するともし足した結果が2で割り切れてあまりが出ない、つまり0だったならば偶数だから丁と出力します。
 
もしそれ以外、つまりあまりができる=奇数だったら半と出力しますよーって感じ。
 
 
炭酸抜けたわー
 

encode とisset 研究

isset = 変数がセットされていることとそれがnull(空)であることを調べる。

 

説明

bool isset ( mixed $var [, mixed $... ] )

変数がセットされており、それが NULL でないことを調べます。

変数が、unset() により割当を解除された場合、 何も値が設定されていない状態になります。 NULLに設定されている変数を調べた場合、 isset()FALSEを返します。 null文字("\0")はPHPの定数 NULLと等価ではないことにも注意してください。

複数のパラメータを渡した場合は、isset() はそれらすべてがセットされている場合にのみ TRUE を返します。 左から順に評価を行い、セットされていない変数があった時点で処理を終了します。

 

 

 


<?php
$encode_str = '';
if(isset($_GET['input'])){
 $encode_str=urlencode($_GET['input']);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>URLエンコード</title>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<h1 class="bg-primary">URLエンコード</h1>
<form action="" method="get">
<div class="form-group">
<textarea class="form-control" name="input" rows="3"></textarea>
</div>
<button type="submit" class="btn btn-default">エンコード</button>
</form>

<h1 class="bg-primary">デコード結果</h1>
<textarea class="form-control" rows="3"><?php echo $encode_str; ?></textarea>
</div>
</body>
</html>

 

_get(input)がtrueのときに

urlencodeをやりますよーって感じ。

 

 

 

 

中島くんはヤンキーです!

とうつと

f:id:suika_koto:20160109163658p:plain

 

エンコード結果を出してくれます。

 

 

PS。ゲスの極み乙女は確実にブランディングが上手いことは明白であり、ブランディングで紅白出場にまでいけちゃうならば、確実にブランディングはやったほうがいい。

スキルは大事だけど。

 

全然できないんですけど、研究

次はフォームからPOSTを使って送られてきたデータの処理を行ってみます。基本的にはGETの場合と同じです。

GETの場合は$_GET変数に値が格納されていましたが、POSTの場合は$_POST変数に値が格納されています。よってフォームからのデータを取り出す場合は下記のように行います。

変数 = $_POST['フォームの部品に付けた名前'];

このようにフォームからのデータを受け取り側のPHPプログラムで取り出すことが出来ます。

下記のサンプルはGETの場合の時のサンプルとほぼ同じですが、フォームからの値を判別して画面への表示を変更しています。

mondai2.html

<html>
<head><title>PHP TEST</title></head>
<body>

<p>
問題:10×4=
</p>

<form method="POST" action="./kaitou2.php">
<input type="text" name="text1">
<input type="submit" name="btn1" value="回答">
</form>

</body>
</html>

kaitou2.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

$input_data = (int)$_POST['text1'];

if ($input_data == 40){
    print('正解です。おめでとうございます。');
}else{
    print('残念でした。もう一度チャンレンジして下さい。');

    print('<p>');
    print('問題:10×4=');
    print('</p>');

    print('<form method="POST" action="./kaitou2.php">');
    print('<input type="text" name="text1">');
    print('<input type="submit" name="btn1" value="回答">');
    print('</form>');
}

?>
</body>
</html>

上記の2つのファイルは同じディレクトリに設置してある前提で記述してあります。

まず「mondai2.html」をブラウザ経由で見て、テキストボックスに値を入力してボタンをクリックして下さい。

POSTのテスト

フォームの「action」に指定してある「kaitou2.php」にフォームのデータが送られ、その中に記述してあるPHPプログラムによってフォームからのデータが取得され画面に表示されます。もし答えが間違っていた場合には下記のように表示されます。

POSTのテスト

間違っていた場合は再度回答できるようにフォームを表示させています。そこで改めて今度は正解の値を入力してボタンをクリックしてみます。

POSTのテスト

POSTのテスト

正解だった場合には、その旨表示して終了です。

Getで送られてきたデータ処理

まずはフォームからGETを使って送られてきたデータの処理を行ってみます。

下記のようなテキストボックスだけがあるフォームを考えて見ます。

<form method="GET" action="./kaitou.php">
<input type="text" name="text1">
<input type="submit" name="btn1" value="回答">
</form>

上記のようなフォームが含まれるHTMLからフォーム上のボタンをクリックすると、「action」で指定されたPHPは含まれるHTMLファイルにフォームのデータが渡されてきます。上記の場合には「text1=(テキストボックスに入力した値」と「btn1=回答」と言う2つの値が送られ来ますが、これらの値は下記のように取り出すことが出来ます。

変数 = $_GET['フォームの部品に付けた名前'];

先ほどの例で言えば下記のように取り出すことが出来ます。

$input_string = $_GET['text1'];
$btn_action = $_GET['btn1'];

このようにフォームからのデータを受け取り側のPHPプログラムで取り出すことが出来ます。

下記では、2つのHTMLファイルを用意し、1つのHTMLファイルには問題と、それに対する回答を記述するためのフォームを用意し、2つめにはフォームからのデータを処理するためのPHPプログラムを記述して、実際にフォームからのデータが取り出せるかどうかを試してみます。

mondai1.html

<html>
<head><title>PHP TEST</title></head>
<body>

<p>
問題:10×4=
</p>

<form method="GET" action="./kaitou1.php">
<input type="text" name="text1">
<input type="submit" name="btn1" value="回答">
</form>

</body>
</html>

kaitou1.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

$input_data = $_GET['text1'];
print('入力した値は'.$input_data.'<br>');
print('帰ってきた値の型は'.gettype($input_data));
?>
</body>
</html>

上記の2つのファイルは同じディレクトリに設置してある前提で記述してあります。

まず「mondai1.html」をブラウザ経由で見てください。

GETのテスト

テキストボックスに値を入力してボタンをクリックして下さい。

GETのテスト

するとフォームの「action」に指定してある「kaitou1.php」にフォームのデータが送られ、その中に記述してあるPHPプログラムによってフォームからのデータが取得され画面に表示されます。

GETのテスト

ちなみにフォームからのデータを取得した場合、文字列型の値として取得が行われるようです。

PHP定義済みの変数研究

 

 

1、HTMLフォーム機能についてのおさらい。

 

 

<form action="送信先URL" method="post">

<input type="text" name="example">

<input type="submit" value="送信">

</form>

 

 入力欄に何か入力してボタンを押すと、Webブラウザーは指定したURLに対して入力内容を送信します。通常そのURLでは何らかのWebアプリケーションが動作していて、入力内容に従って動作するように作られています。例えば、検索エンジンなら検索結果を表示する、などです。

 

 

2、PHPの定義済み変数

 PHPの便利なところは、この送信先のURLにPHPのファイルを指定するだけで、Webブラウザー上のフォームから送信された値を受け取ることができる点です。

 「定義済みの変数」というあらかじめ決められた変数群があり、この変数に送信値が格納されています。つまり、変数にアクセスするだけで送信値を取り出せるようになっています。

 これまでの解説では、変数は何らかの値を代入することで使えるようになりましたが、定義済みの変数は、そういった操作をせず、いきなり使える点が異なっています。

 定義済みの変数はいくつか種類があり、フォームの送信値以外の目的でも使われています。よく使われるのは次のものです

  • $_COOKIE:クッキーの値
  • $_ REQUEST:$_GET、$_POST、$_COOKIEをまとめたもの
  • $_SERVER:サーバーの環境情報やクライアント(Webブラウザー)の情報
  • $_SESSION:セッションに格納した値

 

 

 全て変数名の冒頭に「_(アンダースコア)」が付いていますが、これは「通常の変数ではない」ということを主張しています。特に、文法上のルールがあるわけではありません。通常のものとは違うという主張をするためにアンダースコアから始まる名前を付けることは、PHP以外の言語でもよく行われています。

 上記のうち、$_GETと$_POSTがフォームから送信された値が格納される定義済みの変数です。いずれの変数も連想配列になっています。

 例として、$_SERVERの内容を見てみましょう。$_GETや$_POSTはフォームから送信しないと空っぽですが、$_SERVERなら常に値が格納されています。

 次のコードで$_SERVERを表示してみましょう。

<pre><?php var_dump($_SERVER) ?></pre>

 

連想配列として、さまざまな情報が格納されていることが分かります。$_SERVER内の要素の意味は、「PHP: $_SERVER - Manual」で解説されているので、参考にしてください。

 

 

3定義済みの変数「$_GET」「$_POST」の中身を見る

 

フォームにはGETメソッドとPOSTメソッドの2種類があり、それぞれ定義済みの変数、$_GETと$_POSTに対応しています。このメソッドはHTML上で<form>要素のmethod属性として指定するものです。

GETメソッドの例

 GETとPOSTの違いは、GETメソッドの場合、送信値はURLに連結した形で送信されるということです。URLの一部になっているため、送信する値を含めてブックマークしたり、リンク先を保存したりといったことが可能になります。

 get_dump.phpとして次の内容を保存し、ブラウザーで「http://localhost:8000/get_dump.php」にアクセスしてみましょう。

<pre><?php var_dump($_GET) ?></pre>

 何も送信していないため、$_GETは空です。「array(0){}」と表示されたことでしょう。次に下記URLにアクセスしてみます。「?」から右側がURLに追加した文字列です。

http://localhost:8000/get_dump.php?key1=abc&key2=xyz
php8_02.jpg図2 GETメソッドによる値の送信はURLを介して行われている

 $_GETの中に、URLに追加した文字列が格納されていることが分かります。

 GETメソッドで追加する文字列の規則は例を見ればだいたい分かると思いますが、「?」「&」「=」といった区切りに使われている文字列を値に使いたい場合どうするかという疑問が生じることと思います。

 こういった特殊な文字は「URLエンコード」という変換をする必要があります。詳しくは各自調べてみてください。

 

POSTメソッドの例

 POSTメソッドの場合は送信するフォームが必要になります。フォームを表示するHTMLと、送信先となるPHPの2つにファイルを分けてもいいのですが、ここでは1つのPHPファイルとしてサンプルを作ってみることにします。

 サンプルは、送信された2つの数値を足し算して表示するという、ごく簡単なものとします。段階を追って作っていきましょう。まずはフォームです。

  1. <form action="" method="post">
  2. <input type="text" name="num1" size="4"> +
  3. <input type="text" name="num2" size="4">
  4. <input type="submit" value=" = ">
  5. </form>

 これを表示すると次のようになります。

php8_03.jpg図3 足し算をするフォームの表示。足し算っぽく表示してみた

 フォームの送信先URLは空になっています。空のままでも当該ファイル自身が送信先になりますが、ここでは明示することにしましょう。ファイル自身は、$_SERVER配列のSCRIPT_NAME要素として格納されていますので、次のようになります。

  1. <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  2. <input type="text" name="num1" size="4"> +
  3. <input type="text" name="num2" size="4">
  4. <input type="submit" value=" = ">
  5. </form>

 ブラウザーのHTMLソース表示機能を使って確認してみてください。

 次に、値が送信されていた場合に足し算を行って表示する部分を追加します。値が送信されたということは、$_POSTに何か値が入っているということです。配列が空かどうかは、if文で比較する(すなわち、真偽値へ型変換する)と、空の場合は偽となるので判定できます。

  1. <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post">
  2. <input type="text" name="num1" size="4"> +
  3. <input type="text" name="num2" size="4">
  4. <input type="submit" value=" = ">
  5. </form>
  6. <?php
  7. if ($_POST) {
  8. $num1 = $_POST['num1'];
  9. $num2 = $_POST['num2'];
  10. echo $num1, ' + ', $num2, ' = ', $num1 + $num2;
  11. }
  12. ?>

 これを表示し、フォームに数字を入力してボタンを押すと、次のようになります。

php8_04.jpg図4 足し算が実行されて表示されたところ

 <input>要素のvalue属性に入力された値を入れて表示すれば、もっときれいに表示することもできるでしょう。ぜひ挑戦してみてください。

コラム「フォームの名前に『』を使うと、PHP上では配列として格納される」

 フォームの名前に「」を使うと、PHP上では配列として格納されます。これは他の言語にはない特徴です。例えば、次のようなフォームから送信すると、$_POST['foo']に2つの要素を持つ配列が格納されます。

  1. <form action="" method="post">
  2. <input type="text" name="foo[1]"><br>
  3. <input type="text" name="foo[2]">
  4. <input type="submit" value="送信">
  5. </form>
 

編集部注:一部内容の補足について(2014年7月8日)

本記事ではPHPプログラミングにおけるセキュリティ対策の必要性を以降の文章で記載しておりましたが、内容について一部読者から指摘があり、内容を補足させていただきました。また本連載「Web業界で働くためのPHP入門」はPHPの文法解説を行うものなので、セキュリティ対策について詳細に解説するものではないにもかかわらず、本稿タイトルに「セキュリティ対策」と入れたため誤解を招いた点がありました。タイトルも変更させていただきます。

 
 

 

 

フォーム送信値の取り扱いにおける注意点

 今回のサンプルプログラムは、あくまで解説のためのサンプルです。テストサーバー上で、PHPを理解するために試行錯誤する分には問題ありませんが、実際にWebサーバー上で公開してはいけません。

 PHPに限らず、どのようなプログラムでもいえることですが、外部からの入力は、何らかの悪意をもって行われる可能性を常に考慮に入れなければならないためです。「悪意」というのは誤動作や停止を引き起こさせたり、セキュリティを侵害したりといったことです。サンプルプログラムは、そういった考慮を一切していません。

 例えば、前回の例では数値が素数かどうか判定するのに、数え上げる方法で判定しましたが、調べる数値をフォームから入力できるようにしたとします。この方法は数値が大きくなると計算量が増える可能性があるため、ブラウザータイムアウトになってしまったり、同時に接続している他のユーザーに影響したりすることもあるでしょう。

 従って、フォーム送信値の範囲を制限することが必要になってきます。もちろん望ましいのは判定方法を見直すことですが、ここではあくまで送信値に対する考え方を示しています。このように値の型式や範囲が正しいかどうか確認することを、「バリデーション」といいます。

 さらに致命的な例を紹介します。認証のためにフォームから送信されたパスワードをデータベースに問い合わせる、といった処理は典型的ですが、その際、問い合わせのための命令(「SQL」といいます)に、送信値を単純に埋め込むと、パスワードを知らなくても認証を通すこともできるようになってしまいます。これは引用符などのSQLにおける特殊文字を入力に使うことで可能になります。

 こういった攻撃は「SQLインジェクション」と呼ばれますが、防ぐための1つの方法として、特殊な文字を取り除いたりエスケープしたりして無害化するといった対応があります。これを「サニタイズ」といいます。ただし、SQLの実行には入力値を安全に受け渡す仕組みも別途存在しているので、根本的にはそちらを利用するべきです。

 このようにフォームの送信値は、目的に応じたバリデーションやサニタイズをきちんと行うことが大切です。これは入力値を受け取るという部分に限った話で、全体的に見れば、より望ましい対策がある可能性も忘れてはなりません。

 また、Webアプリケーションの場合、もう一つ注意しなければならないことがあります。ブラウザーに返すHTMLに変数の内容を表示する場合です。HTML上の特殊文字である「<」「>」「&」をエスケープして表示しなければなりません。エスケープをしないとHTMLのタグとして認識されてしまいます。

 特に、フォーム送信値をそのままエスケープせずに表示してしまうと、任意のタグを表示できることにつながってしまいます。