Yahoo! UI Library でお勉強 その弐

昨日に引き続き、Yahoo! UI LibraryJavaScriptコードを眺めて見た。まだ内容を追っていないが、文法的な部分は大分慣れてきた。気付いた点としては、

var foo = [];

これで配列宣言になる。「new Array();」とするのと同じかと思われる。
配列要素を削除するのに「delete」を使用する。コード例は以下のようになる。

foo[10] = "HelloWorld";
delete foo[10];

最近使っていなかったので忘れていたものとして

if (typeof foo == "string") {
}

で型による処理分岐が可能。「typeof」は変数の型を返してくれるが、配列は「object」となり文字列は「string」、数値は「number」となる。因みに、「new String()」で生成されたインスタンスは「object」となる。内部的に「””」と「new String()」で差があるようだが、どちらにも「toString()」といったObjectの持つメソッドは提供されている。今のところIEでしか試せていないので、ひょっとするとブラウザによって違う結果が出るかもしれない。
中身のロジックについても興味があるので、是非追ってみたいと思う。

Yahoo! UI Library でお勉強 その壱

Yahoo! USが公開したJavaScriptYahoo! UI Library)を見ていると知らない文法が結構ある。まだまだ勉強が必要そうだ。

var foo = {};

と書けば空のオブジェクトを生成することが出来る。応用で無名関数のreturnでオブジェクトを生成すると、以下のようになる。

var foo = function() {
return {
hello: function() { alert("HelloWorld") }
}
}();
foo.hello();    // HelloWorldと表示される

これでfooはhelloというメソッドが定義されたインスタンスになる。
他には

var foo = new Array();
var result = foo[10] || {};
alert( result );

知っていたら何てことないが、「 || {} 」というような表記が可能なことを知らなかった。上記のコードを実行するとfoo配列に10というインデックスが無いためundefinedとなりfalseと見なされ右辺が実行(つまり空オブジェクトが生成)される。「foo[10] = “HelloWorld”;」というコードが入っていれば、左辺が実行され「HelloWorld」と出力される。
あとはargumentsという変数。

function(a, b, c) {
alert( arguments.length );
}

関数の引数をarguments配列として使用可能でlengthによって引数の数を調べることもできる。
まだまだ色々な発見ができそうなので、しばらくはコードを追ってみたいと思う。

functionの中身

JavaScriptはブラウザがダウンロードしているので、コードを調べることは可能だが、ファイルから探して関数名を検索したりするのは面倒に思う。

<input type="button" value="foo" onclick="foo();">

上のように関数名は判るけど、どんな関数を呼んでいるか知りたいときは、いつもブラウザのアドレスバーに

javascript:alert(foo);

と入力してアラート表示する。仕事がIE中心なので他のブラウザは試していないが、IEのアラートはドラッグ出来ないのでコピーしたい場合などは、コピット!でコピーする。
私の周りにはURLにJavaScriptを書く人が少ないが、勝手に一般的な行為だと思っている。

丁寧語は難しい

はてなダイヤリーを始めた時に、丁寧語で書いてしまったので今まで同じ語調を守ってきたが、丁寧語は難しい。少しストレスに感じるようになったので丁寧語を止めることにした。原因は自分に丁寧語の語彙が少ない為だと思う。
あと、書くときに特に読み手を意識していないので違和感がある。「今日は晴れだと思う」だと独り言か誰かに発した言葉か不明な印象だが、「今日は晴れだと思います」は何故か相手を感じる。これは心の中で思考するときに丁寧語を使わないからだろうと思う。
私の場合、世間に広めようといった思想はなく思ったことをそのまま書いているので、丁寧語を使わない方がきっと自然なのだ。

新幹線で寝る

東京-大阪間で新幹線に乗ると必ず名古屋-京都くらいは寝ています。朝でも昼でも関係なく寝れるのは何故かと思うのですが、新幹線に乗っている状態の定義とはなんでしょうか。

  1. シートに座っている。
  2. 揺れている。
  3. 車窓が流れている。
  4. 走行音がある。

どれが要因かは不明ですが、こういう睡眠ルームがあれば行くかもしれないですね。2時間くらい休憩したいとか、仮眠を取りたいという時には凄く効果がありそうな気がします。
疲れがとれるかどうかは別問題ですが。

最高責任者

最近は日本でもCEOやCTOという使い方をよくします。Wikipediaで見ていると他にもいろいろありましたので、メモ書きしておきます。

英語 日本語
CEO Chief Executive Officer 最高経営責任者
COO Chief Operating Officer 最高執行責任者
CFO Chief Financial Officer 最高財務責任者
CTO Chief Technical Officer 最高技術責任者
CKO Chief Knowledge Officer 最高知識責任者
CIO Chief Information Officer 最高情報責任者

略称のアルファベットが重ならずに表現できているのが素晴らしい。いや、CIO以外は文字数まで完璧です。

どちらでもいいけれど

プログラムは同じ処理を複数の書き方が出来るのが普通です。同じ結果なら特に気にすることはないのですが、どういう書き方をするのか拘ってしまうことがあります。

int i = 0;
i++;
i = i + 1;
i += 1;

三つとも同じ結果で恐らくパフォーマンスも変わらないと思いますが、私はインクリメント演算子がある場合はそちらを優先して使う傾向にあります。

boolean b = true;
String s;
if (b) {
s = "A";
} else {
s = "B";
}
(b) ? s = "A" : s = "B";

上のような、そのままのifブロックか三項演算子を使うかも良く迷います。

for (;;) {
}
while (true) {
}

無限ループはwhileの方が好きです。
こんなことで悩まず、コード書き進めた方がきっと生産性は良くなると思いながら、考えてしまいます。

条件演算子とビット演算子

条件演算子とビット演算子の違いは、プログラミング言語の最初に出てくる項目のため、機能を丸暗記してしまって理解しないままの場合が多いと思います。
私もWebの開発で「&」や「|」を利用する機会がないので、曖昧なままです。二つの演算子の説明で一般的な論を知りませんが、私が教わったのは以下のようなものです。まず、次の二つのコードがあるとします。

int a = 50;
if (a > 0 & a < 100) {
System.out.println("true");
}
int a = 50;
if (a > 0 && a < 100) {
System.out.println("true");
}

この場合では、どちらもif文の真偽値はtrueなのでifブロックが実行されます。この違いの説明としては、「&」の場合はまず左を判定した後に必ず右も判定するが、「&&」の場合は左がfalseの場合は右を判定する必要がないので、その時点で結果をfalseと判定してifブロックを実行しない、というものです。
その通りですが、この説明はあまり意味のない説明だと思います。少なくとも私はこの説明の為にいつまでたっても「&」の現実味が沸きません。
その理由は、上記のような例では常に「&&」と書けば解決するので、「&」の存在価値が解らないからです。そもそもif文で例を出すのが良くないのかとも思います。
私の認識ではビット演算子は計算です。ビット演算の計算は縦でイメージすると解り易いのですが、1バイトのデータ同士を「&」で計算すると

10101010
10000010

迷惑メールフィルタの効果は大

先日、携帯電話の迷惑メールフィルタの設定を厳しくしました。AUのフィルタで携帯からのメール以外を受信しないようにすると、1通も来なくなりました。
予想通りというか、当たり前の結果なのですが、携帯同士のメールしか許可しないことが常識になると、携帯での迷惑メールは消えるのでしょうか。
スパムはいつでも存在するので、誰かの携帯を踏み台にするとか、メールヘッダや送信ホストを今より高度に偽装するとか(よくわかりませんが)結局なくならないものかもしれません。
だから、結局、迷惑メールの効果があることが問題なのでしょう。誰も内容に反応しなければそれだけのことだと思います。ワンクリック詐欺オレオレ詐欺も、効果があるからなくならないのだと思います。
しかし、これは「殺人兵器だらけでも誰も人殺しをしなければ問題がない」と言っているようなものなので、現実的には手段を制限することが手っ取り早いとも思えます。
出来ないようにするか、しないようにするか、どちらが人間にとって許容しやすいのでしょうか。

getElemtnByIdで楽しくなる

以前はJavaScriptが好きではありませんでした。覚えたての頃は入力チェックを作って欲しいと言われて

if (document.fooForm.fooInput.value == "") {
alert("Fooが入力されていません。");
}

というようなものをフォームの項目数書いていたりしました。とても面倒だったと記憶していますし、今でも同じことを書けと言われるとうんざりすると思います。
JavaScriptが楽しくなったきっかけは、HTMLが全てエレメントとして参照されることを知ったときでした。つまり、HTML上に記述されたものはどこでも変化させることが可能ということに気づいた訳です。
タグ名でも取れますし、配列として取得してタグを子階層に進むことも出来ますが、IDで取得するのがお好みです。例えばフォームに

<input type="button" id="fooId" name="fooName" value="FOO">

というようにIDを付与しておくと、ボタンの表示テキストを変化させるには

document.getElementById("fooId").value = "HOGE";

また、使用できないようにするには

document.getElementById("fooId").disabled = "true";

というようになります。
動的にHTMLを追加したりも出来て

<div id="fooId"></div>

というような名前空間だけ作っておいて

document.getElementById("fooId").innerHTML = "<img src='./foo.gif'>";

とすれば画像を挿入できます。直接タグを記述せずにJavaScript上で生成することもできて

var imgElement = document.createElement("img");
imgElement.setAttribute("src","./img.gif");
document.getElementById("fooId").appendChild(imgElement);

というようになります。
今時風にprototype.jsを使用するなら、getElementByIdのショートカットとして$()があるので

$("fooId").innerHTML = "FOO";

というように簡単に参照できます。
知っている人には当然すぎる内容ですが、結構無理したJavaScriptのコードはよく見るので、知っている人と知らない人の差が激しく出る言語だなと思います。
話のつながりはありませんが、キャンペーンには参加しておくということで。
近藤本と梅田本欲しい!