第133回 JavaScriptだけ学んでいても動的なページを作れるようになれない DOMが必要だ
私は動的なページを作ってみたいと思いJavaScriptを学び始めた。
今までこうとしか書けないと思っていたモノが、
他の言語では別の方法で書け、
その表現のおかけでパワフルなプログラミングができるといった話がかなり好きなので、
始めはJavaScriptの文法ばかりを勉強していた。
とくに、他の言語の経験者が面白い! ためになる! と思うのはこの本である。
- 作者: 天野仁史,舘野祐一,川崎有亮,arton,田中孝太郎,国分裕,山本有悟,海野裕也,nanto_vi
- 出版社/メーカー: インプレス
- 発売日: 2007/02/15
- メディア: 大型本
- 購入: 8人 クリック: 98回
- この商品を含むブログ (78件) を見る
といったことや、最近の動向がぎゅぎゅっとまとまっている。
そこで私は、やはりもっとみっちりと学びたいと思い
- 作者: シェリーパワーズ,Shelley Powers,武舎広幸,武舎るみ
- 出版社/メーカー: オライリージャパン
- 発売日: 2007/05
- メディア: 単行本
- 購入: 5人 クリック: 87回
- この商品を含むブログ (82件) を見る
HTMLのタグを扱う方法もきっちり説明されている。
だが、どうも思ったようにタグをいじれない。
思ったとおり取得できなかったり、思ったところに要素を挿入できなかったりする......
実は要素の取得・挿入といったことはDOMという仕様で定められており、
getElementById()などはその仕様に乗っ取って要素を操作するためのインタフェースに過ぎない。
多くの解説ページではこのJavaScriptとDOMの区別をあまり重用視しているようには感じられず、一緒くたにJavaScriptとして扱っているように思える。
そこで、私はJavaScriptよりもDOM関連・要素を動かす事に重心を置いている書籍はないものかと探してみた。
DOM Scripting 標準ガイドブック ~やさしく学ぶ、JavaScriptとDOMによるWebデザイン~ (Web Designing BOOKS)
- 作者: Jeremy Keith,中村享介,吉川典秀
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2007/06/21
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 97回
- この商品を含むブログ (31件) を見る
DOMを操作するときの注意点や、誰もが一度ははまるbodyタグの前にJavaScriptを書いてしまったがために存在しない要素にアクセスしようとしてバグってしまうことの説明とその解決方法がしめされていた。
この次に読むと面白いのが、
標準DOMスクリプティング JavaScript+DOMによるWebアプリデザインの基礎
- 作者: 羽田野太巳
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2007/01/16
- メディア: 単行本
- 購入: 8人 クリック: 98回
- この商品を含むブログ (31件) を見る
inputタグが持つメソッドはどのようなものであると決まっているか などの説明が載っており。
もう ワクテカが止まりません と言った状態である。
最後に、JavaScriptの文法で他言語出身者がはまりやすい部分などをついた
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (190件) を見る
ブロックレベルのスコープがないことを知らずにJavaScriptを書き出すといらぬところで
ハマってしまうので、ぜひ押さえておきたいところである。
thisはどのような場面で、なにが代入されているのかの説明もまとめられており、大変ためになりました。
第132回 わかりやすい・感動した を集めてみました
ラジオだと番組へのお便り的なものがありますが、そんな感じで
皆様からいただいた温かくありがたいコメントを紹介させていただきます。
- はてなブックマーク - 第5回 リファレンスと無名配列 - bingo_nakanishiの他言語出身者のためのPerl入門
- 2009-01-11
- はてなブックマーク - 第54回 ガベージコレクションについて - bingo_nakanishiの他言語出身者のためのPerl入門
- はてなブックマーク - 第56回 クロージャの実践的使いどころ - bingo_nakanishiの他言語出身者のためのPerl入門
- はてなブックマーク - 第87回 なかなか理解できないfindコマンドのmanを理解してみた - bingo_nakanishiの他言語出身者のためのPerl入門
- はてなブックマーク - 第96回 ペイントでドット絵を書く人はこうやってグリッドを出していたのか! - bingo_nakanishiの他言語出身者のためのPerl入門
- はてなブックマーク - 第97回 これだけは押さえておきたいエクセルの知識 前編 - bingo_nakanishiの他言語出身者のためのPerl入門
- はてなブックマーク - 第98回 これだけは押さえておきたいエクセルの知識 後編 - bingo_nakanishiの他言語出身者のためのPerl入門
- 2009-05-24 - 燈明日記
- livedoor クリップ
- livedoor クリップ
- Chrome Web Store
- http://archive.mag2.com/0000109251/20090308191632000.html
第131回 Perlを軸にプログラムを覚えていきたい人向け書籍
小さいながらもソースが書けるようになる
- 作者: ランダル・L.シュワルツ,トムフェニックス,Randal L. Schwartz,Tom Phoenix,近藤嘉雪
- 出版社/メーカー: オライリージャパン
- 発売日: 2003/05
- メディア: 単行本
- 購入: 15人 クリック: 474回
- この商品を含むブログ (273件) を見る
いきなりこれからプログラムに入るのは正直つらいところがある。
(だが、まずはここを通らずして次はないと言える)
まずはプログラムを知る
- 作者: 柴田望洋
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/08/30
- メディア: 単行本
- 購入: 17人 クリック: 184回
- この商品を含むブログ (42件) を見る
やはりC言語を押さえておくのは重要だろう。
この本でプログラムの基礎を押さえておきたいところ。
(本当はC言語は静的型付けであり、Perlは動的型付けであるので、
発想が全然違うということを理解できるのは、たぶん3年ぐらいは先の話)
プログラム言語だけやってても作れるようになれない
プログラムが動く環境も知っておかないと正直作るのはつらい。
図解でわかるLinuxのすべて―コマンド操作&パッケージ管理
- 作者: 西村めぐみ
- 出版社/メーカー: 日本実業出版社
- 発売日: 2000/06
- メディア: 単行本
- 購入: 1人 クリック: 38回
- この商品を含むブログ (20件) を見る
こうすればこうなるというHow to本とは違った理解ができる。
Windowsも知りたくなる
Linuxについて学んでいくとWindowsについても知りたくなるのがさがと言うものだ。
- 作者: 天野司
- 出版社/メーカー: 日経BP社
- 発売日: 2002/10/28
- メディア: 単行本(ソフトカバー)
- 購入: 9人 クリック: 51回
- この商品を含むブログ (46件) を見る
初学者には分量も多く内容が濃いかもしれないが、ぜひ読んでおきたいシリーズだ。
大きめのソースを書きたい
- 作者: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川英興,伊藤直也,田中慎司,株式会社ロングテール/長尾高弘
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2006/10/21
- メディア: 大型本
- 購入: 9人 クリック: 389回
- この商品を含むブログ (99件) を見る
大きめのソースが書きたくなると「続・初めてのPerl」は読まなければならなくなるだろう。
しかし、またこれが初学者には難しい。
かなりアクロバティックなこれってプログラマ上級向けなんじゃ.... と思えることが多く書かれている。
何回も読み返して理解したいところ。
「初めてのPerl」と「続・初めてPerl」の間くらいのレベルとして本ブログを書き始めてみました。
このあたりから、Perlの「すごさ」「真価」がわかってくる。
CPAN
PerlにCPANは欠かせない。
CPANに行けば、サンプルソースも載っており、モジュールの使い方もわかる。
でも、なんでこんな書き方してるんだろう?この書き方の意味ってなんだろう?
そういう場面に出くわす事が多いかもしれない。
そんなときはベストプラクティスだ。
- 作者: Damian Conway,クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2006/08/24
- メディア: 大型本
- 購入: 11人 クリック: 153回
- この商品を含むブログ (155件) を見る
あの書き方ってこういうことだったのか! これは便利!
が満載。
もっとやさしく詳しく知りたい
- 作者: 深沢千尋
- 出版社/メーカー: 技術評論社
- 発売日: 2008/06/20
- メディア: 大型本
- 購入: 12人 クリック: 195回
- この商品を含むブログ (34件) を見る
ダントツのわかりやすさで疑問が氷解していくだろう。
「続・初めてのPerl」より上のレベルの本でつまづいているなら、
この本を読んで理解し、次のステップへ行きたいところ。
エフェクティブ
Effective Perl (ASCII Addison Wesley Programming Series)
- 作者: ジョセフ・N.ホール,ランドル・L.シュワォーツ,Joseph N. Hall,Randal L. Schwartz,吉川邦夫
- 出版社/メーカー: アスキー
- 発売日: 1999/03/01
- メディア: 単行本
- 購入: 5人 クリック: 56回
- この商品を含むブログ (52件) を見る
Perlでもぜひ押さえておきたいところ。
「Effective Perl」は「Perlベストプラクティス」と同じような方面で書かれており、
この2冊は合わせて読みたいところである。
プログラミングPerl
- 作者: ラリーウォール,ジョンオーワント,トムクリスチャンセン,Larry Wall,Jon Orwant,Tom Christiansen,近藤嘉雪
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/09/01
- メディア: 単行本
- 購入: 8人 クリック: 245回
- この商品を含むブログ (125件) を見る
- 作者: ラリーウォール,ジョンオーワント,トムクリスチャンセン,Larry Wall,Jon Orwant,Tom Christiansen,近藤嘉雪
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/09
- メディア: 単行本
- 購入: 4人 クリック: 94回
- この商品を含むブログ (63件) を見る
JavaScriptが再注目され、「無名関数」「クロージャ」といったことに関心が高まっているが、
実は、この何年にも前に書かれている本にすでに、それらは登場している事を読み返してびっくりした。
第130回 Javaを始めるにあたって読んだ本
私はJavaは得意ではない。
だが、世の中にはやらなければならないということがあるのだ。
Javaの「仕組み」・「文法」
Java 謎+落とし穴 徹底解明 (標準プログラマーズライブラリ)
- 作者: 前橋和弥
- 出版社/メーカー: 技術評論社
- 発売日: 2001/12/01
- メディア: 大型本
- 購入: 8人 クリック: 40回
- この商品を含むブログ (21件) を見る
確かにポインターはないかもしれないが、
もう全部「参照」と言ってもいいくらいなのがJava。
というか「参照」がわかっていないとなにもできないということに気づかせてくれる本。
- 作者: パトリックニーメイヤー,ジョナサンナッセン,Patrick Niemeyer,Jonathan Knudsen,滝沢徹,鈴木憲子,牧野祐子
- 出版社/メーカー: オライリージャパン
- 発売日: 2003/03
- メディア: 単行本
- 購入: 3人 クリック: 11回
- この商品を含むブログ (11件) を見る
- 作者: Kathy Sierra,Bert Bates,トップスタジオ
- 出版社/メーカー: 日経BP社
- 発売日: 2006/06/29
- メディア: 大型本
- 購入: 8人 クリック: 191回
- この商品を含むブログ (23件) を見る
ただ、分量が多いので、
正直Java初学者には読むのに時間がかかりすぎた感も否めない。
徹底攻略 Javaアソシエイツ問題集[310-019]対応 (ITプロ/ITエンジニアのための徹底攻略)
- 作者: 株式会社CSKシステムズ,八木裕乃,明壁敦子,須澤秀人,ソキウス・ジャパン
- 出版社/メーカー: インプレス
- 発売日: 2006/02/02
- メディア: 大型本
- 購入: 4人 クリック: 31回
- この商品を含むブログ (13件) を見る
徹底攻略 Java2 プログラマ問題集 Platform5.0 対応 (ITプロ/ITエンジニアのための徹底攻略)
- 作者: 八木裕乃,明壁敦子,株式会社ソキウス・ジャパン,須澤秀人
- 出版社/メーカー: インプレス
- 発売日: 2006/11/24
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 98回
- この商品を含むブログ (25件) を見る
そして知識の定着ぶりはどうだろうか?
それを黒本で試した。
Javaの用語
- 作者: エクスメディア
- 出版社/メーカー: エクスメディア
- 発売日: 2003/08
- メディア: 単行本
- クリック: 2回
- この商品を含むブログ (5件) を見る
という場面によく出くわす。特に私がわからなかったのが
「コンテナ」という単語。
「入れ物」という意味合いはわかっていたが、
Java的にはなにが「入れ物」なのだろうか?
GUIプログラムを少し覗いてみると理解できるかもしれない。
Eclipse
Eclipse 実践開発入門 -Java・オープンソース開発・Eclipse3.2
- 作者: 河村嘉之/池正人/川尻剛/松前健太郎(日立ソフトウェアエンジニアリング株式会社)
- 出版社/メーカー: 技術評論社
- 発売日: 2007/05/14
- メディア: 大型本
- クリック: 10回
- この商品を含むブログ (9件) を見る
Eclipseの機能は「どんだけあんねん! てか、その設定ってどこからできんねん!」
と言いたくなるほどいっぱいある。この本で、ざっと機能を掴める。
Javaのオブジェクト指向
豆蔵セミナーライブオンテキスト(1) わかるオブジェクト指向
- 作者: 山田隆太
- 出版社/メーカー: 技術評論社
- 発売日: 2005/07/29
- メディア: 単行本
- 購入: 1人 クリック: 22回
- この商品を含むブログ (17件) を見る
すいすい習得 UMLモデリング (豆蔵セミナーライブオンテキスト (2))
- 作者: 岡村敦彦,株式会社豆蔵
- 出版社/メーカー: 技術評論社
- 発売日: 2006/04/11
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 11回
- この商品を含むブログ (15件) を見る
Java・オブジェクト指向の壁を突破する 抽象化プログラミング入門 (豆蔵セミナーライブオンテキスト 3)
- 作者: 岡村敦彦/山田隆太,A5
- 出版社/メーカー: 技術評論社
- 発売日: 2007/08/10
- メディア: 単行本(ソフトカバー)
- クリック: 26回
- この商品を含むブログ (10件) を見る
Perlでもオブジェクト指向。
Rubyもオブジェクト指向。
JavaScriptだってオブジェクト指向。
その中で、
オブジェクト指向って「こういうモノ!」と強く主張しているのがJava界隈のように感じる。
そんなJava界隈で通じるオブジェクト指向をこの3冊で学べる。
シーケンス図はこの本で理解できました。
クラスを作って、インスタンスを生成するJavaの世界にさあ行こう。
小話系
15歳からはじめるJAVAわくわくゲームプログラミング教室―Windows98/2000/Me/XP対応
- 作者: 大槻有一郎
- 出版社/メーカー: ラトルズ
- 発売日: 2005/03/01
- メディア: 単行本
- 購入: 3人 クリック: 40回
- この商品を含むブログ (13件) を見る
System.out の outが参照しているオブジェクトなどの小話が随所にあり面白かった。
コレクションフレームワーク
- 作者: 田中良浩,小山博史
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/03/01
- メディア: 単行本
- 購入: 2人 クリック: 22回
- この商品を含むブログ (10件) を見る
Javaの開発は困難を極めるかもしれない。
あと普通に開発でコレクションフレームワークは使われているので
わかってないと置いてきぼりをくらう。
しかし、Perlの配列とハッシュだけあればいいのではないか?
MapとPerlのハッシュってなにが違うんだ....などの思考が理解を邪魔し、
コレクションフレームワークは先輩の方や友人にもかなり教えていただきました。
JavaでのWEBアプリ
一番やさしいJSP & サーブレット入門塾 第2版 (DB Magazine SELECTION)
- 作者: 樋口研究室,山本隆之
- 出版社/メーカー: 翔泳社
- 発売日: 2008/03/19
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 18回
- この商品を含むブログ (3件) を見る
どういうモノをさすのだろうかと思い買ったもの。
JavaでWEBアプリを作るときのサーバ構成の基本はこのように構成する
といったようなことが学べた。
Webコンポーネントディベロッパ(SJC-WC) (SUN教科書)
- 作者: 米山学
- 出版社/メーカー: 翔泳社
- 発売日: 2006/07/11
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 31回
- この商品を含むブログ (19件) を見る
Javaではこの仕様に基づき作っていく事になる。
徹底攻略Webコンポーネントディベロッパ問題集―310-081対応 (ITプロ/ITエンジニアのための徹底攻略)
- 作者: ソキウス・ジャパン,岩崎正嗣,山本大,吉田豊,藤原久美子
- 出版社/メーカー: インプレス
- 発売日: 2007/04/01
- メディア: 単行本
- 購入: 3人 クリック: 29回
- この商品を含むブログ (16件) を見る
第129回 クロージャは作られたときの状態を保持するわけではなく参照する
第55回 クロージャ - bingo_nakanishiの他言語出身者のためのPerl入門
第56回 クロージャの実践的使いどころ - bingo_nakanishiの他言語出身者のためのPerl入門
第58回 クロージャをもっとていねいに - bingo_nakanishiの他言語出身者のためのPerl入門
私は今まで、「クロージャは作られたときの状態を保持する」という言い方をしてきたが、
これは厳密には間違いだったようだ。
状態を保持しているように見える例
use strict; sub h{ my $c = shift; sub { $c++ }; }; my $h = h(5); print $h->(), "\n"; print $h->(), "\n"; print $h->(), "\n";
結果:
5 6 7
この例だと、確かに作られたときの状態を持っており、その状態に変化を加えているように見える。
厳密に言うと「作られたときの変数を参照している」
しかし、次の例を見てみると、
use strict; sub h{ my $c = shift; my $fun = sub { $c++ }; # ここで作った $c = 10; # $cを変更 return $fun; # 作った関数を返すのはココ } my $h = h(5); print $h->(), "\n"; print $h->(), "\n"; print $h->(), "\n";
結果:
10 11 12
このように、$cは作られたときではなく、$c = 10;が実行されたものを見ている。
つまりこれは、関数が作れたときの状態を保持するのではなく、作られたところの外側の変数をただ参照していることを示している。
同じ変数をクロージャとして持つ関数を2つ返してみる
use strict; sub h{ my $c = shift; [ sub{ $c++; print $c, "\n" }, sub{ $c++; print $c, "\n" } ]; } my($fun1, $fun2) = @{h(5)}; $fun1->(); $fun1->(); $fun2->(); $fun1->();
結果:
6 7 8 9
このようにお互いに同じ変数をクロージャとして持つ場合は、
参照であるので、お互いの関数は同じ$cを更新している。
Rubyでも念のために見てみる
class Hoge def foo c = 1 [1,2,3].each do |i| c=c+1 # cを更新 puts c end puts puts c # cが更新されているのがわかる end end Hoge.new.foo
結果:
2 3 4 4
確かに外側のcが更新されている。
第128回 Rubyを使っている人は無意識のうちにクロージャを使っているかもしれない
eachなどに与えるブロックは高階関数と考えてよい
class Hoge def foo c = 10; [1,2,3].each{|i| puts c} end end Hoge.new.foo
結果:
10 10 10
each{ }の中にいるcは外側のcを見れている。
参考
まつもとゆきひろ コードの世界?スーパー・プログラマになる14の思考法
- 作者: まつもとゆきひろ,日経Linux
- 出版社/メーカー: 日経BP社
- 発売日: 2009/05/21
- メディア: 単行本
- 購入: 50人 クリック: 1,711回
- この商品を含むブログ (110件) を見る
第127回 Ruby vs Java ダックタイピングとインタフェースで見る多態性
前回は、Perlで書いたのだけど、
Rubyでも書いてみたので載せます。
動的型付け言語と静的型付け言語における多態性
オブジェクト指向では、多態性(ポリモーフィズム)という発想がでてくる。
この多態性を実現する方法を今回は2つ紹介する。
Rubyは動的型付け言語であり、ダックタイピングという手法で、多態性を実現できる。
対して、静的型付け言語であるJavaでは上位の型を作ることで多態性を実現できる(今回はインタフェースを用いてみた)。
ダックタイピング
Rubyでのタックタイピングを見てみよう。
human = Human.new dog = Dog.new duck = Duck.new human.touch(dog) human.touch(duck)
いま、このようにhumanがtouchすると、おのおのの動物が鳴くソースを書いてみる。
duck(アヒル)はhuman(人間)に触られると「ガーガー」と鳴き、
dog (犬)はhuman(人間)に触れると「ワンワン」と鳴くとする。
全体のソース:
class Dog def say puts 'ワンワン' end end class Duck def say puts 'ガーガー' end end class Human def touch(o) o.say end end human = Human.new dog = Dog.new duck = Duck.new human.touch(dog) human.touch(duck)
結果:
ガーガー ワンワン
これは何がすごいかというと、
class Human def touch(o) o.say end end
の o.sayのoがduckならDuckのsayが呼ばれ、 oがdogならばDogのsayが呼ばれているところである。
Javaは型を書かないといけない
Javaでは引数に受け取る型を書かないといけないので、DuckとDogを受け取ることができない。
Humanクラスのtouchメソッドに注目してほしい。
public class Human { public Human() { // ただのコンストラクタ } public void touch(Dog dog){ //型を決めないといけない dog.say(); } }
public class Duck { public Duck() { // ただのコンストラクタ } public void say() { System.out.println("ガーガー"); } }
public class Dog { public Dog() { // ただのコンストラクタ } public void say() { System.out.println("ワンワン"); } }
public class Main { /** * @param args */ public static void main(String[] args) { Human human = new Human(); Duck duck = new Duck(); Dog dog = new Dog(); human.touch(duck); human.touch(dog); } }
結果:
コンパイルエラー
インタフェース
そこで、JavaではDuckとDog以外にさらに上位の概念であるAnimalという型を作ってやる。今回はこれをインタフェースで実現する。
public interface Animal { public void say(); }
DuckとDogはこのAnimalを実装し、
Humanのtouchメソッドは、Animal型を受け取るように書き換える。
public class Human { public Human() { // ただのコンストラクタ } public void touch(Animal o){ //型を決めないといけない o.say(); } }
public class Duck implements Animal{ public Duck() { // ただのコンストラクタ } public void say() { System.out.println("ガーガー"); } }
public class Dog implements Animal{ public Dog() { // ただのコンストラクタ } public void say() { System.out.println("ワンワン"); } }
public class Main { /** * @param args */ public static void main(String[] args) { Human human = new Human(); Duck duck = new Duck(); Dog dog = new Dog(); human.touch(duck); human.touch(dog); } }
結果:
ガーガー ワンワン
このように、明示的に型を書かないといけない言語では、
さらに上位の型を作らなければ、柔軟なことをしにくい。