Translate

2013年11月30日土曜日

Nunitで書くまでの流れ

1.Nunitを入手する
https://launchpad.net/nunitv2
現在は、2.6.3

Nunit-2.6.3.msi をダウンロード。
インストール実行

2.Nunitの設定を変更
Nunitを起動する。
メニューバー⇒Tools⇒Settings...
IDE SupportのVisual Studioをクリック
Enable Visual Studio Supportにチェックをつける(Expressでも)

3.クラスとテストを結びつける
テスト対象のクラスを作成

テストクラスを作成

[テストクラス側]
nunitを認知させる
⇒参照設定の .NET タブを選択 nunit.framework を追加

テスト対象を認知させる
⇒参照設定のプロジェクトからテスト対象のクラスを選択

[テスト対象クラス側]
テストクラスを認知させる
Properties⇒AssemblyInfo.cs
[assembly: InternalsVisibleTo("テストクラス名")]

4.テストを書く
テストクラスの前に[TestFixture]を書く。
using NUnit.Framework;
していないと破線でそんなの知らんとおこるので、[TestFixture]上でCtrl+. でuse NUnit.Frameworkを表示

[Test]
テストメソッドの前につける
[TestCase]
テストメソッドの前に引数の値をリスト化して並べる

メソッド
Assert.True(期待値 == 実際の値, [メッセージ]);
Assert.AreEqual(期待値, 実際の値);
Assert.IsNull(実際の値);
Assert.IsEmpty(実際の値)
Assert.IsInstanceOfType(期待値, 実際の値);
Assert.IsAssignableFrom(期待値, 実際の値);

http://www.nunit.org/index.php?p=classicModel&r=2.6.3

5.テストしてみる
・ソースをビルドする
・Nunitを立ち上げ、dllを読み込む
・Unitで保存をしておく(設定の保存)
・Runで実行

サイクルを回す
以上、度忘れした時ようのためのエッセンシャル版まとめ。

参考
http://qiita.com/rohinomiya/items/47f09523f1b9dfa015b1
http://codezine.jp/article/detail/6518

2013年10月13日日曜日

ruby学習めも

■出力
print, puts の違い putsは最後に¥nを書かなくても改行してくれる。
ただ、putsはコンマ区切りで書くとその都度改行する。

■変数の展開
ダブるクォート内で #{変数名} と書くと展開してくれる

■コメント
# 一行コメント

=begin
複数行にわたる
コメントアウト
=end


■if文

if 条件

elsif 条件

else

end

一行でもかける。
式 if 条件

if の反対としてunlessもある。

文字列.empty? 長さ0ならtrue じゃないければ false
(真偽値を返すメソッドは?を末尾につけるルールあり)

■真偽判定は、
偽:nil, false
真:上記以外

■CASE
case 変数
when 値[, 値]
when 値[, 値]
else
end

■for
for 変数 in 開始の値..終了の値
end

for 変数 in オブジェクト
end

■while(条件が真の間ループ)
while 条件

end

一行でも書ける。
式 while 条件
whileの反対としてuntilもある


■配列、ハッシュのイテレータ

配列.each do |変数|
end

ハッシュ.eadh do |変数(キー), 変数(値)|
end

■break, next, redo
break…ループを抜ける
next…次のループへ
redo…同じ条件でもう一度

■コマンドラインからの引数
ARGV配列にあるよ。

puts "第一引数:#{ARGV[0]}"
puts "第二引数:#{ARGV[1]}"
puts "第三引数:#{ARGV[2]}"


■変換
文字列→数字
変数.to_i

数字→文字列
変数.to_s


■メソッド
def メソッド名(引数)
end

・引数のデフォルト値は 引数 = 値とする
戻り値はreturn 値
省略可。省略時は、最後に得られた値が戻る

・キーワードによる引数の受け渡し(key, value)
defメソッド名(引数1:値, 引数2:値,…)
end

def area(x:0, y:0, z:0)
return (x*y + y*z + z*x) * 2
end

p area(x:2, y:3, z:4) #=> 52
p area(x:2, z:3) #=>12


・引数の数が不定の時 その1
def メソッド名(*変数名) #配列として受け取る
end

例)
def a(a, *b, c)
return [a, b, c]
end

p a(1, 2, 3, 4, 5) #=> [1, [2, 3, 4], 5]
p a(1, 2) #=> [1, [], 2]

・引数の数が不定の時 その2 キーワード引数(ruby 2.0以降)
def メソッド名(**変数名) #ハッシュとして受け取る
end

例)
def meth(x:0, y:0, z:0, **args)
return [x, y, z, args]
end

p meth(z:4, y:3, x:2) #=> [2, 3, 4, {}]
p meth(x:2, z:3, v:4, w:5) #=> [2, 0, 4, {:v=>4, :w=>5}]

・引数に渡した際配列を展開する
例)
def foo(a, b, c)
return a + b + c
end

args1 = [2, 3]
p foo(1, *args1) #=> 6 展開される!

■ライブラリを読み込む
require (相対パス)ファイル名(.rbは省略可)

■定数
変数名の先頭が大文字だと定数扱い

■変数の入れ替え
変数をまとめて入れる機能を利用すると
a, b = b, a と書くことで入れ替えができる
全般的にまとめて入れる機能は、なじみにくいから様子見としておこう。



■どのクラスのインスタンスか調べる
変数.instance_of?(クラス名)

■クラスの親子関係を調べる
変数.is_a?(クラス名)
str = "hogehoge"
p str.is_a?(String) #=> true
p str.is_a?(Object) #=> true


■変数
ローカル変数
→小文字or_で始まる
グローバル変数
→$で始まる
インスタンス変数
→@で始まる
クラス変数
→@@で始まる

■クラスの作り方
class クラス名 #大文字で始める
end

■コンストラクタ
initializeメソッド

■インスタンス変数
@で始まる名前をつけるとインスタンスごとの変数となる

■setter/getter
class クラス名

def インスタンス変数名
return @name
end

def インスタンス変数=(変数)
@name = 変数
end

■一番簡単なsetter/getterの場合
attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK
ここでは、@はつけない
この場合は、self.変数名 (@はつけない)でアクセスする

■クラスメソッド
class << クラス名
def メソッド名
end
end

or

class クラス名
class << self
def メソッド名
end
end
end

or

def クラス名.メソッド名
end

or

class クラス名
def self.メソッド名
end
end

■クラス内定数
クラス名::定数名 でアクセス可能

■クラス変数
@@変数名 で定義すると全てのインスタンスからアクセス可能となる

■アクセス制限
指定方法 その1:一つずつ直接指定
public :メソッド名 #デフォルトなので設定する必要はない
private: メソッド名 #インスタンス経由でのアクセスを禁じる時
protected: メソッド名 #同一クラスとそのサブクラスから呼び出し可能

public
def メソッド1
end

def メソッド2
end

private
def メソッド3
end

def メソッド4
end

■クラスまとめ
class クラス名(大文字で始める)
#クラス変数
@@変数名

#クラスメソッド
def クラス名.メソッド名
end

attr_reader :変数名 #読み取りのみ
attr_writer :変数名 #書き取りのみ
attr_accessor :変数名 #読み書きOK

#インスタンスメソッド
def メソッド名
end

#コンストラクタ
def initialize(引数)
@変数 = 引数 #インスタンス変数
end

end


■クラスの拡張
class String
def メソッド名
end
end

で拡張できる

■クラスのツリー図
BasicObject
Object
Array
String
Hash
Regexp
IO
File
Dir
Numeric
Integer
Fixnum
Bignum
Float
Complex
Rational
Exception
Time


■継承
class クラス名 < スーパークラス名
def メソッド
super(引数) #スーパークラスの同名メソッドを呼ぶ
end
end


■モジュール
module モジュール名
def メソッド名
end
module_function :メソッド名 #公開する モジュール名.メソッド名で呼べる?
end



include モジュール名で利用できるようになる


2013年8月17日土曜日

[perl]クラスメソッド

学習のため、某JavaのソースコードをPerlで表現してみる。


public class Counter {
    static int num = 0;
    static int getCounter(){
        return ++num;
    }                                                                              
}

実行してみる
public class SandBox extends Counter {
       public static void main(String[] args){
           System.out.println(Counter.getCounter());
           System.out.println(Counter.getCounter());
           System.out.println(Counter.getCounter());
           System.out.println("クラスフィールド:" + Counter.num);
       }
}

実行結果:
1
2
3
クラスフィールド:3


perlで表現してみます。
package Counter;
use strict;
use warnings;

our $num = 0;                                                                      

sub getCounter{
    return ++$num;
}

1;


use strict;                                                                        
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;
use Counter;

say Counter::getCounter();
say Counter::getCounter();
say Counter::getCounter();
say "クラス内変数:". $Counter::num;

実行結果:
1
2
3
クラス内変数:3

たいした違いはないですね。
クラス内の変数にアクセスするためにourで宣言しています。

[perl]複数のコンストラクタに対応するには?

学習のため、某JavaのソースコードをPerlで表現してみる。

Javaでは引数違い同名のメソッドを持つことができます。
便利ですね。

class Rectangle {
    int width;
    int height;
    Rectangle(){
        setSize(10, 20);
    }
    Rectangle(int w, int h){
        setSize(w, h);
    }    
    void setSize(int w, int h){
        width = w;
        height = h;
    }
    int getArea(){
        return width * height;
    }
}

引数無しのnewならデフォルト10, 20をセット
値があればそちらをセット同じことをPerlでやってみます。
処理をまねするならこうなるでしょうかねぇ?
package Rectangle;                                                                 
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

sub new{
    my $self  = bless{}, shift;

    #引数チェック
    if(@_==0){
        $self->setSize(10, 20);
    }elsif(@_==2){
        $self->setSize($_[0], $_[1]);
    }else{                                                                         
        die("コンストラクタは引数無し または、                                     
            2引数を指定してください(width, height)");
    }

    return $self;                                                                  
}

sub setSize{
    my $self = shift;
    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $self->{width}  = $_[0];
    $self->{height} = $_[1];
}

sub getArea{
    my $self = shift;
    return $self->{width} * $self->{height};
}

1;
引数を明示しない言語なので引数違いの同名メソッドは作れないので
引数の数で振り分けるしかないと思います。

実行してみます。
use strict;
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;                                                                     

my $r1 = Rectangle->new();
my $r2 = Rectangle->new(123, 5);

output($r1);
output($r2);

sub output{
    my $self = shift;
    say "幅 :". $self->{width};
    say "高さ:". $self->{height};
    say "面積:". $self->getArea();
}

実行結果:
幅 :10
高さ:20
面積:200
幅 :123
高さ:5
面積:615

[perl]コンストラクタで値の初期化

学習のため、某JavaのソースコードをPerlで表現してみる。

class Rectangle {
    int width;
    int height;
    Rectangle(){
        setSize(10, 20);
    }
    void setSize(int w, int h){
        width = w;
        height = h;
    }
    int getArea(){
        return width * height;
    }
}

引数無しでnewされた場合
setSizeメソッドを使って幅10, 高さ20を指定するわけですね。
では、やってみましょう。
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

sub new{
    my $class = shift;
    my $self  = bless {width=>0, height=>0}, $class;

    #引数無しでnewされたらデフォルト値を指定                                       
    if (@_==0){$self->setSize(10, 20)};                                            

    return $self;
}

sub setSize{
    my $self = shift;
    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $self->{width}  = $_[0];
    $self->{height} = $_[1];
}

sub getArea{
    my $self = shift;                                                              
    return $self->{width} * $self->{height};
}

1;

ポイントは第一引数にオブジェクトを渡すためには、blessした
オブジェクト経由でメソッドを呼ばないといけないというあたりですかね・・・
これで最初に書いたメソッドをうまく再利用できてますね。
では使ってみます。
use strict;
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;

my $r = Rectangle->new();
                                                                                   
say "幅 :". $r->{width};
say "高さ:". $r->{height};
say "面積:". $r->getArea();

出力結果:
幅 :10
高さ:20
面積:200


初期化の時は直接記載しようよ。
というのであれば、
class Rectangle {
    int width = 10;
    int height = 20;
    void setSize(int w, int h){
        width = w;
        height = h;
    }
    int getArea(){
        return width * height;
    }
}
こうなると思います。
では、Perlでは
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

sub new{
    return bless {width=>10, height=>20}, shift;
}                                                                                  

sub setSize{
    my $self = shift;
    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $self->{width}  = $_[0];
    $self->{height} = $_[1];
}

sub getArea{
    my $self = shift;
    return $self->{width} * $self->{height};
}

1;

Perlでクラスを書く

学習のため、某JavaのソースコードをPerlで表現してみる。

class Rectangle {
    int width;
    int height;
    void setSize(int w, int h){
        width = w;
        height = h;
    }
    int getArea(){
        return width * height;
    }
}

perlだとコンストラクタは必須なのでnewは書くとして
・値はsetSizeで指定する
・getAreaにて面積を求めあたいを返す
これを表現します。
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

sub new{
    return bless {width=>0, height=>0}, shift;
}
                                                                                   
sub setSize{
    my $self = shift;

    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $self->{width}  = $_[0];
    $self->{height} = $_[1];
}

sub getArea{
    my $self = shift;
    return $self->{width} * $self->{height};
}

1;
JavaやJavascriptと言った言語だと自動的にthisを参照すると自分自身のオブジェクトを参照できるけども
Perlだとshiftをすることで他の言語のthisの代わりのようなことができると。
つまり第一引数に自動的にオブジェクトがはいっているので取り出したら使えるよってことね。

ちなみに、blessのとこでJavaで言うとこのプロパティを用意しています。
使ってみます
use strict;
use warnings;
use utf8;  
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;

my $r = Rectangle->new();
$r->setSize(123, 45);

say "幅 :". $r->{width};
say "高さ:". $r->{height};
say "面積:". $r->getArea();

Perlのクラス作成 メモ

Perlのクラス作成について自分用のチートシート的にまとめておく

クラス作成で最小の状態は以下の通り
package クラス名;

sub new{
    return bless {}, shift;
}

1;




面積を求めるRectangleクラスを例に考える
コンストラクタでwidth と heightの値を設定し
getAreaで面積を求める

ファイル名:lib/Rectangle.pm
package Rectangle;
use strict;
use warnings;
use utf8;
binmode STDERR, ":utf8";

my ($width, $height);

sub new{
    return bless {}, shift;                                                        
}

sub setSize{
    my $self = shift;

    if(@_!=2){die("setSizeの引数を2つ指定してください(width, height)")}
    $width  = $_[0];
    $height = $_[1];
}

sub getArea{
    my $self = shift;
    return $width * $height;
}

1;

ファイル:Sample.pl
use strict;                                                                        
use warnings;
use utf8;
use feature 'say';
binmode STDOUT, ":utf8";

use lib qw(lib);
use Rectangle;

my $r = Rectangle->new();
$r->setSize(123, 45);
say $r->getArea();

2013年8月15日木曜日

Gitを一人で使うさいのメモ

■初期準備
git init



[WorkTree] → [Index] → [repository]

■Indexに追加
git add [file]指定したファイルをIndexに追加
git add .全てのファイルをIndexに追加する
git add -uCommit済みファイルのうち変更のあったものだけ追加
git add -pIndexへの追加を、変更箇所単位(ハンク)で追加
git add -Agit add . + git add -u



[WorkTree] ← [Index] ← [repository]
■Indexから削除
git reset HEAD [file]ステージへの登録を解除する


[WorkTree] → [Index] → [repository]
■コミット
git commit -m "内容"1行メッセージと共にコミットする



■バージョン管理下から除外する
git rm [file]バージョン管理下からはずし、ファイル自体も削除する
git rm --cached [file]バージョン管理下からはずす(ファイルは残す)



■状態の確認
git statusgitの状態を表示
git logコミットログを表示
git log -数字数字分コミットログを表示
git log -pコミットログにパッチ(差分情報)を追加して表示
git log --pretty=shortコミットログ(1行目の要約文のみ)を表示

2013年5月25日土曜日

クラス HelloWorld は public であり、ファイル HelloWorld.java

helloworld.java:1: クラス HelloWorld は public であり、ファイル HelloWorld.java
で宣言しなければなりません。
public class HelloWorld
       ^
エラー 1 個

クラス名とファイル名を揃えなさいって話ね。

Javaでコンパイルしたら文字化けしましたとさ@Mac

ターミナルがUTF-8なのに対し、コンパイル後のメッセージがShiftJIsなため
文字化けるというお話。

なので、全てUTF-8に統一してしまえばよいよね。
ということでメモ
## alias
alias java='java -Dfile.encoding=UTF-8'
alias javac='javac -J-Dfile.encoding=utf-8'


これで
javac ファイル名.java でコンパイル
java ファイル名 で実行。

2013年5月11日土曜日

configure make make install のしていること

どうもWindows OSどっぷりな状態でぼたんぽち一つでインストールされる環境になれてしまうと
Unix OS系のインストール作業になかなかなじめないってのが最初に感じるとこだったりするのでは
と思ってみたり。

なじめないのは、
やれ configure だの make だの make install だの ヤサイマシマシニンニクアブラカラメ
だの何してるんだかわからずに使っているからなじめないような気がしているのでインストール作業で何しているのかメモ。


1.ソースを入手
wgetコマンドで 目的のファイルをカレントでリレクトリにダウンロードします。
例)
wget http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.24.zip
wget http://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.24.tar.gz


2.解凍
圧縮されているだろうから解凍しましょ。
例)
unzip mysql-5.5.24
tar xvzf mysql-5.5.24.tar.gz

tarのコマンドに触れる前に…
tar は複数のファイルを1つにまとめるもの。
この時点で圧縮は行われないため、tar.gzのように
gzipやbzip2を併用して初めて圧縮が行われる。

ちなみに、一つにまとめることを書庫化というみたい。

ということでtarがある時点で一つのファイルにまとめられているので
そこから複数のファイルに取り出したい。
そこでxというオプションが必要になる。
x...書庫からファイルを取り出す。

ただ、tar.gzのように圧縮されているとそれらを使って戻さないといけないので
zというオプションが必要になる。
z...gzipを使って圧縮解凍を行う。

ちなみに、何を解凍したのか気になるなぁ〜
という場合vコマンドが必要になる。
v...処理の詳細をターミナルに表示する

f...ファイル名を指定する際に使用。
解凍するんだからファイル名指定するよね。

という感じ。


3.configure
インストールするOSの情報を調べ、インストールに必要な情報をMakefileとして作成する

4.make
configureで作成したMakefileをもとにソースコードをコンパイルする。
もちろんコンパイルしているだけでシステムのどっかに組み込む作業をしているわけでない。
解凍したファイルを消せばさようならです。

5.make install
makeしたファイルに問題がなければmake installをして既定のデリレクトリにコピーを行う。
ここで初めて所定の場所に組み込まれる。

2013年3月8日金曜日

[perl]定数

あちこちネットを眺めてみた
定数のモジュールといえば?

constant

ReadOnly

Attribute::Constant(or Data::Lock)

というような流れっぽい。
→http://d.hatena.ne.jp/fbis/20090612/1244806476

少なくとも2009年までだと。
もうちょっと調べるか。