Mr.Border [要素を区切る要素の存在]

スクリプト言語を使うプログラマーの私的日常。
多くの事に慣れられない不器用な人間が書く駄文集。

消滅予告

2006-08-15 01:52:12 | Weblog
 一部の、本当に限られた人には事情を明かしましたが、このブログは消します。
 思えば、使い始めた一日目に嫌気がさして「利用しない」と宣言したgooブログですが、これに変わる物を自前で用意する時間も無く、また、他のブログサービスを利用して同じように落胆するような事を何度も繰り返すのも面倒だと思って、結局は使い続けていました。

 しかしこの度、多くの人には明かす事の出来ない理由により閉鎖の必要性が生じ、このブログに書かれていた全ての記事を抹消します。

 とは言え、終わり際に頑張ってアクセス数伸ばす作業をしたために、現在は一週間辺り300件以上の閲覧数が記録されています。
 閉鎖の理由は、記事に問題があったのではなくごく個人的な事が原因になっています。
 こんな、サービスも何もあった物じゃ無いブログに今まで通って頂いた方々に対し、突然「全記事の抹消」と言う事をする事は申し訳無いと思っています。

 利用出来る情報が書かれている記事は残し、他は消します。
 そして、閲覧者数が0になる日が来たら、完全に全てを消す事にします。



 たった三ヶ月程度でしたが、今までご利用下さった方々は有り難う御座いました。
 皆様の閲覧記録が僕の励みになった日も沢山ありました。
 またどこかで会う事があれば、生ぬるい視線で見守ってやって下さい。きっとどこでも僕は自分の思うままに書きたいプログラムを書いて、誰か他の人も使えるかもしれないと思ったらそれを公開します。

 さようなら。

STD_source["感激"]();

2006-08-13 06:58:15 | Weblog
 ぶっちゃけてしまうと、この記事がページの中から消えるまでしばらくこのブログは情報的価値が全く無いと思われても仕方がないと思われるような事を、書く。



























































































































































































感動した!!


 よそでやると明らかに迷惑なのは解ってるけど、どこかで叫ばなきゃ気が済まない状態だったので自分のブログを犠牲にする事を選択した。
 何でこんな事したのかは、こちら ([小説]→[賽の目狂詩曲])へ。


 いやぁ……何と言うか、読んでるともの凄く切なくさせられます。
 著者のどんべさんが書かれた作品は、どれもクォリティが高くて一気に読んでしまうのが惜しくて作品ごとに有る程度期間を空けてから読むように習慣つけているくらい、僕は気に入っている。

 信じられないくらいの品質の高さから、どんべさんの人間性がうかがえるようにも思えるんですが―――僕が思い悩んでいた事に対する「答え」がどの作品にも必ず在ると言うのがまた、何か凄い物を感じさせられる。

 僕は一時期、真剣に死ぬ事を考えていた。
 何やってもどれ一つとして上手くいかなくて、理想とする自分のイメージと現実の自分とのギャップに絶望していた。
 「足りない物が解っているなら、補えばいい」と思って行動しても、どれだけ簡単な仕事でも成功率100%が保証できない状態の僕が行動して生まれる結果は、完全に自信を失う事だった。

 前にもここで書いた事があるが、自分の体に備わっていて取り替えようの無い物が、信頼性が無いと判断した時、僕は現世に対する未練を失う。
 出来る事があるなら、やる。
 やって出来る事なら、いくらでも挑戦してやる。
 だけど、何をするにしても上手くできないこの体が僕の意志に忠実に従うただ一つの物体だと知ったら、全てが無になる。


 その頃の僕は友達の言葉に助けられて、出来ないと思い込んでいた仕事も数とレベルを最低の所まで減らしてとにかく自信を回復する事を考えてメンタルのリハビリに努めて復帰した。

 ただ、こうなる前にこの小説を読んでいたら、もう少し違っていたかもしれないなと、思った。
 僕にはそういう過去があるから、ことさらその小説に衝撃を受けたと言う事かもしれないし、僕のような過去を持たない人がこの小説を読んだら僕が見いだした要素は見つけないかもしれない。

 でも、それでも、やっぱりあれが良かったと声を大にして言いたい。
 僕が言いたい事のほとんどは、僕と同じ記憶を持たない人間―――つまり、僕以外の全ての人間には理解不能だろうけれど、一つくらいの事は簡単に伝えられる。



 どんべさんの小説を読んで、すっごく幸福な気分になれた読者がここに一人、います。
 こういう事をちゃんと表現するのは、生産者としての誠意です。
 分野が異なるけど、作品の品質を高めるために努力されている方は素で尊敬します。

 有り難う御座いましたー!!

一人二役

2006-08-10 20:43:17 | JavaScript
 これはあれだ。野球で例えるなら「ピッチャーやりながらキャッチャーもこなす」とか、阿呆な事だ。

 またもや自分の疑問に自分で回答。
 つーかこんな簡単な問題に誰かつっこんではくれないのかと少し凹む。


function xnm(){
  // xml node model Object

  var no = new Array();

  // [基本パラメータの準備]
  //xml editorだけじゃ無く、他のプログラムでも必ず
  //使用するプロパティだけを用意する。
  no.name   = '';
  no.text   = '';
  no.type   = 'text';
  no.show   = '1';
  no.enum_item = [
    'name' ,
    'text' ,
    'type' ,
    'show'
  ];

  // [メソッド準備]

  //指定したプロパティを削除する
  no.del   = function( name ){ xnm_1_Child_Delete( this , name ); }

  //jsonもどきの書式で情報を書き出す
  no.json_out = function(){ return xnm_json_out( this ); }

  return no;
}
function xnm_json_out( obj ){confirm(1);
  //メモリー内に記憶された多次元配列をテキスト化する

  var t3, key, key_txt, i, o, tmp, x;
  t3  = '';
  key = new Array();
  if( obj.name != undefined ){ key.push( 0 ); }
  x = [obj];

  while( key.length ){
    o   = xml_read( x , key );
    if( key.length > 1 ){
      key_txt = '[' + key.slice(1,key.length).join('][') + ']';
    }else{
      key_txt = '';
    }
    if( o == undefined ){
      if( key.length > 1 ){
        key.pop();
        key[ key.length-1 ]++;
        continue;
      }else{ break; }
    }
    if( o.name != undefined ){
      //名を持つオブジェクトの場合

      // xml node model objectをセットする。
      t3 += 'a<-key-> = new xnm();\\n'
              .replace(/<-key->/ , key_txt );
      // enum_itemにセットされている名前のプロパティだけ出力する
      for(i=0; i<o.enum_item.length ;i++){
        t3 += 'a<-key->[\\'<-name->\\'] = \\'<-v->\\';\\n'
                .replace(/<-key->/ , key_txt )
                .replace(/<-name->/, o.enum_item[i] )
                .replace(/<-v->/   , json_txtEsc( o[ o.enum_item[i] ] ) );
      }
      if( o[0] ){
        //長さのある配列の場合
        key.push( 0 );
      }else{
        //子要素を持たない配列の場合
        key[ key.length-1 ]++;
      }
      continue;
    }
    //無限ループ回避用。正常処理によるkey.pop()が行われなかった場合に
    //処理がここまで継続したらbreak;を行う。
    confirm(' error type data : break ');
    break;
  }
  return t3;
}


 コンストラクタ自体を配列型にする方法が無いかと色々悩んでたけど、よく考えたら配列型のオブジェクトに色々飾りをつけた後で返してやればいーんじゃん、と。
 これで、かなり難しい題材っぽい「lengthプロパティの管理」をしなくて良くなった。いやぁ楽だ!!

 まぁ……折角子要素を列挙するメソッドを二つ作ったのに、結局意味が無くなっちゃった辺りは少し残念だ。
 列挙するメソッドが、それ自体まで列挙してしまうのがなぁ……。
 とは言え、あらかじめ決められたプロパティ名だけはリストから自動的に抜く、なんて処理を追加するのは無粋だし、格好悪い……。大体、抜かないプロパティを決めておくぐらいなら抜くプロパティだけ指定しておく方が解りやすいし。そうなると列挙メソッド意味無いし。
 しかも列挙しない属性の「DontEnum」プロパティはビルトインオブジェクトの専用プロパティだそうで。ユーザー定義のオブジェクトorプロパティには適用不可なのだそうで。

 今日も二つか三つくらい賢くなった。

Arrayオブジェクトのlengthプロパティについて。

2006-08-10 20:10:10 | JavaScript
 xml editor用の独自オブジェクトを作っていて、思った。
 「Arrayオブジェクトのlengthプロパティって、どーなってんの?」と。

 配列に要素を追加する方法は幾つかある。
 僕が知ってる物を列記すると

 //配列作成時に、ついでに要素も入れてしまう(1)
 a = new Array('a','b','c');

 //配列作成時に、ついでに要素も入れてしまう(2)
 a = ['a','b','c'];

 //添え字をつけて、任意の要素番号に値を入れる(1)
 a[0] = 'a';

 //添え字をつけて、任意の要素番号に値を入れる(2)
 a['0'] = 'a';

 //関数を使う(1)
 a.push( 'a' );

 //関数を使う(2)
 a.unshift( 'a' );

 //関数を使う(1)
 a = a.slice(0,3);


 インスタンスの作成時に、lengthプロパティをいじるのは簡単だ。
 それからメソッドが実行された時にlengthプロパティに触るのだって簡単だ。

 だけど、添え字つけて代入されると実行されるメソッドが無い。
 けれどもArrayオブジェクトから作成したインスタンスに対して「添え字で代入」をするとlengthプロパティはちゃんと正しい値になる。

 lengthの値を吐かせる時に何かメソッドが動く訳でも無いし、もちろん代入の時にも動かない。表面上は。
 でもlengthプロパティの値の挙動を見てたら「絶対何かが裏で動いてる」としか思えない。

 どうなってる?どうなってるんだArrayオブジェクト?

xml editor のモデルオブジェクト (途中)

2006-08-09 20:22:33 | JavaScript

function json_txtEsc( txt ){
  if( txt != undefined ){
    txt += '';
    txt = txt.replace(/\\\\/g,'\\\\\\\\')
             .replace(/'/g,'\\\\\\'')
             .replace(/\\n\\r|\\r\\n|\\r|\\n/g,'\\\\n');
  }else{ txt += ''; }
  return txt;
}
function xnm(){
  // xml node model Object

  // [基本パラメータの準備]
  this.length = 0;      //←初期は配列オブジェクトだったので、名残。
  this.name   = '';     //xml editorだけじゃ無く、他のプログラムでも必ず
  this.text   = '';     //使用するプロパティだけを用意する。
  this.type   = 'text'; //例外的な物はインスタンスにしてから付加する事。
  this.show   = '1';

  // [メソッド準備]

  // プロパティ列挙
  this.cl    = function(){ return xnm_Child_List_Array_Make( this );         }

  //数字でアクセスできるプロパティを除いた、プロパティ列挙
  this.cl_nn = function(){ return xnm_Child_List_Array_Make__not_No( this ); }

  //指定したプロパティを削除する
  this.del   = function( name ){  xnm_1_Child_Delete( this , name );          }

  //Arrayオブジェクトっぽいメソッド達
  this.push  = function( item ){         xnm_push(  this , item );  }
  this.pop   = function(){        return xnm_pop(   this );         }
  this.shift = function(){        return xnm_shift( this );         }
}
function xnm_(){

}
function xnm_(){

}
function xnm_1_Child_Delete( obj , name ){
  //指定されたプロパティを削除する

  //名前が無い場合は終了
  if( name == undefined ){ return false; }

  if( !(name+'').match(/[^0-9]/) ){
    //指定されたプロパティの名前が数字だけで構成されてる場合
    for(var i=0; ((name-0)+i+1)<obj.length ;i++){
      obj[ ((name-0)+i) ] = obj[ ((name-0)+i+1) ];
      //confirm('['+((name-0)+i)+'] = ['+((name-0)+i+1)+']');
    }
    obj.length--;
    delete obj[ obj.length ];
  }else{
    //指定されたプロパティの名前が数字だけで構成されてない場合
    delete obj[ name ];
  }
}
function xnm_push( obj , item ){
  if( item != undefined ){
    obj[ obj.length ] = item;
    obj.length++;
  }
}
function xnm_pop( obj ){
  var item;
  if( obj.length ){
    //obj.length--;
    item = obj_copy(obj[ obj.length-1 ]);
    obj.del( obj.length-1 );
  }
  return item;
}
function xnm_shift( obj ){
  var item;
  if( obj.length ){
    //obj.length--;
    item = obj_copy(obj[ 0 ]);
    obj.del( 0 );
  }
  return item;
}
function xnm_Child_List_Array_Make( x ){
  //渡されたオブジェクトが持つプロパティの、
  //列挙できる物を配列(プロパティ名を並べた物)にして返す。
  var a , name;
  a = new Array();
  for( name in x ){ a.push(name); }
  return a.slice(0,a.length);
}
function xnm_Child_List_Array_Make__not_No( x ){
  //渡されたオブジェクトが持つプロパティの、
  //列挙できる物を配列(プロパティ名を並べた物)にして返す。
  //ただし、数字でアクセス出来るプロパティは含まない。
  var a , name ,obj;
  a   = new Array();
  obj = obj_copy( x );
  delete obj[0];
  for( name in x ){ a.push(name); }
  return a.slice(0,a.length);
}
function obj_copy( obj ){
  //「=」の代入演算子を使うと参照情報のコピーになってしまう物を
  //擬似的に複製する。
  //列挙できるプロパティだけコピーして出来上がるオブジェクトを返す。
  var a, name, sw, o;
  if( typeof(obj) == 'object' ){
    o  = new Object();
    for( name in obj ){
      o[ name ] = obj[ name ];
    }
  }else{
    o = obj;
  }
  return o;
}

  my_obj = new xnm();
  my_obj.push(12345);
  my_obj.push(12);
  my_obj.shift();
  confirm( '[l] '+my_obj[0] );


 こーんな感じで製作中。
 独自オブジェクトを作って、それに処理をまとめるやり方って言うのは「利便性無視の”俺ルール”を作り出して自己満足に浸るエゴイストの趣向」かもしれないと思ってた。
 けど、これは意外といい。

 参照の使い方が理解できたせいって言うのもあるけど、短縮した形で命令を出せるのが意外と便利な事に気づいた。

 ↑のソースでは「xnm」と言うコンストラクタを作ってる。
 そして、そのコンストラクタを使用してインスタンスが作成される時は、色んなプロパティやメソッドが自動的に準備されるようになってる。
 そんで、今まで多次元配列の要素を取り扱う時には大抵
「 var text = xml_read( xml , [0,1,0,0…] ); 」
 みたいな書き方をしていたのだが、これからは
「 var text = xml.read( [0,1,0,0…] ); 」
 ……で、良くなるようにするつもり。

 たった一つの問題としては、Arrayオブジェクトとか既存のオブジェクトが持つ機能をコピーしてきて簡単にメソッド追加、と言う事が出来ない点か。
 しかしまぁ、まだ読んでない(と言うかダウンロードすらしてない)けど、その点については「prototype.js」のソースを読めば簡単に解決するだろう。きっと。多分。