「ほっ」と。キャンペーン
<   2008年 06月 ( 6 )   > この月の画像一覧
(VB.Net)COMオブジェクトを解放する
.Net側からはなるべくCOMを使わないほうがいいといわれてますが、どうしても必要な時は結構あります。
そのときのCOMオブジェクトの解放についてです。

実はCOMについてはよくわかっていません。
ちょうどプログラミングの勉学を始めたのもCOMから.Netへの移行時期であり、当時はJ2EEのほうに注力してたため、現在の会社ではたらくまでほとんど疎遠の技術でした。


とりあえずCOMのインスタンスには参照カウンタというものがあって、自分がどれだけ参照されているかを管理してみたいです。
そして、参照カウンタが0になったら自信を消去して解放という流れみたいです。

で、.NetからCOMを利用する場合はRCW(ランタイム呼び出し可能ラッパー )をいうCOMとCLRとの相互運用レイヤーを通してCOMを参照するみたいです。
このRCWにも参照カウンタがあり、RCWからは唯一のCOMのインスタンスを見に行くらしいです。
つまりはRCWの参照カウンタを空にしてやればCOMオブジェクトも解放されるということでしょうか。

System.Runtime.InteropServices.Marshal.ReleaseComObject メソッドを利用すればこのRCWの参照カウンタを1つ減らせるようです。
ただ、この場合だとCOMのインスタンスをいくつも持ってる場合だとループでまわして云々しないといけません。

ということで、もっと手軽に使えるようにするため、.Net2.0からは
System.Runtime.InteropServices.Marshal.FinalReleaseComObject メソッドが追加された見たいです。
これは実行すると参照カウントを 0 に設定することによって、RCW へのすべての参照を解放するようです。
一気に解放したい時に使えそうです。

参考:MS:第 7 章 「相互運用パフォーマンスの向上」(「Marshal.ReleaseComObject」に解放方法載ってます。全般的にかなり詳しい情報載っています。非常に役立ちます。)
[PR]
by jehoshaphat | 2008-06-19 16:34 | .Net開発 | Trackback | Comments(0)
(VB.Net)自作コントロールにおいて、不要なプロパティをデザイナANDインテリセンスで隠したい時
たとえば.Net標準のSystem.Windows.Forms.Buttonを継承した拡張ボタンコントロールを作ります。
その自作ボタンコントロールにSystem.Windows.Forms.Buttonのすべてのプロパティを実装しているわけではない場合、そのプロパティをなるべく開発者に使わせたくないために、未実装(というか意味がない)プロパティをVistual Studioのデザイナと、インテリセンス上では非表示することができるみたいです。

それのメモです。


■デザイナ上での非表示
まず、実際のソースを見てみましょう。(あらかじめ「System.Design.dll」への[参照の追加]が必要)

< Designer(GetType(OriginalButton.OriginalDesigner))> _
Public Class OriginalButton
Inherits System.Windows.Forms.Button

''' <summary>
''' デザイナ上の表示をカスタマイズするインナークラス
''' </summary>
''' <remarks>
''' </remarks>
Friend Class OriginalDesigner
Inherits System.Windows.Forms.Design.ControlDesigner
''' <summary>
''' 下記で指定してあるプロパティはデザイナでは非表示とする。
''' </summary>
''' <param name="Properties"></param>
''' <remarks></remarks>
Protected Overrides Sub PostFilterProperties(ByVal Properties As IDictionary)
Properties.Remove("Image")
End Sub
End Class


''実装部分
End Class


まず、自作コントロールクラスの属性として、
Designer(GetType(OriginalButton.OriginalDesigner))
を宣言します。
おそらくこのクラスのデザイナの設定は OriginalButton.OriginalDesigner クラスを使ってねということでしょう。
次に、OriginalButton.OriginalDesignerクラスを実装します。OriginalButtonの中に作り、インナークラスとします。
OriginalButtonクラスはSystem.Windows.Forms.Design.ControlDesignerを継承します。
そして、PostFilterPropertiesメソッドをオーバーライドし、
Properties.Remove("隠したいプロパティ名")
で指定したプロパティをデザイナ上から非表示にできます。

参考:@IT 第2回 継承と属性プログラミングで実現するRAD開発 「■クラス属性の指定による[プロパティ]ウィンドウ上への非表示化」の項目にあります。C#のサンプルもあります。


■インテリセンス上での非表示
おなじく、またコードを見てみましょう。

Public Class OriginalButton
Inherits System.Windows.Forms.Button
<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Public Shadows Property BackgroundImage() As Image
Get
Return MyBase.BackgroundImage
End Get
Set(ByVal Value As Image)
MyBase.BackgroundImage = Value
End Set
End Property

  ''実装部分

End Class


まず、非表示にしたい親クラスのプロパティをオーバーライドします。(親クラスのプロパティにOverridableがないときはShadowsを使っちゃいましょう)
そして、セッター、ゲッターは親クラスのプロパティをそのまま投げる形にします。
肝心なのはオーバーライドメソッドに
<EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)>
の属性をつけることです。

これでインテリセンス上にも出てきません。


しかし、出てこないと言って使えないわけではない(テキストエディタ見たく手で打てばいいだけ)のでその点は要注意です。
オブジェクト指向的にも継承元のメンバを使えないようにするということ自体、おかしなことかもしれません。
まさに、実装とアーキテクチャントのずれの部分ですね。


参考:・MS:~ 10 行でズバリ!! - 番外編 ~ 自分流のコントールを作っちゃおう ~ 下のほうの「プロパティを非表示にするには」に記述。
特定のプロパティやメソッドをインテリセンス上で非表示にする. C#での書き方が載ってます。
[PR]
by jehoshaphat | 2008-06-19 15:36 | .Net開発 | Trackback | Comments(0)
Virtual Server2005 でのゲストOS起動エラー
昨日プロジェクトメンバの不注意でVirtual Server2005を動かしているサーバを電源断したらしいです。

ということで Virtual Server マネージャ からゲストOSを起動しようとしたら、
「Active Directory 内の Virtual Server のサービス接続ポイントの作成中にエラーが発生しました。操作を完了するドメイン コントローラが利用できないか、またはドメインへのアクセスでセキュリティ上の問題が発生しています。この操作は次回サービスを開始する際に再度試行されます。 エラー 0x80070005 - アクセスが拒否されました。」
というエラーが。。。
(クリックすると大きくなるっぽいです)
e0091163_16303710.jpg


実はホストOSがWindows2008でドメインコントローラなので、それが悪いのかと思っていろいろ調べてみました。
サービス プリンシパル名とか(いまだによくわかっていません)の登録方法とか云々。
子1時間悩みましたが、結局はVirtualServerのゲストOSの全般プロパティにある、自動起動のパスワードが違っているだけでした。
そういえば、先週パスワード変更週だったなぁと思いつつこんな簡単なことに気付かなかった自分が恥ずかしい。

ただVirtualServerのヘルプによると動かす対象のゲストOSが利用するファイル(仮想ハードディスクや構成ファイル云々)に適切なアクセス権をふっておけばどのユーザでもOK的なことを書いていたので、試してみました。
現状はAdministartorで起動しているのですが、パスワードは定期的に変更しないといけないため、VirtualServer用のアカウントを作りたかったわけです。
結果は無理でした。
原因は不明です。

結局はAdministratorで運用することとなりました。ちゃんとパスワード変更時にここの設定も変えておかなければ。。

以下、調査中に出くわした役立ちそうな資料です。
Virtual Server 2005 R2 究極活用ガイド(PDF)
pnpkさんのブログ 関連項目にドメインコントローラにVirtualServerをいれるコツ等の記事もありました。今後の参考にさせてもらいたいと思います。
[PR]
by jehoshaphat | 2008-06-18 16:41 | サーバがらみ | Trackback | Comments(0)
(Firefox3) Firefox3の所感とブックマークツールバーの多段(複数行)表示アドオン
■所感
今日正式版が公開され、ダウンロードでギネスを狙ってるFirefox3を仕事で使ってるサブマシンに入れてみました。

やはり、辛いのが今まで愛用してたアドオンがまだ3に対応してないこと。。
Firefox2時代は8個のアドオンを入れていましたが、3に対応してたのはわずか2つだけです。
特に All-in-One Gestures や Tam Mix Plus などのUIにかかわるアドオンが対応してないのは痛いです。

でもまあ、すぐに3対応版でると思うので、それまでの辛抱です。


JavaScliptエンジンが高速化されているのが目玉の1つ見たいだったので、Gmailで少し試してみました。
まあもともとマシンスペックが非常に低いのであれですが、若干速くなったような気がします。
メインマシンで重いWebアプリ試してみないと体感速度向上まではわからないかも。

■ブックマークツールバーの多段表示
RSS購読は基本的にFirefoxのブックマークツールバーを使ってます。
ただ、標準だと1段しか出てこず、あふれたものは>>を押さないと出てきません。

これでは不便だということで、ブックマークツールバーを多段表示できるアドオンを探して見ました。
1つは Wrap Bookmarks Toolbar です。
http://firefox.geckodev.org/index.php?Wrap%20Bookmarks%20Toolbar
Firefox3 Betaには対応済みたいです。
ただ現時点ではサーバエラーでインストールできませんでした。


実際にいれてみたのは Multirow Bookmarks Toolbar です。
https://addons.mozilla.org/ja/firefox/addon/6937
Firefox3にも正式に対応済みでした。
ツールバーの高さもCSSで指定できるみたいです。
#bookmarksBarContent{
max-height: 96px !important;
}
でも、どこのCSSだかがまだ不明。。。
[PR]
by jehoshaphat | 2008-06-18 16:10 | ツール | Trackback | Comments(1)
メモリ使用量の調査。用語メモ書き…

現在開発中のアプリをパフォーマンスをチェックするため、Windows付属のパフォーマンスログを使いチェックしてみました。

瞬間的なメモリ使用量はタスクマネージャでもみれます。
特にWindowsXPのタスクマネージャは表記がかなり不親切です。

まずデフォルトで出てくる「メモリ使用量」。
これはプロセスのワーキングセットを表しています。(ワーキングセットについては後述)
(パフォーマンスカウンタの Process/Working Setと同じ)

そして、「列の選択」で表示を追加できる「仮想メモリサイズ」。
これはプロセスによってコミットされたサイズ、つまりプライベートバイトを表しています。
(パフォーマンスカウンタの Process/Private Bytesと同じ)

参考:(MSDN)CLR徹底解剖 メモリの問題を調べる。

ちなみにVistaではタスクマネージャのデフォルト表示項目が変わっています。
「メモリ(プライベートワーキングセット)」となっています。
これは共有DLLなどが使用するメモリーを除いた、プロセス本体が使用するメモリー量(つまりワーキングセットから共有オブジェクト等を引いたもの)だそうです。
参考:タスクマネージャに表示されるメモリ使用量
また、XP時代にタスクマネージャで「仮想メモリ」表示されていた項目はVistaでは「コミットサイズ」になっているようです。(プライベートバイト)
参考:Vista で "private bytes" の意味って本当に変わったの?
Vista表記になれるまで時間かかりそう。。


さて、作成アプリのパフォーマンス計測時にメモリ関連項目に注意してみるべき点ですが、パフォーマンスカウンタには非常に多くのカウンタがあり、わけがわからなくなってしまいます。おもに重要だと思われる項目だけあげてみました。

■Process
Private Bytes
実際にプロセスが必要しており、他のプロセスと共有できないサイズです。そのプロセスがどれくらいメモリを消費するのかの一番の目屋です。なお、この項目はハードディスクにスワップされているページや物理メモリ上の領域を問いません。(つまり物理メモリで使用中+HDDスワップ中ということになります)
なお、XPのタスクマネージャでは「仮想メモリサイズ」と表現されています。

Working Set
そのプロセスで使用しているメモリサイズ(仮想メモリ含む)のうち実際のメモリ上で確保されている領域です。メモリに余裕がある場合(正確には空きメモリ領域のしきい値)は、使用中でなくても実メモリ上に残る仕様見たいです。(キャッシュ的な感じ?)

Working Set -Private-(Vistaのみ)
上記にて説明済みですが、ワーキングセット - 共有オブジェクト の値となります。実メモリ上のそのプロセスonlyな確保している空間です。
Vistaのタスクマネージャのデフォルトです。

Page Faults/sec
プロセッサがページフォルトを処理する全体の割合を表し、その値は秒あたりに発生するページフォルト数で測定します。
この値はハードページフォルト(ディスクアクセスを伴うもの)と、ソフトページフォルト(ページフォルトが物理メモリの他の場所に検出される) の両方を含むようです。
HDD上のページファイルに対して、スラッシングしているかどうかの正確な値はこのカウンタがソフトページフォルトを含んでいることから難しいかもしれません。HDD上ページファイルへのページングを見るには Memory¥Pages/sec を見たほうがよさそうです。(ただこれだと、そのプロセスに対してというのが見れませんが。)


■Memory
Available Mbytes
物理メモリの空きサイズです。
これが足りないとスラッシングになってしまい、激しくパフォーマンスが低下します。

Pages/sec
MSからのコピペになりますが。。
ハード ページフォルトを解決するためにディスクとの間で読み書きされるページの数を表します (ハードページフォルトは、プロセスにおいて必要なコードまたはデータが作業セットまたは物理メモリの他の場所にも存在せず、ディスクから取得しなければならないときに発生します)。
その値は、Memory: Pages Input/sec と Memory: Pages Output/sec との合計です。


Commited Bytes
システム全体で利用されているメモリの使用量(HDD上のページファイル含む)です。
これが物理メモリより大きくなればなるほどページングが頻繁に発生します。

以上最低限見ておきたい項目をまとめてみました。
メモリ管理、結構手間ですね。

NyaRuRuさんのブログには非常に細かい情報が載っているので大助かりです。

参考:NyaRuRuのメモリがらみが多く書いてる月
MS:パフォーマンスカウンタについて
OS統計情報の取得(Windows以外のOSについても載ってます)
OS小論:OSの構造をもう少し考えてみる(15)(かなり濃い内容です。時間あるときに。。)
パフォーマンスモニタの監視項目(パフォーマンス低下を見極める値も載っているので助かります)
[PR]
by jehoshaphat | 2008-06-10 18:12 | .Net開発 | Trackback | Comments(0)
(SQL)日付処理まわりの注意 - SQL Server
DB上で本日が○/○~○/○に含まれているデータを取りたい(境界線日は含む)という場合がありました。

最初は
SELECT * FROM table
WHERE GETDATE() BETWEEN StartDate AND EndDate

と入れていましたが、これは間違いです。

(StartDate,EndDate列は時刻は00:00:00が入っているという設定です。

なぜならSQL ServerのDatetime型は日付だけでなく時間も含むからです。
参考:新人SEのためのSQLの基礎 第3回(前半) 日付型の注意点
ということで時間を切り捨てて比較する必要があります。

とりあえず下記の2つを考えてみました。

■比較するdatetime型すべてを日付だけの文字列に変換し、文字列で比較する。
CONVERT(varchar,GETDATE(),112) BETWEEN CONVERT(varchar,StartDate,112) AND CONVERT(varchar,EndDate,112)

■比較するdatetime型すべてを日付を切ったdatetime型に変換(時刻は00:00:00)し、比較する。
CONVERT(datetime,CONVERT(varhcar,GETDATE(),112)) BETWEEN StartDate AND EndDate

(この方法は田舎娘のプログラマ生活さんを参考にさせてもらいました。)


一応どちらも正しい結果が返ってきたのでOKだとは思います。
(SQL ServerだとCONVERT関数ですが、OracleだとTO_CHAR関数になるんですかね?)

なお、CONVERT(xxxx,datetime型,style)のstyleの部分には日付のフォーマットが入るようです。
フォーマットについては下記のサイトに載っていました。
CONVERTを使いこなそう!! ~日付編~
MSDN:CAST および CONVERT (Transact-SQL)(CONVERTの使い方も載ってます)
ちなみに、上記の例の 112 だと YYYYMMDD(20080604)という形でフォーマットされます。

しかし、SQLはいまだに苦手ですね。
業務では1kLineもあるようなSQLとかも見かけますが、あんなのは触りたくないです。
[PR]
by jehoshaphat | 2008-06-04 10:06 | SQL | Trackback | Comments(1)