Translate

2014年8月31日日曜日

プリプロセッサディレクティブ

#ifディレクティブに DEBUG をつけると、DEBUG用にビルドされた物を実行する時のみ実行される
using System.Windows.Forms;

namespace SampleCode {
    class Program {
        static void Main(string[] args) {

#if DEBUG
            MessageBox.Show("DEBUG");
#else
            MessageBox.Show("RELEASE");
#endif
            
        }
    }
}
DEBUGがあるならRELEASEもあるのかと思ったらそれはないのでelseで分岐する


同様のことは、System.Diagnostics.Conditional("DEBUG")でも実現でき
メソッド単位に使用する。この場合Release用にコンパイルされる側では
条件付きメソッドの呼び出しは削除されるそうな。
using System.Windows.Forms;

namespace ConsoleApp {
    class Program {
        static void Main(string[] args) {
            ShowMessage("DEBUGの時のみ実行");  
        }

        [System.Diagnostics.Conditional("DEBUG")]
        static void ShowMessage(string str) {
            MessageBox.Show(str);
        }
    }
}

github

□Windows
MinGWを使っているので GitBushを起動

$ssh-keygen -t rsa -C "github_from_win"

保存するディレクトリを聞かれます。
デフォルトのまんまならEnter
Enter file in which to save the key(/c/Users/UserName/.ssh/id_rsa):

パスフレーズを聞かれます。
ssh接続する時に聞かれるものです。
Enter passphrase (empty for no passphrase):
Enter save passphrase again:

これで、.sshにid_rsaとid_rsa.pub(公開鍵)が作成されるので
githubにアクセスして
Settings⇒SSH keys⇒Add SSH key
titleを入力し、先ほど生成されたid_rsa.pub(公開鍵)を貼付けます
で登録。

git clone git@github.com:[UserName]/[RepositoryName]
でクローンできます。

2014年6月14日土曜日

redmineをお試しでさわりたくてmac os xにテスト的にいれてみたというお話

サービスに登録して恒久的に動かすというわけじゃなくてちょっといろいろ試してみたくて入れてみた的なスタンスです。

前提、いろいろ入ってるよ。
なので足りないものだけしかいれてないよ。

■nginx
% brew install nginx
でするする入ったよ。

% nginx
で実行

http://localhost:8080
で確認。
うん動いたね。

他のコマンド
% nginx -s stop
% nginx -s reload

参考
% nginx -v
nginx version: nginx/1.4.2


以上


■mysql
入れてあるよ。

redmaine用のDB作っておくよ。
mysql -u username -p
mysql> create database redmine default character set utf8;
mysql> quit
はい。DBの準備完了


■redmine
サイトにいってダウンロード
http://www.redmine.org/projects/redmine/wiki/Download
今は2.5.1
好きなとこに解凍

□DB接続情報を設定
redmine/config/database.yml.exampleを複製して
redmine/config/database.ymlを作成
production:
adapter: mysql2
database: redmine
host: localhost
username: username
password: ********
encoding: utf8

databaseはさっきcreateしたdb名
dbに入るためのusernameとパスを指定

□config/configuration.yml の作成
ひとまず、redmineを動かすだけなので、exampleを複製するのみとしておく
redmine/config/configuration.yml.exampleを複製して
redmine/config/configuration.yml

何もノータッチ。

□unicornを使いたい
gem install unicorn

□Gemfileに追加
gem "unicorn"


□uniconrn.rbの作成
redmine/config/unicorn.rb

下記を参照させていただきました。
さくらVPSで nginx + MySQL + Unicorn + Redmine の運用
worker_processes 2
#working_directory /home/www/rails/charag

listen File.expand_path("tmp/unicorn.sock", ENV['RAILS_ROOT'])
pid File.expand_path("tmp/unicorn.pid", ENV['RAILS_ROOT'])

timeout 60

preload_app true # ダウンタイムをなくす

stdout_path File.expand_path("log/unicorn.stdout.log", ENV['RAILS_ROOT'])
stderr_path File.expand_path("log/unicorn.stderr.log", ENV['RAILS_ROOT'])

GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

old_pid = "#{server.config[:pid]}.oldbin"
if old_pid != server.pid
begin
sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
Process.kill(sig, File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
end
end

sleep 1
end

after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

□Gemパッケージのインストール
bundle install --without development test

□Redmineの初期設定とデータベースのテーブル作成
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

□まずは動くか確認
% bundle exec unicorn_rails -c config/unicorn.rb -E production -D -p 5001
問題なく動いた。

お試しと言ってもオプションに-Dつけてデーモンとして起動
とめたければ
ps -ef | grep unicorn | grep -v grep で親プロセスを調べて
kill -Quit プロセス番号

□nginxから呼ぶ
/usr/local/etc/nginx/ ここにいるそうな。

/usr/local/etc/nginx/nginx.conf を書き換えた
location / {
root html;
index index.html index.htm;
proxy_pass http://localhost:5001/; #追加
}

本当は、直接書き換えたりはせずに、変更して
チェックにかけてエラーを吐かないか確認して
それから上書きして

% nginx -s reload
という事情はすっとばして・・・

http://localhost:8080
でredmineが表示されることを確認。

なるほど。

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 モジュール名で利用できるようになる