Home > Archives > 2005年04月

2005年04月

シマリスの子供が出回る季節だなぁ

この週末に実家に帰っている.そんで今日は家族で買い物に出た.うちの家族は買い物ついでによくペットショップによるのだが,今日もやっぱりペットショップによった.で,昨日入荷したらしいシマリスの子が居たわけで,数十分悩んだ挙句に購入決定.店員が手で掴んだときは鳴いていたのだが,家に帰ってみると人の手の上でしか寝付かない.どうやらちゃんと手乗りになってくれるらしい.とにもかくにも,また長生きしてくれることを願いつつ,新しい家族の一員が増えましたとさ.

ただいまの最小n回HelloWorldプログラム

とりあえず,bash などのシェルスクリプトで外部の yes と head を呼ぶバージョン:

yes $0|head -$1

ただし,"Hello World"というファイル名で保存して,

bash Hello\ World 10

などで実行.とりあえず 15バイトで今のところ最小.

次に,perl で

print"$0\n"x$ARGV[0]

を同様に "Hello World" というファイル名で保存.

perl Hello\ World 10

などで実行.とりあえず 20 バイトで外部コマンド使用せず.

実行時のファイル名を使用しない場合には,それぞれ $0 を Hello World で置き換えるべし.その場合,24バイトと29バイトになる.

さて,これ以上縮まるかどうか... とりあえず言語の候補としては perl 以外に無い気がするのでむりかも.文字列と数値を自動で変換してくれて繰り返しが簡単でコマンドライン引数が簡単に扱えて... そんな言語が他にあったかなぁ?

DHCP on Cygwin

coLinux に対して DHCP でIPを割り振りたい.ホストPCがネットワークにつながっていなくても.

ということで,簡単な解決法はネットワークの共有を使ってひとつのインターフェースを 192.168.0.1 に固定し,その上で Windows の DHCP が立ち上がるようにすればいい.この場合,接続が切れていようが問題ない.しかし,この方法は少々使いにくいので,自前でDHCPを動かしてみることにした.

で,Cygwin にDHCPがあるだろうと思ってたら無かったわけで,自分でコンパイルしてやらないとならない.とりあえず,cygwin でコンパイルするためのパッチをここらへん(dhcp-3.0.1rc11-cygwin.patch)から落としてきて,本体を ISC (dhcp-3.0.2.tar.gz)から落としてくる(バージョンが違うが気にしない).落としたら解凍してパッチ当ててコンパイルしてインストール.(パッチのときに行が合わないと文句が出るが無視)

tar xfvz dhcp-3.0.2.tar.gz
cd dhcp-3.0.2
/bin/patch -p1 < ../dhcp-3.0.1rc11-cygwin.patch
./configure
make
make install

で,設定ファイル(/etc/dhcpd.conf)を適当に書いてやる.下のは 192.168.1.250 のインターフェースに対して DHCP を立ち上げている.

local-address 192.168.1.250; # This limits dhcpd to listening to this interface
max-lease-time 180;
default-lease-time 180;
ddns-update-style none;
option routers 192.168.1.250;
subnet 192.168.1.0 netmask 255.255.255.0 {
   authoritative;
   range 192.168.1.100 192.168.1.200;
   log(debug, "debug 192 DHCPD-logging");
   log(debug, binary-to-ascii(10,8, ".", packet(24,4)));
}

実行は

dhcpd -d eth1

とかやれば動くのだが...  少々問題が.とりあえず,DHCPを動かすインターフェースにケーブルが接続されていないと起動できない.そのため,coLinux の立ち上げ直後にしか dhcpを立ち上げるタイミングが無い.

さーてどうしようかなあ?

最短のn回 "Hello World "

ちょっとした疑問.

コマンドライン引数から回数 n を読み込み,"Hello World"を n 回(n行)出力する

というプログラムを作るとして,ソースコードのバイト数換算で最短となるプログラムはどれくらい短いのだろうか? 条件として以下を考える.

  • インタプリタ形式であれば
    interpreter sourcecode n
    
    のようにインタプリタプログラムを指定してよい.(#! の行はバイト数にカウントしない)
  • 外部のファイルに対して入出力してはいけない.(stdout のみ出力可能)
  • Hello World 以外の文字を出力してはいけない.('"'とかを出してはいけない)
  • 自前でプログラミング言語を作った場合はその処理系も倍とすうとしてカウントする.
  • コマンドライン引数が正当でない場合の処理は考えなくてよい.

さてどれくらい短くできるかな? Unix の標準的なコマンド sed, grep, awk, head, tail, yes とかは使ってもいい場合にはどうだろう?

雨は嫌だ...

自転車には泥除けが付いていない.木から落ちてきた雄花だか雌花だかが道路一面に広がっている.そして今日は雨が降った.

そんな中を全力で自転車こいだ.

結果としてかなり悲惨な状況になった.これだから雨は嫌~.まあ,泥除けをつければいいんだけど.

JApplet の add と setLayout

Swing のいくつかのコンポーネントは getContentPane() というメソッドを使って ContentPane を取得し,そのContentPane に子要素を追加(add)したりレイアウト指定(setLayout)しなければならない.

で,Java 1.4 では JApplet もこの制約のかかるクラスであるため,間違って直接 add を使うコードを書くとコンパイルは通るが実行時にエラーを吐いて止まってしまう.一方,Java 5 では親切なことに add などが getContentPane().add などにリダイレクトされるようにオーバーライドされている.よって,直接 add を使うコードを Java 1.4 でコンパイルしたバイトコードも,実行環境が Java 5 であれば実行時にエラーを吐くことなく動く.

と,こんな仕様のため,今日はマシンによって動かないプログラムを見事に作ってしまったのであった.

自転車が危険かも

4年間乗ってた自転車があちこちボロっちくなってきた.というか,ぼろぼろとあちこちのネジやら止め具などが落ちてしまっている.

似たようなパーツで修理してはいるけどそろそろ危ないかも.折りたたみ自転車だからうまく衝撃を与えると二つ折りになる可能性も出てきたし... 一番重いギアのときに力を掛けすぎるとチェーンが飛びまくるし... やっぱちゃんと直すか.時間ができたら.

OOo2.0Beta の Impress

輪講のスライド作成に OOo2.0Beta を使ってみた.

Impress のUI がPowerPoint に近いものに変わっており,スライド作るのが楽になった気がする.でも,まだBetaバージョンだからなのかスライドの選択ができなくなったりしてしばしば再起動.あと,PDFに出力したら画面の切り替え時に変なエフェクトがかかるようになっているのはよろしくないなぁと.

なにはともあれ,速く正式バージョンが出てほしいなぁ.

XPのネットワーク共有をブリッジ接続したcoLinunxesで使う

TAPのアダプタを複数作ってブリッジ接続して仮想的に複数台のcoLinuxesを接続できていたのだが,これまではそのブリッジにさらに外部に出られるインターフェースを追加してcoLinuxesが外部に出放題な状況だった.このままでも別に問題ないといえば無いのだが,この場合はcoLinuxがDHCPでリアルのネットワークにIPを取得しに行くため,自宅にいるか研究室にいるかで取得IPが違うのが面倒だった.ということで,NATで coLinuxes のネットワークを完全に外部から隔離してみた.

やったのは単純にTAPを全てブリッジ接続して,リアルのネットワークにつながるインターフェースをその「ネットワーク ブリッジ」に対して共有かけただけ.これでcoLinuxesはXPの提供するDHCPからIPを取るようになり,どこへ持っていっても同じIPでよろしい感じ.ただ,ネットの接続を共有した場合,共有を受ける側のインターフェースが 192.168.0.1 になり,DHCPも 192.168.0.xxx を割り振ることになるのでこれが少々めんどうかも.というのも,自宅のLANはもろに 192.168.0.xxx で組んであったので IP が衝突しまくりで設定変更を余儀なくされたから.共有を受ける側のIPが 192.168.yyy.xxx のように下二つを指定できるようになってると非常に使いやすいんだけどなぁ.なんで固定なのかが非常になぞだ...

Windows 互換シェル

面白そうなので Windows の Explorer の代わりになる互換シェルを調べてみた.どうやら昔試したときより数が増えてる模様.

Geoshell(日本語サイト)

BB4Win

xoblite

BBLean

LiteStep(日本語サイト)

litestep は昔に使った記憶があるので今回はやめるとして,とりあえずどれを試そうか? モジュールとか組み込んでいろいろできるらしいので楽しみだ.

coLinux + CygwinX

Cygwin の X サーバで XDMCP の接続が使えることに気づいたので試してみる.

起動はCygwin の startxdmcp.bat で REMOTE_HOST を coLinux の IP に変更して実行するだけ(coLinux 側で xdm/gdm の設定が必要だけど.その設定自体は VNC の場合も同じ).バッチファイルのコメントを消したのは以下となる(フルスクリーン,クリップボードあり).

SET DISPLAY=127.0.0.1:0.0
SET REMOTE_HOST=192.168.0.104
SET CYGWIN_ROOT=c:\cygwin
SET PATH=.;%CYGWIN_ROOT%\bin;%CYGWIN_ROOT%\usr\X11R6\bin;%PATH%
SET XAPPLRESDIR=/usr/X11R6/lib/X11/app-defaults
SET XCMSDB=/usr/X11R6/lib/X11/Xcms.txt
SET XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
SET XNLSPATH=/usr/X11R6/lib/X11/locale
if not exist %CYGWIN_ROOT%\tmp\.X11-unix\X0 goto CLEANUP-FINISH
attrib -s %CYGWIN_ROOT%\tmp\.X11-unix\X0
del %CYGWIN_ROOT%\tmp\.X11-unix\X0
:CLEANUP-FINISH
if exist %CYGWIN_ROOT%\tmp\.X11-unix rmdir %CYGWIN_ROOT%\tmp\.X11-unix
run XWin -query %REMOTE_HOST% -nodecoration -lesspointer -fp tcp/%REMOTE_HOST%:7100 -clipboard

ただ,このバッチファイルは coLinux でDHCPを使ってると IP がかかわる度に編集しなきゃならんのでめんどい.

GUI の起動用のランチャでも作ろうかなぁ?

ところで, gdm で Disconnect しても Cygwin-X が再起動するのをとめるにはどうしたらいいのだらう?

GDMでローカルサーバ立ち上げない+α

coLinux で gdm を使うときにはローカルのXサーバを勝手に立ち上げてほしくない.でも,それをやるには --no-console のオプションを渡さなければならない.

ということで,/usr/X11R6/bin/gdm-nc というファイルを作って,中身を

#!/bin/bash
/usr/bin/gdm --no-console

としておいて,/etc/rc.conf 内の DisplayManagerの起動コマンドをこれに変えてしまう.

DISPLAYMANAGER="gdm-nc"

これでローカルにXサーバが起動しなくなる.めでたし.

ついでに,kinput2 を起動させるために ~/.xprofile で

export XMODIFIERS="@im=kinput2"
kinput2 &

としておくか.(ふつうはどこで設定するのだらう?)

CapsLock さようなら

いい加減 CapsLock がうざくなってきたので過去やっていたように Ctrl に変身してもらう事にした.

設定はレジストリエディタでマッピングをかえればよく,変える値は HKEY_LOCAL_MACHINE -> SYSTEM -> CurrentControlSet -> Control -> Keyboard Layout -> Scancode Map である.最初はエントリが無いのでバイナリ値のエントリを作る必要があるはず.

で,その中身はこんなんで.最初の8バイトがヘッダ,次にエントリ数,続いてマッピングのエントリとなる.エントリの最後には終端記号として 0 が必要らしい.

  00 00 00 00   ; header version
  00 00 00 00   ; header flags
  02 00 00 00   ; header エントリ数(including Terminate)
  1d 00 3a 00   ; エントリ: CapsLock -> 左Ctrl
  00 00 00 00   ; Terminalte

ちなみに,リトルエンディアンなのでキーマップのエントリは始め2バイトが変更先で後ろ2バイトが変更元.詳しくは Scan Code Mapper for Windows で.それぞれのキーのスキャンコードは以下のとおりらしい.ここから一覧が取れる.(Scan Code Set 1のほう)

    Backspace       00 0E
    Tab             00 0F
    CapsLock        00 3A
    Enter           00 1C
    Left Shift      00 2A
    Right Shift     00 36
    Left Ctrl       00 1D
    Left Alt        00 38
    Space Bar       00 39
    Right Alt       E0 38
    Right Ctrl      E0 1D
    NumLock         00 45
    Esc             00 01
    F1~F10         00 3B ~ 00 44
    F11             00 57
    F12             00 58
    Scroll Lock     00 46
    Left Win key    E0 5B
    Right Win key   E0 5C
    Application Key E0 5D
    Insert          E0 52
    Delete          E0 53
    Left Arrow      E0 4B
    Home            E0 47
    End             E0 4F
    Up Arrow        E0 48
    Down Arrow      E0 50
    Page Up         E0 49
    Page Down       E0 51
    Right Arrow     E0 4D
    DBE_KATAKANA    00 70   (カタカナ ひらがな)
    DBE_SBCSCHAR    00 77   (???)
    CONVERT         00 79   (変換)
    NONCONVERT      00 7B   (無変換)

これでWindowsキーの無いIBMマシンでもエクスプローラが楽に立ち上げられるぞ.

HDDぶっ飛んだ

4年目になるIBMのHDD様にがたが出てきて起動すら怪しい状況になった.この60Gのハードディスクにはいろいろとバックアップが取ってあったので痛い.とりあえず救出できるデータを救い出して low level format でもしてみよう.

バンキシャで「萌え」が

TBSのバンキシャで「萌え」の特集があってメイドカフェとかやってたのだけど... 一般人がどのような反応をしたのだろうか?ととても気になる今日この頃.はっきり言って「萌え」を理解できるためにはそのための因子が必要な気がするし.まあ,てきとうな会社がでしゃばって適当な商品を出してコケまくるって流れはあってほしくないなぁ.見苦しいし.

Memtest86+

買ってきた1Gのメモリを載せて Memtest86+ を実行したらテストの切り替え時にピコピコ,ピコピコとどこぞのなぞ生物のようにビープ音を鳴らしまくる.んで,その挙句にテストの切り替え時にハングアップ. orz

不良品をつかまされたか?と考えながらいろいろな構成にしてテストを走らせて見たら,実は今までの構成でも途中でハングアップすることが判明.これは怪しいと思いgoogleで調べてみると,どうやら USB 関係が怪しいとの情報がちらほらと見つかった.早速 USB 系を全部 Disable にして memtest を走らせると,なるほど今度はうまくいく.ピコピコ言わなくなるし複数回走らせられるし.

ということで,メモリは無事 1.5G Dual Channel で動作成功.んで,この6時間あまりで学んだことは,

「memtest86 を使うときはUSBをはずしましょう.」

ということでしたとさ.

メモリ1Gゲット

ふとメモリを増設してみたくなったので秋葉へいって DDR400-512Mx2 で1G分のメモリを購入.SAMSUNGの純正メモリだけど今載ってるやつとあわせて Dual Channel でうまく動くかは不明.とりあえずこれから memtest でも実行して試してみよう.

深弾幕結界キター

久々に永夜抄をやって霊夢単体 Hard クリアを達成.ようやく魔理沙のラストワードを取得して最後のラストワードを拝むことができた.さて,次は妖々夢にもどってPhantasm のクリアへ向かいましょ.

Inkscape 日本語設定

ドロー系のソフトを探していたら Inkscape なるものがあった.なにやら sodipodi の製作チームのメンバーが作ったそうな.

で,起動してみたらメニューの文字が化けまくっている.どうやら gtk を使っているようなので,設定ファイルをいじくって日本語フォントを使うようにしてやった.設定ファイルはインストールしたディレクトリの etc/gtk-2.0/gtkrc で.

gtk-theme-name = "Default" 
style "user-font" {font_name="MS UI Gothic 8"} 
widget "*" style "user-font" 

としたら日本語メニューになった.マル.

Java の & のオーバロード

とあるプログラミング初心者の Java プログラムを見ていたら,

if( a <= b & a <= c) {
    ....
}

みたいなコードが書かれていた.

はじめ見たときはC言語であればまったく問題ないコードだけど Java で論理演算の結果を bit 演算しちゃダメだろ,と考えていた.

しかしながら,実はこのコードはコンパイルも通るしちゃんと動く.int と boolean でキャストが自然に起こるようになったのかとも考えたが,実のところ & は boolean 同士をオペランドに取れるようにオーバロードされているだけだった.でもまあ,今までまったく知らなかったので少々驚きだった.

ちなみに,よく考えてみると AND を && でとると左のオペランドが false のときに右側のオペランドは評価されないので,これと対になって両方とも評価される & が存在することは当然だなぁと思う.うーむ,こんなことにも気づかずに何年間 Java 使ってたんだろ... 恥ずかしい

HelloWorld

Java で Hello World を書いてみた.ちょっと離れて見ると Hello World になっている.

 class Hello             {{{      {{{           
  {{{   {{{               {{       {{           
  {{{   {{{               {{       {{           
  {{{   {{{    {{{{{{     {{       {{     {{{{{{{  
  {{{{{{{{{   {{    {{    {{       {{    }}     }}
  }}}   }}}   }}}}}}}}    }}       }}    }}     }}
  }}}   }}}   }}          }}       }}    }}     }}
  }}}   }}}   }}    }}    }}       }}    }}     }}
 }}}}} public  static    void     main    (String 
 
 []a){   {{{{{                       {{{         {{{ 
  {{{     {{{                         {}          }} 
  }}}     }}}                         }}          }} 
  }}}     }((   (System   . out))     ).     println 
  ((( "H" +""  +(     ""   ))+  ""    )+    ""    +( 
  "e" )+( "l"  +(     ""   ))         +(    ""    )+
  "l" +(( "o"  +(     ""   ))         +(    ""    )+
   ""+" "+((   ""     )+   ""         )+    ((    "" 
   +""   ))+    "W"+"o"   +"rl"      +"d"    ));}}{}} 

動かすとちゃんと Hello World を出力する.C ほどへんなことができないのであまり面白くない... 先の自己出力プログラム生成プログラムに食わせると,Hello World をバナーみたいに出力できてうれしいかも.

自己出力プログラムの生成プログラム

Java のソースを読んでそのソースを含む自己出力プログラムを吐くプログラムを書いた.あまり美しくないなぁ...

/***
 * 次の Self2.template をソースファイルに埋め込んで,
 * そのソース全体を含む自己出力プログラムを作成する.
 * 実行クラス名は SelfPrint (Self2.template のクラス名) となる.
 * \r は置き換えないのでソース中に含まないようにすること.
 * \n, \t, " を %n, %t, %c という文字に変換して文字列を埋め込むので,
 * ソースはこれらを含まないこと.
 * あと, %s もあるとまずい.
 * エスケープ文字もまずそう.
 * Self.template の main 関数で何かメソッドを呼ぶように書けば仕事もできる.
 * そのばあい,画面出力があると自己出力の意味が無いけど...
 *---------------------- Self2.template start -------------------------- 
class SelfPrint {
	static String s="%s";
	public static void main(String [] args) {
		String ss=s.replaceAll(new String(new byte []{37, 110}), new String(new byte []{10}));
		ss=ss.replaceAll(new String(new byte []{37, 116}), new String(new byte []{9}));
		ss=ss.replaceAll(new String(new byte []{37, 99}), new String(new byte []{34}));
		ss=ss.replaceAll(new String(new byte []{37, 115}), s);
		System.out.print(ss);
	}
}
 *---------------------- Self2.template end -------------------------- 
 *
 */
 
import java.io.*;
 
class SelfGen2 {
	public static void main(String [] args) throws Exception {
		if(args.length <= 0){
			System.out.println("Usage: java SelfGen2 input.java");
			System.out.println("Note: input.java should not contain CR");
			System.exit(0);
		}
		File file = new File(args[0]);
		FileReader fis = new FileReader(file);
		int len = (int)file.length();
		char [] buf = new char[len];
		len = fis.read(buf, 0, len);
		String source = new String(buf, 0, len);
		File tfile = new File("Self2.template");
		FileReader tfis = new FileReader(tfile);
		int tlen = (int)tfile.length();
		char [] tbuf = new char[tlen];
		tlen = tfis.read(tbuf, 0, tlen);
		String template = new String(tbuf, 0, tlen);
		source = source + template;
		//System.out.println(source);
 
		String ss = source;
		ss=ss.replaceAll(new String(new byte []{10}), new String(new byte []{37, 110}));
		ss=ss.replaceAll(new String(new byte []{9}), new String(new byte []{37, 116}));
		ss=ss.replaceAll(new String(new byte []{34}), new String(new byte []{37, 99}));
		source=source.replaceAll(new String(new byte []{37, 115}), ss);
		System.out.print(source);
	}
}

フック

ふとフックが気になって Windows のフック登録の API を調べてみた.どうやら SetWindowsHookEx という名前らしい.グローバルにフックするにはDLLを作る必要があるそうで面倒かもしれないけど今度これで遊んでみよう.ここらへんが参考になるかなぁ?

還付金帰ってきた

先月の頭に確定申告に行って払いすぎの税金を返してもらう手続きをしていたけど,このたびその還付金が帰ってきた.やったー! ちなみに実際に振り込まれたのは三月末だったみたい.兎にも角にもお役所様もしっかり働いていらっしゃる様で何よりだ.さて,返ってきた金は新しいMP3プレーヤにでも変えようかなぁ.

地震だぁ

今朝方ちと大きめの地震がまた起きた.震源は千葉の北のほうだそうで東京はあまり大きく揺れなかったけど久々に長く揺れ続けたので少々ビビってみたり.でもまあ,最近地震が多いせいで震度5弱が弱い地震に思えてしまう.もともと地震には慣れているけどもう少し危機感を持ったほうがいいかなぁと思ってみる今日この頃.

再び寝過ぎ...

ヒノキ花粉のせいか最近体がだるくやる気が指数関数的に減少... 春だから花粉抜きでももちろん眠い... 結果として今日一日ほとんど寝てすごした... だめだこりゃ.

寝すぎた...

昨日寝たのが23時ごろ.今日起きたのが17時ごろ.二日分寝てしまったので今日は寝ないでがんばろう.さっさとテクレポ仕上げなきゃ.

Mattix++

Algo に続く「頭のよくなるゲーム」第二弾として Mattix なるものが発売されている.ルールは単純で,4x4 に数字1~8 とクロスチップを並べ,先手がクロスチップのある行から一枚数字をとってそこにクロスチップを移動.続いて後手がクロスチップのある列から一枚数字を選んで取ってそこにクロスチップを移動.数字を取れなくなるまで繰り返し,取った数字の合計が大きいほうの勝ち.というものである.

このように単純なルールではあるが,縦横の制約があって頭を使うというのが販売元の主張である.しかし,このゲームは盤面の情報が全て分かっているため,先手と後手が最適な手順をとったときの合計点は決定的に計算できてしまう.すなわち,コンピュータを持ってくればそれでおしまいであり,面白みにかける.そこで,研究室のある人がこのルールに改良を加え,面白みのあるものに昇華させた.さらに,その場にいた別の人間がそれを Mattix++ と名づけた.

ルールの変更点は以下のとおり.まず全ての数字は裏向きで配置する.プレーヤは自分の番になったら任意の裏返しの数字一枚を表向きにひっくり返すか,なにもひっくり返さない.

ルール変更は以上の2点のみであるが,この変更により情報が完全に手に入っていない状況で自分に有利に進めるにはどうしたらよいかと考えることができ,ゲームの面白さが増している.また,相手をはめるためにはどこの情報が必要なのかとか,ここの期待値はいくらだからこっちのほうが有利だとか,結構考えることはいろいろできるので,戦略を持たせたプログラムを作って戦わせるという面白さも生じている.

ということで,じゃあ対戦させようという話になり,プロトコルを決めてサーバとテストクライアントを作成.とりあえず話が出てから2時間弱でプロトタイプのテストまで終了.あとは各自で戦略を埋め込んだプログラムを作りましょうということで解散となったので,これからクライアントをせっせと作りましょう.

VNCで合わせ鏡

誰でも考えるであろうことをふと思いつき,実際にやってみた.

何をやったかというと,Windows の VNC Client から coLinux につないで X (Xvnc) を立ち上げ,そのなかから Windows 側で立ち上げた VNC Server に VNC Client で接続するということをした.これをやると,Windows で画面描画をした際に coLinux 内の VNC Client の描画が起こり,その描画は Windows の VNC Client に伝わり Windows 側の新たな描画を生じる.あとはこのサイクルが描画イベントが画面領域の外に出るまで繰り返され,合わせ鏡と同じ現象となる.

ちなみに結果はこんなもん.(ただ単に Window が重なっているようにしか見えない...)

coLinuxes -- 複数起動

無意味に coLinux を複数起動して通信させてみた.

やり方としては TAPアダプタを複数用意してブリッジ接続してやるだけ.TAPアダプタの増やし方は,[コントロールパネル]->[ハードウェアの追加]->[新しいハードウェア デバイスの追加]->[一覧から選択]->[ネットワーク アダプタ]->[TAP-Win32 Provider(coLinux)]->[TAP-Win32 Adapter V8(coLinux)] で.追加されたら [コントロールパネル]->[ネットワーク接続] で名前を TAP1, TAP2, ... とかに変えておく.

あとは,coLinux の設定XMLファイルのほうで,

    <network index="0" name="TAP2" type="tap" />

のように name 属性を接続の名前 TAP1, TAP2, .. などに重ならないように指定するだけ.MACは自動でランダムに割り当てられるはずなので指定なし.

xfs が入ってなかった

Gentoo で xorg-x11 を GRP インストールしたら xfs が入ってなかった... しょうがないからソースから作り直す.念のため USE に font-server を追加して.

で,まあ,ちゃんとコンパイルできたわけだが,今度は /etc/X11/fs/config が空... 面倒なのでここに xfs の config を書いておく.

#
# X Font Server configuration file
# 
# allow a max of 4 clients to connect to this font server
client-limit = 4
# no tcp, use sockets!
#no-listen  =  tcp
# when a font server reaches its limit, start up a new one
clone-self = on
# alternate font servers for clients to use
#alternate-servers = foo:7101,bar:7102
# where to look for fonts
# Some of these are commented out, i.e. the TrueType and Type1
# directories in /usr/share, because they aren't forced to be
# installed alongside X.
catalogue = /usr/share/fonts/75dpi,
        /usr/share/fonts/100dpi,
        /usr/share/fonts/shinonome,
        /usr/share/fonts/monafont,
        /usr/share/fonts/mplus,
        /usr/share/fonts/aquafont,
        /usr/share/fonts/aquapfont,
        /usr/share/fonts/mikachan-font,
        /usr/share/fonts/artwiz:unscaled,
        /usr/share/fonts/misc,
        /usr/share/fonts/Type1,
        /usr/share/fonts/util,
        /usr/share/fonts/local,
        /usr/share/fonts/TTF,
        /usr/share/fonts/cyrillic
# in 12 points, decipoints
default-point-size = 120
# 100 x 100 and 75 x 75
default-resolutions = 75,75,100,100
# how to log errors
use-syslog = on
# font cache control, specified in KB
cache-hi-mark = 2048
cache-low-mark = 1433
cache-balance = 70

とりあえず,これで xfs, gdm, xinetd, vncserver を設定して coLinux + VNC の GUI 環境ができた.

ちなみに,gdm の立ち上げうサーバを Xvfb :1 とかしてディスプレイ 0 以外にしておくと native に起動したときに startx でパラメータを渡さなくていいから楽(そうでないと startx -- :1 とかしてディスプレイ番号を指定しなければならない)

Gentoo 2-Way Boot (native & coLinux)

なんとなくデュアルブート用にインストールした Gentoo を coLinux で起動してみたくなった.これができると 2-Way Boot で結構便利なので.

で,そのためには coLinux の設定XMLを書かなければならないのだが,Windows のディスクナンバーとパーティションナンバーの管理の仕方が良く分からず苦戦.diskpart コマンドの返すディスクナンバーと,同パーティションナンバーからもずれているらしい.最終的に ,hda7, hda8 が /, swap である私の PC では次のような設定になった.まあ,ext3 のパーティションは一個しかないから全パターン試して起動したのが正解であっただけだけど.

<?xml version="1.0" encoding="UTF-8"?>
<colinux>
    <block_device index="0" alias="hda7" path="\Device\Harddisk0\Partition4" enabled="true" />
    <block_device index="1" alias="hda8" path="\Device\Harddisk0\Partition5" enabled="true" />
    <bootparams>root=/dev/hda7</bootparams>
    <initrd path="initrd.gz" />
    <image path="vmlinux" />
    <memory size="256" />
    <network index="0" type="tap" />
    <block_device index="2" alias="hdc" path="\Device\Cdrom0" enabled="true" />
</colinux>

(hda2 が拡張領域で hda3,4 が存在していないので,その分を引いた数がパーティション番号になるのかな?)

とりあえず,起動時に coLinux でサポートしていない機能に関して文句を言われるが,

ログイン画面が立ち上がったので今日のところはよしとしよう.

P2P通信技術 Bittorrent を試す

Gentoo の GRP インストールのために packages CD がほしいのだけど,http/ftp ではダウンロードできず Bittorrent を利用しなければならない.ということで,Bittorrent のクライアントである BitComet をダウンロードして使ってみた.

660M の ISO イメージのダウンロードをしてみたが,平均で 470KB/s 程度とそれなりに使えるものらしい.P2P というと 某MX/NY のおかげでグレーなイメージがあるけれど,このような巨大ファイルの配布にはサーバの負荷を分散できていいなぁ.やっぱ技術(ソフト)は使い方を考えて使わないといかんね.

さて,明日にでも「昨日P2Pソフトで600Mのファイルをダウンロードしたよ」と会話を振って周りの反応を見てみよう.

Installation of coLinux with Gentoo(3)

続いて GNOME と GDM の設定をする.

とりあえず emerge する.

emerge -k gnome
emerge -k gdm

GNOMEの設定は特に無いのでGDMの設定をする.

DIsplayManager として GDM を使うように /etc/rc.conf を修正

DISPLAYMANAGER="gdm"

次いで GDM の設定ファイル /etc/X11/gdm/gdm.conf を修正.ここでは必要な部分のみを示す(Xvfb へのサーバ変更と VirtualTerminal割り当てをしないのと XDMMCPの使用).

[daemon]
StandardXServer=/usr/X11R6/bin/Xvfb
VTAllocation=false
[xdmcp]
Enable=true
[server-Standard]
command=/usr/X11R6/bin/Xvfb
[server-Terminal]
command=/usr/X11R6/bin/Xvfb -terminate
[server-Chooser]
command=/usr/X11R6/bin/Xvfb 

以上で GNOME + GDM に置き換わっているはずである.VNC で接続すれば XDM の変わりに GDM が起動する.(ちなみに,GDM をデーモンとして起動するためにはXDMの起動スクリプトを使う.なので, rc-update add xdm default を実行してあれば GDM がデーモンとして起動される.)

ところで,GNOME の起動時に xscreensaver が無いと文句を言われるが,xscreensaver の emerge で

emerge -k xscreensaver
...
media-libs/svgalib-1.9.19-r3
!!! ERROR: media-libs/svgalib-1.9.19-r3 failed.
!!! Function kernel-mod_configoption_builtin, Line 114, Exitcode 1
!!! kernel has not been configured yet
!!! If you need support, post the topmost build error, NOT this status message.

のように文句を言われるため,今のところ仕方が無い.後で考える.同様の理由で KDE も emerge できないのだが,これも後で考える.

次は KDE が入ったらいいなぁ.

ちなみに起動の様子はこんなもん(gdm, gnome).

Installation of coLinux with Gentoo(2)

続いて X の設定をする.今回は VNC で接続する形をとる.

まず,/etc/make.conf の USE に少々追加

alsa canna cjk emacs java mozilla mule ruby unicode usb xface

WMに IceWM を使うとして X 関係を emerge する.

emerge -k xorg-x11
emerge -k icewm
emerge -k kterm 
emerge -k mozilla

次いで,vnc と xinetd を emerge (VNC への接続を xinetd で管理する)

emerge -k tightvnc
emerge -k xinetd
rc-update add xinetd default

そして,日本語関係を emerge する.

emerge -k canna kinput2 
rc-update add canna default 
emerge -k kochi-substitute shinonome monafont mplus-fonts aquafont aquapfont mikachan-font

必要なものの emerge が終わったので,設定に入る.

まず,VNC が X のスタートアップに使う ~/.vnc/xstartup に以下を書き込む.

if [ -x /usr/X11R6/bin/kinput2 ] ; then
    /usr/X11R6/bin/kinput2 -canna &
    XMODIFIERS="@im=kinput2"
    export XMODIFIERS
fi 
export LANG="ja_JP.UTF8"
exec icewm-session 

そして,vnc 単体で起動したときと xdm を使ったときで同じ振る舞いをするように

ln -s ~/.vnc/xstartup ~/.xsession

でリンクを張っておく.

次にフォントサーバ Xfs の設定をする.まず,常時起動にする.

rc-update add xfs default

次にフォントパスの指定をする.編集するファイルは /etx/X11/fs/config で,以下を行う.

tcpを使いたいのでコメントアウト
# no tcp, use sockets!
# no-listen  =  tcp
catalogue に追加
	/usr/share/fonts/shinonome,
	/usr/share/fonts/monafont,
	/usr/share/fonts/mplus,
	/usr/share/fonts/aquafont,
	/usr/share/fonts/aquapfont,
	/usr/share/fonts/mikachan-font,

さらに,Xfs のポート設定をするために /etc/conf.d/xfs の書き換えをする.

XFS_PORT="7100"

以上の設定が正しいかどうかは,/etc/init.d/xfs start したあとに

xfsinfo -server localhost:7100

で正しい応答が示されればいい.

ここまでの設定で,手動でVNCサーバを立ち上げれば接続できるようになっているはず.VNCサーバの立ち上げは以下のコマンドでできる.

vncserver :1 -depth 24 -geometry 1024x768 -compatiblekbd -fp tcp/localhost:7100

そして,ホストOS の方から VNCclient で hogehoge:1 に接続すれば X が起動する.

続いて,一々ログインして手動で VNCserver を起動しなくてもいいように xinetd の設定をする.

まずはVNC接続をサービスに登録するため, /etc/services に以下を追加.

vnc-1024x768x24         5950/tcp                        # vnc server
vnc-1280x1024x24        5960/tcp                        # vnc server

これは,画面の解像度などに応じてポート 5900 以上に適当にエントリを作る.このポート番号から 5900 を引いたものがVNCのディスプレイ番号になる.なので,上の設定は 50 番で XGA, 60番で SXGA となる.

続いて,xinetd の設定ファイルを追加する.設定ファイルは画面サイズごとに作る(正確にはサービスごとに).

/etc/xinetd.d/vnc-1024x768x24 を以下のとおり作る.

service vnc-1024x768x24
{
        disable         = no
        socket_type     = stream
        wait            = no
        only_from       = 192.168.0.0
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -compatiblekbd -depth 24 -geometry 1024x768 -fp tcp/localhost:7100
        log_on_failure  += USERID
}

同様に /etc/xinetd.d/vnc-1280x1024x24 を以下のとおり作る.

service vnc-1280x1024x24
{
        disable         = no
        socket_type     = stream
        wait            = no
        only_from       = 192.168.0.0
        user            = nobody
        server          = /usr/bin/Xvnc
        server_args     = -inetd -query localhost -once -compatiblekbd -depth 24 -geometry  1280x1024 -fp tcp/localhost:7100
        log_on_failure  += USERID
}

最後に,xinetd を常時起動にして xinetd の設定終了.

rc-update add xinetd default 

次に,ディスプレイマネージャ(GUIのログイン処理) XDM の設定をする.

作業としては以下のとおり.

/etc/X11/xdm/Xservers のサーバを Xvfb に変更
/etc/X11/xdm/Xaccess  の * で始まる行のコメントアウトはずす(上から二つ)
/etc/X11/xdm/xdm-config の最後の行(requestPort)をコメントアウト

/etc/init.d/xdm start として立ち上げてみて,

外部から vnc でつなげてログイン画面がでることを確認してから常時起動の設定をする.

rc-update add xdm default 

ちなみに,Xサーバの設定が間違っているとGentoo全体が立ち上がらなくなる可能性あり.

そうなったら gentoo.colinux.xmlでシングルユーザモードにして立ち上げて修正する.

    <bootparams>root=/dev/cobd0 single</bootparams>

ちなみに,Windows 側の VNC としては Gentoo も使っている tightvnc のほか,

それの改良版(?)である UltraVNC やオリジナルの系統である RealVNCがある.

とりあえず,Gentoo にあわせて tightvnc をダウンロードしてインストールし,hogehoge:50 に接続すると XGA のログイン画面が現れ,ログインすると IceWM が起動することが確認できる.

ちなみに起動の様子はこんなもん(xdm, icewm).

次は GNOME と GDM へ.

宙を舞うひき肉

今日の夕飯はシチューだ.作らねば.

ということでひき肉を塊のまま炒めようとパックからなべに移したのだが,何を血迷ったか半分だけなべの外側に折れて出てしまった.幸いなことにまだなべに張り付いているため落ち着いてうまく対処すればなべの中に戻る.しかし,当然のようにあせって対処したため思わぬ力がひき肉の塊にかかってしまい... その塊はものの見事に宙を舞いましたとさ.しかもかなりの回転数で回転しながら... 着地点がなべの中でなかったことはいうまでもない.

後片付けが非常に面倒であったこともいうまでもない.

Installation of coLinux with Gentoo

突然 coLinux を使ってみたくなってインストールしたので,その記録を残してみる.

まずはhttp://www.colinux.org/ から 0.6.2 のインストーラ(coLinux-0.6.2.exe)をダウンロード.そして, インストーラを実行して適当なディレクトリにインストール(例えばN:\coLinux).インストールオプションは,WinPcap は使う予定が無いのでチェックをはずして,さらに Gentoo をインストールするのでルートイメージのダウンロードはしない.Gentoo のルートイメージは別途 Wiki からたどってダウンロード.ルートイメージをcoLinuxのインストールディレクトリにでも展開する.

ちなみに解凍されるルートイメージは 512M なので,/usr なども同一イメージ上に作成するのであれば topo\topoenlarge.bat を使って適当にサイズを大きくする(4Gぐらいほしいなぁ).別のイメージを用意するならば,cygwin の dd とかで適当なサイズのファイルを作っておく(フォーマットはマウント後に普通にやればいい).

で,以下のような感じで設定ファイル gentoo.colinux.xml を書いて保存.

<?xml version="1.0" encoding="UTF-8"?>
<colinux>
    <block_device index="0" path="\DosDevices\n:\coLinux\gentoo512" enabled="true" />
    <block_device index="1" path="\DosDevices\n:\coLinux\swap64" enabled="true" />
    <bootparams>root=/dev/cobd0</bootparams>
    <initrd path="initrd.gz" />
    <image path="vmlinux" />
    <memory size="256" />
    <network index="0" type="tap" />
    <block_device index="2" alias="hdc" path="\Device\Cdrom0" enabled="true" />
</colinux>

起動は以下のコマンドで行う(バッチファイルでも書いて置けば楽).

colinux-daemon.exe -t nt -c gentoo.colinux.xml

あと,coLinux 側からネットワークを使うため,ホストPCのネットワークインターフェースとcoLinux の TAP ドライバをブリッジ接続しておく.

引き続きGentoo側の設定をする.

まず,portage のスナップショットを取ってくる(emerge sync でもいいけど).そのために,とりあえず手動でネットワークの設定をしておく(DHCP がイメージに入っていないので).

ifconfig eth0 192.168.0.4 netmask 255.255.255.0
ifconfig eth0 up
route add default gw 192.168.0.1
wget ftp://ftp.isu.edu.tw/pub/Linux/Gentoo/snapshots/portage-yyyymmdd.tar.bz2
tar -xvjf portage-yyyymmdd.tar.bz2 -C /usr

この作業は大量の画面出力を伴うが, coLinux のコンソールの挙動がおかしいので最後の tar コマンドは /dev/null へリダイレクトしておいたほうが無難かも.

次に,swap パーティションを大きくする.適当に大きなサイズ,ここでは512メガのファイルを swap512 という名前で手適当に作って(cygwin の dd コマンドで十分)

   <block_device index=\"2\" path=\"\DosDevices\n:\coLinux\swap512\" enabled=\"true\" />

の行を gentoo.colinux.xml に追加してマウントできるようにし,gentoo のほうで

mkswap /dev/cobd/2

を実行して swap 用にする.そして, gentoo.colinux.xml を書き換えて

    <block_device index="1" path="\DosDevices\n:\coLinux\swap512" enabled="true" />

にする.これで swap パーティションの切り替え終了.

あとは基本的に Gentoo のインストールに従うだけでしょう.http://www.gentoo.org/doc/ja/gentoo-x86-install.xmlの「13. ステージ3から始める場合」以降からで.

ホスト名の設定

echo hogehoge > /etc/hostname

タイムゾーン設定

ln -sf /usr/share/zoneinfo/Japan /etc/localtime

システムロガーとCronのインストール

emerge -k syslog-ng
rc-update add syslog-ng default
emerge -k vixie-cron
rc-update add vixie-cron default

ルートパスワード設定

passwd

ネットワーク設定

/etc/conf.d/net で eth0 を dhcp にして gateway の設定もなくすDHCPを使うので dhcpcd を入れて自動で立ち上げるように設定

emerge -k dhcpcd
rc-update add net.eth0 default

SSHを常時使用に

rc-update add sshd default 

その他に必要なものとして, screen, vi は必須なので入れておく.

emerge -k screen
emerge -k vim

次は X の設定で.

RMagick Compilation on Cygwin Failed...

Cygwin 上の ruby に RMagick をインストールしようとしたら

checking for InitializeMagick in -lMagick... no
configure: error: Can't install RMagick. Can't find libMagick

と怒られた.いや,libMagick-devel 入れてるし /usr/lib/libMagick.a あるし.ということで config.log を見てみると...

/usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -lxml2

をい,libxml2 が見つからないんじゃんと.何でこんなオプション(-lxml2)がここで付いているのか不明だが,これもちゃんとチェックしとけよ configure .とりあえず libxml2-devel をインストールしてやったら ./configure がちゃんととおりましたとさ.

次は make で.C のコンパイルは成功してちゃんと shared library ができたらしい.が,その後のテストで RMagick.so のロードに失敗したと文句を吐きまくる.Cygwin で shared library って特別な作り方が必要だっけ? とりあえず面倒なので gem でのバイナリインストールに切り替える.gen 自身が入っていなかったので落としてきて(RubyGems)インストール

ruby setup.rb

続いて RMagick のバイナリアーカイブを解答して gem でインストール

gem install RMagick-win32-1.7.0-mswin32.gem

よし,動くだろう.ということで

ruby -e 'require "RMagick"'
/usr/lib/ruby/site_ruby/1.8/i386-cygwin/RMagick.so: dlopen, Win32 error 126 - /usr/lib/ruby/site_ruby/1.8/i386-cygwin/RMagick.so (LoadError)
        from /usr/lib/ruby/site_ruby/1.8/RMagick.rb:11
        from -e:1:in `require'
        from -e:1

ダメじゃん.

今日は日が悪いらしいのでまた今度にしよ

RMagick Compilation with Older GCC

CGI での画像操作に ImageMagick の Ruby interface である RMagick を使いたい.ということで RMagick をサーバ上でコンパイルしたのだが,少々問題発生.

RMagick は古い gcc2.95 とかでコンパイルすると -std=gnu99 オプションのせいでコンパイルがこける.なので,ext/RMagick/extconf.rb.in の

$CFLAGS = "-std=gnu99 -Wall -g @CFLAGS@"

$CFLAGS = "-Wall -g @CFLAGS@"

に書き換えてオプションをはずしてしまう.これでコンパイルできる.ついでに,インストール先を変えた場合パスを通しておかないと動かないので,たとえば

./configure --prefix=/home/ls-al/local/usr/

としたときには

ruby -I/home/ls-al/local/usr/lib/ruby/site_ruby/1.8/ -I/home/ls-al/local/usr/lib/ruby/site_ruby/1.8/i386-freebsd4 -e'require "RMagick"'

みたいに RMagick.rb, RMagick.so へのパスを渡す.一般的には次のような感じだと思う.

./configure --prefix=_PREFIX
ruby -I_PREFIX/lib/ruby/site_ruby/1.8/ -e'require "RMagick"' -I_PREFIX/lib/ruby/site_ruby/1.8/_ARCH

Home > Archives > 2005年04月

Search
Feeds

Page Top