git reset についてもまとめてみる

前回 git diff を図に書いてみたところ、自分の中で意外と整理できたので、これまたなんとなく使っていた git reset についてもまとめてみた。


とりあえず結論を先にまとめよう。

git reset とは?
HEAD の位置を変更するコマンド。
オプションによってインデックス、ワーキングツリーの内容も変更できる。


git reset のオプションは?
--soft、--mixed(オプションなしと同等)、--hard オプションがあり、影響度の小さい順に以下のようになる。

  • --soft
    • HEAD の位置のみを変更する。インデックス、ワーキングツリーには影響なし。
  • --mixed (またはオプションなし)
    • HEAD の位置とインデックスを変更する。ワーキングツリーには影響なし。
  • --hard
    • HEADの位置、インデックス、ワーキングツリーをすべて変更する。
続きを読む

git diff の使い方がほんの少し理解できた

いままでなんとなく使ってきたけど、ようやく使い方が分かったような気がするのでメモ。

前提知識
  • インデックスとワーキングツリーが理解できていること
  • HEAD が何か分かっていること

git diff

ワーキングツリーとインデックスの差分を表示。
git add した後にさらに修正したけど、そういえばどの時点で git add したのかなー、というときに使う?
git add したらすぐにコミットする自分には関係なさそう。


git diff --cached

HEAD とインデックスの差分を表示。
git add して、コミットする前に差分を確認したい時に使うんだと思う。
自分は git diff よりもこっちの方をよく使う。


git diff HEAD

HEAD とワーキングツリーの差分を表示。
前にコミットした時からどれくらい編集したか確認したい時に使う。
HEAD の部分はコミット(HEAD、HEAD^ やコミットのハッシュ値)やブランチ、タグを指定できる。


git diff HEAD^..HEAD

コミット間の差分を表示。
ドット 2 つ (..) は空白でも OK。(git diff HEAD HEAD^ と同じ)
これも HEAD の代わりにコミットやブランチ、タグを指定できる。


git diff コミットその1...コミットその2

コミットその1、コミットその2 の共通の親と コミットその2 の差分を表示。
コミットその1 と コミットその2 が同じブランチだと上のバージョンと同じ結果になる。
イメージで見たほうが多分分りやすい。


git diff Y...D (ドット 3 つ版)



参考: git diff Y..D (ドット 2 つ版)




これ以外にもパッチを作ったり、出力形式をいじったりといろいろできるようだ。
ただ、正直そこまで使いこなせる気もしないし、使いこなす気もしない。


もっと使いこなしたい人はマニュアルを参照してください。
git-diff(1)

FreeBSD 8.1-RELEASEでWLI-UC-G300Nを使う

いろいろあって Ubuntu から FreeBSDに乗り換えたので、前回使った無線LANアダプタを今回は FreeBSD で使えるようにしたのでメモ。


WLI-UC-G300N は Ralink 製のチップを使っているので、 FreeBSD では if_run を使えばいいらしい。
ただ、8.1-RELEASE についてきた if_run では G300N を認識してくれなかったので、今回もドライバのソースに若干の修正が必要だった。


まずはここから最新版のソースをダウンロードしてくる。
他の FreeBSD 用のドライバへのリンクは Finished: CALL FOR TESTERS Ralink wireless run(4) usb driver for FreeBSD - The FreeBSD Forums に載ってた。


そして解凍。

$ tar xvfz run-run-8.1_REL.tar.gz 


ソースに追加するためにG300N の ID を調べる。

# lsusb
(略)
Bus /dev/usb Device /dev/ugen1.3: ID 0411:016f MelCo., Inc. 
(略)

lsusb がない場合は sysutils/usbutils をインストールすれば使えるようになる。


dev/usb/usbdevs に以下を追加。

product MELCO WLIUCG301N	0x016f	WLI-UC-G301N

自分の G300N に使われているチップを調べてみたら RT3071 となっていて、このチップは G301N に使われているらしい & WLI-UC-G300N が既に使われている、ということで名前を「WLI-UC-G301N」とした。
「WLI-UC-G300N」の値を直接書き換えても多分動くと思う。


dev/usb/wlan/if_run.c に以下を追加。

RUN_DEV(MELCO,		WLIUCG301N),


後は README に従ってビルドしていく。

usbdevs の上書き。

# cp dev/usb/usbdevs /usr/src/sys/dev/usb/


firmware のビルド。

$ cd modules/runfw
$ make
# make install


ドライバのビルド。

$ cd ../usb/run
$ make
# make install


起動時にドライバを読み込むために /boot/loader.conf に以下を追加。

if_run_load="YES"
runfw_load="YES"


WPA を使ってるのでその設定もしておく。(参考: DELL Inspiron 1300 内蔵無線 LAN を FreeBSD から WPA2 で使う)
wpa_passphrase の出力内容を /etc/wpa_supplicant.conf に追加。

$ wpa_passphrase SSID パスフレーズ


/etc/rc.conf に以下を追加。

wlans_run0="wlan0"
ifconfig_wlan0="country JP WPA SYNCDHCP"

「SYNCDHCP」を「DHCP」にすると起動時の IP 取得を非同期で行うようになるらしい。
自分の場合、非同期にすると起動中に他のデーモンがネットワークにアクセスできなかったので IP 取得を待つようにした。


後は再起動して wlan0 のステータスが associated になっていればOK。


起動中に

runfw: root not mounted yet, no way to load image
run0: failed loadfirmware of file runfw
run0: could not load 8051 microcode
device_attach: run0 attach returned 6

というエラーがでる場合、firmware のロード (runfw_load="YES") を忘れている。


あと、自分の環境ではなぜか起動中に無線 LAN アダプタを抜くと無線マウスが使えなくなる。
マウスのアダプタを差し直してやるとなおるのでとりあえず気にしないことに。

FreeBSD 8.1 on ZFS-boot

前回の記事があまりにも適当だったので、もう少し詳しく書いてみる。


メモリ 8G 積むので、amd64 版の FreeBSD-8.1-RELEASE をインストールすることに。
それ以外の方針としては、

  • /usr/home は root とは違うプールにする
  • プールはすべて mirror で作成
  • xorg-minimal と gnome2-lite を使う
  • 実機にインストールするので Guest Additions は入れない

といったところ。

続きを読む

テンプレート版 noncopyable を使うときは要注意

コピーを禁止するクラスを定義する際に Boost の noncopyable クラスや同様の自作クラスを使うことは多いと思う。
Boost の noncopyable は継承するだけで OK という手軽さがいいんだけど、More C++ Idioms/コピー禁止ミックスイン(Non-copyable Mixin) によると Boost の noncopyable のような単純なクラスでは多重継承した時に空の基底クラスの最適化が行われないらしい。
その代わり、CRTP を使うことでこの最適化を行わせることができるとのこと。


g++ 4.4.3 で確かめてみたところ、確かに非 CRTP 版では最適化が行われておらず、CRTP 版では最適化が行われているようだ。

#include <iostream>

class NonCopyable {
protected:
	NonCopyable() {}
	~NonCopyable() {}
private: 
	NonCopyable(const NonCopyable&);
	NonCopyable& operator=(const NonCopyable&);
};

class A : NonCopyable {};
class B : NonCopyable {};
class C : A, B {};


template <class T>
class CRTPNonCopyable {
protected:
	CRTPNonCopyable() {}
	~CRTPNonCopyable() {}
private: 
	CRTPNonCopyable(const CRTPNonCopyable&);
	T& operator=(const T&);
};

class AA : CRTPNonCopyable<AA> {};
class BB : CRTPNonCopyable<BB> {};
class CC : AA, BB {};

int main()
{
	std::cout << "sizeof(C)==" << sizeof(C) << std::endl;	// sizeof(C)==2
	std::cout << "sizeof(CC)==" << sizeof(CC) << std::endl;	// sizeof(CC)==1

	return 0;
}

と、ここまでは上記サイトに書いてあった通り。


CRTPNonCopyable でテンプレート引数のクラスの代入演算子を定義しているあたり、 Barton-Nackman trick 使ってるのかなーと思いながらふと代入してみると、なんとコンパイルが通る。

続きを読む

omake: Symbol `FamErrlist' has different size in shared object, consider re-linking

OMake を使うと下のような謎のエラーが出る。

omake: Symbol `FamErrlist' has different size in shared object, consider re-linking

ビルドはちゃんとできているようだけど、どうも気持ち悪いのでなんとかしたい。


単刀直入に言うと、下記コマンドで直った。

# aptitude install libfam0


参考元
http://paragasu.wordpress.com/2009/04/18/lighttpd-symbol-famerrlist%E2%80%99-has-different-size-in-shared-object-consider-re-linking/