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

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

hash_ext.rb

   1  class Hash
   2    def compact!(method = :nil?)
   3      each do |key, value|
   4        value.compact! method if value.respond_to? :compact!
   5        delete key if value.send method
   6      end
   7    end
   8  
   9    def compact(method = :nil?)
  10      dup.compact! method
  11    end
  12  end

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

   1  >> {'foo' => [], :bar => nil, :baz => ""}.compact
   2  => {"foo"=>[], :baz=>""}
   3  >> {'foo' => [], :bar => nil, :baz => ""}.compact :blank? # Rails
   4  => {}

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

   1  >> {'foo' => {:bar => nil, :baz => ""}}.compact
   2  => {"foo"=>{:baz=>""}}
   3  >> {'foo' => {:bar => nil, :baz => ""}}.compact :blank? # Rails
   4  => {}

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

   1  class UserController
   2    def update
   3      @user = User.find(params[:id])
   4      @user.update_attributes(params[:user].compact :blank?)
   5    end

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

posted by Png genki on Wed 12 Dec 2007 at 08:28

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

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

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

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

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

posted by Png genki on Tue 11 Dec 2007 at 00:46

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 Png genki on Tue 11 Dec 2007 at 00:15

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

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

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

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

よろしくお願いします。

posted by Png genki on Mon 10 Dec 2007 at 19:12

まつもとさんも何度か記事を書いていた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 Png genki on Mon 10 Dec 2007 at 01:09

最近話題の ActiveScaffold の開発メンバーでもあるLance Ivy氏のレポート。

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 というプラグインを作ったとの事。

具体的には、こんな感じで違いが出るようです(以下に抜粋)

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 Png genki on Mon 10 Dec 2007 at 00:36

今では、このプラグインのお世話になるような状況にはならなくなった のですが、多人数で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を使ってる場合でも対応できる ようにするのは難しくなさそうです。

使い方

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

   1  % ./script/plugin install http://rails.sanityinc.com/plugins/renumber_migrations

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

   1  % rake db:migrate:renumber

posted by Png genki on Mon 10 Dec 2007 at 00:20

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

Kao Chart API

kao_chart

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

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

posted by Png genki on Sun 9 Dec 2007 at 22:12

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

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

ウィジェット - Wikipedia

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

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

posted by Png genki on Sun 9 Dec 2007 at 21:37

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

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

posted by Png genki on Sun 9 Dec 2007 at 05:12