「入門Git」は噂通りの神本だった

入門Git
4798023809


 既に各所で絶賛されている「入門Git」を読み終わった。これは、噂に違わぬかなりの良書。読んだ後に何とも言えない充足感まで感じてしまった。

 書いてある内容については、他で語られているとおりなんだけど、角谷さんのスライドの中 (84p) ですごく良くまとめられているのを見つけたので、失礼ながら勝手に引用。
“The Git Way”の白眉
  • ワークフローのためにツールがある
    • “Linus君の究極のコンテンツトラッキング”
    • パッチベースのワークフロー
  • 目にみえる手段の背後にある考えかたの重要性
Making Software Development Agile With Ruby
* もっとも、「The Git Way」とかいう別題は、著者の濱野さんにとってはイマイチみたいだけど

 とにかく、Git を使う人だけではなく、何かしらの VCS を使う人だけではなく、ソフトウェア開発に関わる人みんなに読んでもらいたい。技術書とはかくあるべき。

リンク:

[PR]
# by fkmn | 2009-11-19 23:55 | 読書記録
On Lisp 第10章 マクロのその他の落とし穴
 評価の順番が問題になる例がヤバい。こんなのに遭遇したら、かなりの時間を取られそう。
 副作用と再帰に関しては、マクロ展開の結果がイメージできていれば、避けるのはそんなに難しくない気がする。

10.2 評価の順番
- 評価の順番が問題になる例
(defmacro for ((var start stop) &body body)
(let ((gstop (gensym)))
`(do ((,gstop ,stop)
(,var ,start (1+ ,var)))
((> ,var ,gstop))
,@body)))

(let ((x 1))
(for (i x (setq x 13))
(printc i)))
;=> 13
; NIL

stop "(setq x 13)" の副作用で、ループの初期値が 13 になってしまう。
# うーん、このハマリ方はわかりづらい・・・

10.3 マクロ展開関数の副作用
- 展開を行うコードは引数として渡された式にのみ依存すべきで、
値を返す他には周囲の世界に影響しようとすべきではない。
# この原則が重要そう。
# これさえ守っておけば、上の例のような問題は起きないはず。

10.4 再帰
- 末尾再帰関数は、反復形に変換してマクロのひな形に使う事が容易
; 末尾再帰関数
(defun ntha (n lst)
(if (= n 0)
(car lst)
(nsta (- n 1) (cdr lst))))

; 反復形に変換したマクロ
(defmacro nthc (n lst)
`(do ((n2 ,n (1- n2))
(lst2 ,lst (cdr lst2)))
((= n2 0) (car lst2))))


- マクロの引数そのものについての再帰は可能 (引数を無限に重ねる事はできない)
- マクロ引数の値に対する再帰は不可能 (無限ループ!)


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
# by fkmn | 2009-11-17 23:55 | 一人読書会
On Lisp 第9章 変数捕捉
 慣れるまでは、マクロを使う際に変数名の衝突ではまりそうで怖い。とりあえず、gensym 使っておけば大丈夫っぽく思えるけど、どうなんだろ。
 それから、Common Lisp の defmacro と Scheme の「健全なマクロ」の違いについてよくわかってないので、後で勉強する。

9.4 適切な名前によって捕捉を避ける
- Common Lisp のグローバル変数には、
先頭と末尾にアスタリスクがつく名前を付けるのが伝統
(例) *package*

9.5 事前評価によって捕捉を避ける
- 危険のある引数を、マクロ展開で作られる束縛よりも外で評価する。
=> 例えば、マクロを let で始める

9.6 Gensym によって捕捉を避ける
- 捕捉されうるシンボルを gensym で置き換える
<= マクロの変数捕捉を避ける確実な方法

9.7 パッケージによって捕捉を避ける
# パッケージについて:
# - defpackgage でパッケージを定義
# - in-package でカレントパッケージを指定、
#
# 参考: パッケージを作りたい
# シンボルとパッケージ

9.8 その他の名前空間に置ける捕捉
- do は暗黙のうちに、nil という名前のブロックに囲まれる
(block nil
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return-from nil x)
(princ x)))))
;=> (A 6)
* 外側で明示的に指定されている nil ブロックから抜けているつもりが、
暗黙に作られた do のすぐ外の nil ブロックに捕まってしまい、
結果として評価値が (A 6) になってしまっている。

(block foo
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return-from foo x)
(princ x)))))
;=> 6
* 外側のブロックを nil 以外の名前にすれば、無事に抜けられる

(block nil
(list 'a
(do ((x 1 (1+ x)))
(nil)
(if (> x 5)
(return x)
(princ x)))))
;=> (A 6)
* return は、暗黙的に作られた nil ブロックから抜ける


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
# by fkmn | 2009-11-15 23:55 | 一人読書会
MacPorts で Mercurial をインストールしようとして小ハマリ
-- 要約 ----------------------
今話題のGo言語を試そうとしたら、Go言語のインストール (ソースコードの取得) には Mercurial が必要なので、MacPorts で Mercurial をインストールしようとしたらエラーが発生して困った、という絵に描いたような yak shaving の話。
------------------------------

MacPorts で Mercurial をインストールしようとしたら、以下のようなエラーが発生。
% sudo port install mercurial
(略)
checking for XPROTO... configure: error: Package requirements (xproto >= 7.0.13) were not met:

Requested 'xproto >= 7.0.13' but version of Xproto is 7.0.11
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables XPROTO_CFLAGS
and XPROTO_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.


Error: The following dependencies failed to build: python26 tk xorg-libXScrnSave
r xorg-libXext xorg-libX11 xorg-scrnsaverproto
Error: Status 1 encountered during processing.

なんだか、「xproto」のバージョンがあわないらしい。

"sudo port install xorg-xproto" や "sudo port upgrade xorg-xproto" で新しいバージョンをインストールしようとしたが、エラーが出てインストールできず。

ググってみたら、同じようなエラーについてのエントリを発見。
Macportsでインストールするときにハマった - どのバージョンのパッケージが有効なのか注意 (Kanasansoft Web Lab.)

どうやら、「activate」の状態をいじってやればいいらしい。

% sudo port deactivate xorg-xproto
---> Deactivating xorg-xproto
で、一度対象パッケージを "deactivate" して、再インストール。
% sudo port install xorg-xproto
---> Activating xorg-xproto @7.0.15_0
---> Cleaning xorg-xproto
その後、mercurial のインストールに再トライ。
% sudo port install mercurial
---> Configuring xorg-libX11---> Building xorg-libX11
---> Staging xorg-libX11 into destroot
(略)

インストールは無事終了したので、hg コマンドを試してみる。
% hg
Mercurial - 分散構成管理ツール

基本コマンド:

add add the specified files on the next commit
annotate ファイル行毎のチェンジセット情報表示
clone 既存リポジトリの複製
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export 1つ以上のチェンジセットに対するヘッダおよび変更内容の出力
init 指定されたディレクトリでの新規リポジトリの作成
log show revision history of entire repository or files
merge 作業領域の内容と他のリビジョンのマージ
parents 作業領域(ないし指定リビジョン)の親リビジョンの表示
pull 指定されたリポジトリからのチェンジセット取り込み
push 指定されたリポジトリへのチェンジセット反�
remove 次回コミットにおける指定されたファイルの登録除外
serve HTTP 経由でのリポジトリの公開
status 作業領域のファイル操作状況の表示
update 作業領域の更新

全コマンドの一覧は "hg help" で、コマンド詳細は "hg -v" で表示されます

ちゃんとインストールできたっぽい。

上のエントリがあったおかげで、あまり時間を取られずにすんだ。
kanasan++
[PR]
# by fkmn | 2009-11-14 23:55 | 日記
On Lisp 第8章 いつマクロを使うべきか
マクロを使う際の注意点について。
この辺は、実際に使って経験を積まないと分からない (実感できない) 部分も多いだろうなぁ。

基本的には関数を使うべき。マクロが必要なときのみ、それを使う。

8.1 他の手段では不可能なとき
- 1. 変形, 引数等の変形が必要な場合
2. 変数束縛, レキシカルな束縛を変更する場合
3. 条件分岐による評価, 引数を特定条件下でのみ評価する場合
4. 複数回の評価, 引数を繰り返し評価する場合
5. 呼び出し側環境を利用する, 呼び出し側のコンテキストの変数等を利用する場合
* ただし、あまり望ましい使用方法ではない
6. 新しい環境を包み込む
7. 関数呼び出しを節約する
* コンパイル後のコードではマクロ呼び出しに関わるオーバーヘッドがない

8.2 マクロと関数どちらが良い?
- マクロの長所
1. コンパイル時の計算
2. Lisp との密な統合
3. 関数呼び出しの節約

- マクロの短所
1. 関数はデータだが、マクロはコンパイラへの指示に近い
2. ソースコードの明確さ (が失われる)
3. 実行時の明確さ (が失われる)
4. 再帰 (が関数のときほど簡単ではない)


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
# by fkmn | 2009-11-12 23:55 | 一人読書会


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX