履歴情報を用いた 英単語学習ツールの開発

Download Report

Transcript 履歴情報を用いた 英単語学習ツールの開発

CMSにおけるDSL適用による
利便性向上の研究
信州大学
工学系研究科 情報工学専攻
海尻・海谷研究室
06TA681F
青木 淳夫
発表内容
•
•
•
•
•
•
•
•
研究の背景
研究の目的
基盤技術
DSLの検討
動作実験
考察
まとめ
今後の課題
研究の背景
• データベースを利用する機会(Webサイトの管理
や財務データの管理等)が増えてきている
• データを取得して表示するには、SQLやプログラ
ムを記述せねばならない
• 専門教育を受けたプログラマしかデータ取得/設
定できない問題がある
• プログラマ以外のWeb管理者やWebデザイナでも
データを表示できるようにしたい
研究の目的
• 本研究では、簡単にデータを取得して表示できる
DSL(Domain Specific Language)を考案する
• DSLの適用先としてCMS(Contents Management
System)を想定する
• DSLモジュールを開発することで、プログラマの
作業を介さずにデータの取得と表示を行い、CMS
サイト運営の利便性向上と作業量削減を目指す
基盤技術1(CMS)
• CMS(Contents Management System)は、ブラウ
ザのコントロールパネルから簡単にサイトのコ
ンテンツを管理できるWebシステム
• モジュールという部品を利用して機能追加可能
• プロダクト例…Xoops/DotNetNuke/MT等
次期SUGSIの
ポータルサイトも
Xoopsにて構築
基盤技術2(DSL)
• ドメイン特化言語(DSL:Domain Specific
Language)は、ある特定の種類の問題に特化し
たコンピュータ言語。ミニ言語。
• 外部DSL
 ホスト言語から独立し、自由な文法を定義可能
 実装が困難な場合がある
 Java、C#のような強い型付け言語で使用されやすい
• 内部DSL(言語内DSL)
 ホスト言語内に、ライブラリ/API的に構築される
 ホスト言語の機能を利用でき、実装が容易
 Ruby、Lispのような構文が柔軟な言語と相性が良い
DSLモジュールが
CMSにおいて解決する問題
• 従来
Webサイト
管理者
Web
デザイナー
プログ
ラマー
• DSLモジュール導入後
CMSに新しいデー
タを表示させたい
データ取得DSLを定義
HTMLをデザイン
HTMLをデザイン
データ表示DSLを定義
SQLとHTML埋め
込むプログラム
を作成
作業なし
DSLモジュールの機能
• データ取得DSLを解析し、SQLとプログ
ラムを生成し、実行する。
• 取得したデータは変数に格納されHTMLに
埋め込まれ出力する
データ取得
DSLを設定
データ表示
DSLを設
定
SQLが
実行される
HTMLに
埋め込まれて
出力される
DSLモジュールの構成
• DSLモジュールの構成
データ取得DSLの検討(1)
• データ取得DSLの要件
 データの抽出が可能である
 SQLのSELECT文を実行する。また条件、並び順の指定を可
能とする
 営業担当者のようなエンドユーザが安心して使えるよう選択
(SELECT)のみを実行可能とする。データの追加(INSERT)、
更新(UPDATE)、削除(DELETE)は考慮しない
 人間が記述しやすい構文である
 SQLよりも簡単に理解でき、記述/修正が容易な構文を採用
する
データ取得DSLの検討(2)
 BOOKテーブルのレイアウト
ID
NAME
ISBN
ISNEW
KIND
PUB_ID
1
ハイレベルJava
1234567890
TRUE
2
1
2
C#入門
8979879893
TRUE
0
2
3
応用Ruby
8999888972
TRUE
1
2
4
Perl入門
8999888978
FALSE
0
2
5
PHP5実践
1234578998
TRUE
1
3
 PUBテーブルのレイアウト
ID
NAME
ESTABLISHED
1
技術出版
1974/12/31 00:00
2
昭和出版
1920/01/20 00:00
3
未来出版
2009/01/01 00:00
案を検討するSQLの例
(新刊を取得するSQL)
SELECT BOOK.*, PUB.*
FROM BOOK
LEFT OUTER JOIN PUB
ON BOOK.PUB_ID = PUB.ID
WHERE ISNEW= 1
OREDER BY BOOK.NAME
データ取得DSLの案(1)
• 初案: SQL簡略化方式(キーワード使用方式)
・構文
OUTPUT TABLE [変数名]
FROM [テーブル名]
[列名] (条件、並び順、別名の
指定)
・例
OUTPUT TABLE NewBooks
FROM BOOK
NAME AS BOOK_NAME 1
ISNEW = TRUE
FROM PUB
NAME AS PUB_NAME
• SQLのSELECT文の代わりに、OUTPUT TABLE
、FROMなどといったキーワードを使用した
• SQLの簡略化を目指したが、SQLに類似してお
り、エンドユーザには難しいと判断した
データ取得DSLの案(2)
• 第2案:SQL簡略化方式(インデント方式)
[変数名]
[テーブル名]
[列名] (条件、並び順、別
名の指定)
NewBooks
BOOK
NAME AS BOOK_NAME 1
ISNEW = TRUE
PUB
NAME AS PUB_NAME
• キーワードの使用をやめ、Pythonのようにイン
デントの位置から変数名、テーブル名、列名を
判断する構文とした
• 初案よりもシンプルになったが、SQLに近くエ
ンドユーザには難しいと判断した
データ取得DSLの案(3)
• 第3案:設定ファイル方式
[変数名]
取得:[テーブル名] [テーブル名]
条件:[条件式]
かつ:[条件式]
または:[条件式]
昇順:[列名]
降順:[列名]
•
•
•
•
NewBooks
取得:BOOK PUB
条件:ISNEW = TRUE
昇順:BOOK.NAME
設定ファイルに類似した構文を考案した
SQL構文を抽象化するのをやめ、エンドユーザが記述できるような構文と
いう観点でアプローチするように変更した
キーワードは、英語キーワードは理解しにくいと考えたため「日本語+コ
ロンという形式を採用した
しかし、実装実験時にコロン記号「 :」の曖昧性と、クエリ文字列の受け
渡しの機能不足が判明した
データ取得DSLの案(4)
• 最終案:設定ファイル方式
[変数名]
取得→[テーブル名] [テーブル名]
条件→[条件式]
かつ→[条件式]
または→[条件式]
昇順→[列名]
降順→[列名]
•
•
•
NewBooks
取得→ BOOK PUB
条件→ BOOK.ID = 【bookid】
昇順→ BOOK.NAME
コロン(:)には半角と全角があり、CMSの管理ページ上では区別がつきにく
いため、区切り文字を→に変更した。
また、リクエストのクエリ文字列をSQLに渡せるように【クエリ文字列】
というパラメータを利用できるようにした。
この場合「http://ホスト名/Url名.aspx?bookid=123」というURLから123と
いう値を代入して実行できる
データ表示DSLの検討(1)
• データ表示DSLの要件
 データを埋め込むことが可能である
 データ取得DSLによって、取得したデータを表示できる。
一件のデータを表示するだけではなく、
複数件のデータを繰り返し表示できる
 Webオーサリングソフトで
プレビューが可能である
 Webデザイナーのような
プログラムに詳しくない人でも
動的なHTMLを生成できるような
DSLを検討する
データ表示DSLの検討(2)
 案を検討するHTMLレイアウト例
出力するHTML
<h3>新刊のお知らせ</h3>
<table>
<tr><td>ハイレベルJava</td></tr>
<tr><td>C#入門</td></tr>
<tr><td>応用Ruby</td></tr>
<tr><td>PHP5実践</td></tr>
</table>
データ取得DSL
News
取得→Book
条件→IsNew = 1
実行されるSQL
SELECT Book.* FROM Book WHERE IsNew = 1
データ表示DSLの案(1)
• 初案:HTMLテンプレート
機能
構文
出力
{変数}
ループ
<!--LOOP(条件)-->
<!--END_LOOP-->
IF文
<!--IF(条件)-->
<!--END_IF-->
<h3>新刊のお知らせ</h3>
<!--IF({News}.COUNT = 0)-->
新刊はありません。
<!--END_IF-->
<!--IF({News}.COUNT != 0)-->
<table>
<!--LOOP({n in News})-->
<tr><td> {n.name}</td></tr>
<!--END_LOOP-->
</table>
<!--END_IF-->
• PHPなどの開発で一般的なHTMLテンプレートを想定して、この構
文を採用した。
• テンプレートで使用するのは変数出力、ループ、IF文のみなので、
この3機能に絞った
• しかし、LOOPやIFというキーワードが難しいため、プログラマ以
外には難しいと判断PHPなどの開発などで一般的なHTMLテンプレ
ートを想定して、この構文を採用した
データ表示DSLの案(2)
• 2案: 日本語の採用、判定条件記述の簡略化
•
•
•
機能
構文
出力
{変数}
{変数.列名}
ループ
<!--繰り返し開始(変数名)-->
<!--繰り返し完了-->
IF文1
<!--ゼロ件であれば開始(変数名)-->
<!--ゼロ件であれば完了-->
IF文2
<!--ゼロ件でなければ開始(変数名)-->
<!--ゼロ件でなければ完了-->
<h3>新刊のお知らせ</h3>
<!--ゼロ件であれば開始(News)-->
新刊はありません。
<!--END_IF-->
<!--ゼロ件でなければ開始(News)-->
<table>
<!--繰り返し開始(News)-->
<tr><td> {News.name}</td></tr>
<!--繰り返し完了-->
</table>
<!--ゼロ件でなければ完了-->
LOOPやIFという英語キーワードではなく、日本語キーワード(XX開始
~XX完了)を使うこととした
条件式が難しいため、変数名のみ指定するようにした。ループはデータ件
数回の繰り返しのみサポート、IF文はデータ有無判定のみサポート
しかし、日本語が長すぎて冗長であり、可読性が悪いため、採用は不可と
考えた
データ表示DSLの案(3)
• 3案: 矢印記号(↓、↑)の採用
•
•
•
機能
構文
出力
{変数}
{変数.列名}
ループ
<!--↓一覧{変数名}-->
<!--↑一覧-->
IF文1
<!--↓データなし{変数名}-->
<!--↑データなし-->
IF文2
<!--↓データあり{変数名}-->
<!--↑データあり-->
<h3>新刊のお知らせ</h3>
<!-- ↓データなし{News}-->
新刊はありません。
<!--↑データなし-->
<!--↓データあり{News}-->
<table>
<!--↓一覧{News}-->
<tr><td> {News.name}</td></tr>
<!--↑一覧-->
</table>
<!--↑データあり-->
「XX開始~XX完了」というキーワードが冗長であり、本来のHTMLコメント
と混乱しやすいため、矢印記号(↓、↑)に変更した
短くてプログラマ寄りのキーワードの採用。
「繰り返し」キーワードを「一覧」に変更し、「ゼロ件であれば(なければ
)」キーワードを「データあり(なし)」に変更した。
しかし、実装実験時に{}記号の曖昧性と、IF文の機能不足が判明した。
データ表示DSLの案(4)
• 最終案:変数記号の変更
機能
構文
出力
【変数】【変数.列名】【変数(行数).列名】
ループ
<!--↓一覧【変数】-->~<!--↑一覧-->
IF文1
<!--↓データなし【変数】-->~<!--↑データなし-->
IF文2
<!--↓データあり【変数】-->~<!--↑データあり-->
IF文3
<!--もし「条件」ならば「真」-->
IF文4
<!--もし「条件」ならば「真」違わば「偽」-->
<h3>新刊のお知らせ</h3>
<!--↓データなし【News】-->
新刊はありません。
<!--↑データなし-->
<!--↓データあり【News】-->
<table>
<!--↓一覧【News】-->
<tr><td> 【News.name】</td></tr>
<td><!--もし「【Books.IsNew】== 0」
ならば「新作」違えば「旧作」--></td>
<!--↑一覧-->
</table>
<!--↑データあり-->
• 変数記号の{}は半角と全角があり区別が困難であったため、【】記
号に変更した。
• 表示の切り変え等で必要なため、自由な条件を記述できるIF文を再
度、採用した。
• ダイレクトに行数を指定できるような、【変数(行数).列名】という
出力をサポートした
動作実験
• 一覧と明細を表示するDSLを定義して、想定したデータ
の取得と表示ができるかを検証する
DSLモジュール
データ取得DSLを
定義する
データ表示DSLを
定義する
Web閲覧者
DSLに応じた
HTMLを表示する
Webサイト
管理者
Web
デザイナー
実験環境
DSLモジュール(ASP.NET/VB)
DSL.DLL(C#)
DotNetNuke4.9.1(ASP.NET/VB)
IIS7
.NET Framework3.5
Windows Server 2008
役割
テクノロジ/プロダクト
CMS
DotNetNuke4.9.1
プログラム言語
C#/VB.NET
Web開発基盤
.NET Framework3.5(ASP.NET)
Webサーバー
IIS7
テスト
TDD(Visual Studioの単体テスト機能)
データ取得DSLの実装(1)
• DSLの解析方法
Books
取得→Book
条件→ID = 1
または→ID = 2
昇順→NAME
降順→ID
Parserがテキスト
形式のDSLを
オブジェクトの
ツリーに展開
データ取得DSLの実装(2)
• SQLの実行方法
 DataBaseクラスが順番にRootクラスに格納され
たQueryからSQLを生成し実行する
 SQLの結果を変数名と共にContextクラスに格納
する
DataBaseクラス
Queryクラス
RDBMS
Contextクラス
SQLの
結果
データ表示DSLの実装
• DSLの解析(変換)方法
 データ表示DSLは、NVelocityに処理を委譲している
 データ表示DSLの構文を、NVelositiyのDSL「VTL」
に正規表現で置換している
 ContextクラスにセットしたSQL結果を、 NVelositiy
でマージしてHTMLを生成する
<!--↓データあり【News】-->
<table>
<!--↓一覧【News】-->
<tr><td> 【News.name】
</td></tr>
<!--↑一覧-->
</table>
<!--↑データあり-->
#if ($News.Rows.Count != 0)
<table>
#foreach($News_row in $News.Rows)
<tr><td> ${News_row.name}
</td></tr>
HTMLクラスで
データ表示DSLを #end
</table>
NVelocityの
#end
テキストに変換
実験の結果(一覧画面)
• DSLに応じた一覧画面が正しく表示された
データの取得が正しく行われた。
明細画面のリンクも埋め込むなどHTMLも正しく出力された。
News
取得→Book Pub
条件→IsNew = 1
<h3>新刊のお知らせ</h3>
<!--↓データなし【News】-->
新刊はありません。
<!--↑データなし-->
<table border="1" cellspacing="0"
bordercolor="silver"><tbody>
<!--↓データあり【News】-->
<tr><th>タイトル</th><th>出版社</th></tr>
<!--↓一覧【News】-->
<tr><td><a href="/tabid/57/bookid/【News.Book_id】
/Default.aspx">【News.Book_name】</a></td>
<td>【News.Pub_name】</td>
</tr>
<!--↑一覧-->
</tbody></table>
<!--↑データあり-->
実験の結果(明細画面)
• DSLに応じた明細画面が正しく表示された
Books
取得→Book Pub
条件→Book.ID = 【bookid】
<h3>新刊の詳細</h3>
<!--↓データなし【Books】-->
書籍はありません。
<!--↑データなし-->
<!--↓データあり【Books】-->
<table border="1" cellspacing="0" bordercolor="silver" style="width: 346px;
height: 70px">
<tbody>
<tr><th>書籍名</th>
<td>【Books(0).Book_NAME】</td></tr>
<tr><th>ISBN</th><td>【Books(0).ISBN】</td></tr>
<tr><th>新作</th><td>
<!--もし「【Books(0).IsNew】 == 0」ならば「新作」違えば「旧作」-></td></tr>
<tr><th>種別</th><td>
<!--もし「【Books(0).Kind】 == 0」ならば「入門者向け」-->
<!--もし「【Books(0).Kind】 == 1」ならば「中級者向け」-->
<!--もし「【Books(0).Kind】 == 2」ならば「上級者向け」-->
</td></tr><tr><th>出版社名</th><td>【Books(0).Pub_NAME】</td>
</tr><tr><th>出版社設立日</th>
<td>【Books(0).ESTABLISHED.ToString("yyyy/MM/dd")】</td>
</tr></tbody></table>
<!--↑データあり-->
考察(1)
• DSL利用における生産性の向上
 DSLモジュールを導入することにより、簡単
にデータを取得/表示できた。データの表示
のみという制限はあるが、モジュールを設定
するだけでデータを取得できることは生産性
の向上につながるといえる。
 その反面、エラー発生時のデバッグと原因追
究は、DSLの解析/実行時のエラーとなるた
め、DSLモジュールの知識がないと理解が困
難になるという問題が判明した。
考察(2)
• DSL設計のポイント
 本研究のターゲットがプログラミングが苦手な人
を想定しているため、DSLの設計において、プロ
グラマではなく利用者の視点に立ちDSL構文を考
えることが重要であることが確認できた。
 DSLの構文設計では、容易性のために日本語を利
用すること、文字数を減らすことを意識した。
DSLをシンプルにすると、逆に、機能を削ること
にもつながるためドメインに特化した必要最低限
の構文を作ることが重要であると認識した
まとめ
• DSLモジュールの導入により、 DSLを記述する
だけで、簡単にデータの取得、HTML埋め込み
が行えた。簡単なデータ表示機能であれば、大
きな問題はない。
• ただし、全てのデータ取得、HTML埋め込みが
行えるわけではなく、DSLで設計/実装した機
能のみという制限がある。そのためDSLの構文
定義を十分に検討するべきである。
今後の課題(1)
• 簡単なDSL構文を採用したために、パフォーマ
ンスが犠牲になっている。例えば列名を指定し
ない代わりに全ての列のデータを取得している
。
今後はSQLのチューニングを行うなどしてパフ
ォーマンスの向上を図りたい
• データ表示時にセキュリティホールができない
ように留意する必要がある。SQLインジェクシ
ョンなどで自由にデータアクセスされたりする
ことがないように注意する必要がある。
今後の課題(2)
• CMS利用者にとって利用しやすいDSLを検討し
てきたが、それでも初心者によってはテキスト
ベースのDSLでの作業は難しい可能性がある。
そのため、グラフィカルなUIを持ったツールや
モデリングツールを提供することで、操作の容
易さを高めることも検討したい
• 同時にデバッグが行いやすいような仕組みも検
討したい