PHP、データベースを使用して、プルダウンリストを動的生成。

web上結果イメージ

ソースコード

<html>
<head>
<title></title>
</head>
<body>
<?php
// 接続設定(サーバ/データベース/ユーザ/パスワード)
define("DBSV", "DBホスト名");
define("DBNAME", "DB名");
define("DBUSER", "ユーザ名");
define("DBPASS", "パスワード");

// 文字コード設定
define("ENCDISP", "UTF-8"); //表示文字コード
define("ENCDB", "UTF-8"); //データベース文字コード

// 選択リストの値を取得
$menu = "menu1";
$val = $_POST[$menu];

// データベースに接続
$conn = conndb();
?>
<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
  <table>
    <tr>
      <td><?php echo disp_list($conn, "product", "id", "name", $val, $menu); ?></td>
    </tr>
  </table>
</form>
</body>
</html>
<?php
// データベース接続の解除
closedb($conn);
?>
<?php
//------------------------------
// 関数
//------------------------------

// 選択リストを出力する関数
// パラメータ:接続/テーブル名/リスト値/表示値/選択値/リスト名
function disp_list($conn, $table, $value, $text,
    $selected_value = "", $m_name) {
    // DBから製品情報を取り出す
    $sql = "SELECT * FROM " . $table . " ORDER BY " . $value;
    $res = mysql_query($sql, $conn) or die("データが取得できませんでした");

    // 取り出した製品情報をプルダウンリストに表示する
    echo "<select name=\"" . $m_name . "\">";
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
        echo "<option ";
        if ($selected_value == $row[$value]) {
            echo " selected ";
        }
        echo " value=\"".$row[$value]."\">";
        echo cnv_dispstr($row[$text])."</option>";
    }
    echo "</select>";
}

// DB接続
function conndb() {
    $conn = mysql_connect(DBSV, DBUSER, DBPASS) or die("DBに接続できませんでした");
    mysql_select_db(DBNAME) or die("DBに接続できませんでした");
    return $conn;
}

// DB接続解除
function closedb($conn) {
    mysql_close($conn);
}

// 表示用の文字コードに変換
function cnv_dispstr($string) {
     //文字コードを変換
    $det_enc = mb_detect_encoding($string, ENCDB . ", " . ENCDISP);
    if ($det_enc  and $det_enc != ENCDISP) {
        return mb_convert_encoding($string, ENCDISP, $det_enc);
    }
    else {
        return $string;
    }
}
?>
CREATE TABLE product (
    id int NOT NULL auto_increment,
    name varchar(30),
    PRIMARY KEY (id)
);
INSERT INTO product(name) VALUES('製品A');
INSERT INTO product(name) VALUES('製品B');
INSERT INTO product(name) VALUES('製品C');
INSERT INTO product(name) VALUES('製品D');
INSERT INTO product(name) VALUES('製品E');

※環境によっては、DBなどの文字コードが異なるため文字コード変換もしてある。utf-8のマルチバイト文字は3バイトなため、容量面でデメリットがあるが、グローバルに考えるとutf-8に統一するのいいんじゃないかな思う。
mysql_fetch_array($res, MYSQL_ASSOC))関数について。
1行ずつデータを取り出して、MYSQL_ASSOCを指定することによってテーブルの項目名をインデックスにセットしてます。

PHPとMySQL の初歩操作

PHPMySQLの初歩操作

自分メモ。

①DB接続
②DB値取得
③レコード数取得。
④DB取得値表示
⑤DB接続解除

<html>
<head>登録済チェック</head>
<body>
	<?php
	//①DB接続
	$sv ="DBServerのホスト名";
	$dbname ="DB名";
	$user ="ユーザ名";
	$pass ="パスワード";

	$conn = mysql_connect($sv,$user,$pass) or die("接続エラー");
	mysql_select_db($dbname) or die("接続エラー");

	if(isset($_POST["id"])){
		//調べるデータを取得
		$id = @$_POST["id"];
		//②DB値取得
		$sql = "SELECT 列名 FROM 表名 WHERE 条件";
		$res = mysql_query($sql,$conn) or die("データ抽出エラー");
                //③レコード数取得
		$count = mysql_num_rows($res);

		//データが抽出できたときは登録済と表示する
		if(mysql_num_rows($res) > 0 ){
			echo "<p>$id は登録済です";
		}else{
			echo "<p>$id は登録されていません";
		}
	}

	$sql = "SELECT 列名 FROM 表明 ORDER BY 列名";
	$res = mysql_query($sql,$conn) or die("データ抽出エラー");
	echo  "<form method=\"POST\" action=\"".$_SERVER["PHP_SELF"]."\">";
	echo "<table border=\"1\">";
	echo "</tr>";
	echo "<td><input type=\"text\" name=\"id\"></td>";
	echo "</tr>";
	echo "</tr>";
	echo "<td><input type=\"submit\" value=\"入力したデータが登録済か調べる\" name =\"sub1\"></td>";
	echo "</tr>";
	echo "</form>";
	echo "<tr>";
	echo "</table>";
	echo "<table border=\"1\">";

	//④DB取得値表示
	echo "<td>下記はDBに登録済のデータ。<td>";
	echo "</tr>";
	while($row = mysql_fetch_array($res, MYSQL_ASSOC)){
		echo "<tr>";
		echo "<td>".$row["id"]."</td>";
		echo "</tr>";
	}
	echo "</table>";

	⑤DB接続解除
	mysql_close($conn);
	?>
</body>
</html>

POST送信されたデータをPHPで入力チェックする

以下のようなテキストボックスからPOST送信されたデータのチェック
QuickFormパッケージ使えばもっとコードが見やすくなるんだけど・・・。今回は使わない。


<html>
<head></head>
<body>
	<?php
	//POST送信されたデータを$data1へ
	$data1 =@$_POST["data1"];
	$data2 ="data2";
	$maxlen =10;

	//strlen()関数で未入力チェック。(データが未入力の場合true)
	if(!strlen($data1)){
		echo "<p>(strlen)データが入力されていません。";

	}else{
		echo "<p>(strlen)入力された内容:".$data1;
	}

	//empty()関数で未入力チェック。(データが未入力または0の場合true)
	if(empty($data1)){
		echo "<p>(empty)データが入力されていません。";

	}else{
		echo "<p>(empty)入力された内容:".$data1;
	}

	//strlen()関数でバイト数チェック。maxlen(最大桁数を超えた)ならfalse
	if(strlen($data1) > $maxlen){
		echo "<p>$maxlen バイト以内で入力してください。";

	}else{
		echo "<p>$maxlen バイト以内です。:".$data1;
	}

	//getType()関数でデータ型取得
	echo "<p>$data1 のデータ型:".getType($data1);

	//is_numeric()関数で数値型判定
	if(is_numeric($data1)){
		echo "<p>$data1 は数値です。";

	}else{
		echo "<p>$data1 は数値ではありません。";
	}


	//stristr(data1,data2) 関数で文字列比較。data1にdata2が含まれているか。(大文字区別無し)
	if(!stristr($data1,$data2)){
		echo "<P>(stristr) $data1$data2 は含まれていません";
	}else{
		echo "<P>(stristr) $data1$data2 は含まれています";
	}

	//stristr(data1,data2) 関数で文字列比較。data1にdata2が含まれているか。(大文字区別有り)
	if(!strstr($data1,$data2)){
		echo "<P>(strstr) $data1$data2 は含まれていません";
	}else{
		echo "<P>(strstr) $data1$data2 は含まれています";

	}
	?>
	<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
		<table>
			<tr>
				<td><input type="text" name="data1">
				</td>
				<td><input type="submit" value="送信" name="sub1">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

以下のようなプルダウンリストから受け取ったデータの日付チェック

<html>
<head></head>
<body>
	<?php
	//POST送信された日付データを受け取る
	$yyyy =@$_POST["yyyy"];
	$mm =@$_POST["mm"];
	$dd =@$_POST["dd"];

	if(checkdate($mm,$dd,$yyyy)){
		echo "<p> $yyyy/$mm/$dd は正しい日付です";
	}else{

		echo "<p>$yyyy/$mm/$dd は正しい日付ではありません";
	}
	?>
	<form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>">
		<table>
			<tr>
				<td><select name="yyyy">
						<?php
						//年
						for($i =2012; $i <= 2020; $i++){
							echo "<option>$i";
						}
						echo "</select>年";
						//月
						echo "<select name =\"mm\">";

						for($i =1; $i <= 12; $i++){
							echo "<option> $i";
						}
						echo "</select>月";

						echo "<select name =\"dd\">";

						for($i =1; $i <= 31; $i++){
							echo "<option> $i";
						}
						echo "</select>日";
						?>
				</td>
				<td><input type="submit" value="送信" name="sub1"></td>
			</tr>
		</table>
	</form>
</body>
</html>

入社一年目に意識しておくべき7つのこと

 4月に入社した人は今は研修中でしょうか。早いところだと、既に実務をやっている方もいるでしょう。辛い就職活動を終え、一息つきたいところですが、実はこれから「第二の面接」が始まるので、気が抜けません。


 前置きはさえおき、入社一年目に意識しておくべきことは以下です。

  1. 第二の面接の準備
  2. アウトプット!アウトプット!
  3. 情報収集の効率化
  4. 思慮が浅いと思われると損をする
  5. 好奇心!好奇心!
  6. キーマンをさがせ
  7. 120%の仕事を得る

 第二の面接の準備
 入社したころは、あなたに興味を持っている人が色々な質問をしてきます。プライベートの話や、仕事の話など様々です。いつもどおりの会話をすればいいでしょう。しかし、会話相手が「キーマン」だった場合は勝手が違います。後に記載しますが、ここでは「キーマン」とはあなたを評価したり、チャンスを与えてくれる人物と定義します。「キーマン」との会話は第二の面接だと思いましょう。

 準備といっても、あなたが入社するまえにやっていた就職活動時の面接対策と同じで大丈夫です。相手が質問してくることを推測して、答えを準備しておくこと。とはいっても就職活動時の面接とは違い、質問の範囲が広いので全部網羅するのは不可能に近いと思います。そこで以下に絞ります。

  • 「キーマン」の立ち位置が経営者から遠い場合は、現場よりの技術的な話に関して答えられる準備をしておく。(最低概要レベルでも)
  • 「キーマン」の立ち位置が経営者に近い場合は、会社の利益を考慮した返答ができるように準備をしておく。

 就職活動の面接でも、対策をしている人としていない人では結果は違ってくることは、就職活動を通じて身にしみたと思います。。相手が望んでいる答えが出せた場合、チャンスが多くなることは書くほどでもないでしょう。残酷な事に、世の中チャンスは平等ではありません。チャンスを得る確率を増やすことを考えましょう。



 アウトプット!アウトプット!
 考えるだけではなくアウトプットする癖をつけましょう。過程は一切評価の対象になりません。

 とはいっても、ただアウトプットするだけではあまり効果がありません。大事なのは「目的」と「価値」です。どういう目的で成果物を出すのか、どういう価値があるのか。一貫性が必要です。一貫性を持った成果物は、知的・物的財産として個人や他人に蓄積され、他人へ興味を生み出します。

 他人から興味を持ってもらうのは得です。しかし残酷な事に、人はあまり他人に興味がありません。そのため、自分に興味を向ける工夫が必要になります。「目は口ほどに物を言う」といいますが、興味を向けさせるためには、アウトプットが非常に有効になります。こう記載してしまうと、興味を向けさせるためが目的のように聞こえてしまうかもしれませんが、違うのでご了承ください。興味を向かせることは、相乗効果です。
 ここで記載している本来のアウトプットの目的は、「価値」や「目的」の整合性を保ち、知識・物的財産として個人や他人に蓄積していくためです。アウトプットしていく過程で、一貫性がとれていなかった、観点が足りなかった、など考慮が足りなかった問題が顕在化されていきます。その上他人の興味を向けさせることが出来るなんて一石二丁ですよね?

人は自分が期待するほど、自分を見ていてはくれないが、がっかりするほど見ていなくはない

人は自分が期待するほど、自分を見ていてはくれないが、がっかりするほど見ていなくはない


 情報収集の効率化
 どの商売でも大きく儲けるためには、情報力で他を出し抜くことなのは言うまででもありません。現在の社会では有象無象の情報が洪水のように溢れ出ています。情報収集にスピードをあげていかないと、いずれ情報弱者になってしまいます。そこで一つあたりの情報を効率的に得る手段を考えなければなりません。

 少し話がそれますが、MMORPGのようなオンラインゲームをやったことはありますか?あれはまさに情報収集力が要になるゲームです。今は課金力かもしれませんが・・それでも情報収集力が要なのは変わりません。情報弱者が搾取され、情報強者が勝つ縮図がとてもリアルに見えるでしょう。依存性があるのでやることはお勧めしませんが、情報収集の効果をリアルに仮想空間で体験することができます。

 話は戻しまして、情報収集手段は何でもよいと思いますが、なるべく効率の良いようにしましょう。TVなどは一つの情報を得る時間効率が悪いです。私はRSSリーダをお勧めします。一つの情報を得る時間効率が高いです。ただし、紙媒体やTVを完全否定しているわけではなく、そこでしか得られない情報もあると思うので、うまく調整するといいと思います。情報収集の効率化には、下記ブログに記載されています。

 情報を得ると「得」という旨の記載をしましたが、情報を得ることは自分への防御にもなります。ここでは「情報武装」と呼びます。そして「情報武装」をしないと確実に損をします。今の時代、情報弱者が騙され、搾取されるケースが多いです。「情報武装」し被害を受けないようにしましょう。

 ちなみに私は以下を使用してます。RSSリーダが情報収集のメインになっています。

 思慮が浅いと思われるのは損する
 会社内で思慮が浅いと思われるのは損です。熟慮していても、相手に伝わらないと意味がありません。確実にチャンスが減ります。一度思慮が浅いと思われると、再評価してもらうには根気が必要になります。入社一年目の最初が肝心です。「思慮が浅いと思われるのは損だ」という意識だけしているだけでも違います。対策方法は以下を参照ください。

 好奇心!好奇心!
 入社一年目で自分の業界に好奇心がなかったら長く続かないと思います。転職したほうがいいです。「好奇心は猫をも殺す」と言いますが、それくらいの勢いが理想です。

 「好奇心」をもって行動すると「ドーパミン」という神経伝達物質が作用するそうです。何らかの行動によって脳が「喜び」を感じたときにドーパミンは分泌され、人間に「快感・快楽」をもたらします。脳はその快感をもたらした行動をよく覚えていて、また同じようにその快感を再現しようとする。このとき脳の中では何が起こっているかというと、より効率的にドーパミンを分泌させようと、脳内にあるニューロン神経細胞)がつなぎ変わり、新たなシナプス(神経回路網)ができます。つまり脳が変化している、ということ。そしてその快感をもたらした行動を繰り返すうちに、上達していく。これが「学習」のメカニズムです。特に、試行錯誤を経ることでそのシナプスはより強化され、その行動に熟練していく。

 つまり「好奇心」が湧かないような仕事に就いた場合、脳があまり成長しないということになってしまいます。一日の大半が仕事ですから。これは自分にも他人にもなんのためにもなりません。何事にも好奇心持ちましょう。私の周りで成功している人や、尊敬してる人はみんな好奇心が高いですね。



 キーマンを探せ
 「キーマン」とはあなたを評価したり、チャンスを与えてくれる人物です。そして何かしらのきっかけを与えてくれる人も私は「キーマン」と呼んでいます。「キーマン」はタスク単位に探しましょう。会社全体の「キーマン」、取引先の「キーマン」、プロジェクトの「キーマン」・・などタスク単位に考えましょう。

 「キーマン」を決めたら、社内業務の成果物は当然のことながら、社外活動などでも手を抜かずに成果物をだしましょう。この時に大事なのは、「2.アウトプット!アウトプット!」で記載したことと、「期限」です。入社一年目の人物に求められる成果物などは期限内にだせるレベルのものなっているはずです。期限を守れないとチャンスが減ります。必ず守りましょう。また、メールの返答速度にも注意です。24時間以内がいいでしょう。



 120%の仕事を得る
 いままで記載したことがいくつかできてくると、自分の能力の120%くらいの仕事が回ってくることがあります。個人の勉強よりもOJTのほうが遥かに経験値が高いです。また、自分の能力よりも高い仕事をすることで効率よくスキルアップできます。

 ドラクエなどのRPGも、町の周りよりもダンジョンの敵のほうが経験値が高いですよね。私がRPGゲームをするときは、町の周りでレベルあげなんてほとんどしません。ダンジョンに即効いきます。1戦闘に対する経験値取得効率が高く、必要な武器はダンジョンの宝箱にあったりしますから。町の周りでレベルあげてお金貯めて「はがねのよろい」を買い、いざダンジョンに挑んだら、「はがねのよろい」が宝箱から出てきたときの絶望感は異常です。ちょっと極端に、個人勉強を「町の周りのレベルあげ」、OJTを「ダンジョン」にたとえましたが、OJTには予測しない経験(宝箱)を得ることがあります。

下記画像はドラクエ5のレヌール城のお化け退治ですが、ここで「ブーメラン」と「いばらのムチ」を買わないとレヌール城に行けない人は一歩遅れちゃうタイプですね。


話がそれましたが・・・120%ほどの仕事を得る工夫をしましょう。逆に120%以上の仕事が回ってくると、結果がでなくなるので注意が必要です。


 まとめ
 ざっくりまとめると、チャンスをもらえる確率をあげるように考えて動き、120%の仕事を得てOJTしよう。ということです。

 このブログは私の事を知っている人も見ているので念のため記載しますが、私がこれを全て実施したわけではなくて、一年目にこうやってよかった。こうやっておけばよかったなー。と反省も含めて書いているのでご了承ください。

らくちんLAMP(Apache,MySQL.PHP)環境構築

■ LAMPApache,MySQL.PHP)環境構築

LAMPLinux+Apache+MySQL+PHP(or Python or Perl)を組み合わせた環境です。簡単にLAMP環境を構築する方法を記載していきます。
ただし、このやり方はバージョンを指定できないので、バージョン指定の場合は個別にダウンロードしてくるのが良いでしょう。

2012/05/19に下記のやり方でインストールした場合のバージョンは以下でした。

■ 構築手順

1. LAMP環境パッケージをインストールをします。
$ sudo tasksel install lamp-server
※このコマンドでLAMP環境に必要なパッケージを一気にインストールしてくれます。
ここでtaskselってコマンドないよ。って怒られたら、tasleselをインストールしましょう。
$ sudo aptitude install tasksel


2. MySQLのrootパスワード設定
インストール後、MySQLのパスワード設定画面が表示されるため、任意のパスワードを設定

3. インストールした内容確認
以下のコマンドでインストールした内容が確認できます。

$ cat /var/log/dpkg.log | grep installed
2012-05-20 17:32:29 status installed apache2-mpm-worker 2.2.17-1ubuntu1.5
2012-05-20 17:32:52 status installed apache2-mpm-prefork 2.2.17-1ubuntu1.5
2012-05-20 17:33:05 status installed man-db 2.5.9-4
2012-05-20 17:33:06 status installed php5-common 5.3.5-1ubuntu7.8
2012-05-20 17:33:10 status installed libapache2-mod-php5 5.3.5-1ubuntu7.8
2012-05-20 17:33:14 status installed php5-cli 5.3.5-1ubuntu7.8
2012-05-20 17:33:14 status installed php5-mysql 5.3.5-1ubuntu7.8
:
:
4. Apache起動確認
インストール終了時点で、Apacheが起動しているので疎通確認をします。
ブラウザから、http://サーバーのIPアドレス/index.htmlにアクセス。以下のような画面が表示されたら、Apacheは正常です。

5. PHP動作確認
一度PHPApacheに適用させるために再起動します。
$ sudo /etc/init.d/apache2 restart
以下のコマンドで適用確認。「Module php5 already enabled」のようなメッセージが表示されれば問題ありません。
$ sudo a2enmod php5
Apacheのデフォルトのドキュメントルートは/var/wwwなので、以下のディレクトリに、phpのバージョン確認のためのphpファイルを置きます。
 $ cd /var/www
[/var/www]$ sudo sh -c "echo '<?php echo phpinfo(); ?>' > index.php"
/var/wwwにindex.phpファイルが作成されたと思います。
ブラウザから、http://サーバーのIPアドレス/index.phpにアクセス。以下のような画面が表示されたら、PHPは正常です。

5. MySQL動作確認
以下のコマンドで接続を行います。接続できたら、MySQLの疎通確認も終わりです。

$ mysql -u root -p


以上で、構築終わりです。

多人数での開発環境構築(CVSサーバー構築)

■ CSVサーバーについて

UbuntuCVS サーバを導入し、Eclipseと連携するまでの手順を書いていきます。
多人数での開発時は、バージョン管理しなくてはいけないことがあると思います。管理方法は色々あると思いますが、ここではCVS サーバとクライアントを使います。CVSを使うことで以下のことが解決できます。

  • 複数の人間が同時に修正を行いたい
  • いつでも以前のバージョンを取り出したい
  • バージョンごとにログを蓄積したい

また、個人で開発している場合でも捗ることもあります。

  • Linux上にあるソースを、Windowsの開発環境使って編集したい。
  • いつでも以前のバージョンを取り出したい。

■ CSVサーバーの構築概要

管理したいファイルを置くサーバーにCVS サーバを導入。実際に開発するマシンにCVSクライアントを入れます。
基本EclipseなどのIDEツールには、CVSクライアントが付いているので、このへんもメリットだと思います。

■ CSVサーバーの構築手順

1. CSVとxinetdのインストールをします。
$sudo apt-get install cvs
$sudo apt-get install xinetd
※接続要求頻度が低い場合「xinetd経由で起動」したほうが、システムリソースを有効に活用することができるため、今回はxinetdもインストールします。

2. CVS用ディテクトリ作成(どこでもいいです)

$mkdir /home/cvs

3. CVSリポジトリ新規作成

$sudo cvs -d /home/cvs/cvsroot init

これで、cvsrootフォルダが作成されたと思います。

4. 次に、xinetd経由でCVSサーバーを起動するための設定をします。

$sudo vi /etc/xinetd.d/cvs
下記のように編集する。
service cvspserver
{
disable = no
port = 2401
socket_type = stream
protocol = tcp
wait = no
user = root
passenv = PATH
server = /usr/bin/cvs
env = HOME=/home/cvs
server_args = -f –allow-root=/home/cvs/cvsroot pserver
# bind ・ 127.0.0.1
}

5. 編集したあとに、xinetd再起動

$ sudo /etc/initd.d/xinetd restart

6. ログインユーザ作成

useradd ユーザ名
passwd ユーザ名

7. フォルダに権限付与

$ sudo chown -R ユーザ名.グループ名 /home/cvs/cvsroot

8. Eclipseから接続設定
1.「ウィンドウ」→「パースペクティブを開く」→「その他」を選択します。
2.「パースペクティブの選択」画面で「CVSレポジトリー・エクスプローラー」を選択し、「OK」ボタンを押します。
3.「CVSレポジトリー」上で右クリックし、「新規」→「レポジトリー・ロケーション」を選択します。

4.「CVSレポジトリーの追加」画面でレポジトリーへ接続する設定を行います。設定を行った後、「終了」ボタンを押しレポジトリーへ接続します。
5.「ホスト」にはCVSサーバ(Ubuntu)のIPアドレスを入力します。
6・「レポジトリー・パス」にはCVSサーバで作成されたレポジトリーを指定します。ここでは、「/home/cvs/cvsroot」と入力します。
7・「ユーザー」「パスワード」には6.で作成したユーザ名を入力します。
8・「接続型」では、CVSサーバに接続する方式を選択します。ここでは、「pserver」を選択します。

9.あとはEclipseで作成したプロジェクトやソースをimportなりupdateなりcommitなりすれば環境構築のできあがりです。
import方法などは、ここを参照Javaの道:Eclipse(12.CVSの利用)

VirtualBox 4 のネットワーク設定(Windows→Linux SSH接続)

VirtualBox のネットワーク設定


ホストOS(WindowsXP)→ゲストOS(CentOS)にて以下の設定を行う。

  • ゲストOSから外部ネットワークへ疎通可能
  • ホストOSとゲストOSとの間で疎通(SSH or TELNET接続)

上記を実現するには、NATとHost-Onlyという2つのネットワーク構成を組み合わせて使う。この組み合わせは、以下のような人が対象。

  • VirtualBOX使用目的が、個人勉強
  • ゲストOSに外部からは接続させたくない
  • でもホストOSからはSSHTELNETで接続させたい
  • セキュリティは安全なほうが良い

■ ゲストOSから外部ネットワークへ疎通可能にする。


VirtualBoxが行うNATの機能により、HostOSのNICを使って外部と通信できるようになります。詳しくいうと、GuestOSをHostOSや外部から隠蔽するが、GuestOSは外部と通信できる。GuestOSからHostOSへの接続はできるが、HostOSからGuestOSへアクセスすることはできない。

1.VirtualBOXのネットワーク設定
ゲストOSが停止している状態で、VirtualBoxメイン画面にて仮想マシンを選択 -> [設定(S)] -> [ネットワーク]を選択する。アダプタ1を選択し、割り当てをNAT、アダプタタイプを準仮想化ネットワークに設定して保存。

2.ゲストOS側で反映確認
ゲストOSを起動し、ifconfigにてネットワークインタフェースが反映されていることを確認する。eth0がさっきの設定したNICです。

3.外部へ疎通確認
ゲストOSから外部ネットワークへ疎通
ブラウザなどを開きましょう。正常にインターネットへ接続できたら外への疎通はOKです。
現在の設定だと、DHCPによる自動取得になっています。問題なければそのままでOK。デフォルトだとDNSも自動取得になっているため、上手くいかない場合は、静的に設定する必要があります。やり方については今回の焦点とは異なるので割愛。

■ ホストOSとゲストOSとの間で疎通(SSH接続)


ここからは新しいNICの設定。ホストオンリー アダプタを使用する。この設定を行うと、ホストOSとゲストOSが繋がるようになる。詳しくいうと、ホストOSとゲストOSの両方に同一セグメント内の仮想NICが作成され、双方向の疎通が可能となる。(ホストOSのデフォルトのIPアドレスは192.168.56.1、ゲストOSのIPアドレスは192.168.56.100。)

4.VirtualBOXのネットワーク設定
ゲストOSが停止している状態で、VirtualBoxメイン画面にて仮想マシンを選択 -> [設定(S)] -> [ネットワーク]を選択する。アダプタ2を選択し、割り当てをホストオンリーアダプタ、アダプタタイプを準仮想化ネットワークに設定して保存。

5.ゲストOS側で反映確認
ゲストOSを起動し、ifconfigにてネットワークインタフェースが反映されていることを確認する。eth1がさっきの設定したNICです。
inet addr:192.168.56.102っていうのはゲストOSのプライベートIPアドレス。このままだとDHCPによる自動設定ですが、問題ない人は次へ。運用上固定にしたい場合は別途設定。ここでは割愛する。

6.ホストOSとゲストOSとの間で疎通確認
まずはpingで確認。通れば疎通がとれていることになります。失敗する場合は、ゲストOS側のファイアーウォールの設定を見直してみてください。

6.ホストOSからゲストOSへSSH接続
pingが通ってファイアーウォールの設定が出来ていれば、成功するはずです。
ここではsshServerの設定や、ファイアウォールの設定は割愛する。

teratermを使って確認。指定するIPはさっきのゲストOSのプライベートアドレス

できました。




補足とまとめ
VirtualBox のネットワークアダプタの設定では、他にブリッジとインターネットネットワークというのがあるので、各対応アダプタごとに簡単に補足していく。


ホストオンリーアダプタ


  • VirtualBOX使用目的が、個人勉強
  • ゲストOSに外部からは接続させたくない
  • でもホストOSからはSSHTELNETで接続させたい
  • セキュリティは安全なほうが良い

最初は全体像がわかりにくいのが欠点。

ブリッジアダプタ


  • ゲストOSに外部のPCからつなげたい人向け。
  • ゲストOSの知識や、セキュリティが詳しい人推奨。
  • GuestOSは外部から隠蔽されない
  • GuestOSは、HostOSと同様にNICを利用できる。
  • GuestOSに設定されたIPアドレスは外部からもアクセス可能。

一番全体像がわかりやすい接続形態。

内部ネットワーク


  • ゲストOS同士だけで疎通を取りたい人向け。
  • GuestOS同士は通信可能だが、外部からは隠蔽される
  • GuestOSが複数ある場合、GuestOS間でネットワーク通信可能。
  • 外部またはHostOSとの通信は行えない。

アダプタについて、こちらのサイトのほうが詳しく書いてあるので参考に。
詳しくはこちらhttp://nwing.knowd.co.jp/yamazaki/index.php?q=node/169