EmacsのPython開発環境を整えた

macbookを買ってからずっとcarbon emacsを使っていたんだけど、思うところあって23系に変更した。

ここを参考にしながらソースコードを落としてきてインストールした。

python開発環境はemacs-for-pythonがよさそうだったんだけど自分の環境ではpyflakesが動かなかったので、深入りする前にやめた。今度また時間があるときにチャレンジする。

結局以下のサイトを参考にしてflymake, pyflakes, pep8, virtualenv, noseが動くようにしておいた。

emacs

出来上がった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をはしらせることが出来るので快適だ。

ProductName エキスパートPythonプログラミング
Tarek Ziade
アスキー・メディアワークス / 3780円 ( 2010-05-28 )


magit(emacs+git)は快適な予感がする

EmacsからGitを扱いたくなったので、Magitを入れてみた。

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


眺めただけでは快適なのかどうなのかよくわからんので、「chapter4の独りで使う」をmagitでやってみた。

gitの初期化

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のバッファーが開きます(下段)。

magit1

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

magit2

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

C-c C-cを打てばコミットが作られます。

magit3

変更の記録

index.htmlのaddressタグの直前に静岡っぽいテーマを挿入してみます。

<p>第一回会合では、セミナーも開催します</p>
<ul>
<li>お茶の淹れ方
<li>静岡酵母について
<li>Sphinxとか
</ul>

セーブ(C-x C-s)します。

変更を見るには先ほどのmagit-modeでindex.htmlにカーソルをあわせてdを押します。これはつまりgit diffです。先程追加した部分が差分として表示されてます。

magit4

TODO: git diff HEADのやり方を調べる

コミットを作成します。なにもステージングしてない状態でcを押すと、ステージングしてない変更をステージングするかどうか聞いてくるのでyを押してコミットします。

変更履歴を見る

これで2つのコミットログができているはずなので、変更履歴を見てみます。M-x magit-statusでmagit-modeのバッファーを表示してlキーを二回叩きます。

magit5

部分変更の記録

論理的に異なる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でステージします。

下の図は、メタ情報の追加をコミットしたあとの状態です。

magit6

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

magit7

変更の取り消し

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

magit8

杉山フルーツの生ゼリーは美味しいんだけど、そこそこの値段がするので、毎回は出せないですね。

コミットを捨てる

index.cssというファイルを作成し、追加してコミットします。

このコミットを捨てたい時には、magit-statusバッファーでxを押すとresetするかどうか聞いてくるのでyをおすだけです。これはお手軽ですね

コミットをやり直す

コミット編集画面をもう一度表示させてC-c C-aでOK

結論

キーバインドは覚えるまで苦労しそうだけど、一度覚えれば忘れなさそうだしmagitをメインに使っていこうかなと。

  • chapter4のgitの操作はほとんどmagitで操作できた
  • キーバインドに慣れればmagitは快適に使えそう
  • 入門Gitは良書

ProductName 入門Git
濱野 純(Junio C Hamano)
秀和システム / 2310円 ( 2009-09-19 )


Remix 2011

ハウス目、商業色もするけど濃過ぎないので良い感じに聴ける

ProductName Remix 2011
Hed Kandi
Hed Kandi / 3005円 ( 2010-12-07 )


ソースコードリーディングにはpycco

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もサポートされる感じなのでそれもちょっとよさげ。

ただ、まだちょっとバグってるので快適とは言いがたいが、楽しみだ。

Rubyスクリプティングテクニック

ちょっと気になった本

ProductName Rubyスクリプティングテクニック ―テスト駆動による日常業務処理術
Brian Marick
オライリー・ジャパン / 2625円 ( 2008-02-23 )


テストファーストっていうところに興味がわいた。Rubyが物足りなければCoffeeScriptでかきなおすのも面白いかなぁと

白隠正宗の桜のラベル

ラベルは華やかで、中身も酸がしっかり効いててうまい。

1333973942

どっしり感はあるが、燗つけてくいくいと。

shizudevつくる会#5をやった

お疲れ様でした。今回はまさかの二人ぼっちだが色々はかどった。自由気ままに作りたいものをつくる他に、簡単なテーマを決めて作るようなトラックを用意すればいいんだろうか?と思ったけど、そうすると誰か面倒見るヒトが必要になるからなぁ。それよりも、終了前30分くらいとって成果の発表をする時間を用意したほうがいいのかなぁ。

お昼はコミュニティfの近所のプレアーテで。

1333875163

@ringtaroBackbone.js触っていて、僕がSpineのコールドリーディングしてたので、二大クライアントMVCフレームワークを極める感じの勢いだったということで。

さて、今までコードリーディングする時はSphinxを使ってたんだけど、doccoっていうツールを知ったので、今回はこっちを使ってみた。

doccoはソースコードに直接コメントを挿入すれば左にコメント、右にソースコードを表示するhtmlを出力してくれるし、コードはハイライトしてくれるし、コメントはmarkdownが使えるので便利だ。一方index.htmlを出力してくれないので、モジュール間の依存関係なんかを綺麗に出力できればいいなぁと。それから更新を自動検出してドキュメントを作りなおす機能と、ローカルサーバーが欲しいかも。

コードリーディングの流れは

  1. githubのコードをフォークする
  2. ローカルにcloneしてソースコードに注釈を入れてく
  3. doccoをはしらせるとdocsというディレクトリが出来てそこにhtmlが出力される
  4. コミットしてプッシュ

って感じで調子良く進む。例えばspine.coffeeだとこのようにコンバートされる。

今日のつくる会ではSpineを読んだ。

昨日はhemを読んだ。

templateのJadeはいいが、d'n'bのJadeもよい

templateのほう

d'n'bのほう

red skyなんか素敵。

ところでpodcastでよく表現されるheavy weightとsickのニュアンスがいまいち掴みきれてない。

今日の畑(120407)

ポットでオクラとゴーヤの種をまいた。

畑ではじゃがいもの芽も出てた。

1333840512

大根の芽も出てた。

1333840514

スナップエンドウの花が咲いてたんだけど、実がついている気配はなかった。雄花、雌花の違いなんだろうか? と思って調べてみたら雄しべ雌しべで雌しべが実になるらしい。

今度きちんと観察してみる。

1333840516

てんとう虫発見。次は娘を連れてこようか。

1333840517

Backbone.jsとSpineの違い

ここのところbackbone.jsを触っていたので、Spineとの違いもなんとなくわかってきた。

todoをcoffeescriptに変換(backbone-todo)したものとspine-todoの違いを比較した。

モデル

backboneのモデルはmodelとcollection(modelの集合)にわかれているが、Spineではこの区別はない。両方いじってみたのでsofの比較がよく理解できた。

class Task extends Spine.Model
  @configure "Task", "name", "done"

  @extend Spine.Model.Local

  @active: ->
    @select (item) -> !item.done

  @done: ->
    @select (item) -> !!item.done

  @destroyDone: ->
    rec.destroy() for rec in @done()

Element patternでいいんじゃないかねという立場かな。

ViewとController

Backbone.jsのviewがSpineのcontrollerになる感じ。SpineのviewはBackboneのテンプレートになる。

Spineはドキュメントが少ないので、もっと充実して欲しいなぁと。

ProductName JavaScript Web Applications
Alex Maccaw
Oreilly & Associates Inc / 3020円 ( 2011-08-30 )