Feeds:
投稿
コメント

Posts Tagged ‘Windows 8’

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

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 »

久々のMetro Style Apps記事

Metro Style AppsにはIsolatedStorageSettingsなクラスが存在しません。ですがWP7から移行する場合はこの辺使えると便利かなーと思うところがあると思います

そこでちょっと調べるとApplicationDataContainerSettings(Windows.Storage Namespace)があることが分かります

で、これにアクセスする方法なんですけどシンボルの検索しても使ってるよぅなプロパティは見当たりません
これはApplicationDataContainerSettingsにIPropertySetが実装されてるところがポイントです

つまりApplicationDataContainerSettingsはIPropertySetを通じて提供されます

このIPropertySetはApplicationDataContainer.Values Property[Windows.Storage namespace]で取得できます

で、このApplicationDataContainerってどうやってとるんですって話ですがApplicationDataにShared(static)なプロパティのCurrentがあるのでこれを利用してコンストラクタ代わりにインスタンス取得します。次にその中のLocalSettingsかRoamingSettingsがApplicationDataContainerを返すのでこの辺使います

Settings取れたらあとは普通に扱うだけですたぶん
Saveがないのですけど自動で保存されるのかな?
試してないのでわかりません

適当なサンプルは次の通り

Public Sub SaveObjAdd(key As String,instance As Object)
    Dim settings = ApplicationData.Current.LocalSettings.Values
    settings.Insert(key,instance)
End Sub

とりあえずこんくらいで

Read Full Post »

なんだただの連投か

というわけで早いですがその2となります。

今回はoauth_sigunatureの生成です。
TwitterがさっさとOAuth2.0になってくれればこんなめんどくさいものはいらないのに…
(@anywhereでは使われてるのを全部に拡大してほしい)

さてさて、Win8DPの時からすでにSystem.Security名前空間内のクラスがほぼ消えてます。
HMACSHA1はもちろんですがRSAやらDESやらMD5もないような(あまり暗号化アルゴリズム知りません)

ちなみにオブジェクトブラウザでSHA1を検索するとなんか出てきますが証明書に必要なものらしく今回は関係ないです

ということでおそらくTwitterクライアントの大半が使ってるであろうHMACSHA1クラスがないのでここが一番めんどくさそうなところです
(事実ここで投げ捨てたくなりました)
(まだBeta段階なので変わる可能性はあります(今作ったMetroアプリ動かなくなる可能性出てくるからなんとも言えない))

というわけでHMAC-SHA1にするって作業を調べてみましょう。
oauth_sigunatureについてはもういろいろドキュメントあるし大丈夫でしょう

http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/b541a08a-d3cd-4e21-8d21-7ed80749cb23
の中で HashWithというメソッドで例がかかれています。
これを参考にしましょう。

まずMacAlgorithmProvider.OpenAlgorithm(string) (Windows.Security.Cryptography.Core Namespace)のコメントを見ると

The following algorithm names are supported for use in the MacAlgorithmProvider class:
* HMAC_MD5
* HMAC_SHA1
* HMAC_SHA256
* HMAC_SHA384
* HMAC_SHA512
* AES_CMAC

とあります。
つまりOpenAlgorithmの引数に上記の暗号化アルゴリズム名を入れると目的のアルゴリズムが使用できるというわけです。

 Import Windows.Security.Cryptography.Core
 ...
 Dim hmac As MacAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1")
Using Windows.Security.Cryptography.Core;
...
MacAlgorithmProvider hmac = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1");

続いてCryptographicBuffer.ConvertStringToBinary (Windows.Security.Cryptography Namespace)でstringをIBufferに変換します。
この時encodingはASCIIなんざないのでutf8を指定します。
これを利用してkeyと内容をiBufferにします

続いて(接続語が足りてません)keyを作成します。
SHA1に使うKey自体は引数で渡しましょう。
この時は先ほど作ったMacAlgorithmProviderを使います。
MacAlgorithmProvider.CreateKey(IBuffer)を使ってCryptographicKeyを生成します。

さてこれでKeyとIBufferがそろいますのでCryptographicEngine.Sign(CryptographicKey,IBuffer)を使ってハッシュ値を計算します(なんていうべきなのかわからないです)

最後にCryptographicEngine.Signで取得したIBufferをCryptographicBufferにあるEncodeToBase64Stringを使ってstringにして戻します。

というわけでstring戻してoauth_sigunatureの生成は完了です。Headerに渡してやりましょう

というわけでここまでのコード(ちょっと書いたけど)(そもそもリンク先に書いてあるけど)

 Import Windows.Security.Cryptography.Core
 Import Windows.Security.Cryptography
 ...
 Public Function EncryptToSHA1(key As String,data As String)
     Dim hmac As MacAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm("HMAC_SHA1")
     Dim keyBuffer As IBuffer = CryptographicBuffer.ConvertStringToBinary(key)
     Dim xkey As CryptographicKey = hmac.CreateKey(keyBuffer)
     Dim hashData As IBuffer = CryptographicEngine.Sign(xkey,CryptographicBuffer.ConvertStringToBinary(data))
     Return CryptographicBuffer.EncodeToBase64String(hashData)
 End Function

C#のほうはリンク先にあるしいいですか…?(あってるか微妙になったので

というわけで今回はここまでとします
次回は認証…? するのかな…?

Read Full Post »

始めまして… って言いましてもこの記事自体はコピーですね…w

というわけでこんな記事を書き連ねようかなと
こうでもしないと滅べ滅べ言い続けて進まない…w

というわけで昨日Windows 8 Consumer Preview(以後Win8CP)が公開されました。同時?なのかは知りませんがVS11+Blend5のベータ版も公開されました。
VS11とかの期限は320日程度みたいですね(~日までなのか使い始めてから320日なのかはわかりません)

まあWin8で標準となるであろうMetro style apps(以後Metroアプリ)と呼ばれる新しいアプリケーション? テクノロジー? ちょっと私にはわからないですね…
とりあえずMetroアプリという形式のアプリがVS11で開発可能です。

それとWin8CPからMicrosoft Storeが使えるようになりました。
Win8DPではなかったんですけどまあ増えればいいなーとは
3/1の書いてる現在では無料アプリのみ提供でそこまで多いとは感じないです
WP7よりはるかに少ないですね

で、よく見るとTwitterクライアントがないじゃないですか!
これはスタンダードになれるチャンスではないかなと

まあたぶんやる気足りなくてさきこされること間違いなしですね

ということでMetroアプリどうせだし一個くらい作っておくかーてきな感じで始めてみようかなーと思いました
もちろんTwitterクライアントアプリです。

とりあえず書き始めますがコンシューマーキーだのは詳しい解説いっぱいあるし書かなくても問題ないかなと思います
まあめんどくさいのでトークンまで取得しときましょう。

さてまずMetroアプリさんのプロジェクト作ります。
これはVS11で普通にプロジェクトの種類選択して作るだけです
適当にアプリ名つけるなりこった名前をつけるなりご自由にどうぞ

するとおそらくBlankPageとかいうものが含まれたプロジェクトができます。
このBlankPage.xamlが初期状態でのメインエントリとなるページオブジェクトです。
OnNavigatedToというのがありますが別にLoadedイベントに記述してもいいのかな…?
一応動くには動きました

まあとりあえずWP7向けに作ったクライアントアプリのソースコードぶち込むなり.NET 4で作ったソースコードをぶち込むなりしてみるとかなりめんどくさいことが分かります。

まず大半のアプリが使っているであろうMessageBoxがありません。
代わりになりそうなものにMessageDialog(Windows.UI.Popups)はありますがこれでできるのはあくまで通知発行くらいでDialogResultとかはとれそうにないです。
自分で実装するのが一番早いのかなぁ…

続いて.NET2.0からあったBackgroundWorkerは引退しました。
これはTask使えば問題なさげです

次にHttpWebRequestなどはBeginGetResponse,EndGetResponseのみをもちます(非同期)
これはまあWP7と同じなのでWP7での開発経験があればそこまで問題ないかなと
If BeginGetResponse(Action(Of IAsyncReslut),Object).AsyncWaitHandle.WaitOne Thenとかして無理やり同期的にすることもできるかなとは

またSystem.Threading.Thread.SleepはWin8CPになったらいなくなってました。
これは代用どうするんだろ…w
SpinWaitはちょっと

そしてoauth_sigunatureを生成するためのHMAC-SHA1がクラスとして存在してません。
これが一番めんどくさいところになります。

あとBlend SDKが見当たらなくてMVVMがやっとちょっとビヘイビア登録できるようになったくらいの人間である私には難易度が高いですはい…

ということで一応気づいた点を少し
oauth_sigunature周りは次回ちょっと書きます

Read Full Post »