窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

Visual Studio for Mac d15-5 で気になった機能など

本日Visual Studio for Mac (7.3.0.797)がリリースされました.

www.visualstudio.com

英語でのリリースノートが既に公開されているので,ここでは自分が気になった機能を紹介いたします.

1. iOS Automatic iOS Signing

今まではiOSのアプリを作成して,実機に流し込む際様々な署名ファイルが必要になったり,Appleのアカウントページで設定する必要がありました. しかしこれをいい感じに自動化してくれる機能となっています.

詳しい設定方法についてはXamarinの公式ドキュメントをご覧ください. と言ってもアカウントの設定をしてチェックボックスを入れるだけという非常にシンプルなものとなっています.

fastlaneが無いよ!と言われたらIntroduction to fastlane for iOSを参考にして導入してください.

Alpha Previewで常に運用していたのでいつからあったかとかもう覚えていないのですが,いつからありましたっけこの機能

いわゆる0円運用の状態では使えないですが,Developer登録をしていて色んなアプリを実機でテストしてみたいという方には非常に便利な機能かと思います.

2. iOS Designer

いわゆるStoryboardとかの編集画面の改善です. Bottom Toolbarの採用により,最近のXcodeと同じようなUIになりました. Constraintsも前に比べて自分はわかりやすくなったなーと感じます.

3. Android関係

今まで気にしてなかったのですが,必要なSDKパッケージが無かった時,こんな感じで部分ダウンロードがされるみたいになったようです.

4. Xamarin Live Player

これこれこれこれ!!!

Android EmulatorとiOS Simulatorをサポートするようになりました. フォームをちゃちゃっと確認したい,変更をかけてどんなもんかを確認したいという際には非常に便利になったかと思います.

しかし気になったのが既に展開してあるiOS Simulatorではなくて,Visual Studio for Mac側から作成した新規のiOS Simulatorに展開されてしまうということ. うーん,同じ端末サイズのをいくつも作りたくないんだけどなー

5. その他

どうもリファクタリングなどに使用されるCode Analyzer的なのがRoslynバックエンドになったようです. Alpha版ではRoslynバックエンドにしたとたんjsonファイルが開けなくなったりというバグが生じましたが,本Stableリリースではそういうこともなくという感じでいい感じです.

また今までのStableだとnetstandardなXamarin.Formsアプリケーションを開発していた場合xamlファイルとxaml.csファイルがいい感じにネストしてくれないと言った不具合もありましたが,このリリースで改善されています.

と様々な機能追加およびバグ修正がなされたd15-5のリリースの自分が気になった点のサマリでした. お早目のアップデートを!

XamarinとApp Centerで実際に自分が試してみての所感

Xamarin その1 Advent Calendar 2017 - Qiita の4日目のエントリー(ポエム)です(ギリギリですみません)

3日目はくぅ君の

アプリ開発をサポートする App Center とは! Xamarin とも連携してくれるよ! - くうと徒然なるままに

でした. 使ってみたいなぁとは思ってはいたけれども使っていなかったDistribute機能やフリー枠のBuildのことが記載されています.

あと

実際に使ってどうだったのかは明日のやまちゅうさんの記事を楽しみにしてください。

ひぇーっ

はじめに

さて前回投稿した

teitoku-window.hatenablog.com

これの補足...記事という感じのスタンスでお話します.

まだ読んでない方向けに簡単に説明すると

  • 学祭アプリをXamarinで開発してApp Centerと連携してみた
  • App CenterのAnalyticsでアンケートを取ってみた

みたいなことをちょろっと書いていました.

ここでは実際にアプリはどんな感じで作ったのか,またApp Centerを使う上で自分が感じたことを例を交えてご紹介します.

学祭アプリについて

完成品および関連リポジトリへのリンク

東北大学祭2017を App Store で

69th東北大学祭 - Google Play の Android アプリ

github.com

ひとまず参考リンクを...以上2つが実際にリリースされたもの,加えてGitHubリポジトリです.

求められたこと

本アプリケーションは東北大学大学祭の運営委員の方から依頼されたアプリケーションでした. 本アプリケーション,およびソースコードに求められたことがいくつかあり,一部書き出してみると

  • 初回起動時にユーザー属性を取れるようなアンケートを行いたい
  • 直前になってデータベースを変更する場合があるため,柔軟に変更が可能,また即座に反映できる方が好ましい
  • 来年度も流用する可能性があるため,そこそこ新しめの環境でうごくもの

みたいなことが挙がりました. 今回はApp Centerと開発よりの話をするため1つ目と3つ目を紹介します. 2つ目は結論から言うとRealm Object Serverを使った,ということなのですが,それに関しては今後詰まってしまったポイントと一緒に他の記事にしようかなと考えています(コンパイルが通らないとかdynamic型に一回キャストしてからとかそういう感じのこと).

実際の開発での対応

まず3つ目の新しめという点です.

これに関しては数ヶ月ほど前に対応になった.NETStandard,その中でも2系で作っておけば問題ないと考えました. 実際の対応についてはこのコミットが始点になると思います.

Update netstandard2.0 · yamachu/TonpeiFes2017@30ce227 · GitHub

解説記事はこちら

.NETStandardに準拠して作ってみてよかったなと感じたこと,またこういうケースで美味しいだろうなと思った点としては,もしも作成したモバイルアプリケーションと通信するサーバーアプリケーションを作ることになった時にDataObjects周りや一部ロジックが共通化し易いことかなと思いました. 当初ASP.NET Coreでサーバーサイドアプリケーションを作成し共通のモデルのプロジェクトを参照しようと考えていたため,この選択は良かったと思いました.

今からまたXamarin.Formsでアプリケーションを作るのであれば,迷うことなくこの選択をすると思います.

次に1つ目のアンケートの点です.

先ほど

当初ASP.NET Coreでサーバーサイドアプリケーションを作成し共通のモデルのプロジェクトを参照しようと考えていた

という風にお話しました. 実際に行ったかというとこれはNOです. というのも

  • モバイルの実装及び検証の時間が非常にかかってしまいサーバーサイドを考える時間が一切取れなかった
  • アンケート1つのためにAPI実装してサーバーサイドのアプリ作ってホストするのがアホらしかった

ということがあったためです. それではどうしたかと言うと,App CenterのAnalytics機能,その中でもCustom Eventsを使いました.

App Center Analytics | Microsoft Docs

Custom Events機能はドキュメントを見ると

Examples of events and properties are:
* Event Name: "File Upload", Event properties: ".PDF", ".txt", ".PNG".
* Event Name: "Question answered", Event properties: "Accept", "Decline", "Ignore".

みたいな感じですよとあります. もう,アンケートにも使ってくださいと言わんばかりの例ですね!

ということでこんな風にすることでアンケートを取ることが出来ます.

TonpeiFes2017/AnalyticsService.cs at master · yamachu/TonpeiFes2017 · GitHub

これで自分でアンケート用のAPIサーバーを立てなくてもApp CenterのAnalytics機能を使うことでアンケートを取ることが可能になりました.

しかしAnalytics機能のCustom Eventも万能ではありません. 上記の例では1つのイベントに対して5つのユーザー属性を付与してアンケートというふうに扱いました. 今回はこれで問題なかったのですが,更に多くのプロパティを付与しようとすると少し工夫が必要となります.

Limitsの欄を見てみると

The maximum number of event properties that can be defined per event is five. If more than five properties are sent, they are automatically rejected.
The portal will show up the ten property values with highest count.

ギリギリですね...5個以上のプロパティをもたせると弾かれてしまうようです. またその下のshow up the ten property ...という風に,一つの要素に多くの値を持たせてみると上位10件しか取ることが出来ません.

始めこの制限を知らずに使っていてOthersという値にまとめられて何事!と冷や汗をかきました. 詳細にアンケートなどをとりたい場合は他の手段を考えることが必要だろうなと感じました.

ドキュメントを,ちゃんと見ましょうね!

App Centerを使って感じたこと

ここからはちょっとだけApp Centerを使ってみて感じたことを.

まず何よりも導入が非常に簡単でつまづきポイントが無かったことが非常に好印象でした. NuGetで入れて,Appクラスとかで

AppCenter.Start($"android={MOBILE_CENTER_ANDROID_API_KEY};ios={MOBILE_CENTER_IOS_API_KEY}",
                   typeof(Analytics), typeof(Crashes));

こんなのを書くだけで使うことが出来ます. 同じようなサービスはいくつか他のところからも提供されていますが,設定ファイルを落としてきてContentのタイプを変えて,ビルドタイプを変える時設定の変更は〜などなかなかに面倒な部分があることもあるので,非常に直感的だなと思いました.

また上記のコードにも含まれていますが,Crashの監視もApp Centerで行うことが出来ます. 本番環境で自分の想定していなかった使われ方,また端末のバージョンなど様々な環境のものが飛んで来るので非常に楽しいです. このCrash監視機能で実際に修正版をリリースできたため,とりあえずこれから作るアプリケーションにも入れておいたほうがいい気がします.

さいごに

お気持ち書いただけで技術的なことが含まれてない...っ!圧倒的ポエム...っ!! 書き始めの時間が遅くて文章壊れちゃってますが,雰囲気で,雰囲気で読み取ってくだされば幸いです.

本当にこの記事で伝えたかったことはシンプルで

  • App Center便利だし使ってみて
    • Limitsがちょい厳しめな感じあるのでちょっと注意
  • 今からXamarin.Formsでアプリ作るなら.NETStandard2.0で

ってことだけです.ねっ,簡単でしょ?

今度はPush通知やテスターさんへのDistribute機能などを使ってどんな感じか確かめてみたいものです.

また近日中に今回のアプリの設計にあたって非常に参考になった記事などをご紹介いたします.

次回は

さて5日目は @muak_xさんのCustom Cell関係のお話です.

ハイパフォーマンスなListViewにしたいときや,凝ったCellを作ってみたい時には避けて通れないNative Cell,非常に楽しみです.

Xamarin.Forms 2.5.0 Service Release 3がリリースされました(NuGet未反映)

Release 2.5.0 Service Release 3 · xamarin/Xamarin.Forms · GitHub

GroupedなListViewの要素がEmptyなGroupがバインドされている状態で,その後に1つ以上の要素を持ったGroupをコンテキストに加えるとクラッシュする問題が解消されているようです. またこれもiOSのListViewの問題であります.

実際学祭アプリでもこれに類する問題に直面して大変でした...

ASP.NET Core MVC + Razor Pages環境下でajaxでバイナリのフォームをPOSTしたりする時に行ったこと

備忘録です.

現在研究の一環で音声を使ったWebアプリケーションの開発を行っています. プロトタイプとしてASP.NET Coreを使って音声信号処理をC# 側で,その他のインタフェースをHTML5側で行うような構成をとっています.

今後もASP.NET Coreで運用し続けるのであれば,アクションなどをButtonにバインドしたり,またModelを定義していい感じにシリアライズとか出来るようにするのですが, WebAssemblyの導入も検討しているため,どっちにもすぐに変えやすい,すなわちRazor記法などを一切使わず,APIのみをASP.NET Core側が提供するといった形が望ましいです.

この用件を満たために行ったことを以降で説明します.

PageModelのMethod(Action)を呼び出せるようにする

ASP.NET Core MVCなどは完全な初心者だったため,命名規則など全くわかりませんでした. ドキュメントを眺めてみると,どうもPOSTだったらOnPost~とかそういう名前にすれば良いようです(ページURL忘れた).

ということでこんな感じになります.

public ActionResult OnPostGetUserMcep() // PostなのにGetとは...
{
    return null; // Fix Me
}

PageModelにこの様に実装すれば,例えばこのページが/Hogeでアクセスできるのであれば, /Hoge?handler=GetUserMcepに対してPOSTメソッドでアクセスすればこのActionが実行されることになります.

それでは実際に試してみましょう.

...

えぇ...Bad Request...

さて困りました.問題があるようには見えないのですが,どうもだめっぽいです. それでASP.NET Core Ajax Razor Pagesとかで検索してみると,こんな記事が見つかります.

www.talkingdotnet.com

このページを読むとCSRF関係の対策のやつ関係っぽいことがわかります.

このページを参考にTokenを発行してあげて,リクエストに突っ込んであげると無事にPOSTが通りました.

以下サンプルのfetchリクエス

return fetch('/Hoge?handler=GetUserMcep',
      {
        method:"POST",
        body: obj,
        headers: {
            "XSRF-TOKEN": document.querySelector('input[name="__RequestVerificationToken"][type="hidden"]').value
        },
        credentials: 'include'
      });

Request Bodyからバイナリデータを受けとる

デバッガで眺めてたら取れそうだったのでこんな感じで受け取ります.

byte[] tmp;

using (var st = new MemoryStream())
{
    await Request.Body.CopyToAsync(st);
    st.Position = 0;

    tmp = st.ToArray();
}

これだけ. FetchでFileObjectを投げたり,バイナリデータを投げた場合はこんな感じで取るといいと思います.

multipart/form-data なRequestからバイナリデータを受け取る

Fetchでwavファイルを投げた時,そのまま受け取りたくなったので以下のようにして受け取りました.

byte[] wavFile;
var wavform = Request.Form.Files?.FirstOrDefault(v => v.Name == "wavform");

if (wavform != null)
{
    using (var st = new MemoryStream())
    {
        await wavform.CopyToAsync(st);
        st.Seek(0, SeekOrigin.Begin);
        wavFile = new byte[st.Length];
        await st.ReadAsync(wavFile, 0, wavFile.Length);
    }
}

Request.From.Filesからは,FileObjectとして投げられたものを受け取れるので非常に簡単でいいですね.

File以外にもTypedArrayとかを投げることもあるので,そのやり方を確認してみましょう.

var targetArr = Request.Form.FirstOrDefault(v => v.Name == "arr").Value[0].Split(',').Select<string, float>(float.Parse).ToArray();

...たぶんJSONとかでいい感じにやったほうがいい気がするんですけどよくわからないです.

とりあえず自分の目的としていることはこんな感じで実現ができそうでした.

バイナリデータをHTML5(クライアント)側に返す

C# で加工した音声ファイル(float型)のものをクライアント側に返して再生をしたり描画をするためにどうやって返すかを確認してみました.

これは非常に簡単でFileとしてbyteArrayを投げつければいいようです.

var byteArr = new byte[myData.Length * 4];
Buffer.BlockCopy(myData, 0, byteArr, 0, myData.Length * 4); // float32で返すので,4byte

return File(byteMcep, "application/octet-stream");

まとめ

  • Action名はOn{Method名}{Action名}
  • FileObjectやTypedArrayなどを単体で送った際はRequest.BodyをbyteArrayにコピーして使う
  • multipart/form-dataなものにTypedArrayを送った際はRequest.Formから,FileObjectであればRequest.Filesから引っ張ってくる
  • Binaryを返す場合はActionResultにFileを使って,octet-streamとかで返す

お気持ち

TypedArrayをFormで送るとシリアライズされてくっそ長い文字列になるから非常に辛い.

これとWebDNNを組み合わせて使っているのですが,なかなか楽しい感じある.

仙台IT文化祭でMobile Center(現App Center)について発表してきました

2017年10月28日,29日に開催された仙台IT文化祭でMobile Center(現App Center)について発表してきました.

2017.sendaiitfes.org

タイムスケジュールを見ると私の名前は一切ありません. さて,どういうことか.こういうことです.

はい,前日の深夜に決まりました.

ということでちょまどさんのセッション内で10分程度の時間をいただいて発表することになりました. ちょまどさんのセッションはMobile Centerが一体どういうものか,どういう機能があるかといったものを説明するものでした. 自分もそこそこ使っているつもりではいたのですが,テスト関係の内容だったりは全く使っていなかったこともあり非常に興味深い内容だったと記憶しています.

で,自分の発表内容ですが,作成していた学祭アプリでMobile Centerを導入した結果Analytics機能を利用したことによりアンケートなどの集計サーバーを必要としないサーバーレスなアプリケーションが実現できたこと,またそれにより詳細なユーザーのセグメントが取得できた,そしてMobile CenterだけでなくAzure CDNやBlobも利用することによりで画像の高速な配信が可能になったことについて発表しました.

使用したスライドですがわけありで現在公開できないので,実際に作成した学祭アプリに関しての記事でそのことにも触れて紹介したいと思います.

ちなみに学祭アプリは

東北大学祭2017を App Store で

69th東北大学祭 - Google Play の Android アプリ

こんな感じでリリースされていて

github.com

またこんな感じでソースも公開しています.

.NETStandard2.0で作成されたXamarin.Formsアプリで,リポジトリパターンやユースケースに分けて作ってあるので,今後何かのカタログ情報を表示するようなアプリのいい感じのテンプレートになるんじゃないかと思っているので,ぜひともソースを見てみていただければと思います.

さて,いつ学祭アプリの話を書こうかしら...

XamarinなどのPCLプロジェクトにSystem.Reactiveを導入しようとすると失敗することへの対策

はじめに

今日Twitter

System.Reactive を PCL に追加するとエラーになる

といった内容のツイートを見かけました. 自分は過去に普通に導入できていたので何が違うんだろうなぁということで少し検証してみました.

検証環境

  • macOSX
  • PCL 4.5 - Profile 111 (Visual Studio for MacでPCLのプロジェクトを作ると作られるデフォルトのやつです)
  • System.Reactive 3.1.1 (現時点でのStable)

検証

とりあえず実際にSystem.Reactiveを導入してみましょう. するとインストールに失敗するはずです.まあ何かに失敗したらログを見ればいい解決手段が載っているはずですね. ということで少し眺めてみると

Could not install package 'System.Runtime.InteropServices.RuntimeInformation 4.0.0'. You are trying to install this package into a project that targets '.NETPortable,Version=v4.5,Profile=Profile111', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author.

みたいなエラーが出ていると思います.これがSystem.Reactiveが導入できなかった根本原因と考えても良さそうです.

それであれば System.Runtime.InteropServices.RuntimeInformation 4.0.0 ではない,もうすこし上のバージョンではどうかと考えるのが基本的な考え方です. 実際にNuGetのサイトをアクセスしてみると

www.nuget.org

Stableで4.3.0が出ています.

依存ライブラリを比較してみるとバージョンアップの他,今回PCLのプロジェクトに影響しそうな部分で

Microsoft.NETCore.Platformsのバージョンが.NETCore 5.0の部分では1.1.0に上がり,.NETStandard 1.1の部分では削除されています.

ここが非常に匂いますよね?

GitHubのIssueを探してみると

Microsoft.NETCore.Platforms doesn't install on packages.config based projects · Issue #8952 · dotnet/corefx · GitHub

こんなものも見つかったりします. これが本当の原因であるかは(自分の知識が足りないので)わかりませんが,確かにMicrosoft.NETCore.Platforms 1.0.2でも導入に際してエラーが起こったのでこれであると断定してもいいでしょう.

ということで根本的な原因がわかりました.

あとは解決手段としてその問題が解消されている System.Runtime.InteropServices.RuntimeInformation 4.3.0 をまずはじめに導入します. System.Reactiveのインストールで失敗をしたSystem.Runtime.InteropServices.RuntimeInformationが入ってしまえばこっちのもんです,どうでしょう,入りましたよね?

問題の一つが解消されたのでSystem.Reactiveを導入してみましょう. 問題なく導入されたと思います.

まとめ

System.ReactiveをPCLのプロジェクトに導入する際はSystem.Runtime.InteropServices.RuntimeInformation 4.3.0 をまずはじめに導入すればよいでしょう.

またNuGetを使用してライブラリを導入する際はぜひともエラーログを見てみみてください. そうすると解決手段が結構簡単に見つかったりします. 最近ではXamarin.Android.SupportPackage関連でも同様の問題を抱えている人がいましたが,それはエラーログのAndroid71に対してのパッケージはないよー的なことが書かれていたので,TargetPlatformをAndroid80にすればいいだけだな,という風に容易に察しがつきました.

よくわからなかったら適当にバージョン上げてみるのもいいのかもしれませんw

おきもち

今回の問題が起きたのはXamarin StudioからVisual Studio for Macとかに変わってMonoのバージョンが4.8から5系に変わったり,もしくはインストールされている.NET Core SDKのバージョンが上がったことによって起こった問題ではないかなぁともちょっと想像しています.

Mono4.8から5系ではビルドシステムのフローが変わった気がしますし,.NET Core関係でも1.0.1-preとかのときと最近ではまずパッケージ管理の方法が変わったりしましたし,そういうものが積み重なって今回みたいなケースが出たんじゃないかなぁ...違うかなぁ...

ということで昔の環境を持っているという人は是非試してみて欲しい案件ではありますねw

Xamarin WorkbooksがOSSになったので早速コントリビュートしてみた

Microsoft Connect(); 2017 Day1の興奮冷めやらぬまま朝起きたら

えっ,マジで!?Xamarin Workbooksのソース見れるの!?と朝から更に興奮させる出来事が.

早速Cloneしてビルドし実行してみると,そこには自前ビルドのXamarin Workbooksが. 今まで使い続けてきてどういう仕組なんだろうなぁ,とか,オレオレビルドなんだけど?とか言ってみたいなぁと思っていたので感動もひとしおです.

ここまではいいのですが,一点気になることがありました. いつからかのビルドから,Alpha版などではたぶんNuGetパッケージを追加するであろうボタンが真っ黒になっていました.f:id:yamachu_co:20171116204724p:plain

これおま環って言われるやつなのかなぁとすごい心配&どこにバグ報告すればいいのかわからなくてずっと悩んでいましたが,手元にはソース,ハックするしかないですね.

ということでハックを開始し原因がわかったので早速PR

[UI][mac] Remove background color to show NSAddTemplate by yamachu · Pull Request #97 · Microsoft/workbooks · GitHub

ひどい英語でもスクショあれば大丈夫だろうと信じポストしたら環境などを聞かれ色んな調査が始まりました. 原因としてはXcode9系からのバグ(?)だそうで,タイムリーなものを引き当てたようです. こういうバグにすぐに出会えるのもAlphaチャンネル運用の醍醐味でもあります.

ということで対策としてはありな修正だったようで無事マージとなりました.

その後ツイッター

非常に嬉しいですね.

オープンソースのプロダクトはこういう風に仕組みを知れたり,実際に自分で手をいれることが出来るので非常に勉強になります. これからもこういう活動は続けていきたいものです.


頑張って英語考えて返信してみた.久しぶりの英文であれ,仮定法みたいなやつってあとのやつは過去形だっけ?とか悩みまくったレベルに英語力落ちた