tmytのらくがき

個人の日記レベルです

いつの間にかWindowsストアにアプリを提出するAPIが使えるようになってました

Build2016あたりでアナウンスされていた、ストアにアプリを提出するAPIがいつの間にか使えるようになっていたみたいです。と言ってもまだ全員ではないみたい。

このドキュメントの更新日が2016/9/6なので、この時点ではまだFeedbackからAPIつかいたいお!!!!って申告した人に順次APIが利用できるフラグを立てていっているようです。 僕のDevCenterアカウントはこのフラグが有効になっているので、このAPI経由でAristeaの毎日更新チャネルというのを作ってごくごく一部のユーザさんに提供しています。*1

で、Aristeaは今現在VSTSで毎日午前3時から自動ビルドされているのですが、その成果物を自動でDevCenterになげたいですよね。っていうわけで作ったのがこれです。

Azure ADを設定したりうんぬんいろいろすると使えます、がいつのまにか公式でVSTS対応のアドオンがリリースされていたのがこちら。

このアドオンにいま勝てるところといえば、Package Flightに提出できます!!ってところだけです。しかしここも

まもなく実装されるようです。もうなんだか早くもいらない子です。

一応インストールの仕方だけ書いておきます。インストールにはnodeが必要ですが、お手元のWindows 10 AUBash on WindowsでもOKです。

; nodeない人むけ
$ git clone https://github.com/isaacs/nave.git
$ cd nave
$ ./nave use latest
$ cd ..
; ここからインストール
$ git clone https://github.com/tmyt/wspublish-task.git
$ cd wspublish-task
$ npm install
$ npm run tfx-upload

*1:ご希望あればTwitterあたりでご連絡くださいませ

14393で使えるようになったトースト通知の新機能

Anniversaty Update(Build.14393)でAdaptive Toastにいくつか新機能が提供されているようです。

いままでの機能に加え、

  • タイルと同じようにレイアウトの自由度が上がった
  • Heroイメージを設定できるようになった
  • 設定できるテキストの位置が増えた
  • コンテキストメニューが拡張された

という具合です。あいかわらずNotificationチームはBlogでのみ情報提供な感じなんですかね…

TBook10の下半身を注文した

Teclastって中国メーカのTBook10ってタブレットがあって、Surface Bookみたいに2-in-1な感じでドックできる専用キーボードがあるんです。けどこれ、なんか不具合があったとかなんとかで発売が延期されてて海外のショップで在庫ある!っていって、問い合わせたらやっぱりないです。みたいなところばっかりでいったい本当にあるんだろうか…と思っていたんですが

日本で買えるところがあったので注文しました!8/22 2:00現在すでに在庫切れになってますが、前も在庫なしだったのでもしかするとそのうち復活するのかも。一応日本のサイトだからちゃんと在庫もってるはず……

Aristeaのフィルタ式のところだけをライブラリにしました

Aristeaで使えるフィルタ式のパーサとかとかそのへんをライブラリにまとめなおしました。Freesiaといいます。

ごくごく一部のテスタのみなさまにはFreesia版でじっくりテストを進めているところです。ですので、現時点でストアに公開されているやつはまだFreesia版ではないです。 Freesiaが導入されると、フィルタ式にLambda式とLinq likeなメソッド呼び出しがサポートされるようになります。つまり、次のようなフィルタが書けるようになります。

// 動画を含むツイートだけをとりだし
extended_entities.media.any(x => x.type == 'video')

いままでだと、配列にたいするcontainsしか処理できなかったんですけど、これでLINQ的なのが呼べるので柔軟さがかなりあがりました。 たぶん、そのうちリリースするとおもいます。

ExtendedExecutionSessionでサスペンド延長中にリジュームしたときちゃんと面倒みないと運が悪いとアプリが死ぬ話

UWPでOnSuspendingでファイルを保存するとかどうしても長いことかかることをしたいときにExtendedExecutionSessionというのでサスペンド時間を延長できます。結構便利なので頭の隅に置いておくといいと思います。

で、表題の件ですが、ExtendedExecutionSessionでサスペンド時間を延長して、その中でながーーーい処理をしているときにアプリがリジュームしてきて、さらにExtendedExecutionSessionのRevokedイベントで何もせず、ずっと長い処理を実行し続けて15秒ぐらい経過するとOnResumeに失敗してアプリが死にます。

ちゃんとまとめます。

  • ExtendedExecutionSessionを使ってる
  • OnSuspendで長いことかかるかもしれないことをやってる
  • ExtendedExecutionSession.RevokedとかこないでしょHAHAHAとか思ってる

なぜなのか

GetDeferralしてからCompleteするまではOnResumeの実行がブロックされる。ようです。まぁいわれてみればその通りなんですが…。

どーすんの

OnResumeが来たときExtendedExecutionSessionのRevokedイベントが呼ばれます。なのでちゃんとOnResumeは検出できるわけです。 つまり、ここでいったんdeferralを終了してあげるとブロックされていたResume処理が実行されるのでアプリがりじゅーむできずに死ぬことはなくなります。が、サスペンド処理は適当にいい感じにする必要はあります。

こんなん

とりあえずこういう感じで実装してそれなりに動いているようですが、これでいいのかよ感はあります。

var completed = false;

extendedSession = new ExtendedExecutionSession();
extendedSession.Reason = ExtendedExecutionReason.SavingData;
extendedSession.Revoked = (o, args) =>
{
    lock (this)
    {
        if (completed) return;
        completed = true;
    }
    deferral.Complete();
    extendedSession?.Dispose();
    extendedSession = null;
});