原則匿名で公開・個人情報は送られません。必要に応じ御署名/非公開希望をお書き添え下さい。
シャドウ・オブ・ヘゲモン(上)(下)[オースン・スコット・カード、ハヤカワ文庫 ISBN:4-15-011463-3,4-15-011464-1]読了。
「エンダーのゲーム」の設定に縛られているということを差し引いても、架空歴史小説としてはあまり出来のよいものではないだろう。だがしかし、徹底して人を魅せ、徹底して人を描くというカードの語り口はやはり見事だった。
_加えて、今の僕にはとても必要な物語だった。カードの作品はこれまでも何度か僕を導いてくれた。そして今度もまた、僕に道を示してくれた。
彼のように語れるようになりたい。無謀と言われるかもしれなくとも、なりたい。
なんとなくリンクとか。
昨夜の帰り道にもう墓穴を暴くような物語を考えている自分がいた。彼女がいたときにはあまり姿を見せなかった自分だと思う。きっと彼女は、自分を壊して行くようなその自分を眠らせてくれていたのだろう。
今までもそんなことはあったが、今度は早いなと思った。きっと薬の力だろう。病のためでなく到達のために欲する人がいるのを、理解できる気がする。
_僕は自分に嘘を吐いていたのかもしれない。本当はそのことが一番大切なのに、彼女のことを一番にしようと自らを縛っていたのかもしれない。
真実はまだ闇の中だ。僕はそれを暴くために、いつか墓穴を暴きたい。
Subversionのサーバを立てろ、という命令が下されたのでへろへろ作業。
とりあえずドキュメントをざっと読んで下調べ。Subversionなサーバーの立て方は大別すると2つ。
これらを両立させることも可能なようだ。
_なんにしても、一番嬉しそうなのはApache + mod_dav_svnだろう。これで立てるとWebDAVでアクセスできるようになるからレポジトリの内容を見せるだけなら一気に敷居が低くなる。
_と、いうことでcvsサーバとして運用しているFreeBSD機にて必要なものを以下の手順にてインストール。portsは偉大だ。
# cd /usr/ports/www/apache2 # setenv WITH_BERKELEYDB db42 # make install # cd /usr/ports/devel/subversion # setenv WITH_MOD_DAV_SVN yes # setenv WITH_PYTHON yes # make install
setenvなあたりはFreeBSDの場合、/etc/make.confとか/usr/local/etc/pkgtools.confとかに書いておくと幸せになれるらしいけど、そのへんは詳しくないのでとりあえず割愛。
_次にレポジトリの作成。
とりあえずはuser:svn をvipwで追加し、group:svn も追加する。
それから以下の手順でレポジトリを作成。
# mkdir /usr/local/share/svn # svnadmin create /usr/local/share/svn # chown -R svn:svn /usr/local/share/svn # chmod -R g+w /usr/local/share/svn
あと、Apacheからレポジトリに書き込みできるように、group:svnにuser:wwwを追加しておく。
_最後にApacheの設定。以下のように設定を追加/作成。
/usr/local/etc/apache2/httpd.conf:
<IfModule mod_dav_svn.c> Include etc/apache2/svn.conf </IfModule>
/usr/local/etc/apache2/svn.conf:
<Location /svn> DAV svn SVNPath /usr/local/share/svn </Location>
_とりあえずここまででhttp経由で新規モジュールをimportできることを確認した。
単純な構築はここまでで終了。ただしこの状態ではセキュリティ的に問題ありまくりなので、セキュリティポリシー決定した上で、それを実践できるようにあれこれ設定していく必要がある。
……というあたりの作業は明日の予定。
考えるべきは運用形態ってわけで、条件をつらつら考えてみる。
_と、いうことで基本的にはHTTPのBasic認証を要求するやりかた(ドキュメントの例6.2)でよさそうだ。
だけども折角だから、というわけで例6.3のケースを使って、一応匿名アクセスも可能なように設定した。一応、オープンソースなプロジェクトを運営するときには役に立つかも、ということで。
_まずはApacheのSSL鍵を設定。googleって適当にやったらなんとかなったので割愛。
_httpsからのみアクセスできるようにするために、httpd.confからsvn.confを読み込んでるあたりを削り、同内容をssl.confに書き加えた。
それからsvn.confをいじってユーザー認証が必要なように設定。
/usr/local/etc/apache2/svn.conf:
<Location /svn> DAV svn SVNPath /usr/local/share/svn AuthzSVNAccessFile /usr/local/share/svn/authzsvn.conf Satisfy Any Require valid-user AuthType Basic AuthName "anon Subversion repository" AuthUserFile /usr/local/share/svn/htpasswd </Location> <Directory /usr/local/share/svn> SSLRequireSSL </Directory>
htpasswdの生成はお馴染のように以下のコマンドでOK。
# htpasswd -c /usr/local/share/svn/htpasswd foo
authzsvn.confはmod_svn_authz用のコンフィグファイル。これはドキュメント見ながら手書き。
/usr/local/share/svn/authzsvn.conf:
[groups] internal = foo, bar [/] @internal=r [/testproject] foo=rw
_ユーザーを追加するときは、htpasswdにユーザーを追加してから、authzsvn.confで適切な権限を付与する。グループ設定をちゃんと使えば、(面倒だけど)かなり柔軟に管理できそうだ。このへんはcvsに比べて強化されているのかな。
_後はバックアップの設定が必要なところ。これは来週送りかな。
起きてからいきなり電話をして、渡したいものを携えて押しかけた。
残り物と恐縮されながらお昼を御馳走になって、遺影の側に飾ってあるそれらのことや彼女の残した言葉をまとめることについて話して、それから彼女の最後の言葉を見させてもらった。
_読んで、思う。僕は、僕が思っていたよりもずっと想われていたのではないかと。それでも彼を真っ先に想っていたから、彼女は裂かれたのしれないと。
僕は、彼女を救おうとする鳥だったのだろうか。それとも、彼女を旅立ちへと誘った蛇だったのだろうか。
訪問の後、progressiveの面子と行った。
こんなふうにアニメーションを作れるのは、おそらく押井守だけだろう。アニメーションの監督というのはおおよそアニメーションそのものに愛着を持つものだが、この映画における押井守にはそれがないな、と感じた。映画はカッティングで全てが決まるとは、誰の言葉だったか。ともかく、押井守の「映画監督としての」才能を改めて確認できる映画だった。
_新海誠あたりとリンクさせて語るとよいのか、などと思ったりもした。
httpd.confで多段にIncludeとかを駆使して、プロジェクト毎にWebDAVによるファイルスペースと影舞によるバグトラックシステムを立てて適当に権限管理できるようにする。あとはSubversionのレポジトリに適当にエイリアスを張ってWikiあたりを追加すると完璧なのか?
_っていうか、もはやSourceForgeとかの域に達しつつあるという気もする。
心療内科(神経科?)二度目。
リタリンを勝手に減らしたり飲まなかったりしていたのに関しては、むしろそれが正しいという御墨付を頂いた。鬱っぽい状態からは脱しているし、減らした分で手元にいくらか余りが残っているので、今回はリタリンは不要と告げる。
_残る二つ、ソラナックスとアナフラニールについては服用を続けることになった。アナフラニールは少々効き目が強くて眠くなるようなので、少々相談。パニック障害に対しては2つの組み合わせ基本的治療法だということを考慮して、一日の服用量を減らす方向で行くことにした。
と、いうことで「シートのままで適当に薬を出すから適当に様子見ながら(自分で)調整しつつ飲め」という信用されてるんだか投げ出されてるんだかという指示を受ける。こんなふうに信用を見せることで信用させるのも、治療の上でのテクニックなんだろうなあ、と思いながら診察室を出て、薬を受け取った。
_そろそろ様子を見ながら自転車通勤を再開する頃合かもしれない。
原因はDBIモジュールとEncodeモジュールの相性(?)だったらしい。
結論:SQL Injectionを防ぐだけでなく、文字コード問題を回避するためにも$dbh->doではなくてprepareしてからexecuteしましょー。
システムで使うhtpasswdファイルとhtgroupファイルを単一にまとめた上で、登録済ユーザーが自分のパスワードを変更できるCGIをhttps経由でのみアクセスできるところに置いて、とりあえずの設置作業は完了。
グループ管理とか、グループ権限設定とか、管理者がコマンドラインでこなさなきゃならない業務があれこれ残っているけど、そのへんは(俺が)面倒になったらなにか作られるのであろう、きっと。
プロジェクターとしてTLP-S10(J)を購入したのでそれに合わせて模様替え。壁沿いの本棚列に置いていたテレビ台が、列から少し出っぱっていたのでこれをカラーBOXに置換して出っぱりを消す。で、テレビ台に使っていた台は窓際に置いてプロジェクター台兼日用品置場に。
_スクリーン、はとりあえずまともなものを用意せず、いいかげんに買ってきた白シーツを突っ張り棒から吊すという手抜きな方針で解決。これで適正サイズを見極めておいて、そのうち気が向いたらちゃんとしたのを買う予定。
_ビデオデッキからの接続を確保する必要があるかなー、とか思いながら、今日はPS2で遊んでおしまい。
死に向かい合うことができなくなったから、筆を置いたと彼は言っていた。
僕は彼女を愛しているが、彼女のことがわからないままでいる。彼女が世界から去ったことの意味や理由を求めて墓穴を堀り返すたび、僕はきっと違う答えを手に入れる。――であるならば、僕はその墓穴をきっと何度も堀返すのだ。それでも彼女を愛し続ける道として、きっと僕はそんな非道な方法を、選ぶ。
夕方ごろに頓服を1/2錠。
結局こんな感じの設定になった:
/usr/local/projects/mkproject.pl
#!/usr/bin/perl unless(@ARGV[0]){ help(); exit; } $BASE = "/usr/local/projects"; $project = $ARGV[0]; @files = qw(httpd.conf ssl.conf kagemai/html/kagemai.conf); system("cp -R $BASE/.template $BASE/$project"); system("chown -R www:www $BASE/$project"); foreach $file(@files){ my $content; open(FILE,"$BASE/$project/$file"); while(<FILE>){ s/sample/$project/g; $content .= $_; } close(FILE); open(FILE,"> $BASE/$project/$file"); print FILE $content; close(FILE); } open(FILE,">> $BASE/project_httpd.conf"); print FILE "Include www/project/$project/httpd.conf\n"; close(FILE); open(FILE,">> $BASE/project_ssl.conf"); print FILE "Include www/project/$project/ssl.conf\n"; close(FILE); open(FILE,">> /usr/local/www/authfiles/htgroup.system"); print FILE "$project:\n"; print FILE $project."_admin:\n"; close(FILE); print "please restart apache2 as 'apachectl restart'\n"; exit; sub help{ print "usage: ./mkproject.pl new_project_name\n"; }
/usr/local/projects/project_httpd.conf:
Include www/project/sample/httpd.conf
/usr/local/projects/project_ssl.conf:
Include www/project/sample/ssl.conf
ls -l .template/
total 8 drwxr-xr-x 2 root wheel 512 Mar 23 18:59 dav -rw-r--r-- 1 root wheel 774 Mar 23 18:59 httpd.conf drwxr-xr-x 8 root wheel 512 Mar 23 18:59 kagemai -rw-r--r-- 1 root wheel 970 Mar 23 18:59 ssl.conf
.template/httpd.conf:
# DAV Alias /project/sample/dav /usr/local/www/project/sample/dav <IfModule mod_dav.c> <Location /project/sample/dav> DAV On order deny,allow allow from gateway.from.private.example.net deny from all </Location> </IfModule> # kagemai Alias /project/sample/kagemai /usr/local/www/project/sample/kagemai/html <Directory "/usr/local/www/project/sample/kagemai/html"> Options +ExecCGI AddHandler cgi-script .cgi AuthName "auth" AuthType Basic AuthUserFile /usr/local/www/authfiles/htpasswd.system AuthGroupFile /usr/local/www/authfiles/htgroup.system <Files "*.conf*"> deny from all </Files> <Files user.cgi> Require group sample </Files> <Files admin.cgi> Require group sample_admin </Files> </Directory>
.template/ssl.conf:
# DAV Alias /project/sample/dav /usr/local/www/project/sample/dav <IfModule mod_dav.c> <Location /project/sample/dav> DAV On require group sample AuthName "auth" AuthType Basic AuthUserFile /usr/local/www/authfiles/htpasswd.system AuthGroupFile /usr/local/www/authfiles/htgroup.system Satisfy any order deny,allow allow from gateway.from.private.example.net deny from all </Location> </IfModule> # kagemai Alias /project/sample/kagemai /usr/local/www/project/sample/kagemai/html <Directory "/usr/local/www/project/sample/kagemai/html"> Options +ExecCGI AddHandler cgi-script .cgi AuthName "auth" AuthType Basic AuthUserFile /usr/local/www/authfiles/htpasswd.system AuthGroupFile /usr/local/www/authfiles/htgroup.system <Files "*.conf*"> deny from all </Files> <Files user.cgi> Require group sample </Files> <Files admin.cgi> Require group sample_admin </Files> </Directory>
あとはhttpd.confから /usr/local/projects/project_httpd.conf を、 ssl.confから /usr/local/projects/project_ssl.conf をIncludeするようにして完了。
ユーザーが自分でhtpasswdのパスワードを変更できるようにいいかげんなCGIを書いてhttps + Basic認証が必要な場所に場所に設置した。ユーザーを追加するときはいいかげんな初期パスワードを設定して
#!/usr/bin/perl require 'jcode.pl'; print "Content-type: text/html; charset=euc-jp\r\n"; print "\r\n"; $htpasswd = "/usr/local/sbin/htpasswd"; $passwdfile = "/usr/local/www/authfiles/htpasswd.system"; unless($ENV{REMOTE_USER}){ wrong_access(); exit; } $user = $ENV{REMOTE_USER}; %cgi = getQuery(); if($cgi{pass} && $cgi{conf}){ change_passwd(); }else{ input_passwd(); } exit; sub input_passwd{ my($warn) = shift; print "<html><head><title>Change Password</title></head>\n"; print "<body>\n"; if($warn){ print "<p>$warn</p>"; } print "<form method='post'>\n"; print "<table>\n"; print "<tr><th>ユーザー名</th><td>$user</td></tr>\n"; print "<tr><th>パスワード</th><td><input name=pass type=password></td></tr>\n"; print "<tr><th>パスワード(確認)</th><td><input name=conf type=password></td></tr>\n"; print "<tr><td colspan=2><input type=submit></td></tr>\n"; print "</table>\n"; print "</form>\n"; print "</body></html>\n"; } sub change_passwd{ if($cgi{pass} eq $cgi{conf}){ $pass = $cgi{pass}; system("$htpasswd -b $passwdfile $user $pass"); print "<html><head><title>Change Password</title></head>\n"; print "<p>パスワードを変更しました。</p>\n"; print "</body></html>\n"; }else{ input_passwd("パスワードと確認が違います。"); } } sub wrong_access{ print "<html><head><title>wrong access</title></head><body><p>your access is wrong.</p></body></html>\n"; } sub getQuery{ #ARG = () | RETURNS = %cgi_query; my(%cgi,$str); if($ENV{REQUEST_METHOD} eq "GET"){ $str = $ENV{QUERY_STRING}; }else{ read(STDIN,$str,$ENV{'CONTENT_LENGTH'}); } if($str =~ /=/){ foreach my $i (split('&',$str)){ my($name,$value); if($i !~ /\=/){ ($name,$value) = ($i,1); }else{ ($name,$value) = split('=',$i); } $name = urldecode($name); $value =~ tr/+/ /; $value = urldecode($value); &jcode::convert(*value,'euc'); $value =~ s/\015\012/\012/g; $value =~ s/\015/\012/g; $cgi{$name} = $value; } }else{ $cgi{$str} = 1; } return %cgi; } sub urldecode{ #ARG = $encoded | RETURNS = $plain; local($_) = @_; s/\%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; return $_; }
隣で先輩がPostgreSQLのストアドプロシージャーとかをPL/pgSQLとかで書いていて苦しんでいる。ということで、要は言語のプログラミング・パラダイムが古いのが原因だよな、という話しになる。パラダイムとしては20〜30年前のものだし、当然と言えば当然だけど。