« 2006年1月 | トップページ | 2006年3月 »

2006年2月28日 (火)

電気用品安全法PSEて何?

初めで聞いた時
「『MSX』が買えなくなるんだ!」
だった…。

PSE法で大変な事が起こる?
中古家電、もう売れない? 電気用品安全法が猶予切れ
「ソフマップ」の買取のお知らせ

そこで、経済産業省のHPに行くと
「電気用品取締法(旧法)が電気用品安全法(新法)に改正され…」
つまり、あの▽と〒が合体したマークが(PSE)になると書いてある。

経過措置の 終了に伴う電気用品の取扱いに関して

20060227-1 20060227-2

これこれ。▽と〒が合体したマーク。

問題は、旧法認可が新法に継続されない事。
継続されれば緩やかに入れ替わっていくのに…。

「つまり、PSEマークがない製品でも、旧法に適合していれば、
安全性は国によって担保されていることになる。
それでも旧法時代の製品の販売を禁止するのは、

「市場にいろいろなマークの製品が混在するのは好ましくない」
(経産省)ためだという。」

「名機」が販売禁止に 4月に迫る「電気用品安全法」

と言うのであれば、(PSE)シールを用意して、
▽〒の上に張れば良いんじゃない?


そうすれば、ここまで来なかったのに…。

「音楽の発展に支障」 坂本龍一氏らがPSE法緩和を求め署名活動

20060227-3    
20060227-4
既に300円程のタップにも付いている。
※ネタの為だけに買いました。現在使用方法検討中…。

だいたい、PSE法なんてメーカに対しての法律じゃん!
普通の人が知らないのは、当然じゃない?

PSE法「知らない」は65%

こんなことが無ければ、▽〒が何かなんて…
ええ、知りもしませんでしたとも…。

取り敢えず、このコラムが分かり易いのでお勧め。
電気用品安全法は「新たなる敵」か (Side A)
電気用品安全法は「新たなる敵」か(Side B)

初めて聞いた時に一緒にお祭りしなくて良かった…。
ただ、認可が継続されないなんて
突っ込みたくなる所は、あるが…。

救いは、『MSX』は、PCだからセーフのようだ…
ぐらいかも…(?)。<え?やっぱだめ?

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

2006年2月27日 (月)

テンプレートを換えてみました…

子猫も飽きたので『スペース』と言う
テンプレートにしたら…


『背景が黒いのは、見にくい!』
との電波がノー味噌に刺さりました…。

…。

と、言う訳でちょいと前の『ケロロ軍曹』に…。
そしたら、タイトル絵が映画宣伝版に変わっている。

ならば!バッチリ、映画宣伝に協力!

超劇場版『ケロロ軍曹』
3月11日(土曜日)より全国ロードショウ

DS Liteカラー版2機種
3月11日(土曜日)より全国発売!

ついでに動員にも協力予定…。<あくまでも予定ですが…。
ついでに購入予定…。<買えれば…。

…。


次は、キティちゃんにでもするか…。
※なんとなく…。深い意味は、多分無い…。

と、何気に見ていたら…

『サンリオ村』
なるものを発見!

サンリオキャラクター勢ぞろいで

『無料』!
美味しい…
美味し過ぎる…。

どのぐらい美味しいかと言うと
『ハローキティ遊園地』
が525円(税込)するのだ!

まさに

リッチテンプレート』!

プァ~なボケには、敷居が高い。

そんな、プァ~なボケに
『サンリオ村』
は、まさにうってつけ!

早速ボケのブログテンプレートに
登録しました。


『サンリオ村』の出番は近い!
…かもしれない…。

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

2006年2月26日 (日)

DS Lite …買えそうも無いじゃん!

買う気満万だったが…

それが、実に激ムズイ事に
ひしひしと気付いて来た…。

23日の新宿…

ソフマップの予約受付を
友人にチェックしてもらったら
終了との事…。

でも、25日にさくらやが予約受付を
行う情報をゲット!

その時、
『ただ開店2時間前くらいまでにはいかないと
売り切れちゃう予感がしますね。』

とアドバイスを受けた…。
彼はDSユーザーなので情報通。
しかも、PSPを徹夜で購入の剛の者!

が、
『たかがゲーム機如きにそこまでやるか!』
とか、思っていた。

で、当日寝坊し9時に着いた。

20060226

ここに至ってようやく
『購入は、激ムズだと!』
気が付く…。

予約券を手に入れるために
徹夜も覚悟しなくては…。

でも、でもだよ!

任天堂、「ニンテンドーDS カンファレンス! 2006.春」で
好調なDSの今後について岩田社長語る
「年内のできるだけ早い時期に1,000万台の普及を達成したい」


600万台だよ600万台!

いい加減行き渡っているだろ!
何で品薄なんだよぉ!

「DS Lite」一部発売延期に 任天堂

しかも、品薄に拍車!

ネットでも、新品無いし!
中古でもプレミア価格(?)で定価以上!
投資目的で買占めしてねーか!

既にカウントダウン状態
果たして買えるか?
ニンテンドーDS Lite!

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

2006年2月25日 (土)

『脆弱性』を利用したルート権限の乗っ取りって?

良く言われている
「『脆弱性』を利用してルート権限を横取りする」
バッファーオーバーフローって
どうやったら出来るのだろう…?

と言う訳で作ってみた。

※この表現は、多分に誤解されるなぁ…。

#include <stdio.h>
#include <stdarg.h>
void test(char*format,...)
{
    va_list Args;
    char buffer[8];
    va_start(Args,format);
    vsprintf(buffer,format,Args);
    printf(buffer);
}
void weak(void)
{
    printf("weak");
    _asm pop eax
}
char string[8+4]="12345678";
void main(void)
{
    *(long*)(string+8)=(long)weak;
    test(string);
}

リリースモードでコンバートしないと正常に?
いや、目的通りの動作をしないよ。


デバッグモードでは、オート変数のメモリー確保が
異なるので…正常に動作してしまう。

正常に動作するのが…実は、バグ…。(笑

出力結果

123456780@weak

バッファーオーバーフローで
リターンアドレスを書き換えて
「weak」を実行している!


成功だ!

邦画ならここで

「やりましたね!博士!」
とか言われるのだが…。

※美人な助手から言われたい…。

…妄想は、置いといて…。

で、以下の条件が有る関数が
バッファーオーバーフローの脆弱性を
持つ事が分かった。


・入力バイト数が可変である。
 (主に文字操作を行う関数になるでしょう…。)


・入力を受け取るバッファーがオート変数である。
 (スタック上に無いとリターンアドレスを書き換えられなからねぇ…。)


・バッファーオーバーフローのチェックを行わない。
 (※まあ、これが『脆弱』さ…ですなぁ。)

所で、『脆弱性』ってどうやって調べているのだろうか?
さぞかし、凄腕のプログラマーが
調べているとのかと思いきや…
誰にでも出来る!
のだ…。

例えば、HPで文字入力が可能な所に
1万文字とか1000万文字とかを放り込み
ハングアップしたら、そこが『脆弱』だ!


ね、誰にでも出来るでしょ!

ただ、実際にこのやり方でルート権限を取る場合には
入力データを細工するために色々知っている必要がある…。

それこそ、凄腕のプログラマーが作っているのでは?

取り敢えず疑問が晴れたので良しとする!

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

2006年2月24日 (金)

脆弱性…て?

良く耳にする『脆弱性』…。

「○○に深刻な脆弱性」
など良く目にする。

この脆弱性をプログラムで書くと…
こんな感じ…。

※便利なので使っていたらバグりました…。

void debug_print(char*format,...)
{
    va_list Args;
    char buffer[64];/* <<実際には512とかにしてあった…。*/
    va_start(Args,format);
    vsprintf(buffer,format,Args);
    OutputDebugString(buffer);
}

これの何処が脆弱かと言うと…
64バイト以上の入力があると、
ワークをオーバーして書き込んでしまう。

当然リターンアドレス等を破壊する…。

すると…
プログラムカウンタたんが
何処かに迷われてしまいます…。

(「たん」付けると萌える!…かも…

そこで、入力オーバーに対処したのがこれ。

void debug_print(char*format,...)
{
    va_list Args;
    char buffer[64];
    va_start(Args,format);
    _vsnprintf(buffer,sizeof(buffer)-1,format,Args);
    buffer[sizeof(buffer)-1]=0;
    OutputDebugString(buffer);
}

でも、厳密には脆弱性を残している…。

オーバー時に2バイト文字をぶった切った場合
「0x8200」とかのコードになる…。

こんな時、2バイト文字の1文字と
判断する可能性がある。
すると、文字列のエンドコードを求めて
何処までも処理が突き進み…
最悪な何かが起こるかもしれない…。

※「OutputDebugString」は、終了してくれるが
自前の処理は、その限りじゃぁないからねぇ…。

で2バイト文字も考慮するとこうなる。

void debug_print(char*format,...)
{
    va_list Args;
    char buffer[64];
    va_start(Args,format);
    _vsnprintf(buffer,sizeof(buffer)-2,format,Args);
    buffer[sizeof(buffer)-2]=0;
    buffer[sizeof(buffer)-1]=0;
    OutputDebugString(buffer);
}

実際に最初の処理で例外が発生することは、
無かったのだが…

エラー時のエラー表示内で例外が発生して
『およおよ…。どこがおかしいんだ?』
とちょぃっと悩まされた…。

エラー処理に脆弱性が有ったらまずいよね…。
でも、以外にバグがあるものなのだ…。

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

2006年2月23日 (木)

「switch&case」の最適化は?

この前のバグは、
「switch&case」の最適化の結果だが…

実際は、どうチェックしているか
気になったので調べてみた…。

サンプルは、以下の通り。

----------------------------------------
int count;
void test1(int index)
{
    switch(index)
    {
    case 0:count=0;break;
    case 1:count=1;break;
    case 2:count=2;break;
    case 3:count=3;break;
    }
}
void test2(int index)
{
    switch(index)
    {
    case -1:count=-1;break;
    case 0:count=0;break;
    case 1:count=1;break;
    case 2:count=2;break;
    }
}
void test3(int index)
{
    switch(index)
    {
    case 1:count=1;break;
    case 2:count=2;break;
    case 3:count=3;break;
    case 4:count=4;break;
    }
}
void test4(int index)
{
    switch(index)
    {
    case 0:count=0;break;
    case 10:count=10;break;
    case 100:count=100;break;
    case 1000:count=1000;break;
    }
}
void main(void)
{
    test1(-1);
    test2(1);
    test3(2);
    test4(10);
}
----------------------------------------

実際に実行される状態。

----------------------------------------
1:    int count;
2:    void test1(int index)
3:    {
00401000   mov         eax,dword ptr [esp+4]
00401004   cmp         eax,3
00401007   ja          $L98+0Ah (0040103b)
00401009   jmp         dword ptr [eax*4+40103Ch]
4:        switch(index)
5:        {
6:        case 0:count=0;break;
00401010   mov         dword ptr [_count (00406428)],0
0040101A   ret
7:        case 1:count=1;break;
0040101B   mov         dword ptr [_count (00406428)],1
00401025   ret
8:        case 2:count=2;break;
00401026   mov         dword ptr [_count (00406428)],2
00401030   ret
9:        case 3:count=3;break;
00401031   mov         dword ptr [_count (00406428)],3
10:       }
11:   }
0040103B   ret
--------------------
12:   void test2(int index)
13:   {
00401050   mov         eax,dword ptr [esp+4]
00401054   inc         eax
00401055   cmp         eax,3
00401058   ja          $L110+0Ah (0040108c)
0040105A   jmp         dword ptr [eax*4+401090h]
14:       switch(index)
15:       {
16:       case -1:count=-1;break;
00401061   mov         dword ptr [_count (00406428)],0FFFFFFFFh
0040106B   ret
17:       case 0:count=0;break;
0040106C   mov         dword ptr [_count (00406428)],0
00401076   ret
18:       case 1:count=1;break;
00401077   mov         dword ptr [_count (00406428)],1
00401081   ret
19:       case 2:count=2;break;
00401082   mov         dword ptr [_count (00406428)],2
20:       }
21:   }
0040108C   ret
--------------------
22:   void test3(int index)
23:   {
004010A0   mov         eax,dword ptr [esp+4]
004010A4   dec         eax
004010A5   cmp         eax,3
004010A8   ja          $L122+0Ah (004010dc)
004010AA   jmp         dword ptr [eax*4+4010E0h]
24:       switch(index)
25:       {
26:       case 1:count=1;break;
004010B1   mov         dword ptr [_count (00406428)],1
004010BB   ret
27:       case 2:count=2;break;
004010BC   mov         dword ptr [_count (00406428)],2
004010C6   ret
28:       case 3:count=3;break;
004010C7   mov         dword ptr [_count (00406428)],3
004010D1   ret
29:       case 4:count=4;break;
004010D2   mov         dword ptr [_count (00406428)],4
30:       }
31:   }
004010DC   ret
--------------------
32:   void test4(int index)
33:   {
004010F0   mov         eax,dword ptr [esp+4]
004010F4   cmp         eax,64h
004010F7   jg          test4+30h (00401120)
004010F9   je          test4+25h (00401115)
004010FB   test        eax,eax
004010FD   je          test4+1Ah (0040110a)
004010FF   cmp         eax,0Ah
00401102   jne         test4+3Ch (0040112c)
37:       case 10:count=10;break;
00401104   mov         [_count (00406428)],eax
00401109   ret
36:       case 0:count=0;break;
0040110A   mov         dword ptr [_count (00406428)],0
00401114   ret
38:       case 100:count=100;break;
00401115   mov         dword ptr [_count (00406428)],64h
0040111F   ret
00401120   cmp         eax,3E8h
00401125   jne         test4+3Ch (0040112c)
39:       case 1000:count=1000;break;
00401127   mov         [_count (00406428)],eax
40:       }
41:   }
0040112C   ret
--------------------
42:   void main(void)
43:   {
00401130   push        0FFh
00401132   call        test1 (00401000)
44:       test1(-1);
45:       test2(1);
00401137   push        1
00401139   call        test2 (00401050)
46:       test3(2);
0040113E   push        2
00401140   call        test3 (004010a0)
47:       test4(10);
00401145   push        0Ah
00401147   call        test4 (004010f0)
0040114C   add         esp,10h
48:   }
0040114F   ret
----------------------------------------

「test1」では、0~3なので
最初に0~3以外は、排除して
テーブルジャンプしている…。

「test2」では、-1~2なので
最初に+1して0~3以外は、排除して
テーブルジャンプしている…。

「test3」では、1~4なので
最初に-1して0~3以外は、排除して
テーブルジャンプしている…。

「test4」では、テーブルジャンプできないので
個別にチェックしているのだが…
最初に100分で岐分岐して…
どの項目にも最も高速に
到達で切るように細工してある…。

実感…
良く出来ている…。

最適化…
恐るべし…。

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

2006年2月22日 (水)

プレイステーション3は、発売されるか?

「PS3、今春発売」への疑問符

これによると
『PS3が使用する技術の一部仕様が
業界コンソーシアムの決定待ち。』
との事。

ちょっと不思議…。

と言うのは、ゲーム機の仕様は、
閉じた世界なので独自規格物で
通すことが有る。

ただし、この場合

コストダウンがしにくい。

と言う事で、現時点でのコスト高が
PS3の最大のネックになっている
ようだと推測される。

流石に最新技術の塊とは言え
おもちゃだからねぇ~。

まあ、アイボがありますが…。(笑

IBM、現行プロセッサ製造法の延命方法を発見

これが、CPUのコストダウンに
つながると助かるかも…。<一番高い部品だし。

果たして!

クリスマス商戦に間に合うか?
まで行くかも…。

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

2006年2月21日 (火)

プレイステーション3は、受け入れられるか?

PS3のコストはいくら?

これによると、
発表時のコストは、1台9万円ぐらいだが
3年後には3万2千円ぐらいになるとの予想。

もっとも高いのがCPUとBlu-rayだが…
量産等で劇的に安くなるのもこの二つだそうだ。

XBOX360が3万7千円程…。
従ってPS3も、間違い無くその辺りになると

ボケは、思っているのだが…。

今年中に発売されるか微妙~。
CPUとBlu-rayの2つが
・量産できるか
・コストがXBOXに対抗できるか
両方満たせないと発売できないんじゃあ…。

PS3が5万円じゃあ
ボケは、買わないだろうし…。
3万台がボーダーかなぁ?

正直XBOX360が
七転八倒しているので助かっているか?

※七転八起では、無い。

だからと言ってPS3が
XBOX360の転倒に
巻き込まれないとも限らない…。

華麗にテイクオフできるか?

出来ないとSONYがコケルぞ…。<書いて怖いぞ…。

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

2006年2月19日 (日)

XBOX360の明日は、どうなる!

日本国内のXBOX360の販売台数…

11万5000台(2月5日現在)…。

で、『米MS、Xbox日本担当役員入れ替え  販売てこ入れか』てか?

ゲームソフト販売本数ランキング TOP30
集計期間:2006年1月30日~2006年2月5日)
『…えいご漬け』9万1429本(累計32万3199本)
『おいでよ どうぶつの森』6万9401本(累計180万8869本)

既に終わっていませんか?
…って、終わっていますよね?

起死回生なるかマイクロソフト…。

だからってプレイステーション3が成功する…
と言う訳でも無い…。

PS2に負けるかも…。

最終的にPSPとDSが勝ったりして…。

で、何故か…
物欲全開で『 ニンテンドーDS Lite』欲しくなった…。

買います!
見せびらかす為に…!

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

2006年2月18日 (土)

最適化に喰らいました!

デバッグ版で動作しているのに…
リリース版でハング?

と言うのは、たまに有る…。

今回のボケが喰らったのは
コンパイラの最適化による
ハングアップ…。

散々調べて結果がこれ…。

2642:             switch( Index )
2643:             {
004335AA   jmp         dword ptr [eax*4+4339E0h]
2644:             case 0: Option.A = TRUE;   break;
004335B1   mov         dword ptr [Option+14h (0048a5f4)],1
004335BB   jmp         $L48839+0Ah (004335eb)
2645:             case 1: Option.A = FALSE;  break;
004335BD   mov         dword ptr [Option+14h (0048a5f4)],0
004335C7   jmp         $L48839+0Ah (004335eb)
2646:             case 2: Option.B = 0;     break;
004335C9   mov         dword ptr [Option+18h (0048a5f8)],0
004335D3   jmp         $L48839+0Ah (004335eb)
2647:             case 3: Option.B = 1;     break;
004335D5   mov         dword ptr [Option+18h (0048a5f8)],1
004335DF   jmp         $L48839+0Ah (004335eb)
2648:             case 4: Option.B = 2;     break;
004335E1   mov         dword ptr [Option+18h (0048a5f8)],2
2649:             }

「Index=-1」の時に何処か遠い所に逝かれます…。<マジ

直前に「if」が有るので、最適化が
「Index=-1」は来ないと判断したのかもしれない…。

実は、それは正しい!

    if( ( Index <= 0 ) && ( Index <= 4 ) )<こんな風に間違え
//    if( ( Index >= 0 ) && ( Index <= 4 ) )<本当は、こう
    {
        switch( Index )
        {
        case 0: Option.A = TRUE;   break;
        case 1: Option.A = FALSE;  break;
        case 2: Option.B = 0;     break;
        case 3: Option.B = 1;     break;
        case 4: Option.B = 2;     break;
        }
        Function( );
    }

直前の判断ミス(バグ)で「Index=-1」が
来てしまった…。

だからって…
逝く事は無いでしょう!

しかし、めったに喰らわないバグなので
早速ネタに使わせてもらいます!

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

2006年2月17日 (金)

プログラムでチェックしよう!

機械的に調べられる物は、
プログラムでチェックしよう!

例えば、括弧の対応とか…。

VC++だと「Ctrl+]」でチェックできるけど
スクリプトや平文上の括弧の抜けが無いか
人力で調べるのは、大変だぉ。<ボケなら気が狂うよ…。

だが、ここで考えてみる…

括弧の対応には、法則性があるので
こいつを利用すれば機械的にチェックができるはず!

ツールが出来れば、その後のデバッグ作業も考えると
有ると無いとでは、大違いだよ!<ホント。

で、ちょっと作ってみる…。
----------------------------------------

#include<stdio.h>
#include<memory.h>
#include<windows.h>
/* ---------------------------------- */
#define BUFFER_SIZE 1000000
#define LIST_MAX (sizeof(list[0])/sizeof(char))
char buffer[BUFFER_SIZE];
char line[BUFFER_SIZE];
int nest_line[BUFFER_SIZE];
char nest_list[BUFFER_SIZE];
char nest_count=0;
int size;
char list[2][3]={"{([","})]",};
int error_count=0;
char *file_name;
FILE *log_file;
/* ---------------------------------- */
char *line_get(int now)
{
    int s,e;
    for(s=now;s>0;s--)
        if(buffer[s]==0x0a)
        {
            s++;
            break;
        }

    for(e=now;e<size;e++)
        if((buffer[e]==0x0a)||(buffer[e]==0x00))
        {
            e--;
            break;
        }

    memcpy(line,&buffer[s],e-s);
    line[e-s]=0;
    return line;
}
/* ---------------------------------- */
int number_get(int now)
{
    int l,i;
    for(l=1,i=0;i<now;i++)
        if(buffer[i]==0x0a)
            l++;
    return l;
}
/* ---------------------------------- */
void error_out(char*string,int now)
{
    fprintf(log_file,"%s(%d):%s:%s\n",file_name,number_get(now),line_get(now),string);
    error_count++;
}
/* ---------------------------------- */
void main(int argc,char *argv[])
{
    char log_name[MAX_PATH],drive[_MAX_DRIVE],directory[_MAX_DIR];
    FILE*f;
    char c;
    int i,j,fs,fe;

    file_name=argv[1];
    f=fopen(file_name,"rb");
    size=fread(buffer,1,BUFFER_SIZE,f);
    fclose(f);

    _splitpath( file_name, drive, directory, NULL, NULL );
    sprintf(log_name,"%s%s括弧.log",drive,directory);
    log_file=fopen(log_name,"w");

    fprintf(log_file,"「%s」の括弧チェックを行います。\n",file_name);

    for(i=0;i<size;i++)
    {
        c=buffer[i];
        if((c==0x0d)||(c==0x0a))
            continue;
        if(IsDBCSLeadByte((unsigned char)c))
        {
            i++;
            continue;
        }

        for(fs=j=0;j<LIST_MAX;j++)
            if(c==list[0][j])
                fs=j+1;

        if(fs)
        {
            nest_line[nest_count]=i;
            nest_list[nest_count++]=fs;
            continue;
        }

        for(fe=j=0;j<LIST_MAX;j++)
            if(c==list[1][j])
                fe=j+1;

        if(fe)
        {
            if(nest_count==0)
            {
                error_out("開始括弧がありません。",i);
            }else if(fe==nest_list[nest_count-1])
            {
                nest_count--;
            }else
            {
                error_out("括弧の対応が有っていません。",i);
                j=nest_line[nest_count-1];
                fprintf(log_file,"%s(%d):%s:※チェック対応ライン(参考用)\n",file_name,number_get(j),line_get(j));
            }
        }
    }

    if(nest_count)
    {
        fprintf(log_file,"%s:閉じ括弧が無い開始括弧が%d個あります。\n",file_name,nest_count);
        error_count++;
    }

    if(error_count)
    {
        fprintf(log_file,"%d個のエラーが見つかりました。\n",error_count);
    }else
    {
        fprintf(log_file,"異常が見つかりませんでしたた。\n");
    }
    fclose(log_file);
}
----------------------------------------

・『{}()[]』の括弧の対応をチェックするよ。
・ウインドウズで上でドラッグアンドドロップで使用するだ。
・結果は、チェックしたファイルのフォルダに「括弧.log」で出力。
・短いからコメント無しよ!

標準関数のエラーは、すっ飛ばしているけど
(※自力で付けてね。)
括弧の対応エラーに関しては、
潤沢な情報が出るようにしてある。


『エラーが有るよ!』とだけじゃあ
何処直して良いか分かんねぇじゃん!

だって、エラーを修正するために
チェックするんだから!

てな訳で、もっと良いチェックが有ったら教えてください。

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

2006年2月12日 (日)

シャッフルするには…?

トランプを切って並べたら
番号がランダムに並ぶ…。

これを実現する処理を
作るにはどうしたら良いか?

ここでは、単純に0~9の数とするよん。

さて、最初のプログラムは、
ボケが、プログラムをやり始めた頃に
組んだボケボケプログラム。


どのぐらいボケかと言うと
殆ど期待通りに動かん…。

----------------------------------------
#include    <stdio.h>
#include    <stdlib.h>
#include    <memory.h>
int        card[10];
void shuffle( void )
{
    int        i;
    for( i = 0 ; i < 10 ; i++ )
        card[i]    = 10 * rand( ) / ( RAND_MAX + 1 );
}
int shuffle_check( void )
{
    int        i, list[10];
    memset( list, 0, sizeof( list ) );
    for( i = 0 ; i < 10 ; i++ )
        list[ card[i] ]++;
    for( i = 0 ; i < 10 ; i++ )
        if( list[i] != 1 )
            return 0;
    return 1;
}
void main( void )
{
    int        i;
    i    = -1;
    srand( 0 );    /*  毎回同じ結果を期待 */
    do
    {
        i++;
        shuffle( );
    } while( !shuffle_check( ) );
    printf( "error count %d!", i );
}
----------------------------------------

約7500回に1回、成立する…。
って、おいおい…!

よくよく考えてみると…。
・丸め誤差
・数値の制限(循環する)
から、まず成功しない…。

つまり、やり方が悪い!
と言う訳で直したのがこれ。

----------------------------------------
#include    <stdio.h>
#include    <stdlib.h>
#include    <memory.h>
int        card[10];
void shuffle( void )
{
    int        i, c, r;
    for( i = 0 ; i < 10 ; i++ )
        card[i]    = i;
    for( i = 0 ; i < 9 ; i++ )
    {
        r    = ( 10 - i ) * rand( ) / ( RAND_MAX + 1 );
        c    = card[i];
        card[i]    = card[r];
        card[r]    = c;
    }
}
int shuffle_check( void )
{
    int        i, list[10];
    memset( list, 0, sizeof( list ) );
    for( i = 0 ; i < 10 ; i++ )
        list[ card[i] ]++;
    for( i = 0 ; i < 10 ; i++ )
        if( list[i] != 1 )
            return 0;
    return 1;
}
void main( void )
{
    srand( 0 );    /*  毎回同じ結果を期待 */
    shuffle( );
    printf( shuffle_check( ) ? "good!" : "error!" );
}
----------------------------------------

見た通り、カードを切る様に
数値をランダムに入れ替えています。

この方法は、麻雀牌を混ぜたりするのに
使えるので覚えて損は、無いが…
ちょっと考えれば気が付くよね…。

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

2006年2月10日 (金)

2.5インチHDDの可能性。

最近2.5HDDが安い!
容量80GBで1万円程。

ボケは、小さい物が好きだ!

で、有ったら良いな…と思うのが
2.5インチHDDのレイド…。

そしたら、こんなのが…

2.5インチ2台のレイドシステムを3.5インチベイに!
R-IDE2S-LE(
\31,920/HDDは、別)

ボケのPCは、ブックサイズなので
3.5インチHDDが一台なのだ…。
まさにうってつけ!

でもRAID 1(ミラーリング)のみ…。
信頼性を優先しているので0は、無し…。

出来れば、5インチベイに
4台ぐらいセットできてレイド5が
組めると嬉しいなぁ…。
USB2.0の外付けでもOK。

どこか出さないかな…。


物欲がふつふつする冬の夜です…。

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

2006年2月 8日 (水)

電話線が切れた…。

ちょっと早めに床に着いて…

PC電源ON!
インターネットGO!

…いつもならすぐ接続できるのに
なかなか接続しない…?


そして…
『接続できません。』とか
『タイムアップしました。』とか
出る…。


ADSLのモデムを見る…
「ADSL:Link/Act」がチカリともしない…
…断線している?

電話の受話器を上げると
『がぁがぁがぁがぁがぁがぁ…』
ノイズが…。

なんと言うことだ…

電話線が死んでいる!



今朝の4時は、元気にアクセスできたのに…?

しばらく諦め悪くいじるが…
回復見込み無いので寝る!

……。

次の日、電話の受話器を上げると
『がぁがぁがぁがぁがぁがぁ…』
ノイズが…。

何時の間にか直っている事を
期待していたが…。

仕方が無いので、NTTに電話する。<もちろん携帯で。

担当者に施設の状態を確認してもらうと
一応良さげとの事…
そうすると、電柱から電話までの間?

担当者に速攻で

『ADSLを使用していますか?』
と聞かれた。

『ADSLのケーブルを抜くと…。』
ADSL絡みのトラブルは、多いんだろうな…。
もちろん、そんなトラブルは、経験済みだ!
でも今回は、違う!

取り敢えず、修理に来てもらう事に。

二時間程してサービスマンが来た。
室内の電話機を確認し調査した結果…
外の保安機辺りをいじって
直して帰っていった…。

近くのガキがボールでもぶつけたのかも知れない…が!
取り敢えず直って良し!

ただ、普段有るインフラが喪失すると恐怖だ。
それだけに、NTTの対応の速さはちょっと安心。

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

2006年2月 6日 (月)

XPって、凄い!

XPって、ウインドウズの事じゃなくて…
 

「エクストリームプログラミング」と言う
プログラム開発手法のことだよん。
 

その中で、「ペアプログラミング」の所では

強いショックを受けた!
 
何が凄いかというと…
 
一つのプログラミングを二人でやるのだが
一人が作業をしている時には、

もう一人はそれを『見ている』のだ!
 

大抵自分の当たり前は、他の人に伝えない。

そう言ったノウハウの伝播は、難しい…。
 
その有効な方法は、見ること。

そして、自分に無いものを発見するしかない。
 
以前CGにグリッド(方眼)を書いて欲しいと
デザイナーに要望したことがあった。
Aさんは、一本一本線を描いて数分…。しかもずれていた…。
Bさんは、ペイントに方眼を登録して一瞬で塗った…。

もちろんずれていない。
 

Bさんの当たり前は、
Aさんの当たり前ではない…。
 

同じ事がプログラマーにも言えると思う…。
多分、全ての業種にも言える事ではないだろうか?

もし出来るのなら、
丸一日同僚の作業を後ろから眺めてみたら?

自分に無い何かを見付けられると思うよ。

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

2006年2月 1日 (水)

妙に勉強になります…。

「mozilla」は、オープンソースで開発されているので
当然ソースの書き方に作法が存在する。

それがこれ。

Mozilla コーディングスタイルガイド


勉強になります…。

自分が結論した手法が、上記のスタイルになっていると
ちょっと偉くなった気になります。<気だけですが…。

たとえば、
『エラーからはすぐにリターンしてください』
は、昔からネストの解体と見通しの良さを考えた結果
『ソウナルヨネ!なんちゃって…。

さらに細かい作法がこれ。

C++ 移植性ガイド


このなかで、禁止事項とその対処方が細かく書かれている。

『一時的にコードの塊を無効にするためにはコメントよりも #if 0 を使う。』
これは、Cのコメント「/* ~ */」についてなのだが、コメントはネストを
判断してくれないので以下のコメントは、破綻している。

#include <stdlib.h>
int main( void )
{
    int a;
    a = 0;
    a = rand( );                /* 乱数 */
/*    a = ( a & 0xff00 ) >> 8;    /* 加工 */
*/    return a;
}

上記のような短いソースなら良いが、数百行なら修正するのも馬鹿らしい。

とか…。

『コンパイラのウォーニングを有効にして、ウォーニングのないコードを書く。』
は、『やれよ!当然だろ!
と思うのだが…。

ともかく、頷く事しきり…。

Cの作法の勉強にお勧めです。

もちろんCの勉強にもなります。

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

« 2006年1月 | トップページ | 2006年3月 »