http://rubikitch.com/に移転しました このページをアンテナに追加 RSSフィード

2014-06-27

[][]Emacs×Ruby - PryをEmacsで使ってみる

Pry = IRB.succ

今回は久々にRubyEmacsなお話です。

あなたRubyプログラミング試行錯誤するときに

どういうツールを使っていますか?

irb

xmp(rcodetools)?

irbRubyインストールしたときに

昔からついてくる対話Rubyです。

シェルインターフェースRubyの式を

書いたら評価結果を表示してくれます。

その進化形がPryです。

で、pryとは何かというと、

『Pry = IRB + Shell + Ruby Shell + Debugger』

といった感じです。

Emacs世界にあるeshellは

『Eshell = IELM + Shell + Emacs Lisp Shell』

なので、pryはRuby界のeshellみたいなものと

思っていただければよいです。

$ sudo gem install pry pry-nav

インストールしてください。

Emacsで使う準備

pryはEmacsから使えます。

Rubyのパッケージには、ruby-mode.elなどのelisp

含まれていますが、古いのでMELPAのものを使います。

昔からEmacsirbを使うにはinf-ruby.elを使うのですが、

MELPA版のinf-ruby.elはpryにも対応しています。

M-x package-refresh-contents

M-x package-install inf-ruby

そして、以下の設定をしてください。

==== pry-init.el

(require 'inf-ruby)

(setq inf-ruby-default-implementation "pry")

(setq inf-ruby-eval-binding "Pry.toplevel_binding")

;; riなどのエスケープシーケンスを処理し、色付けする

(add-hook 'inf-ruby-mode-hook 'ansi-color-for-comint-mode-on)

Emacsと併用するのでpryの設定ファイルである

.pryrcでemacsclientをエディタに設定してください。

==== ~/.pryrc

Pry.config.editor = "emacsclient"

続きはメルマガ

EmacsでPryを使うのは楽しいものです。

続きは明日のメルマガでお話します。お楽しみに!

http://www.mag2.com/m/0001373131.html

2010-11-07

[][]org-mode→HTML変換をする3つの方法

org-modeはHTMLを生成するツールになる

久々に、みんな大好きorg-modeのお話です。 orgファイルからHTMLに変換する方法を紹介します。

org-modeは、いろいろな機能を持っています。 事実上Emacsの多機能ワープロという位置付けです。 拙著Emacsテクニックバイブル 〜作業効率をカイゼンする200の技〜』 でも1章をまるごとorg-modeに費やすほどです。

org-modeテキストは、読み書きしやすいという特徴があります。 なんといっても、アウトラインから文章を作成することができます。 見出しリストが簡単に記述できるのが嬉しいです。

アウトラインを考えて文章を書くと、よい文章が書けるようになります。 アウトラインの重要性は 『文章術』という本 でも言われています。 そして、アウトラインから直接文章作成できるのがorg-modeです。 よって、org-modeはよい文章を書くためのギプスと言えることでしょう。

org-modeは、いろいろなフォーマットに変換できます。 最も変換するであろうフォーマットはおそらくHTMLです。 ここではorgファイルからHTMLに変換する3つの方法を紹介します。

Emacsの中でorg→HTML変換する

Emacsの中でorgファイルからHTMLに変換するのは簡単です。 C-c C-e (org-export)で、以下のように変換メニューが出てくるので、選択すれば対応するフォーマットに出力してくれます。

[t]   insert the export option template
[v]   limit export to visible part of outline tree
[1]   only export the current subtree
[SPC] publish enclosing subtree (with LaTeX_CLASS or EXPORT_FILE_NAME prop)

[a/n/u] export as ASCII/Latin-1/UTF-8         [A/N/U] to temporary buffer

[h] export as HTML      [H] to temporary buffer   [R] export region
[b] export as HTML and open in browser

[l] export as LaTeX     [L] to temporary buffer
[p] export as LaTeX and process to PDF            [d] ... and open PDF file

[D] export as DocBook   [V] export as DocBook, process to PDF, and open

[j] export as TaskJuggler                         [J] ... and open

[m] export as Freemind mind map
[x] export as XOXO
[g] export using Wes Hardaker's generic exporter

[i] export current file as iCalendar file
[I] export all agenda files as iCalendar files   [c] ...as one combined file

[F] publish current file          [P] publish current project
[X] publish a project...          [E] publish every projects

HTMLに変換するには[h]または[b]を選びます。 つまり、C-c C-e hでHTMLに変換できます。 C-c C-e bは変換後、結果をブラウザで見ることができます。

transient-mark-modeでリージョンが指定してある場合は、その部分のみ変換します。 全体を変換したいのではなく、特定の部位の変換結果のみを見たい場合に便利です。

しかし、変換処理はとても遅く、変換中は待たされる欠点があります。 大きい文章の変換にはかなり待たされます。 そこで、Emacsの中でもバックグラウンドで変換できるようにする設定があります。 デフォルトでは無効なので、以下の行を.emacsに加えます。

(setq org-export-run-in-background t)

一方、これを有効にすれば、C-c C-e bでブラウザを呼び出してくれなくなる欠点があります。 変換対象が小さいorgファイル中心ならば、上の設定はおすすめできません。 大きいorgファイルに対してのみファイルローカル変数で有効にするべきです。 それには、orgファイルの先頭に上の行を加えます。

# -*- org-export-run-in-background: t -*-

実際、『Emacsテクニックバイブル 〜作業効率をカイゼンする200の技〜』の原稿は1つのorgファイルでした。 上記の方法でHTMLに変換して編集者に提出しました。

コマンドラインでorg→HTML変換する

Emacsの中で変換して、ブラウザで見るのはほとんどのケースで便利です。 しかし、それでは不十分なケースもあります。 たとえば、複数のファイルを変換するなら一括でやりたいものです。 変換したHTMLに対してさらになんらかの処理する場合もあります。

そこで、コマンドラインからorg→HTML変換したくなります。 これには、バッチモードでorg-export-as-html-batchを呼び出します。 バッチモードとは、Emacsの画面を表示せず、Emacs Lispで処理し終わるとすぐにEmacsを終了させるモードです。

バッチモードはコマンドラインがとても長くなるのでシェルスクリプトを作成しました。 ダウンロードしたら、場合に応じてスクリプトを修正します。 もちろんPATHの通ったディレクトリに置いて実行許可を付けておいてください。

org2html-batchスクリプト

org2html-batchの引数に1つ以上のorgファイルを指定します。 orgファイルと同じディレクトリHTMLが生成されます。

デフォルトでは~/.org2html-batch.elカスタマイズできるようにしています。 処理直前に読み込むので適当にオプション変数を指定しておけばよいです。

$ org2html-batch /tmp/a.org
OVERVIEW
Exporting...
org-babel-exp processing...
Position saved to mark ring, go back with C-c &.
Fontifying  *temp*...
Fontifying  *temp*... (syntactically...)
Fontifying  *temp*... (regexps...)
Fontifying  *temp*... (regexps....)
Fontifying  *temp*... (regexps.....)
Fontifying  *temp*... (regexps......)
Fontifying  *temp*... (regexps.......)
Fontifying  *temp*... (regexps........)
Fontifying  *temp*... (regexps.........)
Fontifying  *temp*... (regexps..........)
Fontifying  *temp*... (regexps...........)
Fontifying  *temp*... (regexps............)
Fontifying  *temp*... (regexps.............)
Fontifying  *temp*... (regexps..............)
Fontifying  *temp*... (regexps...............)
Exporting...
Saving file /tmp/a.html...
Wrote /tmp/a.html
HTML export done, pushed to kill ring and clipboard

org-rubyを使う

Emacsを使わないでorgファイルからHTMLに変換するorg-rubyというRubyスクリプトがあります。 Rubyインストールしている環境ならば「gem install org-ruby」でorg-rubyインストールします。 これも、orgファイル引数に指定すれば変換してくれます。

ただ、中身を書き出すだけなので、ヘッダやフッタは各自指定する必要があります。

$ cat /tmp/b.org
* [emacs]たいとる
本文
** 0
*** あ
- 1
- 2
  - 2-1
  - 2-2
- 3

**** い
***** う
***** え
****** お
http://www.rubyist.net/~rubikitch/

[[http://www.rubyist.net/~rubikitch/]]

[[http://www.rubyist.net/~rubikitch/][my site]]
****** か
***** き
$ org-ruby /tmp/b.org
<h1 class="title">[emacs]たいとる</h1>
<p>本文</p>
<h2>0</h2>
<h3>あ</h3>
<ul>
  <li>1</li>
  <li>2</li>
  <ul>
    <li>2-1</li>
    <li>2-2</li>
  </ul>
  <li>3</li>
</ul>
<h4>い</h4>
<h5>う</h5>
<h5>え</h5>
<h6>お</h6>
<p>http://www.rubyist.net/~rubikitch/</p>
<p><a href="http://www.rubyist.net/~rubikitch/">http://www.rubyist.net/~rubikitch/</a></p>
<p><a href="http://www.rubyist.net/~rubikitch/">my site</a></p>
<h6>か</h6>
<h5>き</h5>

2010-11-01

[][][]もっと早くタイピングしたい人へ贈る習得容易な拡張ローマ字入力『AZIK』

  • <2010-11-02 火>追記: もっと先は
  • <2010-11-03 水>追記: skk-azik.el独自の操作方法
  • <2010-11-03 水>追記: 返答

僕はPC歴20年近くになりますが、タイピングはとても遅いです。 PC使いだしてしばらく経ってブラインドタッチを覚えたら、速度が頭打ちになってしまいました。 日本語入力環境は10年以上Emacs+DDSKKです。

タイピングが遅すぎる!

タイピングが遅い原因として考えられるのが、

  • 日本語変換のコスト
    • 変換していくので、打つ文面と画面の視線が往復する。こればかりは日本人である以上仕方ないですね。英語圏の人と比べたらとてつもなく大きいハンデです。
    • DDSKKの確定アンドゥがとても貧弱で、直前しか使えない。これはコードをいじれば解決できるはずなので置いておく。
  • QWERTY配列・ローマ字入力の限界
    • QWERTY配列は打ちにくい配列
    • ローマ字入力はそもそも速度が出ない入力方式

T-Code等の漢直入力は、2打鍵で漢字を入力するという効率的な方法で、上記の2つの問題を解決してくれます。 しかし、漢字と打鍵の関連性がつかめず、対応を丸暗記しないといけません。 しかも実用的に使えるには1000文字くらい覚える必要があります。 思春期をすぎると丸暗記がやりにくくなるので、大人になってから挑戦するのは、おすすめできません。 挑戦したとしても、挫折して結局以前の入力方に戻ってしまうのが関の山です。 習得が難しく、時間がかかり、しかも挫折したら習得時間はまったくの無駄になります。 完全に習得できればリターンは大きいですが、多くの場合は無謀な挑戦になるでしょう。

キーボード配列もタイピングを遅くする原因になっています。 通常のキーボード配列はQWERTY配列です。 2段目の左からQWERTYと続くので、そういう名前です。

この問題を解決すべく出てきたのがDVORAK配列です。 DVORAK配列はキーボードの配列を打ちやすいように総入れ替えしています。 DVORAK配列に移行してしまえば、腕が疲れにくくなり、タイピングは高速化するでしょう。 しかし、移行するには何ヶ月も時間がかかります。 習得時は、まったく打てない状態なので業務がストップしていまいます。 おまけに、他のコンピュータを使うときはQWERTY配列です。 これも大人になってから習得するのは現実的ではありません。

ローマ字入力も、日本語文字列の出現パターンを無視している上、QWERTY配列では特定の指を酷使するので速度が出ません。

そこで登場したのが、QWERTY配列でのローマ字入力のまま、それを拡張する入力方式『AZIK』です。 日本語変換のハンデはガマンするしかありません。

AZIKとは

<2010-11-02 火>加筆

AZIKは、現行の入力方式の資産を生かしつつ、入力を改善していくスタイルをとります。 現行の方法を保持したまま、より打ちやすいように改善していくので、移行期間でも作業ができます。 いわば拡張ローマ字入力といったところです。 日本語の読みを研究しつくし、頻出のパターンを打ちやすく最適化しているので、より高速に、より疲れにくくなります。

僕は今日AZIKの練習を始め、このブログもAZIKでタイピングしています。

特徴

  • ほとんどのローマ字入力がそのまま使える
  • 「ん」、「っ」、「ー」が専用キーになっている
  • 「2文字目に『ん』が来る」場合は2ストロークで打鍵できる
  • 二重母音も2ストロークで打鍵できる
  • 拗音(きゃ行など)でYのかわりにGを使える
  • 同じ指で別々のキーを打つ文字が打ちやすくなる
  • 「もの」「こと」「です」「ます」等の頻出文字列も2ストロークで打鍵できる

とりあえずこれだけ覚えろ

  • 「ー」→「:(コロン)」
  • 「っ」→「;(セミコロン)」
  • 「ん」→「Q」(もちろん「NN」でも打てる)
  • 「シャ行」の子音はX*1
  • 「チャ行」の子音はC
  • 「ゃゅょぁぃぅぇぉゎ」はLを前置する

「ー」は遠すぎるので、ホームポジションに置いています。

「っ」もホームポジションで1ストロークで打てるようにしてあります。 子音を連打するよりも、「;」で打つようにクセをつけしょう。 「ん」も「Q」を打つようなクセをつけておきましょう。

僕は初日なので、「ん」で混乱してしまいますが、これだけ知っていても、かなり楽になると思います。

もっと先は

その後は、「撥音拡張」→「外来語」→「二重母音拡張とその他の互換キー」→「特殊拡張」の順に習得していくとよいです。 なぜなら、「ん」はQという特殊な位置にあり、現状通りにローマ字を打つと別の言葉が出てくるからです。 そして、ここをマスターしてしまえば、かなりAZIKの恩恵を受けることができます。 だからこそ撥音拡張の習得はすぐにやる必要があるのです。 二重母音拡張とその他の互換キー、特殊拡張はカイゼンに過ぎず、知らなくても日常の入力には差し支えません。

AZIKの奥義ともいえる特殊拡張は覚えられるものからちょっとずつ覚えていくとよいです。 とくに以下のものは便利です。

ktこと
dsです
msます
srする
stした

AZIK総合解説書 参照。

Emacs+skkでAZIKを使う

DDSKKは、すでにAZIK対応しています。

インストール

DDSKKでAZIKを使うには、~/.skkに以下の行を追加します。

(setq skk-use-azik t)
(setq skk-azik-keyboard-type 'jp106) ; 英語キーボードの場合は 'en を指定

skk-rom-kana-rule-listをいじっている場合はバッティングしてしまう確率大なので、導入時は無効にしておきましょう。

使い方

AZIKの仕様とDDSKKの操作がバッティングしているので、一部の操作方法が異なります。

  • DDSKKのカタカナ変換機能はqではなくて@を使う。*2
  • 「ぁぃぅぇぉ」はlではなくてxxを前置する、「ゃゅょゎ」はxを前置する
  • 「;」をDDSKKのsticky-keyにしている人は他のキーにする*3

<2010-11-03 水>追記 skk-azik.el独特の操作

操作入力される文字
x;;
xxa
xxe
xxi
xxo
xxu
xxh
xxj
xxk
xxl
yi

AZIKの練習するRubyスクリプト

AZIKは習得が楽とはいえ、ものにするには、少しは訓練する必要があります。 そのため、単語帳を使って訓練するRubyスクリプトを作りました。 単語帳のすべての単語をシャッフルして登場した単語を打ち込んでいく端末アプリケーションです。

単語帳をインストールする

AZIK練習用ワード集公開しました - tomoemonの日記 から azik_word_wt-0.1.0.zip をダウンロードします。 展開すると azik_word_wt というディレクトリが作成され、azik*.txt が入っています。 それぞれ、1行ごとに単語が書いてあります。

インストール

azik-renshu.rbダウンロードし、単語帳の置いているディレクトリ (azik_word_wt) に配置します。 実行属性を与えておいてください。

Emacsでの使い方

M-x executable-interpretで直接実行するなり、「ruby azik-renshu.rb」なり実行します。 そして、DDSKKを有効にします。

http://www.rubyist.net/~rubikitch/archive/azik-renshu.png

MigemoをAZIK化する

no title の指示のとおりに、cmigemoをAZIK化します。 Ruby版MigemoはまだAZIK化していません。

返答

kiyokaさん

Sekkaは興味があるので、実用段階になり次第試してみたいと思います。 開発頑張ってください。 楽しみにしています。

ローマ字からひらがなを媒介せずに変換できるので、C-tが活躍できそうな気がします。 SKKだと「くだしあ」と打ってしまったときにC-tしても「くだあし」になってしまうだけなので。

id:at-akaさん

T-Codeをマスターできているのがとても羨しいです。

それにしても、QWERTY配列がわざと打ちづらく作られた説が嘘だったなんてびっくりです。 常識が間違っていることは、ありますよね。 ただ、あの本は「なぜQWERTY配列になったか」が書いていないらしい(書評より)のが残念です。

P.S. fcopy.el便利に使っています!

*1:中国語のシャ行はXだったりする

*2:僕はいまだに混乱してます

*3:これが一番の関門かも

2010-02-11

[][]Rubyを使ってはてブ数をEmacsで表示する?凄いね。帰っていいよ。

この記事は、はてブ数をAPIで得る方法も書いてるので、Emacs使いじゃなくても役立つかもしれない?

やっぱりブログをやっていると、評価は気になるものである。はてなならばはてなブックマーク数だ。

かといってちまちまブラウザではてブ数を確認しにいくのはだるいし時間の無駄である。数秒であったとしても、塵も積もれば山となるっていうじゃない。

はてブ数が気になる、かといっていちいち確認するのは面倒。この問題に対して、Emacs使いならば「モードラインにはてブ数を表示する」という解決策を選ぶもの。これを実現する display-hatebu.el を速攻で作ってみた。

M-x install-elisp-from-emacswiki display-hatebu.el

インストールしてくれ。さらにRubyとjsonライブラリが必要だ。Rubyインタプリタを入れた後で

gem install json

でjsonライブラリをインストールしよう。

使い方は簡単。M-x display-hatebu-set-urlではてブ数監視対象のURLをセットすると、モードラインにはてブ数が出てくるようになる。そして、1分ごとにはてブ数を自動更新する。

http://www.rubyist.net/~rubikitch/archive/display-hatebu.png

下部の44usersと出ているのがソレだ。

以下は動作原理の解説なので、興味ない人は読み飛ばしてよい。

display-hatebu.elの動作原理

モードラインはmode-line-formatによって制御される。で、そのデフォルト値は default-mode-line-format である。mode-line-formatは書式文字列が使えるが解説するのはめんどいので M-x describe-variable mode-line-format でdocstringを読んでね。その中に書かれたシンボルは変数名で、 mode-line-format と同じように解釈される。

その中に含まれている global-mode-string はいわばユーザ定義の mode-line-format だ。これにはてブ用の変数 display-hatebu-string を追加する。これではてブをモードラインに表示させることが可能になる。

あとは、 display-hatebu-string に表示させる内容を格納すりゃいい。

コマンドをEmacs内で非同期に実行して、その結果を変数に格納する

はてブ数を得るには外部コマンドを使って非同期化している。でないとはてブ数を得るたびにEmacsが固まってしまって、やってられんことになる。

そこでこの start-process-to-variable 関数が役立つ。これは、コマンドを非同期実行して、実行終了時に変数に格納する。

(defun start-process-to-variable (variable command &rest args)
  "コマンドの実行結果を変数に格納する。(非同期)"
  (lexical-let ((variable variable)
                (buf (get-buffer-create " start-process-to-variable")))
    (set-process-sentinel
     (apply 'start-process "start-process-to-variable" buf command args)
     (lambda (&rest ignore)
       (with-current-buffer buf
         (set variable (buffer-substring 1 (1- (point-max))))
         (erase-buffer))))))

試しに (start-process-to-variable 'display-hatebu-string "date") を評価すれば日付が出てくるよ。

はてブ数を得る方法 in Ruby

はてブにはAPIが提供されていて、「http://b.hatena.ne.jp/entry/json/?url=対象URL」にアクセスするとはてブの情報をJSON形式で得ることができる。

display-hatebu.elでは以下のスクリプトをワンライナー化してあるので、インストールしなくてもよい。

# -*- coding: utf-8 -*-
require 'json'
require 'open-uri' # !> character class has duplicated range
url = "http://d.hatena.ne.jp/rubikitch/20100210/emacs"
api_url = "http://b.hatena.ne.jp/entry/json/?url=#{url}"
json = JSON.parse(open(api_url).read)
# はてブ数
json["count"]     # => "44"
# JSONのデータ
json
# => {"related"=>
#      [{"count"=>"24",
#        "url"=>"http://gitready.com/",
#        "eid"=>"11697368",
#        "title"=>"git ready &#187; daily tips for the noob to the guru",
#        "entry_url"=>"http://b.hatena.ne.jp/entry/gitready.com/"},
#       {"count"=>"63",
#        "url"=>"http://coreblog.org/ats/cui-based-debugger-pudb",
#        "eid"=>"19191666",
#        "title"=>"\n        CUIベースなのに無駄にビジュアルなPython用デバッガ - pudb &#8212; TRIVIAL TECHNOLOGIES 2.0\n    ",
#        "entry_url"=>"http://b.hatena.ne.jp/entry/coreblog.org/ats/cui-based-debugger-pudb"},
#       {"count"=>"32",
#        "url"=>"http://d.hatena.ne.jp/hiratara/20091112/1258023732",
#        "eid"=>"17305307",
#        "title"=>"Gitリポジトリ中のサブディレクトリを別のリポジトリにする - a geek born in Tomakomai",
#        "entry_url"=>"http://b.hatena.ne.jp/entry/d.hatena.ne.jp/hiratara/20091112/1258023732"},
#       {"count"=>"5",
#        "url"=>"http://d.hatena.ne.jp/m-hiyama/20091127/1259283952",
#        "eid"=>"17588533",
#        "title"=>"本日のtip:Emacsで、文字をアンパサンドによる文字参照に置き換える - 檜山正幸のキマイラ飼育記",
#        "entry_url"=>"http://b.hatena.ne.jp/entry/d.hatena.ne.jp/m-hiyama/20091127/1259283952"}],
#     "count"=>"44",
#     "url"=>"http://d.hatena.ne.jp/rubikitch/20100210/emacs",
#     "bookmarks"=>
#      [{"comment"=>"other-window-or-sprit", "timestamp"=>"2010/02/11 15:16:22", "user"=>"hyrum", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 14:11:27", "user"=>"hmaro", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 12:51:05", "user"=>"ranryu", "tags"=>["keybind", "elisp", "tips", "emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 12:34:12", "user"=>"hshinoda", "tags"=>["Emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 12:05:34", "user"=>"sattzi", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 10:51:24", "user"=>"Shinnya", "tags"=>["emacs", "editor", "Tips"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 08:35:58", "user"=>"taka222", "tags"=>["rssflashg"]}, # !> character class has duplicated range
#       {"comment"=>"", "timestamp"=>"2010/02/11 06:31:35", "user"=>"kei10in", "tags"=>["Emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 04:42:44", "user"=>"IceNine", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 04:21:52", "user"=>"wakarany", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 02:49:19", "user"=>"lifesan", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 02:27:37", "user"=>"ryskosn", "tags"=>["Emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 02:07:35", "user"=>"aoi-sora", "tags"=>["emacs"]},
#       {"comment"=>" これは便利ー", "timestamp"=>"2010/02/11 01:26:43", "user"=>"hiro_nemu", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/11 00:08:31", "user"=>"delico69", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 23:26:28", "user"=>"tyru", "tags"=>["!share-with", "!twitter", "!tumblr-tech", "emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 23:13:58", "user"=>"uhiaha888", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 22:44:59", "user"=>"funayama1116", "tags"=>["emacs", "elisp"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:59:49", "user"=>"gemini7", "tags"=>["emacs", "elisp"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:58:10", "user"=>"m_kisara", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:44:37", "user"=>"Akineko", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:39:47", "user"=>"aki77", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:36:57", "user"=>"Watson", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 20:23:48", "user"=>"gogatsu26", "tags"=>["Emacs"]},
#       {"comment"=>"デフォルトだと C-x o な other-window を1ストロークに。かつ、ウィンドウが1つのときは分割するように。", "timestamp"=>"2010/02/10 20:16:59", "user"=>"june29", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:53:06", "user"=>"wideangle", "tags"=>[]},
#       {"comment"=>"window の扱いについて。僕も C-t で切り替えてたけど、コンテキストで切り替えるのは考えてなかった。", "timestamp"=>"2010/02/10 17:52:03", "user"=>"tomoya", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:51:30", "user"=>"kshimo69", "tags"=>["emacs", "from_greader", "from_plagger"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:36:40", "user"=>"nanolia", "tags"=>["emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:35:47", "user"=>"n2s", "tags"=>["Emacs"]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:35:16", "user"=>"RanTairyu", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:31:02", "user"=>"yokochie", "tags"=>["emacs", "elisp"]},
#       {"comment"=>"Emacsで左右に垂直分割するとPuTTY上でマウスコピペしようとするときにムキーってなるので使ってないがよく考えるまでもなくEmacsさんは悪くなかった関係なかった",
#        "timestamp"=>"2010/02/10 17:30:24",
#        "user"=>"ezookojo",
#        "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:15:26", "user"=>"nmti", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 17:11:08", "user"=>"inc_aka", "tags"=>[]},
#       {"comment"=>"Emacs: そろそろEmacsのウィンドウについて一言いっとくか - (rubikitch loves (Emacs Ruby CUI)) :", "timestamp"=>"2010/02/10 16:57:02", "user"=>"bsiyo", "tags"=>[]},
#       {"comment"=>"", "timestamp"=>"2010/02/10 16:29:57", "user"=>"yinkyweb", "tags"=>["emacs"]},
#       {"comment"=>" ウィンドウ切り替え", "timestamp"=>"2010/02/10 16:25:53", "user"=>"tettsyun", "tags"=>["emacs"]}],
#     "title"=>"そろそろEmacsのウィンドウについて一言いっとくか - (rubikitch loves (Emacs Ruby CUI))",
#     "eid"=>"19224459",
#     "entry_url"=>"http://b.hatena.ne.jp/entry/d.hatena.ne.jp/rubikitch/20100210/emacs",
#     "screenshot"=>"http://screenshot.hatena.ne.jp/images/200x150/6/1/4/5/1/519174ac408c0347a36fd530b1ce9f396d7.jpg"}

2010-01-09

[]僕たちが待ち望んでいたRubyスクリプトをデーモン化する方法

Rubyでは、簡単にデーモンが記述できる。その方法は簡単!Ruby 1.9だと

Process.daemon

と書くだけだ。その行の後は制御端末が切離され、デーモンとして実行される。Ctrl+Cで終了できないので、永遠に実行を続けるスクリプトは「pkill -f」などで殺す。

既存のスクリプトをデーモン化するには、この一行を加えればいいだけなのだが、常にデーモンにしてしまうとデバッグが困難になってしまう。そこで、テスト時はふつうに実行して、普段はデーモンにしてしまえばいい。その方法もまた簡単!上の一行を daemonize.rb というファイルに保存すればいい。だけどこれだけだとつまらないので、ついでにRuby 1.8にも対応させてみる。

if Process.respond_to? :daemon  # Ruby 1.9
  Process.daemon
else                            # Ruby 1.8
  require 'webrick'
  WEBrick::Daemon.start
end

こうすることで

$ ruby -rdaemonize /path/to/script

と実行すればデーモンとして実行してくれるぞ。rubyオプションひとつでデーモン化してくれるとは、素晴しいぞRuby