query: tag:utils

ちょっと必要になったので、
タグや空白を無視して、ある文字列の中から、
指定した文字列がマッチする範囲を計算するJavaScript
を書いてみました。

js>>
/* (C) Genki Takiuchi. New BSD License */
var findSelection = function(html, sel){
var chars = html.split(''), sels = sel.split('');
var start = 0, end = 0, step = 0, tag = false;
var cur = function(){return chars[end]};
var parse = function(){
switch(cur()){
case '>': if(tag) tag = false; return go();
case '<': if(!tag) tag = true; return go();
case '\n': return go();
case ' ': return go();
case '\t': return go();
default: return tag ? in_tag() : out_tag();
}
};
var go = function(){return(chars[end++] ? parse:reject)()};
var in_tag = function(){return go()};
var out_tag = function(){
return(cur() == go_sel() ? match:not_match)()
};
var not_match = function(){step = 0; return go()};
var match = function(){
if(step == 1) start = end;
return(sels[step] ? go:accept)()
};
var accept = function(){return [start, end + 1]}
var reject = function(){return [0, 0]};
var go_sel = function(){
var s = sels[step++];
return white_space(s) ? go_sel() : s
};
var white_space = function(c){
return c && c.match(/[\s\n]/)
};
return parse();
};
<<js

使い方は、こんな感じ。

js>>

findSelection('hello, world!', 'llo, world')
[2, 15]
<<js

選択範囲を取得して、選択している領域をRangeを求めるために作りました。
selに指定した文字列にマッチする箇所が複数ある場合は、
最初にマッチした場所のRangeを返します。

posted by genki genki on Sun 9 Mar 2008 at 10:54 with 0 comments

Railsアプリケーションなどで、lighttpdを使って開発していると、
tmp/sockets以下にソケットファイルが生成されます。

これがあると、
以前紹介したRak
でエラーが発生して
上手く検索することが出来なくなる問題があったので、
対処方法を紹介します。

ソースコードを修正する必要があるので、
Rubyforgeから tar ball を持ってきます。

これを展開して、以下のようにファイルを書き換えます。

bin/rak

diff>>
--- rak_original 2007-12-26 20:48:26.440270979 +0900
+++ bin/rak 2007-12-26 20:43:56.736258421 +0900
@@ -464,6 +464,8 @@
end
return false
end

  • rescue Errno::ENXIO
  • false

end

def self.search2(str, files)
<<--

あとは、rake install_gem すればOKです。

作者のDanには、メールでPatchを送っておきました。

posted by genki genki on Wed 26 Dec 2007 at 21:05 with 0 comments

Markdown記法に加えて、作表機能も備えた、BlueStole
というRubyライブラリを紹介します。

BlueStole - BlueCloth Wrapper

Ruby の Markdown ライブラリ、 BlueCloth に幾つかの機能を付け足した私家拡張版です。

BlueCloth
のMarkdown記法を拡張したものになっていて、こんな感じに
RTtool
を使った作表を行うことが出来ます。

|caption=Rendering Algorithm
|
|What , Who , When
|
|Ray Tracing , Whitted, 1980
|Path Tracing , Kajiya , 1986
|Photon Mapping , Jensen , 1995
|Metropolis Light Transport, Veach , 1997

ソースはこんな感じです。

pre>>
|caption=Rendering Algorithm
|
|What , Who , When
|
|Ray Tracing , Whitted, 1980
|Path Tracing , Kajiya , 1986
|Photon Mapping , Jensen , 1995
|Metropolis Light Transport, Veach , 1997
<<--

Markdown記法のポリシーにあっていて良い感じ。
Railsから使う場合は、bluestole.rbファイルをlib以下に
配置します。

ちなみに、このブログで使っているものは、
BlueStole互換の自家製ライブラリです。

posted by genki genki on Thu 13 Dec 2007 at 02:57 with 0 comments

Hash#only, Hash#except
に続いて、Hashを便利にするシリーズです。

今回は、Array#compactのように、Hashから値が空っぽのキーを取り除く
Hash#compactを実装してみました。

hash_ext.rb

ruby>>
class Hash
def compact!(method = :nil?)
each do |key, value|
value.compact! method if value.respond_to? :compact!
delete key if value.send method
end
end

def compact(method = :nil?)
dup.compact! method
end
end
<<--

非常に簡潔に書けますね。こんな感じの挙動をします。

ruby>>

{'foo' => [], :bar => nil, :baz => ""}.compact
=> {"foo"=>[], :baz=>""}

{'foo' => [], :bar => nil, :baz => ""}.compact :blank? # Rails
=> {}
<<--

値がcompact!を受け取れるオブジェクトの場合は、
再帰的に処理されます。

ruby>>

{'foo' => {:bar => nil, :baz => ""}}.compact
=> {"foo"=>{:baz=>""}}

{'foo' => {:bar => nil, :baz => ""}}.compact :blank? # Rails
=> {}
<<--

実際にどんなところで使えるかというと、フォームから送信された
パラメータのうち、空っぽのものを削除してからARのアトリビュートを
更新したい場合なんかに便利かもしれません。

rails>>
class UserController
def update
@user = User.find(params[:id])
@user.update_attributes(params[:user].compact :blank?)
end
<<--

こんな感じですね。
パスワードとかが空っぽのときは、以前のまま
変更しないというような場合に簡単に対応できます。

posted by genki genki on Wed 12 Dec 2007 at 08:46 with 0 comments
最近話題の [ActiveScaffold](http://activescaffold.com/) の開発メンバーでもあるLance Ivy氏のレポート。 [**How Rails' Benchmarks Lie**](http://codelevy.com/articles/2007/11/28/how-rails-benchmarks-lie) >I’ve been on a benchmarking blogging spree lately. Creating BenchmarkForRails (B4R) with its non-invasive benchmarking technique has made it very easy to play around with timing of key Rails methods and develop a better picture of the true costs. The results have been amazing. Railsのベンチマークでは測定しきれない部分の ベンチマークを可能にする [BenchmarkForRails](http://code.google.com/p/benchmarkforrails/) というプラグインを作ったとの事。 具体的には、こんな感じで違いが出るようです(以下に抜粋) **Rails** Completed in 0.85246 (1 reqs/sec) Rendering: 0.48872 (57%) DB: 0.02561 (3%) **BenchmarkForRails** - [0.9532] GET /plans ---------------------------- 0.8528 processing action 0.5015 rendering 0.2533 activerecord find 0.0461 development mode 0.0073 before filters 0.0046 session management 0.0000 after filters ------------------------------ BenchmarkForRails - かなり細かいところまで計測できていますね。ちょっと面白いです。
posted by genki genki on Mon 10 Dec 2007 at 00:36 with 0 comments

ちょっと使ってみて良い感じだったので紹介します。

Rak

Rak is a grep replacement in pure Ruby. It accepts Ruby syntax regular expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/ and more things you don't care about. It is based on the Perl tool ack by Andy Lester.

Pure ruby で書かれた grep みたいな感じですね。
なんといっても見た目が美しい。

rak_demo

デフォルトで再帰的に、.svn や .cvs を無視して検索してくれる
というのも良い感じ。

RubyGemsとして提供されているので、インストールするのは

shell>>
% sudo gem install rak
<<--

でOKです。

See Also

更新履歴

  • [2007/12/5 23:08] ackへのポインタを追加。
  • [2007/12/26] ソケットファイルがある場合の問題への対処法の紹介
posted by genki genki on Wed 5 Dec 2007 at 20:40 with 0 comments
[RaPT](http://rapt.rubyforge.org/) は、Ruby on Railsのプラグインを管理するためのツールです。 >RaPT is a replacement for the plugin script included with the Rails distribution. It's a little more fault-tolerant and featured than the default plugin script. The main additional feature is the ability to search for Rails plugins from the command line. なんとなく、名前がdebianのaptに似てると思うのは僕だけでしょうか。 以前から、RailsプラグインにもRubyGemsに相当するような パッケージ管理ツールがほしいと思っていたのですが、 これを使えば目的を達することができるかも。 **インストール** RaPT自体はRubyGemsとして提供されています。 shell>> % sudo gem install rapt <<-- おなじみのコマンドですね。これでOK。 **使い方** shell>> % rapt -h Usage: rapt [OPTIONS] command Rails plugin manager. GENERAL OPTIONS -r, --root=DIR Set an explicit rails app directory. Default: /home/takiuchi/blog -s, --source=URL1,URL2 Use the specified plugin repositories instead of the defaults. -v, --verbose Turn on verbose output. -h, --help Show this help message. <<-- **サブコマンド** shell>> discover Discover plugin repositories. list List available plugins. search Search for available plugins. about Show basic info about a plugin. install Install plugin(s) from known repositories or URLs. update Update installed plugins. remove Uninstall plugins. source Add a plugin source repository. unsource Remove a plugin repository. sources List currently configured plugin repositories. pack:install Install plugins from plugin pack file or URL pack:uninstall Uninstall plugins from plugin pack file or URL pack:about Display plugin pack information <<-- **使用例** 長くなったので、 Click to toggle display Example.
posted by genki genki on Sun 2 Dec 2007 at 03:05 with 0 comments

Hash#sliceが欲しい
をさらに拡張。

指定したキーを取り除いたHashを返すHash#exceptを追加。
併せて、既存のHash#sliceHash#onlyに改名してみました。

hash_ext.rb

ruby>>
class Hash
def only(*args)
args = *args if args[0].is_a? Array
args.inject({}){|hash, key| hash[key] = self[key]; hash}
end

def except(*args)
args = *args if args[0].is_a? Array
args.inject(dup){|hash, key| hash.delete(key); hash}
end
end
<<--

使い方:

ruby>>
cond = params.only :year, :month, :day
ma = MonthlyArchive.find :all, :conditions => cond.except(:day)
<<--

posted by genki genki on Thu 29 Nov 2007 at 03:08 with 0 comments

ので作ってみた。

hash_ext.rb

ruby>>
class Hash
def slice(*args)
args = *args if args[0].is_a? Array
args.inject({}){|hash, key| hash[key] = self[key]; hash}
end
end
<<--

使い方:

ruby>>
conditions = params.slice :year, :month, :day
<<--

posted by genki genki on Wed 28 Nov 2007 at 04:16 with 0 comments

MacOS版は以下にあります

https://github.com/genki/ViMouse

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/107

最近身の回りでキーボードの話題が花盛りなので便乗してみたり。

日比さんのとことか金沢さんのとこでも紹介されてますが、ThinkPadのトラックポイントは便利そうですね。ThinkPadの画面サイズがもうちょっと大きかったら買っていたんだけど…。

特にこだわりは無いのですが、僕は長いことSONYのVAIOシリーズを使っています。 キーボードはそこそこ打ちやすくて良いんですが、やっぱりノートPCのスライドパネルは使う気にならず、普段は外付けのマウスを使っています。

それでも外出時などは、外付けのマウスが使えないので、キーボードでマウス操作が出来るvimouseというユーティリティを自作して使っています。

setup.msi

C#で3時間ぐらいで作ったものなのですが、なかなか役に立ってくれています。 マウスモードとキーボードモードを切り替えて、vimっぽい感じにhjklでカーソルを移動します。 コンフィグレーションは完全に自分専用に調整されてるので、他の人が使うのには不便かも。

一応使い方。


hjkl: 左下上右に移動
a: すごくゆっくり移動
s: ゆっくり移動
d: 速く移動
f: すごく速く移動
Space: 左クリック
;(セミコロン): 右クリック
n: 中クリック
g: ホイールモード(g+hjklでホイール)
Ctrl+;(セミコロン): マウスモードに移行
i: キーボードモードに移行し、カーソル直下のWindowにフォーカス
o: キーボードモードに移行。フォーカスはそのまま。
y: コピー
p: ペースト
ウイルスチェックとかはしていますが、利用は自己責任でお願いします。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/107

 

posted by genki genki on Mon 2 Oct 2006 at 16:51 with 1 comment