Open Source WEB



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


Name:
Comment:
び: (Wed Aug 31 16:30:43 2005 )
ご存知かもしれませんが、keychain http://www.gentoo.org/proj/en/keychain/index.xml というのもあります。結構便利です。こいつがEmacsのtrampと連携する方法があるともっと幸せになれるんですが...


2005-08-30 [darcs] パッチベースの分散リビジョン管理システム

Pugs(Perl6インタープリタのHaskellによる実装)開発者は,このシステムを 見て,「Haskell使えるじゃん!」と思ったらしい.

マニュアルの翻訳を進めている向井さんによるとその特徴は,

  1. subversion なんかとは一味違う、 GNU arch と同じく分散リビジョン管理システム
    1. でも GNU arch みたいに「なんでこんなわけわからん名前のレポジトリを作らにゃならんの?」というメにあわなくて済む
    2. ちなみに分散することの利点は、個人でやっていてもいろいろある気がする。
  2. バージョンを管理しない。パッチを管理する。
    1. ゆえに特定のパッチだけリジェクトしたツリーとかも作れる(依存関係さえ満たせば)
    2. なんかパッチの理論なるものがあるらしい。
  3. ソースコードは綺麗かつ Haskell の特長を生かしているらしい。

とのこと.

--nobsun


Name:
Comment:

There is no comment.


2005-08-29 [script] インタラクティブ kill

プロセスを名前で選びだして、インタラクティブにシグナルを送信する ikillという bash スクリプトがあって便利です.詳しくは付属文書をどうぞ.

--nobsun


Name:
Comment:

There is no comment.


2005-08-26 [FYI] Lightweight Language Day & Night 2005

今年もLL祭りが開催されます(2005-08-27).

プログラムが公開されていますので,参加できない方はサイトでおたのしみ下さい.

--nobsun


Name:
Comment:
び: (Sat Aug 27 14:55:16 2005 )
FIYって...
nobsun: (Mon Aug 29 09:06:39 2005 )
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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:
shiro: (Mon Sep 5 19:42:15 2005 )
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


Name:
Comment:

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


Name:
Comment:
novice: (Tue Aug 16 19:33:56 2005 )
gosh> (cc 1000 '(523 256 13))
1
gosh> (cc 1000 '(523 356 57))
0

よしよし、と思ってつい

gosh> (cc 1000 '(532 356 25 -13))

なんてことをしてしまったら、大変なことになってしまった。

少しは考えてから実験をしよう >> 自分へ
SICP勉強中: (Tue Mar 9 15:52:32 2010 )
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


Name:
Comment:

There is no comment.


2005-08-12 [programmer] **プログラマのレベル10

今日は記事の紹介だけ.とても面白いのでぜひ読んでみてください.まだまだ, いろいろな言語で増えてきそうだね.

Scheme はループが書けないからレベル三くらいかなぁ.

--nobsun


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:
nobsun: (Wed Aug 10 06:05:25 2005 )
最後の例は、comment out じゃないからね。使い方まちがえないようにね。
shibata: (Wed Aug 10 11:07:17 2005 )
(and #f if (eq? (queue-front wq) w)
    (de…
くるしい
shiro: (Thu Aug 11 04:57:17 2005 )
C-M-Space M-x comme TAB RETURN
cut-sea: (Thu Aug 11 13:54:00 2005 )
セマンティクスコメントアウトとでも名付けましょーか?


2005-08-09 [Gauche] 一発芸(その二)

ふにゃふにゃのネタですが。

(define ;゜Д゜
  (lambda ()
      (lambda ()
            (lambda ()
                (lambda ()
                          (print "ガクガク"))))))

さすがはgoshは日本語がお上手 (汗も全角なんで注意してね)

gosh> ;゜Д゜
#<closure (;゜Д゜)>
gosh> (;゜Д゜)
#<closure (;゜Д゜ ;゜Д゜)>
gosh> ((;゜Д゜))
#<closure (;゜Д゜ ;゜Д゜ ;゜Д゜)>
gosh> (((;゜Д゜)))
#<closure (;゜Д゜ ;゜Д゜ ;゜Д゜ ;゜Д゜)>
gosh> ((((;゜Д゜))))
ガクガク
#<undef>

自分で自分にあきれてきた。

--cut-sea


Name:
Comment:
び: (Tue Aug 9 12:44:44 2005 )
ワロタ。宴会用一発芸に使わせていただきます(ってどんな宴会だよ)。
cut-sea: (Thu Aug 11 12:20:47 2005 )
笑ってもらえればほんもーです(^^)


2005-08-08 [Gauche] 一発芸(その一)

なんだこりゃ?

>(define (mistake 1 2 arg)
   (+ 1 2 arg))
> (mistake 3 5 7)
10

コメントかなんかに使えないかと協議したんだが募集すっか?

--cut-sea


Name:
Comment:
shiro: (Mon Aug 8 12:53:09 2005 )
Scheme、というよりGauche特有の話ですなぁ。
単にチェックをさぼってるだけです。正規のSchemeプログラムじゃないですし、
Gaucheで今後も動作する保証もありませんです。
(Gaucheは、明白なエラーを検出するために実行時の
ペナルティをかけることはなるべくしない方針ではありますが)
cut-sea: (Mon Aug 8 14:04:30 2005 )
そーなんですか。
でもSTkも同じきょどーですたヨ。(^^)
shiro: (Mon Aug 8 15:09:01 2005 )
「実装=仕様」な言語でない限り、「ある実装でこう動いた」というのと
「言語としてこうである」というのは区別しとかないとまずいっすね。
特にSchemeは「エラー」に関して実装の裁量を大幅に認めているので。
nobsun: (Tue Aug 9 05:26:24 2005 )
Scheme -> Gauche
cut-sea: (Tue Aug 9 10:01:42 2005 )
scheme = Gauche (^^;
ちなみに一年くらい前からGoogleでschemeのI'm feeling lukyは
Practical schemeってことでgaucheがschemeを越えた(無理有り結論)


2005-08-05 [debian] インストール時に入れ忘れてた...

Debian 3.1でインストール時にデスクトップ環境とか入れ忘れてた... そんなときはこれでもう1回人生やり直せます(^_^)

# tasksel

--masq


Name:
Comment:

There is no comment.


2005-08-04 [debian] 日本語環境を使いたい

Debian 3.1でデスクトップ環境を入れても漢字が使えない(-_-u... そこでこんな素敵なコマンド。

$ user-ja-conf

なぜかktermが起動してしまうが、まぁそれは置いといて...

kinput2が入っていないときは、以下も忘れずに。

# apt-get install kinput2-canna

--masq


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:

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


Name:
Comment:
y.hanatani: (Tue Aug 2 23:26:27 2005 )
最後の三個の数字は各 3*3 の領域で 6 通りしか変化がないと思って 46656^6*6^9=103945637534048876111514866313854976 でおさえられそう.


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us