卒業研究がなんとかなりそうだ

うわ、もう一ヶ月近く書いてへんわ…。なんでこんなに書いてへんかったかというと、卒業研究が死ぬ程ヤバかったからに他ならない。
まず一番最初のテーマから3回くらい研究テーマが変わって、11月末にようやく固まった、という時点で既にアレなんやが、その後やることやること全部うまくいかない。そのまま新年を迎えて、更に時が流れ、あと一週間で最終中間発表と卒論のタイトル締切。…という段になって、ようやくまともな案を閃いて助かった。結局は最初に考えたアイデアが、最後に使ってた技法を使えば上手くいく、ということやったんで努力してきた甲斐があったと言えなくもない。
その後はデータを取りつつ資料を作成して、発表前日に発表練習してみたら尺も筋も駄目駄目やったんで内容を大幅に改訂してそのまま発表、とギリギリの日程。その割にはそれなりに結果が出たので中間発表のウケは結構良かった。卒論タイトルも適当に決まって、今は発表までには取り切れなかったデータを取りまくっている状態。今のところ上々の結果が出てるんで、卒論はなんとか書けそうだ。

Safariでの意味不明な文字化け解消

XOOPSで運営してるサイトで、EUC-JPの文字コードを指定してちゃんとHTTP Headerも出ているにも関わらず、Safariが認識してくれなくて悩んでた(ずっと放置してた)んやが、ようやく納得のいく形で解決した。というか相当前に解決はしてたようやが、原因がまとまった記事が見あたらなかったのでまとめておく。問題は複数あったようだ。

Safariの問題

実装を読んだわけではないんで確信はないが、なんか文字コード判定に2段階あるらしい。
第1段階が多分HTTP Headerで指定されたContent-Typeのcharset指定で、ここで指定されたものが第2段階でのデフォルト値になる。指定がなければ恐らくデフォルトエンコーディングの値。
第2段階が実際のHTMLを読む段階での自動判定で、通常エディタなどで行われるような、文字コードを特定できるような文字が出てきた時点で確定とするタイプのアレ。このとき、METAタグも参考にして、それでも特定できなければデフォルト値、というところかなぁ。
この第2段階の自動判定が、HTTP HeaderやMETAタグで明示的に指定があった場合でも実行されるのが混乱の元だった。「METAタグ指定と実際のエンコードが違った場合、Safariだと化ける」という情報があった気がしたんだが、ガセか…。自動判定が弱々し過ぎて、勘違いしたのかもしれない。

しかし、Safariの判定ロジックがようやく納得できた。今迄HTTP Headerを無視するクソブラウザやと思ってたが、若干印象が良くなったよ。

XOOPSの問題

XOOPSはシステム側でKeywordやDescriptionなどのMETAタグが設定できるんやが、標準設定ではAuthorとフッタのところにcopyrightのマルC(©)が入っている(現在のXOOPS Cubeでもこうなっているかは知らない)。これがEUC-JPでは表現できないコードで送られてくるため、SafariはHTTP Headerを無視して自動判定の結果を優先してくれる、という仕組になっている。

ブラウザの問題(?)

XOOPSでも多分初期値としてはちゃんと実体参照で書かれてるんやと思うが、書換えるとき、表示するためにブラウザが解釈して実体に置き換えられてしまい、うっかりKeywordを書換えたりすると一緒にAuthorとかも更新されて、予期せぬうちにこの問題が発現する、というシナリオなんやろうなぁ。
で、UTF-8ならともかくEUC-JPだと表現できんので、その場合とりあえずマルCだけ適当なコードで送られて変になるんやろうか?なんかFirefox3だとまた挙動が違って、全体が別のエンコードだと思われて投稿全体が化けるとかエラいことになるようだ。多分このへんはブラウザによって挙動が違うんやろうけど、かなりデンジャラス。

解決策

そういうわけなので、問題解決としては大きく2つあって、

  1. Safari撹乱の元凶たるマルCを消す
  2. 自動判定がうまく行くように先頭あたりでコメントを付ける

ということになる。1.はいいとして、2.はEUC-JPにしか含まれない領域のbyte値を持つ文字(京とか美乳とか)を先頭あたりに挿入することによって、ブラウザを騙すということのようだ。Yahooがこの対策を取っていて有名になったらしく、いまだにYahoo Japanではheadの先頭あたりにコメントで京が入っている。見たところ問題ないから、もう消してええと思うんやけどな…。[2008/1/4追記]今度のレイアウト刷新で消えたようだ。一応証拠としてWeb魚拓

しかし本当はXOOPS側が、表示するときにエスケープ文字(&)のエスケープ処理を行わなければならないんやが、これを怠っているというのがバグとして大きい(新しいのだと修正されてるんやろうか…)。サニタイズ言うなキャンペーンとか、このへんのややこしい話は昔まとまった記事があったのでリンクを張っておこう。

sandbox/gccがコンパイルできない問題解決

昨日やったサーバアップデートのついでに、だいぶ前から発生してた問題を解決した。
まず、なんだかよくわからんうちにsandboxがコンパイルできなくなった。サーバはamd64でCHOSTはx86_64-pc-linux-gnuなんやが、multilibの影響かなんかでi686(32bit)向けのコンパイルもやろうとして、C compiler cannot create executablesとか出て失敗するようになった。つまりgcci686向けにコンパイルできないということなんで、GCCをreemergeとしたら解決か、というとgccもcannot run compiled C programsとか出てコンパイルできない。multilibなGCCのバイナリなんて転がってないし、困った、泥沼…というのが状況。

続きを読む

久々に色々アップグレード

自宅と大学、両面での作業を円滑に進めるためにSubversionを導入した。テキトーに情報を検索しつつ入れたらあっさり入った。が、ApacheのLocation指定で指定した場所に実際にフォルダがあると、ブラウザでは見えるのにcheckoutとかがParmanently Movedを吐いて軒並失敗する、という問題で若干詰まった。フォルダ消したらあっさり解決。
ついでなんでApache2.0から2.2にアップグレード。なんか今迄標準だった機能までモジュール化されて、AUTH_DIGESTやらLANGUAGEやらとオプションに書かないといけなくなったらしい。他にも適当に設定を弄って、configtestも通ったしいけるかな…と思って再起動したらエラー。log関係が今迄だとlogs/error_logとかで指定したが、default prefixがServerRootになったようで、フルパスで指定しないといけなくなったらしい。あとDigest認証のパスワードファイル指定AuthDigestFileは、Basic認証と同じAuthUserFileで指定するようになったらしい。更になんか知らんがCGI関係のHandlerがなくなってたんで、AddHandler cgi-script .cgiとかDirectoryIndex index.cgiとかも追加してようやく元通り。…うわ、まだ問題があった。DAVの標準設定に、何故か/uploadがAliasで指定されてて参照できなくなってた。なんでサンプル設定が標準でONなんだよ…。

他にもセキュリティアップデートやらシステムアップデートやらをやりまくってたら一日が終わってしまった。いかんなぁ、時間食い過ぎ…。

Firefox3 beta2に移行(軽い!)

今更ながらFirefox3 beta2を試してみて、レンダリングJavascriptの実行速度が相当軽くなってたんで完全に移行することにした。自宅マシンでは重かったGoogle Readerも、これならFirebug付けっぱなしでも見れるぞ!タブを20個くらい一気に開いても固まらない*1!テスト用buildなんは承知してるが、最近重さに我慢できなくなってきてたんで少々のエラーより軽さ優先。たまーに起動時に原因不明のcrashが起こるが、使ってるときはまだ致命的な問題はない。
スマートブックマークとか、ブックマークをタグで管理がきるとか、アドレスバーが自動で履歴検索してくれるとか、ポップアップにアドレスバーが出るとか、アドレスバーに既にブックマークしたものかどうか出る(してたらそれを編集できる)とか、地味に色々便利になってるし、かなり快適。

とりあえず大体のアドオンはmaxVersionを書換えるとかNightly Tester Toolsを使うとかしてやれば動くが、FirebugGoogle Toolbarはまとも動かなかった。ただ、Firebugは有志が修正したものが存在するようだ。

あー、あとhatenabarとか一部のものは「安全にアップデートする手段が提供されていない」とか出るが、install.rdfのupdateURLがhttpsじゃなくてhttpになってるから出るらしい。xpiを解凍して適当に修正/再梱包したらOK。

挙動が変わってる点はJavascriptのbugfixを含めいくつかあるようだが、なんかよくわからんのが出た。前に作ったnetvibes用のreddit widgetなんやが、これがどうも不安定になった。
XMLHttpRequestで取ってきたRSSからgetElementsByTagNameでitemを引っぱって、同様にitemの項目を引っぱるだけの処理なんやが、項目を取ってくるときに微妙に途切れるときがある。どうもtextNodeが細切れに2つのnodeになってしまうことがあるらしい。standaloneモードでは発生せず、netvibes上でしか起きない。ある状況では必ず発生するが、firstChildを使わないと発生位置が変わった、とかわけがわからん。原因の特定ができんので報告はしてへんが、これ何なんやろう?とりあえず結合して対処したが。


メモリ使用量が改善したという噂に期待してたんやが、見たところ本体の消費よりアドオンによる消費(とリーク)のほうが激しいようで、そっちをどうにかしたいところ。でもまぁ、もう十分動作は軽いからあんまり追いかける気にもならなかったり。

*1:前は10個くらい開いてる状態で新しく開くと、いちいち固まってた…

WiLiKiでAJAXな感じの編集

WiLiKiを普段メモ書きに使ってるんやが、ちょっと席を立つ前に保存…とかやるとページ遷移があってウザい。この記法使えたっけ…?と思って表示を確認したいときもページ遷移があってウザい。というわけで、プレビューとコミットをページ遷移なしでやれるようにした。なかなか快適。

しかし、だいぶやっつけで書いたんで、フォームにゴリゴリ書いたJavascriptを埋め込み、AJAX用のactionは普通のコミット用のをコピーしてごにょごにょ弄って仕上げたんで、自分で見ても相当コードが汚い…。今回は晒すのはやめとこう一応晒してみる。

本当はシームレスな編集画面移行とか自動保存とかも付けようかと思ってたが、実はそんなに必要ないような気がしたんで付けず。

続きを読む

WiLiKiにカレンダー

なんだかそろそろカレンダーを付けたくなってきた。まー普通にそのへんにあるかなぁ、とも思ったんやが、さしあたり現在公開されてるのがなさげやったんで作った。Gauche:CGI:スケジュール予定表とか参考にしつつ。

 [[$$calendar hogehoge]]

でhogehogeというprefixのカレンダーを表示。日付ページはhogehoge:yyyy/mm/ddという形式でリンクを貼って、無い日付は編集ページに貼ってある。Pukiwikiプラグインっぽいのが欲しかったんで、そんな感じに。ついでにvirtual pageで過去や未来のカレンダー表示を実現。なんとなく寂しかったんでindexマクロを呼んで一覧も表示したり。

続きを読む