hack my life: 2007年5月アーカイブ

2007年5月アーカイブ

今更気がつきました。

Mac OS 10.5 LeppordにはRailsが標準で搭載されるんですねぇ。

AppleのLeopardテクノロジー概要には、

Leopard Serverは、強力で生産的なRuby on Railsウェブアプリケーションフレームワークが予め組み込まれています。Ruby on Railsは、生産性を継続的に発揮することに最適化された最高のフレームワークです。Leopard Serverは、ウェブベースのアプリケーションの開発および運用を簡素化するMongrelとともに出荷される予定です。

Leopard Serverって謳っているけれど、Leopard自体はどうなるんでしょうね?
Rails搭載だけでなく、MongrelをWebサーバーとして搭載。

凄いことになってきた。
Leopardは2007年10月発売。

サーバー設定につづいてClientの設定。

今回の構成は、サーバーがLinux、クライアントがWindowsとMacという構成。

WindowsをVPNクライアントとして使う

http://openvpn.se/files/install_packages/openvpn-2.0.5-gui-1.0.3-install.exeをダウンロード。

ダウンロードが終わったら、インストールです。
全部デフォルトでかまいません。ちょっと時間かかります。

インストールが終わったら、OpenVPNインストールディレクトリ/config配下に設定ファイルと鍵を置きます。
まず、鍵をOpenVPNインストールディレクトリ/config/keysに置きます。(ここでなくてもかまいません。)

そして設定ファイルを作成。

OpenVPNインストールディレクトリ/config/client1.ovpn
# クライアントであることを指定 ※OpenVPNサーバからパラメータを受け取るために必要 client # 通信に使用するプロトコル proto udp # 使用する仮想ネットワークデバイスの指定 ※OpenVPNサーバと同じにする必要があります。 dev tap0 # 接続するOpenVPNサーバの指定 # 書式:remote [OpenVPNサーバのホスト名またはアドレス] [ポート番号] #一般家庭の場合、ルーターのアドレスを指定して、StaticNAT転送してあげる必要があります。 remote vpn.example.com 5000 # CA証明書、サーバ証明書、サーバ秘密鍵のパス指定 keys/ca ca.crt keys/cert client1.crt keys/key client1.key # OpenVPNサーバの名前解決を継続する resolv-retry infinite # ローカルポート番号をバインドしない nobind # パケット転送の際にLZO圧縮を有効にする comp-lzo # VPNが落ちた場合の再接続設定 persist-key persist-tun # ログの詳細レベルの指定 verb 3 # OpenVPNサーバからパラメータを受け取るための設定 pull # OpenVPNサーバからIPアドレスを受け取るための設定 float

設定が終わったら、タスクトレイに"OpenVPN GUI"というアイコンがあるので、
右クリック -> client1 -> Connectを選択。クライアント証明書を作成したときのパスフレーズを聞かれるので、入力します。

アイコンのPCモニタが緑になれば、接続終了です。
アイコンにマウスカーソルを当てると、割り当てられたIPアドレスが表示されます。
今回の例だと、10.0.1.2が割り当てられています。

Pingをうったり、Webサーバーがあればアクセスしてみてください。繋がっていれば成功です。

MacをVPNクライアントとして使う

http://www.tunnelblick.net/から、自分の環境にあったファイルをダウンロードしてください。Mac OSX Tigerの場合はhttp://www.tunnelblick.net/Tunnelblick-Tiger-2.0.1.dmgがそうです。

ダウンロードしたらインストール、アプリケーションフォルダにTunnelblickがあるので、実行してください。

"Plese Put your Config file"とかいうアラートがでるので、一端"Continue"をクリックしてください。
勝手にエディタが立ち上がりますが、一端とじてターミナルで作業します。

# cd 〜/Library/openvpn
# mkdir keys
# vi client2.conf
# クライアントであることを指定 ※OpenVPNサーバからパラメータを受け取るために必要 client # 通信に使用するプロトコル proto udp # 使用する仮想ネットワークデバイスの指定 ※OpenVPNサーバと同じにする必要があります。 dev tap0 # 接続するOpenVPNサーバの指定 # 書式:remote [OpenVPNサーバのホスト名またはアドレス] [ポート番号] #一般家庭の場合、ルーターのアドレスを指定して、StaticNAT転送してあげる必要があります。 remote vpn.example.com 5000 # CA証明書、サーバ証明書、サーバ秘密鍵のパス指定 keys/ca ca.crt keys/cert client1.crt keys/key client1.key # OpenVPNサーバの名前解決を継続する resolv-retry infinite # ローカルポート番号をバインドしない nobind # パケット転送の際にLZO圧縮を有効にする comp-lzo # VPNが落ちた場合の再接続設定 persist-key persist-tun # ログの詳細レベルの指定 verb 3 # OpenVPNサーバからパラメータを受け取るための設定 pull # OpenVPNサーバからIPアドレスを受け取るための設定 float

実はWindowsと違いは無かったりします.....

先ほど作成した〜/Library/openvpn/keysのしたに、client2の鍵を置きます。client1.keyだけはパーミッション600にしておいてください。でないと怒られます。

あとは、これまた、クイック起動に居る、黒ずんだアーチ状のアイコンをクリックして、
"Connect Client2"を選択します。パスフレーズを聴かれるので、入力してエンター。

Windowsと同じように、接続確認します。
今回の例だと、10.0.1.3というIPが振られます。

また、VPNに接続しているクライアント同士は、サーバーのserver.confにclinet-clientが設定してあれば通信できます。
ためしにping を10.0.1.2に打ってみてください。設定に問題がなければ返答が帰ってくるはずです。

OpneVPNを使うと、VPN環境が簡単に構築できてしまいますね。

自宅サーバーにVPNを導入してみました。
ちょっと長くなるので、何回かにわけて導入手順を書いておきます。

OpenVPNとは

VPNとはVirtual Private Networkの略で、仮想的に専用線でつないだネットワークの様に達振る舞う事ができます。

例えば、会社なんかでは10.0.0.0/24とか192.168.0.0/24なんてネットワークを使っている思いますが、これはプライベートネットワークといって、外部(インターネット)と直接通信が出来ません。

説明し出すと長いのでこの辺りの細かい説明は省略します。

一方、皆さんの自宅でもおそらく192.168.0.0/24のネットワークを使っていると思うのですが、コレもプライベートネットワークです。
当然直接インターネットには繋げません。(モデムルーターとか使っているハズです。)

VPNの便利な所は、此の会社のプライベートネットワークと自宅プライベートネットワークの間で仮想的にブリッジネットワークを使って、仮想的に専用線を引いている様に接続出来るコトです。

例を挙げると、会社のネットワークを10.0.0.0/24、自宅ネットワークを192.168.0.0/24と仮定すると、仮想的にNICを作成して、会社と自宅PCに10.0.1.0/24アドレスを割り当てます。Linuxのファイアウォールで転送のポリシーを設定してあげれば、自宅に居ながら会社のネットワークにセキュアにアクセス出来るようになります。

実装面から言うと、パケット自体はインターネット上を暗号化されて通る事になります。
10.0.1.0/24ネットワーク宛のパケットをSSL/TSL方式で暗号化し、更にグローバルIP用にカプセル化して送信することでこのセキュアな接続を実現しています。

今回はVPNサーバーとしてLinux、クライアントとして、WindowsとMacを使っています。
サーバー側でブリッジモードは使っていません。(ネットワーク上の都合です)

OpenVPN導入

まずはサーバ側のインストール

OpenVPN本体と、ライブラリlzoが必要なのでダウンロードします。

# cd /usr/local/src
# wget http://openvpn.net/release/openvpn-2.0.5.tar.gz
# wget http://www.oberhumer.com/opensource/lzo/download/lzo-1.08.tar.gz

lzo → OpenVPNの順にインストール

# tar zxvf lzo-1.08.tar.gz
# cd lzo-1.08
# ./configure
# make
# make install
# tar zxvf openvpn-2.0.5.tar.gz
# cd openvpn-2.0.5
# ./configure 
# make
# make install

設定ファイルの置き場と、サンプル設定ファイルのコピー。

# mkdir /etc/openvpn/
# cp sample-scripts/openvpn.init /etc/openvpn
# chmod 755 /etc/openvpn/openvpn.init

OpenVPNの設定ファイルを作成します。

# vi /etc/openvpn/server.conf

# 通信に使用するプロトコル及びポート番号の指定 port 5000 proto udp # 使用する仮想ネットワークデバイスの指定 dev tap0 # CA証明書、サーバ証明書、サーバ秘密鍵、DH鍵のパス指定 # ※パス指定は、絶対パスまたはserver.confの設置ディレクトリからの相対パスでの指定 ca /etc/openvpn/easy-rsa/keys/ca.crt cert /etc/openvpn/easy-rsa/keys/server.crt key /etc/openvpn/easy-rsa/keys/server.key dh /etc/openvpn/easy-rsa/keys/dh1024.pem # OpenVPNサーバのネットワーク設定 # 書式:server [OpenVPNサーバのアドレス] [ネットマスク] server 10.0.1.0 255.255.255.0 # クライアントにサーバ側ネットワークへの経路を伝えるための設定 # 書式:push “route [OpenVPNサーバ側のネットワークアドレス] [ネットマスク]” push "route 10.0.1.0 255.255.255.0" # クライアント同士の通信を可能にするための設定 client-to-client # VPN接続間の生存確認のための設定 keepalive 10 120 # パケット転送の際にLZO圧縮を有効にする comp-lzo # OpenVPNデーモン起動ユーザ・グループの指定 ※Windowsシステム以外設定可能 user nobody group nobody # VPNが落ちた場合の再接続設定 persist-key persist-tun # ステータスログのパス指定 status /var/log/openvpn-status.log # ログのパス指定 log /var/log/openvpn.log log-append /var/log/openvpn.log # ログの詳細レベルの指定 verb 3 # OpenVPN管理インターフェイスの起動設定 management localhost 7505

パケットの転送を許可する。

# echo 1 > /proc/sys/net/ipv4/ip_forward
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1	←"1"に変更

OpenSSL設定

続いて、SSLの設定。
用意されているスクリプトを使用するので割と簡単です。

OpenSSLが入っていなければ、入れておいてください。

# yum install openssl

精製用のスクリプトを移動。

# cp -r /usr/local/src/openvpn-2.0.5/easy-rsa /etc/openvpn

SSL設定用の環境設定スクリプトを編集。

# vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=JP               ←国名
export KEY_PROVINCE=Tokyo           ←県名
export KEY_CITY=Minatoku            ←市町村名
export KEY_ORG="hackmylife"         ←団体名
export KEY_EMAIL="test@mail.example.com" ←メールアドレス

証明書を作成。

# cd /etc/openvpn/easy-rsa/
# . ./vars
# mkdir keys
# ./build-ca
Generating a 1024 bit RSA private key
...........++++++
...............................++++++
writing new private key to 'ca.key'
        

大好きだった、名著「ビジョナリカンパニー」の続編が出ていました。
今回は、「時計を作る人」に焦点を当てた、「ビジョナリーピープル」です。

前著の「ビジョナリーカンパニー」の中で、時代を超えて繁栄する企業には、今がその時である。と告げるカリスマではなく、今がその時である、と多くの人が判断する為の「時計」こそ重要である。
その時計という仕組みを作る人を、本文では「時を告げる人」ではなく、「時計を作る人」と書かれています。

本書はその「時計を作る人」達、自分の道を追求しつづけ、ひたむきに、真っ直ぐに生きていく人達をピックアップして、彼らがどんな考えで、どんな行動をしているのか、そして、「時計を作る人」になるためには何が大切なのかが書かれている、自己啓発的な本です。

具体的には、ネルソン・マンデラ、ダライ・ラマ、ジミー・カーター、リチャード・ブランソン、ビル・ゲイツ、スティーブ・ジョブズ、ヨーヨー・マ、U2のボノなど、200人のビジョナリーに10年間かけてインタビューした結果を基に書かれた本です。
これだけでも、一読の価値ありな感じです。

筆者が学んだのは、並外れた人たちやチームそして組織というのは、たいていの場合、ごく普通の人たちが自分自身にとって大切だと思っていることが、結果的に並外れていたに過ぎない、という事実だった。

序章からの引用ですが、時を告げる人=カリスマではなく、ごく普通の人達の成果が結果的に、優れた成果を残したということが、「時計を作る人」こそが重要であるという一つの証明になっている様な気がしています。

蛇足ではありますが、著者の名前に、「ビジョナリーカンパニー」著者の一人、ジェームズ・C. コリンズの名前が無いのは何故なんだろう?


ビジョナリー・ピープル
『ビジョナリー・ピープル』
ジェリー・ポラス、スチュワート・エメリー、マーク・トンプソン 著
英治出版 ¥ 1,995 (税込)

Google Analysticsのインターフェースがポップになりました。

before

昔のインターフェース。コレも凄く良かった。

after

なんだかポップな感じになりました。
一瞬「えっ!?」って感じだったのですが、そこはGoogleインターフェース凝っています。

カレンダーインターフェースなんてshift + クリックでクライアントアプリの様に範囲選択できるし。
まだ昔のインターフェースのほうが見慣れていた感はあるけれど、もう少し使い込むとなじんでくるのかなぁ。

FlickrとiPhotoを同期かするソフトFlickrExportを正式に導入しました。

フリーではなくてお値段£12(3000円弱)なんですが、
大量に写真をUploadするのが面倒だったので、評価版を使った上で購入しました。

購入に踏み切った理由は、ちょっと前にディズニーランド行ったときの写真を大量にアップしようとしたら、
評価版は同時に5枚までしかアップ出来なかったのが非常に面倒だったからです。

まぁ、3000円しないならまぁまぁかな。
ちなみにVer1.Xはソースが公開されているので、コンパイルしてインストールできます。
最新はVer2.0.9。

Flickr Export

もともとはソフトウェア開発が本業なんですが、会社のサーバー管理していたり、趣味でLinux触っている関係で、インフラ構築案件に携わることになりました。

本業とはちょっと違うのですが、たまたま似たような作業、OpenPNEとか、Apacheとか、MySQLとかネットワーク構成とかやったことあったので、そこそこお役に立てているいるようです。

一つ前の案件でも、軽くインフラ周りを見ていたのですが、
最近の案件では、ネットワーク冗長化 + HA構成 + 外部ストレージディスクがトレンドですね。

ちょうどついこの間まで、AIXの冗長構成を見ていたので、割とすんなり理解できました。
今回はLinux×6台で、Webサーバ、DBサーバ、ストリーミングサーバ、CMSなどなかなか面白い案件です。

ネットワークはfirewall、ロードバランサ、VPNなど一般的なライナップですが、なかなか興味深いです。

おかげでデータセンターに2日間ほど入り浸る事ができました。ん〜〜良い経験。
あと数回はデータセンターに行く予感がしています。
個人的にはデータセンターの近くにキルフェボンがあるのが○。

個人的にはMPP環境の構築をやってみたいんですけどね。
会社であいているThinkPadでThinkPadクラスタ組んでみようかなぁ。なんて企む毎日です。

最近リメイクされて何かと話題の竹宮 惠子 の「地球へ・・」を読みました。

30年前のSEコミックなんですが、その斬新なストーリーと綺麗な絵は今読んでも全然遜色は有りません。
特に最近アニメでリメイクされていて、その一話をみて、どうしても気になっていたので、これまた最近出たばかりの愛蔵版を買ってきました。

地球へ・・・

舞台は、現代から遠く離れた未来―S.D.(Superior Dominance:特殊統治体制、西暦3千数百年)の時代。
人類が地球を窒息させている」と結論付けた一部の人間の考えにより、人類の手ではもはや修繕不可能なまでに進んだ環境破壊で生命滅亡の淵にある地球を再生するため、全ての人間がマザーコンピュータとともに植民惑星へ退去します。

その後人類は全てを類は出生から成長、死に至るまですべてコンピュータによって完全に委ね、思想教育を行い、14歳の「目覚めの日」前後に成人検査で健全なであるとコンピューターに判断された人間のみが成人として、再生されつつある地球での暮らしを許されるという、管理された社会を作ります。

しかし、その過程で特殊なエスパー能力を持った「ミュウ」といわれる新たな人類も誕生させてしますます。地球を導く立場にある一部のエリート達、そしてマザーコンピューターは「ミュウ」を迫害し、根絶やしにしようとします。

迫害を逃れたミュウ達は、なんとか人間達と共存すべく、そして、母なる星「地球」へ帰るべく、必死に呼びかけますが、人間達にはその想いは伝わりません。
人間とミュウとの悲しい歴史を繰り返すなかで、主人公ジョミー・マーキス・シンがミュウとしての強大な力に目覚める。

というところから始まります。
個人的には、人間社会でエリートとして成長してゆく、キース・アニアンの無感情で冷徹でありながら、人としての感情の二律背反性が非常に好きでした。

昔の漫画とはいえ、とっても斬新なので、興味のある方は是非。

お仕事の関係で「MySQLのデータディレクトリ(インスタンス)を、物理的に別のディレクトリにしたい。」との要望があって、調査を依頼されました。

ちょっと調べて見たところ、MySQLのデータベースの実体はファイル(ディレクトリ)という事をしりました。
MySQLでは、datadir という変数があって、 この変数がデータベースディレクトリ名を保持しています。
このdatadirで指定されたパスの下にデータベースがフォルダとして作成されていくわけですね。

mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| datadir       | /usr/local/mysql/var/ |
+---------------+-----------------------+
1 row in set (0.00 sec)

で、このdatadirの下に作成されるデータベースを物理的に違うディスクに置く方法ですが、
一番手っ取り早いのはシンボリックリンクです。

たとえば、/disk1/database1と/disk2/database2というデータベースを作りたければ、
CREATE DATABSEをせずに、

$ ln -s /disk1/database1 /usr/local/mysql/var/database1 
$ ln -s /disk2/database2 /usr/local/mysql/var/database2 

としてあげれば、大丈夫です。あとはリンク先のディレクトリに書き込みの権限を与えてあれば、
CREATE DATABASEせずに、USE database1とか通ります。で、CREATE TABLEでOK。

MySQLのデータベースって単なる空ディレクトリで、ファイルシステムを作成すると、データベースとして認識してくれるという凄いオチが・・・

つまり
CREATE DATABASE hoge = mkdir hoge
と等価なわけですね。

・・・ちょっとビックリ。

ちなみに、InnoDB使っている場合は、my.cnfの設定で複数のディスクを指定できるんですが、
どのデータベースが、何処のディスクに入るか指定できるか見検証なので解らないです。

今度やってみよう。

昔書いたものですが、再利用します。オブジェクト思考だから。
前に書いたOOJS続きです。

Javascriptでの継承とオーバーライド

前回Javascriptでのオブジェクト指向プログラミングを見てきました。

今回は継承とオーバーライドについてお話します。Javascriptでは継承はcall()とapply()を使います。

call()メソッドを使った継承の例

下のコードを見てみてください。

<html>
<body>
<script type="text/javascript">
function Person(_name, _email) {
  this.name = _name;
  this.email = _email;
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br><hr>");
  }
}
function Manager(_name, _email, _roll) {
  Person.call(this, _name, _email);
  this.roll = _roll
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br>");
    document.writeln("  役職        : " +  this.roll + "</br><hr>");
  }
}
var taro = new Person("太郎", "taro@example.com");
taro.show();
var hanako = new Manager("花子", "hanako@example.com", "部長");
hanako.show();
</script>
</body>
</html>

Person関数はnameとemailというプロパティを持っています。また、プロパティを表示するshow()というメソッドを持っています。

ここで、役職を持っているAdminという関数が必要になったとします。

役職を識別するrollというプロパティが新たに必要です。勿論Adminにもnameとemailはあるでしょう。
こういった場合、Personを継承してAdminという関数(クラス)を作るのが良いです。

function Manager(_name, _email, _roll) {
  Person.call(this, _name, _email);
  this.roll = _roll
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br>");
    document.writeln("  役職        : " +  this.roll + "</br><hr>");
  }
}

ポイントは、Person関数をcall()メソッドで読んでいる所です。
call()メソッドはFunctionオブジェクトが持つメソッドで、関数に引数を渡しています。また、showメソッドを上書きしています。
継承元の関数を、継承した関数で上書きすることをオーバーライドと言います。

これでオブジェクト指向プログラミングのポリモフィズムは実現できそうです。
ただし、オーバライドを含む継承の際にはcall()を呼ぶ場所に注意してください。試しに下記コードを実行してみてください。
call()を呼ぶ位置を一番下にしてみました。

function Manager(_name, _email, _roll) {
  this.roll = _roll
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br>");
    document.writeln("  役職        : " +  this.roll + "</br><hr>");
  }
  Person.call(this, _name, _email);
}

Person関数のなかでもthis.showプロパティにファンクションを代入しているため、showがオーバーライドされてしまっていますね?

ほとんどの場合、は先頭で呼んでおけば問題は無いと思います。

apply()メソッドを使った継承の例

ほとんどcall()の場合と変わりません。

<html>
<body>
<script type="text/javascript">
function Person(_name, _email) {
  this.name = _name;
  this.email = _email;
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br><hr>");
  }
}
function Manager() {
  Person.apply(this, arguments);
  this.roll = arguments[2];
  this.show = function () {
    document.writeln("  名前      : " +  this.name + "</br>");
    document.writeln("  Eメール : " +  this.email + "</br>");
    document.writeln("  役職        : " +  this.roll + "</br><hr>");
  }
}
var taro = new Person("太郎", "taro@example.com");
taro.show();
var hanako = new Manager("花子", "hanako@example.com", "部長");
hanako.show();
</script>
</body>
</html>

apply()メソッドは可変長引数に対応しています。
但し、IEではサポートしていないので、注意が必要です。

Javascriptでのオーバーロード

Javascriptではオーバーロードは可能でしょうか?

オーバーロードとは、同じ名前のメソッドですが引数の数を変えることで、別のメソッドとして扱う事です。

下のコードはJavaでのオーバーロードの例です。

class hoge() {
  // 省略
  void example(String strVal) {
    // 処理1
  }
  void example(String strVal, int intVal) {
    // 処理2
  }
}

上記の様な同名のメソッドが合った場合、example("文字列")と呼び出せば、処理1が実行されます。example("文字列", 1)と呼び出された場合、処理2が実行されます。感の良い皆様はおわかりだと思いますが、Javascriptにおいてはオーバーロードは実装出来ません。
Javascriptのメソッドはあくまでプロパティと同じ扱いなので、上記の用に書いた場合、2個目のファンクションで1つめのファンクションが上書きされてしまいます。
Javaにおいてはメソッドを識別するのに、メソッド名と引数の定義を使っています。コレをメソッド・ディスクリプタと言います。
Javascriptではプロパティ名としか認識していませんし、可変長引数が有るため、引数の定義でメソッドを識別出来ないためですね。誠に残念ではありますが、此処は泣いて馬謖を斬るしか有りません。

これでオブジェクト指向プログラミングの最低限の道具はそろいました。

アドセンス

MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore
MoMAstore
MoMAstore
MoMAstore