Upload
ao27
View
2.979
Download
3
Embed Size (px)
DESCRIPTION
C++ Webアプリケーションフレームワーク TreeFrog Framework の紹介
Citation preview
C++ Webアプリケーションフレームワーク
TreeFrog Framework の紹介
AOYAMA Kazuharu
Webアプリケーションフレームワーク
● Ruby on Rails● symfony● CakePHP● Struts● SpringMVC
etc.Wikipedia 情報 : 100以上
C++のWebアプリケーションフレームワークはどのくらいあるのか
● Wt ● CppCMS● Tntnet (Wikipediaから)
→ Rails や symfony と比べて機能的に見劣り...→ 簡単にWebアプリが作れるものがなさそう
なぜ C++ のは少ないのか
~ 開発していて思うこと ~
● 文字エンコーディング● データベースドライバ● リフレクション機能
(実行中のプログラムの情報を取り出したり,変更したりすること)
● クロスプラットフォーム
→ これらを実装する必要がある
じゃ、Qt を使えば
● Qt 4.5 から LGPL を加えたトリプルライセンス
→ 企業でも使いやすくなった
→ 開発してみる気になった
:
:
→ そこそこなものができた気がする
→ 公開してみた
TreeFrog Framework とは
2009年に開発を始める
● 高速動作
● C++プログラマでもWebアプリケーションが開発できる!
● Model View Controller (MVC) アーキテクチャ
Rails や symfony などを参考にした
● フルスタック (を目指しています)
● クロスプラットフォーム
● Webアプリケーションサーバに位置するフレームワーク
ブラウザ WebサーバWebアプリケーションサーバ
DBサーバ
ここ
TreeFrogで何ができるのか
● O/Rマッピング → SQL をほとんど書かなくて良い
● テンプレートシステムあります → ERB と Otama
● URLルーティング設定を書かなくともデフォルトの動作 → URLからアクションを決定
● ジェネレータ (足場となるコード)● ユニットテスト
MVC
モデル DAO
(ORM)
ビュー
コントローラリクエスト
レスポンス
Web Application
ブラウザ(Webサーバ)
DB
ヘルパ
スキャフォールディング
● 足場となるコードの自動生成● データベースにテーブルを作成しておいてから● オプション
● MVC全部
● コントローラのみ● モデルのみ● ORMオブジェクトのみ
..など
ちなみに、マイグレーション機能はありません
コントローラ
● 中心的なクラス● ブラウザからのリクエストを受け取り ● モデルを中心としたビジネスロジックを呼び出し
● ビューにHTMLレスポンスの生成を依頼
URLからアクションの決定
/コントローラ名/アクション名/引数1/引数2/…
ORMオブジェクト
● O/Rマッピング (ORM)
SQLを直接記述すると煩雑になりがち → これを軽減
※ プレースホルダを使って安全にSQLも呼べる
● 1レコードが1オブジェクトに関連付く
● CRUD
id name address
100 John England
101 Paul Merseyside
102 George Liverpool
103 Ringo England
オブジェクト int id; QString name; QString address;
Table
モデル
● ブラウザに返す内容(抽象的な情報)を表現するオブジェクト、あるいはその集まり
● モデルクラスは通常のクラス
→ 何かを継承しなければならないという制限なし
● モデルはORMオブジェクトを持つ
→ has-a の関係 2つ以上持っても構いません
ビュー
● HTMLを生成してレスポンスを返す役割● ビュー全体で1つの動的ライブラリ(共有ライ
ブラリ、DLL)に変換される● テンプレートシステム
– テンプレートを読み込み、必要な箇所を動的に書き換えて出力する
● アクション毎にテンプレートを作る
テンプレートシステム
● ERBプログラムコードをテンプレートに埋め込むシステム(ライブラリ)
HTMLの中に <% … %> 形式でコードを記述
● OtamaHTMLテンプレートとプレゼンテーションロジックを完全に分離したテンプレートシステム
HTMLテンプレート
ロジック(C++)
C++コード 共有ライブラリ(View)
テンプレートコンパイラ
C++コンパイラ
Otama テンプレートシステム“Hello world” を出力する
● HTMLテンプレート側:● 書き換えたい要素(タグ)にマークをつける
例: p要素に #hello というマーク
● プレゼンテーションロジック側:
● マークと C++ コードを関連づけ
● 空行までが1つのセット
#hello ~= "Hello world" → あるいは
#hello := "Hello world" →
<p data-tf="#hello"></p>
<p>Hello world</p>
Hello world
ビューへのデータの受け渡し
● エクスポート (コントローラ側)
QString hoge = "Hello world";texport(hoge);
● フェッチ (ビュー側)
もし変数が QString 型であれば
<% tfetch(QString, hoge); %> :<%= hoge %>
<%=$ hoge %>
セキュリティ
● SQLインジェクション対策– ORM オブジェクトを使う
– プレースホルダを使う– エスケープ処理をする
● クロスサイト・スクリプティング対策– eh() メソッドか、<%= … %> を使って値を出力する
● CSRF対策– 何らかの処理(更新や削除など)を実行するページで
は、POSTメソッドでリクエストを受け付けるようにする
– その前のページで秘密情報(hiddenパラメータ)を挿入しておき(form()メソッド)、実行ページでそれを検証する
パフォーマンス
● PC: MacBook Pro 2.4GHz Intel Core 2 Duo, 4GB 1067MHz DDR3
● httperf を使用
● MPM: thread (MPM.thread.MaxServers=20)
● DBレコード: 0件
● キャッシュシステム: 無
→ 1秒間に約 562 回のリクエストを処理
Total: connections 10000 requests 10000 replies 10000 test-duration 17.800 sConnection rate: 561.8 conn/s (1.8 ms/conn, <=1 concurrent connections)
その他の機能
● ロギング
● メーラー(SMTP)
● 認証● プラグインで機能追加
● Makefile自動生成 → qmake
TODO
● HTML5への追随
● NoSQLデータベース対応
● その他いろいろ...
実演
質問タイム
開発者、翻訳者(英訳)、テスター
募集!募集!
ユーザメーリングリストまでご連絡を
ご静聴ありがとうございましたご静聴ありがとうございました