[C#] クリップボードからビットマップ形式のデータを拾って、連番でフォルダに保存する

新人プログラマー向けシリーズ…ではなくて、チープだけど今まで手順が面倒だったのでツールに。

機能的には、クリップボードのビットマップ形式のデータを取り出して、特定のフォルダに連番で保存するだけで、という単発機能です。しかも、保存先はソースコードに書き込んでしまっているので、他で使う場合にはコンパイルし直さないという、私家版≒ダメツールです。設定ぐらいは後で、config に書き直すとして。

いままでの手順が、

  1. クリップボードで画面キャプチャ
  2. IrfanViewに貼り付け。
  3. ファイル名を「日付_連番」にして、特定のフォルダに保存
  4. エディタに [img 日付_連番] の形式で追加

だったのですが、1,2,3,4 は自動化できますよね。時々、2 で IrfanView に貼り付けた後に切り取ったり、縮小したりするので、必ずしも自動化とはいかないのですが、ほぼ1から4は同じ手順になっています。なので「ツール」にしてしまうということです。ブログへの up は、QX エディタで描いて、適当な perl スクリプトを通してアップします。その時に画像のサムネールやら拡大画像やらは C# で作った自作ツールです。なんで、こんなややこしい?ことになっているかというと、本当は Windows Live Writer で統一したいところなのですが、Live Wirter の場合はコードがうまく表示できない。Wordpress の場合は、インラインタグというのがあって、

...

と書くと、SyntaxHighlighter のプラグインを入れておけば、コードにハイライトを付けてくれます。これをローカルで編集する場合は、まあ、適当なテキストエディタのほうが良い訳で、、いくつかのツールを組み合わせて書いているという具合。あまり、ブラウザのエディタを使わないんですよね…というタイプなので。

■クリップボードからビットマップを取得する

private void buttonClip_Click(object sender, EventArgs e)
{
    var clip = Clipboard.GetDataObject();
    // 画像ファイルのみ取り込み
    var bmp = clip.GetData(typeof(Bitmap)) as Bitmap;
    if (bmp == null) return;
    // ピクチャへ表示
    pictureBox1.Image = bmp;
}

とするだけで ok。PictugeBox は自動で拡大されないように SizeMode を Zoom に変更しておきます。

# ここに矢印とか簡単に付けられるツールを作らないと。
# あと、切り取った場合は、切り取り線みたいなのとか。

■指定のフォルダに連番で保存する

private void buttonSave_Click(object sender, EventArgs e)
{
    Bitmap bmp = (Bitmap)pictureBox1.Image;
    if (bmp == null)
        return;

    ImageFormat fmt = ImageFormat.Bmp;
    if (radioButton1.Checked) fmt = ImageFormat.Bmp;
    if (radioButton2.Checked) fmt = ImageFormat.Jpeg;
    if (radioButton3.Checked) fmt = ImageFormat.Png;
    string fname = MakeFileName(fmt);
    bmp.Save(fname, fmt);

    textBox1.Text = "[img " + Path.GetFileName(fname) + "]";

}

string MakeFileName(ImageFormat fmt)
{
    string path = FOLDER ;
    DateTime dt = DateTime.Now;
    string dname = string.Format("{0:0000}{1:00}{2:00}", dt.Year, dt.Month, dt.Day);
    var files = System.IO.Directory.GetFiles(FOLDER);
    var file  = files.Where(f => f.IndexOf(dname + "_") > 0).Max();
    if ( file == null ) {
        path += dname + "_01." + fmt.ToString();
    } else {
        var mat = new Regex( @"_(d+).").Match(file);
        int num = int.Parse( mat.Groups[1].Value );
        num++;
        path += dname + "_" + num.ToString("00") + "." + fmt.ToString();
    }
    return path;
}

ファイル名がユニークであればよい、というのと拡張子に関係なく日付でソートしたい時がある(名前でソートをすると古い順になるので)連番のほうをインクリメントしていきます。ここでは、フォルダからファイルを拾ってきているのでだんだん遅くなってしまう可能性があるのですが、まあ、良しということで。これはツールの config に連番を付けてもよいのですが、手作業で番号を入れたい時にちょっと困るので、フォルダからいちいち拾ってきます。

■ショートカットを設定する

なんどか使ってみて追加した機能が、ショートカットです。「取り込み(V)」となっているので、Alt+V で取り込みボタンを押せるのですが、何度も、Ctrl+V と間違えて押します。コピー&ペーストだから、Ctrl+V のほうが自然なんですね。なので、自然なほうに合わせて、フォームの key 取得のところで Ctrl+V を有効にします。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control == true)
    {
        if (e.KeyCode == Keys.V)
        {
            buttonClip_Click(sender, null);
        }
        else if (e.KeyCode == Keys.S)
        {
            buttonSave_Click(sender, null);
        }
    }
}

そのままだと、フォーカスのあるボタンにキーイベントが飛んでいくので、フォームの方に来るように Form の KeyPreview プロパティを True にするのを忘れずに。

ちなみに、QX エディタでの編集状態はこんな感じになっています。

# QX エディタで img のところにカーソルをあてるとプレビューができるプラグインとか作れないですかね?

サンプルソースはこちら
http://sdrv.ms/10qU0yT

zip ファイル

AutoSaveCap-v0.1-src.zip

# この SkyDrive への登録部分も手間を省きたいところ。

アイコンは、84個のデスクトップアイコン | アイコンを創造するアイコン素材専門館アイコンゲータ- から借りてます。

カテゴリー: 開発, C# | [C#] クリップボードからビットマップ形式のデータを拾って、連番でフォルダに保存する はコメントを受け付けていません

Surface RTに動画用のストレージ(microSD)を増設する

Surface RT 32GB タイプは5万円を切る値段なのですが、OS 自体に10GB以上、Office が入っている分、SSD の容量が取られるので、なんやかやといれていくと残りがが10GB だったりします(もうちょっとあったような気がするけど、私の Surface RT は、現時点で残容量 9GB です)。

音楽とか Word でドキュメントとかを入れている分には、このぐらいでも大丈夫?なのですが、動画を入れたり、3D ゲームを入れたりすると結構圧迫するのが予想されます。そういうハードな使い方をする場合は、あらかじめ 64 GB タイプを買えばいいのでしょうが、幸いにして Surface RT は micro SD のインターフェースを持っているので、これに大容量の SD カードを差し込めば ok … ってなことはできるかな?と。

ちなみに Surface の microSD を入れるところはここです。

20130401_01

Surface RT のスペックはこちら。

価格.com – マイクロソフト Surface RT 32GB 7XR-00030 スペック・仕様

USB のほうは、マウスとかで開けておきたいので、microSD, microSDXC のほうを使います。SDメモリーカード – Wikipedia を見ると、いくつか種類があるので候補を挙げれば以下なところです。

  • SDHCメモリーカード 32GB Class 2
  • SDHCメモリーカード 32GB Class 4
  • SDHCメモリーカード 32GB Class 10
  • SDXCメモリーカード 32GB Class 10

クラスによる違いは、以下の通りだそうです。

カード 最低保障レート
Class 2 2MB/sec ( 16Mbps )
Class 4 4MB/sec ( 32Mbps )
Class 6 6MB/sec ( 36Mbps )
Class 10 10MB/sec ( 80Mbps )

値段的に言えば、

な感じで、microSDHC だったら Class 4, 10 であまり変わらない(数百円程度)なので、新しく買う場合は Class 10 にしておいたほうが良いかな、という感じですね。大容量の microSDXC のほうは魅力的ではあるのですが、さくっと買うにしては値段が高い。

もし、手元にあるならば、Class 4 の microSD カードを使いたいわけで、Amazon.co.jp: A-DATA MicroSDHC 8GB Class6 SDアダプタ-付属 MCSDHC8GB/2A/Class6: パソコン・周辺機器 あたりを使い回すことはできないかな?と考えてみます。

■理論値を計算する

例えば、DVD が 8GB として2時間の映画が入っているとすると、8GB/(2時間*60*60) = 1MB/sec の読出しになります。実際は読出しの後に mp4 のデコードをしてなどなどやっているので、読出しのスピードはもうちょっと早くないといけないのですが、読み込みとビデオ描画が「完全にパラレル」で動いた場合には、1MB/sec 程度あれば十分ってところです。DVDの読み取り速度は何MB/sなんですか? – Yahoo!知恵袋 を見ると、等倍速の場合は、1.385MB/sec なので、まあ、だいたいあっているみたいですね。

■では、古いタイプの SD カードで十分なのか?

DVD のような高解像度の場合でも、Class 2 の転送速度(2MB/sec)で十分な訳だからわざわざ Class 10 を買わずに済みますよね…って方向でいきたいのですが、ちょっと事情が異なります。

ネットワーク経由で、Surface RT のビデオアプリを使うと、ホストしている PC の送信速度はかなり上下します。ピーク時で、8MB/sec を超えるところがあると思えば、数秒ほど 0 MB/sec になります。WiFi では十分な速度があるのですが、動画の mp4 のデータを断続的に送って、Surface RT でデコードして描画というのを繰り返しています。

image

このため、WiFi(無線LAN)を使って Surface RT で動画を表示しようとすると、ホスト側のスピードが遅いとコマ落ちが発生します。多分、MeoBankSD | 製品情報 | TAXAN MeoBank を使ったときに SD カードが Class 4 だと動画がかくかくしていて、Class 10 に変えるとスムーズになった、というのはこの現象だと思います。mp4 あたりの転送とエンコード方法の規格?には詳しくないのでわかりませんが、ネットワークのデータ転送量を見る限り、同じだと思います。ネットワークの場合は、瞬間的な読み込み時に 7MB/sec 位が必要になるので、一時的に Class 4, 6 の速度を超えてしまうので動画が止まってしまう状態になるかと。なので、SD メモリを読み出すときに Class 10 であれば、動画がスムースに動くわけです。

■ローカルの SD カード読出しはどうなのか?

mp4 の読み込みが平均的ではないことが分かったので、今度はローカルストレージの HDD から起動した場合を確認します。これは Surface RT ではなくて、普通の PC で同じビデオを表示したときです。

image

E ドライブの mp4 の動画を流しているときのピークは 1MB/sec 程度になっています。無線LAN経由と同じく、断続的にデータの読出しを行っていますが、ピーク時の転送量が少ないのは…よくわからないのですが、ネットワークのエンコードとか、その関係ですかね? ネットワーク経由よりもピーク時の転送量が少ない(Class 2以下)ので、Class 4の昔の microSD を使いまわせるのでは?と考えられます。

■実際 Surface RT で実験してみる

手元にあった Class 6 の microSD で試してみました。プログラム自体は 200KB/sec で読み込んでいるので、読み取り速度としては十分なような気がするのですが、ピークの出方をみると断続的に読み取りをしていますね。

image

動画のほうはどうなのかというと、エンコードなりサイズの問題もあるでしょうが、ローカルの D ドライブから(SD カード)断続的にデータを読み込んでいて、カメラがパンをしたような背景が大きく動くときは、ちょっとかくかくした感じになります。CPU 自体は大丈夫なので、どうやら読み取りスピードが足りていないようです。同じ mp4 のデータを Cドライブ(内蔵の SSD)にコピーして動かすと、400KB/sec 程度の読み込みが発生して、動きがスムースになります。どうやら、Class 10 にしないと転送量は足りないようです。

■結論としてはどうなのか?

後で実測しないとダメなのですが、microSD から直接動画を表示する場合は、Class 10 を使わないとスムースな描画ができません。サイズの微調整をするか、アプリ側で調節をすればよいのでしょうが、現状では数百円の差ならば Class 10 の microSDHC や microSDXC に買い替えたほうがよさそうですね。ひとまず 32 GB の microSDHC で試してみようと思います。

ただし、少し懸念点があって、内部 SSD が結構なスピードなので、Class 10 でも速度が足りているのか?がちょっと問題です。平均?転送速度が 400KB/sec と Class 6(6MB/sec) の読み込みの倍になっているので、Class 10 の 10MB/sec で足りるのかどうかが、ちょっとわかりません。このあたりは、後日実測してみましょう。

もうひとつ方法があって、Class 6 のような古い SD メモリでも、バッチを作ってやって、一度内部の SSD にコピーしてから動画を表示する、というパターンでもいいですね。転送自体は数秒で済むので、そんなに負担にはならいでしょう。大体、2時間弱の映画が mp4 で 1GB 程度なので、古い映画を 30本ぐらい入れることができます。このあたりは色々試してみたいところです。

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

ビックデータから有用な情報を導き出す方法

ビッグデータという、99%の事業者には効果の無い話(山本 一郎) – 個人 – Yahoo!ニュース
http://bylines.news.yahoo.co.jp/yamamotoichiro/20130328-00024117/
ビッグデータは、そうやって使うもんじゃないんじゃない?そもそも・・・ – ウィリアムのいたずらの開発日記
http://blog.goo.ne.jp/xmldtp/e/cd13de092ea5ab00023e18539234078f
ローソンのビッグデータは、なぜ山本一郎氏に叩かれるほどの成果しか出なかったのか? – ウィリアムのいたずらの開発日記
http://blog.goo.ne.jp/xmldtp/e/f6aa4b0ee88352c8bf5b91e2816ce296

久々に「ウィリアムのいたずら」さんの日記を見つけたので、続けて考察してみる。もちろん、Yahoo ニュースのほうは的はずれ。

■ビックデータの定義とは?

定義っていうほどではないのだろうけど、ローソンのPONTAの例で言えば、かつてPOSシステムがなかった時代から、POSの導入で商品の出入りの管理をして、それを個人に紐づけることができたという時代/技術の流れがあって、それを一次元的に集約できるようになったのが「ビックデータ」ってことで ok ですかね? このときのデータはジャーナル的なデータでしかなくて死蔵されているデータ。単なるロギングとも言えますね。これを「ビックデータ」として活用できるためには、

  • なんらかの形で、データを加工できるマシンパワーがある。

ことが必須。統計的にサンプリングするのもありなんですが、サンプリングすると、

  • 誤差なりノイズなりが消えてしまう
  • 局所データが消えてしまう

という不都合があるわけで、ビックデータからの抽出作業(特異なノイズや特徴量など)ができるマシンパワーが必要なわけで、宇宙人探しのアレと同じパターンです。

■ビックデータから何を導き出してはいけないのか?

いけない訳じゃないけど、意味がないよ、ってのは

  • なんらかの平均値を出す
  • なんらかの中央値を出す
  • なんらかのヒストグラムを出す

というようなことは統計学上、サンプリング理論で十分なので、やっていはいけない…というかデータのサンプリングで十分。ウィリアムのいたずらさんの書いてある「紅白歌合戦」の傾向みたいなのですね。詳しいことはサンプリング理論を読んで貰うとして、サンプリングの分布が本来の分布を表すためのサンプリング率というのが算出できます。それに沿ってデータをランダムに抜き出せば、ビックデータを扱うほどのマシンパワーがなくても簡単に統計がとれます。大きなデータを解析するという意味では、7百万件のデータから1秒以内に波形表示をする – Moonmile Solutions Blog の手法を取れば良い訳です。

なので、単に相関図を出したり、年代別の傾向を出したり、県別のデータを出したりしてレポートを造るのは「ビックデータ」を活用している、といはは言えません。いや、10年前ぐらいだと、そのぐらいのデータを処理するために十分アップアップだったわけで、月次なり日次なりの帳票を出すだけでも一苦労だったんですけどね。最近だと、適当なクエリを書くだけで十分です。あと各DBには統計関数が揃っているし。全体を眺めてマクロ的な統計はあまりいらないのです。

■ビックデータから局所の傾向を導き出す

具体的に何が活用できるかというと、PONTA の例をとると、

  1. 全国の購入データが本社に集まってくる
  2. 県別に平均を取ると、A市の売り上げが悪いことが分かる
  3. A市の顧客数、顧客の来る時間帯、商品の品揃えを全国平均、あるいは優秀店舗と比較する。
  4. A市の商品の品揃えを変更した場合、売上が変わるかシミュレーションする
  5. 実際に商品入れ替えを行い、シミュレートとの誤差を比較して、4へフィードバックする。

ということが本社のビックデータで可能になるということです。1と2の平均計算は、通常のマクロの統計学の範囲で計算ができます。計算スピード自体は、先のサンプリングだけで十分です。全国の平均がでれば、平均以下の店舗の一覧は簡単に抽出できます。これもいままでのデータ解析の範疇でできます。

3のところから、ビックデータの活用範囲になります。全国区のサンプリング数ではA市のサンプリング数とは異なります。優秀店舗(売上がよい店舗)と全国平均、とA市の店舗の売り上げ、顧客の来店時間などを比較します。仮説として、A市が全国平均と同じパターンの人が住んでいれば、全国平均と同じ売上が上がるはずです。さらにA市が優秀店舗と同じ生活パターンの人が住んでいれば、A市の店舗は優秀店舗になったはずです。ですが、A市の売り上げが悪いとうことが、人の分布、生活パターン、嗜好などが、全国平均や優秀店舗のものと異なっているから、というのが原因です。

A市の店舗が優秀店舗になるためには2つの方法があります。

  • A市に住んでいる人を、優秀店舗に住んでいる人と同じように変える。
  • A市に住んでいる人の生活パターンに、A市の店舗を変える。

ということです。時には「人」を変えることも可能なのですが(ええ、会社とか)、コンビニの場合には無理な相談なので、店舗の方を変えます。当たり前ですね。
なので、A市の店舗の商品別売り上げと全国平均、優秀店舗のそれと比較して、違いを割り出します。特に優秀店舗では売れているけれども、A市では売れていないものを導き出します。いままのPOSシステムとデータ解析では、ここまで細かくチェックはできずに、全国区の売れ筋商品をA市の店舗にも入れるというスタイル(大衆スタイル)を取っていたわけですが、ネットの普及、細かい対応が可能になってきたので、A市の生活スタイルにあった販売方法(分衆スタイル)が取れます。

そこで、いままではA市の店舗の自己努力(勘とか営業マンが行ってのリサーチとか)になっていたわけですが、商品入れ替えによってA市の店舗の売り上げをシミュレートします。シミュレーションに関しては、地方販売、棚の設定、顧客の時間帯(通勤客、地元の生活客など)を加味したパターンを用意して一気にシミュレートします。商品入れ替えによる売上の確率は、他市の過去の商品入れ替えによる売上の上下による確率を加味させます。

こうすることで、A市で売り上げが上がるであろう商品の品ぞろえ、棚、戦術が生まれます。ここまでシミュレートでしかないので、実際に棚を変えたときに売り上げが変わるのかどうかを、日々のPONTAと、POSで抽出します。PONTA を出さない人もいますからね。そうやって、シミュレーションの結果と現実を比較して、A市の店舗の売り上げが上がるように調節しています。

ってのがビックデータの活用例です。これが、いままでのサンプリング方式やアンケート方式ではできないのが、

  • ボトムアップ方式による、A市と全国区との違いを抽出
  • A市の生活スタイルに合わせて、商品レイアウトを決定する
  • 多数のシミュレーションを行う
  • 商品レイアウト変更後の効果をシミュレーションに反映させる

ということが、いままではできません。かつ、単なるPOSシステムの場合には、商品レイアウトの変更案は作業量的にそれぞれの店長任せになるか、全国区の統一レイアウトにならざるを得ないのですが、本社に蓄積されているビックデータを活用することによって、本社から各店舗への個別提案が出せます。以前(と言っても5年以上前ですが)、テレビでみた店舗のレイアウト変更は、3ぐらいまでは店長単位でできていたので、3のあたりを本社が代行したり、シミュレートしたりすることが可能になります。いや既になっているかな?

■数学理論的ビックデータを扱うのは簡単だが

そんな訳で、数学的にビックデータを扱って局所に適用させるのは簡単なのですが、実際のところで難しいのは優秀店舗と平均以下店舗の「違い」をどの物理パラメータ(商品売り上げ、顧客年齢、顧客の来店数など)に割り当てるかですね。時々、これらを論理パラメータ(商品の色、季節商品など)に集約させてしまって見間違えることも多いのですが、まあ、全体売り上げからみると誤差の範囲になってしまうし、そのあたりは「ビックデータから大した情報は引き出せない」という間違った結論に達してしまうのかなと。

カテゴリー: 雑談 | ビックデータから有用な情報を導き出す方法 はコメントを受け付けていません

[WinRT] ストアアプリで DoEvents を実現する

[tweet https://twitter.com/biac/status/317963665636732928 ]

を見て Task.Yield() を早速試してみました。ループ待ちとしては、連続したアニメーションをつなぐために、await/async を使う  のパターンになるかなと。

■Application.DoEvents はどう実装するのか?

かつて、VB では画面の更新に DoEvents を使っていたわけで、これが結構便利。プログラムの for ループの中に DoEvents を差し込めば、画面(UI)を再描画してくれるのでループ内のカウンタ表示とか、キャンセルボタンを押すために DoEvents を入れたものです。似たパターンでは、VC++ でも Message ループを差し込んだり、VB.NET で Appliction.DoEvents を入れていました。
が、ストアアプリの場合は、この便利な DoEvents がないのです(確かに、WPFのほうにもないですね)。これをどう実現するのか?ってのが WPF 時代の人は知っているのでしょうが(あまり WPF はハードにタッチしていないので)、.NET 4.5 の場合は、async/await と Task を使いましょう、ってのが本来の姿。長いループの場合は、適宜 Task にして事項しましょう、ってのが推奨パターンです。

が、いちいち Task にするのが面倒臭いのと、Task の中から UI を触れないので Task の中では UI に対して Invoke をするか、ディスパッチをするか、というちょっと面倒なことをしないといけません(多分、まとめたページが世の中に既にあるはず)。

こんな風に、

  • Task.Yeild を使うパターン
  • Task.Delay を使うパターン
  • Task を使うパターン

の三種類で試してみます。いわゆる「重たい処理」というのが、アニメーションの完了待ちになっているので実は重い処理とは違うので、コードがちょっと違いますが、まあ応用が利くかと。

■Task.Yeild 待ちのパターン

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    bool completed = false;
    sbMove.Completed += (_, __) => { completed = true; };
    text1.Text = "アニメーション開始";
    int i = 0;
    sbMove.Begin();
    while ( completed == false ) {
        count1.Text = i.ToString();
        await Task.Yield();
        i++;
    }
    text1.Text = "アニメーション終了";
    sbMove.Stop();
}

開始と終了とにメッセージを TextBlock に表示します。また、ループの間にカウンタを表示。アニメーションの完了待ち(Completed イベント待ち)という「軽い処理」をしてるので、この Task.Yield() の処理は相当重たくなっています。実際に「重たい処理」が入れば、即時戻ってくる Task.Yield() はそれなりに使いでがあるかと。

■Task.Delay 待ちのパターン

private async void Button_Click_2(object sender, RoutedEventArgs e)
{
    bool completed = false;
    sbMove.Completed += (_, __) => { completed = true; };
    text1.Text = "アニメーション開始";
    int i = 0;
    sbMove.Begin();
    while (completed == false)
    {
        count2.Text = i.ToString();
        await Task.Delay(100);    // ちょっとだけ待つ
        i++;
    }
    text1.Text = "アニメーション終了";
    sbMove.Stop();
}

一見すると、Task.Yield() と変わらないように見えますが、Delay メソッドでミリ秒だけ待ちます。Delay メソッドは非同期(UIスレッドに処理を戻す)仕様なので、await を付けて結果的に Yield メソッドと同じ結果を得られます。本当に重たい処理をする場合には、Task.Delay(1); のように瞬時だけ処理を戻すというパターンでも使えます。
後で実験してみますが、Yeild よりも Delay のほうが処理が軽くなります。

■別 Task にするパターン

private async void Button_Click_3(object sender, RoutedEventArgs e)
{
    sbMove.Completed += (_, __) => { _completed = true; };
    sbMove.Begin();
    text1.Text = "アニメーション開始";
    await WaitComplete();   // 完了待ち
    text1.Text = "アニメーション終了";
    sbMove.Stop();
}
bool _completed = false;
///
/// 完了待ち
///
///
private Task WaitComplete()
{
    return Task.Run(async () =>
    {
        while (_completed == false)
        {
            await Task.Delay(100);  // ちょっと待つ
            // ここをコメントアウトしてもスムースに動く
        }
    });
}

おそらくこれが正式な方法で(もう少し良いパターンがあるような気もしますが)、完了待ちを別のタスクにします。_completed がグローバル扱いになるのが難点ですが、これはひと工夫(refを使うとか)すれば消えるはずです。WaitComplete メソッド内のタスクは UI とは別スレッドのために UI にあるカウンタの更新はできません。なので、ちょっとした小細工をするときには面倒といえば面倒ですね。

ただし、このコードの利点としては、await Task.Delay(100); の部分をコメントアウトして、ループだけにしても他のアニメーションがスムースに動くということです。これは async/await の戻りが UI スレッドではなくて、ワーク用のスレッドに戻るからなんですね。なので UI スレッドに負担を掛けずにすみます。なので、uI の応答性を重要視する場合はこのパターンで書くことになるでしょう。

■実測してみる。

Yeild と Delay の UI スレッドへの負担を見てみると。

アニメーションが 5秒の場合には、Task.Yeild は 7万回以上呼び出されているのに対して、Task.Delay は 44回で済みます。Delay が 50回呼び出されていないのは、まあ誤差の範囲で。
ちなみに、シミュレーターの場合は Task.Yeild では動きがかくかくしていますが、ローカルコンピューターではスムースに動いています。でもまあ、5秒間に7万回呼び出しても仕方がないわけで、CPU を喰わない(省電力化)をするためも、Delay のほうがお得かという結論です。

サンプルコードはこちら。
http://sdrv.ms/10mK1ch

zip ファイル

SampleDoEvents-v1.0-src.zip

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

[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=&quot;sbBound&quot;>
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(CompositeTransform.ScaleX)&quot; Storyboard.TargetName=&quot;ellipse&quot;>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.1&quot; Value=&quot;1.2&quot;/>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.5&quot; Value=&quot;1&quot;>
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(CompositeTransform.ScaleY)&quot; Storyboard.TargetName=&quot;ellipse&quot;>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.1&quot; Value=&quot;1.2&quot;/>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.5&quot; Value=&quot;1&quot;>
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name=&quot;sbRotate&quot;>
	<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(CompositeTransform.Rotation)&quot; Storyboard.TargetName=&quot;ellipse2&quot;>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.1&quot; Value=&quot;23.95&quot;/>
		<EasingDoubleKeyFrame KeyTime=&quot;0:0:0.5&quot; Value=&quot;0&quot;>
			<EasingDoubleKeyFrame.EasingFunction>
				<BounceEase/>
			</EasingDoubleKeyFrame.EasingFunction>
		</EasingDoubleKeyFrame>
	</DoubleAnimationUsingKeyFrames>
</Storyboard>

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

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

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

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

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

        <Ellipse x:Name=&quot;ellipse&quot;
            Tapped=&quot;Ellipse_Tapped_1&quot;
            Fill=&quot;#FFF4F4F5&quot; HorizontalAlignment=&quot;Left&quot; Height=&quot;166&quot; Margin=&quot;221,210,0,0&quot; Stroke=&quot;Black&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;166&quot; RenderTransformOrigin=&quot;0.5,0.5&quot;>
        	<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連発の閲覧アプリのリジェクトの記録 はコメントを受け付けていません