fc2ブログ

ネタつつき215  - 時に昔の自分を思い出そう

 これは雑談なのですが、情報技術者は世界で一番本を読む職業かもしれません。私はシステム屋(システム開発の全行程を専門としている情報技術者)をしておりますが、専門書を読まない日はありません。しかも、誰かに強制されてしているわけではなく、空気を吸うがごとく自然に行っています。
 情報技術者は情報を扱う職業なので、毎日何らかの情報を分析しなくてはなりません。しかも、毎回どの業種や業界の人がお客様になるかわからないので、毎回仕事で他の専門分野を学ぶ必要が生じます。人によってはこれが苦痛になるとのことですが、私の場合巣で選んだ仕事ですので、非常に楽しくやっております。その状態が10年以上続いているので、もはや専門書を読むことは、呼吸をすることや食事をすることと同様になっています。無意識に常に何かの専門書を読んでいます。
 たまに専門書を読めない場所にいるときがありますが、そんなときは逆に苦痛を感じます。私にとっては、正しく、食事や呼吸ができないのと同じ状態なのです。
 それと同時に、プログラミングも日常生活に組み込まれています。毎日プログラミングをしないと、手が震えてきます。しかし、PCがない場所もあるので、脳内でプログラミングをしております。そうすれば、いつでもどこでもプログラミングができます。
 この性格は生まれ持ったものです。赤ちゃんの時から、常に何かを考えていました。赤子の時は蟻の研究が好きで、一日中蟻を観察しておりました。小学生のころは、すでに色々な本を読んでいました。アカデミア百官辞典をよく読んでいました。その状態のまま、大人になったものですから、読書・思考・プログラミングといった行為は、習性といえるかもしれません。
 このことから私は思うのですが、人は生まれ持った性格は赤子のころからあまり変わらず、自然と性格に合った職業を選ぶのかもしれません。もちろん後天的に生じた性格もあるでしょうが、核となる部分はもしかしたら、赤子の時から決まっているのかもしれません。少なくとも私はそうでした。
 三つ子の魂百までとはよく言ったものです。赤ちゃんの時の事を覚えていない人が多いようですが、小さなころを思い返してみましょう。そうすれば、きっと「あまり変わっていない」と思うでしょう。時には、昔を懐かしむのもいいと私は思います。

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

C#ライブラリリファレンス - リストジェネリックオブジェクトで高速検索(二分探索)する

概要
 リストに格納したインスタンスを、二分探索により高速検索できます。

日常でたとえると
 僕はこっちを探すから、君はあちらを探して。

使用に適した状況
 複数のインスタンスから、該当するものを検索したい場合。

サンプル

/*----------------------------------------------------
 * 
 *  リストで二分探索/高速に検索をする。
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics; //計測に使用

class Sample
{
    static void Main()
    {
        //データを準備
        const int max = 10000000;
        var datas = new List<int>();
        for ( int i = 0 ; i < max ; ++i )
            datas.Add( i );

        //順次検索
        Action search = ( ) => {
            foreach ( int data in datas ) {
                if ( data == max )
                    break;
            }
        };
        TimeMeasurement( "線形検索", search );

        //2分探索で検索
        Action binarySearch = ( ) =>
            datas.BinarySearch( max );
        TimeMeasurement( "二分探索", binarySearch );
    }

    //検索時間を計測する。
    static void TimeMeasurement( string title, Action Search )
    {
        var watch = new Stopwatch();
        watch.Start();
        Search();
        watch.Stop();
        Console.WriteLine( title + " の実行時間: {0}",
            watch.Elapsed );
    }
}



名前空間
 System.Collections.Genericにリストジェネリックオブジェクトがあります。LINQプログラミングを併用するので、System.Linq名前空間を参照します。

解説
 複数のインスタンスから該当するものを選ぶ行為は、プログラミングでよくあることです。通常の方法である線形検索(逐次検索ともいう)を行うと、インスタンスの数が多い場合、非常に時間がかかります。
 二分探索というアルゴリズムを使用すると、大量のデータから高速に検索できることが広く知られています。古い言語では、二分探索を自分で実装する場面もありましたが、C#ではBinarySearchメソッドを呼び出すだけなので、非常に簡単に二分探索を行えます。
 ただし、少量のデータを検索する場合、線形検索の方が速い可能性があります。十分に注意しましょう。

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

C#ライブラリリファレンス - リストジェネリックオブジェクトで複数のインスタンスを格納管理

概要
 オブジェクトのインスタンスを、格納管理するリストオブジェクトがあります。

日常でたとえると
 資料室で書類を管理する。

使用に適した状況
 オブジェクトのインスタンスが複数あり、それらのインスタンスを格納して、管理したい時。

サンプル

/*----------------------------------------------------
 * 
 *  リストによるデータライフサイクル。
 *  
 ----------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;

class Sample
{
    static void Main()
    {
        //偶数のリストを作成
        var evenNumbers = new List<int>();
        for ( int i = 0 ; i <= 10 ; i += 2 )
            evenNumbers.Add( i );
        PrintNumbers( "偶数:", evenNumbers );

        //奇数のリストを作成
        var oddNumbers = new List<int>();
        for ( int i = 3 ; i < 10 ; i += 2 )
            oddNumbers.Add( i );
        PrintNumbers( "奇数:", oddNumbers );

        //合体!
        var allNumbers = new List<int>();
        allNumbers.AddRange( evenNumbers );
        allNumbers.AddRange( oddNumbers );
        PrintNumbers( "全ての数値:", allNumbers );

        //おや?10が余計だぞ
        allNumbers.RemoveAt( 5 );
        PrintNumbers( "10を修正:", allNumbers );

        //整理整頓
        allNumbers.Sort();
        PrintNumbers( "数値を整列:", allNumbers );

        //1を忘れているぞ
        allNumbers.Insert( 1, 1 );
        PrintNumbers( "1を追加:", allNumbers );

        //値を更新
        allNumbers[ 9 ] = 10;
        PrintNumbers( "9を変更:", allNumbers );
    }

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


名前空間
 厳密に家庭指定されたリストは、System.Collections.Generic名前空間にあります。通常LINQプログラミングでリストを扱うので、System.Linq名前空間も参照します。

解説
 プログラミングをしているとき、複数のインスタンスを扱う必要が生じます。これらのインスタンスを、扱うオブジェクトを実装するのは、意外と骨が折れる作業なので.NETライブラリに用意されています。
 型を指定できるリストジェネリックオブジェクトは、複数のインスタンスを格納管理するオブジェクトの中で代表格ともいえるオブジェクトで、インスタンスの追加と削除ができます。追加と削除は位置を指定することもできますので便利です。さらにAddRangeメソッドを使用して、一括に追加することもできますし、データの整列(ソート)もSortメソッドで行えます。プログラミングをする上で避けては通れない存在なので、ぜひリストジェネリックオブジェクトの使用法を習得しましょう。
 なお、更新は配列と同様の方法で行えます。Listジェネリックオブジェクトは、扱い方が容易なので、非常に直感的にプログラミングができまるといえるでしょう。

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

C#ライブラリリファレンス - SOAP形式でオブジェクトをシリアル化する

概要
 オブジェクトのインスタンスを永続化することをシリアル化と呼びます。シリアル化は、C#を使えば簡単に実現できます。

日常でたとえると
 お客様の情報を保存しておく。

使用に適した状況
 オブジェクトのインスタンスを保存する必要があるとき。

サンプル

/*----------------------------------------------------
 * 
 *  SOAP形式でシリアル化する。
 *  
 ----------------------------------------------------*/
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;

//シリアル化するオブジェクトに属性を指定
[Serializable]
class Sample
{
    public int X { get; set; }
    public int Y { get; set; }

    //シリアル化しない
    [NonSerialized]
    public readonly int Z = 0;

    public override string ToString( )
    {
        return String.Format( "X:{0}, Y:{1}",
            this.X, this.Y );
    }

    static void Main( )
    {
        string name = "Sample.data";
        var formatter = new SoapFormatter();
        Serialize( formatter, name );
        Deserialize( formatter, name );
        Console.ReadLine();
    }

    //シリアライズ
    private static void Serialize( SoapFormatter formatter, string name )
    {
        //処理開始
        Console.WriteLine( "オブジェクトをシリアライズします・・・" );

        //データを用意
        var data = new Sample();
        data.X = 100;
        data.Y = 100;
        Console.WriteLine( "データの内容\n{0}",
            data.ToString() );

        //保存先を用意
        var file = new FileInfo( name );
        FileStream stream = file.Open(
            FileMode.OpenOrCreate,
            FileAccess.ReadWrite,
            FileShare.Delete );

        //バイナリフォーマッタでシリアライズする
        formatter.Serialize( stream, data );
        stream.Close();

        //処理終了
        Console.WriteLine( "シリアライズ完了しました♪" );
        Console.WriteLine();
    }

    //デシリアライズ
    private static void Deserialize( SoapFormatter formatter, string name )
    {
        //処理開始
        Console.WriteLine( "オブジェクトをデシリアライズします・・・" );

        //保存先を再度オープンしてデシリアル化する
        var file = new FileInfo( name );
        FileStream stream = file.Open(
            FileMode.OpenOrCreate,
            FileAccess.ReadWrite,
            FileShare.Delete );
        Sample data =
            ( Sample ) formatter.Deserialize( stream );
        Console.WriteLine( "データの内容\n{0}",
            data.ToString() );

        //後片付け
        file.Delete();

        //処理終了
        Console.WriteLine( "デシリアライズ完了しました♪" );
        Console.WriteLine();
    }
}

名前空間
 SoapFormatterを使用するために、System.Runtime.Serialization.Formatters.Soapを参照します。シリアライズ先を指定するために、ストリームが必要なのでSystem.IOを参照します。
 加えて、SoapFormatterはSystem.Runtime.Serialization.Formatters.Soapアセンブリが必要なので、このアセンブリを参照することを忘れないでください。

解説
 オブジェクトのインスタンスを、何らかのストリーム内でグラフ化し、保存及び復元を可能とすることシリアル化と呼びます。シリアル化には、2つの段階があり、それを行うのがフォーマッタです。
 オブジェクトのインスタンスを保存する事を、シリアライズと呼びます。そして、保存したオブジェクトのインスタンスを復元することをデシリアライズと呼びます。この2つの行為は、何のフォーマット(形式)でするのか決定しなくてはなりません。.NETには、バイナリ形式とSOAP形式の二つが存在します。
 SOAPというのは、データをXML形式で記述するプロトコルの事です。正式名称はSimple Object Access Protocolで、いかにしてデータをXML形式でやり取りするのかを定めています。
 SOAPフォーマットでシリアル化をするには、SoapFormatterクラスを使用します。ここで気を付けなければならないのは、シリアル化の対象となるオブジェクトにSerializable属性を指定しなくてはならない事です。指定を忘れるとシリアル化できません。
 オブジェクト単位で属性を指定すると、デフォルトでメンバー(主にプロパティ)がシリアル化の対象となりますが、シリアル化の対象とならないメンバーがあります。例えば、読み取り専用のメンバーはしたくないかもしれません。そんなときは、メンバーにNonSerialized属性を指定します。そうすれば、そのメンバーはシリアル化の対象になりません。

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

C#ライブラリリファレンス - バイナリ形式でオブジェクトをシリアル化する

概要
 オブジェクトのインスタンスを永続化することをシリアル化と呼びます。シリアル化は、C#を使えば簡単に実現できます。

日常でたとえると
 お客様の情報を保存しておく。

使用に適した状況
 オブジェクトのインスタンスを保存する必要があるとき。

サンプル

/*----------------------------------------------------
 * 
 *  バイナリ形式でシリアル化する。
 *  
 ----------------------------------------------------*/
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

//シリアル化するオブジェクトに属性を指定
[Serializable]
class Sample
{
    public int X { get; set; }
    public int Y { get; set; }

    //シリアル化しない
    [NonSerialized]
    public readonly int Z = 0;

    public override string ToString( )
    {
        return String.Format( "X:{0}, Y:{1}",
            this.X, this.Y );
    }

    static void Main()
    {
        string name = "Sample.data";
        var formatter = new BinaryFormatter();
        Serialize( formatter, name );
        Deserialize( formatter, name );
        Console.ReadLine();
    }

    //シリアライズ
    private static void Serialize( BinaryFormatter formatter, string name )
    {
        //処理開始
        Console.WriteLine( "オブジェクトをシリアライズします・・・" );

        //データを用意
        var data = new Sample();
        data.X = 100;
        data.Y = 100;
        Console.WriteLine( "データの内容\n{0}",
            data.ToString() );

        //保存先を用意
        var file = new FileInfo( name );
        FileStream stream = file.Open(
            FileMode.OpenOrCreate,
            FileAccess.ReadWrite,
            FileShare.Delete );

        //バイナリフォーマッタでシリアライズする
        formatter.Serialize( stream, data );
        stream.Close();

        //処理終了
        Console.WriteLine( "シリアライズ完了しました♪" );
        Console.WriteLine();
    }

    //デシリアライズ
    private static void Deserialize( BinaryFormatter formatter, string name )
    {
        //処理開始
        Console.WriteLine( "オブジェクトをデシリアライズします・・・" );

        //保存先を再度オープンしてデシリアル化する
        var file = new FileInfo( name );
        FileStream stream = file.Open(
            FileMode.OpenOrCreate,
            FileAccess.ReadWrite,
            FileShare.Delete );
        Sample data =
            ( Sample ) formatter.Deserialize( stream );
        Console.WriteLine( "データの内容\n{0}",
            data.ToString() );

        //後片付け
        file.Delete();

        //処理終了
        Console.WriteLine( "デシリアライズ完了しました♪" );
        Console.WriteLine();
    }
}


名前空間
 BinaryFormatterを使用するために、System.Runtime.Serialization.Formatters.Binaryを参照します。シリアライズ先を指定するために、ストリームが必要なのでSystem.IOを参照します。

解説
 オブジェクトのインスタンスを、何らかのストリーム内でグラフ化し、保存及び復元を可能とすることシリアル化と呼びます。シリアル化には、2つの段階があり、それを行うのがフォーマッタです。
 オブジェクトのインスタンスを保存する事を、シリアライズと呼びます。そして、保存したオブジェクトのインスタンスを復元することをデシリアライズと呼びます。この2つの行為は、何のフォーマット(形式)でするのか決定しなくてはなりません。.NETには、バイナリ形式とSOAP形式の二つが存在します。
 バイナリフォーマットでシリアル化をするには、BinaryFormatterクラスを使用します。ここで気を付けなければならないのは、シリアル化の対象となるオブジェクトにSerializable属性を指定しなくてはならない事です。指定を忘れるとシリアル化できません。
 オブジェクト単位で属性を指定すると、デフォルトでメンバー(主にプロパティ)がシリアル化の対象となりますが、シリアル化の対象とならないメンバーがあります。例えば、読み取り専用のメンバーはしたくないかもしれません。そんなときは、メンバーにNonSerialized属性を指定します。そうすれば、そのメンバーはシリアル化の対象になりません。

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

ネタつつき214  - 進歩が速いIT業界を生き抜く方法

 IT業界は秒進分歩であり、年を取るごとに生きづらくなるといわれております。しかしながら、35歳を過ぎれば必ずできないのかというとそうではありません。高齢でもバリバリの現役である人もいます。それで今回は、IT業界の生き抜き方を考えてみようと思いました。
 私は技術で苦しんだ経験がありません。難しいのは対人関係であり、それと比べれば技術の習得はやさしいです。技術は2つの心がけさえあれば、プロならば対応できます。
 1つめは、その場限りの学習はしない事です。表面的な学習では、言語やツールが変わったら役に立たない知識しか習得できません。その技術の奥を学び、未来を予測しましょう。私は専門書を読むとき、本文だけではなく未来をも読んでいます。つまり、新しい技術をその都度発明しています。発明までいかなくとも、ある程度予想することは誰にでもできるでしょう。そうすれば、秒進分歩が止まって見えます。世間一般に、IT技術の進歩は速いといわれていますがそんなことはありません。
 2つめは、楽しむことです。私たちは情報技術が好きでこの仕事を選んだはずです。ならば、その初心を忘れずに、常に楽しみましょう。IT業界は毎日が学習ですが、楽しくない学習は苦痛です。楽しんでいれば、苦痛ではなく快感を得られます。一般に高齢になればなるほど、新しいものに対応できなくなるといわれていますが、そんなことはありません。教授は大概高齢ですので、体の年齢と心の年齢は一致しなくてもよいことがわかります。いつまでも情報技術が好きな少年/少女でいればいいのです。
 この記事を読み、そうはいっても・・・と思う人がいるでしょう。しかしよく考えてみてください。よく悩みを分析すると、技術ではなく人間関係に起因するものではないでしょうか?そうならば、技術と人の問題を切り離して、個別に対応すればいいのです。そうすれば、人間関係はどの職業にもつきものなので、それなりに対応できるでしょう。
 IT業界は進歩が速く、いつかついていけなくなるといわれています。しかし実際はそうではありません。自分の心がけ次第では、永遠に情報技術を愛し、誇りをもって仕事に打ち込めます。人生の中で仕事が占める割合は高いです。どうせやるのであれば、楽しむ方がよいと私は思います。

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

C#ライブラリリファレンス - メモリを読み書きする

概要
 MemoryStreamクラスを使用すると、メモリ上でデータを読み書きできます。

日常でたとえると
 メモを取る。

使用に適した状況
 消えてもよいデータを読み書きする場合。メモリはHDDよりも早いので、極力パフォーマンスを高めたい場合も使用します。PCの電源を消すと、メモリのデータも消えてしまうので、保存する必要がある場合は、他のクラスも併用します。

サンプル

/*----------------------------------------------------
 * 
 *  メモリの読み書きを行う。
 *  
 ----------------------------------------------------*/
using System;
using System.IO;
using System.Linq;

class Sample
{
    static void Main( )
    {
        //データを書き込む
        int count = 100;
        var memory = new MemoryStream();
        for ( int i = 0 ; i < count ; ++i ) {
            memory.WriteByte( ( byte ) ( i + 5 ) );
        }

        //開始位置にセット
        memory.Position = 0;

        //データを読み取る
        Console.WriteLine( "メモリ内のデータを読み出します・・・" );
        for ( int i = 0 ; i < count ; ++i ) {
            Console.Write( "{0}:{1}  ",
                memory.Position,
                memory.ReadByte() );
        }
        Console.WriteLine( "\n読み取り終了\n" );

        //こちらでも可能
        Console.WriteLine( "LINQで読み取ります・・・" );
        var datas =
            memory.ToArray().
            Select( ( data, index ) => 
                new { data, index } );
        foreach ( var data in datas )
            Console.Write( "{0}:{1}  ",
                data.index, 
                data.data );
        Console.WriteLine( "\n読み取り終了" );

        //終了
        Console.ReadLine();
    }
}


名前空間
 System.IOを参照します。LINQプログラミングを行いたい場合は、追加でSystem.Linq名前空間を参照します。

解説
 PCには電源を切ったら消えてしまう記憶媒体である、メモリが搭載されています。メモリは、消えてしまう代わりに、HDDよりも高速で読み書きできます。また、HDDに比べると記憶できる容量が少ないのですが、昔とは違い最近ではギガ単位の大容量が可能となっています。
 C#プログラミングでメモリを操作したい場合、MemoryStreamクラスを使用します。MemoryStreamクラスを使用すると簡単に読み書きできます。特にLINQプログラミングで行うと表現が広がります。

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

プロフィール

インドリ

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