<   2009年 11月 ( 13 )   > この月の画像一覧
Shibuya.pm #TT 12 に行ってきた
 Shibuya.pm TT #12 に行ってきました。スタッフ&関係者の皆様、おつかれさまでした&ありがとうございました。

 気になったところのちょっとした感想をば。

miyagawa さん - "Tatsumaki" I/O bound HTTP clients in web frameworks
 PSGI 関係のプロジェクトって、割と最近始まったばかりの気がするんだけど、ずいぶんと周囲の対応が速い事に驚いた。有名どころの WAF は、ほとんど対応済みらしい。
 Tatsumaki を使った chat アプリは見ていて楽しい。ハックしたくなる気持ちがわかる。

NoSQL vs. NoKVS ライトニングディスカッション
 普段 KVS なんて使わないもんで、いろいろと新鮮な話ばっかり。

mikio さん - Tokyo (Cabinet|Tyrant)
 KVS としてはメジャーどころなんでしょか?名前はちょくちょく聞くけれど。
 Tokyo Tyrant の運用事例の中に「バイオ」ってあったけど、具体的にはどこで使われてるんだろ?勉強不足で知りませんが。

halt さん - 毎秒11万回更新できるのはRedisだけ
 Redis という初心者向け (?) の KVS について。
 「KVS 使った事無い人?」という質問に対して、手を挙げたのは、会場の半分も居ない感じだった。KVS って、そんなに普及してるのか・・・。
 話を聞いていると、確かに取っ付きやすそうな感じを受けた。お試しで遊んでみるのにはよさそう。

kzk さん - Hadoop/hBase を動かしてみた
 hBase は、これから利用実績が伸びてきそうな印象を受けた。けど、Column Store という特徴ををうまく使うのはコツがいりそう。他の KVS と比べて、少し独特な感じ。

kazuho さん - NoKVS な RDBMS sharding 作ってみた
 KVS じゃなくて、RDBMS sharding のためのツールのお話。質問が他と比べて活発だったのは、なんだかんだ言ってみんな RDBMS になじみが深いからじゃないかと勘ぐってみたり。

LT - tokuhirom さん
 PL_keyword_plugin は、なんとなく Lisp のリードマクロっぽい気がする。いろいろ面白いことができそう。


 といったところで、21時ぴったりに終了。takesako さんは、自身のトークだけではなく、TT 全体も時間ぴったりに終わらせることのできる特殊な能力をお持ちのようです :-)。
[PR]
by fkmn | 2009-11-30 23:55 | 日記
On Lisp 第12章 汎変数
 setf に絡むマクロの章。
 何となく基本テクニックっぽい感じがするのは気のせいか。

12.1 汎変数という概念
- インバージョン: 値を求める式からアサーションへの変換
- アサーション: 成り立つべき条件
- Common Lisp で頻繁に使われるアクセス関数 (car, cdr, nth, aref, etc...) には、
インバージョンに当たるものがあらかじめ定義されている
- 汎変数: setf の第一引数として機能する式

12.2 複数回の評価に関わる問題
- define-modify-macro
- arg1, 定義したいマクロの名前
- arg2, 汎変数以外に取る付加的な引数
- arg3, 汎変数の新しい値を返す関数 (名)

12.3 さらに複雑なユーティリティ
- get-setf-method, 汎変数の値をいじくるための情報を返す関数
# 注、ANSI Common Lisp の標準は、get-setf-expansion
# 参考: 代入を簡略化するマクロ
- (get-setf-method '(aref a (incf i))
;;=> (#:G3430 #:G3431) ; 一時変数のリスト
;; (A (INCF I)) ; 一時変数にそれぞれ代入すべき値のリスト
;; (#:G3432) ; 変更後の値を入れるための一時変数
;; (SYSTEM::STORE #:G3430 #:G3431 #:G3432) ; この束縛のもとで行うべき代入操作
;; (AREF #:G3430 #:G3431) ; 変更前の汎変数の値を返す式

12.5 インバージョンを定義する
- defsetf, インバージョン定義マクロ
defmacro と違い、引数のために自動的に gensym を生成する
- defun でも、setf に対するインバージョンを直接定義できる (CLTL2 準拠の場合)
- 非対称なインバージョンも定義可能
- アクセス用の式とそのインバージョンは、同じデータに対して働く必要は無い



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-25 23:55 | 一人読書会
On Lisp 第11章 古典的なマクロ
 だんだんマクロの規模が大きくなってきた。がんばってついていこう。

 ちなみに、最近、仕事でコードを書いていて、「あ、これマクロでやれそう (やりたい)」と考える事が多くなってきた。徐々に洗脳が進んでいるらしい。

よく使われる種類のマクロ
- コンテキストを作るマクロ
- 条件付き評価のためのマクロ
- 反復評価のためのマクロ

11.1 コンテキストの生成
- コンテキストの種類
1. レキシカル環境
2. 世界の状態
- スペシャル変数の値
- データ構造の内容
- Lisp外部の状態
- etc...

11.2 with-系マクロ
- コンテキスト生成マクロの名前は with- で始めることが多い
- unwind-protect
- 複雑なマクロは、関数とマクロの組み合わせで書く方が実用的
# dynamic-extent宣言ってなに??
# あとで読む: Common Lisp のスコープとエクステント (PDF)

11.3 条件付き評価
- 定石のうち、明確なものと効率的なものとの選択に直面したときに、
前者を後者に変換するマクロを書く事で、切り抜けられる

11.4 反復
- 本体となる指揮を執って、それを反復評価するオペレータ
=> マクロでのみ表現可能

11.5 複数の値にわたる反復
# ちょっとでかいマクロが多くて、あまりついていけなかった・・・
# 要復習

11.6 マクロの必要性
- 引数をクロージャで括って、評価から保護する方法があるよ
* でも、マクロで書いた方がすっきりする場合多数



On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-20 19:27 | 一人読書会
「入門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 | 一人読書会
On Lisp 第7章 マクロ
いよいよ本番。
マクロなんてほとんど使った事のないヘタレなので、話の内容が新鮮。

マクロ定義とは実質的にLispコードを生成する関数だ
-- つまりプログラムを書くプログラムだ。

7.1 マクロはどのように動作するか
- 関数 => 結果
マクロ => 式 => 結果

- マクロ呼び出し
1. 与えた定義の指定した式を生成
2. 生成した式を元のマクロ呼び出しの場所で評価する

7.2 バッククォート
- バッククォートは特別なクォート
(equal `(a b c) '(a b c))               ;=> T
(equal `(a b c) (list 'a 'b 'c)) ;=> T

- バッククォート内のカンマ => 評価の保護をやめる
(setq b 1
d 2)
(equal `(a ,b c ,d) (list 'a b 'c d))
;=> (equal `(a 1 c 2) (list 'a 1 'c 2))
;=> T

;; リストが入れ子でも機能する
`(a (,b c))
;=> (A (1 C))

- 1個のカンマは1個のバッククォートの効果を打ち消す
# やばい、だんだん混乱してきたw
`(a (`,b c))
;=> (A (B C))

- カンマアット (,@) は、一番外側の括弧を取り除いて挿入
(setq b '(1 2 3))
`(a ,b c)
;=> (A (1 2 3) C)
`(a ,@b c)
;=> (A 1 2 3 C)

- ,@ の制限事項
- シーケンス内になければいけない
- 切り貼りされるオブジェクトは、最後に来ない限りリストでなければならない
(setq b 1)
`(a ,@b)
;=> (A . 1)
`(a ,@b c)
;=> ERROR!!


7.4 マクロ展開の確認
- macroexpand, マクロ展開関数
- macroexpand-1, マクロを一段階だけ展開
=> タイプ数節約のため、代わりにこんなマクロを定義
(defmacro mac (expr)
`(pprint (macroexpand-1 ',expr)))

- マクロ展開は、マクロの書き方の勉強手段でもある。
=> マクロの展開形を見て、どう書かれたのかを調べる。

7.7 プログラムとしてのマクロ
- マクロ展開では、gensym の返す特別な無名シンボルを使う

7.8 マクロのスタイル
- マクロ定義に関わる二種類のコード
- 展開コード => 明確さ優先
- 被展開コード => 効率優先

7.9 マクロへの依存
- 1. マクロはそれを呼び出す関数 (またはマクロ) の前で定義する。
2. マクロが再定義されたときは、
それを (直接または間接的に) 呼び出している関数とマクロを
すべて再コンパイルする


On Lisp
Paul Graham

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

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-10 23:55 | 一人読書会
On Lisp 第6章 表現としての関数
短い章。これからはじまるマクロ祭りへの序章っぽい。
初めてクロージャってものに触れたときはチンプンカンプンだったなぁ。

Lisp での表現手段 => クロージャ

6.1 ネットワーク
- クロージャの3つの便利な性質
- アクティブ
- ローカルな状態を保持している
- 複数のインスタンスを作れる

6.3 展望
- 「クロージャで表現する」==「コンパイルする」


On Lisp
Paul Graham

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

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


とあるWebアプリケーションエンジニアの日記
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

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