カテゴリー別アーカイブ: WindowsRT

Windows 10 for mobile ?

Windows10でさらに統合が進むのか?

今月21日(PST)、日本では22日深夜ですが、Windows10に関するMicrosoft社のイベントが開催されるそうです。
そうなると注目したのはWindowsPhoneに関する情報がということになるのですが、タイトルに書いていますが「Windows 10 for mobile」とOS名は変わる可能性があるようです。

自分は、WindowsPhoneという名称はそのまま使われるんではないかと予想はしています、変わるのはOS名称だけかなと。

さて、Windows10は「Windows Insider Program」というテストプログラムが用意され、一般ユーザーもテスト環境を構築して、Microsoftへの要望などを行えるようになっています。
このプログラムのWindowsPhone版ともいうべきプログラムが開始されるようで、WindowsPhoneストアに「Phone Insider」という公式アプリが公開されました。

現在はロックがかかっているようなので、インストールしても使用はできません。

a17456e7-8840-49e9-baad-d621b08b96c1

be4186ca-e744-454e-8711-4350bcca16e0

c610d20d-1206-4956-8fb0-16377a67de73

WindowsPhone 10?って?

Windowsとの統合がさらに進むということは伝えられていますが、統合が進むのは「WinRT API」で、WindowsストアアプリのAPIの共通化が進むようです。
もちろん、Phone(電話)向けのAPIがさらに進化する、または整頓されて使いやすくなっていくのではないでしょうか?

Windows8/8.1で搭載されたWindowsストアアプリとの互換性が上がり、WindowsPhoneアプリとの統合が進み、ほぼワンソース(現在もかなり近い状態ですが)でアプリストアも一か所にまとめられるのではないかといわれています。

勘違いしてほしくはないのですが、Windowsのデスクトップで使用する通常のWindowsアプリがPhoneで使えるわけではないです。
MacのアプリがiPhoneで使えないのと一緒ですね。

さて、この発表で日本でのWindowsPhoneに関することは出なさそうな気はしていますが、新しいOS、開発環境に関しては開発者としてワクワクしますね。

どのような発表が行われるか、楽しみです。

16進カラーコードをColorに変換する

WindowsPhone SilverLight 8.1(以下WPSL8.1)で「Brush」へカラーを設定するときがよくあります。
その際に下記のような形でコード上では設定すると思います。

Brush _brushColor = new SolidColorBrush(Colors.RED);
Brush _brushColor2 = new SolidColorBrush(Color.Color.FromArgb(255,255,0,0));

これで設定していると、HTMLでよくある「#FFFF0000」のような設定ができないことが、不満に感じる時があると思います。
そこで、変換コードを書いてみました。

        /// <summary>
        /// ARGB16進カラーcodeをColorに変換する
        /// </summary>
        /// <param name="colorCode">#00000000</param>
        /// <returns></returns>
        public static Color GetArbgColor(string colorCode)
        {
            try
            {
                // #で始まっているか
                var index = colorCode.IndexOf("#", StringComparison.Ordinal);
                // 文字数の確認と#がおかしな位置にいないか
                if (colorCode.Length != 9 || index != 0)
                {
                    // 例外を投げる
                    throw new ArgumentOutOfRangeException();
                }

                // 分解する
                var alpha = Convert.ToByte(Convert.ToInt32(colorCode.Substring(1, 2), 16));
                var red = Convert.ToByte(Convert.ToInt32(colorCode.Substring(3, 2), 16));
                var green = Convert.ToByte(Convert.ToInt32(colorCode.Substring(5, 2), 16));
                var blue = Convert.ToByte(Convert.ToInt32(colorCode.Substring(7, 2), 16));

                return Color.FromArgb(alpha, red, green, blue);
            }
            catch (ArgumentOutOfRangeException)
            {
                throw new ArgumentOutOfRangeException("GetArbgColor : colorCode OutOfRange");
            }
            catch (ArgumentNullException)
            {
                throw new ArgumentOutOfRangeException("GetArbgColor : \"#\" not found");
            }
            catch (AggregateException)
            {
                throw new ArgumentOutOfRangeException("GetArbgColor : \"#\" not found");
            }
        }

あまりきれいなコードとは言えませんが、上記コードで16進数カラーコードをColorで返すことができます。

Brush _brushColor = new SolidColorBrush(GetArbgColor("#FFFF0000"));

このように書けるので、HTMLで使いたいカラーを引っ張ってきたときには便利ではないかと思います。

今回のコードはWPSL8.1向けとしていますが、WPSL8.0でもWindows Runtimeでもそのまま使えるはずです。

de:code 2014 day2 #decode14

さてさて、二日目です。

・Kinect update 2014 ~テクノロジの進化~
 新Kinectの話題、いろいろできそうだなー
 新型はWindows8以降対応の予定、Core i7以上、DirectX11(GPU使っているため)、メモリ4GB以上など少々負荷が高め
 新型はサービス動作なので複数アプリから動作可能
 旧型は複数台可能、旧型+新型も可能、新型の複数台は未定

・WindowsPhone8.1アプリ開発徹底解説
 WinRTJSが投入された。
 APIは90%共有しているから、ほぼそのままWin8.1のコードが流用可能。
 WP8.1はSilverLight(以下SL)8.1を搭載しており、これまでのWP7のSL、XNA、WP8でのSL8.0、DirectX、WinRTのAPIが使用可能
 開発の際はSL8.1をベースにするとWinRTも使えるので、非常に強力な開発が可能。
 端末固有の機能はSL8.1でしかアクセスできないものがある(カメラなど)のでそういう意味でも、SL8.1をベースにするのが良いのではないか?
 バックグラウンド音楽再生機能などの一部機能がSL8.1では未実装だが、早いうちに更新されるのではないか?

・Internet of ThingsをWindowsプラットフォームで実践~センサークラウド、M2M、Big data、つないで、連携して、溜めて、活用~
 BTLE Gatt protocol等つなぐためのプロトコルにいろいろ対応
 今後マイクロソフトがIoT向けのサービス、エージェントを直接提供する
 6月にIoTイベント「Microsoft IoT Summit 2014」を開催
 「.Net Micro Framework」は「FEZ」というボードが対応している
 「FEZ」は「TINYCLR社」の商品で日本では「株式会社デバイスドライバーズ」が取り扱っている
 ※VS2012までの対応なので、現在のところはVS2013は非対応

・ユニバーサルWindowsアプリの画面設計~4インチから82インチまで~
 高DPI、画面の解像度、モニタのサイズが非常に幅広い
 30cm前の4インチと3メートル先の40インチは同じサイズに見える
 縦長への対応どうする?
 そして正方形の画面になる場合が存在するがどうする?
 横前提なら、縦長への対応をすっぱり割り切って横表示だけにする、横表示で狭いなら広げて使ってもらうように促す画面を表示する
 ゲームなどの場合メインの「表示/プレイエリア」を正方形で作ってしまい、周辺のUIをサイズに合わせて移動させるのもあり(例としてアナ雪のパズルアプリ)
 解像度ごとの対応はscaleで複数用意することができて自動的に変更してくれるが、一枚で済ませたいのなら、(必要なサイズの)400%サイズの画像を用意して配置する。

・de:code参加者に捧げる最新Microsoftデモ・プレゼンの極意
 短時間ではあったものの、スピーチテクニック、デモテクニックについて濃い内容でした
 自分もこうできるように訓練しよう
 西脇さんは本を出されているのでリンクを置いておきます。
 Kindle版もあるよ

二日間にわたって参加してきましたが、非常に濃い技術漬けの二日間でした。
ただ、どちらかといえば導入向けのセッションがDeviceセッションでは多かったかもしれません。

今後順次ビデオなどがMicrosoft Virtual Academy等で公開されるそうです

参加者の皆様、関係者の皆様、お疲れさまでした。

“.AsStream”拡張

よく見失うのでメモがてら

「System.Runtime.InteropServices.WindowsRuntime」を「using」する。

一発でわかるってのは少ないような気がするんだが、引っかかってる人が見当たらないってことは、自分の勉強不足だね orz

忘れてなければどうということはないことではあるんだけどね

//Publish/ ハッカソンに参加していました

2014/05/17-18の二日間にわたって、//Publish/ハッカソンに参加してきました。
//Publish/ハッカソンは全世界で行われており、早いところは金曜~土曜で行われていたため、日本は二番手くらいの開始で行われました。

ハッカソンでは、ExpertとしてMVP/MSPの方々がイベント補佐でアプリを製作しながらいろいろなセッションなどを行っていました。

ハッカソンは徹夜、泊まり込みで作成していいようにイベントスペースで行われていましたが、自分は夜はいったん帰宅して部屋で調べ物など行い、就寝して翌朝再度イベントに向かいました。

当初予定していた、WinストアアプリとWPアプリ間のWi-fi Direct接続するアプリというネタをいろいろ検証しながら仕込んでいたのですが、ハッカソンで相談などした結果、現状できないのではないかというところになり、ネタを変更しました。

最終的に選択した画像をゲーム風ステータス表示するというどこかでありそうなネタにしました。
Win/WPのuniversal Project Appsで作成してWP版はハッカソン中に承認が降りて掲載されています。
Win版は現在申請中です。

そしてWP版なんですが、Releaseモードでのデバッグや最終的なスクリーンショット生成時は動いていたのですが、発表時にはうまく動かないという状況になりました(汗

なんとか原因を調べて安定させたものを再申請しようとは考えております。

二日間、ハッカソンに参加された皆様、運営の関わった皆様、会場提供の会社様、ありがとうございました。
そして、お疲れ様でした。

Action<in T>のメモ

Action<in T>はdelegateで単一パラメーターの戻り値を持たないカプセルメソッド

public class Hoge : IDisposable
{
        Action<string> _hogehoge;

        public Hoge(Action<string> HOGEHOGE= null)
        {
                _hogehoge = HOGEHOGE;
        }

        void HogeHoge(string message)
        {
            if (_hogehoge != null)
            {
                _hogehoge(message);
            }
        }
}

上記のように宣言しておく

public class Main
{
        Hoge HOGE;

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            HOGE= new Hoge(async (m) => await Dispatcher.RunIdleAsync((o) => Statustext.Text = m));
        }
}

こんな感じで宣言しておけば、class HogeでHogeHogeにテキストを投げて表示Pageに表示することができます。

Dispatcher.RunIdleAsyncなので、コントロールに限らず定義可能なので使い道は多いと思う。

今回はクラス内のStatusを追いかけるのにstringを宣言してますけど、<T>なので他も可能です。

Windowsストアアプリのアプリ内課金メモ

基本的な方法はMSのエヴァンジェリスト田中達彦さんが「Windowsストア アプリ 作り方解説 Line Attack編 第8回 ~アプリ内購入(アプリ内課金) ~」で書かれています。

Windows8.1では「RequestProductPurchaseAsync(string,bool)」は古い方法なので書き換えるようにと指示が出ます。(エラーや警告にはならない)

自分はこんな感じに書き替えを行いました。

#if DEBUG
            // 課金テスト用
            // C:\Users\使用しているPCのアカウント\AppData\Local\Packages\アプリのID\LocalState\Microsoft\Windows Store\ApiData
            // WindowsStoreProxy.xml
            // <Product ProductId="1" LicenseDuration="0" ProductType="Durable"> ProductIdを使用しているlicense名に書き換える
            //  <LicenseInformation>
            // <Product ProductId="1"> // ProductIdを使用しているlicense名に書き換える
            // <IsActive>true</IsActive> // true 購入済み false 未購入 テストに合わせて書き換える
            //  </Product>
            //  </LicenseInformation>

            ListingInformation listing = await CurrentAppSimulator.LoadListingInformationAsync();
#else
            ListingInformation listing = await CurrentApp.LoadListingInformationAsync();
#endif

            ProductListing paidAddMode = listing.ProductListings[licenseName01];

            MessageDialog msgBox = new MessageDialog(AppStringsClass.StringPurchase + paidAddMode.FormattedPrice);

            await msgBox.ShowAsync();

            try
            {
#if DEBUG
                PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(licenseName01);
#else
                PurchaseResults purchaseResults = await CurrentApp.RequestProductPurchaseAsync(licenseName01);
#endif

                switch(purchaseResults.Status)
                {
                        // 購入
                    case ProductPurchaseStatus.Succeeded:
                        msgBox.Content = AppStringsClass.StringThankYou;
                        await msgBox.ShowAsync();
                        break;

                        // 未購入、又は何かしらのエラー
                    case ProductPurchaseStatus.NotPurchased:
                        break;

                        // 前回購入が未完了
                    case ProductPurchaseStatus.NotFulfilled:
                        break;
                }

#if DEBUG
                // 購入完了のdummy
                msgBox.Content = AppStringsClass.StringThankYou;
                await msgBox.ShowAsync();
#else
                // 実際に購入されているかの二重チェック
                if (LicenseInfo.ProductLicenses[licenseName01].IsActive)
                {
                    // purchased
                    msgBox.Content = AppStringsClass.StringThankYou;
                    await msgBox.ShowAsync();
                }
                else
                {
                    return;
                }
#endif
            }

UniversalAppsでWP8.1も同じコードが使えるようになっているのではないかと思うものの、現時点では未検証
今後確認したら記載する

見かけた面白そうなコントロール

Silverlight Cover Flow
某プレイヤーぽいあれな表示用コントロールですね
ベータではあるもののライセンスが「Ms-PL」でソースコードが公開されているので勉強にもなると思います。