P/2接続101英字キーボードをIMEとGoogle日本語入力に対応させる

2005年以来、新しいLaptopを購入した。
あの頃に買ったLaptopはもはや騒音機械でほとんど使い物にならない。
今回購入したのはLenovoThinkPad Edge E220 CTO。
メモリ4G、CPUはインテル Core i5-2467M、ディスプレイは12.5inch、OSはWindows7
精錬されたデザインで第一印象は「いい買い物が出来た。」

今回買ったLaptopは英語キーボードにした。
それは先月までアメリカにいたこともあり、

といった特に配列を意識してない不純な動機である。

そこで今回英語キーボードで日本語入力を対応させるのに苦労したのでメモとして残す。
Windowsの初期設定をして、さあ英語キーボードで日本語入力しようと思ったら
配列と打った文字が一致しないことに気がついた。

MS-IMEに対応

色々調べたものの結局レジストリをいじることにした。
いじったらたまに不具合が起こる可能性があるようなので安全は保障できない。
システムのプロパティにある「システムの保護」タブから復元ポイントを作成して、
レジストリのバックアップを取っておくのは有効かと思われる。

まず、コマンドプロンプトを開くorファイル名で実行を開く
[スタート]→[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト
次に、「regedit」というコマンドを入力
redegitはレジストリエディタでレジストリを直接編集することができる。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000411
に日本語に対応するKeyboardの設定がある。
その中のLayout fileをKBDJPN.DLLからKBDUS.DLL
に修正して、再起動する。

この時、Keyboard Layoutsが「1」、「2」と2つあるのだが
まず試しで両方を変えてみることにした。
すると英語キーボードの配列で日本語入力ができるようになった。
Layouts番号の違いはよくわからずだが適応されるのは「1」の設定のようだ。
あとはIMEの有効化/無効化などの設定を自分用にカスタマイズしてばっちり。

Google日本語入力に対応

MS-IMEとほぼ同様で変更するファイルが違うぐらいである。
「regedit」を開き、
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\E0210411
その中のLayout fileをKBDJPN.DLLからKBDUS.DLL
に修正して、再起動する。

この時、IMEの有効化/無効化が「Hankaku/Zenkaku」となっているので
キーの設定をカスタマイズして、IMEの有効化/無効化を他のキーに割り当てると
ばっちり日本語入力ができるようになった。
ちなみに私は「Ctrl+Space」に割り当てた。


以上、英語キーボードの日本語入力対応!!
さて、環境構築して開発効率上げる。

参考:Windows 7 で英語キーボードを使って日本語を入力する

10/13(金)のmemo:EclipseにZen-Coding導入

Zen-Codingを本格的にきっちりやるために
Ubuntuだけでなく、XPのEclipseにも導入。

Eclipseを開いて
ヘルプ⇒新規ソフトウェアのインストール
⇒作業対象のテキスト入力に
http://zen-coding.ru/eclipse/updates/
を入力して、Zen-Codingなんて名前をつける
⇒Zen Coding for Eclipseチェックボックスにマーク
⇒完了⇒再起動

以上でZen-Coding導入完了です。

テキストを省略形でラップしてタグを入力する機能の時、
Ctrl+Shift+A
で行うようになっているのですが他の機能の衝突してうまく使いませえん。
というわけでその機能である「ファイル内での出現箇所」を
Ctrl+Shift+Z
に変えました。
これは他と被らないようにすれば大丈夫だと思います。

変え方は
ウィンドウ⇒設定
を開いて
一般⇒エディター⇒キー
でフィルター入力に「Ctrl+Shift+A」を入れれば競合しているのが
一目瞭然であるので、片方を変えればラップ機能が効きます。

以上、EclipseにZen-Coding導入でした。

参考
ぽんずーずさんの
eclipse + zen-coding プラグイン3.6Helios動作確認済み「eclipse-zencoding」
でばっちり出来ました。

9/9(金)のmemo

一週間は早い。アメリカは月曜日が休みだったので実質四日だけど。

reCAPTCHAの相性がどうも良くないらしい。PATHがうまく通らない。
他のライブラリは通るんだけど。なぜ???
というわけで結局他のCAPTCHAを導入することにしたっていう話。
KCAPTCHAという一昔前のCAPTCHAだけど。
なんかbotに解読されてそうな気がする。

さて、今日は・・・

CAPTCHAについて

Adcaptcha
http://www.adscaptcha.com/
これは有り。広告代わりに導入だからタダで終わらない。
操作もそれほど難しくないのでユニーク。

KCAPTCHA
http://goodphp.mirrors.phpclasses.org/package/3193-PHP-Generate-CAPTCHA-validation-images-with-effects.html

setting
http://shikabo.ddo.jp/76.html

結局これを導入。これなら一日もかからないだろう。
よし、ローカルサーバーで表示しようと思ったら画像が出ない。
なぜだろうか??
・・・なるほど、PHPのGD(グラフィックライブラリ)が必要。
ブラウザエラー非表示にしているとエラー見に行くか
PHP Fatal error: Call to undefined function imagecreatefrompng() in
ブラウザには
PHP Fatal error: Call to undefined function: imagecreate()
と出る。

sudo apt-get install php5-gd

sudo /etc/init.d/apache2 restart

したらあっさり起動した。

<?php 
var_dump(gd_info());
print_r(phpinfo()); 
?>

でちゃんと情報が表示されるか確認するのもありだな。
エラーで
PHP Fatal error: Call to undefined function gd_info() in /home/-- on line
って出たらGD有効になってないということだ。

それでKCAPTCHAは使えるようになったらなったで
バーチャルサーバーでzipファイル展開できない。
なぜ??
結局エラー見てもぐぐって試しても分からないので
バーチャルでないところで解凍したのを
FileZillaなどのFTPソフトでファイルを解凍したものを転送する。
バーチャルサーバーのIPアドレスとsftpとユーザー名root、
パスワード、ポートは22番で繋ぐことができる。

でまあ導入は簡単にできた。
エラー表示で条件式でちょっと詰まったけど。
論理性ないなって正直思った。ほんまにないわ〜。

PHP
isset ― 変数がセットされていること、そして NULL でないことを検査する
unset ― 指定した変数の割当を解除する
とかもっと深める必要があるなって思った。
個人的に前も見たけど
issetを正しく理解する。null値とunsetの違い-PHP変数管理が要チェックだと思うのよ。

ちょいmemo

画像にクレジットとは著作権表示をすること

締め切りから自由時間まで。6つのカレンダーで人生の時間を支配する
http://lifehacking.jp/2011/09/6-calendar-to-rule-the-time/

9/7(水)と9/8(木)のmemo

一日飛ばすと結構たまるから毎日更新しなければ。
reCAPTCHAうまく導入できなく、停滞気味。
明日はアプローチ変えてみるけど、明日のうちに機能はworkさせたい。
そもそもユーザビリティ下がるからどうなのというところだけど。
設置されていたCAPTCHAが突破されているなら致したかないのか??
バランスが難しい。バランスってなんだろう。

最近のテーマ
『非効率で不器用な人間だからこそ「量」で勝負する。』
そもそも努力が足りないから。まず量でいこう。

reCAPTCHAについて

reCAPTCHAコード読解

<?php
//サーバーの通信の定義
define("RECAPTCHA_API_SERVER", "http://www.google.com/recaptcha/api");
//https通信の定義
define("RECAPTCHA_API_SECURE_SERVER", "https://www.google.com/recaptcha/api");
//確認サーバーの定義
define("RECAPTCHA_VERIFY_SERVER", "www.google.com");

//クエリ文字列形式に与えられたデータをエンコードする。
//パラメーター:$data エンコードされる要素の文字配列
//返り値:エンコードされたリクエスト

function _recaptcha_qsencode ($data) {
        $req = "";
        foreach ( $data as $key => $value )
                $req .= $key . '=' . urlencode( stripslashes($value) ) . '&';

        // Cut the last '&'
        $req=substr($req,0,strlen($req)-1);
  //$reqの0(始めの文字)から最後の文字($reqの文字列の長さ-1によって)を抜いた分を抜き出す
        return $req;
}

//PHP関数memo
//urlencode ― 文字列を URL エンコードする
//stripslashes ― クォートされた文字列のクォート部分を取り除く
//substr― 文字列の一部分を返す
//strlen― 文字列の長さを得る


//HTTP POSTをreCAPTCHAサーバーに送信する。
//パラメーター:$host(URI)、$path、$data、$port(ポート番号:80番)
//返り値:配列

function _recaptcha_http_post($host, $path, $data, $port = 80) {

        $req = _recaptcha_qsencode ($data);

        $http_request  = "POST $path HTTP/1.0\r\n";
        $http_request .= "Host: $host\r\n";
        $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
        $http_request .= "Content-Length: " . strlen($req) . "\r\n";
        $http_request .= "User-Agent: reCAPTCHA/PHP\r\n";
        $http_request .= "\r\n";
        $http_request .= $req;

        $response = '';
        if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) {
                die ('Could not open socket');
        }

        fwrite($fs, $http_request);

        while ( !feof($fs) )
                $response .= fgets($fs, 1160); // One TCP-IP packet
        fclose($fs);
        $response = explode("\r\n\r\n", $response, 2);

        return $response;
}

//PHP関数memo
//fsockopen:― インターネット接続もしくはUnix ドメインソケット接続をオープンする
//fwrite ― バイナリセーフ(正しく扱うことが出来る関数)なファイル書き込み処理
//feof ― ファイルポインタがファイル終端に達しているかどうか調べる
//fgets ― ファイルポインタから 1 行取得する
//fclose ― オープンされたファイルポインタをクローズする
//explode ― 文字列を文字列により分割する

//ファイルポインタは、有効なファイルポインタである必要があり、
//fopen() または fsockopen() で正常にオープンされた(そしてまだ fclose() でクローズされていない)ファイルを指している必要がある。


//解読するためのHTMLを得る関数
//ブラウザから呼ばれ、結果としてreCAPTCHAHTMLWidgetとなる。
//呼ばれたものはフォーム内に埋め込まれる。

//パラメーター
//$pubkey reCAPTCHAのための公開鍵
//$error reCAPTCHAによって与えられたエラー(オプションでデフォルトはnull)
//$use_ssl sslを用いてリクエストするなら(オプションでデフォルトはfalse)
//返り値:ユーザーのフォームに埋めこまれたHTML

function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false)
{
        if ($pubkey == null || $pubkey == '') {
                die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
        }

        if ($use_ssl) {
                $server = RECAPTCHA_API_SECURE_SERVER;
        } else {
                $server = RECAPTCHA_API_SERVER;
        }

        $errorpart = "";
        if ($error) {
           $errorpart = "&amp;error=" . $error;
        }
        return '<script type="text/javascript" src="'. $server . '/challenge?k=' . $pubkey . $errorpart . '"></script>

        <noscript>
                <iframe src="'. $server . '/noscript?k=' . $pubkey . $errorpart . '" height="300" width="500" frameborder="0"></iframe><br/>
                <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
                <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
        </noscript>';
}


//ReCaptchaResponsはrecaptcha_check_answer関数から返されたもの。
 
class ReCaptchaResponse {
        var $is_valid;
        var $error;
}


//recaptcha_check_answer関数
//ユーザーの推測が正しかった場合、確認機能としてHTTP POSTが呼ばれる。

//パラメーター
//$privkey 秘密鍵
//$remoteip reCAPTCHAを解いたユーザーのIPアドレス
//$challenge フォームの中のrecaptcha_challenge_fieldに記入された内容 
//$respose フォームの中のrecaptcha_response_fieldに記入された内容 
//$extra_params サーバーへの送信のために加えて確認する配列


function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array())
{
  //秘密鍵がnulか空であったらメッセージ。
        if ($privkey == null || $privkey == '') {
                die ("To use reCAPTCHA you must get an API key from <a href='https://www.google.com/recaptcha/admin/create'>https://www.google.com/recaptcha/admin/create</a>");
        }

  //ユーザーのIPアドレスがnullか空だったら
        if ($remoteip == null || $remoteip == '') {
                die ("For security reasons, you must pass the remote ip to reCAPTCHA");
        }



        //discard spam submissions(スパム投稿を破棄する)
  //フォームの値が空だったり、、文字列の長さが0だった時
        if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) {
                $recaptcha_response = new ReCaptchaResponse();
                $recaptcha_response->is_valid = false;
                $recaptcha_response->error = 'incorrect-captcha-sol';
                return $recaptcha_response;
        }

        $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify",
                                          array (
                                                 'privatekey' => $privkey,
                                                 'remoteip' => $remoteip,
                                                 'challenge' => $challenge,
                                                 'response' => $response
                                                 ) + $extra_params
                                          );

        $answers = explode ("\n", $response [1]);
        $recaptcha_response = new ReCaptchaResponse();

        if (trim ($answers [0]) == 'true') {
                $recaptcha_response->is_valid = true;
        }
        else {
                $recaptcha_response->is_valid = false;
                $recaptcha_response->error = $answers [1];
        }
        return $recaptcha_response;

}


//ユーザーがreCAPTCHAにサインアップできるようにURLを得る。
//もしアプリケーションにどこかキーが入っている設定ページがあるなら、この機能が使われているリンクを供給すべきだ。

function recaptcha_get_signup_url ($domain = null, $appname = null) {
        return "https://www.google.com/recaptcha/admin/create?" .  _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname));
}

function _recaptcha_aes_pad($val) {
        $block_size = 16;
        $numpad = $block_size - (strlen ($val) % $block_size);
        return str_pad($val, strlen ($val) + $numpad, chr($numpad));
}

//PHP関数memo
//str_pad ― 文字列を固定長の他の文字列で埋める
//chr ― 特定の文字を返す
?>

PHPについて

requireとinclude

require( )とinclude( )との違いは、require( )が処理中に1回だけ読み込まれると言う点

1)require系はファイルを読み込めなければ必ずエラーで停止する
2)include系はファイルを読み込めなければ必ず警告を(内部レベルでは)出力する。あとfor文などの変数型ファイル読み込みに使える。

どうしてもファイルが存在していてもしていなくても読み込みたければfile_exists()などでファイルの存在を調べてrequireすればいいと思う。
ob_start ― 出力のバッファリングを有効にする
バッファリング:複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを専用に設けられた記憶領域一時的に保存しておくこと

●public
どのクラスからもアクセスできるということ
●static
staticとは固定という意味。
クラス特有の値やメソッドということ。
●void
戻り値なし
詳しくサンプル
http://www.searchman.info/tips/2070.html

ob_gzhandler ― 出力バッファを gzip 圧縮するための ob_start コールバック関数
strpos ― 文字列が最初に現れる場所を見つける
ctype_alpha ― 英字かどうかを調べる
ctype_digit ― 数字かどうかを調べる

apacheについて

アクセス権変更のコマンドの書式
chmod [オプション] [アクセス権の指定] [ファイル/ディレクトリ名]
ex.700=自分だけ読み書き可能、他人は一切見れない

ファイル/フォルダの所有者の変更コマンドは、次のような構文となる。
chown [オプション] [ユーザ名] [ファイル/ディレクトリ名]

English

I'm sorry in such a short notice but〜
急な話で悪いんだけど
→これは結構便利だから早速今日使った。

Security関係

PHP と Web アプリケーションのセキュリティについてのメモ」を読んで

『aaa@bbb.com』というメアドを
『&#97;&#97;&#97;&#64;&#98;&#98;&#98;&#46;&#99;&#111;&#109;』とすることをエンティティ変換という。
セキュリティ識別子 (SID; Security Identifier)

セッション関連の処理で注意すべきクロスサイトスクリプティング問題に関して
strip_tags() ではダブルコーテーションが削除されない。
この問題は、PHP 4.3.2 で修正。
結果的にstrip_tags()はやめて、htmlspecialchars()にすべきということ。

文字コードUTF-7 を使用したクロスサイトスクリプティングに関して
htmlentities — 適用可能な文字を全て HTML エンティティに変換する

ちょいmemo

「ソケット」というのはIPアドレスとPort番号を一組にしたもの。
svn revert ファイル名:svn内のファイルをサーバーのファイルに上書き
PKI(Public Key Infrastructure)は公開鍵暗号基盤と訳され、所有者と公開鍵の対応付けをするのに必要な方式、システム、プロトコル及びポリシの集合によって実現される。
リファクタリング (refactoring) とはコンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理すること。

http://www.amazon.co.jp/dp/4798020826/?tag=hatena_st1-22&ascsubtag=d-ap51
サイト
http://jsdo.it/event/html5cat/2011/summer/

9/6(火)のmemo

reCAPTCHAについて

Q.If I would not specify domain, will I be able to use reCAPTCHA?

A.By default, all keys work on "localhost" (or "127.0.0.1"), so yon always develop and test on your local machine.
(デフォルトでは、すべてのキーは"localhost"(または"127.0.0.1")で動作するので、常に開発し、ローカルマシンでテストすることができます。)

Apacheについて

apacheの設定は

sudo gedit /etc/apache2/apache2.conf

でできるが、
基本モジュールの有効化、無効化は
以前のエントリーのようにする。

以前のエントリーでは権限処理について書いてなかったが重要。
apacheの実行ユーザ名・グループ名はwww-dataで
指定するフォルダの所有者をログインユーザにしたい場合は

sudo chown -R ログインユーザID:www-data 指定するフォルダ

WEBサーバーによる実行や書き込みや読み込みなどの設定は
グループのパーミッションの設定で行う。

sudo chmod 750 指定するフォルダ

またログインユーザーのグループもwww-dataにしておくと
ログインユーザーでファイルを作成したときに権限があるので便利

sudo usermod -g www-data ログインユーザID

参考
http://blog.kcg.ne.jp/blog/sato_si/5488
http://tobysoft.net/wiki/index.php?Ubuntu%2Fapache2

Today's English

I have no idea about the placement of PHP libraries in this site/

hereby:これによって、この結果として、ここに
grant:与える
deal in:取り扱う
obtain:を獲得する、手に入れる
furnish:与える、供給する

9/5(月)のmemo

jQueryについて
  • text()メソッド - エスケープされる。
  • jQuery.get( url, data, callback ) - HTTP(GET)通信でページを読み込み
  • get() - DOMエレメントの配列にアクセス
  • html() - 最初の要素をHTML文字列で返す。組み込みであるinnerHTMLの値と同じ。
  • empty() - 各要素の子要素を全て削除し、空にする。

同時にイベントハンドラや内部でキャッシュしているデータも削除する。

PHPについて

eval — 文字列を PHP コードとして評価する

XSSについて

XSSに関して

split関数で\タグで分けるのがいいみたい。
splitー指定した区切り文字で分割し、その結果を配列として返す
格納する配列名=文字列.split(区切文字)

通常のWebアプリケーションの場合、
HTMLで表示するパラメータのエスケープはサーバー側で行うしかないが、
Ajaxアプリの場合、以下の選択肢がある。

  • サーバー側で予めHTMLエスケープしておく
  • サーバーからは生データを送り、ブラウザ上のJavaScriptエスケープする

http://d.hatena.ne.jp/ockeghem/20110905/p1
http://subtech.g.hatena.ne.jp/mala

referenceについて


文字実体参照実体参照
文字実体参照は、特定のキーワード文字列によって文書文字集合における該当文字を指定する方法

example

  ( ) ノーブレークスペース - 折り返しを起こさない(ホワイトスペースではない)空白
< (<)
> (>)
& (&)
" (")



数値文字参照文字参照
数値文字参照は、10進数もしくは16進数によって文書文字集合における該当文字をISO 10646の文字番号で指定する方法

example
「♪」(10進数による指定:♪)
「♪」(16進数による指定:♪)

【Ubuntu11.04】ローカルWEBサーバー構築memo

何回も設定をやり直しているのでUbuntu11.04WEBサーバー構築の覚書としてmemo

LAMPサーバーインストール(Linux Apache MySQL PHP PHPMyAdmin)


インストールはいくつか方法がある。

$ sudo apt-get install tasksel
$ sudo tasksel

でLAMPServerを選択してやるとか

$ sudo apt-get update
$ sudo apt-get install apache2 php5 php5-gd 
 mysql-server php5-mysql phpmyadmin

とか。

私の場合は後者で行った。
後者の場合は
インストールの過程では4回パスワードを聞かれる。
システムの変更を加えるためのパスワードと
データベースのMySQLのパスワードと
MySQLを設定するためのパスワードと
PHPMyAdminを設定するためのパスワードである。

PHPMyAdminの設定でどのWEBサーバーと連携するかを聞かれるので
その時はapacheサーバーを選択する。

インストールして終わると、
ここでhttp://localhost/にアクセスすると
It works!〜なんちゃらと表示されると成功。

PHPを確認するならば

$ sudo vim /var/www/phpinfo.php

と何かしらのテキストエディタで新しいPHPファイルを作り、

<?php print_f(phpinfo()); ?>

と記入すると、http://localhost/phpinfo.php
にアクセスするとPHPの各種設定情報を表示してくれるPHPinfoが表示される。

mysqlを確認するならば

$ mysql -u root -p

と端末で記入し、
インストール時に設定したパスワードを入力することで
mysqlにアクセスできるようになる。

PHPMyAdminを確認するならば
http://localhost/phpmyadminにアクセスすると
PHPMyAdminのログイン画面が表示される。

apacheの設定

UbuntuなどのDebianapacheの設定においては
sites-availableとsite-enabledについて理解することが重要。
サイト毎の設定であるバーチャルホストの設定を行うためには。

サーバ全体のは/etc/apache2/apache2.confにまとめてあるが、
サイト毎の設定は/etc/apache2/sites-available/の下で行う。

sites-available(利用できるサイト)はファイルを置く場所で、
site-enabled(利用可能にするサイト)はsites-available のファイルのシンボリックリンク用になります。
つまり、site-enabledの有効(a2enmod)or無効化(a2dismod)によってブラウザで表示するサイトが変えられるということです。

apache設置直後に稼働中のものはDefalutの設定で動いているので

$ sudo a2dissite 000-default

で削除する。
(a2dissiteは/etc/apache2/sites-enabled/にあるリンクを削除するコマンド)
そして、設定をapacheに読み込ませるために再起動する。

$ sudo /etc/init.d/apache2 restart

次に、有効にしたいバーチャルホストの設定を行う。
まずdefalutにあるファイルをコピーする。
defaultを残しておくことで例え設定を間違えてもやり直せる。

$ sudo cp /etc/apache2/sites-available/default 
  /etc/apache2/sites-available/好きなバーチャルホスト名

バーチャルホストを有効にする。

$ sudo a2ensite 上記でつけたバーチャルホスト名

(a2ensiteは/etc/apache2/sites-available/にある設定のリンクを/etc/apache2/sites-enabled/に作成するコマンド)
これでシンボリックリンクが作成できたのでバーチャルホストと同じ名前のリンクができる。

通常は/var/wwwにDocumentRootがあると思うが
ユーザーディレクトリ(/home/ユーザ名/wwwなど)に
アクセスできるようにしたい場合はUserdirというモジュールを有効化する。

$ sudo a2enmod userdir

(a2enmodは/etc/apache2/mods-available/にある設定のリンクを/etc/apache2/mods-enabled/に作成するコマンド
ちなみにa2dismodは削除するコマンドだ)

そして、設定をapacheに読み込ませるために再起動する。

$ sudo /etc/init.d/apache2 restart

バーチャルホストの設定を細かくして
ドメイン名、ログファイルや変更ログの保管場所の設定を行いたいときは

$ sudo nano /etc/apache2/sites-available/バーチャルホスト名

を編集する。

私のファイル中身は(*)を修正・加筆

<VirtualHost *:80>
        (*)ServerName サイトのドメイン
        ServerAdmin webmaster@localhost
        (*)UserDir バーチャルホスト名
        (*)UserDir disabled(rootとユーザー名以外受け付けないようにするために)
        (*)UserDir enabled ユーザー名
        (*)DocumentRoot /home/ユーザー名/バーチャルホスト名/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        (*)<Directory /home/ユーザー名/バーチャルホスト名/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        (*)ErrorLog /home/ユーザー名/バーチャルホスト名/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

       (*)CustomLog /home/ユーザー名/バーチャルホスト名/access.log combined
    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

とこんな感じである。
これでバーチャルホスト名を例えば、example.comとかしていたら
HTMLファイルかなんかを指定のフォルダに入れていたら
URLにexample.comと打ち込んで表示される。


躓いたことはローカルのバーチャルホストで設定したドメイン
ユーザーディレクトリにあるphpファイルにアクセスすると
ダウンロードされてしまうというissue。

解決方法はphp5.confの修正

/etc/apache2/mods-available/php5.conf 

を念の為に

sudo cp /etc/apache2/mods-available/php5.conf /etc/apache2/mods-available/php5-cp.conf

とコピーしておく。

/etc/apache2/mods-available/php5.conf

<IfModule mod_userdir.c> 
<Directory /home/*/public_html>
 php_admin_value engine Off 
</Directory> 
</IfModule>

#<IfModule mod_userdir.c> 
#<Directory /home/*/public_html>
# php_admin_value engine Off 
#</Directory> 
#</IfModule>

コメントアウトすることであった。
最後にapacheを再起動して、

$ sudo /etc/init.d/apache2 restart

ユーザーディレクトリでもphpファイルの表示が可能になった。

参考
Ubuntu(11.04)でLAMPP(Linux Apache MySQL PHP PHPMyAdmin)を構築!インストールと設定
http://niwatako.info/20110611/article847.html
apache2
http://wiki.lampetty.net/apache2.html
webサーバ(apache2)の設定
http://www005.upp.so-net.ne.jp/develop-tom/deb/apache-deb.html
Apacheの設定 2 - ユーザーディレクトリでPHPを実行可能にする
http://blog.livedoor.jp/slowhandblues/archives/4871377.html