2013年11月27日水曜日

Visual Studio Express で、 NUnitを使う

もう出尽くした感のあるネタだが、ネットで良い方法を見つけたのでメモしておく。

まず、テストプロジェクトの出力の種類を「Windowsアプリケーション」にする。
(通常のテストプロジェクトは、「クラスライブラリ」である)


そして、ダミーのエントリーポイントを追加する。

// 参照設定にnunit-gui-runner.dllを追加
public class NUnitTestRunner
{
    [STAThread]
    static void Main(string[] args)
    {
        NUnit.Gui.AppEntry.Main(
            new string[] { Application.ExecutablePath, "/run"});
    }
}

テストプロジェクトを、スタートアッププロジェクトに設定してRunすると、見慣れたテストランナーが起動する!
テストコード内でブレークポイントも使える。

GUIが目障りな場合は、出力ウィンドウに結果のみ表示させることもできる。
テストプロジェクトの出力の種類を「コンソールアプリケーション」にして、エントリーポイントを以下のようにする。

// 参照設定にnunit-console-runner.dllを追加
public class NUnitTestRunner
{
    [STAThread]
    static void Main(string[] args)
    {
        NUnit.ConsoleRunner.Runner.Main(
            new string[] { Assembly.GetEntryAssembly().Location });
    }
}

出力ウィンドウに結果が。
################################ UNIT TESTS ################################
Running tests in 'C:\Users\xxx\Desktop\NUnitExample\NUnitTest\bin\Debug\NUnitTest.EXE'...
スレッド 0x1580 はコード 259 (0x103) で終了しました。
############################################################################
##############                 S U C C E S S               #################
############################################################################
Executed tests       : 1
Ignored tests        : 0
Failed tests         : 0
Unhandled exceptions : 0
Total time           : 0.0203104881145478 seconds
############################################################################

テストランナーのDLLは、NuGetでNUnit.Runnersでインストールできる。
ソリューションフォルダ以下、packages\NUnit.Runners.2.6.3\tools\lib にある。

<xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="NUnit" version="2.6.3" targetFramework="net45" />
  <package id="NUnit.Runners" version="2.6.3" />
</packages>

2013年11月26日火曜日

jenkins氏をwindowsに招待する (v1.540限定情報)

と思ったら、公式サイトのWindows版が動かない。
8.1でもXPでも7でも動かない。
ファイヤーウォールをOFFにしても動かない。
インストール直後にIEが起動し、http://localhost:8080にアクセスするのだが、応答がない。

かなり退廃的だが、ひとつ前のバージョンなら動くようだ。

普通にインストーラからインストールして、ひとつまえ(v1.539)のjenkins.warを上書きするだけ。(thx情報提供ysさん)

2013/11/25 ver 1.541も動かない・・・
2014/03/18 動くようになっていました。

2013年11月15日金曜日

C#のデバッグに便利な属性

DebuggerDisplay属性は結構昔からあるが、表示内容のカスタマイズができなくて不便だった。それを打破する方法を見つけた。

[DebuggerDisplay("なまえ={Name}, ねんれい={Age.ToString(\"X\")}")]
public class Example
{
    [DebuggerDisplay("非公開", Name = "名前")]
    public string Name { get; set; }

    [DebuggerDisplay("非公開", Name = "年齢")]
    public int Age { get; set; }

    [DebuggerStepThrough]
    public Example()
    {
        this.Name = "未定";
        this.Age = 255;
    }
}

ダブルクォーテーションにエスケープ文字をつけるのがポイントである。これで、ToStringにより表示形式を変更できる。ちなみに中括弧はエラーになるので、String.Formatは使えない。また、@文字列も使えない。


年齢が16進数になっているところに注目!

ToStringをオーバーライドすればいいんだけどね・・・

2013年11月14日木曜日

C#で契約プログラミング

NetFramework4で契約プログラミングがサポートされたのは知っていたが、高価なVisualStudioだけかと思っていた。ところがプロ版でも使えるということを知ったので、実験してみた。

まずVisualStudioに、拡張機能を追加する。

そして、コンソールアプリケーションを新規作成する。

using System.Diagnostics.Contracts;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 3;
            int b = 2;
            Console.WriteLine("{0} / {1} = {2}", a, b, Program.Div(a, b));

            Console.ReadLine();
        }

        public static int Div(int a, int b)
        {
            
            Contract.Requires(b != 0);                  // 入力の契約
            Contract.Ensures(Contract.Result() >= 0);   // 出力の契約

            return a / b;
        }
    }
}

プロジェクトのプロパティに、見慣れないものが??


わざとb=0にしてコンパイルすると・・・

static void Main(string[] args)
{
    int a = 3;
    int b = 0;
    
    Console.WriteLine("{0} / {1} = {2}", a, b, Program.Div(a, b));

    Console.ReadLine();
}



実行しなくても、ちゃんと契約違反を見つけてくれる!

面白い機能なのだが、漫坊的には採用NGの判定となった。
  1. ExpressEditionでコンパイルできない
    べつに拡張機能が使えるようにしろよ、とか言うつもりはないが、開発関係者全員がプロ版を使えるわけではないので、これは痛い。
    ソースの関連行が無効になってくれたらよいのだが。
  2. 重い
    こんな小さなソースでも、7秒くらいかかる。まるでVS2012のWPFデバッグ開始みたいだ。とても毎回実行したいと思わない。

ExpressEditionでビルドができて、MSBuildで自動化ができるようになったら、再び検討してみるつもりである。

2013年11月13日水曜日

VB6でマルチキャストイベントの実験

VBにもイベント機構が存在しているが、イベントリスナーが複数の時、どのような動きをするのだろうか? というわけで、実験してみた。

まず、イベントを持つクラスを作る。(以下、イベントクラス)
Invokeメソッドを呼ぶと、イベントを発動するだけのクラスである。

Option Explicit

'イベントハンドラ
Public Event Hello(message As String)

'イベント発動のためのメソッド
Public Sub Invoke()
    RaiseEvent Hello(DateTime.Now)
End Sub

MainFormは、イベントクラスのインスタンスを持っている。MainFormもイベントを購読している。

CreateSubFormボタンを押すとSubFormを作り、イベントクラスの参照を渡す。SubFormのRaiseボタンを呼ぶと、イベントクラスのInvokeを呼ぶ。

すべてのイベントハンドラが呼ばれた!
しかし、いまのところ使い道が思い浮かばない・・・

以下は、フォームのソースコード

Option Explicit

'イベントを持つクラス
Public WithEvents ObjWithEvent As ClassWithEvent

'イベントハンドラに相当
Private Sub ObjWithEvent_Hello(message As String)
    Me.Caption = message
End Sub

'クラスにイベント発動を依頼
Private Sub RaiseButton_Click()
    ObjWithEvent.Invoke
End Sub

'コンストラクタの代わり
Public Sub Init(obj As ClassWithEvent)
    Set ObjWithEvent = obj
End Sub

Option Explicit

'イベントを持つクラス
Public WithEvents ObjWithEvent As ClassWithEvent

'フォームを並べて表示するのに使用
Private lastTop As Long

'イベントハンドラに相当
Private Sub ObjWithEvent_Hello(message As String)
    Me.Caption = message
End Sub

'サブフォームを作る
Private Sub SubFormCreateButton_Click()
    Dim Form As New SubForm
    Call Form.Init(ObjWithEvent)
    Form.Left = Me.Left
    Form.Top = lastTop
    Form.Show
    lastTop = Form.Top + Form.Height '縦に並べる
End Sub

'アプリ強制終了
Private Sub ExitButton_Click()
    End
End Sub

'フォーム初期化
Private Sub Form_Load()
    Set ObjWithEvent = New ClassWithEvent
    lastTop = Me.Top + Me.Height
End Sub

2013年9月18日水曜日

C#でスクリプト言語 lua を 使う

luaはグーグル先生に聞けばよいのだが、
C# 5.0 (NetFramework4.5) で使うとなると、
途端に情報が少なくなる。
古い情報ばかりで、NetFrameworkを2.0や3.5で使っている。

というわけで、
VisualStudio 2012とNetFramework 4.5で、
LuaInterfaceを使う方法である。


App.configのstartup要素に、
useLegacyV2RuntimeActivationPolicy属性を追加する。
http://msdn.microsoft.com/ja-jp/library/vstudio/bbx34a2h.aspx


<?xml version="1.0"?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
</configuration>

2013年7月26日金曜日

Visual Studio 2012 のWPFで、リボンを使えるようにする

ツールボックスの何もない所で右クリックし、「アイテムの選択」を選ぶ

 フィルタに「ribbon」と入力し、Ribbonと、使いたいコンポーネントにチェックを入れる。

2013年6月7日金曜日

翻訳してくれる! Resource Translator (VisualStudio2012拡張機能)

リソースを、自動で翻訳してくれるアドオン見つけた
http://visualstudiogallery.msdn.microsoft.com/c23de518-d3bc-4b1a-a8d8-6ce43fdb2ff4?SRC=VSIDE


使い方

プログラムの文字列をリソースへ

ソリューションエクスプローラで、リソースファイルを右クリックして、
「Translate with Microsoft Translator」を選択する

ダイアログで、翻訳する言語を選択する。
一回目は、Create a new file... にチェックを入れる。
※変換もとをAutoDetectにすると、うまく認識されなかったよ。

しばし待つと、英語のリソースができた

このとおり!Saveのアクセラレータキーが化けているけどね。 

中国語とか

ロシア語とか

いろいろな言語が選べる

どうせ他の言語はわからないし、ゼロから始めるよりはいいでしょ。

2014/06/16 VisualStudio2013だとインスコできぬ orz

2013年5月11日土曜日

サーバーを借りてみた(4) ローカルとのファイルのやりとり

サーバとのファイルのやりとりをする場合FTPとか使うんだけど、
環境構築前なので、ServerManを使ってみた。

ServerManが有効かどうか調べる(情報画面)


有効でない場合は、、、


ファイルマネージャ画面(情報画面にリンクが有る)

ファイルは、/var/serverman/htdocs/MyStrageにある。
ただし/varなので、シャットダウンすると消える



サーバーを借りてみた(3) 別にUNIXer目指すわけじゃないので

まずはMidnightCommanderのインスコ
yum install mc

これで、フォルダ移動が、劇的に楽になる。
いちいちキータイプしてられねぇよ


vi使わなくても、設定ファイルの書き換えができるよ



2013年5月9日木曜日

サーバーを借りてみた(3) 接続してみる

TeraTermにて




もうLinuxは覚えていないな・・・

サーバーを借りてみた(2) 初期化の方法

MyDTI -> 契約中サービス画面で、「各種初期化」ボタンを押す

OSを選択してから、サーバの初期化!

数分後には、契約直後の状態になるよ
(もちろんサーバのディスクも、初期化される)


サーバーを借りてみた

月々たったの500円!ワンコインだよ(@@
http://dream.jp/vps/

動かなくなっても、
いつでも元に戻せるしね。