<   2007年 02月 ( 7 )   > この月の画像一覧

e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

最適化の罠

割り込み通知の処理で、どんなコードを書けば、最短で通知できるかテストするために、手始めに次のようなコードを書きました。

DWORD WINAPI WhileLoopThread(LPVOID data)
{
    int& i = *((int*)data);
    Beep(1000, 200);
    Sleep(1000);
    Beep(1000, 200);
    timer.Reset();
    i = 1;
    return 1;
}


void CSyncObjectDlg::OnBnClickedButtonWhileLoop()
{
    // While ループを使用して処理待ちをします。
    int i=0;
    HANDLE hThread = ::CreateThread(NULL, NULL, WhileLoopThread, &i, NULL, NULL);
    while(1)
    {
        if(i==1)
        {
            double t = timer.GetDeltaT();
            CString strMsg;
            strMsg.Format("経過時間:%f", t);
            MessageBox(strMsg);
            break;
        }
    }
    ::CloseHandle(hThread);
}


呼び出し側では、while の無限ループを延々と繰り返し、変数 i が 1 になったことを判定し、なにがしかの処理を実行します。

このコードをデバッグモードでビルドすると、次のコードが生成されました。
(混合モードで表示しています。)

最適化前:
    while(1)
00415A12  mov         eax,1 
00415A17  test        eax,eax 
00415A19  je          CSyncObjectDlg::OnBnClickedButtonForLoop+102h (415AB2h) 
    {
        if(i==1)
00415A1F  cmp         dword ptr [i],1 
00415A23  jne         CSyncObjectDlg::OnBnClickedButtonForLoop+0FDh (415AADh) 
        {
            double t = timer.GetDeltaT();


これはちゃんと動きました。
昨今はCPUが増えたので、パフォーマンスに優れるなら、こんな待ち方もありかな~
なんて思っていました。
反応は、5~10 μs となかなかの応答をしてくれます。

では、最適化後のリリースビルドならもっと早いんじゃないか?と思い、リリースでビルドしてみると、、、
こんなコードができました。

最適化後:
004011CE  mov         eax,dword ptr [esp+0Ch] 
    while(1)
    {
        if(i==1)
004011D2  cmp         eax,1 
004011D5  jne         CSyncObjectDlg::OnBnClickedButtonForLoop+42h (4011D2h) 
        {
            double t = timer.GetDeltaT();
004011D7  mov         ecx,offset timer (4050F8h) 
004011DC  call        CFreqTimer::GetDeltaT (401590h) 
004011E1  fstp        qword ptr [esp+10h] 


実行してみると、、、

無限ループじゃん!!

処理を感知しません。

解説すると、、、
mov eax,dword ptr [esp+0Ch]

で、変数 i の内容を eax レジスタにコピーした後、ループの度に
cmp eax,1

というコードで、eax レジスタと 数値の1を比較して、偽なら、もう一度 eax レジスタと 数値の1を比較、、、
を延々と繰り返します。。。

あほか。。。

別スレッドは、変数 i は変更するけど、eax レジスタを変更する訳ではないので、このままだと永遠に eax レジスタは0のままになってしまいます。

コンパイラの最適化がこんなコードをはき出すなんて。。。

プログラムを書くのが恐くなりました。

今後は、リリースビルドでも最適化はOFFにしようかな。。。。
[PR]
by isoq | 2007-02-26 13:04 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

グッピーがぁ、、、グッピーがぁwwwwww

ここのところ、グッピーの雄が元気がない。
尾ひれがドンドンと裂けていって、なんだかかわいそう。。。
まだ半年とちょっとしか経ってないのに、、、
でも、子供達は元気いっぱいです。

現状では、

雄×1
雌×3
稚魚×8

くらいになりました。
最初は、ペアで買ってきて、最初の雌はすでに他界しています。

今の雌は、その雌の子供達です。
稚魚は孫。

雄はもう寿命なのかな~?
買ってきたときにはすでに大人だったし、あまり流行ってないペットショップだったから、その時点でもう年だったのかもしれない。

でも、稚魚の中に、雄はいなそうだなぁ~
グッピーの雄を産ませるにはどうしたらいいのだ!?
[PR]
by isoq | 2007-02-22 02:39 | 日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

オンライン出版システム SPIP をインストールして試してみた

オンライン出版システム SPIP というWebアプリケーションがある。
GPLライセンスのもとで配布されているフリーソフトで、サポートを必要としない場合はフリーで利用することができる。

ここでいるオンライン出版(Online Publication)と言っているが、内容的にはCMSの一種で、複数の管理者と著者ユーザを定義して、著者ユーザの書いたWebページを管理者がチェックしてオンライン公開を許可・拒否ができる。

フランスで開発されたソフトということだが、日本語表示にも対応している。
もちろん日本語の記事も正しく入力・表示できる。
ただし、日本語は意味がちょっと違うんじゃない?というところもあるが、、、
トランスレーションをバージョンアップする必要がありそう。

最初にIIS5.0 + PHP5.2.1 + MySQL5.0.27 という組み合わせでインストールを試みたが、MySQLのテーブル作成に失敗してしまい、うまくインストールがすすまない。

しょうがないので、おすすめの実行環境パッケージをインストールした。
EasyPHP というソフトウェアパッケージ。
EasyPHPには、PHP5 + Apache + MySQL5 が含まれていて、他の全部まとめてProgram Files\EasyPHP x.x.x 以下にインストールされる。
サービスに登録するかも選択可能。

※サービスに登録しないと、MySQL5がうまく起動できないみたい。そんなときには、Program Files\EasyPHP x.x.x\mysql\bin\mysqld.exe を手動で起動してあげるとうまくいった。(起動後、コマンドプロンプトは消しても良いみたい。)

※EasyPHPには、付属のサーバーをGUIで管理するWebアプリケーションも同時にインストールされるから、仮想フォルダを作ったりするのも簡単にいくはず。

この組み合わせなら、ガッツりOK!
インストールも、インストール用のPHPスクリプトをインストール先ディレクトリに配置して、Webブラウザから表示するだけ。

※ここでエラーが発生!どうも PHPデフォルトの 30秒というスクリプトの実行リミットの間に処理が終わらないので、タイムアウトしてしまうらしい。タスクトレイのEasyPHPを右クリックして、PHPの設定ファイル(php.ini)を表示し、max_execution_time = 30 のところを max_execution_time = 3600 などに修正してからインストールするとインストールできた。あとから、元に戻すのを忘れないように!

パーミッションにあたるセキュリティ設定などは一切無しでインストールが完了。
動作もOKである。

インストール後は、 http://localhost/spip/ecrire をブラウザから開いて初期設定。
(↑これは自動的に開いたかも)
ここでMySQLのアカウント情報が必要。
なにも設定していなければ、

アカウント:root
パスワード:(なし)

でOK。

ドキュメントの仕組みは、セクションで階層構造を作れて、それぞれのセクションには記事やニュースを書き込める。
記事には、HTMLを使用することができて(WYSIWYGではない)、SCRIPTはエスケープされる。
記事は、一般著者が書くと、管理者の認証が必要。管理者が書いても自分で認証しないと公開されない。


スキン機能もあります。
が、ちょっと高度すぎて、「ちょこっとやってみたい人」を敬遠させる原因かも。
チュートリアルもありますが、これってプログラマでもなきゃ無理でしょ?
しかも、パラメータがフランス語じゃん!意味わからんし。
設計思想もフランス的みたいだし。

という訳で、スキンは諦めて、独自路線で行くのは比較的簡単です。
インストール先の dist フォルダに入っているHTMLファイルを直接書き換えちゃいましょう!
SPIPが利用するSPIPタグというのを気を付けながら編集すればOKです。
このときWYSIWYGエディタは使わない方が身のためです。
デフォルトのバックアップは取っておきましょう。


内容的には、シンプルで使いやすそうな雰囲気。
最初はちょっと仕組みがわかりにくいところもあるけど、使っていけばすぐに慣れそう。
SOHOや小企業のHP管理や社内情報共有ツールとしても使えそうですね。
[PR]
by isoq | 2007-02-21 18:37 | Web
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

4GB SDメモリカードについて

最近、4GBの容量を持ったSDカードが販売されている。
大容量対応として開発された SDHC(SD 2.0) ではなく、SD 1.1準拠のカードとのこと。
しかも、安い!
(例えば、これとか。)
トランセンドとか、ちゃんとしたメーカが出しているし、安心して使える様な気もするけど、
気持で機械が動けば苦労はしません(^^;)

しかも、トランセンドのHPには、4GBのSDについての表記がありません。。。。
(大丈夫かこの商品、、、)
Amazonでも売っているから、そこまで変な商品じゃないと思うけど。

TrancendのFAQには、かろうじて出てくる。

手持ちの DMX-C4 で使えるかどうか。。。それが気になります。
使えるなら、即買い決定です!

とりあえず、SDの規格について調べてみました。

Simplified Version of PHYSICAL LAYER SPEC から抜粋:
Memory capacity:
Standard Capacity SD Memory Card: Up to and including 2 GB
High Capacity SD Memory Card: More than 2GB (This version of specification limits
capacity up to and including 32GB)

これによると、SDメモリは、最大2GBまでしか対応していないらしい。
しかも、SDAのトップページ には、CAUTION(注意!) として4GBのSDカードはSDじゃない!と言わんばかりのメッセージが。
詳しくみるをクリックすると、4GBのSDロゴ入りカードについて、
Non-Compliant SD/SDHC Memory Cards (Incorrect cards)
と書かれている。

ここまで書かれると、Trancendとしても、HPに載せる訳にも行かないのかな。。。
SDAが4GB以上はSDHCを使えって言っているんだから。

こうなってくると、4GB買って、人柱になる勇気が無くなってきます。。。

Wikipediaから引用:
ただし、デジタルカメラなどのSDメモリーカード対応機器にはFAT32に対応しているものが少なく、FAT12・FAT16が使用されているため、FAT12の場合は128MB、FAT16の場合は2GBとしてしか使えないことも多いので注意が必要となっている。

つまり、機器のファイルシステムによっては、4GBのメモリも2GBまでしか使うことができないらしい。
また、FAT16しかサポートしていない機器では、FAT32でフォーマットしたメディアは認識しないと思われる。

もし、機器がSD1.1とFAT32に対応していればそのまま使え、FAT32のフォーマットに対応していなければ、Windows上でフォーマットしてから機器に差し込めば使え、機器がそもそもFAT32またはSD1.1に対応していなければ、使えない。

ということになるでしょうか。

う~~ん、実際に使った人の結果を知りたいところですね。

DMX-C4 (SANYO Xacti C4)で使ってみた人いませんか~?

上海問屋のユーザーレビュー
[PR]
by isoq | 2007-02-21 12:17 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

キタ=======! EM・ONE Windows Mobile搭載 電話?電話機能は不要だが魅力的な機体だ。

EM・ONE キました!



ワンセグ標準装備。
通信機能標準装備。
定額。
800x480ワイド液晶
あっちにもこっちにもスライド(キーボードとボタンが切り替わる)
。。。

あ~欲しい!!
いや~~~欲しい。
早く欲しい。
予約しチャオかな。。。

h4150が壊れて以来、キーボード付き携帯端末が欲しくて欲しくて、
一時はSoftBankに走ろうかとも思いましたが、
踏みとどまって良かったです (^^)

プレスリリース

シャープのスペシャルページ ← Flashが重すぎ

Sleipnirが固まりました。。。
↑ タスクマネージャから、優先度を変更すると、一瞬動くようになりましたので、
その間に閉じるとよろしいかと。(何かがロックしてるみたいですね。)

-追記-

Microsoft のページの紹介を見ていたら、こんな記載が。
注) 当端末での音声通話はおこなえません。

良かった~
電話はイランですよ!
ついでに、通信サービスもイランですよ!
ただ、無線LANとキーボード付きマルチメディア端末として使いたいですよ!
[PR]
by isoq | 2007-02-21 09:56 | モバイル
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

Outlook Express メッセージルール 適用されない

Outlook Expressのメッセージルールが適用されないので、
「Outlook Express メッセージルール 適用されない」
でググッて見たところ、
OLEXP: Outlook Express でのメッセージ ルールは、正常に機能しません。
という記事が出てきた。

機械訳で全く意味不明なのですが、文書番号で英語ページを検索してみると、

OLEXP: Message Rules in Outlook Express May Not Work as Expected

が出てきた。

つまり、ルールの設定の時に、アクションとして「やりたいこと」と同時に、「ここで処理を止める」を選択しないと、引っかかったメールをゴミ箱に移動(したいとすると)した後、いろいろなフィルタがかかって、最後に引っかかったフィルタの処理が適用されてしまうらしい。
なので、ゴミにしたいのにゴミにならない。
設定してみよ。
[PR]
by isoq | 2007-02-02 15:20 | コンピュータ
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇

非標準キーボードの惨劇

海外メーカ製ソフトウェアのアップデートに失敗し続けてもう1週間になろうかとしている。
環境は Windows XP Professional 64 bit edition。
海外メーカは「絶対に動く。現にこっちでは動いている!」と、さもこっちの不手際であっちが作ったソフトが動かないとも言いたげな対応。

何日も前から、「OSをクリーンインストールして、ちゃんとインストールして動作するかテストしろ!」と、メーカに伝えているのだが、全くそうしようとしない。
この自信はどこから来るのだ!?

ログを出すように改良したEXE等を何度ももらって、テストしたが、メーカー製のDLLが読み込めないということが分かっただけ。。。。

SysinternalのFilemonで実行ファイルがアクセスしているログを取ってみた。
何全行ものログの中、Microsoft.VC80.CRT.dll へのアクセスにNOT FOUNDで失敗していることを突き止め、「よし!この画面をキャプチャして送りつけてやろう!」とおもって、「Print Screen」キーを押した。
つもりだった。。。

いきなりPCがシャットダウン・・・

も~~~~~~~

システムを安くあげようと安いキーボード買いやがって!!!(← オレ ^^;)

orz

a0002261_11115059.jpg

[PR]
by isoq | 2007-02-02 11:11 | 開発日記
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇