ここのAtomをRailsのAtomFeedHelper#atom_feedで出力してたんですが、基本全て数値文字参照で出る。

エンコーディングに関係無く表示されるので正しくはあるんだろうけど、クロールされてるところ(Planet PHP Japanなど)ではもう一度エスケープがかかって数値の羅列になってしまう。

フィードクライアントとしては数値文字参照をHTMLとして解釈した上でエスケープする必要があるだろう。しかし、自分がクロールする側になったら正直、

「面倒だから数値文字参照などにせんでくれ・・・」

と思うだろう。

しかもそういったクライアントを通して見る第三者の人にとってはそんなサーバークライアント間のやり取りなどどうでもいいことで、単に

「文字化けうぜぇえええ」

である。

atom_feedメソッドでのHTMLのエスケープはたくさんのクラスを遡って、最終的にはここ(String#to_xs)でやってるらしい。

/activesupport-2.2.2/lib/active_support/vendor/builder-2.1.2/builder/xchar.rb:

class Fixnum
  XChar = Builder::XChar if ! defined?(XChar)

  # XML escaped version of chr
  def xchr
    n = XChar::CP1252[self] || self
    case n when *XChar::VALID
      XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
    else
      '*'
    end
  end
end

(...snip...)

class String
  # XML escaped version of to_s
  def to_xs
    unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
  rescue
    unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
  end
end

コメントを見ると、そもそもコレ自体XCharライブラリーというのを拝借しているものらしい。

Wikipediaによると、西欧22言語をサポートするISO-8859-1もCP1252も共にLatin1と呼ばれますが、IBM由来のMicrosoft Codepage(CP)では0×80から0×9Fの範囲の文字が拡張されています。(ユーロ、ダガーとか)

要はShift_JISとCP932みたいな問題がLatin1とCP1252にもあるんですな。

何のためのライブラリかというと、多言語化の時に問題になりそうなそのCP1252の拡張部分を適当な文字にマッピングするためのものらしい。(自動的にCP932で書いたら問題が起きそうなことが予想できる)

とりあえずUnicodeをUTF-8で使ってれば問題無いだろうということで下記の様に対処した。

config/initializers/rails_ext.rb:

class String
  def to_xs
    ERB::Util.html_escape(self)
  end
end

大丈夫かな?

ActiveRecordでcreated_atとかupdated_atを自動更新したくない場合はモデルのクラス変数record_timestampsをfalseにすればいいんだって!

class Doc < ActiveRecord::Base
  @@record_timestamps = false
end

ッアース!(Ass)

Googleツールバーってポイントして翻訳する機能があったんですな!(via rono23

translate_rack

うおおおおおべんりいいいいいい!

携帯で自分の住所は、「メニュー」「0(ゼロ)」!!!

いっつも忘れるので。

そういえばDreamHostのPassengerでRackだけで動くのか試してなかった。

% tree
.
|-- config.ru
|-- public
`-- tmp

2 directories, 1 file

最小限。

% cat config.ru
app = proc do |env|
    return [200, { "Content-Type" => "text/plain" }, "ζ゚<I can fly."]
end
run app

icanfly

http://i.can.fly.komagata.org/

動いた。こりゃ便利。

プロジェクト完了で伊香保温泉行ってきましたー。

シュウマイ弁当

しゅうまい弁当うめー。

081205_103642

尋常じゃない程過疎っててのんびりできました!

githubって色んな機能がありますが、好きな機能のひとつが、READMEを置くと勝手に表示してくれる機能。(README.rdocとかでもいいみたいです)

github readme

これってRailsプラグインだと”“init.rbにプラグインインストール後にコンソールにREADMEを表示するように書いておく”“なんて慣習もあるので1人3役みたいでお徳な感じです。

プラグインやライブラリを探す時なんかはどうせプログラマー向けなんでREADMEさえ出てれば必要十分で、Wikiすら見なくていいので便利です。

まだこのサイトへのコメントの実装方法を考えています。

調べていたところ、JS-Kitのやり方にとても感心しました。

JS-Kit: Commentsをカスタマイズする

RSSをセットアップする。

以下のURLを使えば、RSSを通じて全部のコメントがアクセス可能になります。:

http://js-kit.com/rss/your.site.com/path

pathが、有効なpermalink属性あるいは有効なpath属性の値のどちらかである場合。

別のやり方として、DNSエントリーを設定する方法もあります。:

js-kit.your.site.com. IN CNAME js-kit.com. 

シンプルなのにスゴイ分散システムです。DNSとHTTPで大抵のことが解決できるんですな。

さっそくJS-Kitを使ってみたんですが、どうも機能が多過ぎて気に入らないところが色々。単に見た目とかの問題なんですが。最初はシンプルだったんでしょうが、商売にしようとするとこうなっていくんですかね。

自分で似たようなものを作るか・・・? いや、しかし・・・。

このサイトもAutoPagerizeに対応してみた。

面倒かと思ったらwill_paginateプラグインは最初からrel=”“next”“が設定されてるのでスゴイ楽!やってよかった。

このサイトのコメントの実装についてまだ悩み中です。

テキストの抽象化 – p0t

構造化/非構造化テキスト

テキストには構造(親や子となる何か)を持つものと持たないものがあるようです。一般的なブログコメントはブログエントリを親に持つテキストということになる。

実際に実装しようとすると、テキストを構造化していない(構造化テキストを扱わない)ことが現在シンプルでいられる一番の理由だということがわかった。

非構造化テキストと構造化テキストをわけつつ、直交性を保ったまま統合する方法を考え中です。