Windowsでシンボリックリンク
Windowsの「ショートカット」は*.lnkファイル
- Windowsでリンクといえば、ファイルやフォルダを右クリックして「ショートカットを作成」すればファイルなどのリンクが作られる。
- が、単にリンク先が書かれた*.lnkというファイルが作られるだけで、ファイルなどの別名を付ける機能ではない。
「ジャンクション」
- Linuxのシンボリックリンク的な機能が実はWindows(というかNTFS)にも備わっている。
- 詳しくは http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%83%AA%E3%83%B3%E3%82%AF
- ジャンクションを作成するためのツール: http://technet.microsoft.com/ja-jp/sysinternals/bb896768%28en-us%29.aspx
使いどころ
UTF16の文字が含まれるパスを渡すと動かないツールを、無理やり動かしたいとき。
例えば、エンドユーザーが"C:\Documents and Settings\{UTF16の文字が含まれるユーザ名}\My Documents"配下に作業ファイルを置いている状況を考える。
UTF16に対応していないツールに、上のようなパスを渡すと動かないので、ファイルを移動しなくてはならない。
そこで、例えば
C:\temp
が
C:\Documents and Settings\{UTF16の文字が含まれるユーザ名}\My Documentsを指すようにジャンクションを張れば、ファイルを移動せずに動かせるようになる。
問題点
- 例えば以下が参考になります。
- 「WindowsXP、Windows2000のジャンクション機能は危険」 http://pentan.info/server/windows/junction_trouble.html
MySQL勉強メモ
概要
マスター・スレーブ型のレプリケーションDBを構築した時のメモです。
目的
- スレーブに書き込んだらやばい、ということを体験する
作業の流れ
準備
- サーバ1、2にMySQLとphpMyAdminをインストール
- サーバ1にテーブルを作った
- サーバ1をマスターとし、必要な設定を行った
- サーバ2をスレーブとし、設定を行った
レプリケーションの確認
- サーバ1にレコードを挿入した
- サーバ2のテーブルに、↑のレコードが挿入されていることを確認
スレーブへの書き込みテスト
- サーバ2(スレーブ)に、レコードを挿入できることを確認
- マスターとスレーブ間にデータの不整合が生じた
- 復旧
感想
スレーブに書きこむのはやばい、というのは知っていたが、書き込んだらどうなるか試したことはなかったのでやってみました。
スレーブに設定されているテーブルは、自分がスレーブであることは知らないので書き込めてしまうんですね。
スレーブに書き込めないように設定できないのかなーGRANT何とかで。まだまだ勉強が足りない感があるので頑張ろう
TDD勉強会レポート
概要
PHPでTDD&CIワークショップ に参加したときのまとめです
講師の方々のお話のまとめ
TDDなんぞ
- Test Driven Development
なんのためのTDDか
- クリーンなコードを書く
- レガシーコードをやっつける
- テストコードを書くことが目的ではない
- テストコードは副産物
レガシーコード?
- 「編集して祈る」ことで出来たコード
ワークショップのまとめ
内容
TDDの実践として,FizzBuzzの問題を2人一組でペア・プログラミングするワークショップが行われました.
以下にテストコードの書き方(書く際の方針)として話題に挙がったものをまとめます.
テストコードの書き方
- 最初にassertから書くことを心がける
- どうテストするかではなく、何をテストするかを最初に考える。
- 仮実装はテストコードのテストになる
<?php class FizzBuzz { function getFizzBuzz( $i ) { // 仮実装 return "Fizz"; } } class FizzBuzzTest extends PHPUnit_Framework_TestCase { function testFizzBuzz() { $obj = new FizzBuzz(); // 現状の仮実装の場合,下記のassertがFailとして検出されるはずである $this->assertEquals( "1", $obj->getFizzBuzz( 1 ) ); } }
- テストメソッドの中はできるだけ1個のassertが実行されるようにする。
- 1個目がfailになると2個目以降がテストされなくなるため。
- テストメソッドには良い名前を付けよう
- テストコードに不安があると意味が無い
- 例外が正しく投げられる事をテストしたい場合
- 2つ書き方がある。
a. アノテーションを使う書き方
<?php class Foo { public void someMethod( $some_integer ) { if( $some_integer < 0 ) { throw new OutOfRangeException(); } // do something } } class FooTest extends PHPUnit_Framework_TestCase { /** * @expectedException OutOfRangeException */ public function testFoo() { $obj = new Foo(); // 例外を投げることを期待 $obj->someMethod( -1 ); } }
b. try-catchを使う書き方
<?php class FooTest extends PHPUnit_Framework_TestCase { public function testFoo() { try { $obj = new Foo(); // 例外を投げることを期待 $obj->someMethod( -1 ); $this->fail(); // 例外が正しく投げられないと // ここに到達するため、テストは失敗する。 } catch( OutOfRangeException $e ) { // テスト成功 return; } catch( Exception $e ) { // 期待した例外が投げられないため、テストは失敗する。 $this->fail(); } } }
-
- a.とb.の書き方は一長一短がある。
- a.の書き方は、ドキュメントとして例外の情報が残るメリットがある反面、どこでFailureが起こったかを取得できない。
- b.の書き方は、どこでFailureが起こったかを取得できる反面、ドキュメントとして例外の情報が残らない。
感想など
- TDDを自分の趣味のプログラミングにも導入してみたが,テストコードを書かない場合に比べて安心して実装作業ができるようになった.
- 一人でコードを書く場合であっても,「テストコードを書く」と「実装する」の2つ立場からコーディングを行うことになるため,自然と「テストコードに漏れが無いかどうか」などと考えながら作業ができるようになった.