少しダークなSurface RTの使い方を考える

まともな?業務PCとして使うのであれば、ノートPCにWindows 8 Proを入れたほうが良いと思うのですが、タブレットPC限定かつWindows RTで省電力を効かせてと考えて、内部的には高機能(外部的にWindows RTという自縛をしているものの)なわけで、それを存分に≒効果的に使うにはどうすればよいか?という点で調べています。

■本当にデスクトップアプリは動かないのか?

これは前評判の記事、量販店での説明が悪い≒足りないと思うのですが、Surface RT(Windows RT)でデスクトップアプリは動きます。従来のメモ帳もあるし電卓もあるし、プリインストールのExcel/Word もあるし、そもそもコントロールパネルの類はデスクトップ環境で動いています。この誤解のもとは、Windows RT の CPU が ARM という Intel CPU(AMDも含む)とは異なる CPU を利用しているために Intel CPU 用にコンパイルした実行ファイル≒従来のデスクトップアプリが動かない、という現象になります。なので、これから ARM 用にコンパイルされたデスクトップアプリが出回れば、Surface RT でもデスクトップアプリが動く可能性はあります。

ただし、現時点ではアプリに署名が必要なので、この署名をクリアできるのが Microsoft 社から配布されている実行ファイル(インストーラーを含む)のか、他社の署名も通すのかは不明です。

逆にWindows ストア アプリならば何でも動くのか?というとそうではありません。ストアアプリでは、ターゲットとなる CPU を x86, x64, ARM の 3種類に分けています。x86 は Intel 互換 32ビット版、x64 は Intel 互換 64ビット版の CPU が対象です。最近の CPU であれば x64 で動いているものが多いのですが、ちょっと古めの PC の場合は 32ビット版がまだ動いています。なので、ストアアプリであってもダウンロードするときには注意しないといけない…のですが、大抵は大丈夫です。気を付けるのはゲームアプリや高機能な画像を扱うようなアプリで DirectX を内部的に使ってると、Intel 互換の方しか用意されていないパターンがあります。そういう場合は、配布側で試用版が用意されていることが多いので、それをダウンロードして試します。たいていの場合、CPU の種類よりもグラフィックボードの性能でうまくゲームができない、というパターンになるので、あまり CPU の種類を気にすることはないと思います。

話を元に戻すと、いままでの Windows 7 の場合にはデスクトップアプリを USB でやり取りしたり、Vector からダウンロードしたり、ということができたのですが、Windows RT の場合には、相手の PC が Windows 8 の場合にはそれができません。そういう点では、ちょっと閉鎖的な環境≒残念なタブレット PC という感触はあります。でも、Surface Pro よりも軽いのと、バッテリーの持ちが良いのは ARM の強みです。解像度が若干低い(1366×768)のですが、持ち運びしやすさを考えると重さは重要です。

■むりやりデスクトップアプリを動かしてみる

iPhone でも可能ですが、むりやりアプリを入れるための手段(Jailbreak)があります。Jailbreak とはいえ、Windows RT の脱獄は比較的簡単です。Windows RT、jailbreakされる | スラッシュドット・ジャパン を参考にして、[Release] RT Jailbreak Tool – xda-developers からダウンロードしたバッチを動かします。winsvr.dll の一部を書き換える方式で脱獄が実現されています。これを見ると、署名があるかどうかのチェックしかしていない(将来的にはどうなるかは分からない)ので、署名をしたデスクトップアプリならばいけそうです。ただし、先に書いたように ARM 用に書かれたアプリでしか動かないので、巷にある Windows 8 用のデスクトップアプリとか、Windows 7 以前のアプリとかは動きません。自分でソースからコンパイルするか、誰かがコンパイルしたものを使います。

Desktop apps ported to Windows RT – xda-developers を見ると、vim とか OpenSSL とか C++ のものを ARM 用にビルドしたものがアップされています。スクリプトでは、python があります(残念ながら、perl, ruby はありません)。再コンパイルをしないといけないので、いわゆる UNIX 系のツールが並んでいます。

もうひとつの方法として、x86 CPU をエミュレートする方法があります。いわゆる Virtual Machine 方式です。ARM という非力な CPU に、x86 をエミュレートさせるというのが実用的ではないのですが、実行ファイルしかないけどどうしても動かしたい、ってときに使います…つーか、多分ゲームを動かすのが目的かと。ちょっとリンクを失念してしまたったので後から。

■スクリプトを動かしてみる

バッチ処理や定型処理をするのに、タップでぽちぽち、ソフトウェアキーボードでぽちぽちとやるのは面倒なので、バッチを書くのですが。普通のデスクトップアプリが動くと分かれば、

  • 古式ゆかしき *.bat あるいは *.cmd のバッチファイル
  • CScript ファイル(WScript が動作するかは未検証)
  • Powershell

が動きます。Excel 2013 が入っているので、Excel VBA を期待したのですが、Windows RT 版の Excel は Excel VBA が動きません。残念。

Powershell は、自前のオブジェクトを作成できないので機能が限られてしまうのですが、定型的なスクリプトは動きそうです。私自身 powershell は使いこなしていないので、それ以上はちょっとわかりません。ただ、スクリプト系としては貴重かなと。もちろん、cscript で書くこともできる(javascriptでも書くことができる?)ので、そっちが使えれば十分かなと思ってます。標準で入っている COM は動きそうですよね。Excel の COM が動けば、それをアクセスすることもできるんですが… CreateObject(“Excel.Application”) でエラーになりますね。残念。

■リモートデスクトップを使う

Surface RT に対してリモートデスクトップはできないのですが(リモートアシスタンスはできます)、Surface RT から別の PC にリモートデスクトップができます。ストアで「リモート」で検索をするとストア版の「リモート デスクトップ」が出てきます。いくつか Remote 関係のアプリが出てくるので、Microsoft 社のものを使います。

他PCへのリモートデスクトップは、通常のデスクトップ版のリモートデスクトップと同じように使えます。相手は、Windows 8 に限らず、Windows 7 とか Windows Server とかも使えるのでサーバー系の処理をするときはこれで十分かなと。リモートデスクトップ内でもタッチ操作はマウス同様にできるので画面をタッチしながらでも可能なのですが…Windows 8 以外は、UI 自体がタッチに適していないのでマウスとキーボードは必須でしょう。というか、ソフトウェアキーボードは Windows RT 側のものではなく、リモート先のキーボードを使うことになるので、キーボードは必須ですね。あらかじめ、リモート先の PC にソフトウェアキーボードが出るように仕込んでおけばいいのですが、それでも Windows 7 の場合は面倒です。

回線は、無線LANを使うことになるので、アクション系ゲームの操作は辛いと思います。パズル系のものならばなんとか、という感じです。設定の中に、クリップボードの制御とかデザインの制御があるので、回線が遅い場合も大丈夫そうですね。

■ちょっと高価な動画モニタとして使う

ここ1週間は動画用モニタとして使っています。サブモニタという使い方ですね。自作のストアアプリを作って、タッチがしやすいように画面を作ってしまいます。ツイッターを流すだけとか、Youtube を流すだけとか、普段使いとしてはこれでいいような気がします。動画の配信は、Windows 7/8 でメディアサーバーを立てるか、ホームグループでビデオフォルダを共有します。配信PCの性能やネットワークの状態にもよるのでしょうが、標準のビデオアプリだと mp4 が時々止まるのでなんらかの対策が必要かもしれません(他の再生アプリをつかうとか?)。

■ちょっと高価なタッチパッドとして使う

ストアアプリは自作ということになりますが、別のPCを操作するタブレットとして使えます。ぼちぼちそういうストアアプリが出てくると思います。iPhone でテレビが操作できるとか、家電を操作するとかいうのと同じように、Surface RT で操作します。ええ、Windows Phone 8 でも構いません。

私の場合、仕事用のPCのモニタの横に、Surface RT が据えてあります。以前から使っている Acer w500(Windows 8 Pro に入れ替え)は平置きで画面が見づらかったのですが、Surface の場合は最初から立てかけるようにできているので、そのあたりは便利です。このために使う頻度が全然違います。

なので、用途としては、ビデオ鑑賞用とか環境音楽とかを流すためのアプリと、手元に持ってきて調べ物をするためのブラウジング機能という2種類のアプリに使い方が分かれると思います。人によっては、立てかけたままでほとんど手元で使わない人(もったいない気もするけど)もいれば、常にキーボードと一緒に持ち歩いてノートブックのように使うという人もいるでしょう。アプリを作る側としては、どちらも同時に満足させるよりも、それぞれの使い勝手に特化させるのが良いかと思っています。立て掛けておく場合には、縦置きというパターンはないので、横置きにしてボタンの位置を右側にするとか工夫が必要です。右利きの人の場合は左にボタンがあると、画面が隠れてしまいますからね。マウスの場合は画面と交差してもアイコンなどは隠れませんが、タッチパネルの場合はボタンを右に、情報を左に置くのが常套手段です。あと、据え置いている場合には、画面の上のほうにボタンを置くと、倒れそうになって不安なので、下のほうから三分の一ぐらいの場所によくつかうボタンを置くとよいです。後、下からのスワイプは親指で、上からのスワイプは人差し指でやります。そうなると下からスワイプした時に、親指→人差し指の順で動かすのが意外と面倒ということが分かります。そのあたりのヒューマンインターフェースを考えておくと、より手になじむアプリになるかと。

カテゴリー: WinRT | 少しダークなSurface RTの使い方を考える はコメントを受け付けていません

[WinRT] ビデオ再生時の無線LANネットワーク負荷を考える

子供用の動画再生アプリを作っているのですが、動画が mp4 圧縮されているとビデオアプリ(Windows 8 に付属のビデオ再生の標準アプリです)が途中で止まるという現象が頻発。

■現象

ビデオアプリで、ホームグループ経由で mp4 の動画を表示させているとたまに映像が止まります。映像は止まるけど音声は止まらないので、普通に送られてくるけど描画が更新されていないという感じ。止まったときに、画面をタップして動画のタイムラインを少し動かしてやると再び描画が始まります(動画自体はジャンプした状態で再生される)。

最初は、無線LANのネットワーク負荷を考えたり、Surface RT の WiFi部分が…と思っていたのですが、配信PCのネットワーク負荷をみていくと、Surface RT で止まっている間もちょぼちょぼと配信しているようなのでネットワークが止まっている訳ではないようです。

■配信PCのネットワーク負荷

Surface RT は無線LANで受ける。配信PCはスイッチングハブを通してLANに接続、ってことでネットワーク負荷的には問題ないと思われます。圧縮率が高いためか mp4 のデータを一瞬だけ 10 Mbps 位送って、いったん休憩、再び送って…の繰り返しをしています。

Windows 8 Pro のタブレットPC(Acer w500 にインストール)の時に、フォルダ共有をして動画を流しているとこんな状態でも動画が止まることはなかったので、標準のビデオアプリにちょっと問題があるのかな、と思っています。デスクトップ版の Media Player を使うと大丈夫だった気が。このあたりは未検証。

Surface RT に入っているのは Windows RT なのでファイル共有ができないのと、ストアアプリが主なアプリになります。Windows RT には Media Player が入っていないので、標準のビデオアプリを使うことになります。

■で、いくつかパターンを考える

メディアタグの埋め込みをやって標準ビデオアプリの問題かどうかをチェックすることもできるのですが、それだけでは詰まらないし、回避策も思いつかないので、工作のパターンを考えてみます。

手っ取り早そうなのは、単体で動くパターン。メディアタグを埋め込んで作ってしまいます。ただ、これだと動画表示部分も作りこまないといけないし、なかなか満足できるものを作るのは大変そうです。趣味アプリとしては作業量が多いかなと。


 

それで適当に作ったのが、ひだまりアプリ自体はランチャーの役割しかしてなくて、実際の動画は別のアプリに任せるという方式です。ファイルストレージ(StorageFile)を取得して、Windows.System.Launcher.LaunchFileAsync で起動すればokです。拡張子(*.avi とか *.mp4とか)を判断して、自動的にアプリが起動するのはデスクトップアプリと同じです。起動するアプリはユーザーが決めるので、ランチャーのひだまりアプリは、そのあたりは関知しません。


 

もうひとつの方法は、ランチャーと、再生アプリを別々に作る方法です。標準のビデオアプリの差し替えということになるので、手間といえば手間なんですが。ええと、ビデオアプリ、再生アプリ自体はストアから買ってもいいわけだし、そのあたりは差し替えで。


リモート再生を使ってメディアをデバイスにストリーミングする (JavaScript と HTML を使った Windows ストア アプリ) (Windows) なんかを参考にして、他アプリから呼び出されるようにします。

 

今回ランチャーを作る理由としては、「2歳児にあのファイルピッカーは使えない」というのが主旨で、どうせひだまりしか再生しないのだから専用のボタン付きのランチャーを作れば ok って発想なのです。なので、ビデオアプリで開くファイルピッカーのほうを作るという技もあるかと。


ファイル ピッカー コントラクトとの統合(Windows ストア アプリ) (Windows) ただし、これが目的に沿っているかというと難しいところがあって、ファイルピッカーを起動するボタンは、ビデオアプリのほうにあって、このボタンを押すこと自体が難しい、という問題を抱えてしまいます。でも、まあ、ひとつの手段としてはありかなと。

 

ここまで考えて思いつくのが、それぞれ得意分野のアプリを別々に作っておくことです。


こんな感じで、別々に作っておくと再利用性は高いですよね。ライブラリとして用意してもいいんですが、ファイルピッカーを少し工夫したバージョンとか、年齢によって高機能だったり単機能だったりするバージョンとかが作れます。ちょっと、このあたりの組みあわせ、どんなことができるか実験してみようかなと。多分、コントラクタという仕組みを有効活用するには、これのほうが適していると思うので。

カテゴリー: WinRT | [WinRT] ビデオ再生時の無線LANネットワーク負荷を考える はコメントを受け付けていません

Surface RT を購入しての所感の続き

数日前にSurface RT を購入して初日の所感を 書いた後にいくつかプログラムを作ったのでその話も交えて。

■Surface RT でデスクトップを使う

Surface RT はストアアプリし入れられないことになっていますが、プリインストールされている Office 2013 とか、メモ帳とか、電卓とか、コントロールパネルとか、なんとかかんとかが動きます。ええ、動くのは動くですが、私としては iPad の代わりに使うことを想定しているので、メモ帳ってのは、こんな風に使いたいのです。ストアアプリにもメモ帳らしくものがあるのですが、プログラミングがしたいのではなくてメモを取りたいのですね。OneNote とか Evarnote を試してみたのですが、もっと単機能なものが私にはマッチしています。たぶん、Palm のメモ帳な感じを欲してるかと。

Word を開いてメモを取ると、保存するに「保存ダイアログ」が開かれてしまう。できることならば、マイドキュメントとかに適当な名前で保存してほしい。これが SkyDrive でも同じで、ユーザーとしては「保存したい」のであって「名前を付けて保存したい」のではないのだ。これは、タブレットPCとデスクトップPCで文章を書くときの差(タブレットPCは、手早く手軽に、デスクトップPCは腰を据えてキーボードを書く)というにかかっている。なので、ストアアプリの場合も、デスクトップPCで使うパターンと、タブレットPCで使うパターンとターゲットを分けて考えるとよいかも。特化という意味で。


これは、iPad でも同じなのですが、ソフトウェアキーボードを出すと画面の半分が占有されてしまいます確かに、外部のキーボードを使うのがベストなのですが、手軽さを考えるとキーボードをつけたくない(それがカバー型のキーボードであっても)のと、タブレットPCのタッチ操作を有効利用したい。ソフトウェアキーボードに関しては、状況判別型のキーボードが良かろうと思っていて、入力するものに対してソフトウェアキーボードの大きさが変わるのが良さそう。ただ、iPad も、Windows RT もソフトウェアキーボードの API は公開されていないので、キーボード部分をコンポーネント化して利用するアプリに組み込んでしまうのが手っ取り早いと考えている。


去年の COD 2012 で強調しましたが、先行機種を真似するのもありなんですよ。Microsoft としては以前のメモ帳を踏襲したストアアプリ版を出すか、iPad のメモ帳ライクなものがあれば十分なんですけどね。妙に多機能になってしまって、ユーザーに何かを「強いる」ことになっているのが悪いところかなと。


10年前に使っていた WorkPad ですが(久々に電池を入れてみました)、ネットも使えない、クレードルに接続しないと同期できない(クレードルが RS-232C なのでつなげない…変換ケーブルがあればいいのか?いや、同期用のソフトが動かないはず)ので、単発のメモ帳としてか役に立たないのですが、iPad 購入前までは結構現役で動かしていました。ソフトウェアキーボード(実際はグリフ入力方式)の範囲としてはこれぐらいで収めたいところです。


■Powershell を動かす

普通にデスクトップがあるので、バッチファイルやら、Powershell やらが動きます。ただし、Powershell は自作の.NETコンポーネントは実行できないのでかなり限定的です。

Windows RTでもPowerShellしたい – ういはるかぜの化学 – subtech

WegClient やリモート接続ができるようなので、ひと工夫すればいいのでしょうが、あまりややこしいことをやるぐらいであれば Surface Pro を購入したほうが良いので、ちょっとパス。

■素直に私家版Windows ストア アプリを作る

そんな訳で、Visual Studio 2012 を使って私家版のWindows ストア アプリを作るのが手っ取り早そうです。データなんかは、母艦という形で Windows 8 Pro マシンを使って、ホームグループかメディアサーバー、IIS+ASP.NET、WCF 経由にしておけばよいでしょう。このあたりは、後々の作りで。

なんで「私家版」かというと、

  • Microsoft の審査を通すのが面倒臭い(リジェクト対応とか)
  • 版権とかの問題がある。
  • 自分の環境依存(ホスト名とかパス名とか)はコードで入れ込んでしまう。
  • 他と共有したければ、ソース公開でok

という主旨でやっていきます。Surface RT(Windows RT)でもリモートデバッグができるので、インストールも簡単です。いわゆるドコモ携帯の野良アプリと同じことができます。Android でもいいんですけどね…Android 持ってないし、Java で作るのは面倒だし、ってことでC#で作ります。

Visual Studio 2012が入っていない環境では、パッケージを作ってやって Powershell を動かせば自前でインストールができます。管理モードとか多少ややこしいですが、もうちょっと UI を整備すれば、趣味アプリはこれで十分でしょう。

カテゴリー: WinRT | Surface RT を購入しての所感の続き はコメントを受け付けていません

[WinRT] メディアサーバーを立てて、動画を Surface RT で表示させる

[WinRT] 動画を表示する2GBの自作アプリを作ろう | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/4334

なところで、ひだまりスケッチの動画ファイルをストアアプリにがっつり含ませて動画を表示しよう、ってのを作ったのですが、いやいや、別 PC でメディアサーバーを立てておけばその動画ファイルを Surface RT で表示させることができるのです、っていう話。

メディアサーバー(DLNA)の設定は、以下あたりを参考にしてください。Windows 8 Pro だとエクスプローラーで「共有」するだけで設定は済むはずです。このあたりの詳しい設定は、後で調べておきましょう。

Windows 7実践ナビ – Windows 7をメディアサーバーにする:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20110128/356588/

■マイピクチャのビデオフォルダを共有しておく

エクスプローラーで、この状態で「共有」になっています(他のコンピュータから見える状態)

ビデオのプロパティで、共有したい動画フォルダーを追加しておきます。C ドライブのユーザーフォルダ配下に置くと HDD が破裂しますからね。

■なぜ、ビデオフォルダに動画を置くのか?

ストアアプリでは、一般的な共有フォルダーを直接アクセスできません。Active Directory を使った共有フォルダーであれば参照ができるのですが、Surface RT に乗っている Windows RT や、Windows 8 Home はドメインに参加できないし、そもそも家庭ではドメインサーバーなんて立てないですよね(一部の例外の方を除いて)。
ですが、Windows ストア アプリでは、フォルダを直接参照するのに、ドキュメントフォルダやビデオフォルダを参照するという仕組みが用意されています。更に、今回仕込んだ「メディアサーバー」上の動画や画像ファイルにもアクセスができるのです。KnownFolders.MediaServerDevices ってのを使います。ちなみにホームグループを参照する KnownFolders.HomeGroup ってのもあります。テキストファイルとかはこっちを使うとよいかも。

KnownFolders Class (Windows)
http://msdn.microsoft.com/library/windows/apps/br227151

そんな訳で、メディアサーバーに Windows 8 Pro を準備(Widnows 8 Home ができるかどうかは不明)、クライアントに Surface RT を使ってみます。ストアを見ると、いくつか「media center」がありますが、これを使うと似た感じのアプリが作れます

■子供でも使える UI を作る

わかりやすいように、ボタンを配置しただけの UI を準備します。タップする(ボタンをクリックする)とビデオを開始します。ボタンを押した後、ビデオの開始に若干時間が掛かる(その間にボタンを押される可能性が高い)ので、ここはブロックしないとダメなんですが、ひとまずこのままで。どうせ、私家版なので(ストアにアップする気はないし)ってことで、壁紙も貼ってあります。

■コード

私家版なのでファイル名やホスト名は直書きで。自分で作るときは環境にあわせて調節してください。

/// <summary>
/// ボタンをクリックした時
/// </summary>
/// <param name=&quot;sender&quot;></param>
/// <param name=&quot;e&quot;></param>
private async void WatchClick(object sender, RoutedEventArgs e)
{
    StorageFolder folder = null;
    // メディアサーバーチェック
    try
    {
        // マニフェストの「機能」で「ビデオライブラリ」をチェックしておくfs
        // mars 以外で起動
        folder = await KnownFolders.MediaServerDevices.GetFolderAsync(&quot;masuda (mars)&quot;);
        // 英語版の場合はどうするのか?
        folder = await KnownFolders.MediaServerDevices.GetFolderAsync(&quot;masuda (mars)\\ビデオ\\フォルダー\\ビデオ&quot;);
    }
    catch
    {
        folder = null;
    }
    if ( folder == null )
    {
        // mars 内で起動
        folder = KnownFolders.VideosLibrary;
    }
    folder = await folder.GetFolderAsync(&quot;ひだまりスケッチ 第1期&quot;);
    // ファイル名は固定
    string name = &quot;&quot;;
    switch ((string)((Button)sender).Content)
    {
        case &quot;第1話&quot;: name = &quot;ひだまりスケッチ 第01話.avi&quot;; break;
        case &quot;第2話&quot;: name = &quot;ひだまりスケッチ 第02話.avi&quot;; break;
        case &quot;第3話&quot;: name = &quot;ひだまりスケッチ 第03話.avi&quot;; break;
        case &quot;第4話&quot;: name = &quot;ひだまりスケッチ 第04話.avi&quot;; break;
        case &quot;第5話&quot;: name = &quot;ひだまりスケッチ 第05話.avi&quot;; break;
        case &quot;第6話&quot;: name = &quot;ひだまりスケッチ 第06話.avi&quot;; break;
        case &quot;第7話&quot;: name = &quot;ひだまりスケッチ 第07話.avi&quot;; break;
        case &quot;第8話&quot;: name = &quot;ひだまりスケッチ 第08話.avi&quot;; break;
        case &quot;第9話&quot;: name = &quot;ひだまりスケッチ 第09話.avi&quot;; break;
        case &quot;第10話&quot;: name = &quot;ひだまりスケッチ 第10話.avi&quot;; break;
        case &quot;第11話&quot;: name = &quot;ひだまりスケッチ 第11話.avi&quot;; break;
        case &quot;第12話&quot;: name = &quot;ひだまりスケッチ 第12話.avi&quot;; break;
    }
    var file = await folder.GetFileAsync( name );
    // ストアアプリのビデオを起動
    var ret = await Windows.System.Launcher.LaunchFileAsync(file);
}

マニフェストの「機能」→「ビデオライブラリ」のチェックは忘れずに。

20130318_04

■サンプルコードはここから

動画ファイルがないので動かないですが、参考まで。

カテゴリー: 開発, C#, WinRT | 2件のコメント

[WinRT] VS魂100連発を起動するストアアプリを作り直す

VS魂 100連発! コンテンツ インデックス(3月13日更新) – 日本マイクロソフト株式会社 エバンジェリストチームのブログ – Site Home – MSDN Blogs の私家版が使いづらいので作り直し。

image

これならばずいぶんマシかと。グリッドテンプレートをそのまま活用。

ソースはこちら http://sdrv.ms/15UjCrq

カテゴリー: WinRT | [WinRT] VS魂100連発を起動するストアアプリを作り直す はコメントを受け付けていません

[WinRT] VS魂100連発を起動するストアアプリを作る

VS魂 100連発! コンテンツ インデックス(3月13日更新) – 日本マイクロソフト株式会社 エバンジェリストチームのブログ – Site Home – MSDN Blogs を見て、Surface でぽちぽちとクリックするの面倒なので、私家版のストアアプリを作りました。

image

画面があまりチープなのですが、まあ、私家版としてはこれで十分かと。見た映像は保存できるとか、検索するとか(100個あればそれはそれで資料的な意味がでてくるので)できたほうがいいのですが、ひとまず Surface RTでタッチできるという程度で。

ソースはこちら http://sdrv.ms/ZAxqDG
パッケージはこちら http://sdrv.ms/ZAxt2d


自分でソースをビルドすれば、ストアにアップしなくても使えるし、ない場合でもパッケージがインストールが可能です(パッケージのインストール自体が powershell を使うので敷居が高いというのもあるのですが)。まあ、一例として。

100 個あるので、試しに画面いっぱいに並べてみたのですが、字が見えないですね、やっぱり。GridView を使ったバージョンで時間があれば直しましょう。バインドとか使って。

カテゴリー: WinRT | 1件のコメント

[WinRT] 動画を表示する2GBの自作アプリを作ろう

Community Open Day 2013 用のネタの続き

Acer w500 に Windows 8 を入れて、Vaio のノートを Windows 8 に変えてから常々悩んでいたのが、セカンドモニタ(実際にはセカンドPC)への動画表示です。自宅で作業をしているのもあり、PCファンの音を消すためもあり、動画を流し続けていることが良くあります。本体のPCパワーを喰われたくないので、ノートPCかタブレットPCで動かしていることが多いのですが、ちょっと動画の切り替えが面倒。動画はストア版のVideoで動かします。*.mp4か*.aviであれば、そのまま表示できるのでこれで。*.mkv の場合はちょっとパワーが足りなくて(特に Acer w500 の場合)、ってことで Video で。

さて、ストア版の Video ではいちいちファイルを開くで、*.mp4 を選択しないといけません。


続けて作業をするのに、いちいちピッカーを開くのは面倒です。

なので、もっぱらデスクトップから mp4 を動かすのですが、エクスプローラーのアイコンが小さくて、ちまちま押すが面倒です。大きなアイコンを使えばいいのですが、これもなかなか妙な感じで使いづらい。

そんな訳で、

  • 指定フォルダから、さっくりと mp4 を再生させたい
  • Surface RTで動かすからストアアプリで

ってことを考えていた訳です。子供に映画を見せるのに、エクスプローラーから選ぶってのも大変なので、そのたりも考えて。

■真面目な方法を考える

真面目に考えると、「ストアアプリでは実現できません」という結論になります。ストアアプリのセキュリティ上、ビデオファイルの選択はユーザーの手に委ねられるので、これの抜け道はありません。かつ、マイドキュメントやマイピクチャじゃなくて、ネットワークドライブ上(ほかのPCなど)に置かれているファイルはアクセスできません。おしまい、ってな感じですね。

ストアに出したい場合はそこでおしまいなのですが、ストアに出さないのであれば、いろいろ考えられます。

■私的に利用するだけを考える

いくつかアイデアを並べてみると、

  • 動画を流すためのストリームサーバーを用意して、ストリームを受けるストアアプリを作る。
  • 初回だけ、アプリローカルに保存する動作をさせて、ローカルフォルダから起動する。
  • アプリに動画を含めてしまう。

正式にはストリームサーバーを用意するのが良いのですが、うーん、なんか面倒そうだし良くわかりません(これは、後で調べて実現したいかと)。初回だけコピーってのもいいけど、作りが面倒。なわけで、アプリに動画を含めてしまう方式をとってみました。

ワイドロゴも用意してみました。


プロジェクトに avi ファイルを追加していきました。


画面はこんな感じで。


コードはこんな感じで。

/// <summary>
/// ビデオを再生する
/// </summary>
/// <param name=&quot;sender&quot;></param>
/// <param name=&quot;e&quot;></param>
private async void VideoClick(object sender, RoutedEventArgs e)
{
    string path = &quot;&quot;;
    switch ( (string)((Button)sender).Content)
    {
        case &quot;第1話&quot;: path = &quot;hidamari-01.avi&quot;; break;
        case &quot;第2話&quot;: path = &quot;hidamari-02.avi&quot;; break;
        case &quot;第3話&quot;: path = &quot;hidamari-03.avi&quot;; break;
        case &quot;第4話&quot;: path = &quot;hidamari-04.avi&quot;; break;
        case &quot;第5話&quot;: path = &quot;hidamari-05.avi&quot;; break;
        case &quot;第6話&quot;: path = &quot;hidamari-06.avi&quot;; break;
        case &quot;第7話&quot;: path = &quot;hidamari-07.avi&quot;; break;
        case &quot;第8話&quot;: path = &quot;hidamari-08.avi&quot;; break;
        case &quot;第9話&quot;: path = &quot;hidamari-09.avi&quot;; break;
        case &quot;第10話&quot;: path = &quot;hidamari-10.avi&quot;; break;
        case &quot;第11話&quot;: path = &quot;hidamari-11.avi&quot;; break;
        case &quot;第12話&quot;: path = &quot;hidamari-12.avi&quot;; break;
    }
    if (path == &quot;&quot;) return;
    path = @&quot;video\&quot; + path;
    var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(path);
    var ret = await Windows.System.Launcher.LaunchFileAsync(file);
}

■出来上がったファイルを Surface RT に転送する

お手軽私的利用のアプリを早速Surface RTに転送する訳ですが、リモート接続で転送しようとすると video フォルダ内が 2GB ぐらいあって、ちょっとやそっとじゃ終わらない。なので、パッケージを作って転送しています。アプリケーション パッケージのローカルな共有 (Windows ストア アプリ) パッケージを作って、かつインストールします。

で、なんやかやでインストールができると、無事自作アプリからビデオで動画が表示できます。画像がついていないボタンなので内容がわかりづらいですが、子供用に画像をつけてやれば、それっぽいアプリになるかと。

日曜大工気分でプログラムは30分、転送などが1時間(苦笑)というパターンで出来上がるって訳です。

カテゴリー: C#, WinRT | [WinRT] 動画を表示する2GBの自作アプリを作ろう はコメントを受け付けていません

Community Open Day 2013 に参加します

来る 5月11日(土曜日)に 東京会場 で登壇します。13:00からなので、お昼を食べた後ですね。今年は午前中からセッションをやっているので、結構長丁場な気が。去年は MS さんのセッションが午前中にあっただけのような気が。

去年は、Acer w500 を持っていってデバッグ講座っぽいものをやったのですが(準備がまずくて、ちょっとアレでしたが)、今年は Surface RT を持っていってアレします。

タイトルは「サンデープログラミングから始めるWindows ストア アプリ入門」ってことになっていますが、テーマは「守破離の”破”」をお話しします」ってことになっています。更に言えば、ターゲットは「初心者」ってことになっていますが、Windows ストア アプリの「初心者」だけど、パソコンを弄ることに関しては「上級者」ってことで準備をします。ええ、毎度のことながら、タイトルとテーマから決めた後付なんですけどね。

例えば、Windows ストア アプリの実行ファイルって、何処に置いてあるの?って解説とか。以前、ML に流れていたのですが、C:\Program Files\WindowsApps\ の中にあります。実は、この中には UI の XAML がそのまま入っていて改変が可能です、って話とかします。DDLとか画像ファイルとかも入っているので「抜く」こともできます、ってことで画像を抜かれたくない場合は、Webから随時取ってくるようにしてね、ってのが MS の見解だそうです。XAML の改変については、対処されたかどうかはちょっと不明ですね。

※Word 2013 で投稿のテスト。新しい図形キャンバスの中に図形を入れれば一括で画像にしてくれる模様。

あと、開発者ライセンスとか身内だけに配布する方法とか。MS や Apple の審査を通さなくても(個人で使う分には審査を通す必要がないので)良いですとか。

そんな訳で、「サンデープログラム」≒「趣味プログラミング」的なネタを用意していきます。業務的には役に立たないけど(業務に使うと危ないけどという意味で)、個人的に作っていくとWindows ストア アプリってのは結構便利な存在なんですよ、という話を。

カテゴリー: 勉強会 | Community Open Day 2013 に参加します はコメントを受け付けていません

Surface RT を購入して初日の所感を

ヨドバシで郵送というスタイルで購入したので、午前中から触ってみた感想を少し。

image

箱の中は本体と電源コネクタだけです。キーボード等は別売りなので、今回はパス。iPad で使っていた Bluetooth キーボードが息子(2歳)に投げられて壊れてしまっていたので、これを機に再購入しました。Bluetooth 自体はさっくりとつながります。ただし、iBuffelo の BSKBB06 キーボードは何故か英語配列で認識さえれてしまうので、Windows 8 でキーボードが英語配列キーボードとして認識される あたりを参考にしてキーボードのドライバーを更新しています。Surface RT の場合は、「HID キーボードデバイス」になっているので適当に「Microsoft Basic Keyboard(106/109)」を選びます。ひとまず、106 キーボードで「半角/全角」で IME の切り替えができるようになります。

インストール自体は、iPad よりは手間です。初回はアプリを動かすたびに Microsoft アカウントを入力していかないといけないのが…、いずれ、Surface タイプのタブレット PC が量販店に出るようになれば、iPad と同じように「セッティングして売ってくれる」パターンになるのでは?ってところですね。よくわからない場合には、適当な Microsoft アカウントを取っておかないと、Windows ストア アプリがダウンロードできないし、Office も動かせないので家に帰ったときい困ることになりそうです。

■Visual Studio 2012 のデバッグモードで動かす

Visual Studio 2012 から Surface RT へのリモートデバッグが可能です。Windows 8 Pro などと同じように、リモートデバッグの ARM 版をインストールします。ダウンロード | Microsoft Visual Studio 2012 から「Remote Tools for Visual Studio 2012」を開いて、「Remote Tools for Visual Studio 2012(ARM)」をダウンロードして、インストールすれば ok です。

image

初回だけは開発者ライセンスを要求されれるので、Microsoft アカウントを入力して更新します。開発者ライセンスは3か月ごとに更新を諭されるのですが、それさえやれば(多分)半永久的に自作のWindows ストア アプリを入れることができます。

■リモート アシスタンスで接続する

タブレット PC の場合は、何が面倒かというと初期設定が面倒なのです。小さ目の画面でキーボードとマウスを駆使してぽちぽちと設定するのは大変です。タブレットなのだから指の操作でできるような画面にすればいいのですが、コントロールパネルなどは、いままでのデスクトップ アプリのままなので指で打つのは大変。ソフトウェアキーボードも大変です。

なので、いつもはリモート デスクトップで接続して設定をするのですが、Windows RT の場合はこれができません。「リモート アシスタンス」しかないのです。Windows リモート アシスタンス: よく寄せられる質問 で Windows RT でも使えると書いてあるのですが、アプリケーションの「検索」で「Windows リモート アシスタンス」と打ってもでてきません。実は「msra」というコマンドとして隠れています…つーか、忘れてると思う。那覇レポート: windows8でリモートアシスタンスを使う方法 にあります。使い方は、招待キーを送って諸々面倒ではあるのですが、こんな風に自分で自分を招待することができます。

image

何故か、この PC からだと「簡易接続」ができないので、新しく接続するたびに招待キーを打たないといけないのが面倒なのですが、まあ、いくつかの設定はこれで ok かと。なぜか、Win キーは送れないので、本体のホームボタンを押します。そうそう、Surface のホームボタンは iPad のように押し込むタイプではなく、触って反応する(静電式?)タイプです。Acer w500 の場合はボタン式なので、これは Windows RT の機種によるでしょう。ただ、Surface の場合はスタンドで立てておくことが多いので、このホームボタンを「押し込む」という力を掛けることなく反応するのはかなり良いです。あまり強く推すと倒れてしまいますからね。iPad をスタンドに立てても、ホームボタンをぐっと押すときに倒れそうになるのが問題で、これは後発の Surface にワンポイントかと。

■Excel VBA は動かない

Surface RT には、Office 2013 の home and bussiness というバージョン(Word, Excel, PowerPoint, OneNote)が入っています。が、Outlook は入っていません…まあ、それはいいんですが、Windows ストア アプリの Mail は POP3 が使えないんですよね。うーん、どうしたものか。

さて、Excel で作業できるのはいいんですが、業務 Excel アプリとして必須?な Excel VBA は入っていません。

image

マクロ付きの *.xlsm を読み込ませると、こんな風にエラーが出ます。

image

Word VBA もつかないですね。

ひとまず、ここで区切って。後はプリンターとかスクリプトの動作とかの話を。

カテゴリー: windows 8 | 5件のコメント

[WinRT] XAML アニメーションは GPU のパワーを使い切れるか?

Windows ストア アプリで C++/CX を使ってゲームを使えば、グラフィックボードの性能を最大限に引き出せることが分かっているのですが、では、XAML でのアニメーション(主に storyboard)の場合は、どのくらいグラフィックボードの GPU を使っているか?ってのを調べてみます。
目的としては「小難しい C++/CX とか DirectX を使わなくても、XAML のアニメーション効果を使えばそこそこゲームが作れるのでは?」ってところです。実際、C++/CX は高度な3D効果の使い、単純なテキスト表示などは XAML で表示させる、という手法が Microsoft より紹介されているわけで、そのあたりは、そのあたりで。

■ベンチマークアプリを作る

単純に5000個の円(Ellipse)を表示させて、storyboard で動かしています。storybaord クラスのコピーには、以前作った Storyboard.Clone を少し修正して使っています。

List<Storyboard> sbs;
/// <summary>
/// 円を作成
/// </summary>
/// <param name=&quot;sender&quot;></param>
/// <param name=&quot;e&quot;></param>
private void CreateClick(object sender, RoutedEventArgs e)
{
    var rnd = new Random();

    // 100個のEllipseを適当に並べる
    var xml = @&quot;
<Ellipse
xmlns=&quot;&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;&quot;
Fill=&quot;&quot;#FFF4F4F5&quot;&quot; HorizontalAlignment=&quot;&quot;Left&quot;&quot;
Height=&quot;&quot;50&quot;&quot; Margin=&quot;&quot;94,137,0,0&quot;&quot; Grid.Row=&quot;&quot;1&quot;&quot; Stroke=&quot;&quot;Black&quot;&quot; VerticalAlignment=&quot;&quot;Top&quot;&quot;
Width=&quot;&quot;50&quot;&quot; RenderTransformOrigin=&quot;&quot;0.5,0.5&quot;&quot;>
<Ellipse.RenderTransform>
<CompositeTransform/>
</Ellipse.RenderTransform>
</Ellipse>
&quot;;
    sbs = new List<Storyboard>();
    for (int i = 0; i < 5000; i++)
    {
        object obj = XamlReader.Load(xml);
        Ellipse el = obj as Ellipse;

        Canvas.SetLeft(el, 0);
        Canvas.SetTop(el, 0);
        canvas.Children.Add(el);

        var sb = sbMove.Clone();
        sb.SetTarget(el);
        sb.AutoReverse = true;
        sb.RepeatBehavior = RepeatBehavior.Forever;
        int x1 = rnd.Next(800);
        int y1 = rnd.Next(800);
        int x2 = rnd.Next(800);
        int y2 = rnd.Next(800);
        ((DoubleAnimation)sb.Children[0]).From = x1;
        ((DoubleAnimation)sb.Children[1]).From = y1;
        ((DoubleAnimation)sb.Children[0]).To = x2;
        ((DoubleAnimation)sb.Children[1]).To = y2;
        TimeSpan ts = new TimeSpan(0, 0, rnd.Next(5) + 1);
        ((DoubleAnimation)sb.Children[0]).Duration = ts;
        ((DoubleAnimation)sb.Children[1]).Duration = ts;

        ((ColorAnimation)sb.Children[2]).Duration = ts;
        switch (rnd.Next(3))
        {
            case 0: ((ColorAnimation)sb.Children[2]).To = Windows.UI.Colors.Red; break;
            case 1: ((ColorAnimation)sb.Children[2]).To = Windows.UI.Colors.Yellow; break;
            case 2: ((ColorAnimation)sb.Children[2]).To = Windows.UI.Colors.Blue; break;
        }
        sbs.Add(sb);
    }
}

private void StartClick(object sender, RoutedEventArgs e)
{
    // アニメーション開始
    foreach (var sb in sbs)
    {
        sb.Begin();
    }
}

private void StopClick(object sender, RoutedEventArgs e)
{
    // アニメーション停止
    foreach (var sb in sbs)
    {
        sb.Stop();
    }
    this.sbMove.Stop();
}

動かすとこんな感じになります。円が5000個(半分ほど見えていませんが)うにょうにょと動きます。

■CPU と GPU の負荷を見てみる。

Process Explorer で XamlBenchMark の負荷をみていくと、GPU を 25% ほど使った状態になります。この PC だとそれほど重くないのですが、うまく動かない場合は、1000 個位に減らして動かしてみてください。

この時の CPU 負荷は、26% 程度です。GPU を使わない場合(グラフィックボードを積まない場合)がどうなるのかは、別の PC で検証したいと思います。

プログラムを修正して、ぱらぱらアニメを1000個位動かしてみたいですね。体感速度がそれほど落ちるものでなければ、それなりのアクションパズルゲームとかが C#+XAML+storyboard の組み合わせでできるのではないか、と考えています。

■サンプルのダウンロード

ベンチマークのダウンロードは以下からできます XamlBenchMark.zip

カテゴリー: C#, WinRT, XAML | 1件のコメント