2014-01-26

git log --graph --decorate=full

git を使っていて、ブランチやコミットがどうなっているのか知りたくなる。SourceTree を使っていると、グラフを可視化してくれるんだけど、git log と入力しただけだと、ずらずらっとシーケンシャルに出てくるだけで、わかりにくい。hg の glog エクステンションみたいなのはないのか、と探した。

git には標準で、そんな機能はついている。

git --graph --decorate=full

decoreate を full にするのは、ブランチ名を表示させたいから。デフォルトの short では、コミットのハッシュしか表示されない。

--pretty=format:xxx を使うと、より細かく設定できる。

[alias]
 glog = log --graph --date=short --decorate=short --pretty=format:'%h %Cblue%d%Creset %cd %cn %s'

けど、もうこんなことやるのだるいので、 --graph --decorate=full だけをエイリアスにしておいた。

2014-01-21

森博嗣「キウイγは時計仕掛け」

森博嗣の「キウイγは時計仕掛け」を読んだ。


それが、つい二カ月ほどまえになって、君も発表者だよ、と言われたのだ。え、そんな、と驚いたら、あれ、言わなかったっけ、というのが山吹の言葉だった。そういえば、論文の著者名で、加部谷のところに○が記されている。それが発表者の意味だったのだ。

学会発表ってこんな感じだったなぁ、もう、ぜんぜん分かんないなぁと、思いながら、学会の会期中に起こる事件を追った内容を読んだ。赤柳初朗の正体赤柳初朗の正体を考えるためには、再読が必要である。

シリーズとしては半分以上きているのかな、とタイトルを眺めていたら、タイトルのつけかたが折り返しているように見える。


  1. φは壊れたね
  2. θは遊んでくれたよ
  3. τになるまで待って
  4. εに誓って
  5. λに歯がない
  6. ηなのに夢のよう
  7. 目薬αで殺菌します
  8. ジグβは神ですか
  9. キウイγは時計仕掛け

5作目「λに歯がない」と7作目「目薬αで殺菌します」は、それぞれ歯と目がタイトルに含まれていて、体または顔に関係する。

4作目「εに誓って」と8作目「ジグβは神ですか」は、誓う、神と信仰に関係ある言葉が含まれる。

3作目「τになるまで待って」と9作目「キウイγは時計仕掛け」は、時間を連想させるタイトルだ。

今後は、2作目、1作目と対応する作品が出て完結か、謎は解けたぜベイビーと思ったのだけれど、森博嗣本人が全12作だと書いているので、およそ関係ない。


ところで、この本を買ったときには、まだノベルスしか売られていなくて、しょうがなく買ったんだけど、いま Amazon をみたら Kindle 版が売られている。裁断してスキャンするの面倒なので、2冊分の金払うから、最初から Kindle 版が欲しい。

2014-01-20

スキャン、クローゼットと棚の整理、クリーニング

昨日に引き続き、本のスキャンをした。これで手持ちの本はすべてスキャンできた。

棚とクローゼットの中を整理した。不要なものをゴミ袋へ。長さが同じで口の形がおなじのUSBケーブルが5本もあったり。プログラマ向けイベントや、レースでもらったTシャツも腐るほどあった。外出に使えなさそうなのはすべてゴミ袋へ。どうしていいか分からない書類もゴミ箱へ。

クローゼットにはゴミの他に、当分着ない服があった。クリーニング屋に出した。後は、旅行のおみやげを送るとか、部屋を片付けたりとか、古いメールアドレスで登録しているサービスの設定を変更するとかやっていたら夜になった。

2014-01-19

本の裁断と自炊、ファイル名変更、アドレス帳整理

段ボール箱3つと布団だけで東京に来てから、ずいぶん荷物が増えている。ついでに、ゴミも。冷蔵庫の下のように、普段気にしないので掃除を先延ばしにしたけど、長い間ほったらかしたがために、堆積している埃もある。物理的ではないが、ほったらかしにしていることもたくさんある。少しずつでもよいから、確実に手放していこうとしている。

本の裁断と自炊

未読も既読も、紙のままになっていた本を裁断してスキャンしている。スキャンが終わってからの、OCR 処理に時間がかかる。


自炊後のファイル名

OCR を待ちながら、ビールを飲んでるのにも飽きた。スキャンしたPDFファイルの名前のフォーマットを統一した。Good Reader で読むときに探しやすいようにするというのが目的だ。

[<著者名>]<書名>_<巻>.pdf

外タレの場合は姓だけにする。たとえば DeMarco というぐあいだ。著者が複数いるときには、最初のひとりだけ。所有している本で、複数の著者というのは、ほとんどの場合、技術書だ。タイトルで検索できればいい。フォーマットを統一しておいたほうが後々楽だろうと考えた。雑誌の場合は []Triathlon LUMINA_2013-01.pdf のように著者名を空文字にした。

例外が1冊ある。小池真理子と村上龍によるアンソロジー「美しい時間」だ。小池真理子がひとりめの著者なのだけれど、普段、小池真理子を読まないので、誰が著者だったかすぐに思い出せない。山田詠美だったっけかなぁ、などとよく分からない混乱をする。村上龍だというのはすぐに思い出せる。なので、この本の著者は村上龍にしてある。




「片付けをしていると、中身を見てしまって進まない」問題というのがあるらしい。らしいって、私自身そうなのだが。けれど PDF ファイルの名前を変えるだけなら、そんなことにならない。淡々とファイル名を書き換えるだけだからだ。たまに、著者名が分からなくて、ファイルを開くこともあったけれど、すぐに作業に戻った。紙のデメリット、電子媒体のメリットが、ひとつずつ明らかになった。

アドレス帳

アドレス帳も整理した。どこかで名刺交換したんだろうけど、まったく思い出せない人の情報は削除した。件数が多いわけじゃないけど、気分的にすっきりした。それから、所属が変わったりして、情報が複数ある人は統合した。

自転車のチューブ

バルブの先が壊れている。いまのところ直接困っていないけれど、いつまでも使うわけにもいかない。2本買った。700 x 20-23c の W/O チューブ。


2014-01-17

副作用

同僚に「から副作用とは何か教えろという趣旨の要求があった。この文書はその同僚に向けて書く。

副作用がある、というのは「知ることができるような状態変化が発生する」ということだ。定義から入ろうとすると、状態とはみたいな話になってしまうので、例をあげていく。サンプルコードはすべて Python で書く。

副作用のない関数呼び出し

>>> def add(a, b):
...    return a + b
... 
>>> add(1, 2)
3

関数 add の呼び出しには、副作用はない。関数は呼び出され、計算され、結果が返されているが、システムの状態に変化はない。関数が値を返すことは、副作用ではない。

代入

>>> VAL = 0

この代入文は副作用がある。この代入の実行前には VAL が定義されていないか、他の値が入っている。実行後には VAL に 0 が入っている。VAL の値が変化する = 状態変化がある = 副作用がある。

この代入の前にも VAL の値は 0 の場合もあり、状態は変わっていない。それは結果的にたまたま変わっていないだけであって、この代入文には VAL の値を書き換えるという副作用がある。

副作用のある関数呼び出し

>>> VAL = 0
>>> def incr_by(x):
...     VAL += x
...
>>> incr_by(4)
>>> VAL
4

incr_by 関数の呼び出しには、副作用がある。呼び出す前と後で、VAL の値が変わる = 状態変化がある = 副作用がある。incr_by に 0 を渡した場合は(r

副作用のあるメソッド呼び出し

>>> d = {'foo': 1, 'bar': 2}
>>> d.update({'baz': 999})
辞書の update 関数は副作用がある。上の例で、呼び出す前には辞書 d はキー baz を持っていない。update 関数を呼び出した後に、 d はキー baz を持つ。あるいは、最初から d['baz'] が定義されていても、値が書き換えられる。最初から d['baz']==999のとき(r

ファイル書き込み

>>> fout = open('iwata.txt', 'w')
>>> fout.write('hello')

上の例では open 関数も write メソッドも副作用がある。Python では、書き込みモードでファイルをオープンすると、そのファイルが作られる。したがって、呼び出し前後で os.path.exists() の戻り値が変わる。これはシステムに対する副作用である。

write メソッドを呼び出すと、ファイルに文字列が書き出される。write メソッドの前後で、open('iwata.txt', 'r').read() の戻り値が変わる。これも副作用である。

ところがどっこい

ここで「代入は副作用ではないが、ファイルへの書き込みは副作用である」なる発言を考える。VAL の例で代入は副作用である、という上の例と矛盾する。視点/立場をどこに置くか、で副作用の範囲が異なる。このエントリで例示してきたプログラムの視点で見ると、代入は副作用である。けれど、ファイルシステムだけを観測した場合には、変化がないので、副作用ではない。

最初の add 関数を呼び出すとき、足し算結果が欲しいプログラムのレイヤで観測すると副作用はない。しかし、実際には呼び出し前後で、内部のメモリ状態には変化が起こり、inspect ライブラリを使えば変化を知ることもできる。その立場で観測すれば副作用がある、と言える。

というわけで

知覚できる状態を変えてしまうとき、その関数、メソッド、操作は副作用がある、という。ただし「誰/何にとって」なのかによって、解釈が異なる場合がある。

BDD 的なアプローチでテストを書くとき、通常 given の操作は、テスト対象を特定の状態に強制するため、副作用が起こりえる。when 操作に副作用がないときには、then で戻り値を確認すればよい(副作用がないことを確認したければ、他にもすることはある)。when 操作に副作用があるときには、戻り値の確認だけでは不十分で、副作用を検出(他のAPIを呼び出して変化していることを確認など)する必要がある。

2014-01-13

着られない服、履かない靴、使わないコップなどを捨てる

来週あたりに仕事納めができそうだ。公私ともに落ち着いてきた。今月は余計なモノやコトを捨てることにしたので、まずはクローゼットや靴箱を整理した。着ない(着られない)服、履かない靴、使わないコップなどをゴミ袋にまとめた。可燃ごみと不燃ごみばかりなので、それぞれ次の収集日に出す。

2014-01-10

Vagrant のチュートリアルをやった

Vagrant のチュートリアルをやった。仕事で使うツールが、間接的に Vagrant を使っている。基本的なことくらい知っておこうと考えた。

Vagrant は virtualbox、VMWare Fusion、AWS EC2 の操作をラップする、と理解している。チュートリアルでは virtualbox が操作対象である。

vagrant init は、Vagrantfile を作る。Vagrant レイヤでの仮想マシン設定項目が、 Ruby で記述されている。vagrant init はひな形を作る。ユーザが用途に合わせて編集する。

vagrant box add は、box(仮想マシンイメージ)を取得して、~/.vagrant.d/boxes ディレクトリに保存する。

vagrant up はVagrantfile の box を読み取り、box を使って virtualbox 上で仮想マシンを起動する。このとき、.vagrant/machines/ 以下に仮想マシン情報が書き込まれる。

プロジェクトディレクトリは、仮想マシンの /Vagrant ディレクトリにマウントされる。ローカルで好きなツールを使って編集すればよい。

Vagrantfile にプロビジョニングの方法を記述しておくと、最初に vagrant up したときや、vagrant reload --provision したときに実行される。チュートリアルでは、/Vagrant ディレクトリ以下に Apache をインストールするシェルスクリプトを配置した。

なるほど。なるほどですね。

2014-01-08

bpython をインストールした。まだ使っていない

bpython をインストールした。Python のインタラクティブシェルを拡張したもの、と理解している。たとえば、入力中に関数やメソッド名の候補が表示される。パス名や、引数のヘルプも出る。

$ bpython
>>> import os.path
>>> os.path.e
┌──────────────┐
│exists     expanduser             │
│expandvars extsep                │
└──────────────┘

オリジナルの環境にはできるだけ入れたくない。しかし、プロジェクト毎の環境に入れるのもちょっと違う気がする。時雨道場に、シェルでログインしたときに、virtualenv を適用した環境にする、という教えがあった。bpython をインストールした環境を作り、 ~/.zshrc.local に以下のように書いておいた。

export VIRTUAL_ENV_DISABLE_PROMPT=1
source ~/.virtualenvs/default/bin/activate
unset VIRTUAL_ENV_DISABLE_PROMPT