8日目 目指せ!ループマスターへの道!

  • 2007/12/14(金) 00:00:00

日記

うわあああぁぁぁぁぁあああ!!!!
ナイスーなギークにゴイスーなツールもらった!!!!!!!


ギークなお姉さんのPHPソースコンバーター

ギークなお姉さんのPHPソースコンバーターは、
ギークなお姉さんが自分で書いたPHPのソースをアップロードすると、
そのソースをdtiブログに投稿しやすいようにタグを書き換えたり、
行番号を付け足してくれる、ただそれだけのツールです。

by ギークな(?)バスケットマン tetsunosuke


ちょ!!それだけって!!!それ以上なにを求めるというの!!!???
欲しがりません勝つまでは!!!!!

かみさま。私になにができますか。
どうすれば tetsunosuke さんは喜んでくれますか。
私は tetsunosuke さんを幸せにしたい。する!してみせる!!

そうだ。ギークになろう。
今のところ、それ以外の誠意の示し方を知らない。
とゆことで。よーし、べに特盛で頑張っちゃうぞー!
ここは本当におめでてーいんたーねっとですにょ^^^^^^



繰り返し構文を学ぼう

ヘッダ情報の取得の時に覚えた繰り返し構文。
前回は foreach という関数を使ったけど、繰り返し構文は他にもある。


PHPには、foreach命令のほかにも、繰り返しループを実現するための構文として、
for、while、do...whileという3つの構文が用意されています。
foreach命令が配列の要素数に基づいてループの終了を判定するのに対して、
for命令はあらかじめ指定された繰り返し回数で、while、do...while命令は
条件式の真偽(TRUE/FALSE)によってループの終了を判定します。

参考:10日でおぼえるPHP5 入門教室



foreach は前回やったので省略。
今回は for、while、do...while の3つに迫る。
この ”迫る”って表現はドキュメンタリーぽくてカコイイので、これからちょくちょく使おうと思う。
ではさっそく迫ろう。
これは上で挙げた参考書の説明が分かりやすかったので、以下それを引用する。


【for命令】
for(初期化式;終了条件;増分式){...ループ内で処理する処理...}

1回目のループで初期化式を実行し、変数を初期化します。
その後、ループを1回実行するごとに増分式が実行され、終了条件がFALSEになった
タイミングで処理を終了します。



【while命令】
while(条件式){ループ内で処理する処理...}

条件式がTRUEの間のみループを繰り返します(前置判断)。



【do...while命令】
do{...ループ内で処理する処理...}while(条件式);

条件式がTRUEの間のみループを繰り返します(後置判断)。




はぁ。Lovecall The Typing Girl って感じだった。参考書コピペ乙。
一応説明したけど、日本語よりソースコードの方が分かりやすいよね♪(←ギーク発言!!
ってことで、実際に書いて動かしてみる。
ヘッダ情報の取得の foreach 部分だけ書き換える。
まずは該当部分のソースを貼る。
※タグの最初は全角にしてあります。


8 foreach($aryHeader as $name){
9 
10  :(PHP終了タグとhtml部分中略)
11   
12 <?php print($name); ?></th>
13   <td><?php print($_SERVER[$name]); ?></td>
14  
15 :(html部分とPHP開始タグ中略)
16 }

サンプル:list_header.php


うん。
foreach は変数 $aryHeader に入ってるデータを順番に $name に代入して、
入れるデータがなくなったら繰り返し終了の構文。大丈夫、覚えてる。
参考:7日目 ヘッダ情報が見たい!知りたい!晒したい!

これをまず、for で書き換えてみよう。


8 for($i=0;$i<count($aryHeader);$i++){
9 
10  :(PHP終了タグとhtml部分中略
11   
12 <?php print($aryHeader[$i]); ?></th>
13   <td><?php print($_SERVER[$aryHeader[$i]]); ?></td>
14  
15 :(html部分とPHP開始タグ中略)
16 }



8行目。
(カッコ)内は初期化式;終了条件;増分式の順で並んでる、と前述の説明にあった。
最初に $i に 0 を代入して初期化。
次の count は初めてだ。


count命令は、指定された配列に含まれる要素の数(ここでは3)を返します。



OK。
参考書によると ”終了条件が FALSE になったタイミングで処理を終了” とのこと。
つまり、$i が 3 より小さい、という条件が成り立たなくなったら処理を終了しろってことね。
最後の $i++ は、$i に 1 を加算して代入するという意味。
参考:6日目 クッキー受け取ってください!
よし。問題ない。全く問題ない。



12行目。
$aryHeader[$i]Print しろ、と言ってる。
8行目の for 以下で指示した通り、最初は $i に 0 が入ってる。
で、++ 効果で2回目は1、3回目は2が入る。
それ以降は $i<count が成り立たなくなるのでココで終了。
よし。ちっとも不思議じゃない。予想通りだ。


13行目。
$_SERVER[$aryHeader[$i]]Print しろ、と言ってる。
[カッコ]が二重になっててイラっとするけど、怒ってはいけない。
これは確か、内側から評価するんだった。
$aryHeader[$i] については上で書いた通り。
ってことは、それを $_SERVER で取得すればいいだけ。なんだ、分かるじゃん。
12行目と連動してるので、コレも3回目で終了。
やってみよう。完全に問題ない。
サンプル:header_for.php



今度は while で書き換える。


8 $i=0;
9 while($i<count($aryHeader)){
10  
11  :(PHP終了タグとhtml部分中略)
12 
13 <?php print($aryHeader[$i]); ?></th>
14  <td><?php print($_SERVER[$aryHeader[$i]]); ?></td> 
15 
16 :(html部分とPHP開始タグ中略)
17 $i++;
18 }



while は(カッコ)内が成り立つ限り繰り返す。
つまり、$i が 3 より小さいうちはずっと処理する。
処理する内容は 以下の通り。(しつこくGIGAZINE風)


13,14行目は for の時と一緒なので省略。
で、17行目で $i++ してる。
これも ++ されて $i が 3 以下じゃなくなったら終了。
パーペキに無問題だ。
サンプル:header_while.php



最後は do...while


8 $i=0;
9 do{
10  
11  :(PHP終了タグとhtml部分中略)
12 
13 <?php print($aryHeader[$i]); ?></th>
14  <td><?php print($_SERVER[$aryHeader[$i]]); ?></td> 
15 
16 :(html部分とPHP開始タグ中略)
17 $i++;
18 }while($i<count($aryHeader));



ふむ。さっきとちょっと違う。
9行目。
まず「しろ!」と言ってる。何を?13〜17行目までの処理を。上と一緒ね。
んで、18行目で「もしアレだったら繰り返してね^^」と言ってる。
アレの内容を具体的に言うと、$i が 3 以下なら、ってこと。


while が最初に 「$i が 3 以下なら繰り返せ」って言うのに対して、
do...while は後出しだ。つべこべ言わずに、とりあえず1回は処理させる。
処理させたあとで「条件が許す限りリピートしてね☆」と言ってくる。
商売上手だな!どうだろう。そういう問題だろうか。



おっけい♪
繰り返し構文はマスターした。
忘れないように do{復習}while(ギークになるまで); な感じでがむばろーっと!


LINEで送る

7日目 ヘッダ情報が見たい!知りたい!晒したい!

  • 2007/12/09(日) 23:00:00

日記

「エントリ書くからねえぇぇー!!」

そう叫んで別れた駅の改札口。
今日は先週行けなかったあきやん宅へけんすうと一緒にパジャマでおジャマ!
や、けんすうはちゃんとした格好してたけど、紅はマジでパジャマだった。
正直、暮らす気満々だった。ごめんなさい。
けんすうと2人で 「あの部屋ぜんぜん住めるよなー!」 って盛り上がってた。なんのつもりだ。


あきやんが夕食にシチューを作って待っていてくれたよ!
カレーっぽく見えるけどシチューなの。曰くカボチャが溶けたらすぃ。
あきやんだからってカレーと判断するのは早計だ。失敬だ。
下は写メ撮影に必死こくべにぢょ。(撮影:けんすう) 

   
   


紅が昼間ブクマしたのを知ってて作ってくれた・・・( ;Д;)ウッウッ...
アルファギークはサーバだけじゃなく、女の子にも優しい。
「つーか、私たち繋がりすぎなんじゃね。」は確かにあるある。
みんなと繋がったまま街中歩くなんて、頭がフットーしそうだよっっっ!!!って感じ><
確かに頭は沸いている。悪い意味で。
前回、あきやんと飲んだとき 「切込隊長も言ってたけどさぁー。」 と↑のエントリの話をした。
若い男女が酒を飲みながらする話ではない。[だがそれがいい]
僕らはいつも以心伝心!二人の距離つなぐツイッター!! ってオレンジレンジも言ってたし♪
Web2.0の中・・・すごくあったかいナリ・・・ネト充バンザイ\(^o^)/





ヘッダ情報を晒しage隊!

先週は風邪でヘタれてて全然勉強できなかった(つд・)
通説によると紅は風邪を引かない体質のはずなんだけど。
きっとギークになったせいだと思う。まいったねこりゃ><

とゆことで、平日にやるはずだったヘッダ情報について。
これはわりとスムーズに理解できた。
スムーズすぎてあきやんがちょっぴり淋しそうだった。以後気をつけない。



ヘッダ情報を取得しよう

はてブを禁止する方法のときにちょっと触れたけど、
サーバとブラウザは普段、いろいろな情報をやり取りしてる。
参考:コレやってみたい! - べ、べつにブクマ禁止したいわけじゃないんだからっ!

サーバとやり取りする情報というとPOSTやGETを思い出すけど、
ヘッダ情報がその2つと違うのは、不可視であるという点。
事実、ネット充の紅が「ヘッダ情報ってなに?」って感じるということは、
ネットサーフィンをするだけのユーザがヘッダ情報を意識することはない。


Use-Agentヘッダを利用すれば、サイトにアクセスしてきたクライアント(ブラウザ)の種類が
わかります。(中略)
Refererヘッダを利用することで、自サイトに対してどのようなページがリンクを張っているのか
自サイト内でユーザがどのようにページ間を移動しているのかを把握できます。(中略)
Accept-Languageヘッダを利用することで、クライアントの対応言語を判定し、バイリンガルな
ページを構築することもできます。

参考:10日でおぼえるPHP5 入門教室


(・∀・)ほぅ!ちょっと楽しそう。
それじゃ早速、ソースを貼ろう。
※タグの最初は全角にしてあります。



1 <html>
2 <head><title>ヘッダ情報の取得</title></head>
3 <body>
4 <h1 style="background:#cccccc">ヘッダ情報の取得</h1>
5 <table border="0">
6 <?php
7 $aryHeader=array("HTTP_USER_AGENT","HTTP_ACCEPT_LANGUAGE","HTTP_REFERER");
8 foreach($aryHeader as $name){
9 ?>
10  <tr>
11   <th style="color:#FFFFFF;background:#0086b2;width:80pt;">
12 <?php print($name); ?></th>
13   <td><?php print($_SERVER[$name]); ?></td>
14  </tr>
15 <?php
16 }
17 ?>
18 </table>
19 </body>
20 </html>




ハッハー!見たことある関数はっけん!!
聖闘士には同じ技は二度と通用しないのだ!!なんのはなしだ。


1〜5行目はhtmlなので飛ばす。6行目からPHP。

7行目は配列だ。
$aryHeader という変数に、array 関数を使って "HTTP_USER_AGENT","HTTP_ACCEPT_LANGUAGE","HTTP_REFERER" という
3つのデータを格納してる。これは問題ない。
参考:4日目 おみくじとか作っちゃうかモナー!



8行目。
foreach というのは初めて見るな。


foreach命令
foreach(配列 as 仮変数){…ループで行う処理…}
配列の各要素の値を仮変数にセットしつつ、ループを繰り返します。
各要素には、この仮変数を介してアクセスすることができます。

参考:10日でおぼえるPHP5 入門教室


ふむふむ。
説明だけだとよく分からない。
こういう場合は、何が起こるか実際にブラウザで見てみたほうがいい。
サンプル:list_header.php


おぉ。
"HTTP_USER_AGENT","HTTP_ACCEPT_LANGUAGE","HTTP_REFERER" の3つが
順番に表示されている。
でも print は2回しか使ってない。におうな。このへんがあやしい。



9行目。
いったんPHPを閉じて、10行目からhtmlの記述が始まる。
PHPというのは、htmlと混在して書いてもおkらしい。
以前ナイス・tetsunosuke・ギークさんがトラバで教えてくれました。

// PHPの部分とHTMLは分けて書いて、必要なときだけ埋め込む

参考:ギークなお姉さんを目指すブログを友人にも紹介しようと思う。

余談だけど、この // のあとにコメント書くのってギークっぽくていいよね・・・!!!
のあとにコメントとか!すんげぇすんげぇギークっぽい!!!!
使おう。


再びhtmlは飛ばす。必要そうな参考リンクだけ貼っておく。
参考:<TABLE> ★HTMLタグリファレンス



で、12行目の print
$name を表示しろ、と言っている。
これはページの左側、<table>タグのセル<th>内に、配列で $aryHeader に代入した
"HTTP_USER_AGENT","HTTP_ACCEPT_LANGUAGE","HTTP_REFERER"
3つの文字列を順番に表示させてる。


いいね、foreach の正体をつかんだ気がする。


13行目。
$_SERVER[$name] を表示しろ、と言ってる。
$_SERVER は見たことあるな・・・そうだ。はてブ禁止方法のときに出てきた。
あのときは確か、$agent$_SERVER['HTTP_USER_AGENT'] を代入して、
if ・もしも $agent の最初の6文字がHatenaだったら・・・というコードだった。
HTTP_USER_AGENT は今回も出てきてる。
前述の参考書の説明だと、これでサイトにアクセスしてきたクライアント(ブラウザ)の
種類がわかるそうな。他にもいろいろあるらしい。

PHPでは、サーバに関する環境変数はグローバル変数$_SERVERに格納されます。
HTTP_REFERERやREMOTE_ADDR、PHP_SELFなどスクリプト構築において欠かせない
変数群を簡単に取得できるので、それぞれ暗記しておいて損はないです。

参考:PHP:$_SERVER サーバ環境変数


サンプルページを見てみる。
ページの右側、<td>セル内に、ブラウザの情報・言語情報・リファラ情報が表示されてる。



オーケー!
ってことは、foreachというのは$aryHeader に入ってるデータを順番に $name に代入して
{ 以下を繰り返せ、って意味ね。完全に把握した。


15〜17行目で、もう1度PHPで処理命令を閉じてる。閉じるためだけのPHP。


以上、終わり!
わぁい!ひとりで理解できたよできたよ!!
これ以外にも繰り返し構文をいくつかやったけど、紙面と眠気の都合上、今回は断念。
今週は仕事のスケジュール的に平日更新できるか分からんけど、できたら繰り返しの話だけ
サクっと書きたい。書く方向でがんばる。ギークの食べ物食べてがんばろう。

LINEで送る

6日目 クッキー受け取ってください!

  • 2007/12/03(月) 00:00:00

日記

今日はけんすうと一緒にあきやんちに行ってお勉強するはずだったのに、
家庭の事情とか一身上の都合とか私鉄の人身とか風水的に考えて日が悪いとかで
行けなかった・・・(´・ω・`)
どんまいどんまい。
さよならは言わないよ!またいつかリベンジするから!!


とゆことで自習。





訪問者にクッキーを食べさせたい!

クッキーはなんとなく分かる。
でも改めて、クッキーとは何か?を確認しておく。


クッキーとは、サーバにアクセスしてきたブラウザに
対して、一時的にデータを書き込んでおく仕組みです。

参考:改訂新版 基礎PHP


ほうほう。


クッキーとは、クライアント上に保存される小さなテキストのことを言います。
通常、Webの世界では、セキュリティ的な観点から、サーバからクライアントに対して
書き込みを行うことは許されていません。
しかし、クッキーだけが唯一の例外で、サーバがクライアント側になにかしらの情報を
残したいと思った場合には、まずクッキーを利用する必要があるのです。

参考:10日でおぼえるPHP5 入門教室



了解!このへんは大丈夫。
一度書き込んだ掲示板に、次回からはデフォで名前が入るようになるとか、そゆことだよね?
でもネカフェのPCからアクセスした場合は、名前は入らない。
ということは、当たり前だけどサーバが私からのアクセスと判断している基準は
ブラウザってこと。
IPではない、というのは、同じPCからぷにるでアクセスしたときは覚えてる情報も、
FireFoxからアクセスすると覚えていない、という実験から分かる。
ブラウザって地味にいい仕事するよね。今さらだけど。



訪問回数によって表示を変えてみよう

あああ!これはアレか!
ホームページ1.0みたいなサイトで 「○回目の訪問ですね!」っていうのは
クッキー使ってたわけ? ほぅ・ほぅ・ほほぅー。
紅はかろうじてアレは使っていない。でも、マウス動かすとハートがついてくる、っていう
Javascript は超ー可愛いと思って使っていた。若気の至りだ。今は反省している。


では早速、ソースを貼ろう。
※タグの最初は全角にしてあります。


1 <?php
2 $times=$_COOKIE["count"];
3 if(!isset($times)){
4   $times=0;
5 }else{
6   $times++;
7 }
8 setcookie("count",$times,time()+600);
9 ?>
10 <html>
11 <head><title>cookie.php</title></head>
12 <body>
13 <?php
14 if($times==0){
15   print("1回目");
16 }elseif($times==1){
17   print("2回目");
18 }elseif($times==2){
19   print("3回目");
20 }else{
21   print("それ以降");
22 }
23 ?>
24 </body>
25 </html>



if はよく出てくるなぁー。
2行目の$_COOKIE は、スーパーグローバル変数らしい。
$_POST と一緒。
参考:3日目 今度はあなたに挨拶したい><


$_COOKIE
setcookie命令で指定したクッキー名を指定します。



$times に、あとで出てくる setcookie で保存した値を代入する、ということか。



3行目。
if(!isset とびっくりしているのはなぜだ。こっちがびっくりする。
isset は関数ぽい。


isset
引数に指定した変数が定義されているかどうか調べる関数です。

参考:PHP関数講座:isset


つまり、$times が定義されているかどうかを調べてるってこと。
OK、それはいい。そこまではいいんだけど、 ←コレが気になる。
なにか注意を促されている気がする。スルーしたいがきっとダメだろう。






NICE GEEK!!!!!!!!!
先日ナイスギークって「nice boat!」と関係あるのかな?って言及されたけど、
nice boat とは関係ない。
でもこのブログが最終回を迎えるときは紅の画像を流しておくので、
そのときは Nice Geek って書き込んでくださいね!



で、これを踏まえてもう1度3行目を見てみよう。
$times が定義されてたら 以下を処理しない。と言ってる。
てことは、定義されてなかったら 以下を処理する、ってこと?
たぶんそうだろう。そうじゃなきゃつじつまが合わなくて困るし。そういうことで進める。
処理する内容の詳細は以下から。(GIGAZINE風)


$times=0 は、0を代入。
そうじゃなかったら $times++ するんだって。
この場合の ++ は、イイ!の意味ではなく代入演算子と言うらしい。
参考:コメント欄より - ”++” は ”イイ!” のサイン


++ 加算代入
変数 $x の値に1を加算して代入する

参考:演算子/PHP入門


おぉ!いまなんかキタ。
このからくりが分かった気がする。
初めてページを訪れた人は $times が定義されてないから0を代入。
2回目に訪れたときは0が入ってるから、それに ++ して1にする。
3回目に訪れたときは1が入ってるから、それに ++ して2にする・・・
という処理が、アクセスするたびに行われてくんじゃないの?もしかして!!!
やーい!わかったぞ!!「よくぞ見破ったな!」 という高笑いが聞こえてきそうだー!
ごめん嘘。全くそんな気はしない。ちょっと盛り上げたかっただけなの。



8行目の setcookie という関数。

setcookie( )
任意のクッキーをクライアントの Webブラウザに送信します。

書式
setcookie (クッキー名, クッキー値, 有効期限, 有効パス,
有効ドメイン, trueまたは false);

参考:PHP関数リファレンス


参考書によると、必須項目は一番最初のクッキー名だけらしい。あとは省略可。
今回は、クッキー名・クッキー値・有効期限の3つを指定してる、んだと思う。
クッキー名はcount、クッキー値は$times
そして time()+600 は・・・


time( )
現在の時刻を、UNIX時間で返します。
UNIX時間は、1970年1月1日0時からの経過秒数とされ、
現在の時刻とは、20時間の差異があります。
UNIX時間を現在時間に換算するためには、72000秒を追加することで可能になります。

参考:PHP関数リファレンス


なんだろ、72000秒足してないけどいいのかな?
72000秒をスルーして考えると、現在の時刻プラス600秒が有効期限ってことなのかな。
そうだったらいいな。



とりあえずPHPはココでいったん終了。
この次からhtmlに入る。



14行目。
もし $times が超イコールで0だったら、1回目と言えと。
以下、$times が1なら2回目、2なら3回目と続く。


20行目。
$times が0でも1でも2でもない場合、つまり訪問回数が3回目以降のときは
それ以降と言え、ってこと。



オーケー。if は問題ない。
それじゃ、サンプル。
サンプル:cookie01.php



こういうの作ると使いたくなってしまうので危ない。
そこは初心に返る必要はないはずだ。




追伸

Twitterでアドバイスくださった方、ありがとうございました!!
名前書いてもいいかなぁ。名前だけならきっとセフセフと思う。

@signdigit @tetsunosuke @whitebell @Malan @yukkie_m @hmori @tsupo
@dev0000 @djfjmt @maname &いつもコメントくださるナイスギークな@てさん♪

お礼に紅からあなたにクッキーを渡します。


  


有効期限はどうだろう、4〜5日くらいは平気らしいです。とマジレス。


LINEで送る