すのふら

すのふら

日々の備忘録

センチメンタルグラフティ20周年イベントクラウドファンディング開始してます

f:id:snofra:20181111023004j:plain
センチメンタルグラフティ20周年スペシャルイベント〜再会〜」 開催プロジェクトの
クラウドファンディングが2018/10/11(木)から開始しています!

camp-fire.jp


この名前を聞いて懐かしいと思ったら人、是非ご支援をお願いします。
俺はイベント昼夜通しで参加+ライブグッズ+キャラクターグッズで支援しています!

じゃあどれを支援したらいいのかって、おすすめはキャラクターグッズC


ネット上で結構記事上がってるけど大体「イベントのクラウドファンディング」という記載が多い。

だから会場に参加できない人はスルーみたいな感じな人も多いのかなっておもうけど、イベント自体の支援だけではなく、20周年記念のグッズの支援があるので、会場に参加できない人はグッズで支援もありだと思う。


準備不足考慮不足が多々あってクラウドファンディング実施延期もあり、チケット売れなかったときどうするの?みたいな話もあって、先月頭あたりは本当に始められるのか?なんておもっていたけど、いざ始まってみるとネット上でも結構取り上げられていて、イベントのチケットもいい感じで売れている。(昼夜通しチケットは完売)

いい感じで盛り上がってるなあという感じ。

news.denfaminicogamer.jp
www.4gamer.net

『センチメンタルグラフティ』20周年クラウドファンディング、開始10分弱で目標達成。現在は180%超えの1800万オーバーに - ファミ通.com

news.denfaminicogamer.jp

www.inside-games.jp


支援状況

支援状況という点では、10/11の22時から開始して、開始10分程度で目標金額クリア。

10/12の1時断面で180%、17時断面で200%パーセント突破。正直予想してなかった、というよりツイキャスで「帰ってきたセンチメンタルナイト20」を8月からやっていたけど、リアルタイム視聴者数そんないなかったのに、どこにいた伏兵!みたいな感じ。

結構余裕こいていたけど、実際はAWSのCloudFrontがタイムアウトエラーで落ちるくらいのアクセス量。
みくびってた。


ツイキャス

ツイキャスも絶賛やってます。

Live History - センチメンタルグラフティ20周年 (@c:senti20th) - TwitCasting

RedshiftでのCREATE TABLE中に「ERROR: XX000: 1040」が出力

タイトルそのままの現象だが、RedshiftでCREATE TABLEコマンドを実行中に「ERROR: XX000: 1040」が出力されて、CREATE TABLEができない状態に陥った。

実行クライアントツールはaginity。クライアントを再起動、再接続してみたが結果変わらず。


メッセージも上記の文言だけでよく分からず、何でだろうと調べたら、「ERROR: XX000: 1040」はRedshiftのinternal error(500エラー)なのね。

調べていくと、Redshiftのインスタンスタイプのテーブル作成上限を突破していたことが原因だということが判明。

テーブルの最大数は large と xlarge クラスターのノードタイプで 9,900、8xlarge クラスターのノードタイプでは 20,000 です。制限には一時テーブルが含まれます。一時テーブルには、ユーザー定義の一時テーブルや、クエリの処理またはシステムメンテナンス中に Amazon Redshift によって作成された一時テーブルが含まれます。ビューはこの上限には含まれません。

Amazon Redshift における制限 - Amazon Redshift

テーブル数は一時テーブルも含むので、一時テーブルを作っていた別のチームにも影響を与えていた。

取り急ぎ使用していないテーブルをS3に退避のちDROP

What does my warehouse error mean? Documentation - Segment

再入可能・再帰的・再使用可能・再配置可能について調べる

プログラムをメモリに格納するときの構造と、プログラム自体の性質について調べた。

再入可能(リエントラント)

プログラムやサブルーチンが実行中に割り込まれ、その実行が完了する前に再び呼び出され実行されても安全だという性質を指す。
割り込みは分岐や呼び出しなどの内部的な動きによって生じる場合もあるし、ハードウェア割り込みやシグナルなどの外部の動きによって生じる場合もある。割り込んでの呼び出しが完了すれば、割り込まれた呼び出しが実行を継続できる。

直接または間接に再帰可能なサブルーチンはリエントラントである。しかし、グローバル変数が処理の流れの中でしか変化しないことを前提としているサブルーチンはリエントラントではない。

リエントラント - Wikipedia

自分がいつも作っているプログラムだけで考えると、みんな使うような共通処理はサブルーチン化する。

みんな使うので当然様々な処理から実行されるんだけど、そのときにAプログラムは1を返して、BプログラムはAプログラムの結果を持ったままだと1+1で返しちゃうとAプログラムとBプログラムで結果違わない? ってなってしまう。

そういうときは大体グローバル変数とかメモリから解放されない値が原因のバグだったりする。

そういうことがなく、必ず1を返すというのが再入可能。

処理ごとにメモリが確保されて、処理が終わったらちゃんと確保された値がメモリから解放されてるってことだよね。


ハードディスク割り込みについては、処理中にクリックしてCPUに割り込んだ時にクリックしているのにシャットダウンしたらまずいよね、クリックしたら必ずクリックした結果がかえされるべきであるということ。


サブルーチンから自分を呼び出す処理も当然あるので、自分のサブルーチンからまた自分を呼びだせる(再帰可能)。

再入可能の3原則

  • リエントラントなコードは、静的変数やグローバル変数を保持しない。
  • リエントラントなコードは自分のコードを書き換えない。
  • リエントラントなコードは、リエントラントでないプログラムやサブルーチンを呼び出さない。

ということは再帰可能=再入可能と言える。


再帰的(リカーシブル)

再入可能で書いた通り、自分自身を呼び出せること。


再使用可能(リユーザブル)

プログラムはメモリに格納されて処理される。処理が終わるとメモリから解放される。

サブルーチンはメモリに毎回格納して開放するのは無駄なので、メモリに確保したままで複数のプログラムから使えるべき。それが可能なのが再使用可能。

再利用可能ということは再入可能で、再帰的であるといえる。

逆に、メモリを確保したままで複数のプログラムから使えないパターンもある。それは逐次再利用可能という。

ということは逐次再利用可能は再入可能ではない。
逐次再利用可能なプログラムから再入可能なプログラムを別に呼び出せないわけでない。そりゃそうだ。


再配置可能(リロケータブル)

再使用の手前の話。

プログラムをメモリに格納するときに、メモリのアドレス空間のどこに置くのかっていう話がある。

メモリアドレスAではうまく処理されるけど、足し算するためにメモリアドレスAからメモリアドレスBに移動したときにコンパイルエラー。
メモリアドレスAからメモリアドレスCのときは大丈夫みたいなのでは、プログラムとして安全性に欠ける。

そのためどこのメモリに配置してもうまく動くよねっていうのを担保する必要がある。


ざくっと一覧にする

この4つの概念、メモリとプログラムで軸が全然違うが、ざくっと一覧にするとこんな感じか。
f:id:snofra:20180906003753p:plain

再使用可能が△なのは、逐次再使用可能が×で再使用可能が〇だから。
応用情報試験とかで出てくる際の再使用可能は逐次も含んでいる。


参考にしたサイト

再帰的(リカーシブ)・再入可能(リエントラント)・再使用可能・再配置可能 - stacked tip that high

実行プログラムの主記憶配置<ソフトウェアとOS<ハードウェアとソフトウェア<Web教材<木暮

再帰的,再入可能,再使用可能,再配置可能 [徹底研究!情報処理試験]

再入可能、再帰的、再使用可能、再配置可能 : 応用情報技術者試験 - SE娘の剣 -

木構造について調べる

相変わらずwikipediaをメインに調べていく。

木構造(きこうぞう)とは、グラフ理論の木の構造をしたデータ構造のこと。

木構造 (データ構造) - Wikipedia

親に子供がぶら下がっている構造のこと。
f:id:snofra:20180905161535p:plain
こんな感じで親に当たる根ノードとその子供である葉ノードに分別できる。
深さをカウントするときは根ノードよりも下をカウントする。


木構造なぜやるのか、木構造によって何が幸せかというと、データを取得するときに効率よく取得できるということ。
HDDのデータを取得するのも木構造(B+Tree)で、データ探索の効率がよいから。
*1

この動画みたいに何通りあるのかの処理の実行に260億年とかかけられると非常に困るわけで。
www.youtube.com

それを効率よくデータを取得しようという考えがあって、アルゴリズムのひとつとして木構造が存在するということ。


木構造の走査法

木構造を処理するとしたときに実行方法(走査法)はいくつか存在している。主に2つ。


深さ優先探索

簡単に言うと、

  1. 根ノードから葉ノードまでの1ルート、分岐気にせず全部見る。※左側から順番に見る
  2. 末端までたどり着いたら、末端の直前の分岐まで戻ってまだ行っていないルートを末端まで行ってみる。
  3. それを繰り返す。

そんな感じ。

俺が一番しっくり来たのはノベルゲームのルートをいったん全部やってED見た後、行っていない選択肢選びつづけてルート制覇する感じ。

この探索方法も3つある。

  • 前順・先行順・前置順・行きがけ順
  • 間順・中間順・通りがけ順
  • 後順・後行順・後置順・帰りがけ順


前順・先行順・前置順・行きがけ順

上で書いた内容の通り順番に実行する。
f:id:snofra:20180905163651p:plain


間順・中間順・通りがけ順

木の左側の末端の葉ノードから走査する。
ABCFのような節になっているところは、上から下とのきにカウントするのではなく、下から上になったときにカウントする。
※B→Fのときに1ではなく、I→Fのときに1カウントする
f:id:snofra:20180905163706p:plain


後順・後行順・後置順・帰りがけ順

前順・先行順・前置順・行きがけ順の逆版みたいなイメージ。
この場合も木の左側の末端の葉ノードから走査する。
f:id:snofra:20180905163734p:plain


幅優先探索

深さが同じノードを浅い方から順に走査していく。
f:id:snofra:20180905163915p:plain

木構造の種類

二分探索木とかAVL木は以下動画がわかりやすくておすすめ。
www.nicovideo.jp

B-Treeは上の動画のAVL木を少し変えたもの。
何が変わっているのかっていうと、多分木であるのでその要素が違う。
多分木って何かっていうと、ひとつの親にぶら下がれる子供が複数件OKってだけ。

二分探索木やAVL木はそもそもそものルール上、ひとつの親にぶら下がれる子供が2つのみ。

じゃあなぜAVL木ではなくB-Treeをつかうのか。

B-treeとは、1つのノードがm個 (m>=2) の子ノードを持つことができる平衡木構造のことです。

なぜAVL木だと問題があるかというと、大規模なデータを補助記憶装置(ハードディスクなど)へ格納し検索する場合、コンピュータの処理に時間がかかってしまうためです。
ハードディスクは主記憶装置に比べ、アクセス時間が非常に長く、そのためハードディスクを効率的に扱うには、なるべくブロックの読み取り回数を少なくする必要があります。

ブロックの読み取り回数は木の深さになります。
AVL木の場合、log n 回なのに対して、B-treeの場合、log n / log m 回 (※計算は省略) になります。そのためmが大きくなるほど、処理時間に差が出てきます。
このことから、MySQLではインデックスのデータ構造にB-treeが採用されているようです。

B-treeインデックス入門


そのほか参考サイト

http://www-ikn.ist.hokudai.ac.jp/~arim/pub/algo/algo6.pdf

木構造<ハードウェアとソフトウェア<Web教材<木暮仁

https://wa3.i-3-i.info/word14397.html

よく分からない深さ優先探索

ヴァイロンとトロイメアを使用したデッキを考えてみる

f:id:snofra:20180827012531p:plain

2010年4月27日に稼働した「DUEL TERMINAL -ヴァイロン降臨!!-」の新規テーマ「ヴァイロン」を使用したデッキ。

このカテゴリ群が登場したとき、カードデザインが個人的に好みで集めたことを覚えているんだが、デッキコンセプトが「シンクロ」と「装備魔法」だったので、フリーでもきついとことがあった。

リンク召喚が出てきてある程度戦えるようになってきたので、動かし方をメモしておく。


デッキレシピ

f:id:snofra:20180827005955p:plain


コンセプト

ヴァイロンデッキは、以下2つが有名どころだと思う。

  • 「ヴァイロン・シグマ」でのワンキル
  • 「静寂のロッド-ケースト」を使用した「ヴァイロン・オメガ」(いわゆるケーストループ)

俺が思うに「ヴァイロン・シグマ」はワンキルできなかったとき、そのまま泥試合に突入するし、ケーストループは安定性に欠けるかなと。

ある程度安定して盤面固められるのが、「ヴァイロン・エプシロン」軸かなと思い、そちらをメインに使用するデッキにする。

f:id:snofra:20180827010211j:plain

シンクロ・効果モンスター
星8/光属性/天使族/攻2800/守1200
光属性チューナー+チューナー以外のモンスター1体以上
このカードに装備された装備カードは、カードの効果の対象にならない。
また、1ターンに1度、このカードに装備された装備カード1枚を墓地へ送って発動できる。
相手フィールド上のモンスター1体を選択して破壊する。


ヴァイロン自体に汎用的な特殊召喚モンスターがなく他のカードでフォローするしかないので、以下のカードと「ヴァイロン・プリズム」でシンクロ召喚する形になる。

  • フォトン・スラッシャー」
  • 「召喚僧サモンプリースト」
  • 「ワンタイム・パスワード」


単純に打点であれば、「ヴァイロン・エプシロン」の元々の攻撃力2800+「ヴァイロン・プリズム」効果で攻撃力1000で、3800まで上がるので戦闘破壊はあまり心配していないんだけど、この時代効果による除去がメインなので、攻撃力に頼るのは難しい。


ある程度、盤面を固めておきたいという意図があり、昨今の【剛鬼】デッキを参考にした「トロイメア」との組み合わせて安定性を上げる。


「召喚僧サモンプリースト」1枚からの展開

「召喚僧サモンプリースト」が手札になければ「終末の騎士」からでもある程度で展開することはできる。

f:id:snofra:20180827010413p:plain

f:id:snofra:20180827010417p:plain

f:id:snofra:20180827010420p:plain

f:id:snofra:20180827010409p:plain
後続で「ヴァイロン・アルファ」と特殊召喚したときに墓地から装備させるので、戦闘破壊という点で有利な「月鏡の盾」を墓地に送る。

ヴァイロンは戦士族チューナーがいないので、なんでもいい戦士族チューナーになる。
「ヴァイロン・マター」を使用するなら、ここで3枚分ヴァイロンの装備カードを墓地に送っておく。

f:id:snofra:20180827010424p:plain
フォトン・スラッシャー」でなくてもいいが、次ターン以降の展開のことを考えて特殊召喚して他ヴァイロンカードをサポートできる「フォトン・スラッシャー」にしている。

f:id:snofra:20180827010651p:plain
「水晶機巧-ハリファイバー」の出張パーツの流れ。

f:id:snofra:20180827010712p:plain

f:id:snofra:20180827010825p:plain
「ヴァイロン・キューブ」は機械族なので、「水晶機巧-ハリファイバー」の出張パーツの流れでデッキから特殊召喚が可能。
「水晶機巧-ハリファイバー」からでも「ヴァイロン・キューブ」は出せる。

ただ、「ヴァイロン・プリズム」は雷族なので出すことができないのがつらい。

f:id:snofra:20180827011000p:plain
「D-HERO ディアボリックガイ」と「ヴァイロン・キューブ」「ヴァイロン・アルファ」を出す。正直他のレベル7シンクロモンスターでもよい。

f:id:snofra:20180827011439p:plain
「リビング・フォッシル」で特殊召喚するモンスターは何でもいいがここでは「屈強の釣り師」にしてる。

f:id:snofra:20180827011602p:plain

f:id:snofra:20180827011618p:plain


回した感想

盤面が安定する

「トロイメア・グリフォン」が立っている状況かつ、ヴァイロンシンクロモンスターが立っているとかなり盤面が固くなるので、かなり安定できている気がする。

「トロイメア・グリフォン」に「ヴァイロン・プリズム」や「魔導士の力」を装備させてシンプルに打点をあげていくのもよかった。

トロイメアモンスターは相互リンクさせることで、モンスター自体固くなるが、打点が高くなくていまいち突破力に難があった。
それを装備カードで補えるのが強い。


一度妨害されると立ち直れない

「サモン・ソーサレス」や「水晶機巧-ハリファイバー」を封じられるのと、さすがに8年前のカード群に何かするパワーはないので、そのまま崩れていってしまうことが多い。

「墓穴の指名者」を入れてカバーする必要があるなと感じている。


ヴァイロン専用の装備カードの有無

ここが一番悩みどころで、今「ヴァイロン・セグメント」と「ヴァイロン・マテリアル」で5枚体制。
ただ汎用的ではないという点で、リンクモンスターに装備できず、手札で腐ることが多い。

「ヴァイロン・セグメント」は「ヴァイロン・エプシロン」を場に維持するのに欲しいところではあるが、何枚入れるかは考える必要があるなと。

ソートアルゴリズムメモ

ソートのアルゴリズムをちゃんと理解したいなあと思いつつネットで調べてみたんだけど、歴史からちゃんと書いているものはないなあ。
そういう書籍ってないのかなー。

バブルソート

隣り合う要素の大小を比較しながら整列させること。最悪計算時間がO(n2)と遅いが、アルゴリズムが単純で実装が容易なため、また並列処理との親和性が高いことから、しばしば用いられる。安定な内部ソート。

バブルソート - Wikipedia

2つの要素について順番に比較していって大小を決めていくソート。いちばん単純なやつ。

www.youtube.com

www.youtube.com


クイックソート

1960年にアントニー・ホーアが開発したソートのアルゴリズム。分割統治法の一種。

n個のデータをソートする際の最良計算量および平均計算量はO n\log nである。他のソート法と比べて、一般的に最も高速だといわれているが対象のデータの並びやデータの数によっては必ずしも速いわけではなく、最悪の計算量はOn^{2}である。また数々の変種がある。 安定ソートではない。

クイックソート - Wikipedia

ある基準を設定して、基準に対して値の大小で左右に数字を振り分ける。
振り分けたうち、基準より小さいものと多きもので分割する。
分割したものに対して、またある基準を設定して振り分けていく。

www.youtube.com

www.youtube.com


ヒープソート

リストの並べ替えを二分ヒープ木を用いて行うソートのアルゴリズムである(ヒープ領域とは無関係であることに注意する)。

アルゴリズムは、以下のように2つの段階から構成される。

未整列のリストから要素を取り出し、順にヒープに追加する。すべての要素を追加するまで繰り返し。
ルート(最大値または最小値)を取り出し、整列済みリストに追加する。すべての要素を取り出すまで繰り返し。
計算量は O(n\log n) となる。安定ソートではない。

ヒープソート - Wikipedia

二分木を使って作られるヒープを利用したソート。
ヒープといえばヒープ領域を思い浮かべるが、それは全くの別物なので気を付ける。

配列の0から順番に整列して、根と葉を比較して大きいほうを根にもってくる。

sevendays-study.com

www.youtube.com


シェルソート

シェルソートは、交換によるソート(バブルソート)あるいは挿入によるソート(挿入ソート)の一般化と見なすことができる。
ソートの方法は、まず、間隔の離れた要素の組に対してソートを行い、だんだんと比較する要素間の間隔を小さくしながらソートを繰り返す、というものである。
離れた場所の要素からソートを始めることで、単純に近くの要素を比較する場合よりも速く、要素を所定の位置に移動させることができる。ただし、安定ソートではない。
ドナルド・シェル(Donald L. Shell)が、1959年に、シェルソートの最初のバージョンを公開した。

シェルソート - Wikipedia

ある配列に対し、大きな間隔でソートする。
それが終わったら1回目よりも小さい感覚でソートしていく。

www.youtube.com

www.youtube.com


マージソート

ソートのアルゴリズムで、既に整列してある複数個の列を1個の列にマージする際に、小さいものから先に新しい列に並べれば、新しい列も整列されている、というボトムアップの分割統治法による。
大きい列を多数の列に分割し、そのそれぞれをマージする作業は並列化できる。

マージソート - Wikipedia

配列を2分割し、さらに2分割した中から細かく分割して比較。
細かく分割したもの同士で比較していって、最終的に最初に分割した2分割したものを比較していくソート。

www.youtube.com

www.youtube.com


そのほか参考

qiita.com


qiita.com

XMLについて勉強する

JSONは使用したことがあったけど、XMLの知見が全くなかったので、調べたことをメモしておく。

wikipediaベースで調べていったので、引用のURLがなければWikipediaから引用している。 Extensible Markup Language - Wikipedia

そもそもXMLとは

EXTENSIBLE MARKUP LANGUAGEの略称。

基本的な構文規則を共通とすることで、任意の用途向けの言語に拡張することを容易としたことが特徴のマークアップ言語の総称である。

基本概念

個別の目的に応じたマークアップ言語群を創るために汎用的に使える。


XMLはその「入れ子状にタグで囲まれたもの」という構文を共通としたことで、拡張が用意であるとして「extensible」と主張している


しばしば「あらゆる目的に使える」などと主張されるが、基本的に入れ子構造(木構造)であって、より入り組んだネットワーク構造(グラフ構造)を直接扱うことは不可能である(XLinkなどの提案はあるが)。

つまり、

  • XMLマークアップ言語である。
  • 基本的にHTMLタグと同じルールで<>...で囲う必要があるし、<body><h2></h2></body></span>みたいに入れ子にしないといけない。
  • XPathRSS*1等別規格を拡張することが可能である。

目的

インターネットを介して、構造化文書や構造化されたデータの共有を、容易にすることである。 XMLを使うと、文書を構造化して記述できるし、コンピュータのデータを直列化 (シリアライズ) できる。

XMLはファイル拡張子でもあるので、ファイルの共有が容易にしたいという点。
文書の書き方があるので構造化されていて、可読性があるしデータをひとつの固まりにできる。

結局、データの受け渡しを簡単にしたい、文書は構造化したい、ある程度タグ(構造)は自由にしたいという3点が目的のよう。
「データの受け渡しを簡単にしたい、文書は構造化したい」あたりはJSONとおなじようなもんだなーと。

スキーマ言語

XMLスキーマ言語を定義しなくてはいけない。

スキーマ言語というのは

「このXMLファイル(とかSGMLファイルとか)は、こんな構造になっていますよ」が書いてあるファイルの、書き方ルール

https://wa3.i-3-i.info/word13412.html

「ある程度タグ(構造)は自由にしたい」と記載した通り自由にやれるんだけど、可読性を考えたときにこれがどういうルールで書かれているのかが分からないとそもそも読めないので、事前にどういうルールなのかを記載しておこうねっていうもの。

そのスキーマ言語は Document Type Definition (DTD、文書型定義)、W3C XML SchemaRELAX NG (文書スキーマ定義言語: DSDL)などがあるよう。
メインはどころはDTDになるのかね。

Document Type Definition - Wikipedia

整形式XML文書と妥当なXML文書

書かれたXMLが正しいかどうかのチェック水準として2つの水準が存在。

整形式XML文書

整形式XML文書 (well-formed XML document) は、XMLの構文の規則のすべてに準拠している。例えば、文書中のある要素が開始タグが有るが対応する終了タグが欠落している場合、その文書は整形式 (well-formed) ではない。整形式ではない文書はXML文書とはみなされない。

要は文章内の構文チェックか。タグの記載がミスってるとコンパイルエラー起きるのでXML文書として扱わないよってことかな。

妥当なXML文書

妥当なXML文書 (valid XML document) は、整形式XML文書としての条件を満たしていることに加えて、文書の論理的構造を規定する何らかの規則に準拠している。このような規則は、RELAX NGXML Schema、Document Type Definition (DTD) などのスキーマ言語で定義されたスキーマで定める。例えば、あるXML文書がスキーマに定義されていない要素 (タグ) を含んでいた場合、検証XMLプロセサは、そのXML文書を処理することはできない。検証XMLプロセサによって検証されたXML文書は、妥当 (valid) であると位置づけられる。なお、妥当な文書であっても、非検証XMLプロセサでは実体の定義を確認しないため、仕様で定められている実体参照(<、>など)以外の私的な実体参照を用いている場合、非検証XMLプロセサは当該実体を参照できず致命的なエラーとなる。

これはタグの記載はミスっていないけど、DTD上のルールに沿っていない場合かな。
実行時のコンパイルは通るけど、いざ実行する際にDTDルールに沿っていないからうまく読み取れないので、XML文書として扱わない。

整形式XML文書と妥当なXML文書の範囲

各文書で記載している通り、整形式XML文書がきちんとできていて、次にその文書がちゃんとルール通りだよねという観点での確認となる。

図で表すと以下となる。
f:id:snofra:20180818123228g:plain
@IT:やさしく読む「XML 1.0勧告」 第4回 XML仕様書で使われる言葉の意味

XMLを読む

以下のサイトに記載されている例を見る限り

www.atmarkit.co.jp

<?xml version='1.0'?>
<!DOCTYPE document [ ... ]>
<document> 記載したい内容 </document>

この流れで構成されているよう。

DTD部の一般的な構成は以下のよう。

<!DOCTYPE ルート要素名 [SYSTEM もしくは PUBLIC 公開識別子] 外部サブセット参照 [ ]>

そのほか参照サイト

www.slideshare.net

kaihooo.com

slidesplayer.net

*1:Extensible HyperText Markup Language (XHTML)、DocBook、RSS、Mathematical Markup Language (MathML)、ebXML、Scalable Vector Graphics (SVG)、MusicXML etc