Whiteのふりーとーく

2004年3月後半

About this Page |過去分一覧

原則匿名で公開・個人情報は送られません。必要に応じ御署名/非公開希望をお書き添え下さい。


Wiki/BBS


3.16

@シャドウ・オブ・ヘゲモン

シャドウ・オブ・ヘゲモン(上)(下)[オースン・スコット・カード、ハヤカワ文庫 ISBN:4-15-011463-3,4-15-011464-1]読了。

「エンダーのゲーム」の設定に縛られているということを差し引いても、架空歴史小説としてはあまり出来のよいものではないだろう。だがしかし、徹底して人を魅せ、徹底して人を描くというカードの語り口はやはり見事だった。

_加えて、今の僕にはとても必要な物語だった。カードの作品はこれまでも何度か僕を導いてくれた。そして今度もまた、僕に道を示してくれた。

彼のように語れるようになりたい。無謀と言われるかもしれなくとも、なりたい。

@

なんとなくリンクとか。

@

同僚何人かに何があったのかを話す。自分の中で整理するためでもあり、友好を示すための儀式でもあり。

こうやって晒け出すだけのみっともなさが僕にはある。みっともなくてもいいから、僕は生きる。


3.17

@

昨夜の帰り道にもう墓穴を暴くような物語を考えている自分がいた。彼女がいたときにはあまり姿を見せなかった自分だと思う。きっと彼女は、自分を壊して行くようなその自分を眠らせてくれていたのだろう。

今までもそんなことはあったが、今度は早いなと思った。きっと薬の力だろう。病のためでなく到達のために欲する人がいるのを、理解できる気がする。

_僕は自分に嘘を吐いていたのかもしれない。本当はそのことが一番大切なのに、彼女のことを一番にしようと自らを縛っていたのかもしれない。

真実はまだ闇の中だ。僕はそれを暴くために、いつか墓穴を暴きたい。


3.18

@Apache2 + Subversion(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できることを確認した。

単純な構築はここまでで終了。ただしこの状態ではセキュリティ的に問題ありまくりなので、セキュリティポリシー決定した上で、それを実践できるようにあれこれ設定していく必要がある。

……というあたりの作業は明日の予定。


3.19

@Apache2 + Subversion(2)

考えるべきは運用形態ってわけで、条件をつらつら考えてみる。

_と、いうことで基本的には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に比べて強化されているのかな。

_後はバックアップの設定が必要なところ。これは来週送りかな。


3.21

@グッバイ・レーニン!

土曜日に、くわね氏C.F氏と行った。優しい虚構の連鎖の話――と私の目には映った。どうしようもなく滑稽な優しさの連鎖が心地よい映画だった。

@

起きてからいきなり電話をして、渡したいものを携えて押しかけた。

残り物と恐縮されながらお昼を御馳走になって、遺影の側に飾ってあるそれらのことや彼女の残した言葉をまとめることについて話して、それから彼女の最後の言葉を見させてもらった。

_読んで、思う。僕は、僕が思っていたよりもずっと想われていたのではないかと。それでも彼を真っ先に想っていたから、彼女は裂かれたのしれないと。

僕は、彼女を救おうとする鳥だったのだろうか。それとも、彼女を旅立ちへと誘った蛇だったのだろうか。

@イノセンス

訪問の後、progressiveの面子と行った。

こんなふうにアニメーションを作れるのは、おそらく押井守だけだろう。アニメーションの監督というのはおおよそアニメーションそのものに愛着を持つものだが、この映画における押井守にはそれがないな、と感じた。映画はカッティングで全てが決まるとは、誰の言葉だったか。ともかく、押井守の「映画監督としての」才能を改めて確認できる映画だった。

_新海誠あたりとリンクさせて語るとよいのか、などと思ったりもした。


3.22

@

httpd.confで多段にIncludeとかを駆使して、プロジェクト毎にWebDAVによるファイルスペースと影舞によるバグトラックシステムを立てて適当に権限管理できるようにする。あとはSubversionのレポジトリに適当にエイリアスを張ってWikiあたりを追加すると完璧なのか?

_っていうか、もはやSourceForgeとかの域に達しつつあるという気もする。


3.24

@

心療内科(神経科?)二度目。

リタリンを勝手に減らしたり飲まなかったりしていたのに関しては、むしろそれが正しいという御墨付を頂いた。鬱っぽい状態からは脱しているし、減らした分で手元にいくらか余りが残っているので、今回はリタリンは不要と告げる。

_残る二つ、ソラナックスとアナフラニールについては服用を続けることになった。アナフラニールは少々効き目が強くて眠くなるようなので、少々相談。パニック障害に対しては2つの組み合わせ基本的治療法だということを考慮して、一日の服用量を減らす方向で行くことにした。

と、いうことで「シートのままで適当に薬を出すから適当に様子見ながら(自分で)調整しつつ飲め」という信用されてるんだか投げ出されてるんだかという指示を受ける。こんなふうに信用を見せることで信用させるのも、治療の上でのテクニックなんだろうなあ、と思いながら診察室を出て、薬を受け取った。

_そろそろ様子を見ながら自転車通勤を再開する頃合かもしれない。


3.25

@仕事。

原因はDBIモジュールとEncodeモジュールの相性(?)だったらしい。

結論:SQL Injectionを防ぐだけでなく、文字コード問題を回避するためにも$dbh->doではなくてprepareしてからexecuteしましょー。


3.26

@仕事。

システムで使うhtpasswdファイルとhtgroupファイルを単一にまとめた上で、登録済ユーザーが自分のパスワードを変更できるCGIをhttps経由でのみアクセスできるところに置いて、とりあえずの設置作業は完了。

グループ管理とか、グループ権限設定とか、管理者がコマンドラインでこなさなきゃならない業務があれこれ残っているけど、そのへんは(俺が)面倒になったらなにか作られるのであろう、きっと。


3.28

@模様替え

プロジェクターとしてTLP-S10(J)を購入したのでそれに合わせて模様替え。壁沿いの本棚列に置いていたテレビ台が、列から少し出っぱっていたのでこれをカラーBOXに置換して出っぱりを消す。で、テレビ台に使っていた台は窓際に置いてプロジェクター台兼日用品置場に。

_スクリーン、はとりあえずまともなものを用意せず、いいかげんに買ってきた白シーツを突っ張り棒から吊すという手抜きな方針で解決。これで適正サイズを見極めておいて、そのうち気が向いたらちゃんとしたのを買う予定。

_ビデオデッキからの接続を確保する必要があるかなー、とか思いながら、今日はPS2で遊んでおしまい。


3.29

@

あげぷらおめ、と言いつつ晒され度を上げてみるテスト。

_ついでにこっちも貼っておこう

@Stand by me.

死に向かい合うことができなくなったから、筆を置いたと彼は言っていた。

僕は彼女を愛しているが、彼女のことがわからないままでいる。彼女が世界から去ったことの意味や理由を求めて墓穴を堀り返すたび、僕はきっと違う答えを手に入れる。――であるならば、僕はその墓穴をきっと何度も堀返すのだ。それでも彼女を愛し続ける道として、きっと僕はそんな非道な方法を、選ぶ。

@記録。

夕方ごろに頓服を1/2錠。

@プロジェクト用影舞 & WebDAV設定

結局こんな感じの設定になった:

/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

ユーザーが自分で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 $_;
}

3.31

@

隣で先輩がPostgreSQLのストアドプロシージャーとかをPL/pgSQLとかで書いていて苦しんでいる。ということで、要は言語のプログラミング・パラダイムが古いのが原因だよな、という話しになる。パラダイムとしては20〜30年前のものだし、当然と言えば当然だけど。


御意見・御感想の宛先white@niu.ne.jp