どういう悪さされるかはイラストになってる方が分かりやすくていい。
今日の朝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するのとは状況がかなり違う。