=begin #encoding="shift_jis" #------------------------------------------------------------------------------# = Next Generation Mireille Specification # $Id: MireilleNG.txt,v 1.1 2003/01/14 23:52:22 naruse Exp naruse $ == Description 次世代Mireille (Mireille 1.3) の計画資料(覚書?)です。 基本的にMireille1.xは全て、CGI/Perl向けに開発されます。 Mireille1.0-1.2はいわゆるWebBBSとして開発され、使われてきましたが、 Mireille1.3では日記(blog)やニュースとしても使えるように、設計しなおされます。 上記からも推測できる通り、Mireille2はCGI/Perlではないかもしれません。 代わりの環境として、最も可能性が高いのはASP.NET(C#)で、 次点にRuby系(eRuby or CGI/Ruby or so)が挙がっています。 まぁこちらは先の話です。 == Technologys === Model-View-Controller MVCモデルです、多分。(MVCモデルという概念しか知らないもので) Mireille1.3は以下の4ファイル構成になりそうです。 予定は変わることもありますが。 :Model * データを扱う関数群 :View * ControllerがModelを使って得た情報を表示する * どこからその情報を得る?(引数として? or Modelから? or ...) * スキン機能はこのモジュールの取替えで実現する :Controller * Modelを呼び出して情報を格納。どこに格納?どうやって格納? :Configuration * 起動ファイルであり設定ファイル * 管理者が手を入れるべきものは唯一このファイルのみ これにCSSファイルやアイコンが加わる〜かな、あとJavaScriptファイルも。 今のところは「下手にプラグイン/モジュールシステムをとるよりも、 ファイル数は最小限にとどめた方が良い」という方針です。 異見があれば検討しましょう。 ちなみに、開発側の管理は、もうちょっとファイルを分けた方が、やりやすいのです。 けれど、掲示板管理者側では、ファイル数は少ないに越したことはないようなので、 今の方針になっています。 おそらく、最小のファイル数は、以下の3ファイル構成でしょう。 これ以上減らすと、掲示板をバージョンアップするのが果てしなく面倒になります。 * コアファイル。掲示板の機能を提供する部分。 * デザイン設定ファイル。掲示板のデザインをつかさどる。 * 掲示板の名前やアイコンなどを設定するファイル。つまりは、ここの掲示板ごとに必ず異なる部分。 #結局この項で何が言いたいのかわかりにくいなぁ・・・ === Customization & Personalization :Customization ユーザーが自分の好みに合わせて掲示板を設定できる。 StyleやCookieなど、かなぁ。 アイコンや名前を設定できるのは言うまでもなく、もっと高次の話。 ただ、掲示板のデザインをユーザーが設定できる、ということについては成瀬は若干否定的だったり。 「掲示板のデザインが各サイトの個性なのに、ユーザーが自由に選べたら個性がなくなっちゃう。」 :Personalization システム側が、ユーザーの好みを考えて、自動でシステムの挙動を変える。 世間ではどんな広告を出すか、に使っているらしいけど、掲示板に応用できるか? NEWSに応用するのも〜んむむ。。 === RDF/RSS 使う? 更新情報はLastModifiedだけでいいような気もする (()) === P3P 今度こそ実装? (()) === CSS3 実際に使うのは無理だろうなぁ・・・。 (()) 現実解としては、むしろ、HTML3.2とHTML4.01+CSS2.1の二つを用意するくらいになるのかな。 CSS3はまだ勧告が出る見通しすら立ってないし^^;; 早くopacityとかborder-radiusとか使いたいんだけどねぇ。 === XHTML2 これも実際に使うのは無理かなぁ。。 まぁ、Mireille1.3ではスキンをサポートしている(はず)だから、XHTML2スキンを作るのは良いかも。 (()) === オブジェクト指向 どの程度、どこで、どのように使うか、が考えどころ。 CGI/Perlは富豪的プログラミングが通用するジャンルではない(?)ところが難しい。。。 名前空間も下手に使うと複雑になるからなぁ。。。 今までどおりハッシュを使ったほうが良いかも。 === 荒らし対策 真に有効な手法が存在するのなら実装します。 しかし、2000年前後に行われたような「PHASER vs ひみこーど」のような、 いたちごっこ的無為な争いに巻き込まれるのはごめんです。 #------------------------------------------------------------------------------# == New Features === 超!注意書き PL法対策にでも。 現行法がどうであれ、その気になれば訴訟を吹っかけることは可能ですから、 === Icon Manager * menu/icon/textareaの3ペイン式? * JavaScript使いまくり、DOM使いまくり、IE6以外じゃうまく動かないかも(ほぇ * 管理CGIの機能制限を、isExists(KeyFile)で行う === Design Manager ? ? ? 色設定をWeb上でGUI風味にできると便利かも。 具体的にはJavaScriptで色見本をつくり(ここはealisのを真似よう)、 掲示板デザインのプレビューを見ながら、デザインを設定できる? フォント周りもいじれるように? MozillaのDOM Inspectorに編集機能を加えたようなもの、になるかな。 スタイルの構成は、Controller-View-BaseCSS-CustomCSS、となる模様。 Controllerで機能を選び、Viewでページ構成を決め、BaseCSSで基本スタイルを定めて、 CustomCSSで掲示板を設置する人が好みに合わせて微調整、と。 微調整する必要が無ければCustomCSSを使う必要は無い。 === Textarea Auto Save 投稿フォームの内容を、一定時間ごとに自動でCookieに保存する機能。 今ある一時保存機能の延長としての機能となる。 (意識して保存していない時に、ブラウザが強制終了→涙、ということがあったので) でも、一般向けとして高機能をつけるのは、プライバシーもあるしなぁ。。 隠し機能にしようか公開しようかどうしようか。。。 この手の公開すべきか迷った挙句に、公開しないことに決まった機能は、 今もMireilleのソースの片隅に“隠し機能”として、眠っているのです。。。 === SKIN機能 正確に言えば、(偽春菜|(あれ以外の)?何か|伺か)のGhostという概念に近い、かもしれない、かな? 挙動を定義するControlや、表示HTMLを定義するView、そして外部CSSファイルの3レベルで、 いわゆる``SKIN''を切り替えられるのです。 いや、切り替えられるようになるのです、きっと。 === 記事属性 一つ一つの記事に「属性」という概念を与えてみるのもいいかな、と。 「NEWS」属性とか、「日記」属性とかがあるとよいかな〜と。 属性があると、どう変わるかですが、属性によって記事の扱い方が変わる、とかでしょうか。 例えば「ツッコミ」属性だとアイコン無しになるとか、 ある属性だけ表示するオプションとか。 ある程度使い道は考えているのですが・・・どうなることやら。 === セットアップを簡単に とは言っても、どこをどうする? 思いつく策は無し。 === 修正履歴 修正機能で記事を変更した場合、変更する前の状態を見れる。 RCSみたいな感じになるのかなぁ。 Perl単体で実装するのはきついかもしれない。 diffコマンドをたたくようにするかな。 === SSUS ScreenShotUploadSystem。 画像ファイルをアップロードすることができる。 別のアップロード専用CGIを作った上で、それを読み込むようにする。 実際にMireilleと関連付けたときに、どの程度細かく画像の貼り付け場所を指定できるようにするかは検討中。 #------------------------------------------------------------------------------# == How work 起動→$userInputs=getParameters()→分岐($userInputs) →Controller($userInputs->{'mode'}){ $logs=getLogs(); $pageInfo=pageSelect(); } →View({logs=>$logs,pageInfo=>$pageInfo}){ print getHeader(),getBody(getArticles()),getFooter } こんな感じかなぁ ViewModuleはとりあえず、HTML3.2版とHTML4.01+CSS2版になるかな。 前者はIE4未満やNN、iCabなどCSSに対応していないものと、携帯端末向け。 後者はIE4以降やMozilla/5なブラウザ(Mozilla、Netscape6以降、Opera7、KHTMLなど)向け。 (IE4をどちらにするかは微妙。) ViewModuleのXHTML1.x版は純正では出さないことになりそうです。 XHTML1.xより成瀬はXHTML2.0+CSS3の方が魅力的です。 (もちろんサードパーティ製XHTML1.xViewModuleを否定するわけではありません) #------------------------------------------------------------------------------# == Copyright Copyright (c) 2001-2003 NARUSE Yui ((())). All rights reserved. #------------------------------------------------------------------------------# = おまけ〜RD2XML Test Suite #------------------------------------------------------------------------------# == Baseline |この行はトップレベルのTextBlockの行だとします。 |<- したがって、Baselineは左端です。 *|List内では (1) |<- このようにBaselineは(1)の行で決定されます。 * |同じListでもListItem毎にBaselineが決定されます。 |<- したがって、1番目のListItemとは違うここにBaselineがあります。 == Headline = Headline 1. === Headline 1.1.1. + Headline 1.1.1.1.1. #------------------------------------------------------------------------------# == TextBlock これはTextBlockです。 TextBlockの2行目の行です。 この行はTextBlockでなくVerbatimです。 * そしてこの行はListの行です。(正確にはListItemの中のTextBlockの行でも あるのですが) #------------------------------------------------------------------------------# == Verbatim これはVerbatimです。 最初の行より深いインデントを持っても、同じVerbatimの行になります。 * この行はListに見えますが、Verbatimです。 しかしこの行は最初の行よりも浅くインデントされているので、別のVerbatim の行になります。 #------------------------------------------------------------------------------# == Item List * 親Listの最初のItem * 子Listの最初のItem * 孫Listの最初のItem * 孫Listの2番目のItem * 曾孫Listの最初のItem * 曾孫Listの2番目のItem * 玄孫Listの最初のItem * 子Listの2番目のItem 親ListのItemに含まれるTextBlock #------------------------------------------------------------------------------# == Enum List (1) 親Listの最初のItem * 子ListとなるItemList (2) 親Listの2番目のItem (10) 番号は無視されます。 #------------------------------------------------------------------------------# == Desc List :Term Descriptionの最初の行 2番目の行 :Term 2 * aaa * Listも含む事ができます * ... #------------------------------------------------------------------------------# == Method List --- Array#each {|i| ... } # => Labelは"Array#each" 各項目に対してブロックを評価する。 --- Array#index(val) # => Labelは"Array#index" ((|val|))と同じ値である最初の項目を返す。同じ項目が無いときには (({nil}))を返す。 ((*Em*)) (({while gets...})) ((|var|)) ((%ruby -v%)) ((:Term:)) (()) ((-Footnote-)) (('v((*er*))b')) ((<((*Technologys*))>)) =end