Feeds:
投稿
コメント

Archive for 2012年9月

タイトル考えるのだけは楽しいですね

Office 2013は現在もっともWindows 8のデスクトップアプリケーションのあるべき姿をとっているということができると思います。そもそも現在Windows 8向けのデスクトップアプリケーションというものはないのではないかと思います。というのもたいていはWindows 7以前向けのアプリケーションを使っているためです。
しかしOffice 2013は完全にWindows 8を意識して作られています。これはWindows 8、ならびにこれからのWindows デスクトップアプリケーションのあるべき姿である、そんな風に思います。というわけでOffice 2013のUIなどを見ながらどうしていけばよいかなんかを考察していきます

・増える入力形式
今までのWindowsでは基本的にマウスとキーボードの入力が主流でした。Windows 7からマルチタッチをサポートしましたが実際には対応したデバイスが多く出なかった点や単純にWindows 7をそのままタッチデバイスに持って行ったためあまり操作性が高いといえるものではありませんでした(標準のコントロールのpxとかうんぬん)

しかしWindows 8からはタッチとペンも主流の入力形式としてサポートしていく形になります。これが示すことはつまりどんな入力デバイスからでも操作できる可能性 というものが必要になってくるわけです。たとえば11pxのListBoxのアイテムを直列に並べたらどうなるでしょうか? 間違えずにちゃんと押せるのか といわれると間違えるかもしれない という回答になることでしょう。最低でも何たらpx以上とかなんとかってどこかにあった気がしますが本当にWindows 8などに対応したデスクトップアプリケーションを作るうえではとても大事になっていくことと思います

・UI表示方法を変えるタッチモード
タッチモードはすべてのOffice製品に追加されているUIレイアウトを変更するモードです。次の二つの画像を見てみましょう

現在のOutlook 2013の画像です。上が標準モード、下がタッチモードです。タッチモードのほうはオレンジで囲ってある部分が変更部分です。リボンUIのボタンレイアウトが通常より大きめにとられているのが分かると思います。またリストアイテムも大きめになりよく使うコマンドは右側にコマンドバーとしてまとめられているのが分かると思います。さて、この時どのようなことが行われているのかをもうちょっと検証してみましょう。次に4枚の画像を示します

はい、ということでリボンUIコントロールとリストアイテムを拡大して横にルーラーを配置したものです。どちらも先が標準で後がタッチモードです
リボンUIのほうはわかりやすいように適当に選択してみたのですがこれに誤差があるとすればボタンの大きさは同じといえることが分かります。リストアイテムの方は17px→26pxとなり事実上大きくなってはいますがフォントサイズはどちらも11pxとまったく同じです
つまりタッチモードで調整してるのはマージン部分である という風に言えると思います。マージンとグリッドが大きくなっていますが中のコントロール自体はそのままになっているためタッチへの対応はマージン調整を行えるようにするだけでもだいぶできるのではないかという風に感じます

・シンプルなアイコン
Office 2013になってからリボンUIのアイコンはだいぶシンプルになりました。これはModern UI(だっけ?)に影響を受けたものといえるかもしれません。 2010と2013のリボンを並べてみるとこんな感じです

アイコンの形なんかも結構シンプルになりましたね。まあこの辺は手間が大きい可能性もあるしなんともいえないですけど

・IMEから見るキーボードとタッチの違い
情報そのまま垂れ流しです。タッチキーボードと通常のキーボードではIMEの予測変換の出方が違います。タッチでは縦に並べると誤操作が多くなるため横にならべていてキーボードだと縦となっています

UIのコンテキスト依存
これなんかもはや調べてない…
Office 2013では特定のメニューにおいてタッチで開くかマウスで開くかに応じてメニューのレイアウトが切り替わるというものがあります。おもにはコンテキストメニューやカラーピッカーなどとなります。参考としてはhttp://blogs.technet.com/b/microsoft_office_/archive/2012/08/14/office-office.aspxなんかがいいと思います。私のこの記事の全部の内容が書いてあります(

・実際どうしたらいいのか
どうせ対応するなら今からやっとくといい気もしますがその辺は滑らないことを願いつつ
デスクトップアプリケーションは現状マウスとキーボードのみをターゲットとしてるものが多いので新規に作るときにこういう点を考えてもいいかもしれません。既存のアプリケーションに加えるならやはりOfficeみたいにタッチモードの導入が一番いいかもしれません。またはリボンUIみたいにコントロールが大量に列挙されるようなものでないなら最初からタッチモード的な形で作成する という手もあると思います。情報量少し減るのでその辺はよく考える必要はあるかもですが
Officeでタッチモードと標準が共存してるのはリボンUIがスペースとりすぎるという問題があるためなのでそういう問題がないならタッチモード一本で組んでしまうのは十分ありではないかと思います

UIのコンテキスト依存要素についてはControlクラスにMouseDownイベントTouchDownイベントの二つがあるのでこれを使い分けていくという方法がありかなと思います

重要な選択肢は横に並べる方が正確性が出る っていうのも割と大事かもしれませんね

おまけ:リングメニューという新しいメニュー
おまけですがWindowsストア向けのOneNoteにはリングメニューという特殊なメニューが実装されています。これはフリックに近い操作でコンテキストメニューの操作を行えるやたらとすごい代物です。タッチの時代に合わせて新しくコンテキストメニューに代わるものが出るのかもしれませんね


とりあえず今回はここまでで
こんなタイトル負けした記事でよいのか…

とりあえずここまでで

広告

Read Full Post »

Apps for Officeは果たして私の心を揺り動かすものなのか!?

というわけでMSC2012の2日目に取り上げられた新しい開発モデル、Apps for Officeについての記事です
VSTOより優れてるなら使ってみたいですよね

※この記事は2012年9月29日現在の情報を少しまとめたものです。筆者による推測なども当然含んでいます。この記事の内容が正しいということはありませんし突然変わる可能性もありますがそれらについて筆者は一切の責任を負いません

さて、Office 2010までのOffice開発手法には何があったかという話ですがこんな感じ
・VBA(Visual Basic for Applications)
・BCS(Business Connectivity Services)
・Add-ins(Excel,COM)
・Fluent UI(UIカスタマイズ)
・Office Services(SharePointとか)
・Open XML(ファイル操作)

VSTOではAddinとFluent UIができますね。BCSとOffice ServicesはよくわかりませんけどSharePointとか企業向けっぽいのはわかりました。Fluent UIは名前知らなかったけど内容はまあ一応扱ったことある内容

じゃあここに加わるApps for Officeは何を担当するのかという話ですが、それにはまずOffice 2013で何が変わるのかという話から始まります
Office 2013ではこれまで以上にプラットフォームの壁がなくなります。つまりはWindowsだけという時代は終わるわけです
これを実現するためにOffice Web Appsというものがあります。Web上のプラットフォームですね
またスマートフォンなどのデバイスなどにもOfficeは対応するようになっていきます
そんなこんなで新しいデバイスに対応するOffice 2013ですが、これら複数のデバイスでも拡張機能が利用できるようにするためには既存の方法では不可能です(.NET4を動かすとかそもそも無理だったりVBAはセキュリティ面でまずかったり)
ということでセキュリティ面を担保でき複数のデバイスで実行できる拡張機能というものが新しいOffice開発モデルであるApps for Officeです
ちなみに開発手法とかについてはこんな画像があったり

・Apps for Officeの開発方法とは
ということで上でいったようなのがApps for Office(私から見たイメージ)となります
これの開発にはすべてのプラットフォームで使えるという点からHTML5、JavaScript、jQueryが使えます(CSS3が使えるって聞いた覚えがあるんですけどMSDNに書いてない…)
これにより使い慣れた開発ツールを用いてOffice向けのアドインを作ることができます。作ったアドインはOffice Storeに公開することができて、それをユーザーはストアからインストールできるようになります。またこれをSharePoint上?(Exchange?)にInternalなストアを作成してそれをインストール などもできるようになります。
このアドインはドキュメントには一切干渉できません(詳細不明)。またWeb appsにもデプロイできます

・実際どこまで使えるのか
MSC2012のKeynoteなんかではApps for OfficeのデモとしてOutlookに搭載されたApps for Officeの拡張を見たことと思います。そこを見たらやべえ時代来る!とか思ったりします
じゃあどんなことができるの? って話ですよね。現状コンテンツとタスクペイン、メールの3つが主となります
ちなみに現状Apps for Office使えるのがWord,Excel,Outlook,Projectの4つです
チャートに応じて地図を出したり~とかはほんと便利かなぁとか思ったりしますけど何ができるのか! を見てみましょう

・JavaScriptがサポートするREST API
http://msdn.microsoft.com/en-us/library/fp142185(v=office.15).aspx
というところにリファレンスがあります。これを見てみるとそこまでできることが多くなさそうに見えてしまいます
実際一応の用意はされているように思うんですけどなんかOutlook重視感がすごい気がします
Projectはこれサポートしてるのかしてないのかわからないんですけど…

・使い道はあるのか
現状だとOutlookカスタマイズには使えそうなんですけど実際本当に使えるかというと微妙な感じです。API増えないことには話にならない感じはありますね
さすがにBetaという状態で判定下すのは早すぎる気もしなくもないところはあります。しかし今まで干渉不能だったWeb AppsやOffice Mobileを拡張できることを考えると非常にメリットは大きそうです

ちなみにApps for Officeはたぶんどの現状の拡張とも相反しないものな気がしますので(そもそもターゲットプラットフォームが違う気がします)今までの技術は引き続き残るのではないかと思います
ただVBAやFluent UI、Open XML、Addin的な面を将来的にすべてカバーできるなら、どんどん置き換えて行ってすべてのプラットフォームで同じ使い勝手を実現 というのはありかもしれません。現在の状況だとWeb Appsなどの拡張に絞ってリッチクライアントはリッチクライアントで拡張したほうがいいかなと

まとまってないけどこんな感じで

Read Full Post »

MVP for VSTOになりたいとか思うこのごろ(ならもっとちゃんとやれ

VSTO(Visual Studio Tools for Office)ではCOMアドインやVSTOアドインを用いた特殊なファイルを作ることができます。ですが実際はVSTOはVBAほど万能ではありません。それをいかに克服するか ということについてちょっと考えてみます

・VSTOとVBAの比較
そもそもVBAの上位互換がVSTOじゃないのとかそう思う方もいるかもしれないですけど(私が思ってただけかもですが)VSTOとVBAは正確にはターゲットが違います
形もリファレンスアセンブリも同じなのに何が違うんだって話ですけどVBAはアドインが作れなくてVSTOはファイルにアクセスがかなり困難です
(推測かなり含んでるのでここ違うとかありましたらぜひ)
VBAはどちらかというとファイルのための拡張という部分があると思います。VBAのコードは基本的に外部から参照ということでは使わず内部でのみ使用されます。簡単に言えば使い捨てという面があるわけです
VSTOはまったく逆でアプリケーションのための拡張という面があります。実際アドインしか作れません(拡張ファイルもファイルロード時にvstoアドインをロードします)
つまりxlsx系のプロパティのGetを行ったりしてファイルを操作するのがVBAでExcelなどのアプリケーション系の拡張を作成してメソッドの実行やプロパティのSetを行えるのがVSTOといえます

・VSTOとVBAの長所短所
もうちょっと深く考えてみます
VSTOがVBAと比較して優れている点としては
・.NETのアセンブリを利用してアプリケーションを作成できる(LINQ,Rx,etc…)
・言語としてVB.NET/C#を利用できる
・Visual Studioの環境を用いて作成することができる
逆に劣ってる点としては
・ファイルからデータを取得しづらい(COMオブジェクトとして扱われます)
・利用する環境に複数のアセンブリを必要とする(最低でも.NET Frameworkが必須)

ではVBAがVSTOより優れている点としては
・現在のExcelファイル内のデータにアクセスできる
・Excelさえ入っていれば実行可能である(セキュリティ面がうんぬんですが)
・Excelのバージョンはほとんど問わない上拡張子、フォーマットもほぼ問わない
逆としては
・言語にVisual Basicしか利用できない
・アドインを作成して全てのファイルに機能を提供するのが難しい?

などなどがあるわけです(主観)
VBAより新しいからなんとかってわけではないということですね

・VSTOからxlsxファイルへのアクセス手段
そろそろ本題
上記の通りVSTOはGetプロパティがほぼ使えない状態です。じゃあどうしたらいいかという話ですがVSTOのメリットに.NETアセンブリの利用可能があるはずです。これを使わない理由がありませんね

ではいくつか手段を考えてみましょう

・OLE DBによる接続
割とオッフィースらしい接続方法かもしれません。OLE DB(Object Linking and Embedding DataBase)によるxlsxファイルへの接続を行いファイルの情報をDataTableとして扱う手段です。OleDbAdapterを用いて接続するのですがこの時Accessのアセンブリが必要になってくるので注意
まともなクエリ構文が書けないとファイルサイズが大きくなったときにまったく使えなくなるので小さいファイルを扱うだけなら有効かもしれません。なんともいえないですけど

・LINQ to XMLを用いて直接読み込む
何かで見た気がする…? Office2007以降のファイル(~~~x,~~~m)はXMLファイルの集合体をZipファイルにして拡張子を変更しているため(xapと同じ)これを一度解凍してXElementなどを使って読み込む手段もあります
ただしこれをやるにはなぜか分かれているファイル構成に対応できなくてはいけません

・OOXMLを用いて読み込む
私的にはこれがよさげ。OOXML(Office Open XML) SDKを用いて読み込む手段です
先ほど書いた通りファイルはxmlで構成されています。このフォーマットはOpenXMLformatsを使用しているためこれにそった形で読み込めるのがこのOOXML SDKです。もともとはOfficeクライアントを作成するためのものですがファイルサイズが大きくてもちゃんと読み込めるためこれでよいんじゃないかと思います

まあそんなこんなでとりあえずOOXMLについて少しずつ調べて行こうかななどなどと

とりあえずこの辺で

Read Full Post »

暑いです

そんなこんなでWP7トライアスロンのほうに少し参加しようと頑張ってます
第1と第2までできたので(遅い)適当に書いときます

PictureResizer
絶対にあると思ってた。後悔はしてない。そもそも使う予定がない(

画像のサイズを1~200%に変更できます。直接入力で1~のpxを指定できます。スライダーで縦横を別々に縮小拡大できます。それだけです

まあ適当です、粗造アプリなんて出すなといわれても困りますけどね…(

WheresHereToTile
今朝審査通ってました。まだ公開されていないらしい…

これはBingマップから画像持ってきてタイルに表示する謎のアプリです。用途不明。そもそも地図が小さい

まあ適当に地図出しておくには使えるかもしれません。ズームレベル指定可能です。なぜかローカライズしてあります
画像取得のロジックがかなり怪しくて失敗してもメッセージ通知も何もしないんですけどなぜか通ってよくわかりません

以上です
第3のほうは何作ればいいのかわからなくて進んでいない現状が

とりあえずこの辺で

Read Full Post »

調べただけ系記事

VSTOでアドインを作ってそのアドインをファイルごとに設定できるようにするにはどうしたらいいかを考えてみます。たとえばExcelアドインで基本自動で背景を表示するけど特定のファイルだけ表示しないようにしたい とかしたいとします。
(企業とかでプレゼンとかほら)

この時設定をAppDataに書き込むのはあまりよくありません。自分で使うだけなら問題はないかと思いきや一つの環境だけなら となります。2つ以上環境がある場合はAppDataに書き込んで共有でもしない限り話になりません。プレゼンしようと開いたらかわいい女の子が表示されるなんてことはあってはならないわけですね
またopenxmlformatを調べて埋め込むっていうのもありっちゃありかもしれませんけどめんどくさすぎる気がします
(propsあるしできなくはないきがしました)

WPFとかのControlだとTagというプロパティがあるしそういうのないかなーと思ったらCustomDocumentPropertiesがほぼすべてで使えるように思われます。Word、Excel、PowerPointでは使えるみたいです。ほかは調べるのがめんどくさかったんです

CustomDocumentPropertiesはその名の通りユーザー定義のドキュメントプロパティを使用するために使われます

そもそもドキュメントプロパティって何かというとコードでいうならAssemblyInfoに書くような内容のあれです
アセンブリにポインタを合わせるとツールチップで作者名とかでるじゃないですか、あれですあれ

で、BuiltinDocumentPropertiesというものもあるのですがそれはさっきの作者名とか入れる方です。基本的な事項はこっちに入れます
ですけど背景画像を自動表示しないなんてプロパティはないのでユーザー定義という形で埋め込んで使用します

とりあえず追加するなら次のような感じ

Dim dp = DirectCast(CacheInfo.GetInstance.cacheApplication.ActiveWorkbook.CustomDocumentProperties, Microsoft.Office.Core.DocumentProperties)
dp.Add("IsNotShowAutoBackground", False, Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeBoolean,True, )

DocumentPropertiesはOffice.Coreにあるので注意が必要です

DocumentProperties.Add(name,linkToConvert,type,value,linkSource)では主にnameが名前、linkToConvertはセルとリンクするかどうか(bool)、typeは値の型(variantですが実際はMicrosoft.Office.Core.MsoDocProperties)、valueはtypeに該当する型の書き込む値、linkSourceはlinkToConvert時にリンクするオブジェクトを指定します

ちなみにDocumentPropertiesのデータはなぜか__comObject地獄がない気がします。たぶんです。たぶん。今度調べます(

この辺で

Read Full Post »

Kinectデータ解析のためなんです(苦しい)

APIなんかを通じてダウンロードできるデータの形式はxmlなんかも多いですがやはりjsonが多いです。jsonのみはあってもxmlのみは割と見ない感じがします?

ところでExcelにはXMLをインポートする機能があります。外部データの取り込みとして使えるあいつです。
これが予想以上に便利でXML内のメンバーを全部拾ってテーブルとしてまとめてくれます。配列をいれると壮観です
これを使えばJsonViewとかそういうの使わなくてもよくなる!?とか思ったりおもわなかったり

XML…? そうだJSON!ってことでこの使いやすいXMLインポート機能をラップしてJSONをインポートさせましょう。もちろんうまくいってない部分が大きいですが気にしない

ExcelのWorkbookにはXmlImportとXmlImportXmlというメソッドがあります。XmlImportXmlとか何かすさまじいものを感じる名前ですが
Workbook.XmlImport(String, XmlMap, Object(Boolean), Object(String|Range))(Object後の括弧内は実際の型を表します)はUrlを使用したインポートを行います。つまりAPIなんかのエンドポイントに接続といったことが可能になったりしますね。このメソッドは主に外部のXMLをインポートするために用いられます

Workbook.XmlImportXml(String, XmlMap, Object(Boolean). Object(String|Range))は引数の型全く同じですが今度はXMLの文字列を渡します。(XmlImportのほうはいまだとUri使うかな) つまるところこっちは内部のXMLをインポートできます

外部と内部の違いは何かというとまあ単純に言えばStringとしてXMLのデータがあるほうが内部です。もってないほうが外部です
今回はJSONをXMLに変換しないといけないので当然XmlImportXmlのほうを使います

・JSON→XMLの変換
さて、使うメソッドは確認できましたので次はJSONのデータの文字列をXMLに変換しなくてはなりません。さすがに内部ではXMLにしてくれません
今回使うのはもちろんJsonReaderWriterFactoryです。いやまあがっつりXmlReaderに変換しますし

JsonReaderWriterFactory.CreateJsonReader[System.Runtime.Serialization.Json namespace]はJSONのByte()からXmlDictionaryReaderを生成します。JSONデータのByte()はSystem.Text.Encoding.Unicode.GetBytesとかでJSONデータのStringを変換すればいいかなと。XmlDictionaryReaderQuotasのほうは今回はそんな怪しいデータは使わないのでMaxにします。必要に応じて変えてください
MemoryStreamにJSONのデータ書き込んだりしてもいいんですけどusingで囲ったりするの面倒なのでStringで扱ったほうがいいかなーという感じです

この時の返り値のXmlDictionaryReaderをXDocumentのコンストラクタの引数にそのまま突っ込みます。どうせXmlReader継承してるしいいよねっていう感じで
XDocumentにする理由はXElementだと配列が配列になってしまうのでXML一個として扱うならXDocumentです
ちなみにXmlDictionaryReaderまともに扱ったら大変な事態になりました

ここまでをソースコードにまとめると次のような感じです。今回はファイルから読み込みます(Webから読み込みたかったんですけどBadRequest5回ほど返されて断念)

If Not String.IsNullOrEmpty(FileSourceTextBox.Text) AndAlso IO.File.Exists(FileSourceTextBox.Text) Then
    Dim content As String = ""
    Using xreader As New StreamReader(FileSourceTextBox.Text)
        content = xreader.ReadToEnd
    End Using
    Dim xdoc = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(System.Text.Encoding.Unicode.GetBytes(content), Xml.XmlDictionaryReaderQuotas.Max))
End If

一行に収まってて力技みたいになってますが普通です。きっと普通です

・XmlImportXmlを使う
準備できたので本題へ

XmlImportXmlに必要なのはWorkbookのインスタンスとDestinationです。なぜかDestinationにNothing渡すと参照がないとか言われます。意味が分かりません

第一引数にはさっき作ったXDocumentをToStringしたものを入れれば十分です。スキーマが足りないとかいわれますがExcelが勝手にやってくれるので問題ありません
第二引数のImportMapはByRefがついてるのでNothingで構いません。XmlMapの変数宣言して入れてもいいと思います。とりあえずNothing安定な感じ
OverwriteはBooleanです。上書きしていいかを指定するものです。たぶんこれはTrueでいいかなと
Destinationはセルの位置を指定します。StringかRangeのインスタンスが必要です。これはOptionalなのにNothing入れたら進めません

WorkbookはMicrosoft.Office.Interop.Excel.Application.ActiveWorkbookを使いましょう。ActiveWorksheetなんかと違ってちゃんと型指定されてます。すばらしい

さてこの辺をまとめたメソッドを作るとこんな感じになります。先のコードとかぶってる部分がありますがそこはうまく分けてください

Private Sub jsonTextImport(ByVal text As String, workbook As Microsoft.Office.Interop.Excel.Workbook, destination As String)
    Dim _map As Microsoft.Office.Interop.Excel.XmlMap = Nothing
    Dim xdoc = XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(System.Text.Encoding.Unicode.GetBytes(text), Xml.XmlDictionaryReaderQuotas.Max))
    workbook.XmlImportXml(xdoc.ToString, _map, True, destination)
End Sub

まあこんな感じでできます。DataContractJsonSerializerで作ったJSONも普通に解析できるのでぜひとも活用していきたいですね

とりあえずここらへんで

Read Full Post »