2010年10月31日日曜日

【翻訳】Code Kataその1 スーパーマーケットの価格

Code Kataの日本語訳を色々探してみたが、見つけられなかった。
無いのなら自分で作ればいい、ということで、Code Kataその1を英語学習がてら、翻訳してみた。
学校の授業以外での英文翻訳なんて生まれて始めてやったので、ツッコミ大歓迎です。
=============================================
Code Kata -その1 スーパーマーケットの価格
  ( http://codekata.pragprog.com/2007/01/code_kata_one_s.html )

この型はDFW Practionersミーティングにあるいくつかの議論から起こりました。その問題はパッと見簡単なもの-- スーパーマーケットで商品に値をつけること--です。
豆の値段が0.65ドルであるというように、スーパーマーケットのいくつかのものには、単純な価格がついていますが、それより複雑な価格のものもあります。
例えば:
   ・3個で1ドル (すると、私が4個か5個買うならいくらになる?)
   ・ポンドあたり1.99ドル(とすると4オンスはいくら?)
   ・2つ買うと一つは無料(じゃあ3つ目の値段は?)
この型は、コーディングを必要としません。この演習は、お金を表現するための様々なモデルと価格に、充分なこれらの(およびその他の)価格体系に対応する柔軟性を実験します。そして同時に一般的な場面で(チェックアウト時、株式管理、受注などのために)使用可能です。
   ・小額なお金は存在していますか?
   ・いつ丸めは起こりますか(やるとしても)?
   ・あなたはどのように価格決定の動作記録を保ちますか?(あなたは、必要があります)
   ・経費と価格は同じクラスのものですか?
   ・100缶の棚を使って値が付けられるとき、
         「2つ買ったら1つ無料」の場合にどのように在庫を評価しますか?
これは、理想的なシャワータイムの「型」ですが、注意してください。問題のいくつかは、最初に現れるより微妙です。わたしは、主な選択肢を消化するために、それが2、3週間分のシャワーを浴びるのに相当するかもしれないことを提案します。


■GOAL
この型のゴールはよりゆるいスタイルの実験的なモデル化を練習することです。問題を扱うできるだけ多くの異なった方法を探してください。各々のいろいろな取引を考慮してください。どんなテクニックを使うことが、これらのモデルを調査するためにベストですか? それらを記録するために? どのように、あなたはモデルが合理的であることを確認できますか?
=============================================


…なんか、日本語として変ですね。やっぱり難しい…。
要するに、いろいろなスーパーマーケットの価格設定のモデルを考えてみようってことです。
今後も気が向いたら(もう二度と向かないかもしれないけど)順次翻訳していこうかな、と思ったり思わなかったり…。

Code Kataって知ってる?

情熱プログラマという本 ( http://amzn.to/d6zjDE ) を読んでいる。

そこにこんなことが書いてあった。

プログラマはしばしば実務の中でスキルを訓練する。
これがミュージシャンだったらどうだろう? 彼らがステージ上で変な音を出しながら練習していたら、観客はどう思う? 練習は、観客のいない密室で、自分の時間を使ってするべきだ。プログラマもそれと同じだ。

なるほど、それはその通りだ。で、この本にプログラミングの訓練の手がかりが紹介されている。
それが「Code Kata ( http://codekata.pragprog.com/ )」 だ。

"Kata"とは、空手の型のこと。
空手の練習は、定められた型を繰り返し反復することで技術を習得していく。
それと同様のコンセプトで、型を訓練し、ソフトウェア開発のスキルを磨きましょう、というものだそうな。

お暇な方は試してみては?

2010年10月29日金曜日

今までよく分かってなかったラムダ式の使い道を考えてみた。

C#3.0から追加された言語仕様に「ラムダ式」というのがある。
どういうものかは、何となく知っていたが、今いちどういう局面で使うのか分からなかった。
(業務アプリでこういう実装がどうしても必要な局面もあんまり無いし)

昨日、『言語設計者たちが考えること』( http://amzn.to/azXdTs ) という本でC#の設計者であるアンダース・ヘルスバーグのインタビューを読んでいて、このあたりの認識に閃きを得た。

そこでラムダ式の使い道について、誰得なエントリーを書いてみる。
まぁ、僕個人の覚書なのでスルーしてもらってもOKです。

内容に関して、「お前そりゃ間違ってるよ」などのツッコミがあれば大歓迎です。
拙いコードですが、お暇な方はお付き合いください。

さて、まずはこんなコードを書いてみる。
static void Main(string[] args)
{
  TokyoOutput();
  OsakaOutput();            
}

private static void TokyoOutput()
{
   int result = 0;
   for (int i = 1; i <= 10; i++)
   {
      result += i;
   }
  Console.WriteLine("計算結果は" + result.ToString() + "ですね。" +
                                 Environment.NewLine);
}

private static void OsakaOutput()
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    Console.WriteLine("計算結果は" + result.ToString() + "やね。" + 
                                Environment.NewLine);
}
1から10を順に足しこんでいって、それを標準語で出力するメソッドと、大阪弁で出力するメソッド。ご覧の通り、異なるのは最後の結果出力のみで、計算処理は当然まったく同じロジック。 しかし、これはいくらなんでもブサイクすぎる。同じロジックが複数のメソッドに分散しているなんて。ってことで、ちょっと分離してみたらこうなった。
static void Main(string[] args)
{
    TokyoOutput(Calculate());
    OsakaOutput(Calculate());
}

private static int Calculate()
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    return result;
}

private static void TokyoOutput(int i)
{
   Console.WriteLine("計算結果は" + i.ToString() + "ですね。" + 
                                Environment.NewLine);
}

private static void OsakaOutput(int i)
{
    Console.WriteLine("計算結果は" + i.ToString() + "やね。" + 
                                Environment.NewLine);
}
うーん。なんか周りくどい…。 計算処理(Calculate)からの戻り値を次の出力メソッドに引数で渡すとか、面倒くさくね? ここにはコードを書かないけど、計算部分を抽象クラスにして、出力部分をoverrideするって手もある。しかしこの程度の処理でそこまで大げさにやるのもなんか嫌だ。 そこでラムダ式を使ってみる。
static void Main(string[] args)
{
    Action Tokyo = (int i) => 
                 Console.WriteLine("計算結果は" + i.ToString() +
                                   "ですね。" + Environment.NewLine);
    Action Osaka = (int i) => 
                 Console.WriteLine("計算結果は" + i.ToString() + 
                                   "やね。" + Environment.NewLine);
    Output(Tokyo);
    Output(Osaka);
}

private static void Output(Action outProc)
{
    int result = 0;
    for (int i = 1; i <= 10; i++)
    {
        result += i;
    }
    outProc(result);
}
うん。なんかすっきりした気がする。

ラムダ式を使う局面ってこんな感じでいいのかな?

要するに、関数をパラメータで渡すって事だから、メソッドの中の一部を外から見て任意にしたいって事だよね? うん。なんとなく分かってきた。もうちょっと掘り下げて考えていこうっと。

2010年10月27日水曜日

僕たちが若い人たちに伝えられること

今度、ちょっとしたライトニングトーク大会を皆で企画している。

その中で、会場はある幹事メンバーの母校を使わせてもらえることになった。
最終的にそこを使わせてもらうかはどうかは、これから皆で話しあって決める予定なのだけど。

なんでも担当の職員さんや先生方もノリノリで、エンジニアを志す学生に向けて勉強のために公開してもらえるなら喜んで提供しますよ、というありがたいお話である。

学生さんにオープンにするのは全然問題ないのだが、この件で少し悩んでしまった。

僕らが、エンジニアを目指す学生さんたちに伝えられることなんてあるだろうか……?

IT業界は今、多くの局面において厳しい状況にさらされている。

どういう風に厳しいかは今回の主旨に関係ないのであえて書かないけれど、お世辞にも若い人に向けて「うちらの業界は安泰だから安心して飛び込んで来い」なんて言えない。なんたって自分たちの10年後がどうなっているかすら、不安な状況なんだから。

僕らは、エンジニアを志す若い人たちに、一体何を伝えてあげればいいんだろう…。

でも、あまり難しく考える必要はないのかもしれないな。

確かに厳しい世の中だけど、少なくとも僕らはこうしてイベントなどをやっては仲間内で集まって、ケラケラ笑いながら、遊んだり、学んだり、お互いに影響を受け合ったりして楽しくバカなことしてる。

そういう部分を見せてあげられれば、それでいいんじゃないかな。

そして、若い人に向けてそんなバカで最高にクールなお祭りを見せてあげられる僕らは、なんだかんだいって幸福なんじゃないかな。

2010年10月24日日曜日

totoBIGが当たったよ!

毎回、10口ずつ買っているtotoBIG。
生まれて初めて当選した!!

その模様をお届け。

これが結果画面。
右上にある「当せん照会サービス」をクリック!!

当せん照会画面で照会番号を入力!!
そしてその結果は……………。


見事当せんなり!!!

5等。1,800円!!

10口買ったから差し引き -1,200円。

まあ、損得とかじゃなくて当たったらそれはそれで嬉しいものだ。



2010年10月23日土曜日

前へ進むという事の覚悟

禁煙を始めて三週間が経った。

ニコチンの離脱症状も無くなり、僕は今、「非喫煙者」としての生活を満喫している。

僕はもう二度と、タバコを吸うことはないだろう。なぜなら、タバコを止めるという行為によって、僕は一つ前へ進んだのだから。

喫煙者であった頃の自分にとって、禁煙はとてつもないハードルだった。たとえば、タバコが嫌いな会社の偉い人と一日過ごすために一時的に禁煙を余儀なくされる場合など、そのたった数時間が耐え難いほどだった。

しかし、僕は禁煙を決断した。最も短絡的な動機はタバコの値上げである。そしてもう一つの動機は、「自分はそろそろ次のステージに行かねばならない」という自身のキャリアに関する悩みがあったからだ。

キャリアといっても別に転職を考えている訳ではないのだけれど、もう一段、自分を意識的にレベルアップさせたいと考えたのだ。TOEICの勉強などを始めたのもその一貫である。

意識的に自分をレベルアップさせるためには、相当な困難を伴なう。タバコをあっさり止めるくらいの事ができなくて、レベルアップなどできるものか。なぜかそう思った。そして僕はタバコを止めた。

自分自身を次のステージに上げるために、覚悟を決めて踏み出した道であるから、後戻りは許されない。時々タバコを吸いたいな、と思うときはあるけれど、そうはいかない。

例えば、転職した人が、前職をどれだけ懐かしんでも、もう戻ることはできない。
例えば、学生時代にどれほどノスタルジーを感じようと、戻ることはできない。

前へ進む覚悟というのは、そういう事だ。

だから、僕も後ろを振り返らない。二度とタバコは吸わない。

そう自分に言い聞かせながら、「非喫煙者」としてのモチベーションを維持している。
それに、喫煙者時代に「非喫煙者になりたい」とある意味で憧れていた自分自身の姿になった、過去の自分にとっての「あちら側」の生活を過ごす満足感なんかも心地良い。

これ、結構効果があってオススメの禁煙法ですよ。

2010年10月21日木曜日

意外な方向が見えて面白くなってきた の巻

今日は午後から、某社が主催するクラウド研究会に参加した。

上司から参加を命じられた会なのだが、最終的に研究成果を論文に書いて来年のシンポジウムで発表する、という恐ろしくも興味深い会である。

研究テーマは「クラウドサービスの運用について」。

しかし、一言でクラウドと言っても幅が広すぎて、きちんとスコープを絞らないと論文どころか本一冊書けてしまうような事態になる。

ここで別の研究グループの中間報告を聞く。
別のグループもクラウドについて研究しているようだが、我々の感覚からすると少し違和感のある結論に向いているようだ。

そこで、シンポジウム全体のバランスを考えると、その別グループの主張と真逆の方向で研究を掘り下げ、対立構図を作っても面白いのではと提案してみた。内容的に逆の意見で掘り下げるのも可能であるということで、その方向性で行くことになった。

あと、この会議では「クラウドサービスの定義」について、今まで誰も言及しなかった少し面白い視点でのアイデアが出た。論文として成果をまとめるのであれば、こういった「今までにない視点」は非常に有効である。

具体的にどういった内容かを今ここで書いてしまうと、シンポジウムのお楽しみが無くなってしまうので詳細は伏せるが、ちょっと面白い方向になってきた。

さて、来月までにこの論文要旨を僕が書くことになったので、頑張らないと!!

2010年10月18日月曜日

【備忘録】iBatis.netで任意の場所に配置されているSqlMap.configを指定する方法その2 -こっちのほうが良いみたい-

頑張って英語のマニュアルを読んだら書いてあった。

http://code.google.com/p/mybatisnet/downloads/detail?name=Doc-DataMapper-1.6.2.zip&can=3&q=datamapper+docs
↑このマニュアルの73~75ページ

public class Mapper
{
    private static volatile ISqlMapper _mapper = null;
    protected static void Configure(Object obj)
    {
        _mapper = null;

    }

    protected static void InitMapper()

    {

        ConfigureHandler handler = new ConfigureHandler(Configure);

        DomSqlMapBuilder builder = new DomSqlMapBuilder();

        _mapper = builder.ConfigureAndWatch("SqlMap.configのパス", handler);

    }

    public static ISqlMapper Instance()

    {

        if (_mapper == null)

        {

            lock (typeof(SqlMapper))

            {

                if (_mapper == null)

                {

                    InitMapper();

                }

            }

        }

        return _mapper;

    }

    public static ISqlMapper Get()

    {

        return Instance();

    }

}
C#4.0 (Visual Studio 2010)
iBatis.DataMapper 1.6.2

builder.ConfigureAndWatch()というメソッドが、SqlMap.Configの変更を監視し、
変更が無ければ前回作成したインスタンスを再利用するようだ。

なるほど、こっちのやり方のほうが安心。

上記サンプルクラスを使えば、Mapper.Instance()というように、
従来通りMapperにアクセスできるという寸法だね。

やっぱり面倒臭がらずにマニュアルは読むべきだな…。

【備忘録】iBatis.netで任意の場所に配置されているSqlMap.configを指定する方法

iBatis.netでは、iBatis関連のdllとSqlMap.configを同じディレクトリに配置する必要があるのだが、
ちょっと理由があって、それぞれ別々に配置したくなった。

なにかいい方法はないかといろいろ試したら、こんな実装で実現できた。


ISqlMapper _sqlMap = null;



XmlDocument sqlMapConfig = new XmlDocument();

DomSqlMapBuilder mapBuilder = new DomSqlMapBuilder();

sqlMapConfig.Load("Sql.configのパス");

_sqlMap = mapBuilder.Build(sqlMapConfig, true);


C#4.0 (Visual Studio 2010)
iBatis.DataMapper 1.6.2

ほんとにこれでいいのかな?
もうちょっと調べてみる。

2010年10月17日日曜日

今更ブログを始めて見た。

これまでに何度かブログを作ってきたのだが、いろいろ思うところあってもう一度やってみる。

かつては自作サイトで日記を書いていたが、いろいろ面倒になって閉鎖。
mixiで日記を書いているが、マイミク(ほとんどリアル知人)限定に向けた内容。
某所でコラムを書いてみるが、もう少しカジュアルな話題も書きたい。技術的な独り言とか。
で、そういう部分はTwitterでまかなおうと思ったけど、140字ではいろいろ足りない。

そんなわけでここに独り言の場を作った。

ひょっとしたら放ったらかしになるかもだけど、気が向いたら更新しますよ、と。