AndroidのブラウザでHTTP_REFERERが送られてこない?

webプログラムでHTTP_REFERERを取得したいという話があったんですが,Androidの標準ブラウザからREFERERが送られてこないという現象がありました.
いわゆるガラケー時代にはREFERERが送られてこない端末なんて普通だったんで,まぁAndroidでもそういうのがあるのかしら?なんて思いましたが,どうやら違うようです.

「デフォルトで使用するブラウザ」が決まっていないとHTTP_REFERERが送られてきません.
原因についてははっきりとした資料を当たってないのですが,下記のように推測.

Android端末に標準以外にFirefoxやらOperaやらのブラウザを入れると,webサイトでページを移動する度に「アプリケーションを選択」という画面が出てきます.

おそらく内部的には毎回「URLを開く」というインテントが動くので,通常のブラウザ内での移動とは異なり,毎度毎度新規にURLを開いている扱いになるのだろうなぁと思います.
「常にこの操作で使用する」をチェックしてデフォルトのブラウザを決めてあげると,ちゃんとHTTP_REFERERが送られてきます.

まぁそうでなくてもHTTP_REFERERなんて偽装できちゃうもんだしアテにできないのですけどね.

書いてて思ったけど,cookieでセッション情報を保持している場合,途中でブラウザを変えちゃったらセッションの継続ができないよなぁ.
一般的な他のwebサービスとかだとそのへんは保証外にしてるんだろうなぁ.もしくはガラケーよろしくGETパラメータで引渡か…

Smartyでescapeができなくなる

PHP+Smarty環境のこと.

通常通りSmartyで {$hoge|escape} を書いたらwarningが出るように.

PHP Warning: htmlspecialchars() expects at most 3 parameters, 4 given

おそらくエラーを表示しないようにしてる場合はescape修飾子がついたところで文字が出力されなくなるはず.

Smartyは3.1.7,PHPは…あれこのサーバ5.1じゃないの.
SmartyのほうでPHP5.2以降対応って書いてあるし,htmlspecialcharsのパラメータが4つになったのは5.2.3からみたいです.

PHP: htmlspecialchars – Manual

そんなわけでPHPの入れ替えをして解決.
まだPHP5.1.xのサーバは多いですからね…要注意.

CentOS6でYour BIOS is brokenと言われる

NEC Express5800 GT110bにCentOS6を導入.
色々とテスト.

・haltしてもリブートしちゃう.
→Wake On LANを切ればいいらしいが,どうせ電源入れっぱなしで落とすことは無いしどっちでもいいやー

・Your BIOS is brokenとか言われる
→起動時に intel_iommu=off をつけると回避できるっぽい.Intel VTとIO関連か.
しかしこれも特に実害はないような?(仮想化使ってないし)
続きを読む

webサーバをlighttpdにしてみる

他のサーバで pound + thttpd + apache という組み合わせを試していましたが
・なんかthttpdが落ちる
・thttpdが落ちるとpoundも引きずられて落ちる(これは設定で回避できそうだけど)
という状況だったので,まぁ実験だしpoundとthttpdをやめてapacheのみにしようかと思いましたが,どうせなのでlighttpdにしてみました.

中身はwordpressのサイトなので,それ用に設定を追加します.

【Lighttpd】WordPressやDooPHPを動かす設定 | SOLAT -DEV- 開発ブログ

CentOS5にrpmforgeリポジトリを追加してあるのでlighttpdとlighttpd-fastcgiをインストール
modules.confで必要なものを有効に.fastcgiも追加.
virtualhostの設定内にurl.rewrite-onceを追加.

$HTTP[“host”] == “example.com”{
server.document-root = “/path/to/www/example.com/wordpress”
url.rewrite-once = (
“^/(wp-.+).*/?” => “$0″,
“^/(sitemap.xml)” => “$0″,
“^/(xmlrpc.php)” => “$0″,
“^/(.+)/?$” => “/index.php/$1″,
)
}

他のサーバでもlighttpdを採用してみたいですが…既にあるapacheの設定を移植するのが面倒だなぁ…
フロントをlighttpd,バックをapacheにして,全体的にlighttpdをリバースプロキシ動作にしたあと,移行できるサイトから順次lighttpdにしていく手もあるか.
多分やらないな…w

SELECTの結果でUPDATEをかける(pgsql/mysql)

DB内で他のテーブルからSELECTした内容でUPDATEを行いたいときがある.
SELECTした内容をINSERTに使うINSERT~SELECT構文みたいなのもあるので,どうかなーと思ったら各DBMS毎に文法が違うのね…

PostgreSQLの場合
オデの日記@WEB系: postgresqlでSELECTした結果でUPDATEをかける
PostgreSQL/SQL/SELECT結果でUPDATE – yanor.net/wiki

UPDATE target_table
SET target_column = s.value
FROM (SELECT * FROM source_table) AS s
WHERE target_table.id = s.id

個人的にはSETとWHEREの間にFROMが入るのが直感的でない…と思う.

MySQLの場合
MySQL/SELECT結果でUPDATEする – 俺の基地
yoko_net Blog : 結合したSELECT結果でUPDATEするTips(for MySQL)

UPDATE target_table,source_table
SET target_table.taraget_column = source_table.source_column
WHERE target_table.id = source_table.id

個人的にはUPDATEの後に両方のテーブル名を並べるのがまぎらわしい…と思う.