09 Jun 2013, 05:22

CentOS上でSAMBAサーバを立ちあげてWindowsからアクセスするためのメモ

前回、VMware上のCentOSからCygwinのディレクトリをマウントすることを記事にしました。

Cygwin(Windows)をCentOSからmountする方法 | Futurismo

今回は、その逆。CentOSのディレクトリをWindowsにマウントします。CentOSにSambaを導入することで、実現しようと思います。

CentOSでのSambaの設定

CentOS側での設定を書きます。ここでは、home配下を共有することを目的とします。

# Sambaのインストール
yum -y install samba

# ユーザの追加。ここでは、tsu-neraユーザを
pdbedit -a tsu-nera

# パスワードを聞かれる
new password:
retype new password:
Unix username:        tsu-nera
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3434940687-3012143288-2006372190-1000
Primary Group SID:    S-1-5-21-3434940687-3012143288-2006372190-513
Full Name:
Home Directory:       \\centos\tsu-nera
HomeDir Drive:
Logon Script:
Profile Path:         \\centos\tsu-nera\profile
Domain:               CENTOS
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    日, 09  6月 2013 04:07:43 JST
Password can change:  日, 09  6月 2013 04:07:43 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF


 

#======================= Global Settings ==================
[global]
   # 文字コード設定 CentOS
   unix charset = UTF-8
  # 文字コード設定 Win
   dos charset = CP932
   display charset = UTF-8

# ----------------------- Network Related Options ----------
       # Widnows グループの設定 コンピュータのプロパティから調べる
        workgroup = WORKGROUP
 
        # Allow within local network
        hosts allow = 192.168.1. 127.

#============================ Share Definitions ==============
[homes]
        comment = Home Directories
        # ホームディレクトリをSAMBAで共有する
        path = %H
        browseable = no
        writable = yes

 

# Samba起動
bash-4.1# /etc/rc.d/init.d/smb start
SMB サービスを起動中:                                      [  OK  ]

# NMB起動
bash-4.1# /etc/rc.d/init.d/nmb start
NMB サービスを起動中:                                      [  OK  ]

# 起動時にサービスを起動するおまじない
chkconfig smb on 
chkconfig nmb on 

ファイアウォールの設定

SAMBAを利用するためには、tcp 139,445, udp 137,138のポートを開ける。 /etc/sysconfig/iptablesを編集する。

# for samba
 -A INPUT -p tcp --dport 139 -j ACCEPT
 -A INPUT -p udp --dport 137 -j ACCEPT
 -A INPUT -p udp --dport 138 -j ACCEPT
 -A INPUT -p tcp --dport 445 -j ACCEPT

 

service iptables restart で再起動する。

SELinuxの設定

ここでスゴイハマった。CentOSにはSELinuxというセキュリティ強化用ソフトがあって、この設定をいじらないと、SAMBAでhomeディレクトリ配下を共有できない。(smb.confの初めにほうにも書いてあった)以下のコマンドを実行

setsebool -P samba_enable_home_dirs on

このコマンド実行は時間がかかる。気長に待つこと。

Windowsでアクセスしてみる

(Windows) + r でファイル名を指定して実行を起動。

\(サーバのIP)(ユーザ名)

を入力する。パスワードが求められたら、パスワードを入力する。アクセス出来れば成功。

接続が確認できたら、ネットワークドライブの割り当てをしとく。

参考

08 Jun 2013, 15:22

CentOSに rbenv 経路で Ruby 2.0.0-p195を入れようとしたら、エラー

CentOSに rbenv 経路で Ruby 2.0.0-p195を入れようとしたら、エラーした。

導入した手順は過去記事参照。

Cygwin上のRuby1.9をrbenvで最新版Ruby2.0にバージョンアップしたの巻 | Futurismo

installing default gems:      /home/tsu-nera/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20130517183130.16922
Results logged to /tmp/ruby-build.20130517183130.16922.log

Last 10 log lines:
installing default gems:      /home/tsu-nera/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.2.0
                              io-console 0.4.2
                              json 1.7.7
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?

openssl がないぞと言われるが、インストールはされている。

OpenSSL 1.0.0-fips 29 Mar 2010

調べてみると、libssl-devなるものが必要なようだ。

Installing Ruby 2.0.0-p0 using Rbenv on Ubuntu 12.04.2 LTS – Ruby Forum

CentOSでは、openssl-develに当たるものがそれっぽいので、インストール。

sudo yum -y install openssl-devel

これでうまく行った(・∀・)

08 Jun 2013, 11:16

Cygwin(Windows)をCentOSからmountする方法

はじめに

Cygwinを今までつかっていたけれども、VMware上のCentOSにtelnetしたほうがよいのではと最近考え始めた。

その理由は、Cygwinをつかっていると、

  • カスタマイズしすぎたzshやemacsの起動が遅い
  • screenのデタッチ後に作業を保存されない

vmware playerならば、作業をそのまま保存してサスペンドするのでこの課題を解決できる。

さて、CygwinからVM上のCentOSにお引越ししようとおもったけれども、またCygwinに戻ってくるかもしれないと思った。なので、CentOSからCygwinのフォルダをマウントしてしまえば良いのだということに気づいた。

というわけで、CentOSからmountコマンドでCygwinをマウントする。

CentOSでmountを使うための設定

Windowsの共有フォルダはSMBプロトコルによって除くことができる。CentOSからSambaを利用するためには、mount.cifsというコマンドを利用するらしい。というわけで、インストールする。

yum -y install samba-client

Windowsでmountされる設定(フォルダの共有設定)

次に、Windows側でCygwinの自分のフォルダを共有ファイルに設定する。

C:\cygwin\home(ユーザ)

のフォルダを右クリックして、

  • プロパティ -> 共有 -> 共有 -> 共有

を選択。これで共有が開始される。次に、

  • 詳細な共有 -> アクセス許可

を選択して、共有を許すユーザを追加する。ログインしているユーザを追加すればよい。

次に追加したユーザにフルコントロール権限を与える。これで読み書きできる。

skitch

CentOSからmountコマンドを実行する

マウントするためには、rootユーザである必要がある。

# mount するディレクトリ作成
mkdir -p /mnt/cygwin

# mount する。
mount -t cifs -o user=TSUNEMICHI,password=********* //192.168.1.101/TSUNEMICHI /mnt/cygwin

mount -t cifsで、内部的に mount.cifsコマンドに置き換えられる。

-oがオプション

  • usr ・・・Windowsのユーザ名
  • password Windowsのパスワード
  • //(WindowsのサーバIP(ipconfigで調べる)/共有フォルダ名
  • /mnt/cygwin ・・・ CentOS側のマウントディレクトリ

アンマウントするには、umount /mnt/cygwinでよい。

終わりに

本当は、別の目的で調べていた。

Jenkinsからビルドサーバにビルドを依頼しようとおもった時に、sshを利用するのではなくて、ビルドサーバのディレクトリをCIサーバにマウントしてしまえばいいんじゃねと思った。

しかし、この方法は一人で使うにはいいけれども、ユーザ管理や運用を考えた時にはJenkinsユーザにCIサーバのディレクトリ構造まで意識させる必要がある気がしたので、やめた。

参考

02 Jun 2013, 23:35

Cygwin上のRuby1.9をrbenvで最新版Ruby2.0にバージョンアップしたの巻

はじめに

タイトル通りです。Rubyをrbenvで最新版にバージョンアップする方法を調べたのでまとめます。

Ruby2.0は、1.9系に比べてrequireする速度が2.5倍!ときいたので、是非移行したくなりました!(・∀・)

[toc]

rbenvのインストール

rbenvとは

rbenvとは、Rubyの版数を管理するためのツール。これを使ってRubyのバージョンアップをします。Rubyの版数管理だと、rvmもあるけれども、rbenvは後発のツールで、Rubyのみに特化した、シンプルなツールらしい。

sstephenson/rbenv ・ GitHub

rbenvのインストール

rbenvはgithubで公開されているツールなので、gitを使って取得します。

# ホームディレクトリに移動
cd 
# githubから rbenv取得。~/.rvenvに置きます。
git clone git://github.com/sstephenson/rbenv.git .rbenv

rbenvの設定

rbenvにパスを通すために、ログインシェルにパスを追記します。自分の場合は、.zshrcに以下を追記した。

# .rvenvディレクトリがあるときだけ設定を追加
if [ -d ${HOME}/.rbenv  ] ; then
    PATH=${HOME}/.rbenv/bin:${PATH}
    export PATH
    eval "$(rbenv init -)"
fi

source .zshrcで読み込み。

ちなみに、この設定をいれたら、.zshrcの読み込みが遅くなった気がするので、普段はこの記述はコメントアウトしておくことにしました。

rbenv-buildとrvenv-gemsetのインストール

rbenvだけだと、Rubyをビルドすることができないため、rbenv-buildもインストールします。

mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
# rbenv-build
git clone git://github.com/sstephenson/ruby-build.git

rbenvで最新版Ruby2.0をインストールしてみる

まずは、利用できるバージョンを確認する。

% ~/.rbenv/plugins/ruby-build/bin/ruby-build --definitions
2.0.0-dev
2.0.0-p0
2.0.0-p195

最新安定版である Ruby 2.0.0-p195を入れます。Cygwinでコンパイルをすると、想像を絶するほどの時間がかかった。-vをつけると、コンパイルの様子が出力される。

% rbenv install 2.0.0-p195 -v

と、ここでエラーした。。。。(´・ω・`)

compiling process.c
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:293:72: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:293:72: warning: its scope is only this definition or declaration, which is probably not what you want
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:412:1: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:413:79: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:414:32: warning: 'struct timeval' declared inside parameter list
process.c: In function 'rb_f_sleep':
process.c:4105:2: error: type of formal parameter 1 is incomplete
Makefile:325: recipe for target `process.o' failed
make: *** [process.o] Error 1

回避方法を参考して、ソースをダウンロードしたところで一旦 Ctrl+Zで止めて、/tmp配下にあるrubyソースの中の、include/ruby/intern.hに,「#include 」を追記する。Windows 7,8での不具合っぽい。

Rubyのスナップショットをビルド―2.1.0dev & 2.0.0対応― – わさっき

気を取り直して、再度コンパイルをかけると、opensslのなにかでハング!

止まった。。。(´・ω・`)。。。困った。。。(´・ω・`)

make[1]: ディレクトリ `/tmp/ruby-build.20130602153618.8580/ruby-2.0.0-p195' から出ます
configuring io/nonblock
configuring io/wait
configuring json
configuring json/generator
configuring json/parser
configuring mathn/complex
configuring mathn/rational
configuring nkf
configuring objspace
configuring openssl

これも、ググったら回避方法が載っていた。./cofigureにオプションを設定すればよいようだ。

CONFIGURE_OPTS=-"-with-opt-dir=/usr/local" rbenv install 2.0.0-p195 -v

これでOK.こんなに苦戦するとは。。。最後に、おまじないを叩いて終了。

% rbenv rehash

2.0.0に切り替える。

# インストールされているRubyのバージョンを確認
% rbenv versions
* system
  2.0.0-p195 (set by /home/TSUNEMICHI/.rbenv/version)
# 2.0をいつものバージョンにする
% rbenv global 2.0.0-p195

 

おわりに

rbenvは、いろんなRuby版数を簡単に切り替える機能もあります。なので、試しにRubyを最新版にあげてみて、動かなかったら古い版数に戻したり、特定のディレクトリ配下だけを古い版数で動かしたり、なんていう設定も可能です。

体感的には、2.0にしても速度が向上したようには感じされなかった。(むしろ・・・おそorz)CygwinでRubyが異常に遅いことは有名らしい。Linuxではそんなことはないらしい。(3倍速?)Cygwin上にRubyを動作させることがはかないあやまちのような気がした。

環境

  • Cygwin 1.7
  • Ruby 1.9.3 -> 2.01

参考記事

01 Jun 2013, 13:55

C言語のビルドでほのぼのrakeでmakeするよ

はじめに

C言語/C++でコンパイルするときは、makeするのが当たり前だと思っていた昨今、rakeなるビルドツールがあるとのことで、調査してみた。

まずは、世の中の人気度。。。。makefileの5%にも満たないシェア(2013年現在)

環境

  • Cygwin
  • Ruby 1.9.3
  • Rake version 10.0.4

目次

[toc]

rakeとmakeの比較とメリット

rakeとは、makefileをrubyの文法で記述するためのツール。もう少し正当にいうと、繰り返し使うようなスクリプトを「タスク」にまとめて、必要に応じて実行できるツール。

makeとrakeを比較すると、

  • makeはmakefileを作ってmakeする。
  • rakeはrakefileを作ってrakeする。

なんだか偽物のミッキーマウスみたい(-_-;)しかし、makeに対するrakeのメリットは以下。

  • 記述にRubyが使える

    汎用的なRubyの文法をそのまま使ってビルド手順がかける。なのでmakeのような独特な言語を覚えて(しかも他では使えない)使う必要はない。

  • 美しく記述できる

    Ruby自体が見やすい記法を心がけて開発されているので、記述がわかりやすい。

Let’s インストール!━⊂( ・∀・)彡

> gem install rake

はじめてのrake

まずは、hogehoge.c hogehoge.h uhauha.c uhauha.h をgccでコンパイルして、hogehoge.exeを作成して実行する、というものをやってみる。

ディレクトリ構成

% tree

.

├── include

│ツꀀツꀀ ├── hogehoge.h

│ツꀀツꀀ └── uhauha.h

└── src

├── hogehoge.c

└── uhauha.c

コマンドライン

% gcc -Iinclude src/uhauha.c src/hogehoge.c -o hogehoge.exe && ./hogehoge.exe

makefile

C_COMPILER = gcc
TARGET=hogehoge.exe

#Source FIles
SRCS  =src/hogehoge.c
SRCS +=src/uhauha.c

#Include Files
INC_DIR =-Iinclude

all: target

target:
        $(C_COMPILER) $(INC_DIR) $(SRCS) -o $(TARGET)
        ./$(TARGET)

clean:
        rm $(TARGET)

rakefile

C_COMPILER = "gcc"
TARGET="hogehoge.exe"
INC_DIR ="include"

task :all => ["clean", "run"]
task :default => "run"

task :run => "hogehoge" do
  puts "---- run ----"
  sh "./#{TARGET}"
end

task :clean do
  puts "---- clean ----"
  sh "rm src/*.o *.exe"
end

file "hogehoge" => ["src/hogehoge.o", "src/uhauha.o"] do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

rule '.o' => '.c' do |t|
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

rakefileの解説

rakefileについて、順に解説。

ちなみに、一番網羅的でわかりやすいのは、Ruby公式リファレンス。

http://doc.ruby-lang.org/ja/1.9.3/library/rake.html

Rake Tasks

rakefileはタスクからできている。タスクを順次、実行するための手順を書くのがrakefile。ということで、タスクの概念はrakeには必須。

  • rakeではタスクを見つけると、そのタスクを実行させるために処理を芋づる式に探して実行していく。
  • タスクの定義方法は、 「task :(タスク名) 」。
  • タスクに依存関係を記述する場合は、「task :(タスク名) => “(依存するタスク)”」。依存関係は配列で渡すこともできる。
  • タスクに実施させる処理(action)は、ブロック(do …end)で与える。
task :all => ["clean", "run"]
task :default => "run"

task :run => "hogehoge" do
  puts "---- run ----"
  sh "./#{TARGET}"
end

task :clean do
  puts "---- clean ----"
  sh "rm src/*.o *.exe"
end

File Tasks

ファイル作成のためのタスクかファイルタスク。定義の仕方はタスクと同じ。

rakeタスクは必ず実行されるが、ファイルタスクはタイムスタンプをチェックする。ファイルに変更があった場合のみ実行される。これが、makeと同じところ。

file "hogehoge" => ["src/hogehoge.o", "src/uhauha.o"] do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end
  • t.nameは、タスク名(hoehoge)
  • t.prerequisitesは、依存先タスク名の配列 [“src/hogehoge.o”, “src/uhauha.o”]

をそれぞれ指す。詳しくは以下のURL。

class Rake::Task

rule

異なるファイルに対して、同一の処理を実行するためには、ruleを定義する。ruleを満たす場合に実行される処理を書く。

rule '.o' => '.c' do |t|
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

t.sourceは、依存するファイルパス(src/……c)

Rakeのもう一歩進んだ使い方

コメント

タスクにコメントを記述するには、desc “hogehoge”と書きます。

desc "Clean and Run"
task :all => ["clean", "run"]

desc "Run build"
task :default => "run"

記述は、 rake -Tで見れます。

[tsu-nera]% rake -T
rake all      # Clean and Run
rake clean    # Remove old files
rake default  # Run build
rake run      # Build Main

clean

.oや.exeは普通、rmコマンドで削除するが、rakeにはこれを補助する機能がある。

使い方は、’rake/clean’ を requireで取り込んで、CLEAN、CLOBBERに削除したいファイルを登録する。すると、rake clean/rake clobberタスクが実行できるようになる。

rake clean    # Remove any temporary products.
rake clobber  # Remove any generated file.

cleanコマンドはCLEANに登録されたファイルを削除。clobberはCLEANとCLOBBERに登録されたファイルを削除する。以下の3行を追加。

require 'rake/clean'
CLEAN.include("src/*.o")
CLOBBER.include("*.exe")

実行結果

[tsu-nera]% rake clean
rm -r src/hogehoge.o
rm -r src/uhauha.o
[tsu-nera]% rake clobber
rm -r hogehoge.exe

library rake/clean

ファイルリスト

ディレクトリ配下のファイルに対してまとめて同じ処理を実行するためには、ファイルリストを使うと便利。

こんな感じで宣言する。これは、src配下にあるすべてのソースをSRCSというファイルリストに入れている。考え方はArrayと同じ。

SRCS = FileList[“src/*.c”]

リストの拡張子を変更するために、extメゾッドが用意されている。これで、.cファイルが.oファイルに置き換えられる。

OBJS = SRCS.ext(‘o’)

ファイルリストにファイルを追加するためには、includeメゾッド、除外するためにはexcluleメゾッドを利用する。はじめに、srcs = FileList[“**/*.c”]で全てのファイルをリストに加えてから、srcs.exclude(“src/hogehoge.c”)と書いて除外したりできる。

SRCS = FileList["src/*.c"]
OBJS = SRCS.ext('o')

file "hogehoge" => OBJS do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

class Rake::FileList

まとめ

今までのをまとめると、こうなった。

C_COMPILER = "gcc"
TARGET = "hogehoge.exe"
INC_DIR ="include"

require 'rake/clean'
CLEAN.include(["src/*.o", "*.exe"])
#CLOBBER.include("*.exe")

desc "Clean and Run"
task :all => ["clean", "run"]

desc "Run build"
task :default => "run"

desc "Build Main"
task :run => "hogehoge" do
  puts "---- run  ----"
  sh "./#{TARGET}"
end

SRCS = FileList["src/*.c"]
OBJS = SRCS.ext('o')

file "hogehoge" => OBJS do |t|
  puts "---- link ----"
  sh "#{C_COMPILER} -o #{t.name} #{t.prerequisites.join(' ')}"
end

rule '.o' => '.c' do |t|
  puts "---- compile ----"
  sh "#{C_COMPILER} -I#{INC_DIR} -c #{t.source} -o #{t.name}"
end

依存関係を美しく記述デキる点がとても気に入った。また、今まさにRubyを勉強中なので、makefileよりもモチベーションが上がる。ということで、もう少しいろいろ調べてみます。

参考

この本には4ページほどしか載ってなくてあまり詳しくはない。この本には4ページほどしか載ってなくてあまり詳しくはない。

31 May 2013, 23:57

kdiff3とP4Merge GUI 3ウェイマージツールの比較とEclipseでの設定方法

はじめに

前回の記事で、コマンドラインから3ウェイマージをするためのコマンド diff3を調べました。

GNU Diffutilsを使い倒す!diff3を使って他人の修正ブランチを自分のブランチに3ウェイマージする | Futurismo

今回は、GUIから3ウェイマージをするためのツールを調べてみます。2つのツールを試しました。

  • kdiff3
  • P4Merge

いろんなツールがあるっぽい。

version control – What’s the best three-way merge tool? – Stack Overflow

環境

  • Windows 7 x64
  • Eclipse 4.2 Juno

ダウンロード&インストール

kdiff3のダウンロードとインストール

LinuxライクなUIのkdiff3を試します。

KDiff3 – Homepage

以下のリンクからダウンロード。マルチプラットフォームでWindows,Mac,Linuxといろんなインストーラがおいてある。

P4Mergeのダウンロードとインストール

P4Mergeは版数管理システム Perforce(パワーフォース)のマージツールです。Perforce自体は有料だけれども、そのマージツールは無料なので、嬉しい。

Visual Merge and Diff Tools | Perforce

 

 

ダウンロードは以下から。

  • Perforce Downloads | Perforce
  • P4Merge: Visual Merge Toolの + をクリック
  • OSと32/64bitを選択して、ダウンロードを選択。
  • (とりあえず)Skip Registrationaを選択。

インストール時にはいろいろと他のツールのインストールも求められますが、まずはP4Mergeだけを入れます。

skitch.png

 

差分比較

起動して2つのファイルを指定すると差分比較できます。

kdiff3

skitch.jpg

P4merge

skitch.jpg

 

マージ

両者とも、3ウェイマージをサポートしています。3ウェイマージがあれば、衝突(Conflict)を自動解決できます。つまりは、2ウェイマージでは手動マージしかできないものが、自動マージできるということ。

マージ (バージョン管理システム) – Wikipedia

3つのファイルを指定します。

kdiff3

skitch.png

ツールバーから マージ -> 現在のファイルをマージを選択してマージします。

P4Merge

skitch.jpg

 

kdiff3とP4Mergeの比較

kdiff3とP4Mergeでは、マージ結果が異なりました。

  • P4Mergeは自分の修正と相手の修正の両方を取り込んでマージ
  • kdiff3は相手の修正を優先してマージ

個人的には、P4Mergeの機能を求めているので、P4Mergeのほうがよいかなという印象。P4Mergeはとてもカラフル。kdiff3は古くさいUI。見た目的には、圧倒的にP4Mergeに軍配が上がる。

ただ、P4Megeはフォルダ指定の比較ができないが、kdiff3はできる。また、競合時の解決では、kdiff3はキーボードショートカットで選択できるが、P4Mergeでは選択できない。つまり操作性や機能面ではkdiff3のほうが優る。

というわけで、一長一短でどちらがいいとはいえないようだ。

Eclipseの外部ツールとして利用する

Eclipseから比較ツールを利用したいことがたくさんある。External diff Tool Pluginを入れる。導入方法は過去記事を。

Eclipseの比較エディタでWinMergeを使うためのメモ | Futurismo

Eclipseを開き、ツールバーの

  • ウィンドウ -> 設定
  • 一般 -> 比較/外部ツール

を選択。外部diff実行ツールでkdiff3または、P4Mergeを選択。

コマンドライン引数に以下を入力。

%first %first %second
#それぞれ意味は、(ベース) (自分のファイル) (相手のファイル)
skitch.png

 

あとは、Eclipseで2つのファイルを選択して、右クリックから 比較 -> 相互(外部ツール)を選択すればよい。

参考

27 May 2013, 23:12

GNU Diffutilsを使い倒す!diff3を使って他人の修正ブランチを自分のブランチに3ウェイマージする

はじめに

会社で使用している版数管理システムではブランチ間のマージができない。。。他人の修正を自分のブランチに取り込めないぽい。。ヽ( ゚д゚)ノ

ブランチ間でマージをするためには、両者のファイルを比較して、手動でマージシなければいけいない。そんなバカな、なにか方法があるのだろうと思い、調べてみた。

やりたいこと

  • ブランチ間の自動マージ。
  • コマンドライン上からサクッとできる。
  • ただし、競合があるときや慎重にやりたいときは、手動マージ。

3 way mergeアルゴリズム

調べてみると、svnやcvsもできないらしい。git やMercurialだとできる。

その違いは何かというと、マージのためのアルゴリズムが違うのだった。

マージ (バージョン管理システム) – Wikipedia

  • svn、cvs ・・・ 2 way merge(2ウェイマージ)。2つのファイルの差分を比較してマージ。競合の解決は手動。
  • git、mercural・・・3 way merge(3ウェイマージ)。2つのファイルの共通の祖先との差分を比較してマージ。競合の解決は自動。

競合を自動マージするためには、3-way mergeを使う必要がある。

GNU Diffutilsを使い倒す!

3 way merge をサクッとこなすコマンドを探しいてたら、diff3というものを発見!これは、GNU Project のDiffutilsに含まれるコマンドの一つらしい。ということで、このDiffutilsを調べた。

Diffutils – GNU Project – Free Software Foundation

diffutils とは、cmp, diff, diff3 そして sdiff のプログラムを含むパッケージ。これらのツール群を駆使して、差分比較やマージをコマンドラインからすることができる。

実験

以下のようなファイルをもとに、ツールを検証してみる。

比較対象

# test1 ファイル
a
a
a
a
a

# test2 ファイル
a
a
b
a
a

diff

まずはdiffから。これはさくっと2つのファイルの差分をみるためにつかう。

[tsu-nera]% diff test1 test2
3c3
< a
---
> b

Man page of DIFF

sdiff

対話的にマージするためのツール。まずは、なにも指定しないと、両者を並べてdiffしてくれる。見やすい。

[tsu-nera]% sdiff test1 test2
a                                                               a
a                                                               a
a                                                             | b
a                                                               a
a                                                               a

差分だけをみるには、’-s’をつける。

[tsu-nera]% sdiff -s test1 test2
a                                                             | b

マージするには、-o “出力ファイル” をオプションでつける。マージする部分で、%のプロンプトがでるので、一つづつどうマージするか答える。手動マージで自動マージはしてくれない。

ed:     両方の版にヘッダーで飾って、利用し、編集。
eb:     両側の版を使用して編集。
el:     左側の版を使用して編集。
er:     右側の版を使用して編集。
e:      新版を編集。
l:      左側の版を使用。
r:      右側の版を使用。
s:      共通行を寡黙に含む。
v:      共通行を饒舌に含む。
q:      終了。

こんな感じでマージ。

[tsu-nera]% sdiff -o output test1 test2
a                                                               a
a                                                               a
a                                                             | b
%r
a                                                               a
a                                                               a

Man page of SDIFF

diff3

3 つのファイル間にある違いを探す 。つまり、

3 way mergeができる!(^_^)v

比較のためのアルゴリズムがdiffと異なるのだ。。基本は以下。

%  diff3 MINE OLDER YOURS

  • MINE ・・・自分のファイル
  • OLDER ・・・ 2つのファイルの共通の先祖
  • YOURS ・・・他人のファイル

共通の祖先を指定することがキモ。これで他人の修正を自分のファイルに取り込むことができる。

OLDER — –MINE

            |

             —YOURES

まずは実行。暗号めいた出力がでる。

[tsu-nera]% diff3 test1 test1 test2
====3
1:3c
2:3c
  a
3:3c
  b

====3で3つめのファイルに差分があることを示す。

マージするには、-mオプションをつける。すると標準出力にマージ結果が出力されるので、リダイレクトでファイルに書き出せばよい。

[tsu-nera]% diff3 -m test1 test1 test2 > output
[tsu-nera]% less output
a
a
b
a
a

Man page of DIFF3

まとめ

  • 差分を確認したいときは、sdiff -s で。
  • 自動マージするときは、diff3 -m で。
  • 手動マージするときは、sdiff -o で。

なんとか頑張れそう。

26 May 2013, 06:38

Cygwinにtreeコマンドをいれるためのメモ

Cygwinにはtreeコマンドがないようです。

いつものことながら手のかかる子( 一一)

ということで、ソースコードからインストールします。

treeソースコードの入手

curl -LO http://mama.indstate.edu/users/ice/tree/src/tree-1.6.0.tgz
tar xzfv tree-1.6.0.tgz
cd tree-1.6.0.tgz

 

treeコンパイル

続いてコンパイルですが、Cygwinの場合、makefileの修正が必要。Cygwinはコメントを外してくださいという箇所がMakefileのなかにあるので、コメントアウトを消します。

# Uncomment for Cygwin:
CFLAGS=-O2 -Wall -fomit-frame-pointer -DCYGWIN
LDFLAGS=-s
TREE_DEST=tree.exe
OBJS+=strverscmp.o

 

あとは、コンパイルしてインストールするだけ。デフォルトでは、/usr/bin配下にインストールされます。

% make && make install
% tree
.
├── CHANGES
├── color.c
├── color.o
├── doc
│ツꀀツꀀ ├── tree.1
│ツꀀツꀀ ├── tree.1.fr
│ツꀀツꀀ └── xml.dtd
├── hash.c
├── hash.o
├── html.c
├── html.o
├── INSTALL
├── LICENSE
├── Makefile
├── Makefile~
├── README
├── strverscmp.c
├── strverscmp.o
├── TODO
├── tree.c
├── tree.exe
├── tree.h
├── tree.o
├── unix.c
├── unix.o
├── xml.c
└── xml.o

1 directory, 26 files

26 May 2013, 04:13

Unityのテストフィクスチャフレームワークの使い方を調べてみた

以前、Unityの使い方について記事にしました。そのときは、スクリプトを使っていろいろとテストを書く方法を試したけれども、Unityはスクリプトを使わずにテストフィクスチャを利用する方法もあるみたい。

UnityとCMockの使い方が分かる本『Embedded Testing with Unity and CMock』を読んだ | Futurismo

今日の参考文献は、これです。

テストフィクスチャを使う

Unityには、テストフィクスチャを利用するためのフレームワークが付随している。

/unity/extras/fixture

にあります。これを利用する。このフレームワークはunity_framework.hをunityといっしょに使うことで、テストグループをまとめて実行できたりする。とりあえず、自分の環境で動作するかどうかまずはチェック。

% mkdir build
% rake

20 Tests 0 Failures 0 Ignored
OK

 

必要なもの

必要な物は2つ。

  • Unity本体
    • unity/src
  • Unitry Fixuture
    • unity/extras/fixture/src

これらは、Makefileでパスを通して使うので、Unityを適当な場所に配置します。ここでは、$HOME/tools/unityに配置した。

ソースコードとテストコード

今回のソースコードとテストコードはこんな感じで作成した。

ソースコード

// src/hogehoge.c
#include "hogehoge.h"
int hogehoge(void)
{
  return 1;
}

// src/hogehoge.h
#ifndef _HOGEHOGE_H
#define _HOGEHOGE_H

int hogehoge(void);

#endif // _HOGEHOGE_H

テストコード

//test/Testhogehoge.c
#include "unity_fixture.h"
#include "hogehoge.h"

TEST_GROUP(hogehoge);

TEST_SETUP(hogehoge)
{
}

TEST_TEAR_DOWN(hogehoge)
{
}

TEST(hogehoge,first)
{
  TEST_ASSERT_EQUAL(1,hogehoge() );
}

TEST(hogehoge,second)
{
  TEST_ASSERT_EQUAL( 2 , (hogehoge() + 1) );
}

TEST_GROUP_RUNNER(hogehoge)
{
  RUN_TEST_CASE(hogehoge, first);
  RUN_TEST_CASE(hogehoge, second);
}

簡単な解説

  • TEST_GROUP

テストグループの宣言。ここではhogehogeという名前。

  • TEST_SETUP

テストグループで共通して実施したい前処理を書く。

  • TEST_TEAR_DOWN

テストグループで共通して実施したい後処理を書く。

  • TEST

テストフィクスチャ本体。ここにテストを書く。

  • TEST_GROUP_RUNNER

テストをまとめて実行するためのグループランナー。

テストランナーとmain関数

テストランナー用のファイル AllTests.cを作成。これは、定形なので、コピペしよう。main関数もココに書く。もし、main関数が自分のコードにすでにあるならば、UnityMainをmain関数から呼び出す。

#include "unity_fixture.h"

static void runAllTests()
{
  RUN_TEST_GROUP(hogehoge);
  /** ここにTEST_GROUPを追加していく **/
}

int main(int argc, char* argv[])
{
  return UnityMain(argc, argv, runAllTests);
}

 

Makefileの作成

Makefileを作成します。ポイントは、

  • unity.cとunity_fixture.cをコンパイルすること。
  • unity/srcとunity/extras/fixtureにインクルードパスを通してあげること

でしょうか。

#---- Outputs ----#
TARGET_BASE = hogehoge
TARGET_EXTENSION=.exe
TARGET = $(TARGET_BASE)$(TARGET_EXTENSION)

#--- Inputs ----#
PROJECT_HOME_DIR = .
UNITY_HOME = $(HOME)/tools/unity
UNITY_FIXTURE = $(UNITY_HOME)/extras/fixture

C_COMPILER=gcc

# Unity File
SRC_FILES  =$(UNITY_HOME)/src/unity.c
# Unity Fixture File
SRC_FILES +=$(UNITY_FIXTURE)/src/unity_fixture.c

# Source Files
SRC_FILES += src/hogehoge.c

# Test Files
SRC_FILES += test/Testhogehoge.c
SRC_FILES += test/AllTests.c

INC_DIRS  =-Isrc
INC_DIRS +=-I$(UNITY_HOME)/src
INC_DIRS +=-I$(UNITY_FIXTURE)/src

#SYMBOLS=-DTEST -DUNITY_SUPPORT_64

CLEANUP = rm -f build/*.o ; rm -f $(TARGET); rm -f $(TARGET2) ; mkdir -p build

all: default

default:
        $(C_COMPILER) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES) -o $(TARGET)
        ./$(TARGET)

テストの実行

テストを実行すると、テストが通ります。♪(〃’▽’〃)

./hogehoge.exe
Unity test run 1 of 1
..
-----------------------
2 Tests 0 Failures 0 Ignored
OK

おまけ

このフィクスチャの使い方は、テスト駆動開発による組み込みプログラミング ―C言語とオブジェクト指向で学ぶアジャイルな設計のサンプルコードを見るとよく分かる。

サンプルコードは以下からダウンロードできる。

http://pragprog.com/titles/jgade/source_code

これをみると、unity.framework/extras/fixture/build配下に、MakefileWorker.mkというものを配置して、Makefileの最後でインクルードしている。

こっちのやり方のほうが綺麗だな。ディレクトリを指定すれば、配下のファイルを自動でコンパイルしてくれるので。また、オプションによっては、gcovを実行したりもできるっぽい。面白そう!( ^ω^)こんど調べてみよう。

というわけで、サンプルコードをダウンロードして、MakefileWorker.mkを手に入れましょう。自作のMakefileは書いておきます。

#---- Outputs ----#
TARGET_BASE = hogehoge
TARGET_EXTENSION=.exe 
TARGET = $(TARGET_BASE)$(TARGET_EXTENSION) 

#--- Inputs ----#
PROJECT_HOME_DIR = .
UNITY_HOME = $(HOME)/tools/unity
UNITY_FIXTURE = $(UNITY_HOME)/extras/fixture
UNITY_BUILD_HOME = $(UNITY_HOME)/extras/fixture/build

C_COMPILER=gcc

#UNITY_CFLAGS += -DUNITY_OUTPUT_CHAR=UnityOutputCharSpy_OutputChar

SRC_DIRS = \
     $(PROJECT_HOME_DIR)/src\

TEST_SRC_DIRS = \
          $(PROJECT_HOME_DIR)/test\
          $(UNITY_HOME)/src\
          $(UNITY_HOME)/extras/fixture/src\

INCLUDE_DIRS =\
  .\
  $(PROJECT_HOME_DIR)/src\
  $(UNITY_HOME)/src\
  $(UNITY_HOME)/src\
  $(UNITY_HOME)/extras/fixture/src\
  $(UNITY_HOME)/extras/fixture/test\

include $(UNITY_BUILD_HOME)/MakefileWorker.mk
 

 

ついでにgithubにも。

git://github.com/tsu-nera/embedded_testing_with_unity_and_cmock.git

25 May 2013, 13:39

Cygwin使いならば絶対に身につけておきたいコマンド5選+apt-cyg

Windows上で開発をするならばCygiwinは必須ツールですが、今日はそんなCygwin独自コマンドを紹介します。

この本を読みました。Cygwin本はいろいろ出ているけれども、今までで一番詳しい解説書だった。オススメ。

 

cygstart

cygstartは、Windowsでのデフォルト起動プログラムで、指定されたファイルを実行できる。たとえば、テキストファイルがサクラエディタで開くのがデフォルトならば、

cygstart hogehoge.txt

と入力すると、サクラエディタで開かれる。

自分の場合は、aliasを切って、さらに便利にしている。

alias c='cygstart'

さらに便利なのが、ディレクトリを指定すると、そのフォルダがエクスプローラで起動される。たとえば、

cygstart .

と入力することで、カレントディレクトリをエクスプローラで表示することができる。

cygcheck

cygcheckはCygwin プログラムの診断を行うユーティリティ。

  PROGRAM              list library (DLL) dependencies of PROGRAM

  -c, –check-setup    show installed version of PACKAGE and verify integrity

                       (or for all installed packages if none specified)

  -d, –dump-only      just list packages, do not verify (with -c)

  -s, –sysinfo        produce diagnostic system information (implies -c)

  -r, –registry       also scan registry for Cygwin settings (with -s)

  -k, –keycheck       perform a keyboard check session (must be run from a

                       plain console only, not from a pty/rxvt/xterm)

  -f, –find-package   find the package to which FILE belongs

  -l, –list-package   list contents of PACKAGE (or all packages if none given)

  -p, –package-query  search for REGEXP in the entire cygwin.com package

                       repository (requires internet connectivity)

  –delete-orphaned-installation-keys

                       Delete installation keys of old, now unused

                       installations from the registry.  Requires the right

                       to change the registry.

  –enable-unique-object-names Cygwin-DLL

  –disable-unique-object-names Cygwin-DLL

  –show-unique-object-names Cygwin-DLL

                       Enable, disable, or show the setting of the

                       “unique object names” setting in the Cygwin DLL

                       given as argument to this option.  The DLL path must

                       be given as valid Windows(!) path.

                       See the users guide for more information.

                       If you don’t know what this means, don’t change it.

  -v, –verbose        produce more verbose output

  -h, –help           annotate output with explanatory comments when given

                       with another command, otherwise print this help

  -V, –version        print the version of cygcheck and exit

多機能だ。自分が使うのは、もっぱらパージョンコマンド(-c)だ。

[tsu-nera]% cygcheck -c cygwin gcc ruby screen zsh
Cygwin Package Information
Package              Version          Status
cygwin               1.7.18-1         OK
gcc                  3.4.4-999        OK
ruby                 1.9.3-p385-2     OK
zsh                  5.0.2-1          OK

こんな感じで、コマンドのバージョンが一気に調べられる。

cygpath

これはあまり使わないけど、今回の記事のために調べてみた。

WindowsとCygwinでは、ファイルパスの記述方法がことなる。

  • Windows形式のファイルパスは “C:\Users\hogehoge”
  • Cygwin形式のファイルパスは”/cygdrive/c/Users/hogehoge”

ファイルパスをWindows形式からCygwin形式に、Cygwin形式からWindows形式に、簡単に変換できるコマンドがcygpathだ。

# Cygwin形式からWindows形式に
[tsu-nera]% cygpath -w /home/TSUNEMICHI/dotfiles
C:\cygwin\home\TSUNEMICHI\dotfiles

# Windoows形式からCygwin形式に
[tsu-nera]% cygpath -u "C:\cygwin\home\TSUNEMICHI\dotfiles"
/home/TSUNEMICHI/dotfiles

getclip

getclipは、Windows上のクリップボードにあるものを標準入力に出すことができるもの。

getclip > hogehoge.txt

などと、リダイレクトすると、ファイルに出力できる。

putclip

putclipはgetclipの逆で、Windows上のクリップボードに、出力をコピーすることができる。通常は、echoまたはcatと、パイプと組み合わせて使う。

echo 'hogehoge' | putclip
cat hogehoge.txt | pugclip

getclip/putclipの文字化け対策

CygwinはUTF-8だが、WindowsはShift-jis。なので、そのまま使うとすると、文字化けしてしまう。

そんなときは、nkfコマンドをうまくつかう。

# utf-8に変換してファイルへ
 getclip | nkf -w > hogehoge.txt

# Shift-jisに変換してクリップボードへ
nkf -s < hogehoge.txt | putclip

nkfはCygwinのデフォルトコマンドではないので、以下の記事を参照してください。

Cygwinにnkfをインストールして文字化け攻略する! | Futurismo

apt-cyg

デフォルト内部コマンドではないけれども、Cygwinを使うにおいては必須コマンドがこれ。Linuxのapt-get や yumのように、簡単にツールを導入することが可能となる。通常ならば、setup.exeを利用してツールをいれるのだが、コレさえあれば、setup.exeは不要となる。

これについては、過去記事をごらんください。

setup.exeはもういらん!Cygwinでコマンドラインからインストール/アップデートする[apt-cyg]を試す | Futurismo