Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
- 2004: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005-08-31 [Tips] ssh-agent
- 2005-08-30 [darcs] パッチベースの分散リビジョン管理システム
- 2005-08-29 [script] インタラクティブ kill
- 2005-08-26 [FYI] Lightweight Language Day & Night 2005
- 2005-08-25 [Apache] Apache 間のSSLによる認証
- 2005-08-24 [Apache] 証明書内容によるクライアント認証
- 2005-08-23 [Apache] クライアント証明書認証するための設定
- 2005-08-22 [Apache] クライアント証明書の作成
- 2005-08-19 [Apache] SSLサーバ証明書
- 2005-08-18 [Apache] リバースプロキシ上で BASIC 認証
- 2005-08-17 [Apache] リバースプロキシ
- 2005-08-16 [quiz] 両替問題
- 2005-08-15 [fix] 最小不動点
- 2005-08-12 [programmer] **プログラマのレベル10
- 2005-08-11 [Haskell] 一発芸(その二)のパクリ
- 2005-08-10 [Gauche] 一発芸(その三)
- 2005-08-09 [Gauche] 一発芸(その二)
- 2005-08-08 [Gauche] 一発芸(その一)
- 2005-08-05 [debian] インストール時に入れ忘れてた...
- 2005-08-04 [debian] 日本語環境を使いたい
- 2005-08-03 [Scheme] 幽霊カウンタ(続)
- 2005-08-02 [misc] 数独パターンのプリティプリント
- 2005-08-01 [sudoku] 数独の解パターン
2005-08-31 [Tips] ssh-agent
sshを使うたびにパスフレーズを入力するのが面倒なら,shell を ssh-agent で 起動して,ssh-add で秘密鍵を登録してしまえば,その端末からは以後 ssh パスフレーズを入力しなくても済む.でもね.X Window System を使っている ときには,端末を幾つも開くし...たんびに ssh-agent zsh ってやるのも 面倒.そんな貴方に(儂のことか^^;),gnome-session を使っているなら, $HOME/.xsession に
ssh-agent gnome-session
と書いておこう.
--nobsun
2005-08-30 [darcs] パッチベースの分散リビジョン管理システム
Pugs(Perl6インタープリタのHaskellによる実装)開発者は,このシステムを 見て,「Haskell使えるじゃん!」と思ったらしい.
マニュアルの翻訳を進めている向井さんによるとその特徴は,
- subversion なんかとは一味違う、 GNU arch と同じく分散リビジョン管理システム
- でも GNU arch みたいに「なんでこんなわけわからん名前のレポジトリを作らにゃならんの?」というメにあわなくて済む
- ちなみに分散することの利点は、個人でやっていてもいろいろある気がする。
- バージョンを管理しない。パッチを管理する。
- ゆえに特定のパッチだけリジェクトしたツリーとかも作れる(依存関係さえ満たせば)
- なんかパッチの理論なるものがあるらしい。
- ソースコードは綺麗かつ Haskell の特長を生かしているらしい。
とのこと.
- 開発サイト http://www.abridgegame.org/darcs/
- マニュアル(翻訳(進行中)版) http://www.city5.org/darcs/
--nobsun
There is no comment.
2005-08-29 [script] インタラクティブ kill
プロセスを名前で選びだして、インタラクティブにシグナルを送信する ikillという bash スクリプトがあって便利です.詳しくは付属文書をどうぞ.
--nobsun
There is no comment.
2005-08-26 [FYI] Lightweight Language Day & Night 2005
今年もLL祭りが開催されます(2005-08-27).
プログラムが公開されていますので,参加できない方はサイトでおたのしみ下さい.
--nobsun
FIYって...
F(ukai wakega arundakara) I(jimecha) Y(aayo) ちょっと苦しい。ゴメンなさい。typoです。
2005-08-25 [Apache] Apache 間のSSLによる認証
リバースプロキシをしているApacheを証明書によるクライアント認証する. これにはサーバ側では SSLクライアント認証を行う設定し, リバースプロキシ側では,
SSLProxyEngine on SSLProxyCACertificateFile /etc/apache2/conf/ssl.crt/ca.crt SSLProxyMachineCertificateFile /etc/apache2/conf/ssl.crt/proxy-key.crt
ここで,proxy-key.crt は PEMフォーマットのリバースプロキシ証明書と PEMフォーマットのリバースプロキシ秘密鍵を連結したもので, 秘密鍵は暗号されていないもの.
インターネットからは孤立した実験環境での設定の話だからね.
--nobsun
There is no comment.
2005-08-24 [Apache] 証明書内容によるクライアント認証
クライアント証明書認証は,証明書が 所定の認証局CA(この場合オレオレ認証局)によって署名された証明書の 持主であることを確認する.しかし,誰かを確認しているわけではない. ただし,ssl.conf に設定することで,証明書のSubjectによって, Basic認証を行うことができる.
SSLOptions +FakeBasicAuth
このとき,パスワードファイル( .htpasswd )ファイルには,
/C=JP/ST=Tokyo/L=Shinjuku/O=Mumumu/OU=Huhuhu/CN=JohnDoe/emailAddress=john@example.org:xxj31ZMTZzkVA
のようなエントリがはいる.このエントリ部分のうち,「:」より後の部分 すなわちパスワードのフィールドは通常「xxj31ZMTZzkVA」にする(何故かは, ドキュメントに書いてあるので必ず読んでね). 「:」より前の部分は, クライアント証明書にあるSubjectの部分を正確に写すこと.クライアント 証明書 john.crt のこの部分を確認するには,openssl コマンドを使う.
% openssl x509 -noout -subject -in john.crt subject= /C=JP/ST=Tokyo/L=Shinjuku/O=Mumumu/OU=Huhuhu/CN=JohnDoe/emailAddress=john@example.org
インターネットからは孤立した実験環境での設定の話だからね.
とはいえ,古いバージョンのものには,このオプションにセキュリティホールが あったらしいので,Apache のバージョンは最新のものにすること.
--nobsun
There is no comment.
2005-08-23 [Apache] クライアント証明書認証するための設定
オレオレ認証局で署名したクライアント証明書による認証を行うには, $ServerRoot/conf.d/ssl.conf の以下のディレクティブを設定する.
SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificateFile で指定するのは,オレオレ認証局の証明書ファイルで ある.
あくまで,閉じられた実験環境のなかでの話だからね.
--nobsun
There is no comment.
2005-08-22 [Apache] クライアント証明書の作成
SSLでブラウザ側のサーバ証明書認証だけじゃなくて,サーバ側で クライアント証明書認証をすることもできる.まずはクライアント証明書の作成から
あくまでも,閉じた環境での実験用だからね.
先週作ったオレオレCA局を使って クライアント証明書を作る.
- 鍵の生成
- 証明書発行要求作成
- 証明書作成
- 証明書をブラウザにインポート
% openssl genrsa -out client.key 1024 % openssl req -new -key client.key -out client.csr % openssl ca -config ca.config -out client.crt -infiles client.csr % cat client.key client.crt | openssl pkcs12 -export -out client.p12 -name "My Certificate"
最後にできた client.p12 をブラウザにインポートする.
--nobsun
There is no comment.
2005-08-19 [Apache] SSLサーバ証明書
Apacheで使うSSLサーバ証明書は本来ちゃんとした認証局CAから取得したもの を使うべきなんだけど.Webアプリケーションの開発中に隔離したミニ環境で 実験したりするだけなんで,オレオレCAでいく.
以下はたんなるメモだからね.こうすれば実験には使える気がしたので, 筆者が次に自分でやるとき用の備忘録なんだからね.
まず,認証局CA用の鍵 ca.key を作る.
% openssl genrsa -out ca.key 1024 Generating RSA private key, 1024 bit long modulus ......++++++ ....++++++ e is 65537 (0x10001)
次に CA自身の証明書 ca.crt を作る
% openssl req -new -x509 -key ca.key -out ca.crt
いろいろ聞かれるので,それに「てきとう」に答えて,ca.crt できあがり.
次はCAの設定ファイル ca.config を作る.本当は,openssl.cnf をちゃんと 読んで理解してからやるのが正しいけど,「てきとう」にアレンジして
[ ca ] default_ca = CA_default [ CA_default ] dir = . certs = $dir new_certs_dir = $dir/certs database = $dir/index serial = $dir/serial RANDFILE = $dir/rand certificate = $dir/ca.crt private_key = $dir/ca.key default_days = 365 default_crl_days = 365 default_md = md5 preserve = no policy = policy_anything [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional
てな感じ.ついでに database, serial, new_certs_dir をつくっておく
% touch index % echo '01' > serial % mkdir certs
これで,オレオレCAができた.
サーバの証明書は
- 鍵の生成
- 証明書発行要求作成
- 証明書作成 をやればいい.
% openssl genrsa -out server.key 1024 % openssl req -new -key server.key -out server.csr % openssl ca -config ca.config -out server.crt -infiles server.csr
いろいろ聞かれるのに「てきとう」に答えれば,とりあえずできあがり.
% openssl verify -CAfile ca.crt server.crt server.crt: OK
こんなもんか?
--nobsun
There is no comment.
2005-08-18 [Apache] リバースプロキシ上で BASIC 認証
昨日の設定の <IfModule mod_proxy.c></IfModule>セクションに以下を付け加える. .htpasswd ファイルを用意するのを忘れないように.
<Proxy *>
AuthName SecretServer
AuthType Basic
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Proxy>
--nobsun
gdb <process-id> でコマンドラインから直接attachすることもできます。
2005-08-17 [Apache] リバースプロキシ
Webサイトを公開するとき,本体は直接見えないところに隠しておいて, 別の入口を設けたい場合がある.
+------+ +------+ +------+ | 本体 | <----> | 入口 | <----> |client| +------+ +------+ +------+
クライアント側は入口を本体だと思ってアクセスする.入口サーバは 裏で本体サーバと通信して,クライアントにサービスを提供する. このような入口サーバのことをリバースプロキシというらしい.
Apache 2 での設定は単純で,httpd.conf で
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
があることを確認して
<IfModule mod_proxy.c></IfModule> のセクションに
ProxyRequests Off ProxyPass / http://hontai.example.org/ ProxyPassReverse / http://hontai.example.org/
のように設定する.
--nobsun
There is no comment.
2005-08-16 [quiz] 両替問題
1000円札を,500円,100円,50円,10円硬貨で両替する方法は何通りあるか
これは,##(link2sicp "book-Z-H-11.html#%_sec_1.2.2" "SICPの1.2.2節") にある問題を日本の通貨にアレンジしたものです. ##(link2sicp "book-Z-H-15.html#%_thm_2.19" "Exercise 2.19")にも 登場しています.この練習問題では,以下のように両替する貨幣の種類を 与えられるように一般化されています.
(define (cc amount coin-values)
(cond ((= amount 0) 1)
((or (< amount 0) (no-more? coin-values)) 0)
(else
(+ (cc amount
(except-first-denomination coin-values))
(cc (- amount
(first-denomination coin-values))
coin-values)))))
(define first-denomination car)
(define except-first-denomination cdr)
(define no-more? null?)
これを使うと,問題は
gosh> (cc 1000 '(500 100 50 10)) 158
となります.今度は 5円硬貨も追加してみましょう.
gosh> (cc 1000 '(500 100 50 10 5)) 4905
増えましたねぇ.じゃぁ 1円硬貨も追加すると
gosh> (cc 1000 '(500 100 50 10 5 1)) 248908
かなり待たされる感じですね. 5000円札,2000円札,1000円札を追加して,10000円札の 両替を考えるとなると,上のプログラムではちょっと効率が 悪くて難しいですね.
Quiz: もっと効率のよいプログラムを考えてください.
--nobsun
gosh> (cc 1000 '(523 256 13)) 1 gosh> (cc 1000 '(523 356 57)) 0 よしよし、と思ってつい gosh> (cc 1000 '(532 356 25 -13)) なんてことをしてしまったら、大変なことになってしまった。 少しは考えてから実験をしよう >> 自分へ
24597373438 Cだと一秒
2005-08-15 [fix] 最小不動点
これはパズルだね.
fix f = let x = f x in x
こんな変なもの何につかうかって?
gfun = (fix .) . (.)
という,もうひとつ変なのを定義しておく. そして,
fibF :: (Num a, Num b) => (a -> b) -> (a -> b) fibF f 0 = 0 fibF f 1 = 1 fibF f n = f (n-2) + f (n-1)
この定義は fibonacci 関数の素なんだ. この定義は再帰的ではないんだけど,
fib = gfun ($) fibF
とやると,ちゃんと fibnacci 関数が定義できてしまうんだ.
*Main> fib 5 5 *Main> fib 10 55 *Main> fib 20 6765
ほらね. でも,一体,何が起ってるんだろうね.(^^;)
--nobsun
There is no comment.
2005-08-12 [programmer] **プログラマのレベル10
今日は記事の紹介だけ.とても面白いのでぜひ読んでみてください.まだまだ, いろいろな言語で増えてきそうだね.
Scheme はループが書けないからレベル三くらいかなぁ.
--nobsun
There is no comment.
2005-08-11 [Haskell] 一発芸(その二)のパクリ
Haskell じゃ,2005-08-10 一発芸(その二) みたいなことでけへんやろ!ってか.
まぁ.いまのところ日本語を識別子にはでけへんから,こんなんでどう.
type GakuGakuBuruBuru = String -> GakuGakuBuru
type GakuGakuBuru = String -> GakuGaku
type GakuGaku = String -> Gaku
type Gaku = String -> IO ()
gaku = ";゜Д゜"
buru x = "("++ x ++")"
buruburu = iterate buru gaku
instance Show GakuGakuBuruBuru where
show ggbb = buruburu !! 0
instance Show GakuGakuBuru where
show ggb = buruburu !! 1
instance Show GakuGaku where
show gg = buruburu !! 2
instance Show Gaku where
show g = buruburu !! 3
ggbb :: GakuGakuBuruBuru
ggbb _ _ _ _ = putStrLn (buruburu !! 4 ++ "ガクガクブルブル")
でもって,
*Main> :load gakugaku.hs Compiling Main ( gakugaku.hs, interpreted ) Ok, modules loaded: Main. *Main> (ggbb) ;゜Д゜ *Main> (ggbb "おら") (;゜Д゜) *Main> ((ggbb "おら") "おら") ((;゜Д゜)) *Main> (((ggbb "おら") "おら") "おら") (((;゜Д゜))) *Main> ((((ggbb "おら") "おら") "おら") "おら") ((((;゜Д゜))))ガクガクブルブル
ってのはどう?
--nobsun
There is no comment.
2005-08-10 [Gauche] 一発芸(その三)
;; collect finish processes
(and-let* ((wq (workers-of self))
((not (null? wq)))
(p (process-wait-any #t))
(w (find (lambda (w) (eq? (worker-process-of w) p))
(queue->list wq))))
;; avoid a bug in Gauche 0.7.2
(if (eq? (queue-front wq) w)
(dequeue! wq)
(remove-from-queue! (cut eq? w <>) wq))
(if (and (kahua-auto-restart)
(not (zombee? w))
(> (- (sys-time) (start-time-of w)) 60))
さて、ここで avoid a bug in ...の直後にある if式をコメントアウトしたいとする。
;; avoid a bug in Gauche 0.7.2 ; (if (eq? (queue-front wq) w) ; (dequeue! wq) ; (remove-from-queue! (cut eq? w <>) wq))
伝統的に使えるセミコロンを使うのも面倒だけど。
;; avoid a bug in Gauche 0.7.2
#|(if (eq? (queue-front wq) w)
(dequeue! wq)
(remove-from-queue! (cut eq? w <>) wq))
|#
これもすでに面倒になってきたあなた。
;; avoid a bug in Gauche 0.7.2
#;(if (eq? (queue-front wq) w)
(dequeue! wq)
(remove-from-queue! (cut eq? w <>) wq))
gaucheではこんなのもサポートされてます。srfi-62のS-exp commentね。 正確にはまだサポートって言っちゃいけないかもしれないけど。
さらに一発芸がこれ。
;; avoid a bug in Gauche 0.7.2
'(if (eq? (queue-front wq) w)
(dequeue! wq)
(remove-from-queue! (cut eq? w <>) wq))
クォートで乱暴に。。。(w
--cut-sea
最後の例は、comment out じゃないからね。使い方まちがえないようにね。
(and #f if (eq? (queue-front wq) w)
(de…
くるしい
C-M-Space M-x comme TAB RETURN
セマンティクスコメントアウトとでも名付けましょーか?
2005-08-09 [Gauche] 一発芸(その二)
ふにゃふにゃのネタですが。
(define ;゜Д゜
(lambda ()
(lambda ()
(lambda ()
(lambda ()
(print "ガクガク"))))))
さすがはgoshは日本語がお上手 (汗も全角なんで注意してね)
gosh> ;゜Д゜ #<closure (;゜Д゜)> gosh> (;゜Д゜) #<closure (;゜Д゜ ;゜Д゜)> gosh> ((;゜Д゜)) #<closure (;゜Д゜ ;゜Д゜ ;゜Д゜)> gosh> (((;゜Д゜))) #<closure (;゜Д゜ ;゜Д゜ ;゜Д゜ ;゜Д゜)> gosh> ((((;゜Д゜)))) ガクガク #<undef>
自分で自分にあきれてきた。
--cut-sea
ワロタ。宴会用一発芸に使わせていただきます(ってどんな宴会だよ)。
笑ってもらえればほんもーです(^^)
2005-08-08 [Gauche] 一発芸(その一)
なんだこりゃ?
>(define (mistake 1 2 arg) (+ 1 2 arg)) > (mistake 3 5 7) 10
コメントかなんかに使えないかと協議したんだが募集すっか?
--cut-sea
Scheme、というよりGauche特有の話ですなぁ。 単にチェックをさぼってるだけです。正規のSchemeプログラムじゃないですし、 Gaucheで今後も動作する保証もありませんです。 (Gaucheは、明白なエラーを検出するために実行時の ペナルティをかけることはなるべくしない方針ではありますが)
そーなんですか。 でもSTkも同じきょどーですたヨ。(^^)
「実装=仕様」な言語でない限り、「ある実装でこう動いた」というのと 「言語としてこうである」というのは区別しとかないとまずいっすね。 特にSchemeは「エラー」に関して実装の裁量を大幅に認めているので。
Scheme -> Gauche
scheme = Gauche (^^; ちなみに一年くらい前からGoogleでschemeのI'm feeling lukyは Practical schemeってことでgaucheがschemeを越えた(無理有り結論)
2005-08-05 [debian] インストール時に入れ忘れてた...
Debian 3.1でインストール時にデスクトップ環境とか入れ忘れてた... そんなときはこれでもう1回人生やり直せます(^_^)
# tasksel
--masq
There is no comment.
2005-08-04 [debian] 日本語環境を使いたい
Debian 3.1でデスクトップ環境を入れても漢字が使えない(-_-u... そこでこんな素敵なコマンド。
$ user-ja-conf
なぜかktermが起動してしまうが、まぁそれは置いといて...
kinput2が入っていないときは、以下も忘れずに。
# apt-get install kinput2-canna
--masq
There is no comment.
2005-08-03 [Scheme] 幽霊カウンタ(続)
2005-05-23の幽霊カウンタに続いて、ちょっとクロージャで遊んでみた。
(define (make-obj me n)
(let1 c n
(values (lambda _ (inc! c) (format #t "~a is ~a~%" me c))
(lambda _ (dec! c) (format #t "~a is ~a~%" me c))
(lambda _ (set! c n) (format #t "~a is ~a~%" me c))
(lambda _ (format #t "~a is ~a~%" me c)))))
(define-values (a b c) (values #f #f #f))
(let ((xinc! #f)
(yinc! #f)
(xdec! #f)
(ydec! #f)
(xini! #f)
(yini! #f)
(xval #f)
(yval #f))
(set!-values (xinc! xdec! xini! xval) (make-obj 'a 10))
(set!-values (yinc! ydec! yini! yval) (make-obj 'b 10))
(set! a (lambda (msg)
(cond ((eq? msg 'inc) (xinc!) (ydec!))
((eq? msg 'dec) (xdec!))
((eq? msg 'ini) (xini!))
((eq? msg 'val) (xval))
(else (error "No such command -" msg)))))
(set! b (lambda (msg)
(cond ((eq? msg 'val) (yval))
(else (error "No such command -" msg)))))
(set! c (lambda (msg)
(cond ((eq? msg 'inc) (yinc!))
((eq? msg 'ini) (yini!))
(else (error "No such command -" msg))))))
副作用まみれで嫌な顔されそうだけど、これで遊ぶとこんな感じ。
gosh> (a 'inc) a is 11 b is 9 #<undef> gosh> (a 'inc) a is 12 b is 8 #<undef> gosh> (c 'trick) I'm trick for b b is 9 #<undef> gosh> (c 'treat) I'm treat for b b is 10 #<undef> gosh> (a 'inc) a is 13 b is 9 #<undef> gosh> (b 'val) b is 9 #<undef>
(a 'inc)などをa.incとでもみなせばOOP的に見えてきて、 bのメソッドコールはちょっと変わったアクセス制限になっている 様にみえたり、実はなぁんてこと無いように見えたり…
(以下ばっさり略…としておこう ^^;)
--cut-sea
There is no comment.
2005-08-02 [misc] 数独パターンのプリティプリント
昨日の数独のパターンをちょっとだけ解りやすく見るための工夫
import Data.List
tate = "|"
base = ["○","○","○","○","○","○","○","○","○"]
line = "------・------・------\n"
maru = "●"
every n xs = case splitAt n xs of
([],[]) -> []
(ps,qs) -> ps : every n qs
pprPat :: Int -> Int -> String
pprPat n i = concat
$ intersperse tate
$ map concat
$ every n
$ exchange (i-1) maru base
where exchange i x xs = case splitAt i xs of (ps,q:qs) -> ps++[x]++qs
pprPattern :: Int -> [Int] -> String
pprPattern n pat = concat
$ intersperse line
$ map unlines
$ every n
$ map (pprPat n) pat
testpattern :: [Int]
testpattern = [9,6,3,8,5,2,7,4,1]
実行例
*Main> putStr $ pprPattern 3 testpattern ○○○|○○○|○○● ○○○|○○●|○○○ ○○●|○○○|○○○ ------・------・------ ○○○|○○○|○●○ ○○○|○●○|○○○ ○●○|○○○|○○○ ------・------・------ ○○○|○○○|●○○ ○○○|●○○|○○○ ●○○|○○○|○○○
--nobsun
There is no comment.
2005-08-01 [sudoku] 数独の解パターン
数独で,1つの数字が 現われるパターンを計算してみよう.
bch :: Int -> [([Int],[Int])] -> [Int] -> [([Int],[Int])]
bch n uss ls
= [ (l:xs,ys)
| (xs,ys) <- uss, l <- ls
, notElem l ys && notElem (div (l-1) n) (map (flip div n . subtract 1) xs)]
blines :: Int -> [[Int]] -> [[Int]]
blines n rss = map (uncurry (++))
$ foldl (bch n) (map ((,) []) rss) (replicate n [1..n*n])
patterns n = iterate (blines n) [[]] !! n
patterns 3 で数独でのひとつの数字が現れるパターンが生成される.
*Main> head (patterns 3) [9,6,3,8,5,2,7,4,1]
これは
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ | ||||||||
| ○ |
という出現パターンを現わしている.ひとつの数字の出現パターンの数は
*Main> length (patterns 3) 46656
46656 とおり.ということは,数独の解空間の大きさは 46656^9 = 1047532535594334222593508922191671036215296 より小さい.
--nobsun
最後の三個の数字は各 3*3 の領域で 6 通りしか変化がないと思って 46656^6*6^9=103945637534048876111514866313854976 でおさえられそう.