LDF超絶仕様書 第2版(ぇ *いんとろだくしょん*(導入部 LiteDataFormat(略してLDF)は、肥大化するWebのデータをスマートに伝達するために生まれました。 「必要なデータ以外を見えなくする」の元に見易さを失わない程度に改良を重ねました。 このフォーマットの利点は、「軽量」であることのほかに、バイナリデータを扱える点にあります。 終わり。 *はうとぅーゆーず*(基本的な構造 次は簡単なLDFデータの例です。 \\\For example\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ <?ldf v=0.2 e=utf8 ?> <books <book title = "「ハリー・ポッターと死の秘宝」" writer = "J. K. ローリング (著), 松岡 佑子 (翻訳) " <info isbn = "978-4915512636" price = 3990 > > // 以下Amazon.co.jpランキングより <book title="日本のおかず" writer="西 健一郎 (著)" <info isbn="????" price=1680 >> <book title="ゆりちかへ―ママからの伝言" writer="テレニン晃子 (著)" <info isbn="????" price=1365 >> <book title="上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』" <info isbn="????" price=1600>> <book title="田中宥久子の造顔マッサージ DVD付" writer="田中 宥久子 (著)"<info price=1995>> > \\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ XMLに似た感じですが、大きく異なる点があります。(見りゃわかるかw ・閉じタグが無い ・テキストノード(?)が無い ・"をつけていないところがある ・//がコメントになっている (・手抜き感が漂う) ちなみに、books.book[0].titleは"「ハリー・ポッターと死の秘宝」"になります。(この前ようやく読み終わりました) おわり。 *名前配列* これでもよいのですが、これではLDFの恩恵を受けていません。 ここで登場するのがLDFの新機能「名前配列」です。(ハッシュのことじゃないよ これを使って先のを書き換えてみましょう。 なおLDFでは、配列の区切り文字に空白文字のスペースを使います。 \\\For example2\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ <?ldf v=0.2 e=utf8 ?> <books {book title writer <info #isbn $price >} [ "「ハリー・ポッターと死の秘宝」" "J. K. ローリング (著), 松岡 佑子 (翻訳) " [ 978-4915512636 3990 ] ] // 以下Amazon.co.jpランキングより ["日本のおかず" "西 健一郎 (著)" [ ???? 1680]] ["ゆりちかへ―ママからの伝言" "テレニン晃子 (著)" [???? 1365]] ["上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』" "" [???? 1600]] ["田中宥久子の造顔マッサージ DVD付" "田中 宥久子 (著)" ["" 1995]] > \\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 上の形にすると確かに小さくはなりましたが、ハリポタ以外は少し見にくくなりました。 もちろん、他のフォーマットでも無駄を除くとそうなるのですが、LDFでは違います。 これをご覧ください。 \\\For example3\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ {book title writer <info #isbn $price>} ["「ハリー・ポッターと死の秘宝」" "J. K. ローリング (著), 松岡 佑子 (翻訳) " [978-4915512636 3990]] ["日本のおかず" "西 健一郎 (著)" [???? 1680]] ["ゆりちかへ―ママからの伝言" "テレニン晃子 (著)" [???? 1365]] ["上地雄輔フォト&エッセイ『 上 地 雄 輔 物 語 』" "" [???? 1600]] ["田中宥久子の造顔マッサージ DVD付" "田中 宥久子 (著)" ["" 1995]] \\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ そう、LDFでは区切り文字に改行も使う事ができるのです。 また、タブも改行と一緒に「空白文字」として扱われます。 いままで説明しませんでしたが、#isbnの#や$priceの$には意味があります。 #にはそのデータが"文字列"であることを示し、$は"数値"であることを示します。 isbnに限らず、先頭に0が来そうなデータは""でかこむか#を頭につけます。8進数扱いされるのを防ぐ為です。 LDFは他のフォーマットと違い、文字列に"を必要としません。 サーバーで生成された日付、IDなどの空白文字や"の入らないデータは"を省略出来ます。 空白文字や"が入る場合はそれぞれをエスケープしたり、全体を"で囲んだりします。 ところで、books.book[2].info.priceは何でしょうか?そう、1365ですね。 では、次のデータでscore["1"].nameはどうなるでしょうか? \\\For example4\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ <?ldf v=0.2 e=utf8 ?> {score $student_no #name $japanese $math $english *rank} [41 "太郎" 80 80 90 2] [42 "佐藤" 90 60 80 3] [43 "斎藤" 75 95 92 1] \\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 実は、佐藤君ではありません。*rankに注目しましょう。ここで*は「キー文字列」を意味します。 つまりrankが"1"な人、即ち斎藤君になります。 今回は偶然順位がかさならなかったのですが、キーは重複不可なので注意しましょう。 横軸にも縦軸にも名前が付けられる「名前配列」はいかがだったでしょうか? 終わり。文章なげーよ(ぁぁ *こまごまとした仕様*(超適当 ・宣言部。<?ldf ではじまり ?>\n で終わる。v:LDFバージョン、e:エンコーディング、l:言語。 ・コメント。2種類ある。Javascriptと同じ。// で以降行末までコメント。/* から */ の間もコメント。 ・変数名規則。名前の付け方は基本的にJavascriptと一緒。 接頭辞で型指定できるが、必須でないものがほとんど。以下に箇条書き。 <group : オブジェクトを含むオブジェクト。グループ。 {namedarray : 名前配列。 > : グループの終わり。 } : 名前配列宣言の終わり。あとに[A B C][...]とつづく foo1 : オブジェクト型の変数。普通はこれで十分。これより下の型指定は任意 #foo2 : 文字列。 $foo3 : 数値。 !foo4 : 真偽値。True or False. ?foo5(A B C ...) : 列挙値。enum。A,B,C,...の中から選ぶ。 @foo6 : 普通の配列。 |foo7 : フラグ集合。後述。 &foo8 : バイナリデータ。後述。 終わり。早っw *フラグ集合* 実用的な使い方は以下。 \\\For example5\\ldftext\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ // 2択クイズ charenger = <01101111011> answer = <01101001010> \\\Javascript\\\\\\\\\\\\\\\\\\\\\\\\\ // LDFのデコード ldf = ldfdec(ldftext); count = 0; for(i=0;i < ldf.answer.length;i++){ ldf.answer[i] == ldf.charenger[i] ? count++; : count = count; } alert("正解数:" + count); // 8 \\\END\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ そのまんまフラグ集合です。一文字づつ分解して配列に格納されます。 season=<春夏秋冬>といった使いかたも可能です。 おしまい。 *バイナリデータ* XMLやJSONにはないけれど需要がありそうな機能です。 バイナリデータを格納する方法は2つあります。 1.生バイナリを加工する bindata = ~加工済み生バイナリデータ~ //加工といっても簡単で、~を~~に置き換えるだけです。 //パース時には~が奇数個きたら最後の1つ前で終了と判断させるので楽ちんです。 + (%と~を強制Base64エンコードするのもアリか検討中。) なんと画像もFLASHもそのままファイルに埋め込んでまとめて送信できます! いちいちBase64エンコードしなくてよいので動作も容量も軽いです。 2.エンコード済みバイナリデータ bindata2 = %文字列化済みバイナリデータ~ これには4つのモードがあります。 sjisモード、utf8モード、アスキーモード、バイナリモード。 共通するのは ・%と~は強制Base64エンコードすることです。 あとはそれぞれの文字コードで表示できない(不正な)文字コードの文字だけ Base64エンコードしていきます(改行・タブ以外の特殊文字を含む)。 バイナリモードは文字コードにかかわらず全部Base64エンコードします。 おしまい。 ご精読ありがとうございました。 By Satosi 2008/8/10 第1版はgdgdだった。反省している。 ちなみにこれはpredocで書いた。