古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

Visual Studio Team Services からストアに自動申請する

Visual Studio Team Services (VSTS) には、プロジェクトの自動ビルドの他に、特定のサービスへのデプロイメントもすることができます。その中でも注目なのは Windows ストアへの自動申請ができることだと思います。ドキュメントを見ていたら、いつのまにか Submission API が用意されていたようです。

msdn.microsoft.com

この記事にあるように、エンドポイントが用意されていて、必ずしも VSTS を利用するということではなく、例えば Jenkins などのサービスを使っても同じことが出来るようになるわけです。
今すぐに利用可能というわけではなく、ちょっと準備が必要だったりします。

今回は UWP アプリケーションの申請をメインに話を進めます。

準備しておくもの

  • 開発者アカウントが必要です。
  • 一度デベロッパーセンターで申請するアプリを追加して下さい。そこで得られるアプリケーションの情報を使用します。
  • Package Flight を利用する場合、まず本申請を通して下さい。本申請したアプリは非公開にする手もあります。
  • Package Flight を利用する場合、ダッシュボード上でパッケージフライトを追加してください。フライト名を使用します。

API の利用申請をする

上記記事の「Important」にあるとおり、原則的には、Developer アカウントすべてで API が使える状態になっている訳では無いので、まず申請が必要です。

This API can only be used for Windows Dev Center accounts that have been given permission to use the API. This permission is being enabled to developer accounts in stages, and not all accounts have this permission enabled at this time. To request earlier access, log on to the Dev Center dashboard, click Feedback at the bottom of the dashboard, select Submission API for the feedback area, and submit your request. You'll receive an email when this permission is enabled for your account.


デベロッパーセンターの右下にちょこっとある「フィードバック」をクリックしてください。

f:id:ChiiAyano:20160925223254p:plain

種類は何でも良いと思います。「当てはまる領域をお選び下さい」の部分は「申請 API」にします。フィードバックの内容は「API使わせて下さい」的なノリの英語を気合いで書きました。
これでOKです。利用可能になった時点でメールが来るはずです*1

Azure AD を取得しておく

申請が通るまでに準備だけしておきましょう。API の使用には Azure Active Directory (Azure AD) を準備しておく必要があります。

https://msdn.microsoft.com/ja-jp/windows/uwp/publish/manage-account-usersmsdn.microsoft.com

登録の仕方はだいたいこの記事に載っています。すみません、ここでは割愛します。登録が完了したら、「Azure AD アプリケーションの追加」をします。

f:id:ChiiAyano:20160925224334p:plain

名前は何でも良いと思います。実際のアプリの名前を入れるのが適当かと思います。
「応答URL」「アプリ ID URI」はひとまず有効な URL を適当に入れておきます*2
「役割」はとりあえず「マネージャー」にでもしておくと良いと思います。

ここでできあがった「テナント ID」「クライアント ID」は VSTS 側で必要となります。
「キー」も必要になります。「新しいキーの追加」をクリックして得られたキーはどこかにメモしておいて下さい。一度しか表示されず、もう一度取得するためには一度削除するか、もう一回キーを追加する必要があります。

VSTS 側の準備をする

実際に申請をする拡張機能をインストールします。実は Microsoft 公式で申請用の拡張機能が用意されています。

marketplace.visualstudio.com

これを利用するのも手ですが、本申請しか現時点では出来ないので、Package Flight 向けに利用したい場合は、今のところサードパーティ拡張機能を利用することになります。

marketplace.visualstudio.com

ただ、2016年9月25日現在、公式側も Package Flight へ申請できるようにするアップデートを予定しているので、待ってみるのも手かもしれません。

github.com

今回は後者の Windows Store Automation を利用して進めます。

インストールしたら、VSTS のプロジェクトから設定を選び、「Services」を選びます。
「New Service Endpoint」を選んだら、「Windows Dev Center」を選択して下さい。

f:id:ChiiAyano:20160925225459p:plain

「Connection Name」はわかりやすい名前をつけます。
「Tenant Id」は先ほどの「テナント ID」を入力します。
「Client Id」は「クライアント ID」を入力します。
API Token」はメモしておいた「キー」を入力します。

ビルド環境を整える

ここで、あらかじめ Visual Studio 側でプロジェクトのストアとの関連づけを進めておき、生成した証明書をリポジトリに含めておいてください。申請パッケージを生成するために必要です。

UWP アプリのパッケージ化


設定から離れ、ビルドの準備が出来ていないようであれば「Build Definitions」に移動します。
「New」をクリックし、テンプレートは UWP であれば「Universal Windows Platform」を選んで下さい。
「Repository」は通常であれば既に選ばれているものを、「Default branch」はビルド対象にしたいブランチ名を選んで下さい。
「Default agent queue」は通常「Hosted」を選ぶと良いでしょう。自前で Agent を生成している場合はそちらを選択することが出来ます。

いろいろとビルドステップが準備されます。
僕の環境ではステップをこのようにしておきました。

f:id:ChiiAyano:20160925230528p:plain

まず「Delete files」でビルド生成物を一度全部削除します。ビルドが積み重なるごとに、前に生成したバイナリまで生成物として含まれてしまうので、このような形にしました。「Source Folder」は「$(Build.BinariesDirectory)」、「Contents」は「*」にしています。
「Update Appx Version」でビルド番号を自動インクリメントしています。「Manifest File」でアプリの appxmanifest を入れ、「Build Id」は「$(BuildId.BuildId)」にしておきます。こうすることで、「1.0.100.0」といったバージョン番号の「100」の部分が自動で置き換わるようになります。
「NuGet Installer」は「Path to solution or packages.config」をソリューションファイルに変更するだけでOKです。
Visual Studio Build」は、「MSBuild Arguments」が既定ではストア申請用のパッケージを生成しないので、「/p:UapAppxPackageBuildMode=StoreUpload」を追記してください。「Configuration」に「$(BuildConfiguration)」を追加しておけば、あとはOKです。必要に応じてパラメーターを設定して下さい。

https://msdn.microsoft.com/en-us/library/ms164311.aspxmsdn.microsoft.com

「Index Sources & Publish Symbols」はそのままでOKです。
「Publish Build Artifacts」は「Path to Publish」を「$(Build.BinariesDirectory)\AppxPackages」にしておけばOKです。

これでビルド環境は整いました。一度ビルドしておくと、この後が楽です。

リリースの準備をする

「Releases」に移動します。
「Create Release Definition」を選択し、テンプレートがいくつか表示されますが「Empty」を選択します。

「Add tasks」をクリックして、「Publish to Windows Store」を「Add」してください。「Close」してポップアップを閉じます。
「Service Endpoint」を、さきほど設定で準備したものにします。プルダウンを開くと、おそらくひとつだけ出てくると思うのでそれです。
「App Id」は申請するアプリケーションの ID です。デベロッパーセンターのダッシュボードから「アプリ管理」->「アプリ ID」に切り替え、「ストア ID」を入力します。
「Flight Name」は本申請の場合は不要です。Package Flight で使用する場合は、その名前を入力します。
「Appxupload」はビルド時に生成した「.appxupload」のパスを設定してください。パス名には「* (アスタリスク)」が使用できます。

これでリリース環境は整いました。

申請を投げてみる

とりあえず申請を投げてみましょう。「Releases」で生成した定義を選び、「Release」から「Create Release」を選びます。
表示されたポップアップで「Artifacts」にある赤いドロップダウンを選択して、申請したいビルドを選び、「Create」をクリックして下さい。これで申請が始まります。
申請中のタスクを開き、「Logs」を選ぶと、現在の進捗を見ることが出来ます。

こんな感じです。API 利用申請をしたばかりですとたぶん 「error: {"code":"Unauthorized","message":"Authorization: Account is not allowed to access this api"}」と言われて失敗すると思います。


これでうまくいけば、あとは良い感じにしていきましょう。ビルド完了後自動的に申請を投げることも出来るようになります。

*1:僕の場合メール来ませんでしたが、申請後10日ほどした時ふと試したら使えるようになっていました

*2:僕はひとまず自分のサイト URL にしました。たぶん大丈夫だと思います

Microsoft.NETCore.UniversalWindowsPlatform をアップデートすると、VSTS でビルドが通らなくなる問題の対策

UWP でアプリを書いているとき、ふと NuGet で Microsoft.NETCore.UniversalWindowsPlatform に更新が来ていたりします。
アップデートする分には問題ないですが、アップデートした状態で Visual Studio Team Services でビルド掛けるとなぜかビルドに失敗します。

2016-08-24T15:52:49.2593806Z System.Net.WebHeaderCollection 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z Microsoft.NETCore.Targets 1.0.2 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Net.WebSockets 4.0.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z Microsoft.Win32.Primitives 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Net.Sockets 4.1.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Text.Encoding.CodePages 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Diagnostics.StackTrace 4.0.2 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Net.WebSockets.Client 4.0.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Net.NameResolution 4.0.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Reactive.Interfaces 3.0.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Reactive.Linq 3.0.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z Microsoft.NETCore.Platforms 1.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2593806Z System.Security.Cryptography.X509Certificates 4.1.0 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.IO.FileSystem.Primitives 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.IO.FileSystem 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.Private.DataContractSerialization 4.1.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.Runtime.Handles 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.Xml.XmlDocument 4.0.1 is not compatible with UAP,Version=v10.0.
2016-08-24T15:52:49.2750080Z System.Reflection.DispatchProxy 4.0.1 is not compatible with UAP,Version=v10.0.

... (中略) ...

2016-08-24T15:52:49.8843904Z ##[debug]rc:1
2016-08-24T15:52:49.8843904Z ##[debug]success:false
2016-08-24T15:52:49.8843904Z ##[debug]Processing: ##vso[task.issue type=error;]Error: C:\agent\externals\nuget\nuget.exe failed with return code: 1
2016-08-24T15:52:49.9000123Z ##[error]Error: C:\agent\externals\nuget\nuget.exe failed with return code: 1
2016-08-24T15:52:49.9000123Z ##[debug]Processing: ##vso[task.issue type=error;]Packages failed to install
2016-08-24T15:52:49.9000123Z ##[error]Packages failed to install
2016-08-24T15:52:49.9000123Z ##[debug]task result: Failed
2016-08-24T15:52:49.9000123Z ##[debug]Processing: ##vso[task.issue type=error;]Return code: 1
2016-08-24T15:52:49.9000123Z ##[error]Return code: 1
2016-08-24T15:52:49.9000123Z ##[debug]Processing: ##vso[task.complete result=Failed;]Return code: 1

みたいな感じでずらずらーっと怒られます。
仕方ないので元のバージョンに戻すのがいいんですが、他の NuGet パッケージによっては依存関係にある場合もあるのでなかなか悩ましい。

もし、ビルドサーバーを自前で立てていて、Agent として登録しているのであれば解決することが出来ます。


この issue が役に立ちました。
github.com

要するに、Agent のパッケージに含まれる NuGet をアップデートして 3.4.4-rtm-final にしてやればいいのです。

C:\agent\externals\nuget> ./nuget update -self

コマンドはこんな感じ。これでアップデートできますので、終わったらビルドしてみましょう。あと、少し前に配布されていた agent のパッケージを使っている場合、いつの間にか Legacy になってるので、これを期に新しいやつ (ちょっと前まで preview だとか beta になってたやつ) に差し替えておくといいと思います。



ちなみに VSTS が用意する Hosted を使っている場合は現時点ではやり方はわかりませんでした。なのでアップデートを待つしかありません。
もしやり方があるのようでしたらご教示いただけると助かります。

ソフトバンクから Windows 10 Mobile 搭載 SoftBank 503LV が発表になったみたいです

唐突ですね。レノボの電話らしいですよ
news.microsoft.com
www.softbank.jp

Continuum for Phone 対応みたいですので、RAM 3GB あって、ROM 32GB は割と普通なのかなと思いつつ、CPU は MSM8952 なので Snapdragon 617 ですね。NuAns NEO や VAIO Phone Biz と同じです。
neo.nuans.jp
vaio.com

対応バンドは FDD-LTE 1/8/(18/26)/19、W-CDMA 1/8、そして AXGP に対応してるとのことで、W10M 初の AXGP 対応デバイスになりそうな予感。

2016年10月下旬以降発売を予定しているみたいです。まだ価格は発表になっておらず、法人向けとのことで、個人でも買えるのかは気になるところ。
法人向けなら指紋認証とか、その辺あるとよかったのかなあと思ったり。法人向けだと逆にダメだったりするのかしら。

NEO User Group Meeting vol.2 に参加してきました

NuAns NEO は持ってないんですが、NuAns NEO 持ちのユーザーがどういう方々なのかなあという思いでふと参加してみました。いわゆる偵察です。

eventon.jp

志木は大学時代に通過駅だったので「あああそこかぁ」みたいなノリでした。


トリニティ社屋は雑居ビルの一角だと思ってたんですが、小さな倉庫のような場所で、こぢんまりとした感じのところでした。ただ中はさすがスタイリッシュなスマートフォンアクセサリを販売する会社だけあって綺麗な感じでした。
NuAns NEO がどういう思いで作られたのか、ODM との調整だとか、いろいろな裏話もあってとても充実した会でした。ケースコンプ勢が少なからずいるのはさすがに正気かと思いましたがw
会場内では即売会みたいな形でアクセサリ類の販売もやってました。さすがに CORE は売ってませんでした。 *1


そしてガジェットの会ではすっかりおなじみとなった端末記念撮影もちゃんとありました。…どうしてこうなるのか


懇親会はトリニティが経営している同じ建物内の「トリニータ」へ。めっちゃイタリアンでした。
tabelog.com


目的は偵察だった訳ですが、結局の所いわゆるガジェッターみたいな人々ばかりだったのでなんともでした(汗
ただ、スマートフォンアクセサリを作る会社がスマートフォンを作ったという意義や挑戦、出荷ギリギリまで頑張っていたことなどを聞くことができたのはとても有意義でした。
トリニティのように最後まで責任を持ってリリースする姿勢を持った会社がいることが、日本で Windows 10 Mobile を普及させていく鍵になるのかなと思ったりしています。 *2 *3
Vol.3 は場所にもよりますが、またぜひ参加したいです。

*1:あったら買え買えと圧力かけられそうだったので助かった

*2:マウスコンピューターも同じ姿勢を感じています

*3:そのほかの会社もそうだと信じています

CoreTweet を使って WebAuthenticationBroker で Twitter 認証する

なんとなくメモ

id:kaorun さんが同じように Twitter 認証する方法を記事にしていますが、2014 年と古いのと、Windows 8.1 時代のネタなので UWP 向けに書き換えてみます*1
d.hatena.ne.jp


UWP になってから、Mobile 版でも AndContinue なメソッドを使って気合いでやるようなことをしなくてもよくなりました。それを踏まえてこんな感じで書いてみました。

using System;
using CoreTweet;
using Windows.Foundation;
using Windows.Security.Authentication.Web;

public class TwitterAuthenticator
{
    const string ConsumerKey = "";
    const string ConsumerSecret = "";

    public async Task<Tokens> AuthenticationAsync()
    {
        var redirectUrl = WebAuthenticationBroker.GetCurrentApplicationCallbackUri();
        var session = await OAuth.AuthorizeAsync(ConsumerKey, ConsumerSecret, redirectUrl.ToString());

        var broker = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, 
            session.AuthorizeUri, redirectUrl);

        if (broker.ResponseStatus == WebAuthenticationStatus.Success)
        {
            var responseUri = new Uri(broker.ResponseData);
            var decoder = new WwwFormUrlDecoder(responseUri.Query);
            var tokens = await session.GetTokensAsync(decoder.GetFirstValueByName("oauth_verifier"));

            return tokens;
        }
        else
        {
            // エラーとか
        }

        return null;
    }
}

だいぶすっきりしました。CoreTweet のチカラ全開っすね
github.com

*1:と言っても、同じ WinRT なのであんまし変わらないですけどね

VAIO S13 を安曇野に里帰りさせました(修理しました)

1ヶ月前に VAIO S13 を購入してちょっとレビューした話を記事にしました。
ayano.hateblo.jp

VAIO S13 凄くいいです。前に持っていた VAIO Pro 11 よりも格段に CPU が違うこと、RAM 16GB の恩恵がものすごく、Visual StudioWindows 10 Mobile エミュレーターを用いた開発がかなり快適でメイン PC として存分に発揮してくれるものと確信しています。*1
VAIO Pro 11 よりもインチアップしたので、キーピッチも広くなり使いやすくなりました。縮こまってキーボードを打たなくなったのでだいぶ楽になりました。
TPM ありにしたので初めて Bitlocker をしてみました。特にパフォーマンスも落ちたと感じることも無く使えています。もしものための安全ということで。


そして、しばらく使ってて、届いて2~3週間したある日のこと。[、] キーに違和感があってよく見たら

f:id:ChiiAyano:20160221181036j:plain
よく見ると浮いてます。中が外れたかしてちゃんとはまらなくなったみたいです。キートップの上のあたりで打つとこうなって、下のあたりを打つと元に戻るような感じでした。
最初は、まあ良いかな…と思っていたのですが、だんだん気になってきたので修理を決断。

SONYVAIO を持っていた頃はサポセンに電話で修理の依頼をしていました*2が、メールフォームからも修理の依頼が出来るようになっていました*3
support.vaio.com

「ご指摘の症状」の箇所には文章での記述の他、その症状が出ている状況を示す画像や動画をアップロード出来るようになっていました。文章で伝えきれないことも伝えられるので凄く便利でした。上記の画像をアップロードして修理を依頼。
翌日には回答があり、修理をしていただけるということで、3月6日に修理に出しました。SONY の頃は日本通運パソコンポを持って引き取りにきていましたが、今回はヤマト急便がパソコン宅急便で引き取りにきました。

その後は修理状況を確認できるページを定期的にポチポチしながら今か今かと待っていましたが、3月11日に無事に発送。12日に受け取ることが出来ました。ここまで VAIO から一度も連絡はありませんでした。状況がわかったら都度伝えてって書いておけば良かったかな…。

f:id:ChiiAyano:20160312104437j:plain
f:id:ChiiAyano:20160312104527j:plain

オカエリナサイ


というわけで、無事キーが浮いた状態も直り、また強力な相棒として活躍してもらおうと思っています。

*1:家ではデスクトップ PC があるので、出先とか別の場所で使うときに VAIO S13 は不便無く使える感じ

*2:VAIO type Z の頃は大変お世話になりました。

*3:確か SONY の頃も末期の頃にあったと記憶しています

企業向け Office 365 をやめて、Office 365 Solo を契約しました

まだ個人向け Office 365 が日本で登場していない頃に、個人でも登録できる企業向け Office 365 Small Business Premium を契約していました。2 年くらい前のことです。常に最新の Office が使えるし、Exchange Online がついてくるのでメールアドレスも作れてありがたかったのですが、企業向け故にいろいろと不満がありました。

  • OneDrive は企業向けで個人向けとは別(個人向けは結構使っていたので、企業向けと併存できずでした)
  • Lync (Skype for Business) で会話する相手が居ない
  • 年間維持費がちょっと高かった

今日が企業向けの更新期限日で、かつ Small Business Premium が使えなくなるタイミングだったので、思い切って Office 365 Solo に切り替えました。
個人向けなので、OneDrive は個人向けに対してストレージボーナスが付与されます。Lync はありませんが Skype で十分。
唯一残念なところは Office のライセンスが企業向けだと 5 PC だったのが 2 PC に減る部分ですが、いろいろ検討した結果 2 台で十分という結論*1に至り、個人向けにシフトしました。
あとはメールアドレスが使えなくなってしまいましたが、それはさくらのメールボックスに移行する形でどうにか対応していく予定です。Outlook.com の独自ドメイン利用が復活する噂があったりなかったりなので、そのタイミングがきたら移れるかな…

ヨドバシやMS公式だと 12,744 円前後ですが、Amazon だとなぜか 11,581 円でした。とはいえ企業向けだと 16,320 円 / 年なので、どちらにせよ明らかなコストダウンになりました。

ちなみに個人向け Office 365 は今キャッシュバックキャンペーンやってるみたいですよ
Office 365 キャッシュバック キャンペーン - マイクロソフト


P.S.
ひとり Lync から離脱します。 > id:kazuakix

*1:そう何台も PC を併用しないですし