2005年10月31日

ApacheでContent Negotiation

というわけで、コンテント・ネゴシエーションするようにしました。 なんとなく賛否両論な気もするんですけど、どうかなあ。 コンテンツを書く側の立場だと、同じディレクトリに各種言語のファイルがあるというのは、 とてもメンテナンスしやすいんだよね。

さて、その方法ですが、まず、httpd.confには以下の行があるはずです。

AddHandler type-map var

これで、*.varというファイルがコンテント・ネゴシエーションに利用できるようになります。 コメントにも書いてありますが、"It Worked"ページ、いわゆる「あなたの予想に反して」のページですが、 そこでも使われているようです。

つぎに、type-mapファイルを書きます。たとえば、index.varというファイルに、

URI: index.php.en
Content-type: text/html
Content-language: en

URI: index.php.ja
Content-type: text/html
Content-language: ja

とか書くわけです。あとは、.htaccessにでも、

DirectoryIndex index.var

と書いておけばいい感じ。対応するファイルを用意するのを忘れないように。

2006年1月 3日

MTとコメントSPAM

さっぱり気がついてなかったんですが、 年末から年始にかけて山のようなコメントSPAMが来ていました。 こんな街はずれのMTにコメントSPAMしてどーするんだ。

で、うちのMTは3.2なんですが、100%叩き落してた。 優秀だといううわさは聞いてたけど、ほんとに優秀だ。

2006年1月 4日

MTSubCatIs{First,Last}

SubCategoryまわりの実装、結構ひどい。

やりたかったことは、 MTSubCatsRecurseでMTParentCategoriesして、 それぞれの先祖に対して(その先祖のContextで)MTSubCatIsLastしたかったのです。 が、実際はMTSubCategoriesのContextで評価されちゃう。 じゃあMTCategoryLabelはどうして動くのかというと、 それは無理やりごにょごにょしてるんですな。

で、直そうと思ったんだけど、 MTSubCatsRecurseしたときにContextをスタックにつんでないのでわりとどうしようもない。 泣く泣く、MTSubCatIsLastでもう一度SubCategoriesを取得しなおし、 sortしなおして評価するようにしましたとさ。ださ。

2006年4月 9日

Sortable.createでonUpdateが効かない

scriptaculousにはSortableというコントロールがあります。 その名の通り、部品をソートできるという代物です。 で、ただソートできるだけでは普通は意味がなくて、 変更があったらAJAXでリクエストを投げて欲しいわけですね。 そのためのcallbackがonUpdateです。 しかし、このonUpdate、試してみてもなかなか動きません。

なんでじゃってことで調べ回りました。 てか、scriptaculousのページの構造って欲しい情報に到達しにくいんですけど。 で、結論から言うとそれはFAQにありました。

4.3 The onUpdate callback on Sortable.create doesn’t seem to work!

You’re probably missing the requirements for naming the id attributes in the elements contained in your sortable element. See Sortable.serialize for more on this.

はりゃー。ずーっとSortable.create見てたよ。てか、onUpdateに書いとけよ。 で、Sortable.serializeを見ると、

Important: For this to work, the elements contained in your Sortable must have id attributes in the following form:

 id="string_identifier" 
 // example: id="image_1" 

Only the identifier part of the id attribute will be serialized. If you want to use an other form of id attributes, you need to implement your own serialization.

まーじで。こんなのonUpdateに書いておかないとみんなはまるよ…

2006年4月10日

Builder.nodeとtableとIE

Builder.nodeでテーブルを作る話。 例えば<div id="tbl"></div>に対して、次のコードを実行してみます。

$('tbl').appendChild(
  Builder.node('table', [
    Builder.node('tr', [
      Builder.node('th', {rowspan:2}, 'TH'),
      Builder.node('td', 'TD1'),
    ]),
    Builder.node('tr', [
      Builder.node('td', 'TD2'),
    ]),
  ]));

期待としては以下のようになって欲しいわけですね(見やすいようにborderいれてます)。

THTD1
TD2

ところがこのコード、IEでは動きません。tableを作ったとき、 その内部にtbodyができてしまうのです。すなわち、超適当に書くと、

var node = $('tbl').appendChild(Builder.node('table'));
if (node.firstChild && node.firstChild.nodeName == 'TBODY') {
  node = node.firstChild;
}
node.appendChild(
    Builder.node('tr', [
      Builder.node('th', {rowspan:2}, 'TH'),
      Builder.node('td', 'TD1'),
    ]));
node.appendChild(
    Builder.node('tr', [
      Builder.node('td', 'TD2'),
    ]));

みたいなことをしないといけないわけです。

さてこれで動くかというと、実はまだだめです。 実行してみるとわかりますが、 rowspanが効いていません。 しかし、生成されたhtmlにはしっかりrowspanがついてるんですね。 というわけでこれはIEのバグではないかと。 すなわち、IEでJavascriptによって動的にtableを生成する場合、 現状ではrowspanは使えないということのようです。

2006年9月 7日

MT3.32のなぞ

久々に頭が痛くて泣きそうです。 しかも、昨晩は寝倒したのに治らない…

ってのはさておき、先日MTを3.32にあげました。 ところが…同じ3.32のみやっちは、メニューが全部日本語に。 ここは全部英語のまま。 いや、英語でも全然かまわないんですけど、 同じ環境なのになんで?と。 Settingとか見ても言語環境選ぶところなんてないしなあ。 訳がわからない…

2006年9月13日

さらばNetCache…って、きいてないよ!

NetAppからこんなプレスリリースが… きいてないよ! ちょっとこれはダメージ大きすぎるのではないかと…

2006年9月30日

target="_blank"は悪か

ちょっとぐぐってみるとわかるんですが、 Hyper Linkにtarget="_blank"をつけるのはかなり嫌われているようです。

原因はいろいろあるようですが、大別すると以下のような感じ。

  • 新しい窓を強制的に開かせることでリソースを消費する
  • W3Cでは非推奨扱い(XHTML1.1以降では既に廃止されている)
  • 利用者から「あたらしい窓で開かない」という選択肢を奪う

まあ最初のやつは戯言なのでどうでもいいとして、 基本的には下のふたつが根拠のようです。 しかも、 W3Cで非推奨扱いになったのは利用者の選択肢を奪うことが理由のようなので、 結局は最後の項目が大きな理由と云うことでしょう。

W3Cで非推奨扱いになったにも拘わらず、 target="_blank"はなくなる気配がありません。 ということはtarget="_blank"擁護派もいるわけで、 彼らの主張はほぼ次の通りです。

  • ほかのサイトに飛ぶときはいずれにしても別窓をひらくでしょ?

私はどうかというと、 確かに他のサイトに飛ぶときは別窓や別タブで開くことが多いようです。 ただ、この場合は状況に応じて無意識に使い分けているわけで、 target="_blank"が設定されていない(すなわち選択の自由がある)ことを利用していることになります。 また逆に、リンクをクリックしたときに意図せず別窓になることもあるわけで、 「別窓開きやがった、うぜえ」と思ったりすることもあります。

このように見てみると、 個人的な意見も「target="_blank"撲滅推進」のように見えるかもしれません。 しかし、実際のところは適宜target="_blank"を使っています。なぜか。 どのように開くかを「無意識に使い分けている」と上で書きましたが、 残念ながら世の中にはそれが難しい人もいるのです。

クリックするときにShiftを押すだけじゃないか、 と思う人もいるかもしれません。 でもそれは、あたらしいものに適応していける若い世代だけであって、 還暦を過ぎたひとたちにはかなり高いハードルになり得ます。 そんなひとたちには、

「インターネット閉じたらまた開かないとだめだし、 さっきまで見ていたところにも行けなくなるし、 ほかのところは大丈夫なのになんで?」 (注:Internet Explorerを閉じちゃうと窓がなくなるので、 もう一度起動しないといけないということ。 ちなみに、「戻る」ボタンでさっきのところに戻ることもハードルが高い)

ということになってしまうわけで、 適切だと思えるところにtarget="_blank"を入れてあげることが、 ある意味でユーザビリティの向上に繋がっているという側面を否定できません。

こういったことから、 無意識でShiftを押すことが身についた世代が還暦を迎える頃までは、 target="_blank"は必要悪として存在し続けるべきだと思うのです。 だってほら、「うぜえ」と思う人は他の手段でなんとかできるでしょ?

ところで、 target="_blank"は個々のリンクかbaseのどちらかに設定することになります。 前者だと設定したリンク以外はtarget="_blank"にならないし、 後者だとページ内の全てのリンクがtarget="_blank"になって、 それこそ「うざい」ことこの上なし。 divとかで特定の領域だけ設定できればいいのにね。

ってことで、 以下のJavaScriptを使ってtarget="_blank"を設定したりしています。 bodyのonLoadで呼んであげてください。

function setLinkTargetToBlank() {
  var links = window.document.links;
  var baseURL = window.location.protocol + "//" + window.location.hostname;

  for(var i = 0; i < links.length; i++) {
    if(links[i].href.indexOf(baseURL) != 0) {
      links[i].target="_blank";
    }
  }
}

2007年2月13日

MovableTypeからtDiaryへ

いえ、引っ越したわけではないんですけどね。 どんなもんだろうかとおもって、とりあえずコンバータを書いてみた次第です。 一応、それなりにコンバートはできたんですけどね。 これ、欲しいひといるかなあ。

さて、移行すべきか、どうしようかな…

2007年2月20日

Rails1.1から1.2への変更点

タイトルと中身が異なるとはどういうことだ。 ってことで、変更点についてまとめるということではなくて、特にdeprecatedなもので気づいたものをつらつら書き連ねるテストです。 まあ、Rails2.0に向けた準備もなんとなくしましょうかってことで。

ええと、気づいたら特に断りなく適宜追加していきます。2007/02/25現在、まだ追加中。

@requestはつかうな
@request.request_uriとかしちゃいけません。requestメソッドを使いましょう。
@headersはつかうな
@headers["Content-Type"] = "text/html; charset=utf-8" とか書いてる人も多い気がしますが、headersメソッドを使いましょう。
@paramsはつかうな
同様にparamsメソッドを使いましょう。
start_form_tagとend_form_tagもつかうな
form_tagがブロックをとるようになりました。これは昔からなんでブロックちゃうねんと思っていたので個人的には違和感なし。
<% form_tag({...}, {...}) do -%>
     :
<% end -%>
ってかんじ。
image_pathは".png"を自動的に補完しない
ちゃんと".png"まで指定しましょう。
modelは使うな
もちろん、controller中のmodelメソッドのことですが… うーん、STIしてて単一ファイルの中に書いてる場合はどうすればいいんだろうか。 これに関しては代わりの方法がよく分かりません。調べ中。

2007年2月21日

Digest認証とIE6

最近、生のHTTPで認証が必要なときはDigestを使うようにしてるのですが。 昨日、IE6からアクセスするとエラーになる、という現象に遭遇しました。

Apacheのエラーログは以下のようにおっしゃっています。

Digest: uri mismatch - </XXX> does not match request-uri </YYY>, referer: ZZZ

なんだこりゃとちょっと調べてみたのですが…また出たよ、IEのバグ。 もう、叩けば叩くだけ出てくる埃のように、IE6はほんとにバグだらけ。 CSSもDOMもDAVもぼろぼろだし、酷すぎるよ…

で、これ、Apacheでは毎度のことながらIE不具合ワークアラウンドが入ってます。 これを有効にするためには、httpd.confか.htaccessにでも以下のように書いておきます。

BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

2008年7月12日

キーボード・ショートカット

その手の(どの手だ)ひとはマウスよりもキーボードを好むものだと思いますが、Google Labsのキーボード・ショートカットも便利なもののひとつですね。Googleのこのあたりのセンスは「あったらいいながある」という感じですが、キー・アサインがこれまたその手の人向けで個人的にはいい感じです。