メニュー

関連ページリンク

トップ > コンピュータ > コンピュータ - 人気ブログ(Blog)検索結果詳細 (2009年1月7日 6時)

[日々の雑感とか]本を大量購入


さすがにまだ時差ボケがあって仕事以外はする気にならないので、今日は本屋巡りをしてきたっス。Eloquent JavaScript の超訳の続きをお待ちの皆さんスンマセン。


まずは、久しぶりにレジに並ぶ時にこっぱずかしい思いしたこの一冊。ある意味、エロ本買うくらいの緊張感(?)


うぇぶマスコットをつくろう!!for Ajax

うぇぶマスコットをつくろう!!for Ajax


でも、イロイロよくまとまってて分かりやすそうだったので思い切って購入。ってか、ヨドバシのゴールドポイント使った。どんどん機能をつけて規模を大きくしていく中で、少しずつ学んでいくネタを加えていく、って流れの作り方がスバラシイ! 参考にさせてもらいまっス。


そして横浜有隣堂で「マンガでわかる〜」シリーズを見てたら同じ棚に発見して思わず買ってしまったのがこの1冊。オレ、数学ネタ好きなんスよ。特に素数系。



素数ネタのカタログって感じで、あんまりそれぞれの項目について詳細に書かれているワケじゃないけど「これは良いまとめ」。ミュンヘンに戻る飛行機の中で読もうっと。


そして、今個人的に考えている動画レコメンドシステムの参考資料として購入した1冊がコチラ。


集合知プログラミング

集合知プログラミング


はてな界隈では既に知られた1冊っぽいし、説明は不要ですな。


ああ、そして数年ぶりに買ったコミックスがこちら。


数学ガール 上 (1) (MFコミックス フラッパーシリーズ)

数学ガール 上 (1) (MFコミックス フラッパーシリーズ)


原作を読んでるから「上手く漫画化されたなー」と思うけど、コミックだけ読んでミルカさんとボクの会話の中身を理解出来る人がいたら、それはそれでスゴイ人なんじゃ?と思ってしまった。まぁ、コミックスって性格上、数学はスパイスくらいの扱いにワザとしてるんだから良いのカモ、、だけど、もともと購入前に考えてた「難しいコトをマンガの力でスッと解説」って感じの作品ではなかった点は少しアテが外れたカモ。でも、そういう不純な動機(?)を除外して純粋に作品として見ると、十分に面白い。特に「やっぱノートの部分は手書きっしょ!」と思った。こういう分野(?)を開拓した結城浩さんは、やっぱスゴイなー。こういうのをきっかけにして勉強出来るような分野が増えれば「英語の世紀」なんて怖くないんじゃないの?とか思ったりする。


ああ、そして昨日購入したSICPの第2版。



amazonでは訳のクオリティについてあんまり評判良くないみたいだけど「他の人がドウ解釈したか?」ってのが紙で見れるダケでも、この手の本を独学で学んでいくにはかなり重要だと思うので迷わず買っておいた。冬期休暇中にじっくり読みたい。


うーん、しばらくは暇を持て余すコトもなさそうだ。。

作者:hamatsu1974

更新日:2008年11月27日 23時48分

このブログのホーム

[Eloquent JavaScript] JavaScript の基本を叩き込め:値、変数、制御フロー(後半) - Eloquent JavaScript

ちょっとブレイクをとり過ぎたな!


よし、ヤル気十分な顔してやがるな。うむ。熱意があるのは大事なことだ。しっかり最後までやり抜こうな。オレも正直、超訳がカッタルくてそのまま普通に訳しちまおうかと思う時もあるんだが、オマエらだけに努力を強いるのもアレだからな。最後までオモシロおかしいノリで行ってやるゼ。逃げるんじゃねーぞ!(<- 今日は"ごくせん"ノリらしい)


ファイトー、おー!


どうやら id:HolyGrail が見守りモードに入ってくれたみたいだし心強いな。今日も元ネタ提供者の Marijn Haverbeke さんに感謝しつつレッスンを進めるぞ。


さっそくレッスン開始


前回のレッスンでは"expression"って話が出てきたところで終わったんだったな。何がしかの値を生じさせるコードのコトを、"expression(式)"と呼ぶ。「22」だの"psychoanalysis(精神分析)"だのと直接記述するってのは全部"expression"。括弧の間にあるヤツもまた"expression"。そして、バイナリ演算子を2つの"expression"に適用するとか、単項演算子を1つの"expression"に適用する、なんてのもまた"expression"。

expression (式)ってのは何ぞや?って話を細かくやっていこうとすると、あとちょっと追加があるんだが、まぁそれは時期が来てから話すってコトにしとく。この手の話を詰め込みすぎると混乱するからな。


んじゃ、次は"expression"より大きい単位を見てみるか。"statement(文)"ってヤツなんだがな。プログラムってのは、この"statement"ってヤツがリストになって組み上げられてるもんなんだ。で、この"statement"の大部分は、セミコロン(;)で終わる形になってる。まずは最もシンプルなパターンのexpression(セミコロン付き)を見てみるか。

1;
!false;

見て分かるだろうが、コイツは無意味なプログラムだ。"expression"だったら単に何らかの値を与えるってダケでもアリなんだが、"statement"って観点で見た場合、何かを宣言するってダケじゃ何も起きやしねー。スクリーンに何かを表示するだとか、プログラム内部の状態を遷移させて後に続くプログラムに影響を与えるだとか、そういう変化のコトを「副作用」っつーんだが、上の例で示した"statement"は"1"と"true"ってValueを提示してるダケで、副作用もなけりゃ、状況も変わっちゃいねー。てんで意味なしだ。


・・・・


さて、そもそもプログラムってのはどうやって内部状態をキープしてるんだろうな?どうやって、物事を記憶してるんだろうか?これまで「古い値を使って新しい値を作る方法」ってヤツは見てきたが、これだと古い値を変更するって話じゃねーし、新しい値ってのも直ぐに使うか、消えちまうかだったな。んで、結局どーすんだ?って話なんだが、なんらかの値を保持しておくのにJavaScriptでは変数ってものを使うコトになってる。


さっそくコードの例を見てみるぞ。

var caught = 5 * 5;

変数には常に名前があって、値を指し示せるようになってる。で、ソイツを覚えとくワケだ。上の例だと、"caught"って変数を作って、5*5の掛け算の結果として出てくる数字を覚えておくのに使ってるってコトになる。


上のプログラムを実行した後、コンソールに"caught"と入力してみな。25って表示されるハズだ。変数の名前ってヤツは、その値を取得するのに使われるってワケだな。"caught + 1"なんて書き方をしてもOKだ。変数名ってヤツは"expression"として成立するし、より大きい"expression"の一部として使うコトだってアリってコトになる。


"var"ってのがは新しい変数をつくるのに使われるオマジナイみたいなもんだ。で、その後に続くのが変数の名前な。変数名ってのは殆ど全ての単語を使ってOKと思ってイイんだが、スペース文字入れるのとかは駄目な。数字を変数名の一部に使うのはアリだ。例えば"catch22"とかな。だが、"1"で始まる変数名ってのはNGな。それから"$"だの"_"って文字を使うのはアリだ。だから"$_$"なんて変数名だってOKってコトになる。


新しく作った変数に直ぐに値を当てはめたい場合、演算子"="を使うとイイ。ちなみに変数ってのは名前の通り"変"数だからな。何かの値をあてがっても、その値を永遠に結び付けられてるってコトにはならないぜ。演算子"="を使えばいつでも別の値を当てはめることが出来るようになってる。

caught = 4 * 4;

・・・・


変数ってヤツを何かに当てはめるとするなら、箱ってよりは触手って感じの方がイイぞ。変数ってのは値を内包するもんじゃなくて、掴んでるダケだ。例えば2つの変数が同じ値を掴んでることだってある。で、プログラムにおいて必要とされてる値だけが変数を使ってアクセス出来るようになってる。値を使いたきゃ、値をあてがった触手を使い続けるか、既存の触手に新しい値を結び付けるかすればイイ。例えば、ルイージに貸した金の総額が必要なら、こんな感じで書く。

var luigiDebt = 140;

で、ルイージが金を返す度に、この値は返金された分だけ減らしていく形になる。

luigiDebt = luigiDebt - 35;

特定のタイミングに存在する変数とその値の集合体を"environment(環境)"って呼んでる。プログラムが動き出すタイミングで"environment"は空じゃぁない。コイツは常にいくつか標準的な変数を持ってる。ブラウザがページを読み込んだタイミングで新しい"environment"が生成されんだが、そこで今言った"標準的な値"ってヤツが持たされるようになるワケだ。そしてブラウザが新しいページへ行くまで、該当ページ上で生成され、変更された各変数は生き続けるコトになってるぞ。


・・・・


標準環境から提供される多くの値は、関数型だ。関数ってのは、何らかの名前をつけられたプログラムのひとかたまりって感じのもんだな。この関数ってヤツは一般的には何か目的があって作られてるもんで、つけられている名前を呼び出す形で使えるようになってる。ブラウザ環境の場合、"alsert"って変数にはダイアログウインドウでちょっとしたメッセージを表示するのに使うような関数があてがわれてるぞ。こんな感じで使うもんだ。

alert("てか、オマエの髪の毛、燃えてっぞ");

関数内のコードを実行するってのは、「呼び出し」だの「適用」だのって呼ばれてる。で、関数の標記には括弧を使うぞ。そして関数を実行するには関数名の後に括弧を書くような形になってる。ちなみに、括弧の間に入れている文字列は、関数に与えられるようになる。上の例だと、この文字列がダイアログウインドウに表示されるテキストとして使われてるな。このように関数に与えられる値のコトをパラメータ(或いは引数)なんて呼ぶぞ。alert 関数が必要とした引数は1つだったが、他の関数の場合はそうとは限らんぞ。


・・・・


ダイアログウインドウの表示は副作用だ。多くの関数は、こういう副作用を目的に作られてるって言ってもイイだろう。もちろん、何らかの値を提供するダケで、特に副作用を生じさせるワケじゃないような関数だってあっても構わない。たとえば、Math.max なんて関数がある。コイツは2つの引数をとって、その2つを比較して大きい方を返すようになってるもんだ。

alert(Math.max(2, 4));

関数が値を生成するって現象は「値を返す」なんて風に言われてる。JavaScriptにおいて値を生み出すものってのは常に式(expression)だから、関数の呼び出しってのは、より大きな式(expression)の一部分として使えるようになってるぞ。想像しにくければ下の例を見てみろ。

alert(Math.min(2, 4) + 100);

レッスン3では、オマエが関数を自作できるようなカリキュラムを組んでるから、楽しみにしとけよ!


・・・・


前の例で見せたように、"alert"は何らかの式(expression)の結果を示す際に役立ちそうだな。ただ、いちいちウインドウが出てきてクリックしなきゃならんってのはちとウザい。そんなワケで、機能としちゃ似てるが、いちいちポップアップしないでコンソール画面に結果を出力してくれるだけの関数""print"の方がイイんじゃねーの?って話をしていくぞ。ちなみに、"print"ってのは標準のJavaScript関数じゃねーから注意してくれ。ブラウザには実装されてねーぞ。ケドな、サンプルページ上ではちゃんと使えるようにしてあるから心配しないで読み続けてくれ。まずは軽くジャブから行ってみるか。

print("ぶひ");

それから、サンプルページ上で実装してる類似の関数として"show"ってのがある。"print"が単なるテキストとして渡された引数を表示する一方で、"show"はプログラム中で表現されてるままを表示するようになってる。そして、型に関する詳細情報が分かる。たとえば、クウォートがついてる文字列の場合を見てみるか。

show("ぶひ");

ブラウザが提供する標準環境には、ウインドウのポップアップ絡みで、ほかにもうちょっと関数がある。何らかの確認をしたい場合に、ユーザーにOK/Cancelの質問をするってのも1つだな。この場合に返されるのはブーリアンになってる。ユーザが"OK"を押したら"真(true)"が返され、"Cancel"を押したら"偽(false)"が返されるって感じだな。

show(confirm("で、、やっとく?"));

"prompt"は自由度の高い質問をするのに使えるヤツだ。1番目の引数が質問で、2番目の引数がユーザが入力したテキストになってる。ポップアップされたウインドウに1行テキストを入力出来るようになってて、この関数が入力されたテキストを文字列として返すような作りになってるってワケだ。

show(prompt("知ってるコトは全て吐けや!", "..."));

・・・・


環境内にあるほぼ全ての変数に対して新しい値が与えられるようになってる。これは役に立つ場合もあるんだが、場合によっちゃ、危険にもなり得るコトだから注意しとけよ。例えば関数"print = 8;"なんてコトをやっちまったりしたら、もう関数"print"は使えなくなっちまうから、コレで何かを表示したりってコトは出来なくなっちまうぜ。まぁ、コンソールにはでっかい『リセット』ボタンをつけておいたからな。面倒なコトがあったら、コイツを押せば、初期状態にリセットされるようになってるんで、心配は要らないから、どんな風に問題が出るのか?思う存分自分で試してみてイイぞ。


・・・・


1行プログラムってのは、ちと面白みに欠けるよな。プログラムに複数行の文(statement)がある場合は、オマエも予想出来たろうが、一つずつ、上から下まで実行されるようになってるぞ。

var theNumber = Number(prompt("数字を選びな", ""));
print("オマエの入力した数字は、次の数の平方根だ " +
      (theNumber * theNumber));

関数"Number"が入力された値を数値に変換してる。プロンプトで入力された値ってのは文字列型だからな。この処理が必要だ。類似の関数として"String"と"Boolean"がある。コイツらも、それぞれ型の変換に使われるようになってるぞ。


・・・・


0から12までの偶数を全て表示するプログラムについて考えてみるか。これをやろうとした場合、1つの書き方としてこういうのがあるな。

print(0);
print(2);
print(4);
print(6);
print(8);
print(10);
print(12);

このやり方で確かに動くんだが、プログラミングってのは、労力を減らす為にやるもんだ。1000以下の全ての偶数を表示するって場合に、上の例と同じようなコトをやったとしたらエライ事になっちまうよな?自動的に偶数を見つけ出すような処理を繰り返してくれるような方法があるとイイんだが。

var currentNumber = 0;
while (currentNumber <= 12) {
  print(currentNumber);
  currentNumber = currentNumber + 2;
}

初回で"while"って処理についてちょっと触れたのを覚えてるか?"while"で始まってる文は、ループ処理を作ってる。ループを使うと、上から下へと文を処理していくって流れを遮って、いくつかの文を繰り返して処理するような形になる場合があるんだ。この例の場合、"while"の後に括弧にくくられた(ここで括弧は必須)式(expression)が続き、この中でループを終わるかどうか決定する為の条件が書かれてる。この式(expression)から導き出されるBoolean値が真である限り、ループは続けられるようになってるぞ。Boolean値が偽になったら直ぐにプログラムはループ処理の書いてある箇所の下へと移動し、引き続いて上から下への処理が続行される形になるってワケだ。


変数"currentNumber"ってのは、変数がプログラムの進捗を追跡できるってコトを示すもんだ。ループが繰り返される毎に、コイツが2ずつ増加するようになってる。で、毎回このループ処理を実行する前に、コイツは数字の12と比較されるようになってるってワケだ。ループを抜けるがドウかの判断の為にな。while文の3行目にある文は、別の処理が書かれてる。コイツは、複数回実行されるべきループ処理の本体だ。だから数字を表示する必要がない場合、プログラムはこういう形になるぞ。

var currentNumber = 0;
while (currentNumber <= 12)
  currentNumber = currentNumber + 2;

「currentNumber = currentNumber + 2;」って文が、ループの本体だ。が、数字についても表示してかなきゃならんせいで、ループ文は複数の文(statement)で構成される形になってるってワケだ。ブレース("{"と"}"のコトな)は、複数の文(statment)を1つの処理ブロックとして切り分けるのに使われてる。ブロックの外側からは、ブロックってのは単一の文(statment)として数えられるようになってるぞ。今回の例の場合、"print"関数の呼び出しと"curentNumber"の更新処理の呼び出しの両方を1つのループの中にまとめるのに使われてるな。


・・・・


練習問題 2.2

ここまで紹介してきたテクニックを使って、2の10乗の値を計算し、それを表示するプログラムを書いてみろ。分かってると思うが、単に「2 * 2 * ...」なんて処理を書き並べるようなセコい方法を使うんじゃねーぞ。


やり方がワカランようなら、偶数を表示する例をもう一度じっくり見てみろ。プログラムは、適切な回数だけ実行される必要がある。となると、while ループを伴った変数"counter"が使えるな。今回の場合、counterを表示する代わりに、何かに2を掛け算するようなプログラムを書く必要がある。プログラムは何かに2を掛け算しなければなりません。この"何か"は、"counter"とは別の変数じゃないと駄目だな。コイツには計算結果を格納するような感じになるだろう。


もし、まだメカニズムがよく理解出来てなかったとしてもあんまり心配すんな。たとえ今回のレッスンで学ぶ全てのテクニックがちゃんと理解出来てるとしても、それを特定の問題に適用しようってのは難しいもんだ。コードの読み書きを繰り返すことでセンスは磨かれるもんだ。解法を学んだら、次の練習問題に挑戦してみろ。


【例によって回答は元ネタ側を参照のコト】


・・・・


練習問題 2.3

さっきの練習問題を、ちょっと修正するだけで三角形を描画するプログラムが書けるぞ。ちなみに「三角形を描画しろ」ってのは「文字を使って三角形っぽい絵を表示してみろ」って意味な。


10行表示してみろ。最初の行には、文字"#"が1つだけある。2行目は2つだ。残りの行についても、そんな感じで"#"をどんどん増やしていけ。


任意の個数の文字"#"ってのはドウやって作るんだろうな?やり方の1つとして、「内部ループ(ループ内にあるループ)」を使って毎回必要な個数組み合わせるってのがあるぞ。そして、もっと単純なやり方としては、前の繰り返し処理で使われた文字を再利用して、1個分の文字を追加するってのがあるな。


【例によって回答は元ネタ側を参照のコト】


・・・・


オレが文の前にスペース文字を置いてる行があったのに気付いたか?コイツは、別に必要なもんじゃあない。コンピュータは、コイツらが無くても何の問題も無くプログラムを受け入れるようになってる。実は、プログラムには改行すら必須ってワケじゃあない。オマエがやりたきゃ、全部1行にまとめちまったって構わない。各処理ブロック内で行われる字下げ(インデント)の役割ってのは、コードの構造を読んでる人間に分かりやすくするってトコにあるんだ。ブロック内に更に新しくブロックを作るようなコトもアリなおかげで、どのブロックがどこで終わってるのか?どこから始まってるのか?ってのを理解するのが辛くなることがあり得るワケだ。だが、インデントを使うことで、視覚的に各ブロックがドウなってるのかを把握出来るようにするコトが出来る。オレは、各ブロックに対して2つのスペース文字を使ってインデントするのが好きなんだが、まぁここら辺は十人十色ってヤツだな。オマエの好きにしな。


オペラ以外のブラウザの場合、プログラム入力用のコンソールにおいて、インデントってのは自動的にされるようになってる。便利だろ?人によっちゃ、これは最初はイラっとくるかも知れんが、大規模なコードを書くようになってくると、時間の節約って意味で有り難味が分かるようになると思うゼ。ちなみにタブキーを押すと、その時点のカーソルが再インデントされるようになってる。


場合によっては、JavaScriptは文(statement)の最後につけるセミコロンを省略可能だ。それ以外でセミコロンを抜いちゃイカン。でないと変な動作になっちまうぞ。じゃあ、どんな時にセミコロンは省略出来るんだ?って話だが、そのルールってヤツがこれまた複雑怪奇なんだよな。このテキストでは、セミコロンは必要な限りあらゆる文につけるようにしてある。オマエもそれと同じようにするよう、強く勧めとくぞ。


・・・・


これまで見てきた"while"の使い方ってのは、全て同じパターンだな。まず最初に、変数"counter"が生成されて、コイツでループ回数を追跡するようにしてある。そして、while自身が"counter"がループの終わりに到達してるかどうかをチェックする為の情報を持つようになってる。で、ループ本体の終わりで、"counter"は更新される、って感じだな。


多くのループは、このパターンに落とし込めるようになってる。そういうワケで、JavaScriptや、それと類似したプログラミング言語は、もちょっと短くて包括的な表記が使えるようになってるぞ。例を見てみるか。

for (var number = 0; number <= 12; number = number + 2)
  show(number);

このプログラムでやっている事は、さっきの偶数を表示する例と完全に等価だ。唯一の違いは、ループの状態に関連した文が全て1行に収まってるってコトにある。で、for の後にくる括弧の中にはセミコロンが2つ入るようになってるぞ。最初のセミコロンがくる前の部分にあるのがループの初期化をやる部分だ。大体の場合は変数が定義される形になってるな。で、次の部分がループを継続するかドウかをチェックするための式(expression)が書かれてる部分だ。そして最後の部分がループ処理における更新作業の中身を書く場所になってる。ほとんどの場合、コイツを使う方が while文を使うよりも短くて済むし、分かりやすくなるぞ。


・・・・


これまでオレがいくつか変数名に大文字を使ってたのに気づいてたか?変数名に空白文字を使えないからな(使った場合、2つの別々の変数として取り扱われちまう)。複数の単語で作られた変数名をつけようとした場合、やれる工夫なんてのはそんなに無い。まぁせいぜいこんな感じだろう。:fuzzylittleturtle、fuzzy_little_turtle、FuzzyLittleTurtleまたはfuzzyLittleTurtle。最初のヤツは読み難いな。個人的には、アンダーバーを使うのがイイね。打ち込むのがちと面倒だが。ただ、標準的なJavaScriptの関数や、JavaScriptプログラマの大部分は、最後のやり方に従ってるぞ。まぁ、他の大勢のヤツらがそうしてるってなら、それに合わせるのに大した労力があるワケでもなし、オレもそうするダケだ。つまり最初の単語の後にくる各単語の最初の文字を大文字にする、ってコトだ。


まぁ、関数Number みたいに変数名の最初の文字が大文字になってるヤツもわずかにありはするんだがな。コイツは、その関数がコンストラクタだってコトを示す場合にそうなってる。ちなみに、そもそもコンストラクタって何だよ?って話についてはレッスン8でやる予定になってるから、それまで待ってろ。物事には順序ってもんがあるからな。まぁ、今の時点では、「なんだよ!一貫性ねーじゃねーか!」なんて下らんツッコミを入れてくれるなよ、っつー事だけ理解してくれりゃそれでイイ。


特別な意味を持つ名前(例えばvar だの while だのforだの)には注意しろよ。コイツらは変数名として使うべきもんじゃない。こういうヤツらは、キーワードって呼ばれてる。それから、JavaScriptの将来のバージョンで『将来使うので予約』って形になってる名前もいくつかあるぞ。ブラウザによっては許容するものもあるみたいだが、公式にはこいつ等を変数名として利用する事は許されてねーから気をつけろよ。ってワケで、ちと長いがリストにしてみたぞ。

abstract boolean break byte case catch char class const continue
debugger default delete do double else enum export extends false
final finally float for function goto if implements import in
instanceof int interface long native new null package private
protected public return short static super switch synchronized
this throw throws transient true try typeof var void volatile
while with

今のところは、「覚えられナーイ!」なんて落ち込む必要はねーぞ。だが、何か上手くいかないような事があった場合に、この件が関連してるかも?って思い出すくらいにはなっといてくれよ。オレの経験では、char(1個の文字を保持する)とかclassなんてあたりで悩むってのが、よくある話みたいだな。


・・・・


練習問題 2.4

前の2個の練習問題について、while を使う代わりにforを使って書き換えてみろ。


【例によって回答は元ネタ側を参照のコト】


プログラムを書いてると、変数を前の値を元にして新しく更新したい場合ってのがよくあるよな。例えば counter = counter + 1 みたいな感じで。JavaScriptではコレをやるのにショートカットが提供されてる。そういう場合は counter += 1 ってやればイイ。これは"+"に限らず他にもイロイロな演算子で使えるワザになってるぜ。例えばresultの値を2倍にしたい場合に result *= 2 なんてしたり、カウントを減らしたい場合に count -= 1 なんてするのもアリだ。


ちなみに、counter += 1 だの counter -= 1だのってのは、さらに短か目バージョンとして counter++ だの counter-- なんてのがあったりするぞ。


・・・・


ループってのは、プログラムの制御フローに影響を及ぼすもんだって言われてる。コイツらは文(statement)が実行される順番を変えるものだからな。もう一つ役に立つ制御フローがあるぜ。スキップ文ってヤツだ。


たとえば、0から20の間の数字で、3でも4でも割り切れるものを全て表示したいとする。


for (var counter = 0; counter < 20; counter++) {
  if (counter % 3 == 0 && counter % 4 == 0)
    show(counter);
}

キーワード if ってのは、while とそんなに変わらねーぞ。コイツは括弧内に与えられてる条件をチェックして、その条件に従って続いて書かれてる文(statement)を実行するようになってる。ただ、この判断がなされるのは1回だけだ。つまり、後に続く文(statement)が実行されるのは1回か0回か、ってコトになるな。


剰余(%)の演算子を使ったワザは、任意の数字が別の数字で割り切れるかドウかチェックする簡単な方法だ。割り切れるなら、剰余算の結果として出てくる余りは0になる。


もし、0から20までの間の全ての数字を表示し、その中でも4で割り切れないものについては括弧でくくるようにしたいとするなら、こんな感じでやればイイ。

for (var counter = 0; counter < 20; counter++) {
  if (counter % 4 == 0)
    print(counter);
  if (counter % 4 != 0)
    print("(" + counter + ")");
}

だがコレだと、プログラムはcounterが4で割り切れるかドウかを2回判定しなきゃならねーコトになっちまうな。if文の後にelseのパートを付けてやる事で同様の処理が出来るぞ。else文ってのは、ifで指定された条件が偽だった時にだけ実行される処理を書くことができるようになってるもんだ。

for (var counter = 0; counter < 20; counter++) {
  if (counter % 4 == 0)
    print(counter);
  else
    print("(" + counter + ")");
}

この例をちょいと拡張して、扱っている数字については変えず、15より大きな数字には星(*)を2つ、10より大きく15以下なら星を1つ、それ以外なら星無し、って感じで表示してみるとするか。

for (var counter = 0; counter < 20; counter++) {
  if (counter % 4 == 0)
    print(counter);
  else
    print("(" + counter + ")");
}

ココで示したのは、if文が連鎖させられるってコトだ。今回の場合、プログラムはまず counter が15より大きいかドウかをチェックするようになってる。で、実際に15より大きい場合は、2つの星が表示されて残りのチェックはスキップされる。15より大きくない場合は、引き続いてcounter が10よりも大きいかドウかをチェックする。最後のprint文は、counter が10より大きくもない場合にのみ実行される処理になってる。


練習問題 2.5

"prompt"を使って"2 + 2"の結果がドウなるか、入力させるようなプログラムを書け。で、回答が"4"の場合には"alert"を使ってちょっと褒めてやれ。回答が"3"か"5"なら「惜しい!」とか言ってやれ。それ以外の回答なら、ゴルァ!しろ。


【例によって回答は元ネタ側を参照のコト】


・・・・


ループの際に、常に最初から最後まで全部の処理をする必要があるってワケじゃない場合には、キーワード"break"を使うとイイぞ。コイツは、以降に来る処理を飛ばしてループを抜ける為に使うもんだ。以下のプログラムは、20より大きくて7で割り切れる最初の数字を発見するってのを目的にしてる。

for (var current = 20; ; current++) {
  if (current % 7 == 0)
    break;
}
print(current);

上の例だとfor文にループの終わりをチェックする部分が無いな。つまり、for文中に宣言されてる"break"に、ループの中断条件が依存しちまってるってコトだ。同じ内容のプログラムは、こんな感じでシンプルにも書ける。

for (var current = 20; current % 7 != 0; current++)
  ;
print(current);

この場合、ループの中身はカラッポだ。セミコロンをポツンと置いときゃ、カラッポの文(statement)ってコトになる。この場合のループの唯一の効果は、変数"current"を所望の値まで加算してくコトだけだな。が、今回のポイントは"break"の例を示すってところだ。前者の例の方もちゃんと見て、しっかり理解してくれよ。


・・・・


練習問題 2.6

さっきの練習問題で書いたコードに"while" と"break"(使わなくてもイイ)を付け加えて、「正解が出てくるまで質問を繰り返し続けるプログラム」ってヤツを作ってみろ。


"while (true) ..."ってのを使えば、一種の無限ループを作れる。おっ、今「無限ループがヤバいくらいオレも知ってるけど、アンタ馬鹿?」とか思ったか?だがな、コイツは上手く使えば役に立つワザになるんだぜ。


【例によって回答は元ネタ側を参照のコト】


・・・・


今の練習問題の2番目の解法に、var を使ってる文があるな。コイツは変数に名前を付けて生成するって役割を持ってる。だが、作られた変数に値は与えられてないって点は注意しろよ。んじゃ、この変数の値を見ようとしたらドウなるんだろな?

var mysteryVariable;
show(mysteryVariable);

この変数は何も掴んじゃいない(変数は箱じゃなくて触手って喩えたから「掴む」って表現にしてみたぞ)。「カラッポの場所に何があるの?」って聞いた場合は、特別な値"undefined"ってのが返されるようになってるぞ。"print"だの"alert"だのって意味ある値を返さない関数なんかも、同様に"undefined"を返すようになってるな。

show(alert("おっす。オレ、副作用"));

それから似たような値として"null"ってのがあるな。意味は「この値は定義されているが、値自身を保持するものではない」だ。"undefined"との違いってのはかなりアカデミックになっちまうから、殆どのヤツにとってはツマラン議論みたいだぜ。実際のプログラムの場合、何かについて『値を持つか』どうか調べるってコトがしばしば必要になるんだが、こういう場合"何か == undefined"って使われ方もアリだ。厳密に言えば"undefined"と"null"の2つは別物だったとしても"null == undefined"は真ってコトになってるからな。


・・・・


"null == undefined"が真って話でアレ?って思ったか?

show(false == 0);
show("" == 0);
show("5" == 5);

上記の例は3つとも真を返すようになってるな。実は、型の違う値を比較した場合、JavaScriptでは複雑怪奇なルールを使うようになってる。オレ的には、そのルールを正確に説明しようなんて気はサラサラ無いワケだが、ちょっとダケ解説しておく。ほとんどの場合は、単に一方を他方の型に合わせようって形になる。だが、左右が"null"か"undefined"の場合、型がどうのとか関係なく、真を返す。と、まぁそういうコトだ。


んじゃ、変数が偽(false)を参照してるかドウか調べたい場合にはドウすりゃイイんだろうな?文字列型や数字型をブーリアン型に変換するルールは、「0と空(empty)文字は 偽(false) と見なし、その他の値は 真(true)とする」ってコトになってる。だから、変数が"0"か"空(empty)文字"を参照してる場合には、"変数 == faluse"ってのも真(true)になる。自動型変換を望まないような場合の為に、演算子がさらに2つあるぞ。"==="と"!=="ってヤツらだ。前者は値が比較対照とキッチリ同じかどうかを調べるもんで、後者はその逆を調べるもんだ。

show(null === undefined);
show(false === 0);
show("" === 0);
show("5" === 5);

コイツらは全部、偽(false)になる。


・・・・


if文、while文、for文なんかで与えられてる値は、別にブーリアン型である必要はねぇ。チェック前に自動的にブーリアン型に変換されるからな。つまり、数字の"0"や"null"、"undefined"、それに勿論"false"なんかは偽(false)ってコトにされるってワケだ。


他の全ての値が"真(true)"に変換されるって事は、多くの場合に明示的な比較を無視できるってこったな。例えば、任意の変数について保持しているのが文字列型か"null"かどっちかだってコトが事前に分かってるなら、こうやれば簡単に調べられる。

var maybeNull = null;
// ... 変数 maybeNull に文字を与えるかも知れない謎のコード ...
if (maybeNull)
  print("変数 maybeNull は値を持ってるっス!");

謎のコードが変数"maybeNull"に"空文字(empty)"を与える場合(空文字は偽(false)だからな)以外、何も表示されないぞ。ちなみに、オマエが何をしたいか?によっては、このやり方は良くないカモ知れん。微妙な間違いを防ぐには、明示的に" === null" 或いは" === false "を使った方がイイってコトが良くあるからな。似たようなコトが、数字の0にの場合にあるカモな。


・・・・


さっきの例で『謎のコード』について書かれてる行を見て、「なんじゃこりゃ?」と思ったかも知れねーな。テキストをプログラムに含めるってのが役に立つコトがしばしばあるんだぜ。一般的な使い方で最もよくあるのは、プログラムに対して人間の言語で解説を入れるような感じだな。

// 変数 counter をここで定義する。開始時点では"0"。
var counter = 0;
// こっからループだよ
while (counter < 100 /* counter は100より小さい */)
/* ループの度に、counterの値を加算していく,
   1ずつね */
  counter++;
// で、おしまい

こういうテキストはコメントって呼ばれてる。ルールは「/*」がコメントの開始で、「*/」が終了の合図って感じだな。ちなみに1行内に収まるコメントの場合には「//」ってのを使ってコメントの開始の合図にする事も出来るぞ。


見ての通り、大量にコメントを入れちまうと、ごくごく簡単なプログラムでさえ、デカく、醜く、難しそうになっちまうから気をつけろよ。


・・・・


他にもいくつか、自動型変換が起こる原因になりそうなシチュエーションがあるぞ。例えば、文字列型でない値を文字列に加えようとする場合、その値が連結される前に自動的に文字列型に変換されるようになってる。それから、数字型と文字列型で掛け算をしようとする場合、JavaScriptは文字列型から数値型を作ろうとするぞ。

show("Apollo" + 5);
show(null + "ify");
show("5" * 5);
show("strawberry" * 5);

最後の文については、"NaN"ってのが表示されたな。コイツは特殊な値だ。コイツは数値型で「Not a Number(数値じゃねーよ)」って意味だ。この場合、strawberry(イチゴ)は数値じゃねーぞ、ってコトだな。"NaN"な値に関する算術演算は全て"NaN"って結論になる。そういうワケで、今の例の場合、5と掛け算をしても出てくる値が"NaN"ってなってるってコトだ。それから、コイツはちょっと「はにゃ?」って感じになるかも知れんのだが、"NaN == NaN"は偽(false)になるぞ。ちなみに、ある値がNaNであるかどうかはisNaN関数で確認できるようになってる。


ここまで紹介してきた自動型変換ってヤツはかなり便利ではあるんだが、エラーの温床にもなりそうだ。"+"と"*"が両方とも算術演算子であったとしても、さっきの例では完全に別の振舞いになってるよな。オレ自身のコードでは文字列型でない値に対して"+"を使うコトが多いんだが、"*"とか他の演算子はあんまり使わん。数値型を文字列型に変換するのは常に可能だし、簡単だ。だが、文字列型を数値型に変換するってのはイマイチだ。さっきの最後の例みたいにな。文字列型を明示的に数値型に変換するのに関数Numberは使えるが、"NaN"を得る危険があるって事はしっかり理解しとく必要があると思うぞ。

show(Number("5") * 5);

・・・・


冒頭でブール演算子"$$"と"||"について触れたとき、コイツらはブーリアン型の値を返すって話したよな。だが今考えると、これは、ちょっと単純化し過ぎってのが分かるな。コイツらに適用する値がブーリアン型なら、確かに返されるのはブーリアン型になる。だが、コイツらは他の型に対しても適用可能だからな。で、そういう場合には引数の一方を返すようになってるぞ。


"||" が本当にやってる処理ってのはコウだ:


最初に左側の値を見る。その値がブーリアン型に正しく変換可能な場合、その左からとった値を返す。そして、左側の値が正しく変換出来ない場合、右側の方を返すようになってる。引数がブーリアン型の場合にこれが正しいのかドウか、自分で確認してみろ。なぜ、そうなるのか理解してるか?そう処理するのが理に適ってるってコトが分かるぜ。この例を見てみな。

var input = prompt("オマエの名前を言え!", "ふたばていしめい");
print("おお、オッス " + (input || "dear"));

ユーザが名前を入力せずに"キャンセル"ボタンを押すか、"prompt"ダイアログを閉じるかする場合、変数"input"は"null"か"空文字(empty)"名前を持つことになる。この2つとも、ブーリアン型に変換する際に偽(false)が返るようになってる。「input || "dear"」って式(expression) は、この場合「変数"input"の値」或いは「文字列"dear"」って風に理解すればイイ。コイツは"戻り値"を出すやり方として簡単な方法だ。


演算子"&&"の働きも似た感じだ。働きとしちゃー、真逆だけどな。左側の値がブーリアン型に変換された際に"false"ならその値を返す。で、そうでないなら右側を返すってコトになるワケだな。


コイツら2つの演算子のもう1つの特徴は、右の式が必要に応じて評価されるだけだって点だ。"true || X"って場合、Xが何者だろうと結果は"true"だ。つまり、Xは最後まで評価対象になってない。ってワケで、そのXが副作用を記述するものだってなら、副作用は発生しないってこった。同様のコトが"false && X"についても言えるぞ。

false || alert("I'm happening!");
true || alert("Not me.");

さて、今回はボリューム満点だったな。大事な項目だから、分かった気になって勝手に読み飛ばさず、全ての問題をしっかりこなせよ!今度はオマエがじっくり読み込む番だ。


さぁ、声を出して行くぞ!


Go! ニコガク、Go!!


次回につづく

作者:hamatsu1974

更新日:2008年11月25日 21時32分

このブログのホーム

[Eloquent JavaScript]【Lesson2】 JavaScript の基本を叩き込め:値、変数、制御フロー(前半) - Eloquent JavaScript

気合入れていくぞ!


前回の内容は覚えてるか? 気分は盛り上がってるか? オマエの目標をしっかりイメージしろ。そうだな。。。例えば id:amachangid:HolyGrail の書いたエントリの内容が理解出来る様になって、間違っても「良くワカランがスゲー!」なんてコメントしないで済むとか、、そこら辺でどーだ? 何? 畏れ多い? オマエの気合はそんなものか? 「なれたらイイな」じゃねーぞ。「なる」んだよ。決定事項なんだよ。最後までやり切って脱初心者すっぞ! 今日も元ネタ提供者の Marijn Haverbeke さんに感謝しつつレッスンを進めるぞ。用意はいいか!? よし、声出して行くぞ!


Go! ニコガク、Go!


さっそくレッスン開始


コンピュータの世界において存在しているのはデータだけだ。それ以外には存在しない。データってのは要するにビットの連なりに過ぎないワケで、全部似たようなもんだって言えばその通りなんだが、各々のデータにはそれぞれ自分の役割ってもんがある。JavaScriptにおいては、データのうちの大部分は"value(値)"ってもんに切り分けられるようになってる。そして、あらゆるValueには型ってもんがある。この型ってのは、データがどのような役割を果たすか?について規定するもんだ。そして、この型には6種類ある。Numbers(数値型)、strings(文字列型)、booleans(ブーリアン型)、objects(オブジェクト型)、functions(関数)、そしてundefined values(未定義値)だ。


Value を生成するには、ソイツに名前をつけりゃあイイ。こりゃカナリ便利だよな。小難しい作法は必要ねぇ。ちょちょいと名前を付けて呼んでやれば、それでValue は出来上がりってワケさ。って言っても勿論、無から有を生み出すような勢いで全てのValue ができるってワケじゃないぞ。全てのValueはどこかに保存されてる必要があるからな。大量にメモリを消費するようなValueの扱い方をすれば、コンピュータメモリを使い切っちまうようなコトだってあるカモ知れないぜ。って言っても、そう心配する必要はないぞ。あくまで「全てのValueを同時に」使うような場合に出てくる問題だからな。必要のなくなったValueは、ほんのチョイのビットを残してすぐに消えるようになってる。で、この残されたビットってのは、次に作られるValueを生成するのにリサイクルされるようになってるってワケだ。


・・・・


数値型のValue ってのは、オマエの推察の通り数を扱うもんだ。通常はこういう書き方になる。

144

コンソールに入力してみな。出力ウインドウに同じものが表示されるハズだ。オマエが入力したテキストが数値型のValueとして生じ、そして、コンソールがこの数字を受けとって再度スクリーンに書き出した、とまぁそういうワケだ。当たり前過ぎて今回のようなケースだと、意味なくねーか?って感じのエクササイズになっちまってるな。ケドな、これから先に取り組んでいくコトを考えると、こうやって「やってみる」ってのは理解を助ける上で役に立つもんだから、くれぐれも飛ばすんじゃねーぞ。


次に144って数字がビット表現ではどんな感じになってるか見てみるか。


0100000001100010000000000000000000000000000000000000000000000000

上で示した数値型は64ビットのサイズだ。JavaScriptにおいて数値型ってのは常にそうなるから覚えておけよ。これは重要だぞ。取り扱うことのできる数値の範囲が限られてるってコトなんだからな。30進数の場合10の3乗、つまり0から999までしか書けねえ。2進数の場合、2の64乗(つまり10の19乗以上)の数字が表現できるってコトになる。

10の19乗以下の数がJavaScriptにおいて全て使えるってワケじゃないんだがな。まず、負の数ってのを考えなくちゃならねー。だから、1つのビットは数の正負を示すのに使われちまう。もっとデカい問題として、実数の場合は小数点のコトも考えなきゃなんねー、って話がある。そのために11ビットは小数点を入れる位置を表現するのに利用されることになるワケだ。


っちゅーワケで残るのは52ビットだ。2の52乗(10の15乗より大きい)より小さい整数ならJavaScript において数字として問題なく使えるってコトだな。大方のケースでこれ以上の数を扱う必要ってのはねーから、ビットの制限についてあんまり考える必要はないだろうぜ。有り難いこったな。だが、一応仕組みを知っとくってのは重要だから覚えとけよ。オレ(訳者)の経験から言えば、暗号とかやるのにここら辺を押さえとかねーと後で悩みまくるぞ。


少数の表現は以下のようにドットを使う。まぁ、普通だな。

9.81

数字がデカ過ぎたり小さ過ぎたりする場合には、科学っぽく"e"を使って指数による表現をすることだって出来るぞ。

2.998e8

これはつまり、2.998 × 10の8乗 = 299800000 ってこったな。52ビットに納まる整数を使った計算は、その結果が常に正確だってコトが保証されてる。だが残念ながら小数の計算の場合にそれは言えねえ。π(パイ)が正確に十進桁の有限量で表現出来ないのと同様に、少数にも保存可能な幅が64ビットと決められちまってる以上、精度の上での問題が出ちまうワケだ。困ったちゃんな話ではあるが、まぁこれが問題になるようなシーンってのはごくごく僅かなんじゃねーの?と思うゼ。重要なのは、精度問題があるってのをちゃんと理解しておくってこった。


・・・・


数を使って何かするって言えば、まぁメインでは算数だよな。足し算だの掛け算だのって計算は、2つの数を使って新しい数を作り出す処理として実行されるぞ。JavaScriptの場合は以下のように書く。

100 + 4 * 11

"+" だの "*" だのって記号は演算子って呼ばれてる。前者が加算に、後者が乗算に使われる。2つの値の間に演算子を挟むことで新しい値が生み出される、ってこったな。まぁ、算数の書きかたと同じだし、あんまり難しく考えなくても理解できると思うが。


で、この例の場合、100と4の足し算をしてから、その結果に11を掛けるような感じになるのか、それとも掛け算が足し算より先になるのかは分かるか?そう。オマエの予想通り、掛け算が先になる。だが、数学と一緒で括弧を使えば前者のような計算だってさせられるぞ。


(100 + 4) * 11

ちなみに、引き算なら「-」、割り算なら「/」の演算子を使えばOKだ。


演算子が括弧なしで一緒に使われてる場合は、優先順位は演算子同士の関係で決まるようになってる。最初の例だと、掛け算が足し算より高い優先順位を持ってるってコトだな。算術演算子の序列は次の通りだ。割り算>掛け算>引き算>足し算(2ちゃん風)。


次の例を見ながら、どういう順序で計算が行われるのか考えてみろ。で、その予想が正しいのかチェックしてみろ。


115 * 4 - 4 + 88 / 2

まぁ、あんま気にすんな。処理の順序が気になるなら、算数と同じく括弧使えばイイんだからな。


それから多分、オマエにはあんまり馴染みのない算術演算子がもう1個あるぜ。「%」ってヤツなんだが、コイツは剰余を求めるもんだ。Yを法としてXの剰余を求めるってのは、XをYで割り算してその余りを求めるってコトだ。例えば、314 % 100は14、10% 3は1になる。そして、144% 12の場合だと0だな。ちなみに、剰余算の優先順位は掛け算と引き算の間になってるぞ。


・・・・


で、お次はstring型だ。

数値型と違って名前から「何者なのか?」がピンと来にくいかも知れんな。だが、コイツの役割も超基本的なもんだ。string型はテキスト(文字列)を表現するのに使う。名前の由来は多分、たくさんの文字をつなぎ合わせてるってトコから来てるんじゃねーかな。Strings(文字列型)は、クウォートで囲む形で書かれるようになってるぞ。


"こんにちはこんにちは!"

ダブルクォートの間に挟まれてりゃ、JavaScriptでは殆ど何でも文字列型として扱うようになってるんだが、いくつか注意しなきゃなんねーもんがあるから気をつけろ。例えば、クウォートの間にクウォートを入れるってのは厄介そうだよな、、とかは想像つくだろ?それに改行したい時に改行文字をそのまま入れるのも駄目だ。文字列ってのは1行で表現されてないと駄目だからな。

で、そういう場合に使うワザがある。クウォートに挟まれた文字列内にバックスラッシュ('\')がある場合、その次に来る文字が特殊な意味を持ってるってコトを表してると判断されるようになってるから、それを利用してバックスラッシュに引き続いてクウォートがある場合、そのクウォートは文字列の終端を示すもんじゃなくて、文字列の一部って扱いに出来る。バックスラッシュの次に'n'が出てくりゃ、コイツは改行の意味だって風に理解される。同様にバックスラッシュの後に't'が来てりゃ、そりゃTab文字ってこった。


"これは1行目\nで、これは2行目"

勿論、文字列の中で上で示したような何かの合図としてではなくて、単なるバックスラッシュ文字として扱いたいって場合もあるよな。そういう場合にはバックスラッシュを2つ並べてみるとイイ。片方だけが文字列として残って扱われるようになるぞ。

"改行文字はこんな風に使うぞ \"\\n\"."

・・・・


文字列型は割り算も掛け算も引き算も出来ねーが、「+」演算子は使えるぞ。足し算としてじゃなくて、文字列の連結としてだけどな。

"つ" + "な" + "が" + "ってる"

文字列に対する操作はまだまだあるんだが、それは後にじっくりやるからまぁ待っとけ。


・・・・


すべての演算子が記号ってワケじゃなく、言葉として書かれるものだってあるんだぜ。たとえば、typeof演算子だ。コイツは与えた値の型を教えてくれるぞ。

typeof 4.5

今まで見てきた演算子って言えば、2つの値に対して作用するもんだったが、コイツはたった1つの値しか扱わねぇ。2つの値を使う演算子はバイナリ演算子と呼んで、1つの値をとる演算子は単項演算子って呼ぶことになってるらしい。演算子「-」はそのどっちとしても利用可能になってるぞ。

- (10 - 2)

・・・・


ほんでお次はブーリアン型だ。コイツが保持してるのは真(true)か偽(false)かって情報ダケだ。真の値をとりたい場合にはこういう感じになるな。

3 > 2

で、逆に偽をとりたい場合にはこんな感じになる。

3 < 2

「<」だの「>」だのって記号が何かは既に分かってるよな?そう、左右の大小を比較するもんだ。コイツらはバイナリ演算子で、結果を真か偽で保持するようになってる。


文字列だって同じように比較できるぜ。

"Aardvark" < "Zoroaster"

文字列の序列ってのは、まぁ大体アルファベット順になってる。で、大文字のは小文字より常に『少ない』って扱いになってる。だから、「Z < a」の比較の場合は真になるな。それから「!」だの「@」だのって非アルファベットの文字についても、この序列ルールで扱えるようになってる。実際コレは、Unicode標準に従ったもんだ。このUnicode標準ってヤツが、この世のありとあらゆる文字(ギリシア語、アラビア語、日本語、タミル語等を含む)に対して数字を割り当ててる。まぁ細かい話はしないが、要するにコンピュータ内で文字列ってのは数として保存されてるってこったな。JavaScriptで文字列の比較をするって場合には、単にその文字に割り当てられてる数字を左から右に比較していくってダケになってるぞ。


そして他に似たような演算子として「>=(以上)」「<=(以下)」「==(等しい)」「!=(等しくない)」ってのがある。

"Itchy" != "Scratchy"

・・・・


真偽値に対して使える便利な演算子がいくつかあるぜ。JavaScriptでは次の3つの論理演算子をサポートしてる。「and」「or」そして「not」だ。コイツらは、真偽が予め分からないような場合に使えるぞ。


演算子「&&」は論理演算における「and」を表現するもんだ。コイツはバイナリ演算子で与えられた2つの値が共に真である場合にのみ結果が真になるようになってる。

true && false

演算子「||」は論理演算における「or」を表現するもんだ。与えられた値のどちらかが真なら真を返すぞ。

true || false

それから、論理演算「Not」は「!」で表現されるようになってる。コイツは単項演算子だ。!true は偽、!false は真ってことになる。


・・・・


よーし、そんじゃ軽く練習問題をやってみるか? ブログじゃ上手く回答だけ隠すとかできねーからな。回答部分はココには入れねーから、自分で元ネタ見てチェックしとけよ。オレの気が向いたら、練習問題の回答だけまとめた超訳エントリを作るかも知れねーけどな。


練習問題 2.1
((4 >= 6) || ("grass" != "green")) &&
   !(((12 * 2) == 144) && true)

コレは真か? 読み易さを考えると、要らねぇ括弧が大量にあるな。下に書いたシンプル版も中身は一緒だ。

(4 >= 6 || "grass" != "green") &&
   !(12 * 2 == 144 && true)

・・・・


括弧が必要かドウか?なんて必ずしも自明じゃねぇよな。実際、見たことないもんについては良くワカランわけだし。演算子の優先順位について説明しとくと、 || が1番低くて、次に&&、それから比較演算子(== とかのヤツな)、そんで残りが次に来る、って順番になってる。これはドウしたら括弧を少なく出来るか?って観点で決められたみたいだぜ。


・・・・


ここまでの例では、電卓を使うような感じで言語を使ってきた。いくつか値を作って、ソイツらと演算子とを絡めて新しい値を得る。こんな感じで値を作るってのは、あらゆるJavaScriptプログラムにおいて重要な部分ではあるんだが、あくまで氷山の一角だ。ちなみに何がしかの値を生じさせるコードのコトはは、"expression(式)"って呼ばれてる。「22」だの"psychoanalysis(精神分析)"だのと直接記述するってのは全部"expression"だ。括弧の間にある"expression"も"expression"だ。そして、バイナリ演算子を2つの"expression"に適用するとか、単項演算子を1つの"expression"に適用する、なんてのもまた"expression"ってコトになる。うーん、ややこしいか? あんまり小難しく考えるなよ。混乱させようとして話してるワケじゃねーからな。


さて、モヤモヤした状態で進めても身に付かないからな。ここまでキチンと理解してるか、一度自分で復習してみろ。んで、その後ちょっと気分転換にコーヒーブレイクといくか。(いや、正直言うと、オレはコーヒー嫌いなんだがな。。。)


とにかく休むと決めたらキチンと休め。いいな?

さぁ、頭の切り替えの為に声を出すぞ!


Go! ニコガク、Go!!


次回につづく

作者:hamatsu1974

更新日:2008年11月22日 7時41分

このブログのホーム

[Eloquent JavaScript]ハッカーに憧れてたダケのオマエらに捧ぐ(序+目次) - Eloquent JavaScript

心配するな。日本語は死なんよ


来たか、ハッカー大好きはてなー野朗。ちょっとオマエ、ブクマを見せてみろ。ん?なんだこの大量の「あとで読む」タグは?! で、これは読んだのか? 何? まだだと? あ?「だって英語で書いてあるしー」だ? で、「その前に英語やらなくっちゃ!」と思ってやった事が、英語Tips のページにブクマして「あとで読む」タグを付けること? おめでてーなー。オマエは本当におめでてーヤツだよ。今日も新たな教材探しか?


おい、、、図星かよ。涙目になんなよ。。


今日から、そんなオマエのヘタレな日常とサヨナラ出来るよう、またオレが教材を用意してやったぞ。喜べ。元ネタは"Eloquent JavaScript (オレ的な超訳では「スゴいよ JavaScript」)"だ。コイツの出来の良さは関係各方面でお墨付きが出てるから安心しろ。さぁ読め!学べ! そしてオマエも憧れのハッカーへの第一歩を踏み出してみろ!!


まずは準備運動


今回のテキストがどんなもんか?って事を軽く紹介してるカバーページについてはココに載ってるから、興味があったら確認しとけ。オレは和訳が存在してる箇所まで訳す程には暇じゃねーからな。


それじゃまずは目次だ。以下の流れで学習は進んでいくぞ。


スゴいよ JavaScript
- 頑固オヤジのプログラミング講座 -

1回目(今回): はじめっぞ!

2回目 : JavaScript の基本を叩き込め:値、変数、制御フロー(前半)(後半)

3回目 : 関数を知れ

4回目 : データ構造を学べ:オブジェクトと配列

5回目 : エラー制御だ!

6回目 : 関数型プログラミングとか言ってみたいオマエに

7回目 : 検索の話は奥が深いぜ!

8回目 : オブジェクト指向プログラミングとか言ってみたいオマエに

9回目 : Modularity はオマエ、いやその、Modularity だよ

10回目 : 正規表現に溜息(正直オレはキライなんだが…)

11回目 : Web プログラミングをザックリと

12回目 : Document-Object Model も学んどくぞ

13回目 : ブラウザイベントの話も見ておくか

14回目 : HTTP リクエストでサーバと通信してみっか?


オマケ

15回目 : 伝え漏れてる制御構造

16回目 : ヒープも知っとけ


用意はイイか?


よーし。じゃあ行くぞ。

Go! ニコガク、Go!!(←なんかいまだに気に入っている)


はじめっぞ!

 

昔話から始めるとだな、パソコンが世の中に出た最初のあたりは、その殆どがシンプルなプログラミング言語(概ねBASICの派生型)を使えるようになってたんだ。コンピュータとの対話ってのは、このプログラミング言語と密接に結び付いてたもんだから、コンピュータのユーザって奴は皆、その気があろうがなかろうが、プログラミング言語をたしなんでおく必要があったってワケだな。今じゃコンピュータは種類豊富で価格も安いよな。マウスでクリックするくらいで大体は事足りてる。と言っても、技術的な方面にまでやりたい事が向いちまうと「プログラミング無しの日常を」ってのはちょっと無理がある。まだ「プログラミング言語を学ばなくても何でも出来る」って世の中にはなってねーよな。


で、今だとウェブが発展してくれたおかげで、最新のウェブブラウザをインストールしてあるコンピュータには、みんなJavaScript用のプログラミング環境も備わってるよな。ユーザに技術的に複雑なことをアレコレ見せて悩ませない、ってのが基本的な考え方にあるから、大っぴらにJavaScriptが前面に出てくるコトは無いワケだが、ウェブページを使ってブラウザをJavaScriptのプログラミング学習用プラットフォームとして利用することは現実的に可能だ。で、それこそが今回のテキストでやりたい事の中身ってことになる。


憤せずんば啓せず。俳せずんば発せず。一隅を挙げて三隅を以って反(カエ)らざれば、則ち復(マタ)せざるなり - 孔子

【意味】

相手の気持ちが盛り上がってこなかったら、手をかしてやらない。
口元まで出かかっているのでなかったら、助け舟は出してやらない。
一つの隅を示しただけで、他の三つの隅にも鋭く類推をはたらかせるようでなかったら、
それ以上の指導はさし控える。

# 孔子の引用なので、英語を訳すかわりに原文を持ってきた!

このテキストはJavaScriptの説明の他、プログラミングの基本原則についての導入も兼ねたものにしようと考えてる。プログラミングは難しいよな、分かるよ。殆どの場合において基本ルールってのはシンプルで明快だ。だが、その基本的なルールが積み重なって作られるプログラムってコトになると、複雑なもんになっちまう。だから、プログラミングがシンプルになったり予想通りのものになったりすることは滅多にない。ドナルド・クヌース(プログラミングの世界の第一人者)が言うように、プログラミングは一種の芸術だ。


このテキストから何物かを得ようと思うなら、ただ受身で読む以上の姿勢が必要だぞ。頭を研ぎ澄ませ。例題を解く努力をしろ。そして本当に理解したと確信した場合にだけ、先に進め。


コンピュータプログラマは、彼だけに責任のある世界の創造者だ。
実質的に無制限の複雑さを持つ宇宙は、コンピュータプログラムによって創り出される。

ジョセフ・ワイゼンバウム、コンピュータ・パワー 人工知能と人間の理性

プログラムって言ってもイロイロあるよな。プログラマによってタイプされるテキスト、コンピュータにやらせたい事を指示する力、コンピュータのメモリ上のデータで、同一メモリ上で行われる処理を制御するもの。プログラムを俺たち馴染みのものと比較しようってのは、ちと無茶があるんだが、あえて言うなら機械かな。機械式腕時計の歯車は巧妙に組み合わされてて、時計職人の腕が確かなら、その時計は長年時間を正確に示すよな。プログラムもそんな感じで要素がカッチリ組み合ってる。で、プログラマが自分で自分が何をしているかわかってるなら、プログラムはクラッシュすることなくちゃんと動くってワケだ。


コンピュータってのは、これら無形の機械のホストの役割を果たすために造られた機械だと言えるな。コンピュータ自体は、愚直に命令されたコトを実行するだけだ。ヤツらがとても役立つ理由は、信じられないほど高速に処理を実行するってとこにある。プログラムってのは、単純な行動を巧く多数組み合わせるコトで、えらい複雑なコトだって出来ちまうんだぜ。


俺たちの中には、コンピュータプログラムを記述するってことが、魅力的なゲームだって思うようなヤツもいる。プログラムってのは、思考によって組み立てられたビルみたいなもんだ。そしてこのビルは建築費無料、重さナシ、そして俺たちの手によるタイピングで簡単に成長していくってシロモノだ。俺たちが一歩間違えると、そのサイズと複雑さは制御不可能になっちまう。そして、それは作った本人にとっても例外じゃない。コイツがプログラミングにおける主問題だ。これが今、沢山のソフトウェアがクラッシュし、エラーを出し、グチャグチャになっちまう理由だ。


キチンと動くプログラムってヤツは美しい。プログラミング術ってのは、複雑さを支配する技術だ。凄いプログラムってのは地味なもんだ。複雑なものを複雑に表現せず、シンプルにしてるってコトだな。


・・・・


最近のプログラマーの多くは、この複雑さを制御する処方箋として、プログラムでよく理解されている技術の小さなセットだけを使えばイイと思ってる。プログラミングの形式に対して厳しいルールを作って、その信者ともなると、そのルールを破るプログラマを駄目プログラマとして非難したりしやがる。


プログラミングにおける「豊かさ」ってものを何だと思ってやがるんだろうな!プログラムを単純で予想可能なものに落とし込もうとしたり、美しいものだろうと異様なものだろうと全てのプログラムにタブーを持ち込もうとするような事があるなんてふざけた話もあったもんだ。プログラミングの道は深い。誰も極めちゃいない、魅力的で多様な世界だ。確かに、未熟なプログラマをオソロシイ間違いに誘い込むって意味で、ありとあらゆる罠や落とし穴があるだろうな。だが、そうだとしても注意しなきゃなんねーコトは、「常に自分で考える」ってクセを忘れるなってことダケだ。学ぶ道には常に新しい挑戦がある。探検すべき新しい領域がある。探究心を失ったプログラマは、きっと停滞し、喜びを忘れ、プログラムをしようっていう意志を失っちまうだろう。(んで、マネージャになっちゃったりしてな)


オレに言わせれば、プログラミングの"明確な基準"ってヤツがが正しいかどうかなんてこたー、どーでもイイ。効率も明快さもサイズも重要な話だと思うよ。けどな、互いのバランスをどうやってとるか?ってのは常に、各々のプログラマが自分自身で判断すべきもんだ。経験則は役に立つよ。それは認める。だけど、慣習破りを恐れちゃ駄目だ。


おっと、なんか熱く語りすぎちまったな。。そろそろ本題に入るとするか。


・・・・


コンピューティングが誕生した当初は、プログラミング言語なんてなかったからな。プログラミングっていや、こんな感じだった。

00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000

コイツは1から10までを順に足し算して、その結果(1 + 2 + ... + 10 = 55)を表示するプログラムだ。ごくごくシンプルな構造のコンピュータを想定してる。初期のコンピュータでプログラムを組む場合、スイッチの並んだどデカい配列を必要に合わせてセットするか、レシートみたいな紙に穴をあけて、そいつをコンピュータに食わせるようなコトをしなくちゃならなかったんだぜ。こういうやり方がどんだけ退屈で、エラーを起こしやすかったか、想像つくよな?単純なプログラムを記述するのでさえ、多くのノウハウがあった。複雑なものを作るなんざ、ほとんど考えられなかったな。


まぁもちろん、ビット(上の例で見られる0と1の並びを一般にこう呼ぶ)のパターンを手入力するなんてワザが使えちまうワケだから、プログラマって言えばそりゃもう強力な魔法使いにでもなったような深い満足感みたいなものはあったと思うぜ。そんな感覚が仕事の満足感につながってた、ってのはあるだろうな。ハッカーになり損ねてきたオマエになら想像つくよな?


上で示したプログラムの各行には、それぞれ1つの指示が含まれてる。言葉に直すとこんな感じだ。


1. メモリ0番地に数字の0を格納せよ

2. メモリ1番地に数字の1を格納せよ

3. メモリ1番地にある値をメモリ2番地に格納せよ

4. 数字の11をメモリ番地2の値から減算せよ

5. メモリ番地2の値が数字の0であるならば、指示9の処理を続行せよ

6. メモリ番地1の値をメモリ番地0の値に加算せよ

7. メモリ番地1の値に数字の1を加算せよ

8. 指示3に行け

9. メモリ番地0の値を出力せよ


バイナリのスープより読みやすくはなったが、それでもまだスッキリしねーな。この状況を改善するには、指示文につけてる番号だの、メモリ番地だのの代わりに名前を使ってみるとイイかもな。

 Set 'total' to 0
 Set 'count' to 1
[loop]
 Set 'compare' to 'count'
 Subtract 11 from 'compare'
 If 'compare' is zero, continue at [end]
 Add 'count' to 'total'
 Add 1 to 'count'
 Continue at [loop]
[end]
 Output 'total'

ここまでくると、プログラムがどういう風に動くか?ってのを理解するのは、そんなに難しい話じゃなくなるだろ?最初の2行は2つのメモリ番地に対して初期値を与えてる。"total"はプログラムの結果を作るのに使われ、"count"は現在注目してる数字の経過を保持するのに使われてるってワケだ。"compare"を使っている行が、多分一番ワケワカラン部分だろうな。ここでプログラムがやりたい事ってのは、プログラムを止めちまってOKかドウかをチェックするために、"counter"が11になってるかを調べる、って処理だ。マシンが超原始的なおけげで、数がゼロであるかどうか?ってコトを調べて、その結果に応じて処理をジャンプするかドウかを決められるダケだから、話がややこしくなっちまってんだよな。っちゅーワケで"count - 11"の値を計算するのに"compare"ってラベル(名前)のつけられたメモリ番地を使ってる。んで、その値に応じて判断を下すワケだな。次にある2行は、結果に対して"count"の値を加算して、その後でプログラムが11に達していないと判断する限り1ずつ加算していく、って処理になる。


JavaScriptで書くとこんな感じになるぞ。

var total = 0, count = 1;
while (count <= 10) {
  total += count;
  count += 1;
}
print(total);

これで更に改善されたな。一番大事な改善点は、前後にとぶようなプログラムを書く必要が無い、ってコトだ。魔法の呪文"while"が処理してくれるからな。コイツは"count <= 10(つまり"count"の値が10以下)"と与えられた条件が続く限り、下に続く行に書かれてる命令を実行し続けるもんだ。見るからに分かるだろ?テンポラリの値を作って、そいつを0と比較するなんて処理をする必要はドコにも無い。まぁ、アホみたく細々した話っちゃーそうなんだが、プログラミング言語の力ってのは要するに、そういうアホみたいに細々した話をケアしてくれちゃうってトコにあるんじゃねーのかな。


んじゃ最後に、便利な演算"range" と"sum"を使った場合にはどんな感じになるか見てみるか。この演算はそれぞれ、指定された範囲にある数字を集める処理と、その集められた数字の合計値を求める処理になってるぜ。


print(sum(range(1, 10)));

ここまでの話から得られる教訓は、同じコトをするプログラムが、長くも短くもなれば、読みにくかったり読みやすかったりする、ってこったな。最後に紹介したプログラム(1から10までの間の数字の和を出力する)が殆ど英語のような表現になってるのと比べ、初期のプログラムってのは本当にワケワカランやつだった。("sum"だの"range"だの使ったように、プログラムをどうやって組み上げていくか?については、次回以降で学んでいくことになるから楽しみにしとけよ)


良いプログラミング言語ってモンは、抽象的な表現方法が使えるようになってる。プログラマにとってはそっちがイイからな。プログラマにとって興味を持ちにくい細々したトコロを隠蔽してくれ、便利な機能ブロック(さっき見たwhile構造みたいなの)を提供し、そしてほとんどの場合において、プログラマ自身で機能ブロック(sum だの rabge みたいなヤツな)が追加出来るようになってるもんだ。


・・・・


JavaScriptは、現在、ワールドワイドウェブ上のページでイロイロやりたい場合に一番使われてる言語だ。JavaScriptの次のバージョンでは、ウェブページ以外の場でも活躍が見込める重要な言語になるって主張してるヤツもいるぜ。まぁ、ホントにそうなるかオレは知らんが、もしオマエがプログラミングに興味があるなら、JavaScriptを学ぶってのは確かにオススメだぜ。たとえオマエが最終的にウェブプログラミングをあんまりすることにならなかったとしても、オレがこのテキストで見せる高難易度のプログラム達は、オマエの血肉となって他の言語でプログラムを書く場合に影響を与えるコトになるだろうぜ。


JavaScript を猛烈にdisったりするヤツいるよな。まぁ、そうした意見の多くは真実だと思うゼ。オレが初めてJavaScriptを使わなきゃならなかった時、直ぐにこの言語はクソだと思ったしな。オレが打ったコードは殆ど何でも受け入れてくれるんだが、意図したものと結果が全然違ったり。オレは何が悪いんだがワケが分からずイロイロ大変だったぜ。で、問題の本質もここにある。JavaScriptってのはあり得ないくらい寛大過ぎなんだよな。ちなみに、こういう設計になった背景には「初心者に易しく」ってのがあったみたいだ。実際のところは、システム側がプログラム上の問題を殆ど指摘してくれねーおかげで、それを見つけるのが難しくなっちまってるんだけどな。


だがな、言語の柔軟性ってヤツは利点でもあるぞ。厳格なプログラミング言語だと不可能な技術を使う余地があるってコトだからな。それにJavaScriptの欠点のいくつかは、言語の柔軟性によって克服出来る。キッチリ勉強し、しばらく仕事につかってみてから、オレはJavaScriptってイケてんじゃねーの?って思うようになったんだ。


・・・・


名前はJavaScriptって言っても、プログラミング言語のJavaとは殆ど無関係だ。名前が似てるのは単にマーケティング上の問題だしな。1995年に、JavaScriptがNetscapeから世に出たた際、Javaがかなり市場に出回って支持されてたから、マーケティング的に見て、こりゃ名前に取り入れるしかねーな、みたいなコトを誰かが考えたなろうな、、ってのは明白だ。今現在、おかげでオレ等はその名前に戸惑う羽目になっちまってるワケだが。。。


JavaScriptに関連性があるのはECMAScriptってヤツだ。Netscape以外のブラウザがJavaScript(あるいはそれモドキ)をサポートし始めた際、言語仕様についてのドキュメントが作られたんだが、そのドキュメント上に記述された言語が標準化の後、ECMAScriptって名前で呼ばれるようになったってワケだ。


ECMAScriptは多目的なプログラミング言語について記載してるもんであって、インターネットブラウザでこの言語を実装するコトについての言及は何も無いぞ。JavaScriptってのは、ECMAScriptにインターネットページやブラウザのウインドウを処理する為のプラスアルファを備えたもんだと思えばいいだろうな。


他にもいくつかECMAScript文書で記述されてる言語を使ったソフトウェアがあるぞ。一番重要なのは、Flashで使われてるActionScriptだな。コイツはECMAScriptがベースになってる。正確に標準準拠ってワケじゃねーけどな。ちなみに、Flashっつーのは、ウェブページを動かしたり音を出して賑やかにしたりする為のシステムだ。にたくさんの雑音を動かして、音を立てるものを加えるためのシステムだ。オマエがFlashムービーを作る方法を学んだコトあるなら、JavaScriptの学習は苦痛じゃないカモな。


このテキスト(元ネタの方)の執筆時点で、ECMAScript 4の作業が進行中だ。コイツはECMAScript言語の新しいバージョンで、いくつか新機能が加わるコトになる。が、新バージョンと比較してこのテキストが時代遅れのものになるんじゃ?なんて心配は要らないと思うゼ。そもそもECMAScript 4はその大部分が現在ある言語の拡張だからな。このテキストに書かれてる殆ど全てが使えるハズだ。加えて、全てのメジャーなブラウザが新たに加わった機能をサポートするまでには、たぶんかなりの間かかるだろうぜ。メジャーなブラウザでサポートされるようになるまでの間は、ECMAScript 4はウェブプログラミングで使えるってコトにはならねーよ。


・・・・


このテキストには大量のプログラムコードが入ってる。オレの経験から言わせてもらうと、コードの読み書きはプログラム学習において重要な部分だ。例として出ているコードは眺めるだけじゃなく、しっかり読んでちゃんと理解しろよ。そういう進め方は、最初はスローペースだと感じ、混乱しちまったりするコトもあるかも知れんが、なに、直ぐにコツを掴むさ。練習問題についても同じだ。動くコードを自分で書けるようになったのを確認しないまま、勝手に分かったと思わんようにな。


ウェブの仕組み上、他人のWebドキュメントに書かれているJavaScriptプログラムを見るのは常に可能だ。これは、何がドウなってるのか学ぶのに良い方法かも知れん。が、大部分のウェブプログラマは『プロの』プログラマーでないし、面白くないとかって理由でJavaScriptプログラミングをきちんと学んでないからな。ウェブ上で見かけるコードの多くは品質がかなり悪いだろうぜ。醜いコード、誤ったコードに悪影響を受けないように気をつけろよ。


・・・・


プログラムを実際に試用してみる為に、このテキストではコンソールってヤツを使うぜ。コレで例として書かれているコードも、オマエが自分で書いたコードも両方とも実行OKだ。最新のブラウザ(Internet Explorer版6以上、Firefox 1.5以上、オペラ9以上、Safari 3以上)を使ってるなら、スクリーンの底にバーが表示されるハズだ。ブラウザ画面下部の右端(Firefox なら"CONSOLE"って表示されてる)にある矢印をクリックするとコンソールが開くようになってるぞ。

訳者注:コレは元ネタのページ画面でしか実現できねーコトなんで、コードを実験的に動かすって部分についてダケは、元ネタ「Eloquent JavaScript」のページの方を併せ読みしながらチェックしてくれ。

コンソールは、3つの重要な要素から構成されてる。エラーメッセージやプログラムの実行結果を表示する出力ウインドウ、その下に表示されてる行がJavaScriptを入力するところだ。数字を入力し、それを実行するためにエンターキーを押してみろ。オマエが入力したテキストがJavaScript的に意味あるものであれば、出力ウインドウに表示されるだろう。んじゃ次に、間違った入力(例えば日本語の文字列とか)をしてエンターキーを押してみろ!出力ウインドウにエラーメッセージが表示されるハズだ。ちなみに、上矢印・下矢印キーを使って、タイプしたコマンドの履歴が辿れるぞ。


プログラムのコードが複数行のデカいもんになって、それをそのまま保持しておきたいような時には右側にあるボックス型のフィールドを使うとイイぞ。ちなみに"Run"ボタンは、このフィールドに書かれているプログラムを実行する際に使われるもんだ。同時に複数のプログラムを開くコトは可能だ。"New"と"Load"のボタンを使って新しいプログラムを追加するようにすればOKだ("New" なら空のファイル、"Load"ならウェブから取得したファイルを読み込む形になる)。プログラムが複数開かれている場合、"Run"ボタンの隣にあるメニューは、表示されるべきファイルを選択するのに使われるようになってる。そして"Close"ボタンは、オマエの予想通りプログラムを閉じる為のボタンだ。


このテキストにあるサンプルプログラムが書かれたボックスには、全て右上端に矢印が描かれた小さなボタンが用意されてる。コイツはそのプログラムを実行させる為のもんだ。(が、さっきも触れたが、本エントリ上で同じ機能を実現するのは無理なので、元ネタ「Eloquent JavaScript」の方で確認してくれ)


矢印をクリックして実行してみろ。ちなみにもう一つのボタンはプログラムをコンソールに流し込むのに使われるもんだ。遠慮なくサンプルプログラムを修正して、結果をチェックしてみろ。起こり得る最悪のケースは、エンドレスなループを作っちまうコトだな。"while"の条件で永遠に偽とならないようなものを作っちまった場合にそうなる。例えば、変数"count"に対して1の代わりに0を加えるような処理にしちまった場合とかな。そうなるとプログラムは永遠に動き続けることになっちまう。だがあんまり心配する必要はないぞ。ブラウザが動作してるプログラムを監視してくれてるからな。ラッキーだな、オマエ。処理にあまりにも時間がかかるような場合には、ブラウザの方から処理を中断するかドウか聞いてくれるようになってるぞ。


・・・・


次回以降、コードが書かれた大量のブロックから成るプログラムを扱っていくことになる予定だ。プログラムを動かす為に、ブロックに書かれたコードを全て1つずつ実行させるようなケースがしょっちゅうあるだろう。もう気付いたかも知れんが、ブロック内のコードが実行された後は、ブロック内にある矢印は紫色に変わるようになってる。テキストを読み進める際には、全てのコードを実行してみてくれ。特に何か新しいものを"define(これが何を意味するかは次回で触れる)"してるような場合にはな。


一回の勉強で1つの章を読み終えられるとは限らない、ってのは勿論あることだな。これは、途中から続きを始めるような事もあるって事だ。だが、各回にある全てのコードを最初から実行していない場合、うまく動かないプログラムもあるだろう。そういう場合は、コードの書かれたブロック上にある"Run"矢印を押している間、シフトキーを押すことで、それより以前のブロックも実行されるようになる。だから、各回の途中から始めたい場合は、先ず最初のコードを実行する際にシフトキーを押すようにしろ。そうすりゃ全てが期待通りに動くようになるからな。


・・・・


ああ、それから最後に。このテキストの文章で何か間違いとか気になるところがあった場合、それは多分訳者の問題だろう。だから、くれぐれも先走って元ネタ「Eloquent JavaScript」の作者であるMarijn Haverbeke氏に「(゜Д゜)ゴルァ!」すんじゃねーぞ。そんなオマエにはオレが「(゜Д゜)ゴルァ!」だ。


それじゃこれから気合入れて行くぞ!!

さぁ、声を出せ!


Go! ニコガク、Go!!


次回につづく

作者:hamatsu1974

更新日:2008年11月20日 6時6分

このブログのホーム

[日々の雑感とか]ToDo のメモとか。。


数学ガールのコミックスが23日に発売になるらしい。数学のように文字数の多いネタをマンガにまとめ上げるワザは、今後のエントリ作成の上でもかなり参考になると思うので、来週からの日本出張で是非ゲットしてみたいと思う。

f:id:hamatsu1974:20081119184303j:image

マンガで数学と言えば、尊敬する小島寛之さんが監修しているらしい萌え系(?)の数学本があるらしい。それもチェックしてみよう(買うかドウかは値段とボリュームを見てから考える)。


マンガでわかる微分積分

マンガでわかる微分積分

似た系統でここら辺も評判イイらしい。

マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 回帰分析編

マンガでわかる統計学 因子分析編

マンガでわかる統計学 因子分析編

それから絵の描き方で参考になりそうなハウツー本もいくつか買っておきたいな。

手塚治虫のマンガの描き方 (手塚治虫漫画全集 (399別巻17))