とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

カテゴリ:C# の記事一覧

| |

【C#】StreamWriterの注意点

System.IO.StreamWriterの使い方


System.IO.StreamWriterのWriteメソッドは引数に文字列を取って
指定したファイルに文字列の書き込みができる。

書き込みの途中で、指定したファイルはオープンしたままで(同じStreamで)
バイナリデータの書き込みを行いたい時は(書き込み方法を文字列→binaryに変更したい)
System.IO.StreamWriterのBaseStreamプロパティを参照し、
BaseStream.WriteByteメソッドにバイナリデータをそのまま指定すれば
そのStreamにアクセスしつつ記載が可能。

注意点としてはBaseStream.WriteByteメソッド呼び出し前に
Streamのpositionを適切に移動してあげないと意図した通りにデータの書き込みができない。



こんな感じ。

例えば、最後に終端記号(1AのEOF)を書きたい時は
一旦Flushメソッドの呼び出しが必要です。

abcde(1A)
これが意図している結果。

Flushメソッドの呼び出しがない場合は、
(1A)bcde
こうなる。

Flushメソッドを呼び出さなくてもpositionプロパティに直接数値をいれてやっても大丈夫。
バイナリデータの書き込みとか、
ストリームを意識して読み書きしたいときは、ポジションは適切に管理しないとダメだねということです。

テーマ:プログラミング - ジャンル:コンピュータ

【C#】virtual(仮想)メソッドをoverrideした時の挙動確認メモ

継承クラス利用時にいつも確かめてしまうこと


C#で継承クラスを作ってメソッドをoverrideする時、
例えば親クラスの型に子クラスのインスタンスを代入するとどうなるのか?
overrideしたメソッドは本当に正しく動くのかな?
とかかなり気になる。

ところで、「仮想メソッド」をキーワードとして調べた時
一緒に「抽象メソッド」なるものがもれなくついてきます。
この抽象メソッドは実態がない、つまりabstract キーワードによって作成するもので
当エントリで扱うvirtualキーワードを使った「仮想メソッド」とは別物なので注意して下さい。

どちらにしても、ふと仮想メソッドや抽象クラスを作成する時に
実行結果が気になってしまい、そのたびに同じようなサンプルプロジェクトを作っている。

何度も何度も作ってるうち、さすがに重い腰を動かしてメモでも取っておかなければ
今後も作り続けるだろうなと反省したのでまとめておきます。



クラス設計


確認するためにクラスを考えてみる。

継承元(Parent)と継承先(Child)の2クラスを作成する

■Parentクラスのメンバ
・Shout:叫ぶ (仮想メソッド)
・ThisShout:Shoutする

■Childクラスのメンバ
・Shout:叫ぶ (オーバーライド)
・ThisShout:Shoutする(親のThisShoutを隠蔽)
・BaseShout:親がShoutする。

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

DeviceIoControl関数の使い方~CDドライブの回転速度を指定する

kernel32のDeviceIoControl関数はとてもややこしい・・・
1関数1機能ではなく、関数の第2引数dwIoControlCodeに制御コードを渡し、
その制御コードにしたがってデバイス操作を実現します。

また、制御コードによってその他の引数に指定する構造体(Buffer)が変化するので
予め制御コードに付随する構造体の内容を理解しておく必要があります。

DeviceIoControl関数の呼び出しに必要不可欠なのが
ファイル、またはデバイスへのハンドルです。

必然的にCreateFile関数を事前に呼び出す事になるので
呼び出しのサンプルコードをまとめておきました。

今回は制御コードであるIOCTL_CDROM_SET_SPEEDを使って
CDドライブの回転速度を指定しています。

CDドライブの回転速度を指定するサンプルコード

Change the rotational speed of the CD drive use by "DeviceIoControl"

続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

接続文字列(ConnectionString)を動的に変更するには?

.NETアプリケーション開発において
DataGridViewを使ってデータベースの情報を表示することは多いです。

開発時と実行時に接続文字列を分けたいけど
デザイナ画面でデータソースを作成してしまうと
ConnectionStringを変更できない事に気づいた。

自動生成させる接続文字列とは別に、実行時にユーザーのインプットによって
接続先を変更したり、アカウント、パスワードを切り替えたりしたいことはあるはず。

仕方なくDataSetを使わずに自前で
TableAdapterやSqlCommandクラスを使って実装したけど
後々になって方法が分かったのでメモしておきます。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

C#からC++DLLを呼び出してマーシャリングの動きを確認した(後編)

やっと後編を書くことができます・・・
前回
C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)
C#からC++DLLを呼び出してマーシャリングの動きを確認した(中編)
の続きです。

今回はドラゴンの詠唱速度に焦点を当てて記載したいと思います。

その前に・・・
当記事で使っているソリューション一式をGitHubにアップしていますので
実行しながら確認したい方はどうぞ。(Debug構成だと落ちますが・・・)

C#より、C++で作成したDLLの呼び出し方法 及びマーシャリングの考察
あんちょこなソリューション名で申し訳ないです。
ではドラゴンさんの大量呼び出し、行ってみましょう。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

C#からC++DLLを呼び出してマーシャリングの動きを確認した(中編)

C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)
の続きです。

前回はC#とC++のCOM相互運用(マーシャリング)について記載しました。
今回はタイトルの通り、C++とC#のプロジェクトを作成し、実際に呼び出してみます。

プロジェクト概要


以下にプロジェクトのイメージを絵にしています。
検証用にゲームの魔法使いをイメージしたクラスを作成しました。

サモナーがクリーチャー(モンスター)を呼び出すという
なんとも安直な発想ですが・・・

サモナークラスをC#で作成
クリーチャーをC++のDLLで作成しています。

イメージとしてはこんな感じ
20130308_solImage.png

サモナーがDLL呼び出しを使い、クリーチャーを召喚するという流れです。
では、さっそく実装部分をみていきましょう。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

C#からC++DLLを呼び出してマーシャリングの動きを確認した(前編)

C#からC++のDLLを呼び出す前に必要な理解


C#からC++で作成されたDLL(アンマネージDLL)の呼び出し時における
マーシャリングに関する考え方、記載方法をまとめてみました。

大前提として、.NETとは無縁のC++で作成されたDLLを呼び出す方法を記載しています。
また、開発環境はMicrosoft Visual Studio 2010としています。

そもそもC#という言語は.NET Frameworkというフレームワーク上で動いていて
利用したメモリの開放や、細かなメモリ操作は.NETに丸投げすることで
プログラマは利用資源を気にすること無く「ユースケースとしてやりたいことを素直に書く事ができる」
言語だと認識しています。

一昔前であれば、ただのテキストファイルを読み込むにあたって

1.まずは読み込みに必要なメモリ領域を確保
2.テキストファイルを開く
3.テキストファイルを読み込む(文字コードの指定等も含まれる)
4.テキストファイルを閉じる
5.確保したメモリ領域を開放する

このような処理をプログラマが自分ですべて書かなくてはいけませんでした。
ユースケース的には2.3.4でよいのに、1と5が付随してくるのですね。
.NET上で動く言語であれば、C#にしろVBにしろファイルを読み込みするクラスを探して
new ってやれば、メモリ確保と開放を自動的に行なってくれます。

この自動的に良きにはからってくれる.NETで作ったプログラムコードの事を
マネージドコードといい、マネージドコードで作られたDLLの事をマネージドDLLと呼びます。

逆にC++等で作られた、メモリの管理はプログラマの責任に於いて行なうプログラムコードの事を
アンマネージドコードといい、アンマネージドコードで作られたDLLの事をアンマネージドDLLと呼んでいます。
ネイティブコードとも呼ばれたりしていますが、
.NETを語る時アンマネージド・マネージドは.NETから見た呼び方ですが
ネイティブコードは、何にとってネイティブなのか定義が定かじゃないので
このブログではアンマネージドと記載します。
(ネット上ではマネージドの「ド」があったりなかったりです)

また、Microsoft社が提供するアプリケーション開発に使われてきた既存のWindowsテクノロジ
――つまりは後で出てくる"user32.dll"のようにWindows APIと呼ばれるもの――
と、.NETとのやり取りを「COM相互運用」という呼び方をしています。

では早速ですが、DLLの呼び出し方法を見て行きましょう。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】指定した範囲で配列をコピーする方法の速度比較【C# 配列】

配列のコピーを行なう時に、範囲を指定する方法がいくつかあるようなので
使用感と実効速度を比較してみた。

System.Array.Copyを使う方法


Array.Copy メソッド

言わずとしれた王道中の王道だと思います。

使い方は

第1引数にコピー元
第2引数に開始index
第3引数にコピー先
第4引数にコピー先の配列に格納する開始位置
第5引数にコピーする要素数

を指定します
Array.Copy( ary1, 2, ary2, 0, 5 );
続きを読む

【.NET】正規表現を使って検索しマッチした文字列を吐き出す【調査用】

テキストファイルから小難しい検索や置換を行う場合、
正規表現を使ってこねくり回してるわけです。

そうして出てきた結果をExcelなぞに貼り付けてフィルタリングしたり
内容を精査したり・・・
現場ではよくある話でしょう。(たぶん)

正規表現に慣れてきたといえど、指定したパターンとはかけ離れた
想定外の文字列の並びがあったり、
正規表現エンジンが違ったりして使い方に戸惑ったりしていると
一発で置換できなかったりしてモヤモヤとする時間を過ごすハメになります。
最終的に途中で手順がよく分からなくなって、結局手作業で行うことに・・・

はい。本日陥りました。
というわけで、またまたC#で作成したソースコードを保持っと。
続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】CopyFileExを使ってコピーの進捗状況を取得する【WPF】

CopyFileExでコピーの進捗状況を取得する
C#でコピーの進捗状況を取得するには
API関数(kernel32.dllのCopyFileEx)を呼び出すことで実現できるけど
そのまま使うにはあまりにも.NET風じゃないので、クラス化しておいた。

相変わらずPINVOKEを利用する時は
PINVOKE.NETさんで悶絶しながら実現していくのだけど、PINVOKE.NETアドインってのがあるようだ。
便利そうだから時間があれば今度使ってみたいな。
使ってみました! → PInvoke.net Visual Studio Extensionを使ってみた

はじめてのWPFアプリケーション
今回は初めてWPFアプリケーションにしているので、GDIな書き方になってるかもしれないけど了承ください。
とはいいつつも、csのコード部分はそのまま使えるので大丈夫。

WPFで困ったのはDoEvents()がないことだった。
そもそも、今回作ったコピー処理の呼び出しを別スレッド化していないからなんだけど
コピー中に中断ボタンを有効にするためにDoEvents()メソッドを呼びだそうとしても存在しなかった。
自分で作らないとダメみたい。
こんな感じです。
続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】Stopwatch(ストップウォッチ)を使った実行速度測定用クラス【テスト用】

プログラムコードの速度確認では
Stopwatchを使って計測する事が多いけど、毎回出力処理を書くのが億劫になってきたので
クラス化しておく。

.NET Framework 4(3.5?)からしか使えないと思うが
時々使いましができるかもしれないのでメモメモ。

経過時間を正確に計測できるStopwatch クラスを利用。
使い方は以下のような感じで、計測したいコードを
StartメソッドとStopメソッドに引数(テスト用No)を指定して実行する。

その後Dumpメソッドを実行するとC\TEMPにファイルができます。TEMPフォルダがないと落ちると思う。

出来上がるファイルは日付とテスト用Noを組み合わせたもので、中身は処理時間です。
Stopメソッドが呼び出しされたIndexを条件としてファイル出力します。

ファイル名:20121029202002_TestNo_0.txt
内容:
処理No 0
0.0750594
0.0717569
0.0726305
0.0731859
0.0743963

上記内容をExcelなどに貼り付けてグラフにすることでビジュアル化なりしてください。
速度結果を選択して、グラフの挿入をすると下記のようなアウトプットになります。
メソッドを階層呼び出した時の速度比較

残念ながらマルチスレッドで同一コードが動いた場合、スレッドIDまで考慮して作っていないから
測定結果が正しく取れません。
もし必要な時はクラス変数に用意してあるStopwatch クラスとStringBuilderのSystem.Collections.Generic.List
をDictionaryかなんかにして、スレッドID+連番のような形でStopwatchクラスが自動でAddされるような実装しなおせば大丈夫。

ちなみにソースコードのコピーはD&Dでやると改行が消えてしまうので、ダブルクリック→コピーするとうまくいくよ。

クラスの実装

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】プロパティに存在しないパスが入る【global::なんじゃこりゃ】

結論としてはMSのバグなのでしょう。
ただ回避策はみつかった。よかった。

またまた、わんくまの皆様に助けてもらいました。
本当に感謝・・・・
リンク:継承コントロールのプロパティに存在しないパスが入る

継承コントロールを作成し、そのコントロールに基底のコントロールを配置。
その継承コントロールを別のFormに貼っつける。

その後、
Visual Studioのデザイナをいじると、プロパティ値に
 global::~~
なんていうコードが入り込んでコンパイルエラーになる。

例としてはこんなの
this.buttonCancel.ImageKey = global::Namespace.Properties.Resources_nb_NO.Message;
ここ、関連してるんだろうね。
Windows Forms Designer.cs files corrupt after changing language
(デザイナ使ってプロパティを変更したら破損ファイルができちゃうよ!)

<回避策>

1.プロパティを指定すること
2.宣言時に初期化しておくこと
   private Label _Label = new Label() { Text = "最初の値だよ!" };
3.さらにCaption プロパティの getter を下記のように変更。

4.DefaultValue属性を指定する

これで、最初のコードは、「初期値 = "最初の値だよ!"」、「既定値 = "でふぉるとばりゅ"」ですね。

(ほんとは、これ手抜き。綺麗に実装ずるならISupportInitialize インターフェースを作るのが良しとおもわれる)
理由・・・
建前上は
自前で Dispose する必要があると思います(Control は IDisposable なので)。

ゆえにインスタンス管理のことを考えると、TextBoxEX 内では new Label() せずに
Label プロパティの初期値は private Label _Label = null; の方が良い気がします


とりあえず、デザイナいじるとglobal::が入ってコンパイルエラーになるのだけは
直してくださいって思うよ。
でも知らない間に意図しない動きになるのもやだな。

あ。ISupportInitialize インターフェイスについてはこちら

今回の場合で言うと、void ISupportInitialize.EndInit() メソッドが呼ばれた時に、
Caption プロパティが保持している値と _Label.Text が保持している値を比べ、
違っていた場合は、_Label.Text に Caption の内容を反映させるようにするとか。

ですw

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】オーバーフロー例外(OverflowException)が発生しない【C#】

算術演算のインクリメント処理でオーバーフローが発生しても
何事もなかったかのように「1410065407」という数値が入って終了する。

C#の仕様の根本を知らなかったなんて・・・
いままで知らずにコーディングしていたかと思うとゾっとする・・・
たとえばint型をインクリメントするループでぶん回している場合、落ちてるのを知らずに
放置しちゃう可能性だってある。


落ちてよ!!!!
知らずにクルクルしちゃうよ!!

C# プログラマーズ リファレンス
でも読み直した方がよいな。

回避策は以下
/checked (C# コンパイラ オプション)
を使う。
これで、何事があったら例外発生してくれるようになる。

もうひとつが、checked キーワードを使う。
未確認飛行 C オーバーフローのチェック

逆にuncheckedキーワードを使うと、常にオーバーフローを発生させないようにするみたい。
その場合「1410065407」じゃなくって、
演算結果を2の32乗で割ったあまりが入るのだとか。

一応、コードもテストしてみた。
int maxValue = int.MaxValue;
var Value1 = unchecked( maxValue + 1 );
結果retは「-2147483684」になるから、ビットがずれるだけじゃあ?
足りない頭で考えてもダメだから、有効値の範囲ないで動きがあるんだろうね。

乱数値を出すような計算しない限りuncheckedの使い方が思いつかない。
いやぁ。参った。

テーマ:プログラミング - ジャンル:コンピュータ

【.NET】プロセスを使った処理が入力待ちとなる現象を回避

Processクラスを使って、外部ファイルを実行中に
Enterキーの入力待ちとなり次処理にすすまなくなる事があった。

実行コードとしては以下のようなもの
・プロセスを作成し、外部プログラムを指定
・外部プログラムからの進捗状況を受け取り、UIに通知する
・プロセス終了時点で終了通知を受け取り、メインスレッド側で次処理を実行する

上記を行うにあたり、
Processクラスに渡すProcessStartInfoで重要な設定は次の通り

// シェル機能を使用しない
psInfo.UseShellExecute = false;
// 標準リダイレクト入力を不許可
psInfo.RedirectStandardInput = true;

これを行っておくことで、Enterキー等の入力を破棄して
プロセススレッド側でどんどん処理を行っていってくれるハズ。
ハズなんだけど・・・・

今回、C#.NET側からformat.comを実行したら
「準備ができたらEnterキーを入力して下さい」という進捗状況から一切動かなくなる現象を発見。
もちろん、メインスレッド側ではProcessクラスの終了待ちだし、
Process側では、メインスレッドからのEnterキー待ちとなりロックが発生。

プレーンなプロジェクトを作成したらなんなく次に進むのだけど、
手をつけているソリューション内では待ちになる・・・同一コードなのになぁ。

時間内に解決への糸口を見つけることができなかったので
疑似的にEnterキー入力を行うようにして回避した。

以下、実行コード



このサイトさん的にはこんなことをしなくても大丈夫なんだけどねぁ・・・
外部プログラム実行時に処理が固まる場合には?[2.0、C#、VB]

あとは、ここでも書き込んだ人が迷っていた模様
Processクラスの入力情報取得

にっちもさっちもいかないので
MSのこのあたりを読んで、解決。
ProcessStartInfo.RedirectStandardInput プロパティ
とにかく、入力ストリームにEnterを入れ込んでやろうぜ!的な発想です。

対応に問題点等あればコメントもらえるとうれしいです。

テーマ:プログラミング - ジャンル:コンピュータ

戻り値を持つラムダ式(匿名メソッド)の書き方

C#でラムダ式を書くことがめっぽう増えたんだけど
あまり書きすぎるとよくないなぁと思いながら、なんだかんだいって書きまくってる。
だって直感的なんだもん。

今回、戻り値を返すラムダ式で、匿名的に書きたかったんだけど
直感的に書くと

「ラムダ式はデリゲート型ではないため~~型に変換できません」

とかエラーがでるんだなぁ。

ラムダを匿名的に書くと、実際はFunc<T>型に変換されたものが返るみたい。

というわけでメモ・・・

戻り値を返すラムダ式の書き方




後ろの()が気持ち悪いと思うけど、結局のところ後ろに()で引数を指定(引数なしでも)
しなければならないところをみると、ラムダ式という別モノとして考えるよりも
デリゲートのシンタックスシュガーと認識してる方がパニックにならないかもねぇ。

ついでに、ラムダについて少しメモ書きを・・・

お得意のMSさんところを見てみると・・・・
http://msdn.microsoft.com/ja-jp/library/bb397687.aspx

いろいろ情報が載ってるんだけど

・式形式のラムダ
・ステートメント形式のラムダ
・標準クエリ演算子でのラムダ

などなど、よくわからないものがいっぱい。


標準クエリ演算子の多くが、汎用デリゲートの Func ファミリに属する型の入力パラメーターを持ちます。 Func デリゲートは型パラメーターを使用して入力パラメーターの数と型、およびデリゲートの戻り値の型を定義します。 Func デリゲートは、ソース データのセット内の各要素に適用されるユーザー定義の式をカプセル化する場合に非常に便利です。 たとえば、次のデリゲート型を考えてみましょう。

public delegate TResult Func(TArg0 arg0)

このデリゲートを Func myFunc としてインスタンス化できます。int は入力パラメーター、bool は戻り値です。 戻り値は必ず最後の型パラメーターで指定されます。 Func は 2 つの入力パラメーター (int と string) と戻り値の型 bool を持つデリゲートを定義しています。 次の Func デリゲートを呼び出すと、入力パラメーターが 5 に等しいかどうかを示す true または false が返されます。

Func myFunc = x => x == 5;
bool result = myFunc(4); // returns false of course


こんな感じ???
いまいちまだFunc<>が何者なのか理解できていないところがあるんだけど

今回作った例は
標準ステートメント式でのラムダに当たるものだと予想。


うーん。
カーソルを当てるだけで英文が出てくるMSサイトを読みあさらないとダメなのかなぁ
と悩んでたら、見やすいブログさん発見!!

やさしいC# 3.0まとめblog

こちらのブログさんで紹介してる情報のほうがはるかにわかりやすくて
ディ・モールトですよ。

テーマ:プログラミング - ジャンル:コンピュータ

Parallel.For()とInvoke()またはBeginInvoke()を使うとデッドロックする

マルチスレッドでのUI操作における
UIスレッドのデットロックについてハマることがあったので纏めた。

非同期操作、かつ並列処理で、UI上のテキストボックスにテキストを追加する検証を行っていて、
特定の非同期操作でUIスレッドのデッドロックが発生していた。

Parallelで非同期処理を行って、TextBoxに結果を描画させたかったんだけど
Invokeを使えどBeginInvokeを使えど、とにかくロックする。
ちゃんと同期させてるやん!!っていう認識なんだけど、どうやら違ったらしい。

DOBONの掲示板の皆様に感謝
DOBON.NETプログラミング道掲示板


最終的なMSの説明は以下

引用
http://msdn.microsoft.com/ja-jp/library/dd997392.aspx

次の例では、並列ループが実行されている UI スレッドは、すべての反復処理が完了するまでループによってブロックされます。ただし、このループの反復処理がバックグラウンド スレッドで実行されると (For と同じ処理を行う)、Invoke の呼び出しによって UI スレッドにメッセージが送信され、そのメッセージが処理されるのを待機することになります。For を実行中の UI スレッドはブロックされているので、メッセージが処理されることはなく、UI スレッドでデッドロックが発生します。

private void button1_Click(object sender, EventArgs e)
{
 Parallel.For(0, N, i =>
 {
  // do work for i
  button1.Invoke((Action)delegate { DisplayProgress(i); });
  });
}

タスク インスタンス内でループを実行することによってこのデッドロックを避ける方法を次の例に示します。UI スレッドはループによってブロックされず、メッセージを処理できます。
private void button1_Click(object sender, EventArgs e)
{
  Task.Factory.StartNew(() =>
  Parallel.For(0, N, i =>
  {
   // do work for i
   button1.Invoke((Action)delegate { DisplayProgress(i); });
  })
  );
}



UIスレッドをブロックするステートメント内で、UIスレッドにメッセージを投げて待機するような処理を行うな。(UIスレッドはメッセージを処理できる状態にしておけ)
ってことやね。

引用コードはTask.Factoryを使ってるけど
new Thread() を使ってStart()メソッドを使っても問題なさそう。

こんな感じで。

 
private void button1_Click( object sender, EventArgs e )
{
//マニュアルスレッド・バックグラウンドでパラレル処理実行
var t = new Thread( () => {
Parallel.For( 0, 20, id => {
AddMsgUseInvoke( id + "開始" );
System.Threading.Thread.Sleep( 2000 );
AddMsgUseInvoke( id + "終了" );
} );
} );
t.IsBackground = false;
t.Start();
}

///
/// Invokeを使ったTextBox再描画処理。
///

///
private void AddMsgUseInvoke( string msg )
{
//というか、パラレル処理上での描画更新invokeの実例がどこにもない。
//2つの並列処理でもデッドロックした。使わない方がよさそう・・・
textBox1.Invoke( new MethodInvoker( () =>
{
textBox1.Text += msg + " - 1" + "\r\n";
textBox1.Text += msg + " - 2" + "\r\n";
textBox1.Text += msg + " - 3" + "\r\n";
textBox1.Text += msg + " - 4" + "\r\n";
textBox1.Text += msg + " - 5" + "\r\n";
textBox1.Refresh();
}
) );
}


ボツコードをたくさん生成してしまったけどそれは割愛してアップ。
とにかく、InvokeとParallelを使うときは必ず、別スレッドを立てること。
これが大事。

テーマ:プログラミング - ジャンル:コンピュータ

Windowsのタスクバーの表示・非表示をAPIで制御する方法。(自動的に隠す隠さないもあるよ)

いやぁ、久しぶりの更新です。
C#でWindowsAPI を使ってタスクバーを制御する機会があったので
ソースコードを丸ごと貼り付けておきます。

それにしても、APIに関するサイトでわっかりやすいのがほとんどないなぁ。
Google先生が勝手に作ってくれたらいいのに。

参考サイト
codeproject.com
PINVOKE.NET
MicroSoft Windows API 一覧
進め!中級プログラマー 創刊号

テーマ:プログラミング - ジャンル:コンピュータ

久しぶりのクライアントアプリ

ここ最近はWEBアプリの開発が増えましたね。

実際、クライアントアプリ開発の機会がめっきり減って
WEBの方が難しいなぁという印象を抱いてたわけです。

だって
ブラウザの仕様に悩まされる事もない。
開発言語とHTML、Javaの関連、WEBサーバーとの関連。。etc

セキュリティを考えれば
WWWで展開するようなWEBサイトだとミスなんて絶対許されないプレッシャーが付きまとってくる。
一度、自分が手がけたサイトにSQLインジェクションが見つかった時は凹んだものだ。

とはいえ、セキュリティに関するプレッシャーならインフラ屋さんの方がきつい気もするけど。
彼らの言い分では、枯れた技術であればマニュアル化されてるから大丈夫なんだと。
新技術のセキュリティホールが見つかった場合なんてどうして対応してるんだろ?


ただ、クライアントアプリは「WEBだから許される」ことが許されないことが多い。

例えば
「フォーカス移動と同時にデータベースにアクセスして情報を取ってきたい!」
なんて言われたら

WEBだと「ブラウザ上で通信が発生します」とか「チラツキ防止の為にAJAX使うので工数あがりますよ」とか、テキトーなこと言えばいいんだけど、クライアントアプリでできないことは
基本、ないからね。
WEBでもできるんだけど・・・

最近はあまりみないけど
お客様はクライアントとWEBの違いも分からずに要望を言うこともしばしば。
それを真に受けて

YES! 

っていうSEが、とんでもない実装を設計して後で泣くっていうパターンが多発している。

とにもかくにも、今回はクラサバ開発なので
WEB仕様に追われることもない。

じっくりC#の言語仕様を深めていこう。
というわけで先ずはラムダだ!

テーマ:雑記 - ジャンル:日記

Gushwell's C# Programming Page がすごい

TableAdapter で Command のタイムアウトを設定する方法を調べていると
まずはここにたどり着いた。
TableAdapter で Command のタイムアウトを設定するには

ちょっと記事を読んだらとっても興味深い。
そして、初めてデザインパターンのページを開く。
窓際プログラマーの独り言 -C#の話題を中心に

メインのサイトはここっぽい。
Gushwell's C# Programming Page


メールマガジン初めて購読するかもしれない。

Gushwell's さん勝手にリンクすいません。

テーマ:雑記 - ジャンル:ブログ

FC2Ad