求む、LG ボランティア
LG ではこのコラムのヘルパーを募集しています。業務量は1号に付き 6 - 8 時間程度。業務内容は送られた HTML ファイルから載せるもの、まとめるものの検討、記事の減量、プレスリリースの要約など。テキストエディタを使えばはできることばかりです。もしボランティアをしてみたいという人は gazette@ssc.com までメールを下さい。
Linux Journal 9月号発売中。今月の特集は組込みシステム。
▼▼▼ディストリビューション関連ニュース▼▼▼Caldera Systems, Inc. は Linux 2.4 テクノロジプレビューをリリース。Java HotSpot、glibc 2.1.91、KDE 2.0 開発版スナップショットなどが搭載されている。
Caldera Systems, Inc. と The Santa Cruz Operation, Inc., (SCO) は Caldera が SCO サーバソフトウェア部門とサービス部門を買収すると発表した。
Caldera Systems, Inc. と Tarantella, Inc. は Tarantella ウェブベースソフトウェアを Linux にバンドルすると発表。Caldera OpenLinux アプリケーションサーバと Tarantella は集中管理とアプリケーションの配備を安定した低コストプラットフォームで提供することができ IT コストも低減する。
InterLan Technologies と Caldera systems は戦略的提携を発表。
●DebianDebian GNU/Linux 2.2、"joel 'Espy' Klecker" リリース
Debian Project は Debian GNU/Linux の最新版 Debian GNU/Linux 2.2 をリリースした。今回の開発には18ヶ月かかっている。今回からは PowerPC と ARM が新たにサポートされている。又ソフトウェアの選択、X ウィンドウシステムのインストールなどが簡略化されており、ネットワーク設定も DHCP を使って簡単にできるようになった。
KONDARA MNU/LINUX 2000 はシングルバイナリで多国語化を実現。現在、言語を変えるには Linux システムの再インストールが必須だが Kondara はこれを一つのバイナリで実現した。マルチプラットフォームはシングルソースで実現されている。ソースコードにわずかな変更をするだけで Alpha と Intel に対応できる。カーネルは 2.2.16 だ。
www.df-usa.com
Macmillan は Linux for Windows のアップデートを発表した。このソフトは既存の Windows パーティションにインストールすることができ初心者は簡単に Linux を試すことができる。ベースは Linux-Mandrake 7.1 だ。インストールに関するサポートはインターネットファクスで提供される。
●LuteArgent Resources Ltd. が Lute Linux Corp. を買収。LuteLinux の特徴は Linux コミュニティへの関わりとそのコミュニティとの相互の情報交換に務めてきたことだろう。非 Linux ユーザへの情報提供にも熱心だった。
●MandrakeLinux-Mandrake が Sun Microsystems の SPARC と UltraSPARC とに移植された。Linux-Mandrake 7.1 ベースの Corporate Server 1.0 は迅速に基本的なサーバ機能を構築することが可能。WizDrake で幅広い設定やアプリケーションの設定などが可能。
●ProgenyProgeny Linux Systems は Ian Murdock と Bruce Perens の新しい企業だ。目的は Progeny Debian のリリースと Linux NOW(Network of Workstation) だ。Linux NOW の基本 OS が Progeny Debian になる予定。詳細は http://www.progenylinux.com/news
●Red HatRed Hat, Inc. は Red Hat Linux 6.2 をベースにした Red Hat Availability Server 1.0 をリリースした。Red Hat Availability Server 1.0 は特別のクラスタリングソリューションで、個々のサーバをクラスタにまとめ、信頼性の高いネットワークシステムを構築することが可能。ビルトインのセキュリティ機能が通常の侵入からシステムを防護する。finger, talk, wall や他のデーモンはディスエーブルになっているか、インストールされていない。
●RockRock Linux はインストールが難しいディストリビューションだ。と言われれば興味を引かれるだろうか。Rock Linux はそういう人のためのディストリビューションだ。ユーザフレンドリと言うより管理者向きのシステムで従来通りのコマンドライン、シェルスクリプトでシステムの設定をする。もちろん X-Window は付属している。
http://www.rocklinux.org
Slackware 7.1 がリリースされた。
www.slackware.com
Stormix Technologies inc. は Storm Linux 2000 スターターエディションをリリースした。これは Windows ユーザを対象にしたインストールが容易なディストリビューションで、Debian/GNU Linux 2.2 をベースにしている。
Stormix Technologies Inc は Storm Firewall をリリースした。SOHO をターゲットにしたネットワークセキュリティソリューションだ。GUI で簡単なオプションか高度な設定かを選ぶことができ、IP マスカレード機能も利用できる。
www.stormix.com
SuSE Linux 7.0 のドイツ語バージョンがリリースされた。英語版は9月にリリースの予定。
英語版:http://www.suse.com
Trustix Secure Linux 1.1 がリリースされた。http://www.trustix.net/download/ か http://www.trustix.net/mirrors.php3 からダウンロードできる。基本的にはメンテナンスリリースだが、データベースサポート、メールフィルタリングなどの新機能も取り入れられている。Trustix Secure Linux はサーバ市場をターゲットにしている。詳細は http://www.trustix.net/products/trustix-1.1/
▼▼▼その他のニュース▼▼▼●今後開催予定のコンファレンスとイベント
|
Linux Business Expo (co-located with Networld + Interop event) |
September 26-28, 2000 Atlanta, GA www.key3media.com/linuxbizexpo
|
|
Atlanta Linux Showcase |
October 10-14, 2000 Atlanta, GA www.linuxshowcase.org
|
|
ISPCON |
November 8-10, 2000 San Jose, CA www.ispcon.com
|
|
Linux Business Expo (co-located with COMDEX event) |
November 13-17, 2000 Las Vegas, NV www.key3media.com/linuxbizexpo
|
|
USENIX Winter - LISA 2000 |
December 3-8, 2000 New Orleans, LA www.usenix.org
|
|
LinuxWorld Conference & Expo |
January 30 - February 2, 2001 New York, NY www.linuxworldexpo.com
|
●Linux Square
ITsquare.com は Linux Square を立ち上げた。これは既存の b2b 市場を補完するためだ。20以上の Linux 開発企業にアクセスでき、ウェブベースのフレームワークでセキュアな調達が可能。
●MaxSQLMySQL AB と Sleepycat Software, Inc. は MaxSQL をリリースした。オープンソース、ハイパフォーマンスのトランザクション SQL サーバだ。2社が協力し MySQL のデータアクセス言語と Sleepycat の Berkley DB のハイパフォーマンストランザクションサービスを統合した。MaxSQL は www.maxsql.com からダウンロードできる。MaxSQL は信頼性、スケーラビリティ、パフォーマンスに優れたオープンソースリレーショナルデータベースエンジンだ。
●Linux エキスパートのための新サイトIQLinux.com は Linux エキスパートのためのテクニカルサポートウェブサイトを立ち上げた。同サイトでメンバはビジネスリレーションの構築やコンサルティングチーム、交渉、契約、価格設定などができる。
▼▼▼ソフトウェア関連ニュース▼▼▼●FIASCO
FIASCO がリリースされた。FIASCO は低ビットレート用のビデオ圧縮システムだ。その性能は JPEG や MPEG をしのぐ。ライブラリ関連情報は http://ulli.linuxave.net/fiasco から。
●その他のソフトウェア画像処理、ペイントアプリケーションの Corel PHOTO-PAINT がダウンロード可能。
11カ国語に対応した Sun の StarOffice 5.2 がダウンロード可能。
Intel の Universal Plug and Play (UPnP) Software Development Kit (SDK) 1.0 がダウンロード可能。
Linux では好みのウィンドウマネージャを選ぶことができる。ウィンドウマネージャの使い方やウィンドウマネージャそのものについて説明しよう。しかしウィンドウマネージャの設定に関してはそれぞれのマニュアルを参照して欲しい。
Linux で利用できるウィンドウマネージャの主なものは次の通りだ。
| ウィンドウマネージャ | 説明 |
| TWM | XFree のデフォルトのウィンドウマネージャ、こだわりのある人向けか |
| FVWM | Linux では一番使われているウィンドウマネージャ |
| FVWM 2 | FVWM の改良版、使ったことはないがテーマと色は多い |
| FVWM 95 | Windows 95 風の FVWM |
| AfterStep | NextStep 風のウィンドウマネージャ、ワーフとパネルがある |
| Enlightenment | 使ったことはないが非常にカラフル(らしい)。ウィンドウマネージャというよりは遊びに近い?;-) |
| KWM | KDE デスクトップ用のウィンドウマネージャ、使用も設定も簡単 |
| IceWM | スクラッチから書かれたウィンドウマネージャ、Windows 95 風のタスクバーがあり主観的には起動は KDE よりかなり速い |
これらが Linux では一番使われているが、その他 olvwm、wm2、Windowmaker などもある。
友人に Linux の素晴らしさを聞いて使い始めてから2年になる。最初に使い始めたのは TWM だが、Linux が初めてなので感動していた。1999年の春に ダイアルインの BBS を運用しようと考えた。それには Linux が最適だったので Linux を再インストールし研究を続けた。その当時の主な関心はシステム設計とプログラムだ。Linux の情報が増加するにつれて TWM の設定もできるようになったがより使いやすいものを探して FVWM 95 に変更した。Windows 95 を使っていたから親しみやすい。10月には Debian をインストールした。とてもモダンなディストリビューションでインターネットアクセスも容易だ。それ以後は Windows 95/98 の利用頻度が減少した。Debian には KDE と GNOME が付属していたがどちらもまだ完全とは言えなかったので FVWM と AfterStep をインストールした。
FVWM は FVWM 95 や TWM よりは優れているが概観は AfterStep が好みだ。ドックも気に入ったのでそれ以来 AfterStep を使っている。ディスク容量が不足して SuSE Linux はインストールできなかった。しかし2000年春に Athlon 600 のシステムを手に入れたので SuSE Linux 6.4 をインストールした。ディスク容量の問題もないので KDE と GNOME をインストールして使っている。
ドイツの Linux 関連雑誌は KDE の記事が多いので最初は KDE を試した。非常に強力なデスクトップで MS の製品よりも遥かに優れている。そこでログインも KDM を使うことにした。しばらく使っているうちに IceWM を見つける。KDE の外観はより Windows 98に近いが IceWM は UNIX らしい。IceWM は KDE の持つ機能をほとんど有し通常の方法で設定できる。が、KMail という E-Mail クライアントや kfm などの KDE アプリケーションはいまだに使用している。現在 Windows 98 を使っているのはゲームと Atari ST エミュレータのためだ。
ウィンドウマネージャは大きく三つに分類できる。TWM のような単純なウィンドウマネージャ、FVWM や AfterStep のような機能豊富だがカスタマイズには設定ファイルを修正する必要のあるもの、KDE のような機能豊富で設定も GUI でできるもの。Linux の初心者には3番目のカテゴリに属する KDE か GNOME がいいだろう。カラフルでデスクトップテーマやサウンドを使いたいなら FVWM2 か AfterStep がいい。Windows 95 の雰囲気を残したいなら FVWM95 か IceWM だ。スタートメニューやタスクバーが使える。IceWM の設定はいくつかに分かれていて変更も容易だ。従来の Linux の雰囲気を好むなら FVWM1 がいいだろう。メモリに余裕がないなら KDE は諦めたほうがいい。メモリが少ないシステムには IceWM がお薦めだ。
それぞれのウィンドウマネージャの長所短所を簡単にまとめると次のようになる。
| ウィンドウマネージャ | 長所 | 短所 | 結論 |
| TWM | ほとんどのディストリビューションに付いている |
外観はあまりよくない メニューが大きい ワークスペースがない | こだわりのある Unix ユーザ向け |
| FVWM |
事実上標準のウィンドウマネージャ 設定やチップスに関する情報も多い 外観も悪くない |
設定ファイルが一つ GUIでの設定は不可 | 迷った場合には選択するのもいい。 初心者には薦めない |
| FVWM2 |
現代的にした FVWM テーマが使用可能 | GUI ベースの設定は不可 | FVWM の別種 カラフルなデスクトップを好む人にはいい |
| FVWM95 |
FVWM ベース タスクバー スタートメニュー |
GUI ベースの設定は不可 記憶する限りワークスペースは一つ | FVWM の別種 Windows 95 風の外観を好む人にはいい |
| AfterStep |
ワーフ NextStep 風の外観 |
ワーフの設定が難しい 記憶する限り GUI ベースの設定は不可 | NeXT か NextStep を使ったことがあるならこれがいい |
| KDE |
現代的な外観 テーマが使える スタートメニュー タスクバー上でドラッグアンドドロップに対応 多数のアプリケーションが付属 使用、設定が容易 ワークスペースが最大8個 GUI ベースの設定が可能 細かいカスタマイズが可能 |
多量のメモリを使用 外観が Windows に近すぎる | 完全なデスクトップソリューション 初心者には最適 |
| IceWM |
起動が早い メモリ使用量が少ない GUI ベースの設定が可能 タスクバー ワークスペースが4個 スタートメニュー テーマが使える | 設定ファイルを使ってカスタマイズ | 非常に強力なウィンドウマネージャ メニューの設定が容易 初心者にもベテランにも最適 |
好みのウィンドウマネージャを探す際の参考にして下さい。
今月のHelpDexはこちらからご覧下さい。
多数のファイル名を一度に変更したいと思ったことは? 値がないときはデフォルトの値をセットする、ということが bash の文字列演算子を使えば可能です。${foo} のように使います。変数の置換には3つのパターンがある。
パターン照合には左からと右からの二通りある。演算子の例は次の通りだ。
| 演算子 | 機能 | 使用例 |
|---|---|---|
${foo#t*is} |
先頭から最小マッチ部分を削除する |
export $foo="this is a test"
|
${foo##t*is} |
先頭から最長マッチ部分を削除する |
export $foo="this is a test"
|
${foo%t*st} |
文末から最小マッチ部分を削除する |
export $foo="this is a test"
|
${foo%%t*st} |
文末から最長マッチ部分を削除する |
export $foo="this is a test"
|
これらを組み合わせるといろいろなことが可能になる。例えば次のスクリプトは ".html" という拡張子を ".htm" に変更する。
#!/bin/bash
# quickly convert html filenames for use on a dossy system
# only handles file extensions, not file names
for i in *.html; do
if [ -f ${i%l} ]; then
echo ${i%l} already exists
else
mv $i ${i%l}
fi
done
もう一つの便利な機能は置換だ。bash には4つの置換用の演算子がある。使用例は次の通りだ。
| 演算子 | 機能 | 使用例 |
|---|---|---|
${foo:-bar} |
$foo に値があれば $foo を返す。値がないか null の場合は bar を返す |
export foo=""
|
${foo:=bar} |
$foo に値があれば $foo を返し、$foo に値がないか null の場合は $foo に bar をセットして bar を返す |
export foo=""
|
${foo:+bar} |
$foo に値があれば bar を返す。値がないか null の場合は null を返す |
export foo="this is a test"
|
${foo:?"error message"} |
$foo に null 以外の値があればその値を返す。値がないか null の場合はエラーメッセージを表示する。エラーメッセージが表示されなければ parameter null or not set が表示される
|
export foo="one"
|
これらの演算子も便利だ。次の例ではコマンドラインからの引数がなければデフォルトの値を使用する。
#!/bin/bash
export INFILE=${1-"infile"}
export OUTFILE=${2-"outfile"}
cat $INFILE > $OUTFILE
bash に関して興味のある人は私のホームページ をご覧下さい。
ngrepはネットワークトラフィックを監視するツールで libpcap ライブラリを利用する。正規表現にも対応し表示するトラフィックを選択できる。ほとんどのディストリビューションには含まれていないがインストールから使用法までを説明しよう。
ソースコードは http://www.packetfactory.net/Projects/ngrep/ から入手できる。Redhat 6.2 を使っている場合はその前にhttp://www.tcpdump.org/releaseから libpcap を手に入れてインストールしておこう。コンパイルしてインストールする方法は次の通りだ。
$ tar xvzf libpcap-0.5.2.tar.gz
$ cd libpcap_0_5rel2
$ ./configure
$ make
$ su
Password: ********
# make install-incl
# make install-man
# exit
|
$ tar xzvf ngrep-1.38.tar.gz
$ cd ngrep
$ ./configure
$ make
$ su
Password: ********
# make install
# exit
|
ngrep を使用するにはサーチするパターンを決める必要がある。方法は libpcap スタイルと GNU grep スタイルの正規表現とがある。次の例では "ssword" というパターンを含むパケットを表示する。
[root@cherry /root]# ngrep -x ssword
interface: eth0 (192.168.1.0/255.255.255.0)
match: ssword
################################
T 192.168.1.20:23 -> 192.168.1.10:1056 [AP]
50 61 73 73 77 6f 72 64 3a 20 Password:
#########################exit
59 received, 0 dropped
[root@cherry /root]#
|
ngrep の使用法はいろいろあるが主要なものは libpcap スタイルのパケットフィルタリングだろう。フィルタはプリミティブと and, or の組み合わせからなる。プリミティブは シンボルネームとtype, direction, protocol の3つの修飾語からなる id だ。修飾語 type は id が参照するものを示し、host, net, port などのオプションをとる。デフォルトは host だ。type プリミティブの例は:host crashtestdummy, net 192.168.2, port80だ。
修飾語 direction は方向を示す。オプションは src と dst だ。修飾語 protocol は監視するプロトコルを制限する。protocol が指定されなければすべての ip パケットが監視される。オプションは tcp, udp, icmp だ。
プリミティブの組み合わせでより複雑な設定も可能だ。ホスト rose の telnet, ftp-data 以外のトラフィックを監視するにはhost dst rose and not port telnet and not port ftp-dataのようなフィルタを使う。
表1、ngrep のコマンドラインスイッチ
| -e | Show empty packets. |
|---|---|
| -n [num] | Match num packets, then exit. |
| -i [expression] | Search for the regular expression without regard to case. |
| -v [expression] | Search for packets not containing the regular expression. |
| -t | Print a YYYY/MM/DD HH:MM:SS.UUUUUU timestamp on each matched packet. |
| -T | display a +S.UUUUUU timestamp on each matched packet. |
| -x | Show the packets in the alternate hex and ascii style. |
| -I [filename] | Read from a pcap style dump named filename instead of live traffic. |
| -O filename | Write output to a pcap style file named filename. |
| -D | Mimic realtime by printing matched packets at their recorded timestamp. |
ngrep はトラブル処理時には便利だ。アプリケーションレベルのトラブルの場合には原因の切り分けができる。例えば cherry (192.168.1.10) から cuke (192.168.2.10) へ接続したいがうまくいかない場合のトラブル処理は次のようになるだろう。
症状:cherry からリモートネットワークのホストに接続できない。他のネットワークのホストには接続できる。同ネットワークの cherry 以外のホストはリモートネットワークにアクセスできる。
環境:関連するホストは cherry, rhubard(リモートネットワークへのゲートウェイ), cuke
仮定:問題は cherry かルーターの設定ミスらしい。
問題の絞込み:接続できないホストは cuke だけらしい。cuke の問題が解決できれば rhubarb に到達できるだろう。
アタックプラン作成:cherry から cuke に ping を飛ばしてトラフィックを ngrep で監視する。(ngrep host cherry)
結果:cuke へ ping を送出した時の出力は次の通り。
[root@cherry /root]# ngrep -e -x host 192.168.1.10 interface: eth0 (192.168.1.0/255.255.255.0) filter: ip and ( host 192.168.1.10 ) # I 192.168.1.10 -> 192.168.2.10 8:0 eb 07 00 00 31 86 a7 39 5e cd 0e 00 08 09 0a 0b ....1..9^....... 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b ................ 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b .... !"#$%&'()*+ 2c 2d 2e 2f 30 31 32 33 34 35 36 37 ,-./01234567 # I 192.168.1.1 -> 192.168.1.10 5:1 c0 a8 01 0b 45 00 00 54 25 f2 00 00 40 01 d0 52 ....E..T%...@..R c0 a8 01 0a c0 a8 02 0a 08 00 dc 67 eb 07 00 00 ...........g.... 31 86 a7 39 5e cd 0e 00 08 09 0a 0b 0c 0d 0e 0f 1..9^........... 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f ................ 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f !"#$%&'()*+,-./ 30 31 32 33 34 35 36 37 b4 04 01 00 06 00 00 00 01234567........ 00 10 00 00 01 00 00 00 e8 40 00 00 .........@.. exit 2 received, 0 dropped [root@cherry /root]#2 パケットが表示されている。一つは タイプ8、コード0の ICMP パケット、ping リクエストだ。もう一つはタイプ5、コード1の ICMP パケット、リダイレクトでゲートウェイマシンの mango から送られている。
結果の検証:ホスト mango が絡んでいるとは予想外。"-v" スイッチで ICMP リダイレクトを監視すれば cherry が rhubarb ではなく 192.168.1.11 へリダイレクトされているのが分かる。正しいゲートウェイに送出されていなければアクセスできない。これは cherry で 192.168.2.0/24 への route を追加すれば解決する。
設定を修正後、正しくアクセスできた。
CD-Writing HOWTO と cdrecord のドキュメントは http://www.guug.de/~winni/linux/ と www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/cdrecord.html に豊富に揃っている。古いドライブやカーネルを使うのでなければカーネルの再コンパイルをする必要はない。ここでは簡単に CD を焼く方法を説明しよう。これができればオーディオ、ブータブル、マルチセッション、ハイブリッドディスクなどにも手が届くようになる。必要なものは次の通り。
まずドライブをインストールする。ケーブルの向き、マスタ、スレーブの設定などを間違えずに。BIOS の設定は必要ない。起動時に BIOS が認識しているかどうかをチェックしておこう。
インストールが完了したら SCSI エミュレーションの設定だ。
最後はいよいよ書き込みだ。
この記事はhttp://www.nber.org/cdrecord.htmlで見ることができる。今月はもう一つ CD-R/RW に関する記事がある。
2年前に発足した Linux Professional Institute (LPI) は Linux に関する知識、技術の認定の標準化、多国語化が目的だ。2年足らずで Linux Professional Institute Certification (LPIC) は事実上の標準となりつつある。http://www.lpi.org/はすでに日本語、ドイツ後化が終了し、フランス語と中国語化が進んでいる。ボランティアによる他の言語への翻訳も今後進むだろう。翻訳のボランティアを望んでいる人はpdunstan@pfeffer.eduまで連絡を下さい。LPI-Japan も設立された。その他 LPI 中国なども問い合わせがある。北京の IDG ショー(8月29日〜9月1日)、同台北(9月7日〜9日)、同クアラルンプール(11月7日〜9日)などにも招待されている。
企業関連では MacMillan から LPIC Exam 101 に関する書籍が出版された。IBM も LPIC を取りいれている。
LPI 準備のウェブサイトは http://www.lpi.org/c-preperation.html。Linux トレーニングに関する情報はhttp://www.lintraining.comから得られる。
ウェブベースのレベル1コースは CyberState 大学でスタートした。費用は995ドルで、LPI のレベル1の受験資格が得られる。
LPI は短期間であっという間に広がってしまった。日本語のウェブサイトはhttp://www.yesitis.co.jp/LPI/だ。LPIC 試験の情報はhttp://www.vue.comから得られる。
CVS は優れたソフトウェアバージョン管理プログラムだ。プログラミング初心者やフリーソフトを使いたい人には最適だ。
まず読者諸君が bash を使っているものとする。複数でアクセスすることも出来るが今回は1ユーザ、"mark" で使用するものと仮定する。"mark" で使用する前に "root"で次のコマンドを実行しよう。
mkdir /usr/local/cvs
chown mark /usr/loal/cvs
つぎに "mark" でログインして .bashrc に次の行を追加する。
CVSROOT=/usr/local/cvs
保存したら "source .bashrc" を実行しよう。これで /usr/local/cvs がデフォルトのディレクトリになる。初めにディレクトリも作成しておこう
mkdir /usr/local/cvs/CVSROOT
ホームディレクトリに "Temp_Source" というディレクトリを作って新しいファイルを置く
mkdir Temp_Source
ls > Temp_Source/File1.txt
ls Temp_Source/* > Temp_Source/File2.txt
Temp_Source のファイルを CVS の管理下に置く。
cd Temp_Source
cvs import -m "Test Import" My_Files Revision1 start
これで作業ディレクトリを作成する準備が整った。早速ファイルを作業ディレクトリにダウンロードしてみよう。CVS からファイルをチェックアウトするときにはディレクトリを作成してくれる。今回は "My_Files" というディレクトリが作成される。では CVS からファイルをダウンロードしよう。
cvs checkout My_Files
My_Files ディレクトリで新しいファイルを作成し CVS リポジトリへ追加してみよう。
ls /etc > File3.txt
cvs add File3.txt
ファイルは追加されたが実際にはアップロードはされていない。
cvs commit
"cvs commit" はデフォルトのエディタを開くのでファイルを保存しエディタを終了する。終了時に続けるかどうか尋ねられるので "continue" を選択する。これでアップロードは終了だ。
cvs にファイルを追加したので今度はファイルを削除してみよう。
rm File3.txt
cvs remove File3.txt
cvs commit
最初のコマンドでファイルを実際に削除し、次のコマンドで現在のディレクトリの設定を変更し最後のコマンドで cvs リポジトリを変更する。
ファイルの追加と削除ができるようになったので今度はファイルを修正してみる。方法は次の通りだ。
ls /var >> File2.txt
cvs commit
他の人が管理しているリポジトリをダウンロードするには次のようにしよう。
cvs update -dP
cvs は優れたソース管理プログラムだ。メジャーのディストリビューションには標準で添付されいるし、メジャーのフリーソフトウェブサイトでも cvs を利用している。複数のバージョンがあるドキュメントを管理するには最適のプログラムだ。
rpm を使わずに サービスをインストールするのは簡単だ。筆者は Debian GNU/Linux 以外ではほとんど rpm を使用していない。これからインストールするソフトウェアは非常に人気のある ウェブ/データベースプログラムで、学習用としても最適のプログラムばかりだ。さらにそのパワーも非常に強力なものばかりだ。フリーソフトウェアの費用抑制効果は抜群でその限界は人とハードウェアだと言ってもいいだろう。
今回インストールするプログラムは次の通りだ。
これらのプログラムをインストールする手順は次の通りだ。
#### Before anything is done, goto the apache/src #### directory and edit Configuration.tmpl add uncomment info and so. #### Answer y to just configure apache with mod_perl, ### but don't let mod_perl build apache. ### Add # AddModule modules/mod_snake/libmod_snake.a # to the end of src/Configuration.tmpl in apache. ### Then do this stuff. cd mysql-3.22.32 mkdir /usr/local/mysql-3.22.32 ./configure --prefix=/usr/local/mysql make make install cd ../postgresql-7.0.2/src mkdir /usr/local/postgresql ./configure --prefix=/usr/local/postgresql --with-perl -with-odbc make make install chown -R postgres /usr/local/postgresql ### Just configure apache, but don't build it cd ../apache_1.3.12 make clean ./configure --prefix=/usr/local/apache cd ../mod_snake-0.2.0 ./configure --prefix=/usr/local/mod_snake --with-apache=/usr/local/src/apache_1.3.12 make make install ### Do not have perl build apache, just let is configure apache cd ../mod_perl-1.24 make clean perl Makefile.PL EVERYTHING=1 APACHE_PREFIX=/usr/local/apache make test make install ### Build apache cd ../apache_1.3.12 make make install ### For those of you who might try to get php3 working with php4, ### you can try to get the stuff installed, but I got the error #Syntax error on line 208 of /usr/local/apache/conf/httpd.conf: #Cannot load /usr/local/apache/libexec/libphp3.so into server: /usr/local/apache/libexec/libphp3.so: undefined symbol: dlst_first #/usr/local/apache/bin/apachectl start: httpd could not be started ### Thanks to Chad Cunningham for metioning you can get both php3 and php4 ### working in Apache at the same time. I still had some errors, ### so I just abandoned php3. #cd ../php-3.0.16 #./configure \ #--enable-versioning \ #--with-pgsql=/usr/local/postgresql \ #--with-mysql=/usr/local/mysql \ #--with-config-file-path=/usr/local/apache/ --enable-track-vars \ #--with-apxs=/usr/local/apache/bin/apxs --with-xml #make #make install cd ../php-4.0.1pl2 ./configure \ --enable-versioning \ --with-pgsql=/usr/local/postgresql \ --with-mysql=/usr/local/mysql \ --with-config-file-path=/usr/local/apache/ --enable-track-vars \ --with-apxs=/usr/local/apache/bin/apxs --with-xml make make install cd .. mv Zope-2.2.0-src /usr/local/Zope chown -R nobody /usr/local/Zope cd /usr/local/Zope ### Setup the password and remember this password su - nobody 'python wo_pcgi.py ### My hack to get a password I can remember, very bad security risk su - nobody 'python zpasswd.py -u mark -p Something' ### Start the web servers su -c nobody '/usr/local/Zope/start' & chown -R nobody /usr/local/apache /usr/local/apache/bin/apachectrl start #### Execute this command so that php can find the mysql libraries ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.6.0.0 /usr/lib/libmysqlclient.so.6 ### Put this in your startup script for apache. ### this gets PHP working. LD_LIBRARY_PATH=/usr/local/postgresql/lib export LD_LIBRARY_PATH PATH=$PATH:/usr/local/postgresql/bin export PATH export LIBDIR=/usr/local/postgresql/lib /usr/local/apache/bin/apachectl start ### REMEMBER to initialize the database for postgresql and mysql. ### Execute the shell commands above ### For postgresql, mkdir /usr/local/postgresql/data chown -R postgres /usr/local/postgresql cd /usr/local/postgresql su postgresql -c '/usr/local/postgresql/bin/initdb -D /usr/local/postgresql/data' /usr/local/postgresql/bin/pg_ctl -D /usr/local/postgresql/data start ### To initialize MySQL cd /usr/local/src/mysql-3.22.32 chown -R postgres /usr/local/mysql su postgres -c 'scripts/mysql_install_db' su postgres -c '/usr/local/mysql/bin/safe_mysqld' & ### Remember to change the password for the server and to setup ### permissions for other users. #### Remember to setup permissions in MySQL and PostgreSQL for #### the username that Zope and Apache un under. #### Here are some httpd.conf file option I put at the bottomSetHandler perl-script PerlHandler Apache::OutputChain Apache::SSIChain Apache::Registry PerlSendHeader On Options ExecCGI AddType application/x-httpd-php4 .php4 ### I haven't yet done anything with the mod_snake module. #### These are my files and directgries in /usr/local/src Apache-OutputChain-0.07 Zope-2.2.0-src Apache-OutputChain-0.07.tar.gz Zope-2.2.0-src.tgz Apache-SSI-2.13 apache_1.3.12 Apache-SSI-2.13.tar.gz apache_1.3.12.tar.gz ApacheDBI-0.87 mod_perl-1.24 ApacheDBI-0.87.tar.gz mod_perl-1.24.tar.gz DBD-CSV-0.1023.tar.gz mod_snake-0.2.0 DBD-ODBC-0.28.tar.gz mod_snake-0.2.0.tar.gz DBD-Oracle-1.06.tar.gz mysql-3.22.32 DBD-Pg-0.95.tar.gz mysql-3.22.32.tar.gz DBD-XBase-0.161.tar.gz php-3.0.16 DBI-1.14 php-3.0.16.tar.gz DBI-1.14.tar.gz php-4.0.1pl2 Install php-4.0.1pl2.tar.gz Install~ postgresql-7.0.2 Msql-Mysql-modules-1.2214 postgresql-7.0.2.tar.gz Msql-Mysql-modules-1.2214.tar.gz
これらのツールを CVS と組み合わせて使用すれば非常に優れたツールとなるだろう。最近ではこれらの技術に関連する求人が増えてきているが、これらを学ぶ機会はそう多くはない。他のシステムではかなりの費用がかかるだろう。Linux ならすべてがフリーで揃う。
関連サイト
関数は非常に便利なものだ。形式は単純な一群のコードで簡単に呼び出すことができ、新たにシェルを起動することもない。簡単な関数の例を示そう。
#!/bin/bash
#
# "venice_beach" - translates English to beach-bunny
function kewl () # Makes everything, like, totally rad, dude!
{
[ -z $1 ] &&& {
echo "That was bogus, dude."
return
}
echo "Like, I'm thinkin', dude, gimme a minute..."
sleep 3
echo $@', dude!'
# While the function runs, positional parameters ($1, etc.)
# refer to those given the function - not the shell script.
}
clear
kewl $(echo "$@"|tr -d "[:punct:]") # Strip off all punctuation
このスクリプトは "I'm thinkin'....." の後に引数を表示する。
Odin:~$ venice_beach Right on Like, I'm thinkin', dude, gimme a minute... Right on, dude! Odin:~$ venice_beach Rad. Like, I'm thinkin', dude, gimme a minute... Rad, dude! Odin:~$ venice_beach Dude! Like, I'm thinkin', dude, gimme a minute... Dude, dude!
関数を利用する上で一つ注意しなければなら名ことは "exit" ステートメントの使用だ。スクリプトがカレントシェルで実行されているとき "exit" が実行されるとカレントシェルをログオフしてしまいシェルがハングアップする可能性がある。関数を終了させる場合は "return" を使うようにしよう。
今まではスクリプトがファイルとして保存され再使用されるということを前提にしてきたが一度だけしか使わない場合、もしくは保存したくない場合には次のようにする。
Odin:~$ (
> echo
> [ $blood_caffeine_concentration -lt 5ppm ] &&& {
> echo $LOW_CAFFEINE_ERROR
> while [ $coffee_cup != "full" ]
> do
> brew ttyS2 # Enable coffeepot via /dev/ttyS2
> echo "Drip..."
> sleep 1m
> done
> echo
>
> while [ $coffee_cup != "empty" ]
> do
> sip_slowly # Coffee ingestion binary, from coffee_1.6.12-4.tgz
> done
> }
>
> echo "Aaaahhh!"
> echo
> )
Coffee Not Found: Operator Halted!
Drip...
Drip...
Drip...
Aaaahhh!
Odin:~$
"(" はシェルにスクリプトが続くことを指示する。シェルはサブシェルを起動してその後に続くスクリプトを実行する。単純なループや "if" ステートメントなどは次のように表現できる。
Odin:~$ for fname in *.c > do > echo $fname > cc $fname -o $(basename $fname .c) > done
シェルで実行するワンタイムスクリプトでは "#!/bin/bash" も必要ない。又最終コマンドを繰り返すアップアローを押すとちゃんと1行で表示してくれる。
優れたシェルスクリプトを書くにはプログラムについて学ばなければならない。コマンドを熟知するだけでは問題を解決できない。筆者は X Window の起動後に背景を自動的に変更するスクリプトを書き、".xinitrc" 実行時に起動するようにしたのだが X Window がスタートする前に背景変更スクリプトが起動してしまったりして正しく動作させるまで何度も思考錯誤を繰り返したことがある。
昔 ASCII コードと ACSI エスケープシーケンスを使って見栄えのするメニューをつくるということを良くやった。メニューを作るにはいくつかの機能が必要になる。カーソルの操作、テキストの属性の変更、それに色などだ。単純な例は次のようになる。
#!/bin/bash
#
# "ho-hum" - a text-mode menu
clear
while [ 1 ] # Loop `forever'
do
# We're going to do some `display formatting' to lay out the text;
# a `here-document', using "cat", will do the job for us.
cat << !
M A I N M E N U
1. Business auto policies
2. Private auto policies
3. Claims
4. Accounting
5. Quit
!
echo -n " Enter your choice: "
# Why have I not followed standard indenting practice here? Because
# the `here-doc' format requires the delimiter ('!') to be on a line
# by itself - and spaces or tabs count. Just consider everything as
# being set back one indent level, and it'll all make sense.
read choice
case $choice
in
1|B|b) bizpol ;;
2|P|p) perspol ;;
3|C|c) claims ;;
4|A|a) acct ;;
5|Q|q) clear; exit ;;
*) echo; echo "\"$choice\" is not a valid option."; sleep 2 ;;
esac
clear
done
改良版を次に示す。
#!/bin/bash
#
# "jazz_it_up" - an improved text-mode menu
tput civis # Turn off the cursor
while [ 1 ]
do
echo -e '\E[44;38m' # Set colors: bg=blue, fg=white
clear # Note: colors may be different in xterms
echo -e '\E[41;38m' # bg=red
for n in `seq 6 20`
do
tput cup $n 15
echo " "
done
echo -ne '\E[45;38m' # bg=magenta
tput cup 8 25 ; echo -n " M A I N M E N U "
echo -e '\E[41;38m' # bg=red
tput cup 10 25 ; echo -n " 1. Business auto policies "
tput cup 11 25 ; echo -n " 2. Private auto policies "
tput cup 12 25 ; echo -n " 3. Claims "
tput cup 13 25 ; echo -n " 4. Accounting "
tput cup 14 25 ; echo -n " 5. Quit "
# I would have really liked to make the cursor invisible here -
# but my "xterm" does not implement the `civis' option for "tput"
# which is what does that job. I could experiment and hack it
# into "terminfo"... but I'm not *that* ambitious.
echo -ne '\E[44;38m' # bg=blue
tput cup 16 28 ; echo -n " Enter your choice: "
tput cup 16 48
read choice
tput cup 18 30
case $choice
in
1|B|b) bizpol ;;
2|P|p) perspol ;;
3|C|c) claims ;;
4|A|a) acct ;;
5|Q|q) tput sgr0; clear; exit ;;
*) tput cup 18 26; echo "\"$choice\" is not a valid option.";
sleep 2 ;;
esac
done
最良の例とは言えないがレイアウトや色の使い方などは分かるだろう。ただシステムによっては動作が異なるかもしれない。スクリーンの操作は "tput" と "echo -e" で賄っているがハードウェアや "terminfo" のバージョンで違いが出るかもしれない。ターミナルで使えるカラーを調べるには次のスクリプトを使えばいい。
#!/bin/bash
#
# "colsel" - a term color selector
for n in `seq 40 47`
do
for m in `seq 30 37`
do
echo -en "\E[$m;${n}m"
clear
echo $n $m
read
done
done
このスクリプトを実行して表示される色のコードを "echo -e '\E[
今回はまとめられるかどうか自信がなかったが何とかまとめられたようだ。次回は "source", "eval", "trap" などを解説しよう。
スキャナはセキュリティを自動的にチェックするプログラムだ。ネットワークの弱点を表示してくれるのでシステム管理者はそれに応じた対応を取ることができる。スキャナの基本的な機能は次の通り。
今回はホストスキャナ、ネットワークスキャナ、侵入スキャナなどに分けてそれぞれのツールを紹介しよう。
Host scanners
ホストスキャナはローカルマシンで実行してセキュリティ上の問題をチェックする。
Cops
Cops はセキュリティツールのコレクションでコンピュータセキュリティの気づかれにくい部分をチェックする。Cops はhttp://www.fish.com/cops から入手できる。
Tiger
Tiger はUNIX のセキュリティチェッカーで、シェルスクリプト、C コード、データファイルからなり、システム設定ファイル、ファイルシステム、ユーザ設定ファイルなどをチェックする。Tiger はhttp://www.giga.or.at/pub/hacker/unix から入手できる。
check.pl
perl スクリプトですべてのファイルシステムをチェックする。アクセス管理のためにもユーザ権限で週に一度は実行すべきだろう。チェックの結果は標準出力に表示される。check.pl はhttp://opop.nols.com/proggie.htmlから入手できる。
Network scanners
ネットワークスキャナはホストマシンから他のマシンのサービスなどをチェックする。もしセキュリティホールが見つかれば攻撃者もそれを利用できるということだ。ファイアウォールなどをチェックするにはいい。
NSS (Network Security Scanner):
NSS は それぞれのホストやサブネット全体をチェックする perl スクリプトだ。次のようなものをチェックする。
1: sendmail
2: Anon FTP
3: NFS Exports
4: TFTP
5: Hosts.equiv
6: Xhost
NSS はhttp://www.giga.or.at/pub/hacker/UNIX から入手できる。
SATAN (Security Administrator's Tool for Analyzing Networks):
SATAN は自動的にネットワークを探査して弱点を探し出し、報告するツールだ。リモートホストの既知のセキュリティホールをチェックする。
1: FTPD, FTP の書き込み可能ディレクトリ
2: NFS
3: NIS
4: RSH
5: sendmail
6: X server
Strobe:
Strobe は TCP ポートのチェックに最適化されている。ホストのリスニングポートを探しレポートする。チェックは帯域をフルに使用するがプロセスリソースは抑えられている。単純で高速だが最新のスキャナほど高機能ではない。Strobe はftp://suburbia.net/pub/ から入手できる。
Nmap
最新の高機能のホストスキャンツール。対応機能は次の通り。
Network Superscanner
http://members.tripod.de/linux_progz/
Portscanner
リスニング TCP ポートをスキャンするネットワークユティリティ。オープンソースで公開されている。http://www.ameth.org/~veilleux/portscan.html から入手できる。
Queso
ホストの動作 OS をスキャンするツール。http://www.apostols.org/projectz/queso/ から入手できる。
Intrusion Scanners
実際にセキュリティホールをチェックするプログラム。
Nessus
モジュールの形を取る非常に高速で優れたツール。クライアント/サーバの形を取り、サーバは Linux, FreeBSD, NetBSD, Solaris に対応している。クライアントは Linux, Windows に対応しており Java クライアントもある。IP アドレスかホストネームでポートスキャンをする。ホスト探索にはネットワーク DNS も利用できる。Nessus はhttp://www.nessus.org/ から入手できる。
Saint
セキュリティ管理者の統合ネットワークツール。クライアント/サーバで使用できるが www インタフェースにも対応している。リモートホストのネットワークサービスをチェックして情報を収集する。出力は理解しやすい。さらにアドインのスキャンモジュールもある。Saint はhttp://www.wwdsi.com/saint/ から入手できる。
Cheops
多数のホストの OS をチェックするツール。探したいものを特定するためのスキャンには便利。Cheops はhttp://www.marko.net/cheops/ から入手できる。
Ftpcheck
/ Relaycheck:
ftp サーバとメールサーバのリレー機能をチェックするユティリティ。http://david.weekly.org/code/ から入手できる。
BASS
BASS (Bulk Auditing Security Scanner) は既知のインターネットセキュリティホールをチェックする。http://www.securityfocus.com/data/tools/network/bass-1.0.7.tar.gz から入手できる。
Firewall scanners:
ファイアウォールをチェックするプログラム。通過できるかどうかなどもチェックする。
Firewalk
traceroute に似たテクニックで IP パケットからパケットフィルタリングのルールをチェックする。システム管理者は自分のネットワークの強度チェックに利用できる。Firewalk はhttp://www.packetfactory.net/Projects/Firewalk/ から入手できる。
セキュリティはソリューションではない。システム管理者は常に自分のシステムのセキュリティホールをチェックしなければならない。そうすることによりセキュリティが強化される。セキュリティホールは常に発生しているし、治療よりは予防のほうがいい。
筆者がこの記事を書こうと思い立ったのは HOWTO やヘルプなどがあまり役に立たないためだ。知りたい情報は限られているのだがそれにたどり着くまでにかなりの情報を読破しなければならない。そこで今回は2台のコンピュータを接続する簡単な方法を解説する。但しメールの送受信はできない。分厚いドキュメントよりも簡単な例を立てて説明してくれたほうがわかりやすいと思う。そこで今回はそのような例を使って説明してみよう。「私のLinuxマシンのパラレルポートが設定できない」、「2番目のパラレルポートからの接続ができない」、記事の中で既に解説されていることなどに関するメールはやめてほしいが、sendmail の設定方法に関するメールは歓迎する。
まず2台の Linux マシンを PLIP かネットワークカードを使って接続し、その後 Windows マシンと Linux マシンの接続を説明する。今回使用したのは RedHat 6.0 だ。
PLIP を使用するのにカーネルのコンパイルは必要ない。Linux の汎用カーネルで十分だ。PLIP で接続するには次のようにする。
127.0.0.1 localhost localhost.localdomain 10.0.0.1 one 10.0.0.2 two
modprobe plip ifconfig plip0 two pointopoint one up
これで2台目のコンピュータはキーボードが認識されなくても起動し plip インタフェースが使用できるようになる。キーボードがなくても telnet, ftp, ssh などでアクセスできるから心配はない。"modprobe plip" と入力したときにシステムが "unresolved symbols", "...device busy" などのエラーが返ったときは PLIP HOWTO では解決できなかった。問題は IRQ の割り当てだろう。次のようにすれば問題はないはずだ。
echo 7 > /proc/parport/0/irqこれはカーネルに IRQ 番号を直接割り当てさせる。しかし最初は必ず "modprobe plip" を使用するように。これで /proc/parport/0/irq に7が割り当てられたので "modprobe plip" と入力して plip をインストールしよう。もし2台目のマシンで同じようなエラーが発生したら /etc/rc.d/rc.local ファイルを次のように変更しよう。
modprobe plip echo 7 > /proc/parport/0/irq ifconfig plip0 two pointopoint one up1代目のマシンの設定は次のようになる。
modprobe plip echo 7 > /proc/parport/0/irq ifconfig plip0 one pointopoint two upこれで telnet, ssh, ping, ftp, lynx などが使えるはずだ。念のために "telnet two" としてみよう。root では telnet でログインできないので注意しよう。
DOS/Windows 用の plip ドライバがftp://ftp.crynwr.com/drivers/plip.zip にあるが、これは Windows 9x には対応していない。そこでネットワークカードでの接続をお勧めする。筆者が進めるのは安価な 10Base 2 での接続だ。コンピュータが2台ならターミネータを一つ使わなければならない。通常ネットワーク接続の方法は三つある。
10Base 5 - 古い 10Base 2 - 今回の記事で使用しているもの 10Base 10 - ハブを利用する、若干高価NE2000 か互換のカードを購入することをお勧めする。非常に安価だ。最初のコンピュータで次のコマンドを入力しよう。
modprobe ne2k-pci ifconfig eth0 one2台目のコンピュータでの入力は次の通りだ。
modprobe ne2k-pci ifconfig eth0 twoこれで2台のコンピュータで telnet, ssh, ping, ftp が利用できる。NFS を使うならばNFS Howtoを見るか /etc/exports ファイルに次の行を入れよう。
/ two (rw)rpcinfo -p を実行すると次のような出力が得られるはずだ。
program vers proto port 100000 2 tcp 110 rpcbind 100000 2 udp 111 rpcbind 100024 1 udp 903 status 100024 1 tcp 905 status 100011 1 udp 914 rquotad 100011 2 udp 914 rquotad 100005 1 udp 924 mountd 100005 1 tcp 926 mountd 100005 2 udp 929 mountd 100005 2 tcp 931 mountd 100005 3 udp 934 mountd 100005 3 tcp 936 mountd 100003 2 udp 2049 nfs
Windows マシンと Linux マシンとはネットワークカードを介して会話をすることができる。Windows マシンはネットワークカードは装着すれば自動で認識してくれる。もしだめだったらコントロールパネルからハードウェアの追加を選べばいい。認識できたらコントロールパネルのネットワークから認識されたカードの TCP/IP プロパティを設定する。設定するのは IP アドレスとネットマスクだ。それが済んだら再起動する。次に Windows のシステムディレクトリにある hosts.sam と lmhosts.sam を hosts と lmhosts にそれぞれコピーして次のように修正しよう。
c:\windows\hosts c:\windows\lmhosts 127.0.0.1 localhost localhost.localdomain 10.0.0.1 one 10.0.0.2 twoこれで2台のマシンで通信が可能になった。Linux マシンで Apache サーバが走っていれば Windows マシンから
http://twoとすることでアクセスできる。Linux マシンのユーザ ID があれば Linux マシンへ ftp することもできる。
ラップリンクのパラレルケーブルは結構値段も高いので安価なネットワークカードを買ったほうが通信速度も速く快適だ。ところで sendmail をホームネットワークで使う場合の設定方法が分かる方は教えてもらえないだろうか。
最後の記事を書き終えてから SCREEM に関するメールをいくつか受け取った。記事を書いているときに Freshmeat でそれらしい名前を見た記憶がある。それと Quanta からもメールを受け取った。確かに拡張 Ascii コードはまだ完全ではないが LC_ALL=
最近サーバが変わったのでホームページを移動する必要があった。ダイアルアップでは FTP での転送は手間がかかるので自動的に移動するツールを探してみた。コマンドラインで使用する wget はサイトをまとめてダウンロードしてくれる。筆者はグラフィック環境で使用しているのでそのフロントエンドの Kwebget を利用した。ディレクトリやファイルへの移動が速やかに行われるのでダウンロードの時間は早い。
それでは SCREEM を見てみよう。SCREEM は単なる HTML エディタではない。今はまだ分からないが最終的には ウェブ環境構築プログラムを目指しているらしい。SCREEM のインストール時には gnome-libs、libguile、libreadline の最新版が必要というエラーが出た。インストールするときにはあらかじめアップデートしておこう。
サイトを構築するときはプロジェクトの作成から始まる。必ずプロジェクトを作成する必要はない。ブラウザはファイルのブラウズとプロジェクトのブラウズとが可能だ。
SCREEM は使いやすい。メニューとタブバーからなるがまだメニューは荒削りだ。サポートするフォーマットは HTML、PHP3、RXML、SSI などと多い。CSS も利用できるが、まだ不安定だ。タグ補完機能は便利だ。それにプレビューモードも若干不安定だ。エディタに含まれている機能としてストラクチャブラウザと属性ブラウザがある。ストラクチャブラウザではドキュメントで使用されているタグが一覧される。属性ブラウザでは属性を簡単に修正できる。SCREEM は非常に良くできたエディタだが目的はもっと高度なところにあり、今後どのように進化するかはまだ分からない。
ハッシュテーブルはアクセス可能な要素を持ったビンと呼ばれるメモリ上の連続したセクションだ。ハッシュテーブルに格納されたデータは迅速な検索、挿入、削除が可能だ。データ操作の迅速性のためにメモリの使用効率を犠牲にしている。ハッシュテーブルはデータ操作の非常に標準的な手段であり、それゆえ Java にも採用されている。Java でハッシュテーブルを提供するクラスは hashtable だ。hashtable は Dictionary から派生し、Map, Cloneable, serializable をインプルメントしている。
キーはハッシュテーブルのアクセス可能な要素の一つにマップされる値だ。Java はキー生成のためのインタフェースを提供している。ハッシュ機能は一群のデータの一部からキーを作成しそのキーを基にアクセスするメモリ領域を特定する。そのためにはデータがランダムに分散しておりハッシュが適切に実行される必要がある。
ハッシュテーブルの中の総ビン数のうちの使用されている割合をロードファクタという。このロードファクタからコリジョンの発生数を予想することが出来る。Java ではロードファクタが75%を越えると新たなメモリが割り当てられる。
二つのデータがハッシュにより同じキーを差すことをコリジョンという。キーが生成される方法が分かればコリジョンを発生させることも可能だ。次の例は異なった文字列がコリジョンを起こす Java コードだ。
import Java.util.*;
import Java.lang.*;
// x + 31x = x(31 + 1) = x + 31 + 31(x-1)
public class Identical
{
public static void main(String[] args)
{
String s1 = new String("BB");
String s2 = new String("Aa");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
Red Hat 6.2 の kaffe でコンパイルした結果は次の通りだ。
[bash]$ javac Identical.java [bash]$ java Identical 2112 2112 [bash]$
それぞれのビンの要素がデータエレメントへの連鎖リストを指し示しているものがチェーンだ。コリジョンが発生すれば何らかの方法でこの連鎖リストにインサートされる。削除をするときはマッチするデータが見つかるまでリストを手繰っていく。Java Foundation クラスはこの方法を採用している。
データ要素がすべてハッシュテーブルに格納されている場合をオープンアドレスという。それぞれのビンには一個のデータが格納されている。これが最も単純なハッシュテーブルの例で配列でも同じことが出来る。オープンアドレスの場合はデータ挿入時の空のビン検索でコリジョンが発生すれば単純にリニアにリストを辿っていく。コリジョンを避けるために常に次のビンが検索される。
string クラスはハッシュテーブルのキー生成のために hashCode() というメソッドがある。string オブジェクトの hashcode は次のように計算される。
s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]
例に利用しているスクリプトでは String のハッシュ機能を利用しているが似たような文字に偏る難点がある。使用される文字列のキャラクタ数が限られているとコリジョンが発生する可能性が高い。理想的にはデータをハッシュテーブルにランダムに分散し偏らないことが望ましい。hashCode メソッドは又インテジャのキータイプが 2^32 -1 に限られている。これは64ビットデータタイプよりもコリジョン発生の可能性が高い。
Java Foundationa クラスで実装されている Hashtable クラス、メソッドは非常に優れているが、データが大きくなると偏りが多くなりパフォーマンスが低下する。データをよりランダムに配置し、キーにはより長いデータタイプを採用すべきだった。例に使用した CloseWords のコードは次の通りだ。
import java.lang.*; import java.util.*; import java.io.*; /** CloseWords: Exploit the clustering tendency of the native hashCode() method * in the String class to find words that are "close" to the argument. */ public class CloseWords { Hashtable ht; String currString; /** In the code below we create an instance of the Hashtable class in which to store * our hash of all of the words in the system dictionary (yes, this is a very memory * inefficient way of indexing the words). * * @param args */ public static void main(String[] args) { ht = new Hashtable(); try { DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("/usr/dict/words"))); while((currString = in.readLine())!=null) ht.put(new Integer(currString.hashCode()), currString); int i = args[0].hashCode(); int found=0; while(found < 5) { i--; if(ht.get(new Integer(i))!=null) { System.out.println(ht.get(new Integer(i))); found++; } } i = args[0].hashCode(); found=0; while(found < 5) { i++; if(ht.get(new Integer(i))!=null) { System.out.println(ht.get(new Integer(i))); found++; } } } catch(IOException ioe) { System.out.println("IO Exception"); } } }