fc2ブログ

VBオブジェクト指向プログラミング講座 第14回 型の概念を覚えよう

 この記事は、 第13回 オブジェクト指向プログラミングの原理を覚えようの続きです。前回は、オブジェクト指向プログラミングの原理を解説しました。今回は、VBにおけるオブジェクト指向プログラミングにつきものの「型」について解説します。
 VB言語で行うオブジェクト指向プログラミングは、主にを扱います。しかしながら、型とは何かと問われた時、意外と答えられない人も多いかと思います。そこで、今回は型について解説します。型を知ることにより、プログラミング力が増すこと間違いなしです。
 VBコンパイラがしていることを表現してみました。

Imports System
Imports System.Collections.Generic

'型に関する情報
Friend Structure TypeInfo

    '型名。
    Public Name As String

    '型が持っている関数テーブル。
    Private table As Dictionary(Of String, Object)

    '名前を指定してインスタンスを生成する。
    Public Sub New(ByVal name As String)
        Me.Name = name
        Me.table = New Dictionary(Of String, Object)()
    End Sub

    '関数もしくは手続きを登録。
    Public Sub ResistFunctionOrSub(ByVal name As String, funcOrSub As Object)
        Me.table.Add(name, funcOrSub)
    End Sub

    '関数もしくは手続きを取得。
    Public Function GetFunctionOrSub(ByVal callName As String) As Object
        Dim result As Object = Me.table.Item(callName)
        Return result
    End Function

End Structure

'サンプルで使用するオブジェクト
Friend Structure Foo
    Public Value As Integer
End Structure

'エントリポインタ(プログラムの開始地点)
Module Sample

    'Foo型に関する情報を取得する。
    Function GetFooTypeInfo() As TypeInfo

        '関数のテーブルを用意
        Console.WriteLine("Foo型の準備をします。")
        Dim result As TypeInfo = New TypeInfo("Foo")

        Dim ctor As Func(Of Foo) = Function() New Foo()
        result.ResistFunctionOrSub("New", CObj(ctor))
        Console.WriteLine("コンストラクタを登録しました。")

        Dim getValue As Func(Of Foo, Integer) =
            Function(obj As Foo) obj.Value
        result.ResistFunctionOrSub("Get_Value", getValue)
        Console.WriteLine("Valueプロパティのゲッターを登録しました。")

        Dim addFunc As Func(Of Foo, Integer, Foo) =
            Function(obj As Foo, value As Integer)
                obj.Value += value
                Return obj
            End Function
        result.ResistFunctionOrSub("Add", addFunc)
        Console.WriteLine("Addメソッドを登録しました。")
        Console.WriteLine("Foo型の準備が終わりました。")
        Console.WriteLine()

        Return result

    End Function

    Sub Main()

        'Foo型オブジェクトのインスタンスを生成する
        Dim fooType As TypeInfo = GetFooTypeInfo()
        Dim ctor As Func(Of Foo) = fooType.GetFunctionOrSub("New")
        Dim obj As Foo = ctor()

        'メソッドを呼び出す
        Dim addValue As Integer = 10
        Dim f As Object = fooType.GetFunctionOrSub("Add")
        Dim addFunc = CType(f, Func(Of Foo, Integer, Foo))
        obj = addFunc(obj, addValue)
        Console.WriteLine("オブジェクトに{0}加算しました。", addValue)

        'プロパティのゲッターを呼び出す
        f = fooType.GetFunctionOrSub("Get_Value")
        Dim getter = CType(f, Func(Of Foo, Integer))
        Dim v As Integer = getter(obj)
        Console.WriteLine("オブジェクトの値は{0}です。", v)

        '間違った!
        Dim name As String = "ピヨ"
        Try
            f = fooType.GetFunctionOrSub(name)
        Catch ex As KeyNotFoundException
            Console.WriteLine("Foo型に{0}関数は存在しません。", name)
        End Try

        '終了
        Console.WriteLine()
        Console.WriteLine("サンプル終了です。")
        Console.ReadLine()

    End Sub

End Module

サンプルがしていることは前回とほぼ同じです。違いは型を使用している点です。この点が型が目指している事です。
 サンプルにて、存在しない関数を呼び出そうとするとエラーになる点に注目してください。前回述べたように、オブジェクト指向プログラミングがない時代は、関数・データ・手続きがバラバラでした。バラバラに存在しても機械は困りませんが、プロジェクトの規模が大きくなると、管理をする人間は大変困ります。プログラミングの各要素がバラバラなまま、数百万行をプログラミングしている場面を想像してください。とても大変だということがわかってもらえると思います。
 人間は物事を関連付けて認識します。人間はデータ・手続き・関数がグルーピングされていると、プログラムを理解しやすくなります。そこで、「型」というプログラムの要素を関連付ける方法が考えだされました。型という枠組みがあると、人間の間違いを減らし、プログラムの理解が容易になります。つまり型とは、人間がプログラムを扱いやすくするために、コードを関連付けるものだといえます。
 型はオブジェクト指向プログラミングの必須知識なので、是非この機会に覚えてください。
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

VBオブジェクト指向プログラミング講座 第13回 オブジェクト指向プログラミングの原理を覚えよう

 この記事は、第12回 デリゲートをマスターしようの続きです。前回は、デリゲートオブジェクトについて解説しました。今回は、オブジェクト指向プログラミングの原理について解説します。
 前回デリゲートオブジェクトが、特別な数値を使って、手続きと関数を適切に呼び出していると書きました。この部分について興味を持った人もいるかと思います。実はこの事と、オブジェクト指向プログラミングの原理と深い関係があります。そこで今回は、オブジェクト指向プログラミングの原理を解説します。

Imports System.Collections.Generic

Structure Foo
    Public Value As Integer
End Structure

Module Sample

    Sub Main()

        '関数のテーブルを用意
        Dim table As List(Of Object) = New List(Of Object)()
        Console.WriteLine("コンストラクタを登録しました。")
        table.Add(CObj(New Func(Of Foo)(AddressOf Constructor)))
        Console.WriteLine("Valueプロパティのゲッターを登録しました。")
        table.Add(CObj(New Func(Of Foo, Integer, Foo)(AddressOf Add)))
        Console.WriteLine("Addメソッドを登録しました。")
        table.Add(CObj(New Func(Of Foo, Integer)(AddressOf Get_Value)))
        Console.WriteLine()

        'コンストラクタを呼び出す
        Dim index As System.IntPtr
        Console.WriteLine("Fooオブジェクトのインスタンスを生成します。")
        Dim ctor = CType(table(index), Func(Of Foo))
        Dim obj As Foo = ctor()

        'メソッドを呼び出す
        index = 1
        Dim addValue As Integer = 10
        Dim addFunc = CType(table(index), Func(Of Foo, Integer, Foo))
        obj = addFunc(obj, addValue)
        Console.WriteLine("オブジェクトに{0}加算しました。", addValue)

        'プロパティのゲッターを呼び出す
        index = 2
        Dim getter = CType(table(index), Func(Of Foo, Integer))
        Dim v As Integer = getter(obj)
        Console.WriteLine("オブジェクトの値は{0}です。", v)
        Console.ReadLine()

    End Sub

    'コンストラクタ
    Function Constructor() As Foo
        Return New Foo()
    End Function

    'メソッド
    Function Add(ByVal obj As Foo, ByVal value As Integer) As Foo
        obj.Value += value
        Return obj
    End Function

    'プロパティ
    Function Get_Value(ByVal obj As Foo) As Integer
        Return obj.Value
    End Function

End Module

ちょっと難しいサンプルですが、ステップ実行すればよくわかると思います。難しく見えますが、やっていることは単純です。Fooオブジェクトのインスタンスを作り、Addメソッドを呼び出し、最後にプロパティから値を取得しているだけです。
 サンプルに書いてある関数のテーブルこそ、オブジェクト指向プログラミングの実現を可能としているものです。オブジェクト指向プログラミングでは、データと手続きと関数でできていますが、それを実現しているのがこの考え方なのです。
 アセンブラレベルで考えると、全ては0と1しかありません。ですから最終的には、関数や手続きの呼び出しは名前ではなく、アドレス(数値)を指定しています。従って原理的には、関数と手続きがどこにあるのかを示すアドレスさえわかっていれば、それを実行することができます。この考えを応用すれば、予めアドレスを管理しておき、人間が指定した関数を呼び出せるようにすれば、より分かりやすいプログラムとなります。それが、オブジェクト指向プログラミング言語の原理です。
 オブジェクト指向プログラミングがない時代には、データと手続きと関数がバラバラでした。そこで、データと手続きと関数をまとめて、より人間がわかりやすい形式にするという発想が出ました。その結果生まれたのが、オブジェクト指向プログラミングなのです。このことがわかれば、デリゲートが何故特別な数値を使うのかわかると思います。もちろんデリゲートとオブジェクト指向プログラミングの原義は全く同じではありませんが、考え方そのものはほとんど同じです。
 オブジェクト指向プログラミングの原理がわかれば、プログラミングの能力が飛躍的にアップします。この機会にぜひ覚えてください。

テーマ : プログラミング
ジャンル : コンピュータ

中の人の徒然草437 マニフェスト選挙はもう枯れた。新しい契約選挙をしよう。

景色は紅葉色から冬色に変わってきました。物悲しくなりますが、それはそれで楽しいものです。物悲しいといえば選挙です。民意が反映されるシステムがないので誰がなっても一緒です。国民にとって政治はいつも冬景色です。
思えばマニフェスト選挙は意味がないものでした。何故ならば、それが守られなくとも何の罰則もなく、報酬も同じであり、嘘をついた方が得をするシステムになっているからです。そんな状態ですから、正直な立候補者は落選しますし、たとえ嘘をついていなくとも守られる保証が何もありません。保証がない契約ほど害になるものはありません。ビジネスの世界ではありえない話です。
さらに言えば、民意を反映しているといいながら、実際のところは国民の要望を吸い上げるシステムが何もありません。それで民意がと言われても、やはりビジネスの世界では一笑に付されるだけです。お客様の要望を聞かないサービスなど通常はあり得ません。
問題を箇条書きします。
  • 報酬と成果が一致していない。
  • 国民の要望を反映するシステムが存在しない。
  • 選挙で人を選ぶ基準が何もない。
  • 契約としての保証が何もない。
  • 選挙時にしか評価できない。
  • 政治家の人数に論理的根拠が何もない。
  • 集団で作業する利点が生かされておらず、集団の弊害のみが残っている。
政治家が悪いというのは簡単ですが、システムそのものがこれほど酷いものですから、誰がやってもろくな結果を残さないと思います。システムとして考えると、英雄だけが成果を上げるのではなく、普通の人が真面目に仕事をすれば、ちゃんとしたサービスが提供される状態にせねばなりません。それが基本です。
それらの問題を考慮すれば、マニフェスト選挙をやめて、契約選挙をすればよいかと思います。契約選挙という名前は私が便宜的に考えたもので、報酬の計算方法などを提示して選挙する方法です。例を挙げます。

例1 私たちは国家システムのコストを下げる事をお約束します。報酬はコスト削減金額の1/100です。
コストが増加した時は、増加金額分を賠償いたします。
例2 出生率を上げます。上昇率1%ごとにX万円の報酬をいただきます。下がった場合はもちろんその分を賠償します。

簡単な例ですが、こんな風に評価基準と報酬額を提示していただければ、国民がそのサービスを購入するかどうかを決められます。世間は政治離れなどと安易に言いますが、民意が反映されることがない、まったく意味のない選挙システムでそれを言うのは間違っています。常識的に考えて、消費者が興味を抱かないサービスは、消費者ではなく提供者が悪いのです。サービスを受ける側の国民が悪いというのはお門違いです。
なお、皆で多数決をとりながら全ての法律を決めるなどという馬鹿げたシステムは止め、責任を持った複数の集団が得意な法律を作る体制に変えたほうが、日本は絶対に良くなります。みんなで決めないと・・・などと言っているから何も決められないのです。コミュニケーションコストを考えると、そんなコストが高い状態では何も生産できないのは当たり前です。「決められない政治」になるのは至極当然であり、今更何を言っているのだと思えてなりません。
さらに言えば、一刻も早く簡単に国民が要望を出せるシステムを構築するべきです。それは最低条件です。そうしなければ、政治家がやりたくない事は何も実現されないからです。それは、民主主義の原則に反しています。具体的には、次のような要求を出せるようにします。

ストーカー規制法を正し、どんな道具を使っても他者に被害を加えられないようにする。賛成24320822件、反対12件。現在の順位1。期限は1週間。

そもそもどの職業にも最低ノルマや納期があります。国家サービスを考えたとき、これに該当するのは、現在の問題点を一刻も早く直すことです。ノルマがない職業はいまどき珍しいです。現状ではこの基本的なことが守られていません。国民の生命と財産を守るのが国家の役割であり、現状は異常といってもよいでしょう。
サービスの提供者は、サービスの消費者を満足させて報酬を得ます。その報酬とは、お金だけではありませんが、まともに働いている人が報酬を受け取れず、満足に働いてない人が報酬を得るのは間違っています。この異常な状態をただせば、日本は世界一の国になれる潜在能力があると思います。
私が言っていることは子供でも分かる当たり前のことだと思います。このバグを直せば、政治家と国民の双方が幸せになれます。それが本来あるべき姿ではないでしょうか?当たり前のことが当たり前になる状態になってほしいと願っています。

テーマ : 政治・時事問題
ジャンル : 政治・経済

初心者のためのC#プログラミング本格入門103 - セキュリティ意識をもってプログラミングしよう

 この記事は、初心者のためのC#プログラミング本格入門102の続きです。前回は、プログラムを分割して、テストの精度を高める方法について解説しました。今回は、セキュリティ意識を持ったプログラミングについて解説します。
 現在作っているSimpleListに、要素を追加する機能はありますが、追加した要素を削除する機能がありません。そこで今回は削除機能を作ります。テストファーストの精神に従ってテストから作りましょう。

//関係のないプログラムは省略しています。
class SimpleListTest : Test
{
    public override void ExecuteAllTest()
    {
        this.OneElementAdd();
        this.CurrentTest();
        this.AddElementCheck();
        this.ForeEachTest();
        this.ForeEachTest2();
        this.OneElementRemove( ); //ここに追加
    }

    private void OneElementRemove()
    {
        base.Execute( );
        int count = 10;
        for ( int i = 0 ; i < count ; ++i ) {
            this.target.Add( i );
        }
        this.target.Remove( );
        if ( this.target.Count != ( count - 1 ) ) {
            string message = "正しく削除されていません。";
            base.Error( message );
        }
    }
}

始は簡単なテストにしておきます。Removeを定義しておき、テストを実行しましょう。エラーメッセージが表示されることを確認しましょう。面倒だと思うでしょうが、意外とこうした確認作業は重要です。
 さて、Removeメソッドをどのようにプログラミングしましょうか?一番簡単なのは、配列の場所を指す変数をデクリメントする方法です。SimpleListオブジェクトは、insertIndexという変数で新たに追加する場所を管理しています。つまり、Removeメソッドを呼び出す前のinsertIndex変数は、今から追加しようとしているデータの場所を示しているのです。従って、要素を1つ減らすには、その場所を1歩下がればよい(変数を1減らす)ということになります。

//関係のないプログラムは省略しています。
partial class SimpleList 
{
    public void Remove()
    {
        this.data[ this.insertIndex ] = 0;
        --this.insertIndex;
    }
}

これでテストをパスできます。考える事がない、単純極まりないプログラムに見えますが、本当はそうではありません。配列に格納しているデータを消している点が非常に重要です。
 配列内にあるデータを消さないと、元のデータが残ってしまいます。そうしたデータは、ちょっとした技術力があれば調べられます。初心者の人は驚くでしょうが、クラッカーと呼ばれる悪い人たちは、こうしたちょっとした隙を使って悪さをします。使用しないデータは消すという心掛けが大切です。初心者がいきなり本格的なセキュリティプログラミングをするのは無理ですが、データを消すことならば誰でもできます。今のうちに、セキュリティにつながるプログラミングを習慣付けしましょう。プログラミングもまたスポーツと同じで日頃の練習が大事なのです。

テーマ : プログラミング
ジャンル : コンピュータ

ネタつつき148 - お前の代わりいくらでもいるという言葉に騙されない

 人は皆「世界に一つだけの花」だと私は考えています。人には色々な要素があり、それらすべての要素が一致することはあり得ません。一致するにはすべての要素が等価であると証明せねばなりませんが、それは実質不可能です。ですから、個人には一意性がある(世界に一つだけ)だと断言できます。これは感情論でもなんでもなく理論的な話です。等価な個人がいると考える方が、非理論的で感情論だと思います。
 しかしながら、世間には「お前の代わりはいくらでもいるんだ」と恫喝に近い交渉をする人が居ます。誰しもそう言われると反論しづらく、向こうの言いなりになりがちだと思います。言われてみれば確かに、代替が不可能な人間なんて存在しません。ノーベル賞を受賞するような偉人ですら、「お前が発明しなくても人類のうちいつか誰かが発明しただろう」と強引に言うこともできます。しかしながら、その人がその時に発明することが重要なのです。強引な屁理屈に騙されてはなりません。冷静に考えるとうまく対処できます。
 私もそういった場面に何度か遭遇しました。そのとき私は相手の言い分を認める事から始めました。そうすると相手も調子が狂います。大体こんな流れになります。
交渉相手「お前の代わりはいくらでもいる」
私「はい。そうですね。代替が不可能なサービスなんてありません。」
交渉相手「。。。そ、そうだ。分かっているなら話しは早い。もっとまけろ。」
私「それは出来ません。貴方様の要求を考えると、この金額になります。」
交渉相手「お前が認めたようにこちらは代わりが居るんだ。
 まけないと交渉を打ち切るぞ。」
私「失礼ながら買い手にも代わりはいます。
 交渉を打ち切るのも結構ですが、どう考えても貴方が損をしますよ。」
交渉相手「なぜだ?」
私「あなた様の要求を考えると、これほど投資効果が高い業者はほかにはいません。」
交渉相手「代わりはいると認めたよな。」
私「ええ。価格ならばもっと低くても受注する業者は存在するでしょう。
 しかしながらその分品質は落ちます。安物買いの銭失いになります。」
交渉相手「品質を下げても安い方が良いと言ったらどうする?」
私「貴方様が要求する基準を下げれば、その分価格は下げられます。
 当方はお客様の要求で価格を決めているので柔軟に対処できます。
 もしよろしければ要求の見直しを相談しませんか?」
交渉相手「。。。。。分かった。よく検討してみよう。」
もちろんこれでも、交渉を打ち切る人はいますが、別に気にしません。何故ならば、不利な交渉条件をのむならばその方がましだからです。
 実際一時的に交渉を打ち切っても交渉相手が損をするだけなので、向こうから泣きついてきます。それに加えて、無茶な要求をする相手は大概メリットを求めています。こちらの言い分ものんだ方がメリットがあると提示すれば、損得勘定がわかる人ならば受け入れます。分からない人の場合は、こちらにとっても交渉するメリットがありませんので打ち切ってもよいのです。
 「お前の代わりはいくらでもいる」という言葉には強制力がありますが、慌てず「等価な個人なんてありえない」と冷静に考えましょう。そうすれば、相手の無茶な言葉に振り回されなくても済みます。

テーマ : 情報処理技術
ジャンル : コンピュータ

VBオブジェクト指向プログラミング講座 第12回 デリゲートをマスターしよう

 この記事は、第11回 手続きも関数もオブジェクト の続きです。前回は、手続きと関数を、オブジェクトのように使える事について解説しました。今回は、手続きと関数をオブジェクトとして扱えるようにする、デリゲートオブジェクトについて解説します。
 まずは、デリゲートの使い方を示すサンプルを見てみましょう。

Module DelegateSample

    '手続き用デリゲートを宣言
    Delegate Sub Action(value As Object)

    '関数用デリゲートを宣言
    Delegate Function Func(left As Integer, right As Integer) As Integer

    Sub Main()
        'コンソールに出力する手続きを宣言
        Dim OutPut As Action =
            Sub(value As Object) Console.WriteLine(value)

        '足し算を宣言
        Dim Add As Func =
            Function(value1 As Integer, value2 As Integer) value1 + value2

        '1+1は?
        Dim x As Integer = 1
        Dim y As Integer = 1
        Dim message As String = x & " + " & y & " = "
        Dim result As Integer = Add(x, y) '関数を使用
        OutPut(message & result) '手続きを使用

        Console.WriteLine("処理を終了しました。Enterキーを押してください。")
        Console.ReadLine()
    End Sub

End Module

手続きと関数を呼び出している部分に注目してください。デリゲートでない普通の手続きと関数に見えます。
 この不思議なオブジェクト「デリゲート」は、プログラムではたった一言です。ですが、コンパイラはDelegateキーワードを見つけると、複雑なオブジェクトを作成しています。それがデリゲートの正体です。
 コンパイラが生成するデリゲートオブジェクトは、手続きと関数を示す特別な整数値(System.IntPtr)を保持します。この数値を使って、手続きと関数を適切に呼び出しています。他にも色々ありますが、あまり詳細を解説するとややこしくなると思いますので今回は止めます。サンプルプログラムを元に、デリゲートオブジェクトを使って、実験をしてみましょう。そうすれば、デリゲートオブジェクトの事がわかると思います。

テーマ : プログラミング
ジャンル : コンピュータ

実践的オブジェクト指向設計入門26

 この記事は、実践的オブジェクト指向設計入門25の続きです。前回は、物理的なパッケージ化について解説しました。今回は、設計における決定事項の文書化を解説します。
 いよいよ、オブジェクト指向設計の最後の作業です。今まで設計で様々な決定を下してきました。それらの決定を文書化する必要があります。システムは終わりがありません。後でシステムをバージョンアップする場合や、開発の途中で仕様が変更される場合すらあります。そうした状況が起こることを前提に、担当者が変わっても今までの流れがわかる状態にせねばならないのです。そのために文章を清書します。
 ただし注意するべき事があります。それは、下書きは他の作業と並行するのが前提である事です。いきなり全てを文章化しようとしても上手くいきません。全ての決定事項を、詳細かつ正確に覚えていられないでしょう。しかしながら、文書化という手段を目的にしてしまう人が居ます。こうした過ちは人間ならば誰しもする可能性があります。文書化はあくまでも手段であって目的ではありません。十分に注意しましょう。
 以上でオブジェクト思考法論OMTにおける、オブジェクト指向設計は終わりです。世の中にはほかにも方法論がありますし、物事は教科書通りに進みません。オブジェクト指向方法論OMTを学び、その知識を応用しましょう。そうすれば、システムの品質は飛躍的に上がるでしょう。この連載を読んでくれた方のご活躍を心から願っています。終わり。

テーマ : ソフトウェア開発
ジャンル : コンピュータ

中の人の徒然草436 選挙に向けて政党制度について考えた

もうすぐ選挙が違いようなので、今の国家システムについて考えてみました。システム屋として、システムを考えた場合、今の選挙自体無意味です。政党もいりません。政治家が悪いといわれがちですが、この粗末なシステムでは政治家だって困っているでしょう。
日本の立法システムは、集団の短所を前面に出し、個人能力と集団の利点を消しています。まことに不合理なシステムです。今は秒進日歩の時代です、みんな賛成してから法律を作ろうなどと、悠長な事を言っていられません。システムとして考えたとき、立法スピードが問題発生数よりも上回らないと意味がありません。しかしながら、数百人の人間の意見が一致してから・・・などという悠長なシステムになっています。これでは莫大なコミュニケーションコストが発生し、決められない政治になるのは至極当然です。
日本の立法システムは、数が全てですから政党を作ることになります。しかしながら、その政党というものが曲者です。コミュニケーションコストを削減する効果はほとんどありません。それどころか、利害関係が生じて法律の質が悪化します。
ここで考えなくてはならないのは、そもそもこの複雑化した社会において、全ての事を熟知している人間が数若人もいるか否かです。答えは明白です。国家レベルで全てを把握している人間は数百人も居ません。その時点でこのシステムは破綻しています。
ではどうすればいいのかといいますと、ビジネスの世界では常識となっている5・6人のチームを複数設け、個別に問題を解決する方法です。会社が複数の部署に分かれているのはこのためです。法律も少数の専門家が5・6人のチームを組み、その人たちに責任をもって仕事をしてもらうのが適切です。したがって、何回選挙しても日本はよくなりません。ただお金と時間が浪費されるだけです。
そんな理想的な状態があるのかと疑問に思う人もいるでしょう。しかし実在します。それはマイクロソフト社です。Windowsは頻繁にアップデートされ、アジャイルに複雑なシステムソフトが開発されています。巨大すぎる会社だと非難されることが多いのですが、ビルゲイツ氏は少数の精鋭チームを社内で作り官僚主義になるのを避けています。そのお蔭で今日の超巨大な企業になっています。規模が大きくなると、理解せずに悪口を言う人がどうしても出現しますが、マイクロソフト社の実際の姿を知ればそのすごさにきっと驚くと思います。悪口を言う人の中で、ビルゲイツ氏を超える能力を持ち、マイクロソフト社に勝てる会社を作れる人は何人いるのでしょうか?
つまり日本の国家システムがあるべき姿は、頻繁に法律がアップデートされ、国民の生命と財産が守られる状態を維持するというものです。現状は政治家が法律を作ってくれるのを、指をくわえて待っているしかありませんが、本来サービスというものは、問題があるとお客様から指摘をつければすぐさま修正するものです。
それに比べて、今の日本の国家システムは何もかもが遅いです。メールでストーキングしても捕まらない、などといった馬鹿げたセキュリティホールがあったりします。もし日本の国家システムがスピーディならば、メールが発明されたと同時にストーキングを防止するはずです。いえそれ以前に、法律の書き方がおかしいです。新しい道具が発明されるのを前提に法律を書かないのは愚かです。日本はセキュリティ意識があまりにも低すぎます。国民の生命と財産が適切に守られていません。
こうした問題を政治家個人の責任にするのは簡単ですが、システムそのものを見直さない限り、政治家の能力が生かされることはありません。そもそも国家レベルの全問題をすべて把握し、適切に処理できる人間が数百人そろうことはあり得ません。そんなありえない事を前提にするシステムは馬鹿げています。マイクロソフト社を見習って、よりより早く法律をアップデートする体制を整えるべきです。
日本の選挙は手段が目的化しています。そんな愚かな行為を続ける意味はありません。目先の選挙という手段に騒がず、国家システムを一から考えるべき時期が来ていると私は思います。

テーマ : 日記
ジャンル : 日記

中の人の徒然草435 自分が望む報道について考えてみた

私は何度か、日本のマスメディアが発信する情報の質が悪いと書きました。ならば、どんな情報ならば質が良いのかを書かないとただの誹謗中傷と勘違いされるかもしれません。そこで、質が良い情報について考えました。
質が良い情報とはなにか、それについては質が悪い情報について考えたほうがわかりやすいので、まずは質が悪い情報を述べます。

【質が悪い情報が持つ性質】
  • 個人攻撃に終始している。
  • 背景について書かれていない。
  • 感情的すぎる。
  • 書き手の想像だけで書かれている。
  • 事実がもれなく書かれていない。

まことに残念ながら、日本のマスメディアが発信する情報はこれらの性質を持っています。特に最近は政治闘争ゆえに頻繁にこの手の情報があります。どの週刊誌とはあえて言いませんが、差別意識だけで市長の一族を貶めていました。これを報道の自由と呼ぶのであれば、犯罪する自由があるのと言っているのと同じです。誰も犯罪行為を自由と考えませんから、報道の自由とは何かと問い詰めたくなります。自由とは、他人の権利を侵害しない限り保障されるものです。他人の自由を奪っておいて、自分だけは自由があると主張するのは、あまりにも非論理的です。これを許すと社会が成り立ちません。
察しが付くと思いますが、私が考える質が良い情報は、質が悪い情報とは反対のものです。

【質が良い情報が持つ性質】
  • 個人ではなくシステム、もしくは論理に注目して書かれている。
  • 背景について詳細かつ分かりやすく書いている。
  • 書き手の感情をほとんど書かない。
  • 事実だけを淡々と書いている。
  • 事実をもれなく書いている。

残念ながら、日本の報道ではこの性質を満たした情報が得られません。といっても、海外の報道が良いといっているのではありません。他国は関係ありません。たとえ他国がこれらの情報を発信していなくとも、日本は質が良い情報を発信するべきです。他国の情報の質が悪くとも、それは免罪符になりません。仕事は本来そうあるべきです。
困ったことに、私たち非マスメディア業界の人間は、他の仕事がありますので、本格的に調べることができません。そのジレンマをどう解決するのか、それが日本の課題なのかもしれませんね。何はともあれ、質が悪い情報は買わない、質が良い情報にはちゃんとお金を出す、その2つを守って質が良い情報を得られる環境を整える必要があるかと思います。

テーマ : 日記
ジャンル : 日記

初心者のためのC#プログラミング本格入門102 - テストはプログラムを分けよう

 この記事は、初心者のためのC#プログラミング本格入門101の続きです。前回は、テストとオブジェクト指向の関係について解説しました。今回は、プログラムを分割してテストの精度を高める方法について解説します。
 前回のテストプログラムの問題点がわかったかな?正解は・・・

//関係のないプログラムは省略しています
class SimpleListTest : Test
{
    public void AddElementCheck()
    {
        base.Execute();
        //一旦実行させる
        for ( int i = 0 ; i < 10000 ; ++i ) {
            this.target.Add( i );
        }
        //チェックプログラム
        for ( int i = 0 ; i < 10000 ; ++i ) {
            int result = this.target[ i ];
            if ( result != i ) {
                string message = "予期せぬ値が返されました。" +
                    "予想値:" + i +
                    " 返された値" + result;
                base.Error( message );
            }
        }
    }
}

前回との違いは、テストするメソッドの実行とチェックプログラムを分けている点です。試しに新しいテストを実行してみましょう。すると、大量のエラーが報告されます。この結果は、SimpleListが大量のデータに対応できない事を示しています。
 テストするメソッドとチェックプログラムを分けると、何度か実行した後に発生するエラーをとらえられます。とくに耐久テストの場合、テスト対象の決まったメソッドを何回も実行します。この状況下では、エラーは耐えきれなくなった後で発生します。従って、すべて実行した後でチェックする方が正しいテスト結果を得られます。
 エラーがあるのがわかったので、デバッグ(プログラムにある間違いを取り除く行為)をしましょう。エラーメッセージをよく観察すると、格納されている数値が0になっているのがわかります。その事実から、格納した数値が消えていると推測できます。試しにブレークポイントを、
this.data = new int[ this.data.Length * 2 ];
の行に設定してみましょう。そのあとデバッグ実行(F5)し、止まったらステップイン(F7)を1回だけ押し、ローカルウィンドウを見てください。そうすると、配列変数の「data」内の数値が0になっている事を確認できます。エラーの原因がわかったら解決したのも同然です。配列内の数値が消えるのが問題なのですから、新しい配列を作った後に、元の数値を格納すればよいとわかります。

//関係のないプログラムは省略しています
partial class SimpleList 
{
    public void Add( int value )
    {
        ++this.insertIndex;
        if ( this.insertIndex == this.data.Length )
        {
            int[ ] tmp = new int[ this.data.Length * 2 ];
            for ( int i = 0 ; i < this.data.Length ; ++i ) {
                tmp[ i ] = this.data[ i ];
            }
            this.data = tmp;
        }
        this.data[ this.insertIndex ] = value;
    }
}

これでOKです。今度はテストを実行してもエラーメッセージが表示されません。
 今回解説したことは耐久テストで必須となる知識です。言われてみれば簡単だと思うでしょうが、知らないと意外と本場で失敗します。ちょっとしたことでも、経験者と未経験者に差が出ます。その小さな差が積み重なって大きな差となります。しかし所詮小さなことですから、覚えて初心者を卒業しましょう。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター