flowrとは?

ブログや Wiki を使うときに、「使い勝手はこちらのツールが気に入っているんだけど、機能が足りないんだよなあ」とか「ブログサービスにこの機能を追加したいんだけど、勝手にそんなこと出来ないし……」などと思ったことはありませんか?
他の人が作った Web アプリケーションやサービスの連携や拡張を行ったものの、相手がバージョンアップして仕様が変わってしまったために、作り直さなくてはならなくなったという経験はありませんか?

flowr (フラワー) はそれらの問題を解決しうる方法の一つとして構想している、「外付け可能な Web 間アプリケーションフレームワーク」です。

flowr の仕組み

flowr が対象とするのは、パーマネントリンクを持つ Web アプリケーションです。一般的なブログや Wiki、Amazon のような製品情報ページの URL が一定のルールで固定化できる EC サイトなどが当てはまります

flowr の最も基本的な特徴は、URI の指す各リソースに対しステートマシンでその振る舞いを定義し、また個々の URI に対してメタデータを付加・制御することができるというものです。
Web アプリケーション に flowr を使って機能を追加するために必要なことは、各リソースの URL を取得する方法を用意するだけです。例えばブログの場合はブログパーツを貼り付けることで flowr との連携を行います。

flowr 本体は Ruby で実装されており、アプリケーション(ステートマシンの振る舞い)は Ruby による内部 DSL で記述します。

# flowr DSL の例(部分)
class SampleStateChart < StateChart
  # 対象URL。正規表現やロジックも記述可
  target_site :url=>'http://sample.com/blog/'
  
  # 本文部&タイトル部を抽出する場合のルール
  setting :body_xpath=>'div.entry-body'
  setting :title_xpath=>'#archive-title'

  class NotOwnedState < State
    name "所有者無し"
  end
  class OwnedState < State
    name "所有者有り"
  end

  class ThrowDiceTransition < Transition
    name "さいころを振る"
    edge :NotOwnedState, :NotOwnedState  # 遷移を定義
    edge :OwnedState, :OwnedState
    
    def guard(context)   # 遷移可能か判定
      if context.properties.join then
        '進んでください' if context.properties.dice > 0
      else '参加してください' end
    end
    
    def action(context)  # さいころを振る
      context.properties.dice = rand(6)+1
    end
  end

  class PurchaseTransition < Transition
    name "購入"
    edge :NotOwnedState, :OwnedState

        :

この DSL はブログパーツの動作(状態、可能な遷移、各種プロパティの表示)も記述します。アプリケーションが異なっても同じブログパーツを使用することが出来、アプリケーション毎にブログパーツを作り直す必要はありません。

flowr の応用範囲

flowrイメージ図

今後の flowr

flowr でどういったことができるかの一例としてコンセプトアプリケーション companula(カンパニュラ) を公開しています。
この companula の整備を行いながら、flowr そのものを試してもらえるようなアプリケーションをまた別途用意して、RubyForge などで公開することを予定しています

flowr についてのその他の情報