どういう悪さされるかはイラストになってる方が分かりやすくていい。
今日の朝5時にダウンロードするSUSマシンには来てなかった。朝7時ダウンロードのSUSマシンには来てた。
マイ一押しVPNソフト OpenVPN がついにWindows対応。 今のところ開発者の都合によりWinXPのみの動作確認だが、Windows2000/NT4でも動くかも、という雰囲気。
OpenVPNはログを見れば大体何が悪いか分かるところがIPsecより楽。OpenVPNならUDPのポート1つだけなのでNAT越えも簡単。
ports/www/pound が Pound1.4にアップデートされた。/usr/local/etc/pkgtools.confに以下の行を追加して portupgrade。
MAKE_ARGS = {
'www/pound' => 'CONFIGURE_ARGS="--disable-daemon --without-log"' ,
}
これでdaemontoolsの流儀で起動できる。--without-logの影響かCPUを食わなくなった。
encodeとunencodeが非対称なのが気持ち悪かったのでutilpuny.rbをこんな風にしてみた。
String#escape した結果は Hiki::String クラスになるので、unescape で元に戻る。
ただし文字列演算をしたらアウトという微妙な状況。
require 'uconv'
require 'punycode.so'
module Hiki
class String < String
def escape
Hiki::String.new(CGI::escape(Punycode.euctopuny(self)))
end
def unescape
Hiki::String.new(Punycode.punytoeuc(CGI::unescape(self)))
end
end
end
class String
def escape
Hiki::String.new(CGI::escape(Punycode.euctopuny(self)))
end
def unescapePuny
if self =~ /^xn\-\-/ then
Hiki::String.new(Punycode::punytoeuc(self))
else
Hiki::String.new(self)
end
end
end
class Hash
def unescapePuny
# unescape all values (do NOT unescape keys)
self.keys.each { |k|
self[k] = self[k].unescapePuny
}
self
end
end
class Array
def unescapePuny
self.map { |v| v.unescapePuny }
end
end
プログラム中に存在する文字列リテラルのクラスを変更するとかいう大技はないよなあ…
そもそも [Server上で文字列をescapeした結果] はHTTPプロトコルを通じてブラウザ上に展開される時点でunescapeされる という非対称性をかかえている、 というか「Server上でunescapeしたい」とはどういう状況なのか検討しないと。
少なくとも db/flatfile.rb中で使われているescape,unescapeはファイル名の生成に利用しているので、
ブラウザに投げる文字列としてescapeするのとは状況がかなり違う。