Archive for the ‘.NET’ Category

普段使わない漢字

水曜日, 5月 16th, 2007

 SqlServer で普段使わない漢字が文字化けするのを防げるかもしれない方法。
 通常変換では候補に出てこないような漢字、常用漢字以外の漢字が入る可能性のあるカラムの型を varchar から nvarchar へ変換する。

 今回は「冷」という漢字のニスイがサンズイの漢字が入力できないという相談を受けて、これで解決した。ただ、通常変換だと候補に挙がってこないので、入力するのが面倒。
 文字コードの問題が起こるたびに、英語圏の技術者が羨ましく感じる。

SQL Server における JIS2004 対応について寄せられる質問と回答



C#でのマルチスレッド

日曜日, 2月 11th, 2007

 C#でマルチスレッドアプリを作る。マルチスレッドとはどんなものか、というのは http://www.stackasterisk.jp/tech/dotNet/csharp07_01.jsp
を読んで、サンプルを書いてみるとよく分かった。Web開発では余りお目にかかれないと思われる点をメモ。

lock ステートメンツ
 マルチスレッドで実行する際の、割り込みを遮断する。とりあえずlock ステートメント内の処理を終わって次にいく。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_009/cs2_009_04.html
の「Column - スレッド切り替えをロックするlockステートメント -」を参考にした。

volatile 修飾子
 volatile をつけないとコンパイルされる際に最適化される。コンパイラがある変数に値が入るタイミングの余計な処理を無視してコンパイルしてしまう。変数が複数のスレッドから参照される場合に最適化されないように宣言しておく。
ちなみに英語で volatile は「揮発性の」とか「予測が非常に難しい」とか「気まぐれな」とか言う意味。

Deligates
 メソッドを参照するための型。リファレンスや解説を文章で読むと分かりにくいけど、コードを書いてみると分かってきた。

Generics
 Threading 以外でも使うけど(むしろデータをやり取りするWebアプリケーションとかでは使う方がいい)ジェネリック。Java5にも同じ機能がついてちょっと前に話題になった。

List <型名>

とすると、Object 型を保持できるコレクションの要素に決まった型を指定出来る。後で使うときにキャストが不要になるし、実行時エラーも無くなる。

例外の補足
 今回は Windows のサービスとして動くコードを書いた。Web開発で留意する例外は勿論、考えられるあらゆる例外に対して対策を考えて実装しないといけない。ネットワーク障害、DB障害、ハードウェア障害、バッファが途切れたとか変になってきた、などなど。サービスが停止する事は許されない。もし例外が発生しても処理データを保持しておき、別のタイミングでまた再試行する。

英単語
多分、日常会話では使わない。
enqueued【形】 待機状態{たいき じょうたい}の
dequeue【他動】 待機解除{たいき かいじょ}する

 COMでRS-232Cからバッファを取得するところも書きたいのだけど、まだよく分かっていないので後日。



インストーラを作る

月曜日, 1月 15th, 2007

 前回のプロジェクトで作成過程に調べた事を書きとめようとしたのだが、作り込みを優先させて、完成するころには何が分からなかったのか、何を調べたのか、何を実装したのか、等等を全て忘れてしまっている。すべてはコードに込められているのだが。何かもったいない気がする。他の人に知識を共有するときは、原因と対策と実行結果を伝えるとわかりやすい気がする。ゆとりのあるプロジェクト管理(そんなの無理か?)と調べたらメモする癖を付けなければならないと感じている。
 そして今になって、頭に残ってる事を書き出しているわけです。

 .NET では Web アプリケーションのインストーラーを作ることができる。ASP.NET だけでアプリケーションを構築したなら、ビルトしてサーバーのディレクトリに配置すればよいのだけど(dll を作成しないで直接配置するやり方もある)例えば私は今回、CrystalReports を使ったので、依存する dll も配置しなければならない。

作り方
・アプリケーションを作成した同じソリューションに Web セットアップ プロジェクトを作成する。

ソリューションのルートで右クリック→追加→新しいプロジェクト
→その他のプロジェクトの種類→セットアップと配置
→Web セットアップ プロジェクト

・外部ライブラリを使用した場合は、各ベンダーからマージモジュールが提供されている場合がある。それをプロジェクトに追加する。
・作成したプロジェクトを右クリックしてビルトすると指定した場所にインストーラが作成される。
・運用環境に .NetFramework インストール、IIS インストール、Web フォルダを作成して環境を整える。出来上がったインストーラで、Webアプリケーション自体もインストールする。

 一度インストールした後は、ライブラリの依存関係が変わってたりしない限り、Visual Studio の “Web サイトの発行” から必要なファイル(dll や *.aspx など変更になったもの)だけを置き換えればよい。



ASP.NET のログ出力

火曜日, 11月 7th, 2006

 ASP.NET のログ出力を実装する際に、良い方法を探していたら、MS のオープンソースプロジェクトという選択肢を見つけた。前に C/S システムを VB で設計した際もログ出力に不満で、良い方法を探していたら Java ではおなじみの Log4j ライブラリ の .NET 版、Log4NETを見つけた。いつの間にかいろんな種類のlog4がリリースされていた。
log4cxx C++用
log4php
PHP用
他にも Perl, PLSQL 用のものも開発されるのか?

 今回は Log4 を使わないでMS製の Enterprise Library を使ってみる。Enterprise Library にはログのほかにもデータアクセス、暗号化、セキュリティ機能などが提供されているようだ。

@IT > Insider.NET > Enterprise Library

patterns & practices Enterprise Library



ASPも新しくなった

土曜日, 8月 12th, 2006

Visual Studio 2005のASP.NETと初対面メモ。

  • Webアプリケーションの開発が簡単
    IISをインストールしてプロジェクトを配置しなくても、”ASP.NET 開発サーバー”で簡単にデバックできる。Webアプリケーション開発がとっつきにくい理由に、サーバー環境の構築があると思うけど、これなら「Webは初めてだけど、まずプログラムを書いてみたい」人向けに良い機能だと思う。
  • SQL Server 2005 Express Edition が付いてくる。
    開発後にそのままアプリケーションと一緒にDBを配布できるのだが、[ThinkIT] 第1回:SQL Server 2005 Express Edition とは によると Express Edition はデータベースの最大容量が4GBだったり、最大メモリが1GBだったり、と制限が付いているので、プロジェクトでは Workgroup Edition を使うことにした。
  • 画面デザインが簡単。
    Windows アプリケーションと同じようにフォーム部品を簡単に並べられる(前のと比べても)。デザインソースを見ていると、PHPのSmartyとかと同じくらい便利なのでは?と思った(あ、この前、ethna を使ってみたので、そのメモも後々)。
  • 画面とロジックを分離しやすくなった。
    コードビハインドといって、画面のソースとロジック部分のソースを分離しやすくなった。
  •  相変わらず MS 製品は欲しい技術情報を探すのに苦労する。MSDN のナビゲーションをもう少しどうかして欲しい。しかし、.NET 2005 初対面の感想は、結構使いやすいかも、でした。



    定数宣言時に関数が使えない

    土曜日, 4月 1st, 2006

     今回、頂いた仕事では Visual Studio .NET 2002 を使うのですが、マシンには2003 が入っています。一度 2003 を入れたマシンに 2002 を入れるのは .NET Framework の関係も怖いので MS Virtual PC を使うことにしました。結構メモリつんでるのに重い。

     ASP(VB)のクラスで定数をメンバ変数として書こうとしたとき

    Private Const mstrSql As String = _
            "SELECT * " & _
            "  FROM XXX " & _
            " WHERE XXX_Ymd >= " & Format(Now(), “yyyyMMdd”)

    のFormat(Now(), “yyyyMMdd”)の箇所でコンパイルエラーが出ていた。はまってしまって、原因が分からなかったのでSさんに聞いたら、定数の宣言では関数が使えないのでは?ということ。調べたらそういう仕様でした。ただそれだけなんですけど、メモしておく。



    ODP.NETのプリペアドステートメント

    金曜日, 2月 3rd, 2006

     人のソースコードを読むのは苦手ですが、勉強になることが多い。先のプロジェクトで私が書いたコードは、VBに慣れるのに必死なのと、早く書かなければというプレッシャーで、いま眺めていると工夫して書いていないと思う箇所が多々あります。
    Sさんのソースを読んでいて、DB処理でプリペアドステートメントを使っていました。これ、使えばよかったなぁと思いました。

    SQLを文字列として完成させてから実行するより、プリペアドステートメントで実行する方法の方が良いと思った理由は
    ・パラメータを明示的に、型によって違う関数に渡すのでバグが出にくい。
    ・デバッグの際にどこでエラーになってるのか分かりやすい。
    ・SQLをベタ書きするより、コードが見やすい。
    ということです。
    @IT > Database Expert > ODP.NETファーストステップ(1)Page 4を参照すると、ODP.NETでプリペアドステートメント(SQLステートメント)を使う方法は

    VB.NET:
    1. cmd.CommandText = _
    2. "insert into emp(empno, ename) values(:empno, :ename)"
    3. cmd.BindByName = True
    4. Dim pEmpno As OracleParameter = cmd.Parameters.Add("empno", 100)
    5. Dim pEname As OracleParameter = cmd.Parameters.Add("ename", "steve")
    6. cmd.ExecuteNonQuery()

    となるようです。

    Javaの場合は以下。
    @IT > Java Solution > Javaデータアクセスの基礎 第4回
    論より証拠??:OracleでSELECT文を実行する。(プリペアドステートメント)

    なぜか、ストアドプロシージャとプリペアドステートメントが混ざってしまう。意味は分かってるんだけど、言葉を間違ってしまう。ストアドプロシージャはDBにSQL命令を置いて実行する。
    @IT > Java Solution > Java TIPS > ストアドプロシージャでデータベースアクセスを効率化する

    あと、関係ないのだけど、最近拝見したブログの記事に C# では文字列の比較に Equals を使うな というのがあったので、あとで理解する。C#だけなのかな?VB.NETも型は同じようだけど。



    VBでよく使う小技

    月曜日, 12月 19th, 2005

    VB.NETでコーディングする際によく使った小技を忘れないようにメモしておく。
    (more...)



    文字列の比較

    金曜日, 12月 2nd, 2005

    Javaで開発しているときは、文字列を比較するときに == ではなくequals()メソッドで比較するようにしていた。.NETでも String.Equalsメソッド がある。Equalsメソッドを使わないといけないのか?とSさんに質問したら、柳臣一さんの blog : .NET や C# がメインの blog 文字列比較のパフォーマンスという記事を探してくださった。記事によると、

    1. s1.Equals(s2)
    2. String.Equals(s1, s2)
    3. s1 == s2

    の三つでは、3 は 2 を呼び、2 は 1 を呼ぶ、という実装になっているそうです。というわけで、パフォーマンスが違うだけでどれを使っても結果は同じということ。コードのわかりやすさを考えると、3の書き方に統一しようと思っている。

    ついでにJavaのもおさらい。

    Javaでは文字列比較ではequals()メソッドを使わないといけない。
    SUGAI, Manabuさんの Java 入門 | 文字列 を参照すると、

    文字列はクラス java.lang.String 型のれっきとしたオブジェクトなのですが、頻繁に使うので、プリミティブ型と同様の記法も許されており、その場合は、equals() と == が、ある程度までは、同じ結果を返すような仕組みを持っています。

    ==はプリミティブ型の比較に使って、equals()はオブジェクトの比較をする。
    String型はオブジェクトのクラスなのだが、頻繁に使われるため、プリミティブ型のように使えるようになっている。でも比較するときはequals()を使う。

    文字列を擬似プリミティブ型として宣言してみる。

    JAVA:
    1. public class StrTest {
    2.     public static void main(String strArgs[]) {
    3.         String a = "文字列";
    4.         String b = "文字列";
    5.         System.out.println("a.equals(b) ->" + a.equals(b));
    6.         System.out.println("a == b -> " + (a == b));
    7.     }
    8. }

    出力は

    a.equals(b) -> true
    a == b -> true

    次にオブジェクトとして宣言してみる。

    JAVA:
    1. public class StrTest {
    2.     public static void main(String strArgs[]) {
    3.         String a = new String("文字列");
    4.         String b = new String("文字列");
    5.         System.out.println("a.equals(b) -&gt; " + a.equals(b));
    6.         System.out.println("a == b -&gt; " + (a == b));
    7.     }
    8. }

    出力は

    a.equals(b) -> true
    a == b -> false

    SUGAIさんの記述を借りると、

    通常のオブジェクトの作成と同じ形式で作った文字列オブジェクト a,b の場合は、 == では、保持している値自身が比較されるので、別のオブジェクトの参照同士を比較したことになり、 false が戻ります。 equals() では、参照しているオブジェクトの実体が比較されるので、今の場合は true が戻ります。



    コードからリファレンスを作る

    火曜日, 11月 22nd, 2005

     ここ2週間ほど、友人や学校の先輩や前の会社から仕事の依頼がどんどん入ってきてアワアワしてました。そのうち2つはだめになって、もうひとつは交渉中。仕事を頂くというのは難しいですね。でも、声を掛けて頂けるという事はとてもありがたいことです。今回はご協力できなくても、そこから枝葉が広がっていけば良いと思っています。

    JavaでコードからAPIリファレンスを作る Javadoc というのがあります。フォーマットに沿ったコメントでメソッドやクラスの概要・引数・戻り値などを書いておくと、それらの情報をHTMLに吐き出してくれるというやつ。「多分.NETでもあるんだろうな~」と思っていたが、調べて実装するのを怠っていました。
    リファレンスを作っておくと便利だし、納品物として要求するお客さんもいるかもしれないので、癖にしておこう。これからチェックアウトするソースはコメントを書き直す。

    参考:@IT > Insider.NET > VS.NETによるチーム開発事始め > Visual C# .NETでAPIリファレンスを作る(前編)
    よく見ると、Microsoft MVPの方々のソースは、ちゃんとフォーマットに沿ったコメントを書いてますね。参考になります。

    2005/12/02追記
    VS2003ではVBの"説明"はリファレンスに反映されないらしい。例えば

    '/ <summary>
    '/ メソッドの説明
    '/ </summary>
    '/ <param name="aaaa">引数の説明</param>
    '/ <returns>戻り値の説明</returns>

    では太字の部分。時期バージョンではサポートされるとかされないとか。
    Todo:2005が来たら試してみる。