[C#] Storyboard を使ってばねのような動きをつける

CSS3アニメーションで心地良いモーションを作る|1 pixel|サイバーエージェント公式クリエイターズブログ
http://ameblo.jp/ca-1pixel/entry-11497184837.html
[Windows8]XAMLアニメーションで心地よいモーションを作る
http://blogs.wankuma.com/hatsune/archive/2013/03/29/323879.aspx

つながりで、タップしたときにモーションを付ける方法を紹介しておきます。
HTML+CSS のパターンはモーションを付けるのに、@keyframes を付けるので、そのまま XAML の Storyboard を使ったときも同じノウハウが使えます…が、XAML の場合には、もうひとつ仕掛けがあって、ばねのような動きがあらかじめ EasingFunction という形で用意されています。

これを使うと「物理的な動きを内部で高速化されたルーチンをつかって手軽に」…という謳い文句を昔聞いたことがあるのですが、高速化されるかどうかはさておき(調べてないので)、ばねとか重力とかそういうのを意識した作りができます。
Easing Function 早見表 にあるのは、Javascript の Easing 処理ですが XAML でも同じことができます。

動きとしては http://youtu.be/Lqhn8DbERlg な感じに作れます。

<Storyboard x:Name="sbBound">
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="ellipse">
		<EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="1.2"/>
		<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1">
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="ellipse">
		<EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="1.2"/>
		<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1">
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="sbRotate">
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="ellipse2">
		<EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="23.95"/>
		<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
</Storyboard>

吹き出しの回転は、元ネタのように吹き出しの突起のところに中心を置きたいのですが…ちょっと実力不足で単なる回転で実装しています。参照点を変えられるので、あとからわかったら変更します。

追記、回転の中心点 RenderTransformOrigin を左下のポイントに移動させれば、吹き出しの角で回転できますね。

<Storyboard x:Name="sbRotate">
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.Rotation)" Storyboard.TargetName="ellipse2">
		<EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="-16.163"/>
		<EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0">
			<EasingDoubleKeyFrame.EasingFunction>
				<ElasticEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
	<PointAnimationUsingKeyFrames EnableDependentAnimation="True" Storyboard.TargetProperty="(UIElement.RenderTransformOrigin)" Storyboard.TargetName="ellipse2">
		<EasingPointKeyFrame KeyTime="0" Value="0,1"/>
	</PointAnimationUsingKeyFrames>
</Storyboard>

■これをボタンに適用するのはどうやるのか?

円とか吹き出しは普通に Tapped イベントで拾ってきます。Mouse イベントで拾うとタブレットPCでタップをしたときにイベントが拾えなくなるので、Tapped イベントを使いましょう。

        <Ellipse x:Name="ellipse"
            Tapped="Ellipse_Tapped_1"
            Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="166" Margin="221,210,0,0" Stroke="Black" VerticalAlignment="Top" Width="166" RenderTransformOrigin="0.5,0.5">
        	<Ellipse.RenderTransform>
        		<CompositeTransform/>
        	</Ellipse.RenderTransform>
        </Ellipse>

デスクトップPCの場合は、これにマウスの hover を付けないといけないのですが、タブレットPCの場合はこのままで十分です。が、動かしてみると問題があって、Tapped イベントだと、タップして指を離したときに(マウスを離したときに)イベントが発生するので、押した瞬間にアニメーションしたい場合は、PointerPressed イベントのほうを使います。このあたり、深みにはまると本格的なボタン作りになってしまうので、アプリごとに使い分けるのがよいかと。

■複数のボタンに割り当てる場合にはどうするのか?

これ、XAML の Storyboard の問題で、アニメーションのターゲットがひとつしか選択できません。なので、複数のボタンを画面に並べる場合は、Storyboard 部分を手作業でコピーして Storyboard.TargetName を書き換えるか、<a href=”http://www.moonmile.net/blog/archives/4087″>[WinRT] Storyboard.Clone を作る </a> のようにクローンを作ります。Silverlight や WPF の場合には Clone メソッドが用意されているですが、何故か WinRT には Clone メソッドがないので拡張メソッドとして自作します。これはいずれ、きれいに直して nuget あたりにアップします。
先の記事にある開始点、終了点を指定するとか、アニメーションの長さを指定するとかあるので、バリエーションが多く出てくると思いますが、そのあたりはアプリごとに作ったいったほうが手間は少ないかと。KeyFrames の位置が固定ってのが難点ですが。

カテゴリー: C#, WinRT | [C#] Storyboard を使ってばねのような動きをつける はコメントを受け付けていません

Surface RTから印刷するにはホームグループを使う

Surface RTには、Office 2013 が入っているのですが、じゃあ印刷はどうするのか?ってことで。悩みます。Windows 8 からプリンターへのインターフェースが GDI 経由ではなくて、XML 経由(XPS Document Writer)になったことで、プリンタを出している各社は XML 経由のドライバーを出さないといけなくなった訳ですが…、まあ、古めのプリンタの場合には、ドライバーが出るなんてのは絶望的で、さらにいうと、Windows RT の場合には、CPU が ARM なために、ARM でコンパイルをしたドライバーを出してくれるなんとは皆無な訳です。

プリンタ自体が認識してくれる場合は、Surface Windows RT でプリンタを使いたい: 世の中は不思議なことだらけ な方法で ok です。ストアアプリを入れないとダメなのかな?ってところですが、印刷ができます。

じゃあ、Surface RT から Word/Excel で印刷する場合にはどうするのか?というとホームグループによるプリンタ共有を使います。

1.あらかじめ印刷可能な PC(Windows 7か8)を用意しておいて、プリンタの設定をしておきます。

2.ホームグループを右クリックして「ホームグループの設定の変更」をクリック。

image

3.共有しているライブラリとデバイス(プリンタとか)を設定

image

「ホームグループとの共有内容の変更」をクリックすると、個別に変更できます。

image

これで、共有される方の設定は終わり。

今度は Surface RT のほうで、ホームグループをクリックして「今すぐ参加」させます。

image

ホームグループのパスワードを入力します。これは、先に設定した PC で「ホームグループ パスワードの表示」で見れます。

image

こんな風なややこしい文字列になっています。このややこしい文字列は、「ホームグループの設定の変更」→「パスワードの変更」で変更が可能です。家庭内のローカルLANならば、わかりやすい文字列に変えておくとトラブルが少ないと思います。特に、Surface RT で打つ場合は、ソフトウェアキーボードを使うことになるので、簡単なアルファベットにして良いでしょう。

image

無事にホームグループに参加できると、以下のようにずらずらとコンピュータ名がでてきます。

image

ここのビデオとかミュージックとかに入れておくと、他のPCの音楽やビデオファイルを簡単に再生できます。タブレットPCの場合、内部ストレージ(SSDの容量)が少ないので、こうやって外部PCに置いておくと便利です。ただし、動画の場合はぽちぽちと切れますが。

この状態でプリンタの共有もできているので、チャームで「設定」→「PC設定の管理」(チャームの一番下に出てきます)を選択して、「デバイス」をクリック。すると、共有されているデバイスがずらずらと並びます。この中に、すでにプリンタが出ています。FinePrint は印刷を節約するツールです。

  • Brother DCP-750CN
  • FinePrint

image

これで Surface RT から印刷する準備はできました。Excel から印刷しようとすると、きちんとプリンタが選べます。

image

この方法の欠点は、「プリンターへ送る PC の電源が入ってないと動かない」ことなのですが、今のタブレットPCの使い方だと、動画や音楽はホームサーバー(サーバーとはいえ、普通のWindows 8 マシン)に置いて、適宜 Surface RT で流すというパターンになるので、これで十分かなと思っています。なんにせよ、あれこれとプリンタドライバーを探さなくて済む(プリンターに接続している PC の更新だけで済む)ので、一度ホームグループを設定しまえば、タブレットPCのほうはややこしいことをしなくて済む、ってのが良いですね。

実は、ホームグループ自体は Windows 7 の頃からあるので、ASCII.jp:Windows 7の新機能「ホームグループ」とは何か? (1/2)|あなたの知らないWindows 、今の手元にある Windows 7 で設定しておいて、Surace RT のような新しく買った Windows 8/RT と繋げるというのが簡単にできます。会社の場合は Active Directory とかを使うのでしょうが、家庭内の LAN や小規模の会社ならばこれで十分かも。ちょっと工夫すると、Windows 7/8 Pro でしかできないファイル共有などもできるので(これも標準である機能)、プリンタ共有/ファイル共有だけしたい場合にはホームグループが手軽で便利です。

カテゴリー: WinRT, windows 8 | 2件のコメント

最強.NET開発PC マザーボードの選定ポイント

目次はこちら

最強.NET開発PCを作るよ(その5) マザーボード編 の補記として。
マザーボードってのは、まさしくマザーってことなので PC の基盤となるところです。なので、この部分が非力だったりすると、外部装置が強力でも残念なPCができあがってしまうし、逆にマザーボードが強力であってもそれに見合う外部装置がないと実力を発揮できません。今回、リンクスの阪口氏から提案されたマザーボード ASRock X79 Extreme9 は2つの選定基準があります。

  • 大容量メモリの搭載が出来る事
  • ストレージの帯域を余すことなく発揮できる事

大容量メモリってのは、64 GB のメモリってことです。実は 32 GB メモリでも十分かなと思ったのですが無理を承知でお願い。これクリアできるマザーボードが意外と少ないことが判明、ってな現状です。ストレージの帯域というのは、SSD, HDD につなぐインターフェースです。最近の SSD は SATA3 に対応した高速なものが普通なので SSD の能力を存分に発揮する(OS領域やDB領域、VM領域など)ためには、このインターフェースが必須になります。HDD の場合には SATA2 までしか対応していないので、ここまでは必要ありません。なので、構成として、SSD 1台、HDD 3台となると SATA3 のポートはひとつで十分なのですが…、これからの SSD の状況と、3,4年後のを見越した開発スタイルを考えると、ピンポイントで SSD を増やしていく(実際、試験 DB 領域に 100 GB 程度の SSD を購入しようかと考えています)のは必然ですね。

実際、ここ最近のサーバー系で SSD を大量に積むストレージマシンが発表されているので、SQL Server のパフォーマンスチェックは SSD をベースに考えてもいいかも、と思っています。アクセス単位で HDD を分けるよりも違ったノウハウがいるのかもしれません。

そのほかに「高品質な電解コンデンサやキャパシタ、安定性を高める16+2フェーズ電源回路、PCI-E 3.0に対応した5つの拡張スロット、バックパネルI/OはUSB 3.0×4、内部ヘッダピン×2(ポート数は4)」などなどと、阪口氏からは専門用語が飛び出すのですが、サーバー系に「電解コンデンサ」は重要とのことで、下手をするとマザーボードが一気にいかれてしまうので、それなりのものを用意したほうがよいそうです。開発系なので24時間x365日運用は考えていないのですが、そのあたりも重要とのことです。

image

VMWare を動かしたり、Visual Studio を動かしたり、メディアサーバとして動かしたりしていますが、いまのところ特に問題はでていません。

そうそう、気になる電量使用量ですが、ワットチェッカーを買って最近確認しました。モニタ2台+PC1台の構成で120wぐらいです。この話はまた記事を改めて書きます。

カテゴリー: 最強.NET開発PC | 最強.NET開発PC マザーボードの選定ポイント はコメントを受け付けていません

[WinRT] 改変しやすい GridView テンプレートを考える

[WinRT] メディアサーバーを立てて、動画を Surface RT で表示させる の派生として、GridView のテンプレートバリエーションを考えます。つーか、Visual Studio 2012 の吐き出すグリッドアプリケーションの GridView テンプレートは改変がしづらいです。今、書いている本は、そのグリッドアプリケーションを元にしてアプリを作ろうというスタイルになっているので、この言及自体矛盾しているのですが…まあ、ちと高機能すぎて使いづらい。モノとしては、従来の DataGridView コントロールっぽい形で使えたらいいのですが、どうも WPF の GridView を踏襲しているらしく、ItemTemplate(だっけ?)を「自由に作れる」ってところが強調されすぎてるきらいがあるのです。まあ、それはそれで自由度があっていいのですが、最初の取っ掛かりとしては難しいかなと。かつ、最後まで難しいって雰囲気もあります。

方法としては、従来の DataGridView コントロールの扱い位(エクスプローラーの ListView ぐらい)チープな扱い方に戻してしまってもいいのですが、それはそれで退化している感じがして面白くありません。iOS の UITableView ぐらいにするものアリはアリです。なので、タイトルとかサブタイトルとかのデータ部分だけ残して、UI 的なごちゃごちゃしたところをばっさりと隠蔽してしまうのが「コンポーネント」的で良いかなと思っています。

■ビデオ再生専用の GridView を考える

Windows 7/8 は、ホームグループやメディアサーバーを簡単に立てられるようになったので、Surface のようなタブレットPCで、ストリーミング的に動画を流すことが簡単にできます。そんな訳で、私家版ひだまり鑑賞アプリを作ってみました。で、あれはボタンを固定で配置しているので、データが増えるとプログラムを手直ししないといけません。ひだまりの場合は放映が終了しているので、DVD の数は増えたりしないし、話数やタイトルも今後変わりません。なので、ファイル名などはハードコーディングでよいのです。
が、私家版とはいえ先行き、他の動画再生とかする場合にいちいちプログラミングをしているのも面倒ですよね。なので、ビデオ再生のランチャーを目的とした GridView コンポーネントを作っておきますってのが主旨です。

作成途中ですが、プログラミングパターンとしては、MVVM とコンポーネント技法と遅延ロードの組み合わせになります。

  • VideoGridView へは Source プロパティで Model のコレクションを渡す
  • Model は INotifyPropertyChanged を持つ。
  • Model の Image プロパティは、遅延ロードを行う
  • VideoGridView の Item は適当なスタイルをいくつか準備しておく

ってところです。

グリッドアプリケーションのテンプレートを使ったときの SampleDataSource.cs のまずいところは、はっきり言って2点あります。

  • SampleDataItem, SampleDataGroup をそのままの状態でシリアライズできない。
  • SampleDataGroup クラスの ItemsCollectionChanged メソッドの実装がまずい/不要

「サンプル」なのでか書き換えてくれ、ってのもそうなのですが、書き換えるにしても実装まるごと書き換えるスタイルになってしまうので、この2点は直してほしいかなと思ってます(今更直せない気もするけど)。

なので、VideoGridView では、このあたりをばっさりと削ってコンポーネント化します。

■Model クラス(SampleDataItem, SampleDataGroup)

ほぼ、データ構造はグリッドアプリケーションのものを使いますが、コンストラクタと ItemsCollectionChanged を外します。アイテムコレクションの増減に対する処理は、本来 UI で行うべきこと(データの仮想化、遅延ロードなど)なので、モデルに含めるのは妙な感じかと。直接シリアライズができないのも、ここが原因になっています。

Image プロパティに関しては、直接 BitmapImage オブジェクトを生成することになっていますが、これを遅延化させるため別な方法を考えます。というのも、WinRT ではファイル読みが非同期になっているので、new BitmapImage( パス名 ) という同期型で画像ファイルをロードするのは、スタイルとして矛盾がでてきます。実際、書籍のほうで矛盾がでてきたので回避コードを書いています。
MVVM パターンを使うと、バインドという形で UI に接続しているのですが、Image プロパティのように非同期で設定されるプロパティに関しては、バインドが即時実行を期待されているのに反して、画像のデータ(BitmapImageオブジェクト)の生成は時間がかかる(場合によっては読み込めない)という矛盾がでてきます。プロパティには async/await がつけられないというのもこれが元になっています。— バインド自体を少し修正して、非同期の GetImage メソッドを呼び出すように改変するとどうなのかは、試していません。— そんな訳で、同期/非同期とは離れた形で、モデルを実装します。

■データストアクラス SampleDataSource

アプリケーションが唯一持つデータクラス SampleDataSource には、2つの役目があって、デザイン時にテスト的なデータを提供する役割と、実行時にアプリのデータストア的な役割があります。デザイン時のデータは、VS2010 の Blend で使っていたサンプルデータのバインドのやり方で、デザイナさんが UI のイメージが作りやすいようにする技です。グリッドアプリケーションのテンプレートには、これが入っているために、単にビルドしてもなんらかの画面が表示される、ってのが「売り」あんですが、逆に仇になってしまっていて修正するときにはどう修正すればいいのかわからない、という状態のブログが多々みつかります。商業コードの場合は、ばっさりと削ってしまって別の Model を作るのですが、なんかせっかくのテンプレートがもったいないですよね。なので、デザイン時のコードは短めに記述、実行時のシリアライズのコードを事前に組み込んでおきます。

ちなみに SampleDataSource クラスが static を持っているのは、MFC の App スタイルです。ただし、「唯一の App」スタイルは、実行時の生成順序が分かりづらい(変更しずらい)ので、複雑な構成になる場合は app.xaml.cs の OnLaunched 時に明示的にオブジェクト生成を行うほうがいいと思います。起動時の時間とかが予測できなくなるので。

■Image プロパティの遅延ロード

先に書いたように Image プロパティは ImageSource オブジェクトになるのですが、画像ファイルのロードの仕方によっては非同期になります。むしろ、new BitmapImage(path) のほうが例外的で、アプリローカルの画像ファイルやマイドキュメントのファイルをロードするときは必ず非同期処理になります。特に SkyDrive やホームグループ先の画像ファイル(ピクチャフォルダ)を扱う場合には、読み込めない場合も多々あります。
そうなると、Model クラスで Image プロパティに画像オブジェクトを設定するパターンだと、画像ファイルのロード処理をどこでおこなうのか?遅延する場合はどうするか?エラーになった場合はどうするのか?遅延前はどう表示したらよいのか?という課題がでてきます。これらの課題は、いままでは Model の外側で行っていたのですが — なんらかのロードが終わったら Image プロパティに設定するというコーディングスタイル — せっかく async/await の非同期処理の構文が導入されたのですから、UI コントロール内でこの遅延処理を実行しましょう、ってのが発端です。
おそらく、パスかスキームを渡して ImagePath を指定するか、Image プロパティを設定するかというところです。バインドなどで従来の書き方を残しておくために Image プロパティは ImageSource 型になるので、そのあたりをどうコントロールで実装するかってことですね。いわゆるブラウザが画像表示をさせようとしているとき(jQuery.ui とか)と同じです。

  • 画像を表示する前
  • 画像をロードしているとき
  • 画像のロードが完了したとき
  • 画像がロードできなかったとき

の4種類を一括してコントロールのほうで受け持ちます。Model としては Image プロパティあるいは ImagePath プロパティに任意のタイミングで設定し、SetPropertyChanged を行ったタイミングで画像をロードし始めるというパターンです(場合によっては、スタートも遅延させます)。そして画像のロードが終わったタイミングをコントロール自身が取得して画像を更新させる、というコードスタイルですね。このあたりが、コンポーネントの技法になります。

■Item のスタイルをいくつか用意しておく

これはグリッドアプリケーションもやっている方法で、StandardStyles.xaml の中に Standard250x250ItemTemplate などのスタイルが記述してあります。ですが、これを VideoGridView 内部リソースとして持つようにします。DataTemplate の書き方が難しいのと、そのままではデザインできないので、ってところです。

ちなみに、StandardStyles.xaml にバグがありますね。

            <ToolTipService.Placement>マウス</ToolTipService.Placement>

ではなくて、

            <ToolTipService.Placement>Mouse</ToolTipService.Placement>

のように書きます。たぶん「訳し過ぎ」ってやつです。後で Connect にでも。
<a href=”http://msdn.microsoft.com/ja-jp/library/system.windows.controls.tooltipservice.placement.aspx”>ToolTipService.Placement アタッチされるプロパティ (System.Windows.Controls)</a>

こんな風に、GridView を継承した/改変したコンポーネントが揃ってくるといいかなと思っています。インターフェースは GridView そのままで。UI とか内部動作がちょっとずつ違うというパターンですね。Model はストレージに近いので、共有化して使えるほうが便利なのです。

カテゴリー: C#, WinRT | [WinRT] 改変しやすい GridView テンプレートを考える はコメントを受け付けていません

[WinRT] Surface RTを子供用に構成する

2歳児の子にタブレット(iPadとか)を渡すと何が大変かというと、癇癪を起して投げられる、ってのが怖いのですが、幸いにして私の初代iPadは2,3度投げられましたが無事です。

その次に怖いのが、(内田春菊の「私たちは繁殖している」を見るとわかります)ファイルを消されることです。iPhone を渡していると、じっと長押しした後に「×」で消す、ってのを危うくやられそうになりますが、幸いにしてまだ消されたことはありません。ボタンを長押し→「×」を押す→問い合わせで「削除」ボタンを押すという3コンボがなんとか大丈夫ってな具合ですね。4歳ぐらいになると「消しちゃダメ」ってことを分かってくれるので(いたずらとしては別ですが)、それほど気を遣わなくてよくなります。

iPad は特にログイン制御とかがないので(あるといちいちパスワードを入れてあげないといけないのが大変)共有ってことでほっておくのですが、じゃあ Winodws RT(Surface RT)の場合はどうなのか?ってことで、そういう視点で試しています。

■ログインアカウントを別にする

Windows へのサインインとサインアウト を見て、子供用のアカウントを作ります。パスワードはなしで作っておきます。画像を張っておくといいんだけど、ひとまず作っただけで。

image

ここで、自分用と子供用の切り替えができます。自分用のはパスワードを入れておけば ok 。スリープから復帰のときはパスワードなし、って設定ができるので、そうしておくと作業は楽です。ええと、画面がべたべたと汚れているのは、保護シートとか使っていないからですね。どうせ子供がべたべたにしてしまうのだし、所詮道具なので。

■スタート画面を整理してしまう

子供用のアプリだけスタート画面に表示させます。

image

「スタートからピン止めを外す」でがんがん消してい行きます。ブラウザとか地図とかも消してしまいました。ああ、カメラを消してしまったので後で戻さないと。戻すのは、検索から「カメラ」で検索して「スタート画面にピン止めする」を選択すれば元に戻せます。

一番あやういデスクトップを外しておくと、大事なフォルダとかを消されずに済みます。よかったですね。が、なんかのはずみで(アプリでコマンドプロンプトを動かすとか)デスクトップが開いてしまうと、スワイプでデスクトップを引き出せるようになってしまいます。

image

アプリの検索でデスクトップアプリ全般を動かせない(あるいはキッズモードでは起動できない)ようにできると、いいのかも。

image

ファミリーセーフティを使うと、利用するアプリを制限することができます。なので、デスクトップのゲームアプリやら諸々が制限できるのですが「デスクトップ」という項目はないようです。まあ、アプリ自体を動かないようにするのもいいのですが、エクスプローラーでファイルを消す、ってのは制御できないですよね。なので「デスクトップに移れない」モードが欲しいところです。

■私家版アプリを子供アカウントに入れる

他アカウントを作ると、ストアアプリも共有されるかと思ったのですが、そうではないのですね。デスクトップアプリの場合は、どのアカウントでも使えますが、ストアアプリの場合はインストールしたアカウントしか使えません。なので、子供用のアプリをインストールするときは、子供用のアカウントでログインしてインストールをする必要あがります。ええ、自分も使いたい場合は、何度もインストールしないといけないという…ちょっと大きめのゲームだったりすると内部ストレージがいっぱいになりませんかね?

私家版アプリは、Visual Studio 2012 でのリモートデバッグでも、私家版パッケージでも両方いけます。ファミリーセーフティとか標準ユーザーとかの権限は関係ないようです。普通のPCだと、管理者しかインストールできない、というパターンがあるのですが、ストアアプリの場合そのあたりは安全ってことで ok なんですかね?リモートデバッグでもインストールは可能なのですが、普通、子供アカウントは「パスワードなし」にすることが多いので、Visual Studio 2012 から Surface RT に接続できなくて失敗します。Microsoft アカウントを作った場合は不明です。一応、ローカルアカウントでやってみました。

Microsoft アカウントを作ると、SkyDrive を使うことができるので写真の共有をしてストレージの圧迫を避けたいところですが…大切な資料とかを SkyDrive で公開されると困るので、やめておきましょう。その代わり、ホームグループを設定して写真とか映像は「ピクチャ」や「ビデオ」フォルダに置いておくといいと思います。

image

デスクトップの問題は残っていますが、スタート画面を変えておけば kids っぽくなります。私家版アプリも動くので、これ「ストア審査」頑無視のアプリができるかと。

私家版ひだまり鑑賞のソースはこちら。ローカルのホームグループを使っているので「当然」他の環境で動きませんが、適当にホスト名やパス名を変えれば、自分なりのビデオランチャーが作れます。

カテゴリー: WinRT | [WinRT] Surface RTを子供用に構成する はコメントを受け付けていません

[WinRT] VS魂 100連発の閲覧アプリのリジェクトの記録

あまりアップする気はなかったのですが、[WinRT] VS魂100連発を起動するストアアプリを作り直す | Moonmile Solutions Blog を土曜日にストアに提出してみました。

image

という訳で、月曜日に「めでたく」リジェクトになったので、その記録を。ちなみに、ソースはこちら http://sdrv.ms/15UjCrq 。Youtube のリストを拾ってきて、IE10 を起動ってな簡単なものです。

コンテンツの適合性: 不合格

このテストは、Windows ストアの認証要件にコンテンツが準拠しているかどうかという観点でソフトウェアを評価します。 さらに詳しく

お客様のアプリは、要件 1.2 を満たしていません。 詳細情報

確認事項:

  • アプリには、ユーザー アカウントが必要ですか?その場合は、テスト アカウント 1 件を [審査担当者へのコメント] ボックスに含める必要があります。
  • ユーザーは、アプリを通じて買い物ができますか?その場合は、買い物をテストする方法の説明を提供する必要があります。

アプリがこの要件を満たしていないと見なされる一般的な理由:

  • アプリに、機能しないセクションが含まれているか、主要なユーザー シナリオに該当する部分に (“近日提供”、”続く”、”準備中” などと書かれた) プレースホルダーが含まれている。
  • アプリでサポートするとしているすべてのアーキテクチャでアプリが動作しない。たとえば、あらゆる CPU で動作するとしている場合、そのアプリは ARM を含むすべてのアーキテクチャで動作する必要があります。
  • アプリの説明があいまいであるか、誤解を招きやすい。
  • 実際には含まれていない機能が含まれているかのように見せるスクリーンショットまたは記述をアプリの説明に使用している。
  • ユーザーがオーディオの再生を制御するための “再生” および “一時停止” のキーボード イベントに、アプリが応答しない。
  • アプリの説明に、ハードウェアまたはネットワークの要件が明示的に記載されていない。

お客様のアプリは、要件 2.4 を満たしていません。 詳細情報

アプリがこの要件を満たしていないと見なされる一般的な理由は、アプリの主要なシナリオの 1 つに該当する部分を完了するために、ユーザーが Web ブラウザーにリダイレクトされることです。

お客様のアプリは、要件 4.1 を満たしていません。 詳細情報

審査担当者からのコメント:

You should add more detail to your app description, it reads too generic or vague to adequately represent the app’s unique value. The app has declared access to network capabilities and no privacy statement was provided in the Windows Settings Charm. This app appears to be links to the same website opening in a web browser. The primary experience is not within the app.

Google 翻訳も

あなたのアプリの説明に詳細を追加する必要があり、それが十分にアプリのユニークな値を表すことが一般的すぎるか、漠然とした読み取ります。アプリはネットワーク機能へのアクセスを宣言し、全くのプライバシーに関する声明は、Windowsの設定チャームで提供されていません。このアプリは、Webブラウザで同じウェブサイトのオープニングへのリンクがあるように見えます。主要な経験をアプリ内ではありません。

Windows 8 アプリの認定の要件 (Windows) を開くと、要件にアクセスできるので、読んでみると。

■要件1.2 ユーザーが Windows ストアからアプリを入手したとき、そのアプリは完全に機能しなければならない

てことなんですが、なんか動かないところがあったのでしょう。グリッドテンプレートのリンクあたりを殺していないとか。まあ、説明が足りないってのはそうかも。説明自体は、

日本マイクロソフト社 エバンジェリストによる VS魂 100連発を簡単に視聴できるツールです。
日本マイクロソフト株式会社 エバンジェリストチームのブログ
http://blogs.msdn.com/b/evangelistsjapan/

としか書いてないので。

■要件2.4 アプリで提供されるプライマリ エクスペリエンスはアプリ内で行われなければならない

このアプリの「プライマリ エクスペリエンス」=主な機能ってのはリンクをクリックすると目的の Youtube を表示するランチャーなので、「ユーザーが Web ブラウザーにリダイレクトされることです。 」って言われても困るんですけどね…これダメだと、ランチャーアプリ一般はすべてダメってことになるけど。つーか、ビデオアプリと「コントラクト」主体のアプリってのは否定なのか?

■要件4.1 プライバシーに関する次の要件に準拠しなければならない

ネットワークにつなげるのでプライバシー保護への宣言が必要なのですが、アプリを登録するときのリンクではダメなようで、やっぱり設定を作ってアプリに入れないとダメみたいです。これは巷で言われていたことなんですが、個人用だし面倒なのでソースには含まれていません。URL だけだと、その先が書き換えられる可能性があるかダメってのは知っていたのですが、アプリ登録のときに URL があるからね。アレを消してほしいなと。

■でもって、対策はどうするのか?

要件2.4 ってのは、このアプリの主要機能なので、対応できません。ってことで、要件1.2 と要件4.1 だけ修正してリリースし直しましょう。チャームで設定ってのが作業量が増えるので面倒なんですが、まあ後ほど。

カテゴリー: WinRT | [WinRT] VS魂 100連発の閲覧アプリのリジェクトの記録 はコメントを受け付けていません

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

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

20130318_04

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

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

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