FlymakeのエラーメッセージをGrowlで通知する

Emacs Advent Calendar jp:2010 26日目。ウソです。

宗教上の理由により参加は見合わせました。

flymake便利

最近、C/C++を書くようになって文法チェックにFlymakeを活用しております。エラーがあったら激しく自己主張するので大変便利なんですが、 そのエラーメッセージを確かめようと思ったらマウスカーソルをエラー箇所に持っていかないといけなかったりするところはストレスです。

ミニバッファに表示したりpopup.elを使ったりする方法もあるみたいですけど、 エラーの原因が別ファイルにあった時に参照できないと困るので常にエラーメッセージを見れるようにしておきたいです。できるだけ邪魔にならない位置で。

よろしい、ならばGrowlだ。

Growlでエラー内容を通知

.emacsに下のコードを追加すればエラーのたんびにgrowlで通知されます。 stickyを有効にすると通知は消えないので、エラーメッセージを見ながら別ファイルを編集することができます。

https://gist.github.com/754920/

Flymake-growl

速さが足りない

growlnotifyコマンドにはstickyオプションをつけた通知を消す方法が直接クリックして閉じる以外用意されてないようです。 そこで、エラーが解消されたらstickyオプション無しで再度同じ通知を行なって消えるのを待つ方法を取ってます。

消えるのに時間がかかってしまいますが、こればっかりはどうしようもない感じ。

当初の目的は実現できてるのでいいか。

今年も終わりですね

今年もほぼ毎日Emacsを触って過ごしましたが、来年もEmacsをもっと快適にすべくガンガンいじり倒そうと思います。

よいお年を!

Blasphemy

 

EmacsでHit a Hint(改)

id:tm8stさんの素敵なelisp、yafastnav.el を参考に日頃愛用しているvimperatorのhit a hintに近づけたものを作ってみました。

yafastnav.elと違う所は

  • オーバーレイは文字に被せる
  • 移動に使うキーはアルファベットのみ
  • 候補が多い場合は複数のキーを使って絞り込む
  • 分割した別ウィンドウにもジャンプできる

などです。

改造しているうちに元コードから大きく変わってしまったのでイチから作ったんですが別ものとして公開して大丈夫でしょうか。

ソースコード github.com/kawaguchi/jaunte.el

ちなみに名前は小説「虎よ、虎よ!」から取りました。 ジョウント - Wikipedia

 

スクリーンショット

2010-10-01-01

カーソルが表示されてませんが、上ウィンドウにあります。

2010-10-01-02
"C-c C-j" で全てのウィンドウにヒントが表示されます。

2010-10-01-03
まず"k"を押すと前方一致で絞り込まれ

2010-10-01-04
続けて"b"を押すと"kb"と表示されていた場所にウィンドウを跨いで移動できます。

 

 

 

Cocoa Emacs-HEAD + DDSKKをインストール

homebrewに含まれているemacs用のformulaファイルは以下のコマンドでHEADをインストールできるようになってます。 すごい便利。

$ brew install emacs --cocoa --HEAD --use-git-head

アップデートは —force オプションをつければいいみたい。

あとはskkを使うために必要なapelとddskkをインストールする

ふたつのファイルを/usr/local/Library/Formulaに置いて

$ brew install ddskk

でskkが使えるようになります。

HEADはしょっちゅうフリーズしたり日本語フォントが豆腐になったりしてますが、追っかけ楽しいです ;)

第45回 Ruby/Rails勉強会@関西に行ってきました

日本Rubyの会 公式Wiki – 第45回 Ruby/Rails勉強会@関西

約1年ぶり2回目の参加です。行きは暑さで汗だくになり、帰りは夕立でズブ濡れになる素敵な一日でした。

RubyでFM音源を鳴らそう

今回の勉強会参加のお目当て。DXなんちゃらってヤマハのFMシンセが実家にあったなー。

FM音源は音の波形を数学的に作り出すので、PCM音源に比べてメモリに優しい音源。

気になってた音が出る仕組みについては、Rubyで作った音の波をwaveファイルに書き出して再生されているようでした。

PCM音源もメモリに乗せた音のサンプルファイルを鳴らすので、ソフトウェアで音を鳴らすにはファイルを再生する方式が主流?

なんとなく仕組みがわかったことで、CUIで操作するプリミティブなソフトウェアシンセを作りたくなりました。

デバッガでデバッグしない

コードリーディングにデバッガを使うというのは目鱗でした。思えばコード読むとき脳内で同じようなことしてた。

Emacsのmulti-term上でrdebugを試してたんですが、ステップ実行中に該当ファイルを別ウィンドウに開いてくれてフリンジに印までついて超便利でした。

これからバリバリ活用しよう。

NoSQL をRubyで実践するための n個 の方法

RubyでMongoDBを使う方法。MongoDBのMongoとは「huMONGOus」らしいです。マッドマックスなDBですね。

何を勘違いしてたのか、KVSやNoSQLってメモリ上で扱うものだとばかり思ってました。

調べたところ永続化もできるようです。この分野の勉強を怠ってたことを激しく後悔。

Ruby初心者向けレッスン -イテレータを使う –

Array, Hash, Range等数え上げることができるオブジェクトに使えるイテレータについて。

Rubyでは、繰り返しはすべてイテレータで済ますのでforは使わないですよね。

ちなみに好きなイテレータはmapです。使い分ける派。

[1,2,3,4,5].map(&:to_s)
 users.collect(&:name)

練習問題があり、おさらいができて楽しめました。

自分の回答は以下

2-1

nまでの階乗を求める方法。

(1..n).inject(:*)

いろんなLisp本でやったせいか階乗=再帰で解くものと考えてしまいましたが、Rubyではかなり単純化できますね。

2-2

アラビア数字がkey,漢数字がvalueなハッシュをつくる。

numbers = "零 一 二 三 四 五 六 七 八 九 十 十一 十二 十三 十四 十五"
Hash[numbers.split.each_with_index.map(&:reverse)]

最近、Rubyのメーリングリストで見かけたHashの生成方法を応用。

回答例でも似たようなものが紹介されていました。

2-3

シンボルの配列を文字列化してキャピタライズ化してソート。

syms = [:tokyo, :kyoto, :osaka, :kobe, :matsue, :sendai]
syms.map(&:to_s).map(&:capitalize).sort

できるだけブロックを使わないのが俺のジャスティス。

2-4

二重階乗を求めるメソッド。

def doublefactorial(n)
  (1..n).select(&(n.odd? ? :odd? : :even?)).inject(:*)
end

三項演算子を使って短く美しく。

2-5

「エラトステネスのふるい」を使って2からnまでの素数を求めるメソッド。

def sieve_of_eratosthenes(n)
  result = []
  (2..n).each do |n|
    unless result.any?{|x| n % x == 0 }
      result << n
    end
  end

  result
end

「エラトステネスのふるい」がわからなかったのでwikipediaのページを斜め読み。

期待する素数の配列は求められますが、篩えてないし計算量が多すぎですね。

2-6

二項分布を生成するメソッド。

SICPで似たような問題をやった気がしたけど、時間切れ。

新発見もあり有意義な勉強会でした。運営の皆様、他の参加者の皆様お疲れ様でした。

Railsコントローラーのスペックをリファクタリングしてみる

リファクタリングRubyエディション読んで、重複コードを見る度に感じるモヤモヤ感との絶縁を決意しました。

まず手を付けたのが、Railsのユーザー認証によって動作を振り分けるコントローラーのスペック。

describe ItemsController do
  describe "GET 'show'" do
    context "管理者としてログインしている時" do
      before do
        login_as(mock(:admin? => true))
      end

      ...
    end

    context "一般ユーザーとしてログインしている時" do
      before do
        login_as(mock(:admin? => false))
      end

      ...
    end

    context "ログインしていない時" do
      before do
        logout
      end

      ...
    end
  end

  describe "GET 'edit'" do
    context "管理者としてログインしている時" do
      before do
        login_as(mock(:admin? => true))
      end

      ...
    end

    context "一般ユーザーとしてログインしている時" do
      before do
        login_as(mock(:admin? => false))
      end

      ...
    end

    context "ログインしていない時" do
      before do
        logout
      end

    ...
    end
  end

  ...
end

何度もでてくるcontextと説明文がイモい。マクロを使うと

describe ItemsController do
  describe "GET 'show'" do
    when_logged_in_as(:admin, :admin? => true) do
      ...
    end

    when_logged_in_as(:user, :admin? => false) do
      ...
    end

    when_logged_out do
      ...
    end
  end

  describe "GET 'edit'" do
    when_logged_in_as(:admin, :admin? => true) do
      ...
    end

    when_logged_in_as(:user, :admin? => false) do
      ...
    end

    when_logged_out do
      ...
    end
  end

  ...
end

だいぶすっきり見えます。 マクロの実装はこんな感じに書いてspec/supportに置いてます。

単純に「ログインしてなかったらリダイレクト」とかは it_should_require_login のようなマクロにまとめてます。

リファクタリングやってて感じたのは、テストがシンプルだと実装もシンプルで見通しがよくなること。 特にコントローラーのスペックはmock/stubで済ませようとすると面倒な仕事はモデル側にまとめざるを得ないで、結果コードが簡潔になってよいです。 よく言われていることだろうけど、実際やって初めて実感。つい実装から先に書いちゃったりしてましたが、感覚を掴んだこれからはTDD/BDDが定着させたい。 スペックがすっきりすれば実装側のリファクタリングも楽しくできそうです。

しかし、あまりリファクタリングに時間取られるのも本末転倒なので、何事もやり過ぎ注意。

S式でHTMLを書く

HTMLを書く際は多くの人が使ってるであろうzen-codingですが、あんまり馴染めませんでした。直感的でないからかな?
けど、展 開するアイデアはありだなと思い、S式をHTMLに変換するEmacs Lispを書きました。

http://github.com/kawaguchi/stag.el

_ の位置で C-c C-e を押すと

このように変換されます。

zen-coding みたいに効率がよくなるわけではありません。
S式と戯れてたいだけなんです。

paredit-modeと併せて使うとタイプ数は減りますが、変態オンリーな感じ。

S式の外に出ないと変換できなかったり、sgml-modeだとS式をインデントしなかったり、改善したいとこ多数なのでちょいちょいいぢっていき ます。