DHJJ [Hatsune's Journal Japan] blog

Hatsune's Journal Japan blog

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  300  : 記事  1  : コメント  744  : トラックバック  87

ニュース

あわせて読みたいブログパーツ
Firefox 3

運営サイト

Hatsune's Journal Japan
DHJJ

著作など

資格など

MVP
Microsoft MVP for Visual Basic
(April 2008 - March 2009) OCP
MCP

書庫

日記カテゴリ

わんくま同盟

2008年9月6日 #

踊るというよりステップを踏んでくれるblogパーツを←に張り付けてみました。

ステップが1種類しかないけれど、ちょっとした気分転換にいいですね。

posted @ 8:03 | Feedback (1)

2008年9月5日 #

来週末(2008/09/13)は、わんくま大阪勉強会#23です。

  • 10:40 ~ 10:50 わんくまについて
  • 10:50 ~ 11:40 「かるぼ式メモリー図ですべて解決 ~C#基礎文法編2~」刈歩 菜良 Lv?くまー
  • 11:50 ~ 12:20 「みんなの知識をWikiで共有してみませんか?」あひる Lv1くまー
  • 12:20 ~ 12:50 おひるごはん♪
  • 12:50 ~ 13:20 ライトニングトーク
  • 13:20 ~ 14:10 「THE OLD NEW UKAGAKA」ぽな Lv2くまー
  • 14:20 ~ 15:10 「三次元と戯れる 3Dオブジェクト制作。」蜜葉 優 Lv1くまー
  • 15:20 ~ 16:10 「System.AddInを利用したアプリケーション拡張」JZ5 Lv2くまー
  • 16:20 ~ 17:10 「My 名前空間の件について。」とりこびと Lv2くまー
  • 17:40 ~ 懇親会
posted @ 10:26 | Feedback (0)

2008年9月4日 #

Visual Studio 2008になってProfessional Editionでも単体テストを自動実行するツールが標準添付されました。

では、Visual Studio 2005までのProfessional Editionでは単体テストを自動実行する事はできないのかといえば、Visual Studioに対応した「NUnit」などのフリーの単体テスト自動実行ツールを導入すれば可能です。

会社の開発環境はVisual Studio 2005が中心であるため、社内での単体テストツールも自ずとNUnitが採用されています。

NUnit

NUnitとは

NUnitは、Java用のテストツールであるJUnitをベースにしており、SourceForge.net上でオープンソースソフトウェアとして公開されていて無料で利用できる.NET用のテストツールです。つまり、NUintの「N」は.NETの「N」になります。

そのほかにも、Ruby用のRUnitのように様々な環境に派生していますので、それらの総称として「xUnit」と呼ばれています。

NUnitを入手するには

入手元:http://sourceforge.net/projects/nunit

NUnitをインストールする

入手元からは.NET Framework 1.1と.NET Framework 2.0のNUnitが入手できる。例えば、.NET Framework 2.0用であれば、NUnit-2.4.5-net-2.0.msiを入手する。

msiファイルをダウンロードしたらダブルクリックすればWindows Installerが起動してインストール画面が表示されるので、デフォルト設定のままでよければ[Next]ボタンを連打していくだけでよい。もちろん、インストールドライブはCドライブ以外も可能で、その場合は[Next]を闇雲に連打せずにドライブ指定画面できちんとCドライブ以外を指定するようにしてほしい。

クラスライブラリをNUnitでテストする

テストされる側のクラスライブラリの用意

クラスライブラリをNUnitでテストする場合、もちろん、既存のクラスライブラリのプロジェクトを使っても構いませんが、テストファーストっぽく新規にクラスライブラリを作成する例でご紹介したいと思います。

Visual Studioで新規プロジェクトとしてテストされる側のクラスライブラリを作成し、クラスファイルにPublic Class、Public Sub、Public Function、Public Propertyを定義します。

このとき、実際の中身は記述する必要はなく、外部からの呼び出しができるようになっているまでで良いです。

NUnit用のクラスライブラリの用意

次に、IDEの[ファイル]-[追加]-[新しいプロジェクト]でNUnit用の新しいプロジェクト(クラスライブラリテンプレートを指定)を作成します。

ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[参照の追加]を指定します。[参照の追加]画面では[.NET]タグの中の[nunit.framework]を指定します。

ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[スタートアッププロジェクトに設定]を指定します。これで、この2つのソリューションは必ずNUnit用クラスライブラリから実行が始まります。

ソリューションエクスプローラでNUnit用プロジェクトを右クリックしてメニュから[参照の追加]を指定します。[参照の追加]画面では[プロジェクト]タグを選び、テストされる側のプロジェクトを指定します。

単体テスト用コードの作成

テストされる側のクラスライブラリにあるIsLoginメソッドを呼び出して、その戻り値がTrueであるならテスト成功という単体テストを行いたい場合、NUnit用クラスライブラリのクラスで次のようなテストコードを記述してビルドします。

Imports System
Imports NUnit.Framework

 _
Public Class Class2
    Private target As ClassLibrary1.Class1

     _
    Protected Sub SetUp()
        target = New ClassLibrary1.Class1
    End Sub

     _
    Protected Sub TearDown()
        target = Nothing
    End Sub

     _
    Public Sub ログインテスト()
        Assert.AreEqual(True, target.IsLogin("hatsune_", "hatsunedayo"), "認証チェック")
    End Sub
End Class

単体テストを記述するクラスにはTestFixture属性を付与して、NUnitのRunnerが認識できるようにします。

実際にテストを行うコードは、Test属性を付与したPublic Subとして記述します。例では1つだけ記述していますが、もちろん、いくつ定義しても構いません。NUnitのRunnerはそのすべてPublic Subを自動的に呼び出して実行してくれます。

SetUp属性がついたProtected Subは、テストを行うPublic Subが呼び出される直前に自動的に呼ばれます。テストを行うPublic Subが複数ある場合は、それぞれが呼び出される直前に1回づつ呼ばれます。今回の例では、テストするクラスライブラリのインスタンシングを行っています。

TearDown属性がついたProtected Subは、テストを行うPublic Subが呼び出された後に自動的に呼ばれます。テストを行うPublic Subが複数ある場合は、それぞれが呼び出された後に1回づつ呼ばれます。

単体テストの実行

[スタート]メニューの[プログラム]-[NUnit V2.0]-[NUnit-Gui]メニューでNUnitのRunner画面を開き、[File]-[Open]メニューで単体テスト用クラスライブラリのDLLを指定します。

ウィンドウ内の[Run]ボタンをクリックすれば、テスト成功の時は緑マーク、失敗の時は赤マークになります。このエントリのように新規にプロジェクトを作っている場合、この段階では、IsLoginメソッドの中身は空ですからTrueが返却されてくる事はありません。よって、必ず赤マークがつくはずです。

あとはテストケースを増やし、そのテストケースすべてが緑マークになるようにIsLoginの中身をコーディングしていく事になります。

UnitRun利用のお勧め

NUnit付属のRunnerは使い勝手が良いとも言えませんし、あまりデザイン的にもかっこよくありません。

そのため、以前にもご紹介しましたが、RunnerとしてはReSharper UnitRunをつかっています。

ソリューションエクスプローラでソリューションを右クリックして[Run Unit Tests]で実行できるなど非常に便利ですよ。

posted @ 12:13 | Feedback (4)

2008年9月2日 #

HATSUNE Akiraさんの二つ名は…「虚数密度(バロックミラージュ)」です http://pha22.net/name2/c/HATSUNE%20Akira

Hatsune Akiraさんの二つ名は…「幻想狂喜(カタルシスペイン)」です http://pha22.net/name2/c/Hatsune%20Akira

初音玲さんの二つ名は…「彷徨計画(サイレントバタフライ)」です http://pha22.net/name2/c/%E5%88%9D%E9%9F%B3%E7%8E%B2

初音 玲さんの二つ名は…「爆裂覚醒(スプーキーブラスト)」です http://pha22.net/name2/c/%E5%88%9D%E9%9F%B3%E3%80%80%E7%8E%B2

posted @ 11:30 | Feedback (1)

2008年8月30日 #

全体アンケートの結果をお知らせします。なお、スピーカ個別の結果については、それぞれのスピーカの方に直送いたします。

※点数は満足度を表しています。基準点が100点です。

Q1.本勉強会の全般に関して、全体に対する満足度をお聞かせください。

162.5

Q2.本勉強会の資料代、参加代(寄付)について満足度をお聞かせ下さい。

175.0

【お寄せいただいたコメント】

  • もう少しデモなどが多い方がよい
  • (参加費は)妥当です。
  • 囚人さん、えぴさんを福岡に!
  • 福岡で年4回くらいやってほしいです。
  • 九州でC++Dayできますか?
  • WPFはやった事がないので難しかったです。
  • ゆーちさんのパート3、画伯、がまた聞きたいです。
  • もう少し一般向けのセッションが必要かと思いました。

アンケートの結果は、今後の勉強会開催の参考にさせて頂きます。勉強会の参加時にはコメント欄にもご意見をご記入ください。

posted @ 1:10 | Feedback (2)

2008年8月29日 #

長い文字列定数はWEBアプリで宣言できない?

http://blogs.wankuma.com/hatsune/archive/2008/07/09/148129.aspx

でみなさんにご協力いただいてフィードバックをおこなった問題ですが、どうやら、.NET 3.5 SP1で解決したようです。もしよかったら再確認してみてください。

https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=355484

------ここから引用------

フィードバックをいただきありがとうございます。

.NET 3.5 SP1をインストールしてこの問題が解決するか見ていただけませんか?この新しいバージョンには新しいバグフィックスが入っています。
こちらでWindows 2003サーバー、Visual Studio 2008、.NET 3.5 SP1の環境で再現作業を行ったところ、ご報告いただいた現象は再現できませんでした。

(翻訳者注: .NET Framework 3.5 SP1の詳細についてはhttp://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs2008/sp1/ をご覧ください)

------ここまで引用------

posted @ 11:43 | Feedback (1)

2008年8月27日 #

全体アンケートの結果をお知らせします。なお、スピーカ個別の結果はそれぞれのスピーカの方に直送いたします。

※点数は満足度を表しています。基準点が100点です。

q1.本勉強会の全般に関して、全体に対する満足度をお聞かせください。

    150.0

q2.本勉強会の資料代、参加代(寄付)について満足度をお聞かせください。

    175.0

【お寄せいただいたコメント】

  • 椅子のある場所での開催を希望します。
  • 壁のスクリーンがもう少し大きければ良かった。
  • ちょっと会場が狭くて息苦しかったような

アンケートの結果は、今後の勉強会開催の参考にさせていただきます。勉強会参加時にはぜひコメント欄にもご意見をご記入ください。

posted @ 13:29 | Feedback (0)

2008年8月25日 #

imodeTwiter(通称、いもつい)の暗号化にはTripleDESを使用しています。

暗号化/複合部分については、以下のMSDN Onlineのサンプルを参考にしています。

MSDN Online = 10 行シリーズ~ 10 行でズバリ !! 暗号化 (VB.NET) ~
http://www.microsoft.com/japan/msdn/thisweek/10lines/encrypt_vb.aspx

しかしながら、このサンプルには重大なバグがあり、バイト配列をEncoding.Unicode.GetStringで文字列化しているために、暗号化した結果のバイト配列の中にUnicodeとして定義されていない値が入ってきた場合、その文字列を再び複合しようとするとエラーが発生します。

これは、暗号化/複合するときの2つのキー値、暗号化/複合する文字列の3つの組み合わせにより発生するもので恒常的に発生しません。そのため、なかなか見つからない、分からないというのが実情でしょう。

それを回避するには、Encoding.Unicode.GetString、Encoding.Unicode.GetBytesを使わずにSystem.Convert.ToBase64String、System.Convert.FromBase64Stringを使います。

Imports System.Text
Imports System.Security.Cryptography
Public Class TripleDESCrypto
    Private Sub Execute_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Execute_Button.Click
        Me.Crypto_TextBox.Text = TextToCryp(Me.Original_TextBox.Text.Trim, "hogehogexxxxxxxxxxxxxxxx")
        Me.Plain_TextBox.Text = CrypToText(Me.Crypto_TextBox.Text.Trim, "hogehogexxxxxxxxxxxxxxxx")
    End Sub
    Public Function TextToCryp(ByVal plainText As String, ByVal keyValue As String) As String
        Dim key() As Byte = Encoding.ASCII.GetBytes(keyValue.Substring(0, 16))
        Dim iv() As Byte = Encoding.ASCII.GetBytes(keyValue.Substring(0, 8))
        Dim des As New TripleDESCryptoServiceProvider
        des.Key = key
        des.IV = iv
        Dim transform As ICryptoTransform = des.CreateEncryptor
        Dim destination As Byte()
        Using ms As System.IO.MemoryStream = New System.IO.MemoryStream
            Using cs As CryptoStream = New CryptoStream(ms, transform, CryptoStreamMode.Write)
                Try
                    Dim source As Byte() = Encoding.Unicode.GetBytes(plainText)
                    cs.Write(source, 0, source.Length) 'sourceの内容を暗号化してmsに書き出す()
                    cs.FlushFinalBlock()
                    destination = ms.ToArray()
                Catch ex As Exception
                    Throw
                Finally
                    cs.Close()
                    ms.Close()
                End Try
            End Using
        End Using
        Return System.Convert.ToBase64String(destination)      '<-----暗号化後のバイナリ値にGetStringは使わない
    End Function
    Public Function CrypToText(ByVal crypText As String, ByVal keyValue As String) As String
        Dim key() As Byte = Encoding.ASCII.GetBytes(keyValue.Substring(0, 16))
        Dim iv() As Byte = Encoding.ASCII.GetBytes(keyValue.Substring(0, 8))
        Dim source As Byte() = System.Convert.FromBase64String(crypText)       'GetBytesは使わない
        Dim des As New TripleDESCryptoServiceProvider
        des.Key = key
        des.IV = iv
        Dim transform As ICryptoTransform = des.CreateDecryptor
        Dim destination As Byte()
        Using ms As System.IO.MemoryStream = New System.IO.MemoryStream
            Using cs As CryptoStream = New CryptoStream(ms, transform, CryptoStreamMode.Write)
                Try
                    cs.Write(source, 0, source.Length)  'sourceの内容を複合してmsに書き出す()
                    cs.FlushFinalBlock()
                    destination = ms.ToArray()
                Catch ex As Exception
                    Throw
                Finally
                    cs.Close()
                    ms.Close()
                End Try
            End Using
        End Using
        Return Encoding.Unicode.GetString(destination)
    End Function
End Class
posted @ 13:16 | Feedback (1)

一緒につくる本の執筆陣である長月葵さんやおのでらさんと顔合わせするために大阪にいったら「北浜ひな」の前だったので大阪勉強会#22に参加してきました。

なんもやるつもりはなかったのですが、ちょっと自分に挑戦をしてみたくて、LT4人目に現地で立候補しました。スケジュール調整ありがとうございます。とりこびとさん。

現場でちょこちょこっとPPTの調整をしてLT準備のために前に移動したら、中さんから「まえふりよろしく」といわれて、その場で昔のPPTを取り出して調整。スピーカーだれだっけーーーからでしたよ(笑)。

まあ、LTまえふりは何度かやりましたから、それほど大変ではありませんでした。私が東京でやってるスタイル、つまり、まえふりの中でスピーカを簡単に紹介して、各LTの直前では司会からは紹介しないのがスピーディでよいと思っているスタイルを紹介しましたが、如何でしたでしょうか。なるべくスピーディにどんどんLTが進行していく形をこれからも模索していきたいと思います(ここ何回か導入しているホイッスルもその一環)。

さて、自分のLTですが、東京勉強会#23の50分枠で話した内容を5分で紹介するという無茶をやらしていただきました。きっと、当日LT聞いた人は誰も内容を覚えていないと思います。

マイク無しで早口でしたので、言葉がどこまで聞き取れていたか若干不安ではありますが、嵐のような5分間を味わって頂けたかと思います。

それでは、通常枠やLT枠でちゃんとした話をするチャンスがありましたら、大阪でお会いしましょう。

posted @ 10:29 | Feedback (4)

2008年8月23日 #

イベントや勉強会、また各種締切などを管理するために、Googleカレンダを利用しています。GoogleカレンダとWindows Mobole機であるemoneの予定表の同期をとるためには、間にOutlookをインストールしたPCをいれて、emone⇔Outlook(PC)⇔Googleカレンダという形になります。これは少々面倒ですし、Outlookが嫌いでPCにインストールしていない人には使えません。そこで色々探してみるとどうやらNuevaSyncと使うと、GoogleカレンダをExchange Serverとしてアクセスできるようになるそうなので、早速、この方法を試してみました。

NuevaSyncとは

NuevaSyncとは、GoogleカレンダをExchangeServerへのアクセス方法で公開するためのGatewayです。Web上の仕組みですので、NemusSyncのようにJailBreakも必要ありませんし、また無料で利用できます。

注意点1

その反面、Googleカレンダに接続するためのIDとパスワードをNuevaSyncサーバに保存する事になりますので、カレンダへのエントリに取引先名などを記入する際には注意しましょう。

注意点2

Nuevasyncの仕様上、emone予定表から2週間以上前の予定が消えてしまいます。Googleカレンダには残っていますので、最初に使う場合などはGoogleカレンダに正本スケジュールを移すなどの対策が必要です。

注意点3

Nuevasyncで最初に同期をとる場合、Google側のデータは大丈夫ですが、emone側のデータが消える(カレンダを同期したときはカレンダ、アドレス帳を同期したときはアドレス帳)てしまい、Google側と完全に一致する状態になりますので注意してださい。

NuevaSyncの設定

NuevaSyncの設定は、「iPhoneカレンダとGoogleカレンダを同期する」を参照して下さい。

emoneの設定

[スタート]-[プログラム]-[ActiveSync]をクリックして、ActiveSync画面を開きます。

  • サーバーアドレス:「www.nuevasync.com」
  • ユーザ名:NuevaSyncに登録したアカウント(Googleカレンダのアカウントではありません)
  • パスワード:NuevaSyncに登録したパスワード(Googleカレンダのパスワードではありません)
  • ドメイン:nuevasync.com
  • 同期するデータ:予定表

同期動作

ActiveSyncのデフォルト動作は「手動」のため、予定表とGoogleカレンダを同期するためには、[スタート]-[プログラム]-[ActiveSync]でActiveSync画面を開き[同期]ボタンをクリックしなければなりません。

これで画面上に「同期日時」が表示されれば同期の完了です。

emoneだけではなく、WindowsMobile機であれば同様な手順で動機ができるはずですので、ぜひ、試してみてください。

posted @ 0:03 | Feedback (1)