はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Xamarinの共有プロジェクトでXamarin.Forms 3.0を使う

Xamarin.Formsも3.0となり、魅力的な機能がさらに追加されました。

主な新規のは次のようなものがあります。

  • FlexLayout
  • ResourceDictionary
  • 右から左(アラビア語など)のサポート
  • CSS StyleSheet
  • Visual State Manger

Microsoft XAMLではおなじみの「ResourceDictionary」や「Visual State Manager」のサポートもうれしいですが、「FlexLayout」と「CSS StyleSheet」のサポートも魅力的ですね。

例えば、FlexLayoutはコンテンツを折り返しならが横方向に並べてくれるレイアウトで、Gridのようにあらかじめ縦横のマス数を指定しなくてもいいので、可変数のコンテンツを効率よく表示するのに適しています。従来であれば、ListViewのように横幅が一定の1列リストなどしか方法がありませんでしたが、タイル状に表示することが可能になりました。

Xamarin.Forms Layout Types

 

新規プロジェクトでのXamarin.Forms 3.0の指定

Visual Studio 2017 (15.7.2)で新規に作成したプロジェクトでXamarin.Forms 3.0を使う方法を紹介します。Xamarin.AndroidとXamarin.iOSに共通のロジックは.NET Standard 2.0でDLL化して共有するのではなく、共有プロジェクトでソースコードレベルで共有するスタイルにします。

image

そのためには、CrossPlatform - Xamarin.Formsテンプレートを選択して、空のアプリで「共有プロジェクト」を選択します。

image

 

この方法で作成したプロジェクトでは、Xamarin.Formsは最初から3.0が設定されています。Xamarin.Formsもnugetパッケージとして提供されていますから、ソリューションエクスプローラーでAndroidのプロジェクトの[参照]フォルダを右クリックして[Nugetパッケージの管理]メニューを選択して、使用されているnugetパッケージのバージョン確認してみましょう。

image

Xamarin.Forms 3.0のnugetパッケージの最新化

テンプレートのXamarin.Forms 3.0は3.0.0.482510ですので、その後に新しいものがでている場合があります。今回も、2018/06/05に3.0.0.530893がでているので、必要に応じてnugetパッケージん更新をしましょう。更新していいかどうかの判断基準は一概にはありませんが、リリースノートなどで判断するのがいいでしょう。

https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-3.0/3.0.0/

 

Xamarin.Androidのサポートライブラリの最新化

Xamarin.Androidの場合、さらにXamarin.Android.* (サポートライブラリ)のnugetパッケージのバージョンをどうするかも考える必要があります。

テンプレートで指定されてるサポートライブラリのバージョンは、25.4.0.1となっており、この時の依存関係にあるMonoAndroidバージョンはv7.0となっております。

2018/6/6現在に対応している最新MonoAndroidバージョンはv8.1ですので、最新のものを使うなら、サポートライブラリを最新のv27.0.2にします。

 

サポートライブラリとAndroid SDKのバージョンの関連

サポートライブラリのバージョンを更新してMonoAndroidのバージョンが変更されたときは、該当するAndroid SDKがイントールされている必要があります。

たとえば、サポートライブラリをv27.0.2にしたいのであれば、事前にAndroid SDK ManagerでSDK 8.1がインストールされていることを確認してください。

image

該当するSDKバージョンがないとnugetでサポートライブラリのバージョンを更新するときにエラーとなります。

image

ターゲットフレームワークの関連

Android SDK v8.1がインストール出来たらプロジェクトのターゲットフレームワークAndroid 8.1にします。

image

こちらターゲットAndroidバージョンとは別となります。もし(そんなタイミングはすくないでしょうけれど)、ターゲットを最新OSにするのを待ちたいときは、ターゲットAndroidバージョンを明示的に指定することも可能です。

image

2つ指定するのが面倒であれば、SDKのバージョン=ターゲットAndroidバージョンにする「SDKバージョンを使用したコンパイルの使用」という指定もあります。

image

 

Xamarin.Formsで画面を定義してみよう

それでは試しにFlexLayoutを使った画面を定義してみましょう。

画面定義は、AndoridとiOSで共通化できるところは共有プロジェクト側に記載します。

image

>|html|
<!--?xml version="1.0" encoding="utf-8" ?-->
<contentpage x:class="XamarinForms3Sample.Views.MainPage" xmlns:local="clr-namespace:XamarinForms3Sample.Views" xmlns:converter="clr-namespace:XamarinForms3Sample.Converters" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns="http://xamarin.com/schemas/2014/forms">
        
    <grid>
        <scrollview>
            <flexlayout justifycontent="SpaceAround" wrap="Wrap" x:name="Flexbox">
                <img />
            </flexlayout>
        </scrollview>
        <activityindicator x:name="activityIndicator" verticaloptions="Center" isrunning="{Binding IsBusy}">
    </activityindicator>
</grid>
||<

Modelなどのロジック部分も完成して実行すればタイル状に画像が表示されるアプリの完成となります。

image

 

ところでFlexLayoutでViewModelとBindingするのはどうするだろう。

 

HoloLensにWindows 10 April 2018 Updateがきました

RS4ことWindows 10 April 2018 UpdateがHoloLensにもやってきました。

HoloLensへの適用は、April 2018 Update済のWindows 10 PCにHoloLensを接続し、Windows Device Recovery Toolを起動して行います。

image

 

HoloLensのアイコンは正しいけれど「電話」という表示は気にしないでおきましょう。そのうち「デバイス」とかに日本語訳も治らないかな。 

image

この画面の見方は、HoloLensのOSバージョンが10.0.17123.1004 (RS4 Preview)で、配布サーバー上のバージョンは10.0.17134.80 (RS4)ということで、更新できるということになります。

 

あとは、画面の指示に従ってサクッとインストールすれば完了です。

注意点追記:

Windows UpdateでのOS更新とは異なり、また、インストールとは言っていますが、リカバリーですからデバイスの中身丸ごと更新になるため、設定やアプリなどはきれいに消えてしまいます
その点、注意してください。

 

Cognitive Service - Speech Service Previewが登場しました

build 2018の初日である2018/5/7にSpeech ServiceがCognitive Serviceに追加されました。

https://azure.microsoft.com/ja-jp/services/cognitive-services/speech-services/

 

あれ?音声認識ってもともとあったよね?とお気づきの方もいるとは思いますが、従来のものは、Bing Speech APIやCustom Speech Serviceですね。

Bing Speech API:20言語に対応した音声認識

https://azure.microsoft.com/ja-jp/services/cognitive-services/speech/

Custom Speech Service:音響モデルや言語モデル、ノイズ除去などに対応した音声認識

https://azure.microsoft.com/ja-jp/services/cognitive-servic

 

新しいSpeech Serviceは、Bing Speech、Custom Speech Service、Translator Speech APIを統合したものです。

  1. 一つのキーで
  2. 一つのSDK
  3. シンプルな価格で
  4. 単一のポータルからカスタマイズ可能で

というのが特徴です。

従来、「音声認識」についてはCustom Speech Serviceがありましたが、Speech Serviceでは「音声合成」もカスタマイズ可能になりました。

カスタマイズポータルは、http://customspeech.ai になっています。

※翻訳部分のカスタマイズは公式サイトからは判断つかなかったですが…

 

いま、比較表をつくっているのですが、buildの資料だと音声認識が28言語ってかいてあるんですが、その一覧がのっている資料がなくてちょっと困っているので、ここにあるよ!って情報をお待ちしております。

 

そうそうGAはいつなの?ってきいたら数か月だと思って!っていたのでGAにも期待sですね。4週間くらいでイテレーション回しているそうなので、なんか気になることがあったらタイムリーにフィードバックしてみるといいかもです。

HoloLens開発のためのUnityおよびMRTKのバージョン(2018/05/09現在)

UnityとMRTKのバージョンはどれをつかえばいいのかわからなくなる時があるのでメモ。

 

UnityはUnty 2018もでていますが、2018/04/30に提供が開始されたUnity 2017.4.2f2。

http:// https://unity3d.com/jp/unity/whatsnew/unity-2017.4.2

 

MRTK (Mixed Reality Toolkit for Unity)は、2017.2.1.4 Patch Release。

github.com

 

Azure PowerShellの具体例(例4:Cognitive Serviceの追加)

前準備

http://hatsune.hatenablog.jp/entry/2018/04/11/010156

Azureへのログイン

PowerShellを起動して次のコマンドを入力するとAzureへのログインダイアログが表示されます。

Login-AzureRmAccount

image27_thumb

ここでIDとパスワードを入力してサインインに成功すると対象となるサブスクリプションに接続します。

しかし、複数のサブスクリプションに紐づいている場合は、目的のサブスクリプションにつながらない場合もあります。

その場合は、Get-AzureRmSubscriptionでサブスクリプションIDを調べて、Select-AzureRmSubscriptionを使ってサブスクリプションを指定します。

Select-AzureRmSubscription -SubscriptionId 'xxxx-xxxx-xxxxx-xxxx'
 
 

例4:Cognitive Serviceの追加

Azure PowerShellを使って具体的にTranslator Text APIを新規追加する方法を順番にみていきましょう。

(1)リソースグループを新規作成する(既存のものを使うときには省略)
New-AzureRmResourceGroup ?Name myResoureceGroup ?Location ‘Japan West’

image16_thumb5

これでmyResourceGroupという名前で西日本にリソースグループが作成できます。

(2)Translater Text APIを有効化する
New-AzureRmCognitiveServicesAccount ?Name Test_Translator -ResourceGroupName myResoureceGroup -Type TextTranslation -SkuName F0 -Location 'global'

image

これでTest_Translatorという名前で、Translator Text APIが無料プランで有効化できます。

Congnitive Serviceは、以前はどこのリージョンを使うかを指定していましたが、現在は、特定のリージョンへの依存関係のないサービスです。そのため、Locationパラメータの指定は必要ですが指定値は常にglobalになります。

(3)APIキー値を取得する
Get-AzureRmCognitiveServicesAccountKey -ResourceGroupName myResoureceGroup -Name 'Test_Translator'

image

これで取得したどちらかのキー値を使えば、Translator Text APIを使うことができます。持ち主などの認証はありませんので、非常に重要な値といえます。

(4)APIキー値を再作成する

キー値を変更したいようなときは、キー値の再作成を行います。

New-AzureRmCognitiveServicesAccountKey -ResourceGroupName myResoureceGroup -Name 'Test_Translator' -KeyName Key1

image

これでKey1の値だけ再作成を行いました。キー値は2つあり利用はどちらでも同じです。Key1は自分用、Key2は一時的な貸出用などにしておくと、貸し出しが終わったらKey2を再作成するという運用ですみます。

(5)利用できる料金プランを取得する
(Get-AzureRmCognitiveServicesAccountSkus -ResourceGroupName myResoureceGroup -Name 'Test_Translator'
 | Select-Object -expandproperty Value).Sku

image

無料プランのF0、有料プランのS1~S4があることが分かりました。

(6)料金プランを変更する

Set-AzureRmCognitiveServicesAccount -ResourceGroupName myResoureceGroup -Name 'Test_Translator' -SkuName S1

image

これで料金プランだけS1に変更できました。もちろん、キー値など他の要素は変わりません。

 

指定できるCognitiveServiceについて

New-AzureRmCognitiveServicesAccountのTypeパラメータに指定できるCognitive Serviceの指定値は次のようになっています。

     
1 Bing.Autosuggest.v7 アプリにインテリジェントな自動提案機能を追加
2 Bing.CustomSearch 簡単に使用できる、広告なしの商用グレード検索ツールで、お好みの検索結果を得ることができます
3 Bing.Search.v7

Bing Search API (Web、Image、Video、News) と Entity Search

4 Bing.Speech 音声をテキストへ、またそのテキストを再び音声に変換し、ユーザーの意図を理解
5 Bing.SpellCheck.v7 アプリでのスペル ミスを検出して修正
6 ComputerVision 画像から意思決定に役立つ情報を抽出 (*一部リージョンのみ提供)
7 ContentModerator 画像、テキスト、ビデオを自動モデレート (*一部リージョンのみ提供)
8 - Custom Decision Service (プレビュー)に対応した指定はありません。
9 CustomSpeech  
10 CustomVision.Prediction 画像分析、タグ付け、著名人の認識、テキスト抽出、およびスマート サムネイル生成などの機能があります。
11 CustomVision.Training 画像分析、タグ付け、著名人の認識、テキスト抽出、およびスマート サムネイル生成などの機能があります(southcentralusのみ)
12 Emotion

プレビュー。一般提供はFaceAPIへ統合。

感情認識を使用してユーザー エクスペリエンスをパーソナライズ

13 Face 写真に含まれる顔の検出、識別、分析、グループ化、タグ付け (*一部リージョンのみ提供)
14 LUIS ユーザーが入力したコマンドをアプリケーションが理解できるようにします (*一部リージョンのみ提供)
15 QnAMaker *別の仕組みになったため?指定不可
16 SpeakerRecognition 音声を使用して個々の話者を識別および認証 (*一部リージョンのみ提供)
17 SpeechTranslation リアルタイムの音声翻訳を簡単に実行
18 TextAnalytics 未加工テキストの高度な自然言語処理に対応しています。感情分析、キー フレーズ抽出、言語検出の 3 つの主な機能があります。 (*一部リージョンのみ提供)
19 TextTranslation 機械翻訳を簡単に実行
20 WebLM *Web Language Model APIはCognitive ServiceからAzure Machine Learning Studioに変更になったため指定不可

残念ながら、この一覧を取得するコマンドはないのですが、Cognitive Serviceは今後も増えていく予感がしますし、Emotion APIがFace APIへ統合されるたように統廃合もあるでしょうから、指定できるTypeの一覧などがあると指定値に悩まなくてよい(まあ、ドキュメントサイトみましょうってことなのでしょうけれど)ですね。

現時点で指定できるAccountTypeでCognitive Serviceを有効にしていくと次のような感じで作成できます。

image

以上、コマンドラインによるCognitive Serviceの追加でした。各ユーザがもっているサブスクリプションに同じ定義で追加したいときとかも便利ですね。

一般社団法人ICTリハビリテーション研究会のアドバイザーに就任しました。

一般社団法人ICTリハビリテーション研究会のアドバイザーに就任しました。

研究会について – 一般社団法人ICTリハビリテーション研究会

リハビリ領域にICTで少しでも豊かさをお届けできるように、ともにいろいろ考えていければと思っています。

 

Azure PowerShellの具体例(例3:ストレージの追加)

前準備

http://hatsune.hatenablog.jp/entry/2018/04/11/010156

Azureへのログイン

PowerShellを起動して次のコマンドを入力するとAzureへのログインダイアログが表示されます。

Login-AzureRmAccount

image27_thumb

ここでIDとパスワードを入力してサインインに成功すると対象となるサブスクリプションに接続します。

しかし、複数のサブスクリプションに紐づいている場合は、目的のサブスクリプションにつながらない場合もあります。

その場合は、Get-AzureRmSubscriptionでサブスクリプションIDを調べて、Select-AzureRmSubscriptionを使ってサブスクリプションを指定します。

Select-AzureRmSubscription -SubscriptionId 'xxxx-xxxx-xxxxx-xxxx'

例3:ストレージの追加

Azure PowerShellを使って具体的にBLOBを新規追加する方法を順番にみていきましょう。

(1)リソースグループを新規作成する(既存のものを使うときには省略)
New-AzureRmResourceGroup ?Name myResoureceGroup ?Location ‘Japan West’

image16_thumb

これでmyResourceGroupという名前で西日本にリソースグループが作成できます。

(2)ストレージアカウントの作成
New-AzureRmStorageAccount ?StorageAccountName 'mystorage0409' ?Location 'Japan West' ?ResourceGroup myResoureceGroup ?SkuName 'Standard_LRS' ?Kind storage

image

西日本に'Standard_LRS'=ローカル冗長ストレージでストレージアカウント「mystorage0409」を作成しました。

SkuNameにはレプリケーションを指定するので、その他にも次のような指定が可能です。

SkuName レプリケーション
Standard_LRS ローカル冗長ストレージ
Standard_ZRS ゾーン冗長ストレージ
Standard_GRS 地理冗長ストレージ
Standard_RAGRS 読み取りアクセス地理冗長ストレージ
Premium_LRS Premium(SSD)ローカル冗長ストレージ

通常はローカル冗長、スピードが必要ならPremiumローカル冗長、データセンタのゾーン全体が死んでもデータの持続性を担保したいならゾーン冗長、データセンター丸ごと死んでもということであれば地理冗長を選択しましょう。

詳細は下記のドキュメントを参照してください。

https://docs.microsoft.com/ja-jp/azure/storage/common/storage-redundancy

もし、ストレージに対してhttpsでのアクセスのみを許可したいときは「-EnableHttpsTrafficOnly $True」を付与しましょう。

 

作成したストレージアカウントをAzure Portalで確認してみましょう。

image

(3)BLOBコンテナの作成

ストレージアカウントができているので、次にやる作業はBLOBサービスにBLOBコンテナを作成することです。

New-AzureRm・・・のようなリソースマネージャー関連コマンドではなくなってしまいますが、次のようなコマンドでBLOBコンテナが作成できます。

$storageAccount = Get-AzureRmStorageAccount ?Name 'mystorage0409' ?ResourceGroupName myResoureceGroup
$ctx = $storageAccount.Context
New-AzureStorageContainer ?Name 'myblob' ?Context $ctx ?Permission blob

image

これで、パブリックアクセスレベルが「BLOB専用の匿名読み取りアクセス」のmyblobというBLOBコンテナが作成できました。

(4)BLOBファイルのアップロード

BLOBコンテナができたので、ローカルPCにあるファイルをアップロードしてみましょう。

$storageAccount = Get-AzureRmStorageAccount ?Name 'mystorage0409' ?ResourceGroupName myResoureceGroup
$ctx = $storageAccount.Context
Set-AzureStorageBlobContent ?Container myblob ?Blob 'Icon09.png' ?Context $ctx ?File 'C:\Users\hatsune\Pictures\icon09.png'

image

これでローカルPCのファイルがAzure上のBLOBコンテナに入りました。

(5)BLOBコンテナの内容一覧

BLOBコンテナにあるBLOBファイルの一覧を表示してみましょう。

$storageAccount = Get-AzureRmStorageAccount ?Name 'mystorage0409' ?ResourceGroupName myResoureceGroup
$ctx = $storageAccount.Context
Get-AzureStorageBlob -Container "myblob" -Context $ctx

image

パブリックアクセスレベルが「BLOB専用の匿名読み取りアクセス」となっているので、BLOBファイルへのURLを公開すれば誰でもが参照のみ可能となります。

(6)アクセスキーの取得

参照は誰でもができますが、一部の人には更新もできるようにしたい場合があります。

しかしAzureサブスクリプションに対するアクセス権を渡してしまうのは大げさです。

そのような場合は、ストレージアカウント名とキーを渡してあげて、Azure Storage Explorerなどを使ってもらうといいでしょう。

詳細は:http://hatsune.hatenablog.jp/entry/2018/03/08/065243

 

Get-AzureRmStorageAccountKey -Name mystorage0409 -ResourceGroupName myResoureceGroup

image

mystorage0409という名前と、key2の値を更新者に渡してあげるといいでしょう。

注意(2018/04/15現在)

今回、ストレージアカウントのアカウントの種類としてstorageを指定したがblobstorageを指定したいときは注意が必要だ。

1つもストレージアカウントがない状態でblobstorageを作成するとBLOBコンテナが作成できないストレージアカウントができてしまう。

1つでも作成した後であれば正常に動作する。

New-AzureRmStorageAccount –StorageAccountName 'mystorage0409' –Location 'Japan West' –ResourceGroup myResoureceGroup –SkuName 'Standard_LRS' –Kind storage
New-AzureRmStorageAccount –StorageAccountName 'mystorage0410' –Location 'Japan West' –ResourceGroup myResoureceGroup –SkuName 'Standard_LRS' –Kind BlobStorage –AccessTier Hot

Azure Portalで作成したときは大丈夫なので、Azure PowerShellに何らかの問題があるのかもしれないが注意した方がいいでしょう。