Linux Gazette 4月投稿記事
 
目次
04/02/2004 - 09:03 Protocol Stack Implementation using IPC as shared memory by Nikhil Bhargava
  共有メモリとしてIPCを用いるプロトコル・スタックの実行
04/04/2004 - 20:15 ftp and konqueror by tonisolo
  ftpとkonqueror
04/09/2004 - 08:51 From Argentina: Old PC + LiveCD Router + WiFi Card = Home Network with Internet by Willy Smith
  老朽PC + ライブCD ルータ + WiFi カード = ホームネットワーク
04/18/2004 - 05:03 Installing Nessus 2.0 on SuSE 9.0 Professional with KDE 3.1 by Lew Newlin
  Nessus 2.0のインストール
04/22/2004 - 14:15 fontconfig and Fixed Sized Fonts by Pádraig Brady
  fontconfigと固定サイズフォント
04/22/2004 - 20:58 Producing a Portable Key Disk for GnuPG by Rob Mitchell
  GnuPG用移植可能キイディスクの作成
04/23/2004 - 21:04 Migration from ASP to PHP by Cheng Kwok Wing
  ASP からPHPへの移行
 
 
 
 
 
共有メモリとしてIPCを用いる
プロトコル・スタックの実行
Protocol Stack Implementation using IPC as shared memory
投稿Nikhil Bhargava:04/02/2004 - 09:03. 記事| ハウツー
 
緒言
この記事は、共有メモリのある一般プロトコルスタックを、メイン層とそのユーザ及びサービス層との間の通信手段として実行することについて述べる。四っつの章から構成される。第一章で、FSMモデルに基づく一般プロトコル設計を述べる。第二章で、個別プロトコル層の間の通信手段としての共有メモリの概念を述べる。次の章では、個別プロトコル要素の間をを共通リソースのため同期するため使用するSemaphoreを調査する。最後の章で、二つのプロトコルの間の共有メモリとSemaphoreを用いる通信を説明する。
 
注記:ここで述べるシステム呼出は全部、システム5リリース4に合致する。コードをテストするターゲットkernelはkernelバージョン2.4.20である。ソフトウエアは全部GPLの下でリリースされる。
 
1.FSMに基づく一般プロトコル設計
プロトコル・スタックは、機能的に活性な構成要素の組から構成される。各プロトコル構成要素は、実在は、ユーザと言う多数の他の上位層プロトコル構成要素のためサービスし、多数の低位層プロトコル構成要素からのサービスを用いる層としてモデル化される。これを次図に示す。ここではプロトコルXのためのユーザ層二つとサービス層一つを示す。
-------  ------
|ユーザ1 | |ユーザ2|
-------  ------
|      |
--------------
| プロトコルX |
--------------
|
--------------
| サービス層 |
--------------
 
図 1. プロトコルモデル
 
一般的プロトコル・スタックは、機能性と役割にしたがって二つか三つに分割される。この分割は、垂直と水平方向の双方又は角度のある方向にすることが出来る。プロトコル・スタックは、垂直方向に(水平方向にもまた)相互作用をする多数の層を含み、最後に物理層で終わり、これが他のシステムで働いている仲間と実際に通信する。このような例の一つが、次図に示す TCP IP スタックである。
-----------------------
|アプリケーション層 (FTP)|
-----------------------
|
-------
| TCP  |
-------
|
----
| IP |
----
|
---------
|イーサネット|
---------
|
--------------
| 物理層 |
--------------
 
図 2. TCP IPプロトコル・スタック
プロトコル設計者は通常、システムを抽象レベルでモデル化し、次いでそのモデルを実行言語で実行する。複雑な行動は、外界からイベントを受領する、そのイベントに応じて計算をおこない、出力イベントを発生するなど、簡単なビルディングブロックを結合して行わせることが出来る。この種の相互作用は、問題を、通常はSDL (State Descriptive Languange 状態記述言語)を用いるFinite State Machine (FSM)有限状態マシンとしてモデル化することにより行われる。
 
2.共有メモリの概念
共有メモリを用いて、メッセージ待ち行列又はパイプの場合のように読取/書込毎にわざわざkernelを通じることなく、一つ以上のプロセスを互いに連絡させることが出来る。プロセスは、それらの仮想アドレス空間にあらわれるメモリを経由して連絡する。システムV IPCオブジェクトすべてと同様に、共有メモリ領域へのアクセスは、キイとアクセス権チェックにより制御される。一旦メモリを共有すると、システムはプロセスがそれを使う方法をチェックしない。System V Semaphoresなどの同期コントラクトを用いてこのメモリへのアクセスを同期する。
図1. shmid_ds 構造体
shmget()を用いて新たに作られる共有メモリ領域は、shmid_ds データ構造体によりあらわされる。これはshm_segsベクトルの中に保たれる。shmid_dsデータ構造体は、共有メモリの大きさ、それを使用するプロセスの数、アクセスの時刻、及びその共有メモリがそのアドレス空間にマップされる方法に関する情報を記述する。メモリを共有したいプロセスは、システム呼出 shmat()を用いて仮想メモリに付着しなければならない。これが、このプロセスのための共有メモリを記述する新しいvm_area_structデータ構造体を作る。プロセスが最早共有メモリを必要としないときは、shmdt()を用いてそれから分離しなければならない。他のプロセスがそのメモリを使っている間は、分離は現行プロセスにだけ影響する。メモリを共有する最後のプロセスが分離すると、現在物理メモリにある共有メモリのペイジは、この共有メモリのためのshmid_dsデータ構造体と同じく、解放され。共有メモリセグメントの行動は、システム呼出 shmctl()により制御することが出来る。
 
3.同期オブジェクトとしてのSemaphore
semaphore は、通信構築物ではなく、多数のプロセスがその作動を同期させるのを助ける同期構築物である。このような構築物がないと、デッドロックデータ完全性の喪失を生じる。主な用途の一つは、共有メモリメモリセグメントへのアクセスを同期することである。semaphoreは、その値が利用可能なリソース数を示すリソース・カウンタと考えることが出来る。プロセスが共有メモリへのアクセスを必要とするときは何時でも、semaphoreインスタンスの現在値をチェックする。これが0より大きいときは(リソースが利用可能であることを意味する)、計数を一つ減らしてそのリソース・インスタンスをロックする。さもないときは、待ち状態に入る(又は設計にしたがって、別の仕事をする)。システムは、そのリソースを待つプロセスのリストを保持する。プロセスがリソース・インスタンスを用いて仕事を終えると、それを解放してsemaphore計数を1だけ増やす。このイベントにより、そのリソースを待っているプロセスが起動される。どのプロセスが最初に来るかは、実行戦略である。
Semaphores上の二つの動作、つまり、Semaphoresの値をチェックすることと、その値を1だけ減らすこととは、自動的でなければならない。つまり、単一の中断不能動作でなければならない。したがって、kernelの中でSVR4 Semaphores が実行される。semaphoreは、semget() system 呼出を用いて作成するか、又は既存semaphoreにアクセスする。Semaphoresは、バイナリ又は計数である。Semaphoresは、システム呼出semctl()により制御される。Semaphores上の増減はsemop()が実行する。
 
4.共有メモリをIPCとして用いる一般プロトコル実行
プロトコル層の有限状態マシンモデルの一つが、開発された。これは次の二つの方法でコードすることが出来る:
1.ステート モデル
2.プリミティブ/イベント モデル
 
ステート モデル においては、プロトコル実在の明確なステート全部を識別して、外部プリミティブ全部を別のプロトコル層と交換し、内部イベントを識別する。プロトコル層Xが三つの異なる層、即ちL1, L2, L3 と相互作用をし、五つの層、即ちS1,S2,...,S5を有するとする。さらに、 X は 12個のプリミティブ(外部イベント)を これら三つの層と交換し、五つのプリミティブ(内在イベント)を有するとする。このメソッドでは、これらのプリミティブだけが、それに適用することの出来る各ステートに含まれる。
 
X のメインモジュールを次の計画で設計する:
/***********メイン Include ファイル***************/
..............
..............
 
/*******標準Config パラメータ**********/
..............
..............
 
XX_main (void)
{
/* ステート・マシンとプロセス制御ブロックの宣言と初期化 */
..............
..............
XXX_Init(dsc);
..............
..............
while (TRUE)
{
/*3層のいずれかからメッセージを受領 */
/* 受領するメッセージにスペースを割り当てる */
if ((msg = (Mesg_t *) malloc (sizeof (Mesg_t))) == 0)
{
printf ("error in malloc");
exit;
}
/* 入信メッセージから層識別子を抽出 */
switch (layerid)
{
 case L1:
/* メッセージ中のプリミティブを捕捉 */
  switch (primitiveid)
  {
            case P1 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  P1_handler(state);
  .............
  .............
  break;
            case P2 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  P2_handler(state);
  .............
  .............
  break;
 
   ..............................................
   ..............................................
  }//end switch for primitive
 
   case L2:
/* メッセージ内のプリミティブを捕捉 */
  switch (primitiveid)
  {
            case P3 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  P3_handler(state);
  .............
  .............
  break;
            case P4 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  P4_handler(state);
  .............
  .............
  break;
 
   ..............................................
   ..............................................
  }//end switch for primitive   
 case L3:
    ..............................................
   /* 上記と同じステップ */
    ..............................................
}//end switch for layer id
..............
/* メモリ割当解除及び整理活動など若干の処理 */
}//end while  
/* クリーンアップ機能 */
XX_cleanup();
}//end XX_main
 
プリミティブ/イベント・モデルにおいては、それに適用することの出来るステートだけを各プリミティブ又はイベントの下にインクルードすることが出来る。ステート・モジュールを同じ例を考え、プロトコルXを次の計画でモジュール化して設計する:
/***********メイン Include ファイル***************/
..............
..............
 
/*******標準 Config パラメータ**********/
..............
..............
 
XX_main (void)
{
/* ステート・マシンとプロセス制御ブロックの宣言と初期化 */
..............
..............
XXX_Init(dsc);
..............
..............
while (TRUE)
{
/*3層のいずれかからメッセージを受領 */
/* 受領するメッセージにスペースを割当てる */
if ((msg = (Mesg_t *) malloc (sizeof (Mesg_t))) == 0)
{
printf ("error in malloc");
exit;
}
/* 入信メッセージから層識別子を抽出 */
switch (layerid)
{
 case L1:
/* この層に適用することの出来る各種ステートの間を弁別する r*/
  switch (present state)
  {
            case S1 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  if (primitive==P1) P1_handler();
  if (primitive==P2) P2_handler();
  .............
  .............
  break;
            case S2 :
 
/*入信メッセージ内のプリミティブ通りに各プリミティブ/イベント・ハンドラを呼出す */
  if (primitive==P3) P3_handler();
  if (primitive==P4) P4_handler();
  .............
  .............
  break;
   ..............................................
   ..............................................
  }//end switch for state
 
   case L2:
/* この層に適用することの出来る各種ステートの間を弁別する r*/
  switch (present state)
  {
            case S1 :
    ..............................................
    ..............................................
    break;
 
              case S2 :
    ..............................................
    ..............................................
    break;
  }//end switch for state
 
   case L3:
    ..............................................
   /* same steps as in above */
    ..............................................
}//end switch for layer id
..............
/* メモリ割当解除及び整理活動など若干の処理 */
}//end while
/* クリーンアップ機能 */
XX_cleanup();
}//end XX_main
 
以下のコード断片は、共有メモリを、二つのプロトコル層LAYER 1とLAYER 2の、二つのプロセスの間のIPC機構として用いる実行を示す。これはLAYER 2に関する最低主機能を示す。これは、互いの通信のためメモリセグメント二つを用いるので、semaphores二つを用いてお互いを同期する。saallm_sysmgmt_msg 共有メモリセグメントは、LAYER 2 により書込まれてLAYER 1により読取られ、saallmsemid により保護される。この場合、sysmgmt_saallm_msg 共有メモリセグメントは、LAYER 1により書込まれてLAYER 2により読取られ、sysmgmtsemid により保護される。コードのほとんどは、自明である。LAYER 2が先ずsemaphore設定と共有メモリセグメントをチェックし、作成して利用して、付着する。次いで、sysmgmtsemid をチェックし、解放されているときはロックしてLAYER 1からのメッセージを処理する。続いて、何かLAYER 1に送るメッセージがあるときは、saallmsemid をチェックしてロックし、次にメッセージを共有メモリセグメントsaallm_sysmgmt_msgに書込む。この後、semaphoreのロックを解いて、LAYER 1がメッセージを読めるようにする。これら全部は、無限ループの中で、終了することない処理として行われる。
/* システムヘッダ全部をInclude */
 
#define MAX_LENGTH 100
 
int saallmsemid;
int sysmgmtsemid;
int saallmshmid;
int sysmgmtshmid;
 
typedef struct Message
{
char Mesg_Data[MAX_LENGTH];
int Mesg_Length;
}Mesg_t;
 
Mesg_t* saallm_sysmgmt_msg;
Mesg_t* sysmgmt_saallm_msg;
 
struct shmid_ds *bufsaallm;
struct shmid_ds *bufsysmgmt;
 
main ()
{
int i,j,k;
sem_init();
k=sizeof(Mesg_t)+2; //to avoid any boundary conditions
shmem_init(k);
 
saallm_sysmgmt_msg=(Mesg_t*)shmat(saallmshmid,(const void *)0,0);
sysmgmt_saallm_msg=(Mesg_t*)shmat(sysmgmtshmid,(const void *)0,0);
if(saallm_sysmgmt_msg==NULL||sysmgmt_saallm_msg==NULL)
{
perror("\nShared Memory segments for saallm and sysmgmt cannot be attached to OS\n");
exit(-1);
}
 
while(TRUE)
{
/* sysmgmtsemid 上で待ってLAYER 1からのデータを読取 */
semop(sysmgmtsemid,&op_lock[0],2);
if (layerid=LAYER 1)
{
/* メッセージを読取って処理 */
........................
........................
/* sysmgmtsemid に信号を送ってSysmgmt が新データを書込めるようにする */
semop(sysmgmtsemid,&op_unlock[0],1);
}
else semop(sysmgmtsemid,&op_unlock[0],1);
 
/* saallmsemid 上で待ってLAYER 1のため新データを書込む */
semop(saallmsemid,&op_lock[0],2);
 
............................
............................
memcpy(saallm_sysmgmt_msg->Mesg_Data, Data buffer in which u have the message);
/* saallmsemid 上で待ってLAYER 1が新データを読取れるようにする */
semop(saallmsemid,&op_unlock[0],1);
}//end while
/* 共有メモリとsemaphoreリソースを解放する */
sem_cleanup();
shmem_cleanup();
}//end main
 
void sem_init(void)
{
/* semaphores が作成されていないときは、先ず作成する */
/* 両 semaphoresを規定値でするように0 に初期化 */
saallmsemid=semget(SAALLMSEMKEY,1,PERMS|IPC_CREAT);
sysmgmtsemid=semget(SYSMGMTSEMKEY,1,PERMS|IPC_CREAT);
 
if(saallmsemid<0||sysmgmtsemid<0)
{
perror("\nSemaphores for saallm and sysmgmt cannot be created\n");
exit(-1);
}
}
 
void shmem_init(int k)
{
saallmshmid=shmget(SAALLMMEMKEY,k,PERMS|IPC_CREAT);
sysmgmtshmid=shmget(SYSMGMTMEMKEY,k,PERMS|IPC_CREAT);
 
if(saallmshmid<0||sysmgmtshmid<0)
{
perror("\nShared Memory segments for saallm and sysmgmt cannot be created\n");
exit(-1);
}
}
 
void sem_cleanup(void)
{
if(semctl(saallmsemid,0,IPC_RMID)<0) perror("\n Cannot delete SAALLM semaphore\n");
if(semctl(sysmgmtsemid,0,IPC_RMID)<0) perror("\n Cannot delete SYSMGMT semaphore\n");
}
 
void shmem_cleanup(void)
{
if (shmdt(saallm_sysmgmt_msg)<0) perror("\n Cannot detach shared memory between saallm and sysmgmt\n");
if (shmdt(sysmgmt_saallm_msg)<0) perror("\n Cannot detach shared memory between sysmgmt and saallm\n");
 
if (shmctl(saallmshmid,IPC_RMID,bufsaallm)<0) perror("\n Cannot remove shared memory between saallm and
sysmgmt\n");
if (shmctl(sysmgmtshmid,IPC_RMID,bufsysmgmt)<0) perror("\n Cannot remove shared memory between sysmgmt and saallm\n");
}
 
 
 
 
 
ftpkonqueror
Ftp and konqueror
投稿tonisolo:04/04/2004 - 20:15. 記事|一般|Konqueror|ヒント
 
Linux 熟練者に取ってこの記事は役立たないのは確かだ。私はニカラガに小さい共同体組織で働いているが、ウインドウズのセキュリティが悪いのに全くウンザリしており、Linuxに移行している(SuSE 9.0を使用)。
 
我々の最も重要な仕事は、我々の資金供与者その他が、彼らの助けるプロジェクトを維持するのに遅れないようにすることである。
 
私は、先週の一夜ftpコマンドをKonquerorで走らせようとして、それがGUIファイル・マネージャのように働くのを発見するまで、KBearとftpコマンド行の回りでウロウロしていた。
 
今は、古いウインドウズ98システムを走らせる必要のある唯一の理由は、Linuxデジタルカメラプログラムが私のデジタルカメラを認識しないためだけだ。新しいカメラを買う必要があるのだろうか?
 
これはLinuxに移行する他の人にも関心があると思う。Konquerorのftp機能は私の読んだほとんどのマニュアルで言及していないので、WS-FTPなどのようなものを使い慣れた人には、大いにプラスになる。
 
投稿:デジタルカメラ、
投稿者 capheind :04/16/2004 - 09:49.
貴方のデジタルカメラが、USB大量記憶装置として働くなら、/dev/sda1のような何かとして取付られる筈です。suseが正しく設定されてると仮定して、 'lsmod' とタイプして下さい:
usb-storage 116080 0 (unused)
scsi_mod 94368 3 [sd_mod sr_mod usb-storage]
usbcore 60460 1 [usb-storage printer usb-ohci ehci-hcd]
と出れば、働く筈です。
 
 
 
 
 
老朽 PC + ライブ CD ルータ + WiFi カード
= ホームネットワーク
From Argentina: Old PC + LiveCD Router + WiFi Card = Home Network with Internet
投稿Willy Smith:04/09/2004 - 08:51. 記事 | 一般 | ハウツー | Linux
 
これは、自宅で私が取り組んでいるプロジェクトだ。バグ退治から出て来た。寝ている老朽PC(固定ディスクのない486で結構)とWiFiカードがあれば、接続共有とネットワークを楽しみ、自分の接続ソフトウエアを作ることが出来る。ソフトウエアはCDから直接働いて、WiFiカードをアクセスポイントに変換する。古いノートパソコンは、幾つかの理由で小手に適している:
 
1.廉価である
2.小型である
3.電力消費が小さい
4.内蔵電池の支援がある
5.殆どの WiFi カードはPC型である
 
ノートパソコンにはブート可能CDドライブ(486マシンには付いていないものがある)が付いており、10/100ベースTイーサネットとWiFiの両方をするのであれば、カードスロットの二つあるものである必要があるのに注意。WiFiカードには 単純外部アンテナ があると、この設定で数キロまでの友人と接続を共有することが出来る。
 
比較的楽な方法でLinuxに足場を持ち、老朽コンピュータをその回りに置きたいなら、このプロジェクトで進まれたい。これはWindowsやその前のOSシステムで走るコンピュータを用いてもネットワークで働く。
 
WiFi.com.ar サイトからの基本的情報を示す:
 
Linux 現役CD ルータ (無料!)
 
Linux Live-CD Router を用いると、ブロードバンド接続を共有してWIFIを使用することが出来る。DSL, ADSL, ケーブルモデモ, T1, 固定 IP, ISDN, ダイアルアップ, WIFI, 自分で構築するアクセスポイントなどを使用することが出来る。
 
特徴
・自分のブロードバンド又は専用インターネット接続を共有
・インストレーション不要。ライブCDなのでコンピュータが直接CDからブートする。固定ディスクは不要
・xDSL、ケーブルモデモ、固定IP、ISDN、ダイアルアップをサポート
・Firewall Shorewall 及びMasquerading (NAT)を含む。
・ウェブユーザ・インターフェイスが容易
・標準、低コストのコンピュータ、ネットワーク,wifiハードウエアを利用
・低コストwifiカードを用いて外部アクセスポイントに置き換える
・リモート SSH 管理
・DNS キャッシュを含めて、サーフィンを加速
・SNMP リモートモニタを含む
・Windows 及びMac ネットワークと互換のLinux ソフトウエア
 
ハードウエア要件
 
以下の最小仕様を有する専用コンピュータ:486 プロセッサ、16 MBのRAM, 2X CDRom リーダ、フロッピイドライブ、イーサネット・カード1,2枚。固定ディスク不要。オプションでWIFIカード。
 
リンクを示す:
英語サイト
スペイン語サイト
 
 
 
 
 
Nessus 2.0のインストール
Installing Nessus 2.0 on SuSE 9.0 Professional with KDE 3.1
投稿Lew Newlin:04/18/2004 - 05:03. 記事|ハウツー| セキュリティとGPG/PGP | KDE
 
以下は、SuSE Linuxに対するNessus脆弱性スキャナ、サーバデーモン及びクライアントのインストール方法の簡単な説明である。Nessusの特徴と利点、Linux の一般作動についてはご存じだと思うので、詳細は説明しない。
 
他のソフトウエアと同じく、インストレーション結果はマシンにより異なる。インストレーションの手順は、SuSE 9.0の市販版を用いておこなった。Professional手順をノートブック、ワークステーション、サーバで試験して正確度を確認した。インストレーション中の困難の一つは、ネットワークカードやインターネット接続である。SiteReconでは、DHCPを使わないので、インストレーション毎に、NIC及びIP情報を人手で設定する。DHCPを使うときは、ネットワークとインターネット設定は以下の説明と異なる。
 
インストレーションはルートで行う。インストールは敵対通信のないルート不能ネットワークで行うことを強く推奨する。システムはウィルスなどに感染し易いからだ。
 
SuSE 9.0 Professionalのインストール
・ディスク 1 を挿入してシステムをブートする
・F2 を押す−画面解像度の選択
・上/下矢印を使って "Installation" を選び <enter>
・言語を選んで <accept>
・ "New Installation" を選んで<ok>
(インストレーションによっては画面が出ない)
・"Installation Settings" 必要箇所を変更して <accept>
・YaST2 "Start installation" <Yes, install>
(インストレーションによっては画面が出ない)
・システム再起動...
・要求通りディスクで2 を挿入、<ok> を選ぶ
・"Expert Options" ボタンをクリックして、暗号型をMD5に変更 <ok>
・ルートユーザ・パスワードを入力して <next>
・"Network Configuration"−必要に応じて変更 <next>
・"Test Internet Connection" <next>
・"User Authentication Method" <next>
・"Add a New Local User"−"Auto Login" をアンロック、望み通り入力 <next>
・"Release Notes" <next>
・"Hardware Configuration" <next>
・"Installation Completed" <finish>
・システムは、KDE インターフェイスに起動
・ルートとしてログイン <go!>
・"Welcome to SuSE Linux 9.0" <close>
・タスクバーで "Control Center" をクリック
・"Desktop"をクリック
・"Size & Orientation"をクリック
・望みの画面解像度を選び、"Apply settings on KDE startup"をチェック <apply>
・"Accept Configuration"をクリック
・"Size & Orientation" ウインドウを閉じる
 
・ネットワークカード設定 (必要な場合)
・タスクバーの"Control Center"をクリック
・"YaST2 modules"をクリック
・"Network Devices"をクリック
・"Network card" をクリックして NICを設定
 
・SuSE ウォッチャ
・タスクバーで "SuSE Watcher" をクリック(右側の緑色又は赤色の丸いアイコン)
・ <yes> をクリック
・"Start online update" をクリック
・"Welcome to YaST Online Update" <next>
・<accept>
・プロンプトで望みの処置をする
・完了したら "Remove Source Packages after Update" をチェック、<finish>をクリック
 
これでSuSEの機能が完全に補修され、Nessusに必要なアプリケーションのインストール準備が整った。以下のプログラムをインストールすることにより、GCC C プログラムをコンパイルする環境も設定した。GCCに関する詳細情報は、http://gcc.gnu.org/.にある。
 
Nessus アプリケーション要件
・タスクバーで "Control Center" をクリック
・"YaST2 modules"をクリック
・"Software"をクリック
・"Install and Remove Software" をクリックして、以下のプログラムをインストール:
・Bison
・Flex
・Gcc
・Gcc-c++
・GTK2
・GTK2-devel
・GTK-devel
・kdepim3-time-management package
・libnet
・Make
・OpenSSL
・OpenSSL-devel
・Perl
・sharutils
・xfree86
・xfree86-compat-libs
・xfree86-devel
・YaST Online Update を走らせてインストール済み全プログラムを補修
 
Nessusのダウンロード
・"Local Network"をクリック
・ロケーションを "/" に変更 <enter>
・右クリックして名称 "nessus-installer" の新ディレクトリを作成、ウインドウを閉じる
・ブラウザを用いて http://www.nessus.org/nessus_2_0.htmlに行く
・"The easy and less dangerous way" セクションから、"nessus-installer.sh" をダウンロードしファイルを "nessus-installer" ディレクトリにセーブ
 
Nessusのコンパイル
・タスクバーで "Konsole" をクリックしたディレクトリを "nessus-installer"に変更
・ "sh nessus-installer.sh" とタイプ <enter>
・<enter> を押して規定値を承認
(コンパイル中に、"nessus_popen", "insert_nasl_func", "extra tokens"の警告メッセージが出ることがある。これらは通報でコンパイル処理はうまく進む筈)
・コンパイル処理を完了すると、<enter>を押して完了せよとのプロンプトが出る
 
Nessus サーバ設定
・サーバ証明書を作るには "nessus-mkcert" とタイプt
・"CA certificate life" に関する規定値を承認 <enter>
・"Server certificate life" に関する規定値を承認 <enter>
・自国の二文字国コードを入力 <enter>
・州又は県コードを入力 <enter>
・ロケーションを入力 <enter>
・組織名を入力 <enter>
・証明書処理完了メッセージ <enter to exit>
・"nessus-adduser" とタイプしてユーザアカウントを作成
・ログイン名を入力 <enter>
・認証に関する規定値を承認 <enter>
・パスワードを入力 <enter>
・ctrl-D を押してユーザ作成処理を完了
・"Is that ok?"メッセージ <enter>
・"nessusd -D" とタイプしてNessus サーバサービスを開始
( Nessus 初期化には数秒掛かることがある。Nessus デーモンがスタートするとコマンドプロンプトが返る)。
 
システムをブートするとき、サーバデーモンを自動的にスタートさせたいときは、"etc/init.d/boot.local" ファイルを編集して"nessusd -D".を追加する。
 
Nessus 設定
・"nessus"とタイプ
・loginと入力
・パスワードを入力
・"Log in" ボタンをクリック
・"SSL Setup" が出るので、<ok>をクリック
・"Nessus" がこの証明書を承認するか聞いて来るので <yes>をクリック
・リモートシステムに関するプラグイン、衝突に付いての "Warning" メッセージが出るので <ok>をクリック
・"Konsole" ウインドウを閉じる
 
KAlarm
・タスクバーで"Start Applications"をクリックし"Utilities", "Time", "KAlarm"の順で選ぶ
・KAlarm ウインドウで "Actions" 次いでNewをクリック
・"Command" をクリックし、コマンド行として "nessus-update-plugins" を入力
・"Any time" チェックボックスをチェック
・繰り返しに関しては "Recur" をチェック、次いで "Recurrence" タブを選ぶ
・"Recurr every" フィールドに関して "01:00" を入力
・<Try> ボタンを選んで <ok>
・"Kalarm" ウインドウを閉じる(Kalarm は規定値でブートの際に自動的に宣言される)
 
ファイアウォール
KDE には内蔵ファイアウォール保護がある。Nessusなどの脆弱性スキャナは、ソフトウエア・ファイアウォールがあるとうまく働かない。ファイアウォールを削除するには:
 
・タスクバーで "Control Center" をクリック
・"YaST2 modules"をクリック
・"Security and Users"をクリック
・"Firewall"をクリック
・"Stop Firewall and Remove from Boot Process"をクリック <next>
・"Firewall configuration - deactivate firewall"、<next>をクリック
・"The firewall is now turned off" <ok>と出る
 
一般情報
アンインストール・プログラム: /usr/local/sbin/uninstall-nessus
コンフィギュレーション・ファイル: /usr/local/etc/nessus/nessusd.conf
認証権限:/usr/local/com/nessus/CA/cacert.pem
認証権限 - 秘密: /usr/local/var/nessus/CA/cakey.pem
Nessus サーバ認証ファイル: /usr/local/com/nessus/CA/servercert.pem
Nessus サーバr - 秘密キイファイル: /usr/local/var/nessus/CA/serverkey.pem
Nessus はポート1241 を用いて通信
 
これで、KDEデスクトップ環境を用いるSuSEにインストールされたNessusサーバデーモンとクライアントが完全に働く。Kalarmは、一時間に一度Nessusを自動的に更新する設定となっており、最新の脆弱性テストを保証する。Nessusは、セキュリティ要件に完全に役立つ。
 
 
 
 
 
fontconfigと固定サイズフォント
Fontconfig and Fixed Sized Fonts
投稿pixelbeat :04/22/2004 - 14:15. 記事|一般|Gnome
 
私は固定スペース・アプリケーション用のアンチエイリアス・フォントが嫌いだ。私の場合、テキストのサイズを変更する必要がないので、固定サイズビットマップフォントが最適だ。だから、人が作ったままの表現で(伸縮自在テキストに役立つよう)コンピュータで細工をしないフォントだけで十分だ。
 
またアンチエイリアス・テキストは遅い(これはgnomeターミナルで "edit current profile"にあるフォントをダイナミックに切り換えながら次を走らせてテストした)
dd if=/dev/zero | od -Ax -tx1z -v
そのため、どのフォントを使うか知る方法は?先ず固定スペースフォントだけでは、任意のサイズに伸縮することは出来ないので、アンチエイリアスである。
 
$ fc-list ":spacing=mono:scalable=true" family
Luxi Mono
Bitstream Vera Sans Mono
Courier 10 Pitch
Nimbus Mono L
Courier
 
scalable=false (又は堂々の antialias=false)を規定する必要がある。
 
$ fc-list ":spacing=mono:scalable=false" family pixelsize
console8x8    8
console8x16   16
Fixed      14,15,16,20,24
Gothi      12,14,16,18
LucidaTypewriter 8,10,12,14,18,19,24
Marumoji     14
MiscFixed    6,7,8,9,10,12,13,14,15,18,20
 
上記の中で私の好きなのはMiscFixed 10が、これをシステムで設定する場所は?
 
1.gnome terminal: Startt → Preferencest → Font t → Terminal Font
2.xchat: Settings t → Preferences t → Interface t → Text Box t → Font
3.gvim: ~/.gvimrc で次を行う:
 
  if has("gui_gtk2")
    set guifont=MiscFixed\ 10
  else
    set guifont=-misc-fixed-medium-r-normal--10-100-75-75-c-60-iso8859-1
  endif
(この文書をvimで編集する)gnome-ターミナルでこれが、固定と伸縮自在双方のファイルで見える様子を示す:
 
 
 
 
 
GnuPG用移植可能キイディスクの作成
Producing a Portable Key Disk for GnuPG
投稿 rsok13 :04/22/2004 - 20:58. 記事|ハウツー|セキュリティとGPG/PGP
 
gnupgを使い始めて最初にぶつかった問題は、そのマシン一つ以上の上で暗号化e-メールを受ける必要だった。gnupgで同じ問題を経験されていれば、キイがキイリング上に記憶されているのを見出された筈だ。これらのキイリングは、ホームディレクトリの中の.gnupgディレクトリに記憶されている。自分の秘密キイを両マシンにコピイすることは出来るが、これでは、両マシンを物理的に常時防護することが出来ないので、安心でない。
 
別の可能性は、多数の公開キイを使うことだ。私なら家庭用と仕事用の二つのキイを作る。これは確実に実現可能だが、キイの利用をマシン二つに限定する。別のマシン上でウェブインターフェイスからアクセスしたe-メールを解読するにはどうするか?
 
これが行えるようにするには、秘密キイを携行しなければならない。Linuxの基本コマンドと技術を用いて、二つのマシンの間で安全にキイを転送する方法を探って見る。
 
キイの存在の検証
公開キイと秘密キイを作った後、.gnupgディレクトリは次のようになっている筈だ:
 
testpc:.gnupg->ll
total 32
drwx------  2 testacct testacct   4096 Apr 21 13:05 .
drwx------  13 testacct testacct   4096 Apr 21 13:03 ..
-rw-rw-r--  1 testacct testacct   7793 Apr 21 13:03 options
-rw-rw-r--  1 testacct testacct    899 Apr 21 13:05 pubring.gpg
-rw-rw-r--  1 testacct testacct     0 Apr 21 13:03 pubring.gpg~
-rw-------  1 testacct testacct    600 Apr 21 13:05 random_seed
-rw-------  1 testacct testacct   1356 Apr 21 13:05 secring.gpg
-rw-rw-r--  1 testacct testacct   1240 Apr 21 13:05 trustdb.gpg
 
pubring.gpgの中に最低一つのキイとsecring.gpgの中に最低一つのキイを持っているように見える。数個のgnupgコマンドを用いて必要なキイの有無を検証することが出来る。
--list-keysオプションを用いて公開キイを検証することが出来る:
 
testpc:.gnupg->gpg --list-keys
/home/testacct/.gnupg/pubring.gpg
--------------------------------
pub 1024D/3445AAA9 2004-04-21 Test Key
sub 1024g/A3F729EE 2004-04-21
秘密キイには --list-secret-keys オプションを用いる:
testpc:.gnupg->gpg --list-secret-keys
/home/testacct/.gnupg/secring.gpg
--------------------------------
sec 1024D/3445AAA9 2004-04-21 Test Key
ssb 1024g/A3F729EE 2004-04-21
 
リストする前に、必要数だけ公開キイをインポートして、定期的に使用することが出来る。移植可能と思うキイがキイリングの中にあることをを検証すると、メディアの作成に移動することが出来る。
 
フロッピイの作成
最も高速(で最も廉価)なキイディスク作成方法はフロッピイの使用だ。フロッピイの使用には次が含まれる:
1.フロッピイのフォーマット
2.キイリングのフロッピイへの移動
 
1.フロッピイのフォーマット
フロッピイをドライブに入れる。フロッピイのデータは全て消去されるので、全部不要なことを予め確認する。フロッピイドライブに結合するデバイスファイルは/dev/fd0。必要なのは mke2fsコマンドだけで、規定値パラメータはルートシェルだ。
 
testpc:dcs6255->su -
Password:
[root@testpc root]# mke2fs /dev/fd0 
mke2fs 1.27 (8-Mar-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
184 inodes, 1440 blocks
72 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
184 inodes per group
 
Writing inode tables: done              
Writing superblocks and filesystem accounting information: done
 
このファイルシステムは、32ヶ月又は180日毎の早い方でチェックされる。上書きするには tune2fs -c 又は -i を用いる。
フォーマット完了の後、フロッピイをmountする。mountコマンドからの戻りはない。
 
[root@testpc root]# mount /dev/fd0 /mnt/floppy
 
2.キイリングのフロッピイへの移動
このステップは、キイリングファイルののフロッピイへのコピイから始まる。移動にmvコマンドを用いるときは、ハードディスク上に残されるのファイルの破壊を保証することが出来ない。そこで、コマンド行上の簡単だスクリプトを用いて、ファイルをフロッピイにコピイし、shredユティリティを用いて残ったものを破壊する。
 
[root@testpc home]# cd /home/testacct/.gnupg
[root@testpc .gnupg]# for x in `ls`
> do
> cp $x /mnt/floppy
> shred -zu $x
> done
 
zオプションは、ディスク上のファイルのスペースに0を書くことをshredに命じ、uオプションは、完了次第ファイルを削除することを命じる。これで .gnupgディレクトリにはファイルが残らなくなり、キイディスクは次のようになる:
 
[root@testpc .gnupg]# ll /mnt/floppy
total 31
drwxr-xr-x  3 root   root     1024 Apr 21 10:53 .
drwxr-xr-x  4 root   root     4096 Mar 23 14:07 ..
drwx------  2 root   root    12288 Apr 21 09:02 lost+found
-rw-r--r--  1 root   root     7793 Apr 21 10:53 options
-rw-r--r--  1 root   root     899 Apr 21 10:53 pubring.gpg
-rw-r--r--  1 root   root      0 Apr 21 10:53 pubring.gpg~
-rw-------  1 root   root     600 Apr 21 10:53 random_seed
-rw-------  1 root   root     1356 Apr 21 10:53 secring.gpg
-rw-r--r--  1 root   root     1240 Apr 21 10:53 trustdb.gpg
 
フロッピイを取出して、任意のマシン上で使用することが出来る。unmountコマンドからの戻りはない。
[root@testpc root]# umount /mnt/floppy
 
キイディスクの使用
キイディスクは、ハードディスク上の .gnupg ディレクトリ上のmountして使用する。mountを検証するにはdfコマンドを用いる。
 
[root@testpc root]# mount /dev/fd0 /home/testacct/.gnupg
[root@testpc root]# df
Filesystem      Size Used Avail Use% Mounted on
/dev/hda2       2.6G 2.2G 347M 87% /
/dev/hda1       72M 9.2M  59M 14% /boot
none          62M   0  61M  0% /dev/shm
/dev/fd0       1.4M  27K 1.2M  3% /home/testacct/.gnupg
 
これで、フロッピイ上に移植可能キイのある gpg を使用する準備が整った。
 
最後の注意
この技術を使うと、誰かが秘密キイを盗んでマシンに物理的にアクセスするのを阻止する。キイディスクを無くさないことの重要さは言うまでもない。
この技術を使う別の利点は、マシンがインターネット又は別のネットワークに接続されている間に、キイリングを取り外すことが出来ることだ。
キイ携帯に別のメディアを使うことも出来る。CD-Rはフロッピイより耐久性が良い。現在のgnome 又は kdeを走らせるディストリビューションもまた、CDROMのため自動マウント機能を利用するので、キイCD-Rの方が人手でマウントするフロッピイより便利だ。しかしこの目的でCD-Rを使用するのは、スペースに無駄を生じるので、それが問題でないときCD-Rを利用することを薦める。この技術にフラッシュドライブを用いることも出来る。
 
 
 
 
 
ASP からPHPへの移行
Migration from ASP to PHP
投稿 http://www.linuxgazette.com/user/view/3973 :04/23/2004 - 21:04. 記事|ハウツー
 
緒言
この文書は ASPkらPHPへの移行の手引きである。
 
今までスマートカード会社で、昨年夏から、Windowsの下のウエブサーバとデータベースをLinuxに移植する仕事をして来た。プロジェクトの発端で、会社のウエブサイトは、 Microsoft SQL サーバ 2000を用いMicrosoft IISの下で、ASPを走らせた。プロジェクトの目的は、LAMP(Linux, Apache, MySQL, PHP)を用いて、会社のウエブサイトを走らせることだった。言い換えると、IISの代わりにApache を、ASPの代わりにPHP を、MS SQL サーバ2000の代わりにMySQLを用いて、これらオープンソース・ソフトウエアをLinux上で走らせることだった。
 
御承知の通り、前節で述べたオープンソース・ソフトウエアはLinux上だけでなくWindowsでも走る。したがって、移行に当たっては二つの戦略がある:Apache, PHP, MySQLwo先ずWindowsにインストールして移行をWindowsの下でおこなってLinuxに移動するか、又はオープンソース・ソフトウエアをLinux上にインストールして、移行作業全部をLinux 上でおこなうかd。
 
ASP から PHP への移行
我々の場合、ウエブサイトは韓国のITプロバイダが設計して管理している。残念ながらASPコードのコメントは全て韓国語で書いてあるので、ASPからPHPへの転換は韓国会社が上の第一戦略を用いておこなうのが良い。しかし、色々な理由で、ウエブサイトを運営する会社は移行に巻き込まれるのを好まなかったので、移行は自分自身がLinux の下でおこなった。
 
ASPコード全部をLAMPマシンにコピイした後、コード翻訳を始める。だが、その前に,ASPコードをバックアップしておく必要がある。移行自体は二段階に分かれる:ASP2PHPと人手のコード翻訳だ。これを以下に説明する:
 
第一段階:ASP2PHP
第一段階では、ASP2PHPと言うオープンソース・ツールを用いて自動コード変換をおこなう。これは http://asp2php.naken.cc/でダウンロードすることが出来る。これは、殆どのLinuxディストリビューションに付いて来るRPMを用いてインストールすることも出来るが、ASP2PHPウエブサイトから、最新版をダウンロードして自分でコンパイルすることを薦める。執筆時現在0.76.19 の最新版には、最新の機能とバグ修正がふくまれているからだ。ツールを構築するステップは次の通り:
 
$ wget http://www.mikekohn.com/asp2php/asp2php-0.76.19.tar.gz
$ tar zxvf asp2php-0.76.19.tar.gz
$ cd asp2php-0.76.19
$ make
$ make install
 
これで、ASP2PHPが /usr/local/bin にインストールされる。次のコマンドを用いてASP2PHPのGUIバージョンをインストールすることも出来る:
make gui
 
ASP2PHP は各種の機能を提供する。それはパラメータ無しでコマンド asp2php を走らせるとリストすることが出来る。使い方の例は次の通り:
$ asp2php -includes -fulltags \
> -mysql -uid root -passwd root -database smartcard -address localhost \
> dbopen.asp
 
パラメータ includes は、ASPコードの #includes requires() に変更する:
ASP PHP
<!--#include virtual ="/bin/dbopen.inc"--> <?php require("/bin/dbopen.inc"); ?>
 
includeファイルがasp拡張子のものであるときは、ASP2PHPがこれらファイルをPHPにも同時に転換する。
パラメータ fulltags は、PHP magic tag全部を <? から <?php に変更する。
ASP2PHP はまた、sessionなど下に示す一般的な特性をサポートする(ASPの乱数ファン
クションさえも正しくPHPに転換される):
ASP PHP
<%
response.write "Example on Randomize<br>"
randomize
randomnum=int(rnd*2)+1
IF randomnum=1 THEN
session("a")=session("a")+1
ELSE
session("b")=session("b")+1
END IF
response.write "A = " & session("a") &    "<br>"
response.write "B = " & session("b") &    "<br>"
%>











 
<?
session_start();
session_register("a_session");
session_register("b_session");
?>
<?
print "Example on Randomize<br>";
mt_srand((double)microtime()*1000000);
$randomnum=intval((mt_rand(0,10000000)/10000000)*2)+1;
if ($randomnum==1)

{

$a_session=$a_session+1;
}
else
{

$b_session=$b_session+1;
}

print "A = ".$a_session."<br>";
print "B = ".$b_session."<br>";
?>
 
ウエブサイトに数百数千のASPファイルがあるとき、ファイル全部を一つ一つ通覧しないで効率的に移行する方法はないだろうか?ASP2PHPには、このための極めて有用で便利なファンクションがある。パラメータ dir がディレクトリの下のASPに繰り返し働き掛ける。例を示す。
 
$ asp2php -includes -fulltags \
> -mysql -uid root -passwd root -database smartcard -address localhost \
> -addextension .inc \
> -dir asp -o php
 
この例は、ディレクトリの下のaspファイル全部を読取って、php拡張子のあるファイルをディレクトリphpの下に記憶する。作用はaspの下のディレクトリに繰り返し実行される。その上、パラメータ addextension が ASP2PHP に、inc拡張子のあるファイルにもまた働きかけることを命じる。
 
例:データベースコード移行
データベースコードの移行を容易にするため、 ASP2PHP は、MySQL, Oracle, ODBC, Postgres, Sybaseを含む多数の各種データベースをサポートする。オプション -mysql -uid root -passwd root -database company -address localhost が次の結果を生じる:
 ASP  PHP
<%
Set Dbcon = Server.CreateObject("ADODB.Connection")
DbCon.Open ("UID=smart;PWD=card;DSN=smartcard")
%>
<?php
// $Dbcon is of type "ADODB.Connection"
$DbCon=mysql_connect("localhost","root","root");
mysql_select_db("company",$DbCon);
?>
 
第一行のコメントは、 ASP2PHPが自動的に作成することに注意。
ASPのことは良く知らないが、データベースに接続するとき、一般的な方法が二つある。しかし、ASP2PHPは、別の方法では完全に作動しないので、移行の例を示す:
 
方法 1: RecordSetを用いてレコードセットを作って開く
この方法は、レコードセットのインスタンス毎のコネクションオブジェクトを暗黙のうちに作る。ASP2PHPからのコード出力を以下に示す:
ASP PHP
<%
'create and open a Recordset using recordset
set rs=Server.CreateObject("adodb.Recordset")
'Set the DSN
connect="UID=admin;PWD=password;DSN=company"
'Designate your SQL statement
sqlstmt = "SELECT * from example"
'Connect the record set with the DSN and the SQL statement
rs.open sqlstmt, connect
If rs.eof then
 response.write "No records in the database<br>"
 response.end
Else

'This is an example of a loop.
Do while not rs.eof
Name = rs("Name")
    Email = rs("Email")
    Phone = rs("Phone")

%>
     The person's name is: <%= Name %><BR>
     The person's email address is: <%= Email %><BR>
     The person's phone number is: <%=Phone %><BR>
     <HR>
<%
     rs.MoveNext
     loop
     End If
%>









 
<?php
//create and open a Recordset using recordset
// $rs is of type "adodb.Recordset"

//Set the DSN
$connect="UID=admin;PWD=password;DSN=company";
//Designate your SQL statement
$sqlstmt="SELECT * from example";
//Connect the record set with the DSN and the SQL statement
mysql_query($rs_CommandText,$rs_ActiveConnection);$connect;
if (($rs==0))
{

  print "No records in the database<br>";
  exit();

}
else
{

//This is an example of a loop.
while(!($rs==0))
{
 $Name=$rs["Name"];
 $Email=$rs["Email"];
 $Phone=$rs["Phone"];

?>
The person's name is: <?php echo $Name; ?><BR>
The person's email address is: <?php echo $Email; ?><BR>
The person's phone number is: <?php echo $Phone; ?><BR>
<HR>
<?php
 $rs=mysql_fetch_array($rs_query);

 }
}

?>
 
お気付きのように、出力PHPコードは正しく働かないので、赤字で示す10行目で警告が出る。システムは、 mysql_query() に与えられる引数が無効であると報告する。ASP2PHPは、データベース接続をおこなうため RecordSet用いるASPコードを完全には認識することが出来ないと思われる。
 
方法 2:Connectionを用いてレコードセットを作って開く
この方法は、コネクションオブジェクトを明示的に作ってデータベース接続をおこなう。ASP2PHPにより翻訳される様子を示す:
 ASP PHP
<%
'create and open a Recordset using Connection - execute
Set conn = Server.CreateObject("ADODB.Connection")
myDSN = "UID=admin;PWD=password;DSN=company"
conn.open myDSN
set rs = Server.CreateObject("adodb.Recordset")
sqlstmt = "SELECT * from example"
set rs = conn.execute(sqlstmt)

If rs.eof then
     response.write "No records in the database<br>"
     response.end
Else
     'This is an example of a loop.
     Do while not rs.eof
      Name = rs("Name")
      Email = rs("Email")
      Phone = rs("Phone")

%>
     The person's name is: <%= Name %><BR>
     The person's email address is: <%= Email %><BR>
     The person's phone number is: <%=Phone %><BR>
     <HR>
<%
      rs.MoveNext
     loop
End If
%>



















 
<?php
//create and open a Recordset using Connection - execute
// $conn is of type "ADODB.Connection"

$myDSN="UID=admin;PWD=password;DSN=company";
$a2p_connstr=$myDSN
$a2p_uid=strstr($a2p_connstr,'uid');
$a2p_uid=substr($d,strpos($d,'=')+1,strpos($d,';')-strpos($d,'=')-1);
$a2p_pwd=strstr($a2p_connstr,'pwd');
$a2p_pwd=substr($d,strpos($d,'=')+1,strpos($d,';')-strpos($d,'=')-1);
$conn=mysql_connect("localhost",$a2p_uid,$a2p_pwd);
mysql_select_db("",$conn);
// $rs is of type "adodb.Recordset"

$sqlstmt="SELECT * from example";
$rs=$rs_query=mysql_query(($sqlstmt),$conn);
$rs=mysql_fetch_array($rs_query);

if (($rs==0))
{


  print "No records in the database<br>";
  exit();

}
else
{
     //This is an example of a loop.
     while(!($rs==0))
     {

     $Name=$rs["Name"];
     $Email=$rs["Email"];
     $Phone=$rs["Phone"];

?>
     The person's name is: <?php echo $Name; ?><BR>
     The person's email address is: <?php echo $Email; ?><BR>
     The person's phone number is: <?php echo $Phone; ?><BR>
     <HR>
     <?php
     $rs=mysql_fetch_array($rs_query);

     }
}

?>
 
凄いだろう!ASP2PHP は、データベース接続に Connection を用いるASPコードを殆ど完全に翻訳する。ASP2PHP がDSNを認識し、7行目(赤字)で ";" を抜かすとの小さい構文エラーだけで、ユーザ名とパスワードを正しく解析する。このバグは著者 Michael Kohn が直ちに修正すると思う。その上、mysql_select_db() に対する引数の中で、データベース名が抜けているのに気付くだろう。この問題は、パラメータ database を用いてデータベース名を規定することにより解決することが出来る。
 
自動翻訳の後、出来上がったばかりの新しいPHPペイジにアクセスしてテストをおこない、正しく働くことを確認されたい。自分のウエブサイトを機能的にも必ず徹底的にテストすること。構文エラーも警告もなくコンパイルされるPHPペイジが、機能の面で支障なく働くとは限らない。
 
第二段階:人手による翻訳
ASP2PHP は、ASPからPHPへのコードレベル移行を容易にする点で疑いなくプログラマの役に立つ。XML-関連ファンクションなど、ASPコードの中には、ASP2PHPを用いて正しく翻訳することの出来ないものがある。このウエブサイトは、インドの会社が提供するニュースサービスを使っている。このニュースはXMLの形で配信され、次のように働く:
1.HTTP GETリクエストをおこなって、第三者からXMLファイルを受領する。
2.XML文書をPhaseする。
3.ニュースを綺麗に表示する。
 
ASP コードの一部とそれに相当する ASP2PHPからの出力を示す:
ASP PHP
<%
Dim objRequest
Dim strOutputXML
Dim xmlHeadlines
set xmlHeadlines = server.CreateObject ("MSXML2.DomDocument")
set objRequest = server.CreateObject ("MSXML2.XMLHTTP")
objRequest.open "Get", "getnews.asp?id=38123", False
objRequest.send
xmlHeadlines.loadxml(objRequest.responseText)
Set Src = Server.CreateObject("Microsoft.XMLDOM")
Src.async = false
Src.loadxml(objRequest.responseText)
%>
<?php
// $xmlHeadlines is of type "MSXML2.DomDocument"

// $objRequest is of type "MSXML2.XMLHTTP"

$objRequest->open"Get"//getnews.asp?id=38123", False
$objRequest->send;
$xmlHeadlines->loadxml($objRequest->responseText);
// $Src is of type "Microsoft.XMLDOM"

$Src->async=false;
$Src->loadxml($objRequest->responseText);
?>
 
 
出力PHPコードには、構文エラーと欠陥PHPオブジェクトを含むので、完全には働かない。しかし、意味の深いコメントを提供して、人手によるコード翻訳を容易にする。これらのコメントがあるので、 DOM XML function を用いて、ASPの中のXMLDOM とDocDocumentオブジェクトを補完することが出来る。xml.Headlines.loadxml(objRequest.responseText) を、 $doc = domxml_open_file ($xmlurl); で置き換えるなどである。
 
コード翻訳をおこなう別の方法は、行毎の翻訳でなくファンクション毎に翻訳することである。ASPコードの中で相当するPHPファンクションを決定するのが難しいことがある。したがって、先ずASPファイルを通覧して作用を理解し、その上で仕事をおこなう自分のPHPコードを書く。上の例で私は、XML Parser Functions を用いて第三者から入手するXML 文書を解析した。
 
まとめ
ASP2PHP がASPから PHPへの移行を容易にすることに疑いはない。このツールが有用だと思われたら、ASP2PHP を開発し改良しているMichael Kohn に礼状を送られたい。この文書に対するご意見を歓迎するので Cheng Kwok Wing, William <wing328-at-yahoo.com>まで数行でよいから寄せられたい。
 
 
 
 
END