Transforming Intelligence (基調講演)

  • Raspberry Piで画像認識のデモ
    • Dockerfileでデプロイ
    • Exportで各種デバイス上で動作できる
    • ローカルに機械学習モデルを持ってるみたい
    • カメラでパイナップルを認識してた

  • Azure Cosmos DB
    • ミリ秒単位のレイテンシ
    • 水平展開可能
    • NoSQL
    • ペタバイト
    • 数百万トランザクション/sec
    • MongoDB, SQLのAPIがある
    • 「プラネットスケールアプリケーション」
    • 全世界でマルチマスター書き込み(すごいらしい)
    • ちょまどさんのお絵かきアプリは西アメリカにあるDB、ララさんのは西日本DBに 1dotずつ読み書き

  • Azure Cognitive Service
    • 例: NBAの試合で靴やユニフォームを認識
    • データ収集に80%の労力を使う
      • Azure Databricks
    • Build & Training
      • Azure Machine Learning
    • Deploy
      • Dockerで。オンプレミスでも可能

  • Visual Studio Studio Live Share
    • 環境設定が違ってもコラボレーションできる
    • Mac(VS Code)とWindows(VS Community)間でデモ
    • カーソル位置やブレークポイントもシェアできる
    • localhost:3000をシェアして相手からも開ける
    • ターミナルもシェアできる

  • Visual Studio App Center
    • GitHub連携
    • iOSアプリのサンプル
    • リモートに実機が多数あり、ビルド後に一括で実機テストしてくれる
    • βテスターへの配布・ストアへのリリースも統合

  • Azure DevOps
    • GUIでCIのフローが組める
    • Kubernatesでデプロイ・スケール

  • Devspaces for AKS
    • マイクロサービスをまたがったデバッグ・ブレークポイント

  • .NET Core
    • SignalR as a Service

  • .NET Core 3
    • Windows Desktop, IoT & AIを統合
    • .NET Frameworkより高速(?)
    • exeファイルに依存関係をすべて含められる?
      • WinFormも同梱?

  • MR
    • Microsoft 365
    • Microsoft Graph
    • デジタルデータだけでなく、現実世界のデータも取り込みたい → Hololens
    • オフィスだけでなく、現場の最前線で働く人に活用してもらう
    • Microsoft Remote Assist
      • 工場の現場で、機械の操作のサポート
    • Microsoft Layout
      • 工場の現場で、機材の配置のシミュレーション
    • 「Cortana、エリアD-15に向かうよ」 → 音声認識して司令室のチャットに流れる
    • 空間分析
    • 東急建設
      • 建設現場でMRで設計図を投影する
    • 船舶
      • 遠隔で機器の保守のサポート
      • 3D海図で船の動きを管制
    • ゴジラ・ナイト
      • 目の前にゴジラがいるような体験

  • りんな
    • 690万ユーザー
    • 次世代会話エンジン 共感モデル
      • 詳細は今日のセッションで

日本の第一人者が語る! C# の現状と今後への展望 「.NET Core 2.x 時代の C#」

  • 機能面で進化が止まって見えていたが、次に進むための投資の期間だった
    • 次の10年を戦える環境に生まれ変わった
  • C# 7.xは細かく頻繁にリリース
    • パフォーマンス優先
  • .NET Core
    • 産みの苦しみを抜けた
    • OS依存の機能も入れる Windows Compatibility Pack
    • .NET Core 2.0, 2.1にするだけで数割高速
    • コンパイラだけでは実現できない機能も追加
    • Windowsの機能もマイナーな機能も入ったので、新規で作るなら.NET Coreがいいかな感
    • UWP, XAML, WPFはクロスプラットフォームは難しい
    • .NET Core → .NET Frameworkの逆移植もしてる
      • でも.NET Coreの方が速かったりする
      • .NET Frameworkはインストールがマシン単位なのでアップデートしづらい
      • .NET Coreはside by side
    • Windows Compatibility Pack
      • 一部はWindows以外でも動く。動かない物はAPIはあるが実行時例外
      • 後者は実行時にifで分岐(JITで速い) or コンパイル時にチェックするアナライザーもあり
    • .NET Core 3.0
      • WPFとかも載せる(Windowsでしか動かない)
      • でも高速、side by sideインストール
      • ML.NET 1.0 (Machine Learning)も近い時期にリリースされそう(.NET Coreには含まれない)
    • 全機能が載ったら.NET Frameworkは引退?
      • 当面サポートはされる
      • .NET Coreでバイナリそのままで.NET Frameworkアプリが動く
      • が、スレッドの挙動の違いなどはあるので注意。無理して移植しなくていい

パフォーマンス

標準ライブラリ

  • 配列の範囲チェック、負にならない場合は省略
  • 9割trueのifは、elseの方を関数に逃がすとインライン展開がかかる
  • throwがあるとインライン展開されない

JIT改良

  • box化はヘタすると1〜2桁遅い
  • Enum.HasFlagはbox化するから重い
    • JITが特殊対応して単なるANDに置き換え
  • 構造体のインターフェイスメソッド呼び出し
    • 構造体をbox化 → メソッド呼び出し
    • これも特殊対応

低レイヤー機能を公開

  • Intrinsics
    • X86.Sse.Add(a, b)
    • IsSupportedは「JIT時定数」。falseの分岐は消える
    • 未サポートだと実行時例外

ランタイムの修正が必要な機能

  • C#だけではできないもの
  • 8.0くらいでそろそろ入ります
  • ジェネリッククラスを属性に使う
  • インターフェイスのメソッドのデフォルト実装

7.xは小分けにリリース

  • タプル
  • ref戻り値、refローカル変数
  • 関数の引数にdefaultを使うとint?が0になるバグ
  • in引数でいろいろバグってた
  • バグもあるが修正も早い(2〜3ヶ月)
    • 英語できなくても再現コード貼ればいいし、講演者が取り次ぐよー

そもそもパフォーマンス必要?

  • Rustとかと戦う
  • C++で書いても、ネイティブ呼び出しが遅い
  • 文字列の部分参照
    • ネイティブヒープのUTF-8文字列を直接参照
  • Span<T> x = stackalloc
  • System.IO.Pipelines
    • Spanを使った高速なI/O
    • まだインターフェイスのみ
  • 文字列処理関連が1.5〜2倍高速に
    • C++をC#で書き直して速くなったとこもある!
  • Utf8String
    • UTF-16の変換が不要で速い

その他

  • where T : System.Enumなど追加
  • 7.xと8.0は並行開発してる
    • null許容参照とかは8.0
  • 8.0プレビュー版出てます
    • null許容参照も使える
  • null許容参照
    • null可、不可、未指定のコンパイルオプション
  • Range(..演算子)

Visual Studio App Center でモバイルアプリ開発/運用サイクルを高速化させよう!

  • アプリをリリースすることは、開発・リリース・テスト・公開・改善のサイクルを繰り返すこと

あるあるケース

  • 結合テストしたらバグだらけ
  • 主要メーカーの機種全部に対応してね
    • 概算: 200端末 * OSバージョン10個 * テストケース数
  • テストチームの端末管理大変・全員にアップデート配るの大変
  • リリース後に出たバグが再現しない

→ 今までいろんなサービスを組み合わせて対処していたが、 Visual Studio App Center に統合

機能

  • 自動ビルド
  • 署名
  • テスターに配布
  • ストアにリリース
  • デバイスファームで多数の実機でテスト
    • バイナリをインストールしてテストコードを実行
  • システム言語の変更
  • UIテストフレームワーク4種類くらい
  • アクティブユーザーなどのアナリティクス
    • カスタムイベントカウントも。関数1個呼ぶだけ

ところで

  • 2015年時点で、Android端末は24093種類
  • スクリーンサイズも多様
    • マルチタスクで画面分割したりも
  • 90%のユーザーをカバーするには、288機種の対応が必要 (USのデータ)

UIテスト

  • EnterText, ClearText, Tap, Screenshotなどの関数で書く
  • 手動テストだるいですよね
  • app.WaitForElement() // コントロールが表示されるのを待つ
  • コマンドラインからクラウドに自動テストを投げられる

App Center CLI

  • 有償でデバイスファームの占有も可能
  • Open API(REST API)もある

Slack連携

  • どのブランチをビルドする?とかボタンを表示して聞いてくる

Push通知

  • 最新版に上げてない人にpush通知を送ったりできる

App Center Analyticsを使い倒そう 〜静的コード生成を活用したXamarinにおけるAOP活用〜

  • Log Flow
    • イベント発生ログをリアルタイムで確認できる
  • AOPでトラッキングコードを埋め込む
    • 機能要件と非機能要件を分離
  • iOSでは動的コード生成ができない
    • バイトコード段階でAOP
  • AOPに使えるライブラリ
    • Mono.Cecil
    • Fody
    • Qiitaに解説がある

マイクロサービスのすべて

マイクロサービスの良い例・悪い例

  • 悪い例: Web/Business/Dataの3階層にこだわったまま分割する
  • 3階層が綺麗に分離されてたのに、分割したことで返って複雑になる
  • Domain driven design
    • ビジネスドメインをモデル化して分割
    • 各サービスは単一の責任のみを持つ

マイクロサービスの大原則

  • 設計時の疎結合
    • サービス間でライブラリを共有したいときは、ファイルの実体を共有しない
      • nugetなどでそれぞれがバージョンを固定するように
  • 実行時の疎結合
    • 実行中は、他のサービスはいつ落ちるか分からないと想定する
    • 落ちてるときはフォールバックで少ない機能で動くとかやる
  • リリース時の疎結合
    • サービス個別にでビルド・デプロイできるようにする

マイクロサービス登場の背景

  • A/Bテスト
  • 頻繁にデプロイしたい
    • 他のサービスを気にせずにアップデートできる

サービスの発見と抽出

ドメイン駆動設計

  • ビジネスをドメインとしてモデル化する
    • Bounded Contextを分解

  • サービスごとに使用するテクノロジーや言語が違っててもいい
    • スピードがいるところはRedisを使ったり

  • APIゲートウェイ
    • バックエンドはどんどん変わるので、ルーティングを担当
    • 全部のリクエストが通るので、ログもここで取る
    • 証明書もここだけでいい
    • 他、スロットリング・キャッシュ・リトライなどサービス共通の処理に向く
    • ここにドメインロジックを実装すると太るので注意

  • ロードレベリング(負荷の平準化)
    • 負荷がピークの時、バックエンドのどこかがボトルネックになって重くなる
    • Cosmos DBはスロットリング機能を持ってるが、全部のシステムがそんなに賢いとは限らない
    • 非同期キューで受けて、マイペースで処理する
    • トランザクションIDを振って、2回目は処理しない

  • サービス間通信
    • タイムスタンプでの紐付けは難しいので、すべてのサービスコールにIDを振る
    • http RESTで結構性能は出る。ダメなときだけgRPCを使う

  • データ管理
    • 他のサービスのデータに直接アクセスしてはいけない

AI は爆発だ?! 〜 “女子高生AI” りんな を支える技術とその開発現場からみるサービス開発

  • りんなを例にAI開発を紹介
  • コンセプト「エモーショナル」
    • 明日晴れるかなぁ?
    • Cortana「明日は晴れです」
    • りんな「どこか出かける予定でもあるの?」
    • できるだけ会話を長く続けるようにする
  • 17時間くらい話すユーザーが毎週いる
    • アメリカ版(23時間)・中国版(29時間)の方が長かったりする
  • ソーシャルAIボットは、人と人とのコミュニケーションを奨励するのが目的
  • Emotional Computing Framework
    • 人間の五感、世界の情報・知識、サービス展開場所
    • ソーシャルロール(映画に出演したり)
  • 会話技術
    • 元々は検索エンジンのチーム
    • Retrieval Model
      • 多様な雑談を検索
    • Generation Model
      • キャラクター生成
      • ローソンのbotにも提供
    • Empathy Model
      • 共感を得る方法を意識
      • 長く会話を続けるには会話の文脈が大事。過去のセッションを加味する
  • 共感を得る方法
    • 話題の提案・質問・相手の肯定・相づち・無意識(挨拶など)
  • 集団とのコミュニケーション
    • 友達の誕生日を教えておくと、当日に祝ったりする
  • 「りんならしさ」
    • 斜め上の返事が面白い
      • ルールじゃなくて学習で返事するから
    • 100%なんてない
      • 間違えてもそれが個性
      • 「わからない」もコミュニケーション
    • Diversity

りんなの視覚

  • 画像認識ではなくImage Commenting
    • 「スカート超可愛い!」
    • 「チワワかわいい抱っこしたい」
    • りんなのファッションチェック
      • 女子高生が「わかる!」と共感できるコメントを目指す
      • スタイリストと一緒にアイテムの選定・評価
      • 画像認識に自信がある部分にコメント
      • 複数の認識器を組み合わせた構成
      • 最近Cognitive Service Custom Visionがアップデートして、近いことができるようになった
      • りんなの発言をネタに、店員と客のコミュニケーションを活性化する
    • 画像生成も、肖像画機能に活かされている

りんなの声

  • 歌に挑戦
    • EmotionalでCreativeだから
    • AIが苦手な「創作性」に挑戦
  • なんと「耳コピ」
    • 人の歌を聴いて歌詞・音程・リズムを認識
    • りんな声で合成

  • nanaに投稿
    • 人の歌にコメントをしたりするサービス
    • お手本を上げてくれた人たちと合唱
  • 紅白狙ってます
  • 上手さを目指すより、コミュニケーション・コラボレーションが生まれるのが大事
  • 現在は恋愛ポエムを集めてる

りんなと電話

  • 双方向・リアルタイムなのでチャットbot + 音声認識とはひと味違う
  • 雑談エンジンは、短い文章で返すように調整
  • 音声合成エンジンはAyumiとかと同じもの
  • 早めにリリースして生データを蓄積