fc2ブログ

中の人の徒然草506 利き腕と分類のむなしさを感じた秋

 私は最近、胸のときめきを求めて数学をちびちびと堪能しています。それで思ったのですが、システム屋にとっては、数学の抽象さは通常の思考です。システムを設計する際も、実装する際も、その他の工程の時も・・・システム屋は常に抽象的に考えています。ですから、数学の考え方は性に合っています。
 とはいえ、情報技術が理数系だと思ったら大間違いです。芸術的感性と文系のセンスも要ります。情報技術は全てが混ざった魔術に近いものです。理屈だけでは現実に役立つシステムは作れません。
 そうは言うものの、数学も幻術に近いような気がしてきました。というのも、数学をやっていると、段々左利きになってきたからです。右脳左脳という分類に照らし合してみると、数学は左脳を使うから、右利きのはずなんだけどな・・・やっぱり、右脳左脳の分類なんて、占いと同じですね。
 それにしても、不思議なのは、数学をやったら左利きになってきたという事実です。自分でもよくわからないのですが、数学を毎日1時間ほどしていると、気が付いたら物を左手で掴んでいるようになりました。おそらく偶然なのでしょうが、学習が脳に与える影響が気になります。
 それはさておき、やはり分類なんて便宜上のものですね。数学だって、幾何学・代数学・解析学と綺麗に分かれていません。全てが混ざり合っているのが本当の数学です。情報技術もまた、作業工程でわかれているのではなく、設計も実装もその他の事も境界なく混ざり合ってできています。何かを分類することは学習上大切ですが、それにこだわりすぎると真実が見えなくなります。実際、日本のIT業界は拘りすぎて、酷い有様になっています。
 物事は全て空なのかな?分類は補助輪と同じで、本格的にやり始めたら邪魔なだけなのでしょう。思考の枠組みを取り除いて、柔軟に生きたいものですね。
スポンサーサイト



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

C#ライブラリリファレンス - 量指定子演算子で特定の値が存在するか判定する

概要
 データの集合に対して、Enumerable静的クラスのContains拡張メソッドを使用すれば、簡潔に特定の値が存在するか判定できます。

日常でたとえると
 指定した商品が売れているか調べる。

使用に適した状況
 データの集合の中で、指定した値を持つデータが存在するか知りたい場合。

サンプル

/*---------------------------------------------------------
 * 
 *  量指定子演算子で特定の値が存在するか判定する
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        var values = new string[ ] {
            "田中", "鈴木", "山田" };
        Console.WriteLine( "データ" );
        foreach ( string v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //問い合わせ
        Console.WriteLine( "山田さんいる?:{0}",
            values.Contains( "山田" ) );
        Console.WriteLine( "前田さんいる?:{0}",
            values.Contains( "前田" ) );
        Console.WriteLine();

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 プログラミングでは、複数のデータの中から、特定の値を持つインスタンスを、探したい時がよくあります。この時有用なのが量指定子演算子のContainsです。この拡張メソッドを使用すれば、ループ処理と条件文の組み合わせを書かずに、実現することができます。
 プログラミングの学習では、訓練のために、ループ処理と条件文を使用し、特定のプロパティ値を持つインスタンスを探すプログラムを書くことがありますが、実務ではこちらの方で簡潔に書く方がよいでしょう。

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

C#ライブラリリファレンス - 量指定子演算子で条件を満たすデータが存在するか判定する

概要
 データの集合に対して、Enumerable静的クラスのAny拡張メソッドを使用すれば、指定した条件を満たすデータが存在するかチェックできます。

日常でたとえると
 特別に成績が良かった社員が存在する部署を調べる。

使用に適した状況
 データの集合の中で、指定した条件を満たすデータが存在するか知りたい場合。

サンプル

/*---------------------------------------------------------
 * 
 *  量指定子演算子で条件を満たすデータが存在するか判定する
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 10;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = -i;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //0以上の値は?
        Console.WriteLine(
            "0以上の値は存在する?:{0}",
            values.Any(
                x => x >= 0 ) );
        Console.WriteLine();

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 従来の逐次プログラミングでは、データの集合に対してループ処理で、条件を満たすデータが存在するかif文でチェックしていました。しかしながら、このような処理は、処理に関するプログラムが多く、何を意味するのかという情報を隠蔽してしまう危険性があります。また、データを一度に扱う集合指向プログラミングの考え方と相いれません。必要なのは、なるべく一行でこのチェックを実現する方法です。
 その容貌を叶えるのが、Any量指定子演算子です。この演算子(拡張メソッドとして実装されている)を使用すれば、集合指向プログラミングはもちろんの事、一行でチェックを実現できます。

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

C#ライブラリリファレンス - 量指定子演算子で全てのデータが条件を満たすか判定する

概要
 Enumerable静的クラスのAll拡張メソッドを使用すれば、全てのデータが指定した条件を満たすかチェックできます。

日常でたとえると
 ある期間内の全社員の営業成績が指定件数以上か調べる。

使用に適した状況
 複数のデータ集合がある一定の条件を満たしているか確認したい場合。

サンプル

/*---------------------------------------------------------
 * 
 *  量指定子演算子で全てのデータが条件を満たすか判定する
 *  
 ---------------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 10;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = i * 2;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //偶数?
        Console.WriteLine( 
            "全てのデータは偶数?:{0}",
            values.All( 
                x => x % 2 == 0 ) );
        Console.WriteLine();

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 集合プログラミングでは、逐次プログラミングのように、個々のデータを一々取り出し、条件を満たすかチェックする繰り返しプログラムを書きません。量指定子のAllを指定するだけで済まします。
 こうすることにより、プログラムを処理ではなく、内容面を強調して記述できます。また、データの集合を結合する際に組み合わせることが可能となります。初心者の方はピンと来ないかもしれませんが、データを扱うプログラムを書くときにこのAll量指定子演算子の重要性について理解できると思います。

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

C#ライブラリリファレンス - 複数のデータ集合をフラットに射影する

概要
 Enumerable静的クラスのSelectMany拡張メソッドを使用すれば、複数のデータの集合をフラットに扱えるようになります。

日常でたとえると
 商品別売上明細をExcelの表としてまとめる。

使用に適した状況
 複数のデータ集合を結合し、それを単一のデータ集合として扱いたい場合。

サンプル

/*----------------------------------------------------
 * 
 *  射影演算子でフラットに射影する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 5;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = i;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを繰り返し生成してから
        //フラットに射影する
        Console.WriteLine( 
            "複合データをフラットに射影します・・・" );
        var data =  
            Enumerable.Repeat( values, 2 )
                .SelectMany( v => v );
        foreach ( var x in data ) 
                Console.Write( "{0} ", x );
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 集合プログラミングでは、複数のデータの集合に対して、結合処理をすることがよくあります。コンピューターにとってはそれでよいのですが、人間が確認する場合困ります。また、複雑なクエリでは、単一にしたい場合もあります。
 このような状況下では、通常のSelect拡張メソッドでは、複数のIEnumerableオブジェクトとして返されるので、何らかの方法で統一する必要があります。それを叶えるのが、SelectMany拡張メソッドです。
 SelectMany拡張メソッドを使用すれば、単一のIEnumerableオブジェクトを容易に取得できます。集合プログラミングをしたことがない人には有難味がわからないと思いますが、集合プログラミングをすれば直ぐに有効性を実感できます。

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

C#ライブラリリファレンス - 生成演算子で繰り返し同じ処理をする

概要
 Enumerable静的クラスのRepeat拡張メソッドを使用すれば、同じクエリを何度も実行する事と、同じデータの繰り返しを容易に生成することができます。

日常でたとえると
 業務マニュアルに書かれている作業を繰り返す。

使用に適した状況
 集合プログラミングを行う際に有効です。この拡張メソッドを使う状況は、説明しにくいのですが、覚えておくと来るべき状況で対処できるようになります。

サンプル

/*----------------------------------------------------
 * 
 *  生成演算子で繰り返し同じ処理をする
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 5;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = i;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを繰り返し生成
        Console.WriteLine( 
            "データの生成を繰り返します・・・" );
        foreach ( var x in 
            Enumerable.Repeat( values, 2 ) ) {
            foreach ( var y in x )
                Console.Write( "{0} ", y );
        }
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 集合プログラミング時には、様々なデータを組み合します。この際に、一定のパターンでデータを作りたい場合や、同じクエリを何度も実行したい場合があります。この場面で活躍するのが、Repeat拡張メソッドです。
 Repeat拡張メソッドは、サンプルプログラムを作るのは難しいものの、状況に局面したら必要になるタイプのものです。覚えておいて損はないでしょう。

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

ネタつつき224  - 初心者から卒業する方法

 私のメインターゲットは初心者なので、初心者から卒業する方法について書きます。初心者を卒業するには、初心者の定義を知るところから始まります。私が考える初心者とは、専門書をスラスラ読めない状態です。例えば、プログラミングでは、文法全てとほとんどのライブラリを把握し、自分で成長できる状態でない人が初心者です。つまり私は、自己成長性を指標としているのです。何故ならば、初心者の定義を辞書で調べると「習い始めで未熟なこと」と書いてあるからです。
 情報技術者の専門家の視点でいうと、未熟とは自分で学習ができない人の事です。というのも、変化が速い情報技術において、自分で成長できるのが最低条件だからです。それ故に、誰かからに手取り足取り教えてもらわないとできない人は、未熟者だと考えています。
 私が学生だった時の事を思い出してみると、先生に教えてもらわないと何もわからない状態でした。その時は、右も左もわからず、見るものすべてが新しくて、胸がときめきました。初心者というと悪いイメージを持っている人もいますが、初心者の時に感じた胸のときめきがなければ、この先成長し続けることはできません。実は、初めてが一番重要なのです。ですから、卒業する前に初心者の時の心を忘れないように注意してください。
 初心者の時は楽しいので卒業するのは惜しいですが、人はいつか卒業しなくてはなりません。卒業する方法は簡単です。今まで書いた初心者の定義に満たない人になればいいのです。方法はいくつもありますが、共通していえることを書きます。
 先ずは全体像を知ります。学校の勉強のようにしていては、時間がいくらあっても足りません。コツコツすることは良い事のように思えますが、私たちはもう学生ではありません。一つずつ細かく覚えるのではなく、一気に文法とライブラリを見ます。MSDNライブラリといった公式のマニュアルが便利ですが、初心者の時はわからないと思いますので、分厚い専門書を一度速読します。この時選ぶ専門書は、「網羅したもの」です。特化した専門書を読むと視野が狭くなりますので注意してください。
 次に、専門書に書いてあるサンプルを全てプログラミングして、自分が理解している部分と理解していない部分を把握します。初心者の頃は、自分が知っている知識にこだわってしまいますが、自分が知らない事を把握するのは重要です。そうしないと、何時まで経っても成長できません。見かけ上成長しても、それはまやかしで、本当の意味の習得ができませんし、今後の成長も見込めません。
 今度はもう一度全体像を速読してから、公式マニュアルと専門書を見ながら、自分でサンプルプログラムを考えてプログラミングしましょう。そうすれば、初心者を卒業できます。これはどんな知識の獲得にも言える事だと思います。
 初心者の頃は、少しの分野の知識であっても山のように見えると思いますが、慣れてくると一気に習得できるようになるので安心してください。慣れると新しいプログラミング言語が出ても、ちょっと仕様書を速読すれば使えるようになります。速読になれれば、1時間に100ページ~200ページぐらいのスピードは余裕になるので、1日もあればだいぶ使えます。そして、1週間もあれば、余裕をもって実務で使えるようになります。ですから、初心者の状態を楽しみつつ、着実に卒業しましょう。そうすれば、きっと人生も楽しくなります。

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

C#ライブラリリファレンス - 指定範囲の数値を生成する

概要
 Enumerable静的クラスのRange拡張メソッドを使用すれば、容易にデータを生成することができます。

日常でたとえると
 予め並べて置いたトランプを配る。

使用に適した状況
 テストを行いたい場合。テスト以外でも活躍できますが、テストで使用する場面が多いと思います。

サンプル

/*----------------------------------------------------
 * 
 *  生成演算子で指定範囲の値を生成する
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを生成
        Console.WriteLine( "データを生成します・・・" );
        foreach ( int v in Enumerable.Range( 0, 10 ) )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 Sytem.Linq名前空間を参照してください。

解説
 テストプログラムで、数値の列(シーケンス)を生成したい場合がよくあります。このプログラムは簡単なものの、より簡潔に記述したいと思うのがプログラマー心です。そんな要望に応えてくれるのが、Range生成演算子です。
 この演算子を使用すれば、簡潔にテストプログラムを掛けます。また、サブ処理で数列が欲しいときにも使用できます。知ると使いたくなる便利な拡張メソッドといえるでしょう。
 これは余談ですが私は、このサンプルプログラムで常々使いたいと思っていました。でも、拡張メソッドを知らない可能性が高い初心者用に書くのが目的なので我慢していました。もしかしたら、中毒性が高いメソッドなのかもしれない。

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

C#ライブラリリファレンス - データを逆順にならび変える

概要
 Enumerable静的クラスのReverse拡張メソッドを使えば、データの並びを逆にできます。

日常でたとえると
 カードの並びを逆に並び替える。

使用に適した状況
 データを逆順に処理をしたい場合。

サンプル

/*----------------------------------------------------
 * 
 *  データを逆順にならび変える
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int max = 10;
        int[ ] values = new int[ max ];
        for ( int i = 0 ; i < max ; ++i )
            values[ i ] = i;
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //逆順に並び替える
        Console.WriteLine( "逆順にします・・・");
        Console.WriteLine( "データ" );
        foreach ( int v in values.Reverse() )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 System.Linq名前空間を参照してください。

解説
 データ処理をしていると、現在あるデータの集合を逆に処理をしたい場合があります。その時に活躍するのがEnumerable静的クラスのReverse拡張メソッドです。
 この拡張メソッドは、単体で活躍することは少なく、Join拡張メソッドなどと組み合して使用するのが一般的です。

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

C#ライブラリリファレンス - データを降順で並び変える(降順で整列)

概要
 Enumerable静的クラスのOrderByDescending拡張メソッドを使用すれば、複数のデータを簡単に降順で整列することができます。

日常でたとえると
 倉庫にある書類の段ボールを、ラベルに書いてある番号の大きい順に整理してもらう。

使用に適した状況
 データを人間が確認する場合。

サンプル

/*----------------------------------------------------
 * 
 *  データを降順で並び変える
 *  
 ----------------------------------------------------*/
using System;
using System.Linq;
using System.Collections.Generic;

class Sample
{
    static void Main( )
    {
        //データソースを用意
        int[ ] values = new int[ ]{
            5, 10, 2, 4, 8, 1, 3, 6, 8, 7, 9
        };
        Console.WriteLine( "データ" );
        foreach ( int v in values )
            Console.Write( "{0} ", v );
        Console.WriteLine( Environment.NewLine );

        //データを整列
        Console.WriteLine(
            "データを降順で整列します・・・" );
        var results = values.OrderByDescending( 
            ( x ) => x );
        foreach ( var r in results )
            Console.Write( "{0} ", r );
        Console.WriteLine( Environment.NewLine );

        //データを整列
        Console.WriteLine(
            "クエリ式を使用します・・・" );
        var results1 = from v in values
                       orderby v descending
                       select v;
        foreach ( var r1 in results1 )
            Console.Write( "{0} ", r1 );
        Console.WriteLine( Environment.NewLine );

        //終了
        Console.WriteLine( "サンプル終了。" );
        Console.ReadLine();
    }
}


名前空間
 System.Linqを参照してください。

解説
 集合論と機械はデータの順番を気にしません。しかしながら、通常の人はデータが並んだ状態で確認したいと思います。プログラミングでデータを大きい順で並び替えることを、降順の整列と呼びます。
 データを降順で整列させたい時、基準となるプロパティを決定します。そして、Enumerable静的クラスのOrderByDescending拡張メソッドでそのキーを指定し呼びだすだけで、整理整頓された状態のデータを入手できます。 ビックデータを扱う事が多いので、重宝する拡張メソッドだと思います。
 データを整列させるメソッドとしてSortメソッドがあります。このメソッドとの違いは、統一した方法で使用できる点にあります。OrderByDescending拡張メソッドは、Enumerable静的クラスの他の拡張メソッドと連携し、大きな価値を生み出します。

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

プロフィール

インドリ

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