梅林日記

雑用系プログラマの趣味とお仕事

目次

Blog 利用状況

ニュース

資格

MCAD OCP

書庫

日記カテゴリ

2007年5月2日 #

6月勉強会発表:テーマは「デザインパターン」

中さんのBlogエントリで紹介されているとおり、6月の勉強会で初めてスピーカーを務めさせてもらいます。

テーマは「デザインパターン」。

 

私は2月の東京勉強会がわんくま初参加の会だったのですが、その時のひろえむさんのセッションや

後半のパネルディスカッションの活発な議論を聞いて、自分もオブジェクト指向論について

人前で話せるような開発者になりたいと考えていました。

 

デザインパターンについては、皆さん色々な意見をお持ちだと思いますが、今のところの私の考え方としては

特定のソフトウェア開発上の課題について、カプセル化や継承、ポリモーフィズムなどのオブジェクト指向の

要素を組み合わせることで、変化に対する強さなどの価値を実現するベストプラクティスだととらえています。

野球で例えると、ピッチングや守備などの個人技を基盤として、塁に走者がいる時にゲッツーをとるための

各選手の動きの組み合わせのようなものでしょうか。(すいません例えが下手で。ついでに野球経験ありません)

 

デザインパターンといっても、GoF本の23のパターンの全てを一通り解説するというような内容では

時間的にも広く浅くになってしまうと思うので、同書が挙げるパターンの3つのカテゴリー(生成、構造、振る舞い)のうち

生成のパターン(Abstract Factory、Builder、Factory Method、Prototype、Singleton)に絞って、コードサンプルのほか

周辺の技術も含めた話をしてみたいと思っています。

 

頑張りますので、応援よろしくお願いします。

posted @ 2:20 | Feedback (1)

2007年5月1日 #

カラダスキャン

ここしばらく、環境の変化を言い訳に色んなことをなおざりにしています。

運動不足もその一つ。

 

正月に帰省したときも、親に「あんた太った?」と聞かれました。

4月の東京勉強会のときは、4次会(5次会だったっけ?)のカラオケでR・田中一郎さんに

「週に二回は運動しなきゃだめだよー」とありがたいお言葉を頂きました。

この間は、ひいきにしているクリーニング屋のおばちゃんにまで「太ったんじゃな~い?」と言われました(泣)

 

さすがに危機感を感じ、ヨドバシカメラに「カラダスキャン」を買いに行きました。

スマップの香取くんがCMしてたやつですね。

 

早速計ってみると

・体重:約70kg

・体脂肪率:20%オーバー

・BMI:25直前

はい、認めます。

肥満に片足と片腕ぐらいは突っ込んでます。

 

それ以上にショックだったのが体年齢。

自分の年齢より7才オーバーでした。

次の日ランニングシューズとランニングウェアを買いに行きました。

 

夏が近い。

運動不足にご注意を。

posted @ 22:23 | Feedback (2)

2007年4月2日 #

転職しました

今日から新しい会社で働くことになりました。

実はおぎわらさんと同じ会社です。

(というのはこのエントリで知りました。おぎわらさん、よろしくお願いします。)

 

今まで以上にMicrosoftの技術にどっぷり浸かれる会社のようです。

とりあえずはVBとASP.NETを、仕事で使えるレベルになるよう猛勉強せにゃなりません。

色々大変ですが、これからが楽しみです。

posted @ 21:48 | Feedback (5)

2007年2月23日 #

SQL ServerとOracle (その1) : DDLとトランザクション

最近SQL Server 2005の勉強をしているのですが、今まで仕事で関わってきたOracleと比較すると

色々異なる点がありそうなので、ネタにしてみようと思います。

 

一つ目はDDLとトランザクションの関係について。

 

DDLとは、表やビュー、ストアドプロシージャなどのデータベース・スキーマオブジェクトを

新規に作成したり、変更や削除を行うためのSQLコマンドで、例としては

(表の作成) CREATE TABLE table1 (id INT, value VARCHAR(50))

(表の変更) ALTER TABLE table1 ADD CONSTRAINT pk_table1 PRIMARY KEY (id)

(表の削除) DROP TABLE table1

などが挙げられます。

 

ここで、トランザクション内でDDLを発行する場合について考えます。

 

Oracleでは、DDLが発行されるとトランザクションが暗黙でコミットされるため、ロールバックすることができません。

一方SQL Serverでは、DDLもINSERT/UPDATE/DELETEなどのDMLと同様に、ロールバックすることができるようです。


BEGIN TRAN
  CREATE TABLE test1(id INT, value VARCHAR(50))
  INSERT INTO test1(id, value) VALUES(1, 'Hello World!')
  SELECT * FROM test1
ROLLBACK TRAN
go

(1 件処理されました)
 id          value                                             
 ----------- --------------------------------------------------
           1 Hello World!                                      

(1 件処理されました)

SELECT * FROM test1
go

メッセージ 208、レベル 16、状態 1、サーバー xxxxx、行 2
オブジェクト名 'test1' が無効です。


Oracle使いからすると意外な機能でした。

他のデータベースではどうなっているのか気になります。

posted @ 1:33 | Feedback (1)

2007年2月15日 #

WM_PAINTを使ったTextBoxのカスタム描画

数日前のえムナウさんのエントリ「TextBoxを自分で描画する」を読みました。

 

TextBoxに入力もしくはデータバインドしたデータを、数値や日付データとして

フォーマットして表示するという機能は以前から必要としておりまして、これまでは

Textプロパティをoverrideするという無理やりな方式を採用していました。

 

できればTextプロパティはそのままで、表示するデータだけを変えるようにしたいと思っていたので

これはいい、と早速試してみたのですが、書いてあるとおりSetStyleやRecreateHandleを記述しても

どうしてもフォーカスがあるときと無いときでフォントの大きさが変わってしまいます。

 

色々調べた結果、WM_PAINTメッセージを捕まえてCreateGraphicsで作成したGraphicsオブジェクトに

文字列の描画を行う方式に落ち着きそうです。


namespace Umebayashi.Framework.Windows.Forms
{
    public partial class UmeTextBox : TextBox
    {
        public UmeTextBox()
        {
            InitializeComponent();
        }

        private const int WM_PAINT = 0x000F;

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_PAINT:
                    //フォーカスがある状態ではフォーマットしない
                    if (!Focused)
                    {
                        DrawText();
                    }
                    break;
                default:
                    break;
            }
        }

        private void DrawText()
        {
            TextFormatFlags tff = TextFormatFlags.VerticalCenter;
            switch (this.TextAlign)
            {
                case HorizontalAlignment.Center:
                    tff |= TextFormatFlags.HorizontalCenter;
                    break;
                case HorizontalAlignment.Left:
                    tff |= TextFormatFlags.Left;
                    break;
                case HorizontalAlignment.Right:
                    tff |= TextFormatFlags.Right;
                    break;
            }
            if (this.Multiline)
            {
                tff |= TextFormatFlags.WordBreak;
            }

            using (Graphics g = CreateGraphics())
            using (Brush backBrush = new SolidBrush(this.BackColor))
            {
                //BackColorで背景を塗りつぶす。
                //これをしないとフォーマット前後の文字列がダブって表示される。
                g.FillRectangle(backBrush, this.ClientRectangle);

                DateTime dtVal;
                decimal dcVal;
                if (DateTime.TryParse(this.Text, out dtVal))
                {
                    TextRenderer.DrawText(g, dtVal.ToString("yyyy/MM/dd"),
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
                else if (decimal.TryParse(this.Text, out dcVal))
                {
                    TextRenderer.DrawText(g, dcVal.ToString("#,##0"),
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
                else
                {
                    TextRenderer.DrawText(g, this.Text,
                        this.Font, this.ClientRectangle, this.ForeColor, tff);
                }
            }
        }
    }
}

posted @ 0:03 | Feedback (2)

2007年2月8日 #

配列プロパティとインデクサ

以前のεπιστημηさんのVB嫌い[2]というエントリーで
VBの引数付きプロパティとC#のインデクサを比較する話がありました。

Delphiにも配列プロパティというのがありまして、VBの引数付きプロパティと
同じような使い方ができます。(のはず。VB知らないので間違ってたらご指摘ください。)


type
  TAnimals = class(TObject)
  private
    function GetDog(Index: Integer): TDog;
    procedure SetDog(Index: Integer; Value: TDog);
    function GetCat(Index: String): TCat;
  public
    //ReadWriteプロパティ
    property Dogs[Index: Integer]: TDog read GetDog write SetDog;
    //ReadOnlyプロパティ
    property Cats[Index: String]: TCat read GetCat;
  end;

C#のインデクサと比較しての便利さは、やはりgetterとsetterのメソッドを定義するだけで
使えるところ。
そこで、C#2.0のジェネリックを使って、以下のようなユーティリティクラスを作ってみました。


public delegate V ArrayProperty1Get<V, K1>(K1 key1);
public delegate void ArrayProperty1Set<V, K1>(K1 key1, V value);

public class ReadOnlyArrayProperty1<V, K1>
{
  public ReadOnlyArrayProperty1(
    ArrayProperty1Get<V, K1> getMethod)
  {
    this.getMethod = getMethod;
  }

  private ArrayProperty1Get<V, K1> getMethod;

  public V this[K1 key1]
  {
    get
    {
      return getMethod(key1);
    }
  }
}

public class ReadWriteArrayProperty1<V, K1>
{
  public ReadWriteArrayProperty1(
    ArrayProperty1Get<V, K1> getMethod,
    ArrayProperty1Set<V, K1> setMethod)
  {
    this.getMethod = getMethod;
    this.setMethod = setMethod;
  }

  private ArrayProperty1Get<V, K1> getMethod;
  private ArrayProperty1Set<V, K1> setMethod;

  public V this[K1 key1]
  {
    get
    {
      return getMethod(key1);
    }
    set
    {
      setMethod(key1, value);
    }
  }
}


これを使うと


public class Animals
{
  public Animals()
  {
    Dogs = new ReadWriteArrayProperty1<Dog, int>(GetDog, SetDog);
    Cats = new ReadOnlyArrayProperty1<Cat, string>(GetCat);
  }

  private Dog GetDog(int index)
  {
    //
  }

  private void SetDog(int index, Dog value)
  {
    //
  }

  private Cat GetCat(string index)
  {
    //
  }

  public ReadWriteArrayProperty1<Dog, int> Dogs;
  public ReadOnlyArrayProperty1<Cat, string> Cats;
}

class Program
{
  static void Main(string[] args)
  {
    Animals animals = new Animals();
    animals.Dogs[0] = new Dog("パトラッシュ");
    animals.Dogs[1] = new Dog("ラッシー");
    animals.Cats["ABC"] = new Cat("たま"); //コンパイルエラー
  }
}


みたいなことができます。

「インデクスが2つ以上ある場合はど~するんや」と突っ込まれそうですが
その場合はK2、K3、…と型パラメータを増やしたバージョンを追加します。

私の経験上、インデクスが4つ以上もあるような配列プロパティには、自社開発の
アプリも含めて出合った記憶がありません。

posted @ 1:07 | Feedback (1)

2007年1月27日 #

渋谷109に

SHIBUYA109

なにやら見慣れたロゴが(笑)

 

思わずお持ち帰りしてしまいました。

W-ZERO3で撮ったので(しかも夜)画質とかお話になりませんが。

 

ちなみに写真からは分からないと思いますが、Vistaロゴの下に

「次世代OS発売まであとHH:mm:ss」

と、カウントダウンが表示されていました。

(私が見たときは残り50時間くらいでした)

posted @ 22:46 | Feedback (2)

2007年1月16日 #

ふと口走る業界用語

今日の夕方、夕食をとりに外出したとき

財布の中に金が無いことに気づき、ふと口走った一言

 

「やべ、ダウンロードしなきゃ」

 

すっかり毒されつつある今日この頃

posted @ 20:43 | Feedback (7)

2007年1月10日 #

MSDNオフライン ジーニアス平井登場!(受付中)

http://www.microsoft.com/japan/msdn/events/offline/#23

早速登録しました。

 

平井さんといえば、今年のTech Edの最終日・最終セッションで

WPFについての圧倒的に面白いプレゼンをされた方ですね。

あの時は、マイクロソフトにもこんなすごいエンターテイナーがいるのかと感動してしまいました。

 

今回のテーマは「既存アプリケーションのWindows Vista対策」とのことで、Delphi製のC/Sアプリに

関わっている自分としても大変興味のあるテーマです。

 

MSDNオフラインでは第15回の「CLI の実装手法とビジネスへの応用例」にも参加しました。

C/C++経験のない自分としては少々敷居の高い内容でしたが、これからもこういったイベントやセミナーに参加し

自分の幅を広げていきたいものです。

posted @ 2:36 | Feedback (2)

ご挨拶

はじめまして、梅林と申します。

横浜在住で、業務用パッケージソフトの開発に携わっているプログラマです。

 

わんくまは活気のあるコミュニティとして前から注目しており、ここ何度か

掲示板などに書込みをさせて頂きましたが、この度思い切ってメンバーに

加えて頂く事になりました。

 

仕事で使うツールはDelphiとOracleが主でしたが、最近はDelphi製のアプリをC#で書き直すのが主な仕事です。

Webアプリはいまだに仕事で作ったことがないため、ASP.NETとかAJAXのネタは提供できないかもしれませんが

Windows Formsやデータベース、その他歴史の闇に消えつつある(笑)Delphiのネタなどを中心に

つらつらと書き込んでいきたいと思います。

 

どうか皆様、よろしくお願いします。

posted @ 1:47 | Feedback (22)