« 2005年7月 | トップページ | 2005年9月 »

2005年8月31日 (水)

ネットワーク越しのコピーにセキュリティの壁?

ネットワーク越しに2Kへファイルを
コピーしようとしたら…

「XXXをコピーできません。アクセスできません。
 送り側のファイルが使用中の可能性があります。」

というエラーが出た…。

何でかな?と調べてみると…。
実際には、セキュリティ設定がされていない
ためだった・・・。

だったら…

「XXXをコピーできません。アクセスできません。
 セキュリティで書き込み権限が無い可能性があります。」

とかにすれば、分かり易いのに…。

上記のエラーじゃぁ、原因がわかんないよ!

NTFSのドライブのみ食らう!
FAT32では発生しない!
この辺は、ホルダーにセキュリティが
かけられる・かけられないが思いっきり絡む…。

GUESTをアカウントを有効にし
ドライブやフォルダーを共有化して
GUESTでのセキュリティを許可すれば
誰でもアクセス可能なドライブやフォルダーが
出来上がり…。

セキュリティを考えなくて良い
自宅やごく限られたローカルネットワークだと
設定が楽で良い。

まあ、承認すれば良いとの話も勿論あるが…。

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

2005年8月23日 (火)

PCの電源を入れても立ち上がらない時…

朝、職場で優雅でない一日が始まる…。

PCに電源を入れる・・・。

BIOS画面で停止する…。

???

電源を切って…
また入れる。

今度は、
『ピー!ピー!ピー!』
と鳴り出した…。

画面は、ブラックアウトしたままだ…。

また、電源を切って…
入れる。

何度もやる…。

猿のようにやる!

だが…
『ピー!ピー!ピー!』
と鳴るだけ…。

???

考えたくないことだが…

壊れた?

なぜに?

昨日まで元気に動いた奴が!

ぽっくりか!?

…。

ちょっとまて!

今死なれては、困る…。

しかし、これを乗り越えるために
新しいPCを…。<何かを妄想する…。

いや…

金が無い…。

じゃ無くて…。

時間が無い…。

今、押しているから…

…。

バックレよう!

頭の片隅で誰かが囁いた…。

…。

取り合えず直してみよう…。

メーカのHPでトラブルシューティングを確認する。

こう言うときに2台有ると助かる…。

まさにバックアップPC様々!

●電源入れてもファンが回らない…
 >電源不良による心停止

●ファンは、回るがピクリともしない…
 >CPU不良による脳死

●ピー!ピー!ピー!と鳴る…
 >メモリ・BIOS不良による記憶障害

●ビ!ビ!ビ!と鳴る…
 >ビデオカード不良による出力障害

なんか「記憶障害」らしい…。

1枚しか無い貴重なメモリーを外して…
差して…。

直んない…。

BIOSをクリアした。

直んない…。

良く読むと
『メモリーを別のスロットに入れてみよ!』
とある。

1枚しか無い貴重なメモリーを外して…
差して…。

…。

何事も無かったように立ち上がる!

直った!

本当か?

…。

どうやら大丈夫のようだ…。

結局メモリコネクタの破損…らしい。

無論どう破損しているかなんて分からん。

しっかし突然ぽっくり逝ったのには焦った。

故障…侮りがたし!

まあ、動くんだから問題無し。

こいつには、まだまだ頑張って貰わねば…。

だが、壊れたときの為にバックアップは、こまめにしようと
『秋葉に誓う』
と日記には書いておこう。

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

2005年8月20日 (土)

タイマー処理は、こんな感じ?

最近、書いていることが硬いのぉ~。

いかん、いかん。

もっと、チャラチャラ書くぞぉ!

さて!

今回は、最終回!

ようやくタイマーが完成する!

多分…。

でも、ボケのプログラムだから
ボケボケなのは、
お約束だょぉ!

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <Windows.h>
#include    <StdIo.h>
//--------------------------------------
#define        WAIT_TIME        ( 1000 / 60 )
#define        LIST_MAX        1000
//--------------------------------------
DWORD ( WINAPI* TimerGet )( void );
//--------------------------------------
void TimerCreate( void )
{
    OSVERSIONINFO    OsVersionInfo;

    timeBeginPeriod( 1 );
    OsVersionInfo.dwOSVersionInfoSize    = sizeof( OsVersionInfo );
    GetVersionEx ( &OsVersionInfo );
    TimerGet    = ( OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) ? GetTickCount : timeGetTime;
}
//--------------------------------------
void TimerRelease( void )
{
    timeEndPeriod( 1 );
}
//--------------------------------------
void TimerWait( void )
{
    static DWORD    Back    = 0;
    DWORD            Wait;

    if( ( Wait = TimerGet( ) - Back ) < WAIT_TIME )
        Sleep( WAIT_TIME - Wait );

    Wait    = TimerGet( ) - Back;
    Back    += Wait - ( Wait % WAIT_TIME );
}
//--------------------------------------
void main( void )
{
    DWORD            Now, Old, List[LIST_MAX];
    int                Count;

    // 初期化
    TimerCreate( );
    Count    = 0;
    Old        = 0;

    // メイン処理ループ
    while( Count < LIST_MAX )
    {
        TimerWait( );

        // メイン処理
        List[Count++]    = ( Now = TimerGet( ) ) - Old;
        Old    = Now;
    }

    for( Count = 0 ; Count < LIST_MAX ; Count++ )
        printf( "%d\n", List[Count] );

    TimerRelease( );
}

取り合えず完成か?

いや!

完成したことにしよう!

98では、これでいい感じに動くんだもん!

…。

でも、2Kだといい感じに動いてくれない…。

…。

「Sleep」のタイマーは、「GetTickCount」を
ベースにしているらしく2Kだと
精度が出ない…。

と言うことで以下のように修正することで
解決するのだが…。

//--------------------------------------
void TimerWait( void )
{
    static DWORD    Back    = 0;
    DWORD            Wait;

    while( ( TimerGet( ) - Back ) < WAIT_TIME )
        Sleep( 0 );

    Wait    = TimerGet( ) - Back;
    Back    += Wait - ( Wait % WAIT_TIME );
}

だが、これはこれで問題がある。

「プロセッサ使用率」が100%に
なってしまうのだ…。

「Sleep」が入れてあるので
他のプロセスやスレッドが十分に
実行できるのだが…。

と言うことで気にしないというのも手だ!

ゲームなんかは、これで良いんじゃない?

でも、長時間実行する計測する処理の場合には
ちょっとまずいかな?

2Kでも精度がでる「Sleep」を
自作しないとならないのかぁ…。

そいつは、気が向いたらと言うことで…。

…。

はあ、疲れた…。

お休みなさい…。

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

2005年8月17日 (水)

タイマーをOS毎に切りかえるには!

なんで、OS毎に処理違うんかね…?

OS毎に処理を変えなくちゃならんじゃん!

はあ~~。

まあ、こんな感じでやりゃ-良いのか?

DWORD ( WINAPI* TimerGet )( void );
//--------------------------------------
void TimerCreate( void )
{
    OSVERSIONINFO    OsVersionInfo;

    OsVersionInfo.dwOSVersionInfoSize    = sizeof( OsVersionInfo );
    GetVersionEx ( &OsVersionInfo );
    TimerGet    = ( OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) ? GetTickCount : timeGetTime;
}

たぶん、これで良いんでない?

これで良いんだよ!

動くんだから!

て事で…。

最近疲れているなぁ~。

温泉でも行こう!

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

2005年8月13日 (土)

タイマーAPIの処理時間を計測すると…

前回の結果から
「QueryPerformanceCounter」が
最も正確なようだ。

桁違いの精度が、素晴らしい!

しかし処理時間は、どうだ?

あんまり処理時間が掛かり過ぎると
メインを圧迫するし…。

ということでこれらの処理に
どの程度の処理時間が
掛かるか調べてみた。

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <StdIo.h>
#include    <Windows.h>
//--------------------------------------
#define        COUNT_MAX    1000000
//--------------------------------------
double    Value;
DWORD    TimerData;
//--------------------------------------
//    比較用のダミータイマー関数
DWORD DummyTimer( void )
{
    return TimerData;
}
//--------------------------------------
void TimerCheck( void )
{
    LPSTR        Format    = "結果:%f (%s)\n";
    MMTIME        mmTime;
    int            i;
    LARGE_INTEGER    Start, End;
    LARGE_INTEGER    Frequency, PerformanceCount;
    DWORD            Count;

    QueryPerformanceCounter( &Start );
    for( i = 0 ; i < COUNT_MAX ; i++ )
        GetTickCount( );
    QueryPerformanceCounter( &End );
    printf( Format, ( End.QuadPart - Start.QuadPart ) / Value, "GetTickCount" );

    QueryPerformanceCounter( &Start );
    for( i = 0 ; i < COUNT_MAX ; i++ )
        timeGetTime( );
    QueryPerformanceCounter( &End );
    printf( Format, ( End.QuadPart - Start.QuadPart ) / Value, "timeGetTime" );

    QueryPerformanceCounter( &Start );
    for( i = 0 ; i < COUNT_MAX ; i++ )
        timeGetSystemTime( &mmTime, sizeof( mmTime ) );
    QueryPerformanceCounter( &End );
    printf( Format, ( End.QuadPart - Start.QuadPart ) / Value, "timeGetSystemTime" );

    QueryPerformanceFrequency( &Frequency );
    QueryPerformanceCounter( &Start );
    for( i = 0 ; i < COUNT_MAX ; i++ )
    {
        QueryPerformanceCounter( &PerformanceCount );
        Count    = ( DWORD )( PerformanceCount.QuadPart / Frequency.QuadPart );
    }
    QueryPerformanceCounter( &End );
    printf( Format, ( End.QuadPart - Start.QuadPart ) / Value, "QueryPerformanceCounter" );

    QueryPerformanceCounter( &Start );
    for( i = 0 ; i < COUNT_MAX ; i++ )
        DummyTimer( );
    QueryPerformanceCounter( &End );
    printf( Format, ( End.QuadPart - Start.QuadPart ) / Value, "DummyTimer" );
}
//--------------------------------------
void main( void )
{
#if 1    // 禁断の魔法
    HANDLE            Handle;
    Handle = OpenProcess( PROCESS_SET_INFORMATION, TRUE, GetCurrentProcessId( ) );
    SetPriorityClass( Handle, REALTIME_PRIORITY_CLASS );
    CloseHandle( Handle );
#endif

    LARGE_INTEGER    Frequency;

    QueryPerformanceFrequency( &Frequency );
    Value    = ( double )Frequency.QuadPart / 1000.0;

    // 何にもしないで実行すると…
    TimerCheck( );

    // でも、こうすると…
    // 何かに影響があるかもかも…
    timeBeginPeriod( 1 );
    TimerCheck( );
    timeEndPeriod( 1 );
}

前回、98と2Kでやったら
衝撃の結果が出たので
今回もやってみた…。

またもや衝撃の事実が!

次回!
「何でこんなに違う!98×2K」を
お送りします。

遊びは、置いといて…。

…。

参考までに実行した環境…。
PⅢ:1.3GHz:ソケット370

そこ『古!』言うなぁ!
うちじゃあ現役なんだから…。
ぷんすかぷん!

…。

さて、結果は…

98だと…

結果:  20.519955 (GetTickCount)
結果:3805.556580 (timeGetTime)
結果:3734.357767 (timeGetSystemTime)
結果:3429.589836 (QueryPerformanceCounter)
結果:   5.480313 (DummyTimer)

「timeBeginPeriod」を実行すると…

結果:  20.294507 (GetTickCount)
結果:3805.761914 (timeGetTime)
結果:3745.090431 (timeGetSystemTime)
結果:3439.929432 (QueryPerformanceCounter)
結果:   5.495399 (DummyTimer)

2Kだと…

結果:   7.154541 (GetTickCount)
結果:  73.100073 (timeGetTime)
結果: 125.352524 (timeGetSystemTime)
結果:1135.006265 (QueryPerformanceCounter)
結果:   5.460191 (DummyTimer)

「timeBeginPeriod」を実行すると…

結果:   6.998934 (GetTickCount)
結果:  73.548454 (timeGetTime)
結果: 125.933045 (timeGetSystemTime)
結果:1140.625135 (QueryPerformanceCounter)
結果:   5.470248 (DummyTimer)

「timeBeginPeriod」の影響は、
殆んど無いようだ…。

精度向上による処理時間の
変動は、関係無いと言えるかな…。

しかし、「GetTickCount」は
光ってんなぁ・・・。

ぶっちぎりの速さだ!

2Kに至っては、
ダミー関数に迫ってるし…!

まあヘルプにも「GetTickCount」は
メモリーを参照すると書いてあるので
多分最速?

結果から結局
「QueryPerformanceCounter」は、
桁違いに正確で桁違いに重い…。


まあ処理は、速いことに越したことはないので…

98の場合には、
「GetTickCount」と
「timeBeginPeriod」の

セットがお得。


2Kなら
「timeGetTime」と
「timeBeginPeriod」の

セットがお買い得だろう…。

備考…。

・その1
2Kの
「timeGetSystemTime」は、
「timeGetTime」を元にしているので
構造体に変換している分がネックになって
遅くなっているそうだ…。
(ヘルプから…。)、

・その2
98の
「timeGetTime」
「timeGetSystemTime」
「QueryPerformanceCounter」
は、ほぼ同じとは…。

多分…多分ですよ…
I/Oポートに律儀に
アクセスしているのでは?

I/Oアクセスは、重い…
つまりレスポンスが悪い…
要するに遅い!

と言う事だろうと思われる…。

…。

今回は、ここまで!

ああ、知恵熱が…。

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

2005年8月11日 (木)

タイマーAPIの精度は、どんなもん?

時間制御を行うには、
以下のAPIの
どれかを利用する。

多分…。

・GetTickCount
・timeGetTime
・timeGetSystemTime
・QueryPerformanceCounter

さて、これらの関数は、
どの程度の精度なんだろうか?

と言う事で調べてみた。

※「timeGetSystemTime」は、「timeGetSystemTime」の
ラッパーなので変換のオーバーヘッドが有るとヘルプには
書いてあるが、サンプルに使っていたので列挙!

※以下のソースは、拡張子を「cpp」に
しないとヘッダーでエラーが出るぞ!

無論!ボケも引っかかった!<エッヘン!

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <StdIo.h>
#include    <Windows.h>
//--------------------------------------
#define        COUNT_MAX    20
//--------------------------------------
void TimeFunction( void )
{
    DWORD        List[COUNT_MAX];
    DWORD        Time, Now, Count;
    MMTIME        mmTime;
    int            i;
    LARGE_INTEGER    PerformanceCount, Frequency;

    Time    = GetTickCount( );
    Count    = 0;
    do
    {
        if( Time != ( Now = GetTickCount( ) ) )
            Time    = List[Count++]    = Now;
    } while( Count < COUNT_MAX );
    printf( "\n■GetTickCount\n" );
    for( i = 0 ; i < COUNT_MAX - 1 ; i++ )
        printf( "%d : %2d\n", List[i], List[i + 1] - List[i] );

    Time    = timeGetTime( );
    Count    = 0;
    do
    {
        if( Time != ( Now = timeGetTime( ) ) )
            Time    = List[Count++]    = Now;
    } while( Count < COUNT_MAX );
    printf( "\n■timeGetTime\n" );
    for( i = 0 ; i < COUNT_MAX - 1 ; i++ )
        printf( "%d : %2d\n", List[i], List[i + 1] - List[i] );

    ZeroMemory( &mmTime, sizeof( mmTime ) );
    mmTime.wType    = TIME_TICKS;
    timeGetSystemTime( &mmTime, sizeof( mmTime ) );
    Count    = 0;
    do
    {
        timeGetSystemTime( &mmTime, sizeof( mmTime ) );
        if( Time != mmTime.u.ticks )
            Time    = List[Count++]    = mmTime.u.ticks;
    } while( Count < COUNT_MAX );
    printf( "\n■timeGetSystemTime\n" );
    for( i = 0 ; i < COUNT_MAX - 1 ; i++ )
        printf( "%d : %2d\n", List[i], List[i + 1] - List[i] );

    QueryPerformanceFrequency( &Frequency );
    Frequency.QuadPart    = Frequency.QuadPart / 1000;
    QueryPerformanceCounter( &PerformanceCount );
    Time    = ( DWORD )( PerformanceCount.QuadPart / Frequency.QuadPart );
    Count    = 0;
    do
    {
        QueryPerformanceCounter( &PerformanceCount );
        Now    = ( DWORD )( PerformanceCount.QuadPart / Frequency.QuadPart );
        if( Time != Now )
            Time    = List[Count++]    = Now;
    } while( Count < COUNT_MAX );
    printf( "\n■QueryPerformanceCounter\n" );
    for( i = 0 ; i < COUNT_MAX - 1 ; i++ )
        printf( "%d : %2d\n", List[i], List[i + 1] - List[i] );

    Time    = ( DWORD )PerformanceCount.QuadPart;
    Count    = 0;
    do
    {
        QueryPerformanceCounter( &PerformanceCount );
        Now    = ( DWORD )PerformanceCount.QuadPart & 0xFFFFF;
        if( Time != Now )
            Time    = List[Count++]    = Now;
    } while( Count < COUNT_MAX );
    printf( "\n■QueryPerformanceCounter(Special!:/%d)\n", ( DWORD )Frequency.QuadPart );
    for( i = 0 ; i < COUNT_MAX - 1 ; i++ )
        printf( "%d : %2d\n", List[i], List[i + 1] - List[i] );
}
//--------------------------------------
void main( void )
{
#if 0    // 禁断の魔法
    HANDLE            Handle;
    Handle = OpenProcess( PROCESS_SET_INFORMATION, TRUE, GetCurrentProcessId( ) );
    SetPriorityClass( Handle, REALTIME_PRIORITY_CLASS );
    CloseHandle( Handle );
#endif

    // 何にもしないで実行すると…
    TimeFunction( );

    // でも、こうすると…
    // 何かに影響があるかもかも…
    timeBeginPeriod( 1 );
    TimeFunction( );
    timeEndPeriod( 1 );
}

取り合えず動くから
良しとしとしよう…。

他の人の所だと
挙動が違うかも…。

でも、気にしないぞ!

試しに98と2Kでも
やってみる…。

すると驚くべき結果が!
こんなことが有って良いのか!
研究チームは、急遽ゲ○ツに
緊急取材を申し込んだ!

と、言うぐらいの
踊るべき事実が!

そう、踊るしかないぐらいの
衝撃が脳みそに刺さったのだ!

煽りは、置いといて…。

98だと…

 API          :精度(ミリセック)

・GetTickCount       :5
・timeGetTime        :1
・timeGetSystemTime     :1
・QueryPerformanceCounter  :1
・QueryPerformanceCounter(s):0.001

「timeBeginPeriod」を実行すると…

・GetTickCount       :1
・timeGetTime        :1
・timeGetSystemTime     :1
・QueryPerformanceCounter  :1
・QueryPerformanceCounter(s):0.001

2Kだと…

 API          :精度(ミリセック)

・GetTickCount       :10
・timeGetTime        :10
・timeGetSystemTime     :10
・QueryPerformanceCounter  :10
・QueryPerformanceCounter(s):0.001

「timeBeginPeriod」を実行すると…

・GetTickCount       :10
・timeGetTime        :1
・timeGetSystemTime     :1
・QueryPerformanceCounter  :1
・QueryPerformanceCounter(s):0.001

があぁぁぁん!

OSによって違うやん!

何処かのHPに
「timeBeginPeriod」を実行すると…
『「GetTickCount」の精度が上がる!』
とか…
『上がらんわい!嘘書くな!ボケ!』
とか…
書いてあったのは、
OSで挙動が違うからかぁ!

(納得)

同じ物なのに結果が違うのは…
勘弁して…>どっかの偉い人

とまあ、同じ物でも
OSによって挙動が異なるのを
プログラマーは、
血の涙を流しながら
何とかしている…

かもしれない…。

このようにして
第一歩から
けつまずくのであった!

所で…

出力結果中に
いきなり+10とかなるのは
そのタイミングで割り込みが
入ってしまっているため
なのだが…。

プリエンプティブマルチタスク
ちゅうのは、
基本的に割り込みの塊で
成り立っているので…

割り込み禁止は、
○○ちゃんに張り扇チョップ
食らうぐらいの大罪じゃ!

でも、割り込み禁止に近い
効果を組み込んであるので
「禁断の魔法」を有効に
してみよう。

出力のばらつきがなくなるぞ!

多分…。

ああ…。
なんか硬いぞ今回!

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

2005年8月10日 (水)

衆院解散!感動した!

衆院解散…。

どおせお茶を濁して
解散しないだろうと
思いきや…

素晴らしい!

感動した!

良くぞやってくれた!

反対者は、
解散なんかしないだろうと
高を括っていたらホントに
解散しちゃった…。
どうしよう…?
てか?

今まで自民党に
投票した事は無かったが…

自民党に期待!

今回は、自民党に
投票しようと思う!

逆に今まで民主党に
投票していたが、
今回何にもしなかった

民主党に失望!

岡田代表「政権とれなければ辞任」だなんて
言って大丈夫?やばくない?

実際に順次
改革を行っているし
がんばって改革を
進めて欲しい。

改革途中だし…。

そして、個人的には…

国会議員を100人ぐらいに
減らして欲しいんだけどね…。


議員年金もね…

これだけで、どれだけ
支出が減ることやら…?

ねえ?

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

2005年8月 4日 (木)

ネタは、タイマー?

一定時間毎に処理を行いたい…。

簡単そうだが…

これが難しい!

本当だよ…。

※ウインドウズではね。

いまだに『これだ!』という
処理を見かけたことが無い…。

本当は、有るのかもしれないが…。

見たことが無いので
無いものとしよう…。<いいのかなぁ?

と言うことで

お題は、『タイマー』だ!

ボケが何処まで迫れるか…

こうご期待…。

…て、
ぜんぜん迫れないかもしれないけど
その時には、勘弁ね…。

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

« 2005年7月 | トップページ | 2005年9月 »