assemblyコメントを残すSQLiteのアカウントデータベースを使って、ユーザー名、パスワードで認証の可否、アカウント情報を取得するようなコンソールアプリを作った。C++からパイプ経由で呼び出されるのだが、EF使ってたりデータベースのパスワード保護をやってるせいか、接続の初期化に時間がかかって非常に遅かった。パイプ繋ぎっぱなしというのも考えたけど、使う人が嫌がったので、ラッパーDLLをリンクしてC++アプリの起動時にだけ接続処理がされるようにしようと思った。最終的には以下のような構成になった。assembly)データベースに関するビジネスロジックはAuthLib.dllにすべて実装されているが、これに対応するラッパー関数をAuthLibNativeにたくさん書くのが面倒だったので、すべてEvalという一つの関数を経由するようにした。加えて出力を格納するための、linesという文字列の配列とその要素数の参照を渡せるようにする。成功、失敗をEvalの戻り値にする。Entitiesとか使えるC#を選ぶかというところですな。Automationについて参考になりそうなページを50個ほどブックマークしたものの、多すぎるので入口として役立ちそうなページを抜粋しておく。本来はUIテストやアクセシビリティを目的としているようだが、今回は他人が作ったソフトを自動制御するために使う。プロバイダとクライアントの説明があるが、今回はクライアントのことが分かればよいはず。Forms、WPF、サードパーティのUIコンポーネントでもたいていはオートメーションプロバイダとして扱えるようだ。確証はないがUISpy.exeを使ってAutomationIdなどが確認できれば対応していると思っていいのではないかと思っている。Objectというのがある。Version現状はC#でやるのが無難そうだ。Frameworkのクラスを利用できるのだが、まだ未完成、ドキュメントがないに等しいので難しい。クラスメソッドやイテレーションを使えるのかすら分からない。COMは茨の道だと思われるのでできれば避けたい。Treeを歩き回るコードを書く代わりに、もっと楽にしてくれるライブラリというのもあるみたいだ。Automationプロバイダとして必要な機能を持っているかチェックするためのソフト。VerifyUIVerifyが内部で使っているライブラリがこれ。Adapter.NET版のAPIがあるのに何でラッパーを作る必要があるのかは気になるが、まだ調べてない。YamasakiJet/ACEでExcelファイルをCSVに変換するコメントを残すある分析装置がxlsx形式でレポート出力するのでExcelのCOMインターフェース経由でCSVに落としてから処理していました。Excelが必須になってしまいます。あとExcel本体経由なので、セキュリティ設定によっては手動でロック解除しないと開けないとかいう場合もあります。CSV変換プログラムを書く方法を調べました。12,345.67みたいな数字を12345.67に変換。12,345.67みたいな数字を12345.67に変換。Excel2CSV.csファイル名を引数に与えると、標準出力にCSVを出力します。エラーは終了コードで通知します。Excel2CSVただ、COM経由で取得したCSVとは、数値の値が違うことがあります。原因はDAOを使った場合は、表示書式を適用した後の値しか取得できないためのようです。12345.6789という数値を持つセルに、"小数以下桁数2桁、桁区切り"という書式が設定されている場合、12,345.68が抽出されます。考え方によってはこの方がいいというケースも、だめなケースもあるかも知れません。桁区切り(,)の書式はCSVにとって邪魔なので、上記のプログラムでは数値とみなせる文字列は一旦数値に変換しています。ちなみにxdoc2txtの場合は、桁区切りなし、四捨五入済みの数値を吐きます。いうか、いろいろ実験してたらxdoc2txtの出力ってゴミが入ってたりしてプログラムから後処理するのがめんどくさげ。そもそも商用ライセンスは1000本単位じゃないと買えないので却下。あと、xlsxをxlsに変換してExcel2CSVにかけると、可視シートだけが出力されるという微妙な違いもありました。普通は隠しシートの内容を見たいということはないと思いますが。YamasakiC#のプロパティに初期化の方法があればいいのにと思ったコメントを残すC#のプロパティは宣言と一緒に初期値指定することはできない。フィールドと組み合わせるか、コンストラクタで初期化するとかしないといけない。コンストラクタでやるか}}これまでは値をセットしたときにイベントを起こすとか、設定ファイルと連動させるときとかに使ったことがあったくらい。4.0」とかで調べてみるけど、無さそうですね。そのかわりちょっと興味をひく記事を見つけました。[C#]自動プロパティの必要性[C#]自動プロパティの必要性(その2)出水さんという方のコメント「アセンブリ公開するのがわかっていれば、もともとフィールドでは置かないですしね」なるほど、先日からCOMを使っているので意味分かります。インターフェースにフィールドは置けないんですよね。メンバ変数みたいなのをCOMに公開したければパブリックプロパティを使う必要があります。インターフェースに初期化データを置くというのも変な気がするので、その辺で初期化は導入されないのかもしれないですね。詳しいことは知りませんが。type)コメントを残す前回のエントリにて、アルファベットと数字の混在する部屋番号というのを扱ったけれど、結局、文字部分を削除しても問題ないということになったので、それはまあ、良くなった。sortというのがあると知ったのだが、まあ、いろいろ役にたつことだろう。それならわざわざ文字列にしなくてもよいだろうということで、INTEGERに変更した。それでずいぶん無駄なロジックやキャストなんかが減って、すっきりした。そこに新たな要求が来た。部屋番号の範囲を指定して、複数の居住者を検索する。部屋番号を文字列とみなして前方一致検索する。場合、INTEGERなので問題ない。場合、WHERE句で文字列にキャストしないとLIKEが使えない。クライアントサイドでの絞込みは馬鹿らしい。Entitiesではそうもいかない。ObjectQuery<T>のWhereは条件に文字列とプレースホルダが使えるから、その線で探してみた。CASTを使えばよいらしい。Googleで調べるのに2時間もかかったよ。いうのがSQLiteにもあって、それは結構すぐ見つかったけど、typeのところがC#の型になるとは思い浮かばず、TEXTか?VARCHAR(4)とかか?と意味不明なエラーに苦しんでいました。SQLiteを自腹で買おうか真剣に悩んで見つけたサンプルをCASTでgrepしたら見つかりました。YamasakiWCFでエンドポイントを追加したらエラーになって起動できなかったコメントを残すスクリーンキャストを見ながらWCFのデモを打ち込んでいたところ、2番目のデモでいきなり躓いた。”エンドポイントのIDタブには、mexのだけDns=localhostになっていたので、ためしに他のにも入力してみたらうF5で動くようになった。じっさいのところ、Dnsはたぶん関係なくて、このタブで設定されるCertificateReferenceの部分が、App.configにはデフォルトで追加されないので、このタブを修正したことで追加されたらしい。結局Dnsのlocalhostは元通り空白に戻したが、ちゃんと動いている。不要な値は追加しないということで、バグではないんだろうなあ、偶然でなきゃ絶対気づけなかったと思うけど。