≒ コード指定

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

<?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どころかレベルが後退しちゃいました。以上。

≒ DOMマイナス2.0

わざわざブログにネガティブなこと書かなくても良いんだけど、最近頭痛が酷い。特に今日は一日中痛い。
理由はここ二ヶ月毎日10時間前後ずーっと本とPCとでにらめっこしてるから。一日でも休むとちょっと気持ち悪い。その結果、首が限界に達しているご様子。
上を向いてると頭痛が治まってくるんだけど、ちょっとでも首を下に傾ける姿勢だと数分後に頭痛がしてきちゃう。まぁ、中年で首の筋力が落ちてるのがホントの原因なんだと思う。アマゾンでブックスタンド買った。明日届いたら背筋のばして勉強しよう。
以上が前置きで、以下本題。
本当に頭痛が酷すぎて全く頭が働かなくて、我ながら酷いコードを職業訓練の演習で書いたので、後々自分が「かってどれほど酷かったか」を振り返り、謙虚になって人に優しくできるためにここに残しておく。

我ながら酷すぎるスクリプト

訓練で演習でやった正解はこれ。基本のBOM操作。これじゃ飽き足らなくてその前の演習分と合体して「DOM2.0やったるんじゃー!」と意気込んで作ったのが上のやつ。
ああ酷い。どこが酷いって何もかも酷いよ。今まで読んできた参考書の著者さん達に謝れ。というかJavaScriptに謝れ。
「インラインでオブジェクト操作したくない(+HTMLはきれいにしておきたい)」「リテラルで書くんじゃなくてDOMから各数値を取得したい」でこうなりました。まだ何もかも分かってない。最後は正解のコードを参考に何とか動くようになりました。

以上、今日はもう少しやって早めに寝ます。願わくば2ヶ月後の自分が、笑ってこのエントリが見られますように。ちゃちゃっとましなコードに書き直せますように。