2010年12月16日木曜日

オブジェクト指向むつかしい。。

前に教えてもらったサイトを再度目を通してみた。

オブジェクト指向の本懐
http://d.hatena.ne.jp/asakichy/20090421/1240277448

オブジェクト指向の勘違い
継承で処理の共通化
カプセル化してデータを隠蔽
オブジェクトとはデータとメッセージ。

オブジェクト指向とは
責務の分離
直行性
変更部分を抽象化して切り離す。


継承の問題点
変更に弱くなる
再利用性が低下する。
可読性が低下する。


継承よりも集約
共通部分を基底クラスとして抜き出すよりは、
異なる部分だけを抽出してクラスにまとめるか、
共通部分だけを抽出してクラスにまとめておき。
集約の関係をつかってメンバとして持つのが良い。


型としてのクラス。
プリミティブ型はかなり抽象度の高い型であるためラップして別の型を定義することで、具体化した意味のある型として扱える。



2010年11月3日水曜日

のーたいとる

リリース計画
ストーリーポイントでざっくり見積り。

イテレーション計画
ストーリーをタスクに分解して見積もる
収まるか収まらないかでリリース計画を見直す
イテレーションでストーリーが中途半端にならないようにすること。
イテレーションに収まらないストーリは収めないかストーリー分割を行う

イテレーションの長さ。
優先順位が変わらない期間にするとよい。
リリースまでに最低3回以上のイテレーションにするとよい



.

2010年10月12日火曜日

アジャイルな見積りと計画づくり

「見積りとは時間内に作業が完了する確率のことである。」
という帯がついている書籍です。

見積りの誤差。
初期段階では、+75%~-25%

なぜ見積もるのか。
・リスクの軽減
見積もることで予めリスクを知ることができるため、回避方法などを調べることができる。

・不確実性を減らす
機能の価値や開発にかかる工数を

よい計画とはなにか
・見積もり時間と実際の時間の差が少ないこと。
・作業が早く終わることや遅れていることがすぐに解ること。

アジャイルな計画づくりとは。
・計画とはその瞬間のスナップショットでしかないため、計画づくりに重きをおく。
・計画は変更されても構わない。むしろ積極的に変更したい。
・変更することは、チームが知識を得た結果をスケジュールに反映すること。(プラスの面もマイナスの面も含めて)
・知識は最後まで残るが、計画はその場の使い捨て。
・最初にすべてを見積もらない。
・最初の計画を作るために必要な機能のみを見積もる。
・計画は必要な情報を元に算出するようにしておく。



.


2010年10月5日火曜日

チケット駆動型開発

チケット駆動型開発

導入としてはバグ管理から始めるのがよさそう。
チケットの粒度をあわせる。
チケットは開発者一人で完結するぐらいがよいのではないかと思う。(1~2日程度)
細かすぎるとチケットを処理する工数が多くなる。
大きすぎるとチケットを処理するのに時間がかかりチケットの履歴が長くなってしまう。

注意)
チケット無しのコミット禁止
チケットの状態を常に最新にしておくことが重要


2010年10月2日土曜日

FlowLayoutControlにInsertしてみる。

色々困ったことはあったけど、ある程度動くようになってきました。
困ったことはまた別の機会に整理して書いてみようかと思います(たぶん)

C#で作っているのですが、UIで悩みました。
一覧表示するのに、DataGridViewを使うとあまりにもシンプルすぎて、見た目が悪いなーと。
で、UserControl+FlowLayoutPanelを使うことに。
読み込んだTimeLineの一覧を表示するだけならFlowLayoutPanelのControlsにUserControlをAddするだけでよかったのです。
が。。。
差分だけTimeLineを更新するときにAddすると?リストの最後にUserControlが追加される。
考えてみたら当たり前のことなですがね…

Insertとかいう便利なメソッドはFlowLayoutPanelのControlsにはついていないワケでして、
ControlsのメソッドをMSDNでみているとSetChildIndexと言うものがあるじゃないですか!
Controls.Add → Controls.SetChildIndex(追加したControl, 0) でリストの一番上に追加することが出来ました。

あまり使わないコントロールは使いにくいなー。

2010年9月9日木曜日

ジャパニーノを組み立てたはいいが。。。

大人の科学の付録であるジャパニーノを日曜日に購入。

組み立てて動作確認はできた。
正常に動いてくれたので基盤やLEDは大丈夫そうです。

MacBookにスケッチを記述するIDEとUSBドライバを
ダウンロードしてインストールっと。

本を見ながらサンプルコードをコンパイルして、
基盤に書き込む!

素敵に赤い文字でエラーが表示されましたorz
なんでやー。
数回繰り返すがエラー。エラー。

Macの時には注意が必要とのことが本に書いてありました。
どうやら書き込む時にリセットボタンを押す必要があるみたい。

リセットを押す時間やタイミングを替えながら
試行錯誤の結果。ダメでした。

Google先生に聞いてみるとドライバの不具合でMacではリセットが必要になっているみたい。
しかもタイミングと押している時間がすんごいシビアみたいです。

明日はWindowsのパソコンで試してみよっと。

.


2010年9月8日水曜日

XP祭りの平鍋さんの発表をUstreamでみて

自分が感じたことをまとめてみた。

Agile
市場・ビジネス・ITが完全に分離していた。
それを一体化するのがAgile開発
やってみて結果から戦略を作りながら進む

結果を求めるため、プロセスは短期間となり反復開発になる。
7割のレベルで早く試作し実際に使って手直しして完成度を高める。


分割の仕方
機能で切る
層で切らない


Kanban
やっていることを見える化することから始める
みんなで改善してよりよくすること。

仕事
良い仕事をするためには、
家族や自分自身の幸せであることが不可欠
仕事は人生の一部で人生の最も多くの時間を費やす場所として楽しみながら成果をだせるのが一番よい

良いまとめ記事があったので紹介
http://blogs.itmedia.co.jp/hiranabe/2010/09/xp2010-d18d.html


2010年8月31日火曜日

Windows Server 2008のライセンス

Windows Server 2008には仮想化した場合のライセンスが付いている。
ダウングレードしてWindows Server 2003も使えるのでテスト用にも最適。

Windows Server 2008 Standard
サーバーライセンス1
仮想サーバライセンス1


Windows Server 2008 Enterprise

サーバーライセンス1
仮想サーバライセンス4

クライアントライセンス
デバイス単位とユーザ単位がある。
Windows Server 2008にアクセスするのであればどのサーバーにもアクセス出来る。
デバイス単位はPC一台に1ライセンス(アクセスするユーザは誰でもよい)
ユーザ単位はユーザ一人に1ライセンス(アクセスするPCは関係ない)


管理する為だけのアクセスは2デバイスまたは2ユーザまでは無料
Windows Web Server 2008へのアクセスも無料


ライセンス早わかりガイド

クライアントライセンス(CAL)概要



2010年8月24日火曜日

VMWareをざっくりと

VmWare Player
スナップショットはできない
→フリーのツールでスナップショットができる
→NMH http://www.geocities.co.jp/SiliconValley/2994/tool/nhm/nhm.html
→3.0になってから単体で使えるようになった。
→フロントエンド


VmWare Server
→無償
→スナップショットができる。
→リモートからアクセス可能


VmWare Workstation
→有償
→現在のOSの状態をスナップショットとして保存できる。
→スナップショットの履歴を木構造で表示することができる。

.

2010年8月17日火曜日

Hyper-Vをざっくりと

Hyper-V Server
→WindowsServerの仮想化が目的それ以外のゲストOSはサポート外
→Linuxのサポートは弱い。


ホストOS側の物理HDDはゲストOSに割り当てた仮想HDDと仮想メモリに割り当てた分の容量が必要。
仮想メモリ分の容量は起動時に作成される。

1ゲストOSのメモリ割り当て量は 物理容量をコア数で割った数以下がよいらしい。

IPv4だけを使う場合はIPv6の設定を無効にしておくとパフォーマンスがよくなる。

ホストOS、ゲストOSの両方に更新プログラムを当てないとパフォーマンスが悪くなる。


Hyper-Vの分析ツール。
http://biz.mki.co.jp/product/maker/mki/vt_platform/vestat/index.html

Hyper-V Server 無償版
→スタンドアロンでの起動を目的としている。
→ライセンスは無料。

.

2010年8月5日木曜日

C++/CLI Dispose

C++/CLIでもDisposeパターン。
C++/CLIではデストラクタが呼ばれるとインスタンスが破棄される。(デストラクタを呼び出すのは deleteまたはnewしていないインスタンス。)
破棄されたインスタンスはGCの対象外になるためファイナライザも呼ばれることはない。

以下のようにデストラクタとファイナライザを定義してやればよい。

----間違っていたサンプルコード

public ref class DisposableImplClass
{
public:
    DisposableImplClass()
    {
        disposed = false;
    }

    virtual ~DisposableImplClass()
    {
        Dispose(true);
    }

    !DisposableImplClass()
    {
        Dispose(false);
    }

private:
    bool disposed;
    void Dispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }
}

----



コメントで指摘されている通り、サンプルプログラムが間違っていました。。。
指摘してくれた人には感謝です!


----修正したサンプルコード

public ref class DisposableImplClass
{
public:
    DisposableImplClass()
    {
        disposed = false;
    }

    virtual ~DisposableImplClass()
    {
        DoDispose(true);
    }

    !DisposableImplClass()
    {
        DoDispose(false);
    }

private:
    bool disposed;
    void DoDispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }
}


----
.

2010年6月30日水曜日

IDisposable実装のテンプレート

毎回調べてたので、テンプレートとして残しておく。
Disposeメソッドはusingでかこっても、非同期例外によってDisposeが呼び出されないことがあるので、IDisposableを実装する際には、アンマネージドオブジェクトを解放するためにファイナライザを実装しておく必要があります。

非同期例外恐ろしいですね。



public class DisposableImplClass : IDisposable
{
    private bool disposed;

    public DisposableImplClass()
    {
        disposed = false;
    }

    public void Dispose()
    {
        GC.SuppressFinalize(this);
        Dispose(true);
    }

    ~DisposableImplClass()
    {
        Dispose(false);
    }

    private void Dispose(bool disposing)
    {
        if (disposed)
        {
            return;
        }
        disposed = true;
        if (disposing)
        {
            // マネージリソースの解放処理
        }
        // アンマネージリソースの解放処理
    }
}


.

2010年6月20日日曜日

7つの習慣を読み始めました。

良書というのを教えて頂いたので、読み始めました。

真の成功とは。
「優れた人格を持つこと。」

その優れた人格を得る為の習慣が紹介されている書籍です。

優れた人格とは?
人間としての振る舞いや考え方の根本(正義・勇気・謙虚などの人の内面)が優れていること。
人間関係を良くするテクニックやその場を乗り切るための技術が
優れていることではない。

という前振りがあり、7つの習慣が紹介されていく。


2010年5月29日土曜日

プリミティブ型をラップしたクラスを作る。

最近実際に意識している実装方法です。


プリミティブ型をラップしたクラスを作る。
intとかstringという型は抽象的すぎるので、
これを使ってると毎回変数名で意味を表現しなければならない。

ラップクラスを作成するまえは、
変数名がむやみに長くなってしまったり、
短くして意味がわかりにくくなっていました。

string だと文字列の意味しかありませんが、
すごい単純な例ですが
以下のようにTODOという名前のクラスでラップする事により、
stringに意味がつきました。
また必要な関数群を追加していけることもメリットとなります。
後で型を変えたくなっても変更も用意に出来ます。

class Todo
{
public string _todo;
}

出来るだけプリミティブ型は使わない方が、
汎用的に作れると思います。

C++ には便利なtypedefがあり簡単に名前を付ける事が出来るので是非活用したいですね。

.

haskellを触ってみよーってことでMacにインストールしてみた。

ここのサイトを参考に。
http://www.haskell.org/haskellwiki/Mac_OS_X

Haskellのプラットフォームをダウンロード。
http://hackage.haskell.org/platform/mac.html
haskell-platform-2010.1.0.1-i386.dmgをインストール。

コレだけでghcは使えるようになるはず。

ghcだけだとターミナルで使い勝手が悪いので、
hugsもインストールしてみる。

http://www.imasy.or.jp/~miyamoto/mac/install_memo.html
DarwinPortsをインストールしてそこからhugsをインストールする。
DarwinPortsはUnixで動作するアプリを自動ダウンロードインストールしてくれるツール
CentOSで使ったyumと同じようなものなのかも。(まだよくわかってない)

デフォルトのままだと以下のパスにDarwinPortsがインストールされる。
/opt/local/bin
root権限でportsコマンドを実行してhugsをインストール
sudo ports install hugs98

これでhugs98も動いた!

明日あーそぼっと。

.

2010年5月23日日曜日

レガシーコード改善ガイド

『レガシーコードとは、単にテストのないコードである』
という素敵なサブタイトルが興味をそそられます。

レガシーコードにテストコードを追加していく
様々な手法が紹介されています。
主には、キレイに依存関係を排除していく方法が書かれています。
リファクタリングツールがない場合の細かいリファクタリングのステップ等も記載されているので、
大変参考になります。

依存関係の排除以外にも
テストがないコードを保守していく際に必要なテクニックが満載です。

様々な状況別に対応策が記載されているのも分かりやすくてよかった

時間がない。
依存関係が多過ぎてテストが書けない
そもそも、どうやってテストコードを書いていいのかわからない。
etc...

これを気にテストコードを書いていく癖を付けたいものです。

2010年5月22日土曜日

HskellのMaybeクラスをC#で作ってみた。その3


HaskellのMaybeクラスをC#で作ってみた。その2
で作成した
Maybeクラスの単体テストもNUnitを使って書いているので、
それも一緒に公開しておきます。



[TestFixture]
public class MaybeTest
{
[Test]
public void MaybeNothingTest()
{
Maybe<int> nothing = Maybe<int>.Nothing;
Assert.IsFalse(nothing.HasValue);
Assert.Throws<InvalidOperationException>(delegate { int i = nothing.Value; });
}

[Test]
public void MaybeFromTset()
{
DoMaybeFromTest((int)1);
DoMaybeFromTest(DateTime.Now);
DoMaybeFromTest(new InvalidOperationException());
DoMaybeFromTest(new Action<int>(DoMaybeFromTest));
}
[Test]
public void MaybeFromArgumentNullTset()
{
Assert.Throws<ArgumentNullException>(delegate { Maybe<InvalidOperationException>.Just(null); });
}

private static void DoMaybeFromTest<T>(T value)
{
Maybe<T> maybe = Maybe<T>.Just(value);
Assert.IsTrue(maybe.HasValue);
Assert.AreEqual(value, maybe.Value);
}
[Test]
public void GetValueTest()
{
Maybe<int> nothing = Maybe<int>.Nothing;
Assert.AreEqual(1, nothing.GetValue(1));

Maybe<int> maybe = Maybe<int>.Just(20);
Assert.AreEqual(20, maybe.GetValue(1));
}
[Test]
public void EqualsTest()
{
Assert.IsTrue(Maybe<int>.Nothing.Equals(Maybe<int>.Nothing));
Assert.IsTrue(Maybe<int>.Just(1).Equals(Maybe<int>.Just(1)));
Assert.IsTrue(Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10)).Equals(Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10))));

Assert.IsFalse(Maybe<int>.Nothing.Equals(null));
Assert.IsFalse(Maybe<int>.Nothing.Equals(Maybe<int>.Just(1)));
Assert.IsFalse(Maybe<int>.Just(19).Equals(Maybe<int>.Just(1)));
}

[Test]
public void OperatorEqualsTest()
{
Assert.IsTrue(Maybe<int>.Nothing == Maybe<int>.Nothing);
Assert.IsTrue(Maybe<int>.Just(1) == Maybe<int>.Just(1));
Assert.IsTrue(Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10)) == Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10)));

Assert.IsFalse(Maybe<int>.Nothing == null);
Assert.IsFalse(null == Maybe<int>.Nothing);
Assert.IsFalse(Maybe<int>.Nothing == Maybe<int>.Just(1));
Assert.IsFalse(Maybe<int>.Just(19) == Maybe<int>.Just(1));
}
[Test]
public void OperatorNotEqualsTest()
{
Assert.IsFalse(Maybe<int>.Nothing != Maybe<int>.Nothing);
Assert.IsFalse(Maybe<int>.Just(1) != Maybe<int>.Just(1));
Assert.IsFalse(Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10)) != Maybe<DateTime>.Just(new DateTime(2000, 10, 10, 10, 10, 10)));

Assert.IsTrue(Maybe<int>.Nothing != null);
Assert.IsTrue(null != Maybe<int>.Nothing);
Assert.IsTrue(Maybe<int>.Nothing != Maybe<int>.Just(1));
Assert.IsTrue(Maybe<int>.Just(19) != Maybe<int>.Just(1));
}

[Test]
public void CastTest()
{
Maybe<Encoding> maybe = Maybe<Encoding>.Just(Encoding.UTF8);
Assert.AreEqual(Encoding.UTF8, (Encoding)maybe);
}
}

HaskellのMaybeクラスをC#で作ってみた。その2


HaskellのMaybeクラスをC#で作ってみた
のMaybeクラスではdefault(T)が気持ち悪かったので、
ガサゴソと、クラスを分離してみた。



public interface IMaybe<T>
{
bool HasValue { get; }

T Value { get; }
}

public class Maybe<T> : IMaybe<T>
{
private readonly IMaybe<T> _maybeValue;

public Maybe(IMaybe<T> maybeValue)
{
_maybeValue = maybeValue;
}
public bool HasValue { get { return _maybeValue.HasValue; } }

public T Value { get { return _maybeValue.Value; } }

public T GetValue(T defaultValue)
{
if (HasValue)
{
return Value;
}
return defaultValue;
}

public static bool operator ==(Maybe<T> left, Maybe<T> right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (ReferenceEquals(left, null))
{
return false;
}
return left.Equals(right);
}
public static bool operator !=(Maybe<T> left, Maybe<T> right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj))
{
return true;
}

Maybe<T> maybe = obj as Maybe<T>;
if (ReferenceEquals(maybe, null))
{
return false;
}
if (HasValue != maybe.HasValue)
{
return false;
}
if (HasValue)
{
return Value.Equals(maybe.Value);
}
return true;
}
public override int GetHashCode()
{
if (HasValue)
{
return Value.GetHashCode() * 751;
}
return 0;
}
public static explicit operator T(Maybe<T> maybe)
{
return maybe.Value;
}
public static Maybe<T> Nothing = new Maybe<T>(new Nothing<T>());

public static Maybe<T> Just(T value)
{
return new Maybe<T>(new Something<T>(value));
}

}

internal class Nothing<T> : IMaybe<T>
{
public bool HasValue
{
get { return false; }
}

public T Value
{
get
{
throw new InvalidOperationException("No Value");
}
}
}
internal class Something<T> : IMaybe<T>
{
private readonly T _value;
public Something(T value)
{
if (ReferenceEquals(value, null))
{
throw new ArgumentNullException("value is null");
}
_value = value;

}
public bool HasValue
{
get { return true; }
}

public T Value
{
get
{
return _value;
}
}
}




NUnitのテストコード
も公開しています。
.

HaskellのMaybeクラスをC#で作ってみた。

Maybeクラスを作ってみました。
Nothingの場合にnullにしていたんですけど、コンパイルエラーに!
default(T)なんてのがあるんですね。

しかし、default(T)は必要あるのか?
Nothingの場合は値を持つ必要が無いので、Valueで例外、HasValueでfalseを返すだけのクラスがあっても良さそう。


HaskellのMaybeクラスをC#で作ってみた。その2

default(T)を消してクラスを分離したバージョンを作成しました。



public class Maybe<T>
{
private readonly T _value;
private readonly bool _hasValue;
public Maybe(T value)
: this(value, true)
{
if (ReferenceEquals(value, null))
{
throw new ArgumentNullException("value is null");
}
}
private Maybe(T value, bool hasValue)
{
_value = value;
_hasValue = hasValue;
}
public bool HasValue
{
get { return _hasValue; }
}

public T Value
{
get
{
if (_hasValue)
{
return _value;
}
throw new InvalidOperationException("No Value");
}
}

public T GetValue(T defaultValue)
{
if (_hasValue)
{
return _value;
}
return defaultValue;
}

public static bool operator ==(Maybe<T> left, Maybe<T> right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (ReferenceEquals(left, null))
{
return false;
}
return left.Equals(right);
}
public static bool operator !=(Maybe<T> left, Maybe<T> right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj))
{
return true;
}

Maybe<T> maybe = obj as Maybe<T>;
if (ReferenceEquals(maybe, null))
{
return false;
}
if (_hasValue != maybe.HasValue)
{
return false;
}
if (_hasValue)
{
return _value.Equals(maybe.Value);
}
return true;
}
public override int GetHashCode()
{
if (_hasValue)
{
return _value.GetHashCode() * 751;
}
return 0;
}
public static explicit operator T(Maybe<T> maybe)
{
return maybe.Value;
}
public static Maybe<T> Nothing = new Maybe<T>(default(T), false);

public static Maybe<T> Just(T value)
{
return new Maybe<T>(value);
}
}



NUnitのテストコード
も公開しています。
.

Dynamic Language Runtime

Microsoft DLRというライブラリ
http://dlr.codeplex.com/

動的言語をCLR上で動作させることが出来るライブラリです。

IronPythonで作成されたロジックを分岐させて作られたライブラリとのこと。

PythonやRuby等のスクリプト言語を
外部ファイルから受け取りアプリの動作を簡単に変えることが出来るので、
プラグインの作成なんかに使えるかもしれません。

動的言語を作成するための仕組みもライブラリ内に存在しているので、
数種類のライブラリを使って作成していたのがDLR一つだけで出来るのも良いところですね。

動的言語のサンプルは以下のサイトにありました。
http://blogs.msdn.com/shozoa/archive/2008/02/17/7741759.aspx
http://blogs.msdn.com/shozoa/archive/2009/01/29/tech-days-2009-dynamic-language-runtime-s-samples.aspx

.

ボーイスカウトの掟

自分が訪れた状態より、より良い状態にして帰ろう。
そういう目標があるみたいです。
(実際のボーイスカウトの掟とはまた違ってるかも)

それにならって、ソースコードも
自分が見た状態より、より良い状態にしてコミットしよう!

リファクタリング環境が良くなってきているので、
変数名や関数名・クラス名の名前を変更することは
低リスクで実行出来ます。

こういう小さい修正を日々行うことができれば、
綺麗なコードに近づいていくのではないかと思います。

少し探して見つけました。
ボーイスカウトの「3つのちかい」と「8つのおきて」
ちかい
・神と国とに誠を尽くし、おきてをまもります
・いつも他の人々を助けます
・体を強くし心をすこやかに、徳を養います

おきて
・スカウトは誠実である
・スカウトは友情にあつい
・スカウトは礼儀正しい
・スカウトは親切である
・スカウトは快活である
・スカウトは質素である
・スカウトは勇敢である
・スカウトは感謝の心を持つ

【参考文献】
http://bsm5.org/outline/oath.html

.

2010年4月3日土曜日

Windows環境にCassandra Thriftをインストールしてみた。

CassandraをC#で使って遊んでみよーってことでWindows環境にほりこんでみたので
その忘却ログ。

CassandraのインタフェースがThiftで記述されているので、
まずThriftのインストールを行う。
早速Thriftのダウンロードページへ!
http://incubator.apache.org/thrift/download/

あれ?
Windows用のバイナリがない!
ソースコードしかない!

ってことでCygwinでコンパイルすることに。
参考にしたサイトは
http://wiki.apache.org/thrift/ThriftInstallationWin32

Cygwinで以下のライブラリをインストールする必要があるみたいなので、

探してインストール(面倒な人は、CygwinのDevel以下をすべて入れちゃえばOKです。)
  • GNU build tools (autoconf 2.60, automake 1.10, libtool 1.5.24)
  • boost 1.33.1+
  • g++ 4.0+
  • bison 2.3-1
  • boost 1.33.1-4
  • boost-devel 1.33.1-4
  • flex 2.5.33-1
  • pkgconfig
  • libtool
これでcygwinの環境構築はOK。
続いてThriftのバイナリを作成へ。
Thriftのダウンロードサイト(http://incubator.apache.org/thrift/download/)から


ソースコードをダウンロード
Thiftを解凍したフォルダへ移動して。
以下のコマンドを順番に実行。

./bootstrap.sh

export CXXFLAGS="-D PTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE"

./configure

cd compiler/cpp

make

make install

はいおしまい。

続いてCassandraのインストール
ここから0.5.1をダウンロードしました。
http://cassandra.apache.org/

解凍してCassandraのinterfaceフォルダに"cassandra.thrift"ってファイルがあるので、
そこのフォルダまで移動してThiftを実行すればC#のコードが完成!

僕はここにCassandraを解凍(/usr/local/src/apache-cassandra-0.5.1)

cd /usr/local/src/apache-cassandra-0.5.1/interface
$ thrift --gen csharp cassandra.thrift

C#のコードはgen-csharpに出来上がります。
/usr/local/src/apache-cassandra-0.5.1/interface/gen-csharp

ふぅ満足♪
.

2010年2月11日木曜日

python class

クラスの定義は以下の用に記述
__init__がコンストラクタ
__del__がデストラクタ(実際はガベージコレクト時に動作するのでC#のファイナライザかな?)


class MyClass(SuperClass)
field
def __init__(self)
def __del__(self)
def Method(self)
...


pythonは定義の終わりがわかりにくいですね。
別ファイルに記述するか、コメントで区切るしかないのかな?

.

Google App Engineの開発環境構築

ようやくやりたいと思っていたGoogle App Engineの開発環境を整えた。
これを機にPythonを少し勉強するかな。

http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/
○pythonをインストールする(バージョンは2.5系である必要があります。)
私は以下から python-2.5.2.msi をダウンロードしてインストールしました。
http://www.python.jp/Zope/download/pythoncore

○Goole App EngineのSDKをインストール。
http://code.google.com/intl/ja/appengine/downloads.html

○Hello Worldを出力
以下の手順どおりにやればはい出来上がり~♪
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/helloworld.html

go lang の環境を整えたときにも感じたのですが、
Googleの環境構築手順はわかりやすいですね。
サクっと出来上がりました。

.

ラベル