2009年8月17日月曜日

NodeListとHTMLCollection

HTMLDocumentには、document.imagesとかdocument.formsとか、DOM Treeからある要素のみを返すアクセッサがあります。

それとは別に DOM Coreには getElementsByTagName() というメソッドがあります。

これらは同じものだと勘違いしていたのですが、document.xxx はHTMLCollection, getElementsByTagName() は NodeListを返します。


で、HTMLCollection は NodeListを継承しているわけではないのです。

ま、HTMLCollection は NodeListと同じ属性とメソッドを持っているので、JavaScriptから見れば同じとみなしていいのかもしれませんが、どうも違和感が。。。

2009年8月16日日曜日

モジュール性



ちょっと調べたいことがあって
メイヤーの『オブジェクト指向入門』を読んでいたら、モジュール性の5つの基準が書いてあった。
以下抜粋。
  • 分解しやすさ
  • 組み合わせやすさ
  • わかりやすさ
  • 連続性
  • 保護性

お、こんなの知らなかったぞ(汗

で、分解しやすさの説明に(抜粋)
  • 依存関係は最小限に抑えなければならない。そうしなければ、個々のサブシステムの開発がほかのサブシステムの作業の進み具合によって限定される可能性がある。

うぅ、なんだか耳が痛い話。

ほかにも再利用性とか、いろいろためになる&&できていないはなしがちらほら。

分厚い本なので、調べモン程度にしか使わなかったけど、こりゃ一回通読しておいたほうがよさそうだな。

2009年8月15日土曜日

event handler content attributes

onXXXといったイベントハンドラを書ける属性がありますが、

HTML4.01のときは、この属性がかける要素が決まっていました。
HTML4.01のIntrinsic events
これが、HTML5だと、Global attributesとして定義されているので、すべての要素に書けます。

ということは、そのイベントハンドラが呼ばれるかどうかは、その要素にイベントを発火させられるかどうかということになります。

だから、「この要素にこのイベントハンドラを書けるのか」という質問されると、「この要素はフォーカスが当たるからonfocus/onblurが書ける」とか、そういった説明をしなければいけません。
これが、HTML5の要素はかなりあるので、意外と面倒くさいです。

ちなみに、実はHTML4.01では<img>要素にonload属性は書けませんでした。
(書いてあるコンテンツは結構あるみたいですが。)

でも、HTML5では、どの要素にもonload属性が書けるようになったので、リソースをロードする<img>要素ではloadイベントが発火するので、onloadイベントハンドラは呼ばれるのは正しい仕様です。

<img>要素の例を考えると、HTML5の考え方のほうが自然なのかもしれませんね。

2009年8月3日月曜日

はじめてのObjective-C

意味はないけどムシャクシャするので、
Objective-Cでコードを書いてみた。
いや、別にムシャクシャはしていないけど。

ということで、helloWorldを。

hello.m
#import 
#import 

@interface TestClass : Object
  - (void) getMessage;
@end
hello.m

#import "hello.h"

@implementation TestClass
  - (void) getMessage {
  printf("Hello Objective-C World\n");
}
@end

int main(int argc, char *argv[])
{
  id obj = [ TestClass alloc ];
  [ obj getMessage ];

  return 0;
}

Ojbective-Cは @interface で、クラスの定義を行い、@implementationでクラスの実装を行う。

サンプルでは、- (void) getMessage;というメソッドを@interfaceで定義し、@implementationで実装している。 "-"はインスタンスメソッドと言う意味。

一応C言語なので、Cの標準ライブラリをimportすれば使用できる。

で、メソッドの呼び出しは[]で行う。

Objective-Cはsamlltalkと同じメッセージ形式なので、[obj getMessage]は、objに対してgetMessageというメッセージを送信しています。
allocはNewと同じ。

Linuxでのコンパイルは
$gcc -v -Wall -Os -o hello  hello.m -lobjc
とする。-lobjcというのが必要なんですな。

しかし、Objective-Cとかいっても、これじゃどう見てもC言語には見えませんな。

2009年7月24日金曜日

rubyとCの可変長引数

rubyに可変長引数が書けることを知らなかったので、覚書。

*を使えば可変長引数を配列として受け取れるようだ。

引数の1つ前に*を入れれば、その位置の引数を配列として受け取れる。

def max(first, *rest)
  max = first
  rest.each {|x| max = x if x > max }
  max
end
と書いて、

max(1,2,3)

と書けば、firstが1, restが[2,3]になるようだ。

ちなみに、C言語での可変長引数は以下のようになる。

以下は第1引数で渡す数字の個数を、残りの引数をデバッグプリントとする関数です。

#include 
#include   /* 可変長引数に必要な変数 */

void foo(int i, ...)
{
  int j;
  va_list ap;

  va_start(ap, i);  /* ポインタ引数apを引数iの次の位置に持っていく */
  for (j = 0; j < i; j++) {
    printf("%d\n", va_arg(ap, int));  /* 型を指定してapから、値をとりだす*/
  }
  va_end(ap);
}

int main(void)
{
  foo(3, 1, 2, 3);
  return 0;
}
でも可変長引数って基本使いませんよね。
だから忘れちゃうんですよね;

2009年7月23日木曜日

1日1ハック

最近全然更新していませんでしたm(_ _)m


さいきんちょっと仕事で疲れてプライベートでコードを書いていませんでした。


Rubyのまつもとゆきひろさんは1日1ハックを必ず行うと

前に聞きに行った講演会で言ってましたが、
これを守るのはかなり大変だなと実感しています。

でも、どんなに疲れていても自分の技術は磨いていかないと、
衰えていく一方なので、今日から頑張ろうと思います!!

2009年5月19日火曜日

開発プロセス

今あるプロジェクトで後悔していることが一つ。
  • きちんと疎結合になるように設計すること
  • テスト容易性を考えること

を徹底するようにもっと強く言うべきだった。。。。
若手の私は、どうしても強く言われると議論に負けてしまう。。。


もちろん、書籍で読んだ知識は理想論で、
経験を多くすることにより、現実的なところの落とし所を見つけられるようになると思うんだけど、
なんだか、開発プロセスとかを武器にして、自分の都合がいいように理論武装をしている人が
多いような気がする。。。

もっと勉強せねば!

もっと強くならねば!