MetaPortal

6/8の「ホームページ作成ツール」ですが、MetaPortalとか名前付けて、本気で開発するも一興じゃないかと思った。

と言うのも、実装できそうだし、ここでJavaScriptとかWebアプリとかをしっかり勉強しておくのも損じゃない。

分散ファイルシステムはどうした?てな話もあるわけですが、それはそれ、これはこれ。



Ruby + JavaScriptで。
全部JavaScriptでも良いかも。kjsとかSpiderMonkeyとかで。いや、JavaScriptだとファイルとかソケットとか使えないからダメか。

モジューラブルなアーキテクチャで、1つのモジュールの構造は↓以下。

hoge/
hoge/main.rb     # Model
hoge/fuga.erb     # default View
hoge/fuga.full.erb   # PC用View
hoge/fuga.mobile.erb  # 携帯用View
hoge/fuga.firefox.erb  # Browser specific View
hoge/fuga.js      # 同じようにJavaScript
hoge/fuga.mobile.js
hoge/fuga.css     # 同じようにCSS


viewはブラウザによって分岐する。
main.rbで、

inject_view :fuga

と書いておくと、ブラウザがIEだったら、まずfuga.ie.erbを探して、無かったらfuga.full.erbを探して、それも無かったらfuga.erbを探す。同じようにCSSとかJavaScriptも。

ファイルが多くなるなぁ…うーむ。しょうがないか。


これでクロスブラウザに対応。




そんな感じでhogeモジュールを作る。
同じように時計モジュールとか、カレンダーモジュールとか、ファイラモジュールとかを作っていくけど、設定データを保存するとか、データをファイルに保存するとか、そう言う機能はどこからでも使う。
そこで、「設定データを保存するモジュール」を作る。で、モジュール同士でお互いを呼び出せるようにする。これでOK。



以上がRubyで書く基盤部分。

続いて見た目部分。ぎゅぃーんとアニメーションするのは、もはや必須の機能であるから、ここをサポートするいろいろが必要。

http://jquery.com/
↑こんな便利なモノを発見したので、これを使う。

http://www.ndesign-studio.com/blog/design/css-dock-menu/
↑こんな激しいモノもできるらしい。





試しに時計モジュールの擬似コードを考えてみる


clock/main.rb
clock/view.rb
clock/digital.erb
clock/ditigal.js
clock/digital.css
clock/digital.mobile.erb
clock/digital.mobile.js
clock/digital.mobile.css
clock/fuzzy.erb
clock/fuzzy.js
clock/fuzzy.css
clock/fuzzy.mobile.erb
clock/fuzzy.mobile.js
clock/fuzzy.mobile.css


# clock/main.rb
class Module_clock
 require "#{moduleDir}/view.rb"

 inject_module :config, :frame
 # 設定データを保存するモジュールと、
 # HTMLのヘッダとフッタを制御するモジュールをinject

 inject_view :digital, :fuzzy
 # digital.{erb,js,css}とfuzzy.{erb,js,css}をinject

 def run
  if @@config.isSet("clock", "use_digital")
   position = @@config.get("clock", "digital_position")
   @@digital.run( position )
  end
  if @@config.isSet("clock", "use_fuzzy")
   position = @@config.get("clock", "fuzzy_position")
   @@fuzzy.run( position )
  end
 end

end



# clock/view.rb
class Module_clock

 class View_digital
  inject_module :tinysnippet
  def initialize(position)
   @position = position
  end
  attr_reader :position
 end

 class View_fuzzy
  def initialize(position)
   @position = position
  end
  attr_reader :position
 end

end



# digital/digital.erb




# digital/digital.js
時計を表示するJavaScriptくらいどこかにあるに違いない。





…面倒だ…もっと簡単に書けないとやってられない。こりゃダメだ。

JavaScriptからサーバーにデータを伝えるにはどうしたらいいのかワカラン…
お、ここでXMLHTTPRequestを使うのか…うーむ。