特に好きなわけではないのだけれど、気がつけば10年以上VAIOを使っていた。
しかし、SONY製のソフトウェアを使った記憶が残ってない。

なぜアップルにできたことがソニーにはできなかったのか

アップルがiPod+iTunes+iTunes Storeというハード・ソフト・サービスを巧みに組み合わせてネット時代にふさわしいコンシューマ・エレクトロニクス・ビジネスモデルを見せてくれたことに関しては、ここでもさんざん書いて来たが、反面教師として注目すべきなのは、ソニーになぜそれができなかったのか?ということ。

それに対して、Appleのソフトウェアは結構使っている気がする。
わざわざベータ版のWindows Safariまで持ってきて使っている。

posted by genki genki on Sun 30 Dec 2007 at 15:37 with 0 comments

ちょっと前の記事だけど、偶然目にして興味深かった。

TechCrunch Japanese アーカイブ ? Skypeダウンの原因はWindowsユーザーだった

Skypeによれば、サービスがダウンした原因は「国際的な規模での定期的なパッチ配布に伴い、ユーザーが非常に短い期間内に一斉にコンピュータの再起動を行ったこと」

P2Pサービスは、ピアの数が一時に大量に減少すると安定性が損なわれる。

それ以外の様々な効率の面で言っても、例えばWindowsアップデートの
ような大規模なシステムの更新は、時間差を伴って行われるべきだろうな。
○○が××の一斉自動更新の影響でダウン、
という現象はこれから増えてくるのかもしれない。

posted by genki genki on Fri 28 Dec 2007 at 12:12 with 0 comments

今回の主な変更内容は、Rails 2.0への対応です。

Rails 2.0系から prototype.js 1.6が使われるようになった事と、
CSRF対策のために導入された仕組みのため、
バージョン 3.2.5 以前のバージョンでは
動作しなくなっていました。

今回のアップデートでとりあえず動く状態になりました。

よろしくお願いします。

posted by genki genki on Thu 27 Dec 2007 at 16:14 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

うーむ、この挙動の変更には驚いた。

今までなら、

js>>

a = $H()
Object _object=Object

a.test = 'foo'
"foo"

a.inspect()
"#<Hash:{'test': 'foo'}>"
<<--

という挙動だったのだけれど、version 1.6以降、最後の結果が

js>>

a.test = 'foo'
"foo"

a.inspect()
"#Hash:{}"
<<--

と、空っぽのままになってしまう。
Hashへの要素の追加は、以下のようにgetやsetを使わなくては
ならないようだ。

js>>

a.set('test', 'foo')
"foo"

a.inspect()
"#<Hash:{'test': 'foo'}>"
<<--

これは結構影響が大きな変更なんじゃないかな・・・。

####追記

Rails 2.0からprototype.js 1.6が使われるようになったから、
今頃気がついたわけですね。

JavaScriptライブラリ「Prototype.js 1.6.0」正式版リリース(ライブラリ)

Elementsは「new Element(...)」というシンタックスで生成できるようになり、Element#insert、Element#select、 Element#wrapといったAPIが提供された。また、Hashに関するAPIが変更され、Hash#get、Hash#setを使う必要がある。

posted by genki genki on Wed 26 Dec 2007 at 17:49 with 0 comments

対応作業は完了いたしました。


現在のところ、
ShootingStar
はRails 2.0への対応作業中です。

進展があり次第こちらでご報告いたします。

よろしくお願いいたします。

更新履歴

  • 2007/12/26 記事投稿
  • 2007/12/27 対応完了
posted by genki genki on Wed 26 Dec 2007 at 06:11 with 0 comments

お疲れ様でした。

Railsが対応するのは 1.9.1 が出てからだろうか。

更新履歴

  • 2007/12/26 tar ballへのリンクを追加。
posted by genki genki on Wed 26 Dec 2007 at 06:01 with 0 comments

RubyGemsを使い続けていると、古いバージョンのgemがたまっていきますが、
まとめて綺麗にする方法のメモ。

shell>>

gem uninstall activesupport -v '<= 2.0.1'

Select gem to uninstall:

  1. activesupport-1.4.2.6548
  2. activesupport-1.4.2.7357
  3. activesupport-1.4.4
  4. activesupport-2.0.1
  5. All versions

    5
    <<--

このように、-vオプションで不等号によるバージョンの指定
を行い、All versionsを削除すると、まとめて
一度に削除できます。

posted by genki genki on Tue 25 Dec 2007 at 15:53 with 0 comments

非常に参加しがいのある良いイベントでした。
運営者の皆様、お疲れ様でした。ありがとうございます。

イベント自体も面白かったのだけれど、二次会が面白かった。

koizukaさん、nyaxtさん、shinhさん、
末永さん、太田さん、ありがとうございました。
非常に刺激的な時間でした。
全員Twitterフォロー完了。

久々に積分方程式が解きたくなってきた。
並列計算勉強会やりたいですね。

posted by genki genki on Mon 24 Dec 2007 at 08:55 with 0 comments

以前紹介した
BenchmarkForRails
は、Railsアプリケーションの詳細なベンチマークを
行うことが出来る便利なプラグインですが、
rake test:unitsの実行でエラーが発生する問題が
起こっていました。

調べてみたところ、init.rbファイルにrequire文が
足りていないのが原因のようだったので、対処法を紹介します。

vendor/plugins/benchmarkforrails/init.rb

rails>>
require 'dispatcher'
require 'benchmark_for_rails'

The special :request benchmark. This tries to encompass everything that runs

to handle a request.

BenchmarkForRails.watch(:request, ::Dispatcher, :dispatch)
<<--

上記の2行目を加えることで、エラーが出なくなります。

posted by genki genki on Sat 22 Dec 2007 at 22:21 with 0 comments

Twitterの障害情報などを教えてくれる
Twitterアカウント
があるようです。

tw01

弊社
でも真似して作ってみました。

今のところ、特に障害が発生する予定は無しです :-)

何か新しい事を始めるときに使ってみよう。

posted by genki genki on Sat 22 Dec 2007 at 20:48 with 0 comments

ある単語Xが出てくる場所の前後5行以内に別な単語Yが出現する場所を探したい。

たまにはそんなこともありますね。

-A -B -C オプションが実装されている
Rak
やgrepを使えば簡単。

shell>>
% rak X -C 5 | rak Y
<<--

-A nは後方n行、-B nは前方n行、-C nは前後n行を
含めて表示するので、それをパイプして前後の文脈の
中からさらに検索してあげればOK。

posted by genki genki on Fri 21 Dec 2007 at 12:46 with 0 comments

一時動かなくなっていた
restful_open_id_authenticationプラグイン
ですが、
ひとまず手元の環境で動く状態になったので、こちらに置いておきます。

http://svn.s21g.com/public/rails/plugins/restful_open_id_authentication_redux/

ruby-openid-2.0.1
のexamplesのコードが非常に参考になりました。

プラグイン中のmigrationジェネレータは、何も無い状態から
DBを作るためのマイグレーションになっています。

すでにrestful_open_id_authenticationプラグインを
使っている状態からアップグレードする場合は、下記
[2]に掲載したmigrationコードをご利用ください。

Enter at your own risk!

See Also

  1. restful_open_id_authenticationプラグインの更新に着手
  2. rescful_open_id_authenticationプラグインの更新#2
posted by genki genki on Fri 21 Dec 2007 at 08:09 with 0 comments

restful_open_id_authenticationプラグイン
でOpenIDストアに使用していたDBを
ruby-openid 2.0に移行させるためのマイグレーション。
ruby-openid 2.0のexamplesから抜粋。

rails>>

Use this migration to upgrade the old 1.1 ActiveRecord store schema

to the new 2.0 schema.

class UpgradeOpenIdStore < ActiveRecord::Migration
def self.up
drop_table "open_id_settings"
drop_table "open_id_nonces"
create_table "open_id_nonces", :force => true do |t|
t.column :server_url, :string, :null => false
t.column :timestamp, :integer, :null => false
t.column :salt, :string, :null => false
end
end

def self.down
drop_table "open_id_nonces"
create_table "open_id_nonces", :force => true do |t|
t.column "nonce", :string
t.column "created", :integer
end

create_table "open_id_settings", :force => true do |t|
  t.column "setting", :string
  t.column "value", :binary
end

end
end
<<--

ちなみにオリジナルのプラグインが生成したマイグレーションコードはこちら。

rails>>
create_table :open_id_associations, :force => true do |t|
t.column :server_url, :binary
t.column :handle, :string
t.column :secret, :binary
t.column :issued, :integer
t.column :lifetime, :integer
t.column :assoc_type, :string
end

create_table :open_id_nonces, :force => true do |t|
  t.column :nonce,        :string
  t.column :created,      :integer
end

create_table :open_id_settings, :force => true do |t|
  t.column :setting,      :string
  t.column :value,        :binary
end

<<--

open_id_settingsは不要になって、open_id_nouncesの
内容が変わります。

posted by genki genki on Fri 21 Dec 2007 at 06:34 with 0 comments

昨日RubyGemsを1.0.0にアップデートしたところ、
require_gemが使えなくなってしまったため、
内部でrequire_gemを使っているGemが使えなくなりました。

かなり前から移行措置が取られていたため、
使えなくなったGemはほとんど無かったのですが、
一個だけ、ruby-openidの1.x.x系列が使えなくなっていました。

その結果、愛用していた
restful_open_id_authenticationプラグインが
動かなくなってしまいました。
結構いろんなプロダクトで使っていたので影響大です。

ruby-openidの2.x.x系列は、require_gemを使わないようなコードに
なっているのですが、インターフェイスが大分変わっているため、
すんなりとアップグレードが出来ない感じですね。

しかし、アップグレードしないわけにもいかないので、
restful_open_id_authenticationプラグインの
ruby-openid 2.x.x系対応に着手します。

すでに同じ問題に取り組んでいる方がいらっしゃいましたら、
喜んでご協力いたしますのでご連絡いただけるとありがたいです。

連絡先

posted by genki genki on Fri 21 Dec 2007 at 06:23 with 0 comments

遂にリリースされましたね。

Ruby-1.9.1(12/25リリース予定の)にバンドルされる見通しのRubyGemsですが、
それに先立ってバージョン1.0.0がリリースされました。

RubyGems 1.0.0

Release 1.0.0 fixes several bugs.

RubyGemsのバージョンアップを行うためには、
通常のGemパッケージとは違い、以下のような
コマンドを実行する必要があります。

shell>>
% sudo gem update --system
<<--

今年の年末はいろいろと新しくなって、ユーザとしては楽しいですね。
開発者の皆様、お疲れ様です。

posted by genki genki on Thu 20 Dec 2007 at 21:53 with 0 comments

本日、DNSサーバの設定の問題により、本ブログにアクセスできなくなる
障害が発生しておりました。

現在は復旧しておりますが、設定が反映されるまで
今しばらくアクセスが出来ない状態が続く可能性があります。

ご迷惑をおかけいたしますが、
もうしばらくお待ちいただけますと幸いです。

よろしくお願いいたします。

posted by genki genki on Thu 20 Dec 2007 at 21:14 with 0 comments

Twitterで話題になってたのでちょっとやってみたのだけれど、
MyMiniCity
が面白いです。

mmc

なにやらSimCityを髣髴とさせる画面なのですが、
特に何か操作できるようなことも無く、町が発展するのを眺めているだけ。
メッセージボードみたいなのがあって、一応そこでコミュニケーションは
取れるみたいですね。

自分が作った町のページに人が訪れてくると、町の人口が増える
仕組みらしい。これは良いアイディアだなあ。

posted by genki genki on Wed 19 Dec 2007 at 13:35 with 0 comments

前から思っていたけれど、簡単なアプリケーションを作ったり、
とりあえずアイディアを動く形にするためには、MySQLを使うよりも
Sqliteの方が向いていると思います。

そんな人には、今回のRailsのアップデートは嬉しいかもしれません。

Softies on Rails: Rails 2.0.2

So I believe that for anyone reading this blog, Rails 2.0.2 is a must-have upgrade. Just watch out for the new default to SQLite3 instead of MySQL for new applications.

というわけで、Rails-2.0.2では、デフォルトで使用されるDBがMySQLから
Sqlite3に変更されたようです。初めて使う人にとっての敷居が下がるのは良いことですね。

See Also

更新履歴

  • 2007/12/19 See Alsoを追加
posted by genki genki on Tue 18 Dec 2007 at 04:11 with 0 comments

Rails勉強会@東京#25
に参加してきました。

photo01

今回は、勉強会終了後に
東京と関東Rubyの忘年会2007
とmergeされるという事で、普段よりも参加者が多めでした。
賑やかで良かったです。

流れとしては、

  • 3回ほど前から続いているランチ懇親会
  • 前半セッション(DBの話)
  • 笹田さんによるキーノートスピーチ(Ruby 1.9の話)

という感じでした。

ランチ懇親会

shachi
さんやYuumiさんとe-mobileの
スピードテストをしつつ、
The Rails Way
や
Advanced Rails Recipes
がRails 2.0対応していて良さそう、というような話をしていました。

それからSimple DB面白そう、という話もしたような気がします。
まだリリースされてないのですけど、出たら使ってみたい。

DBの話

西さんを捕まえて、第七正規形とか、Rails 3.0に必要なのはなん
だろうというような話をしていました。

User.find :all, :conditions => {:deleted => nil}
みたいなのは簡単に記述出来るけど、:deleted => not nil
な条件を指定したいような状況では、
:conditions => 'deleted IS NOT NULL' とやらないといけない
ので面倒だな、という話から、nilの補集合を表すような
記号の話になり、集合の切り分け方の話、最終的に第七正規形の話
への展開。

他、話した内容のメモ。

  • プラグインをGem化する簡単な方法が欲しい
  • perform_filter的なものが必要
  • detached_after_filterが欲しい
  • backgroundrbでやっているような仕組みを、
    フレームワーク側で用意しても良いのではないか
  • ActiveScaffold GJ!
  • ActiveSearchが欲しい
    • テキスト全文検索のためのアダプタ群が欲しい

笹田さんによるRuby1.9の話

前回に引き続いて、キーノート的なセッション。
なかなかいい感じですね。笹田さん、次回もぜひ。
面白そうだったポイントとしては、

  • ネイティブスレッド
  • RubyGemsとRakeが標準添付
  • {foo: 'bar'}でHash
    • User.find :all, limit: 10, order: 'created_at DESC'
      とかできる
  • proc{|a,b,&block| } ブロック引数でブロックが取れる
  • Hashが全て順序つきHashに

この辺ですね。期待。

posted by genki genki on Mon 17 Dec 2007 at 11:46 with 0 comments

今年のクリスマスにリリースが予定されている
Ruby-1.9.1
ですが、
Rails側でも対応の動きがあるようですね。

[PATCH] Ruby 1.9 compatibility

Aiming for compatibility with Ruby 1.9. The initial patch is incomplete, though nearly all tests pass.

The only substantial breakage is that 1.9 adds a to_time method that converts Time, Date, and DateTime to Time in the local timezone. We have similar methods in Active Support which convert to time in the UTC timezone. The patch overrides the Ruby 1.9 methods in favor of our own.

期待。

posted by genki genki on Sun 16 Dec 2007 at 03:23 with 2 comments

Rails勉強会@東京#02-25

Genki Takiuchi

Recent Situation:

  • Founded
    a small company.
    • And it has already survived 2 months, Yay!
  • Shipped ShootingStar 3.2.5
  • Jogging and swimming.
  • Finally I bought e-mobile (D02HW)
  • And also being with Rails 2.0.1

Favorite Things:

  • C/C++ Template, JavaScript, Ruby.
  • Thinking algorithm, Rendering (CG) and 3D.
  • Vim7, Zsh, GNU screen, rails.vim, ZenTest.

Thank you!

posted by genki genki on Sun 16 Dec 2007 at 02:41 with 0 comments

いろんな環境でよく使うので、指に覚えさせています。

javascript>>
javascript:void(window.resizeTo(1024,768))
<<--

それはさておき、アドレスバーからJavaScriptを実行する
時に、画面遷移しないように使ったりする、このvoid
が気になったので、ちょっと調べてみました。

voidはメソッドではなく演算子

一見メソッドを呼び出しているように見えますが、typeof
等と一緒で演算子です。

Core JavaScript 1.5 Guide:Operators:Special Operators#void

void 演算子は値を返さずに評価する式を指定します。expression は評価する JavaScript の式です。式の周りの括弧はあってもなくてもかまいませんが、使用したほうが見た目はいいです。

したがって、

javascript>>
void window.resizeTo(1024, 768)
<<--

と書いても良いわけですね。

posted by genki genki on Fri 14 Dec 2007 at 10:11 with 4 comments

複数人で開発している場合に、新しく作成したファイルを
svn addし忘れて、Commitもれを発生させてしまうと、
テストが走らなかったり、開発を止めてしまったりと、
様々な悪影響が発生してしまいます。

今回は、Commitもれを防ぐために僕が使ってる方法を紹介します。

やってることは単純で、以下のalias設定を.zshrcに登録しています。

shell>>
alias svn_new='svn stat | grep "^?" | sed "s/? tmp.//" | sed "s/? log.//" | grep .'
<<--

svn statの結果から、log/とtmp/ディレクトリの中身を除外してるだけですね。
あとは、svn_newコマンドを実行すれば、svn add
し忘れてるファイルが無いかどうか簡単に確認できます。

しかし、実際にはconfig/database.ymlやtagsファイルなど、
svn addする必要が無いファイルがだんだん増えてくるので、
そのような場合には適切にsvn:ignoreプロパティを設定していきます。

僕は、手間を省くために、以下のようなzsh関数を作って使っています。

~/.zshrc

shell>>
svn_ignore () {
svn pset svn:ignore -F <(echo $1 && svn pget svn:ignore | sed '/^$/d') $2
}
<<--

使い方はこんな感じです。

shell>>
% svn_ignore something_new_file ./
<<--

svn:ignoreに設定されたファイルは、svn_newに出てこなくなります。

更新履歴

  • 2007/12/14 CometのやりすぎでComitになっていたのでCommitに訂正。
posted by genki genki on Thu 13 Dec 2007 at 12:45 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

Rails Plugin Watcherとしては、
とても興味深い内容の記事がPostされていました。

10 Ruby On Rails Plugins You Should Be Using

One of Ruby on Rails strengths is how easy it is to extend with Ruby Gems and plugins, becuase you don’t have to code everything yourself you can save a lot of time. One problem facing Rails codes is knowing what plugins are out there and how to use them. The following is a list of 12 plugins that should make your coding life much easier and save you a fair bit of time.

タイトルでは10と言ってるけど、実際には11個紹介されてるようです。
本文には12って書いてるからもっと増えるのかも?

簡単に使えて時間節約効果が高いもの、
という観点でチョイスしてるみたいですね。
acts_as_taggable_on_steroids はぜひ使うべきですね。
Tag系のプラグインの中では最高峰だと思います。

それ以外は、結構趣味の問題かなという気もしますね。

posted by genki genki on Thu 13 Dec 2007 at 01:04 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

気がついたら、何語で書いてあるかわからないブログを購読してた。

ブログの中に書いてあるソースコードだけが頼り。

それでも言いたいこと、書きたいことは伝わってる。多分。

もしも、もしも、
発音されることを意識されて設計されたプログラミング言語
が広く普及したら。

百科事典はクラスライブラリだ。

posted by genki genki on Tue 11 Dec 2007 at 00:46 with 0 comments

Fuシリーズ
に新しい仲間が登場。

Running Long Background Tasks In Ruby On Rails Made Dead Simple

BackgroundFu is simple. It has a nice interface resembling ActiveRecord (see examples below). It is small (51 lines of code, 73 lines of specs) and easily understandable. It’s perfect for doing those shiny ajax progress bars showing how busy your box is. It just works.

名前からして
BackgrounDRB
に近いのですが、機能も似ています。でももっとシンプル(Dead Simple)らしい。

プラグインリポジトリはこちらです。

posted by genki genki on Tue 11 Dec 2007 at 00:15 with 0 comments

しばらく間が空いてしまいましたが、
ShootingStar version 3.2.5
をリリースいたしました。

主な変更点は、iPhone/iPod Touchへの対応とバグ修正です。

iPhone/iPod Touchでは、flashによる接続が出来ないため、
強制的にXHRモードで接続を行うようになっています。

今後の開発方針としては、version 4.0
に向けて、Windows環境への対応を行います。

よろしくお願いします。

posted by genki genki on Mon 10 Dec 2007 at 19:26 with 0 comments

まつもとさんも何度か記事を書いていたMUDA
(作者が発音してるのを聞いた感じだと「ムーダ」と読むみたい)の
サイト
がオープンしたようです。

MUDA site opens!

I’ve launched MUDA project page! Check it.

MUDA is a vector language for CPU.
Yeah, not for GPU or (dead and gone) GPGPU ;-)

I’m planning to use MUDA to code core computation part of my lucille renderer.

おめでとうございます!

posted by genki genki on Mon 10 Dec 2007 at 01:09 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

今では、このプラグインのお世話になるような状況にはならなくなった
のですが、多人数でRailsアプリケーションを開発している場合には
便利なプラグインかもしれません。

Renumber clashing Rails migrations in one easy step

If you work in a team on a Rails project, chances are that you and your team mates occasionally create identically-numbered migrations. Renumbering a migration that you're working on is a pain, unless you're using this handy 'renumber_migrations' plugin.

このプラグインを使うと、マイグレーション番号が衝突した場合に、
Subversionのリポジトリを確認して、あるべき順序に番号を
振りなおしてくれます。

Subversionを使って管理していないプロジェクトでは使えないですが、
ちょっとソースを書き換えれば他のSCMを使ってる場合でも対応できる
ようにするのは難しくなさそうです。

使い方

まずは、以下のコマンドでプラグインをインストールします。

pre>>
% ./script/plugin install http://rails.sanityinc.com/plugins/renumber_migrations
<<--

あとは、Rakeタスクを実行するだけです。

pre>>
% rake db:migrate:renumber
<<--

posted by genki genki on Mon 10 Dec 2007 at 00:21 with 0 comments

巷では
Google Chart API
が注目を集めていますが、
その裏でひっそりとリリースされたもうひとつの
Chart APIがあるをご存知でしょうか。

Kao Chart API

kao_chart

この画像は、元同僚の安藤さんが開発した
Kao Chartというサービスが提供している
Kao Chart APIを使って生成しています。

サーバが弱いらしく、ちょっと重たいですが、
面白いですね。「ざわざわ」パラメータが秀逸。

posted by genki genki on Sun 9 Dec 2007 at 22:12 with 0 comments

思い返せば、Widgetという名前を最初に見かけたのは、
wxWindowsなどのGUIツールキットのクラス名(wxWidgetとか)
だったような気がします。

最近、Yahoo! WidgetやGoogle Gadgetなど、WidgetやGadgetという名称を
よく見かけますが、意味的な違いの認識が曖昧だったので
ちょっと調べてみました。

ウィジェット - Wikipedia

グラフィカルユーザインターフェースを構成する部品要素、およびその集まり→ウィジェット (GUI)、ウィジェット・ツールキット。「window gadget」の合成語ともいわれている。

なるほど、Window + GadgetでWidgetだったのか。

posted by genki genki on Sun 9 Dec 2007 at 21:37 with 0 comments

xxxx_controller.rbはXxxxControllerが定義されているべき、
というようなエラーメッセージが出た場合、
XxxxControllerのクラス定義のなかでエラーが発生している
事が原因だったりするみたいですね。

お手製の acts_as_xxxxx を使ってたりする場合、
その辺でエラーを出してないかチェックすると良いようです。

posted by genki genki on Sun 9 Dec 2007 at 05:44 with 0 comments

debianで普通にsnmpdをパッケージからインストールすると、

pre>>

netstat -lnp | rak snmp

17|udp 0 0 127.0.0.1:161 0.0.0.0:* 13404/snmpd
<<--

このように、127.0.0.1にbindしてlistenするようになっているため、
プライベートネットワーク内のほかのサーバ
(cactiとかが動いているもの)から接続できません。

この辺の設定を変えるには、/etc/default/snmpdを
以下のように編集します。

pre>>
..(略)..

snmpd options (use syslog, close stdin/out/err).

SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 192.168.10.123'

..(略)..
<<--

192.168.10.123というのは適当な数字です。
あとはsnmpdを再起動しましょう。

posted by genki genki on Sun 9 Dec 2007 at 01:16 with 0 comments
新しいscriptとして、`script/performance/request`というものが 新たに加わったみたいです。 pre>> h% ./script/performance/request --help USAGE: ./script/performance/request [options] [session script path] -n, --times [0000] How many requests to process. Defaults to 100. -b, --benchmark Benchmark instead of profiling --open [CMD] Command to open profile results. Defaults to "open %s &" -h, --help Show this help <<-- ふむふむ。ベンチマーク系のスクリプトのようですね。 紹介してる記事を見つけました。 [**New in Rails: a request profiler for profiling your app**](http://blog.codefront.net/2007/10/26/new-in-rails-a-request-profiler-for-profiling-your-app/) >Jeremy Kemper (aka bitsweat) committed a very useful tool into the Rails trunk not too long ago: a request profiler! It’s a human-friendly wrapper script around the ruby-prof library, a nice ruby code profiler, that lets you run multiple requests against a URI in your application and get a detailed code profile report in text and HTML. おーなるほど。前回のRails勉強会で紹介した ruby-prof を human-friendlyにしてくれるツールですか。これは面白そうですね。 試してみようと思って触ってみたら、上のサイトで紹介されてる ものと、Rails 2.0で入ったものは若干インターフェイスが違う模様。 DHHが書いてる [こっちの情報](http://weblog.rubyonrails.com/2007/12/7/rails-2-0-it-s-done) が最新のようです(以下に抜粋)
**Action Pack: New request profiler** Figuring out where your bottlenecks are with real usage can be tough, but we just made it a whole lot easier with the new request profiler that can follow an entire usage script and report on the aggregate findings. You use it like this: $ cat login_session.rb get_with_redirect '/' say "GET / => #{path}" post_with_redirect '/sessions', :username => 'john', :password => 'doe' say "POST /sessions => #{path}" $ ./script/performance/request -n 10 login_session.rb And you get a thorough breakdown in HTML and text on where time was spent and you’ll have a good idea on where to look for speeding up the application. なにやらIntegrationTestのコードのようなものを記述したスクリプト を用意して、そのpathを渡せば良いみたいです。
posted by genki genki on Sat 8 Dec 2007 at 21:53 with 0 comments

先日お伝えしたとおり、Rails 2.0がリリースされましたね。

Rails 2.0: It's done!

Rails 2.0 is finally finished after about a year in the making. This is a fantastic release that’s absolutely stuffed with great new features, loads of fixes, and an incredible amount of polish. We’ve even taken a fair bit of cruft out to make the whole package more coherent and lean.

Railsを使い始めたのが2005年の12月、ちょうどRails 1.0がリリースされた
ころの事。あれからちょうど2年の歳月が流れました。
感慨深いものです。

末尾が偶数バージョンがリリースされると、すぐに奇数バージョン
が跡を追うのは相変わらずですね ;-)

早速ですが、このブログシステムもRails 2.0(2.0.1)に移行しました。
1.2.5から、RC1、RC2を経て、バージョンアップをしてみましたが、
特に大きな問題は発生しなかったです。

posted by genki genki on Sat 8 Dec 2007 at 09:41 with 0 comments

基本はstableで使いつつ、ちょっと使ってみたい新しい
パッケージがある場合だけ、unstableから持ってくるような使い方を
する場合のaptの設定メモ。

まずはsources.listにunstableを追加。

/etc/apt/sources.list

pre>>
deb http://cdn.debian.or.jp/debian/ etch main contrib non-free
deb-src http://cdn.debian.or.jp/debian/ etch main contrib non-free

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

deb http://cdn.debian.or.jp/debian/ unstable main contrib non-free
deb-src http://cdn.debian.or.jp/debian/ unstable main contrib non-free
<<--

それがすんだら、優先度の設定を行います。

/etc/apt/preferences

pre>>
Package: *
Pin: release a=stable
Pin-Priority: 100

Package: *
Pin: release a=stable-proposed-updates
Pin-Priority: 110

Package: *
Pin: release a=unstable
Pin-Priority: 90
<<--

ついでに、キャッシュ容量の設定なども行っておきましょう。

/etc/apt/apt.conf

pre>>
APT::Cache-Limit "100000000";
APT::Default-Release "stable";
<<--

上記の設定ファイルファイルが無い場合は、新しく作成します。

これで完了。あとはapt-get updateすればOK。
必要に応じて、-t unstable オプションを指定して unstableの
パッケージを利用できます。

posted by genki genki on Sat 8 Dec 2007 at 07:35 with 0 comments

acts_as_searchableを使う程度であれば、例えばDebianなら、
aptでhyperestraierのパッケージを入れるだけで十分なのですが、
estcmd等のコマンドラインツールを使ったりしようとすると、
estraier
というRubyGemsが必要になったりします。

pre>>

estcmd

/usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:304:in report_activate_error': Could not find RubyGem estraier (> 0) (Gem::LoadError) from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:238:in activate'
from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:76:in active_gem_with_options' from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:50:in gem'
from /usr/local/bin/estcmd:15
<<--

このestraierをインストールするためには、HyperEstraier
のパッケージ以外にも、
QDBM
の開発用ライブラリパッケージを
インストールしておく必要があります。

shell>>

aptitude install libqdbm-dev

<<--

あとは、gemコマンドで通常通りにestraierをインストールします。

shell>>

gem install estraier

<<--

これで estcmd などのコマンドラインツールが使えるようになります。

pre>>

estcmd

estcmd: command line utility for the core API of Hyper Estraier

usage:
estcmd put [-cl] [-ws] db [file]
estcmd out [-cl] db expr
estcmd edit db expr name [value]
estcmd get db expr [attr]
estcmd uriid db uri
estcmd inform db
estcmd optimize [-onp] [-ond] db
estcmd merge [-cl] db target
estcmd search [-vu|-va|-vf|-vs] [-gs|-gf|-ga] [-cd] [-ni] [-sf|-sfr|-sfu|-sfi] [-attr expr] [-ord expr] [-max num] [-sk num] [-aux num] [-dis name] db [phrase]
<<--

posted by genki genki on Fri 7 Dec 2007 at 17:57 with 0 comments

Changeset 8321 - Rails Trac - Trac

Preparing for release shortly

Tracのタイムラインを見ていたら、Rails 2.0が本日
(米国時間だと12/6)リリースするみたいですね。

rails_2_0

posted by genki genki on Fri 7 Dec 2007 at 08:50 with 0 comments

ワークパイル(Work pile)は、並列処理の為のアルゴリズムの一種です。

lucille 開発日記: マルチスレッド化: ワークパイル

簡単に云ってしまえば、ワークパイルはサーバ/クライアント機構と似たようなもので、ジョブを処理するスレッド部分ではマスタースレッドから仕事(ジョブ)を受け取って処理し、仕事がなくなるまでループするというものです。

いわゆる生産者消費者問題を解決する手法の一つですね。
ちょっとサンプルコードを見てもらったほうがはやいかも。

workpile.rb

ruby>>
require 'thread'

class Workpile
def initialize(num_workers)
@queue = Queue.new
@workers = ThreadGroup.new

# Spawn worker threads
num_workers.times do |i|
  @workers.add(Thread.new do
    puts "Worker #%d is ready." % i
    loop do
      @queue.pop.call # work
      puts " (#%d)" % i
    end
  end)
end

end

def push_task(&block)
@queue.push block
@workers.list.sort_by{rand}.each{|worker| worker.run} # wake up!
end

def start
while input = gets.chomp
break if input == 'exit'
input.split('').each do |i|
push_task{print i}
end
end
end
end

Workpile.new(3).start
<<--

出力結果

shell>>
% ruby workpile.rb
Worker #0 is ready.
Worker #1 is ready.
Worker #2 is ready.
hello!
h (#0)
e (#2)
l (#1)
l (#0)
o (#2)
! (#0)
<<--

3つのワーカースレッドを作成して、投入したタスクを処理しています。
RubyのQueueは同期の面倒を見てくれるので、何も考えずにpushと
popでタスクのやり取りを行うことができてしまいます。
しかも、キューが空になったらカレントスレッドを停止するように
なってるんですね。

並列処理というとC/C++でCriticalSectionやmutexのネイティブAPIを
さわるようなのばかりだったので、こんなに簡潔に記述できるのは
良いですね。やはりインターフェイス重要だな。

クリスマスに出る(という噂の)Ruby 1.9でネイティブスレッド化されたら、
もっと楽しいかもしれませんねー。

posted by genki genki on Fri 7 Dec 2007 at 06:14 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

昨年
に続いて今年も、
東京と関東のRubyの忘年会2007
が行われるようです。

Rubyistの皆さん、今年も一年間お疲れさまでした。

RubyKaigi2007での感動的スピーチがまだまだ記憶に新しい今日この頃ですが、早いもので師走を迎え、今年も残すところあと一ヶ月となりました。

ということで、今年の振り返りと来年に向けた英気を養う場として忘年会を行いたいと思います。皆様お誘い合わせのうえ、年忘れ出来る人も出来ない人も(出来ないけど忘れたい人も)奮ってご参加くださいませ。

早速参加申請。もろはしさん、幹事お疲れ様です。

posted by genki genki on Mon 3 Dec 2007 at 12:28 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.
Install a plugin: shell>> % rapt install continuous_builder <<-- Install a plugin from a subversion URL: shell>> % rapt install http://dev.rubyonrails.com/svn/rails/plugins/continuous_builder <<-- Install a plugin and add a svn:externals entry to vendor/plugins shell>> % rapt install -x continuous_builder <<-- Show information about the acts_as_chunky_bacon plugin: shell>> % rapt about acts_as_chunky_bacon <<-- List all available plugins: shell>> % rapt list <<-- List plugins in the specified repository: shell>> % rapt list --source=http://dev.rubyonrails.com/svn/rails/plugins/ <<-- Search available plugins: shell>> % rapt search "authentication" <<-- Discover and prompt to add new repositories: shell>> % rapt discover <<-- Discover new repositories but just list them, don't add anything: shell>> % rapt discover -l <<-- Add a new repository to the source list: shell>> % rapt source http://dev.rubyonrails.com/svn/rails/plugins/ <<-- Remove a repository from the source list: shell>> rapt unsource http://dev.rubyonrails.com/svn/rails/plugins/ <<-- Show currently configured repositories: shell>> % rapt sources <<-- Show the options for the list command: shell>> % rapt list -h <<-- Install a plugin pack: shell>> % rapt pack:install http://opensource.agileevolved.com/pluginpacks/standard.pluginpack <<-- View plugin pack meta data: shell>> % rapt pack:about http://opensource.agileevolved.com/pluginpacks/standard.pluginpack <<--
posted by genki genki on Sun 2 Dec 2007 at 03:05 with 0 comments

Creating OpenSearch plugins for Firefox
を参考に、このブログの検索機能をOpenSearchプラグインに対応しました。

FirefoxやFlock、CaminoなどのMozilla系のブラウザの検索バーから、
サイト内を検索することができます。

posted by genki genki on Sun 2 Dec 2007 at 00:38 with 0 comments

aptitude update したらこんなエラーメッセージが出たので、対処法をメモ。

/etc/apt/apt.conf.d/70debconf

ini>>
APT::Cache-Limit 100000000;
<<--

後は普通に aptitude update でOK。

posted by genki genki on Sat 1 Dec 2007 at 00:15 with 0 comments
Contents rssrss
光ファイバーを二次元振動させて走査するAR用ディスプレイ
因果の取り違え
Swift2's defer for CoffeeScript
mongodb-3.0からcreateIndexのdropDupsが無くなったらしい
mongodb-3.0以降のWiredTigerの設定を動的に変更する方法
一般楕円の高速生成アルゴリズムへの道標
farro mantecatoのレシピ
Droonga関連の記事のまとめ
RuntimeErrorの特定のメッセージに限定してrescueする方法
jQueryでscriptタグを実行せずにappendする
Tags
railsrubyplugintipsお知らせmemonewsutils紹介gemthoughts運用debianeventcometopenidトラブルblogerrorjs
Comments rssrss
瀧内元気 瀧内元気: MacOS版は以下にあります genki/ViMouse 01/16 05:40
dsjf dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これでも出... 01/08 23:23
瀧内元気 瀧内元気: おお、チェックしてみます。thx! 12/24 05:23
overisland overisland: Reeder for iPhone もこの UI を実装していますね。 12/24 05:13
瀧内元気 瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 http:... 12/01 12:20
tkawa tkawa: http://devcenter.heroku.com/articles/rails31_herok... 12/01 10:47
瀧内元気 瀧内元気: どもー。いまはgithubに置いてあります https://github.com/genki/irb... 07/10 08:31
ともち ともち: こんにちは! すばらしいプログラムをありがとうございます。しかし、merbiのドメイン、切れているみ... 07/10 02:30
Services from s21g
MagicBag
MagicBagは、Cloudflare R2やS3互換ストレージをMacのFinderから扱えるファイル同期クライアントです。
アンテナショップめぐり
東京にある全国のアンテナショップ、イベント、特産品を地図や条件から探せるサービスです。
YOMU Web小説リーダー
YOMUは、Web小説の読み上げに特化したiPhoneアプリです。
補助探
公開されている補助金・助成金情報を集約し、条件に合う制度を探しやすくするサービスです。
jotter.me
jotter.meは、考えやアイデア、情報を書き留めるためのノートサービスです。