野良エンジニアの足跡 -15ページ目

DataGrid 選択行のデザインを変更

こんにちは、nagino です。


最近 WPF での開発を続けているのですが、DataGrid の情報が少なくて四苦八苦しています。

また、ASP.NET の GridView の RowDataBound イベントなどで可変数のコントロールを追加するなど様々なカスタマイズを行っていたのですが、WPF の DataGrid はイベントやデザインの感覚が全く異なるので困難です。


● とりあえず最近嵌っていたネタ:選択行の背景色

DataGrid のプロパティにある Background や Foreground で色は変更できるのですが、SelectedColor のようなプロパティが無いため選択行の色が変えられません。

私の環境では濃紺になるため、視認性やデザインから変更したかったのですが、情報が無く試行錯誤していたら、以下の設定でとりあえず変更できました。


<Window ... xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit " ...>

<Window.Resources>

...

<Style TragetType='{x:Type my:DataGridCell}'>

<Style.Triggers>

<Trigger Property='IsSelected' Value='True'>

<Setter Property='Background' Value='#FFFF99' />

<Setter Property='BorderBrush' Value='#FFCC66' />

</Trigger>

</Style.Triggers>

</Style>

</Window.Resources>

...

<my:DataGrid ...>

...

</my:DataGrid>

...

</Window>


スタイルで設定してしまうということです。

セル単位で設定していますが、行単位でできるかどうかは未確認です。

1 つの Window に複数の DataGrid があってそれぞれで設定を変える場合はもう 1 手間必要ですが、とりあえずこれで動くので、時間ができたときにでも確認しようかと思います。


WPF での開発は初の上に時間に追われる状態なので、Dependency Property、Binding、Style といったところを理解する余裕が無く行き当たりばったりで進めているので、かなり厳しいです。

ネットに情報があるにはあるのですが、どうも欲しい情報とずれているようでしっくり来ない感じがしています。

このあたり、うまく分析できれば良いのですが・・・。


照合順序 概要

こんにちは、naginoです。


ちょっと IT コーディネーターのケース研修前でバタバタしてしまい、筆不精になってしまっています。

ですが、以前書きかけてそのまま未公開だった記事があったので、この機会にアップします。

SQL Serverの日本語環境では、照合順序が色々あります。


SQL Server で、例えば「あ」と「ア」が区別されないのは、この照合順序が大抵 Japanese_90_CI_AS などになっているからであって、Japanese_90_BIN2 などを指定すると区別されます。

このように照合順序ではどの文字を同一とみなすか、どの文字はある文字の前か、後か、といったことを指定することができます。

ここをよく SQL Server の仕様だと誤解されている方が多いので、注意してください。


ただし、SQL Server 2005 や 2008 ではデフォルトの照合順序が 1 つ前の世代のものとなっているため、インストール時に明示的に指定しないと機能を生かせません。

そこで、照合順序の基礎知識をまとめてみます。


照合順序はまず、以下の2種類に大別できます。

-1. SQL 照合順序

-2. Windows 照合順序

SQL 照合順序は古い環境との互換性のみが目的で残っているだけのため、現在ではほとんどのケースでは Windows 照合順序を選択することになります。


Windows 照合順序は、以下の 5 種類に分類できます。

-1.Japanese_Unicode (7.0から)

-2.Japanese (2000から)

-3.Japanese_90 (2005から)

-4.Japanese_XJIS_100 (2008から)

-5.Japanese_Bushu_Kakusu_100 (2008から)

それぞれの照合順序は、上記のキーワードの後ろに詳細なパラメータが付きます。

-2. の Japanese は、たとえば Japanese_CI_AS、Japanese_CS_AI などいくつかあります。

-3. の Japanese_90 は、たとえば Japanese_90_CI_AS などいくつかあります。

これらは、-1.Japanese_Unicode の上位が -2.Japanese、そしてそのさらに上位が -3.Japanese_90、そのまたさらに上位が -4.Japanese_XJIS_100 となります。

そのため、互換性が必要な場合を除いて、通常は上位の照合順序を選択します。

また、必要に応じて SQL の COLLATE 句で照合順序を指定して処理することができます。

なお、-5.Japanese_Bushu_kakusu_100 は 2008 からの新しい照合順序で、部首画数順にソートします。

Vista から OS でもサポートされていた順序ですね。

また、パラメータが BIN もしくは BIN2 のものについては、文字のバイナリコードでソートされます。

BIN は一部ソート順が正しくないという不具合があるため、基本的には上位の BIN2 を使用します。


ちなみに、それぞれサポートする文字の範囲は以下の通り(らしい)です。

-1.Japanese_Unicode ⇒ Unicode 2.0

-2.Japanese ⇒ Unicode 2.1

-3.Japanese_90 ⇒ Unicode 3.0

-4.Japanese_XJIS_100 ⇒ Unicode 5.0

-5.Japanese_Bushu_Kakusu_100 ⇒ Unicode 5.0

Unicodeのバージョンが上のほうが、扱える文字が増えます。

その点でも、互換性が特に必要でない限りは、上位の照合順序を使用するほうが良いと思います。


さて、簡潔にまとまったので今回はこのあたりとしますが、機会があれば CI や AS といったパラメータについても別途記事にします。

というのも、日本語の濁点の扱いなどが少々分かりにくいのです。


System.Drawing.Color 構造体

こんにちは、naginoです。


.NET で UI をいじっていると System.Drawing.Color 構造体で色指定することがあるのですが、名称が CSS のものとは微妙に異なるので不便していました。


そしたら、MSDN ライブラリに色見本が一覧で存在するのですね。

http://msdn.microsoft.com/ja-jp/library/ms531197(en-us,VS.85).aspx

http://msdn.microsoft.com/ja-jp/library/aa358802(en-us,VS.85).aspx

http://msdn.microsoft.com/ja-jp/library/aa358800(en-us,VS.85).aspx

http://msdn.microsoft.com/ja-jp/library/aa358801(en-us,VS.85).aspx

http://msdn.microsoft.com/ja-jp/library/aa358803(en-us,VS.85).aspx


ちょっと色見本が小さいですが、とりあえず使えます。

自作しようかと思っていましたが、作成する気力が削がれました。


Future Technology Days ~ Windows 7 セミナー (4)

こんにちは、naginoです。


今回は最後の Break Out Session を振り返ります。


● どう変わる? Windows 7 & Vista アプリケーション開発 ~セキュリティ対応~

このセッションは開発寄りのセッションでした。

ハンズオンの数が少なく、受け取れませんでした。


このセッションでは、全ての前提としてのリソース管理と IL、実際のセキュリティの仕組みである UAC、UIPI、IE 保護モード、セッション 0 の分離、WRP を順に説明し、最後にセキュリティ対応を考慮したアプリケーションの設計について説明するという流れでした。

順に振り返ります。


・リソース管理

基本的には Vista と同じで、セキュリティの観点からはアカウントは 3 種類(標準、Administrators、Administrator)に分類されます。

Administrator は、基本的には Administrators の中の 1 アカウントですが、常に管理者トークンが使用される点が特殊です。


ディレクトリ構造は、大きくマシン全体に関する領域とユーザー別領域とに分かれました。

それぞれ以下の権限が必要になります。

マシン全体 : 書き込み ⇒ 管理者権限

: 読み込み ⇒ ユーザー権限

ユーザー別 : 書き込み ⇒ ユーザー権限

読み込み ⇒ ユーザー権限


また、フォルダ構成が大きく変わりました。

単純にパスが変わっただけではなく、環境変数の追加もあり、また「ディレクトリの接合」という仕組みが導入されたそうです。

「ディレクトリの接合」というのは、古い環境変数のパスへの書き込みをユーザー別領域の所定の場所へリダイレクトする機能のようです。

過去のアプリケーションが動作するために存在する仕組みのようですが、読み込みはリダイレクトしないため、インストールはできるが動作しないなど色々トラブルを起こす原因になっているようです。


・IL(Integrity Level / 整合性レベル)

これは Vista や 7 のセキュリティ機構の基礎となっているもので、プロセスやファイル、レジストリといった様々なオブジェクトに関してアクセスできるレベルを管理する仕組みのようです。

レベルは以下の 3 つに分かれています。

高 IL:管理者権限

中 IL:標準権限

低 IL:信頼できない権限(IEの保護モードで使用)

管理者権限を持つ Administrators のアカウントでログオンしても UAC が表示されるのは、この中 IL と高 IL 両方が発行され、普段は中 IL のトークンが使用されるからのようです。

# トークンと IL って関連するものとして理解しているのですが、もしかして違うかもしれません。


・UAC(User Account Control)

トークンのフィルタリングで実現している、と話していました。

管理者アカウントでログオンしても、標準ユーザーと管理者の 2 つのトークン(フルトークンとフィルタ済みトークン)が発行され、普段はフィルタ済みトークンが使用される仕組みになります。

UAC のダイアログで許可すると初めて管理者承認モードとなり、フルトークンが使用されます。

UAC のダイアログの帯の色は、実行ファイルの署名で変化するため、自作のアプリケーションに対しては適切な署名が好ましいとのことでした。


また、UAC は 7 になってデフォルト設定が変更になり、必要の無い限り出なくなりました。(例えば Windows System 提供の場合は出ない)

また、コントロールパネルにスライダで簡単に UAC の設定を 4 段階で変更できるようになり、Vista のセキュリティポリシーで一つ一つ設定する必要があったのに比べると非常に扱いやすくなっています。

逆に言えば、Vista でもセキュリティポリシーを適切に設定すれば、必要の無い限り出ないようにできるかもしれません。(未確認)


なお、UAC のダイアログではなくアプリケーション実行時に管理者承認モードにするには、以下の 3 通りの方法があるそうです。

- 実行ファイルを右クリックして「管理者として実行」

- プロパティタブの「互換性タブ」で設定

- Manifest で権限指定(RequestExequsionLevel)


あとは、インストーラの自動検出などで例外的に出ることがあるそうですが、これはファイル名などで判別されてしまい、また 32bit で標準ユーザー実行し、Manifest が無い場合のみに限定される保険のような機能のため、Manifest を適切に用意するのが鉄則とのことです。


・ファイルとレジストリの仮想化

標準ユーザーで書き込みを行うときに権限が足りない場合、自動でリダイレクトされるそうです。

こちらも 32bit / 標準ユーザー / Manifest 無しが条件ですが、ディレクトリの接合とは異なり、読み書き両方がリダイレクトされるそうです。(なぜディレクトリの接合は書き込みのみなのかが謎ですが・・・。)

そのため、Vista 非対応のアプリケーションで C:\Program Files にインストールしていないアプリケーションは、この機能によってとんでもないところにインストールされている可能性があるようです。


ここで話が少しそれて、インストール時のアプリケーション初期設定の話になりました。

インストーラによるインストール中は、前述のインストーラの自動検出などもあり、大抵は管理者権限で実行されているのですが、このときはマシン全体の領域に書き込みが行えます。

ここでうっかりその領域に設定情報を書き込むと、以後通常起動すると設定変更などができない事態になります。

このため、Vista / 7 対応のアプリケーションは、アプリケーション自体の初回起動時に初期設定を行うようにするべきだそうです。

実際 Visual Studio や SQL Server Management Studio などの最近のバージョンは、どれも初回起動時に設定を行っています。


また、シールドアイコンは、実行ファイルへは Manifest によって自動的につくが、ボタンなどにはコードで BCM_SETSHIELD で明示的に設定する必要があるということでした。

また、アプリケーションのうち管理者権限が必要な箇所は別の実行ファイルにまとめ、それを ShellExecute() で起動することで、最小権限の付与が行えるとのことでした。


・UIPI

ウィンドウメッセージや DLL 注入から保護するため、権限が低いアプリケーションから権限が高いアプリケーションへの SendMessage が失敗するようになり、それを UIPI(UI特権?)というそうです。

そのような必要がある場合は、もちろん権限昇格しても可能だがそれではセキュリティの意味が無いので、Manifest で uiAccess を設定することで対応できるそうです。

ただし署名つきでインストールした場合のみ有効とのことでした。


・セッション 0 の分離

今までセッション 0 でサービスとユーザーセッションが実行されていたが、セッション 0 はサービスのみになり、ユーザーはセッション 1 以降に接続するようになりました。

そのため、サービスとのやり取りにはセッション間通信が必要になります。

これは Windows XP でもユーザーの簡易切り替え再現でき、ダイアログなどを表示してしまうサービスのような、セッション 0 にユーザーがいることが前提となっているサービスでは「対話型サービス検出」のダイアログが表示されます。

ユーザーとの対話を前提としたサービスはそもそもサービスとして不適切なつくりですので、適切に作り変えるのが本筋の対応になります。


・WRP(ウィンドウズリソース保護)

OS の領域などが Trusted Installer のみフルコントロールの権限を持ち、ローカル Administrator であっても読み取りと実行のみの権限までしか持たないようになったということです。


・設計

この時点でセッションの時間をオーバーしていたため、駆け足で以下のポイントを挙げていました。

- 必要最低限の権限で実行。

- 不要な昇格をしない、必要なときのみ昇格。

- 起動時のみ昇格可能である点に注意。

- 高い権限を必要とする処理の実行ボタンは、高い権限で動作させるアプリケーション内に作る。

最後のは、低い権限のアプリケーション内に高い権限のアプリケーションの起動ボタンを作った際に、必ず高い権限のアプリケーションは起動後すぐに実行処理を行うのではなく、必ずユーザ操作をはさむということです。

なぜなら低い権限のアプリケーションはマルウェアからウィンドウメッセージでボタン押下ができてしまうため、実行ボタンを用意することでマルウェアから直接実行処理を行わせないようにします。


資料が無く、また私の苦手分野(もっぱら ASP.NET や XP 向け Windows フォームが中心)のため、あやふやな記述が多くなってしまいました。



●最後に

1 日の無料セミナーとしては、かなり勉強になりました。

参加してみてよかったと思います。

ただ、初物ということで技術的に深く触れるというよりは機能紹介が多く、その点は技術者の端くれとして物足りなさも多く感じるところがありました。


Future Technology Days ~ Windows 7 セミナー (3)

こんにちは、naginoです。


Break Out Session は 3 つ参加下のですが、1 つずつ順を追って振り返ります。


● Web プラットフォーム(IIS プラスアルファ)の次なる進化の行方

IIS 7 の振り返りと、Windows Server 2008 R2 で搭載される IIS 7.5 について、そしてその先といった、IIS について幅広く見渡すセッションでした。

詳細は講師の方の Blog に詳しくあり、そちらを見ていただいたほうが早そうですので、割愛します。

http://blogs.technet.com/hirookun/archive/2009/02/25/3206452.aspx

http://blogs.technet.com/hirookun/archive/2009/02/26/3206619.aspx

http://blogs.technet.com/hirookun/archive/2009/02/26/3206661.aspx


●Windows 7 と Windows Server 2008 R2 で提供する New Feature の数々

基調講演の中ほどで話があった、クライアント OS とサーバ OS を組み合わせた際の最新機能を駆け足で紹介するセッションでした。

セッションでは 7 つの機能を取り上げて、その幾つかはデモを実際に披露していました。


・DirectAccess

IPv6 や IPSec を利用して、VPN ではない形でイントラネットにアクセスする仕組みです。

実際にデモを行った際は、クライアントマシンをネットワークにつないだ後に使えるようになるまでに 1~2 分ほど時間がかかっていました。

どうもこの間に GW になるダイレクトアクセスサーバーに接続しているようでした。

VPN とは違ってクライアント側で明示的な操作が不要というのを謳っていましたが、そのために自動的に接続するようです。

自動接続は設定で変更できそうな気もしますが、操作の必要性か、時間か、一長一短のようです。


・BranchCache

ファイル等のキャッシュを支社側で保持することで、本社支社間の通信量を削減しようという仕組みです。

キャッシュはクライアント PC が分散して持つ方法と、支社側にキャッシュサーバを用意する方法と、2 通り選べるということで、支社の規模や管理者の有無に応じて使い分けができるようです。

キャッシュの管理も行えそうな雰囲気でしたが詳細が分からなかったので、なんともいえないところです。


・Remote Desktop Services

Terminal Services の名称変更になるようです。

Virtual Desktop Infrastructure(VDI)と絡めて様々な仮想化の話が出てきましたが、機能の紹介に終始していた印象があり、特に興味を引かれた点はありませんでした。


・BitLocker の強化

外部デバイスにも対応した BitLocker になります。

BitLocker To Go とも称していました。

FAT・FAT32・ExFAT フォーマットの外部ストレージを暗号化できるのが強化ポイントで、これによってサードパーティー製の暗号化ソフトを用意しなくても一通りの暗号化が提供できたのではないかと思います。


・APP Locker

アプリケーションのインストールや、開けるファイルの制限を行えるという機能になります。

グループポリシーや電子署名、バージョンで制限可能と謳っていました。

ハンズオンも触れる程度でした。


・DNS SEC

RFC 4033、4034、4035 で定義された DNS のセキュリティ向上になります。


・DFS-R

読み取り専用の分散ファイルシステムによるセキュリティ強化とのことです。

このあたりは聞いていませんでした・・・。


長くなりましたので、3 つ目のセッション「どう変わる? Windows 7 & Vista アプリケーション開発 ~セキュリティ対応~」については別の記事に改めます。