2009-10-08

Doxygenでの名前空間について

C/C++のプログラミングではないが、
Doxygenでドキュメントを作成していて、
どうしても作成されないメンバ関数があった。

はて?

かなり悩んだ末に解決したので、
忘れないように書いておこう。

ヘッダーで宣言した通りに実装しろという事なんですが。
ヘッダーでは、void function (boost::shared_ptr a);
みたいに書いてても、実装でusing namespace boost;
として、void function (shared_ptr a) { }
なんて、実装してしまうと、実装側で書いたコメントは、
ドキュメント化されない。

実装側のファイルでも、名前空間を明示的に書いてやらなくてはならない。
というか、ヘッダーで宣言したのと同じ形でないと、Doxygenが実装部を見つける事ができない。
ということなのかな?!

それと、関数をオーバーロードしている場合には、EXTRACT_ALLをYESにしなくちゃいけないのかもしれない。
これに関しては、ハッキリわからないが、EXTRACT_ALLをYESにしてみたら、解決したので、あまり時間を掛けたくないので、解決としてしまった。

| | コメント (5) | トラックバック (0)

2009-08-19

grubブートフロッピーからの起動と復旧

なんでしょうか、先日Linuxをいじっていたら変なメッセージが . . . 。
で、この機械自体が物凄く古くて、始めは富士通のFMV DESKPOWER SII165でした。
CD-ROMとかCPUとか色々な物を色々な壊れたコンピュータから外して使っているうちに、自分でも構成すら判らなくなってしまっていました。
ただ、今回はHDDがリズミカルに、「カッチャンカッチャン」とHDDの音としては初めて聞く音を出していたので、明らかに壊れたと判りました。

で、Knoppixで起動してHDDを調べてみると、どうやら壊れたドライブでは、対したことをしていなかったようです。 プライマリマスターが壊れたのですが、随分前にWindowsをいれていたドライブらしいです。
その後、FAT32のままマウントして特に用途もなく使っていたようです。
という訳で、/(ルート)がプライマリのスレーブにありました。

復旧の構想としては、スレーブをマスターに付け換えて、mbrにブートローダーをインストールする。

まずは、grubブートフロッピーを作成します。
ftp://alpha.gnu.org/gnu/grub/ここで、grub-0.97-i386-pc.ext2fsをダウンロードして

dd if=grub-0.97-i386-pc.ext2fs of=/dev/fd0

でFDに書き込んだと思います。
このフロッピーから起動します。
このコンピュータのディストリビューションはVine4.2です。
vmlinuzという最新カーネルへのシンボリックリンクが作られています。

grub> kernel (hd0,0)/vlinuz ro root=/dev/hda2 [Enter]
grub> boot [Enter]

これで起動はできました。
実際にはLBAが効いていないためだと思いますが、8Gの壁でパーティションに問題が発生したので、スワップ領域を削除しておきました。

この状態で、/etc/lilo.confを編集します。
このコンピュータはずっと使っているので、liloのままでした。
面倒なのでこのままliloを使います。
今までroot=/dev/hdb2などとなっていた、変更部分を適宜環境に併せて編集しました。また、サスペンド用のデータ保存領域にスワップ領域が指定されているので、コメントアウトしました。
で、インストールします。

# lilo

エラーがでなくなればとりあえず大丈夫だと。

# reboot

ちゃんと起動しました。
LBAも効いているので、この状態であればfdiskで再度スワップ領域を作成できました。
なので、/etc/fstabや/etc/mtabなども編集しなおして、スワップ領域を使えるように変更。
やっと動くようになりました。

支離滅裂な文章なので、後日まとめ直します。

| | コメント (0) | トラックバック (0)

2009-05-30

テスト用更新Pingダミーサーバーを作成して検証。アクセスアップにつながるのか?

更新Pingとは
更新Pingとは、ブログなどを更新した際に、更新した事を通知する仕組みです。

ブログの設定で更新通知を送るサーバーを設定しておくと、記事の更新時にブログ名とブログのトップページのURLがサーバーに通知されます。

この情報を元に、受信サーバーは、RSSなどを取得したりして、更新情報を取得し、新着記事などとしてリンクを作成したりするのに使ったり、ブログ検索などにエントリーされます。
これによって、自分のブログへのリンクが増えたり、検索サイトでヒットする確率が増えるので、アクセス増加の可能性があります。

更新通知サービスが使えないブログ
楽天ブログでは、この更新Pingを送るサービスがありません。(と思います)
トラックバックPingなどのサービスを利用して、更新通知を送る事はできますが、更新Pingサーバーの設定はできないと思います。

このココログもベーシックだからか、自由な追加はできないみたいです。
あらかじめ用意された選択肢にチェックするようになっています。
ブロガーも設定方法がわかりませんでした。

そこで、自作しようというのが、そもそもの企みでした。

しかしながら、あまりいい加減に、現在稼動中のサービスに頻繁に更新Pingを送るのも迷惑ですし、実際にキチンと届いているのか。
また、送られるデータの形式は、本当に正しいのかを判断する事ができません。

更新Pingのしくみ
更新Pingは、RPC (Remote Procedure Call) という仕組みを使います。
リモートの手続きをコールします。
他のサーバーで動いているプログラムに、何らかのデータを渡して処理を行ってもらいます。

プログラミング言語のパスカル (Pascal) では、プロシージャは、値を返しませんが、RPCは戻値というか、レスポンスを返します。
これは、RPCがCGIなどのウェブアプリケーションで作られていて、HTTPアクセスに対する応答が必要だからではないかと思います。

更新Pingに更新を通知するには、XMLという形式のデータを、サーバーにPOSTします。
受信サーバーは、更新通知が送られてくると、エラーかどうかの情報と、そのメッセージ文字列をXML形式で戻してくれます。

しかし、実際には、エラーなし、「Thanks for the ping.」なんてメッセージが戻ってきても、本当に正常に送られているのかどうか、わかりません。
Pingサーバーにアクセスしている事、結果を受け取っている事は確認できますが、その先でブログ名が文字化けしてしまったり、URLが空文字列だったりという事があるかもしれません。

更新Pingを受け取ってみよう
そこで、正しく送られているであろう更新通知と、自作した更新通知を比較してみようと思い、受信した更新通知のXMLをファイル出力するCGIを作成しました。

そして、更新Ping送信機能のあるブログから、自作のPingサーバーに更新通知を送ります。
次に、自作のツールで更新通知を送ります。

その二つを比較してみました。
結果は、ほぼ同じでした。
<?xml version="1.0"?>
が、
<?xml version="1.0" encoding="UTF8"?>
だったりしましたが、調べてみると、encodingを省略した場合にはUTF-8として扱われるようなので、問題はなさそうです。

ということで、どうやら正常に送られていると考えて良さそうです。
ちょっとでも、アクセスアップにつながるといいかなと。

テスト用ダミーPingサーバーソース
#!/usr/bin/local/perl

# 受信データ読み込み
read (STDIN, $xml, $ENV{CONTENT_LENGTH});

# ファイルに出力
open OUT, ">> ping.xml";
print OUT $xml . "\n\n";
close OUT;

# 結果出力
print <<EOF
content-type: text/xml

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
  <member>
    <name>flerror</name>
    <value><boolean>0</boolean></value>
  </member>
  <member>
    <name>message</name>
    <value><string>Thanks for the ping.</string></value>
  </member>
</struct>
</value>
</param>
</params>
</methodResponse>
EOF

こんな感じで、エラー処理も何もしていないテストCGIを作りました。
危なっかしいので、テスト後は、すぐに削除しました。

ただ、普段は、MetaGatewayを使って書いているので、MetaGatewayの機能でPingを送る事ができるので、あまり使うことはなさそうですけど。

色々と勉強になりました。



| | コメント (0) | トラックバック (0)

2009-05-29

XMLRPC::Liteで更新Ping

更新Pingを手動で送信したかったのですが、なかなかどうして、うまくできていない様子です。

perlソースはeucなので、タイトル部分はJcode->new ('ブログタイトル')->utf8;とかして、UTF8にしているつもりです。
XMLRPC::Transport::HTTP::CGIを使って、簡単なサーバーCGIを作って、ログを取ってみたりすると、ブログタイトルはUTF8だし、URLもちゃんと取得できているような気がする。
で、http://ping.bloggers.jp/rpc/とかに送信してみると、Thanks for the pingとか、Thanks for your pingとかなんとか、メッセージが戻ってきてる。
かといって、自分でブラウザで見てても、新着とかに表示されていない。

はて。何が原因なんだろうか。もしかして、そもそも、何かの制約があって、pingを受け取っても表示しないとか、送り元のIPで許可があるとか?

色々と調べた結果、どうやらうまくいっているようす。

で、このブログから適当なサーバーのCGIに更新Pingを送信させて、受信したXMLをファイルにログとして書き出させてみます。

以下のような簡単なCGIを一時的に設置してテストしてみました。

read (STDIN, $xml, $ENV{CONTENT_LENGTH});
open OUT, ">> ping.xml";
print OUT $xml . "\n\n";
close OUT;

で、受信した更新Pingをファイル出力します。

結果は、以下を標準出力に出力しました。

content-type: text/xml

<?xml version="1.0"?>
<methodResponse><params><param><value><struct>
<member><name>flerror</name><value><boolean>0</boolean></value></member>
<member><name>message</name></value><string>Thanks  for the ping.</string></value></member>
</struct></value></param></params></methodResponse>

さしあたて、この記事の更新Pingが送られるようにしてみました。
受信側のCGIレスポンスは、何でもかんでもベタに成功時のXMLを出力するようにしてあります。

結果、自分で送信してる物と、同じXMLが送られている事がわかりました。

MetaGatewayからの結果

<?xml version='1.0'?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value><string>TagoSuckのプログラム日記 たごろぐ</string></value>
</param>
<param>
<value><string>http://tagosuck.cocolog-nifty.com/tagolog/</string></value>
</param>
</params>
</methodCall>

という事は、レスポンスのメッセージを見ても、成功しているという事だと思います。
表示されないのは、送信しているXMLの問題ではないのではないか?という結論にしようとおもいます。

あまり頻繁に送っているつもりはないのですが、スパム扱いになってフィルタリングされてしまっているか、RSS参照で記事の更新を伴っていないという事か。
ハッキリは分かりませんが、この辺りで納得する事にしました。

実際、効果の程はわかりませんが、時々使ってみようと思います。



| | コメント (0) | トラックバック (1)

2009-05-20

kakasiの辞書に単語を追加する

kakasiで分かち書きするのに、
kakasiの辞書では、単語がかなり細かいので、
もう少し長くしたいと思いました。

つまり、「楽天市場でお買い物」を "kakasi -w" すると
「楽天」、「市場」、「でお」、「買い物」になります。
これを「楽天市場」、「でお」、「買い物」にしたいと思いました。

辞書に独自の単語を登録すればよいのではないのか?
「楽天市場」という単語を登録して、「楽天」と「市場」にマッチしないようにしたい。

早速、Google先生に調べてもらいました。

やはり、より長い単語にマッチした場合には、そちらが優先されるという事がわかりました。

やり方はというと、どうやらmkkanwaというコマンドを利用するようです。
kakasiのソースからkakasidictを取り出し、
"mkkanwa kanwadict kakasidict"
とする事で、kanwadictが作成されるようです。

がっ!kanwadictは既に存在します。

試しに、kanwadictのバックアップを作っておいて、
実際に辞書を作成してみると、確かにできました。

更に、独自の辞書を追加するには、
"mkkanwa kanwadict kakasidict mydict"
のようにして、作成するようで、こちらもうまくいきました。

が、namazuからkakasiを使う場合には、今まで通りの辞書がいいと思い、
試行錯誤してみました。
"mkkanwa mydict.bin kakasidict mydict"
とか、して、
"echo 楽天市場でお買い物 | kakasi -w mydict.bin"
全然ダメです。

他にも色々やりました。
まったくダメでした。
ちょっと一服 . . . 。
気分転換はとても重要です。
物凄く単純な事に気がつきました。

「もしかすると、skkタイプのテキストファイルをそのまま指定すればよいのか?」

やってみました。
まず、適当な辞書を作成しました。
形式は、「ひらがな + 半角スペース + 漢字」です。
文字コードはEUC-JPで改行コードはLF(0xA)です。

File: rakutendict

らくてんいちば 楽天市場


"echo 楽天市場でお買い物 | kakasi -w rakutendict"

. . . あっさりできました。

バイナリにする必要はなかったようです。
辞書ファイルの指定は、追加辞書のファイル名だけでよいようです。

ひらがなへの変換も試してみました。
"echo 楽天市場でお買い物 | kakasi -JH"
> "らくてんしじょうでおかいもの"

"echo 楽天市場でお買い物 | kakasi -JH rakutendict"
> "らくてんいちばでおかいもの"




| | コメント (0) | トラックバック (0)

«楽天APIで自動アフィリエイトリンク作成