Hatena::ブログ(Diary)

mizchi log

@mizchiの雑記帳

2012-04-26

Mac/emacsでHaskell環境を作る


最近会社でHaskell書くタスクがあがってきたので環境を作っていた。
最近sublimtext2ばかり使っていたのだが、haskellはかなり文法がかなり厳密な言語なのでflymake(シンタックスチェッカ)がないと辛い

Haskellのインストール


最近のMac(Lion)は標準だとllvmでないgccは持ってないので以下のリンクからDLしてくる
https://github.com/kennethreitz/osx-gcc-installer
LLVMに対応していないので、Macデフォルトのgcc(llvm-gcc)は使えない

Haskellのバイナリをもらってくる
http://hackage.haskell.org/platform/
Homebrewにもあるが、自前のビルドはかなり時間がかかる

Haskellのパッケージマネージャのcabalは /Developer/usr/bin/gcc を見ようとするのだが、Lion以降のMacは/Developer廃止されてるので、適当にaliasだけ作っておく

$ sudo mkdir -p /Developer/usr/bin
$ sudo ln -s /usr/bin/gcc-4.2 /Developer/usr/bin/gcc


cabal で hlint いれておく。よりよいメソッドの提案などをしてくれる。

$ cabal install happy
$ cabal install haskell-src-exts
$ cabal install hlint

hlint かなり賢いので困ったら頼るといい

Haskell-mode

最近はすべてel-getで管理するようにしている。
dimitri/el-get https://github.com/dimitri/el-get

(あとでel-getについてもまとめた記事を書きたい)

とりあえず実行してみる


ghciでREPL起動

$ ghci
GHCi, version 7.0.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> print $ 3 * 7
21
Prelude>

Hello.hs

putStrLn "Hello, Haskell"

runhaskellで実行

$ runhaskell Hello
Hello, Haskell

emacs


主にflymakeの設定

(el-get-install "haskell") ;call once
(load "~/.emacs.d/el-get/haskell-mode/haskell-site-file")

(require 'flymake)
(global-set-key (kbd "M-n") 'flymake-goto-next-error)
(global-set-key (kbd "M-N") 'flymake-goto-prev-error)

(defun flymake-Haskell-init ()
  (flymake-simple-make-init-impl
   'flymake-create-temp-with-folder-structure nil nil
   (file-name-nondirectory buffer-file-name)
   'flymake-get-Haskell-cmdline))
(defun flymake-get-Haskell-cmdline (source base-dir)
  (list "ghc"
        (list "--make" "-fbyte-code"
              (concat "-i"base-dir)
              source)))
(defvar multiline-flymake-mode nil)
(defvar flymake-split-output-multiline nil)
(defadvice flymake-split-output
  (around flymake-split-output-multiline activate protect)
  (if multiline-flymake-mode
      (let ((flymake-split-output-multiline t))
        ad-do-it)
    ad-do-it))
(defadvice flymake-split-string
  (before flymake-split-string-multiline activate)
  (when flymake-split-output-multiline
    (ad-set-arg 1 "^\\s *$")))
(add-hook
 'haskell-mode-hook
 '(lambda ()
    (add-to-list 'flymake-allowed-file-name-masks
                 '("\\.l?hs$" flymake-Haskell-init flymake-simple-java-cleanup))
    (add-to-list 'flymake-err-line-patterns
                 '("^\\(.+\\.l?hs\\):\\([0-9]+\\):\\([0-9]+\\):\\(\\(?:.\\|\\W\\)+\\)"
                   1 2 3 4))
    (set (make-local-variable 'multiline-flymake-mode) t)
    (if (not (null buffer-file-name)) (flymake-mode))
    ))

わざとシンタックスエラーを起こしてflymake-goto-next-errorするとこうなる

f:id:mizchi:20120426125635p:image

これでストレスなくなりました

2011-11-20

MacBook Air にいれてるアプリ 11/20


旧・Macの手書き説明書 - FC2 BLOG パスワード認証
読んでたら書きたくなった。環境構築厨として。

アプリのリンクやスクショ貼るのめんどかったので、ぐぐってください。

ターミナルでできることはターミナルでやる派なので、最近はアプリ減りました。
Dock表示しないし、デスクトップに何も置かない。極力マウスを使わない、そんな設定。キーバインドがないアプリは問答無用でクソ。

Google日本語入力

IMEことえりでは人間が死ぬ。

YoruFukurou

Twitterクライアント。Macだと他が霞んで見える使いやすさ。

Limechat for Mac

IRCクライアント

NNDD

ニコ動ビュワー + ダウンローダ。画面サイズを調整できるのが良い。
要: 最近アップデートがうざいAdobeAir

Growl

アップデートでめんどくさかったから350円の有料版買ったら、色々動かなくなって後悔した。それでもないと死ぬ。

Namely

シンプルなアプリランチャ。/Applications以下から補完する。それだけ。
QuickSilverは大仰すぎた。

AppCleaner

アンインストーラ。~/Library/Application Supports/のリソースも消してくれる。

GeekTool

一秒リフレッシュでデスクトップにtopコマンドを貼ってる。
アクティビティモニタの代用。

TotalTerminal

開発用。
SIMBL不要でViser的なことができる。この前までiTerm2使ってたのだけど、xterm-256でvimのカラースキームが使いたかっただけなので、Lionでデフォルトとなった現在iTerm2はいらないかな、という認識。画面分割はtmuxでやる。

ブラウザ

本当はFirefoxを使いたいのだけど、あのリリーススケジュールだと動くものも動かない。メモリ食いつぶす問題が収まって安定するまでは、Chromeを使うことにした。

Chromium

ChromeのOSS開発版。たしか何かの最新API使いたくて入れたのだが、その後も人柱し続けている。verによっては突然日本語入力できなくったりするが(コミットログみてるとあるモジュールが定期的に消されては復活している。英語圏…)、普通の人は普通にChrome使うのがいいと思う。

ViChrome

Vim風キーバインドを提供してくれるものでは一番

FullFeed for Chrome

グリモン。LDR用。

LDR open in background tab

グリモン。LDR用。

JSON View

開発用。JSONのAPI叩いたときに見やすく整形してくれる

Autopegerize

いわずもがな。

はてブ拡張

いわずがな。

共有

iCloudの余りのクソさに憤慨。というか僕は主に共有先がMacじゃないので…

Dropbox

主にunix設定ファイルだとか、軽いスニペットのドキュメントを置いている。色々ドキュメントソフトあるけど、好きなエディタで好きなファイルぶん投げればそれで十分な気がする。自炊した本を置くには、ちょっと容量足りない。

色々キャンペーンこなして3.5GBにはなってるのだけど、昔VM用Ubuntuの仮想イメージ置いて複数台から参照してたらぶっ壊れたので(当然だが…)、そういうのはやめようと思った。

Pogoplug

アプリで完結するものではないのだけど、Pogoplugに差した家のHDDにアクセスできる。LAN内ならローカル参照と同じ速度でるので2GB x2差してる。自宅クラウドで4GB。
MBPは容量少ないので、~/Downloadsを定期的にぶん投げて、気が向いたときに整理するようにしている。

エディタ

学習コストを無視していろんなエディタをいじりまくった結果、最近はエディタをいじって解決するのではなくて、プラギンごとに得手不得手があるならエディタごと切り替えれば良い、という考えになった。
なんでも一つのでエディタでという思想は、EmacsのNavi2chが他バッファ巻き込んで落ちたときに捨てた。

CocoaEmacs

MacVim

Sublime Text2


共通点としてはどれもVimキーバインドとして設定してあること。Vimはいわずもがな、Emacsはvimpulse-mode、SublimeText2はvintage。スニペットはDropbox上にある。
ところでWebStorm気になるんだけどCoffeeScriptでのJS補完が動いたら使ってみたい。高い。

2011-11-18

Homebrewでnode v0.6.1いれるとセグフォったので戻した


僕は面倒くさがりなのでnodeをMacのhomebrewで管理してるのですが...
日課のようなコマンド

sudo brew update
sudo brew install node

この node , require するとセグフォします。


no title

Issac : Reinstall node from source. Note that the homebrew recipe is broken.


はい

解決法
no title
う、長い…


とりあえず戻そうとした
Homebrewでバージョンを指定したい。 » サイキョウライン

gitのログコメントみて、バージョンが上がる前のリビジョンに巻き戻してインストールするんですって。


え、そんなめんどくさいことやるの

mizchi-mba:mzi%[/usr/local] brew versions node
0.6.1    git checkout b6eb4fc Library/Formula/node.rb
0.6.0    git checkout 6bec7fc Library/Formula/node.rb
0.4.12   git checkout 3eea412 Library/Formula/node.rb
0.4.11   git checkout b6aa338 Library/Formula/node.rb
0.4.10   git checkout 523d360 Library/Formula/node.rb
0.4.9    git checkout 10b3ded Library/Formula/node.rb
0.4.8    git checkout 8d45d93 Library/Formula/node.rb
0.4.7    git checkout cb6a4b4 Library/Formula/node.rb
....


0.4.12がコミットされた3eea412まで戻す

$sudo brew uninstall -f node
$cd /usr/local
$sudo git checkout -b node-0.4
$git reset 3eea412
$sudo brew intall node
$node -v 
 0.4.12
$sudo git checkout master


cluster使いたかっただけなので、そこまで困ってないので誰かがパチあてるまでこのまま待ちます…

naveもビルド失敗するんだよなー
LL言語しか使えずC++というかネイティブ周りに疎いとこういう悲しみに包まれます