• 追加された行はこの色です。
  • 削除された行はこの色です。
RIGHT:&tag(フレームワーク,実装,設計,コード,目次);
RIGHT:[[:t/Wiki]] [[☆]]

現在考案中のWikiEngineについて。
クラス設計→[[X]]
既存のWikiEngineについては→ [[tag:解析]]

#br
-フレームワーク/WikiEngineでやること
-クラス設計→[[X]]
-[[フレームワーク/Webアプリケーション]]はもう一つのフレームワーク

*目次 [#cc67582c]
#contents
#br
#lsx(new=true);
#br
**WikiEngineとは [#be46ac08]

*関連 [#h79ad87b]
#related
#br
#lsx(tag=フレームワーク,new=true,except=^フレームワーク/WikiEngine(/.*)?$)
#br
[[検索:フレームワーク]] [[検索:WikiEngine]]
#br
----
*WikiEngineとは [#d78bd282]
RIGHT:[[:t/WikiEngine]]
RIGHT:[[:t/Wiki]]

wikiのシステム部分。(サイトとしてのWikiは半分が利用者のアイデアでできている)
Xのシステム部分。(サイトとしてのWikiは半分が利用者のアイデア次第)

[[キーワード:WikiEngine]]
[[キーワード:Wiki OR ウィキ]]


利用者から与えられたデータを「ページ」化して保存するもの。
利用者からの要求に応じて「ページ」を切ったり貼ったり整形してから見せる。
**%%HTML変換の内部処理%% [#cfcf01b3]
%%複数の記法→HTML変換を一度に行うために、変換後内容を用意してから置き換え。%%
+%%全記法分、探索%%
%%始点・終点の位置を記録。重なりはエラー。%%
%%挿入・削除の区別は要らない。対象位置と内容があれば十分。%%
+%%末尾から順次置き換え%%
%%位置がテキスト先頭からの距離なので置き換えの影響を受けないよう末尾から。%%
**参考 [#d6531d94]
:人力検索はてな|[[http://q.hatena.ne.jp/1186417853>http://q.hatena.ne.jp/1186417853]]
利用者から与えられたデータをページ化して保存するもの。
利用者からの要求に応じてページを切ったり貼ったり整形してから見せる。


*思い付き [#de986c8a]


*実装 [#y3209a73]
:人力検索はてな|[[http://q.hatena.ne.jp/1186417853>http://q.hatena.ne.jp/1186417853]]

**ページ名にユースケース別接頭辞 [#k4c480b6]
ブックマークや履歴、ウィンドウタイトルを分かりやすくするために。
閲覧…なし
編集…-
追加…>
…など。
**URLクエリーに置くデータ [#c57c9c46]
URLに付けるデータはネット上で共通のもののみ。
個人領域のデータ、状況に左右されるデータは置かない。
URLはどれもパーマリンクにすること。
RIGHT:[[:t/Wiki]]

というわけで、
-検索/クエリー
----

…はURLクエリーに含める。
ユーザーとページ/要素をつなぐもの。それとページ/要素の動作環境の提供も。

呼び出し順序…
+利用者
+フレームワーク/Webアプリケーション
+フレームワーク/WikiEngine
+ページ
+ページ/要素(各種機能)

**「次」や「前」という表現は使わない [#f4686b39]
新/旧、大/小などにする。
ソート順が分かる表現に。

RIGHT:[[:t/コンセプト]]
RIGHT:[[:t/Wiki]]
***認証について [#k5dc6e3e]
利用者認証とID取得はフレームワーク/Webアプリケーション。
利用者IDを利用して、実用的な利用者情報を利用可能にするのはフレームワーク/WikiEngine。


**負荷軽減 [#se24e0c6]
→[[負荷]]
RIGHT:[[:t/Wiki]] [[:t/認証]]

編集後の更新処理を分割。
+%%クエリー保存、ページ更新のキュー入れ%%
衝突時の警告ができなくなってしまうので不可。編集対象ページはすぐに更新、衝突したらそのときのレスポンスで利用者に知らせなければならない。
+対象となるページの更新、関連するページ更新のキュー入れ
+関連するページの更新(複数回)

RIGHT:[[:t/分割]]
**WikiEngine/ [#j6691e1b]
- フレームワーク/WikiEngineでやること

#ls()


%%ページを指定していないリクエストでは%%
+%%最後に参照したページ(クライアントにあるデータによる)%%
+%%デフォルトページ(Wikiの設定による)%%

%%…を返す。%%

#br

%%というわけで、トップページを見せたいときはトップページを指定したリンクを作り、通常はページを指定しないリンクを使う。%%
%%これで、静的なページからでもWebブラウザーの履歴を操作することなく、最後に参照したページに戻れる。%%
→URIとあわない。
**WikiNotationの優先順位 [#v31f1c67]
プラグインにはWikiNotationごとに(プラグインごとではなく)優先順位を定義。
これで複数のNotationに当てはまる場合や、Notationに包含関係がある場合に対応。

WikiEngine側で上書き可能。(Wikiの設定。Notation→プラグインの追加と一緒に定義)
Notationクラス名→優先順位の表を定義。これが無い場合はプラグイン側の定義を使用。

後からでも追加しやすいように優先順位は0以上の小数点数。
*設計 [#abe64751]
-ユースケースをクラス化。
RIGHT:[[:t/クラス]]
-ログインページの次はHTTP_REFERERにあるページ。
-ファイルはFlyweightであるべき。
-%%オブジェクトモデル上ではinclude.incのような機能を考慮しない。%%
%%include.incのような機能はデータコピーで実現。%%
-アクセスログはページの属性。
-%%利用者はページにある情報を元に作られる。%%
-%%ページが他のページインスタンス宛に編集クエリーを作る。%%
-%%検索はプラグイン化する。%%
**名称 [#v5422904]
-ページ→ページレット
-プラグイン→WikiNotation


**クラス間のつながり [#v3861373]
&ref(:Image/WikiEngine.gif);





**モデルはページ中心 [#k89eb2e9]
-ページ中心
-MVCのVとCは決まりきっている
Mはページとページに関連するクラス。
Cはフレームワークと各プラグインにある。
フレームワークが持つVのクラスは1つか2つだけ。(PC/Mobile)。それ以外にはプラグインが独自に持つかも知れない。
-要点はプラグインが持つ拡張性
--トリガーの種類
〜の前/後、他のプラグインと比べたときの優先度、…
--出力箇所の種類
--呼び出し箇所、クライアント側スクリプト部分、ヘッダー、フッター、…

RIGHT:[[:t/クラス]]
**オブジェクトの生成 [#v2749f02]
&ref(:Image/コラボレーション図 オブジェクト生成.png);

-クラス名とインスタンスの対応はFlyweightFactoryが決める。




"WikiEngine"というクラスについて。

ウィキエンジンを表すクラス。
名前が決まり次第、クラス名も変更。

-ユースケースをモデルに入れる。
RIGHT:[[:t/クラス]]
-ログインページの次はHTTP_REFERERにあるページ。
-ファイルはFlyweightであるべき。
-オブジェクトモデル上ではinclude.incのような機能を考慮しない。
include.incのような機能はデータコピーで実現。
-アクセスログはページの属性。
-利用者はページにある情報を元に作られる。
-ページが他のページインスタンス宛に編集クエリーを作る。
-検索はプラグイン化する。


**名称 [#v5422904]
-ページ→ページレット
-プラグイン→WikiNotation
**クラス間のつながり [#v3861373]
&ref(:Image/WikiEngine.gif);



**ページとプラグイン [#ued7bf04]
ページもプラグインもDecoratorパターンを構成する。

&ref(:Image/クラス図 ページ.png);


**モデルはページ中心 [#k89eb2e9]
-ページ中心
-MVCのVとCは決まりきっている
Mはページとページに関連するクラス。プラグインにはあるかも知れないし無いかも知れない。
Cはフレームワークと各プラグインにある。
フレームワークが持つVのクラスは1つだけ。それ以外にはプラグインが独自に持つかも知れない。
-要点はプラグインの拡張性(可能性)
--トリガーの種類
~の前/後、他のプラグインと比べたときの優先度、…
--出力箇所の種類
--呼び出し箇所、クライアント側スクリプト部分、ヘッダー、フッター、…

RIGHT:[[:t/クラス]]


**オブジェクトの生成 [#v2749f02]
&ref(:Image/コラボレーション図 オブジェクト生成.png);

-クラス名とインスタンスの対応はFlyweightFactoryが決める。


*コード [#f8ef9511]

[[プロトタイピング]]の実装。


**擬似言語 [#n2a0a895]
[フレームワーク/Webアプリケーションから呼ばれて…]
+セッションデータを受け取る。
+クエリーを処理する。
++ページを作っていろいろして保存したり、ページを開いていろいろする。
ページ作成をFlyweightFactoryに要求して、得られたページにクエリーを渡すだけ。
++ページをHTML化、永続化する。
+HTMLを返す。

**Perl [#e4ce3b1f]
[[code*:362]]

あとはX::Pageの永続化を。
プロトタイプではFlyweightFactoryを実装しない。
X::Pageのインスタンスは1つか2つでいい。



[[プロトタイピング]]の実装。


**擬似言語 [#n2a0a895]
[フレームワーク/Webアプリケーションから呼ばれて…]
+セッションデータを受け取る。
+クエリーを処理する。
++ページを作っていろいろして保存したり、ページを開いていろいろする。
ページ作成をFlyweightFactoryに要求して、得られたページにクエリーを渡すだけ。
++ページをHTML化、永続化する。
+HTMLを返す。

**Perl [#e4ce3b1f]
[[code*:362]]

あとはX::Pageの永続化を。
プロトタイプではFlyweightFactoryを実装しない。
X::Pageのインスタンスは1つか2つでいい。


*やること [#idbaff1b]

***データ変換 [#j528038f]
テキスト→オブジェクト→HTML
オブジェクト→永続オブジェクト

もしWikiNotationやプラグインをまったく使えないWikiEngineを作ったら…
テキストを記録するだけ。
ファイル名とテキストを与えると記録、ファイル名のみならテキストを出力。

これにプラグイン独自のデータと処理を加えて、プラグインごとに違うHTML出力ができるようにする。
中心はプラグインを作るためのAPI。


***アカウント [#s0de27cc]
-ログイン、ログアウト
-UIとアカウントと権限設定
-アカウント管理

[[利用者]]


***派閥 [#h3dae9a5]
-ページの複製
-ページの統合
-アカウントとページの結び付け

[[派閥]]