日本野望の会 http://yabooo.org いずれにせよITで世界征服をたくらむ悪の組織です。 Mon, 28 Dec 2009 14:30:41 +0000 http://wordpress.org/?v=2.8.3 ja hourly 1 野望の会プロヂュースのミニフィルム作りました http://yabooo.org/archives/237 http://yabooo.org/archives/237#comments Mon, 28 Dec 2009 14:30:41 +0000 hirokidaichi http://yabooo.org/?p=237 おひさしぶりです。事務局長のひろきのだいちです。

この間映画をプロヂュースしたので、ぜひ見てください。
予算の内訳とかあとで書くかもですが、社会人でも合間をぬってコンテンツがつくれるのかなーというトライアルです。
年1くらいでは続けていきたいです

タイトルは肉食女子

現代社会の縮図とも言える肉食女子のサイエンスドキュメンタリーです。

いいかんじにくだらないので見てやってください。

]]>
http://yabooo.org/archives/237/feed 0
入れ替えても読めちゃうツール http://yabooo.org/archives/217 http://yabooo.org/archives/217#comments Fri, 08 May 2009 17:37:55 +0000 http://www.yabooo.org/?p=217 どうも、おひさしぶりです。ひろきのだいちです。

本日こんな記事を見つけて興奮したので、

http://www.asks.jp/users/hiro/59059.html

つい、やっちゃいました。

どうやら、人間は

390 名前:なまえをいれてください[sage] 投稿日:2009/05/08(金) 00:37:47 ID:Oqxr6eLt
こんちには みさなん おんげき ですか? わしたは げんき です。
この ぶんょしう は いりぎす の ケブンッリジ だがいく の けゅきんう の けっか
にんんげは たごんを にしんき する ときに その さしいょ と さいご の もさじえ あいてっれば
じばんゅん は めくちちゃゃ でも ちんゃと よめる という けゅきんう に もづいとて
わざと もじの じんばゅん を いかれえて あまりす。
どでうす? ちんゃと よゃちめう でしょ?

としても読めてしまうみたいなので、ツールというかプログラムにしました。

半角スペース区切りで、ひらがなを入力してください。
適当なので、\sのブラウザごとの違いは吸収してません。
あと、。や?なども一緒くたにシャッフルします。

JAVASCRIPT:
  1. var ShuffledText = Class.create({
  2.     initialize:function(option){
  3.         this.element = $(option.element);
  4.         this.trigger = option.trigger;
  5.         this.target  = $(option.target);
  6.        
  7.         this.element.observe(this.trigger,this.action.bind(this));
  8.     },
  9.     action : function(){
  10.         this.target.value=$A(this.target.value.split(/\s/)).map(function(elem){
  11.             var array = elem.split('');
  12.             var first = array.shift();
  13.             var last  = array.pop();
  14.             return [first,
  15.                 array.sortBy(Math.random),last].flatten().join('')
  16.         }).join(' ');
  17.     }
  18. });

いそいで書いたので、そんなにきれいじゃないんですが
ぜひ遊んでみてください。

追記:
ぐは、なんかもうやられてる
http://blog.livedoor.jp/dankogai/archives/51210157.html

]]>
http://yabooo.org/archives/217/feed 1
Webは進化し続ける。 http://yabooo.org/archives/213 http://yabooo.org/archives/213#comments Tue, 14 Apr 2009 16:52:46 +0000 http://www.yabooo.org/?p=213 yabooo
どうも、ひろきのだいちです。こんにちは。
先月の3/29日にやってきましたよ、「Web2.0中の人ナイト」。
そうそうたる企業の数々が出演しました。
「yahoo!」「mixi」「GREE」「livedoor」「楽天」「クックパッド」「@nifty」。

こんな面子ほかでは見られません。
しかも満員御礼。当日券まで完売の大盛況でした。みなさま本当にありがとうございました。
dsc_0422_s
場所は、@niftyの運営するお台場のライブハウス、「東京カルチャーカルチャー」。

次代を作り上げるには、フツウの場所でフツウに勉強会している場合じゃないんです。

今回出演していただいた20代のエンジニアは、
例外なくみんな目が悪い。
しかし、平均視力0.1の彼らが見据える先にこそ、
ネットはどこまでも広がっている。

平均視力は0.1、WEBエンジニアが見据える世界!「Web2.0 中の人ナイト」ライブレポート(2009.3.29開催)

平均視力よりももっと見てほしいことがある。
それは出演者の平均年齢だ。

出演者はほとんど80's。入社1~2年目のフツウの業界では「右も左もわからないペーペー」と呼ばれている若さだ。彼らみながサービスの第一線で活躍し、うん千万人の日々を支え、そして生活を豊かにし続けている。そう、「WWW」よりも若く、そして学生時代をケータイとともにすごした彼らの見ている地平は、Web2.0といった既存の枠組みを軽くとびこえる。

「webって常に進化して行くものだと思うんです。
だから、個人的には『2.0』も『3.0』も無くて、
webの進化によってみんなの生活が豊かになって行くこと。
これが大事なことなんだと思います」

そしてWebは進化し続ける。

それは、彼らが進化することをやめないからだ。

その他の感想はこちらから

]]>
http://yabooo.org/archives/213/feed 0
[イベント]そろそろWebを再起動しよう http://yabooo.org/archives/205 http://yabooo.org/archives/205#comments Sun, 22 Mar 2009 14:48:56 +0000 http://www.yabooo.org/?p=205 どうも、日本野望の会事務局長のひろきのだいちです。おひさしぶりです。

ひさびさの野望の会イベントです。

WWWが生まれて20年ちかくたちますが、このずっと起動しっぱなしだったWebというものを今一度、若い目線で見直してみようという一大イベントを開催します。オレンジや青の大手SNSをはじめ、誰もが知ってる大手ポータルサイトの歴歴の若手たちが一同に終結し、Webの今後を語り合います。そんなイベントを開催するにふさわしい場所が、コミュニティサイトの最長老niftyのお膝元である「Tokyo Culture Culture」というイベントホール。題して「Web2.0中の人ナイト」。

日時は3/29(日)

nakanohitonight_02

この浮ついた感もあるチープな名前と適度なサブカル臭が、日本野望の会の真骨頂なのですが、なかなかどうして今回はそうそうたる面々からのWeb業界の事情やライフスタイルなどがかんがみえます。

Web2.0とはなんだったのか。

Webの中、どうなってんの?

そろそろ再考してみてもいい時期かもしれません。

http://tcc.nifty.com/cs/catalog/tcc_schedule/catalog_090225201886_1.htm

チケットはe+から購入または当日券もございますyo

チケット残件わずか!となってしまいました。当日券は期待しないでe+からお買い求めください。

では!

]]>
http://yabooo.org/archives/205/feed 0
書評:JavaScript Good Parts http://yabooo.org/archives/201 http://yabooo.org/archives/201#comments Sun, 21 Dec 2008 16:37:12 +0000 http://www.yabooo.org/?p=201 どうもひろきのだいちです。
水野さん。ありがとう。こんないい本を訳してくれて。そしてくれて。

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

この本はJavaScriptの世界を一段押し上げるためのものです。きっとJGPとか略されたり、蝶本といわれたりとしてこれからJavaScriptの世界でスタンダードとなる概念を構築するための本になるんだろうなと。その意味では仕事でJavaScriptを読む人間に必携の本となるだろうし、この本を「読む」だけではなくて「理解」することが必須となる本となるだろう。

しかし、これはPerlの世界で言うところ「Perl Best Practices」的な書籍ではないということも理解してほしい。

というのもまだ、JavaScriptの世界はPerlほど成熟していないからだ。

この本は「use strict」「use warnings」のための諸概念を切り出すという段階を担っているものであり、
JSLintはその外部実装といったほうがいいのだろうか。

これが荒唐無稽な著者の挑戦でないことは彼がすでに「JSONの規格化」に成功していることからも伺える。

次の段階を考えてみよう。
良いものと悪いものの線引きはできた。

ではその次は悪いものの使いどころと悪い性質の避け方だ。
Perlには「no strict」「no warnings」が用意されていて、悪い面をライブラリユーザに見せずに清潔なプログラミングを可能にしている。

newの使いどころ

newの何がわるいの?

JAVASCRIPT:
  1. function hoge(){
  2.     this.fuga = "x";
  3. }
  4. new hoge(); //{fuga:"x"}

newはjavascriptのクラスシステムの根幹を担うところであり、使わないという選択肢はなかなか難しい。
すべての機能をmethod chainの中に隠蔽してしまうという方法論もあるにはあるが、DOMありきのプログラミングモデルならまだしも、それ以上のものを考える場合には必要最低限の機能である。

なにが悪いのかといえば次のようなケースである。

JAVASCRIPT:
  1. function hoge(){
  2.     this.fuga = "x";
  3. }
  4. hoge(); // undefined, window.fuga="x"

hogeはコンストラクタなのに、new演算子を伴わないで呼び出された場合にfunctionにbindされているthisかあるいはトップレベルオブジェクトに対して汚染をしてしまうケースがある。

これは確かに致命的だ。

ひとつはコーディングルールの中にClass名をHogeのように先頭をcapitalizeするという方法論だ。
もうひとつはコンストラクタ中でチェックルーチンを入れるという方法論。

JAVASCRIPT:
  1. function Hoge(){
  2.     if(this===self)throw('Error');
  3.     this.fuga = "x";
  4. }
  5. Hoge(); // error :Error

あるいは、

JAVASCRIPT:
  1. function Hoge(){
  2.         if(this.constructor!==Hoge)throw('Error');
  3.     this.fuga = "x";
  4. }
  5. var x ={};Hoge.apply(x);

こういった機能の柔軟性を封じるやり方もできる。

本書に出てくるnewをFunctionオブジェクトのmethodとして実装するやり方もエレガントだけど、
もうすでにnewがあるんだからライブラリ作成者なりが注意しておくか、レビューをしっかりすれば問題ナッシングだと思う。

withの使いどころ

JavaScriptからは関数のスコープで定義されるActivation Objectに直接アクセスすることができない。
これはここらへんを読んでもらうとして。

たとえば、Globalオブジェクトをできる限り汚染しないようにして、ネームスペース的機能を提供しようとした場合に

JAVASCRIPT:
  1. window['core'] = {};
  2. (function(){with(this){
  3.     this.fuga = 'text';
  4. }}).apply(window['core']);
  5.  
  6. (function(){with(this){
  7.     print(fuga);
  8. }}).apply(window['core']);

これは適切なnamespace機能さえjavascriptに用意されていれば済む話だが、withが強力な機能を提供する場面でのひとつだ。

eval/new Functionの使いどころ

evalはあらゆる言語で悪者だ。
パフォーマンスを下げてしまうし危険を伴うと紹介されることがおおい。
これに関しておおむね同意した上でもなお、evalを利用することが適切な場面が存在する。

これは皮肉なことにむしろパフォーマンスの分野で。

Webクライアントの技術において、パフォーマンスとはユーザエクスペリエンスのために存在する。つまりユーザがある動作(クリックなど)を行ってから何らかのアクションが発生するまでの時間を最適化したいというニーズが最も多い。

なので、

JAVASCRIPT:
  1. element.onclick = function(){
  2.   for(var i=0,length=BIG_ARRAY.length;i<length;i++){
  3.    //複雑な条件や分岐により重くなる処理
  4.   }
  5. }

のようなプログラムがあったときに

JAVASCRIPT:
  1. dom.ready(function(){
  2.     try{
  3.         window.onclick = new Function([
  4.             '複雑な条件、分岐処理で確定しているものを取り除いたtext'
  5.         ].join(''))
  6.     }catch(e){}
  7. });

のようにしておくことで、DOM構築完了後からimageロードまでの比較的余裕のある時間でスマートな関数を構築しておくことができる。

こういったテクニックは邪道ではあるが、effects.jsなどでも用いられている高速化テクニックの1つであって、JavaScriptというインタラクションのために用いられる言語では重要な要素になりうる。

あくまでもミッションクリティカルな場所でのみ使われるべきではあるが、Templateエンジンなどを実装するためにはevalという邪悪な手段が最適最良のスマートな方法になる。

function文とfunction式

function文とfunction式の違いは、Activationオブジェクトの生成タイミングを理解しておけば間違えることは少ないだろうが、解釈の違いにより問題が起こることは確かにある。

JAVASCRIPT:
  1. //function 文
  2. function hoge(){
  3.     [sample code];
  4. }
  5. //function 式
  6. var hoge = function(){
  7.     [sample code]
  8. }

これらは同値であると説明される場合が多いが以下のようなケースで違いが発生する。

JAVASCRIPT:
  1. (function(){
  2.     var x = 0;
  3.     console.log(hoge);// function hoge(){}
  4.     function hoge(){}
  5. })();
  6.  
  7. (function(){
  8.     var x = 0;
  9.     console.log(hoge);//undefined
  10.     var hoge=function(){}
  11. })();

function文は自動的にスコープの先頭に移動して解釈されるが、function式は解釈されない。

これ自体は小さな問題に見えるが、さらにif文内でのfunction文の巻き取りはjsの実装によって異なりポータビリティを損なうというのが本書の指摘するところだ。

たしかにこれらはポータビリティや保守性を下げる場合がおおい。
しかし、function文がデバッグ性にプラスの要素を与える場合が実はある。

JAVASCRIPT:
  1. Handler = {
  2.     func : (function(){
  3.         function xxx(){}
  4.         return xxx;
  5.     })()
  6. }
  7. console.log(Handler.func); // xxx
  8.  
  9. Handler = {
  10.     func : (function(){
  11.         var xxx = function(){}
  12.         return xxx;
  13.     })()
  14. }
  15. console.log(Handler.func); // function

function文によって作られた関数は処理系内部において"公式な名前"を得ることができる。
公式な名前がある関数は、それが他の関数ではなくて自分自身であることを証明することができる。

この仕様を正式なものとしてなにかプログラムを書くことを推奨はしないが、
この要素が煩雑なプログラムの中で問題箇所を適切に見つけることのできる一因になることがあるということは覚えておいて損はないだろう。

functionは式であれ、文であれこの"公式な名前"をつけられるという性質を知っていると
プロファイル等で

JAVASCRIPT:
  1. $('test').observe('click',function (){
  2.     // 公式な名前の無い関数
  3. });
  4.  
  5. $('test').observe('click',function _anon(){
  6.     // 公式な名前のある関数
  7. });

複数の無名関数の中から、問題の箇所をわずかな変更ですぐに知ることができるかもしれない。
これらはfunction文ではなく、function式であるのでスコープのオブジェクトを汚染することはない。

JAVASCRIPT:
  1. $('button').observe('click',function _anon2(){
  2.     $w('first last').each(function _anon(e){
  3.         //
  4.     });
  5.     console.log(_anon); //is not defined
  6. });
  7. console.log(_anon2); //is not defined

公式に運用するscript中では無用なものではあるかもしれないが、こういった性質によって見えてくる世界もある。

そんなわけでまとめ

・JavaScript Good Partsは仕事でJavaScriptを書くすべてのエンジニアが必読の書である。
・読んだ後、汚いもの/悪いものがどのように使われるべきか考えてみよう
・きれいな世界と汚い世界を分けることでJavaScriptはもっと輝きを増す。

]]>
http://yabooo.org/archives/201/feed 0
【告知】日本野望の会 忘年会 2008 http://yabooo.org/archives/194 http://yabooo.org/archives/194#comments Mon, 08 Dec 2008 12:19:18 +0000 http://www.yabooo.org/archives/194 名称未設定-1.jpg

2008年の野望会は新年会にはじまり、忘年会に終わる…
野望会おなじみの居酒屋ライトニングトーク、全員自己紹介、
今回もやります。奮ってご参加ください。

実施要綱

  • 日時 2008/12/20(土)18:00~20:00
  • 場所 渋谷 素材屋 宮益坂店 http://r.gnavi.co.jp/g084612/
  • 会費 4,500円
  • 定員 20名

LTについて

  • 制限時間 1人5分
  • テーマ  2008年わたしの野望(技術ねたでもそうでなくても)
  • LT登壇希望の方はコメント欄にその旨ご記入ください。
  • PCは主催側でも用意します。

参加表明はこちらからお願いします。
http://atnd.org/events/218

]]>
http://yabooo.org/archives/194/feed 0
SBM研究会発表資料を公開します http://yabooo.org/archives/189 http://yabooo.org/archives/189#comments Fri, 05 Dec 2008 17:01:54 +0000 http://www.yabooo.org/?p=189 普通のやつらのメタを行け

パワポです。すこし長いので、はしょりながらやります。

普通に前半のほとんどはフロントエンドの技術を理解している人なら当たり前すぎる内容ですが、
研究会が比較的バックエンドよりなので、こういう話もやってもいいかなと。

あ、

野望イベント近日公開です。

興味のある方はぜひこちらのブログをチェックしてください。

slideshare --

]]>
http://yabooo.org/archives/189/feed 1
Safari/Webkitのおせっかいキャッシュとその対策。 http://yabooo.org/archives/180 http://yabooo.org/archives/180#comments Sat, 29 Nov 2008 06:40:19 +0000 http://www.yabooo.org/?p=180 どうもひろきのだいちです。

最近のモダンなブラウザには、Backfowardキャッシュと呼ばれるブラウザの戻るボタンを押した際に利用されるキャッシュ機構が用意されています。この機構は普段ウェブブラウジングを行う際には間違った操作からの復帰が早く非常に重宝するのですが、一部のWebアプリケーション設計の際にはこの仕組みが厄介に働くことがあります。


そういったケースでよく使用されるテクニックとしてはwindow unloadイベントへのハンドリングで、このページはすでに終端処理を済ませていますよ、ということを通知することで再度インラインjsや、onload後の処理を行うことができます。

JAVASCRIPT:
  1. window.onload=function(){alert('test');}

だけではページ遷移後、戻るを押してもloadEventは発火されません。

しかし、

JAVASCRIPT:
  1. window.onload=function(){alert('test');}
  2. window.onunload=function(){};

とすることで、「戻る」のあとにもonloadイベントは発火されるようになります。

これである程度の問題は解決するはずが、Safariなどの場合、このunloadを付与した場合のForm要素系のタグ、つまりinput,select,option,textareaなどの動作がおかしくなります。

input追加をクリックするたびに、innerHTMLをつかってinputタグが生成されるというケースを考えて見ましょう。

このときに、inputタグのvalueにユーザ入力によって値を設定します。

削除を押すと、inputタグがinnerHTML=""によってクリアされます。

さらに2つほどinputタグを生成して、再びユーザ入力によって値を設定します。

この後、何らかのリンクをたどって「戻る」という状態にすると、unloadが設定されているので、onloadEventが発火し一番最初の状態に戻ります。なので、Backforwardキャッシュ機構は停止されて、まったく最初と同じ状態になっているはずです。ところが、ふたたびinput追加をクリックしてinput要素を追加すると以下のように、いままでのユーザ入力のデータが保存された状態で現れてしまいます。

ちなみにinputタグはname属性やid属性もふられておらず、ただ同じような位置に存在するということだけでそのvalueがキャッシュされてしまっているようなのです。

これではJemplate/EJS/HTMLTemplate.jsなどのテンプレートモジュールを利用してElementの値を再構築するようなアプリケーションやinput hiddenなどで値をサーバサイドから提供するアプリケーションに深刻な不具合をもたらしてしまいます。

これはappendChildのみですべてのUIを実装するというかなりおそろしいやり方をするというのは、中規模以上のアプリケーションではかなり問題になります。ちなみにcreateContextualFragmentを用いてstringからHTML要素を生成する場合でもどうようにこのようなバグが発生します。

では、その対策にはどのような方法があるでしょうか。

まずぱっと思いつくのはそのノード自体をガベコレの対象とするためにremoveChildするような方法です。

JAVASCRIPT:
  1. window.onload=function(){
  2.   // inputタグすべてにたいして
  3.   e.parent.removeChild(e);
  4. }

ところが、このおせっかいキャッシュ機構のいやらしいところは、Elementがremoveされたとしてもvalueの汚染が続くということです。なので、Elementのremoveは効果がありません。

さらに、innerHTML=""などでclearされたElementはjavascript領域からは消えてしまうので取得することができないというやっかいさも抱えています。

このバグ(といっても差し支えないだろう)的なキャッシュ機構に対応するためには、そのページで生成されては消えていったすべてのinput系タグを、"戻る"後に生成されるElementとは異なるものであることをレンダリングエンジンに教えてあげなければいけません。

なので

JAVASCRIPT:
  1. window.onload=function(){
  2.   // inputタグすべてにたいして
  3.   e.name = (new Date).getTime();
  4. }

のようにname属性を二度と参照されない値に変更することで、valueを汚染されることを防ぎます。

さらに、そのページで生成されては消えていったすべてのinput系タグを取得する方法として以下のような戦略をとります。

DOM Event Level2のMutation Eventの中でSafariで利用可能なDOMNodeInsertedを利用して、DOMに変化が生じるたびに"まだマークされていない"すべてのinputエレメントを取得し、キャッシュに保存しておきます。

最後にキャッシュされたすべてのエレメントのname属性を変更することで、このようなバグから開放されることとなります。

以下、これらをPrototype.js 1.60をベースに実装したものを晒しておきます。
ただ、これにも一部既知のバグが存在していて、innerHTML+=で発生するバグや途中でidやname属性を動的に変更されたElementなどをフォローすることができないのです。

しかし、いずれもjavascript的にはマナーの悪いこととされているのでコーディングルールなどでこれらのバグを避けるようにすることが得策かもしれません。

JAVASCRIPT:
  1. if (Prototype.Browser.WebKit)(function() {
  2.   Event._observe = Event.observe;
  3.   function _search(hash, searchText) {
  4.     if (hash[searchText]) {
  5.       return (Object.isFunction(hash[searchText])) ? hash[searchText] : Prototype.emptyFunction;
  6.     } else {
  7.       return (Object.isFunction(hash['_default'])) ? hash['_default'] : Prototype.emptyFunction;
  8.     }
  9.   }
  10.   var firstUnload = true;
  11.   Event.observe = function(element, name, func) {
  12.     return _search({
  13.       'beforeunload': function() {
  14.         return element.addEventListener('beforeunload',
  15.         function(evt) {
  16.           return func.bind(element)(evt);
  17.         });
  18.       },
  19.       'unload': function() {
  20.         if (firstUnload) Event._observe(window, 'unload', (function() {
  21.           var cache = {};
  22.           var selector = $w('input option select textarea').join(':not(._marked),') + ':not(.marked)';
  23.           function storeCache() {
  24.             $$(selector).each(function(e) {
  25.               cache[e.identify()] = e;
  26.               e.addClassName('_marked');
  27.             });
  28.           }
  29.           Event._observe(document.body, 'DOMNodeInserted', storeCache);
  30.           Event._observe(window, 'load', storeCache);
  31.           return function() {
  32.             var time = (new Date).getTime();
  33.             alert(Object.toJSON($H(cache).keys()));
  34.             $H(cache).each(function(e, i) {
  35.               e.value.name = time + "_" + i;
  36.             });
  37.           };
  38.         })());
  39.         firstUnload = false;
  40.         return Event._observe(element, name, func);
  41.       },
  42.       '_default': function() {
  43.         return Event._observe(element, name, func);
  44.       }
  45.     },
  46.     name)();
  47.   }
  48.   Object.extend(window, {
  49.     observe: Event.observe.methodize()
  50.   });
  51. })();

]]>
http://yabooo.org/archives/180/feed 2
新はてぶにフィッシング詐欺の危険性あり! http://yabooo.org/archives/170 http://yabooo.org/archives/170#comments Tue, 25 Nov 2008 05:42:25 +0000 http://www.yabooo.org/?p=170 どうも、ひろきのだいちです。
ソーシャルブックマーク研究会で講演をいたしますので、
ぜひいらしてください。

この記事の内容ははてなおよびJPCERT/CCに連絡いたします。
今しばらくお待ちください。

こういった危険性などについても
12/6 の講演で詳細を発表いたしますのでぜひおたのしみに。

]]>
http://yabooo.org/archives/170/feed 1
YAMLってたべれるの? http://yabooo.org/archives/163 http://yabooo.org/archives/163#comments Thu, 13 Nov 2008 14:12:10 +0000 http://www.yabooo.org/?p=163 おひさしぶりです。へたれのこみや(pinkmac)です。
YAMLとは何かを今更知ったので、覚え書きしておきます。
折角なので他のデータ形式もいっしょに見直してみることにしました。

サンプルデータ on XML

XML:
  1. <zgundam>
  2.     <organization name="エゥーゴ">
  3.         <person>
  4.             <name>カミーユ・ビダン</name>
  5.             <ms>Zガンダム</ms>
  6.         </person>
  7.         <person>
  8.             <name>クワトロ・バジーナ</name>
  9.             <ms>百式</ms>
  10.         </person>
  11.     </organization>
  12.     <organization name="ティターンズ">
  13.         <person>
  14.             <name>パプテマス・シロッコ</name>
  15.             <ms>ジ・O</ms>
  16.         </person>
  17.         <person>
  18.             <name>レコア・ロンド</name>
  19.             <ms>パラス・アテネ</ms>
  20.         </person>
  21.     </organization>
  22.     <organization name="アクシズ">
  23.         <person>
  24.             <name>ハマーン・カーン</name>
  25.             <ms>キュベレイ</ms>
  26.         </person>
  27.     </organization>
  28. </zgundam>

思いっきり偏ったサンプルで恐縮ですが、、
このデータ構造を、YAML、ついでにJSONで書いてみたいと思います。

YAML

特徴

  • YAML Ain't Markup Language の名が顕すようにマークアップ言語ではない
  • スキーマやDTDの概念がない
  • 利用可能な言語: Java / JavaScript / Perl / PHP / Python / Ruby / XML/

基本的な記述法

  • インデントで階層構造を表現
  • インデントにはスペースのみ利用可能。タブは使用できません
  • 配列・ハッシュ・スカラーでデータを表現
  • 日本語の扱いに難あり?
  • 詳しくはYAMLの仕様をご参照あれ
RUBY:
  1. #Zガンダムの登場人物
  2. ##エゥーゴ
  3. aeug:
  4.   - kamille
  5.     name:Kamille Bidan
  6.     sex:men
  7.     ms:z-gundam
  8.   - quattro
  9.     name:Quattro Vageena
  10.     sex:men
  11.     ms:type-100
  12.  
  13. ##ティターンズ
  14. titans:
  15.   - scirocco
  16.     name:Paptimus Scirocco
  17.     sex:men
  18.     ms:THE-O
  19.   - sarah
  20.     name:Sarah Zabiarov
  21.     sex:women
  22.     ms:messala
  23.   - reccoa
  24.     name:Reccoa Londe
  25.     sex:women
  26.     ms:palace-athene
  27.  
  28. ##アクシズ
  29. axis:
  30.   - haman
  31.     name:Haman Karn
  32.     sex:women
  33.     ms:qubeley

インデントだけで記述するスタイルは非常にシンプルですね。

JSON

特徴

  • JavaScript Object Notation
  • YAMLの「フロースタイル」をさらにstrictにしたものがJSONにあたる (( …といって語弊はない…よね? ))  (( 前述した、インデントを用いた記述方法は「ブロックスタイル」 ))
  • オブジェクトの内容は必ず連想配列
JavaScript:
  1. {
  2.   "zgundam": {
  3.     "organization": [
  4.       {
  5.         "name": "エゥーゴ",
  6.         "person": [
  7.           {
  8.             "name": "カミーユ・ビダン",
  9.             "sex": "men",
  10.             "MS": "Zガンダム"
  11.           },
  12.           {
  13.             "name": "クワトロ・バジーナ",
  14.             "sex": "men",
  15.             "MS": "百式"
  16.           }
  17.         ]
  18.       },
  19.       {
  20.         "name": "ティターンズ",
  21.         "person": [
  22.           {
  23.             "name": "ジェリド・メサ",
  24.             "sex": "men",
  25.             "MS": "マラサイ"
  26.           },
  27.           {
  28.             "name": "パプテマス・シロッコ",
  29.             "sex": "men",
  30.             "MS": "ジ・O"
  31.           },
  32.           {
  33.             "name": "サラ・ザビアロフ ",
  34.             "sex": "women",
  35.             "MS": "ボリノーク・サマーン"
  36.           },
  37.           {
  38.             "name": "レコア・ロンド",
  39.             "sex": "women",
  40.             "MS": "パラス・アテネ"
  41.           }
  42.         ]
  43.       },
  44.       {
  45.         "name": "アクシズ",
  46.         "person": {
  47.           "name": "ハマーン・カーン",
  48.           "sex": "men",
  49.           "MS": "キュベレイ"
  50.         }
  51.       }
  52.     ]
  53.   }
  54. }

もはや大分アタマがこんがらがってきましたが…
次の機会には各種実装からこれらを使ってみたいと思います。

]]>
http://yabooo.org/archives/163/feed 0