3章 プリミティブと参照

この章は変数についてです。

プログラミングマグネット

これらの材料で、

int y = 0;

ref = index [y];

islands [0] = "Bermuda";
islands [1] = "Fiji";
islands [2] = "Azores";
islands [3] = "Cozumel"; // この行はテキストでは islands [3] == "Cozumel";と誤記?

int ref;
while (y < 4){

System.out.println(islands [ref]);

index [0] = 1;
index [1] = 3;
index [2] = 0;
index [3] = 2;

String [] islands = new String [4];

System.out.print("island = ");

int [] index = new int [4];

y = y + 1;

class TestArrays{
public static void main(String [] args){

下のような結果にせよということです。

f:id:nehalemv:20120324141715p:image

今回は、材料を眺めていておおよそ見当がつきました。
以下のように並べました。

class TestArrays{
	public static void main(String [] args){
		
		String [] islands = new String [4];
		islands [0] = "Bermuda";
		islands [1] = "Fiji";
		islands [2] = "Azores";
		islands [3] = "Cozumel";
		
		int [] index = new int [4];
		index [0] = 1;
		index [1] = 3;
		index [2] = 0;
		index [3] = 2;
		
		int y = 0; // [miss1of2] この行をwhileの内に入れるミス
		
		while (y < 4){
			int ref; //テキストでこの行はwhileの上にある
			ref = index [y];
			
			System.out.print("island = "); // [miss2of2] System.out print と記述
			System.out.println(islands [ref]);
			
			y = y + 1;
		}
	}
}

二度ほどのミスで完成できました。

プールパズル

四分の二はできましたが、四分の一はたどり着けず、残りの四分の一は、よく分からない感じです。
この結果を、

f:id:nehalemv:20120324164633p:image

このコードで導きます。

class Triangle{
	double area;
	int height;
	int length;
	
	public static void main(String [] args){
		int x = 0;
		Triangle [] ta = new Triangle [4];
		
		while(x < 4){
			ta [x] = new Triangle();
			ta [x].height = (x + 1) *2;
			ta [x].length = x + 4;
			ta [x].setArea(); // 下のvoid setArea()内やここをどう書くかが浮かばなかった
			
			System.out.print("triangle " + x + ", area");
			System.out.println(" = " + ta [x].area);
			x = x + 1;
		}
		int y= x;
		x = 27;
		Triangle t5 = ta [2]; // いきなり t5 って何??
		ta [2].area = 343;
		System.out.print("y =" + y);
		System.out.println(",t5 area = " + t5.area); // ここの以上5,6行の意味がよく分からない
	}
	void setArea(){
		area = (height * length) / 2;
	}
}

それ以外はだいたい分かりました。

2章 クラスとオブジェクト

複数のクラスを用いて、テストクラスにmain()メソッドをおいて実行することをくりかえします。
アーロンチェアほしいです。

プールパズル

前回のエントリで引用したブログには、「P47には間違いの指摘があるが、正誤表には載ってない」とありました。

f:id:nehalemv:20120323174238p:image

こう実行されてば正解です。
whileとifの条件をどういじれば、e2.countの最終値を10にできるのかで悩みました。
他は凡ミスが一つ。
こういう条件の試行錯誤って、みなさんどうされてるんですかね。

public class EchoTestDrive{
	public static void main(String [] args){
		Echo e1 = new Echo();
		Echo e2 = new Echo();
		int x = 0;
		while(x < 4){
			e1.hello();
			e1.count = e1.count + 1;
			if(x == 3){
				e2.count = e2.count + 1;
			}
			if(x > 0){
				e2.count = e2.count + e1.count;
			}
			x = x + 1;
		}
		System.out.println(e2.count);
	}// while内の繰り返しで、↑で最後に出力される e2.count の値が決まる
}

class Echo{
	int count = 0;
	void hello(){
		System.out.println("helloooo...");
	}
}

私は誰でしょう

  • 「オブジェクトに」似ているが厳密には違う意味を持つ
    • クラス
  • クラスを基に作る
    • オブジェクト
  • 設計図の役割を果たす
    • クラス
  • クラスの持つ機能
    • メソッド
  • プログラムをユーザーに提供する際には、結局これを提供することになる
    • ×クラス
  • クラスの持つ情報
  • 他のオブジェクトから呼び出される
    • ×メソッド
  • クラスは他のクラスからこれを継承できる
  • ヒープに格納される
    • ×オブジェクト
  • インスタンスとも呼ばれる
    • オブジェクト
  • オブジェクトごとに値が異なる
  • レシピに似ている
    • クラス
  • メソッドによって値を変更できる

1章 Javaの世界に飛び込もう

Head First Java 第2版 ―頭とからだで覚えるJavaの基本

Head First Java 第2版 ―頭とからだで覚えるJavaの基本


スタートです!
jsのときもそうだったのですが、;を打つタイミングがイマイチ分かってないですね。
…と書いたところで、説明を見つけました。各ステートメントの末尾ですね。

BeerSong

初コンパイル&実行です。

public class BeerSong{
	public static void main (String [] args){
		int beerNum = 99;
		String word = "bottles";
		
		while (beerNum > 0){
		
			if (beerNum ==1){
				 word ="bottle";
			}
			System.out.println(beerNum +" "+ word + "of beer on the wall");
			System.out.println(beerNum +" "+ word + "of beer.");
			System.out.println("Take one down.");
			System.out.println("Pass it around.");
			beerNum = beerNum -1;
			
			if (beerNum > 0){
				System.out.println(beerNum +" "+ word + "of beer on the wall");
			}else{
				System.out.println("No more bottles of beer on the wall");
			} //else end
		} // while end
	} // main end
} // class end

コマンドプロンプトを立ち上げ、

f:id:nehalemv:20120321171209p:image

幾度かのエラーを修正すると、コンパイルできました。
実行。

f:id:nehalemv:20120321171204p:image

成功b

PhraseOMatic

ふたつめ。
配列の中から単語をランダムで選んで表示させるもの。
ビジネスなワードですね。

public class PhraseOMatic{
	public static void main (String [] args){
		
		String [] wordListOne ={
			"24/7","multi-Tier","30,000 hoot","B-to-B","win-win","front-end","web-based","pervasive","smart","six-sigma","critical-path","dynamic"
		};
		String [] wordListTwo ={
			"empowerd","sticky","value-added","oriented","centric","distributed","clustered","branded","outside-the-box","positioned","networked","focused","leveraged","aligned","targeted","shared","cooperative","accelerated"
		};
		String [] wordListThree ={
			"process","tipping-point","solution","architectre","core competency","strategy","mindshare","portal","space","vision","paradigm","mission"
		};
		
		int oneLength = wordListOne.length;
		int towLength = wordListTwo.length;
		int threeLength = wordListThree.length;
		
		int rand1 = (int) (Math.random()*oneLength);
		int rand2 = (int) (Math.random()*towLength);
		int rand3 = (int) (Math.random()*threeLength);
		
		String phrase = wordListOne [rand1] + " " + wordListTwo [rand2] + " " + wordListThree [rand3];
		
		System.out.println("What we need is a " + phrase);
	}
}

これをコンパイル。

f:id:nehalemv:20120321180104p:image

単語の間のスペースが欠けていたので修正。

f:id:nehalemv:20120321180103p:image

プールパズル

一時間ぐらい悩んで結局正解を見てしまった、穴埋めパズル。
これが解答ソース

class PoolPuzzleOne{
	public static void main(String [] args){
		int x = 0;
		
		while(x < 4){
			System.out.print("a");
			if(x < 1){
				System.out.print(" ");
			}
			System.out.print("n");
			if(x > 1){
				System.out.print("oyster");
				x = x + 2;
			}
			if(x == 1){
				System.out.print("noys");
			}
			if(x < 1){
				System.out.print("oise");
			}
			System.out.println("");
			x = x + 1;
		}
	}
}

しかし、これで実行するとこうなります。

f:id:nehalemv:20120322160418p:image

解答としては、

a noise
annoys
an oyster

と表示されなければいけません。
Head First Labs from O'Reilly Media, Inc. :: Head First Java, Second Edition
こちらで入手できるファイルにも、この設問の解答ファイルはありません。
よって、手打ち入力が正しいということにします。

ルールでは、選択肢のコードの複数回使用を禁じています。
すべてのコードを使う必要はないようです。

問題は『三行目に半角スペースを入れるかどうか』です。
一行目に半角スペースのコードは使ってしまっています。
三行目にも半角スペースを入れるのなら、一行目で発生させた半角スペースのコードを『再利用』する形で実現を目指すのだろうと考えました。
ということは、xに入っている値を下げたり上げたりするのだろうと思いました。
しかし、今回の設問制約の中で考えていくと、どうも難しい。
しぶしぶ解答をみて手打ちしたところ、半角スペースがうまくいかない。
検索してみるとこんなページが。

P24 プールパズルの解答の実行結果が違う
どうしても解けなかったのでみたら、そもそも問題が間違ってるという仕打ち。

a noise
annoys
an oyster

が、本での出力結果だが、解答をプログラムして実行すると、

a noise
annoys
anoyster

間違ってる問題を正しく答えるのは無理だ。

駆け出しプログラマーのJava奮闘記 Head First Java5章までの感想
┌┴┐┌┴┐┌┴┐ -┼-  ̄Tフ ̄Tフ __ / /
  _ノ   _ノ   _ノ ヽ/|    ノ    ノ       。。
       /\___/ヽ
    /ノヽ       ヽ、
    / ⌒''ヽ,,,)ii(,,,r'''''' :::ヘ
    | ン(○),ン <、(○)<::|  |`ヽ、
    |  `⌒,,ノ(、_, )ヽ⌒´ ::l  |::::ヽl  
.   ヽ ヽ il´トェェェイ`li r ;/  .|:::::i |
   /ヽ  !l |,r-r-| l!   /ヽ  |:::::l |
  /  |^|ヽ、 `ニニ´一/|^|`,r-|:「 ̄
  /   | .|           | .| ,U(ニ 、)ヽ
 /    | .|           | .|人(_(ニ、ノノ

JavaScriptの業務スキルレベル 判別表 (5段階)

ふと思ったので、今の段階でさらっと確認してみます。
JavaScriptの業務スキルレベル 判別表 (5段階) - 主に言語とシステム開発に関して
○ == その設問で求められることに応えられる
× == 無理だなと理解できる
? == そもそも理解できない段階である

(0)非 JavaScript 開発者

JavaScriptの事を「ジャバ」と呼んでいる。
× ジャバスクリプト。
画面上で物が現れたり消えたりするのを指して「Ajax」と呼んでいる。
× 呼んではいないですけど、似たものかと思っています。
JavaScriptの事を,「Javaスクリプト」とか「JAVAスクリプト」と表記している。その表記だと完全に別物の言語を指す,ということを知らない。
○ 表記はjavascriptJavascriptにしていました。別物の件は知りませんでした。

(1)初学者(入門書を学習してゆく段階)

JavaScriptは,ちょっとさわった事ならばある。
if,for,while,switch,break,continue,function などの基本的な制御構文は,何も見ないで書ける。
× 何も見ずには無理です。"continue"は初めて見ました。
ネット上で拾ったライブラリやサンプルコードを自分で流用する時に,パラメータの部分(数値とか)を変えて,少しだけカスタマイズして使う事ができる。
○ いまcodecademyで近いことをしています。ただオリジナルサイトにコピペをするというものではないです。
HTMLの地の文の中に処理そのものをベタで書いたり,jsファイルの中に関数をそのまま並べて書く,というコーディングスタイルだ。
○ そうですね。
document.getElementById() という関数を使ったことがある。しかし,DOMについては何も知らない。
○ 何度か使いましたが、この関数についての詳細は…DOMについてはさらっとやりました。
バグをなくすために,「バグが出たプログラムに対して,あちこちに alert() を埋め込んで確認する」という方法を主に取っている。
○ 変数がおかしくなる位置を把握するために、そういう手法があるみたいですね。
alert() と書けばアラートを表示できる,ということは知っている。しかし,そのalertというメソッドをどのオブジェクトが持っているのかは知らない。
○ そうですね。標準オブジェクトがどうこう、とは読みました。
for文を書く際,for( var i = 0; … とせず,for( i = 0; … というようなコードを平気で書く。グローバル汚染の認識がない。
○ forに入る前に上でvar i = 0;と書いておけばいいのかなと思ってました。グローバル汚染…!?(白目
document.all や document.form といったコードを書く。
× まだ使ったことないです。
インデントが3や4を超えるような,保守性の悪いコードを平気で書く。(例えば,functionの中のforループの中のif文の中にさらにループを書くとか)
○ 書いたことはないですが、そのくらいは普通かと思ってました。
どこに書いてあるスクリプトがどのタイミングで実行されるか,あまりよくわかっていない。
○ よくは分かっていないけど、それがこわいので、初見のコードをジロジロ追いかけて把握しようとはします。どういう要素があると実行されるのかは、なんとなく分かりますが、全て把握はしてないですし、どういう見方をすれば漏れなく実行タイミングを把握できるのかが分かってません。
HTMLを書く際,tableタグの中にtbodyタグが無いとJavaScriptの動作上困る,ということの理由が分からない。
× ええ?まだtableタグとJavaScriptを合わせたことがないですね。
本屋や書店で,JavaScriptの本がJavaのコーナーの棚に陳列されているのを目にしても,特に憤りを覚えはしない。
× 「エンジニアの人から見ると苛立つんだろうな」とおぼえますね。
Firebugというものを何となく知っているが,それでも「もし作っている物の対象ブラウザがIEだけなら,わざわざfirefoxを立ち上げてfirebugを使う必要性はない。」と考えている。
× 単語は初耳です。ブラウザチェックの話ですね。

(2)ノーマル(基礎的な知識があり,ある程度の動くものを作れるようになった段階)

JavaScriptで,プロトタイプベースのOOPができる。
? ええ?おっぱっぴー?!初耳なような…
つまり,自分で独自に定義したJSON形式のオブジェクトを new して,そこで生まれるインスタンスたちに仕事をやらせる,というコーディングスタイルである。
JavaScriptでは全てが連想配列である,という事を知っていて説明できる。
ある程度DOM操作ができる。DOM Event(例えばDOM Level 2 Event Model)についてはあまり知らない。
×
DOM要素に対し,各種イベントをセットして,画面に動的なしかけを埋め込む事ができる。
× Ajaxの部分でありましたが、まだちょっと無理だなと思いました。
しかし,複数の要素に対して色んなイベントのコードをバラバラに記述しているので,次第にイベント周りのコードがめちゃくちゃになり,画面の挙動が理解不能になってしまう。(つまり,個々のイベントリスナ関数をバラバラに記述しており,1つの管理オブジェクト内にまとめて定義していない。)
jQueryprototype.jsを並存させるためには「(function( $ ){ 〜 })( jQuery )」のように記述する必要があるわけだが,このコードの意味を理解できる。
JavaScriptで,正規表現を使いこなせる。
× パッと見、暗号みたいですよねこれ。
JavaScriptからのCookieの読み書きに慣れている。
静的CSSの作成だけでなく,動的なCSS操作もまあできる。つまり,CSSプロパティをJavaScriptから動的に変える事により,静的CSSの限界を補うことができる。
× hover表現をCSSではなくJavaScript側で操作するというときに触れました。なるほどでした。
JavaScriptはマルチスレッドだと思っている。
thisというキーワードを日常的に使ってコーディングできる。つまり,JavaScriptでオブジェクトをまともに利用できる。thisが文脈依存である事は何となくだけ知っている。
○ なんとなく。
無名関数/クロージャを日常的に使ってコーディングできる。その詳しい効用は分かっていない。
JavaScriptの変数には,参照と実体の2種類があるという事を理解している。それを理解していないと問題が起こる,という事を人に説明するための短いサンプルコードを作れる。その点を図を使って人に説明できる。
× よく使うプロパティやメソッドはprototypeに保存して参照するようにして、同じものをいくつも生産するべきでない、という話は理解しました。
function f( x, y ) という関数を定義したときに, f( 1 ) のように呼び出し時の引数の数が少なかったり, f( 1, 2, 3 ) のように呼び出し時の引数の数が多かったりする場合の挙動がどうなるのか,理解していない。そういった仕様がどう役立つのかわからない。だから,「arguments」というオブジェクトの使い方もよく知らない。
×
配列中の要素を順番に操作する時に,for文やwhile文を使ってスキャンするのが間違っており,オブジェクト指向として正しくない,という事を説明できる。かわりに,いつも map(),each(),select() などのイテレータメソッドを使ってコーディングしている。
× 複数の引数をとる関数には触れましたが、呼び出し側でそういうことをした場合のあれこれは全然知りません。
例外オブジェクトやthrow文を使ったコード設計が具体的にどういう時に必要になるのか,よく理解していない。
Firebugで,デバッグやレイアウト調整まではできる。
「DHTML」という死語をいまだに口にすることがある。
XmlHttpRequestを自由自在に使いこなせてはいない。
JavaScriptを使って複雑なHTMLを動的に生成しなければならず,面倒だと感じることがよくある。または,サーバ側のCGIのコードと全く同じようなロジックを,JavaScriptのコードでも書かなければならず,二度手間・二重管理になってしまう。
scriptタグの中身は,<-- --> などでコメントアウトする。その場合に生じる不具合を知らない。
JavaScriptの自動単体テストの方法を知らないので,品質の保証されたコードを書くことができない。ある程度手動で試験を行なうが,そのために,素早い仕様変更に対応することを難しく感じている。

(3)中級者(開発プロジェクトで1人月としてカウントできる水準)

JavaScriptでやりたい事は,JavaScriptでほぼ実現する力を持っている。(外部仕様が渡されたら,とりあえず完成にこぎつけられる。ただし,内部仕様と工数は度外視している。)
×
Prototype.jsjQueryなどのライブラリを渡されたら,中身のコードを自力で追って動作を理解したり,動作を軽く修正する事まではできる。
Prototype.jsjQueryのような汎用ライブラリの上で動作するプラグインを,必要なら自作できる。
thisというキーワードを使ってコーディングできる。thisのコンテキストがわかり,自分でコンテキストを変更する方法も知っている。
×
JavaScriptで,クラス(プロトタイプ)の継承ができる。(ライブラリを使わない)
×
メインの関数を作るとき,当然,引数はJSONにする。その理由を説明できる。
無名関数/クロージャを使わないとJavaScriptのコーディングが困難である,という事を知っており,遅延評価について説明できる。
inというキーワードを使ってコーディングできる。配列に対してinを使ってはならないという事を知っており,inが必要になる局面を具体的に例をあげて説明できる。
×

:argumentsというキーワードを使ってコーディングでき,どう役立つのか説明できる。
:?

Ajaxのおかげでビューの製造工程をDRYにできる,という事を説明できる。
XmlHttpRequestをラップするようなライブラリを日常的に使っている。なので,自分にとってAjaxは,空気や水のような存在であると言える。
Firebugで,XmlHttpRequestのレスポンスの中味を見たり,XPathの調査やパフォーマンス計測(プロファイル)ができる。
alertやconfirmがDOM構造に属さない特殊な存在であり,イベント発動処理に際して問題を引き起こす可能性がある事を知っているので,取扱いに注意している。
ブラウザ間でJavaScriptの動作にどのような差異があるのか,と尋ねられたら,5〜6個程度ならばその場ですぐに言える。
「サイ本」とは何か理解しており,内容もだいたい把握している。
×
ドラッグ&ドロップやアコーディオン,タブ,ツリー型メニュー,カレンダーなどのUIを,既存のライブラリの組み合わせですばやく作成できる。エフェクトのかけ方にも慣れている。
×
(4)上級者(メインPG/メンターとして,主設計を任せられる水準)
(任意の)やりたい事は,JavaScriptでほぼ実現する力を持っている。
×
IEやOperaで,Firebugと同じようなことができる。
×
不明点が発生したら,ECMA Scriptの仕様書の該当箇所から,ブラウザの動作を説明できる。
ブラウザ間でJavaScriptの動作にどのような差異があるのか,ほとんどの相違点とクロスブラウザ対策実施方法を把握している。
×
JavaScript単体テストツールを利用できる。アプリケーション内のJavaScriptモジュールを,チームで網羅的に単体テストする事ができる。
×
Prototype使い達がprototype.jsを好む理由がわかっており,自分も同感している。 同時に,Visual StudiojQueryが正式サポートされるに至った理由を知っており,自分も同感している。 同時に,両ライブラリのデメリットを客観的に語れる。
Prototype.jsjQueryのような汎用ライブラリを,必要なら自作できる。
単なるプログラミング一般の高速化ではなく,JavaScript特有の,高速化のためのセオリーを理解している。
typeof演算子やinstanceof演算子を使いこなし,その必要性も理解している。
JavaScriptのコーディングをせずにJavaScriptを使った開発を進めて行く,という手法を有効活用している。サーバサイドでjsコードのラッパの役目をするDSLを組むなど。
DOM Level 2 Eventsについて熟知しており,createEventやdispatchEventをクロスブラウザで扱うための方法を理解している。それらがなぜ必要なのかも説明できる。
デザインパターンアーキテクチャパターンの概念を,(完全に等価ではないとしてもアナロジーとして)自分なりにJavaScriptでの設計に取り入れ,そのメリットを一貫性を持って人に説明する事ができる。それらを実際にプロジェクトで利用している。
サーバ側がDAOの役目さえ果たしてくれれば,アプリの残り全体はJavaScriptだけで一人で書ける。
しかし,実際にそうしない根拠も説明できる。
JavaScriptの最前線の動きを常にウォッチしている。
×
JavaScriptを要件に応じて適切に難読化・暗号化・圧縮できる。
×
有用なJavaScriptライブラリやAPIのストックが多い。さらに,そのストックが自分の中で絶えず増えて行くような,何らかのルーチン/仕組みを持っている。

(補足)JavaScriptに対する意識/認識に関わる項目

自分の環境で .js ファイルをダブルクリックした時に,エディタは立ち上がらない。その .js ファイルはその場ですぐに「実行」される。
ブラウザ上の煩雑な作業は,ブックマークレットGreasemonkeyでスクリプトを自作する事によって自動化している。(スクリプトの言語はJavaScript

ブラウザ上の煩雑な作業は,ActiveX/COM経由でIEを操作する事によって自動化している。例えばWebスクレイピングなど。(言語は問わない):?

ブラウザ上の煩雑な作業は,FirefoxのXPIプラグインを自作する事によって自動化している。(言語はJavaScript
デスクトップ上の煩雑な作業は,WSHやWSFやHTAでスクリプトを自作する事によって自動化している。(スクリプトの言語はJScript
エディタ上の煩雑な作業は,マクロを自作する事によって自動化している。(マクロの言語はJScript
時折,コマンドプロンプトから直接JScriptを実行する。
JScript.NETかHTAを使った業務アプリケーション開発案件の経験がある。
自作のスクリプトを利用する事によって,任意のWebサイトの動作を自由に改変する事ができるので,「このWebサイトは不便だ」という概念を持っていない。
Google Maps APIを使って,有用なサービスを短時間で構築できる。もしくは,excanvas.jsを使えるので,Flashがいらない。
VBScriptの可能性を追求したあげく,実用上使い物にならないことを悟り,VBScriptを捨てたという苦い思い出がある。
node.jsなどのライブラリを使って,サーバサイドJavaScriptアプリケーションを作成できる。

Codecademy

レッスンとプロジェクトの対を順にやりたくなりますが、まずレッスンだけこなしちゃうのがいいですかね。

l

iPad

f:id:nehalemv:20120317212454j:image:w360
買いました!
これからよろしくね。

iTunes U

l

村井先生の説明は平易で分かりやすいです。
インターネット 2010 - Download free content from Keio University on iTunes

iTunes Uにある日本の大学を確認してみました。

授業をたくさん提供してるのは東大京大慶大、ほかは単講演の収録、大学・学部紹介、学内受講生用の参考映像という印象です。