ページ

2012年8月6日月曜日

◆Entity Frameworkで自己追跡エンティティを使う(纏め)

MTG Blog: ◆ADO.NET Entity Frameworkに入門してみるで試行錯誤しながら自己追跡エンティティを使ってみたのだが、再度読み直したら判りづらかったのでもう一度纏めてみる。
(DataプロジェクトとWebプロジェクトは分割しないほうが判りやすいのかもしれない)

  1. 新規に「Silverlightアプリケーション」を作成する。(AddressBook)
    imageimage

    2つのプロジェクトができる。
    image
  2. プロジェクトの追加で「AddressBook.Data」プロジェクト(クラスライブラリ)を追加する。(追加されたClass1.csは削除)
    image
  3. 「AddressBook.Data」プロジェクトに「ADO.NET Entity Dta Model」を追加。(Model1.edms)
    image
    image

    データ接続は前回作成した「AddressBook」データベースを使用する。
    image
  4. Model1.edmxを開き、デザイナ画面の背景をクリックし「AddressBookModel」のプロパティを表示。
    image
  5. プロパティ画面で「コード生成方法」に「なし」を指定する。
    image
  6. デザイナ画面の背景を右クリックし、コンテキストメニューから「コード生成項目の追加」を選択。
    image
  7. 「新しい項目の追加」画面で、「ADO.NET Self-Tracking Entity ジェネレーター」を選択する。
    image
  8. 「ソリューションエクスプローラ―」で「ソリューション」を右クリックして「AddressBook.Entity」プロジェクトを追加する。(Silverlightクラスライブラリプロジェクト) 「Class1.cs」は削除
    image
  9. 「ソリューションエクスプローラ―」で「AddressBook.Entity」プロジェクトを右クリックして「追加」「既存の項目」を選択。
    image
  10. 「AddressBook.Data」プロジェクトの「Model1.tt」を「リンクとして追加」
    image
  11. 「AddressBook.Entity」プロジェクトのプロパティで「既定の名前空間」を「AddressBook.Data」に変更。
    image
  12. 「AddressBook.Entity」プロジェクトに「参照の追加」で「System.Runtime.Serialization」を追加。
    image
  13. 「ソリューションエクスプローラ―」で「AddressBook.Web」プロジェクトに「AddressBook.Data」プロジェクトへの参照を追加。
    image
    image
  14. 「ソリューションエクスプローラ―」で「AddressBook.Web」に「参照の追加」
    で「System.Data.Entity」を追加する。
    image
    image
  15. 「ソリューションエクスプローラ―」で「AddressBook.Web」プロジェクトを右クリックして「新しい項目の追加」「Silverlight対応WCFサービス」を追加する。(AddressBookService)
    image
  16. 「AddressBook.Service.cs」に以下のメソッドを追加。
    AddressBook.Service.cs
    1. using System;
    2. using System.Linq;
    3. using System.Runtime.Serialization;
    4. using System.ServiceModel;
    5. using System.ServiceModel.Activation;
    6. using System.Collections.Generic;
    7. using AddressBook.Data;
    8.  
    9. namespace AddressBook.Web
    10. {
    11.     [ServiceContract(Namespace = "")]
    12.     [SilverlightFaultBehavior]
    13.     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    14.     public class AddressBookService
    15.     {
    16.         [OperationContract]
    17.         public List<Entry> GetEntries()
    18.         {
    19.             using (var container = new AddressBookEntities())
    20.             {
    21.                 // Entry
    22.                 return container.Entries.ToList<Entry>();
    23.             }
    24.         }
    25.  
    26.         // UpdateEntries
    27.         // OperationContract
    28.         [OperationContract]
    29.         public bool UpdateEntries(IEnumerable<Entry> entries)
    30.         {
    31.             using (var container = new AddressBookEntities())
    32.             {
    33.                 try
    34.                 {
    35.                     // ApplyChanges
    36.                     foreach (var entry in entries)
    37.                     {
    38.                         container.Entries.ApplyChanges(entry);
    39.                     }
    40.  
    41.                     // SaveChanges
    42.                     container.SaveChanges();
    43.                     return true;
    44.                 }
    45.                 catch (System.Data.OptimisticConcurrencyException ex)
    46.                 {
    47.                     return false;
    48.                 }
    49.             }
    50.         }
    51.     }
    52. }
  17. 「AddressBook」プロジェクトの「参照の追加」にて「AddressBook.Entity」プロジェクトを参照追加する。
  18. 「AddressBook」プロジェクトの「MainPage.xaml」に「DataGrid」コントロールを追加。
    image
    XAMLに以下が追加される。
    image
  19. 「DataGrid」のXAMLソースを以下に置き換える。
    MainPage.xaml
    1.         <sdk:DataGrid AutoGenerateColumns="False" Height="237"     HorizontalAlignment="Left" Margin="8,12,0,0" Name="dataGrid1"     VerticalAlignment="Top" Width="376" ItemsSource="{Binding}" Grid.Column="1">
    2.         <sdk:DataGrid.Columns>
    3.                    <sdk:DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" />
    4.                    <sdk:DataGridTextColumn Binding="{Binding Path=TelNo}" Header="TelNo" />
    5.                    <sdk:DataGridTextColumn Binding="{Binding Path=MailAddress}" Header="MailAddress" />
    6.                    <sdk:DataGridTextColumn Binding="{Binding Path=Age}" Header="Age" />
    7.         </sdk:DataGrid.Columns>
    8.     </sdk:DataGrid>
    9.     <Button Content="Load" Height="23" HorizontalAlignment="Left" Margin="59,265,0,0" Name="loadButton" VerticalAlignment="Top" Width="75" Grid.Column="1" />
    10.     <Button Content="Save" Height="23" HorizontalAlignment="Left" Margin="152,265,0,0" Name="saveButton" VerticalAlignment="Top" Width="75" Grid.Column="1" />


  20. 「F6キー」を押して一旦ビルド
  21. 「AddressBook」プロジェクトの「参照設定」から「サービス参照の追加」をクリック。
    image
  22. 「サービス参照の追加」画面で「探索」ボタンをクリック。
    image
  23. サービスが見つかったら、「名前空間」に「AddressBookServiceReference」を指定して「OK」
    image
  24. 「MainPage.xaml.cs」のイベントハンドラーを以下の通り編集。
    MainPage.xaml
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Net;
    5. using System.Windows;
    6. using System.Windows.Controls;
    7. using System.Windows.Documents;
    8. using System.Windows.Input;
    9. using System.Windows.Media;
    10. using System.Windows.Media.Animation;
    11. using System.Windows.Shapes;
    12. using MyAddressBook.Data;
    13.  
    14. namespace MyAddressBook
    15. {
    16.     public partial class MainPage : UserControl
    17.     {
    18.         MyAddressBookServiceReference.MyAddressBookServiceClient service;
    19.  
    20.         public MainPage()
    21.         {
    22.             InitializeComponent();
    23.         }
    24.  
    25.         private void UserControl_Loaded(object sender, RoutedEventArgs e)
    26.         {
    27.             service = new MyAddressBookServiceReference.MyAddressBookServiceClient();
    28.         }
    29.  
    30.         private void loadButton_Click(object sender, RoutedEventArgs e)
    31.         {
    32.             service.GetEntriesCompleted += (send, ee) => dataGrid1.ItemsSource = ee.Result;
    33.             service.GetEntriesAsync();
    34.         }
    35.  
    36.         private void saveButton_Click(object sender, RoutedEventArgs e)
    37.         {
    38.             var entries = dataGrid1.ItemsSource.Cast<Entry>();
    39.             service.UpdateEntriesCompleted += (send, ee) => MessageBox.Show("Save " + (ee.Result ? "Success" : "Failure"));
    40.             service.UpdateEntriesAsync(new System.Collections.ObjectModel.ObservableCollection<Entry>(entries));
    41.         }
    42.     }
    43. }
  25. 「AddressBook.Web」プロジェクトと「AddressBook.Data」プロジェクトを分割した関係上、接続文字列が「AddressBook.Data」プロジェクトの「App.Config」に定義されているので、「AddressBook.Web」プロジェクトの「Web.Config」に移動する。
    image
  26. 「F5キー」で実行し、「Load」「Save」ができればOK

2012年7月4日水曜日

◆Windows8RPでコマンドを管理者として実行する

これまではUACを切っておくと「cmd」や「PowerShell」は管理者として実行された。

ところが、Windows8RPでは明示的に「管理者として実行」を選択しないといけなくなっている。

これではスクリプトを右クリックして実行するときなどはちょっと不便である。

仕方がないので以下の様にショートカットを作る。

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"に対してショートカットを作り、「プロパティ」から「詳細設定」ボタンを押し、
image

詳細プロパティで「管理者として実行」をチェックする。
image

あとはこのショートカットを「Windows + R」「shell:sendoto」で開いたフォルダに突っ込んでおけば良い。

image

実行するときは、当該スクリプトを右クリックして「送る」から作成したショートカットを選べばよい。
image

2012年6月18日月曜日

◆Excel 選択された行数をカウントする(非連続選択対応)

Excel VBA

通常、選択行は「Range」オブジェクトの「Rows.Count」とかで簡単に取れる。
しかし、これが「Ctrl」を使って非連続行を選択したりするとうまくいかない。

「Rows.Count」は最初の選択行(連続した部分)の行数が返ってくるようだ。

選択された全行を取得するにはどうするのか。
調べてみたが意外とこれが見つからない。

さすがに世界を代表するソフトだけあってExcelの問題はネットを探せば簡単に解決策が見つかるものだが、不思議と問題にしている人さえほとんど見かけない。
(もしかすると根本的にやり方が間違っているのかも・・・)

ネットで回答が見つからなかったので自分なりに力技で求めてみた。

選択部分は「Selection.Areas」で塊ごとの「Range」オブジェクトが返ってくるようだ。
だとすればあとはそれぞれの行数をカウントして足すだけ。

RowCount = 0
For Each Rng In Selection.Areas
    RowCount = RowCount + Rng.Rows.Count
Next
MsgBox (RowCount)

もっとダイレクトな方法があってもよさそうだが、とりあえず良しとする。

2012年6月15日金曜日

◆SharePoint PDFファイルを直接開く


ShaePointサイトにアップしたPDFファイルを開くとダウンロードのダイアログが表示されるが、Officeドキュメントの様にそのまま開いてくれると便利だ。

探してみると以下にその方法があった。
SharePoint 2010 でPDF を開く « クリエ・イルミネート ブログ

簡単にまとめると

  • PDF用のアイコン(どこからか取ってきて)を以下に保存。
    C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IMAGES
  • 以下のパスにあるDocIcon.xml にPDF用のMappingを追加。
    C:\Program Files\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\XML
    image

っと設定してあげれば良いらしい。

様々な環境で試したわけではないので確かなことは言えないが、当方の環境で試してみるとクライアントのAdobeReaderのバージョンによって挙動に違いがみられた。

  • バージョン9
    上記設定では直接開くようにはならず保存ダイアログが表示された。
  • バージョン10(X)
    保存ダイアログが表示されずにドキュメントを開くことができた。
    しかし、以下の設定をしてもブラウザ内には表示されなかった。
    image

そこで、上記サイトに追加情報で載っていた以下の設定を行ってみた。

1)サーバーの全体管理>Webアプリケーションの管理 を開く。
2)一覧から当該サイトを選択し、リボンの【全般設定】をクリック。
3)ブラウザでのファイル処理>制限しない をチェックして【OK】をクリック。

結果は、

  • バージョン9
    AdobeReaderの「PDFをブラウザに表示」のチェックに従ってブラウザに表示、独自ウインドウに表示、が可能だった。(保存ダイアログは表示されない)
  • バージョン10(X)
    先ほどと動作は変わらず。
    ブラウザ外(独自ウインドウ)にのみ直接表示可能。

別の要因による影響かもしれないが一応メモしておく。

◆SharePointサイトのクロール対象にPDFファイルを追加する

SharePointで検索処理をするためには予めクロール処理を行う必要がある。
WordやExcelなどのOfficeドキュメントは最初から検索してくれるようだがファイルの種類によっては、対応するフィルターを追加する必要がある。
以下のドキュメントを基にPDFファイルをクロール対象にする手順を纏めてみた。
Microsoft SharePoint Server 2010 自習書シリーズ | TechNet

  1. 「サーバー全体の管理」から「アプリケーションの全般設定」をクリック。
    image
  2. 「ファーム検索管理」をクリック
    image
  3. 「Search Service Application」をクリック
    image
  4. 「ファイルの種類」をクリック
    image
  5. 「新しいファイルの種類」をクリック
    image
  6. 「ファイル名拡張子」に「PDF」と入力し「OK」ボタンをクリック
    image
  7. IFilterのインストール
    PDFファイルの中身をクロールするためにAdobe社が提供しているPDF用のフィルタープログラム(IFilter)をインストールする。
  8. IFilter用のレジストリー値の確認
    • レジストリーエディタの起動
      「Win + R」で「ファイル名を指定して実行」を開き「regedit」と入力し「OK」ボタンをクリック。
      image
    • レジストリ1
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\14.0\Search\Applications\{site GUID}\Gather\Portal_Content\Extensions\ExtensionList
      ※{site GUID}のところは、環境別に生成された任意のIDが入っています。
      image
      ExtentionListの値の中に”pdf”があることを確認します。もしなければ、値を追加します。
      リスト一覧を見渡し、まだ使われていないID番号を確認します。(この場合は48)
      値はレジストリエディタ右側のウィンドウで右クリックをし、「新規」から「文字列値」を選びます。
    • レジストリ2

      Filter値の確認をします。
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\Filters\.pdf
      を開きます。
      image
      値が下記のようになっていることを確認します。
      <REG_SZ> Default = <value not set>
      <REG_SZ> Extension = pdf
      <REG_DWORD> FileTypeBucket = 1
      <REG_SZ> MimeTypes = application/pdf

    • レジストリ3
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf
      値が ”{E8978DA6-047F-4E3D-9C78-CDBE46041603}”である必要があります。違う値が入っている場合は、この決められた値に変更します。
      image
      ※他の拡張子の「種類」を見ると、すべて「REG_MULTI_SZ」になっているので合わせたいところだがGUIからは変更できないようだ。
      そこで、以下のPowerShellコマンドにて変更。
      New-Itemproperty "HKLM:\SOFTWARE\Microsoft\Office Server\14.0\Search\Setup\ContentIndexCommon\Filters\Extension\.pdf" "(default)" -propertytype MultiString -value {E8978DA6-047F-4E3D-9C78-CDBE46041603}
  9. DOCICON.XMLファイルの編集
    • アイコンの追加
      アイコン画像を入手します。PDFファイルに関しては、Adobe社がアイコンを用意しています。
      http://www.adobe.com/misc/linking.html#pdficon
      17×17サイズのアイコンを選択し、右クリックし、名前を付けて画像を保存します。本書は名前を”PDF16.GIF”としてローカルに保存します。
    • アイコンの保存先
      C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\IMAGES
    • C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\XML\DOCICON.XMLファイルをメモ帳で開く。
    • マッピングキーを追加します。<ByExtention>属性内の任意の場所に下記の値を追加します。
      <Mapping Key="pdf" Value="pdf16.gif"/>
      image
  10. サービスの再起動とIISの再起動

    [スタート] から [ファイル名を指定して実行] をクリックし、 “cmd” と入力し、起動します。下記コマンドを順に実行します。
    net stop osearch14
    net start osearch14
    iisreset

  11. クロール処理を実行し、PDFが検索されるか確認する。

2012年6月1日金曜日

◆Windows8プロキシ環境でLiveIDを使ってログオンする

1.設定を選ぶ(画面右下にカーソルを持っていくと表示される)

image

2.PCの設定変更を選択
image

3.PC設定にて「ユーザー」を選択
image

あとは画面に従った自分のLiveIDを入れればOK

のはずなのだが、これがまたうまくいかない(接続エラーになる)

調べてみると、どうもプロキシ環境ではWinHttpによるプロキシサーバーの設定が必要らしい。
確かにログオン前に接続する必要があるので当然といえば当然なのだが、何かしらセットアップ時にサポートがあってしかるべきではなかろうか・・・。

image

◆Windows8をマルチディスプレーで使う

Windows8RPでマルチディスプレーの扱いがちょっと変わっているっぽい。
まぁ、マルチディスプレーというよりはそもそものWindowsキーの扱いが変わっているのかな。

以前はWindowsキーのトグル動作でメトロと旧デスクトップを行き来していたのだが、CPからは基本的にはメトロアプリとメトロスタート画面のトグル動作になった。
(CPもあまり使っていなかったので勘違いかもしれないが・・・)

マルチディスプレーの場合、メトロは一方の画面でしか表示できないので旧デスクトップとメトロとが頻繁に切り替わって落ち着かなかったがこれでやっと普通に使えそうな感じだ。

Windows8をタブレットやスマフォで使う分には問題ないだろうが、Windows7からのアップグレードとしては厳しいのでは?と感じていたが1、2時間使ってみただけではあるが「なんとなくいけそうなきがする~」と感じるようになった。

要はWindows7の後継として使うには、メトロのスタートアップ画面をこれまでのスタート画面だと思えば良いのだ。
これまではWindowsキーで小さなダイアログ表示されていたのがWindows8では大きな画面になっただけと捉えれば違いは無いのだと思えてきた。
そう捉えれば、通常はこれまで通り同じ感覚で使えるし、いざとなればメトロアプリも使うことができる。
当然開発もこれまでのWindowsアプリも作れれば、メトロアプリも作ることができる。

いい感じだ。

ちなみに、マルチディスプレーのメトロ画面をどちらのディスプレーに表示するか。
この変更方法が解らなかったのだが、偶然以下の操作でいけるのを見つけた。(これが正攻法かは解らないが)

  1. まず、メトロアプリを何か起動する。
  2. 画面の一番上にカーソルを持っていくと手の形をしたカーソルになるので掴んで(クリックして)ドラッグする。
    image
  3. とは反対の画面に持っていくだけでメトロ表示が移動してくれる。

 

 

◆Windows8天気の設定

Windows8のRP版がリリースされたのでインストールしてちょっとだけ使ってみた。

CP版もインストールしただけでほとんど使っていないので感覚的には初めて使うような感じ。

いつもIEをつなげただけで満足て終わっているので今日は別のアプリケーションも触ってみる。
とりあえず「天気」を開いて自分の地域を追加。
追加は簡単にできるのだが、スタート画面に表示させるデフォルトの地域の設定方法が解らない。

こんな感じになっているので普通に考えれば上にドラッグして変わってくれれば良いだけなのだが。
image

実際に個別の地域を表示させたうえで設定するのかとも思ったのだが、右クリックしても表示されるのはこんな画面で特に何も出来そうもない。
image

一番上に表示されている「東京」デフォルトなので削除してやれば必然的に2番目がデフォルトになるだろうとも思ったのだが、追加はできても削除の仕方が解らないと来ている。

Apple対抗に必死なはずなのにこんな直観的じゃないGUIで良いのかしらん・・・。

こんなくだらないことにしばらく試行錯誤してやって見つける。

どうもこの個々の地域の設定画面、現在のデフォルトとそれ以外で表示を分けているのだ。
デフォルトじゃない地域の設定画面を表示させれば目的の設定項目が現れる。
image

どうしてこんな単純なことをこんなに難しくしてしまうのかね・・・。

もし引っ越しでもして以前の地域を削除しようと思ったら、いちいち他の場所をデフォルトにした上でその地域を開きなおして削除しなきゃいけないのかぁ?

2012年4月4日水曜日

◆今年もダメダメ

4月4日広島戦。

ゴンザレス踏ん張るも打線が今年も全くダメダメ。
同じく監督ともダメダメで、越智なんて去年から使いものにならないってわかりきっているのに同点の9回なんて大事な所で出して1アウトも取れずにサヨナラ負け。

なんでみんなが駄目だって判っているのに巨人の首脳陣だけが判らないのか不思議でしょうがない。

なんかマスコミは巨人の戦力が凄いとか言っているが全く頓珍漢な意見だ。

杉内とホールトンが入って危機的な先発陣がなんとか並以上になった程度。
村田を補強したなんて言っているが、ラミレスの穴を考えれば攻撃では若干マイナスだろう。(さすがに守備はプラスだが)

巨人が弱いのは、
足が速く出塁率の高い1番バッターがいないこと。
左殺しのワンポイントが居ないこと。
同点もしくは負け試合を繋げる中継ぎが不足していること。
絶対的な抑えが居ないこと。
っと沢山あるが、何一つ今年になって改善されていない。
監督が脳天気なのかフロントが清武問題で頭が回らないのか。

今年もダメだね。

私が最近チェックした記事