(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

e2wm の気に入っている機能

Emacs 使ってて、この拡張は Anything/Helm と同じくらい僕にとっては必要なものです。

サブウィンドウ的なものの開く位置や大きさを予め設定出来るというだけでもかなり便利なんだけど、僕が一番好きなのはバッファヒストリの一覧(しかも自分で開いたファイルだけのバッファ!!)を表示しておけるのとそれをコマンドでメインのウィンドウにいながらして選択出来ることだったりする。それ以外は僕にとってはあまり必要ないので普段の Emacs はこんな姿になっている。

f:id:ayato0211:20150521182132p:plain

これは StumpWM で画面分割して半分にしてあるから狭く感じるけど、左のバッファヒストリを隠せば優に 120 桁くらいは表示出来るので足りないなんてことはない。行番号とスクロールバーは見てないので消した。モードラインを見れば桁数とパーセンテージが分かるので問題ない。どうしても足りなければ(例えば 2 つのファイルを並べて作業したいとか)画面を最大化するか分割している画面の幅を広げて対処する。

わりとこういう風に設定するの気に入っている。

(use-package e2wm
  :config
  (progn
    (global-set-key (kbd "M-+") 'e2wm:start-management)

    (setq e2wm:c-code-recipe
          '(| (:left-max-size 30)
              history
              (- (:upper-size-ratio 0.8)
                 main sub)))

    (e2wm:add-keymap
     e2wm:pst-minor-mode-keymap
     '(("<s-left>" . e2wm:dp-code)
       ("<s-right>"  . e2wm:dp-two)
       ("<s-up>"    . e2wm:dp-doc)
       ("<s-down>"  . e2wm:dp-dashboard)
       ("C-."       . e2wm:pst-history-forward-command)
       ("C-,"       . e2wm:pst-history-back-command)
       ("prefix L"  . ielm)
       ("C-M-i" . e2wm:dp-code-imenu-toggle-command)
       ("C-M-m" . e2wm:dp-code-main-maximize-toggle-command)
       ("M-m"       . e2wm:pst-window-select-main-command)
       ) e2wm:prefix-key)

    (e2wm:start-management)))

vmware の中で xubuntu を 1920x1080 の解像度に設定する

基本的にデスクトップアプリがよしなにしてくれるケースは、こんなことしなくてもフルスクリーンとかすれば自動的に画面が大きくなるんだけど、そうでないケース(デスクトップアプリ殺したとか)の場合次のような設定をしたほうがいい。

xrandr --newmode "1920x1080"  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync
xrandr --addmode Virtual1 1920x1080
xrandr --output Virtual1 --mode 1920x1080

まぁなんでこんなことしているかというと Xfce なデスクトップとウィンドウマネージャ殺したら、自動的にリサイズしてくれなくなっちゃってデフォルトの設定になかったのでやった。

(println (iterate inc 0)) は何故出力されるのか

質問者の (println (iterate inc 0)) を実行したときの期待値は、何も表示されることなく延々とスタックを貯め続けることだったみたいですが、そうではなくてこのコードは次のように延々と出力していきます。

user=> (println (iterate inc 0))
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 ....................

(iterate inc 0) が無限の正数列を作るのであれば、これは終わるはずのない計算となり出力できないのではないか、というまぁ真っ当なというかいい質問ですね。
回答を読むと Clojurelazy seq を読み込んだ方がいいという風に書いてありますが、簡単に言うと lazy seq は完全にリアライズ*1される前にひとつずつリアライズされていくというようなことが書いてあります。

*1:realize って日本語だとなんと訳すのが妥当なんですかね、実体化?

リロードしたくないファイルをリロードできないようにする

だいたいこういうのをファイルの頭に書けばよいです。

(require '[clojure.tools.namespace.repl :as ns-tools])

(ns-tools/disable-reload!)

ついでに言うと、ネームスペースをリロードしただけでも死ぬことがあるので ns フォームの中で require しないでこれをトップに持っていくのがいいと思っている。

Boot の REPL 上では Clojure の compile 関数は動かない

タイトルまま。
例えばこういう build.boot を書いているとする。

;; build.boot
(set-env! :resource-paths #{"src"}
          :dependencies '[[org.clojure/clojure "1.6.0"]])

さらにこういうファイルを書いているとする。

;; bar.clj
(ns foo.bar)

(gen-class
 :name foo.bar.Baz
 :methods [[piyo [] void]])

(defn -piyo [this]
  (println "Piyo!!"))

そうして REPL を起動して以下を実行する。

boot.user=> (compile 'foo.bar)
CompilerException java.io.IOException: No such file or directory, compiling:(foo/bar.clj:1:1) 

最初何か悪いことしたかなーって思ったけど、そうでもなさそう。ちょっと github の issue で聞いたら「別に aot タスク使えば良くない?」みたいな感じだったのでたぶん boot だと REPL の中で compile 関数は使わない方がいいんだと思う。

boot.user=> (boot (aot :namespace #{'foo.bar}))
boot.user=> (require 'foo.bar :reload)
boot.user=> (.piyo (foo.bar.Baz.))

こうすれば一応実行は出来ますと。ただし、もし bar.clj を修正して aot でリコンパイルしたとしても、残念ながら修正を REPL 上に反映させることができない。

じゃあ、どうしたらいいかというと、以下のように変更監視用の REPL サーバーを設けてあげれば良いですよと。

$ boot watch aot -n foo.bar repl -s wait &

そして REPL クライアントを起動して普通に使えば良いと。

boot.user=> (require 'foo.bar :reload)
boot.user=> (.piyo (foo.bar.Baz.))

こうすれば bar.clj を修正したらそれに自動的に追随してくれるわけですねー。便利。