GLASSプレゼン資料訳

GLASSというのは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のサポートは含まない)
  • できることは、ずっとうまくやっている
商用利用の例

http://www.dabbledb.com

Seasideとは

Squeak/Smalltalkを用いた開発環境が統合されたエンタープライズアプリケーションサーバ

  1. Squeak/Smalltalk
  2. Enterprize
  3. Application
  4. Server
  5. Integrated
  6. Develoment
  7. Environment
Seasideはどこから来たのか
  • まず最初は、Avi BryantがAppleWebObjectsを参考にRubyでウェブ開発フレームワークを作成した
  • それから、Aviは「一般的により豊かな環境とライブラリ群、よりディープで経験豊富なコミュニティ」の力を借りるためにそのフレームワークSmalltalkに移植した
  • その後、Aviはそれ以外のアプローチによる制約を避けて、継続をSmalltalkに追加した
標準的なウェブアーキテクチャ

[図]

Seasideが魅力的なのはなぜか

複雑なウェブアプリを構築するのは困難である

  • HTTPは静的なページを扱うように設計されている。リクエスト/レスポンスモデルからなり、ページ間に渡って状態を保持できない
  • 些細なアプリケーションを除けばどんなアプリケーションにも状態は必要で、そのため数多くのハックが生まれた
  • 他のフレームワークでは抽象化された管理しやすい形でユーザーインターフェースを構築するのが難しい
  • それぞれのUIインタラクションのコードはお互いについて知っておく必要がある − 単体では存在できない
  • ボタンを押されると保存された状態は壊滅する
Seasideはその問題をどう解決したか
  • 提供されるページはそれぞれが継続(つまりプログラムスタック)と関連を持つので、連続したリクエストをユーザーがサブミットしたときに巻き戻ることができる
  • この魔法のおかげで、プログラマはウェブを通じたインタラクションのそれぞれを、独立したリクエスト/レスポンスではなく、連続したやり取りの一部として扱うことができる
  • 関係のないコンポーネントを一つのウェブページに混ぜ込むことがもっと簡単になる
Demo

Smalltalk

  • WACounter
いくつかのSmalltalkの方言でも
Seasideを使うために必要なもの

Seasideを扱うためにはSmalltalkに継続が必要になる

Demo

Smalltalk

  • BlockClosure>>callCC
  • Continuation
なぜSeasideをGemStoneに移植したか

それ以外のSmalltalkはシングルユーザで永続化も弱い

  • つまりSeasideアプリケーションがマルチユーザー永続化に関する組み込みの制約下で動作しなければいけないということになる

GemStoneの値はスケーラブルにマルチユーザーのために永続化されている形でSmalltalkアプリケーションに渡される

  • GemStoneにはGUIがないが(゚ε゚)キニシナイ!!
永続化への挑戦

Smalltalkでの永続化アプローチ

  • イメージに
    • イメージをquitしたらデータが失われる
    • イメージ間で共有できない
  • バイナリとしてファイルアウト
    • サイズに制限がある
    • オブジェクトIDが保持されない
  • 外部データベースに
    • オブジェクト/リレーショナル マッピングのオーバーヘッドがある
    • 外部インターフェース用の余計なコードが必要

GemStone/Sを使うとこれらの問題が解決される!

マルチユーザー連携への挑戦

Smalltalkでのマルチユーザーアプローチ

  • 一つのイメージを複数人で使う
    • イメージにレイヤーを指定した問い合わせをできる必要がある
    • スケーラビリティに限界がある
  • 外部データベースを利用して協調する
    • オブジェクト/リレーション マッピングが面倒
    • 外部インターフェース用の余計なコードが必要

GemStone/Sを使うとこれらの問題が解決される!

スケーラビリティへの挑戦

Smalltalkでのスケーラビリティのアプローチ

  • ハードウェアを追加する
    • 基本的にはシングルスレッドのまま
  • より多くのイメージを使う
    • 永続化やマルチユーザーの問題がそのまま残る

GemStone/Sを使うとこれらの問題が解決される!

Smalltalkのウェブサーバ

Seasideはウェブサーバを必要とする

HyperをGemStone/Sに移植

HyperはSwazooのHTTPサーバのBruce Badgerのブランチ

BruceはGS/Sの以前のバージョン上で動作するバージョンを持っていた

  • GsRandom
  • Sport
  • OpenSkills
  • Hyper
デモ

Smalltalk

  • HTTPServer
  • OSkSocketListenerService
どこでSeasideを手に入れたか

Squeak内にある「公式」バージョン

既存のSeasideの移植版

基本的な移植プロセスは少々やっかい

  • Squeakからエクスポートして
  • 他の方言にインポート
Squeakでのソースコードコントロール

Monticello

  • 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

最初の検索以降、メソッドはキャッシュされる

Demo

Smalltalk

  • GsPackage
  • SessionMethods
どうやって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)を利用する

巨大なアプリケーションは通常は別個のウェブサーバーを必要とする

  • 静的ページを処理
  • SSL(httpsリクエスト)を処理
  • 負荷分散
  • フェイルオーバーバックアップ
  • セキュリティ(ハッカー耐性)
  • サーバ管理の分離
デモ

Apache

  • /srv/www/htdocs/index.html
FastCGI

snip...

デモ

Apache

  • /etc/apache2/conf.d/mod_fastcgi.conf

Smalltalk

  • 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億オブジェクト
デモ

マルチ仮想マシン

  • Browser to daleh-t60
Jade: SqueakでのGemStone/Sツール 1

クライアントは共有ライブラリ(WindowsのDLL)経由でアクセスする

  • GemStone C言語インターフェース(GCI)

SqueakでGCIにアクセスするための外部関数インターフェース

Jade: SqueakでのGemStone/Sツール 1

ユーザーインターフェース使用可

  • ログイン
  • ワークスペース
  • コードブラウザ(コード編集)
  • デバッガ(レジューム/終了)
  • メソッドリスト

まだない

デモ

Squeakツール

ホストされたサンドボックス

GemStoneサーバーのセットアップ、設定、管理が不要

インターネットで共有されるサーバー

アカウントが与えられる

質問

ドキュメント(これのような(^_^;;)

メーリングリスト

メール

  • James.Foster@GemStone.com
  • Dale.Henrichs@GemStone.com

*1:Squeakは _ が ← に割り当てられていて代入につかえるんですが、普通のSmalltalkの代入は := なのでSqueak形式の代入を受け付けるようにGemStoneを改造したみたい