2007-08-01
■ [ruby] irbを使う前にしておくべき3つ(+α)の設定
Rubyで試行錯誤しながら開発したいときにはirbを使うのが便利です。 今日はirbをさらに便利にする設定をいくつか紹介します。
ホームディレクトリ*1に .irbrc というファイルを 作り、そこに設定を書いていきます。
(1) タブ補完
# --- completion require 'irb/completion'
メソッド名をTABキーで補完できるようになります。
例:
yhara@meteor:~ % irb >> a = [] => [] >> a.ind[TAB] a.index a.indexes a.indices
(2) リファレンス検索
IRB上から「r」というメソッドでrefeを引けるようになります。
例:
>> r :partition Enumerable#partition --- partition {|item| ... } ruby 1.7 feature 各要素に対してブロックを評価した値が真であった要素からなる配列と 偽であった要素からなる配列からなる配列を返します。 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].partition { |i| i % 3 == 0 } #=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]] => nil >> r :inspect Iconv::Failure#inspect Included#inspect Method#inspect Object#inspect OptionParser::ParseError#inspect Syslog#inspect TMail::Mail#inspect => nil
クラスを指定したいときは「r "Array#inspect"」とか、「Array.r :inspect」のようにします。
(3)結果の色付け
wirbleというgemをインストールするとirbの実行結果に色が付くようになります。
# --- wirble require 'rubygems' require 'wirble' Wirble.init Wirble.colorize
(おまけ)長すぎる出力を切り詰める
File.readなど、巨大なStringを返すメソッドを呼ぶと、IRBの出力がやたら長くなってちょっと鬱陶しいですよね。 こんな時に、出力の先頭以外を省略する設定を考えてみました。
なお実装の都合上Wirbleを先にロードしておかなければいけません。 *2
# --- truncate long output (load wirble first!) module IRB class Irb CUT = 1000 def output_value if @context.inspect? s = @context.last_value.inspect if s.size > CUT s = s.slice!(0, CUT) + "...(snipped)" end printf @context.return_format, Wirble::Colorize.colorize(s) else printf @context.return_format, @context.last_value end end end end
(おまけ2) irb中でもlsを使えるようにする
手が空くとついlsを打ってしまうあなたにお薦めです(笑)。
def ls print `ls -CF` end
オプションはお好みで。
ついでにcdも実装……とかやってるとirbshになってしまいそうなので 今回はこの辺で。
Enjoy irbing!
2007-08-05
■ [event] 関東にいます
サプライズwが終了したので書いてしまいますが。
- 8/4(土) LL Spirit → http://kangetsu.com/
- 8/5(日) 未踏ユース 2006年度下期成果報告会 → 先輩のうちに泊めてもらう ← いまここ
- 8/6(月) 未踏本体 2006年度下期 並木・齋藤・高田・黒川4PM合同成果報告会 → 多分カプセルホテル
- 8/7(火) 同上 → 帰宅
というスケジュールです(でした)。
今回は(ついに)名刺を作ったので、いろんな人に配りまくりですよ。残り8枚なのでほしい方はお早めに(?)。 LL Spiritでshinhさんにぜひ渡したい!と思ったんだけど人多すぎて探すどころでなかった。ウォーリーもびっくり。
xtalよりxbyakよりまず「神保町」が読めないと思うんですよ。
http://karetta.jp/article/blog/ll-spirit/110939
会場から魂もらいました。やる気でた。このやる気は大事にしないと。
2007-08-08
■ [event] 関東にいました
いました。
- 未踏の発表会でかなりエネルギーを貰ってしまった。やっぱりコード書きまくってる人はカッコいいと思うし自分もそうなりたい。
- ブログに変なことを書いたらshinhさんから飲みに誘ってもらった。何でも書いてみるもんですな。ありがとうございました。
- という効果を考えると事前に「LL魂行きます」とか書いといた方が良かったかな。考えてみればあの会場に相当数の「ブログ読んでるけど会ったことない人」が含まれてたはずだし
- と思いつつやっぱりネタを優先してしまう俺なのでした
■ [hiki] 野良プラグインの管理
hikiは(tDiaryのように)複数のプラグインディレクトリを指定できるようにはなってないのかな?
みんな野良プラグインの管理とかどうしてるんだろう…。バージョン上がるたびにいっこずつコピー?
とりあえず
- misc/plugin/ を ~/bin/hiki-plugin/ に移動
- misc/plugin/ を ~/bin/hiki-plugin/ のシンボリックリンクに (ln -s)
- 野良プラグインは ~/bin/hiki-plugin/ に突っ込む
という感じにしてみた。
■ [hiki] 同一サーバで複数のHikiを管理する方法
同一サーバで複数のHikiを管理する方法について書いてみる。
(1) 設置したいディレクトリごとに hiki-x.y.z.tar.gz を解凍してインストール
面倒なのでお薦めしません。
特にWebアプリは脆弱性が発見された場合に迅速にアップデートしなければならないので、各ディレクトリ毎に アップデート作業が発生するこの方法はあまり良いとは言えません。
(2) HikiFarmを設置する
HikiFarmを設置すると、http://wiki.fdiary.net/ のような感じで ユーザに自由にWikiを増やしてもらうことが可能になります。
が、HikiFarmだと
http://example.com/~hoge/hikifarm/hiki1/ http://example.com/~hoge/hikifarm/hiki2/
のようなURLになるので、ユーザを跨いだりトップレベルに複数設置することができません。
#こういうことがしたい http://example.com/~foo/hiki1/ http://example.com/~bar/hiki2/ http://example.com/~bar/hiki3/
このような場合は、以下の方法を使えばOKです。
(3) tDiary方式
同一サーバで複数のtDiaryを運営する方法のように、 設定ファイルとプロキシCGIだけを置いて本体を共有する方法です。
基本的に http://www.namaraii.com/diary/?date=20030408#p03 を参照すればOK。
まず ~/bin/hiki/ あたりに hiki-x.y.z.tar.gz を解凍します。*1
次に、Hikiを設置したいディレクトリ毎に以下のファイルを設置します。
- hikiconf.rb (hikiconf.sample.rbをコピーして編集)
- .htaccess (dot.htaccessをコピー)
- hiki.cgi (以下ような内容、chmod +xで実行権限を付加しておく)
#!/usr/bin/env ruby master_path = '/home/hoge/bin/hiki/' #←Hikiを解凍したフォルダに合わせて設定 $LOAD_PATH.unshift(master_path) load "#{master_path}/hiki.cgi"
あとはHikiを設置したURLにアクセスし、管理画面からパスワードやタイトルやテーマを設定すれば設置完了です。
*1 もしくはCVSからチェックアウトするのでもOK。その方がアップデートが楽でいいかも。
2007-08-11
■ [ruby] Binding.of_callerが1.8.5から動かなくなったのは
set_trace_funcのバグが修正されたためだそうです(私信)。
つまりBinding.of_callerは存在自体がバグだったらしいw
関数を抜ける直前にフック"return"が呼ばれるべきなのに、関数を抜けた直後に呼ばれていたという。
あとCレベルで実装しようとすると(例) 必要な情報を常に持ってないといけなくなるので、of_callerのためにそこまですべきか…という話になるらしい。
もう少しマシな実装として、&blockみたいに適当な記号(ここでは^とする)を使って
def foo(a, b, ^bdg) ...
みたいに書いておくとbdgに呼び出し元のbindingが入る…みたいな案はあったそうな(実装はされず)。
■ [prog] Befungeが来てる件
http://d.hatena.ne.jp/mayah/20070810/p1
とりあえず「カレンダーが書かれた言語」がesolang多すぎというのは突っ込むべきでしょうか(笑)。
2007年は「Befungeがブレイクした年」として(俺の)記憶に残りそうだ。
Befungeユーザ会作りたい。Befunge Users' Group = BUG か(ひどい)。
□ masa.edw [LL魂の会場でちらっとお話した、Wirbleの履歴の保存の話です。 http://d.hatena.ne.jp/ma..]
□ yhara [> 履歴の保存 どうもです。ちょっと手元でも試してみます。]