Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/ja: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Object Oriented Programming with Free Pascal and Lazarus/ja

OldNewLine
1+## 概要
2+
3+Pascal に関する優れたチュートリアルは数多くあるが、このチュートリアルは初心者をさらに [[Turbo Pascal]],、[[Delphi]]、[[Free Pascal]] / [[Lazarus|Lazarusにより]]提供される標準 [[Pascal|Pascalの]]拡張である、[[Glossary|オブジェクト指向プログラミングを]]深く理解することを目的としている。
4+
5+[[Glossary|オブジェクトは]]標準パスカルの構造の[レコード](http://wiki.lazarus.freepascal.org/Record)構造の拡張である。
6+
7+標準のテキストベースのPascalプログラミングは、1つのことを非常に巧みにこなす伝統的なUnixアプリケーションのようなアプリケーションを作るうえではよいものである。
8+
9+プログラムが行う「1つのこと」は非常に複雑なアクションであるかもしれないし、ユーザーに複数のメニュー駆動型オプションを提供するかもしれない。しかし、本質的には、ユーザーがキーボードで入力するコマンドに従い、そのレスポンスを端末やプリンターに表示することに制限されている。
10+
11+[[Glossary|グラフィカルユーザーインタフェース (GUI)を]]提供するために、ある種のオブジェクト指向プログラミングメソッド(C言語やその派生、もしくはVisual Basic、例えば[[Glossary|Lazarusを]]用いる、あるいは用いない[[Glossary|Free PascalのようなPascalの]]派生[[Glossary|OO]])が用いられるのは通常のことである。
12+
13+GUIでは、ユーザーには以下のような様々な、道具やアクションに紐づけられた[[Glossary|ウイジェットのセットからなる]]、整頓された多くの画像が示される。
14+
15+- メニューから選択する
16+- ファイルを開く、保存する
17+- インターネットに接続する
18+- 算術演算を行う
19+
20+など。
21+
22+ユーザーは、画面上でマウスまたはその他のポインター/選択ツールを移動し、マウス ボタンのクリックまたはキーの押下に応じて実行されるアクションを選択することを期待している。
23+
24+複雑なグラフィカル ユーザー インターフェイスを処理するシステムは、標準の Pascal またはその他のほぼすべてのプログラミング言語で作成できるものの、それぞれのグラフィカルオブジェクトが、画面上で、すべてのプロパティとプロシージャ、共通の構造とともに使用法が結びつけられた関数を持つことのできる、オブジェクト指向システムを用いるほうがはるかにたやすい。
25+
26+## オブジェクト - 現実世界の相似
27+
28+病院や診療所で採取された血液サンプルの例を考えてみよう。
29+
30+### 血液サンプル
31+
32+物理的なサンプルは文字通り「実体」- **object**であり、情報、ドキュメント、他の多くの物理的なオブジェクトが紐づけられている。
33+
34+- **サンプルの入った試験管**、の型は医師が望む試験の種類を規定する
35+
36+- **ローカルルール** (または *メソッド*, *スタンダードオペレーティングプロシージャ*) は看護師や技師にサンプルを集める指示を出す
37+ - どの種類の試験管が用いられるべきか
38+ - サンプルがどのように扱われるべきか
39+ - 検査室に運ばれるまでどのように保存されるべきか
40+
41+- **ラベル**は以下の細目について記載されている
42+ - サンプルの識別記号番号
43+ - 患者の氏名と誕生日
44+ - 採取した日付と時刻
45+ - 必要とする検査
46+
47+- **要望文書** それはサンプルとともに検査室へもたらされ、指示には
48+ - サンプルの識別記号番号
49+ - 指示した医師のID
50+ - 医師が望んだ検査
51+ - 患者のより詳しい情報
52+ - 確認が求められている、可能性がある診断
53+
54+患者のカルテには、医師がしかるべき時に期待する結果を確認させる、要望文書のコピーが加えられる。
55+
56+- 検査室では - **ローカルメソッド**が以下を規定する
57+ - どのようにサンプルが分析されるか
58+ - どの機器を用いるか
59+ - どのようにその機器が補正され、運転されるべきか
60+ - どのように結果が保存され、形式が整えられるか
61+ - 医師に結果を報告すること
62+
63+実際の **結果** が医師の診断を助けるために記録され、患者のカルテに検査結果のコピーが挟まれる。
64+
65+物理的なサンプルは参照、確認、あるいはさらなる検査のために保存されるか、流しに捨てられる、あるいは焼却処分される。これを述べた方法があるだろう。
66+
67+医師はサンプルが採取されるたびに、いちいちすべての細目と指示を書き込む必要はなく、検査室でそのサンプルがどのように検査されるかほとんど知らないだろう。この様々な課程の細目は、以前のサンプル採取と分析から**継承**され、全体の結果に対する、一定の計画、血液サンプルに対して考えらえる、ドキュメントとデータ、その基礎のメソッドを複合が**オブジェクト**である。 医師の考えでは、血液サンプルはその結果とほぼ同じ実体とみなされ、看護師や技師にとっては、サンプル、チューブ、ラベル、および保管状態が再び単一の実体を成す。
68+
69+### 別の例 - 自動車
70+
71+もし、血を見るのが嫌ならば、同様の理屈が車庫から、修理場へ運ばれる自動車にも適用できる。 それは以下よりなっているだろう:
72+
73+- 自動車自体
74+- 所有者によって保存されている、登録証、車両ナンバー(車両ナンバープレートを含む)、保険証、購入の領収書、部品、修理などの書類
75+- 燃料消費履歴
76+- その自動車を使うことのできる運転者、およびその免許書
77+- 修理場でのサービス記録
78+- 定期点検とメンテナンスの方法(メソッド)と手順(プロシージャ)を追う書類
79+- 非定期点検、修理を追うメソッド
80+- 顧客の支払い情報
81+
82+## プログラミング例
83+
84+こんな実社会の事例に没頭するのはもうたくさんだ! 主題の[[Object Pascal|Object Pascalでのプログラミングに]]進もう。
85+
86+Free Pascal/Lazarusでいくつかのコントロールを持つ簡単なフォームを作ることを考える。
87+
88+<div class="floatleft">
89+
90+<figure>
91+<img src="ObjectInspector-TForm-ja.png" title="ObjectInspector-TForm-ja.png" />
92+<figcaption>ObjectInspector-TForm-ja.png</figcaption>
93+</figure>
94+
95+</div>
96+
97+<div class="floatright">
98+
99+<figure>
100+<img src="BlankForm-ja.png" title="BlankForm-ja.png" />
101+<figcaption>BlankForm-ja.png</figcaption>
102+</figure>
103+
104+</div>
105+
106+Lazarus IDEを起動すると、プログラマにはフォーム設計の様々なコントロールや、オブジェクトを置くことを促す、空のテンプレートがもたらされる。
107+
108+あらかじめ作られたフォームがすでにオブジェクトであるとこに注意すること。それは位置(上辺、左)、大きさ(高さ、幅)、色、テキストを加えるときのデフォルトのフォントなどのプロパティを持つ。
109+
110+------------------------------------------------------------------------
111+
112+もしボタンコントロール(TButton型)がフォームに置かれると、それは、オブジェクトインスペクタで検討できるそれ自身の一連のプロパティを持つ。
113+
114+そのプロパティのいくつかはフォームと似たような名前を持っている。これはある共通のその派生クラスによって、どのようにそのプロパティが定義され、扱われるかをレイアウトする祖先クラスから**継承**されたプロパティであることが理由である。
115+
116+プロパティ同様に、オブジェクトインスペクタはアプリケーションがどのように、例えばマウスボタンクリック(OnClick)もしくは位置や、大きさ、他のプロパティを変更(OnChange)したときに、それらを扱うかを指示するメソッドであるイベントハンドラにアクセスする**イベント(Events)**という名前のタブを持つ。
117+
118+フォーム上の物理的な画像であるボタンは、そのプロパティとイベントハンドラと相まって、パスカルでは単一の実体**オブジェクト(Object)**とみなされる。
119+
120+<div class="floatleft">
121+
122+<figure>
123+<img src="ObjectInspector-TButton-ja.png" title="ObjectInspector-TButton-ja.png" />
124+<figcaption>ObjectInspector-TButton-ja.png</figcaption>
125+</figure>
126+
127+</div>
128+
129+<div class="floatright">
130+
131+<figure>
132+<img src="FormWithButton-ja.png" title="FormWithButton-ja.png" />
133+<figcaption>FormWithButton-ja.png</figcaption>
134+</figure>
135+
136+</div>
137+
138+<div class="floatright">
139+
140+<figure>
141+<img src="Source_FormWithButton1-ja.png‎" title="Source_FormWithButton1-ja.png‎" />
142+<figcaption>Source_FormWithButton1-ja.png‎</figcaption>
143+</figure>
144+
145+</div>
146+
147+## 標準パスカルに対するオブジェクト指向拡張
148+
149+Pascalのレコード構造はオブジェクトを定義することで拡張された。
150+
151+### オブジェクト
152+
153+オブジェクトは特別な種類のレコードである。 レコードには、次のすべてのフィールドが含まれる。 (従来のレコードと同様に) オブジェクトの定義で宣言されるが、プロシージャと関数はレコードの一部であるかのように宣言でき、オブジェクトの型に関連付けられたメソッドへのポインタとして保持されるようになった。
154+
155+例えば、平均を計算するメソッドともに実数値の配列を保持するオブジェクトを仮定する。
156+
157+``` pascal
158+Type
159+ Average = Object
160+ NumVal: Integer;
161+ Values: Array [1..200] of Real;
162+ Function Mean: Real; { 配列の平均値を計算する }
163+ End;
164+```
165+
166+「オブジェクト」はフィールドとメソッドを「親」オブジェクトから「継承」することができる。これはこれらのフィールとメソッドが、「子」として宣言されたオブジェクトに含まれているかのように、用いることができることを意味する。
167+
168+さらに、視認性の観念は、フィールド、プロシージャ、関数がpublic、protected、privateとして宣言することを可能とした。デフォルトではフィールドとメソッドはpublicで、現在のユニットの外側へエクスポートできる。Protectされたフィールドやメソッドは現在の祖先オブジェクトから派生したオブジェクトにとってのみ利用可能である。Privateで宣言されたフィールドや、メソッドは現在のユニットでのみアクセスが可能である:そのスコープは現在のユニットの実装に限られている。
169+
170+### クラス
171+
172+オブジェクトはFree PascalとLazarusではそう頻繁には用いられない。むしろ、クラス(Class)は広く用いられる。クラスはほとんどオブジェクトと同様に宣言されるが、オブジェクト自身というよりはオブジェクトに対するポインタである。技術的には、これはプログラムのヒープに割り当てられるが、オブジェクトはスタックに割り当てられる。
173+
174+これはクラス宣言の典型的な例である:
175+
176+``` pascal
177+{-------------------------------------------}
178+{ LCLからのクラス宣言の例 }
179+{-------------------------------------------}
180+ TPen = class(TFPCustomPen)
181+ private
182+ FColor: TColor;
183+ FPenHandleCached: boolean;
184+ FReference: TWSPenReference;
185+ procedure FreeReference;
186+ function GetHandle: HPEN;
187+ function GetReference: TWSPenReference;
188+ procedure ReferenceNeeded;
189+ procedure SetHandle(const Value: HPEN);
190+ protected
191+ procedure DoAllocateResources; override;
192+ procedure DoDeAllocateResources; override;
193+ procedure DoCopyProps(From: TFPCanvasHelper); override;
194+ procedure SetColor
195+ (const NewColor: TColor; const NewFPColor: TFPColor); virtual;
196+ procedure SetFPColor(const AValue: TFPColor); override;
197+ procedure SetColor(Value: TColor);
198+ procedure SetMode(Value: TPenMode); override;
199+ procedure SetStyle(Value: TPenStyle); override;
200+ procedure SetWidth(value: Integer); override;
201+ public
202+ constructor Create; override;
203+ destructor Destroy; override;
204+ procedure Assign(Source: TPersistent); override;
205+ property Handle: HPEN read GetHandle write SetHandle; deprecated;
206+ property Reference: TWSPenReference read GetReference;
207+ published
208+ property Color: TColor read FColor write SetColor default clBlack;
209+ property Mode default pmCopy;
210+ property Style default psSolid;
211+ property Width default 1;
212+ end;
213+```
214+
215+このクラスは他の**parent(親)**もしくは**ancestor(祖先)**クラス(*TFPCustomPen*)のインスタンスとして宣言されていることに注意すること。その祖先から、すべてのプロパティとメソッドを**inherit(継承)**している。このクラスはそれ自身のフィールドを有しており、以下にグループ化されている。
216+
217+- **private** - これはここで定義されたアイテムが、同じプログラムユニットの他のクラスもしくはプロシージャ/関数からのみ用いるあるいは、見ることができる(この例では、*Graphics*から、そのように他のクラスのいずれ、例えば、同じユニットの*TBitMap*、*TPicture*などでもそれらを使うことができる)ことを意味する。それらは本質的にはローカル変数(例えば*FColor*、*FPenHandleCached*)もしくは、ローカルで用いられるメソッド(*GetHandle*、*SetHandle*)だが、**protected**もしくは**public**節で宣言されたアイテムで用いる、あるいは参照されることができる。
218+- **protected** - これはここで定義されたアイテムが、この**祖先**クラスから派生したクラスにとってのみ用いる、あるいは見ることができることを意味し、そのプロパティとメソッドを継承する。
219+- **public** - これはここで定義されたアイテムが[[Glossary|Uses]]句の現在のユニットを含むどのプログラミングユニットからも利用できることを意味する。
220+- **published** - は**public**節と同様であるが、コンパイラが、これらのクラスの自動的ストリーミングにとって必要な型情報も生成する。パブリッシュされたアイテムはLazarusのオブジェクトインスペクタに通常現れる。もし、パブリッシュされたリストがない場合、オブジェクトインスペクタには、いつもすべての**public**フィールドが現れる。
221+
222+### メソッド
223+
224+メソッドは標準のプロシージャ、もしくは関数に似ているが、いくつかの**指令(directive)**を持つ。 上記で定義されているメソッドのいくつかは指令、**virtual**、他は**override**指令が付けられている。
225+
226+- **virtual** はこのメソッドの型、もしくは実際のインスタンスがコンパイル時に知られていないことを意味するが、何のサブプログラムが実際にこのメソッドを呼ぶかによって、実行時に選択される。これはクラスの定義において場所取りとして、考えることができる。
227+- **override**は実行時のローカルな定義が、特にもしそれが**実質的(virtual)**であるならば、派生クラスから継承された定義の場所をとってかわることを意味する。もし、特に、祖先クラスで定義されたメソッドを使いたいときは、特異的に**継承された**句とともに呼ぶ必要がある。
228+
229+Virtualあるいはoverride指令のないメソッドは**静的(static)**メソッド(Pascalにおける通常の種類)である。Virtualあるいはoverride指令は**動的(dynamic)**である。
230+
231+メソッドの特定のインスタンスは:
232+
233+- **create** - メモリの割り当て、全ての必要かつ、様々なプロパティを設定/初期化するためにな情報を一緒に集める、**コンストラクタ(constructor)**である。
234+- **destroy** - 順に従い、論理的にシステムからクラスのすべての部品を取り除く、そして再使用するためシステムにそのリソースを返す**ディストラクタ(distructor)**である。
235+
236+### プロパティ
237+
238+プロパティは従来的なPascalにおける通常のフィールドに似ているが、**読み取り(read)**あるいは/および**書き込み(write)**指示子を持つ。
239+
240+- **read**指示子はプロパティの正しい結果を返すフィールド、あるいは関数である。上記の例では、プロパティ*Color*は使われる値を保持しているローカル変数である、読み取り指示子*FColor*を持っている。もしプロパティが**read**を持ち、**write**指示子を持っていないなら、それは読み取り専用(read-only)である。
241+- **write**指示子は特定の場所の値を保持する、フィールドもしくはプロシージャである。上の例では*Color*は特定の場所に対する色を書き込むためのプロシージャ(**protected**節で宣言されている)である書き込み指示子、*SetColor*を持っている。もしプロパティが**write**を持ち、**read**を持たないなら、書き込み専用(write-only)である。
242+- **default** - **default**値をプロパティに持たせることが可能なことに注意すること。例えば、ここで*Color*が生成時にデフォルト値*clBlack*、もしくは黒を持っている。それは引き続き異なった値が、プログラムの割り当てまたは、オブジェクトインスペクタにより、与えられうる。
243+- **index**指示子は、プロパティ間で共有される、**read** もしくは **write**メソッドが、どのプロパティが望ましいか特定するために用いることのできる整数値である。もし、**index**が**read** もしくは **write**で用いられているなら、指示子はそれぞれ、関数、もしくはプロシージャなければならず、通常のフィールド/値たりえないことに注意すること。
244+
245+#### 例
246+
247+``` pascal
248+ TFooClass = class
249+ private
250+ FIntProp: Integer;
251+ public
252+ property IntProp: Integer read FIntProp write FIntProp;
253+ end;
254+```
255+
256+``` pascal
257+ TFooClass = class
258+ private
259+ function GetListProp(AIndex: Integer): String;
260+ procedure SetListProp(AIndex: Integer; AValue: String);
261+ public
262+ // プロパティのこの型はクラスのpublishedセクションにはないだろう
263+ property ListProp[AIndex: Integer]: String read GetListProp write SetListProp;
264+ end;
265+```
266+
267+``` pascal
268+ TFooClass = class
269+ private
270+ function GetValue(const AIndex: Integer): Integer;
271+ procedure SetValue(const AIndex: Integer; AValue: Integer);
272+ public
273+ // note that the read and write methods are shared
274+ property Value1: Integer index 1 read GetValue write SetValue;
275+ property Value2: Integer index 2 read GetValue write SetValue;
276+ property Value3: Integer index 3 read GetValue write SetValue;
277+ property Value4: Integer index 4 read GetValue write SetValue;
278+ // インデクスは定数か、数値、あるいは型を列挙することもできる
279+ // 例えば:
280+ // property Value: Integer index ord(seSomeEnum) read SomeFunction write SomeProcedure;
281+ end;
282+```
283+
284+## Free Pascal 言語拡張
285+
286+FPCはオブジェクト指向プログラミングをサポートするためにその「標準」Pascal文法にいくつかの言語拡張を含んでいる。
287+
288+- オブジェクト (5 章) [[Programming Using Objects]]
289+- クラス (6 章) [[Programming Using Classes/ja]]
290+- インタフェース (7 章) [[Programming Using Interfaces]]
291+- ジェネリクス (8 章) [[Programming Using Generics]]
292+
293+これらの拡張はFPC Language Reference Guide <http://www.freepascal.org/docs.var>.(訳注: このリンクは無効であるFPCのリファレンスに対するURLは <https://www.freepascal.org/docs-html/current/ref/ref.html> である)で述べられており、それぞれの概念に対するチュートリアルへのリンクもある。Language Reference Guideはこの概要チュートリアルには含まれない文法便覧とさらなる細部を含んでいる。上記には4つの言語仕様が含まれており、[**Objects**](https://www.freepascal.org/docs-html/current/ref/refch5.html#x59-790005)と[**Classes**](https://www.freepascal.org/docs-html/current/ref/refch6.html#x69-930006)はFPCとLazarusにおける、オブジェクト指向プログラミング (OOP)の基礎を成している。OOP初心者にとって、**Objects**セクションはより概説的なセクションで、**Classes**セクションは**Objects**文法に対する類似性と相違性を強調することで、反復を最小限にしている。一般的に **Classes** 実装はDelphi、Lazarus開発者により広く用いられている。FPCではOOPの **Classes** 方言で、何が実際「class」なのかに言及することに「object」がよく使われている。これらのドキュメントは命名上の混乱を最小限にするために記述されているが、このドキュメント以外では、通常、 **Class** から作られるオブジェクトに用語「object」が用いられている。実際、FPCランタイムライブラリ(RTL)は *TObject* と呼ばれる基底 **class** を持つクラスライブラリを含んでいる。
294+
295+古いTurbo Pascal OOP実装に慣れているユーザーはオブジェクト実装が古いTurbo Pascal方言に基づいているため、Classesセクションを初めは飛ばしたいかもしれない。**Classes**セクションはDelphi文法に基づいているため、Delphiユーザーにはなじみがあるはずだ。**Classes**セクションの書き方は**Objects**セクションからの概念を参照しているかもしれないことに注意すること。様々なApple、THINK、MPW Object Pascal方言になじみのあるマッキントッシュ開発者にとって、FPC ObjectsもしくはClasses方言のいずれも直接的な移行パスとならないだろう。2009年 3月時点では、Mac PascalメーリングリストではAppleのObjective C / Cocoa フレームワークにアクセスするためにあるコンパイラサポート(新しい文法)を提供する可能性が議論されている。
296+
297+### オブジェクト指向 Pascal 一般的な概念
298+
299+OOPは利用可能な他の言語仕様と設計に比べ、データの取り扱いとカプセル化とプログラムフローを取り扱う異なる方法を提供する。OOP は多くの場合、グラフィック ユーザー インターフェイス (GUI) や物理システムなどの特定のアプリケーションを、より自然な感覚でモデル化するのに役立つ。しかし、OOPはすべてのアプリケーションに適切ではない。プログラムコントロールはより基本的なPascal手続き的構造ほど明示的ではない。OOPから最も恩恵を受けるためには、学習曲線が急であることを通常必要とする、大きなクラスライブラリの理解が必須とされる。厳格な手続き的コードをメンテナンスすることに比べ、大規模なOOPアプリケーションコードをメンテナンスすることは、その利点と、欠点がある。OO分析、設計とプログラミング技法に対する豊富な学習教材があるが、それらは本稿の範疇を超えてしまう。
300+
301+拡張、あるいはその言語の基本として、OOPフィーチャを取り込んだ多くのプログラミング言語が存在する。このように、OOコンセプトを記述するために多くの異なる用語がある。FPCですら、いくつかの命名上の重複がある。一般的に、OOPはデータ上で機能するデータとプロシージャの関連したセットを明示的に組み合わせ、カプセル化するプログラミングオブジェクト(もしくは、情報ユニット)の概念よりなっている。データは通常、プログラムの実行中に永続的だが、グローバル変数の宣言に固有の問題を軽減するメカニズムが備わっている。さらに、OOP 言語を使用すると、以前に定義されたオブジェクトに基づいてオブジェクトを段階的に変更および/または拡張できる。 この機能は通常、*継承*および*ポリモーフィズム*という用語で呼ばれる。多くのOOP言語は、1つのオブジェクトに属する、プロシージャを称するのに、*メソッド* もしくは *メッセージ*用語を用いる。OOPの力の源泉はコンパイルバインディングよりも、メソッドの遅い(実行時)、動的なバインディングによって、認識される。このメソッドの動的なバインディングは、プロシージャ変数とプロシージャ パラメータの使用に似ているが、構文の凝集性が高く、関連するデータとのカプセル化が行われ、以前に定義されたメソッドの動作も継承される。次の Wiki ページは、オブジェクト指向の方法での分析、設計、プログラミングについてさらに詳しく知るための出発点を提供する。
302+
303+## さらなる情報
304+
305+これは、この話題についてほんの触りを述べたに過ぎない。より詳細には、[Free Pascal](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html)マニュアルの特に、5章(**Objects**)と6章(**Classes**)を読むことを強く推奨する。
306+
307+ボーランドはまた、寛大にもPDF媒体で、オリジナルのTurbo Pascalマニュアルから、オブジェクト指向プログラミングの章を解放していた。この章ではこの言語仕様をボーランドがTurbo Pascalに導入したときからが書かれている。これは古いかもしれないが、OOPの理論は今日でも非常に関連性がある。[Link](http://geldenhuys.co.uk/articles/)の「その他」のカテゴリから、ダウンロードできる。
308+
309+## 以下も参照のこと
310+
311+- [[Programming Using Classes/ja]]
312+- [[Free Pascal videos|Free Pascal video tutorials]]
313+- [[Lazarus videos|Lazarus video tutorials]]
314+- [[Pascal and Lazarus Books and Magazines]]
315+
316+## 外部リンク
317+
318+- <https://castle-engine.io/modern_pascal_introduction.html> - FPC mode ObjFPC
319+- <http://newpascal.org/assets/modern_pascal_introduction.html> - FPC mode Delphi
320+
321+- <http://en.wikipedia.org/wiki/Object-oriented_programming>
322+- <http://en.wikipedia.org/wiki/OOAD>
323+- <http://en.wikipedia.org/wiki/Object_oriented_design>
324+
325+---
326+*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/ja", as it stood on 2024-04-03 after a change by Ariben, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history