• 追加された行はこの色です。
  • 削除された行はこの色です。
RIGHT:&tag(実装,コード,目次,更新中);
RIGHT:[[:t/プロトタイピング]]

*検索機能はどのクラスで? [#k44496c6]
-類似度評価はNotation
-制御はコントロールクラスのUseCase
実装のためのまとめ。

類似度判定なので、リンク先を含む検索は
キーワード1 (Notation/Linkと同じ表現で)[[曜日:*]]
[[曜日:*]]は、リンク名(というか種類というかタグ)が「曜日」で、リンク先はなんでも可。
|
※ワイルドカードがいる。

検索結果のソートはNotation/Sortと同じ表現で。
検索結果のフォーマットはNotation系か検索結果ページのテンプレートから選択して指定。

要、評価順。
リンク元と比較するキーワードと、リンク先と比較するキーワードが混在するので。

Page(ページ名検索キーワード) → ページ名リスト
Exist(ページ内容検索キーワード, 検索対象とするページ名リスト) → ページ名リスト
Filter(ワイルドカードを含むキーワード, 検索対象とするページ名リスト) → ワイルドカード部分リスト

 Exist(『減』, Page(Filter([[1日前:*]], Exist(『増』, Page(*)))))

((『増』が記録されているページ)の1日前)で『減』が記録されているページ
(『減』が記録されているページを取得)
これをより分かりやすく、間違えにくい表現にすると?

----

 『増』のあるページと1日前つながりで『減』のあるページ

 『増』 1日前つながり 『減』

 『増』 1日前→ 『減』

|検索語|解析するクラス|対象ページ|一致する文字列|
|『増』|Notation/PlainText|全ページ|『増』|
|1日前→|Notation/Link|全ページ(または『増』を含むページ)|[[1日前:.*]]|
|『減』|Notation/PlainText|『増』を含むページ|『減』|

1つのページと同じ表現ができるなら、検索クエリーからページ構築→類似度判定1回で済むが、複数ページがどうリンクされているかまでは表現できない。
そのため、検索クエリーには特別な解析が必要になる。
*目次 [#n27e7315]
#contents
----
#lsx(new=true);
*関連 [#q6bdea1e]
#lsx(tag=プロトタイピング,new=true,except=^プロトタイピング(/.*)?$)

[[検索:プロトタイピング]]

*プロトタイピング周辺のタグ [#k2465701]
#tag(0,プロトタイピング)
**全体のクラス図 [#g6d27cbf]

*プロトタイピングとは [#k44c6dd0]
RIGHT:[[:t/プロトタイピング]]
[[https://www.dropbox.com/sh/6d15699bc8vded3/AADhSZL6RV4ySd_lHbLSFAM2a/wiki?preview=%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3.png]]

実装のためのまとめ。


%%[[astah* file>http://dl.dropbox.com/u/62172621/wiki/wiki.asta]]%%
%%&ref(http://dl.dropbox.com/u/62172621/wiki/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E5%9B%B3.png,100%);%%
*特に関連の強いページ [#a1b1cc24]
-[[モデリング]]
-[[フレームワーク]]
-[[クラス>http://wiki.pmint.name/index.php?cmd=lsx&tag=%E3%82%AF%E3%83%A9%E3%82%B9]]
-[[コンセプト]]


*実装 [#u5232eb6]

Perlで。
** [#d71d5ec7]
とりあえずPerlで。
UI抜きで。
フレームワークの実現と主要機能の実現を。


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

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


*図 [#k966a347]

[[Webアプリケーションのフレームワーク>http://f.hatena.ne.jp/pmint/20090927012512]]
フレームワーク/Webアプリケーションのみ。フレームワーク/WikiEngineはControlクラスから別途呼び出し。なのでフレームワーク/WikiEngineはこの図のModelにあたる。
#ref(http://img.f.hatena.ne.jp/images/fotolife/p/pmint/20090927/20090927012512.png)

→[[フレームワーク/Webアプリケーション]]

-ユーザー
システム外。
-メイン
非オブジェクト指向の手続き指向。
--ユースケース
[[フレームワーク/WikiEngine]]のクラス。
編集とか、ページ作成とか、ページ閲覧とか。そういったものの処理フロー。他のクラスに依存しっぱなし。
-クエリー(ユーザーから与えられたデータ)
グローバルなデータ。なのでシングルトン。
モデルによって書き換えられた後、ビューに参照される。
-モデル系
クエリーから入力(内部形式・独自形式、扱い方はモデル系クラス自身が知っている)、処理、保存(永続化)、''クエリーに''出力
-ビュー系
クエリーから入力(文字列)、それをHTMLなどのテンプレートに埋め込む。


----


HTMLを要求するのはフレームワーク/Webアプリケーションのほう。
WebアプリケーションはWikiEngineを3度呼ぶ。

+エントリーポイント
+フレームワーク/Webアプリケーション
WikiEngineオブジェクトを生成。
+フレームワーク/WikiEngine
WikiEngineオブジェクトを作る(だけ)。
+フレームワーク/Webアプリケーション
WikiEngineオブジェクトにリクエストを伝える(そのまま渡すのではなく、WikiEngineが理解できる形で)
+フレームワーク/WikiEngine
自身の状態を変化させる。状態は永続化する。
+フレームワーク/Webアプリケーション
WikiEngineにHTMLを要求。
+フレームワーク/WikiEngine
HTMLを生成。
+フレームワーク/Webアプリケーション
HTMLにヘッダーを付けてWebページ化。


------------------------------------------------------------

Wikiエンジンのフレームワーク

→[[フレームワーク/WikiEngine]]


Webアプリ部分で言うモデル系のこと。
スキンはビュー系。

直接関連はしない。コントロールクラス経由で呼び出し。

+ユースケース(コントロールクラス)→モデル
+ユースケース(コントロールクラス)→ビュー

でも、ビューがモデルを呼ぶこともあるかも。
決まりきっている部分。HTMLヘッダーとか、背景とか。多くのページが必要とする部分とか。ユースケース別にすることもない部分。

----------------------------------------

クライアント側で動くものはUI周辺のみ。
*最低限必要なもの [#w0fbb4e3]

-コア部分
-周辺部分
**コア部分 [#zae1fb02]
&ref(http://img.f.hatena.ne.jp/images/fotolife/p/pmint/20091103/20091103015312.png);

-データ変換
--WikiNotationを含むテキストをオブジェクト化する
--記法を含むテキストをオブジェクト化する
--個々のオブジェクトから(HTMLなどの)別形式を得る
-各WikiNotationクラスによる同型オブジェクト間の同一性の評価
-各記法クラスによる同型オブジェクト間の同一性の評価
検索で使用。類似度を算出。
-検索
-オブジェクトの永続化
-プラグインの使用
-構造化ページ
-代表とその決定方法
-エラーレベル
--利用者向け情報 Info
不正なリクエストなど。ページのメッセージ欄に出力。
[[WikiEngine/Error/Info]]
--警告 Warning
デバッグ用ログ出力と管理者ロール宛てメールに出力。
処理続行。
[[WikiEngine/Error/Warning]]
--致命的エラー Fatal
処理中断。
開発時のアサーション違反はエラー、運用中は警告だけ。
[[WikiEngine/Error/Fatal]]
-排他制御
--更新コマンドのキューイング
キューと要素のフォーマットは…
キュー→ファイル(名前順)
要素→永続化されたCommandオブジェクト
ファイルロックは…PageFactoryが永続化されたオブジェクトを復帰/保存するときと、オブジェクトが自身の関連ファイル(他のオブジェクトの所有物でないファイル)を操作するときくらい。



[Prog]参照
***データ変換(WikiNotationクラス) [#j528038f]
***データ変換(記法クラス) [#j528038f]
テキスト→オブジェクト→HTML
オブジェクト→永続オブジェクト
どれもWikiNotationクラスの役目。
どれも記法クラスの役目。


-WikiNotation/表 |…|…|
-WikiNotation/強調 ''…''
-記法/表 |…|…|
-記法/強調 ''…''

***周辺部分 [#c715cd8b]
特にWebアプリケーションとしてのWikiに必要なこと。

-Webアプリケーションとしてのコントロールクラス
-UI
-アカウント
-スキン


***UI [#s041046b]
スキンに含まれるテンプレートと関連が深い。
最低限必要なUIだけ。


***アカウント [#s0de27cc]
-ログイン、ログアウト
[[Google:はてな認証API]]で。
-アカウントとロールと権限設定

→[[利用者]]

------------------------------------------------------------
必要なときに必要としているクラスから呼び出される。
主にユースケースを表すコントロールクラスから。


------------------------------------------------------------
''ユーザーの属性''
-アカウント(アカウント型)

------------------------------------------------------------
''アカウントの属性''
-ロール(ロール型)
-ID(ID:文字列を継承)
-IDを承認するサイト(URI:文字列を継承)

※アカウントをユーザーの一部にしてもいい。

------------------------------------------------------------
''ロールの属性''
-権限(権限型の集合)
権限の集合を1つのハッシュ構造にしてもいい。

------------------------------------------------------------
''権限の属性''
-権限ID(ID:文字列を継承)
-可否(真偽)
***スキン [#ca6fb64a]
-テンプレート
-スタイルシート
-貼るもの
画像とか。

ページの一種。それがテンプレートになる。
スタイルシートや画像は普通に作ればいい。


***UI [#t9088b46]
最低限必要なUIだけ。

**クラス [#k41904d8]
#lsx(tag=クラス)


**アカウント [#s0de27cc]
-ログイン、ログアウト
[[Google:はてな認証API]]で。
-アカウントとロールと権限設定

**そのほか [#h8eb4121]
→[[利用者]]

''クラス候補''
-[[WikiEngine/Link]]
クラスではない。
WikiEngine/Elementの1つ。WikiEngine/Notation系。ページの構成要素なので。
-[[WikiEngine/File]]
フレームワーク/Webアプリケーション側のクラス。
モデル系オブジェクトの永続化で使用。
-[[WikiEngine/InterPageAdapter]]
WikiEngine/InterPage(ただのテキスト)を解析するクラス系。抽象クラス。要具象クラス。
-[[WikiEngine/User/Role]]
→ アカウント
-[[WikiEngine/User/Permission]]
→ アカウント
-[[WikiEngine/Style]]
ユースケースから呼ばれて
-[[Main]]
エントリーポイントを持つため、必ず呼ばれる。
コントロールクラス。
-[[WikiEngine]]
フレームワーク/WikiEngineの最上位。モデル系にあたる。
アプリケーション全体で使用されるものを定義。
-[[WikiEngine/UseCase]]
コントロールクラス。
WikiEngineから呼ばれる。リクエスト毎に別。
&ref(http://img.f.hatena.ne.jp/images/fotolife/p/pmint/20091108/20091108040844_original.png);

------------------------------------------------------------
必要なときに必要としているクラスから呼び出される。
主にユースケースを表すコントロールクラスから。
***ページの構成 [#h4d33ed8]
Wiki(サイト)─Entry(項目)─View(見解)─Revision(版)
Wiki(サイト)─Entry(項目)─Side(見解)─Revision(版)

:Wiki|WikiEngineのインスタンス
:Entry|項目、ページ、Wikipediaでの1ページ
:View|→ [[見解]]
:Side|→ [[見解]]
:Revision|バックアップ、Wikipediaでの版
*コード [#u12dfe3d]

今使ってるPerlのほか、PHP、Microsoftの、Rubyも。
**01 [#rf91a0f1]

[[codeなにがし>http://code.nanigac.com/]]に投稿してみる。
-フレームワーク/Webアプリケーション
[[code*:357]]
-フレームワーク/WikiEngine
[[code*:362]]
-ページ、|…|…|、''…''
[[code*:364]] [[code*:375]]
-検索/クエリー
[[code*:375]]
[[検索/流れ]]
[[:i/検索/流れ]]
-利用者
クラス定義とOpenID認証のサンプルだけで良い。
''[[code*:???]]'' [[code*:412]]

----------

**02 [#x29cf857]
テスト用のUIを付けて…
[[http://wiki.pmint.name/proto/02/>http://wiki.pmint.name/proto/02/]]に設置して…
コードは[[http://wiki.pmint.name/>http://wiki.pmint.name/]]のどこかに置いて。
コードは[[http://wiki.pmint.name/index.php>http://wiki.pmint.name/index.php]]のどこかに置いて。

-見解
-代表
-利用者
-ページ/章


**01/ [#n3895eae]
#ls

**[[tag:01]] [#lcacfa55]
#lsx(tag=01,new=true)