16042012 sake
無濾過生原酒の吟醸はすぐ酔いがまわるなぁとつくづく。 純米も切れ味するどくシャープ目な味わいなのでくいくいと。

16042012 life
ひと月くらい前の話だと思うが。



内浦漁港の朝一で干物なんかを買って、隣のミトシーへ。



ペンギンはなかなか可愛かった。

15042012 Python javascript Flask Spine
SpineのtodoサンプルをSpine.appを使って書いてみた。これはBrunch(Backbone.js)みたいに、モデル、ビュー、コントローラーをバラバラに開発してbuildすると一つのjsファイル(cssも)にアセンブルしてくれるツールですね。テンプレートはecoを使っています。
index.coffeeの役割がわかりづらかったので理解するのにちょっと時間がかかった。
hem model task
とかやるといっしょにテストのひな形が作られるのとlocalhost:9294/testにアクセスすればjasmineのテストが走るようになっているので使いやすそう。
そして以下の素晴らしい三部作を読んでSinon.jsの便利さに目覚めたので積極的に使っていこうと感じた。
Spine.Model.AjaxつまりRESTのAPIはFlaskを使おうと思っているんだが、Flask-Restlessを利用するのが手っ取り早くていいかなぁと。
14042012 javascript
spine.todosのtodoがデフォルト値を入れてないのに真偽値を返すので、なんでだ?と。
適当なオブジェクトを作って確かめてみると確かに真偽値が返ってくる。
> t = {name:'kzfm'} { name: 'kzfm' } > !t.done true > !!t.done false
結局undefinedかと。
> !undefined true > !!undefined false
JGPのappendixにundefinedはfalsyだって書いてあった。
でもちょっとわかりづらいなぁ。
14042012 Emacs coffeescript
最近順調にバージョンが上がっているCoffeeLintを使ってみた。CoffeeLintのサイトから辿れるcoffeelintnodeはサバクラの構成っぽくてちょっと使いづらそうだったので、flymakeの設定を書いてみた。
flymake-cursorにも対応させてあるので下のスクリーンショットのミニバッファーにエラー内容が表示されてる。

自分でelispを書く場合、この本はとても良かった。この本を片手に他の人の書いたelispを読むのも楽しい。
それからcoffeelintのパスがnvmのちょっとアレなパスで直書きしたくなかったのと、coffeelintが結構死ぬので、flymakeが巻き添えを食わないようにする設定のやり方を参考にさせてもらった。
昨日書いたpythonのflymake部分を切り離してinit-flymake.elに統合したので、coffeescriptだけ設定したい場合は下のelispからpythonの設定を削除すれば動くと思います。
(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted) (setq flymake-check-was-interrupted t)) (ad-activate 'flymake-post-syntax-check) (add-hook 'find-file-hook 'flymake-find-file-hook) (when (load "flymake" t) ;; flymake+pyflakes+pep8 ; http://d.hatena.ne.jp/cou929_la/20110525/1306321857 (defun flymake-pyflakes-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "pycheckers" (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pyflakes-init)) ;; flymake+coffeelint ; http://blog.kzfmix.com/entry/1334315825 (defun flymake-coffeelint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "coffeelint" (list "--csv" local-file)))) (add-to-list 'flymake-err-line-patterns '(".+,\\(.+\\),\\(.+\\),\\(.+\\)" nil 1 nil 3)) (add-to-list 'flymake-allowed-file-name-masks '("\\.coffee\\'" flymake-coffeelint-init))) (load-library "flymake-cursor")
macbookを買ってからずっとcarbon emacsを使っていたんだけど、思うところあって23系に変更した。
ここを参考にしながらソースコードを落としてきてインストールした。
python開発環境はemacs-for-pythonがよさそうだったんだけど自分の環境ではpyflakesが動かなかったので、深入りする前にやめた。今度また時間があるときにチャレンジする。
結局以下のサイトを参考にしてflymake, pyflakes, pep8, virtualenv, noseが動くようにしておいた。

出来上がったelisp
(add-hook 'python-mode-hook '(lambda() (setq indent-tabs-mode nil) (setq indent-level 4) (setq python-indent 4) (setq tab-width 4))) ;; flymake+pyflakes+pep8 ; http://d.hatena.ne.jp/cou929_la/20110525/1306321857 (add-hook 'find-file-hook 'flymake-find-file-hook) (when (load "flymake" t) (defun flymake-pyflakes-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list (expand-file-name "~/bin/pycheckers") (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pyflakes-init))) (load-library "flymake-cursor") ;; virtualenv ; https://github.com/aculich/virtualenv.el (require 'virtualenv) ;; nose.el ; https://bitbucket.org/durin42/nosemacs/src/9302529e68be/nose.el (require 'nose) (add-hook 'python-mode-hook (lambda () (local-set-key "\C-ca" 'nosetests-all) (local-set-key "\C-cm" 'nosetests-module) (local-set-key "\C-c." 'nosetests-one) (local-set-key "\C-cpa" 'nosetests-pdb-all) (local-set-key "\C-cpm" 'nosetests-pdb-module) (local-set-key "\C-cp." 'nosetests-pdb-one)))
M-x virtualenv-workonでvirtualenvが使えるうえにemacsからnosetestsをはしらせることが出来るので快適だ。
EmacsからGitを扱いたくなったので、Magitを入れてみた。
眺めただけでは快適なのかどうなのかよくわからんので、「chapter4の独りで使う」をmagitでやってみた。
M-x magit-initでディレクトリを指定すればgitリポジトリの初期化をしてくれます。ディレクトリが存在しなければ作成してくれる。
M-x magit-init magit4と打つ
これでmagit4というディレクトリが作られてgitリポジトリが初期化される
C-x C-fでindex.htmlを作成します。ファイルの中身
<html> <head> <title>Shizugit</title> </head> <body> <h1>Shizugit</h1> <p>Shizugitでは、参加者を募集しています。 最新の版管理システムgitについて熱く語り合いましょう。 </p> <address> <a href="mailto:magit@test.com">kzfm</a> </address> </body> </html>
C-x C-sで保存します。
さて、ここでおもむろにM-x magit-statusと打つとmagit-modeのバッファーが開きます(下段)。

カーソルをindex.htmlにあわせてs キーを打つとステージングされます。これはgit add index.htmlと同じ事です。逆を行いたい場合(アンステージ)はuキーです。

この状態でcを押すとコミットログ編集画面がでるので「第一回参加募集」とでも書いておきます。
C-c C-cを打てばコミットが作られます。

index.htmlのaddressタグの直前に静岡っぽいテーマを挿入してみます。
<p>第一回会合では、セミナーも開催します</p> <ul> <li>お茶の淹れ方 <li>静岡酵母について <li>Sphinxとか </ul>
セーブ(C-x C-s)します。
変更を見るには先ほどのmagit-modeでindex.htmlにカーソルをあわせてdを押します。これはつまりgit diffです。先程追加した部分が差分として表示されてます。

TODO: git diff HEADのやり方を調べる
コミットを作成します。なにもステージングしてない状態でcを押すと、ステージングしてない変更をステージングするかどうか聞いてくるのでyを押してコミットします。
これで2つのコミットログができているはずなので、変更履歴を見てみます。M-x magit-statusでmagit-modeのバッファーを表示してlキーを二回叩きます。

論理的に異なる2つの変更を施します。みんな大好きSEO対策と、おやつのアナウンスです。index.htmlは次のようになります。
<html> <head> <title>Shizugit</title> <meta name="keywords" content="SEO,SEO対策,SEOアクセス解析,アクセスアップ,SEOツール"> </head> <body> <h1>Shizugit</h1> <p>Shizugitでは、参加者を募集しています。 最新の版管理システムgitについて熱く語り合いましょう。 </p> <p>第一回会合では、セミナーも開催します</p> <ul> <li>お茶の淹れ方 <li>静岡酵母について <li>Sphinxとか </ul> <p>おやつは杉山フルーツの生ゼリーですYo!</p> <address> <a href="mailto:magit@test.com">kzfm</a> </address> </body> </html>
それぞれの変更を個別にコミットしたくなる(git add -p) わけですが、magit-statusバッファーのindex.htmlにカーソルをあわせてタブキーを押すと、ハンクが表示されるのでハンクをsでステージします。
下の図は、メタ情報の追加をコミットしたあとの状態です。

分割してコミットした後のログは以下になります。メタ情報とおやつ情報の2つに分けてコミットしました。

magit-statusバッファーでl l でログを表示させ、おやつ情報のコミットにカーソルをあわせてvを押します。その後cを押してコミット編集画面で編集したらC-c C-cでコミットします。

杉山フルーツの生ゼリーは美味しいんだけど、そこそこの値段がするので、毎回は出せないですね。
index.cssというファイルを作成し、追加してコミットします。
このコミットを捨てたい時には、magit-statusバッファーでxを押すとresetするかどうか聞いてくるのでyをおすだけです。これはお手軽ですね
コミット編集画面をもう一度表示させてC-c C-aでOK
キーバインドは覚えるまで苦労しそうだけど、一度覚えれば忘れなさそうだしmagitをメインに使っていこうかなと。
12042012 music
ハウス目、商業色もするけど濃過ぎないので良い感じに聴ける
11042012 Python
doccoのpython版((doccoはテーブルタグ使っているけどpyccoはdivなので出力するhtmlはちょっと違う))だけどオプションが幾つかあって、pオプションがソースのディレクトリ階層を保持したままドキュメントを生成するのでちょっと便利。
pの使い方は、例えばSphinxのtar-ballをダウンロード、展開して
cd sphinx find . -name "*.py" -print0| xargs -0 pycco -p
ってやるとdocsディレクトリに階層を保持された形で全てのコードのドキュメントが作成されるので、ソース自体にコメントを入れながら動きを把握するのに便利。今までsphinxでメモってたけどこっちのほうが断然理解しやすい。
rオプションとかつけて再帰的にたどってくれればwatchオプションと併用出来ていいかもと思うんだけど。
restもサポートされる感じなのでそれもちょっとよさげ。
ただ、まだちょっとバグってるので快適とは言いがたいが、楽しみだ。
10042012 Ruby
ちょっと気になった本
テストファーストっていうところに興味がわいた。Rubyが物足りなければCoffeeScriptでかきなおすのも面白いかなぁと