Excelの文字入力が遅い
Office 2007 の Excel で文字入力をしているとき、異様に文字入力が遅くなり、入力した文字が時間差で表示されるほどでした。
まぁ、あまり使わないので我慢しており、なんとなくATOKのせいかなと思っていました。
でも、冷静に考えてみると、遅くなるところはいつも同じ列で、 なんでその列だけ遅いんだろうと考えてみると、オートコンプリートじゃないかということに。
Microsoft公式「.NET Framework 開発ガイド」がWebで登場
「.NET Framework 開発ガイド」が、Microsoftから公開されました。内容は、.NET Framework
「.NET Framework の仕組みを紹介した ".NET Framework 開発ガイド ブック" が Web で登場」
.NET Framework 開発ガイド ブックは .NET Framework の動作の仕組みを分かりやすく説明したコンテンツです。.NET Framework の心臓部である CLR (Common Language Runtime) を中心に、.NET Framework をしっかり理解するための情報が満載です。.NET Framework をより深く学びたい開発者にも、.NET Framework を初めて学ぶ人にもピッタリなコンテンツです。ぜひ、.NET Framework スペシャリストへの第一歩としてご活用ください。
というわけで、読んでみました。→「Microsoft .NET Framework 開発ガイドブック」
Microsoft .NET Framework 開発ガイドブック
.NET Frameworkの仕組みや、構成、概要がよく分かります。目次は以下のようになっています。
全体としては短いですが、ボリュームはたっぷりで、これを読むだけで、.NET Frameworkの知識が一気に手に入ります。図も多く、読みやすいです。
どの章も興味深いのですが、気になったところを抜粋して紹介します。
ildasm.exe
ILDASMは、MSIL Disassemblerの略であり、MSILとは、Microsoft Intermediate Languageのことです。つまり、ILDASM.exeは、MSIL(.NETでの中間言語)で記述されたファイル(.exe、.dll)の内容を読み取ることができるツールと言えます。
実際に、ildasm.exeを利用してみます。ildasm.exeの場所は、少し探すのが大変ですが、次のようなパスにありました。
C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\ildasm.exe
ダブルクリックで簡単に実行可能です。
ダブルクリックで実行すると、ウィンドウが表示されるので、「ファイル」から、EXEファイルや、DLLファイル(もちろん、.NET Frameworkを利用したもの)を読み込んでみます。すると、ツリー構造が表示されます。
MANIFESTをダブルクリックするとDLLもしくはEXEに埋め込まれたマニフェスト(ファイルに関する情報)を表示することができます。
また、「表示(V)>メタ情報(M)>表示!(S)」をクリックすることで、ファイルのメタ情報(どのような型が宣言されているかなど)が表示されます。表示する必要があるかは別として、ファイルにどのような情報が格納されているかが見られるというのは勉強になります。
はじめにファイルを開いたときに表示されたツリーをたどっていくことでもどのようなメソッドやクラスが定義されていて使用可能であるかが分かります。
ほかにもたくさんの機能がありますが、とくにおもしろいものとしては、「表示(V)>統計値(I)」から見られる統計情報です。ファイル自体の何パーセントがどのような要素から校正されていて、いくつのメソッドが宣言されているか、そのサイズはどれくらいかなどの詳細な情報をチェックできます。これまた、実用的な意味があるかは別にしても、とても興味深いです。
C#での、正しいマルチスレッドプログラムの書き方を求めて
注意:.NET Framework 4、Visual Studio 2010に対応してアップデートした記事はこちら→「C#での、正しいマルチスレッドプログラムの書き方を求めて(2011年11月版)」
C#におけるマルチスレッドプログラムの作成方法は、たくさんのホームページで紹介されています。しかし、それらは正しく動いたとしても、それがC#や.NET Frameworkを作成した人々の期待したコードであるかどうかは残念ながら、コードを見るだけでは分かりません。生意気なこと言ってすいません
また、BackgroundWorkerという、簡単に別スレッドを作成してメソッドを実行する方法も用意されてはいますが、それで満足していいのかという欲求もあります。より高度なスレッドの扱い方を会得したい。
そんなとき、やはり頼るべきはMicrosoft謹製 msdnライブラリでしょう。
しかし、実際にmsdnライブラリでマルチスレッドプログラミングついて調べていると、リンクが散らばっていて、どこを見ればいいのか分かりません。
そこで、msdn内のマルチスレッドに関するページをまとめてみました。msdnは重く、検索に時間がかかるので、このページをブックマークしておくと楽だと思います。
msdnが新デザインに
msdnライブラリが新デザインになりました。
msdnライブラリはほぼ毎日見ているので、だんだんと変化したのが分かりました。
今までは、濃いオレンジ色がベースで、msdnのロゴには、右下に矢印がありました。
そして、ついこの間、その濃いオレンジ色だった背景が、濃い青のグラデーションになりました。ちなみに、背景に模様はありません。また、背景は変わりましたが、オレンジ色の矢印のあるロゴはそのまま。
そして、何より大きな変化が、右下に出るようになったビューの切り替えというボタン
ボタンを押すと、
- クラシック
- ライトウェイト
- ScriptFree
クラシックは今までと同様です。
ライトウェイトは、すっきりとしたデザインで、言語ごとに表示されていたサンプルコードが、一つにまとめられ、タブ表示になっています。また、いままで左のツリー表示が、ただのリンクになっています。
ScriptFreeは、まさしく、JavaScriptなしのページです。ライトウェイトよりも、さらにシンプルですが、見た目は今までの表示に近いままです。しかし、左のツリーはシンプルなものに変わっています。なぜかライトウェイトよりも見やすい
結論から言うと、見た目は好みですが、ライトウェイトと言いつつ、msdnが重いのはそういう問題じゃないよねということです。検索や、ページ間移動に時間がかかりすぎます。
そんなときのためのオフラインで利用できるmsdnライブラリですが、これまた、ローカルといえども、フリーワード検索にはとても時間がかかります。さすがにページ間の移動は早いですが、たまに、リンク切れ(?)になっているリンクがあったり。。。Visual Studio 2010がもうすぐということでわくわくしていますが、こんなところも改善されるといいですね。なんだか、2010のbetaは遅いみたいですが
DataReaderオブジェクトに、結果の行数を表すプロパティがない理由
System.Data.SQLiteを利用していて、"SELECT DISTINCT"を利用して、格納されている値にどのようなものがあるのかを調べようと思いました。
using (SQLiteConnection cnn = new SQLiteConnection("Data Source=data.db")) using (SQLiteCommand cmd = cnn.CreateCommand()) { cnn.Open(); cmd.CommandText = "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME"; using (SQLiteDataReader reader = cmd.ExedcuteReader()) { result = new string[### 謎 ###]; int i = 0; while (reader.Read()) { result[i] = reader[0]; i++; } } } return result;
コードは以上のようになります。data.dbというSQLiteデータベースファイルのTABLE_NAMEテーブルのATTRIBUTE_NAME属性に含まれている値の一覧を、重複を除いて取得しようとしています。一覧は、SQLiteDataReader型の、readerオブジェクトから得られます。
ここで、結果を配列に格納したいので、まず配列のサイズを決定する必要が出てきます。
すると、readerオブジェクトのLengthプロパティがあるのだろうと思ったりしますが、Lengthはおろか、行数を表すプロパティは一切ありません。つまり、配列のサイズを決定することができないのです。
このことについて調べていると、「Visual C# で OleDbDataReader クラスまたは SqlDataReader クラスを使用するときに、フェッチされるレコード数を示す RecordCount プロパティが存在しない 」というページを発見し、結果の行数をreaderオブジェクトから取得することはできないということが分かりました。
そのページには、SELECT COUNT(*)を利用するようにと記述されています。そこで、その通りに、上記のプログラムを書き直すと、以下のようになります。
using (SQLiteConnection cnn = new SQLiteConnection("Data Source=data.db")) using (SQLiteCommand cmd = cnn.CreateCommand()) { cnn.Open(); cmd.CommandText = "SELECT COUNT(*)" + "FROM (" + "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME" + ")"; int resultCount = int.Parse(cmd.ExecuteScalar().ToString()); cmd.CommandText = "SELECT DISTINCT ATTRIBUTE_NAME FROM TABLE_NAME"; using (SQLiteDataReader reader = cmd.ExedcuteReader()) { result = new string[resultCount]; int i = 0; while (reader.Read()) { result[i] = reader[0]; i++; } } } return result;
ちなみに、DataReaderの、FieldCountは、行数ではなく、結果の列数を表すプロパティです。今回の例では、必ず1になっているはずです。