<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>システム開発</title><link>http://blogs.wankuma.com/jitta/category/409.aspx</link><description>システム開発に関する、設計やデバッグなど</description><managingEditor>はなおか じった</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>はなおか じった</dc:creator><title>サービスを再起動する（フラット）</title><link>http://blogs.wankuma.com/jitta/archive/2008/08/29/154687.aspx</link><pubDate>Fri, 29 Aug 2008 22:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/08/29/154687.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/154687.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/08/29/154687.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/154687.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/154687.aspx</trackback:ping><description>&lt;p class="p"&gt;サービスを再起動させてみます。唐突ですが、そういう必要が生じたので。&lt;/p&gt;
&lt;p class="p"&gt;Visual Studio 2008 にて、C++ の Win32 コンソール アプリケーションです。PSDK API を使うので、C++。&lt;/p&gt;
&lt;p class="p"&gt;説明するのが面倒なので、さくっと行きます。&lt;/p&gt;
&lt;p class="p"&gt;サービスを制御するには、まず、サービス マネージャにアクセスします。このとき、いくつかの特権が必要です。今回は、考えないことにします。&lt;/p&gt;
&lt;p class="p"&gt;「再起動」すなわち、「停止してから起動」というコマンドは、無いようです。そこで、「停止する」というコマンドと、「起動する」というコマンドを発行します。&lt;/p&gt;
&lt;p class="p"&gt;コマンドを発行するには、OpenService 関数で、サービスのハンドラを捕まえ、ControlService 関数を使用します。起動は、StartService 関数です。&lt;/p&gt;
&lt;p class="p"&gt;サービスは、Windows Service を作成したことがある方ならおわかりだと思いますが、起動指示から30秒以内に起動状態にならなければなりません。逆に言うと、起動を指示したからといってすぐに起動するわけではありません。停止も同じ。よって、停止を指示してから、完全に停止するまで待つ必要があります。また、起動も同じく、完全に起動するまで待ちます。待っている間、QueryServiceStatus 関数で現在のステータスを取ります。&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;p&gt;サービス マネージャにアクセスする。&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;指定のサービスにアクセスする。&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;停止信号を送る。&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;停止するまで待つ。&lt;/p&gt;
		&lt;ol&gt;
			&lt;li&gt;&lt;p&gt;状態を見る。&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;&lt;p&gt;SERVICE_STOPPED でなければ1秒待つ。&lt;br&gt;
			SERVICE_STOPPED なら戻る。&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;&lt;p&gt;累積で30秒待っていれば、タイムアウトとする。&lt;br&gt;
			そうでなければ繰り返す。&lt;/p&gt;&lt;/li&gt;
		&lt;/ol&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;起動する。&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;起動するまで待つ。&lt;/p&gt;
		&lt;ol&gt;
			&lt;li&gt;&lt;p&gt;状態を見る。&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;&lt;p&gt;SERVICE_RUNNING でなければ1秒待つ。&lt;br&gt;
			SERVICE_RUNNING なら戻る。&lt;/p&gt;&lt;/li&gt;
			&lt;li&gt;&lt;p&gt;累積で30秒待っていれば、タイムアウトとする。&lt;br&gt;
			そうでなければ繰り返す。&lt;/p&gt;&lt;/li&gt;
		&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="p"&gt;そんなこんなで、次のようなコード。タイトルにカッコがついているのは、これで終われないから。&lt;/p&gt;
&lt;p class="p"&gt;このコードでは、破棄しなければならないリソースを確保したら、次の関数を呼び出す様にしました。これにより、リソースを使うところ＝次の関数内では、何らかのエラーが発生したら遠慮なしに return することができます。なぜこんな作りにしてあるかというと、本当は .c なコードで使っているから（涙）&lt;/p&gt;
&lt;p class="p"&gt;で、こいつを元に、「C++（あるいはオブジェクト指向言語）って、C に比べてこんな利点があるんだよ。」ってことが説明できるかな、と。。。セッション資料作った方が面白いような気もしてきた。&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
// RestartService.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include &amp;lt;locale.h&amp;gt;

DWORD RestartService(LPCTSTR serviceName);
DWORD StopThenStartService(SC_HANDLE manager, LPCTSTR serviceName);
DWORD StopServiceWithWaiting(SC_HANDLE service);
DWORD StartServiceWithWaiting(SC_HANDLE service);
DWORD WaitServiceUntilStatus(SC_HANDLE service, DWORD state, int timeout = 30);

int _tmain(int argc, _TCHAR* argv[])
{
    _tsetlocale(LC_ALL, _T("japanese_japan"));
    if (argc &amp;lt; 2) {
        _putts(_T("引数で、サービス名を指定してください。\n"));
        return ERROR_BAD_ARGUMENTS;
    } else {
        _tprintf(_T("サービス \"%s\" の起動・停止結果 : %d\n")
            , argv[1]
            ,RestartService(argv[1]));
    }
    return 0;
}

// 指定されたサービスを再起動する。
// serviceName : サービス名
DWORD RestartService(LPCTSTR serviceName)
{
    if (serviceName == NULL) { return ERROR_BAD_ARGUMENTS; }

    SC_HANDLE manager;
    manager = OpenSCManager(NULL    /* ローカル コンピュータ */
        , NULL                        /* 規定のマネージャ */
        , SC_MANAGER_CONNECT | SC_MANAGER_ENUMERATE_SERVICE | GENERIC_EXECUTE
        );

    if (manager != NULL) {
        DWORD result;
        result = StopThenStartService(manager, serviceName);
        (void) CloseServiceHandle(manager);
        return result;

    } else {
        return GetLastError();
    }
}

// 指定されたサービスを停止させ、起動する。
// manager : サービス マネージャ
// serviceName : サービス名
DWORD StopThenStartService(SC_HANDLE manager, LPCTSTR serviceName)
{
    if (manager == NULL || serviceName == NULL) { return ERROR_BAD_ARGUMENTS; }

    SC_HANDLE    service;
    service = OpenService(manager, serviceName, GENERIC_EXECUTE | GENERIC_READ);

    if (service != NULL) {
        DWORD result;
        // サービスを停止する
        if ((result = StopServiceWithWaiting(service)) == ERROR_SUCCESS) {
            // サービスを起動する
            result = StartServiceWithWaiting(service);
        }
        (void) CloseServiceHandle(service);
        return result;

    } else {
        return GetLastError();
    }
}

// 指定のサービスを停止させ、停止するまで待つ。
// service : サービスのハンドラ
DWORD StopServiceWithWaiting(SC_HANDLE service)
{
    if (service == NULL) { return ERROR_BAD_ARGUMENTS; }

    SERVICE_STATUS status;
    BOOL ret = ControlService(service, SERVICE_CONTROL_STOP, &amp;status);
    DWORD result = GetLastError();
    if (ret == TRUE || result == ERROR_SERVICE_NOT_ACTIVE) {
        result = WaitServiceUntilStatus(service, SERVICE_STOPPED);
    }
    return result;
}

// 指定のサービスを起動させ、起動するまで待つ。
// service : サービスのハンドラ
DWORD StartServiceWithWaiting(SC_HANDLE service)
{
    if (service == NULL) { return ERROR_BAD_ARGUMENTS; }

    BOOL ret = StartService(service, 0, NULL);
    DWORD result = GetLastError();
    if (ret == TRUE || result == ERROR_SERVICE_ALREADY_RUNNING) {
        result = WaitServiceUntilStatus(service, SERVICE_RUNNING);
    }
    return result;
}

// サービスが、指定の状態になるまで待つ。
// service : サービスのハンドラ
// state : 期待する状態
// timeout : 期待する状態になるまで待機する秒数（既定値 30）
DWORD WaitServiceUntilStatus(SC_HANDLE service, DWORD state, int timeout)
{
    DWORD result;
    SERVICE_STATUS status;
    int count = 0;
    while (TRUE) {
        if (QueryServiceStatus(service, &amp;status)) {
            if (status.dwCurrentState == state) {
                result = ERROR_SUCCESS;
                break;
            }
            if (++count &amp;gt; timeout) {
                result = ERROR_SERVICE_REQUEST_TIMEOUT;
                break;
            }
        } else {
            result = GetLastError();
            break;
        }
        Sleep(1000);
    }
    return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/154687.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>簡単になるのはいいことなのか？</title><link>http://blogs.wankuma.com/jitta/archive/2008/08/18/153413.aspx</link><pubDate>Mon, 18 Aug 2008 22:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/08/18/153413.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/153413.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/08/18/153413.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/153413.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/153413.aspx</trackback:ping><description>&lt;p class="p"&gt;また、書いてみようと思う。&lt;/p&gt;
&lt;p class="p"&gt;LINQ の本を読んでいます。その中で、C# や VB.NET に追加された、ラムダ式、型推論、拡張メソッドといった機能は、LINQ の為に追加された機能で、むやみやたらと使うものではない．．．と、書かれています。&lt;/p&gt;
&lt;p class="p"&gt;確かに、C# の「型推論」“だけ”が取り上げられたときは、VB の様な「何でも型」が C# に取り入れられるのか！？と、物議を醸し出したように思います。&lt;/p&gt;
&lt;p class="p"&gt;しかし、実際には、コンパイラが右辺から左辺の型を推論するもので、“コーディングを簡略化する”という説明が、そのときはされていたように思います。&lt;/p&gt;
&lt;p class="p"&gt;で、実際には、LINQ では、コーディング時にいちいち型を定義しづらい場合があるので、LINQ を実装するために必要な機能だった、ということです。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;で、LINQ。（ここから先、オレ理解）これは、データの塊を扱うときに、“どこにあるデータの塊か”ということを、開発者が意識しなくてもいいようにする仕組みです。LINQ to ほにゃららが、どこにあるのかによって最適な形に、コードを展開します。&lt;/p&gt;
&lt;p class="p"&gt;データベースというと、Oracle, SQL Server, PostgreSQL, MySQL あたりをあげておけばいい？DB2 とか Firebird もあげておく？そんなもんかな？いろいろありまして、SQL99 で標準が決められてはいますが、方言があります。&lt;/p&gt;
&lt;p class="p"&gt;.NET Framework では、System.Data 名前空間に、いくつかのデータベース用のクラスが用意され、いくつかのインターフェイスが定義されています。この、“いくつかの”ってのがくせ者で、使いにくかったのだけど。&lt;/p&gt;
&lt;p class="p"&gt;で、接続先ごとに、それら用のクラスを使い、ビジネス ロジックではインターフェイスを使うようにすると、複数のデータベース システムに対応したシステムが作れます。&lt;/p&gt;
&lt;p class="p"&gt;この方法では、アプリケーション開発者が、SQL のそれぞれの方言を確認し、それぞれにあわせた SQL を組み立て、コーディングします。&lt;span class="comment"&gt;「ストアード プロシージャでやれ」ってのは、置いておく。&lt;/span&gt;&lt;/p&gt;
&lt;p class="p"&gt;対して LINQ では、アダプター提供者が SQL の方言を吸収するため、開発者はどのターゲットに対しても同じコードを書いておけばよい、ということになります。&lt;/p&gt;
&lt;p class="p"&gt;確かに、便利です。簡単です。&lt;/p&gt;
&lt;p class="p"&gt;で、それでいいの？&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;いえ、問いを変えましょう。「本当に、簡単になったの？」&lt;/p&gt;
&lt;br&gt;
&lt;br&gt;
&lt;p class="p"&gt;私は、「いいえ」と思うのです。なぜか。それは、私が「簡単になって欲しい」と思っている対象と、「簡単になる」と言われている対象が違うからです。&lt;/p&gt;
&lt;p class="p"&gt;LINQ によって、“コーディングは”簡単になりました。しかし、顧客の要望をコードにするところは、簡単にはなっていません。そして、コードを書くことよりも、顧客の要望をコードで表すことのほうが、遙かに難しいと思うのです。&lt;/p&gt;
&lt;p class="p"&gt;あるいは、この言葉はあまり好きではありませんが、コードを書くことだけに専念する人をコーダーと呼ぶ場合があります。コーダーの仕事は楽になりますが、仕様書を作る人の仕事が楽になるわけではありません。&lt;span class="comment"&gt;余談：ん～？だからコーダーは安物扱いされるのか？&lt;/span&gt;&lt;/p&gt;
&lt;p class="p"&gt;掲示板などに書き込まれている内容から私が思うのは、仕様書だけを書いている人は、実際に使うものについては無頓着です。何を使おうと、「データベースからデータを参照し、ユーザが編集し、データベースに書き戻す」とだけ書いておけば、自分の仕事は済んだと言わんばかりです&lt;span class="comment"&gt;&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45775&amp;forum=48" title="⇒atmarkit.co.jp" class="outerLink"&gt;一例&lt;/a&gt;&lt;/span&gt;。それによって、実装者がどれほど苦労しているかも知らずに。。。&lt;/p&gt;
&lt;p class="p"&gt;で、実装者の方です。これで、本当に簡単になるのでしょうか。&lt;/p&gt;
&lt;p class="p"&gt;確かに、コードを書くことは軽減されます。しかし、ここで勘違いして欲しくないのは、コードを書くという手作業が軽減されることと、コード化するという頭脳作業が軽減されることは、必ずしも一緒ではない、ということです。&lt;/p&gt;
&lt;p class="p"&gt;LINQ によって、コード化する手作業は軽減するでしょうが、どのようなデータの取得をしなければならないかという頭脳作業については、軽減されていません。&lt;/p&gt;
&lt;p class="p"&gt;それどころか、デバッグの時に、どのコードによってどのようなデータが集まってきているのか、わかりにくくなっているかもしれません（実際に動かしたことはないので未確認）。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;「簡単になる」のは、いいことなのでしょうか。それはいいことなのでしょう。でも、本当に、簡単になっているのでしょうか。“何を”簡単にしたいのか。そこのところが抜け落ちているような気がします。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/153413.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>作る人。売る人。</title><link>http://blogs.wankuma.com/jitta/archive/2008/08/05/151842.aspx</link><pubDate>Tue, 05 Aug 2008 22:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/08/05/151842.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/151842.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/08/05/151842.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/151842.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/151842.aspx</trackback:ping><description>&lt;blockquote&gt;
&lt;p class="quoteSource"&gt;&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45775&amp;forum=48" title="⇒atmarkit.co.jp" class="outerLink"&gt;正規社員にコーディングやプログラミングをやらせる意味はあるか？&lt;/a&gt;（Coding Edge 会議室）より：&lt;/p&gt;
&lt;p&gt;単価の高い正規社員にやらせるとしたらどういう意味があってのことでしょうか？&lt;/p&gt;
&lt;p&gt;コーディングは、孫請け以下がやる作業だというイメージが先行しているのでコーダー（プログラマ？）は、社会での地位はあまり高くはないように思えます。&lt;br&gt;
供給過多もありますか？&lt;/p&gt;
&lt;p&gt;コーダーが増えれば増えるほど、自社に見返りはなくある業種が儲かるだけのような気がします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="p"&gt;なんつーか。。。&lt;/p&gt;
&lt;p class="p"&gt;儲かるって、何でしょう？出て行くものより入ってくるものが多いことですね。&lt;/p&gt;
&lt;p class="p"&gt;出入りしているものって、何でしょう？お金、ですね。&lt;/p&gt;
&lt;p class="p"&gt;お金って、何でしょう？価値を相対的に表すものではないでしょうか。&lt;/p&gt;
&lt;p class="p"&gt;では、儲かるって、何でしょう？価値のバランスが崩れている、ってことではないですか？&lt;/p&gt;
&lt;p class="p"&gt;しかし、ここには、将来的な価値が含まれるとも考えられます。もっとよい商品を作って欲しい。もっとよいサービスを提供して欲しい。そのための、追加された価値です。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;しばらく前にも、同じような人いたね。&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/search.php?term=&amp;addterms=any&amp;forum=all&amp;search_user_id=275131&amp;sortby=-1&amp;searchboth=both&amp;submit=Search" title="⇒atmarkit.co.jp" class="outerLink"&gt;このへん&lt;/a&gt;。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;極端なことをいうと、作る人は予算以内に作れることを目指せばいい。売る人は、予算以上で売れることを目指せばいい。売る人に作る人と同じ事を求めるのはナンセンスだし、逆もしかり。&lt;/p&gt;
&lt;p class="p"&gt;しかし、売る人は、売るものを把握しておかなければならない。前にいましたよ。自社製品の名前を正しく覚えていない営業が。そんな営業から「良いものですから、是非」といわれて、信じますか？&lt;/p&gt;
&lt;p class="p"&gt;作る人、売る人、それぞれに必要とされるものが違います。混同してはいけません。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/151842.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>数字のマジック</title><link>http://blogs.wankuma.com/jitta/archive/2008/08/05/151841.aspx</link><pubDate>Tue, 05 Aug 2008 21:53:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/08/05/151841.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/151841.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/08/05/151841.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/151841.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/151841.aspx</trackback:ping><description>&lt;p class="p"&gt;古い記事の焼き直しですが。。。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p class="quoteSource"&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20080715/310835/?ST=system" title="⇒nikkeibp.co.jp" class="outerLink"&gt;【セキュリティのずさんな実態】社長は現場の窮状を見ぬふり&lt;/a&gt;（ITpro）より：&lt;/p&gt;
&lt;p&gt;一般に，経営層がセキュリティ対策にお金を出したがらない理由の一つは，対策を怠ることによって生じ得る損害の大きさを十分に理解できないことにある。だがC社の社長は，これに全く当てはまらない。&lt;/p&gt;
&lt;p&gt;もちろん，繰り返し起こる被害に対して，PCの復旧にかかるコスト，PCが使えない間のユーザーの損失などは相当な金額に換算できるはず。しかし，この社長にとっては「通常の人件費」の一部であり，会社の利益を減らさない限り，損失とは考えそうにない。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p class="p"&gt;2005年9月の雑誌記事を、記事としての価値が相当に減った今になってウェブで無料公開している、、、というものでしょうが、3年経ってもあまり変わってないように思えるなぁ。&lt;/p&gt;
&lt;p class="p"&gt;PC の置き換えにしてもそうなのですが、一時的な費用が発生します。置き換えないと、効率が悪いまま、作業効率が低いままでいるわけですが、その場合費用は長期にわたって分散されます。&lt;/p&gt;
&lt;p class="p"&gt;この、「分散される」というのがくせ者です。&lt;/p&gt;
&lt;p class="p"&gt;ローンを組むと、本当は必要な額以上に返さなければならないために損なのですが、月々の金額を見るとそう高いものではないように思えてきます。&lt;/p&gt;
&lt;p class="p"&gt;ローンより怖いのが、リボ払いですね。毎月一定額と、手数料です。この手数料がくせ者です。ローンによる金利よりも大きな額になります。ローンの“金利”は、法律によって上限が決められています。しかし、リボ払いで払うのは“手数料”です。手数料に上限はありません。「月々一定額」ということが、利用者に対して少ない金額に見せかけるトリックです。&lt;/p&gt;
&lt;p class="p"&gt;そういえば、手塚治虫の「ブラックジャック」に、こんな話がありましたね。&lt;/p&gt;
&lt;div style="border:1px dashed blue;"&gt;&lt;p&gt;ある男の子が、交通事故で四肢が不自由になります。そのため、超能力を身につけてしまいます。ブラックジャックは、四肢が元通りになれば、超能力を使う必要がなくなり、元通りになるだろうと言います。そして、手術費用を提示します。その額はとても大きいのですが、「毎日10円ずつ返してもらおう。おまえさんに子供が生まれれば、その子供からも毎日10円だ。」&lt;/p&gt;&lt;/div&gt;
&lt;p class="p"&gt;返す額は変わらないのに、「1日10円」というところで、「そんなに安いの！？」と思ってしまいます。&lt;/p&gt;
&lt;p class="p"&gt;こんな昔話もありますね。雇われものが、「1日目は1円、2日目は2円というように、前の日の倍の金額でいいです」といって雇われる話。数日間は3桁4桁という金額でしかありませんが、30日目には2^30=1,073,741,824になっています。日払いですから、(2^31)-12=2,147,483,647の収入が得られている、ということになります。あれ？その数の米粒をくれ、という話だったかな？&lt;/p&gt;
&lt;p class="p"&gt;とにかく、数字のマジックです。少ない額を長い期間をかけて徴収することで、「安い」と見誤らせながら、多くの額を徴収しています。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;セキュリティにかけるお金も、これと同じなのでしょうね。いつ、どのような形で支払いが発生するのか。それが、出せる、出せないの分かれ目なのかもしれません。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/151841.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>セキュアな環境を阻むものを考えてみる</title><link>http://blogs.wankuma.com/jitta/archive/2008/07/07/147823.aspx</link><pubDate>Mon, 07 Jul 2008 21:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/07/07/147823.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/147823.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/07/07/147823.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/147823.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/147823.aspx</trackback:ping><description>&lt;P class=p&gt;本題の前に、フンワリ考えてみる。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P class=quoteSource&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2008/07/06/147597.aspx#147600"&gt;re: Vista UAC の未来をモワモワ考える&lt;/A&gt;より：&lt;/P&gt;
&lt;P&gt;「○○してもいいですか？」とセキュリティソフトが聞いてくる。俺もKasperskyを使ってますが、ぶっちゃけ、それをするとどんなリスクがあって、それをしないとなにができないのか、人並み以上にPC知識があるだろうと思う俺でも判断できません。&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=p&gt;一応、詳細を読んだりしていますが、わかりません。つまり、情報の提示量に問題があると思います。&lt;/P&gt;
&lt;P class=p&gt;また、Kaspersky については、もうちっと調査をしておいてくれてもいいんじゃないの？とも思います。Symantec も同じような機能を実装していますが、標準で Windows に入っている機能については、聞いてきません。すでにルールが組み込まれています。また、どういう基準で選んでいるかわかりませんが、オンラインソフトを含む多くのソフトで、やはりルールが組み込まれています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P class=quoteSource&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2008/07/06/147597.aspx#147621"&gt;# re: Vista UAC の未来をモワモワ考える&lt;/A&gt;より：&lt;/P&gt;
&lt;P&gt;User へ選択を委譲しても責任の回避にしかなりません。&lt;BR&gt;そんなんだったら、専門家が定めた policy で厳しく制限を課し利用させる方がよいかと。&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=p&gt;ええ、そうですね。Vista の UAC は、その方向へ向かうのではないかと思います。あるいは、「&lt;FONT color=#000080&gt;&lt;STRONG&gt;向かって欲しい&lt;/STRONG&gt;&lt;/FONT&gt;」と思います。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P class=quoteSource&gt;&lt;A href="http://blogs.wankuma.com/sakamoto/archive/2008/03/16/127987.aspx#128740"&gt;re: だいめいなし。&lt;/A&gt;より：&lt;/P&gt;
&lt;P&gt;だったら、&lt;STRONG&gt;インストール可不可チェックの代行業者&lt;/STRONG&gt;がいてもいーんじゃないかと。&lt;BR&gt;＃ウィルスチェッカーと同じノリで。&lt;BR&gt;で、業者ごとにブラックリストとホワイトリストを持ってて、それに基づいてインストールの可否を判断する。&lt;BR&gt;個々のソフトについてのインストールの可否はユーザが判断できないけど、その代行業者に対して信頼できるかどうかで判断する。&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=p&gt;で、本題。本題の元ネタが、これ↑。&lt;/P&gt;
&lt;P class=p&gt;「Windows ロゴ プログラム」という、プログラムがあります。「&lt;A class=outerLink title=→microsoft.com href="http://www.microsoft.com/japan/whdc/winlogo/default.mspx"&gt;Windows ロゴ プログラム : 概要&lt;/A&gt;」とか、「&lt;A class=outerLink title=→microsoft.com href="http://www.microsoft.com/japan/partner/products/windowsfamily/windowsvista/logo/default.mspx"&gt;Windows Vista ロゴ プログラム&lt;/A&gt;」とか。Windows Application のロゴ プログラム要件に、「最小特権の原則」があります。日本語の資料を探せなかったのですが、英語の資料はこちら→&lt;A class=outerLink title=→microsoft.com href="http://msdn.microsoft.com/en-us/library/aa480150.aspx"&gt;Developer Best Practices and Guidelines for Applications in a Least Privileged Environment&lt;/A&gt;&lt;/P&gt;
&lt;P class=p&gt;テスト要件も、ダウンロードできますね。いきなりダウンロードしちゃうので、リンクにはしません。→ http://download.microsoft.com/download/a/4/c/a4c003f7-76be-444b-a3b7-4e74b7d5767f/Certifiedfor_ProgramTestCases_1.3J.doc&lt;/P&gt;
&lt;P class=p&gt;この中に、「TEST CASE 2. 最小特権ユーザーが他のユーザの文書やファイルを変更できないことを検証する」、「TEST CASE 3. 最小特権ユーザーが Windows System ディレクトリにファイルを保存できないことを検証する」というのがあります。「最小特権ユーザが」という制約がありますが、Windows ロゴ プログラムをパスしているアプリケーションは、勝手にシステム ファイルを書き換えないことが、第三者機関によって保証されているわけです。かつ、署名されていることも検査されますので、ウィルスなどによる改ざんを検出することもできます。&lt;/P&gt;
&lt;P class=p&gt;つまり、Windows ロゴのついているソフトウェアは、&lt;STRONG&gt;比較的&lt;/STRONG&gt;安心してインストールできると言っていいでしょう。言い切りませんよ。レジストリに関して、テストケースが見あたりませんから。&lt;/P&gt;
&lt;P class=p&gt;100％の安心を保証するものではないにしろ、危険な要素が少ないことは保証してくれるものであります。しかし、大企業を含め、日本企業のソフトウェアの多くは、ロゴ プログラムに参加していません。なぜでしょう？&lt;/P&gt;
&lt;P class=p&gt;「費用の問題」であったり、「他社の動向を見て」であったりします。&lt;/P&gt;
&lt;P class=p&gt;自社製品を使って下さるお客様に「安心・安全」を付加することより、コスト（そりゃ、コストがかかるとそもそも選んでもらえない可能性も出てくるけどね）や周りの目の方が気になる様です。セキュアな環境を阻んでいる要因は、案外、こういう事だったりするのかもしれない。&lt;/P&gt;
&lt;P class=p&gt;セキュリティに関しては、リスクです。リスクは、顕在化するか、しないか、わかりません。問題として顕在化しないのであれば、つっこむ金は少なくしておこう、という考え方なのでしょうか。でも、顕在化したときにかかる費用は、顕在化回避のために費やすお金の比じゃないと思うのです。でも顕在化しなければ、無駄金になる・・・これだぁ！！「無駄金」という考え方だ！！&lt;/P&gt;
&lt;P class=p&gt;どうにかなりませんかね？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/147823.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>システム ハンガリアンを養護してみるテスト</title><link>http://blogs.wankuma.com/jitta/archive/2008/07/07/147822.aspx</link><pubDate>Mon, 07 Jul 2008 21:54:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/07/07/147822.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/147822.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/07/07/147822.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/147822.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/147822.aspx</trackback:ping><description>&lt;P class=p&gt;とか書きながら、養護するつもりはない。しかし、歴史を知っておく必要はあると思います。&lt;/P&gt;
&lt;P class=p&gt;Win32 API のリファレンスを見ていてよく見かける（無理矢理組み合わせた、かも）、「&lt;CODE&gt;lpctstr&lt;/CODE&gt;」という表記。これを、分解してみようかと思います。&lt;/P&gt;
&lt;P class=p&gt;まず、「p」から。これは、Pointer の p です。C 言語において、「文字配列」と「文字列へのポインタ」は、同じように扱えてしまえますが、実は違うものです。そのため、「ポインタであること」を明示するのは、読むとき、保守するときに有用です。&lt;/P&gt;
&lt;P class=p&gt;次、「l」。これ、よくわかりません。いろいろ読んでいるうちに「これかな？」と思ったのは、「local」か、「long」の「l」です。大昔、扱えるメモリ量が少なかったり、少ない故に小さいバイト数でいろいろ扱うために、DLL や EXE の境界を越えてポインタを渡せなかったようです。「ポインタ」に、「起点からの距離」を表すものと、「絶対距離」を表すものがあった様です。このうち、「起点からの距離」は、起点が違えば指す場所が変わってしまいます。あるいは、「GlobalHeap」という関数がありましたが、特定のプロセスのみで使えるアドレスと、Windows 全体で使えるアドレスか。そのため、これらを分けるために付けられたようです。はい、そこの人！！鵜呑みにしない。&lt;FONT size=4&gt;&lt;U&gt;自分で確認すること。&lt;/U&gt;&lt;/FONT&gt;なんにしても、Windows 2000 の頃には、分ける必要がなくなっています。&lt;/P&gt;
&lt;P class=p&gt;次、「c」。これは、Const の c です。関数の引数に対して、「この引数の値は、関数内で変化させない」事を示すために付けられます。関数の入力、出力を明示するために使うわけです。これも、C++ になって const で修飾した場合、コンパイラがエラーを出します。このため、変数の修飾に使用して明示する必要はなくなっています。&lt;/P&gt;
&lt;P class=p&gt;次、「t」。これは、Multi-byte charactor set と、wide charactor set の、どちらにでも変化するよ、を表しています。そのため、文字(列)にしかつきません。Win32 API 関数の最後につく、A とか W と同じカテゴリです。&lt;/P&gt;
&lt;P class=p&gt;そして、「str」。これは String です。C では、char は「文字」だけでなく、「1バイトの数値」の意味も持っています。このため、「&lt;CODE&gt;char a[10];&lt;/CODE&gt;」だと、「10バイトのデータ」なのか、「最大9文字の文字列」なのか、わかりません。そこで、str を付け、「文字列」であることを明示したわけです。&lt;/P&gt;
&lt;P class=p&gt;他に、整数値につく「i」があります。これは、整数といえど、割り算をすると浮動小数点型に変換されることがあります。こういった、暗黙の変換を防ぐ（注意を向ける）意図を持ちます。&lt;/P&gt;
&lt;P class=p&gt;また、short の場合、演算結果がオーバーフローする可能性が高くなりますから、これをレビューで検出できるようにすることもあります。&lt;/P&gt;
&lt;P class=p&gt;あとは、符号のあるなしについても、ありますかね？signed char の 0x80 と、unsigned char の 0x81 を比べると、どちらが大きいか。これは、最近だとコンパイラが警告を出してくれます。また、符号の有無と同じように、縮小変換についても警告、あるいはエラーとなるようにコンパイラが修正されています。したがって、変数名に明示する必要はなくなっています。&lt;/P&gt;&lt;BR&gt;
&lt;P class=p&gt;このように、単に型を示していたのではなく、&lt;FONT size=4&gt;目視レビューで間違いを検出しやすくするための工夫だった&lt;/FONT&gt;わけです。で、コンパイラが検出するようになったからか、Visual Studio 2008 に付属する SDK のドキュメント（英語）では、これらのシステム ハンガリアンな記述がなくなっています（作業中かもしれない）。&lt;/P&gt;
&lt;P class=p&gt;このように、C/C++ では、意味がある事でした。しかし、すべての言語で意味があることではない、あるいは、同じ記号であっていいわけではありません。&lt;/P&gt;
&lt;P class=p&gt;VB や C# のコードで、型名を明示する必要はありません。特に、「クラスだから」と、「cls」を頭に付けているようなものは、全く意味がありません。&lt;/P&gt;
&lt;P class=p&gt;そんな無駄なことをするより、なぜそのような符号を付ける必要があるのかを知り、その上で、使用している言語にそれが必要なのか、同じようにしていいのか、他に追加することがあるか、といったことを考える事の方が重要ではないでしょうか。「システム ハンガリアン使うな」とは言いません。しかし、使う前に、それに&lt;FONT size=5&gt;どんな意味があるか、知って欲しい&lt;/FONT&gt;と思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/147822.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>エントリへのコメント紹介</title><link>http://blogs.wankuma.com/jitta/archive/2008/06/19/144533.aspx</link><pubDate>Thu, 19 Jun 2008 22:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/06/19/144533.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/144533.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/06/19/144533.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/144533.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/144533.aspx</trackback:ping><description>&lt;P class=p&gt;少し昔のエントリに、コメントをいただきました。その内容が、あまりにも「う～む？」だったので、紹介させていただきます。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P class=quoteSource&gt;&lt;A href="http://blogs.wankuma.com/jitta/archive/2008/04/02/131353.aspx"&gt;re: VB 使うな、開発者なら。&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;「まぁ　おかしいと思っていても実は正しくなってんじゃん。XPで動いていたんだし」&lt;BR&gt;なんていわれました。&lt;BR&gt;あまりにあっけにとられて　こんな話してると「あれ。これって別に問題ないんだっけ？」&lt;BR&gt;思わず考えてしまったほど・・・&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=p&gt;もちろん、「う～む？」なのは、コメントをくださった通りすがりさんではなく、お話の中に出てくる「他の開発者」さんです。&lt;/P&gt;&lt;BR&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;やはりこの手の問題は開発ツールうんぬんではなくて&lt;BR&gt;ちゃんとした知識を持っているか、理解が出来ているか　この一点と言えるのではないでしょうか。&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P class=p&gt;確かに。&lt;/P&gt;
&lt;P class=p&gt;私の意見は、「VB の開発環境は、無知でいることを助長するので、開発者なら VB の開発環境を使うな」と書くべきだったのですが、「無知で居続けようとする」人にとっては、開発環境が何であっても関係ないのですねorz&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P class=p&gt;最後になりましたが、通りすがりさん、コメントありがとうございます。また、反応が鈍くてごめんなさい。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/144533.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>コメントの間違いは、プログラムのバグに等しい</title><link>http://blogs.wankuma.com/jitta/archive/2008/06/06/142115.aspx</link><pubDate>Fri, 06 Jun 2008 23:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/06/06/142115.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/142115.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/06/06/142115.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/142115.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/142115.aspx</trackback:ping><description>&lt;blockquote&gt;
&lt;p class="quoteSource"&gt;&lt;a href="http://bbs.wankuma.com/index.cgi?mode=al2&amp;namber=20074"&gt;再帰によるスタックオーバーフロー？&lt;/a&gt;（C# と VB.NET の質問掲示板）より：&lt;/p&gt;
&lt;pre class="code"&gt;&lt;code&gt;
//再帰処理部分。
private bool checkloop(string grp, string ffiscalyr, int fperiod)
{
    int Row;
    string wkKOgrp;

    &lt;span style="font-weight:bold;"&gt;//パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1&lt;/span&gt;
    Row = Find(dtSet, grp, ffiscalyr, fperiod
        , 0 ,int.Parse(dtSet.Tables[0].Rows.Count.ToString())-1);

    while (Row &gt; -1)
    {
        wkKOgrp = dtSet.Tables[0].Rows[Row].ItemArray[1].ToString();

        //一番おおもとの比較値と比較
        if (SerchTarget == wkKOgrp)
        {
            return true;
        }
        else
        {
            //自身を再度呼び出す
            if(checkloop(wkKOgrp,ffiscalyr,fperiod) == false)
            {
                &lt;span style="font-weight:bold;"&gt;//現在の行数以降で、パラメタで渡されたコードが親コードとしてもつ行の行数を取得。ない場合は-1&lt;/span&gt;
                Row = Find(dtSet, grp, ffiscalyr, fperiod
                    , Row + 1, dtSet.Tables[0].Rows.Count - 1);
            }
            else
            {
                return true;
            }
        }
    }

    return false;
}

&lt;span style="font-weight:bold;"&gt;//子コードが一致したデータの行数を返す関数&lt;/span&gt;
private int Find(DataSet ds, string GRP, string ffiscalyr, int fperiod
    , int startrow, int endrow)
{
    int i;

    for (i = startrow ; i &amp;lt;= endrow ; i++)
    {
        if ((ds.Tables[0].Rows[i].ItemArray[0].ToString() == GRP)
            &amp;&amp; (ds.Tables[0].Rows[i].ItemArray[2].ToString() == ffiscalyr)
            &amp;&amp; (int.Parse( ds.Tables[0].Rows[i].ItemArray[3].ToString()) == fperiod))
        {
            return i;
        }
    }

    return -1;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p class="p"&gt;ん。。。呼び出し側に書かれたコメントは、&lt;q&gt;親コードとしてもつ行の行数&lt;/q&gt;。実際の定義に書かれたコメントは、&lt;q&gt;子コードが一致したデータの行数&lt;/q&gt;。&lt;/p&gt;
&lt;p class="p"&gt;親コードが一致するのか、子コードが一致するのか？&lt;/p&gt;
&lt;p class="p"&gt;人間、自分が読めるもの、つまり日本語にまず目がいく。すると、呼び出し側と定義側で違うことが書いてある。まず、とまどう。&lt;/p&gt;
&lt;p class="p"&gt;そうすると、コードを読まないといけない。ここが、本当にしたいことをしているのかわからないから。日本語を読むのと、コードを読むのと。どっちが時間がかかるだろう？あるいは、1行の日本語を読むのと、数行のコードを読むのと、どっちが時間がかかるだろう？&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;そして、Find メソッドがしていること。&lt;/p&gt;
&lt;p class="p"&gt;引数 ds の0番目に定義されているテーブルを、startrow 番目（0起点）から検索を初めて、endrow 番目までに、0列が GRP、2列が ffiscalyr、3列が fperiod である行があれば、その行番号を返す。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;「行数」を返しているわけではない、と。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;コメントに「行数」と書いてあるので、「行の数」が返ると思って&lt;q&gt;「行数」と、「行番号」は、一致しないですよね？&lt;/q&gt;とコメントしたのだけれど、「行番号」を期待して、「行番号」が返っている。コードを、すこ～ししか読んでいなかったので、間違った返信をしてしまった。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;質問に対する返信だから、まだいい。私がこのコードを直す役を負っていたら、間違いなく呼び出し側に修正をかけている。そして、バグを作り込み、慌てて元に戻すことになっている。&lt;span class="comment"&gt;あるいは、コードを読んで違いに気がつき、「どっちやねん！」と叫ぶことになる。これもまた大変で、他から呼びされていないか確認し、呼び出されていればそれらが期待しているものをコードから読み取る羽目になる。「&lt;a href="http://blogs.wankuma.com/jitta/archive/2008/06/05/141805.aspx"&gt;global って、便利なの？&lt;/a&gt;」も参照。&lt;/span&gt;&lt;/p&gt;
&lt;p class="p"&gt;たま～～～に、メンテナンスされていないコメントを見かけます。メンテしてください。コメントの間違いは、バグに等しいのです。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/142115.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>global って、便利なの？</title><link>http://blogs.wankuma.com/jitta/archive/2008/06/05/141805.aspx</link><pubDate>Thu, 05 Jun 2008 22:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/06/05/141805.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/141805.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/06/05/141805.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/141805.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/141805.aspx</trackback:ping><description>&lt;p class="p"&gt;元ネタ→&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45030&amp;forum=10" title="→atmarkit.co.jp" class="outerLink"&gt;【PHP】 変数の受け渡しについて！&lt;/a&gt;&lt;/p&gt;
&lt;p class="p"&gt;グローバルにスコープを持たせる方法をご存じでなかったらしい。それは、今回関係ない。関係あるのは、この言葉。&lt;q&gt;（グローバルって）便利ですねこれは！&lt;/q&gt;&lt;/p&gt;
&lt;p class="p"&gt;便利なのか？&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;確かに、「便利！」と思うかもしれない。&lt;/p&gt;
&lt;p class="p"&gt;C 言語から C++ に以降したての頃・・・いや、移行していないな。移行しようとしていた頃、クラスの中に定義すると、インスタンスを作成しないと見えない、クラスの外から見えない、というのが、非常に使いづらかった。&lt;/p&gt;
&lt;p class="p"&gt;で、まぁ、C++ だから、みんながインクルードするヘッダ ファイルに書いちゃうわけだ。&lt;/p&gt;
&lt;p class="p"&gt;ん。。。今考えると、C でも、とっても怖いことしていたなぁ。。。&lt;/p&gt;
&lt;p class="p"&gt;「あれも、これも、あっちでもこっちでも使いたい。でも、見えない。だから不便。」そんな風に思っていた。&lt;/p&gt;
&lt;p class="p"&gt;オブジェクト指向の「カプセル化」に慣れてくると、それがいつの間にか、「あっちからもこっちからも変更できてしまう。なんて危険！！」に変わっている。。。&lt;/p&gt;
&lt;p class="p"&gt;ん～！おもしろい！！&lt;/p&gt;
&lt;p class="p"&gt;まぁ、確かに、作るときは、作るときは、作るときは、…これくらい強調しておけばいい？作るときは、どこからでも参照できるのは、便利。でも、デバッグするとき、機能追加するときに、地獄が見られる。かもしれない。&lt;/p&gt;
&lt;p class="p"&gt;修正するときに一番気を使うのは、「他の機能に影響を及ぼさないか」ということです。どこでも参照できる変数というのは、保守するときには「どこで参照されているかわからない変数」に変わります。そして、「作っている期間」より、「保守している期間」の方が、遙かに長いです。&lt;/p&gt;
&lt;p class="p"&gt;つまり、「この、global スコープで定義されている変数の内容を、ここで変えていいのだろうか？」ということをず～～～～っと考えながら保守しなければなりません。&lt;/p&gt;
&lt;p class="p"&gt;「どこで使われているか、grep かければわかる」ですって？&lt;/p&gt;
&lt;p class="p"&gt;確かに、どこで使われているかは、わかります。でも、「いつ使われているか」までは、わかりません。&lt;/p&gt;
&lt;p class="p"&gt;「cflow かけて（まだあるのか？）呼び出し図つくればええやん」ですって？&lt;/p&gt;
&lt;p class="comment"&gt;あれ？cflow となんだっけ？よくお世話になったのに、忘れちまった...&lt;/p&gt;
&lt;p class="p"&gt;で、結局、コードを読まないと、変更していいのかどうかは、わからないわけです。&lt;/p&gt;
&lt;p class="p"&gt;この辺でね、地獄になるのですよ。&lt;/p&gt;
&lt;br&gt;
&lt;p class="p"&gt;DLL-Hell といい、怖いもの見たさはいいと思います。見るのは、いいと思います。でも、体験する必要は、ないと思いますよ？&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/141805.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>はなおか じった</dc:creator><title>基本、菠薐草</title><link>http://blogs.wankuma.com/jitta/archive/2008/05/28/139851.aspx</link><pubDate>Wed, 28 May 2008 23:49:00 GMT</pubDate><guid>http://blogs.wankuma.com/jitta/archive/2008/05/28/139851.aspx</guid><wfw:comment>http://blogs.wankuma.com/jitta/comments/139851.aspx</wfw:comment><comments>http://blogs.wankuma.com/jitta/archive/2008/05/28/139851.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/jitta/comments/commentRss/139851.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/jitta/services/trackbacks/139851.aspx</trackback:ping><description>&lt;P class=p&gt;元ネタ→&lt;A class=outerLink title=→atmarkit.co.jp href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44951&amp;amp;forum=7"&gt;件名：プログラムを修正してデバッグしても、修正した結果が反映されません。&lt;/A&gt;（Insider.NET 会議室）&lt;/P&gt;&lt;BR&gt;
&lt;P class=p&gt;しょっちゅう書いているけど、ウェブ コミュニティって、最終手段だと思います。&lt;/P&gt;
&lt;P class=p&gt;理由は簡単。単位時間当たりの情報の濃さが違う。&lt;/P&gt;&lt;BR&gt;
&lt;P class=p&gt;まず、問題が解決できる過程をおさらいしましょう。&lt;/P&gt;
&lt;P class=p&gt;ほぼすべての問題は、時間が解決してくれたりしません。解決に向けて何らかの行動を起こして初めて、解決に向けて動き出し、解決できます。&lt;/P&gt;
&lt;P class=p&gt;では、「解決できる」ために、どうすればいいのでしょうか。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;問題を把握する 
&lt;P class=p&gt;まずは、問題を把握しなければなりません。「問題を把握する」とは、ある事象を「問題である」と認識するところから始まります。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;問題を認識する 
&lt;P class=p&gt;当たり前ですね。「問題だ」と認識しなければ、問題ではないのです。つまり、「見なかったことにしよう」「なかったことにしよう」というのは、問題を「問題である」との認識を捨てると言うことです。認識を捨てると、問題ではなくなります。したがって、問題を解決するためには、「問題である」と認識するところから始まります。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;問題である事象を認識する 
&lt;P class=p&gt;問題であると認識ができれば、次はその問題の具体的な事象を認識します。人に話すとき、「問題なんです」としか言わなければ、「何が問題なの？」と聞かれるでしょう。その「何が？」を明らかにします。&lt;/P&gt;
&lt;P class=p&gt;問題である事象を認識するとは、問題である事象と、問題でない事象の差異を明確にすることです。&lt;/P&gt;
&lt;P class=p&gt;たとえば、我々が医者に行くとき、「何となくしんどい」とか、「何となく気分が悪い」という、不明瞭な不調を訴えます。医者は問診や検温、時には検尿なども行い、何が問題であるのかを明らかにします。この行為に相当する行為を、行うわけです。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;事象の再現手順を確認する 
&lt;P class=p&gt;どんなことが発生しているのか、確認ができました。次は、その事象が必ず発生するのか、確認します。そして、必ず発生する条件、手順を明確にします。この、手順と条件が明確でなければ、もし修正しても、修正が正しく行えたのかどうかを確かめることができません。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;問題を報告する 
&lt;P class=p&gt;多くの人が、何らかの組織に所属して、その組織の「仕事」として、問題解決に当たっていると思います。&lt;/P&gt;
&lt;P class=p&gt;私は、仕事をする上で「報告」することが重要だと思っています。&lt;/P&gt;
&lt;P class=p&gt;なぜか？&lt;/P&gt;
&lt;P class=p&gt;報告するためには、上記のように明らかにしたことを、短くまとめなければなりません。この、「まとめる」という作業が、問題を把握するために役に立つからです。&lt;/P&gt;
&lt;P class=p&gt;漠然と「知っている」ことを、明確に「理解している」に進めます。問題を理解していないと、次の解決策を練るときに苦労するからです。&lt;/P&gt;
&lt;P class=p&gt;そのために、上役に報告します。上役が理解できなければ、理解できなかったことを補足するように求めてくるはずです。そこが説明できるかどうかで、問題を「理解している」かどうかがわかります。&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;
&lt;LI&gt;解決策を考える 
&lt;P class=p&gt;問題の把握ができると、今度はその問題の解決策を考えることになります。&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;問題である事象の差異を埋める 
&lt;P class=p&gt;先に、「問題である事象」と、「問題ではない事象」の差異を明らかにしました。この差異を埋める方法を考えるわけです。&lt;/P&gt;
&lt;P class=p&gt;先に、問題が発生する条件と手順を明らかにしました。その条件と手順の時に、なにが、どうなっているのが問題かわかっているわけですから、そうならない方法を考えればいいわけです。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;差異を埋めることで発生する影響を調べる 
&lt;P class=p&gt;あまり行われていないのではないか、と思われる事です。&lt;/P&gt;
&lt;P class=p&gt;ある条件、ある手順の時のみ問題が発生しているのであれば、その他の条件では問題は発生していないわけです。では、今、その問題を修正することで、他の部分に悪影響が出ないでしょうか？&lt;/P&gt;
&lt;P class=p&gt;あるバグを直すために別のバグを作り込む。そのバグを直すために、前のバグを取るために行った修正を元に戻す。なぜか、よくあることです。なぜ、よくあるのでしょう？修正が及ぼす影響範囲の調査が不十分であったり、そもそも問題を把握できていないためです。こんな事がないように、影響範囲を調べなければなりません。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;試験してみる 
&lt;P class=p&gt;影響範囲の洗い出しを行って、その他のところに影響しないとわかったら、本当にそうか、試してみます。ここは、試すだけです。まだ、本当に修正を行うわけではありません。&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;解決策を相談する 
&lt;P class=p&gt;やはり、上役に報告です。しかし、今回は、「相談」です。これは、問題の解決のために何を行うか、どんな影響が考えられるか、実際に修正した結果どうだったかを報告することで、修正を行ってよいかどうかを尋ねます。決して、「解決策を尋ねる」わけではありません。&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;
&lt;LI&gt;修正する 
&lt;P class=p&gt;問題を把握し、解決策を出し、その解決策に Go! が出たので、修正を行います。修正を行った場合は、退行試験、デグレッション テスト、整合性確認を行います。今行った修正で、本当に他のところに影響がなかったのか、確認します。&lt;/P&gt;
&lt;P class=p&gt;そして、やはり最後も報告です。どの問題について、どのように修正を行い、どんな確認をしたのか、報告します。&lt;/P&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P class=p&gt;さて、元に返って。&lt;/P&gt;
&lt;P class=p&gt;ウェブ コミュニティで尋ねることは、上記の「解決策を考える」、その中でも特に「問題である事象の差異を埋める」になります。したがって、ウェブ コミュニティに出す「質問文」には、把握している問題の報告ができなければならない、と思います。&lt;/P&gt;
&lt;P class=p&gt;ここにあげた「問題解決の手順」は、ウェブ コミュニティで問題を解決するためには不十分です。&lt;/P&gt;
&lt;P class=p&gt;なぜでしょう？&lt;/P&gt;
&lt;P class=p&gt;上記は、「自己解決の手順」だからです。他の人と協力して解決にあたる場合、互いの認識をあわせる必要があります。この「互いの認識」とは、相手がどれくらいのことを知っているのか、相手がどのような制約を持っているのか、相手がどのような経緯をたどってきたのか、などです。&lt;/P&gt;
&lt;P class=p&gt;私が、「ウェブ コミュニティで聞く前に、周りの人に聞いてよ」というのは、この、「互いの認識をあわせる」ためなのです。あなたの周りの人は、ウェブの向こうの人よりあなたのことを知っているはずです。その人でさえわからないから尋ねることは、ウェブの向こうの人もほぼ間違いなくわからないのです。この、「伝わると思って伝えようとしなかったこと」を少なくするために、まず、周りの人に聞いて欲しいのです。&lt;/P&gt;
&lt;P class=p&gt;もう一つ、私は「損得」という言葉を使います。この言葉をなぜ用いるか、理解されていないようです。&lt;/P&gt;
&lt;P class=p&gt;10年ほど前。私の時給は、月給を標準時間数で割ると、1100円ほどでした。しかし、会社は、私が1時間働くと、4500円ほどの費用を費やしていました。私が「損」といっているのは、答えが得られる、得られないではありません。この、4500円というお金のことです。&lt;/P&gt;
&lt;P class=p&gt;このお金、開発者原価について、わんくま勉強会で「意識していますか？」と聞いたことがあります。個人で事業をされている方は意識されているのですが、会社勤めで給料をもらっている方は、意識されていない方がほとんどでした。&lt;/P&gt;
&lt;P class=p&gt;このお金を意識してください。10年ほど前にいた企業では、開発者一人につき、1ヶ月1百万円でした。人月です。ことあるごとに否定したい人月単価ですが、それで動いている（いた）以上、否定しても仕方ありません。1日の標準労働時間が8時間、週5日で40時間。月21日として168時間。1百万円を168時間で割ると、約5950円。&lt;/P&gt;
&lt;P class=p&gt;問題解決のために、1時間につき約6千円を消費しているのです。&lt;/P&gt;
&lt;P class=p&gt;私は、損だと思います。&lt;/P&gt;
&lt;P class=p&gt;私がそれを意識するようになった10年前にいた会社は、逆ザヤでした。時間当たり、本当は4500円ほどかかっているのに、見積単価は4400円だったのです。見積もった時間通りに実施すると、損が出るのです。&lt;/P&gt;
&lt;P class=p&gt;そのようなところにいたので、問題が解決できるかどうかを、他の時間で動いている人をアテにするウェブ コミュニティで尋ねるというのが、とてももったいなく思います。自分でコントロールできないのですから。&lt;/P&gt;&lt;BR&gt;&lt;BR&gt;
&lt;P class=p&gt;あ、タイトルは、「ほうれん草」、すなわち「報告連絡相談」です。「連絡」が出てこなかったな。これは、適切なタイミングで進捗状況を連絡することです。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/jitta/aggbug/139851.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>