レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
  SANE-tutorial-JP
  著者: David Mosberger 

  翻訳: 川岸 良治 < kawagisi@yk.rim.or.jp >
  第1版 1999年7月13日作成

  この文書は、スキャナ用 API の規格である SANE の仕組み、パッケージの使
  い方、プログラミングの概要等について解説したものです。

  The SANE Scanner Interface

           David Mosberger
           David.Mosberger@acm.org

  この記事は Linux Journal Issue 47, March 1998 に発表したものです。

  概要

       SANE は `Scanner Access Now Easy' の略語です。これは、フラッ
       トベッドスキャナ、ビデオ、スチルカメラ、フレームグラバ(画面
       キャプチャ)のようなラスター画像を作るデバイスから画像を取り
       出すことができる汎用のインタフェースです。SANE の意義は、個
       々のデバイスの特性を気にせずに画像処理アプリケーションが書け
       るようになるということです。これを別の視点から見ると、 SANE
       に準拠したデバイスドライバをたった一度書くだけでいいというこ
       とです。同じデバイスドライバをSANE に準拠した別のアプリケー
       ションからも使えるようになるのです。

  1.  はじめに

       Linux で画像をスキャンしたいと思ったことはありませんか? も
       しそうなら、たぶんスキャナドライバパッケージの多さに当惑する
       かもしれません。これを書いている時点で、少なくとも 14 の
       Linux 用スキャナドライバパッケージが存在します。個々のパッケ
       ージは高品質ではあるものの、どのドライバパッケージをどのス
       キャナに使えばよいのか分からないことがよくあります。おまけ
       に、あるパッケージはコマンドライン・インタフェース、別のは
       tcl/tk ベースのグラフィカル・フロントエンドがある、さらに完
       全武装のグラフィカル・フロントエンドを持ったものもあるという
       具合です。バラエティは生活を豊かにするとは言うものの、この場
       合はかなり大きな頭痛の種です。

       SANE はこのジレンマを解決するために作られました。基本的なア
       イデアは単純です。つまり、汎用的でよく出来た API(Application
       Programming Interface) があれば、スキャナドライバから独立し
       たアプリケーションを書くのは容易です。従って、新しいスキャナ
       ドライバの作者は、ドライバ用のアプリケーションを書くことを心
       配しなくてよいのです。さらにアプリケーション・プログラマに
       とっても SANE は汎用的なので、いずれは制御されるであろうデバ
       イスと独立してアプリケーションを書くことが出来るという利点が
       あるのです。

       10 の異なるデバイスをサポートするために、5つのアプリケーショ
       ンが欲しいとします。古いアプローチでは、5×10=50 で 50 もの
       プログラムを書かなければなりません。SANE では 5+10=15 で 15
       のプログラムを書くだけでよいのです。 SANE はユーザにもメリッ
       トがあります。ユーザは自分が最も気に入ったアプリケーションを
       選択する自由が得られ、それをユーザがアクセス可能な全ての画像
       取込みデバイスを制御するために使用できます。つまり SANE は、
       使用中の特定のデバイスに一貫したインタフェース独立性を与えて
  くれるのです。

  もちろん SANE がこのような汎用インタフェースの最初の試みでは
  ありません。 TWAIN, PINT, Linux hand-scanner というインタ
  フェースを耳にしたことがあるかもしれません。問題なのは,これ
  らの古いインタフェースには、アプリケーションからデバイスへ
  の(またはその逆の)インタフェースが不足していることです。例え
  ば、PINT は本当にいくぶん原始的なカーネルレベルのインタフェ
  ースであり、 hand-scanner インタフェースは文字どおりハンドス
  キャナに限定されています。対照的に SANE はラスター画像を取り
  込むデバイスをサポートするのに一般には充分です。SANE に最も
  近いのは、たぶん TWAIN です。

  SANE と TWAIN の韻は偶然の一致ではないことは事実ですが、それ
  は別の話です。 TWAIN が SANE ではない主な理由は、TWAIN がア
  プリケーションに代わってドライバの中にデバイスを制御するため
  のグラフィカル・ユーザインタフェースを置くことです。これは
  スキャナが動作しているマシンとは別のマシンでアプリケーション
  が動いているといった Linux またはネットワーク環境には適して
  いません。SANE はこれと対照的に、実際のドライバとそれを制御
  するアプリケーションの厳密な分離を強要します。実際、現在の
  SANE ディストリビューションにはネットワーク経由でのスキャン
  がサポートされています。

  2.  SANE を使う

       SANE を使うには下記の ftp ディレクトリから最新バージョンの
       ディストリビューションを入手します。
       

       SANE に付いてくるグラフィカル・ユーザインタフェースをビルド
       したいなら、 GIMP あるいは最低限でも GTK を入手、ビルド、イ
       ンストールする必要があります。 GIMP と GTK はいずれも
       
       から入手します。GTK は元々 GIMP 用に開発されたユーザインタ
       フェースのツールキットですが、今では SANE を含む他の多くのプ
       ロジェクトに採用されています。 SANE ディストリビューションは
       GIMP/GTK ライブラリが無くてもうまくビルドできます。しかし、
       その場合グラフィカル・ユーザインタフェース・プログラムは何ひ
       とつビルドされず、多くの楽しみが奪われてしまいます。従ってサ
       ーバ用のみに SANE をビルドするのでなければ、最低でも GTK
       (GIMPではなく) をインストールすることを勧めます。

       SANE ディストリビューションを入手したら圧縮されている tar
       ファイルを展開し、 README ファイルの内容に従って下さ
       い。README は SANE をビルドし、インストールする方法を説明し
       ています。また PROBLEMS というファイルにも目を通して下さい。
       これには既知の問題点と、するべきことのリストがあります。

       SANE を動作させるためにスキャナやカメラが必須ではないことに
       注意して下さい。 SANE ディストリビューションには、PNM
       (portable `anymap')ファイルを読むことによりスキャナをシミュ
       レートする仮想ドライバが入っています。また、SANE は Linux に
       限定されません。Linux Alpha, Linux x86, Linux m68k 以外にも
       AIX, Digital Unix, FreeBSD, HP-UX, IRIX, NetBSD, SCO,
       Solaris, SunOS また OS/2 でも動作します。

       SANE をインストールしたら下記のコマンドを入力してみましょ
       う。

       scanimage --list-devices

  すると以下のように出力される筈です。

  device `mustek:/dev/scanner' is a Mustek MFC-06000CZ flatbed
  scanner
  device `pnm:0' is a Noname PNM file reader virtual device
  device `pnm:1' is a Noname PNM file reader virtual device

  この例では Mustek のスキャナは mustek:/dev/scanner という名
  前で利用可能であり、また pnm:0 と pnm:1 という PNM ファイル
  を読むために使う 2 つの仮想デバイスも利用できることを、この
  リストは表しています。個別のデバイスの全てのオプションを表示
  するには、例えば pnm:0 の場合、次のようにします。

  scanimage --device pnm:0 --help

  こうすると図1 のようなヘルプメッセージが出ます。

  ____________________________________________________________
      Usage: scanimage [OPTION]...

      Start image acquisition on a scanner device and write PNM image data to
      standard output.

      -d, --device-name=DEVICE   use a given scanner device
      -h, --help                 display this help message and exit
      -L, --list-devices         show available scanner devices
      -v, --verbose              give even more status messages
      -V, --version              print version information

      Options specific to device `pnm':
        Source Selection:
          --filename <\<>string> [/tmp/input.ppm]
              The filename of the image to be loaded.
        Image Enhancement:
          --brightness -100...100% [0]
              Controls the brightness of the acquired image.
          --contrast -100...100% [0]
              Controls the contrast of the acquired image.
          --grayify[=(yes|no)] [no]
              Load the image as grayscale.
          --three-pass[=(yes|no)] [no]
              Simulate a three-pass scanner by returning 3 separate frames.
              For kicks, it returns green, then blue, then red.
          --hand-scanner[=(yes|no)] [no]
              Simulate a hand-scanner.  Hand-scanners often do not know the
              image height a priori.  Instead, they return a height of -1.
              Setting this option allows one to test whether a front end can
              handle this correctly.
          --default-enhancements
              Set default values for enhancement controls
              (brightness & contrast).

              Figure 1: Scanimage Help Message For pnm:0 Pseudo-Device
              図1: pnm:0 仮想デバイス用 scanimage のヘルプメッセージ
  ____________________________________________________________

  SANE パッケージには、Scanimage プログラムの使い方を説明した
  詳細なマニュアルページが付いてきます。例として input.ppm と
  いう名前の PPM ファイルを想定します。下記のコマンドで、この
  画像を「スキャン」し、かつ明るさを 50%増加させることができま
  す。

  scanimage --device pnm --brightness 50 input.ppm >
  output.ppm
  xv のような画像ビューワで output.ppm ファイルを見る
  と、output.ppm が著しく明るくなっていることが分かるでしょ
  う。

  あなたはこう言うかもしれません − 「すごい。だけどグラフィカ
  ル・ユーザインタフェースはないの?」。SANE をビルドした時点
  で GTK ライブラリがインストール済みであれば、xscanimage とい
  うプログラムを呼び出すことができます。これは、利用可能なデバ
  イス一覧のダイアログボックスを表示します。`pnm:0' をダブルク
  リックすると図 2 に示すダイアログが表示されます。

  <<  図2: SANE ダイアログウィンドウ >>

  (   の Figure
  2: SANE Dialog Window 参照 )

  ご覧のようにダイアログには 2 つの `Filename' というテキスト
  入力ボックスと `Brightness' というスライダがあります。最初の
  テキスト入力ボックスに output.ppm , 2 つ目のボックスに
  input.ppm と入力し、Brightness のスライダを 50.0 に移動させ
  てから左下の Scan ボタンを押すと、前述のコマンドラインで実行
  した scanimage と同じ結果が得られます。もちろん本番のスキャ
  ンをする前に、右下の Preview ボタンを押してプレビュー・ウィ
  ンドウ(図3) を表示させることもできます。

  <<  図3: SANE プレビュー・ウィンドウ >>

  (   の Figure
  3: SANE Preview Window 参照 )

  プレビュー・ウィンドウでは、 Acquire -> Preview ボタンを押す
  とスキャン本番の画像を低解像度でプレビュー表示できます。例え
  ば、Brightness スライダを操作すると、画像の明るさがどのよう
  に影響されるかが分かります。スライダを動かしてから Acquire
  Preview ボタンを押すとプレビュー表示が更新されます。

  スキャナやカメラで画像をスキャンする際、様々な方法の画像補正
  をしたいことがよくあります(例えば画像をシャープにするな
  ど)。xscanimage プログラムは幸いにも GIMP の拡張として実行さ
  せることができます。このようにするには、GIMP の plug-ins
  ディレクトリから xscanimage のバイナリにシンボリックリンクを
  張るだけです。SANE をインストールしたディレクトリがデフォル
  トと同じだとすると、下記のコマンドでシンボリックリンクを張れ
  ます。

  ln -s /usr/local/bin/xscanimage ~/.gimp/plug-ins

  シンボリックリンクを張ると、 GIMP の次回起動時から
  xscanimage は `Xtns' (拡張) メニューに組み込まれます。これは
  `Xtns -> Acquire' そしてうになります。この方法で起動する場
  合、Scan ボタンを押して新しくスキャンした画像は(ディスクにセ
  ーブするかわりに) GIMP ウィンドウの内側に置かれます。これ
  で、通常の GIMP の画像処理機能を、取り込んだ画像をセーブする
  前の補正に使えるようになります。

  この PNM 仮想デバイスはちょっと変に見えるかもしれませんが、
  本物のスキャナインターフェースはどのように見えるのでしょう
  か?図 4 は、Mustek フラットベッド・スキャナでの xscanimage
  ダイアログです。この図は、xscanimage の他の機能:ツールチッ
  プ(バルーンヘルプとも言う)のデモンストレーションも行っていま
  す。ツールチップがあれば、新規ユーザがスキャナやカメラの能力
  を理解しやすくなります。図の中で、マウスは Scan Source メ
  ニューを指し、その結果このメニューのヘルプ情報がマウスポイン
  タの下の黄色い箱の中に表示されています。ツールチップは新規ユ
  ーザには便利ですが、しばらくすると自分なりの方法でやりたくな
  ります。そこで xscanimage は上級者向けに Preferences サブメ
  ニューでツールチップを出さないようにすることもできます。

  << 図4:xscanimage での Mustek ダイアログウィンドウ >>

  (   の Figure
  4: Mustek Dialog Window for xscanimage 参照 )

  ご覧のように Mustek ダイアログは PNM 仮想デバイスインタフェ
  ースとはかなり異なるように見えます。これは元になるデバイスが
  異なる能力を持っているからです。デバイスダイアログは、選択さ
  れたデバイスに依存するだけでなく、デバイスのモードにも依存し
  ます。例えばダイアログの下の方にある `Use custom gamma
  table' オプションをオンにするとインタフェースが変更され、結
  果として図 5 のようになります。ご覧のようにダイアログの右半
  分はグラフエディタになり、輝度と RGB のガンマテーブルを変更
  できます。言い換えれば xscanimage はアクティブな、または与え
  られたスキャンモードでの重要なオプションを正確に表示するの
  で、ユーザが混乱しにくくなります。

  << 図5:ガンマテーブルエディタ付き Mustek ダイアログ >>

  (   の Figure
  5: Mustek Dialog With Gamma Table Editor 参照 )

  図の右半分にある画像の輝度ガンマテーブルを見ると、xscanimage
  を起動する度にガンマテーブルを定義していたら、むしろいらいら
  するのではないかと思うかもしれません。理想的なテーブルが見つ
  かって、もしそれらをセーブすることができるなら素晴らしいです
  ね。このために、xscanimage は Preferences サブメニューの項目
  で現在のデバイス設定をセーブできます。セーブしておけば
  xscanimage を起動する度に、そのデバイスで最後にセーブされた
  オプションが自動的に読み込まれます。

  3.  SANE に付属するもの

       SANE ディストリビューションに含まれるいくつかのプログラムの
       使い方を見てきました。その他に何があるのかを書きます。これを
       書いている時点で、パッケージには以下のデバイス用のドライバが
       入っています。

       o  Connectix QuickCam (カラーとモノクロ)

       o  Epson SCSI スキャナ

       o  Hewlett-Packard ScanJet SCSI スキャナ

       o  Microtek SCSI スキャナ

       o  Mustek SCSI フラットベッドスキャナ
          (1 パスおよび 3 パススキャナ のいずれもサポートされていま
          す)

       o  PINT デバイス
          PINT は NetBSD, OpenBSD, SunOS 用の Unix カーネルインタ
          フェースです。 SANE の PINT ドライバは PINT サポートがあ
          るスキャナにアクセスできます。

       o  ほとんどの UMAX SCSI スキャナ

          他の多くのスキャナ、カメラのサポートは計画中で、その内の
          いくつかはこの記事を読むまでの間に出来ているかもしれませ
          ん。最新情報は参考文献のところに書かれているウェブページ
          を見て下さい。

       利用可能なアプリケーションは、コマンドラインの scanimage と
       グラフィカルな xscanimage (スタンドアロンで、または GIMP の
       拡張として)と (Connectix QuickCam のような)連続した画像のス
       トリームを作るカメラに適したグラフィカルユーザインタフェース
       の xcam です。

       加えて、SANE には Python や Java 用の API があり、またリモー
       トデバイスへのネットワーク経由のアクセスを可能にする saned
       というネットワークデーモンがあります。これはパーミッションを
       適切に設定してあれば、アメリカで動作しているカメラをヨーロッ
       パにあるマシンから制御することもできます。これは全て SANE と
       インターネットのサービスによるものです。

  4.  どのように動作するか

       SANE アプリケーションをビルドする際、libsane.so という共有ラ
       イブラリがリンクされている必要があります。実際には、lib-
       sane.so は SANE ドライバ群の一つへのシンボリックリンクに過ぎ
       ません。どの SANE ドライバも同じインタフェースを提供するの
       で、いつでも libsane.so へのシンボリックリンクを変更できます
       し、アプリケーションが使用しているドライバを効果的に変更でき
       ます。全てのアプリケーションをリンクし直すことなくドライバを
       アップグレードできるため、ある意味これは便利ですが、スキャン
       デバイスを切替えたい時はシンボリックリンクを変更しなければな
       らず、かなり不便です。このため SANE は、dll および net とい
       う 2 つの仮想デバイスドライバをサポートしています。これらは
       仮想ドライバです − なぜなら物理的デバイスに話しかけるのでは
       なく、図 6 に示すように他の SANE ドライバと話すからです。

  << 図 6: 取りうる SANE 階層 >>

  (   の Figure
  6: Possible SANE Hierarchy 参照 )

  マシン A にとって、libsane.so のシンボリックリンクは dll 仮
  想ドライバ (libsane-dll.so と呼ばれる)を指しています。仮想ド
  ライバは他の SANE ドライバにアクセスするためにダイナミックリ
  ンクライブラリ(dll)を使用します。例示した図では dll は pnm,
  mustek, net ドライバを使うために設定されています。

  net ドライバもやはり仮想ドライバで、これはマシン B で動作し
  ている SANE デーモン(saned)に接続することにより、リモートス
  キャナへのアクセスを提供します。さて、マシン B は、他のいく
  つかのドライバにアクセスするために再び dll を使用します。ご
  想像のように、システム管理者は、マシン A と B を正しく設定し
  ないといけません。

  libsane.so を dll 仮想ドライバへのシンボリックリンクとするの
  は、普通に行われるやり方です。でも net 仮想ドライバへのリン
  クにしたり、単純に mustek ドライバへのリンクにしたりもできな
  い理由はないはずです。もちろん、例えば mustek にリンクさせた
  場合には、アプリケーションは mustek のドライバにしかアクセス
  できなくなるでしょう。でも、これは特定の環境においては完全に
  合理的であるかもしれません。

  このアプローチは大変柔軟ですが、興味深い質問が出てきます。こ
  のような環境でデバイスの名前をどうやってつけるのでしょう?答
  えは、リアルドライバは全てそれ自身の名前のスペースを持ってい
  る、です。例えば、Mustek と HP ドライバはデバイスを制御する
  /dev/scanner のような Unix スペシャルデバイスのパスを使いま
  す。

  仮想ドライバには、もう少し面白いことがあります。 dll は各ド
  ライバ名がユニークであることを保証しなければならないので、各
  々の従属デバイス名と従属ドライバ名をコロンで区切ったものを接
  頭辞としてつけます。従って、マシン A では mustek のスキャナ
  は mustek:/dev/scanner と呼ばれます。net 仮想ドライバも同様
  に、リモートデバイス名とリモートホスト名を接頭辞としてつけま
  す(やはりコロンがセパレータとして使われます)。

  例えば、マシン B の HP スキャナ1
  は、net:B.domain.com:hp:/dev/scanner1 という名前でマシン A
  に現れます。野暮ったい名前ですが、名前に含まれる情報は実際に
  極めて有用です。

  デバイス名は SANE の階層を通して個々のデバイスへ割り振られま
  す (本質的には、Unix のパス名に似ています)。例えば、マシン B
  がダウンしたことが分かれば、
  net:B.domain.com:hp:/dev/scanner1 も同じようにダウンしている
  ことは、明白です。

  これらの名前がすごく嫌なら、ユーザまたはシステム管理者が、ア
  プリケーションを簡潔なエイリアスで定義することもできます。例
  えば、ユーザがアプリケーションで上記デバイス名を(初心者には
  分かり易い) `HP Scanner 1' にリネームできます。

  5.  SANE のプログラミング

       定義により、SANE はそれを使うプログラムと同じくらい良い唯一
       のものです。これは、SANE を使用するアプリケーションやデバイ
       スが多い程、より楽しくなることを意味します。SANE ディストリ
       ビューションには、SANE API を説明した詳細なドキュメントも付
       いてきますが、インタフェースは極めてシンプルです。下記に示
       す6個のメイン関数があります。

       handle <- sane_open (device-name):

       SANE デバイスを名前 (例えば pnm:0)でオープンします。

  sane_close (handle):

       SANE デバイスをクローズします。

  sane_get_option_descriptor (handle, option-number):

       デバイスが利用可能な制御はなにかを問い合わせるために使われま
       す (PNM 仮想デバイスドライバの明るさ制御のような)。

  sane_control_option (handle, option-number, action, value):

       オプションの値を取得または設定するために使われます。例えば、
       明るさのオプションの値を 50% にセットするために使われます。
       加えて、いくつかのオプションはドライバが適切な値をとるように
       する自動モードをサポートしています。このようなオプションで
       は、sane_control_option() は自動モードをオンまたはオフにする
       ためにも使われます。

  sane_start (handle):

       画像の取り込みを開始するために使われます。

  bytes-read <- sane_read (handle, buffer, buffer-size):

       全ての画像を取り込むまで、実際の画像データを読むために使われ
       ます。

  SANE API はシンプルに設計されています。目標は、洗練されたドライバとア
  プリケーションを可能にする充分な機能を提供しながらも、シンプルなタスク
  を少ない時間で成し遂げることでした。HP スキャナ用の hpscanpbm プログラ
  ムを SANE ドライバに変換するのに要したのはふた晩という事実は、設計のシ
  ンプルさの最良の証拠です。逆に、Mustek ドライバと xscanimage はかなり
  困難なプログラムですが、SANE はそれらに順応するのに問題はありません。

  6.  SANE と商用のアプリケーション/ドライバ

       商用の SANE ドライバまたはアプリケーションに関する私たちの見
       解は何でしょう? GNU Public License の精神によれば、SANE プ
       ログラムのソースを持つことは好ましいことです。しかし、ダイナ
       ミックロードされる、Linux と他のプラットホーム用のダイナミッ
       クローディングをサポートする商用 SANE ドライバを書くことは許
       されます (ドライバは常にダイナミックロードされるので、これは
       特別な作業を生じません)。同じ理由で、共有ライブラリ
  libsane.so にリンクする商用アプリケーションを書くのも正しい
  ことです。この見解を支える基本的な考え方は以下の通りです。

  1. 商用とフリープログラムの健全な競争は財産であって負債では
  ない。

  2. より幅広く SANE が使用されれば、Linux/Unix コミュニティに
  とってさらによい状況になる。

  7.  将来の計画

       ごく近い将来の計画は、もっと多くのデバイスのサポートを追加す
       ることです。例えば、Agfa と Plustek のスキャナ、Nikon フィル
       ムスキャナのドライバが計画されています。また、よりポピュラー
       なデジタルカメラのドライバが間もなく実現する可能性がありま
       す。ネットワークの接続性で最良のものを得るために、Java の実
       行が可能なウェブブラウザからスキャナを制御できる Java のス
       キャナアプリケーションを実装する計画もあります。

       長期計画では、オーディオソースやビデオテープレコーダを含む他
       のマルチメディア・デバイスをSANE が包含するのが一般化するこ
       とに興味があるでしょう。

       言い換えれば、SANE は始まったばかりです。そして多くのわくわ
       くするようなプロジェクトがあります。あなたがあらゆる意味で、
       これらのどれかに参加することに興味があるなら SANE メーリング
       リストを通して他の開発者と文通して下さい。メーリングリストと
       他の価値あるリソースが SANE のホームページにあります。

       

  8.  謝辞

       SANE プロジェクトは、多くの人達の継続的なサポート無しには
       やってこれなかったでしょう。中でも、Andreas Beck, Gordon
       Matzigkeit, Patrick Reynolds, Tristan Tarrant による貢献
       は、SANE を夢から現実のものに変換するために決定的でした。

       同様に Michael K. Johnson と Jeremy Rosenberger が、この記事
       の初期のドラフトバージョンのフィードバックをくれたことにも感
       謝します。

  9.  日本語版について

       この文書は Linux Journal Issue 47, March 1998 に掲載さ
       れ、SANE のホームページ   で
       "Tutorial" として公開されている文書を翻訳したものです。翻訳
       および公開することに関し SANE プロジェクトの了承を得ました。

       履  歴: 第1版 1999年7月13日

       版権等: オリジナルの文書と同様に、この日本語版も GPL(GNU
       General Public License)に従います。

       謝  辞:日本語版作成にあたり、以下のJF メンバーの方に御協力
       頂きました。有難うございます。

  福島 於修さん < fuku@amorph.rim.or.jp >
  武井 伸光さん < takei@cc.kochi-u.ac.jp >
  中野 武雄さん < nakano@apm.seikei.ac.jp >
  Hiro Sugawara さん < hiro@arkusa.com >

  連絡先: 日本語版の誤訳等の指摘、質問、改良に関する提案、ご意見等は
  R.川岸 < kawagisi@yk.rim.or.jp > または JF プロジェクト
   宛にお願いします。

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/