読者です 読者をやめる 読者になる 読者になる

なかしょの技術日誌

業務でプログラミングをしなくなったのでプライベートで調査した技術情報を書き留めていきます。

.NETラボでXamarin.Formsについて登壇してきました。

Xamarin

1月28日の.NETラボ勉強会でXamarin.Formsについて登壇してきました。

dotnetlab.connpass.com

登壇するきっかけは11月の.NETラボ勉強会でMicrosoftMVPの西村誠さんが登壇された「Xamarin入門(技術というより心構え編)」というセッションで色々とコメントしたら、西村さんから「君がXamarinについてしゃべりなよ」と言われたので、登壇することとなりました。

Xamarinを始めたのが昨年の無償化後で、まだまだXamarinが使えているとは言えない状況の自分ですが、ハンズオンのメンターなどを何度か経験し、初心者向けのセッションであれば対応可能だと判断しました。

そんなわけでタイトルは「Xmarin.Formsから始めるクロスプラットフォーム開発」として、資料を作成しました。

docs.com

構成は以下のようにしました。

  • Xamarin
  • Xamarin.Forms
  • コードの共通化
  • Xamarin.FormsでPlatform固有の機能を扱う手段
  • Xamarinのデメリット
  • Xamarin.Formsの学び方
    • 書籍編
    • ハンズオン編
    • ツール・ライブラリ編
    • Prism編
    • Azure編
    • DevOps編
    • サンプルアプリ編
    • コミュニティ編
  • Xamarin関連情報
  • Xamarin Advent Calendar 2016

40分も時間をいただいたので、なるべく詰め込もうとしたらスライド88枚にもなり詰め込みすぎ感が...

また、発表練習が足りず、だいぶパワポのメモに頼ったスピーチになってしまいました。参加者の方からは「スライドを見ながらナレーションを聞いているようで聞きやすかった」との意見ももらいましたが、メモを見ずにスピーチしたいものです。

今回の発表で自分にとって良い復習にも予習にもなりました。 今後もセッションの機会があれば積極的に対応したいと思います。

後日共有いただいたアンケート結果では、このセッション目当ての方もけっこういらっしゃって期待に応えられたか不安ではあるのですが、おおむね好意的な意見を頂けました。
もっと突っ込んだ内容が聞きたかったという意見の方は、なぜ隣の部屋でやっていたJXUGのイベントに行かなかったんだ、と小一時間問い詰めたい

おまけ

真面目にしゃべったら知恵熱が出てしまったので、ネタをやらねばとLT枠でTizenについて発表してきました。

docs.com

Tizenの.NET対応についての始まりとこれから

はじめに

本エントリーは、 Xamarin(その2) Advent Calendar 2016 の13日目です。

Tizen の.NET対応の発表について

記憶に新しい Connect(); 2016 では様々な発表がありました。

connectevent.microsoft.com

皆さんは何が一番のサプライズでしたでしょうか。
もちろん
Xamarin.Forms.Platform.Tizen
の発表ですよね。
そこで、本記事ではTizenの.NET対応についての始まりとこれからを探っていきたいと思います。

MonoTizen

Xamarin.Forms.Platform.Tizenが初めての.NET対応ではありません。 Tizenの.NET対応としてMonoTizenが世に出ています。

MonoTizenの誕生

2014年5月20日 Kitsilano Software がMonoTizenを発表しました。

MonoTizenkitsilanosoftware.wordpress.com

この会社は「C#と.NET開発の生産性をGNU / Linuxバイルにもたらす」というコーポレートスローガンをを持っています。
Tizenの.NET対応を推進するのにふさわしそうなスローガンですよね。
MonoTizenのロゴは以下になります。可愛いですよね。

f:id:nakasho_dev:20161212000120p:plain

そして、2014年6月4日からGitHubにて開発がスタートしました。
Tizen向けアプリの開発者たちは完成を待ちわびたことでしょう。

github.com

MonoTizenの開発延期

f:id:nakasho_dev:20161212010607p:plain なんということでしょう。
2014年8月13日にMonoTizenの開発が延期になりました。
誕生したばかりで、停止?とお思いでしょうが停止にあたって、 Kitsilano Software は明確な意思表示をしています。

kitsilanosoftware.github.io

MonoTizenの開発は当面延期されます。 私たちは将来復帰したいと考えていますが、Tizenプロジェクトがポジティブな方向に変わらない限り復帰できません。 ロードマップを持たず、パートナーとの有意義なコミュニケーションがないプラットフォーム上ではソフトウェアビジネスはできません。(意訳)

Tizenを推進するはずのサムスンの対応を見限っての発言かもしれません。
その時の気持ちはどのような気持ちだったのか想像に難くありません。

f:id:nakasho_dev:20161212005417p:plain

某D社のTizen版xxモードやTizen版専用アプリの開発や端末検証を担当していた某下請け会社も「有意義なコミュニケーションがない」には同意するのではないでしょうか。

そして開発は延期になりましたが、2014年10月20日に Kitsilano Software はTizen AssociationにJoinしました。
Tizen AssociationはTizenの産業的役割を主導するために組織された非営利コンソーシアムです。
MonoTizenの開発復帰に向けて、ビジネスの在り方を議論したかったのかもしれません。

Kitsilano Software joins the Tizen Associationkitsilanosoftware.wordpress.com

Tizen.NET

時は移り行き、2016年。Xamarin.Forms.Platform.Tizenが誕生します。

サムスンの.NET FoundationへのJoin

2016年6月27日 サムスンが.NET FoundationのTechnical Steering GroupにJoinします。

.NET Foundation - Samsung joins the .NET Foundation Technical Steering Group

この時、Tizenの.NET対応について想像された方もいらっしゃると思います。

Connect();2016でTizenが公式に.NETに対応したと発表

Congratulations Samsung
Xamarin.Forms.Platform.Tizenの発表に全世界が歓喜したことでしょう。
しかし、この発表に最も驚いた人は Dimitar Dobrev さんではないでしょうか。
この方はみなさんもご存知の通り、MonoTizenのリード開発者の一人です。
.NETへの対応が発表されたTizenProjectの以下のBlogに彼はコメントしています。

www.tizen.org

BY Dimitar Dobrev, 17 NOV 2016 9:09 AM

Hello,

My name is Dimitar Dobrev. I developed the C# language bindings for MonoTizen by Kitsilano Software. That effort unfortunately got suspended for financial reasons but I believe my expertise can help you with your current work.

MonoTizen stepped on CppSharp (hosted at GitHub) of which I am one of the lead developers. It is an open source project which generates C# wrappers for C++ libraries. The process is fully automatic and only requires passing the headers and libraries as file paths. I believe Tizen can use it to automatically generate the C# layer instead of it being slowly and expensively coded by hand.

I think I can be of great help to you and Tizen .NET. I would really like to start a discussion about this possibility.

Best regards,

Dimitar Dobrev

MonoTizenの立役者だった一人であるのに何も知らされていなかった感がありありですが、彼の熱意が伝わってきますね。
ぜひとも彼には Tizenの.NET対応のリードを頑張っていただきたいです。

Tizenの.NET対応状況

Tizenのページを見ても発表以降更新はないです。以前の記事をみてください。
NuGetでのライブラリのバージョンは上がっているのだからWebページも更新してよ、とは思います。

nakasho-dev.hatenablog.jp

nakasho-dev.hatenablog.jp

でも、Tizenに興味津々で公式からの発表が待ちきれない人も大勢いますよね。
そんな人たちはソースを見ましょう!Tizenはオープンソースです。

Tizenの.NET関連のソース

TizenのソースはGitで管理されています。以下のサイトで確認できます。

source.tizen.org

.NET 対応に関するリポジトリは以下を確認しました。 ※他にもあるかもしれません。

csapi

TizenのネイティブをC#で呼び出すラッパーAPIを管理しています。
リポジトリを確認すると、対応していないはずのTelephonyなどが存在し、今後の拡張に期待が持てます。
また、プラットフォーム固有のAPIにはUI関連がないと思ったのですが、ElmSharpにより実現しているようです。そもそもプラットフォーム固有のAPIがなくて、どのようにXamarin.Formsを実現するんだ、って話になりますよね...
ElmSharpとはTizen NativeのUI FrameworkであるEFLをベースに開発したもののようです。
Xamarin.Forms.Platform.TizenのUIはこのElmSharpを使用して実現しています。

dotnet

ビルドツール等を管理しているようです。

xamarin-forms

皆さんの本命、Xamarin.Forms.Platform.Tizenについて管理しています。
ソースツリーを見ると何やら、まだNuGetからダウンロードしたものには存在しないクラスがあります。

f:id:nakasho_dev:20161212024542p:plain

おや?

f:id:nakasho_dev:20161212024558p:plain

なんと! Xamarin.Forms.Maps.Tizenが!

f:id:nakasho_dev:20161212024840p:plain

さっそくXamarin.Forms.Maps.Tizen.MapControl.csのソースを見てみます。

using TLabel = Xamarin.Forms.Platform.Tizen.Native.Label;

namespace Xamarin.Forms.Maps.Tizen
{
    public class MapControl : TLabel
    {
        public MapControl(ElmSharp.EvasObject parent) : base(parent)
        {
            Text = "Can not supported Maps";
            TextColor = ElmSharp.Color.Red;
        }
    }
}

"Can not supported Maps"...

f:id:nakasho_dev:20161212025421p:plain

期待した私が愚かだったのでしょうか。
しかし、リポジトリに登録しているからは実装しようという意気込みは感じます。
そしてオープンソースなので、自分でcsapiを増やして現在のネイティブにないものも対応することは可能だと思われます。

おわりに

いかがでしたでしょうか。
Tizenの.NET対応についての始まりとこれからを紹介しました。
過去に停滞していたTizenプロジェクトですが、Connect();2016から再始動した感じはありありと伝わってきました。
しかし、Tizenプロジェクトの本気度を確認するのはこれからです。
皆さんも早くTizenの開発をしたくなったのではないでしょうか。
Tizen 3.0の正式リリースが待ちきれません。

docomoの発話理解APIからLUISの扱い方を学ぶ

Bot Framework Coginitive Services

はじめに

この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の8日目になります。

概要

LUIS(Language Understanding Intelligent Service)は非常に優秀な自然言語解析ツールですが、日本語ではサンプルモデルが存在せず、どのようなIntentとそのパラメータ、および、Entityを扱えばよいか困っている人もいることでしょう。
そこで本記事、『docomo Developer support | NTTドコモ』で提供している発話理解APIを元に学んでいきます。

dev.smt.docomo.ne.jp

LUISの基本知識はある程度省略しますので、
本記事を読み進める前に以下の記事を読んでいただけると理解が深まります。

beachside.hatenablog.com

docomoの発話理解API

発話理解APIは発話文をテキストでインプットすると、文脈を解析し、その意図に沿った『コマンド名』及び『スロット名』に該当する値を返却するAPIです。 https://devsite-pro.s3.amazonaws.com/contents_file/contents_7140522162331.jpg

LUISですと『コマンド』がIntent、『スロット』がパラメータにあたります。

発話理解APIで取得できるコマンド

発話理解APIのリファレンスで紹介しているコマンド一覧は以下になります。

commandID commandName 説明 スロット名
BC00101 雑談 あいさつなど雑談
BK00101 知識検索 Q&Aの検索
BT00101 乗換案内 乗り換え案内を検索 stationTo,
stationFrom
BT00201 地図 地図の表示 searchArea,
hereArround,
facilityName
BT00301 天気 天気の検索 searchArea,
hereArround,
date
BT00401 グルメ検索 飲食店の検索 gourmetGenre,
searchArea,
hereArround
BT00501 ブラウザ ブラウザアプリの起動 browser,
website
BT00601 観光案内 観光地の検索 searchArea,
hereArround,
sightseeing
BT00701 カメラ カメラアプリの起動
BT00801 ギャラリー ギャラリーアプリの起動
BT00901 通話 電話アプリの起動 phoneTo
BT01001 メール メールアプリの起動 mailTo,
mailBody
BT01101 メモ登録 メモの生成 memoBody
BT01102 メモ参照 メモの参照 memoBody
BT01201 アラーム アラーム設定 time
BT01301 スケジュール登録 スケジュールの登録 date,
time,
scheduleBody
BT01302 スケジュール参照 スケジュールの参照 date,
time
BT01501 端末設定 端末設定の起動 setting
BT01601 SNS投稿 SNSへの投稿 snsSource,
snsBody
BT90101 キャンセル キャンセルコマンド
BM00101 地図・乗換 地図・乗換いずれかのタスク searchArea
BM00201 通話・メール 通話・メールいずれかのタスク phoneTo
SE00101 判定不能 判定不能
SE00201 サーバエラー1 サーバエラー
SE00202 サーバエラー2 サーバエラー
SE00301 ライブラリエラー ライブラリエラー

余談ですが上記の表はdocomoの公式のHTMLからExcelにコピーし、以下のアドインを使ってExcelからMarkdown形式に変換しています。便利です。

www.nuits.jp

発話理解APIで取得できるスロット

スロット一覧は以下になります。

スロット名 説明 タイプ
browser ブラウザ名を格納 browser
date 日付,曜日,相対日付を格納 date,
datePnoun,
dateWeek,
dateRelative
facilityName 検索対象の施設名を格納 gpoi
gourmetGenre グルメ検索ジャンルを格納 food,
drink
hereArround 現在地周辺を表す言葉を格納 hereArround
mailBody メール件名を格納 mailBody
mailTo メール宛先を格納 fullName,
lastFirstName,
firstName,
lastName,
postName,
otherAddress,
upoi,
gpoi
memoBody メモの本文を格納 memoBody
phoneTo 電話宛先を格納 phoneNumber,
fullName,
lastFirstName,
firstName,
lastName,
postName,
otherAddress,
upoi,
gpoi
scheduleBody スケジュール内容を格納 scheduleBody
searchArea 検索対象の地名を格納 address,
upoi
setting 設定項目を格納 setting
sightseeing 観光関連用語を格納 sightseeing
stationFrom 乗車駅を格納 stationFrom,
hereFrom,
station,
here
stationTo 降車駅を格納 stationTo,
hereTo,
station,
here
snsBody SNSの本文を格納 snsBody
snsSource SNSの投稿先を格納 snsSource
time 時刻,または相対時間を格納 time,
timeRelative,
timeHour
website Webのサイト名を格納 website

余談ですが上記の表は(ry

発話理解APIの実行例

docomo Developer support ではAPIを実行するコンソールが提供されています。
ユーザ登録をすると利用できます。
実行例を示します。

「品川で焼肉を食べたい」の結果

「品川で焼肉を食べたい」で実行した結果の一部が以下になります。

f:id:nakasho_dev:20161208230037p:plain

この場合、コマンド名として「グルメ検索」、ジャンルとして「焼肉」、対象エリアとして「品川」が抽出できました。
ちなみに「現在地周辺の焼肉屋は?」としたときはhereArroundに「現在地」が格納されました。

LUISへの応用

グルメ検索をLUISで同じようなことを実現しようとした場合、あらかじめ「groumetGenre」、「searchArea」、「hereArround」をパラメータとした、「searchGroumet」というIntentを作成することとなります。

Entityの作成

ここでEntityを作成する際は一工夫必要です。
「groumetGenre」はおそらくグルメのジャンルで他と被ることもなさそうです。なので、「groumetGenre」というEntityを作成してよいでしょう。

f:id:nakasho_dev:20161208232733p:plain

「searchArea」は検索目的でなくてもエリアという概念はあるので、「Area」というEntityを作成したうえで「searchArea」というchildrenを作るとよいでしょう。
こうすることで検索目的ではないAreaのchildren作成時にも学習効果が期待できます。

f:id:nakasho_dev:20161208232753p:plain

「hereArround」は現在地周辺ということなので、hereだとかhereArroundのままでよいと思います。

f:id:nakasho_dev:20161208232847p:plain

Intentの作成

先ほど作成したEntityを元に「searchGroumet」というIntentを作成します。

f:id:nakasho_dev:20161208233547p:plain

学習

作成したIntentを学習させます。

f:id:nakasho_dev:20161208233634p:plain

学習を繰り返して、このIntentの精度を高めます。

まとめ

いかがでしたでしょうか。
今回はAdventCalendarの空きが出ないために急いで作ったためグルメ検索のみの紹介でした。
docomoの発話理解APIには、よくあるポータル検索ではなくスマートフォンの機能を使用するためのコマンドをそろえているのが特徴的です。
もし、LUISを使ってスマートフォンコンシェルジュ的なアプリを作成するときは、この発話理解APIスマートフォン向けコマンドが参考になるかもしれません。 docomoの発話理解APIは無料で使えますが、自分が好きなように学習させる機能はありません。
発話理解のノウハウをdocomoから学んで自分好みの学習をLUISで実現してみてはいかがでしょうか。

ちなみにdocomo Developer SupportではAPIを活用したサービスを考案された方には事業化支援金の提供も含めた支援プログラムがあります。

dev.smt.docomo.ne.jp

docomoAPIMicrosoft Bot Frameworkを組み合わせたサービスでも支援してもらえるかもしれませんね。

以上です。

LUISとAzure Bot Serviceを利用してMicrosoft Teamsで在庫管理ボットを動作させる

Bot Framework Coginitive Services

はじめに

この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の6日目になります。

概要

自身の前記事のいい加減さに反省して、もう一件記事を書きます。

LUISとAzure Bot Serviceを利用してMicrosoft Teamsで在庫管理ボットを動作させる例を紹介します。

LUISの構築やAzure Bot Serviceの構築はある程度省略しますので、
本記事を読み進める前に以下の記事を読んでいただけると理解が深まります。

beachside.hatenablog.com

beachside.hatenablog.com

LUISの設定

Phrase Listの設定

在庫管理対象となるものをPhrase Listに登録します。
今回はProductという名前で以下のように登録しました。

f:id:nakasho_dev:20161206010143p:plain

Entityの設定

製品のEntityとしてProductを登録します。
実際にはもっと子要素を増やすべきですがサンプルなので割愛します。

f:id:nakasho_dev:20161206010434p:plain

Intentの登録

製品の在庫数を取得するためのIntentをGetZaikoとして作成しました。
Actionパラメータには先ほど作成したPhraseやEntityのProductを指定し、NameもProductとしています。
(※違う名前にしたほうがわかりやすかったです。)

f:id:nakasho_dev:20161206010840p:plain

LUISを学習させる。

GetZaikoとなる文章パターンを覚えさせます。

f:id:nakasho_dev:20161206011212p:plain

f:id:nakasho_dev:20161206011221p:plain

何パターンかSubmitし、Trainで学習させ、Publishします。
「レモンの残りは?」のQueryの結果は以下のようになりました。

f:id:nakasho_dev:20161206013617p:plain

Azure Bot Serviceの実装

LUIS向けのAzure Bot Serviceの初期構築が完了している想定で進めます。

LUIS向けで構築する際に作成されるBasicLuisDialog.csxの末尾に以下のメソッドを登録します。

f:id:nakasho_dev:20161206013654p:plain

記事の可視性のためにメソッド内に処理をすべてまとめています。
実際はDBやWebAPI等からデータを取得することとなります。
今回、Entityが一つである前提のため、result.Entities[0].Entity という取得方法を実施していますが、通常はtypeやscoreの値をみて判断すべきだと思います。

Azure Bot Serviceのチャットウィンドウで動作を確認します。

f:id:nakasho_dev:20161206014211p:plain

期待通り動作しました。

Microsoft Teamsへの登録

https://dev.botframework.com/ にアクセスしてログインします。
Azure Bot Serviceでは作成した時点でMyBotsに登録されているところが便利だと思います。

f:id:nakasho_dev:20161206015126p:plain

Add another channel から Microsoft Teamsの行のAddを選択します。

f:id:nakasho_dev:20161206015144p:plain

Microsoft Teamsとの連携を有効にし、「I'm done configuring Microsoft Teams」のボタンをクリックします。

f:id:nakasho_dev:20161206015756p:plain

ChannelsにMicrosoft Teamsが加わりました。

f:id:nakasho_dev:20161206015803p:plain

Test linkの「Add to Teams」をクリックするとTeamsのアプリケーションが起動し、chatbotとのチャット画面が開きます。

f:id:nakasho_dev:20161206020455p:plain

以上でTeamsとの連携まで完了しました。

まとめ

在庫管理っぽいことをするボットを作成してみました。
例えば製品販売店であれば、実際の在庫管理システムとリンクさせたボットを公開し、顧客の購買部のメンバーが参加するTeamsに登録いただくなんてことも考えられます。
ボットを活用して問い合わせに対する時間が削減できるとよいですよね。

余談

なぜ、今回の記事の連携先にMicrosoft Teamsを選んだかというと、個人でOffice365 Business Premiumを契約しているけど、契約人数が一人のため、Teamsのチャットがつまらなかったからです。
もうこれで1人じゃないよ! このボットは自分自身への最高の誕生日プレゼントです。

Microsoft Bot Framework と docomo Developer Support 雑談対話APIの連携

Bot Framework

はじめに

この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の5日目になります。

概要

Bot Frameworkと連携できるのはCognitive Serviceのみではありません。
本記事ではdocomo Developer Supportで提供されるAPIを使用して、Botアプリケーションを作成することで、チャットボットの可能性を広げて行きたいと考えています。
と大層なことを言っている割に雑談対話APIとの連携のみとなってしまいました。

docomo Developer Supportとは

docomo Developer supportをご存知でしょうか

dev.smt.docomo.ne.jp

サイトには以下のように紹介されています。

docomo Developer supportは、ドコモやパートナー企業が持つ様々なアセットを「API」として汎用化して提供し、開発者へ展開することで、新たな事業の創出を推進する協創プラットフォームです。ドコモは、中期目標に向けた取り組みとして、世の中の様々なパートナーの皆さまとのコラボレーションにより新たな付加価値を創造する「協創」を進めていきます。

どのようなAPIがあるか

| docomo Developer support | NTTドコモ

対話AI向けとして以下を提供しています。

雑談対話APIとの連携

パラメータは以下のページで紹介しています。

dev.smt.docomo.ne.jp

発言したいテキストのみをパラメータに渡しても問題ありませんが、botに話しかけるユーザの属性を付与することで、雑談の内容が変わるようです。

リクエスト

Bot Frameworkを利用したアプリケーションから以下の形式でリクエストを投げるようにしました。

  • リクエストURL

    https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue

  • メソッド : POST
  • 文字コード : UTF-8
  • リクエストヘッダ:Content-Type:application/json
  • リクエストクエリパラメータ
    • APIKEY(ユーザ登録後発行されるキーです)
  • リクエストボディ(JSON形式)

    {
    "utt": "こんばんは",
    "context": "100001",
    "nickname": "なかしょ",
    "nickname_y": "ナカショ",
    "sex": "男",
    "bloodtype": "A",
    "birthdateY": "1978",
    "birthdateM": "12",
    "birthdateD": "6",
    "age": "37",
    "constellations": "射手座",
    "place": "東京",
    "mode": "dialog",
    "t": "20"
    }

utt(発言内容)はBotFrameworkを利用したactivity.Textから取得したものを当てはめています。
contextはレスポンスから取得した値を次の発言時に含めることで意味のある会話を継続できるようです。特にしりとり機能を使用時では必要となります。
今回はuttとcontext以外は固定値を使用しています。

modeは何も選択しなければ「dialog」が適用されて通常の会話になります。「srtr」を指定するとしりとりのモードになります。
tはキャラクタ選択で今回は「20:関西弁キャラ」を選択しています。

レスポンス

以下のようにレスポンスを受け取りました。

{
"utt":"こんありやけど",
"yomi":"こんありやけど",
"mode":"dialog",
"da":"0",
"context":"100001",
}

uttの値を返信テキストとして、ReplyToActivityAsyncに渡してBotから返信させるようにしています。

連携例

エミュレータのキャプチャを以下に示します。

f:id:nakasho_dev:20161204032042p:plain

簡単ですが以上です。

Microsoft Cognitive Servicesでは雑談対話の仕組みはなく、LUISで雑談できるまで学習させるのも大変です。
例えばLUISでintentのscoreが低いものばかりの時は的外れな回答をしてしまう可能性が高いです。そういう場合は条件に該当しないと判断して、この雑談対話APIで返信内容をゲットするのもありかなぁと思っています。
正直雑談対話が成り立っていない時も多々見受けられますが...

.NETラボでConnect();2016についてLTしてきました。

Tizen Xamarin

11月26日の.NETラボ勉強会で以下の資料をLTしてきました。

docs.com

5分間のLTで、ガンガン進めていったので、トピック的には以下のような感じ。

前半

  • MicrosoftLinux Foundationに加わり、Googleが.NET Foundationに加わり、どんどんオープンになっていくMSに期待できますね。
  • Azure Functionsはサーバレスアーキテクチャとして期待しています。
  • Visual Studio for MacWindows版に慣れている人は同じ操作感でコーディングできるので助かります。
  • Visual Studio Mobile CenterはHockyAppやXamarinTestCloudなどモバイル開発に必要なものが統合されて使いやすくなりますね。
  • Xamarin for VisualStudioで紹介されたものはEnterpriseエディションのみなのでComunity版で使用できなくて残念です。

後半

  • このマークは何か知っていますよね?
  • Congratulations Samsung
  • Tizen.netのPreview版がリリースされました。
  • 発表前まではフロントエンドはWebアプリケーションかNativeアプリケーションしかありませんでした。
  • 今はXamarin.Formsで開発が可能になりました。
  • Xamarin.Formsは99%対応しているとはいえ、WebViewがないのでハイブリッドアプリは作れません。ListViewはあるけど使えない機能が多いです。
  • Tizen固有のAPIはUI周りが未対応でXamarin.Forms頼り。そのため、Xamarin.Formsで表現できないことをNativeに頼れません。
  • これからブログ等で継続的にTizenネタを発信しますのでご期待ください。

以上。

Tizen.NETにおけるXamarin.Formsの制限事項

Tizen Xamarin

Xamarin.Tizenチョットデキルのなかしょです。

前回の記事ではプラットフォーム固有APIの制限事項について説明しました。
今回はTizen.NETにおけるXamarin.Formsの制限事項について説明します。

Tizen.NETではXamarin.Formsへの対応状況を以下のように説明しています。

『Tizen .NET supports 99% of Xamarin.Forms.』

99%か、Preview版にしてはなかなかのものです。(と実際の制限事項を見るまでは思っていました...)
では、具体的にどのような機能が制限されているかは以下のページで説明しています。

developer.tizen.org

Ignored, No Action, Never triggered など、様々な制限が記載されています。
中でもListViewの制限が多い印象です。
特にGroupDisplayBindingでListViewをグループ化して表示できないとか、IsPullToRefreshEnabledで引っ張って画面更新などのスマフォっぽい動作ができないとか、色々とつらそうです。

デザインを調整するための要素が使えず、プラットフォーム固有のAPIにはUI系が存在せず、Custom Rendrerを実装できないとなると、デザインを重視したTizenアプリにはまだまだXamarin.Formsは使えないのではと懸念しています。

今日はここまで。

2016/11/24 追記

前述の制限は対応しているクラスに対してのものです。クラスそのものが非対応なものは以下になります。

  • AppLinkEntry
  • PinchGestureRecognizer
  • PanGestureRecognizer
  • OpenGLView
  • WebView
  • OnPlatform
  • PlatformEffect<TContainer, TControl>

WebViewがないとか、ちょっとしたWebサイトをアプリ内で表示したいときに困りますね。