fc2ブログ

ネタつつき218  - 好きでもない仕事はするな。好きでない人は雇うな。

 巷では「好きなことは職業にするな」といわれる場合もあります。日本の場合これが極端になり、その仕事を好きだという人を採用しないなどといった人事担当者もいるそうです。今回はその件について、自分の考えを書きます。
 結論から書くと、「好きでもない仕事につくな」と考えています。私がかく言う理由が三つあります。それをこれから書きます。
 第一に「仕事の苦痛に耐えられるのか」と考えたとき、好きでもない仕事で耐えられないと考えるからです。どんな仕事でもつらいことがあります。また、どんな仕事も地味です。システム開発を派手なものだと勘違いしている若者がいますが、これほど人間臭くて地味な仕事はありません。どんな仕事にも人間関係があり、地味な作業の連続です。嫌いな職業で、そのつらく地味な作業に耐えられるのでしょうか?私は耐えられないと思います。
 第二に「向上心を持てるのか」という問題があります。どんな仕事でも向上心が必要です。例えば、アルバイトでも、究めようと思えば、いくらでも努力できます。人間の仕事に完璧はないのです。あるのは理想に向かって突き進む、人間の意志だけです。嫌いな仕事に向上心を持てる人がいるでしょうか?好きでも向上心がない人がいるのですから、嫌いならばお話にならないと私は考えています。
 第三に「いやいややったらお客様に失礼」だという事が考えられます。意識していない人もいるかと思いますが、好きでもない仕事を嫌々しているという事は、お客様にも伝わってしまいます。嫌々されて、気持ちがいい人はいません。お客様指向といっておいて、その仕事を好きでもない人にやらす会社は、何を考えているのでしょうか?論理的整合性がありません。
 纏めます。全ての仕事は地味で、苦痛が伴います。それでも、完璧な仕事というものは、この世に存在せず、高い志を持って仕事をせねばなりません。嫌々仕事をされて喜ぶ人はいません。従って、「好き」は仕事の必要条件だと思います。好きだけでは、仕事ができないので、必要十分条件ではありませんが、必要条件を満たさないと話になりません。仕事の「好き」の度合いをもっと考慮するべきだと私は思います。
スポンサーサイト



ネタつつき217  - 教育と技術向上に必要なもの

 世の中は、「才能」という言葉を使いたがります。他者に対して良い影響を与えるために使用するのであれば問題ありません。しかしながら、不適切に使用する人が多く、その言葉によって傷つけられた人が多いようなので、今回はその件に関して書きます。
 私自身は才能という言葉を「数値化できない非常にいい加減なもの」だと考えており、自分が才能あるのかなどと考えたことがありません。才能なんてものはどうでもいいものです。ですが、たまに「君は才能がない」といわれたり、「自分に才能がない」などと考えたりして、傷ついた人に出会います。
 私は「才能がない」なんて言葉を、口にする人の気がしれません。そんなことを言う人に対しては、「貴方は神様ですか?」と思います。人間である以上、才能なんてものは真にわかるはずがありません。また、人を傷つける権利もありません。従って私は、新人に対して「君は才能がある」といって褒めた事しかありません。才能という言葉は、人を褒めるときにしか使用してはならないというのが私の持論です。人は褒めて伸ばすものです。
 私が初めて歩いた時、両親から褒められて伸びました。それを覚えているので、私は他者に対して積極的に褒めます。特に新人教育を任せてもらった時は、褒める事しかしません。たまに、それを疑問視するクライアントもいますが、「情報技術に必要なのはラヴ&パッションだけです」と答えます。私は本気でそう考えています。そのほかに必要なものは何もありません。才能?そんな曖昧なものは、どうでもいいです。そんなものは犬のえさにすればいいです。
 情報技術を学ぶ上で重要なのは、それをどれくらい愛しているのかと、それに対してどれぐらい情熱を持っているのかの2点だけです。私は情報技術がなければ死んだ方がましだと考えるぐらい、情報技術を愛し、永遠に情報技術を極めたいと考えるぐらいに情熱を持っています。金よりも、女よりも、名誉よりも、何よりも、情報技術を愛しています。自分の技術力はそれだけで伸ばしました。例え、人から「君に才能はない。やめるべきだ。」といわれても「やらないぐらいならば死を選ぶ」と答えるだけです。情報技術に初めてであった中学生の時から、迷ったことがありません。私の人生に情報技術以外(※家族愛や友情などを除くとです)ありません。
 纏めます。才能という言葉は、使用法を間違えれば、人を傷つける凶器になります。しかし何人たりとも他人を傷つける権利はありません。才能は人を褒めて伸ばすとき以外に使用してはなりません。技術を極めるのに必要なものは、愛と情熱だけです。何にも惑わされず、ただひたすらに、技術を愛し、常に情熱をもって生き続けましょう。そして、人は褒めて伸ばしましょう。それが唯一の真理です。

テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

C#ライブラリリファレンス - データを集合として扱う

概要
 集合としてデータを扱いたい場合は、ハッシュセット(HashSet)ジェネリックオブジェクトを使用します。

日常でたとえると
 子猫の集まりと、子犬の集まりを合体させたら、すごい癒し空間になるよ。

使用に適した状況
 集合論でデータを扱いたい場合に使用します。集合論の使用できる場面は、あらゆる状況だといえますが、他にもコンテナオブジェクト(リストやディクショナリー)があるので常用する必然性はありません。データベースとの連携で使用するとよいでしょう。

サンプル

/*----------------------------------------------------
 * 
 *  ハッシュセット(集合)の使い方
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //男性の偉人リストを作成
        var man = new HashSet<string>();
        man.Add( "坂本龍馬" );
        man.Add( "西郷隆盛" );
        man.Add( "織田信長" );
        man.Add( "武田信玄" );
        man.Add( "マハトマ・ガンディー" );
        PrintNumbers( "男性の偉人リスト", man );

        //女性の偉人リストを作成
        var women = new HashSet<string>();
        women.Add( "紫式部" );
        women.Add( "ジャンヌダルク" );
        women.Add( "卑弥呼" );
        women.Add( "エカチェリーナ" );
        women.Add( "清少納言" );
        PrintNumbers( "女性の偉人リスト", women );

        //偉人に性別なんて関係がない
        var human = new SortedSet<string>( man );
        human.UnionWith( women ); //集合ならでは
        PrintNumbers( "偉人リスト", human );

        //集合演算を試す
        SetOperator( man, women, human );

        //終了
        Console.ReadLine();
    }

    //数値を表示。
    private static void PrintNumbers(
        string tile,
        IEnumerable<string> datas )
    {
        Console.WriteLine( "***** {0} *****", tile );
        foreach ( var d in datas )
            Console.WriteLine( "{0} ", d );
        Console.WriteLine();
    }

    //集合演算を試す
    private static void SetOperator(
        HashSet<string> man,
        HashSet<string> women,
        SortedSet<string> human )
    {
        //子集合を判定
        Console.WriteLine(
            "男性の偉人リストは、偉人リストの子? : {0}",
            human.IsSupersetOf( man ) );
        Console.WriteLine(
            "女性の偉人リストは、偉人リストの子? : {0}",
            human.IsSupersetOf( women ) );
        Console.WriteLine(
            "女性の偉人リストは、男性の偉人リストの子? : {0}",
            man.IsSupersetOf( women ) );
        Console.WriteLine();

        //親集合を判定
        Console.WriteLine(
            "偉人リストは男性の偉人リストの親? : {0}",
            man.IsSubsetOf( human ) );
        Console.WriteLine(
            "偉人リストは女性の偉人リストの親? : {0}",
            women.IsSubsetOf( human ) );
        Console.WriteLine(
            "女性の偉人リストは、男性の偉人リストの親? : {0}",
            women.IsSupersetOf( man ) );
    }
}


名前空間
 ハッシュセットジェネリックオブジェクトは、System.Collections.Genericにあります。集合を扱いたい時は、LINQプログラミングが役立ちます。System.Linq名前空間も参照しましょう。

解説
 データベースを扱う人で必須知識の集合論があります。集合論では、データを「物の集まり」だと考え、個々ではなく、一度にたくさんのデータを操作します。マスターすると、大変有効にデータを活用できるようになります。
 C#で集合を扱いたい場合、HashSetクラスを使用するのが自然です。ですが、昨今では、LINQプログラミングの守備範囲と重なり、IEnumerableインタフェースを実装したオブジェクトであれば、集合指向プログラミングができるので微妙な立場です。とはいえ、プログラムに明示性を持たせるのは大切なので、集合で扱いたいことを明示するために、HashSetクラスとLINQプログラミングを使うとよいと思います。

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

ネタつつき216  - 初心は大切

 「初心忘るべからず」という言葉があります。これが大切だという事は誰も知っています。しかしながら、実際に行っている人が多いと見受けられます。そこで今回は、「初心忘るべからず」について書こうと思いました。
 私が最も経験した初めては、「初めて歩いた時」です。その日は、両親に連れられて、家の前で日向ぼっこをしていました。少しの間何もせずに日向ぼっこをしていましたが、「この子が立って歩くかどうか試さない?」と母がいい、父も微笑みながら頷き、両親は少し離れたと場所に立ち、私の名前を呼びました。
 その当時の私はまだ赤子で、知らない単語が大量にありましたが、何となく両親の言葉の意味を理解しており、「うちの親は僕が立って歩く姿が見たいんだ」と思いました。まだ立って歩くことの意義がわかりませんでしたが、その日はよく晴れており気分もいいし、道に雨水が流れるように作られた小さな溝が細い線となっており、それが面白くて、その線の上を立って歩きたくなりました。
 初めて歩こうとするとき、赤子の私はちょっと戸惑いました。両親をまねて立とうとすると、まだ足腰が弱いのか、思ったよりも難しかったからです。くじけそうになりましたが、ちょっと立とうとするだけで、両親が驚いてはめてくれるものですから、「難しいけどもやってみよう」と硬く決心しました。その結果、ふらつきながらも根性で何とか数歩歩けました。
 そうすると、両親はすごく感激し、ちょっと涙ぐみながら、ものすごく喜んで褒めてくれました。赤子の頃はぼーとしている時間の方が長くて、思い出が少ないです。蟻を観察したり、風景を楽しんだり、両親の会話を聞いていたりしていましたが、殆どの時間は寝ていましたのですから当然そうなります。しかしながら、この時の嬉しさは今でも忘れません。初心は誰しもうれしいものであり、大切な宝物になります。
 ほかにも初めてPCに触れたとき、初めてインターネット知った時、初めてプログラミングしたとき・・・など、色々な初めての思い出を大切にしています。そして、困難な仕事にぶち当たった時に、初心を思い出し、それを原動力にしてアグレッシブに挑戦しています。
 人間はえてして、初めての事を忘れてしまい、負の感情に支配されることが多いです。今更こんなことできない、やっても失敗する・・・などと後ろ向きの人が多く見受けられます。かく言う私も、もちろん後ろ向きになる瞬間があります。しかし、初心を忘れなければ、後ろ向きな心を前に向き直して、何歳であろうとも何事に対しても楽しく挑戦できます。
 何事も挑戦しなければ、「初めての感動」を味わえません。良い思い出を得るために、常に前向きになりましょう。もし失敗しても、泣いても笑っても、全てがよい思い出になります。時には休息をとりながら、どんどん前に進みましょう。そうすれば、苦楽を含め人生が楽しいものになります。

テーマ : 人生を豊かに生きる
ジャンル : 心と身体

C#ライブラリリファレンス - 重複する値を持つデータを格納管理する

概要
 キーと値を組で格納管理したい場合、ディクショナリジェネリックオブジェクトを使用するとよいでしょう。

日常でたとえると
 言葉に番号が割り振られている国語辞典。

使用に適した状況
 同姓同名がいる顧客リストなど、リストでは上手く扱えないデータを格納管理したい時に使用するとよいでしょう。

サンプル

/*----------------------------------------------------
 * 
 *  辞書(ディクショナリー)のデータライフサイクル。
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //男性の偉人リストを作成
        var man = new Dictionary<int, string>();
        man.Add( 3, "坂本龍馬" );
        man.Add( 8, "西郷隆盛" );
        man.Add( 5, "織田信長" );
        man.Add( 15, "武田信玄" );
        man.Add( 33, "ガンダーラ" );
        Print( "男性の偉人リスト", man );

        //女性の偉人リストを作成
        var women = new Dictionary<int, string>();
        women.Add( 20, "紫式部" );
        women.Add( 12, "ジャンヌダルク" );
        women.Add( 9, "卑弥呼" );
        women.Add( 14, "エカチェリーナ" );
        women.Add( 22, "清少納言" );
        Print( "女性の偉人リスト", women );

        //偉人に性別なんて関係がない
        var human = new SortedDictionary<int, string>( man );
        foreach ( var d in women ) 
            human.Add( d.Key, d.Value );
        Print( "偉人リスト", human );

        //ガンダーラって誰?
        Console.WriteLine(
            "[{0}, {1}]を削除します・・・",
            33,
            human[ 33 ] );
        human.Remove( 33 );

        //もしかしてガンジー?
        human.Add( 18, "ガンジー" );
        Console.WriteLine(
            "[{0}, {1}]を追加しました。",
            18,
            human[ 18 ] );

        //正式名に変更
        human[ 18 ] = "マハトマ・ガンディー";
        Console.WriteLine( "ガンジーを正式名に変更します。" );
        Console.WriteLine();

        //最終リスト
        Print( "最新偉人リスト", human );
        Console.ReadLine();

        //終了
        Console.ReadLine();
    }

    //辞書の内容を表示。
    private static void Print(
        string tile,
        IDictionary<int, string> datas )
    {
        Console.WriteLine( "***** {0} *****", tile );
        foreach ( var d in datas )
            Console.WriteLine( "{0} ", d );
        Console.WriteLine();
    }
}


名前空間
 System.Collections.Generic名前空間を参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。

解説
 値だけを扱うリストジェネリックオブジェクトでは、同じように見える値をうまく扱えません。例えば、同姓同名の人がいる場合、名前だけでは重複値となり、正しく扱えません。
 そのような重複する値が想定されるデータを扱いたい場合、データベースでやっているように、キーを別に定めて、プログラミングを行います。その時活躍するのが、ディクショナリージェネリックオブジェクト(Dictionary)です。
 ディクショナリージェネリックオブジェクト(Dictionary)は、主にキーで検索し、値を操作します。もちろん値を使っても検索できますが、元々の動機が「重複した値も分けて扱いたい」ですから、バグになる可能性が大いにあります。素直にキーを主体にデータを扱いましょう。
 キーを扱う事さえ気を付ければ、さほど難しいオブジェクトではありません。有効活用しましょう。リストしか扱えない人よりも、断然表現力が高まるので、ぜひ習得しておきたいオブジェクトです。

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

C#ライブラリリファレンス - 常に整列されている状態でデータを格納管理する

概要
 SortedListクラスを使えば、常にソートされた形でデータを格納管理できます。

日常でたとえると
 会社の倉庫は常に整理されている。

使用に適した状況
 データ発生件数よりも参照している回数の方が多い場合。もし、大量のデータが発生している状況で使用すれば、ソートコストによりパフォーマンスが悪くなります。

サンプル

/*----------------------------------------------------
 * 
 *  常にソートされているリストのサンプル
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //数値のリストを作成
        var numbers = new SortedList<int, int>();
        for ( int i = 1 ; i < 10 ; ++i ) {
            numbers.Add( i, i );
        }
        PrintNumbers( "0~9の数値:", numbers );

        //0を忘れていた!
        numbers.Add( 0, 0 );
        PrintNumbers( "0を追加:", numbers );

        //マイナス値も欲しい
        for ( int i = 1 ; i < 10 ; ++i ) {
            numbers.Add( -i, -i );
        }
        PrintNumbers( "-9~9の数値:", numbers );

        //0を10にしてみる
        //キーではないので順番は変わらない
        numbers[ 0 ] = 10;
        PrintNumbers( "0を除く-9~10の数値:", numbers );

        //そうだ0を消して10を入れよう
        numbers.Remove( 0 );
        numbers.Add( 10, 10 );
        PrintNumbers( "0を除く-9~10の数値:", numbers );

        //終了
        Console.ReadLine();
    }

    //数値を表示。
    private static void PrintNumbers(
        string tile,
        IEnumerable<KeyValuePair<int, int>> numbers )
    {
        Console.Write( tile );
        foreach ( var number in numbers )
            Console.Write( "{0} ",
                number.Value );
        Console.WriteLine();
    }
}


名前空間
 System.Collections.Genericを参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。

解説
 通常のリストジェネリックオブジェクトは、データを格納した後、Sortメソッドを使って並び替えます。適切な状況を選んで、ソートしてから処理をする場合それでも良いのですが、システムの仕様上、常にソート(整列)されなければならないときあります。
 もしこのような状況下で、プログラマに任せてしまうと、些細なミスで仕様を満たさなくなります。この事態は、状況によっては非常に見つけにくいバグとなる可能性があります。従って、個人がメソッドを呼び出すことを要請して、リストジェネリックオブジェクトを使用するのは不適切なのです。
 幸い.NETのライブラリには、その名も SortedListという要望に合致したオブジェクトが用意されています。このオブジェクトを使用すれば、バグを未然に防ぐことができます。ただし、だからといって、常にSortedListを使用するのは賢明といえません。
 あくまでも、ソートされているのが前提となっているシステムの実装で使用するものであり、基本的にはリストジェネリックオブジェクトを使用するようにしてください。そうしないと、オオカミ少年のようになってしまい、プログラムの意図が正しく伝わらなくなってしまいます。また、ソートにコストがかかるので、無意味にパフォーマンスを下げる結果になってしまいます。
 最後に一つ注意するべきことがあります。それは、SortedListに格納する要素には、整列の基準となるキーが必要である点です。リストと同じ感覚で使用すると、少し面食らうと思います。

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

中の人の徒然草493 人を攻撃する事ばかり考えている野蛮な状態にうんざり

 ここ最近私が感じたのは、日本は非常に冷たい野蛮な国になりつつあるという事です。ストーカー被害で人が殺されても、何時までも法律を変えない国会議員たちは何を考えているのでしょうか?誰かを常に攻撃しているマスメディアと世間?は何を考えているのでしょうか?・・・色々な事例から冷たく野蛮であるという現状であると感じます。
 法律はいわばサービスです。自分が製造しているサービスで、人が殺されても対処できないとなれば、被害者の事を考えて涙し、聞いた瞬間から改善案を出し対策するというのが普通の人の行動だと私は思います。不備があれば、1日以内に対処するのが私の基本姿勢です。私がもし、自分が開発したシステムで、人の命がなくなる原因となったのであれば、非常に深刻に受け止めます。それにも拘らず、日本は法律を作るスピードが遅すぎます。こんなサービスは通常では考えられません。また、そこを指摘しないマスメディアにも幻滅しています。
 彼らが主張するように報道に正義や意義があるというのであれば、立法者達に対して「何が原因か」「何時対処するのか」「どこをどのように改善するのか」と問い詰めるのが当然であって、誰かをバッシングして満足しているその姿にプロとしての誇りを感じません。感じるのは被害者が出ても何も感じず、ただ売れればよいという冷酷さです。そんなサービスが報道というのであれば、そんなものは一層の事、なくなってしまえばいいと私は思えてなりません。誰かを傷つけるだけのサービス何て、犯罪と何ら変わりません。いったいどこが違うというのでしょうか?
 とにかく、日本はずいぶんと冷たく野蛮な国に成り果ててしまったようです。私は日本に生まれ、自分の環境に感謝して生きてきましたが、その考えが揺るいでいます。日本には良い人が沢山住んでおり、良い文明も持っています。ですが、今の日本は、人が死んでも放置し、ただ誰かかを攻撃して儲ける。そんな、非人間的な側面が強く出ています。私にはそれが残念でなりません。日本は良い面もたくさん持っており、その部分が殺されている状態になっているのは不快です。人間の野蛮で冷酷な面を強調する現状は、けっして好ましいとは言えず、良い面が生かされるように心がけねばならないと私は思いました。

テーマ : ニュース
ジャンル : ニュース

ニュースを分析24回 - 美味しんぼの表現問題を考えよう

 最近話題となった「美味しんぼ」の表現が話題になり、その時に、日本の病巣が明らかになったのでそのことについて、私が分析したことを書きます。結論としては、先ほど言ったように、日本の病巣がよくわかると思いました。
 美味しんぼという漫画が、取材を基にしたフィクションで、「鼻血が出る」と書いて騒動になりましたが、非常に非理論的に騒いでいたのが気になります。前提として、漫画はフィクションのものです。それを鵜呑みにして、騒ぐというのは大人として恥ずかしいです。それに加え、前編と後篇に分かれているのも関わらず、前編だけ見て騒ぐというのは、話を聞けない人というしかありません。理性的に考えるのであれば、後篇を見ないと結論を出せないと考えるのが至極当然です。
 また、政府関係者が、庶民が読む漫画の表現にまで口を出すというのも如何なものかと思います。おそらく、マスメディアの人が取材しに行ったというのもあるのでしょうが、漫画の表現を権力者が一方的に批判するのを許せば、表現の自由はなくなってしまいます。普段から表現の自由を売り文句にしているマスメディアは、何を考えて政府関係者の意見ばかりを取り上げたのか、不思議で仕方がありません。表現の自由はどこに行ったのでしょうか?
 もう一つ気になるのは、鼻血が出なかった人がいるからあり得ないと騒いでいる件です。論理的に考えるのであれば、100%同じ症状が出るとは限りません。そういう症状が出る人もいれば、違う症状が出る人もいると考えるのが合理的であって、鼻血が出ない人がいるから嘘を言っていることにはなりません。他の可能性を考えず、批判だけをするのは感情論であって、大人がする姿勢ではありません。
 もっと問題なのは、批判者たちが「鼻血が出た」という被害者に対して、何の心配もせず、ただひたすらに漫画を攻撃する点です。被爆した結果かどうかは明らかになっていませんが、国民が健康被害を訴えているにもかかわらず、原発を再稼働したいからといって、無暗に批判するという姿勢は頂けません。この態度から、政府の人たちが国民の健康を気にしていないと思えてなりません。
 私が一番気になったのはここです。放射能の被害は、人道的見地から言って、人体実験で研究していないので、色々な部分が明らかになっていないようです。しかしだからといって、「わからないからそうでない」というのは、理論的に 妥当とは言えません。わからない事をすべて否定すれば、あらゆる学問は成り立ちません。わからないから研究するのであって、始めから「わからないからあり得ない」と思考を放棄するのであれば、人類の進歩はあり得ず、学問をする人の姿勢ではありません。
 これらの事を総合して考えれば、戦前に日本を戦争へと駆り立てた反省が一切なされておらず、相も変わらず、非理論的に騒いでいるという事です。日本の言論は、一つの意見に強制される傾向があり、そこを直さねば、また同じ過ちが繰り返されます。放射能で鼻血が出る可能性と、そうでない可能性を考えましょう。そして、その症状を訴えている人の事を思いやる。そんな、理性的で温かい社会でなければならないと私は考える次第です。

テーマ : 文明・文化&思想
ジャンル : 学問・文化・芸術

C#ライブラリリファレンス - スタックを使って後入れ先出し法でデータを管理する

概要
 スタックジェネリックオブジェクトを使用すれば、複数のインスタンス(データ)を後入れ先出し法で格納管理できます。

日常でたとえると
 入社して間もない人から順番に社員研修を受けてもらう。

使用に適した状況
 インスタンス(データ)の格納する順番に重要な意味がある場合。後入れ先出し法は、文字列解析などに使用します。また、昔は会計システムでも後入れ先出し法が重宝されていました。

サンプル

/*----------------------------------------------------
 * 
 *  スタックにより後入れ先出しでデータを管理。
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;


class Sample
{
    static void Main( )
    {
        //スタックを用意
        var datas = new Stack<int>();

        //スタックにデータを追加
        Console.WriteLine(
            "***** スタックにデータを入れます *****" );
        Action<int> Add = ( int value ) => {
            datas.Push( value );
            Console.Write( " 追加した数:{0}",
                value );
        };
        ProcessPrint(
            datas,
            Add );

        //スタックからデータを取り出す
        Console.WriteLine(
            "***** スタックからデータを取り出します *****" );
        Action<int> Get = ( int i ) => {
            int value = datas.Pop();
            Console.Write( " 取り出した数:{0}",
                value );
        };
        ProcessPrint(
            datas,
            Get );

        //終了
        Console.ReadLine();
    }

    //追加または取り出すときの様子を表示する。
    private static void ProcessPrint(
        Stack<int> datas, Action<int> process )
    {
        for ( int i = 0 ; i < 10 ; ++i ) {
            Console.Write( "処理前の個数:{0}",
                datas.Count );
            //空の時Peekを呼び出すと例外が発生
            Console.Write( " 先頭の数:{0}",
                datas.Count != 0 ?
                datas.Peek().ToString() :
                "0" );
            process( i );
            Console.Write( " 処理後の個数:{0}",
                datas.Count );
            Console.WriteLine();
        }
        Console.WriteLine();
    }
}

名前空間
 System.Collections.Generic名前空間を参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。

解説
 プログラミングでは、データ(オブジェクトのインスタンス)をただ集めればいいというものではなく、格納した順番が重要な意味を持つ場合があります。リストジェネリックオブジェクトでもデータを格納できますが、誰かが整列してしまうかもしれませんし、プログラマに対して入れた順番の逆順(後に入れたものを先に出す)に、取り出すのが重要であることを明示しなくてはなりません。
 データを入れた順番とは逆に取り出して処理をしたい場合、Stackジェネリックオブジェクトを使用します。このオブジェクトは、Push(プッシュ)メソッドでデータを入れ、Pop(ポップ)メソッドで後入れ先出し法にてデータを取り出します。
 取り出したデータは消えてしまうので、先頭のデータを調べたい時は、Peekメソッドでスタックの中を覗きます。ただし、空の時に覗くと怒られる(例外が発生する)ので注意しましょう。
 後入れ先出し法の使い道がわからない人がいるのでちょっとだけ解説します。コンパイラのアルゴリズムで、後入れ先出し法を使います。これは、文字列を解析し、意味を割り出すために行います。コンパイラのアルゴリズムを知らない人がいるかもしれないので、現実に例も挙げます。現実の例は原価計算です。
 今は会計法規が変わって禁止されましたが、結構使用されていました、というのも、新しい製品の製造に力を入れている会社は、月初仕掛品換算量よりも月末仕品換量(材料の量)の方が多いもしくは同じぐらいだからです。もしこの場合に、先入れ先出し法で原価を計算してしまうと、極端にコストが安くなる恐れがあります。何故ならば、材料の物価が上昇している場合、昔の材料の物価が極端に安い場合があり得ます。なので、現実の原価を把握するために後入れ先出し法で計算している会社もありました。
 実例でわかるように、思わぬところで使用されています。覚えておくと、発想の幅が広がります。

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

C#ライブラリリファレンス - 先入れ先出し法でデータを管理する

概要
 キュージェネリックオブジェクトを使用すれば、複数のインスタンス(データ)を先入れ先出し法で格納管理できます。

日常でたとえると
 お客様、並んでください。整理券を配ります

使用に適した状況
 インスタンス(データ)の格納する順番に重要な意味がある場合。

サンプル

/*----------------------------------------------------
 * 
 *  キューにより先入れ先出し法でデータを管理する。
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;

class Sample
{
    static void Main()
    {
        //キューを用意
        var datas = new Queue<int>();

        //キューにデータを追加
        Console.WriteLine( 
            "***** キューにデータを入れます *****" );
        Action<int> Add = ( int value ) => {
            datas.Enqueue( value );
            Console.Write( " 追加した数:{0}",
                value );
        };
        ProcessPrint( 
            datas, 
            Add );
        
        //キューからデータを取り出す
        Console.WriteLine( 
            "***** キューからデータを取り出します *****" );
        Action<int> Get = ( int i ) => {
            int value = datas.Dequeue(); 
            Console.Write( " 取り出した数:{0}",
                value );
        };
        ProcessPrint( 
            datas, 
            Get );
    }
    
    //追加または取り出すときの様子を表示する。
    private static void ProcessPrint( 
        Queue<int> datas,  Action<int> process )
    {
        for ( int i = 0 ; i < 10 ; ++i ) {
            Console.Write( "処理前の個数:{0}",
                datas.Count );
            //空の時Peekを呼び出すと例外が発生
            Console.Write( " 先頭の数:{0}",
                datas.Count != 0 ? 
                datas.Peek().ToString() : 
                "0" );
            process( i );
            Console.Write( " 処理後の個数:{0}",
                datas.Count );
            Console.WriteLine();
        }
        Console.WriteLine();
    }
}


名前空間
 System.Collections.Generic名前空間を参照します。LINQプログラミングのために、System.Linq名前空間も参照しましょう。

解説
 プログラミングでは、データ(オブジェクトのインスタンス)をただ集めればいいというものではなく、格納した順番が重要な意味を持つ場合があります。リストジェネリックオブジェクトでもデータを格納できますが、誰かが整列してしまうかもしれませんし、プログラマに対して入れた順番に取り出すのが重要であることを明示しなくてはなりません。
 データを入れた順番通りに取り出して処理をしたい場合、Queueジェネリックオブジェクトを使用します。このオブジェクトは、Enqueue(エンキュー)メソッドでデータを入れ、Dequeue(デキュー)メソッドで先入れ先出し法にてデータを取り出します。
 取り出したデータは消えてしまうので、先頭のデータを調べたい時は、Peekメソッドでキューの中を覗きます。ただし、空の時に覗くと怒られる(例外が発生する)ので注意しましょう。

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

プロフィール

インドリ

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カウンター