« December 2004 | メイン | February 2005 »

January 29, 2005

シーングラフについてメモ

GNU 3DKit
OpenSceneGraph
OpenSG
Open Inventor
NVSG
LAMP
Irrlicht

投稿者 Takenori : 05:45 PM | コメント (0) | トラックバック

こまごまとした事

プロジェクトプロパティに基づき、グリッドのレイヤー数とサウンドバッファ数を決定するようにした。
グリッドの横の数をコマンド数+100になるようにした。
変更付加セルでクリックされた場合、その前に有効になっていた位置でメニューが表示されていたのを、表示されないようにした。
シーケンサーが閉じようとされた時、実際には閉じずに、非表示にするだけにした。
メインフォームのボタンからシーケンサーを表示できるようにした。
メインフォームも現在のシーンを保持していたので、そのプロパティを削除。
そのプロパティを参照していたDocModuleのメソッドも削除。
使われていないソースファイルがあったので削除。
シーケンサーが表示される時、ドキュメント(DocModule)に基づきシーンタブとグリッドの左端の項目が設定されるようにした。

これで、プロジェクト生成/保存部分までにやることは、少し大変なコマンド属性のメモリ上での保存とフォームへの反映のみになった。

ちょっとメモ。
コマンド属性を生成する時、レイヤー番号などもきちんと設定すること。

こういった細々とした事はここに書かずに、こまめにコミットしてそこにコメントとして書いたほうが良いかも。
それと、早めにWebSVNの設定をしてブラウザでコメントなどを見やすくしたほうが良さそう。

投稿者 Takenori : 03:31 AM | コメント (0) | トラックバック

シーン周りを整備

シーンの追加/削除/名前の変更が行えるようにした。
Enterキーでメニューを表示できるようにしようとしたら、メニュー項目決定のEnterで再びメニューが表示されてしまい、かなり使いづらい。なんか、前も同じ事やったような・・・。で、諦めた気がする。
でも、今回はいい方法を思い付いた。単に、Enterではなくスペースキーでメニューを表示させると言うだけのことだが。
で、そのように実装。
いい感じ。

直近でやることをメモ。
プロジェクトプロパティに基づき、レイヤー数を変更する。
コマンド属性のメモリ上での保存とフォームへの反映。
現在固定になっているグリッドの横の数をコマンド数に応じて追加する。
プロジェクトの生成/保存部分を作る。

投稿者 Takenori : 03:04 AM | コメント (0) | トラックバック

EAccessViolation例外

起動時にEAccessViolation例外が突然発生するようになった。
メンバを直接アクセスしていたのをプロパティ経由にして、参照を使うようにしたのか、ダイアログを追加したぐらいしかやっていないはず。
なんだ?
バージョン管理しているので、戻そうかと思ったけど、また変更を加えるのは面倒なのでとりあえず、ダイアログを自動生成しないようにしてみる。
変わらず例外発生。
プロパティ経由を、メンバ直接アクセスに戻す。
例外が発生しなくなった。
プロパティ経由とメンバ直接アクセスは何か違うのだろうか?
読み出しの場合、プロパティは単にメソッドを呼び出し、その結果を使っていると思っていたのだが・・・
その読み出し用メソッドは単純に参照を返しているだけ。
よくわからないなぁ。
デバッガで追うと、初期化が完了していない値が返ってきているか、変なアドレスを参照しているみたい。
よくわからんな。

投稿者 Takenori : 01:16 AM | コメント (0) | トラックバック

January 28, 2005

WinInetの接続周りの見直し

WinInetのAPIを調べたら、キャッシュが有効になっていた。
キャッシュが効くと困るので、修正。
あと、接続が常に直接接続となっていたので、レジストリの設定を参照するようにした。

投稿者 Takenori : 03:10 AM | コメント (0) | トラックバック

コマンド属性生成部完成

各コマンド属性の生成部分を一通り作成
シーンの追加、削除、プロパティのメニューだけ作成
シーンの追加を実装するためにシーン周りを少し見直し中。
左クリックのみでメニューを表示していたのを、Ctrl+左クリックで表示するように変更。

投稿者 Takenori : 02:08 AM | コメント (0) | トラックバック

January 27, 2005

公開開始

そこそこまともに動くようになったと思うので、公開を開始した。

公開前に変更&追加したこと
一部エラーメッセージの変更。
アクセス時にエラーが発生した場合、エラーログを出力するようにした。
設定ウィンドウの表示位置を画面中央になるようにした。

投稿者 Takenori : 10:39 PM | コメント (0) | トラックバック

XML データバインドウィザード

少し前に、XMLを扱うライブラリは何を使おうかと悩んでいたが、C++Builderのものを使うことにした。
そして、ヘルプを見てみるとXML データバインドウィザードなるものがある。
どうやらこれは、XML の構造を表したクラスを作ってくれる機能のようだ。
で、使おうとしたのだが・・・ ない!
ないぞそんなの。
C++Builderのページを見てみるとEnterpriseでのみ使えるようだ。
持っているのはProfessional。
使えないのか。
で、仕方なくTXMLDocumentを直接使おうとコンポーネントのInternetタブを見るが・・・ない! あれ?
コンポーネントもないのか?
XMLDoc.hpp をインクルードし、自分でnewすると使えるが、newするときにファイル名を指定しないといけない。
で、ファイルがないとエラー。
新しく作るときにはどうするのだろう?
面倒なのでMSXMLを少し調べてみる。
やはり、OSとIEのバージョン依存だな。
となると、やっぱりXerces C++か?
Xerces C++はApacheライセンスだったな。
日本語訳を読むことにする。

どうやら、Xerces C++はライセンスのテキストファイルを添付し、著作権表示を入れれば使用できるようだ。

投稿者 Takenori : 02:33 AM | コメント (0) | トラックバック

January 26, 2005

新着日記もチェック

新着日記もチェックにも対応した。

インストール後、初回起動時は常に新着日記があると表示。
Alert Windowで「mixiを開く」もしくは「Close」がクリックされたら、見たとみなす。
仕様はそんなところ。

投稿者 Takenori : 10:53 PM | コメント (0) | トラックバック

コマンドパラメタ用フレーム作成一通り終了

コマンドパラメタ用フレーム作成が一通り終わった。
改良の余地のあるものもあるが、とりあえずは良しとしよう。
後、シーンタブの切り替えにも対応した。

画像、音、動画はプロジェクトにいったん追加して、そこから選ぶようにした方が良さそうだな。(とりあえず、メディアパレットと呼ぼう)
なら、プロジェクト周りを作る必要があるな。

他に最低限必要なものは、
・シーンの追加と削除
・プロジェクトプロパティの設定
・プロジェクトの新規作成/保存
・スクリプトの生成
・メディアパレット
これだけあれば、とりあえず作ることは可能なはず。
たぶん、まだまだ使いにくいだろうけど。

次は、プロジェクトの新規作成/保存だな。

そういえば、エレメントの生成も途中までしか作ってなかった。

投稿者 Takenori : 01:14 AM | コメント (0) | トラックバック

January 25, 2005

ひたすらコマンドパラメタ用フレーム作成

imageタグはパラメタが多いのですごいことになってしまった。
グループ化したり、有効/無効で表示/非表示にしたりして、もう少し見やすくしたほうがよさそう。
タブとかにしたほうがいいかなぁ・・・

でも、2時間で6個ぐらい。
あんまり進まないなぁと思ったけど、imageタグに1時間以上とられてる。
パラメタがそんなに多くなければ1時間で5個ぐらい?
まずまずかな?

投稿者 Takenori : 05:25 AM | コメント (0) | トラックバック

機能追加&変更

変更項目
接続時のエラーメッセージを詳細に表示するように変更。
Alertウィンドウが自動的に消えないように変更。
ログイン時のレスポンスのリダイレクトURLを認識し、そのURLを読み込むように変更。
その時、boost::regexの正規表現でまたハマる。
<と>は別にエスケープしなくても良いようだ。と言うか、しないようにしないとヒットしない?
不必要なエスケープを減らしたらヒットするようになった。
チェックサイクルの時間をインターバルに変更。(以前は定期的に実行)

追加機能
チェックサイクルを1分、2分、3分、5分、10分、15分、20分、30分、1時間の中から選択できるように機能追加。

ソース上の変更
設定ウィンドウの各コントロールの設定を、前は呼び出し元が行っていたが、設定ウィンドウが表示される時に、自分で取得、設定を行うように変更。また、同時に設定ウィンドウのプロパティもなくす。

投稿者 Takenori : 01:59 AM | コメント (0) | トラックバック

January 23, 2005

コマンド表示部を追加

ウィンドウ上部にコマンドを表示するようにした。
今までは表示していなかったので、各フレームにどのようなコマンドが設定されているか全然わからなかった。
このことに限らず、実際に使用する時にいろいろと足りないと思うことがありそうだ。

投稿者 Takenori : 03:59 AM | コメント (0) | トラックバック

Frameとのデータの受け渡し

パラメータを設定する箇所はFrameを使用しているが、そのFrameとのデータの受け渡しに初めは多重継承によって実現しようと考えていた。
そのFrameを切り替える元となるフォームは、各Frameを保持している。
そして、そのFrameのメソッドを介してデータを渡すようにしようとしていた。
そのため、単純に多重継承したのでは、そのインターフェイスとなるクラスのポインタも保持しなければならなくなる。
それを回避するために、Frame の派生クラスではなく、その親となるクラスで多重継承することにした。
次のような感じ。
class ITagProp
class TPropFrame : public TFrame, public ITagProp
class TUserFrame : TPropFrame
こうすれば、TPropFrame を保持しておくだけで良い。
これでメイクも通りうまくいったかと思ったが、Frameのレイアウトなどを変更しようとしたら問題が発生した。
プロパティが取得できないとかなんとかエラーが出てしまった。
それでも、そのまま無視を選択したらフォームが表示されたのだが、メイクして動かそうとしたらエクセプション。
どうやら、この方法ではダメのようだ。
そこで、Tagプロパティを使って受け渡しをしようと思ったが、FrameにはOnShowなどがないので、Tagプロパティに値を設定しても、それを拾うタイミングがわからない。
良いメソッドがないかヘルプのTFrameを見る。
Dispatch!
そうだ、普通にメッセージでやり取りすればいい。
Frameの切り替えを行う際、Dispatchをコールすることにした。
そして、独自のメッセージを作り、各Frameで受ける。
この方法でうまくいくかどうか実装してみた。
いい感じだ。
初めからこうするべきだったな。
なお、実際のDispatch 部分は、次のようにマクロで定義するようにした。

void __fastcall SetElement( TElementMessage &mes );
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SET_ELEMENT,TElementMessage, SetElement);
END_MESSAGE_MAP(TFrame);

投稿者 Takenori : 02:30 AM | コメント (0) | トラックバック

January 21, 2005

とりあえず完成

実装した機能は以下の通り
新着メッセージ、新着コメントを定期的に確認。
確認サイクルは固定。
アラートウィンドウは一定期間で非表示に。
非表示になるまで時間は固定。
ログイン用メールアドレス、パスワードの設定。
タスクトレイへのアイコンの登録。
イマイチなアイコン。

要求システムは次のとおりのはず。
Internet Explorer 5.5 以降
Windows 2000 もしくはWindows Me 以降
とりあえず、XP と 2000 では動作確認している。

その他制限事項
IEを普段使っている場合、自動ログインが切れてしまう。IEは使わずにFirefox使ったほうが良いと思われ。


他に対応したいこと
インストーラー
マルチユーザー
新着日記、新着コミュニティー書き込み、新着レビューの確認。
確認サイクルの指定。
アラートウィンドウを自動的に非表示するかどうか。また、その時間。
自動的に非表示された場合、タスクバーのアイコンで未チェックかどうか明示。
アイコンがイマイチなので、何とかしたい。
確認の一時停止。(ユーザーの操作がない場合など)
メッセージやコメントへのダイレクトリンクをアラートウィンドウに表示する。
それぐらいだったかな。

投稿者 Takenori : 12:00 AM | コメント (0) | トラックバック

January 20, 2005

C++でWinINet

perlの場合、かなりお気楽に使えるが、C/C++で使うとなると、少し事情が違った。
まず、perlの場合読み込みバッファは自動的に確保してくれるので、気にしなくても良かったが、Cの場合は明示的に確保しないといけない。
で、HttpQueryInfo( hHttpRequest, HTTP_QUERY_CONTENT_LENGTH, BufSizeText, &BufSizeTextSize, NULL); とコールするが、サイズが返ってこない。
仕方ないので、512KBぐらい確保して読み込み処理をするが、1回のInternetReadFile コールではすべてのデータを取得しきれない時があるようだ。
そこで、次のようにして読み込むこととした。

read_buff = new char[htmlSize];
memset( read_buff, 0, htmlSize );
DWORD curPos = 0, ReadSizeAll = 0;
int bootstrap = 0;
while(1)
{
    BOOL ret;
    ret = InternetReadFile( hHttpRequest, &read_buff[curPos], (htmlSize-ReadSizeAll), &ReadSize);
    if(ret && (ReadSize == 0)) break;
    curPos += ReadSize;
    ReadSizeAll += ReadSize;
    bootstrap++;
    if( bootstrap > TRY_MAX) break;
}

curPos と ReadSizeAll は同じだから両方は必要ないかも。
他はperlの時とだいたい同じでいけた。
ラッパークラスとかあると便利かも。

投稿者 Takenori : 07:11 PM | コメント (0) | トラックバック

バッファからの行読み込み

自作の関数ではなく、STLのstrstreamとgetlineを使えば、簡単に実現できることが判明。
次のような感じ。

char *read_buff = new char[html_size];
unsigned long read_size_all;
// read_buffへWinINetを使って読み込み処理
std::istrstream read_stream( read_buff, read_size_all );
while( std::getline( read_stream, line ) )
{// 何か処理
}

std::istrstreamではなく、std::strstreamにしたらなぜかうまくいかなかった。(これでしばらく悩んだ)
std::ios::in を指定すれば同じだと思っていたのだが、違うのだろうか?
まあ、出来たからいいか。

投稿者 Takenori : 07:02 PM | コメント (0) | トラックバック

January 18, 2005

クリエティブ・コモンズ

http://internet.impress.co.jp/im/pdf/cc.pdf
http://hotwired.goo.ne.jp/matrix/0311/

すばらしい。
著作権などのライセンスにかかわることを自動化しようという試み。
これから積極的に取り入れていきたいと思う。

投稿者 Takenori : 03:45 PM | コメント (0) | トラックバック

January 17, 2005

perlでゴミ箱へ

いつもはperlで削除する場合、unlink()で消してしまうが、いきなり消すのではなく、ゴミ箱へ一度入れたいと思った。
で、SHFileOperationが使えたらゴミ箱へ移動出来るはず。
ActiveStateで検索すると、Win32-ShellExtと言うちょうどいいのがあった。
ppm install Win32-ShellExt とやるが、インストールできない。
上述のページを見るとPlatforms: Hpux-ia64 とある。
これってIA64用ってこと?
うーん、他にないのかなぁ。

投稿者 Takenori : 11:51 PM | コメント (0) | トラックバック

January 15, 2005

perl でWin32 Inet

次のようにすれば、perlでWin32 Inetを使いmixiからログイン後のHTMLデータを取得できる。

use Win32::Internet;
$email = 'your_addr@yourhost.ne.jp';
$password = 'your_password';
$next_url = '/home.pl';
$target_url = 'mixi.jp';
$target_object = 'login.pl';
$post_req = 'email=%EMAIL%&password=%PASSWORD%&next_url=%NEXT_URL%';
$success_login = 0;
$INET = new Win32::Internet();    # WinInetのインスタンスを得る
if( defined( $INET ) ) {
    local $HTTP;
    $INET->HTTP( $HTTP, $target_url );
    if( defined( $HTTP ) ) {
        $send_command = $post_req;
        $send_command =~ s/%EMAIL%/$email/g;
        $send_command =~ s/%PASSWORD%/$password/g;
        $send_command =~ s/%NEXT_URL%/$next_url/g;
        {
            my $REQ;
            my $params;
            $params{"path"} = $target_object."?".$send_command;
            $params{"flags"} = INTERNET_FLAG_RELOAD;
            $params{"method"} = "POST";
            $HTTP->OpenRequest( $REQ, \%params );
            if( defined( $REQ ) ) {
                $REQ->SendRequest( $send_command )
                $file = $REQ->ReadEntireFile();
                $REQ->Close();
                @read_data = split( /\n/, $file );
                foreach( @read_data ) {
                    chomp;
                    if( /url=\/check.pl\?n=\%2Fhome.pl/ ) {
                        $success_login = 1;
                    }
                }
            }
        }
        if( $success_login ) {
            my $REQ;
            my $params;
            $params{"path"} = 'check.pl?n=\%2Fhome.pl';
            $params{"flags"} = INTERNET_FLAG_RELOAD;
            $params{"method"} = "GET";
            $HTTP->OpenRequest( $REQ, \%params );
            if( defined( $REQ ) ) {
                $REQ->SendRequest();
                $file = $REQ->ReadEntireFile();
                $REQ->Close();
                @read_data = split( /\n/, $file );
                foreach( @read_data ) {
                    chomp;
                    print $_."\n";
                }
            }
        }
    }
    $HTTP->Close();
}
$INET->Close();

perlでWin32 Inetを使えばプロトタイプを書いたり、そのまま使ったりするのに意外と便利。
と言うか、他のモジュールでHTML取得するスクリプト書いたことないんだけど。
ま、Winなら問題ないし、いいでしょ。

投稿者 Takenori : 10:13 PM | コメント (0) | トラックバック

boost::regexで悩む

L"\<a href=view_diary\.pl\?id=([0-9]+)\>"
と書いた正規表現が通らない。
あるはずなのにヒットしない。
perlでやるとヒットする。
なぜだ?としばらく悩んで気づいた。
L"\\<a href=view_diary\\.pl\\?id=([0-9]+)\\>"
と\マーク自体をエスケープしないといけないことを。
でも、ここが出来たら後は細かいところと全体の結合だな。
HTTPでHTMLを取得するところは、Win32 Inetを使ってperlでプロトタイプを書き、動作することを確認しているので、これはC++に書き換えなければならないが。

投稿者 Takenori : 09:57 PM | コメント (0) | トラックバック

カウンターの分散

全ページのカウンターが共通だとわかりづらいので、Topページとブログトップページ、その他のブログで分けることにした。
どこのアクセスが多いだろうか。

投稿者 Takenori : 09:21 PM | コメント (0) | トラックバック

January 14, 2005

libiconvを使おうとしたが

まず、libiconvをソースからmakeしようとしたが、うまくいかなかった。
で、バイナリのやつを使おうとしたけど、よくわからなかった。
で、いろいろと検索するとKaoriYa.netにiconv.dllをVCでビルドした物があったので、これを使うことにした。
そして、使ってみるが、文字列などによってうまくいくときといかない時がある。
iconv.cを見ると、その辺りはなんか面倒なことをしている。
この辺りでかなりiconvを使う気が減衰。
NKF32.DLLを使ってSHIFT_JISにした後、MultiByteToWideCharでUnicode(UTF-16)に変換しようかと思った。
だが、MultiByteToWideCharを使って、いきなりEUC-JPからUnicodeへ変換できない物かと考えて調べてみた。
調べるとEUC-JPのコードページは、51932 とある。キャラクタセットの認識および、Windowsコードページ一覧を参照のこと。
つまり、MultiByteToWideCharでコードページ 51932 を使えばうまくいくかと思ったが、変換できず。
文字コード掲示板過去ログにもそのことが書いてあった。
ConvertINetMultiByteToUnicodeを使うしかない様子。
で、ConvertINetMultiByteToUnicodeを使おうとするが、MSDNに必要なヘッダーファイルの記述がない。
いろいろ調べてMLANG.IDLから、MLang.h だろうと思い、MLang.hをinclude。
しかし、リンク時にエラーになる。
DLLはmlang.dllだと記述されているので、検索し発見。
mlang.dll からC++Builder用のインポートライブラリを作る。
implib mlang.lib mlang.dll
と、コマンドラインで入力すれば、mlang.libが出来るので、これをプロジェクトに追加。
メイクが通るようになった。
初めはうまく動かなかったが、キチンとリファレンス読んで書いたらうまく動くようになった。
その部分のコードは次のような感じ。
なお、エラー処理は省いている。

#define CP_EUCJP 51932
FILE *ifp, *ofp;
ifp = fopen( "test.html", "rb" );
ofp = fopen( "unicode.html", "wb" );
if( ifp && ofp ) {
    char inbuf[1024*64];
    wchar_t *outbuf = (wchar_t*)malloc(1024*64);
    wchar_t *out_base = outbuf;
    int out_cnt;
    DWORD dwMode = 0;
    while( fgets( inbuf, 1024*64, ifp ) != NULL )
    {
        out_cnt = 1024*32;
        outbuf = out_base;
        ConvertINetMultiByteToUnicode( &dwMode, CP_EUCJP, inbuf, NULL, outbuf, &out_cnt );
        fwrite( out_base, 1, out_cnt*2, ofp );
    }
    fclose(ifp);
    fclose(ofp);
}

今回はファイルからなのでfgetsで読んでいるけど、実際はInternetReadFileで読むから行読み込みを行う物が必要だな。
確か、昔作った記憶があるけど・・・探さないと。

ConvertINetMultiByteToUnicode を使用するには、Internet Explorer 5.5 以降、Windows 95、Windows NT 4.0以降が必要。

投稿者 Takenori : 04:27 PM | コメント (0) | トラックバック

文字コードの変換

mixiからHTMLを取得した後、文字コードの変換が必要だ。
しかも、面倒なことにmixiはEUC-JPで返してくる。
それで、まず思い付いたのがNKFだ。
これのWin32ライブラリ版がないか探したところNKF32.DLLがあった。
でも、UTF-8対応版ではない。

もう一つはlibiconvだ。
GNU Win32から取得し、試そうとするがlibintlも必要と言われたのでDL。
自動認識がないのが難点だな。

これは強引にEUC-JPでやるか? と思ったけど、boost::regexを使おうと思ったらUnicodeにする必要があるようだ。
文字コード認識の良さそうなライブラリを探すが、どれが良いかイマイチよくわからない。と言うか、知らない。
で、HTMLのcharsetを頼りに認識を行うのであれば、正規表現で簡単に取得できる。
これで行こうかと思ったが、面倒なのでEUC-JP決め打ちでいいかと思った。
このツールは、mixiに変更が合った場合認識できなくなる可能性が高い。
なら、文字コードは決め打ちでも問題ないと考えたからだ。

で、結局iconvでEUC-JP からUTF-16LEへ変換することにした。

投稿者 Takenori : 03:55 PM | コメント (0) | トラックバック

ブラウザでURLを開く

HINSTANCE hInstShell = ShellExecute( hWnd, "open", "http://taregeturl.com/", NULL, NULL, SW_SHOWDEFAULT );
とやれば、標準ブラウザで http://taregeturl.com/ が開かれる。
引数の意味などはShellExecuteを参照のこと。

投稿者 Takenori : 02:39 PM | コメント (0) | トラックバック

Application Dataフォルダの取得

SHGetSpecialFolderPathで、ユーザーごとのApplication Dataフォルダ ( CSIDL_LOCAL_APPDATA ) を取得するためには、Internet Explorer 5、Windows 2000 もしくはWindows Me 以上が必要。

投稿者 Takenori : 02:34 PM | コメント (0) | トラックバック

enscriptを使ってみた

WebSVNでenscriptをC++からHTMLへの変換に使っていたので、cygwinを入れて試してみた。
cygwinで何もせずにインストールすると、enscriptはインストールされない様子。
チェックされているかどうか確認する必要がある。
で、試してみたところPREタグで出力された。
期待したものと違った。
CSharpToHTMLの方が良いかも。
変換後ブログに貼るために変換するから。
色分けなしで特定の文字だけ変換するならperlとかで作った方がいいかも。

s/\t/\&nbsp\;\&nbsp\;\&nbsp\;\&nbsp\;/g;
s/ /\&nbsp\;/g;
s/\</\&lt\;/g;
s/\>/\&gt\;/g;
s/\&/\&amp\;/g;

って感じかな?

投稿者 Takenori : 12:44 AM | コメント (0) | トラックバック

January 13, 2005

cygwinで各ドライブへアクセス

/cygdrive/drive/
driveは任意ドライブ。

投稿者 Takenori : 07:17 PM | コメント (0) | トラックバック

ImageMagickを使う

以下は、VC 2003で確認した。
まずはVCを起動し、新規プロジェクトでコンソールアプリのプロジェクトを作った。
そして、インクルードディレクトリに ImageMagick-6.1.8/Magick++/lib とImageMagick-6.1.8 を追加。
ライブラリパスを設定に追加し、ライブラリをフルパスで指定しなくても良いようにした。
ライブラリはいっぱいあって面倒なので、次のように入力して一覧が記述されたテキストファイルを作った。
perl -e "foreach( glob(\"*.lib\") ) { if( /DB/ ) { print $_.\" \"; } }" > DB.txt
Release版も同様に次のようにして一覧テキストを作った。
perl -e "foreach( glob(\"*.lib\") ) { if( /RL/ ) { print $_.\" \"; } }" > RL.txt
で、出力されたテキストファイルからプロジェクトの追加ライブラリにコピペ。
Socket関連も使うようなので、Ws2_32.lib も追加ライブラリに追加。
LIBCMTD を無視するライブラリに追加。
以上で、Magick++を使える環境が整ったはず。
サンプルにあった物とほぼ同じ以下のようなソースをビルド。
#include "stdafx.h"
#include <Magick++.h>
#include <iostream>
using namespace std;
using namespace Magick;

int _tmain(int argc, _TCHAR* argv[])
{
 // Construct the image object. Seperating image construction from the
 // the read operation ensures that a failure to read the image file
 // doesn't render the image object useless.
 Image image;

 try {
  // Read a file into image object
  image.read( "test.jpg" );

  // Crop the image to specified size (width, height, xOffset, yOffset)
  image.crop( Geometry(100,100, 100, 100) );

  // Write the image to a file
  image.write( "x.jpg" );
 }
 catch( Exception &error_ )
 {
  cout << "Caught exception: " << error_.what() << endl;
  return 1;
 }
 return 0;
}
で、実行したらException。
調べると、どうやら ImageMagick-6.1.8/config/magic.xml が実行ファイルと同じディレクトリに必要なようだ。
magic.xml をコピーし、実行したらうまくいった。
以上でVCからはImageMagickが使えるようになった。
ちなみに、上記コードの実行ファイルのサイズは3.6MB。やはりでかいな。

投稿者 Takenori : 05:16 PM | コメント (0) | トラックバック

ImageMagickライブラリのビルド

ImageMagickを使えば、かなり多くのフォーマットに対応できるし、C++での使い方もPerlMagickのように簡単に見える。
また、ライセンスもApache-style licenseで、たぶんオープンもプロプラエタリにも使えるとある。
たぶんと書いてあるのは、リンクするライブラリが多いためだろう。
以上のようなことから、ImageMagickを使いたいと思い、ビルドしてみることにした。
バイナリのインストーラーもあるが、いろいろとインストールされてしまうので、必要な物のみスタティックなライブラリとしてビルドし、必要に応じてリンクするような形態にしたいため、ソースからビルドすることにした。

Install-windows.txtを見ながら進めた。
使用したのは、Windows Source 6.1.8-5で、VCは2003。
まずは、ImageMagick-6.1.8/VisualMagick/configure にあるVCのプロジェクトを開き、Releaseビルドでconfigure.exeをビルド。
出来たconfigure.exeをダブルクリックして起動するとダイアログが開く。
"次へ" をクリックした後、Build type setupでStatic Multi-threaded runtimesを選択。
Use X11 stubs to... のチェックははずした。
Build optionsはGenerate Visual Studio 7 formatにだけチェックが入った状態にし"次へ"をクリック。
次のパスの設定などはそのままにし、完了すると、VisualStaticMT.sln がImageMagick-6.1.8/VisualMagick に出来る。他にも各ライブラリのプロジェクトファイルが生成されたようだ。
VisualStaticMT.sln でVCを起動し、ビルド。
しばらく待てばImageMagick-6.1.8/VisualMagick/libにわんさかライブラリが出来る。
また、ImageMagick-6.1.8/VisualMagick/binに実行ファイルがいろいろと出来る。
Debug版、Release版はそれぞれ、途中のDBとRLの文字が異なるライブラリが生成される。
以上で必要なライブラリは生成されたはず。
次は、簡単なサンプルを作れるかどうか確認する。

投稿者 Takenori : 04:37 PM | コメント (0) | トラックバック

January 12, 2005

ソフトアンテナ

ソフトアンテナ
よくどこか忘れてしまうのでここに書いておく。

投稿者 Takenori : 03:49 AM | コメント (0) | トラックバック

XMLも

RDBではなく、値と変数が1対1で対応するデータも保存したいので、XMLの利用を検討する。
初めに思い付いたのは。
Xerces C++libxml
libxmlはCなのかー。
Xerces C++はそれなりにでかい。
今回の用途に近いxmliniと言うのがあったが、COMなのが難点。LGPLなのでソースをいじってもいいが、面倒くさい。
後、tinyxmlも軽量なようだが、資料探したりするのが面倒臭いなぁ。
やはり、手軽にMSXMLとかか?
気持ち的には、Xerces C++を使いたいがDLLは2.3MBか。
スタティックな方は2.9MBだが、実際にリンクするとだいぶ減ってくれるだろうか? 使う機能はそう多くないので、そうなって欲しいが・・・
とりあえず、MSXMLとXerces C++を試してみよう。

投稿者 Takenori : 03:29 AM | コメント (0) | トラックバック

データはSQLiteで

データ保存はSQLiteでやろうと思い、DL。
quick startのコードを見てみるが、コールバック!?
API Referenceを見てみると、1行ずつ取得する方法も出来そうだが、どうもピンとこない。
で、SQLitePlusをDL。
ソースコードを見てみる。
ああ、なるほど。
そういうことか。
やはり、ソースコードを見たほうが理解が早い。

で、肝心のデータ保存方法だが、SQLite 3 からBLOBがきちんとサポートされたので、やはりBLOBかな。
一度スクリプトにして保存してもいいけど、パーサーが面倒臭い。
BLOBでも、ある程度クラスからの変換が必要だが、明確な変換が必要なのはstringぐらいだろう。
クラスファクトリとローダーを作ればいい感じになるかな?
読み込みと書き出しは各クラスに任せて。
少しクラス図を書いてみよう。

投稿者 Takenori : 12:55 AM | コメント (0) | トラックバック

January 10, 2005

WebSVNのセットアップ

Memo/WebSVNを元に設定を行ったが、より詳細な設定を下記にメモ。
なお、サーバーはLinux (Fedora Core 3)を使用している。

WebSVNドキュメントから適切なtar.gzをDL。
適当なディレクトリに展開した後、include/distconfig.inc を include/config.inc にリネーム。
include/config.inc を以下のように編集する。

まず、--- PLATFORM CONFIGURATION --- で、各種コマンド パスの設定を行う。
例えば、以下のような感じ。
$config->setSVNCommandPath("/usr/bin"); // svnlook
$config->setDiffPath("/usr/bin"); // diff
$config->setEnscriptPath("/usr/bin"); // enscript
$config->setSedPath("/bin"); // sed
$config->setTarPath("/bin"); // tar
$config->setGZipPath("/bin"); // gzip

コマンド(/usr/bin/svnlookなど) ではないので注意。
わからない場合は、"which コマンド" で調べる。

次は、 --- REPOSITORY SETUP ---
Subversionで管理しているリポジトリを追加する。
$config->addRepository("myrep", "/home/svn/myrep");

次は、 --- LANGUAGE SETUP ---
include("languages/japanese-utf8.inc"); // (FedoraCore/Max OS X/BeOS)
を有効にし、次のようにエンコーディングを設定する。
$config->setInputEncoding("UTF-8");
$config->setOutputEncoding("UTF-8");

次は、 --- COLOURISATION ---
$config->useEnscript(); を有効にする。

以上で表示できるようになるが、ログメッセージが文字化けする。
対策を探したところ、以下のようにすると良いようだ。
まず、"/usr/local/WebSVN/bin/"というディレクトリを作る。

/usr/local/WebSVN/bin/svnlook というシェルスクリプトを書く。
内容は次の通り。
--------------------------------------------
#! /bin/bash
export LANG=japanese
/usr/bin/svnlook "$@"
--------------------------------------------

svn へのシンボリックリンクを次のようにして作る。
ln -s /usr/bin/svn /usr/local/WebSVN/bin/svn

include/config.inc のSVNCommandPath の設定を次のように変更する。
$config->setSVNCommandPath("/usr/local/WebSVN/bin");

以上でログメッセージの文字化けは回避できる。
が、ソースコード中のShift_JISなどの日本語は文字化けしてしまう。
上述のsvn をシンボリックリンクではなく、以下のようなシェルスクリプトにすることで回避できるが、バイナリファイルが壊れてしまうと言う問題が発生する。
--------------------------------------------
#! /bin/bash
/usr/bin/svn "$@" | nkf -w
--------------------------------------------

これは、ソースに手を加えなければ回避できなさそうだったので、コードを追ったところ、include/svnlook.inc の listFileContentsに修正を加えることで回避できた。
修正個所は次の通り
if( $config->useEnscript ) の中
$cmd = quoteCommand( ... とある次の行に
"/usr/bin/nkf -w | ".
を追加する。
なお、nkf のパスは環境に合わせて設定する必要がある。

configclass.inc にnkfの設定を追加して、有効なら上述の行をコマンドに追加するようにすれば、汎用的になるだろうけど、とりあえずこのままでよしとした。
今度気力がある時に、本体の方へマージしてくれーって送ろうかな。
--------------------------------------------
以上の設定で使えるようになるのだが、SELinuxを有効にすると使えなくなる。
まあ、コマンドを呼び出したり、テンポラリファイルを作ったりといろいろやっているので、専用のポリシーを作らないと厳しそうだ。
これは、今度頑張ることにする。

投稿者 Takenori : 02:10 PM | コメント (0) | トラックバック

January 09, 2005

シェルスクリプトでも・・・

Subverionでリポジトリを作る作業が面倒なのでシェルスクリプトを少し調べてみた。
bashで始めるシェルスクリプト基礎の基礎
DOSのバッチとPerlの中間ぐらいって感じか。
なんとなく書けば出来そう。

Subverionでリポジトリを作るのは、/home/svn にDAV用のポリシーが設定あれば、次のような感じかな。(new_repは引数)

svnadmin create --fs-type=fsfs /home/svn/new_rep
chown -R apache:apache /home/svn/new_rep
rstorecon -R /home/svn/new_rep

/etc/httpd/conf.d/subversion.cnf に公開用なら次のように
<Location /svn/new_rep>
 DAV svn
 SVNPath /home/svn/new_rep
 <LimitExcept GET PROPFIND OPTION REPORT>
  SSLRequireSSL
  AuthType Basic
  AuthName "Please enter password."
  AuthUserFile /path/to/passwdfile
  Require user imoto
 </LimitExcept>
</Location>

ローカル限定なら
<Location /svn/new_rep>
 DAV svn
 SVNPath /home/svn/new_rep
 SSLRequireSSL
 Allow from 192.168.1.0/255.255.255.0
 Deny from ALL
 Order Deny,Allow
</Location>
と追加し、httpdを再起動。
httpd restart
ってやるようにすれば、作成完了かな。
まあ、次リポジトリを作る時にスクリプト書くことにしよう。

投稿者 Takenori : 11:09 PM | コメント (0) | トラックバック

January 07, 2005

Perlモジュールのインストール

WinでActive Perlならppmで簡単にモジュールをインストールできるが、Linuxの場合はどうするか良くわからなかったので検索。
CAPNを使えばセミオートでインストールできるようだ。
やり方は、CPAN経由でLinuxにモジュールを組み込むが参考になる。

投稿者 Takenori : 07:48 AM | コメント (0) | トラックバック

MTをインストールしようとしてまた・・・

MTをインストールしようとしたら、最初のmt-check.cgiでつまる。
パーミションでエラー。
アクセスできない。
すでにアクセスできるディレクトリの下にディレクトリを作って、そこにファイルを置いたのだが、うまくいかなかった。
ここ最近の傾向から行くとSELinuxの仕業だろう。
とりあえず、以下のようにコマンドを入力。
restorecon -R ディレクトリ
すると、アクセスできるようになった。
どうやら、新しいディレクトリを作ったら restorecon -R ディレクトリ とやらないといけないようだ。再起動でもOKかもしれないけど。

manを見るとrestoreconは、
ファイルセキュリティーコンテキストをセットする。( セキュリティーコンテキスト : 拡張属性 )
とある。
必要かどうかよくわからんが、ディレクトリを作った時は、毎回やっとけば間違いないだろう。

投稿者 Takenori : 07:21 AM | コメント (0) | トラックバック

アクセスカウンタの設置場所

アクセスカウンタの設置場所をブログも対象となるようにした。
このページはほとんどブログなので、ブログも対象とした方が良いと思ったからだ。
また、検索すると自分のブログが出てくることも多い。
まあ、自分の興味があることをブログに書いていて、さらに似たようなことを検索するから自分のページが出てるくのは当たり前と言えば当たり前。
でも、ブログに書くエラーメッセージやソフトウェアの名前などは出来るだけ正確に書くように気を遣っている。
それは、自分が後から検索しやすいようにだけど、当然他の人も同じキーワードで検索することがあるだろう。
そして検索して見られるページはブログの1ページ。
そういったこともあるので、ブログもアクセスカウンタの対象とした。

その変更を行っていた時に気付いたけど、ブログを主体にしてしまってもいいかもしれないと思った。
テンプレートやCSSをいじれば、今のトップページのメニューのように表示させることも出来る。
また、各コンテンツもブログで書いた方が更新など楽だ。
各コンテンツは別ブログとして、テンプレートをいじって個別ページの見栄えを独立したページのように見せれば変に見えることはない。
いいアイデアだと思うけど、大幅な変更になるので実際に取り掛かるのは少し先だな。
今は構成などをもう少し詰めていこう。

とりあえず必要なのは、前述のようにログを残していくブログとコンテンツ用ブログの2つのブログ。
掲示板ページ。
ファイルを置いておく場所。
必要なのはそんなところか。

後、MTのバージョンアップも同時に行おう。
それと、旧ブログはリンクのために残しておいて、ブログページ移動のアナウンスを表示するようにしないとな。
出来たら更新作業が楽になりそうだ。

投稿者 Takenori : 03:00 AM | コメント (0) | トラックバック

ZIPがダウンロードできない?

家サーバーにZIPファイルを置いてダウンロード出来るかどうかテストしてみた。
そしたら、全然出来なかった。
なぜ?
Apacheの設定などを調べるが良くわからない。
ログからするとパーミッションの問題のようだが、いろいろといじっても変わらない。
これは、SELinuxが原因では? と思って、WebDAVフォルダに置いてからDLしてみる。
出来た。
やはり、SELinuxの設定が問題な様子。
これは面倒臭いなぁ。
まあ、セキュリティーレベルは高いんだろうけど。

少し前にAmazonで注文したSELinux徹底ガイドが今日届いたが、まだ読んでいない。
でも、最近徐々にSELinuxはOFFにしておきたい気分になってきた。
まあ、まじめに取り組んだ方が安全なんだろうけど・・・
少しずつやっていくかなぁ。

投稿者 Takenori : 02:53 AM | コメント (0) | トラックバック

January 06, 2005

MySQLの復旧

MySQLへアクセスできないので、いろいろと調べる。
まず、パスワードをなくしたい。
いろいろ調べて /etc/shadow にパスワードが保存されていることがわかった。
shadow のManページで意味を見る。
cryptで暗号化されたパスワードと思われるものが、mysqlユーザーには設定されていた。
PostgreSQLを真似て、パスワードを!!に変更。
で、再起動。
まだアクセスできない。

mysql とコンソールで入力した時に表示されるメッセージと、
ERROR 2002 (HY000): Can't connect to local MySQL server through socket 'ソケットファイル名' (111)
を手がかりに、"Can't connect to local MySQL server through socket" で検索する。
このページがほぼそのままのことを書いている。
1番目にMySQLが起動していない可能性を指摘している。
ps axで見ると、mysqlはない。でも、ps ax | grep mysql とやると出てくる。
なんだろう? よくわからない。
で、ふとsafeモードみたいなのがあったのを思い出し、適当にコマンドを打つがわからない。
MySQL install で、mysqladmin version と入力するのがあったので、やってみると、同じエラーメッセージが表示された。
どうやら、起動していないようだ。
で、whereis mysqladmin として、mysqladminがある場所を調べると、同じディレクトリにmysqld_safe と言うのがあった。
これか!
で、mysqld_safeと入力。
"STOPPING server from pid file /var/run/mysqld/mysqld.pid"
と表示され、終了してしまった。
前述のページにエラーログのことが書かれていたので、エラーログを見てみることにした。
/var/log/mysqld.log がそのログみたいだ。
見てみると、
Operationg system error number 13 in a file operation.
The error means mysqld does not have the access rights to the directory.
File name ./ibdata1
File operation call: 'open'.
Cannot continue operation.
とある。
つまり、access rights がないのか。
で、指摘されたファイル /var/lib/mysql/ibdata1 を見てみる。
なぜか、所有者がrootになっていた。
いつの間に。
他にもいくつか所有者が変わっているファイルがあったので、所有者とグループをmysqlに変更した。
で、再び、mysqld_safe。
コンソールがそのままになった。そうか、別プロセスで起動させるとかなんとかのコマンドでやらないといけなかったのか。
仕方ないので、コンソールをいったん閉じて、再び開き、ps axで見ると、mysqld_safeが立ち上がっていた。
mysql -u root -p でアクセスすると、きちんとアクセスできた。
再起動しても、きちんと起動するかどうかを確認するため再起動。
問題なくアクセスできた。
なんか、無駄に苦労したような気がしないでもないけど、うまく動くようになって良かった良かった。

投稿者 Takenori : 12:29 AM | コメント (0) | トラックバック

January 05, 2005

やっぱりSambaが使いたい

WebDAVで十分かと思ったけど、やっぱりWinの共有フォルダの方が使い勝手が良い。
たぶん、これもiptablesのせいだろうと思い、Sambaが使うポート番号を調べる。
UDP/137、UDP/138、TCP/139、TCP/445を開けると良いようだ。
で、
/sbin/iptables -I INPUT -p tcp --destination-port 139 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --destination-port 445 -j ACCEPT
/sbin/iptables -I INPUT -p udp --destination-port 137 -j ACCEPT
/sbin/iptables -I INPUT -p udp --destination-port 138 -j ACCEPT
/sbin/iptables-save > /etc/sysconfig/iptables
てな感じで、変更。
再起動。
エクスプローラーでアクセスしてみる。
ちゃんと表示された。
やった、これで編集が楽になる。

心配していた、MySQLは普通に立ち上がっていた。
で、mysqlとアクセスしようとするが出来ない。
やっぱりー

投稿者 Takenori : 11:32 PM | コメント (0) | トラックバック

MySQLのアップデート

Fedora Core 3では、MySQLは3.X系が入っているが、どうやらこの記事(MySQLの最新版でも静まらないライセンス方式への批判)に書いてあることが原因の様子。
それはともかく、4.0系が使いたいので、RPMをDLしてインストールすることにした。
で、MySQLのDLページを見ると4.1系がrecommendedになっている。
と言うことは、4.1系を使った方がいいのか?
前に書いたとおり、developmentパッケージを入れれば、MySQLは4.1.7系が入る。でも、どうせなら4.1.8を入れたい。
で、結局RPMをDLして、インストール。

rpm -Uvh MySQL-shared-compat-4.1.8-0.i386.rpm
rpm -Uvh MySQL-server-4.1.8-0.i386.rpm
rpm -Uvh MySQL-client-4.1.8-0.i386.rpm
rpm -Uvh MySQL-bench-4.1.8-0.i386.rpm
rpm -Uvh MySQL-devel-4.1.8-0.i386.rpm
rpm -Uvh MySQL-Max-4.1.8-1.i386.rpm
ってな感じ。
後から気付いたけど、これは、 rpm -Uvh MySQL-*.rpm とやってもいいみたい。
それと、最初入れる順番がまずかったのか、依存関係がどうとかでうまくいかなかった。いろいろと調べて、よくわからずにもう一度やったらうまくいった。
うーん・・・順番が違ったのかな。
あと、MySQL-shared-4.1.8-0.i386.rpm も入れたけど、その後に MySQL-shared-compat-4.1.8-0.i386.rpm を入れたら、表示されなくなっていたので、いらない様子。
たぶん、MySQL-shared-compat-4.1.8-0.i386.rpm は、3.23系と両方含んだものみたい。と言うか、DLページにはそんなようなことが書かれている。

で、早速起動してアクセスしようとするが、うまくいかない。
localhostからアクセスできないとか何とか表示された。
いろいろ調べるが良くわからん。
それと、4.1.8を入れたときかどうかわからないが、mysqlのグループとユーザーが消えていた。/var/lib/mysql/mysql にあるファイルなどの所有者にはID番号が表示されている。
ユーザーとグループを見てみても、mysqlはない。
一体いつ消えたのだろう?

それとは関係なく、SELinuxのポリシー関係のアップデートがあったので、インストール。
WebDAVで変更していた個所を再設定し、makeする。
で、再起動。

起動後確認するが、mysqlはグループ、ユーザーともにない。
仕方ないので、postgresのを真似て、mysqlを追加。
IDはファイルの所有者として表示されていたものを設定。
警告が出たけど、無視。
設定は次のようにした。
グループ名 : mysql
グループID : ファイルに設定されていたものと同じ。(postgres+1)

ユーザー名 : mysql
ユーザーID : ファイルに設定されていたものと同じ。(postgres+1)
プライマリグループ : mysql
氏名 : MySQL Server
ログインシェル : /bin/bash
ホームディレクトリ : /var/lib/mysql
後、パスワードは適当に設定したのだが・・・ 次起動した時うまくいくだろうか?
少し不安。

で、再びMySQLへアクセス。
今度はうまくいった。
phpMyAdminからアクセスしたら、MySQL 4.1.8-Maxと表示された。
これでうまくいったのかな。

投稿者 Takenori : 10:49 PM | コメント (0) | トラックバック

WebDAVフォルダの追加でまたハマる

SSL+パスワード付きのWebDAVフォルダを追加しようとしたら、すんなり行かずかなり悩んだ。
理由は、SELinuxのポリシーの設定と、許可するユーザーの設定ミス。
WebDAVポリシーは、以前Fedora Core 3 で WebDAV/Subversion を使おうを参考にして追加したが、今回新しいフォルダを追加しようとしていたので、設定の追加が必要になった。
詳しい設定方法は、前述のページを参照して欲しい。
で、ここにも一応備忘録としてメモ
なお、httpd_dav_content_t の追加は前述のページを参照のこと。

/etc/selinux/targeted/src/policy/file_contexts/program/apache.fc の最後に新しく追加したポリシーを追加。
具体的には、
/home/dav(/.+)? system_u:object_r:httpd_dav_content_t
ってな感じ。
太字部は、新しく追加したフォルダに合わせる。
で、コンソールで次のようにしてポリシーをmake。
# cd /etc/selinux/targeted/src/policy
# make clean
# make reload
# restorecon -R /home/dav

書いていてふと気付く。
/home/webdav にポリシーを設定して、WebDAVを追加する時は必ずその下にフォルダを作り、そのフォルダにAlias を設定する。
そうすれば、毎度毎度ポリシーをいじらなくて済む。
で、設定変更。
うまくいった。

もう一つは、許可するユーザーの設定。
Require valid-user
と書けば、パスワードファイルにかかれているユーザー全てがアクセスできるようになるが、そうではなく、パスワードファイルは一元管理し個別にアクセス許可を与えたい。
その場合、Require user に続けて、ユーザー名をスペースで区切って入力するのだが、userと入れるのを見逃していた。
いやー、悩んだ悩んだ。

投稿者 Takenori : 04:01 AM | コメント (0) | トラックバック

MySQL

Fedora Core 3 に入っているMySQLのバージョンは3.23.58と少し古い。
せめて4.0系が欲しかったが、まあいいか。
たぶん、大丈夫だろう。
で、MySQLの設定を参考にパスワードの設定などを行う。
ただし、最後の
mysql> set password for root@'%'=password('パスワード');
は、%ではなく、きちんとしたホスト名を入れないとうまくいかなかった。
で、次にphpMyAdminをインストール。
DLして、任意のディレクトリに展開した後、apacheの設定をいじって、そのディレクトリへはローカルからしかアクセスできないようにした。
そして、phpMyAdminのインストールを参考にして、設定を行った。
ただし、前述のページで変更する必要があると書いてある次の場所以外に
$cfg['PmaAbsoluteUri'] =
$cfg['Servers'][$i]['password'] =
次の、場所のlocalhostの部分をきちんとしたホスト名にする必要があった。
$cfg['Servers'][$i]['host'] = 'localhost';
以上で、MySQLが使えるようになった。
でも、やっぱり4.0系が欲しいなぁ。
FC3でyumを使ってサインが入っていないdevelopmentパッケージをインストールするを参考に、アップデートできるパッケージを調べると、4.1系が表示される。
まあ、当たり前っすね。
で、普通にyumでやると、3.23.58になる。
うーむぅ。
RPMパッケージでやらないとダメなのか?

投稿者 Takenori : 12:50 AM | コメント (0) | トラックバック

January 04, 2005

DNSサーバー

少し前に書いたとおり、iptablesでnamed が使う、TCPの53番および953番、UDPの53番を開けた。
/sbin/iptables -I INPUT -p tcp --destination-port 53 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --destination-port 953 -j ACCEPT
/sbin/iptables -I INPUT -p udp --destination-port 53 -j ACCEPT
/sbin/iptables-save > /etc/sysconfig/iptables

そして、サーバーを再起動し、WindowsマシンのDNSサーバーの設定をローカルのものに変更。
nslookupで、設定した名前を指定してるみる。
やった! きちんとローカルのIPアドレスが返ってきた。
今度は、ブラウザで確認。って、あれ? うまく表示されない。
一度、すべてのブラウザを終了させ、再度アクセス。今度はうまくいった。
これで、ローカルからも、外からも同じアドレスでアクセスできる。
※注 うちのルーターの場合、うちに割り振られているグローバルアドレスでアクセスしても、ローカルのアドレスまでは届かない。
大部分のルーターはそうらしい。
なので、外からと内からではアドレスの指定が変わってしまう。
そこで、ローカル内だけのDNSサーバーを設置した。
これによって、内からも外からも同じドメイン名でアクセスできる。
ちなみに、私は固定IPではないので、家サーバー・プロジェクト ダイナミックDNSサービスを使用している。
外からのアクセスを確認したい時は、前に書いたようにシマンテックのセキュリティーチェックを使用するか、プロキシを使う。
プロキシについては、CyberSyndromeが詳しい。

良かった、良かった。
内と外で同じアドレスが使えるようになったし、DNSのキャッシュも効くようになった。
DNSのキャッシュは初めてアクセスするところは遅いけど、次からは早くなるのでいい感じだ。
で、次何するんだっけ?
そうだ、MySQLの設定だ。

投稿者 Takenori : 11:27 PM | コメント (0) | トラックバック

iptablesの設定を追う

iptablesの設定を見てみると、元々あると思われるhttpの設定は次のようになっている。
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
しかし、自分で設定したのは次の通り。
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
なんか、少し違う。
気になるので、iptablesのManページを参考に意味を見ていく。
たぶん、次のような感じ。

-A RH-Firewall-1-INPUT :
選択されたチェインの最後に 1 つ以上のルールを追加する。送信元や送信先の名前が 1 つ以上のアドレスに解決された場合は、可能なアドレスの組合せそれぞれに対してルールが追加される。
この場合、選択されたチェインとはRH-Firewall-1-INPUT のこと。

-p tcp :
ルールで使われるプロトコル、またはチェックされるパケットのプロトコル。
この場合、TCPを使うってこと。

-m state :
state モジュールをロードする。
次の、--state NEWのために必要?

--state NEW :
接続追跡 (connection tracking) と組み合わせて用いると、パケットについての接続追跡状態を知ることができる。
NEWの接続状態は、このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケット。

--dport 80 :
送信先ポートまたはポート範囲の指定。
ポート80を指定。

-j ACCEPT :
ルールのターゲット、つまり、パケットがマッチした場合にどうするかを指定する。
ACCEPTなので、受け入れる。

----------------------
最初のルールはそんなところみたい。
で、RH-Firewall-1-INPUT がなぞだが、これはそれより前に、次のように定義されている。
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT

INPUT と FORWARDの意味は次の通り。
INPUT : マシン自体に入ってくるパケットに対するチェイン
FORWARD : マシンを経由するパケットに対するチェイン

で、-j は前述の通り、次に来るターゲットに従う。
つまり、RH-Firewall-1-INPUTに従うってことで、さらにRH-Firewall-1-INPUT は、後でルールが定義されている。
間接的に定義しているってことか。
なら、-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT でも、問題なさそう。
たぶん、RH-Firewall-1-INPUT を使用することで、設定を一気に書き換えたり、切り替えたりする時に便利なんだろう。
まあ、とりあえず、今のままでいいや。

投稿者 Takenori : 10:26 PM | コメント (0) | トラックバック

書き込みを行うCGI

書き込みを行うCGIがうまく動作しない。
しばらく理由がわからなかったが、ふとSELinux のせいではないか? と気付いた。
Fedora Core 3 で WebDAV/Subversion を使おうより安全に使いたい場合を元にWebDAV 用のポリシーを追加したが、この設定によって、httpd が書き込みを行えないようになっているのではないかと思った。
そこで、httpd_unified=0 をhttpd_unified=1 に戻し、再起動。
動作を確認すると、うまく動いている様子。
よし、よし。
SELinuxは、イマイチよくわからないので、AmazonでSELinux徹底ガイドを注文した。

次は、BINDの設定だな。
前にも設定したが、なぜかうまく動かなかったからな。
って、BINDもiptablesのせいでは!
少し試してみよう。

投稿者 Takenori : 09:22 PM | コメント (0) | トラックバック

SSLの設定で悩む

パソコンおやじのページを参考にいろいろと設定を行っているが、このページのApache+SSLの設定には、証明書の作り方として、サーバ証明書の作成へリンクが貼られているが、SSL用証明書の作成(Linux編)の方が新しく、Apache+SSLの設定も新しいページで作ったものに準じているようだ。
いやー、公開鍵とかSSLのハンドシェイク方法とかそんな基礎的なことから調べてしまった。
後、前述のページでは、クライアント用証明書の作成も行っているが、私のページにはそこまでのセキュリティーは必要ないので、作成と設定はしないことにした。
つまり、SSLVerifyClient require は、コメントアウトしたまま。
で、https://localhost/ でアクセスすると、きちんと証明書を受け入れるかどうかなどが表示され、SSLで通信できることが確認できた。(サーバーに入れているFirefoxは、以前書いた通り英語版だったので注意メッセージは詳しく読まず)
同様に他のマシンから https://ローカルIPアドレス/ としてアクセスしたが、つながらず。
なぜ?
シマンテック・セキュリティチェックから、自分のPCのセキュリティーチェックを行うと、443はステイルス。もっとも安全です。と出た。
ダメじゃん。
で、ルーターの静的マスカレードとフィルタの設定の確認を行うが、443は開けていて、サーバーマシンに行くようになっている。
うーん・・・ なんだろう?
と、考えていたらピンときた、iptablesだ!
やつの仕業に違いない。
/sbin/iptables -I INPUT -p tcp --destination-port 443 -j ACCEPT
/sbin/iptables-save > /etc/sysconfig/iptables
と入力し、再起動。
httpsでアクセスできるようになった。
やった。
途中でSSLいらないやとかなーり思ったけど、なんとかうまく設定できた。
Fedora Core 3 の情報はまだそれほど多くないので、ちょっと辛い。
やっぱり、新しい方がいいだろうと思ったのは、まずい選択だったかも。

投稿者 Takenori : 02:17 AM | コメント (0) | トラックバック

January 02, 2005

WebDAVの設定で悩む

パソコンおやじを参考にしながら、SSLの設定をする。
が、うまくいかない。
と言うか、上記のページで解説が食い違っている個所がある。
うーん・・・
キーを作成したりといろいろとやったのだが、SSLはちょっと後回しにして、WebDAVの設定をすることに。
で、検索すると、Fedora Core 3 で WebDAV/Subversion を使おうと言うちょうどいいページがあったので、これ元にSubversionを使えるように設定。
ブラウザでアクセスするとうまくいった。
で、単なるWebDAVフォルダを作ろうとするが、うまくいかない。
様々なページの設定を調べたり、SELinuxについて調べたり。
そして、いろいろと設定をいじっていての違いってなんだったっけ? と思いながら、を追加するかと思って、Alias のパスを確認すると、"/" がない。
これはもしかしなくても・・・
"/" を追加して、Apache 再起動すると難なくアクセスできるように。
今まですごい悩んでいたのは一体・・・
まあ、とにかく次はSSLだな。
後、SambaはWebDAVがあれば、いらないかと思い始めてきた。
Samba の設定はほっておくか。

投稿者 Takenori : 12:16 AM | コメント (0) | トラックバック

January 01, 2005

Fedora Core 3 のインストール

Linux でサーバーを立てるのはほとんど初めてに等しいので、いろいろと大変そうな予感大。というか、すでに大変さを味わい中。

Linux World 1月号についていたDVDからFedora Core 3 をサーバー設定でインストール。
Apacheの設定をいじって起動。
とりあえず、テストページは表示されたが、WebDAVはうまくいかない。
でも、それは後回しにする。

Sambaのインストール・設定を参考にして、設定を少しだけ変える。(ワークグループのところだけ)
で、Sambaの実行を参考にして、
smbd -D
nmbd -D
と入力し起動。
しかし、Winからアクセスできず。
なぜ? よくわからない。

Firefoxを立ち上げて調べようと思ったが、英語な上にバージョンが古い。
Firefoxのページから日本語版の一番新しいのをDLして、インストールしようとするが、libstdc++.so.5 がないと言われる。
調べると、libstdc++.so.6 があるのみ。
libstdc++.so.6のシンボリックリンクをlibstdc++.so.5 で作り、試すがうまくいかない。
で、yumでupdate出来ないかと思い、Fedora core 3でyumを使うを元に、yumの設定をする。
上記設定をした後、yum でfirefoxを入れようとするが、うまくいかない。
そこで、RedhatLinux7.3 への Firebird1.5.1 インストールを元に、gcc 3.3.3 をmake & インストール。パスは通さずに、ln -s /usr/local/gcc-3.3.3/lib/libstdc++.so.5 /usr/lib/ のシンボリックリンクのみにする。
で、DLしたFirefoxのインストーラーを立ち上げるとうまくいった。
意気揚揚と起動するが、何も変わっていない。
なぜ?
ふとタスクバー(?)を見ると、赤い!が付いていたので、クリック。
なんか、いろいろと自動更新してれるよう。
なんだ、これでやってくれるのかと思いきや、プログレスバーが途中で止まる。
はて?
何度かやるがうまくいかない。
仕方ないので諦めて、yum update firefox としてみる。
なんか、うまくいった。
で、起動するが、バージョンは古いまま。
ふと再起動しようと思い、再起動をかける。
再起動後にFirefoxを立ち上げる。
やった、新しいバージョンになっている。
でも、英語だ。
まあ、いいか。英語でもそんなに不自由しないし。
で、再び赤い!をクリック。
今度はサクサク進む。

メモ
パソコンおやじ

投稿者 Takenori : 01:37 AM | コメント (0) | トラックバック

Total : Today : Yesterday :