xercesによるC++コンパイル

ユーザー設定ファイルのXMLをDOMで解析するために、にxerces3.1.1をUbuntuにソースからデフォルトの設定でインストールしたが、プログラムをそのままg++でコンパイルしても動かない。次の操作が必要だ。
(1)リンカ段階で、xerces-cライブラリをくっつける。すなわち、こんな感じ。g++ -o xmldom xmldom.cpp -lxerces-c
そうしないときらめくようなエラーの流れが発生する。
(2)/etc/ld.so.confに次の1行を加える。(デフォルトではそこにライブラリがインストールされている)
/usr/local/lib
(3)/sbin/ldconfigを実行しておく。
ただ、XMLのparse exceptionが発生する。と、思ったら、サンプルに使っているxmlファイルがおかしかったようだ。

ファイル転送モジュールのプロトコル

ロボット管理のクラウドサイトの原型はできて、ロボットとクラウドとのファイル転送を仲介するモジュールを作成している。すでに作成していたのは、httpプロトコルで、あくまでもウェッブサーバー上のファイルをロボットに取込むものだった。これでは、クラウド上に作成したスクリプトの取り組みには使えないので、ftpプロトコルでロボットにファイルを取込むモジュールに変更しているところ。
ロボットとサイト間通信のC++プログラムの基本はできているので、あとはFTPのプロトコルをそこに組み込むだけである。基本的に、ロボットはローカルネットワークのファイヤーウォールの内側にあることがメインであると想像されるから、ftpプロトコルはpassiveモードにしなければならない。
telnetを使って、このpassveモードの手続きをシミュレートしたので、記録のためにここに残しておく。あとはプログラムに組み込むだけである。
********** 端末1を開く ************
sample.jp(仮想サイト)からrobo.xxxx.jp(仮想サイト)への接続。$から始まる行は、クライアントが打ち込んだコマンド。
$ telnet sample.jp  21
Trying 133.12.158.102...
Connected to robo.xxxx.jp.
Escape character is '^]'.
220 (vsFTPd ....)
$ USER xxxxx
331 Please specify the password.
$ PASS yyyyy
230 Login successful.
$ TYPE I  (I:がバイナリモード、A:がアスキーモード)
200 Switching to Binary mode.
$ PASV
227 Entering Passive Mode (zzz,zzz,zzz,zzz,39,6).
(いま端末を動かしているクライアントが、NATなどのファイヤーウォールの内側にいると想定。普通は、このあとPORTコマンドで指示されたクライアントのポートに、サーバー側からつなぐのであるが、ファイヤーウォールのもとでは、それが正常にできないので、クライアントからつなぐ、サーバーのIPアドレスが、zzz,zzz,zzz,zzzとして、また、ポート番号が39×256+6=9990として指定されてきている。そこで、もう一つ端末を開いて、すなわち独立のコネクションを実行する。これもまた、クライアント側の端末であることに注意。)
******* 端末2のコネクション ********
telnet zzz,zzz,zzz,zzz 9990
Trying 133.12.158.102...
Connected to robo.xxxx.jp.
Escape character is '^]'.
(これは、このままなにもしない。)
******* 端末の1コネクションにもどる ********
$ CWD /home/xxxxx
(たとえば、上記コマンドで、フォルダを変更する:これ自体はPASV指定前でもできる。)
$ LIST
(こうすると、先ほどの端末2にフォルダのリストが出力される。このあたりがPASVモードの面白さと言うか、おどろきというか。)
******* 端末2のコネクション ********
drwxr-xr-x    3 1000     1000         4096 Jul 15 12:30 Desktop
drwxr-xr-x    3 1000     1000         4096 Dec 26  2012 Documents
drwxr-xr-x    2 1000     1000         4096 Jul 15 10:06 Downloads
drwxr-xr-x    2 1000     1000         4096 Dec 24  2012 Music
drwxr-xr-x    4 1000     1000         4096 Mar 02 06:13 Pictures
drwxrwxr-x   13 1000     1000         4096 Jun 21 22:29 Project
drwxr-xr-x    2 1000     1000         4096 Dec 24  2012 Public
(以上のように、実際のデータのやり取りは、端末2上で行われ、コマンドは、端末1でやりとりされる。)
というわけである。
※ ただ、ロボットがグローバルIPを持っていて、20番ポートでデータのやり取りができる場合でも、PASSIVEモードにしても良いかどうかは若干気がかりである。多分問題ないと思うが。問題があれば、おそらく20番ポートを指定してPORTコマンドを打ったときに、
500 Illegal PORT command.
と返した場合にだけ、PASSIVEが必要になるとすれば良いと思う。