VMware PlayerでLAMP環境構築(1)

やっぱりLinuxは使えないといけないなということで、VMware Playerを使用して仮想マシン上でLAMP環境を構築したので以下手順メモです。

●ホストOS:Windows7 64bit
VMware Player:version 4.0.2
Ubuntu Japanese Team:Ubuntu11.10(ubuntu-ja-11.10-desktop-i386.iso)

VMware Playerのインストール

以下のリンク先に行き「ダウンロード」をクリック。
VMware ダウンロードページ

ダウンロードするにはユーザー登録が必要なので未登録であれば登録を行います。
登録したメールアドレスにダウンロード先のリンクが貼られているのでクリックします。

Windowsにインストールするので一番上のWindows用の「ダウンロード」をクリック。

ダウンロードしたインストーラーを起動してインストール作業を行います。
「次へ」をクリック。

インストール先を指定して「次へ」。

「次へ」。

チェックがついたままだと何らかのデータがVMwareに送られるらしいです。いやならチェックを外して「次へ」。

お好みでチェックを入れて「次へ」。

「続行」をクリック。

セットアップはこれで完了なので、「今すぐ再起動」をクリック。

再起動後に以下のダイアログが表示されるので内容をよく読み同意を選択して「OK」をクリック。

新規仮想マシンを作成するので「新規仮想マシンの作成」をクリック。

「後でOSをインストール」にチェックをして「次へ」をクリック。
今後新しくOSを入れる時も、この手順です。

UbuntuをインストールするのでゲストOSで「Linux」を選択し、バージョンは「Ubuntu」を選択して「次へ」。

仮想マシン名」は任意で好きな名前を付けれます。
「場所」で作成したフォルダや参照したフォルダにLinux本体やデータが格納されます。
以下の様に設定しました。

場所

C:\VMware\Ubuntu

ディスクの最大サイズを指定します。Ubuntuの推奨サイズは20GBになっています。今回は50GBを指定しました。
「仮想ディスクを単一ファイルとして格納」を選択して「次へ」をクリック。

「ハードウェアをカスタマイズ」をクリック。

以下のダイアログが表示するので各ハードウェアの機能を設定します。「メモリ」や「プロセッサ」等、使っているPCのスペックと比較しながら設定をしていきます。
今回は以下のように設定しました。
「メモリ」 → 1GB
「プロセッサコア」 → 1
その他の機能は特に変更していません。(設定は後で変更できます。)

設定が終われば完了して仮想マシンウィザードを終了すると以下の様な仮想マシンが設定されます。

Ubuntuのインストール

以下のサイトからUbuntu Linuxのイメージファイル(ubuntu-ja-11.10-desktop-i386.iso)を任意のフォルダにダウンロードします。CD-Rにデータを焼く必要はありません。
http://www.ubuntulinux.jp/

VMware Playerと仮想マシンを起動して「仮想マシンの再生」をクリック。

以下の画面が出てきて途中で何回か質問が出てきますが、そのまま「Enter」キーで先に進めます。最終的にインストールが失敗するので画面下の「CD/DVDの設定を変更」をクリックします。

以下のダイアログが表示するので、「ISOイメージファイルを使用する」から先ほどダウンロードしたイメージファイル(ubuntu-ja-11.10-desktop-i386.iso)を選択して「OK」をクリック。

Ubuntuのインストールが開始します。
Ubuntuをインストール」をクリック。

「続ける」をクリック。

「ディスクを削除してUbuntuをインストール」を選択して、「続ける」をクリック。

「インストール」をクリック。

以降、地域設定やユーザー設定など設定を終わらせ後は以下の画面になるまでインストールが終わるのを待ちます。以下の画面になれば再起動をクリックします。

その後、何かキーを押して以下の画面が表示されれば、下に出ている「インストールを完了しました」をクリックして、Ubuntuのインストールを終了します。

VMware-Toolsのインストール

上部のメニューバーにある「仮想マシン」から「VMware Tools」のインストールをクリック。

1. ファイルが開くので「VMwareTools-8.8.2-590212.tar.gz」をダブルクリック → 圧縮ファイルが開くのでその中の「vmware-tools-distrib」をユーザーのホームディレクトリに展開します。

2. 圧縮ファイルがホームディレクトリに展開されるので、「Dashホーム」 → 検索窓に「terminal」と打ち込んで、端末を起動する。

3. 端末が開いたら以下のコマンドを実行して圧縮ファイルのフォルダまで移動して、インストールを実行します。

cd vmware-tools-distrib
sudo ./vmware-install.pl

パスワードの入力が求められるので、ログイン時のパスワードを入力してください。

4. vmware-toolsのインストールが始まります。途中かなりの回数で質問がありますがそのままEnterキーを押してください。最終的に現在のディレクトリが表示されていて処理が止まっていればインストールは終了なので一度Ubuntuをシャットダウンします。

WindowsUbuntuに共有フォルダ/ディレクトリを作成

今回はC:\VMware\shareを共有フォルダ/ディレクトリにしました。
最初にC:\VMware\shareを作成して、VMware Playerを起動します。
メニューバーの「仮想マシン」 → 「仮想マシンの設定」を選択し、左上のオプションからフォルダの共有を「常に有効」にして、フォルダの「追加」をクリック。

「ホストパス」を参照からC:\VMware\shareを選択して名前を決めて「次へ」。

共有フォルダの属性を「共有する」にして「完了」をクリック。

これで共有フォルダの設定は完了です。Ubuntuの端末を起動して「mnt/hgfs/share」にディレクトリが存在するか確認するため、以下のコマンドを入力します。

cd /mnt/hgfs/share
touch test.txt

Ubuntuの「mnt/hgfs/share」とWindowsの「C:\VMware\share」のフォルダの中にtest.txtが作られているはずです。

以上でVMware PlayerにUbuntu Linuxをインストールする作業は完了です。次はこの環境の中にApache, MySQL, PHPをインストールします。

Java -- 例外処理

Javaではコンパイル時に発生するコンパイルエラーと実行時に発生する実行時エラーがあります。例外処理とは実行時に発生するエラーに対して別途記述した処理を行わせることです。

try〜catch

例外処理の基本構文
try {
	例外の発生を調べる文;
	.....
}
catch {
	例外が起きた時に調べる文;
	.....
}
サンプル

以下のサンプルは配列要素を超える数を代入して例外を発生させています。

public static void main(String[] args) {
	try {
		int[] test = new int[5];
		test[10] = 80;
		System.out.println("test[10]に80を代入しました。");
	}
	catch(ArrayIndexOutOfBoundsException e) {
		System.out.println("配列の要素を超えています");
	}
	System.out.println("無事に終了されました");
}

結果

配列の要素を超えています
無事に終了されました

処理の流れとしては
1. tryブロック中で例外が起きると、そこで処理を中断。
2. 例外がcatchブロックの()の処理と一致していれば、catchブロック内の処理を行う。
3. catchブロックが終われば、そのtry〜catchブロックの後から処理が続く。

finallyブロック

finallyブロックは例外の有無にかかわらず、そのメソッド内で最後に必ず処理が行われるブロックです。なのでそのメソッド内で必ず行っておきたい重要な処理はfinallyブロックの中に記述しておかなければいけません

finallyブロックの基本構文
try {
	例外の発生を調べる文;
	.....
}
catch {
	例外が起きた時に調べる文;
	.....
}
finally {
	必ず最後に処理する文;
	.....
}
サンプル

以下のサンプルは上記のサンプルにfinally文を足しています。

public static void main(String[] args) {
	try {
		int[] test = new int[5];
		test[10] = 80;
		System.out.println("test[10]に80を代入しました。");
	}
	catch(ArrayIndexOutOfBoundsException e) {
		System.out.println("配列の要素を超えています");
	}
	finally {
		System.out.println("最後に必ずこの処理を行います");
	}
	System.out.println("無事に終了されました");
}

結果

配列の要素を超えています
最後に必ずこの処理を行います
無事に終了されました

必ずfinallyブロック内の処理が行われています。

Java -- 継承・オーバーライド

継承

新しく拡張したクラスが既存のクラスのメンバを受け継ぐこと

サブクラスの宣言
class サブクラス名 extends スーパークラス名 {
	サブクラスに追加するメンバ
	サブクラスのメソッド(引数リスト) {
		.....	
	}
}

元になる既存のクラスはスーパークラスで新しいクラスはサブクラスとなります。
サブクラスでは継承したスーパークラスのフィールド、メソッドをすべて扱うことができます。
サブクラスはいくつでも作れるが継承は一つのクラスからしか出来ない。つまり、スーパークラスは一つしか持てないと言うことです。

オーバーライド

サブクラスで新しくメソッドを記述するときは、スーパークラスと同じメソッド、引数の数、型をもつメソッドを定義することが出来る。
サブクラスのメソッドが、スーパークラスのメソッドに代わって機能することです。

オーバーライドの例
class A {
	void calc(int i) {
		int x = i * 10;	
	}
}
class B extends A {
	void calc(int i) {
		int x = i * 10;
		System.out.println(x);
	}
}

1. スーパークラスAで引数に指定された数を10倍にするメソッドcalcを作成。
2. サブクラスBでスーパークラスAで作成したcalcメソッドをオーバーライドし、結 果を表示する機能を追加します。

スーパークラスと同じ名前のメンバを使う

サブクラス内でsuper.をつけてメソッドやフィールドを呼び出すと、スーパークラスのメソッドやフィールドを呼び出すことが出来ます。

class A {
	int x;	//スーパークラスAに変数xを宣言
	....
}
class B extends A {
	int x;	//サブクラスBにも変数xを宣言
	....
	public void disp() {
		x = 10;		//サブクラスBのフィールド変数xに10を代入	
		super.x = 20;	//スーパークラスAのフィールド変数xに20を代入
	}
}
finalをつける

サブクラスによってオーバーライドされたくないメソッドにはメソッドの先頭にfinalをつけると、オーバーライドされないようにすることが出来ます。

class A {
	public final void A() {
		.....	
	}
}

サブクラス自体を拡張してほしくない場合にはクラスの先頭にfinalをつけておくこともできます。

final class A {
	.....	
}

フィールドの値を変更されたくない場合には、finalをフィールドの先頭につけておきます。

class A {
	static final int NUM = 4;	
}

この場合は宣言したときには必ず初期化しなければなりません。

Androidのエラー対応

作っている最中にいろいろとエラーや警告が出てきたのでメモ。

EditTextの警告

This text field does not specify an inputType or a hint

こんな警告が出てきたので調べてみると

<EditText android:id="@+id/edittext1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="text" />

の「android:inputType="text"」が必要ということらしい。

ListViewの警告

The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView)

という警告が出てきたので訳してみると要は、「垂直にスクロールするScrollViewは別の垂直にスクロールするListViewを含んでいるべきではない。」ということで、基本的にScrollViewの中にListViewを入れてはダメらしい。(入れる方法はあるけれど)
両方ともスクロール機能を持っているので、どっちをスクロールすればいいかわからず、スクロールがうまくいかない原因になるということです。

予期せず停止しました

エラーでプログラムが起動しないのですが、このエラーの原因は大方タイプミスということです。
ちなみに今回はScrollViewのVが小文字になっていた。

ログ解析

エラー情報やその他いろいろな情報を調べるにはLogcatという機能を利用してログの解析が出来ます。

メニューのウィンドウ→ビューの表示→その他でダイアログが表示されるので、AndroidからLogcatを選択。

すると画面下にログが表示されます。

何かあったらログを見ると分かりやすいかもしれません。

基本的なフォームを作ってみました。

HTMLで組めば数分で終わるようなページも、上記のようなAndroid特有のエラーと闘いながら2時間くらいかかってしまった。

Android SDK Toolsでのバージョンアップエラー

Android SDK Toolsがバージョンアップしたということでアップデートしたのですが、インストールが完了してAndroidSDKManagerを立ち上げようと思ったらエラーが起こる。

調べたところ、ADTのアップデートが必要との事なので設定をする。
メニューのヘルプから「更新の確認」をクリック。

全てを選択して「次へ」をクリックして進んでいく。

使用条件に同意して「完了」をクリック。

これでエラーも消えて、AndroidSDKManagerも起動できました。

これが今回初めてのアップデートだったけど、調べてみるとバージョンアップする度にこの作業をしないといけないみたいですね。

Java -- メソッドとは

クラス内部で定義される機能をメソッドを呼びます。
メソッドはフィールドと共にクラスのメンバと呼ばれます。
メソッドには、そのクラスのオブジェクトの機能(入力、処理、出力)を記述します。

メソッドの定義

戻り値の型 メソッド名(引数リスト) {
	処理;
	....
	return 戻り値;
}

戻り値を持つメソッド

int型の引数を持ち、return文でint型の戻り値ansを返すcalc()メソッドの作成。

int calc(int x) {
	int ans = 10 * x;
	return ans;
}

戻り値のないメソッド

戻り値のないメソッドには、voidを指定します。

void setName(String n) {
	name = n;	
}

Java -- オブジェクトの作成

オブジェクトの作成手順

1. オブジェクトを扱う変数を宣言する
2. オブジェクトを作成し、その変数を扱えるようにする

クラス名 変数名 = new クラス名();

(例)Carクラスを作成する場合

Car car1 = new Car(); 

メンバにアクセスする

オブジェクトを作成するとフィールド変数にアクセスして実際に値を格納することが出来るようになります。

class Car {
	//フィールド変数設定
	int number;
	double gasoline;
}
class Sample {
	public static void main(String[] args) {
		//オブジェクト作成
		Car car1 = new Car();
		//ナンバーとガソリンを代入
		car1.number = 3325;
		car1.gasoline = 30.5;
		//表示する
		System.out.println("車のナンバーは" + car1.number + "です");
		System.out.println("ガソリン量はは" + car1.gasoline + "です");
	}
}

フィールドに値を代入するには、以下の様に
car1.number
car1.gasoline
と、オブジェクトを指す変数名に「.」をつけて、フィールドを指定します。