Re: Outputz を Growl で表示し隊。

エロい人達のコメントを待ってまーす。

http://d.hatena.ne.jp/tomoya/20081216/1229378861

やった。「エロい人」なら答えられる :)

outputz.el に手を入れないで、同じようなことをするコードを書いてみました。

(when (executable-find "growlnotify")
  (add-hook 'outputz-mode-hook
            (lambda ()
              (set (make-local-variable 'outputz-latest-count) 0)))

  (defun growlnotify (str)
    (shell-command (format "growlnotify -m %s" str)))

  (defun growlnotify-outputz (&optional count)
    (interactive)
    (growlnotify (format "Emacs: You are %s bytes Outputz!!!!!!"
                         (or count
                             outputz-latest-count))))

  (defadvice outputz-post (after
                           growl-outputz (count)
                           activate)
    (growlnotify-outputz (setq outputz-latest-count count))))

いろいろやってます。

executable-find

まず executable-find で growlnotify を探します。見付かったら...

outputz-latest-count

バッファローカル変数 outputz-latest-count を定義するよう定義。初期値は 0 にしておきます。

growlnotify

関数 growlnotify を定義。
growlnotify(1) の、ごく単純なラッパです。

growlnotify-outputz

関数 growlnotify-outputz を定義。

  • 引数 count が渡されたらその数値を
  • 渡されなかったら outputz-latest-count を

format して growlnotify に渡します。

growl-outputz

みんな大好き defadvice. outputz-post に対し アドバイス growl-outputz を定義します。

outputz-post が呼ばれた後 growlnotify-outputz へ数値を渡します。

  • outputz-post に渡ってきた count を再利用して渡しています。
  • ついでに outputz-latest-count へ count の値を束縛した返り値を束縛しています。*1

ところでぼくは chord を導入していないので試していませんが、 id:tomoya さんのこれもそのまま動くはず……です。

(key-chord-define-global "op" 'growlnotify-outputz)
http://d.hatena.ne.jp/tomoya/20081216/1229378861


というわけで今回も defadvice の布教でした。

既存のコードをに手を加えずに機能を追加できるのって素敵ですね :)

*1: そう setq は束縛した値を返すのです ;)

制御文字のエスケープ

例によって、コピペする場合は

^[

のところが制御文字ですので、viの場合 Ctrl v + Esc で入力しなおしてください。

http://d.hatena.ne.jp/rsyudo/20070405/p1

ESC を \033 や \e と表記すると、そのままコピーできるようになりますよ。

chpwd () { echo -n "^[_`dirs`^[\\" }
chpwd () { echo -n "\033_`dirs`^[\\" }
chpwd () { echo -n "\e_`dirs`^[\\" }

余談

この「preexec を利用したステータスラインの変更」の初出記事(の筈)が、当時とは別の URL で復活していましたので、紹介をば :)

*Article*

今月 8 日より feed 配信も開始されたそうです。 Subscribe now!

Goodby, procmail. Hello, scmail.

長年お世話になった procmail を捨てて、scmail に移行しました。

scmail は Scheme で書かれていて、ルールも Scheme で書ける素敵な MDA です。

lambda and or regexp を並べていくだけなので非常に直感的。[作者の高林さんによる素晴しい紹介/説明ページもあります。

(add-filter-rule!
 (lambda (mail)
   (or
    (and (mail  'from      "bank.example.com")
	 (mail  'subject   "ATM")
	 (refile mail      ".notifications.example-bank"))

    (and (mail  'from      "no-reply@exmaple.com")
	 (mail  'subject   "購読対象")
	 (refile mail      ".notifications.microblog")))))

こんなに快適だったなんて……もっとはやく移行してしまえば良かったです ;)

もちろん「From: に "string" が含まれるだけ」などの単一条件なら lambda 不要。

(add-filter-rule!
 '(from
   ("foryou@amazon.co.jp"  ".newsletters.amazon")
   ("new-music.itunes.com" ".newsletters.apple.itunes")
   ("ana.co.jp"            ".newsletters.ana")
   ("news@twitter.com"     ".newsletters.twitter")))

複数箇所に現れる文字列は define してしまいましょう。今後の変更も楽々です。*1

(define elim/cell "elim@mobile.example.com")
(add-filter-rule!
 ;;
 ;; Cell phone.
 ;;
 (lambda (mail)
   (and (or (mail 'to   elim/cell)
	    (mail 'from elim/cell))
	(refile mail ".cell-phone.elim"))))

当然 regexp で match した個所を取り出してフォルダ名を作ることもできます。

 ;;
 ;; Refile a mail from a mailing list according to List-Id header.
 ;; e.g. "List-Id: <ml.example.jp>" => "ml/ml.example.jp"
 ;;
 '(list-id
   (#/<([-.\w]+)>/  "ml/\\1"))
http://0xcc.net/scmail/

procmail の複雑怪奇なルールに疲れた方、一度 scmail を試されてはいかがでしょうか。

*1:もしかして procmail でもできたのかな。調べる気がしませんでしたが :)

re: add-hook 疑問

mode解除時に特定の処理をする,というのは書けるんだろうか.要調査.

http://d.hatena.ne.jp/yaotti/20081104/1225812059

lisp/view.el を読んだ*1ところ、view-mode-enable には hook を提供しているのに view-mode-disable には hook を提供していないようですね。

そういう時は advice を定義しましょう :)

(defadvice view-mode-disable (after
			      hl-line-mode-disable
			      activate)
  (hl-line-mode -1))

advice は関数の実行前(before)、実行後(after)、そして実行全体を包んで(around)任意の S 式を実行してくれる素敵な機能です。

たとえば上記のように記述すると view-mode-disable 実行後に (hl-line-mode -1) を実行してくれるようになる訳ですね。

なお関数が本来定義された動作以外の事を行うようになる訳ですから、濫用には十分ご注意ください ;)

*1:[http://cvs.savannah.gnu.org/viewvc/emacs/lisp/view.el?root=emacs&view=markup&pathrev=EMACS_22_BASE:title]

Jackalope

JauntyJackalope - Ubuntu Wiki

jack・a・lope[ dklup ]

[名]( (米) )ジャッカロープ:ジャックウサギとレイヨウ(antelope)との交配種とされる架空の動物.

http://dic.yahoo.co.jp/dsearch?p=jackalope&dtype=1&index=03874600

ふーむ、次期 Ubuntu は UMA なんですね。

http://upload.wikimedia.org/wikipedia/commons/e/e0/Animalia_Qvadrvpedia_et_Reptilia_(Terra)_Plate_XLVII.jpg:image:w233,h195
Jackalope - Wikipedia, the free encyclopedia

なぜわざわざまだ実在を確認されていない*1 *2動物にしたのか調べたところ、実に格好良い告知がされていました。

Introducing the Jaunty Jackalope

Jaunty Jackalope にはいくつかの目標があって、それぞれを以下のようになぞらえているそうな。

  • Jackalope のそのすばしっこさを
    • 起動/再開の速さに。
  • Jackalope の見た目の曖昧さ(ウサギなの?シカなの?)を
    • Web Application と Desktop Application の境目のない様に。
  • Jackalope のその奇妙な角の展開を
    • 分散リビジョン管理システムの採用に。

なかなか意欲的な命名のようです。これからの Ubuntu もたのしみですね :)

追記

一ヶ月以上前に日本語の紹介記事が出ていました。

「Ubuntu 9.04」の詳細が明らかに--開発コード名は「Jaunty Jackalope」 - CNET Japan

*1:信条上 UMA を「実在しない」や「架空」と表現することはできません :)

*2:ウサギ乳頭腫ウイルスに罹病したウサギの事じゃないかという説もあり

gist.rb

gist/gist.rb at 753c59bf3042933074697e1f94b2d5a8b8c3050d · elim/gist · GitHub

もとはこれ。 defunkt/gist · GitHub

何ができるかといえば。

  • 標準入力を gist に入れる
  • 数値の引数を与えると当該番号の gist を標準出力に吐く

id:dzfl が...

  • もとの gist.rb は git config --global github.token の出力を読み込む設計。
  • git config --global の情報は ~/.gitconfig に書かれている。
  • id:dzfl は ~/.gitconfig を公開リポジトリで管理している。
  • だから ~/.gitconfig に token 書きたくない。
  • なんとかして。

というので、fork して弄ってみました。

主立った変更点は...

pit からも token を取れるように

  • --pit
  • ~/.gitconfig に token を書かずに済むようになりました。

optperse を採用

  • ARGV.first 決め打ちのままだと拡張し辛かったので。

匿名での投稿を明示できるように

  • --anonymous
  • .gitconfig 編集も pit 編集も面倒な時に。

実装をモジュールからクラスへ

  • 趣味です。
  • これで require して使う事もできるようになりました*1

各種整理

  • 機能の整理
    • 初期化(Gist#initialize), 読み込み(Gist#read), 書き出し(Gist#write) 以外は外から隠す。
    • 更に ./gist 時にしか使わないコードは if $0 == __FILE__ ... 以降へ追い出し。
    • その中のクリップボード操作を、実行ファイル探すメソッドと、それを呼び出すメソッドに分離したり。

以上です。

case ... end の直後に || を置けるなんて、Ruby は本当に気持ち良いですね*2

皆様も快適な gist 生活を。

追記

ライセンスが明示されていなかったようなので作者の Chris Wanstrath さんにメールで問い合わせています。

追記の追記

何かライセンスに言及した記事でもないかと Chris Wanstrath さんの blog を読みにいきましたところ...

a dude who lives in san francisco, works on github,and pontificates at err the blog.

http://ozmm.org/

...works on github??

慌てて Google で検索実行。

GitHubの開発者のひとりであるChris Wanstrath

http://www.infoq.com/jp/news/2008/03/github-git-repository-hosting

...そういうことははやくいって >_<.

追記の追記の追記

もう返信がきました! メールを出してから 1 時間と経ってない!!

意訳(?)すると

「MIT だよ! 今日ライセンス追加するよ!」

ですって。実際追加になっていました gist/LICENSE at 04e54f8d18101dd8306d121f505882db109b08b1 · defunkt/gist · GitHub

defunkt++ !!

*1:誰がそんな使い方するというのか

*2:読み手のことも考えるとお薦めできませんが ;)

cmd.exe による擬似 touch(1)

人様の計算機での話です。

保存時に mtime を編集前の時刻まで戻してしまうエディタがありまして、TortoiseSVN が変更を検出してくれず困っておりました。

Unix なら touch(1) してしまえば良いのですが、そこは素の Windows. そのようなコマンドは用意されておりません。

なにか解法はないかと Google でお伺いをたててたところ、以下の方法で空ファイルを作成できることがわかりました。

The solution to this delimia was to use the following dos command which will create an empty file:

copy /y nul file.txt
http://brett.batie.com/dosshell/touch-with-dos-commands/

これを応用して、以下のようにすることで mtime の変更(の様なこと)を行う事ができるようになりました。

copy /b /y nul + target.ext target.orig.ext
move /y target.orig.ext target.ext

本物の touch(1) には遠く及びませんが、よくある作業はこれで行えるかと。

難点を挙げれば、一度 copy しているのでその時間と容量が必要なことでしょうか。

通りすがりさんから簡便な方法を教えていただきました。 ありがとうございます :)

タイムスタンプのみ変更なら↓で十分では?

copy ファイル名 +

or

copy ファイル名+
http://d.hatena.ne.jp/elim/20081028/1225211305#c1227881513

擬似 sleep(1)

よく知られている技術ですが、localhost に対し回数を指定して ping を実行することで sleep(1) 代わりにすることができます。思い出したのでついでに書いておきます。

ping -n 10 localhost > nul