PHPからのJavaScript出力でエラー

PHPスクリプト中のヒアドキュメントでJavaScriptを出力させようとして、次のようにするとエラーになってしまう:

<?php
print <<<EOF
<script type="text/javascript">
var obj = function(){$('#foo').text('OK');}
</script>

EOF;

実行結果(エラー)

PHP Parse error:  syntax error, unexpected '(', expecting T_VARIABLE or '$' in /tmp/foo.php on line 4

function中でjQuery絡みの$(‘…’)の箇所を解釈しようとしてエラーになっているらしい。

試しに、同じ個所を
対策1

var obj = function(){1+$('#foo').text('OK');}

とすると問題なく出力されて、JavaScriptも動作する。

PHP側のヒアドキュメント側での変数展開の問題かと思いついて、次のようにエスケープすると
対策2

var obj = function(){\$('#foo').text('OK');}

これも問題なく出力されて、JavaScriptも動作した。

ヒアドキュメントでの変数展開の理解不足が根本原因そうだが、不要な式が入ってこない後者(対策2)のほうがいいのかな。

ETCマイレージサービスの登録フォームが脱力…

新年度4月に入って、高速道路ETCの早朝・夕方の割引サービスがマイレージ登録されているものに限定されるようになったようだ。

登録ページを見てみると

登録フォームが出てくるが、数字を入力する個所で全角を要求したり、半角を要求したり…。
20140405114649
こういう半角か全角かを指定してくるサイトは多いのだが、入力後に使いたい側が自動変換で形式を揃えてはダメなのか?(何か契約上の問題でもあるんだろうか。「本人の入力データに限る」とか?)

入力する番号情報として、車両番号と車載器番号とETCカード番号が必要だが、ETCカード番号のみセキュリティ上の配慮なのか、暗証番号扱いになっている。
20140405113923
「画面上は●と表示」なっているのだが、次の確認用の入力フォームもあり、「怪しいぞ」と思って試してみると
20140405113936
立派に表示されとるじゃーん!表示隠しの意味ねーし。誰が作った、つーか誰が許可したんじゃ、こんなフォーム。

HTMLソースを抜き出してみると

<INPUT type="password" name="IccardId" size="48" maxlength="19" value="">
<span class="txt-small">(半角数字 左詰め 画面上は●で表示)</span>
<span class="txt-small">確認のためもう一度</span>
<INPUT type="text" name="IccardId_confirm" size="25" maxlength="19" class="txt-mode-inactive" value="" onCut="return false;" onCopy="return false;" onPaste="return false" onContextMenu="return false">(半角数字)

きちんと「text」指定されております…。

Ruby Mechanizeでタイムアウト

RubyのMechanizeでデータ取得をしていたら、次のようにEOFErrorが発生する。

/usr/local/rvm/gems/ruby-1.9.3-p374/gems/net-http-persistent-2.8/lib/net/http/persistent.rb:959:in 
  `rescue in request': too many connection resets (due to end of file reached - EOFError) 
  after 0 requests on 21405360, last used 1394984831.0672119 seconds ago (Net::HTTP::Persistent::Error)
        from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/net-http-persistent-2.8/lib/net/http/persistent.rb:968:in `request'
        from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize/http/agent.rb:257:in `fetch'
        from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize.rb:431:in `get'

データ取得に失敗しているのかと、Mechanizeのagentの設定でtime_out値を増やせばいいかとも思ったが、そちらではなくkeep_aliveがtrueになっているとタイムアウトになった際にEOFErrorになってしまうため、keep_alive=falseとするといいらしい(エラーメッセージにある「too many connections」はkeep_aliveに関連して発生するものか?)。

Rubyのバージョンは1.9.3だが、更新したほうがいいのかも?

w3mのUTF8表示で表示ズレ

このところTeraTerm + w3mの状況で使っていたら、改ページした際に文字(ゴミ)が残って表示が汚くなってしまう。

TeraTermの端末設定をVT220Jやら、w3m側のTERM設定をTERM=linuxやら、いろいろと変更してみたが改善せず、改ページの度にCtrl-lで再描画をしないと見てられない。

端末側は漢字コードはUTF-8なのだが、ふとw3mの表示用の漢字コードを’w3m -e’のオプション指定でEUCにしてみて、TeraTermの側の受信漢字コードもEUCにしてみると問題なく表示されるようになった!UTF-8が問題だったのかな?

UTF-8の表示環境でもlessでのファイル閲覧では改ページでの崩れは起こらないのだが、また別の問題か?

Firefoxの「クッキー保存の毎回確認」だとJavaScriptで保存できない

Firefoxで次のようにJavaScriptを使って単純にクッキーを保存しようとしても動作しない。

<script type="text/javascript">
setcookie('cookie_check', '12345');
</script>

設定を見直していたら、どうもFirefoxの履歴設定で「Cookieを保存する期間」を「毎回確認する」と設定しているのが原因らしい。

20140208191351

この場合に、ロケーションバーからサイトの情報を確認したり、詳細を表示させても特にクッキー関連の表示は出てこない。

20140208191510
20140208191545

それで、クッキーの保存設定を他の「サイトが保存した期間まで」と切り替えてみる:

20140208191604

と、クッキーの保存や値の書き換えも問題なく動作する。

ここで元の設定の「毎回確認する」に戻すと、先に保存していたクッキー値の読み出しはできるのだが、その値を変更したり新たに保存したりということはできない。

これに対して、phpで次のように保存を試してみる:

<?php
setcookie('check_php', '12345');

と、こちらだときちんと確認ダイアログが表示されて保存するサイト設定が有効になり、クッキーの保存も問題ない。

20140208191950
20140208192004
20140208192115

これでブラウザ側のサイト設定が「毎回確認する」→「許可」と切り替われば、それ以降はJavaScript側からもクッキーを保存することができるようになるようだ。

ブラウザのセキュリティ上の制限なのかもしれないが、JavaScriptでの動作時にブラウザの設定を切り替えるようにはなっていないらしい。困ったな。(一度は、php側で不要なクッキーの保存と削除を行なっておくとか??)

自前サイトの問題なのかと思って、他の方のページでも試したが、やはり保存期間を「毎回確認する」としていると(クッキーが保存できないため)「JavaScriptが無効」というような判定になってしまった。

20140208203022