DRUM

投稿者 nanki 2006-01-19 05:58:00 GMT

ちょっと前から注目のプロジェクト、DRUM が徐々にその姿を現し始めた。

DRUMは、現在、Ruby/Java/C#での開発が進められている、多言語対応の分散オブジェクトブローカー。 ネットワークの向こうのオブジェクトに透過的にアクセスできる仕組み。

個人的には、3Dに凝ってた時代があるので、LookingGlassのAPIをたたくデモが興味深い。

全く本質的じゃないところに興味を持ってしまって後ろめたいのだが。

irbで「光あれ」とかやると光源ができたりするんだろうな。いいなぁそれ。

今度のRuby勉強会でデモが見られそう!

なんだかうれしくなって、気がついたらドラムができてた・・・。

drum

参考:

航海日誌


信頼性

投稿者 nanki 2006-01-16 09:33:00 GMT

レクサスの信頼性が高い理由

一つ一つの部品は完璧だけど水が漏るアメリカの製品と、不完全な部品を組み合わせて信頼性の高い製品を作る日本の自動車メーカーの話。

8年落ちのレクサスのほうが、6カ月落ちのBMW 7シリーズよりも100項目当たりの問題の数が少ないことが明らかになった。

ってすごい違い。

この話をソフトウェア開発で使うとしたら、ユニットテストの結果には目を瞑って、ファンクショナルテストの結果がよければよし、ということか。気持ち悪っ。

というのは冗談で、ソフトウェアテストは、機能的側面についての限定的なものでしかないと見るのが妥当だろう。

例えば、XMLでのレスポンスがエラーステータスを返しているか、ということをチェックするのに、エラーがチェック出来さへすれば、正規表現を使ってもXMLパーサを使ってもいいわけだ。

ソフトウェアテストではそこは見ない。 (ああ、上品なプログラマへの道は遠い・・・)

こういうのを見ると、ソフトウェア開発って品質管理の面でかなり楽できてるんだなぁ、と思う。 使ってるうちに部品が痛んでくる事なんてないし。 複雑な外的要因を考慮しなくていいのが大きい。


Rails Plugins...

投稿者 nanki 2006-01-14 22:10:00 GMT

ユーザ認証をプラグインを使って作ろうと思ったんだけど、

$ script/plugin list

すると、たくさんでてきてどれが何やらさっぱり。 そこでまとめてみた。

認証系

account_location
  • アカウント毎にサブドメインがあるような、スコープ付の認証に。
acts_as_authenticated
  • script/generate authenticated user account で認証機能が作れる
  • メール認証を使ったアクティベーションも作れる
  • generator を使うので、既存のクラスに機能追加するのはできない?
login_engine
  • # in config/environment.rb
    module LoginEngine
    config :salt, "your-salt-here"
    end
    Engines.start :login
    という感じで設定を記述する
  • engines というplugin に依存している
  • rake engine_migrate ENGINE=login でDBのスキーマを変更できる。
  • メール認証も余裕で対応!
user_engine
  • login_engine をさらに拡張する形で、role ベースの認証を組み込める。
  • Engines.start :login
    Engines.start :user
    login_engineより後じゃなきゃダメ。
ssl_requirement
  • include SslRequirement
    ssl_required :signup 
    とすると、signup が実行される時は、ssl にリダイレクトされる。
security_extensions
  • verify_form_posts_have_security_token を使うと、postされた値が正当なものかどうかチェックできる。
  • secure_form_tag を使ってform の中にsession id をハッシュしたトークンを埋め込んでおいて、セッション中の値と比較する、という仕組み。
  • 元ネタはこちら
sentry
  • 指定したフィールド(主にpassword)の値を暗号化してくれる
  • 暗号化の方式は、いくつか選べるようだ。

View系

browser_filters
  • UnicodeContentType: text/html; charset=utf-8 の設定を自動で
  • SafariUnicodeFix: SafariでAjaxを使う時の問題を回避
  • LinkPrefetchingBlock: Google Web Accerator などがリンクを先読みするのをブロック
labeled_form_helper
  • <label>タグのalias
  • <% formfor :person, @person, :url => { :action => "update" } do |f| %>
    First name: <%= f.textfield :first_name %>
    <% end %>
    と書くとFirst name: をラベルに変換してくれる
restifarian
  • Rails をRESTful にしてくれるらしい
  • RailsのモデルにアクセスするためのRESTfulな?URL形式をRoutesで定義しているだけみたい
    • /models/:action -> コレクションに対する操作
    • /model -> 新規作成
    • /model/:id -> エンティティを表示
    • /model/:id/:action -> エンティティに対する操作 といった感じで、ModelsControllerにマッピングしてくれる。
scriptaculous_slider
  • <%= sliderstylesheet %>
    <%= sliderfield :object, :method, :range => 1..10 %>
    とやると、スライダーができる。
localization
  • 多言語対応用
  • <%=_ ‘yes’ %> のように参照
  • 単数/複数にも対応できる
css_graphs
  • ドキュメントは無い
  • 棒グラフが生成できる
  • 一ページに付き一個という制限
asset_timestamping
  • この画像、ブラウザにキャッシュされては困る、というときに使う
  • image_tag('smiley.jpg')
    => <img src="/images/smiley.jpg?1129811151" /> 
    と展開される。
javascript_generator_templates
  • RJS Templates として知られるものと同じ
  • サーバ側でJavascriptを動的に生成、ブラウザに実行させることができる
us_states
  • アメリカ51州のセレクトボックス。
  • 残念ながら日本は含まれていないので、あまり用途はない。
wiki_engine
  • rails_engineでこんなこともできるんだぞ!という例。
  • production品質ではありません、と書かれている
date_slider
  • Flashを使ったデータ表示コンポーネント
  • かっこいいデモムービー
  • Flash/JavaScript間の通信ライブラリを使っているので、Railsから動作をいじれる
head-helper
  • doctype,stylesheet,script,metaなど、<head>の中で使いそうなものを集めました。
enhanced-form-tag-helper
  • formのinput系のタグに、id,class属性が自動的に付加されるようになる
liquid
  • template engineをerbからliquidに変更
  • .rhtml -> .liquid
  • .rhtml と混在可能
  • {{ item.name }} みたいな記法
  • {{ item.name | upcase }} のように、パイプのような表現で出力フィルタをかけられるのが特徴的
  • フォーマット付きテキストを多様するような場合は、記述がシンプルになってよさそう
rails_pdf
  • PDFWriterを使ってPDFが出力できるようになる。
  • テンプレートは.rpdf 中身はrubyのコード
upload_progress
  • アップロードの進み具合を表すバーを作る。
  • requirements
  • コントローラに
    uploadstatusfor  :create
    という感じの記述を加えると、:createアクションでプログレスバーが使えるようになる。

開発系

continuous_builder
  • 最新のリビジョンでのテストの結果をメールで送信してくれる
  • 時間がかかるようなものや、複数のアプリケーションにまたがるような変更をしたときなどに便利そう?
  • Continuous integrationを実現するためのものらしい
exception_notification
  • include ExceptionNotifiable すると、例外が発生したときに然るべき所にメールを送信してくれる
ar_fixtures
  • テスト用のfixturesを今あるデータベースから生成してくれる?
engines
  • ほにゃらら_engine の親分
refactor
  • model,controllerのpublic methodに対するtest stubを自動生成してくれる。
  • rake findunusedviews
    で使われてないview 見つけてくれる。
assert_accessible
javascript-packaging
  • 複数のJavaScriptのソースファイルを実行時にひとつにまとめてくれる
  • 開発時はばらばらなので、見通しがよくなる
  • まだあんまりテストされてない
migrate_ext
  • rake migrate に機能を付加
    • rake current_schema # 現在のバージョン番号を表示
    • rake migrate_ext VERSION=-1 # 一つ前に戻す

ActiveRecord 拡張

acts_as_taggable
  • モデルがタグ漬けに。
  • taggable.tag_with(“frog animal”)
acts_as_versioned
  • モデルがバージョニングに対応しちゃう
  • page = Page.create(:title => 'hello world!')
    page.version       # => 1
    page.title = 'hello world'
    page.save
    page.version       # => 2
    page.title         # => 'hello world'
    page.revert_to(1)
    page.title         # => 'hello world!'
    こんな感じ。
deadlock_retry
  • ActiveRecordが、デッドロックで失敗したトランザクションを自動的にリトライするようになる
  • コードの変更は必要ない
  • 今のところMySQLでのみテスト
acts_as_paranoid
  • paranoid とは偏執狂のこと
  • 削除する時に削除フラグ(ちょと違うけど)を使うようになる
  • 忘れてしまいがちなフラグの指定も、普通にfind するだけで勝手に付く
  • find_with_deleted で削除されたものも検索対象に
calculations
  • group by を使った構文が書ける
  • User.calculate(:count) といった感じ
  • たぶん、:max, :min などもあるだろうな。
  • Order.calculate(:sum, :cost).group_by(:country).having { |sum| sum > 50 }
    SELECT country, SUM(cost) FROM orders GROUP BY country HAVING SUM(cost) > 50
    になる!?
guid
  • class MyModel < ActiveRecord::Base
    usesguid
    ...
    とすると、ID(デフォルト)フィールドに22文字の、URLに使っても大丈夫なGUIDが生成されるようになる。
  • システムの中でuniqueってことだよな。
where
  • findの検索条件をキレイに書ける
  • Model.findwithconditions(:all) do
    year '>', 2005
    name 'like', 'Foo%'
    end
    こんな感じ。
  • 条件をCondクラスのインスタンスに保存しておけば、cond.where をActiveRecord::Base#find の条件として使える。
count_limit_associations
  • Model.count にて、:include を指定した場合でも、Modelの数が数えられる(普通はjoinによって行が増える)
  • paginate でも:include が使えるように
  • Rails本体に取り込まれるかも(pending patch)
  • 1.13.2には取り込まれてない。

その他

numeric_spell
  • 23.spell => ‘twenty-three’ とできるようになる
  • 当たり前のように単数/複数に対応
referenced_page_caching
  • Railsのページキャッシングを拡張して、1:Post といった名前で参照できるようになっている
  • 削除するときにスコープがわかりやすい?
foo_with_install
  • 騙された!?中身ないじゃん

宿題

とりあえず、script/plugin list のは無くなった。ふぅ。

参考:

Plugins in Ruby on Rails え、まだこんなにあるの!?

こっちも。 rails2u SVN Nowhere Near SVN

actsasferret

datebox_engine


先日、HaagenDazsが新フレーバー、ココナツマカロンを出したらしい。

マカロンというと僕は実物を見たことがなくて、まっさきに頭に浮かんだのはケーブルタートルだったけど、あながち間違ってはいないようだ。 (マカロン)

それはそれとして、昨年夏、同じくHaagenDazsがパンナコッタ&ラズベリーを出した時にも、パンナコッタってなんだ?という騒動が僕の周りで起こった。

  1. まず、パンナコッタがピンとこない
  2. 僕が子供の頃にはそんなお菓子はなかった。
  3. ババロアとの違いがわからない
    • パンナコッタの作り方とババロアの作り方に大きな差はない
  4. ムースも作り方が一緒
    • 調査の途中で、ムースの作り方も根本的に違いがないことがわかる

さて困った。

これについて、数人の友人と話しあった結果、ついに答えらしきものにたどり着いた。

パンナコッタ≒ババロア⊂ムース

パンナコッタはイタリア語で、パンナ(クリーム)コッタ(火を通す)。

ババロアは、フランス語でbavarois、英語ではBavarian cream、どちらも、バイエルンの(クリーム)という意味。 ドイツで働いていたフランスの菓子職人が命名したそうな。

ムースは「泡」が語源。

こんな感じで、同じものを指す別の言葉と考えても矛盾しない。 発祥地が違うのに同じもの、というのはちょっと乱暴だけど。

ムースだけはお菓子以外にも登場するので、より広義な言葉だと考えるのが適当。 オマール海老のムースはおいしそうだけど、オマール海老のババロアはふた味くらい違う、でしょ?

日常生活においては、ムースとババロア、パンナコッタの違いは、煮物とおでんの違いと大して変わらない、という認識で支障がないという結論に達したのでした。

めでたしめでたし。

(誰か真相を知ってたら教えて!)

「おしることぜんざいは何が違うか?」につづ・・・かない。


SwitchTower インストール

投稿者 nanki 2006-01-09 18:21:00 GMT

もう二ヶ月近くほったらかしてたSwitchTowerをインストールしてみた。

$ sudo gem install switchtower
...
$ switchtower --apply-to ../rails_app
      exists  config
      create  config/deploy.rb
      exists  lib/tasks
      create  lib/tasks/switchtower.rake

ふむふむ。

config/deploy.rb に設定がたくさんあって、lib/tasks/switchtower.rake にはrake のタスクの記述がある。

さあ、早速使うぞと思いきや、まだデプロイ先がないんだった・・・