Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

Archive for 01:15

Javascriptのforループのパフォーマンスのいい書き方

2010年02月22日

面白いかと思ったのでメモしときます。

普通の書き方

var rows = document.getElementsByTagName('tr');

for( var i = 0; i < rows.length; i++ ) {

   rows[i].className = 'newclass';

   rows[i].style.color = 'red';
  ...
}

効率のいい書き方

var rows = document.getElementsByTagName('tr');

for( var i = 0, row; row = rows[i]; i++ ) {

    row.className = 'newclass';

    row.style.color = 'red';
    ...
}

参考サイト:您的访问请求被拒绝 – ITeye技术社区

jsp内のコメントアウトはjsp式の記述で

2010年02月17日

基本

多分ほとんどの人は分かっていると思いますが、

jspファイル内のコメントの記述は以下になります。

<%-- JSPのコメント --%>

そしてHTMLのコメントの記述は

 <!-- HTMLのコメント -->

問題

SP内でもHTMLのコメント記述が使えますが、

コメントアウトした部分にJavaプログラムが埋め込んだ場合

そのコードは実はコンパイルされてしまいます。

例えば、

<!-- コメントアウト
<input type="text" value="<%= request.getNotExistMethod() %>" />
 -->

ここでは全く存在しないJavaのメソッドを書きました。

このままだとJSPがコンパイルエラーになります。

“The method getNotExistMethod() is undefined for the type HttpServletRequest”というメッセージです。

正しい方法

Javaプログラムが埋め込んだコードをコメントアウトするには

JSPのコメント式を記述します。

上記の例で言うとこうなります。

<%-- JSPコメントアウト
<input type="text" value="<%= request.getNotExistMethod() %>" />
--%>

補足

下記のようなコンパイルが通るJavaコードが書かれた場合は、

もちろんエラーは出ないし、 HTMLの部分もコメントアウトされたため画面には何も表示されません。

<!-- コメントアウト
<input type="text" value="<%= request.getContextPath() %>" />
-->

MagicMouseを買いました

2010年02月16日

マルチタッチがサポートされているマジックマウス、

ついに購入しました。

今のところはまだクリックとスクロールだけデフォルトで使えますが、

そのうちフルパワーを発揮したいと思います。


マルチタッチ以外でBluetoothが使えるのも私にとって大きなポイントです。

今はACアダブタ以外にMacに接続する線などがなくなり

整然とした感じです。

ちなみにクリーニングも大変便利になりそうです。

毛が立ってない布を使って表面を掃除できます。


あとはゲームでもマルチタッチが使えるなら最高。。。

以下写真を御覧下さい。

クロスサイトのリンクはいいか悪いか

2010年02月15日

Question

If I have 3 websites, Is there a problem to cross link websites?

Answer by Google Webmaster Central

要はサイト間の”関連性”が一番大事です。

関連性があればOKで、なければ無意味って感じです。

「海外SEO情報ブログ」からの訳文

サイト同士に何らかの関連性があるかが問題だね。

1つがドライクリーニングのサイト、もう1つが古美術のサイト、もう1つが携帯レビューのサイトだとしたら、ページの下にリンクがあるのは奇妙だ。

漫画のサイトを見ていたのに、ページの最後に行ったら自動車保険やコーヒーテーブルのサイトへのリンクが突然出てくるのは、何にも関係がない。

「どのくらい関連性があるのか」をまず先に考えてほしい。

3つのサイトで相互リンクしてもたいした数じゃないから、大きな問題にはならないと思う。

でも、30サイト、300サイトでクロスリンクしていたら、「何の関係があるんだろうか」と一般のユーザーも競合も不思議に思うだろう。

紳士洋服・婦人洋服・子供洋服がクロスリンクしあうのは、関連があるから完全に理由がある。

同じ企業傘下にある会社同士も、正当な理由があるから問題があるとは思えない。

少ない数だったらまだいいかもしれないけど、サイトの規模が大きくなるに連れてページの下に大量のリンクが出現するのは良くないね。

Javascript変数にブロックスコープはない

2010年02月12日

JavaをやってからJavascriptを触ったので、

Javascript変数にブロックレベルのスコープがないことにビックリしました。

if文ブロックか、forループブロックか関係なく、

function内に定義された変数は全て同じスコープ:functionのスコープになります。


例えば

function test(o) {

    var i = 0;                      // i is defined throughout function

    if (typeof o == "object") {

        var j = 0;                  // j is defined everywhere, not just block

        for(var k=0; k < 10; k++) { // k is defined everywhere, not just loop

            document.write(k);

        }

        document.write(k);          // k is still defined: prints 10

    }

    document.write(j);              // j is defined, but may not be initialized

}


変数kとjはそれぞれif文のブロック、forループのブロック内に定義されたが、

実はfunctionのスコープとなりfunction内ならどこでも参照できます。


これをしっかり理解しないと以下のようなミスが起こしやすいです。

var scope = "global";

function test( ) {

    alert(scope);         // Displays "undefined", not "global"

    var scope = "local";  // Variable initialized here, but defined everywhere

    alert(scope);         // Displays "local"
}

test( );


一番目のalertは”global”だと思ったらこの記事を読む価値はあるでしょう。

一番目のalertは”undefined”を表示します。

なぜならさっき言ったように変数のスコープはfunction内に跨るのです。

varで宣言する位置、順番と関係ありません。


ここではfunction内で同じ名前でscopeという変数が宣言され、

“global”の値を持つグローバル変数は上書きされました。

そして一番目のalert時のscopeは初期化されていないため、undefinedとなってしまいます。


上記のコードを書き換えると以下と同じです。

function test( ) {

    var scope;       // Local variable is declared at the start of the function

    alert(scope);    // It exists here, but still has "undefined" value

    scope = "local"; // Now we initialize it and give it a value

    alert(scope);    // And here it has a value

}

誤解を招かないように変数の宣言はfunctionの先頭に置くのが大事ですね。

Ruby オブジェクトのクラスを調べるには?

2010年02月03日

Rubyでは変数の型を宣言しないです。

そのため、オブジェクトは実際に何型かがわからない時が多いです。

オブジェクトのクラスを調べるには以下の三つの方法があります。

class

オブジェクトのクラスを調べられます。

返された結果はクラス名です。

例:

"文字列です。".class

出力結果:string

kind_of?

オブジェクトは特定のクラス又はそのサブクラスのインスタンスかどうかを調べられます。

モジュールに関しても、調べられます。

返された結果はtrue又はflaseです。

例:

"文字列です。".kind_of?(String)

出力結果:true

ちなみに、is_a?メソッドもあります。kind_of?の使い方と同じです。

instance_of?

オブジェクトは特定のクラスのインスタンスかどうかを調べられます。

kind_of?との区別は、サブクラスを含まらないことです。

つまり、kind_of?はサブクラスまで調べられますが、

instance_of?は特定のクラスだけ、サブクラスを調べられないです。

返された結果はtrue又はflaseです。

例:

"文字列です。".instance_of?(String)

出力結果:true