Misc Change Log

`OpenBSD で scheme のアプリ開発' みたいなことをやってます。

2005-03-28

resolv.conf(5) の動的読み込み

tech@obsd

DNS がころころ変わる環境(DHCP とかノートで出張してるとか)によいかもしれないパッチ。

いまのところ、 アプリーションは起動中に resolv.conf が変わっても捕捉できないので、 環境が変わるとアプリケーションを再起動するしかない。

このパッチは gethostby* が呼ばれると、 それが以前の呼出しから 30 秒以上経過していれば(__res_chktime=30) resolv.conf をチェックし、 変更があればリロードすることで解決するらしい。

私はローカルに DNS サーバを起動して resolv.conf を nameserver 0.0.0.0 とすることでうまくやっていけてるので、 このパッチは当てないけどね:P

Posted at 01:25 | Permalink | Category | Comments

耐コリジョンハッシュ

http://www.ietf.org/...

via: http://yendot.org/

IETF のドラフト。既存のハッシュ関数を使う。SHA1 なら CR-SHA1、MD5 なら CR-MD5 等。

上のドラフトでは ASN.1 の DER エンコードを例にしているので、読んでみる。

ASN.1 の書式はこう。

DigestInfo ::= SEQUENCE {
    digestAlgorithm AlgorithmIdentifier,
    digest OCTET STRING }

AlgorithmIdentifier ::= SEQUENCE {
    algorithm OBJECT IDENTIFIER,
    parameters ANY DEFINED BY algorithm OPTIONAL }

CR-MD5 を選択した場合、 CR-MD5 の OBJECT IDENTIFIER は 1.3.6.1.4.1.10471.6.4.3.1 になる予定で、 これを DER エンコードすると、

30 1f
   06 0b
      2b 06 01 04 01 d1 67 06 04 03 01
   04 10
      XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX

XX は乱数列になる。

例えば、 XX が 109de96f90aa7d08814c32fc456f9e6e6a となるような ASN.1 ストリームと 平分 f8f04799c4ea178042b604660a6fe3f166599a815aa9e2edf4 を受け取ったとき、

digest(平分) => MD5(4f63cc47a5cc2d2e563b54cd0b38f5d7)

digest(乱数列 + 平分) => CR-MD5(faa4702ab6e7fa890627192cd6cc6333)

となる。なるほど。入力を制御しようという試みか。これって salt の発想そのもの?

Posted at 00:28 | Permalink | Category | Comments
2005-03-27

スワップの暗号化がデフォルトに

http://marc.theaimsgroup.com/...

まあ最近の流れを見ると、 これくらい変態的なことやらないとセキュリティ第一 OS として胸張れんわな。

実際いままでずっと vm.swapencrypt.enable=1 で運用してきたけど、 オーバーヘッドはそんなに無いし、いいんでない?

Posted at 03:35 | Permalink | Category | Comments
2005-03-25

jscm をいじってみる

jscm っていうのは javascript で書かれた scheme インタプリタ。 バグがいくつかあるし、標準的な手続き(eq? とか)がちょっと足りないのでいじってみた。

重いけど遊んでやってください。

http://quasiquote.org/repl

プリミティブ

begin, lambda, define, defmacro, list, quote, quasiquote, unquote, unquote-splicing

ビルトイン関数

cons, car, cdr, eq?, eqv?, memq, memv, assq, assv, length, reverse, append, pair?, list?, symbol?, string?, number?, +, -, *, /, remainder, floor, ceiling, exp, log, sin, cos, tan, asin, acos, atan, sqrt, and, or, =, <, <=, >, >=, random-real, number->string, string->number, null?, set-cookie!, get-cookie, make-string, string-append, string-length, string-ref, substring, symbol->string, obj->string, string-match, string-search, document->sxml, sxml->document!, display, error, print-string, gensym, eval

sxml 経由で DOM を呼べるようにしたので、実用になるかな。

(document->sxml)

とか、

(sxml->document!
 '(html
   (body
    (h1 (@ (style "color:red")) "hello")
    (p (@ (style "color:blue")) "world"))))

とかやってみるとよろし。

その他手続き(from tinyscheme)

not, last?, xcons, caar, cadr, cdar, cddr, caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr, caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr, map, for-each, list-tail, list-ref, last-pair, let, let*, foldl, foldr, unless, when, cond, equal?, even?, odd?, zero?, positive?, negative?, quotient, abs, <> max, min, succ, pred, gcd, lcm, member, assoc

既知の不具合

関数を受けとり、関数を返す関数が動かない。非常に痛い。

(define (one op) (lambda (y) (op y 1)))
((one +) 1)
=> error

cons の扱いが変, member の動きがあやしい

まだ無い機能

文字型(#\), vector, apply, set!, 名前付き let, letrec, delay/force, call/cc, define-syntax(defmacro, gensym はあるよ)

さて、これを使って遊ぶぞー。

Posted at 22:19 | Permalink | Category | Comments
2005-03-24

3.7 準備

ページが準備された。

いつものあれを楽しみにしている人は見ないように。

http://www.openbsd.org/37.html

扉の絵はいつも笑わせてくれるなあ。

Posted at 21:43 | Permalink | Category | Comments
2005-03-23

googlebar が google suggest 搭載

googlebar options をひさびさに開いてみると、google suggest があるではないですか。

まだ experimental だけど遊べる。わーお。

[googlebar-suggest]

[googlebar-suggest-overview]

KDE にもあるんだ。 へー。http://de.kde-apps.org/...

追記:

リアルタイム検索の後にフォーカスが戻らないんだな。これじゃあ使えん。

Posted at 22:30 | Permalink | Category | Comments
2005-03-19

unparen

EmacsWiki:UnParenMode

Pretty Lambda のときにいっしょに紹介すべきだったんだけど。

要はあれだ。括弧消しちゃう。Lisp 仙人の視点がわかるんじゃない?

こんな感じ。

[unparen]

EmacsWiki によれば、Pretty Lambda と組み合わせるのがおすすめらしい。

[unparen-Y]

どこがやねん。てかこれ何語ですか?

肝心の使い方なんだけど、.emacs に、

(autoload 'unparen-mode "unparen"
  "Make all parens invisible, unless they are quoted." t)

あとは、M-x unparen-mode で実行。バッファが読み込み専用に変更される。 トグルになってるので、戻すにはもう一回 M-x unparen-mode すべし。

気に入ったら、

(global-set-key [(super u)] 'unparen-mode)

とかすれば S-u で楽々変換……ってこんなことできてうれしいかと聞かれてもちょっと困る。

オリジナル版はコメント中に () が入ってるときに () の対応がとれなくなって止まることがあるので、 ちょっとだけ書き換え。

(defun unparen ()
  "Hide all parens and make buffer read-only."
  (goto-char (point-min))
  (while (re-search-forward "[;()]" nil t)
    (cond ((eq ?\; (char-after (match-beginning 0)))
	   (if (eq ?\\ (char-before (match-beginning 0)))
	       (goto-char (+ (match-beginning 0) 1))
	       (forward-line 1)))
	  ((and (eq ?' (char-before (match-beginning 0)))
		(eq ?\( (char-after (match-beginning 0))))
	   (progn
	     (goto-char (match-beginning 0))
	     (forward-sexp)))
	  (t
	   (put-text-property (match-beginning 0)
			       (match-end 0)
			       'invisible
			       'unparen))))
  (toggle-read-only 1))

弱点は、可変個引数を取る手続きを一行に複数書くと破綻することか。 いい例がすぐに思いつかないけど、

(map (lambda (m n) (cons m n)) '(1 2 3) '(4 5 6))

を unparen すると、

map lambda m n cons m n '(1 2 3) '(4 5 6)

になっちゃうので lambda の引数はどこまであるのかわからなくなる、とか。 一応 mic-paren-mode が効くんだけど、カーソル持っていかないとだめだから、ちょっとアレ。

Posted at 11:43 | Permalink | Category | Comments
2005-03-18

角を丸くする

http://pro.html.it/esempio/nifty/

via: http://dkiroku.com/2005-03-16-10.html

CSS3 に border-radius っていうのが入る予定。 mozilla なら独自に -moz-border-radius というのが使えるので両方指定しておくといいかも。

試しにやってみた。

[border-radius]

あまり似合わないな。

Posted at 13:15 | Permalink | Category | Comments

disable-output-escaping="yes"

http://sonic64.hp.infoseek.co.jp/...

disable-output-escaping="yes" が mozilla にはないんだけどー。みたいなお話。 bugzilla 参照。

とりあえず、#11 の W3C の部分を訳してみた。

An XSLT processor will only be able to disable output escaping if it controls how the result tree is output. This may not always be the case. For example, the result tree may be used as the source tree for another XSLT transformation instead of being output. An XSLT processor is not required to support disabling output escaping. If an xsl:value-of or xsl:text specifies that output escaping should be disabled and the XSLT processor does not support this, the XSLT processor may signal an error; if it does not signal an error, it must recover by not disabling output escaping.

抄訳

処理済みのツリーをどのように出力するかを XSLT プロセッサが制御するの場合にのみ、 出力のエスケープは無効にできる。 これは常に成立するものではない。 例えば、処理済みのツリーは他の XSLT 変換器が代わりとなって出力をするために、 ソースツリーとして利用するかもしれない。 出力のエスケープ無効化のサポートは XSLT プロセッサにとって必須ではない。 もし、xsl:value-of または xsl:text が出力のエスケープ無効化を指定してあり、 かつ、XSLT プロセッサが出力のエスケープ無効化をサポートしないのであれば、 XSLT プロセッサはエラーシグナルを発生させるだろう; エラーシグナルを発生させないのであれば、出力のエスケープを無効化せずに復帰すべきである。

あ、日本語訳あったのねorz

こういうことはサーバ側でやれ、という主張なのかなあ。

代替案としては上のリンクにあるように、innerHTML をいじればいいのだろうか。

      ...
      </head>
      <script type="text/javascript">
        function onload_cb() {
            var elements = document.getElementsByTagName('div');
            for (var i = 0; i &lt; elements.length; i++) {
                var el = elements[i];
                if (el.className == 'description') {
		    el.innerHTML = el.textContent;
                }
            }
        }
      </script>
      <body>
	<xsl:if test="system-property('xsl:vendor')='Transformiix'">
	  <xsl:attribute name="onload">onload_cb()</xsl:attribute>
	</xsl:if>
	<div class='description'>
	  <xsl:value-of select="content:encoded" disable-output-escaping="yes"/>
	</div>
	</p>
      ....

みたいにしてみたけど、innerHTML に代入するところで例外吐いて死ぬ。ううむ。

Posted at 12:28 | Permalink | Category | Comments
2005-03-17

hsp-mode.el 0.1

いやはや何年(5 年以上?)もバージョン 0.0 のまま放置プレイしてました。 とりあえずやっつけで 0.1 リリース。

http://quasiquote.org/files/hsp-mode.el

こんなかんじ。

[hsp-mode]

http://www9.plala.or.jp/...で紹介されていて、びっくり。 私以外に使っている人がいるとは。

ただ,行末に;をつけようとするとなんか微妙におかしな挙動をしてくれるのが難点.

これは仕様です。 ';' 1 回で行末、2 回で前の行、3 回で前の行頭にコメントを書くことを強制するためです。 これは元になっている asm-mode といっしょ。

リアルタイムに色付けされないのは、hilit19 を使ってたからです。 今度のは font-lock に変更したので大丈夫。

ヘルプがブラウズできないのは HSP のバージョンにより、ヘルプファイルの名前が変わるからだと思います。 とりあえず、このバージョンでは hsp261 に合わせておきました。

それとも C-c ? がバインドされてないのかしら。M-x describe-bindings を見てみないとわからないなあ。

Posted at 17:57 | Permalink | Category | Comments
2005-03-14

S-expression->JavaScript

http://hirofummy.net/...

はやっ。

ふじさわさんのところでうだうだやっている間に先を越されてしまった。 ちょとくやしい。

Posted at 23:38 | Permalink | Category | Comments
2005-03-13

Perl のコードを読むのが嫌になる理由

判明。

http://marc.theaimsgroup.com/...

思わず膝を叩いてしまった。

比較している言語が awk ってのも笑えない。

今後、悪口に使わせてもらおう。

Posted at 05:55 | Permalink | Category | Comments
2005-03-12

リリースしないと試してくれない

http://cgi.netlaputa.ne.jp/...

う。痛い話。

といっても、利用しかしないユーザなんてそんなもんかもしれず。 新しい機能なんでどうでもよくって、安定していればいい。 リリース版だからってそういうわけでもないのにね(Netscape 6 を見よ)。

こういう人にバグ出しさせるには、http://www.tlug.jp/...にあるように、

はやめのリリース、しょっちゅうリリース

しかないのかな。

よーし、こうなったらパパ、毎日リリースしちゃうぞー。

Posted at 23:45 | Permalink | Category | Comments
2005-03-11

ajax ねた

もうちょっと考えてみる。

これ、

サーバーでS式を吐き出してクライアントで評価

via: http://nnri.dip.jp/...

を実現するにはどうすればいいだろうか。

cl-ajax でやるなら、javascript による Common Lisp インタプリタが必要だな。 でもこれをやるには Common Lisp の仕様がちょっとでかすぎる。

とりあえず、jscm で手を打とう。 lisp じゃなくて scheme インタプリタだけど scheme のほとんどの機能がある (defmacro まである!末尾再帰の最適化や多値、call/cc はさすがにないけど)。

あとは sxml……はでかすぎるので、 text.html-lite をどうにか動かせるようにして、 DOM バインドを書くってのはどうよ? あとは sxpath みたいなのをだましだまし実装する、と。

って、こうなったらサーバは Gauche で書けばいいじゃん。 cl-ajax ってば SBCL のインストール面倒だし、こっちの方法でやってみるか。

Posted at 23:51 | Permalink | Category | Comments
2005-03-08

cl-ajax

http://www.holygoat.co.uk/...

via: http://lemonodor.com/archives/001087.html

やっぱりそうこなくっちゃ。 ただ、私にゃ使いみちが思いつかないけどね:)

Lisp でやる利点ってなんだろう。

サーバーでS式を吐き出してクライアントで評価

via: http://nnri.dip.jp/...

してみる?

Posted at 10:15 | Permalink | Category | Comments

QEMU

OpenBSD の ports に入ったので試してみた。 オーディオが /dev/dsp になっているので /dev/audio に差し替え。 COPT 設定してると gcc が内部エラーで死亡。 なんやかやでインストール完了。

なかなか軽快じゃないですか。

NetBSD の i386live やら Plan9 やらを iso イメージから起動してみる。 さすがに KDE は重い。没。 Plan9 はええかんじ。起動速い。rio シンプル。acme いいねえ。 emacs でも vi でもないちょっと不思議感覚が味わえるエディタだな。クセになるかも。

メモなど:

QEMU

Plan9

Posted at 09:53 | Permalink | Category | Comments
2005-03-07

New LAND Attack

http://isc.sans.org/diary.php?date=2005-03-06

Windows XP と 2003 Server が対象らしい。

ソースとターゲットが同ポート同 IP の SYN bit の立ったパケットを送られると不安定になる、ってをいをい。

Windows XP Home Edition が無効ってのもよくわからんな。

Posted at 16:38 | Permalink | Category | Comments

OpenBSD 3.7-beta

-current のバージョンが 3.7-beta に。 今回も劇的な変更 てんこもりなので、 今から入れ替えるなら、cvs update しないで snapshot をフロッピーからインストールしなおした方がいいかも。 3.6 から次のリリースの 3.7 への入れ替えも慎重にしないといけないんだろうな。

あと、今日 src/libc/Makefile.inc に変更があった。sprintf とか使ってるとリンク時に警告が出るようになった。__warn_references() なんてあるんだ。へー。

まあ、バグ出しにいいんじゃないの。

少なくとも私は sprintf を間違いなく使いこなす自信はないなあ。 それにしても OpenBSD の CAVEATS はおもしろい(sprintf ならこんな感じ)。

Posted at 13:21 | Permalink | Category | Comments
2005-03-04

hashcash - DOS ベースのアンチスパム技術

世の中にはいろんな人たちがいる。 その中でも、あなたにとってコミュニケーションをとる価値のある人と、 あなたの意思に関わりなくメッセージを読ませたがる人がいるのではないかと思う。

もちろん、あなたが必要としているのは前者であって、後者ではない。

それを振り分ける技術が、 メールだったらホワイトリスト/ブラックリストだったりベイジアンフィルタだったりするわけだ。

でも、こういった技術はかなり広汎に試されているので、ここで説明するのは置いておいて、 今回はもう少し変わり種の手法である hashcash を紹介しよう。

ここで、突然ちょっとした数学の話になる。 まあそんなに難しくはないので、最後までお付き合い願いたい。

ある文字列 S が与えられたとき、もうひとつの文字列 s と連結した文字列(トークン) S + s の ハッシュ値 H の 左 n bit がすべて 0 になる、そのような s はどんな文字列だろうか。

計算してみないとわからないって? そう。実際に s を 0 から順に H を計算して、 実際にそうなっているのかどうか確かめてみなければわからない。ここがミソ。

あなたがスパムメールにうんざりさせられているのなら、 この条件を満たす H のスタンプの入ったメールのみ読めばいい。 とうぜん、あなたの友人の同意も必要だけど。

久しぶりにメールのやりとりをしたいと思い立ったあなたの友人も、 毎週メッセージを替えて送ってくるスパマーも、 誰もが衝突するハッシュを発見するまで計算しなければならない。 「私と会話したいなら、ちょっとだけあなたの電力と時間をください」というのが、 hashcash なわけ。 個人の間でメッセージをやりとりするなら計算は 1 回きりだけど、 スパマーは大量にメッセージをまき散らさないといけないから、 それこそ何度も何度も違うハッシュを計算しないといけなくなる、というしかけだ。

それでは、実際どうなっているのか hashcash の公式ページからダウンロードして試してみよう。

コンパイルできただろうか? それではさっそく n = 20 で s を検索してみよう。

$ hashcash -mb20 foo
hashcash token: 1:20:050303:foo::kN687vWdyW8jUw3+:0000000000000072LM

しばらく計算した後、上のようなトークンが出力される。 実行するごとに乱数でかき混ぜるのでトークンのエントリの真ん中より右側は毎回違う値が出力されるはずだ。 ちなみに、いちばん右の 0000000000000072LM が s に相当する文字列である。

foo は他の人のトークンとぶつからないように、 実際に使用するときはユニークな文字列の方がいいだろう。 例えばメールアドレスのような。

本当にこれが正しいトークンなのか確かめてみよう。

$ echo -n "1:20:050303:foo::kN687vWdyW8jUw3+:0000000000000072LM" | \
openssl sha1
000004a5a3839d2d4e696d2ec4af01cf6340cfba

左 20 bit が 0 になっているのがわかるだろうか。

以上で原理が理解できたと思う。

次に応用なのだが、 javascript で実装してみたのがこれ。

token:
sha1:

javascript は実行速度が遅いので n = 10 である。

これを使って、 このページの くっつき BBS と連携させてみたので試していただきたい。

検索空間は 0 から 210 なので、 もしかすると衝突を発見できないかもしれない。 そのときは発見するまで計算ボタンを気が済むまで連打してほしい。

確認しておくけど、計算結果であるトークンは一回きりしか使えないことに注意。 なぜだかわかるよね? それを実現するためには毎回データベースへ使用済みトークンを登録していけばいい。

最後に、ここまで読んでくれた人への宿題。

リンク

Posted at 13:26 | Permalink | Category | Comments