VB.NET + NUnit 2.5 の Assert.Throws で例外のテスト

[ブログ紹介] NUnit 2.5 で追加された Assert.Throws: TDD.NET

を参考に VB.NET の書き方にしただけですが。

Imports NUnit.Framework

Public Class ExceptionTest
    Private Shared Function throwArgumentException(ByVal obj As Object) As String
        Throw New ArgumentException("VarType Error: " & TypeName(obj))
    End Function

    
    Public Sub ArgumentExceptionTest(ByVal obj As Object, ByVal expected As String)
        Dim ex = Assert.Throws(Of ArgumentException)(
            Function() throwArgumentException(obj)
        )
        Assert.That(ex.Message = expected)
    End Sub
End Class

サンプルコードは実際のコードを編集して書きましたが動作確認してないので参考程度に。

.NET のサンプルってC#の場合が多いので「VB.NETではどう書けばいいのかなぁ」ってことも結構あります。

Facebooktwitterlinkedintumblrmail

MacでPPTP(VPN)接続しつつ、通常の接続も行えるようにする方法

Mac OS X 10.5でPPTP接続する方法

MacでPPTP使ってVPN接続するようになって、いろいろと面倒だったことが解決して良かった。
と思っていたのですが、PPTPの方の優先度を上げないといけない場合は、通常の接続が駄目になってしまうようです。
VPN側にインターネットへの制限が掛かっていたりしたら、残念なことになります。
ローカルなネットワークにPPTPに繋ぎながら、それ以外は通常の経路で通信ということで下記にて解決しました。

方法としては、PPTPの優先度は通常のインターネット接続より下げておいて、特定のネットワークアクセスの場合のみPPTPインターフェースを使うようにしてあげればいいようです。VPNを接続した後、ターミナルで下記コマンドを実行すればOK。

sudo route -nv add -net 192.168.13 -interface ppp0

ただ毎回ターミナル上げるのは面倒臭いです。 ちょっと調べると、PPTPが開始するときに実行されるスクリプト(参考)があるじゃないですか。ということで

sudo vi /etc/ppp/ip-up

#!/bin/sh

if [ "$1" = "ppp0" ]; then
/sbin/route -nv add -net 192.168.13 -interface ppp0
/sbin/route -nv add -net 192.168.15 -interface ppp0
fi

のような感じで、route add するスクリプトを書きました。

sudo chmod Cheap Adobe Photoshop CS5 744 /etc/ppp/ip-up

するのをお忘れなく。

もっと楽、シンプルな方法があったら教えてください。

Facebooktwitterlinkedintumblrmail

VS2010+NUnit2.5.10でテストメソッドをデバッグ

VB.NET+NUnitで開発をしていますが、テストをしてもメソッドの戻り値しか確認できず不便だったので、テストメソッドもデバッグできるようにしました。

1.
ソリューションのプロパティからスタートアッププロジェクトをテストプロジェクトに変更。
マルチスタートアップでも可。
2.
テストプロジェクトのプロパティを開いてデバッグの開始動作を[外部プログラムの開始]に変更。
ファイル選択からnunit.exeを指定。
3.
開始オプションのコマンドライン引数にテストプロジェクトのdllを指定。

これでできるはずだったのですが、起動はしてもブレークポイントに反応してくれません。
調べてみると、
[VS2010][NAgile] VisualStudio2010 Express + NUnit でDebug実行ができない場合
こちらのページを発見しました。
どうやら.NET Framework 4.0だとデバッグ実行ができないみたいです。
なので上のページを参考にさせていただいて、nunit.exe.configを編集。

4.
nunit.exe.configのconfiguration内に下の3行を追加。


    

上書きして実行してみると、ちゃんとブレークポイントに反応するようになりました!

Facebooktwitterlinkedintumblrmail

PHP + SQLite で正規表現(PDO_SQLITE編) in CakePHP

CakePHP 1.3.6 での話です。

これ、やったのはずいぶんと前なんですが書いてなかったですね。
私はすごくうれしかったのですが、周りの反応は薄かった覚えがあります。

CakePHP 1.3 でSQLite3ってのはかなりイレギュラーで、確か、CakePHPのTracから探してきたドライバ(dbo_sqlite3.php)を使用しています。
確認しようと思ったのですがTracに繋がらないぞ?ってな状況。

そんなこんなでとてもマイナーな話なんですよね。 反応が薄いのもむべなるかな。

ですが、PDOでSQLiteにアクセスしている場合なら応用が効くかと思います。
dbo_sqlite3.php 内部でPDOが使用されておりますので。

app_model.php でやっているので関係するところをまとめて引用。

class AppModel extends Model {
    function beforeFind($queryData) {
        parent::beforeFind($queryData);
        //正規表現関数有効化
        $this->regxEnable();
    }

    /**
     * 正規表現関数有効化
     */
    public function regxEnable(){
        $db =& $this->getDataSource();
        $db->connection->sqliteCreateFunction('RGX', array('AppModel', 'sqliteRegexMatch'), 2);
    }

    /**
     * 正規表現関数
     */
    public function sqliteRegexMatch($regex, $str) {
        if(empty($regex)){
            return true;
        }else{
            return preg_match($regex, $str);
        }
    }
}

$db->connection がPDOのインスタンスです。
sqliteRegexMatch で $regex が empty の場合に true を返しているのは実装しているアプリケーションの都合ですのでご注意を。

実装の際、下記サイトを参考にさせていただきました。

SQLiteで正規表現 « karak

違いはPDOであること、preg_matchを使用していること、SQL関数を処理するコールバック関数としてメソッドを使っていることです。

CakePHP的ポイント

  • DBOからPDOのインスタンスを取得
  • beforeFindで検索時に正規表現関数を有効化

PDO_SQLITE的ポイント

  • sqliteCreateFunctionでSQL関数登録
  • sqliteCreateFunctionのコールバック関数にメソッドを登録する際の書式

使い方ですが、参考サイトと違ってpreg_matchでの正規表現であることに注意してくださいね。

私の場合、CakePHPでの使用ですので

    /**
     * モデルのconditonsに正規表現を使う場合の配列を返す。
     *
     * @param  $pattern 正規表現
     * @param  $cols 判定対象のカラムの配列
     * @return 
     */
    function whereByRgx($pattern, $cols) {
        $conditons = array();
        if(!empty($pattern)){
            foreach ($cols as $colname) {
                $conditons[] = "RGX('" . $pattern . "', " . $colname . ")";
            }
        }
        return $conditons;
    }

てなモデルでのfindなどで使用するconditions用の配列を返すメソッドを作って使っております。

Facebooktwitterlinkedintumblrmail

PHP5.1.6-27でのファイルアップロードと文字コード変換

OSはCentOS5.4でphp-5.1.6-27で確認しました。

この状態でencoding_translation = OnにしてFormタグにenctype=”multipart/form-data”を指定すると、同じForm内に入力した文字コードは自動変換されません。
encoding_translation = OffにしてPHPで全変換するか、事前にチェックして書き換えるか、悩みどころです。
encoding_translationの必要があるシステムは可能な限り避けたいなと思いますけどね。

Facebooktwitterlinkedintumblrmail

行事

クリスマスもお正月も過ぎてしまって、いろいろと書くタイミングを逃していまいましたが、
改めて、今年もどうぞよろしくお願い致します。

行事といえば、今はランタンですね。

あまりこういった祭りには参加しないのですが、先週はちょっとお誘われしたので行ってみることに。
なんだかんだ初ランタンかな~

こういうのを間近で見ると、やっぱり感動しますね。

あとはランタン行った証拠みたいなのが欲しかったので、角煮まん買ってほくほくしてました。
まあいつでも買えるんですけどね。笑

あ、今年のバレンタインデーも、社長の奥様からお菓子(プリン)を頂いちゃいました!
ありがとうございます。

女性である私が毎年楽しみにしてます(笑 this

Facebooktwitterlinkedintumblrmail

OSC北海道、セミナー

今回、私はブースで留守番してたのでセミナーで前説やったりタイムキーパーやったりはできませんでしたが、写真ぐらいは撮っておきたい!撮っていきたい!

ということで、はじまる直前

セミナー佳境でもうすぐ終わりってところ

セミナーが終わり、ブースの片付けも終わって油断してる代表

正直、セミナーは人数が少なかったのですが、興味を持ってくださるかたはすごくディープで「やってよかったなぁ」って感じでした。

でもセミナーは寂しすぎたのでもうちょっと事前の宣伝とかがんばろうかな、と思いました。

Facebooktwitterlinkedintumblrmail

OSC北海道、来場者ふえてきました

顔を写さないようにしてるのでわかりにくいですが。

Facebooktwitterlinkedintumblrmail

Mac で複数ファイルの一括置換ってどうしてます?

Windows だと Devas ってソフトでバッチリだったんですが、Mac ではいいソフトを見つけることができずにいます。

サブディレクトリ内のファイルも含めてまとめて置換は、今はターミナルで次の手順でやってます。

まず、find で特定拡張子のファイルリストをとって xargs で grep にわたして置換したい単語を検索。

$ find . -name '*.拡張子' | xargs grep 置換したい単語 

で、grepに -l オプションつけて置換したい単語が含まれるファイルリストをとって xargs で  perl にわたして置換。

$ find . -name '*.拡張子' | xargs grep -l 置換したい単語 | xargs perl -p -i.bak -e 's/置換したい単語/置換後の単語/g'

perl の -i オプションに .bak と付けてるので元ファイルは bak という拡張子で残ります。
「perlだけでやればいいじゃん」と言われそうですが、いきなりやるのは不安なのと置換が行われてないファイルまで全てタイムスタンプが変わったりしたのでこの方法に落ち着きました。

で、置換されたファイルの内容確認して問題なければbakファイル削除。

$ find . -name '*.bak'

で確認して、

$ find . -name '*.bak' | xargs rm

完了〜。 xargs ラヴ♡

Unix系なら他でも使えると思います。

いいっちゃいいんですが、記憶力がないので思い出せる気がしません。historyがあふれるとオレ終了って感じ(なのでメモという意味もあり)。

ちなみに私がターミナルで一番使うコマンドはブッチギリで

$ history | grep コマンド名

history ラヴ♡♡

Facebooktwitterlinkedintumblrmail

CakePHP で debug.log にクエリを出力する(手抜き版)

シェル書いてる時とか Web でも Ajax のときとか

「画面にクエリだされても見えないし、困る〜」

ってときありますよね?

「つーか、なんで画面にだすんだ?ログファイルに出してくれればいいのに 」

とか思いません?

で、調べたらみなさんDBのドライバを拡張して対応されてるようです。
ですが、常にクエリをログに書いて欲しいわけでもないし、ドライバ拡張とか面倒。

クエリを画面にだしてるとこどうなってるのかなぁ、と思って調べたら

cake/libs/view/elements/sql_dump.ctp

にゴリゴリに書いてありました。

これマネしてapp_model.phpにでもメソッド作ればいいんじゃないかなーってことで、作りました。

    /**
     * 通常画面に表示されるログを取得してdebug.logに出力する。
     */
    function sqlToLog(){
        $db =& $this->getDataSource();
        if ($db->isInterfaceSupported('getLog')){
            $this->log($db->getLog(), LOG_DEBUG);
        }
    }

元のログ表示と違って明示的に呼び出すものなのでgetLogインターフェースの確認とか要らない気がしますが、一応。

このメソッドを実行すると debug.log にそれまでに実行されたクエリやら付帯情報(画面に表示されてますよね)が書き出されます。注意点として、画面に出すデータを横取りしているのでログに書き出されたものは画面には表示されません。

配列を print_r で出力した形式なので見やすくはないですが、まぁ、十分かな。

Facebooktwitterlinkedintumblrmail