1 00:00:00,560 --> 00:00:01,360 こんにちは。 2 00:00:01,600 --> 00:00:04,880 この講義では Seaside ウェブフレームワークを カバーします。 3 00:00:05,160 --> 00:00:08,240 Pharo でウェブアプリを構築するための 創造的な方法です。 4 00:00:08,480 --> 00:00:12,200 Seaside は強力で、かつ、柔軟です。 5 00:00:12,480 --> 00:00:17,240 Seaside は再利用可能でステートフルなコンポーネントを 6 00:00:17,600 --> 00:00:21,520 ステートレスなプロトコルである HTTP の 上に構築しています。 7 00:00:22,600 --> 00:00:26,040 Seaside はもちろん、そのままでセキュアです。 8 00:00:26,200 --> 00:00:29,200 Ajax などや REST アーキテクチャのような 9 00:00:29,360 --> 00:00:31,760 最新の Web2.0 テクノロジーを統合しています。 10 00:00:33,040 --> 00:00:36,200 これは Seaside の URL です。 11 00:00:36,920 --> 00:00:42,120 Seaside の無料オンラインブックのような ドキュメンテーションを得ることができます。 12 00:00:42,400 --> 00:00:45,560 また、Seaside のチュートリアルも 一通り揃っています。 13 00:00:45,880 --> 00:00:49,520 さらに、Seaside メーリングリストで 質問することもできます。 14 00:00:49,800 --> 00:00:54,800 アクティブなコミュニティから 質問への答えが得られるでしょう。 15 00:00:56,320 --> 00:00:59,920 ちょっと歴史の話をします。 Seaside は 2002 年から提供されています。 16 00:01:00,080 --> 00:01:01,640 そしてアクティブにメンテナンスされています。 17 00:01:01,920 --> 00:01:04,520 Seaside フレームワークは 18 00:01:05,080 --> 00:01:07,800 Pharo の成功事例の多くの基礎になっています。 19 00:01:07,960 --> 00:01:11,200 それらの事例は Pharo のサイト pharo.org で見ることができます。 20 00:01:11,640 --> 00:01:15,640 見ればわかる通り ウェブのプロジェクトが多くあり 21 00:01:16,040 --> 00:01:18,520 その大部分が Seaside フレームワークを 使っています。 22 00:01:18,960 --> 00:01:23,960 前に言いましたが Seaside はコンポーネントを中心にした 23 00:01:24,200 --> 00:01:26,680 ウェブフレームワークです。 24 00:01:26,840 --> 00:01:30,400 コンポーネントは再利用可能で ステートフルなのものです。 25 00:01:30,640 --> 00:01:35,880 HTML でコンポーネントを描画するための ドメイン特化言語(DSL)を持っています。 26 00:01:36,560 --> 00:01:39,160 それらのコンポーネントを構成するためのルールは 27 00:01:39,440 --> 00:01:43,160 後の講義でカバーします。 28 00:01:43,800 --> 00:01:46,760 ウェブアプリケーションは ルートのコンポーネントです。 29 00:01:46,920 --> 00:01:51,160 Seaside では、アプリケーションを 実行中にデバッグすることができます。 30 00:01:51,640 --> 00:01:53,360 Pharo のデバッガーで。 31 00:01:53,720 --> 00:01:56,840 このコースの続く講義で 32 00:01:57,120 --> 00:02:01,080 フォームを自動生成するために使う メタデータについて学びます。 33 00:02:02,680 --> 00:02:05,280 これらは 34 00:02:05,440 --> 00:02:10,080 2002年から開発されている Seaside で作られたウェブアプリケーションの例です。 35 00:02:10,640 --> 00:02:12,560 いくつかを見てみましょう。 36 00:02:12,720 --> 00:02:16,200 このアプリケーションでは グラフを豊富に使っていて 37 00:02:16,360 --> 00:02:20,320 コンポーネントを組み合わせて 複雑なアプリケーションを作っています。 38 00:02:20,920 --> 00:02:25,680 もう1つは、Pharo のウェブサイトで 見ることができる例ですが 39 00:02:26,040 --> 00:02:28,840 複雑な表を食い合わせて 40 00:02:29,000 --> 00:02:32,440 レポートを出力しています。 41 00:02:32,880 --> 00:02:36,440 Seaside フレームワークを使うと とてもシンプルに構築することができます。 42 00:02:38,120 --> 00:02:41,360 Seaside の主要なコンセプトは コンポーネントです。 43 00:02:41,680 --> 00:02:44,800 コンポーネントは Seaside フレームワークが 提供する 44 00:02:44,960 --> 00:02:47,120 WAComponent のサブクラスです。 45 00:02:47,720 --> 00:02:50,520 コンポーネントは再利用可能で ステートフルです。 46 00:02:50,680 --> 00:02:55,040 HTML の div 等の要素として描画されます。 47 00:02:55,960 --> 00:03:00,440 Seaside ではウェブアプリケーションには ルートのコンポーネントが 48 00:03:00,760 --> 00:03:02,720 (この場合は WACounter ですが) 49 00:03:02,920 --> 00:03:06,080 置かれています。 50 00:03:06,240 --> 00:03:10,400 これは Counter という名前がつけられて URL からその名前でアクセスできます。 51 00:03:11,040 --> 00:03:14,560 ここに Counter アプリケーション例の URL があります。 52 00:03:14,760 --> 00:03:17,840 これは HTML で描画されたコンポーネントです。 53 00:03:18,200 --> 00:03:21,840 カウンターの値はゼロです。 ここに 2 つのリンクがあります。 54 00:03:22,160 --> 00:03:25,240 ++ をクリックするとインクリメントして 55 00:03:25,480 --> 00:03:28,200 -- をクリックするとデクリメントします。 56 00:03:29,160 --> 00:03:32,720 このアプリケーションを実装するコードは とてもシンプルです。 57 00:03:33,000 --> 00:03:36,520 WAComponent のサブクラスとして WACounter を作ります。 58 00:03:36,680 --> 00:03:39,160 インスタンス変数 count を持っています。 59 00:03:39,760 --> 00:03:43,480 初期化メソッドがカウンタを 0 にセットします。 60 00:03:44,040 --> 00:03:47,800 値をインクリメントするメソッドと デクリメントするメソッドがあります。 61 00:03:48,640 --> 00:03:51,720 ここで HTML の部分が必要になります。 62 00:03:52,000 --> 00:03:54,520 それで counter を HTML に描画します。 63 00:03:54,680 --> 00:03:57,520 やることは 描画方法をメソッドとして 与えてあげることだけです。 64 00:03:57,680 --> 00:03:59,800 renderContentOn: に引数がつきます。 65 00:04:00,360 --> 00:04:03,160 引数を使って HTML コードを生成できます。 66 00:04:04,520 --> 00:04:08,280 ここに WACounter クラスの renderContentOn: の 67 00:04:08,520 --> 00:04:09,880 例があります。 68 00:04:10,040 --> 00:04:14,280 この引数は 通常の Pharo のオブジェクトですが 69 00:04:15,360 --> 00:04:19,080 Seaside から提供される WAHtmlCanvas クラスのインスタンスです。 70 00:04:19,400 --> 00:04:23,520 このオブジェクトにメッセージを送って HTML コードを生成します。 71 00:04:23,680 --> 00:04:25,920 見出しや アンカーつまりリンクなど。 72 00:04:26,360 --> 00:04:29,160 callback: メッセージで 73 00:04:29,320 --> 00:04:32,560 リンクがクリックされた時に実行する コードブロックを指定できます。 74 00:04:32,720 --> 00:04:35,520 ここでは ++ リンクがクリックされたら 75 00:04:35,680 --> 00:04:38,320 self increase が実行されます。 76 00:04:38,560 --> 00:04:43,920 -- をクリックすることで self decrease が実行されます。 77 00:04:44,440 --> 00:04:45,400 とてもシンプルですね。 78 00:04:46,880 --> 00:04:51,840 リンクをクリックして コールバックでエラーが発生したら 79 00:04:52,000 --> 00:04:56,600 ここで意図的にブレークポイントを 挿入してありますが、これでエラーになります。 80 00:04:57,040 --> 00:05:00,240 decrese メソッドに ブレークポイントを挿入しました。 81 00:05:00,600 --> 00:05:05,120 カウンターがゼロより小さい値になれば self が停止(halt)します。 82 00:05:05,520 --> 00:05:08,240 するとデバッガが立ち上がります。 83 00:05:09,040 --> 00:05:12,440 見ての通り これをウェブアプリでやったら 84 00:05:12,600 --> 00:05:14,480 デバッガがここに表示されます。 85 00:05:14,640 --> 00:05:19,440 ここにプログラムのアプリケーションスタックが renderContentOn: のところで表示されます。 86 00:05:20,120 --> 00:05:22,720 そしてここに decrease があります。 87 00:05:23,600 --> 00:05:25,480 haltIf: で停止しました。 88 00:05:25,800 --> 00:05:28,680 ここでコードを修正することができます。 89 00:05:29,000 --> 00:05:30,560 Proceed をクリックします。 90 00:05:30,960 --> 00:05:34,040 すると HTML レスポンスを受け取ります。 91 00:05:34,200 --> 00:05:36,080 何事もなかったかのように。 92 00:05:39,080 --> 00:05:42,800 ウェブアプリでのもう 1 つの問題は 「戻る」ボタンです。 93 00:05:43,240 --> 00:05:45,480 「戻る」をクリックすると 94 00:05:45,640 --> 00:05:48,600 サーバーとクライアントの同期が壊れます。 95 00:05:48,960 --> 00:05:53,640 カウンタを 5 回インクリメントしたとします。 今、スクリーン上に 5 が表示されています。 96 00:05:53,880 --> 00:05:57,600 そしてブラウザの「戻る」ボタンをクリックすると 97 00:05:57,920 --> 00:05:59,840 カウンタは 4 と表示されます。 98 00:06:00,000 --> 00:06:03,520 しかしサーバーは「戻る」ボタンを押した ことによる更新がされていません。 99 00:06:03,680 --> 00:06:08,640 なので、また ++ をクリックすると スクリーンには 6 が表示されます。 100 00:06:09,280 --> 00:06:13,320 問題は、サーバー側は まだ 5 だと思っていることです。 101 00:06:13,640 --> 00:06:14,800 5 + 1 は 6 です。 102 00:06:15,320 --> 00:06:18,520 Seaside を使うと「戻る」ボタンの扱いが とても楽になります。 103 00:06:18,680 --> 00:06:22,160 WACounter クラスに 新しいメソッド states を定義します。 104 00:06:22,600 --> 00:06:26,560 states は「戻る」ボタンが押された時のために 105 00:06:26,720 --> 00:06:28,520 保存しておくべき状態の配列を返します。 106 00:06:28,680 --> 00:06:32,360 この場合には self つまりカウンターのみです。 107 00:06:33,200 --> 00:06:36,640 さて、「戻る」ボタンをクリックして ++ をクリックしてみると 108 00:06:36,880 --> 00:06:38,680 5 になるはずです。 109 00:06:41,640 --> 00:06:46,280 コールバックは Pharo の力を全て備えた 110 00:06:46,520 --> 00:06:49,040 コードブロックです。 111 00:06:49,360 --> 00:06:53,440 コールバックには Pharo の どんなコードでも書くことができます。 112 00:06:54,040 --> 00:06:56,960 さらに複雑な例を用意しました。 113 00:06:57,240 --> 00:07:01,160 カウンターを 1 増やすか あるいは 2 増やすかを 114 00:07:01,320 --> 00:07:05,200 count の値が奇数か偶数かで 分岐することができます。 115 00:07:05,760 --> 00:07:11,720 偶数の場合には偶数の場合よりも速く増加します。 116 00:07:12,560 --> 00:07:17,000 見ての通り、Pharo はコールバックとして 117 00:07:17,160 --> 00:07:18,920 本当にパワフルな言語です。 118 00:07:21,560 --> 00:07:25,840 元の例に戻ると、 ++をクリックすると 119 00:07:26,240 --> 00:07:30,720 新しいウィンドウが開いて 120 00:07:31,920 --> 00:07:35,600 偶数だと知らせてくれます。 121 00:07:36,800 --> 00:07:40,560 次に、挨拶アプリの書き方をお見せします。 122 00:07:40,720 --> 00:07:43,160 ユーザーは自分の名前を入力します。 123 00:07:43,400 --> 00:07:47,720 ここに入力します。 そして「Say Hello,」をクリックすると 124 00:07:48,640 --> 00:07:52,680 「Hi」に続いてユーザーの名前が 表示するようにしたいと思います。 125 00:07:53,040 --> 00:07:55,160 ここで最初に入力します。 126 00:07:56,760 --> 00:08:01,600 これを Seaside で実装するのは とても簡単です。 127 00:08:01,960 --> 00:08:05,160 WAComponent のサブクラスとして Greeter クラスを作ります。 128 00:08:05,360 --> 00:08:07,240 インスタンス変数は username です。 129 00:08:07,400 --> 00:08:10,240 ここでお見せしている renderContentOn: メソッドは 130 00:08:10,880 --> 00:08:14,080 username フィールドを表示します。 131 00:08:14,240 --> 00:08:15,920 次の行は textinput です。 132 00:08:16,120 --> 00:08:20,680 前に見た、「Bob」と入力した あのテキストフィールドです。 133 00:08:20,840 --> 00:08:22,520 コールバックを定義します。 134 00:08:22,760 --> 00:08:26,240 今回は 引数 value 付きのブロックです。 135 00:08:26,760 --> 00:08:30,840 引数 value に渡されるのは 136 00:08:31,360 --> 00:08:33,480 ユーザーが入力した文字列です。 137 00:08:33,800 --> 00:08:36,280 それをインスタンス変数に代入します。 138 00:08:36,440 --> 00:08:39,000 Greeter コンポーネントの username です。 139 00:08:39,520 --> 00:08:42,960 次に submit ボタンがクリックされた時に 140 00:08:43,320 --> 00:08:48,040 self inform: を使って 新しいコンポーネントを呼び出します。 141 00:08:48,200 --> 00:08:51,520 「Hi, Bob」と表示するようにします。 142 00:08:51,920 --> 00:08:56,480 文字列「Hi」と、username として 入力された文字列を連結します。 143 00:09:00,040 --> 00:09:03,760 ウェブアプリを開発したことがある人たちには 144 00:09:03,920 --> 00:09:06,320 Seaside ではリクエストや URL から パラメータを得るために自分でパースする 145 00:09:06,760 --> 00:09:11,800 必要がないことに気付いたでしょうか。 146 00:09:11,960 --> 00:09:16,520 XML 設定ファイルなどのファイルやページは 必要ありません。 147 00:09:16,920 --> 00:09:20,240 次のページへのリンクについても 私は何も言いませんでした。 148 00:09:20,640 --> 00:09:23,480 今まで言ってきたことは コンポーネントと 149 00:09:23,640 --> 00:09:25,320 オブジェクトとメッセージの話だけです。 150 00:09:25,640 --> 00:09:27,160 コールバックや 151 00:09:27,320 --> 00:09:32,160 Pharo のデバッガーで ライブにデバッグすることを話しました。 152 00:09:33,360 --> 00:09:36,960 まとめると、Seaside では 簡単にウェブアプリケーションを構築できます。 153 00:09:37,200 --> 00:09:41,960 ルートとなるコンポーネントが 1 つあって コンポーネントを組み合わせて 154 00:09:42,240 --> 00:09:44,400 より複雑なアプリケーションを構築します。 155 00:09:44,600 --> 00:09:48,000 コンポーネントは renderContentOn: で そのコンポーネント自身を HTML で描画します。 156 00:09:48,680 --> 00:09:51,960 豊かなドメイン特化言語を使って 157 00:09:52,240 --> 00:09:55,240 それぞれのコンポーネントの HTML コードを生成することができます。 158 00:09:55,400 --> 00:09:58,680 次のビデオでより詳細に説明します。