• 追加された行はこの色です。
  • 削除された行はこの色です。
RIGHT:[[:t/プロトタイピング]] [[:t/実装]]

実装したものと実装のための情報。
このWikiを洗練させるための試作。
[[http://x.pmint.name/>http://x.pmint.name/]]


#ls

----------

#contents

**プロトタイピング/05 [#k2612436]
***やること [#c8dac453]
-フレームワーク/Webアプリケーション
セッション(認証も)
-フレームワーク/WikiEngine
ページの永続化。
-フレームワーク/WikiEngine/ビュー
WikiEngineレベルでのビュー。
テンプレート(実体はページ)、下位展開。
InterWikiにつながる。
-永続化のシステム
-X/Pages/Name
ページ名4区分と内部名、順不同パス(4区分でのEntry)、プレビューモード
-X/Element
全てURIで、セレクター記法(参照記法)、ページ/属性、権限、権限一覧の表示
「全てURIで」はInterWikiにつながる。
--X/ElementとTokenize
汎用記法、見出しに自動リンク
「汎用記法」は機能別プロトタイプにつながる。

----
注意点
-認証はOpenID
-検索は入っていない
入れるとしたら小検索。
-自動リンクのアルゴリズム
Aho-Corasick法を試して。
***概要図 [#g4797979]
#ref(:Image/abstract.svg,100%)
[[docs.google.com>https://docs.google.com/file/d/0B9sAsjPbXxUHY2ZoejRIS3lkSWs/edit?usp=sharing]]

RIGHT:[[:t/コンセプト]]
***fw/Web [#c7404306]
#ref(:Image/MVC.svg,100%)
[[docs.google.com>https://docs.google.com/file/d/0B9sAsjPbXxUHdmJPc3hTR05SM0E/edit?usp=sharing]]

RIGHT:[[:t/Web]] [[:t/実装]]

***クラス構成 [#ee07f455]
#ref(:Image/p05.svg,100%)

各クラスのプラグインは書かない。
あとはVisitorをElement周辺に付け足すだけでクラスが揃う。
**資料 [#r6f203fe]
***フレームワーク [#hbeb9ad8]
[[:t/Web]]フレームワーク部分と、その上の[[:t/Wiki]]フレームワーク部分。
ページ/[[:t/要素]]が動く環境を作る。
ユーザーからのリクエストを対応する要素に伝えて、その結果をレスポンスに変える。
***権限 [#i5755127]
権限設定と表示。

[[:t/権限]]は「錠」と「鍵」の2種類。
[[:t/属性]]に書く。

[[:t/汎用記法]]で[[:t/埋め込み]]機能を呼び出して権限情報を表示。
ページとその属性名を全て[[:t/URI]]で指定・参照・ページ上にレンダリング。
***下位展開 [#l0f753b1]
[[:t/下位展開]]は複数のページをまとめて見せる機能。

対象になるページは[[:t/順不同]]な[[:t/名前]]での下位に位置するページ。

ページ間の[[:t/リンク]]も下位展開に対応する必要がある。
まとめられたページは[[:t/見出し]]として表示されるので、リンク先もそこへつなげなければならない。

ページごとに[[:t/権限]]判定と[[:t/代表]]の適用が必要。
***プレビューモード [#vf775f50]
[[:t/プレビュー]]モードは[[:t/名前]]の補完ルールに細工をすることで実現。
タイムマシンモードも同じ発想。

まだ投稿していないページは[[:t/セッション]]に一時保存。
セッションの実体は特殊な[[:t/ページ]]。一時的ではあるが[[:t/永続化]]することになる。

プレビュー中も[[:t/下位展開]]はある。
*あとでなおす。ほぼいらない。 [#i132360f]

**紹介 [#c1c2ce6d]
相変わらずページの保存が出来ないバージョン。
サンプルデータとして http://wiki.pmint.name/ のページをインポートしてみた。
***実装したこと [#e98d503c]
-下位展開
このシステムはページが他のページを含むツリー構造になっている。1つのページに含まれるページ階層を深い階層まで一括表示。
-下位展開を利用した自動リンク先
深い階層のページは浅い階層の一部(見出し)として表示されるので、素直にはリンクしない。[[浅いページ/深いページ]]を、浅いページ#深いページへのリンクに。
-プレビューモード
編集プレビュー中に他のページを開いて、編集の影響を見ることが出来る。「仮の未来」を見る機能。
-タイムマシンモード
過去のある時点でのWikiを再現。「実在した過去」を見る機能。
-アクセス制御
アクセスコントロール。ページ側に「錠」となる属性、ユーザー側に「鍵」となる属性を与えて随時適合するかどうか判定。適合することを各ユースケースの事前条件に。
-リンク一覧
内部リンク(同一Wiki内リンク)のリンク先一覧。リンクの属性「関連名」でフィルタリング。これで「あるユーザーが閲覧できるページ一覧」と「あるページを閲覧できるユーザー一覧」を生成。
記法は特に考えず#links(リンク先のほう|リンク対象テキストのほう|全部)

***そのほか [#obc2415b]
-multi-gram
自動リンク処理で行なっていた”bi-gramを使ったページ名探索”。連続する2文字をインデックス化していたが、数字列では1つのキーに集まり過ぎ、漢字を使う単語では分散し過ぎだったので、文字種により0文字から3文字を使うよう変更。

***実装方法 [#he0bc323]
-ページ作成フォーム記法
新規ページ作成の入力欄生成。入力受け付け、ページ生成。
とりあえず #newpage()
[Notationsにクラス作成]
-自動リンクの下位展開対応[Autolink]
 /ページ名#セクションID
リンク対象文字列が /セクション名/ページB/ページA ならリンク先は /ページA/ページB#セクションID
 /ページ名#セクションIDでもリンク対象になるように。リンク先をコピペしてもリンクするように。
-ページ名を4区分に[Pagename]
Wiki, Entry, Side, Revision
--代表
4区分それぞれに補完ルールがある
Wiki
Entry
Side
Revision
--内部名、メジャーIDになるのはEntryだけ(ユーザーが指定するので)
[Pagename]
PageFactoryで扱うのは内部名
--下位展開
セクション記法(見出し記法、ページタイトル記法)[PageElement、ページ生成時]
とりあえず /^==/
セクション記法はページのもの。セクションのものではない。
-ページ→ページ(→セクション0〜1コ)
Compositパターン
-閲覧時展開[Section.toHtml()]/編集時展開[Section.toWikitext()]
--権限、錠と鍵
どちらもページ属性で
錠はページ、鍵はユーザーが持つ
権限があるとき見出し+下位の内容、権限不足時は見出しだけ。
ページ名はページ内容と編集権限が異なる。接頭辞属性を含むので。
--下位の代表見解を展開[Pagename]	・ページ属性(ページ属性記法)
属性の自動リンク[Autolink.toHtml()]
--情報配置
錠と鍵(権限)の表示は参照記法を配置して
ページ参照と関連名フィルタリングをするPageElement、それを配置

-プレビューWiki
[Pagename、Wikiを明示指定]
Previewモード
指定されたWikiにページが無ければ、デフォルトWikiのページを使う。
デフォルトWikiにも無ければ、指定されたWikiでページが存在しない処理。
-タイムマシンWiki
[Pagename、版の補完方法で](プレビューとは実装方法が違う)
Back way to ... モード
日時指定→版の補完時に版番号に置き換え
日時指定用のUI: 版の中から選択、あらかじめページ名と見解が指定されていないと
ページ(Entry)が無ければ、普通にページが存在しないときの処理。

----------------------------------------
- Notation→ElementでPukiWikiのようにRegex1回にしないのはネストを可能にするため。Notationのネストを内側から探すのも同じNotationをネスト可能にするため。

「C#に依存するコードが増えてきましたが」
- ウィキエンジンXのページを自動リンク
**そのうちやること [#fcfe5f45]
***自動リンク [#n5ac218c]
-自動リンクルール
相対パス→絶対パス変換に一手間加えたもの。
-メタページ生成ルール




***アカウント [#s0de27cc]
-利用者のログイン/ログアウト
-アカウント管理


**クラス [#g839899e]
→[[X]]

-X(Wiki)
フレームワーク/WebアプリケーションのComponentにあたる。


クラス名は…
View::ユースケース名::リクエスト名、Control::ユースケース名


-PageElements
記法別クラスの上位クラス。
記法別クラス(Notations)はWikiTextを読んで''自身が理解できる記法だけ''オブジェクト化する。
WikiTextの先頭からではなく、記法別にオブジェクト化。
***図 [#a068f061]
[[クラス図>http://dl.dropbox.com/u/62172621/wiki/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3%20%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B003%20Web%E3%82%A2%E3%83%97%E3%83%AA%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E9%83%A8%E5%88%86.png]]

[[クラス図>http://dl.dropbox.com/u/62172621/wiki/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3%20%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B003%20X.png]]
**フレームワーク間の関係 [#d19defef]
HTMLを要求するのはフレームワーク/Webアプリケーションのほう。
WebアプリケーションはWikiEngineを3回呼ぶ。
+エントリーポイント
+フレームワーク/Webアプリケーション
Xオブジェクトを生成。
+フレームワーク/WikiEngine
Xオブジェクトを作る(だけ)。
+フレームワーク/Webアプリケーション
Xオブジェクトにリクエストを伝える(そのまま渡すのではなく、変数の形で)
+フレームワーク/WikiEngine
自身の状態を変化させる。状態は永続化する。
+フレームワーク/Webアプリケーション
XにHTMLを要求。
+フレームワーク/WikiEngine
HTMLを生成。
+フレームワーク/Webアプリケーション
HTMLにヘッダーを付けてWebページ化。

**%%Wiki→Space、Entry、Side、Revision%% [#u7d37135]
-%%Entry(項目)%%
-%%Side(見解)%%
-%%Revision(版)%%

%%''いずれもPageクラスのインスタンス名。''%%
%%ただし、実体があるのはRevisionだけ。その名を変えたのがEntry、Side。%%

----------
**排他制御 [#q6171bfe]
永続化クラスを排他制御不要な方式に。

%%WikiはEntryの構造体。%%
%%ルートページから始まるツリー構造。%%
%%各Entryもそれぞれツリー構造。%%
%%つまりツリーの要素からまたツリーが始まる2段ツリー構造。%%
**%%エラーレベル%% [#t6bc1961]
-%%利用者向け情報 Info%%
%%不正なリクエストなど。ページのメッセージ欄に出力。%%
%%[[X/Error/Info]]%%
-%%警告 Warning%%
%%デバッグ用ログ出力と管理者グループ宛メールに出力。%%
%%処理続行。%%
%%[[X/Error/Warning]]%%
-%%致命的エラー Fatal%%
%%処理中断。%%
%%開発時のアサーション違反はエラー、運用中は警告だけ。%%
%%[[X/Error/Fatal]]%%
**%%排他制御%% [#q6171bfe]
%%更新コマンドのキューイング。キューと要素の関係。キュー→ファイル(名前順)。要素→永続化されたCommandオブジェクト。ファイルロックは…PageFactoryが永続化されたオブジェクトを復帰/保存するときと、オブジェクトが自身の関連ファイル(他のオブジェクトの所有物でないファイル)を操作するときくらい。%%
→永続化クラスを排他制御不要な方式に。

モデル系クラスでは自分で自身を書き換える。他のクラスを扱うのはPageFactoryくらい。

RIGHT:[[:t/Web]] [[:t/ロック]]
**%%Componentの使い方%% [#n24f2fd9]
-%%WikiEngine(の代表的なクラス)を1つのComponent(MVCセット)にする%%
%%WikiEngine内部ではクラス間は記法で関連するので。似ているけど別の仕組み。UsecaseやRequest、Query(検索/クエリーではない)もWikiEngineの一部。Componentの<<control>>や<<model>>部分になる。WikiEngineの全クラスをComponentにしなくていい。フレームワーク/Webアプリケーションと関わりのあるクラスだけComponentを継承。%%
-%%サイトのグローバルナビを1つのComponentにする%%
**%%ASP.NETを使うなら%% [#h197c0d4]
%%ViewとControllerはASP.NET MVCのもの。%%
%%非ASP.NET MVC。Wiki - View(.aspx) - Controller。Viewはマスターページのようなものを1つだけ。プラグイン無し。ControllerでReadなどを実装。というかControllerがプラグインのようなもの。%%

%%フレームワーク/WebアプリケーションはASP.NETと競合するので後回し。フレームワーク/WikiEngine以上を作る。%%
**実装からTips作成 [#h19c72ba]
実装からTips作成、よりよいコードのヒント集め。
実装以外にも、アイデア、方式、UIなどでも。


**仕様の分け方 [#k3a05217]
%%MVCの観点で。%%
%%1. UI%%
%%2. フレームワーク%%
%%3. ページ%%
%%4. 運用、利用法%%

フレームワークは空気。ページが本体でユーザーがそれを利用できるようにするのがフレームワークの役目。

UIの内訳
1. 読みUI
ページ/履歴含む。
2. 書きUI
エディターなども。
3. 探しUI
検索の他に関連情報やおすすめの類も。
4. 組み立てUI
管理とWiki構築。テンプレートやデータコンテキストなどページ/要素を使ったプログラミング部分。

RIGHT:[[:t/プロトタイピング]]