『 2010年10月 』

≒ 学習の記録(PHP)

今日は職業訓練が一日自習だったので勉強が大分捗った。web構築スキルの「勉強」ってのも変な話だけど、本をじっくり読んで「勉強する」ってことは今しかできないかなって思ってるのと、資格試験が近いため「勉強」してるんです。ええ、あの悪評高い「ウェブデザイン技能検定」受けます。ええ。2級です。すみません。この話はまたの機会に。

というわけで時間が出来たので皆さんお待ちかねの学習の記録第二弾。PHP(地獄)編です。ええ、分かってます。誰も見てません。アクセスログ見てますから。

ノン・プログラマのためのPHP入門 10日間コース

JS編で書いたとおり、PHPの学習にはすごく苦労してます。この本に最初に取りかかったのは「持ってたから」。去年前職がちょっと暇だったときに少しでも勉強しようかと思い買いました。けど積ん読。「ノンプログラマ」とはありますが、「素人向け」という内容ではないよう。(僕ちょっと疲れてるのかな)。webデザイナーなど、「触れたことはある」程度の知識は事前に必要ではないかと思います。はい言い訳です。で、用語の分からないものが多く、3章で挫折。ただし、この本にものすごく感謝してるのはXamppの導入を助けてくれたこと。おかげさまで最初の学習環境を整えることに労力をとられないで済みました。僕の場合は本の通りやって一発で上手く行きました。まぁ後で人並みに苦労はするんですが。

初めてのPHP5

次はこれ。迷いに迷ってこれを買いました。JS編で触れた『初めてのJavaScript 第2版』より先に始めて6章で挫折。詳細な説明で勉強の充実感はあるんですが、知らない言葉が多すぎて本当に頭がパンクしそうになりました。1ページ/日がデフォになってきたんで一旦撤退しました。

基礎からのMySQL

ネットで(泣きながら)探しまくって、藁にもすがる思いで次に買ったのがこの本。どこでも絶賛されてる感じなのですが、僕にもこの本はよく理解できました。というかこの本で駄目ならサーバサイドは一旦諦めようと思って始めたので、西沢先生(勝手に呼ばせてもらってます。)には足を向けて寝られません。2章の扉に書かれてらっしゃる「必ず成功する秘訣」を何回も読み返しながら勉強しました。で、嬉しくて調子に乗って掲示板を公開してます。理解し易くて読んでて気持ちが良いので暇があれば読み返してますが、やっぱり分かってない部分も多くてまだまだお世話になりそうです。

以上が勉強のために買った本です。今は『初めてのPHP5』に再挑戦中。今日は9章がようやく終わりました。頭痛が酷い。2度目の挫折間近。明後日から一旦『独習PHP 第2版』に行く予定です。

他にも評判が良かったので『PHPによるWebアプリケーションスーパーサンプル 第2版』も買いました。でも今の僕のレベルでは意味が分からなすぎてただのカーゴカルトコーディング(こんな言葉あったのね)になっちゃうんで、眺めるだけに止めてます。もう少し理解が進んだらもう「勉強」ではなくて「実習」を始めるつもりなんで、その時は大活躍してくれそうです。いつのことやら。

以上、PHP編でした。JSの方は順調に『JS5』に進んでいて今日は5章まで進みました。意外に分かり易いです。

≒ コード指定

今日参考書の演習で打ったスクリプト。

<?php

$midnight_today=mktime(0,0,0);
print'<select name=”date”>’;
for($i=0;$i<7;$i+=1){
$time_stamp=strtotime(“+$i day”,$midnight_today);
$display_date=strftime(‘%y年%m月%d日(%a)’,$time_stamp);
print'<option value=”‘.$time_stamp.'”>’.$display_date.”</option>\n”;
}
print”\n</select><br/>”;

require’form_helpers.php’;
$midnight_today2=mktime(0,0,0);
$choices=array();
for($i=0;$i<7;$i+=1){
$time_stamp2=strtotime(“+$i day”,$midnight_today2);
$display_date2=strftime(‘%y年%m月%d日(%a)’,$time_stamp2);
$choices[$time_stamp2]=$display_date2;
}
input_select(‘date’,$_POST,$choices);
foreach($choices as $key => $value){
print”<br/>$key:::$value”;
}
?>

別ファイル該当部分

function input_select($element_name,$selected,$options,$multiple=0){
print'<select name=”‘.$element_name;
if($multiple){
print'[]” multiple=”multiple’;}
print'”>’;
$selected_option=array();
if(($multiple)&&($selected[$element_name])){
foreach($selected[$element_name] as $val){
$selected_options[$val]=true;
}
}else{
$selected_options[$selected[$element_name]]=true;
}
foreach($options as $option => $label){
print'<option value=”‘.htmlspecialchars($option,ENT_QUOTES, ‘UTF-8’).'”‘;
if(isset($selected_options[$option])){
print’ selected=”selected”‘;
}
print’>’.htmlspecialchars($label,ENT_QUOTES, ‘UTF-8′).'</option>’;
}
print'</select>’;
}
動作はこんな感じ。
上のselectが裸のやつ。下のselectはhtmlspecialcharsでサニタイズしてるやつ。PCに入れてるxamppでは下のselectが動作しない。

で、foreachで配列吐き出し。ちゃんと値は設定されてる。

  1. htmlspecialcharsはずして裸で出力してみたら大丈夫。ってことはコード変換の問題か。
  2. あれ?関数格納phpファイルはUTF-8だけど(前に作ったやつの流用だから)、今書いたスクリプトはSjisで保存してた。原因はこれか?
  3. 両方UTF-8に統一した→何もかもおかしくなった。
  4. 頭北ー!サーバにあげてtestだ。
  5. 最初のファイル(ただしUTF-8に統一)で全く問題なし。

原因はxamppの文字コード設定だった。前からphpの演習はこれで苦労してるんだよなー。

結構な時間をかけて色々な設定試してるんだけど、文字コード関係で躓くこと多し。学習の環境として導入してるのに、その環境の設定のために時間とられてたら馬鹿馬鹿しいな。

サーバのほうの文字コード設定は最初にちょっといじっただけで済んだ。情報も少ないし。xamppの方は設定について、情報多すぎて迷っちゃうんだよね。

設定に困って探し回ってたときに見た情報で、うろ覚えなんだけど、xampp日本向けパッケージはsjis前提でコンパイルされているので深いところでは完全にUTF-8対応にできないといった話があったような。本気で環境作るならApache、PHP、MySQLそれぞれ個別に導入すべし、とか。

ホントかどうか分からない。今の僕には理解力が足りない。とりあえず今はhtmlspecialcharsが動作してるってことでOKということにしておきます。つーかSjisなんてこの世から無くなればいいのに。

PHPの学習がまともなレベルまで進んだら、セキュリティ関係掘り下げないとまずいなー。で、もう一度このコード検証しよう。

≒ CatDogその後

今日訓練でJSON関係ちょっとやったので、その演習の時間に試行錯誤。ものはこれ

元のコードの分かってなかった部分を分解してみた。「一旦#dataに入れて、出して、加工して入れなおして、それから表示」なんてやってるから変な挙動をするんだと思って、受け取ったJSONを我ながら野暮ったいやりかたで分解して、出したり入れたり無し、一発で#dataに入れるように改造した。

  • JSONはすぐに受け取れてる(はず)。
  • とすればただの文字列なのだからおなじfunction内でやりとりするのに例の謎の「alert挿入」は必要ないはず。
  • もしかすればChromeでも見れるようになるかも!

で、1funnction化した。駄目だった。謎alertを入れないとtoo much recursionになる。つまりいつまでたってもJSONから配列に文字列を取り込めない。何で?

さらに途中のプロセスを整理したためなのか、イメージデータ取得に時間のかかる「Other」カテゴリが変になった。なぜかFlickrのsensorにひっかかったのがそのまま表示される。といっても面白写真が見れます、ってことじゃなくて、例の「This photo is currently unavailable」って白いスクエア整形されてないやつが出てくる。みっともないことこの上なし。

前のバージョン(現行か)のCatDogViewerだと「スクエア整形はちゃんと出る」→「クリックして拡大してみると見れない(This photo is currently unavailable)」って順番だったんで、推測すると、

  1. 投稿があるとだだ漏れでフィード流す。ナンバー(=url)は自動付加。
  2. 大雑把な検閲(形状認識とか)で分かり易い不正をはねる。とりあえず白画面にする。
  3. 次の投稿で同ナンバーは上書きされる。
  4. 第一段階の検閲をクリアしたものでナンバー確定。スクエアやその他規定のサイズに整形。派生ナンバー(=url)を(に)付加。
  5. 再検閲。有名人の顔が入っているなど版権ありそうなものをはねる。この場合、ナンバーは上書きされず、なぜかスクエアサイズは残ってる。ほかのサイズは白画面。

じゃないかと思いました。そんなに単純じゃないかな?

で、1と2は光の速さで行われてて、このCat~だと画像取得が早すぎて、3に行く前の画像を持ってきているのではないかと。ということは、これ以上スムーズにしたらもっとおかしくなるのか!

うーん。Chromeどころかレベルが後退しちゃいました。以上。