まさるblog

越後在住アプリケーションエンジニア奮闘記

目次

Blog 利用状況

ニュース

07/04/23
新規加入しました。
よろしくお願いします。

07/06/02
東京勉強会#8に参加しました。

07/10/21
情報処理技術者試験(NW)受験しました。

07/11/17
オブジェクト指向分科会#2参加しました。

07/12/06
SOFTWARE TOYBOXオープンしました。

08/03/02
息子誕生しました。

08/03/05
twitterはじめました。

現在
子育て奮闘中です。
デザインパターン勉強中です。
iKnow!、ESLPodcastなどで英語勉強中です。

ブログパーツ

あわせて読みたい

書庫

日記カテゴリ

コミュニティ

色々

2008年4月24日 #

あ、1年経ってた・・・

昨年4/23にわんくま同盟に加入してから1年経ちました。

その間、2回の勉強会への参加をはじめとして、メンバの皆さんにはいろいろとお世話になり、感謝しています。

ただ、ここ最近は私生活の忙しさにかまけて、ろくに情報発信できていません。

それでもぼちぼちと時間を作りながら、今後もやっていければと思います。

 

というわけで、皆様、今後ともよろしくお願いします。

 

#まずはデザインパターンシリーズ書かなきゃ・・・

posted @ 9:16 | Feedback (3)

2008年4月8日 #

Write Once Run Forever

Javaの「Write Once Run Anywhere」よりふと浮かんだ、SIerが作ったプログラムに顧客が求めていること。

#そろそろVB6はやめにしませんか?

posted @ 12:41 | Feedback (4)

2008年3月27日 #

MSBuildやってみよう~その1~

MSBuildをやってみようと、ふと思い立ちましたので、そのメモとしてエントリします。

 

MSBuildとは?

.NET Framework 2.0 より新たに採用されたビルドエンジンがMSBuildです。以下にMSDN Libraryより引用します。

Microsoft Build Engine (MSBuild) は、Microsoft および Visual Studio の新しいビルド プラットフォームです。MSBuild を使用すると、ソフトウェアの処理方法とビルド方法を完全に制御できます。開発者は、Visual Studio がインストールされていないビルド ラボ環境において製品を統括的にビルドできます。

MSBuild の概要より引用】

MSBuildの実行方法

MSBuildを使用するためには、まず「.NET Framework SDK 2.0」が必要です。ただ、Visual Studio 2005以降をインストールしてあれば、もうインストールされていますので、改めてインストールする必要はありません。

次に、ビルドプロセスを記述した「プロジェクトファイル」を準備します。プロジェクトファイルはXML形式のファイルで、拡張子は「.*proj」とします。C#、VBプロジェクトのプロジェクトファイル(*.csproj、*.vbproj)をそのまま使うこともできます。

そして、Windowsのスタートメニューより「.NET Framework SDK コマンドプロンプト」を起動し、次のようなコマンドで実行します。

MSBuild <プロジェクトファイル名>

プロジェクトファイルの構造

プロジェクトファイルの構造は以下のようになっています。

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="ターゲット名">
    <実行するタスク />
    ~
    <実行するタスク />
  </Target>
</Project>

Project要素をルートとして、実行するプロセスを「ターゲット」を単位として記述していきます。ターゲットには行う処理の最小単位である「タスク」を1または複数記述します。

まずはHello World!

「Hello World!」を表示するプロジェクトファイルは次のようになります。

[HelloWorld1.proj]
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Hello" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Hello">
    <Message Text="Hello World!" />
  </Target>
</Project>

まず、Project要素の「DefaultTargets」属性にて、実行するターゲットを指定します。

そしてターゲット「Hello」の中では、ログ出力を行うためのタスク「Message」を使い、「Hello World!」を表示します。

 

このプロジェクトファイルの実行結果は次のようになります。

image

「ターゲット Hello:」の下に「Hello World!」が表示されています。

次回の予定

次回はプロジェクトファイル内で使用する「項目」について書く予定です。

参考URL

posted @ 0:16 | Feedback (1)

2008年3月19日 #

castの意味

castというのは、鋳造(ちゅうぞう)のことで、溶かした金属を、鋳型(いがた)に流し込み、冷えて固まってから取り出し、目的の形を得る。

MORI LOG ACADEMY: キャストより引用】

投げる方じゃなくて、こっちの意味だったのね。今更ながらに納得。

posted @ 12:53 | Feedback (4)

2008年3月15日 #

ESL Podcast いいよー

English as a Second Language Podcast
http://www.eslpod.com/website/

 

ぷら~っとネット巡回しているときに「英語の勉強したい人はiknowよりESL Podcast聞こうぜ」というエントリ経由で知りました。

"English as a Second Language"(第二言語としての英語)ということで、ゆっくりと聞き取りやすい発音で本文を読み上げた後、本文で使用したボキャブラリの説明をしてくれます。さらに、ダウンロードしたMP3の歌詞にスクリプトも付いていますので、安心です。

最近はiKnowでボキャブラリを増やしつつ、ESL Podcastでリスニングを養うといった感じでやってます。効果が表れるのはまだ先でしょうが、なんとなくTVで流れる英語の単語、単語が聞き取れるようになって来た気がします。

 

英語の勉強は一朝一夕で出来るものでもないですし、2,3年かけて気長にやってこうと思います。

posted @ 22:42 | Feedback (0)

2008年3月3日 #

フレームワーク(笑)

最近うんざりしているのは、自ら作った(or用意した)フレームワークを案件にバーターしてくるSIerがいることだ。

SIerのフレームワーク - KazzzのJとNのはざまでより引用】

インスパイアード・バイ→(笑)

 

よくありますねぇ、こういうこと。

うちの会社は.NET案件が大半なのですが、そこで「上」から押し付けられるフレームワークが「VB6時代のものをコンバートしただけ」ってもの。その元となるVB6のプログラムも、おそらく汎用機のものをコンバージョンしたものなのでしょう、オブジェクト指向なんて影も形もありません。

当然、データバインドなんてのも使えず用意されておらず、ゴリゴリとコードを書く羽目になりますし、部品として提供されている部分も大量のバグが盛り込まれており、生産性がぜんぜん上がりません。

そんなものを押し付けておきながら、生産性アップを目指せといわれても、そりゃ無理ってもんでしょう。

 

本当は自社でフレームワークの選定/開発から携われればいいのでしょうが、最近は元請となる案件が少なくなってきていて、なかなかそうもいかないのが現状です。また、たとえ携われるとしても、自社にそれだけの力を持った人材がいるかといえば、ゴニョゴニョとしか言えず。

とりあえずは、いつかそのときが来ても対処できるよう、自分のスキルを伸ばしていかないといけませんね。また、周りへの啓蒙活動も必要でしょうね。

 

新人がそろそろ入ってくる季節。少し考えてみよう。

posted @ 23:51 | Feedback (3)

生まれました

昨晩、ついに子供が生まれました。 しかし、出産というのはやはり一筋縄ではいかないものでした・・・

 

* * *

 

陣痛が始まったのは一昨日の夜。ヨメが「なんか腰が痛い」というので揉んでやったりして過ごしていると、トイレに行ったヨメから「しるしが出た~!」との知らせが。

その後腹の痛みが出てきたので、その間隔を測りつつ、ともかくもシャワー浴びたり夕食を食べたりして、この後の戦いに備えます。

そして陣痛の間隔が短くなったところで病院へ移動。病院についた後は陣痛室にて分娩の準備が出来るまで(陣痛が強くなり子宮口が開ききるまで)待機です。

時間と共にだんだんと強くなる陣痛に泣き叫ぶヨメ。それをなだめつつ、朝方には子宮口8cm開大とあと少しのところまできました。

が、なぜかそこでストップしてしまい、それからは一向に進まず、陣痛も若干弱まり感覚も広くなってしまいました。(夜中じゅう暴れたり叫んでたりしたから、体力がもたなかったのかなぁと、個人的には思ってます。) そして、その状態が午後まで続き、このままでは生まれてこないということで、陣痛促進剤を使うことに。

その後は薬が効きどんどん強くなる陣痛。ヨメは再び泣き叫びます。それをがっちりと抱えたり、腰をさすったり、押したりしてなだめ、そのときを待ちます。 陣痛促進剤を打ち始めてから3時間くらいすると、ようやく子宮口がさらに開いてきました。あと一歩です。

しかし、ヨメは体力も限界に近いですし、痛みにももう耐えられない様子でしたので、医師の判断で人口破膜して赤ちゃんが下がってくるのを待つことになりました。いよいよ分娩開始です。

ところが、分娩台の上でも泣き叫び、暴れるヨメ。医師や看護師さんにも散々注意されました。ごめんなさい>病院関係者の方々

しかも、どんなに待っても、いきんでも、一向に赤ちゃんの頭が見えません。 結局、赤ちゃんが骨盤を通れないと判断され、帝王切開に移行することになってしまいました。ヨメは長い間陣痛促進剤まで打って痛みに耐えてきたので、さすがに可哀想でした。せっかくがんばったのにねぇ・・・

そんなこんなで手術も無事に終わり、生まれてきてみればなんと3520gの男の子。そりゃ細いヨメの骨盤は通らないよなぁ。でも、無事に生まれてきてくれてよかった。狭いところを通ろうとしたので頭はとんがってましたが(^^;

 

とにもかくにも、ヨメお疲れさん。そしてありがとう。しっかり休んでくださいな。

 

* * *

 

そして私もかなり疲れました。徹夜したのはいつ振りだろう。一夜明けた今朝は体の節々が痛いですし。

ただ、今回の事で思ったのは「結局男はほとんど何も出来ないんだ」ということ。泣き叫ぶヨメのそばにいて腰をさすったりしていても、私は無力感でいっぱいでした。最終的には妊婦本人ががんばるしかないということを痛感しました。

 

さて、今日からは色々と申請、手続きをしなくては。こういうところは男にしか出来ませんからね。新米パパはがんばりますよぉ。

posted @ 8:18 | Feedback (24)

2008年2月27日 #

デザインパターンを学ぶ~その16:Factoryパターン(3)~

記念すべき100エントリ目となりました。いい加減にシリーズ再開せねばということで、前回から間が空きましたが、今回はAbstract Factoryパターンを取り上げます。

 

Abstract Factoryパターンは、具象クラスに依存することなく、一連の関連するオブジェクトを生成するためのインタフェイスを提供します。

具体的には、例えばGUIインタフェイスでスキンを指定したら、それに紐付くボタン、枠、スクロールバーなどを生成する、といった用途で使われているようですね。

 

では、コード例です。今回はお弁当の種類に応じたごはんとおかずを作るFactoryをコードにしてみます。

  1. 生成される製品の抽象クラスを定義します。
    C# Code
    public abstract class Abstractごはん
    {
      public abstract string 名前
      {
        get;
      }
    }
    
    public abstract class Abstractおかず
    {
      public abstract string 名前
      {
        get;
      }
    }
    
    VB Code
    Public MustInherit Class Abstractごはん
    
      Public MustOverride ReadOnly Property 名前() As String
    
    End Class
    
    Public MustInherit Class Abstractおかず
    
      Public MustOverride ReadOnly Property 名前() As String
    
    End Class
    
  2. 1.で作成した抽象製品クラスを継承し、具象製品クラスを定義します。
    C# Code
    public class ごはん : Abstractごはん
    {
      public override string 名前
      {
        get { return "ごはん"; }
      }
    }
    
    public class ふりかけごはん : Abstractごはん
    {
      public override string 名前
      {
        get { return "ふりかけごはん"; }
      }
    }
    
    public class ごま塩ごはん : Abstractごはん
    {
      public override string 名前
      {
        get { return "ごま塩ごはん"; }
      }
    }
    
    public class 梅干し : Abstractおかず
    {
      public override string 名前
      {
        get { return "梅干し"; }
      }
    }
    
    public class から揚げ : Abstractおかず
    {
      public override string 名前
      {
        get { return "から揚げ"; }
      }
    }
    
    public class 玉子焼き : Abstractおかず
    {
      public override string 名前
      {
        get { return "玉子焼き"; }
      }
    }
    
    public class 焼き鮭 : Abstractおかず
    {
      public override string 名前
      {
        get { return "焼き鮭"; }
      }
    }
    
    public class 煮物 : Abstractおかず
    {
      public override string 名前
      {
        get { return "煮物"; }
      }
    }
    
    public class ウインナ : Abstractおかず
    {
      public override string 名前
      {
        get { return "ウインナ"; }
      }
    }
    
    VB Code
    Public Class ごはん
      Inherits Abstractごはん
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "ごはん"
        End Get
      End Property
    
    End Class
    
    Public Class ふりかけごはん
      Inherits Abstractごはん
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "ふりかけごはん"
        End Get
      End Property
    
    End Class
    
    Public Class ごま塩ごはん
      Inherits Abstractごはん
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "ごま塩ごはん"
        End Get
      End Property
    
    End Class
    
    Public Class 梅干し
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "梅干し"
        End Get
      End Property
    
    End Class
    
    Public Class から揚げ
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "から揚げ"
        End Get
      End Property
    
    End Class
    
    Public Class 玉子焼き
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "玉子焼き"
        End Get
      End Property
    
    End Class
    
    Public Class 焼き鮭
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "焼き鮭"
        End Get
      End Property
    
    End Class
    
    Public Class 煮物
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "煮物"
        End Get
      End Property
    
    End Class
    
    Public Class ウインナ
      Inherits Abstractおかず
    
      Public Overrides ReadOnly Property 名前() As String
        Get
          Return "煮物"
        End Get
      End Property
    
    End Class
    
  3. 1.で作成した抽象クラスそれぞれを生成するメソッド(Factory Method)を持つ、抽象Factoryクラスを定義します。
    C# Code
    public abstract class Abstractお弁当Factory
    {
      public abstract Abstractごはん Createごはん();
      public abstract Abstractおかず[] Createおかず();
    }
    
    VB Code
    Public MustInherit Class Abstractお弁当Factory
    
      Public MustOverride Function Createご飯() As Abstractごはん
      Public MustOverride Function Createおかず() As Abstractおかず()
    
    End Class
    
  4. 3.で作成した抽象クラスを継承し、具象Factoryクラスを定義します。
    C# Code
    public class 日の丸弁当Factory : Abstractお弁当Factory
    {
      public override Abstractごはん Createごはん()
      {
        return new ごはん();
      }
    
      public override Abstractおかず[] Createおかず()
      {
        return new Abstractおかず[] { new 梅干し() };
      }
    }
    
    public class 和風弁当Factory : Abstractお弁当Factory
    {
      public override Abstractごはん Createごはん()
      {
        return new ごま塩ごはん();
      }
    
      public override Abstractおかず[] Createおかず()
      {
        return new Abstractおかず[] {
          new 梅干し()
          , new 焼き鮭()
          , new 煮物()
        };
      }
    }
    
    public class こども弁当Factory : Abstractお弁当Factory
    {
      public override Abstractごはん Createごはん()
      {
        return new ふりかけごはん();
      }
    
      public override Abstractおかず[] Createおかず()
      {
        return new Abstractおかず[] {
          new ウインナ()
          , new 玉子焼き()
          , new から揚げ()
        };
      }
    }
    
    VB Code
    Public Class 日の丸弁当Factory
      Inherits Abstractお弁当Factory
    
      Public Overrides Function Createご飯() As Abstractごはん
    
        Return New ごはん()
    
      End Function
    
      Public Overrides Function Createおかず() As Abstractおかず()
    
        Return New Abstractおかず() {New 梅干し()}
    
      End Function
    
    End Class
    
    Public Class 和風弁当Factory
      Inherits Abstractお弁当Factory
    
      Public Overrides Function Createご飯() As Abstractごはん
    
        Return New ごま塩ごはん()
    
      End Function
    
      Public Overrides Function Createおかず() As Abstractおかず()
    
        Return New Abstractおかず() { _
         New 梅干し() _
         , New 焼き鮭() _
         , New 煮物() _
         }
    
      End Function
    
    End Class
    
    Public Class こども弁当Factory
      Inherits Abstractお弁当Factory
    
      Public Overrides Function Createご飯() As Abstractごはん
    
        Return New ふりかけごはん()
    
      End Function
    
      Public Overrides Function Createおかず() As Abstractおかず()
    
        Return New Abstractおかず() { _
         New ウインナ() _
         , New 玉子焼き() _
         , New から揚げ() _
         }
    
      End Function
    
    End Class
    
  5. 1~4.で作成したクラス群を使用する、Clientクラスを定義します。
    C# Code
    public class お弁当Client
    {
      private Abstractごはん ごはん;
      private Abstractおかず[] おかず;
      private Abstractお弁当Factory お弁当Factory;
    
      public お弁当Client(string 種類)
      {
        if ( 種類 == "日の丸" )
        {
          this.お弁当Factory = new 日の丸弁当Factory();
        }
        else if ( 種類 == "和風" )
        {
          this.お弁当Factory = new 和風弁当Factory();
        }
        else if ( 種類 == "こども" )
        {
          this.お弁当Factory = new こども弁当Factory();
        }
      }
    
      public void お弁当作成()
      {
        this.ごはん = お弁当Factory.Createごはん();
        this.おかず = お弁当Factory.Createおかず();
      }
    
      public override string ToString()
      {
        List<string> おかず名List = new List<string>();
        foreach ( Abstractおかず おかず単品 in おかず )
        {
          おかず名List.Add(おかず単品.名前);
        }
        return String.Format(
            "{0}におかずとして、{1}が付いています。"
          , ごはん.名前
          , String.Join("、", おかず名List.ToArray())
          );
      }
    }
    
    VB Code
    Public Class お弁当Client
    
      Private ごはん As Abstractごはん
      Private おかず As Abstractおかず()
      Private お弁当Factory As Abstractお弁当Factory
    
      Sub New(ByVal 種類 As String)
    
        If 種類 = "日の丸" Then
    
          Me.お弁当Factory = New 日の丸弁当Factory()
    
        ElseIf 種類 = "和風" Then
    
          Me.お弁当Factory = New 和風弁当Factory()
    
        ElseIf 種類 = "こども" Then
    
          Me.お弁当Factory = New こども弁当Factory()
    
        End If
    
      End Sub
    
      Public Sub お弁当作成()
    
        Me.ごはん = Me.お弁当Factory.Createご飯()
        Me.おかず = Me.お弁当Factory.Createおかず()
    
      End Sub
    
      Public Overrides Function ToString() As String
    
        Dim おかず名List As New List(Of String)()
    
        For Each おかず単品 As Abstractおかず In Me.おかず
    
          おかず名List.Add(おかず単品.名前)
    
        Next
    
        Return String.Format( _
         "{0}におかずとして、{1}が付いています。" _
         , ごはん.名前 _
         , String.Join("、", おかず名List.ToArray()) _
         )
    
      End Function
    
    End Class
    

上記コードを実行してみます。

実行コード

C# Code
public class Program
{
  static void Main(string[] args)
  {
    お弁当Client client;

    Console.WriteLine("日の丸弁当:");
    client = new お弁当Client("日の丸");
    client.お弁当作成();
    Console.WriteLine(client.ToString());

    Console.WriteLine("和風弁当:");
    client = new お弁当Client("和風");
    client.お弁当作成();
    Console.WriteLine(client.ToString());

    Console.WriteLine("こども弁当:");
    client = new お弁当Client("こども");
    client.お弁当作成();
    Console.WriteLine(client.ToString());

    Console.ReadKey();
  }
}
VB Code
Public Class Program

  Public Shared Sub Main(ByVal args As String())

    Dim client As お弁当Client

    Console.WriteLine("日の丸弁当:")
    client = New お弁当Client("日の丸")
    client.お弁当作成()
    Console.WriteLine(client.ToString())

    Console.WriteLine("和風弁当:")
    client = New お弁当Client("和風")
    client.お弁当作成()
    Console.WriteLine(client.ToString())

    Console.WriteLine("こども弁当:")
    client = New お弁当Client("こども")
    client.お弁当作成()
    Console.WriteLine(client.ToString())

    Console.ReadKey()

  End Sub

End Class

実行結果

日の丸弁当:
ごはんにおかずとして、梅干しが付いています。
和風弁当:
ごま塩ごはんにおかずとして、梅干し、焼き鮭、煮物が付いています。
こども弁当:
ふりかけごはんにおかずとして、ウインナ、玉子焼き、から揚げが付いています。

 

さて、上記のコードをよく見てみると、気付くことがあります。

まずは、3.で定義した抽象Factoryですが、そのメンバである製品を生成するメソッドは、前回紹介したFactory Methodパターンとなっています。

また、Clientクラスの中で、抽象Factoryクラスの変数に、具象Factoryのインスタンスを切り替えて設定し、Factoryメソッドを実行している箇所は、Strategyパターンになっていますね。(この辺の話は以前凪瀬さんがまとめていらっしゃいますのでご一読をオススメします。)

このように、あるパターンの中に他のパターンが紛れている、ということもGoFパターンにはちょくちょくあるようですので、その意味、役割を考えなければいけませんね。わたしももう少し勉強します(^^;

 

 

さて、次回はFactoryパターンについてのまとめをお送りする予定です。

posted @ 23:58 | Feedback (0)

2008年2月26日 #

やっと届きました

επιστημη大先生の「C++言語のカラクリ」。

やっぱりまずは座談会から(^^

 

勉強させていただきます。

posted @ 23:09 | Feedback (2)

2008年2月11日 #

チャイルドシート購入

出産を来月に控え、今日、某「赤○ゃん本舗」にてチャイルドシートを購入しました。しかし、チャイルドシートも種類がたくさんあり、選ぶのに苦労しましたので、私なりの選んだポイントを紹介します。

今回選ぶ基準としては、

  • 安全であること
  • 乗せ降ろしが楽であること

の2つをメインとしました。

 

まず安全面を考えた上での第一候補はタカタの「takata04-neo」でした。

 

タカタは車のシートベルト、エアバッグなどの安全装置のメーカという事もあり、安全性はダントツのようです。「takata04-neo」が乳児用、幼児用ともに2004年度チャイルドシートアセスメントで「優」評価を得ている事からもそれが窺えます。

ただ、乳児用の取り付けは後ろ向きになるため、主に取り付ける予定の、妻の車のミニカ(3ドア)では社内が狭く、乗せ降しが大変そうでした。

 

そこで、店員さんに話を聞いてみて、最終的に選んだのが、「カーメイト」の「AILEBEBE・クルット プレミアム」です。

この商品は「クルット」の名のとおり、赤ちゃんを乗せたまま、シート部分が360°回るようになっているため、乗せ降しが楽そうでした。

また、安全性も「国土交通省型式指定基準適合品」ということでしたので、とりあえず信用することにしました。

さらに赤ちゃんは強い日差しに当たると皮膚がやられるため、「サンシェード」が付いているのもポイントでした。

 

同じような商品にコンビの「ゼウスターン」もありました。

が、回転させるための操作がクルットより煩雑だったので、今回はクルットに決定しました。

 

なお、超余談ですが、購入を済ませた後、「赤○ゃん本舗」にてくじ引きをしていたのでやったら、「特賞」を当ててしまいました。

んで、空気清浄機をもらったのですが、「EAST EA-300W」という聞いた事もないやつで、どうしようかなと。今流行り(?)の「MADE IN CHINA」だし。パッケージも非常にアジアンなかほりがしますです。(手抜き感がにじみ出ているところとか)

P506iC0017891788 

リサイクルショップに売るかな・・・

posted @ 18:28 | Feedback (5)