2008年2月28日木曜日

[他]Windows Live SkyDrive

マイクロソフトより「Windows Live SkyDrive」と言うサービスがリリースされました。
無料で利用できるファイル共有サービスなんですが、最大容量が5GBある上に、1つのファイルの最大サイズが50MBのため、通常考えられるファイルはほとんどUPすることが出来ます。
また、ファイル操作用のActiveXをインストールすると、ブラウザにドラッグ&ドロップでファイルをアップロードすることが出来ます。

難点とえいば、フォルダ単位でのアップロード・ダウンロードが出来ない点です。このへんは今後のバージョンアップに期待しましょう。

2008年2月26日火曜日

[.NET]引数がポインタのWinsdowsAPIを呼び出す

引数がポインタのWindowsのAPIを呼び出す場合、C#では以下のような宣言をします。 GetMailslotInfoの場合

[DllImport("kernel32.dll")]
static extern bool GetMailslotInfo(
    SafeFileHandle hMailslot,     //メールスロットのハンドル
    ref uint lpMaxMessageSize,    //最大メッセージサイズ
    ref uint lpNextSize,          //次のメッセージのサイズ
    ref uint lpMessageCount,      //メッセージ数
    ref uint lpReadTimeout);      //読み取りタイムアウトの間隔

となります。しかし、pinvoke.netで生成できる宣言はref uintの部分がIntPtrとなります。

ほかにもっとよい方法があるのかもしれませんが、これでもとりあえず動作しますね。

2008年2月25日月曜日

[.NET].NET Frameworkソース公開(VS2008)

去年の10月ごろ、アナウンスされていた.NET Frameworkのソースコード公開されるというニュースがありましたが、ついにリリースされたようです。
ただし、アドオン機能同様に、Express Editionではサポートされないようです。
残念ならが製品版を持っていないので、私は見ることができません。。。

@ITに詳しくまとめられています。

2008年2月20日水曜日

[.NET]キーボードステータスの取得

会社用なのですが、スタートアップとシャットダウンの時に時刻を記録して集計するツールがあります。
基本的に自動的に画面を開き保存が終わると自動的に画面を閉じます。
で、土曜日など稼動日ではない場合には、念のため確認の画面を表示します。

しかし、帰る前に雑務などで、時間を記録したくないときも時刻を記録してしまうという難点がありました。そこで、シフトキー押下されていたら記録しない。というモードを追加しようと思い調査してみました。
が。.NET Framework2.0では残念ながらサポートされていないっぽいことがわかりました。
で、仕方が無いのでp/invokeです。実装はこのようなかんじ。

[DllImport("user32.dll")]
static extern short GetAsyncKeyState(int vKey);
const int VK_SHIFT = 0x10;
private void Form_Load(object senderEventArgs e)
{
    if (GetAsyncKeyState(VK_SHIFT) != 0)
    {
        MessageBox.Show("緊急停止!!");
    }
}

2008年2月14日木曜日

[.NET]C#のparams

C#2.0には、可変長の引数をサポートする、paramsというキーワードが追加されました。
実装は以下のようなかんじ。

public void TestFunc(string p1params string[] p2)
{
    StringBuilder sb = new StringBuilder();

    sb.Append("p1=").AppendLine(p1);
    foreach(string sp2 in p2){
        sb.Append("p2=").AppendLine(sp2);
    }

    textBox1.Text = sb.ToString();
}


呼び出し側はこんなかんじ

TestFunc("p1""p2-1""p2-2""p2-3");


paramsは引数の最後という条件はありますが、実装側は、p2が配列として受け取れます。

で、気になったのですが、たとえば

string[] p2 ={ "p2-1""p2-2""p2-3" };
TestFunc("p1""p2-0"p2);


のような呼び出しが可能か?ということでやってみました。結果はコンパイルエラー。
・・・えぇまぁせっかく実験したので、blogに書いてみました。ただそれだけです。

2008年2月12日火曜日

[.NET]VS.NETのショートカットキー

VS.NETにはいろいろなショートカットキーが設定されています。代表的なヤツではCtrl+Spaceで入力候補の表示など。でも、たくさんありすぎて覚え切れません。
で、とあるサイトで「MSDNに一覧があるよ」と記載されてましたので、コレをメモ。
一通り眺めておきたいですね(覚えられるかなぁ)。

JavaのツールEclipseであればCtrl+Shift+Lで一覧形式で選択できますね。

2008年2月11日月曜日

[.NET]CSVを簡単に処理する方法

よく外部とのファイル連携でCSVを使うことがあります。いまどきはXMLかもしれませんが大量のデータをバッチ処理する場合など、今でもCSVのほうが多いのではないでしょうか。

しかしこのCSVは意外とクセモノで、メンドウな処理が結構あります。たとえば
  • 文字列は"文字"のようにダブルコーテーションで区切る
  • 基本は,(カンマ)で区切るが"(ダブルコーテーション)中の場合、データとして扱う
  • "(ダブルコーテーション)中の改行はデータの一部として扱う

などなど。そんな時、TextFieldParserという便利なクラスを使用すると良いです。
このクラス名前空間がVB.NETのものになっているので、C#派にはちょっと抵抗があるかもしれません。しかし、見る限り便利すぎるので知ったからには使うしかありませんね。


@itに紹介の記事があります。MSDNを見た後ここを参考にするとわかりやすいと思います。

[追記]タイトルがCVSだったのをCSVに変更。ご指摘ありがとうございます。>匿名さん

2008年2月7日木曜日

[.NET]INSERT時の自動採番される値を取得する(SQLSERVER)

SQLSERVERのシーケンス(オートナンバー)の主キーだったりするテーブルがある場合、その値が何になるかはINSERTしてみないことにはわかりません。時としてそのキーを別のテーブルのキーに使ったり値として使ったり。。。ということがあります。
ちょっと古い記事ですが「@@IDENTITY クライシスを管理する」の中で、そういった問題の解決策のひとつとして、INSERT直後に値をSELECTしてしまうという荒業を見つけました。


今まで、SCOPE_IDENTITY()を使って値を設定したり取得したりすることはやったことがありますが、SELECT文を発行するという発想にはなりませんでした。


まぁそもそも、このようなキーフィールドは、外からを値を設定するのは、あまり良くない発想です。そういう意味ではこの方法は正しいと言えそうです。また、DataSet内の連携もあるため、意外と理想系なのかも知れませんね。また、トリガーなどで値を設定しているフィールドも参照することによって正しい値を取得することが出来ます。そういったメリットはあります。


しかし反面、コードがトリッキーに見えます。この「@@IDENTITY クライシスを管理する」を読んでいれば別だと思いますが。

2008年2月5日火曜日

[.NET]ActiveX(com)呼び出し(その3)

[.NET]ActiveX(com)呼び出し で書いためんどくささを回避する方法ですが、ほかにもアプリケーションのEXEファイルやDLLファイルを1つにまとめるには?という方法があるようです。
コレをビルド後の処理に入れれば。。。書いてあるとおりそれらしくマージできそう。

でも感覚的になんですが、GDD Blog: [.NET]ActiveX(com)呼び出し(その2)のほうがいいような気がする。