2004/12/15

dumpファイル取得用phpスクリプト

subversionのレポジトリをダンプしてダウンロードするんにいちいちサーバを操作するんがめんどくさかったんで、phpでダンプを取るためのスクリプトを書いてみた。
ブラウザで、/path/to/script.php/repositoryName.dmp のように、このスクリプトのURLの後に「/レポジトリ名.dmp」と入れてやると、ダンプファイルをダウンロードする。
ちょっと思いのほか便利。
<?php

define("REPOS_HOME", "/home/svn/repos");
define("SVN_ADMIN", "/usr/local/bin/svnadmin");

dumpRepository(getRepositoryName($_SERVER["PATH_INFO"]));

function getRepositoryName($pathInfo) {

   $fileName = substr($pathInfo, 1);
   list($repository) = split("\.", $fileName, 2);
   $repository = escapeshellcmd($repository);

   return $repository;
}

function dumpRepository($repository) {
   header("Content-type: application/svndump");
   header("Content-Disposition: attachement; filename=${repository}.dmp");
   passthru(SVN_ADMIN . " dump " . REPOS_HOME . "/${repository}");
}
?>
どうせやったらRubyで書いた方がかっこよかったかな?勉強にもなったはずやし...

2004/12/14

自動起動設定

書いてなかったがおとといJBossの3と4を両方ともインストールした。 こいつは/usr/ports/java/jboss-n.n.n> make install一発で入るんやけど、自動起動までしてくれる。
基本的に便利やけど2つ入れるとまずいな、って事で自動起動設定を切ることに。

FreeBSDの自動起動設定てどうなってるんやろうと思ってぐぐると、トップでそれっぽいのが叫んでた。ふむふむ...
rc.d/は/usr/local/etc/の下にあるって事らしい。で、こいつの中の020jboss3.shをリネームして丁寧にパーミッションまで変えてやったら無事起動しなくなりました。よしよし。

subversionでの自動ビルド

今日仕事帰りに「Subversion解説書」を何気に立ち読みしてたら これまでずっと調べててわかんなかった自動ビルドの設定法をあっさり発見。
これにのってるって事は当然「Subversionによるバージョン管理」にものってるわけで...
5. リポジトリの管理 > リポジトリの作成と設定 > フックスクリプト に書いたあるやん。普通に。
まあ、やりたいことベースとかCVSからの移行イメージで、とかで 「subversion 自動ビルド」とか「subversion 自動テスト」とか「subversion commitinfo」とか、 そんな検索ワードを使ってたから見つからんかったんやろなぁ。
一通り読み込んでたつもりでまだまだ読めてない部分も多いんでしょう。

で、やり方やけど、リポジトリを作ったらその中にhooksてディレクトリがあるので そこに決められた名前のファイルを作っておけばそいつか実行される。
UNIX系ならまさしくの名前のものを、winなら拡張子は無視して実行ファイルなら 実行してくれるそうなので、けっこうなんでも置けそう。
自動ビルドならantをキックするスクリプトをpost-commitてな名前で追いとけばよさげ。
管理しやすいようにリポジトリディレクトリ内にautobuildという名前でtrunkをチェックアウトして、 そいつを自動ビルドする。てかコミットのたびに自動でテストしてレポートを吐きたかったんだ。
とりあえずwinノートで試したんやけどBSDのblog(じゃぁ無いよな、このメモ) なのでBSDベースでかきます。
まず、そのpost-commitの内容。

#!/bin/sh
cd ../autobuild
PATH = /usr/local/bin
export PATH

svn update
ant -l build.log test
てな感じで書いて、chmod +xすればよし。
そんだけでコミットするたんびに更新してくれる。なんて解りやすい...解っちゃえばこんなもんですな。
こんだけじゃなんなんで、ついでにbuild.xmlの内容なんかも。
<?xml version="1.0" encoding="UTF-8"?>
<project name="triggertest"  default="build"  basedir=".">

 
   <target name="build">
       <javac destdir="bin" debug="true">
             <src>
               <pathelement path="src"/>
             </src>
           <include name="**/*.java"/>
       </javac>
   </target>

 
   <target name="test" depends="build">

       <delete dir="test-result" />
       <mkdir dir="test-result"/>

       <junit>
           <formatter type="xml"/>
           <classpath path="bin"/>
           <batchtest todir="test-result">
               <fileset dir="bin">
                   <include name="**/*Test.class"/>
               </fileset>
           </batchtest>
       </junit>

       <junitreport todir="test-result">
           <fileset dir="test-result"/>
       </junitreport>

   </target>
</project>
こんな感じでした。まる。

2004/12/13

気を取り直してJDK1.4

JDKのインストールをいまさらながら行う。
てかJDKが入ってなかったことの方が驚きやけど。SVNのJavaサポートとか入れてるくせに。

これもなかなかはまった。まず/usr/ports/jdk14を試したんやけど、こいつに必要なpachsetというの野ダウンロードがなぜかうまくいかない。
Java 2 on FreeBSDのサイトでダウンロードページからボタンを押すと何もいわずに戻されてしまう。 仕方が無いので半日の格闘後あきらめました。
気を取り直して、やっぱ今からやったら1.5やんね、とlinux-sun-jdk15をmakeしたらBad System Callが出てインストールできない。で、linux-sun-jdk14をインストールすることにした。

まずはダウンロード

と りあえず/usr/ports/java/linux-sun-jdk1.4/でmakeしてみると、j2sdk-1_4_2_06-linux- i586.binを/usr/ports/distfilesに入れてくれといわれる。こいつは、なぜか自分でfetchしてくれへんのです、ports のくせに。ていうかライセンスの承諾がいるんやね、きっと。
で、自力でSunのJDCからダウンロードページへ行って、self-extracting file (j2sdk-1_4_2_06-linux-i586.bin)を取ってくる。
こいつを指定された/usr/ports/distfiles/にいれて、再度makeすると、今度はgettextのバージョンが古いと文句を言われてしまった。

gettextは0.13ですか。

甘やかしちゃいかんと思いつつもついつい/usr/ports/devel/gettext/でmake deinstall; make install(無茶は承知)。
で、再度/usr/ports/java/linux-sun-jdk1.4/に戻り、makeすると今度はlibintl.so.5が無いと止まってしまう。

libintl.so.5を作ってやる

ぐぐって調べるとなにやらlibintl.so.n(nは5以上の任意の整数)にシンボリックリンクを貼れば良い模様。(これは無茶ではない。んじゃ無いかとおもう)
/usr/local/lib/ でln -s libintl.so.6 libintl.so.5として、再度/usr/ports/java/linux-sun-jdk1.4/でmake すると、ようやくmake 完了。で、make install して晴れてインストールできました。再起動してjava --versionと ...したらエラーがTT。

続きは飯の後にしよう...

linuxバイナリ互換を入れないとね...

で。とりあえず、「FreeBSD jdk14 インストール」でぐぐって再度インストール法を確認。
そこで見つけたページで、こんなことが書いてある...
また、linux版には、Linuxバイナリ互換機能が必要です。 ...(略)... 実際にLinuxバイナリ互換機能を使用するには、/etc/rc.confに linux_enable="YES" の1行を追加します。
もちろん、そうですな。インストールだけして動かしてない。そら効いて無いわって話で。
やりました、rebootしました、動きました。しょうもな。ってrebootまでせんでもいいやん、UNIXやのに。win癖がついちゃって...

そんなわけで無茶をしつつもインストール完了です。無茶しすぎ。
サーバ管理の仕事は出来ひんなぁ、と改めて実感した半日*2でした。

いまさらXfree86設定

実は今までtextオンリーで使って来たんである。
いや、最初はちゃんとがんばってXFree86設定を完了させててんけど。 HDが逝ってしまわれて再セットアップせなあかんくなたらめんどくさくて。

で、さすがにGUI無しがなにやらもの悲しゅうてXFree86の設定に再挑戦する。 何がまずくて設定できなかったかと言うと、グラフィックカード。
サーバマシンにはATI Rage XLが入っているんやけど、 こいつとBSDの相性が悪いらしい。
ちなみになぜ今更かというと、たまたまネットを手繰っていてHPのサポートページに 同一構成の設定法がのってたから。HPではいないんやけど、参考になりそう。

その上ディスプレイはLCDで、ちょっと周波数がリストに無いんではまっていたらしい。

で、どんな設定をしたかというと。
まずキーボードとマウスは普通にデフォルトのままでうまくいった。
問題はまずディスプレイである。こいつはスペックを見て 水平はリスト上のHigh Frequency SVGA 1024*768@70 Hzを選択、 垂直は直入力で55 - 75とする。
後はグラフィックカード。リストに無いので正直にUnlisted cardとし、 メーカーのatiを選択。
で、次がポイントで、ディスプレイは16bitで1024*のみを設定しておく。 これでXFree86は動くようになった。
が、なぜかKDEが起動してくれないTT。 まだまだ苦難が続きそうです...

2004/12/09

おまけ:winにsubversion

基本的に今のところBSDはsubversion用にしか使ってない。のでここに置いたんやが...
普段サーバに置いとけばなんなとなるし、 subversion+apache+2、とかやとセキュリティ付きでインターネット経由のアクセス、なんかも (比較的)容易なんやけど、
けどサーバを持ち運べるわけじゃないんで、接続できない場面なんかも 当然発生する。
そんな場合でもPC持込、なんて場合が多いんで、開発用ノートPCにsubversionをセットアップしておけば 持ち出しも可能。
んで、そのノートPC側の設定を行ったんでその記録を。

まず、apache2をインストールする。まあ、deltavでアクセスせずに使うならいらんし、ファイアウォールでLAN内だけ許可しとけばsvnservで充分な気もするけど...
基本的にはインストーラを取ってきてインストールするだけ、何やけどうまいこといかなかった。
あとでわかっんやけどskypeが悪さをしていたらしい。
今回は仕事の変わり目でPCの中身をサラにしてから入れたのでここでは問題なし。
問題があったときはさっきのページとかそっから飛べる@ITの記事とかを参考に犯人を突き止めるべし。
場合によってはapache2のポートを変えるよりほかに無いかも。
まあ、今回はすんなり行ってよかった。

で、subversionのインストールやけど、これは簡単。
別に普通に使うのみならTortiseSVNで充分だが、サーバから移行して別サイトで使用したり、戻ってきてサーバに戻したり、なんて事をしたいんで、svnadminのついた本物のsuvbersionがいる。
で、どうするかっていうと、windows版のフォルダからインストーラをインストールして入れるだけ。.zipを取ってきて解凍してパスを通すだけでもいけるみたいやけど。

で、ここからが本番です。mod_dav_svnをApache2にインストールしないといけない。
基本的にはインストーラがやってくれて、後はmod_dav_svn.soとmod_authz_svn.soをApache2のmodulesにコピーすれば良い、はずなんやけど、うまくいかない。
ちなみにLoadModulesとかの修正はBSDの時とおんなじ。
でもおんなじにしても動かない。モジュールが見つかりません、と言うメッセージを丁寧に\xでエスケープして出してくれる。
このメッセージを読み解く為に、


public class UnescapeFilter extends FilterReader {

   public static void main(String[] args) {
       BufferedReader r = new BufferedReader(
               new UnescapeFilter(
               new InputStreamReader(System.in)));
      
       try {
           String line;
           while((line = r.readLine()) != null) {
               System.out.println(new String(line.getBytes("ISO-8859-1"),
                       "JisAutoDetect"));
               if (line.length() == 0) {
                   break;
               }
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
       try {
           r.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
  
   public UnescapeFilter(Reader in) {
       super(in);
   }
  
   public int read(char[] buf, int ofset, int len) throws IOException {
       char[] myBuf = new char[buf.length - ofset];
       int count = super.read(myBuf, 0, len);
       int pos = ofset;
      
       for (int i = 0; i < count;) {
           char ch = myBuf[i++];
           if (ch == '\\') {
               ch = myBuf[i++];
               if (ch == 'x') {
                   ch = (char)toByte(myBuf[i++], myBuf[i++]);
               } else {
                   buf[pos++] = '\\';
               }
           }
           buf[pos++] = ch;
       }
      
       return pos - ofset;
   }

   private byte toByte(char upper, char lowwer) {
       return (byte)Integer.parseInt(
               new String(new char[]{upper, lowwer}), 16);
   }
}

みたいにしてJavaで変換して読んだ。このコード、前はごめんなさいな程汚かったんで書き直した。 で、この件、W32notes.txtを見る限り、パスを通したりすると直るらしいんやけど、うまくいかず。
結局どうやったかというと、subversionのbinから全部のdllをapache2のmodulesに移すと、動いた。 (また無茶を...)
あまりに無茶なんで1つずつ消して要らんやつをはずして見たら、libaprutil.dllとintl.dllとlibdb42.dllが必要だったらしい。今回は。でも常にこれで充分かは疑問。
んで、ようやく動きました。後はapache2の設定しだいなんでBSDの時とおんなじでいい。
以上。

subversion1.1.1登場

日本にいない間にsubversionが1.1.1になってた。 今回はPortsが対応してくれているので、そっちでインストール。
Lev Serebryakov氏に感謝!

さすがにportsは楽ちん。cvsupしてからmake; make installで終わる。 といってもMakeFileを調べてプションをつける必要はあったのだけれど。
やったのは以下の通り。


> cd  /usr/local/etc/cvsup
> cvsup ports-supfile

> cd /usr/ports/devel/subversion
> make clean
> make -DWITH_PYTHON -DWITH_JAVA -DWITH_MOD_DAV_SVN
基本的に最初に入れたときの準備完了後と同じなのだが、 subversion-pythonを使う代わりに-DWITH_PYTHONとしたのと、 なんとなく気分でWITH_JAVAしたら入ったので使っている。
しかしやっぱりportsは便利だなぁ、などと思ったりしたのでした。 いじょ。