GLASSプレゼン資料訳
GLASSというのはSmalltalkを使って実用的なサービスを公開するときの推奨構成みたいな感じ?
- GemStone: オブジェクトサーバー (OODB?)
- Linux: OS
- Apache: ウェブサーバー
- Seaside: アプリケーションサーバー
- Smalltalk
正直、期待したような資料でもなかったですが、せっかく訳したので公開。
そういえば、一つよく分からなかったこと。
GemStoneってOODBだと思ってたんですが、資料を読むとGemStone/Sって書くときはそれがSmalltalkの一実装であるような書き方してる。結局GemStoneってなんなんだろう。
http://seaside.gemstone.com/GLASS-StS2007.pdf
GLASS - GemStone, Linux, Apache, Seaside, Smalltalk
Ruby on Railsにインスパイアされたこと
Rubyはオブジェクト指向言語の一つ
Ruby on Railsはウェブアプリケーションフレームワーク
- 基本的なウェブサイトに必要なロジックやビューのほとんどを一気に生成してくれる革新的なスキャフォルドを備える
なぜSeasideに興味を持ったか
Ruby on Railsはウェブ開発環境としてのRubyに開発者の注目を呼ぶ熱狂をもたらした
SeasideはSmalltalkにとって同じような役割を果たしている
- Rails程完全ではない (DBのサポートは含まない)
- できることは、ずっとうまくやっている
商用利用の例
Seasideとは
Squeak/Smalltalkを用いた開発環境が統合されたエンタープライズ版アプリケーションサーバ
Seasideはどこから来たのか
標準的なウェブアーキテクチャ
[図]
Seasideが魅力的なのはなぜか
複雑なウェブアプリを構築するのは困難である
- HTTPは静的なページを扱うように設計されている。リクエスト/レスポンスモデルからなり、ページ間に渡って状態を保持できない
- 些細なアプリケーションを除けばどんなアプリケーションにも状態は必要で、そのため数多くのハックが生まれた
- 他のフレームワークでは抽象化された管理しやすい形でユーザーインターフェースを構築するのが難しい
- それぞれのUIインタラクションのコードはお互いについて知っておく必要がある − 単体では存在できない
ボタンを押されると保存された状態は壊滅する
Seasideはその問題をどう解決したか
いくつかのSmalltalkの方言でも
- Squeak
- VisualWorks (Cincom)
- VA Smalltalk (Instantiations)
- Dolphin (Object Arts)
- GemStome
Seasideを使うために必要なもの
Seasideを扱うためにはSmalltalkに継続が必要になる
- サポート
- Squeak
- VisualWorks
- Dolphin
- GemStome/S (64bit 2.2.0以降)
- 未サポート
- VA Smalltalk
なぜSeasideをGemStoneに移植したか
それ以外のSmalltalkはシングルユーザで永続化も弱い
- つまりSeasideアプリケーションがマルチユーザー永続化に関する組み込みの制約下で動作しなければいけないということになる
GemStoneの値はスケーラブルにマルチユーザーのために永続化されている形でSmalltalkアプリケーションに渡される
- GemStoneにはGUIがないが(゚ε゚)キニシナイ!!
永続化への挑戦
Smalltalkでの永続化アプローチ
- イメージに
- イメージをquitしたらデータが失われる
- イメージ間で共有できない
- バイナリとしてファイルアウト
- サイズに制限がある
- オブジェクトIDが保持されない
- 外部データベースに
- オブジェクト/リレーショナル マッピングのオーバーヘッドがある
- 外部インターフェース用の余計なコードが必要
GemStone/Sを使うとこれらの問題が解決される!
マルチユーザー連携への挑戦
Smalltalkでのマルチユーザーアプローチ
- 一つのイメージを複数人で使う
- イメージにレイヤーを指定した問い合わせをできる必要がある
- スケーラビリティに限界がある
- 外部データベースを利用して協調する
- オブジェクト/リレーション マッピングが面倒
- 外部インターフェース用の余計なコードが必要
GemStone/Sを使うとこれらの問題が解決される!
スケーラビリティへの挑戦
Smalltalkでのスケーラビリティのアプローチ
- ハードウェアを追加する
- 基本的にはシングルスレッドのまま
- より多くのイメージを使う
- 永続化やマルチユーザーの問題がそのまま残る
GemStone/Sを使うとこれらの問題が解決される!
Smalltalkのウェブサーバ
Seasideはウェブサーバを必要とする
- 組み込み
- Swazoo
- Hyper (Swazooから分岐)
- Kom (かつてのComanche)
- 外部 - FastCGIが必要
- 我々としては組み込み(開発者用)と外部(製品用)のどちらもサポートしたい
HyperをGemStone/Sに移植
HyperはSwazooのHTTPサーバのBruce Badgerのブランチ
BruceはGS/Sの以前のバージョン上で動作するバージョンを持っていた
- GsRandom
- Sport
- OpenSkills
- Hyper
どこでSeasideを手に入れたか
Squeak内にある「公式」バージョン
既存のSeasideの移植版
- Dolphin
- VisualWorks
基本的な移植プロセスは少々やっかい
- Squeakからエクスポートして
- 他の方言にインポート
MonticelloをSqueakからGemStone/Sに移植
マルチユーザーイメージの複雑さ
- ユーザーはそれぞれ異なるパッケージをロードできる
- パッケージには他のパッケージにあるクラスのメソッドを追加したり置き換えたりできる
- 他のクラス/メソッドを共有するにはどうする?
GsPackage
- sessionMethods
- Prereqs
- symbolDict
セッションメソッド1
古典的なメソッドルックアップ:
- Array
- SequenceableCollection
- Collection
- Object
セッションメソッド2
新しいメソッド検索(トップダウン):
- ArrayのためのSessionMethods
- Array
- SequenceableCollectionのためのSessionMethods
- SequenceableCollection
- CollectionのためのSessionMethods
- Collection
- ObjectのためのSessionMethods
- Object
最初の検索以降、メソッドはキャッシュされる
どうやってSeasideを手に入れるか
Monticelloを使ってSqueakSource.comからロードする
GemStone/Sコンパイラはアンダーバーで代入できるように変更された*1
url _ 'http://seaside.gemstone.com/'.
このおかげでコードを直接ロードできる
これでMonticelloのツールを使ってw/o clutterのバージョンを比較できる
SqueakSource
SeasideアプリケーションはMonticelloパッケージのサーバーとして振舞う
- SqueakSourceにインストールされたSqueakイメージはサーバーとして振舞える
SqueakSourceサーバーを干すとする特定のインターネットドメインがある
GemStone/SはSqueakSrouceをインストールされたアプリケーションとしてホストできる
Apacheとどうやって組み合わせるか
ほとんどのSeasideアプリケーションはSmalltalkのHTTPサーバー(例: Kom)を利用する
巨大なアプリケーションは通常は別個のウェブサーバーを必要とする
FastCGI
snip...
デモ
- /etc/apache2/conf.d/mod_fastcgi.conf
- FSDemoHandler>>anserResponderRole:
- FSGsDemoHandler
- FSSeasideHandler
パフォーマンス
ページ/秒
- Squeak: 〜30
- VisualWorks: 〜60
- GemStone
- Commit every page: 〜60
- Commit every 200 page: 〜200
スケーリング
マルチVMs
- それぞれが分離したOSプロセスである
- それぞれがデータベースにフルアクセスできる
- ほぼ線形にスケーリング
マルチホスト
- 実際の生産システム
- 1500VMs; 200hosts
- テスト
- 3000VMs; 1テラバイトデータ; 160億オブジェクト
Jade: SqueakでのGemStone/Sツール 1
クライアントは共有ライブラリ(WindowsのDLL)経由でアクセスする
- GemStone C言語インターフェース(GCI)
SqueakでGCIにアクセスするための外部関数インターフェース
Jade: SqueakでのGemStone/Sツール 1
ユーザーインターフェース使用可
- ログイン
- ワークスペース
- コードブラウザ(コード編集)
- デバッガ(レジューム/終了)
- メソッドリスト
まだない
- デバッガでのブレークポイント/ステップ実行
- インスペクタ
質問
ドキュメント(これのような(^_^;;)
- http://www.seaside.st/Community/MailingList/
- subscribe-gemstone-smalltalk@earth.lyris.net
メール
- James.Foster@GemStone.com
- Dale.Henrichs@GemStone.com
Rubyのcaseって
同僚のコードで見たんだけど
case when t < Time.now.last_month.beginning_of_month '先月以前' when t < Time.now.beginning_of_month '今月以前' when t < Time.now.next_month.beginning_of_month '来月以前' else '未来' end
caseって対象オブジェクトなくてもいいんすね。驚いた。Rubyのパーサ空気読みすぎ。if/elsifでいいじゃん、というのは皆様に代わって私が突っ込んでおきました。
とりあえず比較対照が何か分からないと気持ち悪いので、これも試してみた。
case when NilClass 'nil' else 'not nil' end
結果は「nil」。ふむ、やはり。
ついでに、別の同僚に教えてもらったイディオム。
(t < Time.now.last_month.beginning_of_month) ? '先月以前' \ : (t < Time.now.beginning_of_month) ? '今月以前' \ : (t < Time.now.next_month.beginning_of_month) ? '来月以前' \ : '未来'
こっちの方が好きだな。
¥なしですんだらもっといいんだけど。