TEMTECOMAI ORTHOSTATIC HYPOTENSION

元ダメプログラマで現ダメ中間管理職の駄文

カテゴリ: .NET

Visual Studio 2015 が 7月20日に発売されますね。
今回も引き続き Community Edition も出るみたいですね。

そして 9日後の 7月29日には Windows 10 も出ますね。
一般ユーザー向けには無償アップグレードも提供されますね。

Visual Studio 2015 でユニバーサル アプリを開発するには Windows 10 の SDK が必要らしく、Windows 10 SDK は Windows 10 が正式公開される 7月29日まで待つ必要があるみたいですね。
両者が出揃うまでの間にユニバーサル アプリを開発したい場合は Visual Studio 2015 RC とプレリリース版の Windows 10 SDK と Universal Windowsアプリツールを使い続ける必要があるみたいですね。

それなら Visual Studio 2015 も 7月29日に公開したっていいんじゃないかなって思いますけどね。

それにしても Windows 10、楽しみです。

昔に比べて C# からも扱いやすくなったって話を聞いたんで C# でやってみました。
確かに扱いやすくなっている。
VBA の時にスルーしている Workbooks とか Worksheets とか Cells あたり、VSTO の記事ではきちんと漏らさず参照しては解放してあげないとならないって話だったけど、今回は VBA のようにスルーしてみた。
ドキュメント レベルのカスタマイズで、こいつが中心となって 2種類のファイルを読み込み、新規ブックにシートを 3つ作成してデータを吐き出す。 特に Excel のプロセスが残るようなトラブルもありませんでした。
いやー面倒くさくない。 楽ちん楽ちん。

とは言え、所詮は Excel の COM オブジェクトのラッパーでしかないので、セルへのアクセスが多いと速度が出ないですね。
Worksheet オブジェクトのインスタンス内包し、各種の独自メソッドなどを組み込んだクラスを作成してガツガツと数万件のデータを読み込んでは加工して出力していったんですけれど、数万件のデータを 1件ずつセルから入出力してるとスピードの遅さが気になって仕方がない。
ならば処理の進捗をカスタム作業ウィンドウにプログレスバーなどで表示してみようと思ったのですが、これも所詮は Excel です。 長い処理を行うプロセスから進捗具合を Excel の作業ウィンドウで受け取る術がない。
スレッドを分けるとかできないんですね。
というか VBA のようにカスタム作業ウィンドウのコードに処理を詰め込んでしまえばプログレスバーに進捗を表示できるんでしょうが、いくらなんでも開発言語のメリットを殺してますよね。

Excel アプリケーション自体を駆動することを諦め、Excel のドキュメントをコントロールするライブラリを探す時間がなかった。
2年ぐらい前に ClosedXML ってライブラリを使ったんだけど、ライブラリの完成度がいまいちだったのでいろいろ泣かされた記憶がある。
今はもっと成熟してるのかなぁ。 ほかにも同種のライブラリが出てきたりしてるのかなぁ。

ともかくそういう調査をしている時間がなかったので泣く泣く VBA で行うことになりました。
VBA ならば Office Developer Tools for Visual Studio 2013 を使うよりも処理は速そうだけど、やっぱ数万件のデータってのが気になる。 データが書き込まれているファイルを開いたら、シート上のデータを 2次元配列に一気に読み取って、すべての中間加工処理は配列の中で済ませることにした。
書き込みは処理の都合上 1件ずつセルに書き込むしかない。
それでも 3万件のデータ処理が 10秒ぐらいで終わる爆速ぶり。
VBA すげーな。
そしてこの種の処理に VSTO (というか Office Developer Tools for Office) は向かないのかもしれないね。
私のスキルが低いだけか。

期末ですね。
社内ツールの依頼があったので久々に VSTO についても候補に入れてみました。
ここ 2年ほどはネットワーク屋さんのような感じだったのでツール開発は浦島太郎。

Visual Studio 2013 をインストールしてみたんですが、C# のバージョン上がってたんですね。
VSTO (Visual Studio Tools for Office) って名前が消えちゃって、今は Office Developer Tools for Visual Studio 2013 っていうんですね。 長い名前ですね。 でも ODT とか ODTVS 2013 って読まないで、便宜上 VSTO って言ってる人も多いようですね。 ほんとはどう読んだらいいんでしょうかね。 わかりづらいですね。

最近の Visual Studio は定期的に Update されてて、Visual Studio 2013 は 2014年11月に出た Microsoft Visual Studio 2013 Update 4 ってのが最新なんでしょうかね。 Visual Studio 2013 Update 4 はここからもダウンロードできますし、もちろん Visual Studio を起動して [ツール]−[拡張機能と更新プログラム] からダウンロードすることもできます。
そして Visual Studio 2013 Update 4 には関連したリースもあって、その中に Office Developer Tools for Visual Studio 2013 もありました。 Office Developer Tools for Visual Studio 2013 - 2014 年 11 月更新プログラムって名前です。
ところがこの Office Developer Tools for Visual Studio 2013 (ホントに長い名前だなぁ) には専用のダウンロード ページが用意されていないようなのです。
Visual Studio 2013 Update 4 のページの本文にインストーラー ファイルへの直リンクが貼ってあるだけなんですね。 見つけづらいよ、ホントに。
それでも実際に私がダウンロードした時はこんな親切なページ見つからなかったんだよな。 英語のブログ記事の本文にあった直リンクからダウンロードしましたよ。

うちは .NET Framework 1.1 でのリリース実績あったっけかなぁ・・・現役稼働中のシステムあったっけっかなぁ・・・人事異動で他のセクションに移っちゃったのでよくわからんのよ
まぁ主要顧客はほとんど Windows 7 へ移行済みだし (Windows 8 眼中になしって感じだし)、クライアント アプリケーションについては問題ないかもしれない。
問題はサーバーかな。Windows Server 2003 / 2003 R2 / 2008 がどれだけ残ってるかって点。そんでそれがいつ頃 Windows Server 2008 R2 や Windows Server 2012 になるかって点。
いや、2012 のインターフェイスは勘弁してほしいんだが・・・

無料で手軽に VBA 感覚で Excel を操作できるライブラリってことで ClosedXML を使い始めたんだけど、どうもいくつかの妙な現象に泣かされてます。
続きを読む

形式にこだわる性格?
http://oshiete.goo.ne.jp/qa/7777459.html
ズボンを脱がなくてもチャックを開けるだけでオシッコできるし、便座に座らなくても立ったままオシッコできるわけだし。

EF で SQLite を使うために System.Data.SQLite を使ってみたわけですが、ビューをもとにモデルを生成する際、関数を通した列はモデルに反映されないみたい。
まだ未完成なライブラリだね。

自己啓で開発中のプログラムですが、ろくな仕様書も作らないまま手書きメモだけを頼りに作っておりましたところ、土日を遊びほうけて再開してみたら記憶が飛んでいるわけです。
Visual Studio の IDE で記入するタスクってどこに保存されてるんだろうか。
SkyDrive のフォルダーにプロジェクトを保存して別の場所でも開発できるようにしてるんだけど、タスクだけが消えちゃうんだよね。

前回の続き。
データベースへの接続文字列は App.config や Web.configに書くわけですが、DB のパスに関しては DataDirectory ってキーワードが使えますわな。
たとえば
<connectionStrings>
    <add name="MyDbEntities" connectionString="Data Source=|DataDirectory|MyDB.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
とか。
これつまり、"|App_Data|" の部分は相対パスで表現した予約変数でして、Web アプリの場合はアプリのルートにある App_Data フォルダーを表し、Windows フォーム アプリの場合は実行ファイルと同じフォルダーを意味する。
ところが SQLite の .NET Framework 用ラッパーで有名な System.Data.SQLite の何が悪いのかわからんけれど、Windows フォーム アプリでは 「テーブルが見つからないよ」 みたいなエラーになるわけです。
Entity Framework で作成したモデル オブジェクトにデータを入れるところまでは問題なし。
コンテキストの SaveChanges() メソッドで DB に書き込もうとしたところでエラーが出て、そのメッセージが 「○○テーブルが見つからない」 的な。
いやいや、テーブルならホラこの通りあるじゃないか、と。
だから最初は全然気づかなかった。
英語のサイトとか調査してて何となく 「Windows フォーム アプリでは絶対パスを書かないとダメ」 みたいな情報にぶちあたったので試してみたらビンゴですわ。
使えねーぞ System.Data.SQLite !!

とりあえずその問題を置いといて開発を進めるため Connection String に実行ファイルのフォルダー パスを書きましたよ。bin\debug フォルダーのパスをね。

んで書き込みテストして、その結果を Visual Studio の中で確認してみようとしたけれどデータが反映されていないじゃないか!!

しばし考えた。
そして答えが出た。
プロジェクト フォルダー内に SQLite のデータベース ファイルがある。
このファイルはコンパイル時に bin\debug フォルダーにコピー出力される。
んで App.config 内の Connection String には C:\hogehoge\...\hogeProject\bin\debug\hoge.db って言う風にデバッグ時の実行ファイルと同じパスを記述してある。
デバッグの中で DB を更新する。これすなわち bin\debug フォルダー内のデータベース ファイルが更新される。
次に IDE のデータツールでデータベース ファイルを開いてテーブルのデータを確認してみる。これすなわち開発時に生成した接続情報を使っているのでプロジェクト フォルダーにあるオリジナルのデータベース ファイルを参照している。
更新されてなくて当たり前じゃないか

すんげー疲れたよ。
そんでオリジナル ファイルへの接続以外に debug フォルダーのデータベース ファイルを開くための接続を作ったりして混乱してきて気持ち悪くなってきたよ。

そう、結局解決策としてどうするか。
これも英語のサイトで見つけたんだけど、App.config に書かないで Connection String を動的に作成する方法。
static で適当なクラスを作り、実行ファイルのフォルダー パスとデータベース ファイルを使って作ったフルパスを System.Data.EntityClient.EntityConnectionStringBuilder なんぞに突っ込む。
さらに System.Data.SqlClient.SqlConnectionStringBuilder なんぞも使う。
そいつをコンテキストのコンストラクターで取り込む、と。
具体的なコードは面倒だから載せないよ。

8月ごろからでしょうか、ちょっと訳あって月度の CSV ファイルを読み取って、ベースになる Excel ファイルをもとに 200程度のファイルを複製して CSV の中身を転記する処理を書くことになったわけです。
今までは別の手法でデータを拾ってきて Excel ファイルに張り付けていたらしいのだけれど、その手法が NG になるので CSV から取得することになりました。

まぁ今までの手法で取得した内容と CSV の内容が微妙に違うってのもあるし、出力する Excel ファイルの書式が担当者の趣味と性格が入り込みすぎて汎用性ゼロって問題もあるのですが、それはおいおい汎用化への説得をしていくとして。

で、プラットフォームをどうしようか、という話になるわけです。
今までは Excel 2003 を使って *.xls を使ってた。 じゃぁこれからはって言うと、まず 3人いる担当者の Office のエディションとバージョンがバラバラなんですね。
1人目は Office 2003 Professional なので Excel 2003 と Access 2003 がある。
2人目は Office 2010 Professional なので Excel 2010 と Access 2010 がある。
3人目は Office 2010 Standard なので Excel 2010 だけ。
Office 2003 はそのうち 2010 に切り替わるとしても、2010 Standard ってのがちとネックかな、と。
CSV の情報を一度加工しなきゃならないし、それを蓄えておいた上で順次読み出ししながら転記しなきゃならんので Access を使おうかってなるわけです。
今回対象としている処理、今後は全データを一気に処理しちゃうようになるので、この際 Access 持ってない人には休んでいただいて、Access が入ってる 2人のうちどちらかの人に処理してもらえば問題ない。

でさっそく Access でゴリゴリと書き出して何とか最低限の処理ができるようになった。ホントは選択したデータだけ出力する機能も付けたかったけど、まずは全データを出力するほうが先。
でテストですよ。
これが終わらねーんだわ。
だんだんと処理スピードが落ちてきて、Excel ファイル 1つ書き出すのに 1秒も掛かってなかったのが 100件目ぐらいになると 10秒ぐらい掛かってるの。
その後もみるみるうちに処理スピードが落ちて行って、まるでアキレスと亀の話ですわ。

あ、まだ前置き。
もう一つの作戦として、Access じゃなくて C# の Windows フォーム アプリで作っちゃえば Access いらないじゃん、と。
こっちは完全に自己啓発ってことで自宅で作業ですわ。
Windows フォームと SQL Server Compact 4.0 あたりでどうだろうか、と。
そんでもってどうせだから Entity Framework のコードファーストで POCO なんかを使ってデータ モデルを作成してみようかなぁなんて趣味も入れちゃうわけですよ。
あらかた読み込み処理が終わったところで気づかされましたよ。

SQL Server Compact データファイルを使った DB アプリって、アプリとデータファイルさえあれば良いって事じゃないんですね。アプリを実行する PC に SQL Server Compact の関連ファイルをインストールしないとダメなんですね。
なんじゃそりゃ。SQL Server エンジンが実行されてない環境でも良いですよっていうメリットはあっても、結局余計なものをインストールしなきゃ使えないってことじゃないですか。
XML ファイルやテキストファイルをデータストアにできるような手軽さまではダメなのね。

つーことで DB は SQLite に決定。これなら DLL だけで済みそう。

そしてようやく本題の Excel 処理。
うちの開発メンバーも、どうしても Excel を扱いたいって場合は泣く泣く VB.NET を使ってたのですが、イロイロと調べていたら、Microsoft の Open XML SDK を使えば COM を使わずに Office 2007 以降のファイル フォーマット (*.xlsx とか) を読み書きできるようになるって言うじゃありませんか。
さっそく調べたのですが、出てくる話題は 「使いづらい」 「やりたい事の数倍の労力が必要」 という悪口ばかり。
ところが Open XML SDK というキーワードと一緒に ClosedXML てキーワードがやたらと出てくる。
詳細はググってもらうとして、さっそく使ってみましたよ。
導入は NuGet を使って楽ちん。
まるで COM を使って Excel を扱っているかのような滑らかさ。
ここ数年の開発で一番感動したかもしれない。
既存ファイルを開く。新規ファイルを作成する。名前を付けて保存する。上書き保存する。シートをコピー する。シートの名前を変える。セルに値を書き込む。セルの値を読み取る。
最低限これだけできれば今回の開発には十分です。

ということで開発も絶好調。
POCO のモデル クラスとデータ コンテキスト クラス、業務処理を行うクラス、CSV を読み込んでモデル データを生成するクラス、Excel を読み込んでモデル データを生成するクラス、Excel に書き出すクラス、ファイル関連のヘルパークラス、時間計算のヘルパー クラスなどを粛々と進めている最中でございます。

次回、「SQLite の Connection String に "DataDirectory" のキーワードが使えないじゃないか」 の巻き。

NuGet のバージョンが 1.8.30524.9000 に上がった。
んで気が付いたんだけど NuGet のインターフェイスや Visual Studio に表示されるメニュー項目が日本語化されてますね。(もしかしたら少し前のバージョンから日本語化されてたかもしれないけど)
まぁ日本語化されてうれしくないわけじゃないけれど、英語 UI でも不都合なかったしね。

ASP.NET MVC 3 でページングなんぞを実装しようと思い、NuGet のマネージャーを開いたらダイアログの上部に 「NuGet の更新バージョンがあるよ」 てなメッセージ。
だもんで Visual Studio 2010 の拡張機能マネージャーで NuGet を更新しようとしたんだけれどエラーが出てしまう。
エラーのログを見ると
「'NuGet Package Manager' の更新バージョンの署名が、インストール済みバージョンの署名と一致しません。したがって、拡張マネージャーを使用して更新バージョンをインストールすることはできません。」
的なメッセージが残されてた。

こんなときは
  1. 一度 Visual Studio 2010 を終了させる。
  2. Visual Studio 2010 を管理者として実行する。
  3. 拡張機能マネージャーを開いて、インストール済み一覧の中にある NuGet をアンインストールする。
  4. 改めてオンラインの一覧から NuGet を探してインストールする。
  5. Visual Studio 2010 を終了させる。
  6. Visual Studio 2010 を通常起動させる。
という手順で解決。

ASP.NET MVC の研修資料を作成するにあたり、MVC 2 とか MVC 3 とか、EF 1 とか EF 3 とか EF4.x とか。そうそうサンプルを何個も考えるのは面倒。
なんだけど、Visual Studio 2008 って ASP.NET MVC 2 までだっけ?
Visual Studio 2008 SP1 って Entity Framework 3.5 だったっけ?
Visual Studio 2010 だと MVC 2 or 3 だったっけ?
Visual Studio 2010 標準搭載は MVC 2 で、MVC 3 は SP1 に入ってるんじゃなくて独立したインストールが必要なんだっけ?
Visual Studio 2010 SP1 を入れると Entity Framework 3.5 が入ってくれるんだっけ?
Entity Framework 4.1 は独立したインストールが必要なんだっけ?
Entity Framework 4.3 は独立したインストールっていうか、NuGet でプロジェクトごとにインストールが必要なんだっけ?

まだまだ眠れないな・・・

前に勉強会を開いたとき、Visual Studio 2010 または VWD 2010 + SQL Server 2008 を想定して資料を準備してたんだけど、現場にある PC が案件の関係上、Visual Studio 2008 だったり SQL Server 2005 だったりで散々な目にあったことがある。
なので次の勉強会とか今後も考えて、勉強会を組み立てる側としても Visual Studio 2008 を用意しておこう、と。
んで PC は VMWare Player 上の Windows 7 64bit なんだけど、それすらももしかしたら間違いなのかな。
まぁそれは置いといて、ともかく Visual Studio 2008 をインストール。
インストールが終わってみて気が付いたんだけど、Visual Studio 2008 って SQL Server 2005 Epxress をインストールするんだね・・・
先に SQL Server 2008 をインストールしておけばよかったよ・・・
ま、Windows 7 64bit + Visual studio 2008 + SQL Server 2005 ってことにしておこう。
SQL Server 2005 で作成した Drop & Create のスクリプトって SQL Server 2008 や SQL Server 2012 で動くかな・・・
ともかく、Windows 7 で動かすんだから Visual Studio 2008 は SP1 に、SQL Server 2005 は SP4 まで上げとかないとな。

まだまだ眠れないな。

5

Visual Studio 2010 の SP1 インストール中に RiaServices.msi を要求されてしまい、どうしてもインストールを完了することができなかった。

この PC では前に C# 2010 Express やら VWD 2010 やらを入れてたんだけど、それらをアンインストールした経歴がある。
こいつらのアンインストールって一発じゃ行けないので手さぐりしながら一つずつアンインストールした。
そんなんが影響してるんだろうなーと思ってはいた。
そんで本日、再度チャレンジ。

ちなみに SP1 インストール前にプログラムのアンインストールを見てみると 'WCF RIA Services V1.0 ' てのがインストールされてることになってる。
こいつは Visual Studio 2010 によってインストールされたのか、それとも以前インストールしていた C# 2010 SP1 やらの残骸なのかなーと思いながら記憶を呼び覚ます。
そう、確かにアンインストール対象に入れてたはずだ。だけどアンインストールの順番が悪かったのか、アンインストールできずに残っちゃったんだった。
てなわけでこいつのアンインストールは置いといて、とりあえず Visual Studio 2010 SP1 がインストールできる方法を探る。
RiaServices.msi を要求してるんだから、要求に応えてやる作戦。

まずは SP1 のインストーラーから展開した RiaServices.msi を試してみる。

展開方法はここに書いてある方法で VS10sp1-KB983509.exe から RiaServices.msi を抽出 (つーかダウンロード) して、こいつを指定してやる。
結果はダメ。このファイルではない、と。

次は WCF RIA Services v1.0 の単独インストーラーから抽出してみる。
こいつは Microsoft (US) のダウンロードセンターから落とした。

WCF RIA Services V1.0 for Silverlight 4 and Visual Studio 2010
んでここから抽出した RiaServices.msi を指定してやる。
これもダメ。

次は WCF RIA Services V1.0 SP1 だ!!

こいつもダウンロードセンターから見つけた。
WCF RIA Services V1.0 SP1 for Silverlight 4
しかしここから抽出した RiaServices.msi もダメ。

WCF RIA Services V1.0 SP2 なんてのもあったけど、そこまでアップデートした記憶がないので無視。

万策尽きたか?
いやいや、そもそもこの RIA Services V1.0 ってどうやってこの PC に入り込んだんだっけって考えた。
使ってるツールは C# 2010 Express だったんだぞ。そんな無料版についてたか? もしかして後から何かをインストールしたんじゃなかったか?

つーと Silverlight 4 tools for Visual Studio 2010 とかか?

どうも Web で検索してみると RIA サービスと Silverlight 4 の記事が目立つ。
んで Silverlight 4 tools for Visual Studio 2010 をインストールするとか書いてある。
ならば、Visual Studio 2010 SP1 を適用する前に、まずは Silverlight 4 tools for Visual Studio 2010 をインストールしてみようじゃないか!!
てことでこれもダウンロードしてみる。
Microsoft Silverlight 4 Tools for Visual Studio 2010
お、インストールできた。てっきり不整合があって 「すでにインストールされている」 とか 「これよりも後のバージョンがインストールされている」 とか言われるかと思ってたけど素直に行けたぞ。

それでは満を持して Visual Studio 2010 SP1 を適用してみる・・・
行けた、行けたよママン
無事にインストールできたよ。
ようやく眠ることができるよ・・・

Website Spark に参加して Expression Studio 4 Ultimate をダウンロードしてインストール。
とりあえずどれかのアプリを起動してライセンスキーを入れて認証 → 失敗。
Expression Studio 4 Ultimate を入れる前にパッケージ版の Expression Blend 4 を入れてたことがあるからか?
気を取り直して電話でライセンス認証。5分くらいで完了。

about

めでたしめでたしと思い、「新しいプロジェクト」 のダイアログを見ると、ダイアログ上部に 「SketchFlow オーサリングの有効期限はあと 55 日で切れます。」 のメッセージと [ライセンス認証の手続きを今すぐ行う] のボタンが。。。
newProject

なんで?
念のためボタンを押してみるとオンライン認証のプログレスバーが表示され、その後に 「正常にライセンス認証されました。ありがとうございました。」 と表示される。
しかし再び新しいプロジェクトのダイアログを表示させると何も変わっていない。
56日後に何らかの結果が出るんだろうな。

ナビゲーションプロパティを辿れば親モデルのビューで子モデルのレコード群を引っ張れるんだね。
これで表示上は、親レコードの画面に子レコード群も表示できるから安心。
あとは子レコード群の追加、変更、削除をどこでどうやってやらせるかだね。
親モデルと子モデルを同時に表示させるのが利用者にとって自然な表示法であるならば、親モデル用の Details View、Create View、Edit View、Delete View あたりでは子モデルの内容も表示させておきたい。
で、子モデル自体を操作する場合もなるべくなら親モデルと、兄弟の子モデルも表示させておきたいってもんだ。
子モデルの操作なのだから View も子モデル用の物を使うわなきゃならんわけなので、親モデル用の各ビューと同じデザインにしてしまうのは当然としても、子モデルの Create View、Edit View、Delete View の時に親モデルや兄弟の子モデルをどうすっかなーっていう技術的な問題もあるかな。
これもナビゲーションの件と同様、簡単にできちゃうのかもしれないけど。

asp.net または silverlight でゲージ コントロールを使いたい。
100% まで伸びる棒があって、80% を超えると棒の色が赤になるとか。
もしくはありがちなメーター タイプでもいい。
フリーでないのかな。
CodeProject にダイブしてみようかな。

作る時のためにメモメモ。

カスタムな共有フォルダーを作って欲しけりゃ所定の申請を行う。
システム担当者が作業を行い、オイラが確認を行う。
今はファイル サーバーにリモート デスクトップでアクセスしてフォルダーのプロパティーのセキュリティー タブから詳細を表示させて確認している。設定の内容は "読み取り" とか "変更" みたいな単純設定じゃなくて、社内で規定されてる設定内用にする。
かなり面倒。
WMI を使った VBScript はできてるけど GUI 版も欲しいところ。

.net な Windows アプリで、実行ユーザーは一般権限しか持たないオイラ。
そんなオイラがアクセスできないパスでも、申請書に書かれているパスを与えるとアクセス権一覧を確認できるようにしたい。
内部的には管理者特権で対象パスにアクセスするように WMI を利用する。

対象パスを与えるとエントリーされてるグループやユーザーのアカウント一覧を表示し、さらに各アカウントのアクセス権内容を表示する。

できれば、規定されてるアクセス権設定のどのタイプと合致しているかも表示してくれれば、細かいアクセス権の目視確認が不要になる。

対象パスの文字列、作業ユーザーのアカウント名とパスワード、エントリーされてるアカウント名の一覧を保持するクラス。

一つ分のアカウントの内容を保持するクラス。
こいつは対象アカウントの名前、ドメイン名、各アクセス権ごとの bool 値を保持するクラス。

こんなところか?

何が何だかさっぱりだ。
背景も状況もわからん。
でも解決したってんだから良いだろう。
Application.Wait の参照設定

MSDN サイトダウンロード ページ右下にある新着ダウンロードの一覧に懐かしすぎる名前がリストされてます。
DCOM95 for Windows 95 とかw
新着ダウンロード?

Access や Word から Excel を CreateObject してブックを開いて上書き保存すると、ブックを閉じて Excel を Quit しても Excel のプロセスが残ってしまう問題の続き。
複数の打合せで一日中離席している間に部下本人がある程度まで調査してました。
周りの Windows XP SP3 + Office 2003 SP3 な PC では再現しなかった。
Office 周辺で違いを調査した。
本人の PC には Office Live アドイン(バージョン不明)が入っていた。
(ホントはここで同じ Office Live アドインが入ってる PC を見つけられるとよかったが)
本人の PC から Office Live アドインをアンインストールして実験してみたところ、見事にプロセスが消えてくれた。
このままだと Office Live アドインに原因があるのか、インストールされていたアドインの状態に原因があるのかわからん。
マイクロソフトのサイトから Office Live アドイン 1.2 (正確には Microsoft Office Live Update 1.2 ) をダウンロードしてインストール。
またプロセスが残ってしまった。
1.2 をアンインストールせず Office Live アドイン 1.3 (正確には Office Live Update 1.3) をインストールして実験。
まだプロセスが残ってしまう。
1.3 もそのままに Office Live アドイン 1.4 (正確には Office Live Update 1.4)をインストールして実験。
今度はちゃんとプロセスが消えてくれた。

本人はサポート担当じゃないので細かいところで調査不足はありますが、とりあえず仕事を先に進めなくてはならないのでこのまま放置。
あとで時間があれば別の PC に Office Live Update 1.3 あたりを入れてみます。

金曜の帰りしな、部下が浮かない顔をしているので訊いてみると Excel のプロセスが残ってしまって困っているらしい。
C# か VB.net の話かと思ったら VBA だっつうんだ。
現象が再現するミニマムなコードがこんな感じ。 一応 .NET の風習に習って Workbooks も変数で参照してみた。
Access VBA の標準モジュールから Excel をコントロールする。
Sub Test()
    Dim xlApp As Object
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True

    Dim xlBooks As Object
    Set xlBooks = xlApp.Workbooks

    Dim xlBook As Object
    Set xlBook = xlBooks.Open("D:?hoge.xls")

    xlBook.Save
    xlBook.Close
    xlApp.Quit

    Set xlBook = Nothing
    Set xlBooks = Nothing
    Set xlApp = Nothing
End Sub

ちなみに xlBook.Save こいつをコメント アウトするとプロセスが消えてくれる。

Windows XP SP3 & Office 2003 SP3 の PC で再現を確認。ただし時間がなかったので部下の 1台でしか動かしてない。
ちなみにオイラが使ってる Windows XP SP3 & Office 2007 SP2 では xlApp = Nothing の所で Excel のプロセスは終了する。この行をコメント アウトしても End Sub で終了してくれる。
コードを見る限りバージョンの違いではないと思う。
暗黙的な参照されちゃってるかなぁ、、、されてないと思うんだけどなぁ。。。
"Excel プロセス 残る" で検索しても得られるのは .Net Framework な情報ばかりなんだよなぁ。
ともかく明日は他の PC でも調査だな。

dotnetlogo2昔 .NET Framework 1.1 で作成した Web サービスの動作確認をすることになったが実機を用意できないため Virtual PC で環境を構築中。
ホストは 1GB RAM で Pentium D 3GHz なマシンなため、ケチってゲストの XP SP2 に 128MB しかメモリを割り当てなかった。
おかげで動作が遅い遅い。
一晩かけて約 90件の Windows Update が終了。
今は数時間前から Visual Studio .NET 2003 をインストール中。
そのあとは SQL Server 2005 をインストール予定w (当時は SQL Server 2000 だったのだが、最近になって相手が DB もろとも 2005 に上げてしまった)
さすがに 128MB RAM はダメか?
512MB 差し出さないとダメかなぁ。
こんなんだったらホスト機を 2GB にしとけばよかった。

ともかく Visual Studio のインストールは Windows Update 以上に掛かりそうな気配。今日は帰る。

dotnetlogo2面談をしている間に何かが右から左に動いたらしい。
詳しい状況はわからんのだが、もしかしたらオイラの現ポジションを前任者が 「ほぼ」 一時的に引き受けてでも実行するかもしれない 「何かの開発」 があるかもしれない、と。
その 「何かの開発」 はちょっと前から動き出していたのは知っていたのだが状況が変化した、と。
さらにちょっと前にはインフラ系の全社プロジェクトにも P/L として選出されたわけだが、優先順位と交通整理はどうなるのだろうか。。。
4月からは小さいながらも一国一城の責任者になったのだが、またしても流されていく予感。。。

dotnetlogo2結果、たぶん復旧できました。けどここに書いてある方法が正解かどうかの保証はありません。まぁテストのための構築ですし。
とりあえず DotNetNuke 的にはモジュールのアップデートなどはどういったロジックなんでしょうかね、てなことで HTML_04.05.00_Install.zip の中身と DotNetNuke_4.3.7_Install.zip をそれぞれ解凍して解析してみました。

4.3.7_Install.zip のインストーラを解凍した中の Install\Module\HTML_3.3.0_Install.zip を取り出して更に別の場所に解凍。
解凍されたファイルの数は 10個。全て更新日時は 2006/07/04 22:51 となっています。
03.00.00.SqlDataProvider
03.01.00.SqlDataProvider
DNN_HTML.dnn
DotNetNuke.Modules.Html.dll
DotnetNuke.Modules.Html.SqlDataProvider.dll
EditHtml.ascx
EditHtml.ascx.resx
HtmlModule.ascx
HtmlModule.ascx.resx
Uninstall.SqlDataProvider

HTML_04.05.00_Install.zip をまた別の場所に解凍。
解凍されたファイルの数は 16個。更新日時は 2007/02/23 15:51、2007/02/27 16:27、2007/04/02 11:10 が混じってます。
03.00.00.SqlDataProvider
03.01.00.SqlDataProvider
04.05.00.txt
DataProvider.vb
EditHtml.ascx
EditHtml.ascx.resx
EditHtml.ascx.vb
htmlModule.ascx
HtmlModule.ascx.resx
HtmlModule.ascx.vb
HtmlTextController.vb
HtmlTextInfo.vb
Uninstall.SqlDataProvider
04.05.00.SqlDataProvider
SqlDataProvider.vb
DNN_HTML.dnn

たぶん DotNetNuke がモジュール群をアップデートする際の動作って、これらの中にある XML で記述された設定ファイルを読み込んで適切な場所にファイルをコピーする程度なんじゃないか、と想像してみた。あとは Database にも何かを書き込んでいるかな、と。(あまり複雑に書き込まれていると手が出ないかも)
じゃぁどれが設定ファイルなんだろうかと見渡せば *.dnn があやしい。んでこれを秀丸で開いてみたらビンゴ。

まずは 4.05 の DNN_HTML.dnn の中身。
<files> セクションの下の <file> に <path> とか <name> でパスやファイル名が書いてある。
なるほどこれらの場所にファイルがコピーされるんだ、と。
大胆にこれらのファイルと思われるものを削除。結果動かなかったら再構築するつもり。大丈夫、責任はオイラが持つ。
しかし最後に 1個ファイルが残ってしまった。DNN_HTML.dnn.config ってやつ。あ、".config" が追加されただけで今開いているファイルと同じ物なのね。

んで次に 3.3 の DNN_HTML.dnn を開き、記述内容に従ってファイルをコピー。

とりあえずトップページを読み込んでみる。動いた !!
ホスト管理ユーザーでログインしてモジュール定義ページを見てみる。
Text/HTML モジュールのバージョン表記が 04.05.00 のままでした。
こりゃどこかに書き込まれているに違いない。データベースか?
SQL Server Management Studio で DNN のデータベースにログインし、テーブル一覧を眺める。dbo.DesktopModules, dbo.HtmlText, dbo.ModuleControls, dbo.ModuleDefinitions, dbo.ModulePermission, dbo.Modules, dbo.ModuleSettings なんてあたりがあやしい。
とりあえず dbo.DesktopModules を開いてみると "DesktopModuleID" "FriendlyName" "Version" て列が目に入る。FriendlyName 列を見ていくと "Text/HTML" て値の行を発見。その横の "Version" 列の値が "04.05.00" になってる。コレですね。とりあえず値を "03.03.00" に戻してブラウザで確認。
オーケー、謎は解けた。

dotnetlogo2ちょっち実験で Virtual PC 上の Windows Server 2003 に DotNetNuke 4.3.7(日本語化済み)を入れてただよ。
ホスト管理ユーザーでログインして [ホスト]-[モジュール定義] を見てたらモジュールの最新版があれやこれやと公開されてるじゃないですか。
んで早速英語サイトからそれらをダウンロードしてインストールしてったわけです。
そんで Text/HTML 4.05.00 ってやつをインストールしたら DotNetNuke が壊れちゃいました。
ASP.NET Runtime Error ってな。ブラウザに表示されたエラー画面は 「詳しいエラーを表示させるには設定ファイルのここん所をこうしなさいよ」 みたいな内容なんですが、イベントビューアを眺めてたらそっちにエラーが詳しく出てました。
イベント コード: 3007
イベント メッセージ: コンパイル エラーが発生しました。
イベント時間: 2007/09/06 17:41:22
イベント時間 (UTC): 2007/09/06 8:41:22
イベント ID: 3662e8e855704fcaabefc20a04b9956c
イベント シーケンス: 9
イベント発生: 1
イベント詳細コード: 0

アプリケーション情報:
アプリケーション ドメイン: /LM/W3SVC/1/Root/DotNetNuke-1-128335416175058555
信頼レベル: Full
アプリケーションの仮想パス: /DotNetNuke
アプリケーション パス: C:\DotNetNuke\
コンピュータ名: DNN-TEST01

プロセス情報:
プロセス ID: 3604
プロセス名: w3wp.exe
アカウント名: NT AUTHORITY\NETWORK SERVICE

例外情報
例外の種類: HttpCompileException
例外メッセージ: C:\DotNetNuke\App_Code\HTML\DataProvider.vb(42): error BC30560: 'DataProvider' は、名前空間 'DotNetNuke.Modules.HTML' では不適切です。

要求情報:
要求 URL: http://dnn-test01.hoge.local/DotNetNuke/default.aspx
要求パス: /DotNetNuke/default.aspx
ユーザーのホスト アドレス: 192.168.1.102
ユーザー:
認証済み: False
認証の種類:
スレッド アカウント名: NT AUTHORITY\NETWORK SERVICE

スレッド情報:
スレッド ID: 1
スレッド アカウント名: NT AUTHORITY\NETWORK SERVICE
偽装: False
スタック トレース: 場所 System.Web.Compilation.AssemblyBuilder.Compile()
場所 System.Web.Compilation.BuildProvidersCompiler.PerformBuild()
場所 System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed)
場所 System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories)
場所 System.Web.Compilation.BuildManager.CompileCodeDirectories()
場所 System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled()
場所 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters)


カスタム イベントの詳細:

詳細な情報は、http://go.microsoft.com/fwlink/events.asp の [ヘルプとサポート センター] を参照してください。
こりゃぁえらいこって。Web を潜りまくったのですが不具合の線で探してみても特に情報がない。なぜ? 不具合じゃないから? 悪いのはオイラ?
んでダウンロード サイトの情報をよ〜く見てみた。
Text/HTML module が要求する DNN の minimum version が 4.05.00 !!!!!
なんてこった。
どうやって戻そうか。。。
テストで入れてるんでバックアップとかとってないし。。。

PowerShellPowerShell のコマンドプロンプトが開いてもウィンドウだけが表示されてプロンプトが表示されない。
いくら待っても表示されない。
この状態でもう一枚 PowerShell のコマンドプロンプトを開こうとすると、この 2枚目のウィンドウは正常に開いて操作可能な状態になる。
ただし依然として 1枚目のウィンドウにはプロンプトが表示されない。
1枚目のウィンドウがどうなっているかというと、背景はオイラが設定した青色になっていて、プロンプトが表示されていない状態でウィンドウの左上(0, 0 の位置)にカーソルが点滅。ウィンドウ内の任意の位置でマウスをドラッグさせると選択モードにもなる。でも文字は入力できない。
仕方がないので 1枚目のウィンドウ右上の [X] をクリック。しばらくすると <プログラムの終了 - Windows PowerShell> のダイアログが出る。迷わず [すぐに終了(E)] をクリック。
んで 2枚目のウィンドウで作業を始める。

dotnetlogo2Visual Basic 初心者掲示板の "リストボックスが正しくソートされない" がすごいことになっている。
久しぶりにこんな質問者を見た。
とっくにサポートが終わっている VB 5 のリストボックスの仕様で暴走。
心の病を患っているのかな。
最近は 「一課に一人」 だし他人事じゃないし。

プログラミングMicrosoft ADO.NET2.0 (マイクロソフト公式解説書 Microsoft Visual Studi)
プログラミングMicrosoft ADO.NET2.0 (マイクロソフト公式解説書 Microsoft Visual Studi)

んでコチラが ADO.NET 2.0 版の書籍。
先月出たばかり。
さっき Amazon で注文した

プログラミングMicrosoft ADO.NET (マイクロソフト公式解説書)
プログラミングMicrosoft ADO.NET (マイクロソフト公式解説書)
なぜか定価の 2倍強。
オイラのも売りに出そうかな。。。

VISTA 英語情報ですが MSDN にコンテンツが公開されてました。
ここら辺とか
Icons (What's New in Windows Vista)
ここらへん
Windows Vista Icon Development Guidelines

あとは Axialis IconWorkshop てなツールのサイトにも
What's New with Windows Vista™ Icons?

Windows XP の頃からパースがついたアイコンが出てきて、アイコンのデザインも高度になってきてるわけですが、MSDN ではアイコン作成に使うと良いものとして以下のような物を挙げています。

  • 紙とペン
  • Autodesk 3Ds Max
  • Adobe Photoshop
  • Adobe Illustrator / Macromedia Freehand
  • Gamani Gif Movie Gear
  • Axialis Icon Workshop
  • Microsoft Visual Studio
  • ベクタデータや 3D レンダリングに精通したデザイナー
紙とペンでラフスケッチを行い、パースをきれいにつけたい場合は 3Ds Max のようなレンダリング ツールを使う。Photoshop や Illustrator でデザインを繰り返して細かいところを決めていく。最後に Gif Movie Gear や Icon Workshop で Vista 対応アイコンを作成する、と。
(ちなみに Visual Studio に付属しているアイコン エディタは 256 色以上やアルファチャンネルに対応してません)
にしてもちと原価が高すぎますね。。。

// エラーにならない
System.Drawing.Bitmap img = new System.Drawing.Bitmap(10782, 10782);

// エラーになる
System.Drawing.Bitmap img = new System.Drawing.Bitmap(10783, 10783);

// エラーにならない
System.Drawing.Bitmap img
    = new System.Drawing.Bitmap(12450, 12450, PixelFormat.Format24bppRgb);

// エラーになる
System.Drawing.Bitmap img
    = new System.Drawing.Bitmap(12451, 12451, PixelFormat.Format24bppRgb);

// エラーにならない
System.Drawing.Bitmap img
    = new System.Drawing.Bitmap(15248, 15248, PixelFormat.Format16bppRgb555);

// エラーになる
System.Drawing.Bitmap img
    = new System.Drawing.Bitmap(15249, 15249, PixelFormat.Format16bppRgb555);
まぁ実際はこんな大きな画像は必要ないけれど。 幅と高さの変化割合を引数で受ける拡大縮小メソッドを作ってて、ユーザーが 50% のつもりで 50f を入力したらどうなるかなぁってテスト中の出来事でした。>

Photoshop を直接コントロールできるんだったらそれでもいいだろって気持ちも。
参照設定で "Adobe Photoshop 8.0 Object Library" を参照。
Dim ps  As Photoshop.Application
Dim src As Photoshop.Document

' JPEG 保存時のオプションを設定 '
Dim saveOption As New Photoshop.JPEGSaveOptions
With saveOption
    .EmbedColorProfile = True
    .FormatOptions = psStandardBaseline
    .Matte = psNoMatte
    .Quality = 8
End With

Set ps = New Photoshop.Application
Set src = ps.Open("source.jpg")

' オリジナル画像の複製を作成し、 '
' 解像度を 144dpi、バイキュービックで再サンプリングを行う。 '
Dim dest As Photoshop.Document
Set dest = src.Duplicate
dest.ResizeImage Resolution:=144, ResampleMethod:=Photoshop.PsResampleMethod.psBicubic

' 保存する '
dest.SaveAs "dest.jpg", saveOption
dest.Close
src.Close
ps.Quit

dotnetlogo2300dpi でスキャニングして品質を 8 に設定して JPEG 保存した画像ファイルがソース。
こいつを再度 Photoshop CS で開き、[イメージ]-[画像解像度] で解像度を 144pixel/inch、バイキュービック法で画像の再サンプル、てな処理をする。
すると [ピクセル数] の幅と高さも連動して小さくなる。300dpi を 144dpi にしたので 0.48倍。なので幅と高さも元のサイズの 0.48倍になってる。
最後にこいつを [ファイル]-[別名保存] で JPEG 保存する。オプションとしては [カラー] の "ICC プロファイル" にチェック。画像品質は "8(高)"、形式オプションは "ベースライン(標準)" にする。
んな感じの処理を C# で。

.NET ではプログレッシブ JPEG で保存できないっぽいってことは標準ベースラインで保存されてるって解釈しちゃってもいいのかな・・・ 続きを読む

dotnetlogo2.NET Framework 2.0 なんですが、JPEG 画像を保存するのにプログレッシブで保存しようにも情報が少なさすぎ・・・
とりあえず Bitmap オブジェクトの Save メソッドで使う EncoderParameters に EncoderValue.RenderProgressive を設定した EncoderParameter を突っ込んで使ってみたんだけど、GV で確認するとプログレッシブになってないっぽい。
MSDN ライブラリで EncoderValue 列挙体の RenderProgressive について調べてみると 「GDI+ バージョン 1.0 では使用されません。」 と。
で、Windows XP SP2 + .NET Framework 3.0(2.0) な環境の GDI+ ってのはバージョンいくつ?

dotnetlogo2久しぶりにプログラムなんぞをやってますんで、独自の型をコレクションするクラスに各種有名どころなメソッドを実装するのさえ面倒くさくなっております。
というかいまいちそこら辺のインターフェイスって消化できてなかったり。
んなもんで .NET Framework 2.0 になって何とかならんのか、ジェネリックって何なんだ、と調べておりましたら Gushwell さんのエントリー 「独自クラスでforeach を書けるようにするには」 で便利な物を見つけちゃいました。今度こそちゃんと覚えておこうっと。
/// <summary>
/// ホスト 1台を表すクラス
/// </summary>
Class Host
{
    // まぁとりあえず適当に
    private string _ipAddress = ""
    private string _hostName = "";
    private string _macAddress = "";

    public Host(string aIPAddress, string aHostName, string aMACAddress)
    {
        _ipAddress = aIPAddress;
        _hostName = aHostName;
        _macAddress = aMACAddress;
    }

    // あとはプロパティを適当に実装
}

/// <summary>
/// Host オブジェクトのコレクション クラス
/// </summary>
class Hosts : System.Collections.ObjectModel.Collection<Host> { }

/// <summary>
/// 実行側クラス
/// </summary>
class myApp
{
    public hoge()
    {
        Hosts hosts = New Hosts();
        // もうこれで hosts コレクション オブジェクトには
        // Add メソッド
        // Creal メソッド
        // Insert メソッド
        // Remove メソッド
        // RemoveAt メソッド
        // Count プロパティ
        // なんてのが勝手に実装されてる!!
        // しかも foreach もできちゃうし、キャストも必要ない!!
    }
}

dotnetlogo2ホスト名を取得する部分は System.Net.Dns.GetHostEntry メソッドで System.Net.IPHostEntry オブジェクトを取得し、HostName プロパティの値を取れば OK だという事はすぐにわかった。
しかしホスト名が分からなかった場合、HostName プロパティには文字列形式の IP アドレスが格納されてしまう。
そもそも IPHostEntry オブジェクトはどうやってホスト名を取得してるのかがよくわからんのですが、まぁ DNS やら WINS やら hosts ファイルやらキャッシュやら、実行 PC のネットワーク環境のアレやコレやを駆使して取得しているに過ぎないんでしょうな。
IP アドレスが格納されてしまうパターンとしては、
  1. ホスト名を解決できなかった場合
  2. そもそも指定した IP アドレスのノードがネットワーク上に生きていない
てな感じ。
2 に関しては System.Net.NetworkInformation.PingReply の Status が System.Net.NetworkInformation.IPStatus.Success 以外ならその後の処理をしないようにすれば OK か。
1 に関しては HostName の値が IP アドレスと同じなら空文字を返すようにしちゃえばいいかな。

dotnetlogo2プロジェクトの環境整備のためにツールを開発中。
指定した範囲の IP アドレスに対して
  1. PING を打つ
  2. MAC アドレスを取得
  3. ホスト名を取得
てな動作。
結果はとりあえず ListView に出力。
ListView は 3列構成で、IP アドレス、ホスト名、MAC アドレスを表示。
PING が timeout になったりホスト名が取れない場合、ListView のその項目は空白のまま。(IP アドレスは必ず出力する)
ここまでは Vector あたりに沢山ツールが置いてあるわけですが、指定した範囲のアドレスに対して 1回舐めるだけじゃなく、指定した回数繰り返し処理したいわけです。
対象にしている LAN は管理ができていないカオスな所でして、「ちょっと電源を入れて 10分ぐらい作業してすぐに落としちゃう」 てな端末を取り逃したくないわけですわ。
それと [以前の続きで調査] てな機能も必要。
ListView 上の Item を舐めていきながら(IP アドレスは書き出してあるので)ホスト名か MAC アドレスが空白のノードだけ処理するモード。

てな要望を書き出していたら、このツール、素直に考えると単なる DoS 攻撃ツールなんじゃないかと。。。
んじゃぁせめて繰り返し時のインターバルを設定できるようにしようじゃないか、と。続きを読む

某所で質問されて回答した話だけどメモw
int lines = System.IO.File.ReadAllLines("d:\\test.csv").Length;

dotnetlogo2MSDN バーチャルラボ
https://www.microsoft.com/japan/msdn/virtuallabs/

開発環境を構築しなくても、マイクロソフトが用意した環境をすぐに使えるようになる。しかも Web ブラウザの中で行う。
ちょっと前に Office 2007 ベータの試用イベントがあったけど、あれも同じ。
さすがに Web ブラウザなのでオイラの動作に対する反応は遅いけれど、バックで動いているサーバの処理速度はなかなかな速さだと思う。
ブラウザの中で動いている Windows からリモート デスクトップで別のサーバにアクセスしたりする。けっこう面白い。続きを読む

dotnetlogo2Oracle にアクセスする Windows アプリの場合、.NET Framework に付属する(と言うか .NET Framework をインストールする過程で一緒にインストールされる MDAC と言ったほうがいいのかな) .NET Framework Data Provider for Oracle を使うか、Oracle が出している .NET Framework 用の純正ドライバ Oracle Data Provider for .NET (ODP.NET) を使うんじゃないかな。
そりゃ純正の ODP.NET のほうが安心なんだけど、こいつを選択した場合、開発した Windows アプリケーションを ClickOnce で配布する場合の手間が初回のみ違ってきちゃう。
ODP.NET は Setup.exe を実行する必要があんで、セキュリティ上 ClickOnece で配布できない。んなもんで初回のみこいつを各ユーザーに配布するしかないわけです。
とは言えセットアップ用のファイルをばら撒いてユーザー自身にインストールを完了してもらうっていうのも有り得ない話。サイレント インストールができるようなので、そうしたほうがいいかもね。
いやどうせ ClickOnece 用に Web サーバを用意しているぐらいだから、それなら DB アクセスの部分は Web サービスに任せちゃうって手もあるかな。

dotnetlogo2.NET Framework 2.0 廃止予定の API 一覧
代替などにより廃止される運命のメンバや型です。

dotnetlogo2某所での質問。
サーバにあるデータの一覧を表示する Web 画面があり、定期的に表示を自動更新する。
データの一覧は GridView を使って表示している。
新しいデータが見つかると一覧の最後に追加して表示する。
ブラウザの一番下に新しいデータが表示されてしまうので、画面更新時に GridView を一番下までスクロールする方法はないのか。

というのが質問の概要。
降順でデータを取得して表示すれば最新データが一番上に表示されて何の苦労もないんじゃないのかとアドバイスしたのだが、「データが一番下に追加されるのでスクロールさせたい」と返ってきた。う〜んイマイチかみ合ってないっぽい。

表に出てない前提要件なんか全然ないのに、スクロールさせることが目的になっちゃってる?
それとも昇順が至上命題であり、スクロールで解決するしかないって話?
てなことで質問者の反応待ちな感じ。(と言うかスクロール方向で突進中です)

スクロールで解決するメリットを一応考えてみた。。。
画面を見ているユーザーが、自動的にスクロールする様を見て「すげぇ!!!」って声をあげ、作者が「すごいね」って言ってもらえる。。。
すごいね。。。

dotnetlogo2クラスのデザインは Visio を使ってます。クラス デザイン以外にもいろんな図を書けるんで、デベロッパ作業以外でも重宝してます。
複数業務にまたがって同じ操作で作業できるってことこそ「アプリケーション」ですな。
しかし社内でも布教してるんですが、なぜか Visio の業務がオイラんとこに来てしまうってのが困りますがw

さて、Visual Studio にもクラス デザイナ機能があります。
まだ使ったことがないんでこれから使い方を勉強。Visual Studio 付属ツールってことで、C# や VB で普段使っている用語を翻訳しないで済む、と。てことは教育でもつかえるんじゃないか、と。

Microsoft Visual Studio Developer Center 技術資料 "Visual Studio 2005 クラス デザイナ"
Microsoft Visual Studio Developer Center 技術資料 "Visual Studio 2005 クラス デザイナを使用した API 設計"

dotnetlogo2ようやくGotDotNet Japan アーカイブが公開されました。
.NET Framework 1.0 の頃の話題が豊富です。

dotnetlogo2Visual Studio 開発トップの blog による告知
Microsoft Visual Basic Developer Center Windows® Vista™ における Visual Basic 6.0 のサポートについて
Microsoft Visual Studio Developer Center Visual Studio .NET 2003 Service Pack 1

上記 3つのリンク先の情報のうち、Visualo Studio .NET 2003 SP1 の記述内容には疑問が残る。
最新の情報によれば、
<開発環境が Vista 上でサポートされるか>
Visual Basic 6.0 → サポートする
Visual Studio .NET 2002 → サポートしない
Visual Studio .NET 2003 → サポートしない
Visual Studio 2005 SP1 → サポートする(動作の互換性に問題が残る場合はパッチで対応)

<開発されたプログラムが Vista 上で動作するか>
Visual Basic 6.0 → 動作する(Vista には最初から VB 6.0 ランタイムが入っている)
Visual Studio .NET 2002(.NET Framework 1.0)→ 動作しない(動作すると言っていない?)
Visual Studio .NET 2003(.NET Framework 1.1)→ 動作する
Visual Studio .NET 2005(.NET Framework 2.0)→ 動作する

<関連事項>
Vista には .NET Framework 2.0 が最初から入っている。(もちろん .NET Framework 2.0 に WPF、WCF、WF、WCS を加えた形を .NET Framework 3.0 と呼ぶので、.NET Framework 3.0 も最初から入っている、という言い方もできる)

で、.NET Framework 1.1 用のアプリが Vista でどうやって動作するのかはわかりません。Vista 用の .NET Framework 1.1 ランタイムが出るのか、.NET Framework 2.0 が 1.1 のアプリを解釈して動くってだけなのか。。。あまり期待しないほうがいいかもしれませんね。
まぁ仮に動作が問題ない場合、Vista 上で動作させる .NET Framework 1.1 アプリは XP 上の Visual Studio 2003 で開発できるって事になりますので、特に問題はないでしょう。まぁ開発用 PC とテスト用 PC が必要になりますけど。仮想マシン? 仮想マシン内で開発環境を動かす? それとも仮想マシン内で Vista を動かす?

3つ目のリンク先「Visual Studio .NET 2003 SP1」の内容に疑問が残るって点ですが、リンク先ページには Visual Studio .NET 2003 SP1 の動作環境として Vista が載ってるんですわ。当然開発環境のことです。
まぁこれもいずれ修正されて Vista の文字が外されるんでしょうね。

dotnetlogo2MSDN サブスクライバ ダウンロードサイトからの日本語版 Visual Basic 6.0 提供再開に関するご案内
首の皮一枚でサポート中の VB 6.0 ですが、MSJVM 和解による MSJVM 排除の一環として、製品の中に MSJVM が入っている物に関しては MSDN サブスクライバ ダウンロードからも製品ごと削除されていきました。
VB 6.0 以外にも Windows 2000 や Windows NT 4.0 なんかが削除されてたわけですが、Windows 2000 もまだ延長フェーズだよねぇ。復活しないのかな。

dotnetlogo2Windows Vista 上で既存の VB 6.0 アプリケーションがそのまま動作するようです。
VB 6.0 のサポートはすでに延長フェーズに入っており、2008年の春にはそれも終了する。
その関係もあり、Windows Vista には最初から VB 6.0 用のコンポーネントが入っているので、VB 6.0 で開発されたアプリケーションはほぼそのままで動作するようです。
じゃぁそういったアプリケーションをメンテするため、開発ツールである VB 6.0 IDE はどうなのかというと、これも Vista 上で動作するそうです。
MSDN「Windows® Vista™ における Visual Basic 6.0 のサポートについて

サポート終了と同時に Vista 上で VB 6.0 が機能しなくなるわけもなく、引き続き使用することは可能でしょう。
2008年のサポート終了を無視して少なくとも Vista のライフサイクルが終了するまで VB 6.0 アプリケーションを使い続けるか、この期間を .NET Famework に乗り換える最後のチャンスとするか、システム管理部門は本気で考える期間になることでしょう。

ちなみに最近のオイラは C# な日々。

dotnetlogo2QND ちう管理ツールを使って全 PC の状態を管理しとるわけです。
収集したデータを取得するのは専用の管理コンソールを使います。
ところがライセンス数の関係で、管理コンソールを同時使用できる数に限りがあります。まぁそれは必要数のライセンスを取得すりゃ済む問題ですが・・・
ところが問題がもう一つあります。コンソールで見れる情報ってのは「前回取得した情報」なわけです。確認したい相手 PC の今の状態を生で見るわけじゃないんですね。
例えばログオン時に QND サーバへ情報を送るようにクライアント PC に設定をしておくと、ログオンしっぱなしで 24時間稼動させてたり、ログオンせずに 24時間稼動させてる PC の情報はいつになってもサーバに送られないわけです。
かと言ってそんな一部の PC のために、定期的に情報を送るようにしても殆どのユーザーに良く思われない。

ちゅうことで、じゃあ余計な出費なしに、生の情報を見たいときに見ちゃおうってツールを考えると、WMI を使うツールを自作しちゃえばいいんじゃないか、と。
ただしそれには一つ大きな問題が。
WMI の真骨頂であり、今回の目的そのものである「リモートからの接続」ですが、Windows ファイヤーウォールによってがっちりとガードされちゃってるんです。
穴を開けるためにはグループ ポリシーで設定するしかないんですが、今回のテーマがきちんとテーマアップされてるわけじゃないので、せめて今できることといえばオイラが WMI でどこまでの物を作れるかって程度になっちゃってます。
それに Windows NT ドメインのグループ ポリシーでどこまでできるかってのも、手元に Windows NT ドメインがないので調査が難しいんですわw

↑このページのトップヘ