giantneco’s blog

技術メモ

builderscon 2018

9/7, 9/8 に builderscon tokyo 2018 に参加してきた。 builderscon はあまり技術分野などの縛りがないカンファレンスで、 他のカンファレンスではなかなか聞かない話が聞けるおもしろイベントだ。 縛りがゆるいとはいえ、発表内容は結構レベルが高いものも多い。

Web周りから低レイヤまで幅広いジャンルの話が聞けるので、 参加したらなにか一つは引っかかるものがあるんじゃないだろうかと思う。 これまで聞いたことがない話を聞きたいという人にはすごいあっているじゃなかろうか。

会場は一つを除くとさほど狭くないので、 観るセッションは決めておいて早めに並んでおかないと見逃しやすい。 自分も結構聞きたいセッションを逃してしまったので、ここらへんは改善してほしい。 そういうのは会場変えないと難しいのかもしれないが…

ちなみに開催場所は日吉。 Google Map での表示を見ると駅から少し歩くように見えるが、 実際には駅から出てすぐの建物になるので初参加の場合は気を付けたい。 前回初参加のときはちょっと間違えた場所に行ったが今回は間違えなかった。

以下見てきたセッション

Envoy Internals Deep Dive by Matt Kelin

Envoyはマイクロサービス向けのサービスプロキシ。発音は「あんぼい」に近い。

Envoy とは

Envoy はマイクロサービス向けのサイドカーロキシー。ユニバーサルなデータプレーンとも。 このサイドカーロキシーは、マイクロサービスを動かすノードに常駐して、 アプリケーションや言語、フレームワークによらずロードバランシグなどを行ってくれるものを指すようだ。 同じノードにのるということで「サイドカー」ということなのかも。

背景

Envoy はマイクロサービスを作るにあたって出てくる次のような問題を解決する: * 複数の言語とフレームワークの解決 * 複数のプロトコル ( HTTP/1, HTTP/2, gRPC etc ) * ブラックボックスなロードバランサ (AWS ELB とか) * 一貫したモニタリング方法がない (統計、トレーシング、ロギング) * 足りない機能 (リトライ、サーキットブレーカー、タイムアウトなど分散システムのベストプラクティス * 認証周り * 言語ごとに存在するサービス呼び出しのライブラリ * レイテンシーやエラーのデバッグの難しさ * マイクロサービスアーキテクチャを信用していない開発者

Envoy は、ネットワークはアプリケーションに対して透過的=アプリケーションの問題が起きたときにその発生元が簡単に特定できるようにしたい。

Envoy の目標

  • プロセスアーキテクチャの外側で動かす
  • 低レイテンシ、高パフォーマンス、高開発効率
  • L3/L4 フィルター
  • L7 での HTTP フィルター
  • HTTP/2 ファースト
  • サービス・コンフィグディスカバリと API の提供
  • アクティブ・パッシブなヘルスチェッキン
  • よりよいロードバランサ
  • サービス・ミドル・エッジプロキシー
  • ホットリスタート

Envoy のアーキテクチャ

xDS API による設定マネジメント

  • Envoy is a universal data plane
  • xDS == X Discovery Service つまり:
    • LDS == Listener Discovery Service
    • CDS == Cluster Discovery Service
  • gRPC ストリーミングや JSON/YAML REST Protocol Buffers (proto3) もサポート
  • 中央集権的に Envoy 設定を管理することができる
  • Eventual consistency

Envoy のスレッドモデル (c10k)

  • アイディアとしては、スレッドにイベントループを持たせて複数のコネクションを操作する
  • メインスレッドはデータと関係ない様々なタスクを実行
  • ワーカースレッドは並列にリスナー、コネクション、プロキシをハンドリングする
  • ブロッキングを避けるためにファイルのフラッシュをするスレッドを持つ
  • 100% ノンブロッキング
  • RCU (read-copy-update) をメインスレッドとワーカー間の共有に使用

ホットリスタート

Envoy はコネクションを一切切らずにバイナリのリロードができる。 仕組みとしては: * ソケット、ロックはシェアドメモリー上に持つ * シンプルな RPC プロトコルunix domain ソケット上で使用 * ソケットなどはプロセス間でやり取りする

Caching at Netflix: The evolution of EVCache by Scott Mansfield

EVCache = Ephemeral VOlatile Cache は Netflix が開発している KV ストア形式のキャッシュ。 特徴として: * 分散、シャードされた KV ストア * memcached を基にしている * インリージョンかグローバルかチューニング可能 * AWS に最適化している (AWS は色々問題があるので)

パフォーマンスの話で性能について話すのにパーセンタイルを使っていたのが興味深い。 聞いてみるとパフォーマンスのイメージを掴みやすいかったので、ぜひ自分もマネしたい。

パフォーマンスの問題解決については同じフロアに Brendan Gregg (詳解システムパフォーマンスの著者、パフォーマンス研究のすごい人)がいたのがよかったとのこと。

カクヨムでの縦組み表示の実装と縦書きWebの将来に向けて by nanto_vi

カクヨムで行っている縦書き表示での苦労と将来的にはどうするかについての話。

縦書き表示は CSS では規格があるものの、そのまま使うと表示がおかしくなる例があったり、バグも結構あったりで大変だったらしい。

後半ではバグの報告の行いかたについての話があった。

バグを新たに報告する際には次の3つを書くとよい * 簡潔な再現コード (jsfiddle を使うのが便利) * 期待する挙動 * 実際の挙動

あと Web 屋さんにとってはブラウザ間の挙動の違いもバグに含むものらしい。

謎ガジェット by @uzulla

https://builderscon.io/tokyo/2018/session/442f46cc-c888-4cc6-8e66-0f17144ea5fb

おもしろガジェットを作ったという話だが、作った数が 200 台ということでなかなか普段聞くことがない話を聞けた。

200 台なのでバッテリーが200個とかネジが 4,000 本あったりとするので購入するのにかなり苦労したという話も。 実際に小規模な大量生産しようとすると訳に立ちそうな話がたくさんあった。

途中でも人に評価してもらうことが大事で、作業に集中しているとすごい見落としてしまうことがあるそうだ。

Java カード @moznion

Java カードの話。SIM カードやクレジットカードはこの Java カードらしく、それらのカードの上で jvm が動いている。 当然制限は普通の JVM よりかなり厳しく型は byte だけだし、メモリの扱いなどにもかなり癖がある。

たとえば、電源を切っても Java カードの vm はとまらず、インスタンス変数のデータは残り続けるなど普通の環境とは違うことが多々あるようだ。

lld, rui314

lld の話。今回の builderscon で聞きたかった話。 lld はとにかく高速ということで、最近色々なプロジェクトで使われているし、特に FreeBSD ではデフォルトのリンカになっている。

最初は Windows 上のリンカとして作られたが、ELF 向けのパッチが送られてきてなし崩し的に他のものもターゲットになったというこ。

高速にするためのコツがかなり聞けたので良かった。 * よいデータ構造にするのが重要:データが先、コードが後 * 2回書く、1度目の経験を2度めに活かす * 最適化する箇所を最小にとどめる

gold との違いが気になっていたが、gold ではスレッドをタスク、ワーカーで扱うなど汎用的な書き方にしているので lld よりも遅くなっているのではという話。

Securty, privacy performace of next-generation transport protocols, Kazuho Oku

ネットワークプロトコルのセキュリティで、主に TLS の現状と将来のQUIC の話を聞いた。

現在の TLS 1.3 でどのような問題があって、 QUIC ではどのように解決しているのかなどを聞いた。 主な話としては: * TLS 1.3 * QUIC * Encrypted SNI

といったようなあたらしい拡張でプライバシーを確保することができるようになり、 セキュリティ面でこれまでの TCP/TLS とはかなり違った世界になるらしい。

ルーター屋とプロトコル屋で意見に違いがあったりしてな興味深かった。

TLS

  • TLS 1.2
    • ハンドシェイクには時間がかかる: Hello -> 鍵交換 -> 終了通知 -> 終了通知
    • 最初のパラメータ交換のときは暗号化されていないので、クライアント証明書・サーバ証明書がバレてしまう
    • iOS はクライアント証明書が端末単位なので、あるユーザがどのネットワークにいたのかがわかってしまっていた (トラッキング)
  • TLS 1.3
    • 最初に公開鍵を交換してとりあえず通信を暗号化
    • 暗号化してから証明書の交換

QUIC

TLS over TCP では man-on-the-side アタック = パケットを観察して RST などをインジェクションする攻撃が多い。 これは他の攻撃に対してコストが安く済むため。 この攻撃に対策するためには、認証付きでパケットを暗号化するのがよくて、QUIC ではそれを行っている。

  • QUIC の特徴
    • encrypted transport
    • handshake in 1 RT
    • mulitiplexing streams int on connection
    • fix head-of-line blocking int HTTP/2
    • mobility (network migration)

QUIC の問題 * 暗号化 * 複数のストリーミングの1つで暗号化のための前処理を行っているので、他のストリームからはいつ QUIC で暗号化通信が開始できるかの判断が難しい

Encrypted SNI

SNI = Server Name Identity も暗号化が進められている。まだドラフト段階。

Excel 依存からの脱却と失敗

非常にレガシーな体制な会社でワークフローを Excel 依存から切り替えようとしてうまく行かなかった話だった。

技術選定に失敗したとあったが、技術選定は選ぶ余地がある場合に使う言葉ではなかろうか。

上からの命令が絶対で、技術の選定が技術的な理由でなく政治的な理由から決まるというのはかなりひどい話だ。

最初から最後まで成功しそうな感じがしていなかったので、大変でしたねと言う他ない。

自分が作ったシステムで人が首になるというのはかなり胃が痛いらしい。

なぜエンジニアはパフォーマンス計測しないのか , @mogetta

健康の話

ウェアラブルバイスや IoT 機器など、健康に関する色々なガジェットを試してみたという話だった。

色々製品が紹介されたので、若干通販番組のような気分だった。

結構お金がかかっているが、健康のためにはしょうが無い。。のか?

紹介されてたモノ * HEALBE Gobe2 * Withings Wifi Body Scale * Withings Activie * Withings Sleep * JINS MEM * Spire

話を聞いてて欲しくなったがちょっと高い…。

計測結果はは Firebase に入れておいて、いろいろグラフを作りやすくしていたらしい。 やっぱり計測は大事か。

Chrome デベロッパーツールのハック

Chromeデベロッパーツールをうまいこと使ってテイラースウィフトのチケットを入手したという話。 テイラースウィフトのPVをたくさんみると、チケットが購入しやすくなるというキャンペーンをやっていたらしく、 紹介されていたハックは youtube の動画の再生数をスクリプトを使って稼ぐようにするものだった。

スクリプトを作るために、まず最初にChromeデベロッパーツールを使って、 動画の再生速度を上げたり自動再生するようにしたりするリクエストがどうなるかを調査していた。

そして狙いのリクエストが作れたらクリップボードにそのリクエストがコピーできるので、これを cURL などに渡す。 後はシェルスクリプトでもなんでもこのリクエストを投げるようにして目的達成となる。

普段フロントエンドそれほど触ったりしないので、興味深く話を聞いていた。活用できれば便利そうだ。

1 日 700,000 ビルド: Docker と Nomad が支える CI/CD プラットフォーム

Circle CI でどのように CI/CD プラットフォームを提供しているかという話。

Docker は当然として、Nomad は全然知らなかったので使っているとは思わなかった。 ただ話を聞いていると、たしかに妥当だなという感じがする。

Google I/O 2018 day 3

5 月上旬に行われた Google I/O 2018 に参加してきた。 この記事は Google I/O 2018 の 3 日目の記事である。

f:id:dexil:20180618011211j:plain

Android Jetpack: manage UI navigation with Navigation Controller

www.youtube.com

Android Jetpack で導入された Navigation の更に詳しい話。

Navigation では Navigation エディタか XML で記述される Navigation Graph を定義する必要がある。 Navigation Graph は画面遷移とありうる遷移先の設計図になる。 遷移先でしかないので、どういうタイミングで遷移を起こすかはコードで表現する必要があるが、 その際には NavigationController を使うのが勧められていた。

ここで「遷移先」になる単位は Fragment なので、 Activity についてはなるべくアプリケーションのエントリポイント・アプリケーションのオーナーとして扱ったほうがよいし、 アプリケーション全体の遷移(画面下のナビゲーションバーやナビゲーションドロワー)などでの遷移は androidx の NavHostFragment に委譲するのがよい。

Navigation には Safe Args も含まれていて、 画面遷移時の引数授受を型安全にするボイラープレートを生成してくれる Gradle プラグインが新しく提供される。

Deep Linking についてもいろいろ便利な機能を提供していて、 アプリショートカットなどの明示的な Deep Link は NavDeepLinkBuilder を使うと簡単に作成できる。 対して暗黙的な Deep Link は Navigation Graph の XML<deepLink> タグを記述しておけば良い。

Android Jetpack: sweetening Kotlin development with Android KTX

www.youtube.com

Android KTX 含めて、Kotlin を使った Android 開発のテクニックの話だが、 ライブラリ開発者など向けの Kotlin フレンドリーに書くにはどうすればいいかの話もあった。

Android KTXAndroid をより Kotlin らしい記述で実装できるようになるライブラリで、 例えば Kotlin で次のように書いていたのが

val notification = ContextCompat.getSystemService(this,
    NotificationManager::class.java)

Android KTX では次のようにかけるようになる。

val notification = systemService<NotificationManager>()

Android KTX は次のような方針で作られているそうだ: - 既存の機能に合わせて、上流の機能にリダイレクトする - サイズ、アロケーションで問題にならない限り inline にする - Kotlin 特有の機能を活用する - コードゴルフ API は避ける - 単一 and/or 特定の利用法のための最適化は避ける

また Java で Kotlin フレンドリーなライブラリを書くための KEEP-110 で提案されたアノテーションが紹介されてた。 紹介されたアノテーション@ExtensionFunction, @ExntensionProperty, @KtName, @DefaultValue の 4 つで、例えばこの内の @ExtensionFunction を使うと

class TextUtil {
    @ExtensionFunction
    @ktName("isDigitsOnly")
    public static boolean isDisigtsOnlyString(@NonNull CharSequence str) {
        // ...
    }
}

Java 書いておくと、

Kotlin 側では isDisigsOnly という拡張関数として上記の関数を呼び出すことができる。

val onlyDigits = phoneNumber.isDigitsOnly()

参考: - https://noti.st/jakewharton/ZvuDxC/present

TensorFlow and deep reinforcement learning, without a PhD

www.youtube.com

TensorFlow を使ってピンポンの AI を作る話。

内容としては API の使い方だけではなくて、機械学習の考え方を含めて解説してくれているので、機械学習の知識がない人にはいいんじゃないかと思う。

Codelabs でも同名のコースがある。ちらっと見ただけだが結構良さそう。

https://codelabs.developers.google.com/codelabs/cloud-tensorflow-mnist/index.html?index=..%2F..%2Findex#0

Improve app performance with Android Studio Profilers

www.youtube.com

Android Studio Profiler の話。 消費電力もプロファイルできるが、Android P からに限られるみたい。

Device provisioning and authentication with Android Things

www.youtube.com

Android Things のプロビジョニングと認証の話。

バイス側が行う認証は Attestation というらしい。

Advances in machine learning and TensorFlow

www.youtube.com

最近の ML が出した成果の話。 医療分野、天文学、ロボット、音楽などの分野で ML がどのように使われているか、またどういう成果を出したかが紹介された。

紹介されたなかでは、magenta https://magenta.tensorflow.org/ という AI でアートや音楽を作るプロジェクトがデモがあったのもあって興味深かった。 天文学では Gan で宇宙(の画像)を生成する事例が紹介されてたし、アイディア次第で本当にいろいろできるんだなという感想になる。

Distributed TensorFlow Training

www.youtube.com

TensorFlow を分散して動かして学習させる話。 分散での学習にはいろいろ方式があって

  • 中央集権的なクラスタにするかどうか
  • ネットワークを密にするか疎にするか
  • データ並列にするかノード並列にするか
  • パイプライン化するかどうか

などの選択肢があるが、TensorFlow では方式は選択できるようになっているとのこと。

Codelab

この日の Codelab では直前のセッションで話を聞いた Navigation のコースを試してみた。 聞いてすぐ試せるのはやっぱりいい。

f:id:dexil:20180618011113j:plain

これでシール 4 つ集まったので、次回の Google I/O のチケットがもらえる。

Sandbox

Sandbox は大体 3 日目に回ってきた。AR & VR のブースがちょっと観るだけになってしまったのが今考えるともったいない。

f:id:dexil:20180618011140j:plainf:id:dexil:20180618011149j:plain

Google I/O 2018 Day 2

5 月上旬に行われた Google I/O 2018 に参加してきた。 この記事は Google I/O 2018 の 2 日目の記事である。

f:id:dexil:20180617182433j:plain

Code beautiful UI with Flutter and Material Design

www.youtube.com

Material Theming と flutter の話。

Flutter はマテリアルデザインのファーストクラスプラットフォームとなっているそうで、

import 'package:flutter/material.dart';

をいれるだけで、Material Theming に関するあれこれが使えるようになる。 MaterialApp などのマテリアルデザインができるクラスがあって、 それに手を加えていけばマテリアルデザインにアプリが作れる。

デモでもやっていたがコードを変更するたびに、VM 上のアプリがホットリロードされるので イテラティブな開発が非常にやりやすくなっている。

Codelab で flutter のコースがいくつかあるので、flutter 触りたい人はそこから始めるのがおすすめ。

Microservices in the Cloud with Kubernetes and Istio

www.youtube.com

Kubernetes + Istio によるマイクロサービスとサービスメッシュの話。

Microservice が 2000 を超えるようなことも多々ある状況だと 管理が大変になる。そういう場合に使うのが Istio で、 これはサービスメッシュというインフラストラクチャとサービスデプロイメントを統一したレイヤを提供してくれる。 Istio を使うとコードを変更することなくマイクロサービスのルーティングを変更したりするなど、 オペレータがマイクロサービスを扱うのに便利なことができる。

デモではistioctlコマンドでルーティングルールを記述した yaml を元にマイクロサービスに色々な変更を加えていた。 GUI も提供されていて、マイクロサービスの状況が簡単にわかるようになっている。

Android Jetpack: what's new in Architecture Components

www.youtube.com

Android Jetpack の Architecture Component の話。

新しく追加されるのは Navigation, WorkManager, Paging。

Paging ライブラリは RecyclerView 向けの遅延読み込みリストを提供するもので、 データベースやネットワークなどをデータソースにするのが主な使い方になる。 RxJava もサポートしている。

WorkManager はこれまで複数あったグラウンドジョブのライブラリをまとめたインターフェースとなるもので、 タスクのチェーンや制約条件の指定などをつかって柔軟にバックグラウンドジョブを登録することができるようになる。 制約条件にネットワークにコネクションがはられた場合にひとつだけジョブを開始するというような設定もできる。

Navigation は画面遷移の設計を簡単にするもので、GUI 上から簡単に画面遷移を設計することができる。 また DeepLink を貼って、本来複数回の画面遷移後に表示される画面にジャンプした場合のバックスタックも自動的に作ってくれる。 なお Navigation での画面遷移は Fragment を使っているので、Acitivity は単なるエントリーポイントとして使って Fragment で画面遷移しようという意図が感じられる。

プロジェクトの目標としては Architecutre Component がデフォルトになるようにしたいらしい。

TensorFlow for JavaScript

www.youtube.com

TensorFlow が JavaScript で使えるようになるというだけだが、 それが嬉しい点としてブラウザで動かせるとカメラとかセンサとか機械学習に役立つものが使えるから、というが個人的に非常に腑に落ちた。 ブラウザというとPCから使うものというイメージを自分は持っていたが、最近ではスマホ上のものの方が多いもんな。

普通の TensorFlow からモデルをインポートする使い方もできるし、node.js で動かすこともできる。 パフォーマンスとしては普通の TensorFlow と遜色ないレベルにまでなっているそうだ。

Introducing AIY: Do-it-yourself Artificial Intelligence

www.youtube.com

AIY の紹介。AIY は ダンボールと Rasberry Pi に加えて色々部品がついて、自分で組み立てる IoT グッズ。 AI と付いている通り、TensorFlow が入っていて、現在は画像認識ができる Image Kit と、音声認識ができる Voice Kit がラインナップされている。

f:id:dexil:20180617182606j:plain

Google I/O が終わった後にサンフランシスコの Target までいって買おうとしたが売り切れだった。 展示はしていたので、販売自体はしている様子。 秋月電子でも扱っているので、一応日本でも買うことはできるようだ。

Android Jetpack: what’s new in Android Support Library

www.youtube.com

Support Library が Android Jetpack に含まれたことによる変化の話。

Support Library でバージョンがわかりづらくなっていたのを整理して、1.0.0 に巻き戻した上でこれからは Semantic Versioning に従ってバージョニングする。 後ライブラリとしては androix という名前空間になるので、これまでは support.* だったのが androidx.* になる。

androidx へのマイグレーションAndroid Studio 上から行える用になっているが、これはまだバギーでバックアップを取るのが望ましいようだ。 また AAR/JAR のバイナリをマイグレーションする Jetifier というツールもある。

ML Kit: Machine Learning SDK for mobile developers

www.youtube.com

ML Kit の紹介の話。

ML Kit は iOS/Android どちらでも使える SDK でモバイルフレンドリー、つまりネットワークのオン・オフにかかわらず使えるようになっている。 ネットワークがオフ時にはオンデバイスで推論して、オンの場合には Google Cloud AI の推論 API が使える。 Firebase は必須。

使える API はテキスト認識、バーコード認識などモバイルで使えそうな基本 API がある他、カスタムモデルもサポートしていて好きな推論をすることができるようになっている。

ML Kit も Codelab でコースがありすぐに試すことができる。やってみると簡単に推論ができるのがわかる。 ML Kit の API 呼び出しは、機能別に月 1,000 回までは無料なので、codelab はお金をかけずにできるはずだ。

Community Groups - Northeast Asia and Oceania

北東アジアの開発者向けのミートアップにもちょっと行ってみた。 写真撮影をしていたので入ってみたが、なんか全然関係ないところの撮影だったかも。 一応ちょっと名刺とか今作ってるサービスのシールとか配ってきた。

Codelabs

Codelabs の待機列が少なくなってきていたので、自分も並ぶことにした。 このとき手をつけたのは、Flutter 2 コースと Slices 1 コース。 その場で Googler に質問できるのは思っていたより良かった。 結構時間かかるのもあったが、あまり Codelab の終了時間まで少しだったので短いものばかり選んでしまった。 もうちょっと早めに始めたほうが良かったかとちょっと後悔。

After Party

f:id:dexil:20180617182514j:plain

二日目の After Party では Amphitheatre でライブがあった。 サイリウムのような、 LED が入った棒をもらったので振ってきた。 これ自宅まで持って帰ってきてしまって処分に困っている。

その他

この日に Google Home mini と Android Things Starter Kit をもらってきた。

f:id:dexil:20180617182730j:plain

Google Home mini は現在部屋に設置して使っているが、このブログを書いている時点でまだ Android Things の方に触れてないという体たらく。さっさと 3 日目のも書いたら手を着けたい。

Google I/O 2018 Day 1

f:id:dexil:20180610210801j:plain

5 月上旬に行われた Google I/O 2018 に参加してきた。 この記事は Google I/O 2018 の 1 日目の記事である。

今回の Google I/O の自分の方針としては

  • セッションは Android, 機械学習中心
  • 前回行かなかった codelabs とかも参加する

後で社内で発表するので、まとめやすいセッションを中心に聞いておこう考えてたが、 実際やってみると codelabs が結構良くて観るつもりだったセッションもいくつかスルーしてしまった。 まあ youtube で見られるとわかっていたので、ここでしかできないような体験の方をやっておいてよかったと思う。

次回行く機会があったらもっと codelabs とか Office hour とか参加するようにしたい。 また今作っているサービスのステッカーとかも持ってきたので少しでもいいから配っておくのが小目標。 エンジニアはそういうの主張してなんぼのもんだとようやく最近思うようになってきた。無論自分には苦手なことではあるが…

2016 年と比較になるが、 待機列、給水、などなど非常に運営が非常に改善されていてしんどいイベントにならなくて本当に良かった。

キーノート

www.youtube.com

残念なことに前日の疲れと目覚ましの設定ミスがあって少し寝過ごしてしまった。 ただその時点では 9 時のシャトルバス乗れるし、流石にキーノートには間に合うかと思っていたが、 実際バスに乗ってみると渋滞がひどくて結局キーノートの開始には間に合わなかった。 前日のシャトルバスから 30 分くらいでつくかと思っていたのが、結局 1 時間 30 位は掛かってしまったので 朝は早めに出たほうがいいんだろうな。

前の方の席にも座れず、結局後ろの芝生席から観ることになってしまった。 ただ天候は穏やかで、2016年の経験から恐れていたよりも気温・日光ともに強くはなく 日陰ではなかったが割と快適に観ることができた。

キーノートで特に印象に残ったのが Google Duplex。会場の反応もかなり大きかった

デベロッパーキーノート

www.youtube.com

こちらは開発者向けのキーノートで、開発者が聞いてて楽しいのはこっちの方だと思う。

Android から機械学習まで、今回の Google I/O の目玉が一通り聞ける。

Android P はまだベータのまま。 popcycle になるという予想が出ていたし、てっきり Google I/O で正式名称が発表になるかと思っていたが、ベータの発表だった。

後で調べてみると他のメーカのがベータを使えるのは結構意義があることだったらしい。 いままでは Google Pixel とかの Google 端末が対応してから他のメーカーが追随するという形だったのが、 これからは他のメーカもベータ版の時点で対応できるようになる。 ということは新しい Android への対応もしやすくなるので、Android がアップデートされるまでの期間が短くなるかも。

Android Jetpack があるので、今回の Google I/O でまた Android の開発環境が結構変わるんじゃないかと思う。

あと Kotlin も昨年の Google I/O で公式に Android 開発の言語になってから、 けっこう浸透してきたようで、 発表された限りではすでにアプリの 35 % を Kotlin が占めているらしい。

セッションで使われるサンプルコードも Kotlin がほとんどだった。

Android Bundle も結構重要そうで、今後の Android 開発ではモジュール化を考えるもの求められてきそう。

Matrial Design も Material Theming に更新されたし、本当に変化が大きい業界だなとおもったり。

What's New In Android

www.youtube.com

Android API の新機能を紹介するセッションであり、今後のセッションの紹介をするセッションでもある。 ブログにまとめるときにちょっと見なおしてみたが、やっぱり量が多い。

紹介されていたのは:

  • Android app bundles
  • Android Jetpack
  • Jetpack Architecture 関連の変更
    • Lifecycle, Room,
  • Core platform
    • battery
    • app standby buckets
    • background restrictions
  • Background input & privacy
    • バックグラウンドジョブのセキュリティ改善
  • Kotlin
  • Mockito
    • 発音は「モヒート」と同じ感じ
    • Mockable Framework
    • Activity などシステムオブジェクトのモックも可能に
  • Background Text Mesurement
    • テキスト長計測の改善
  • Magnifier
    • テキスト選択の改善
    • API も提供
  • Baseline Distance
    • フォントベースラインの設定が柔軟になった
  • Smart Linkify
    • Linkify より賢い
    • テキストを解析して単語からリンクを生成する機能
  • Location
    • 室内の位置取得のための WiFi Round-Trip-Time APIs
  • Accesibility
    • ナビゲーション周りの変更
  • Security
  • Enterpise 向け機能
    • プロファイルのスイッチ, アプリケーションのデバイススクリーンへのロック, 一時ユーザ
    • キオスク端末のアレ
  • noch
  • slices
  • Android actions
    • Google Assistant 向けの改善
    • Deep links int o your app
    • a visible Intent, shourtcuts with parameters
  • Notification
  • Deprecation Policy
    • 2018 夏から API 26 が必要になる
    • Native Componens -> 64 bit 対応が必要になる
  • App Compatibility
  • NDK
    • r17 -> Neural Networks API, JNI shared Memory API, etc
    • r18 -> GCC 削除
  • Camera
  • ImageDecoder
  • Media
    • HDR VP9 のビルトインサポート
    • HEIF のサポート
  • Vulkan
    • Vulkan 1.1
  • Neural Networks API
  • ARCore
  • ChromeOS

What's New in Firebase

www.youtube.com

Firebase の現状と新機能を発表するセッション。

大きい発表としては ML Kit がある。 ML Kit は現在 5 つの基本 API と、カスタムモデルに対応している。 認証周りも更新があり、電話番号での認証とパスワードレスログイン対応が追加された。

What's New in Android Developer Tool

www.youtube.com

Android Studio の改良色々。

ビルド時間など性能面が改善された他、機能的には Navigation といった Jetpack の新機能や Android App Bundle に対応し、プロファイラも改善された。 プロファイラはCPU, メモリ, ネットワークのよくみる指標に加え、消費電力のプロファイルが取れるようになった。

The future of app

https://www.youtube.com/watch?v=0raqVydJmNE

Android App Bundle 周りの話。 Android App Bundle によって、端末ごとに必要最低限のモジュールだけはいった apk を配布できるようになるし、一部のモジュールはオンデマンドで配布することもできる(Dynamic Feature)。

機能的には Google Play が aab 周りの世話をするようで、古い Google Play を使う場合は従来通りに全部入りの apk が配布されてくる。

また Android App Bundle は、将来的には Instant App との統合されるらしい。

Modern Android Development

https://www.youtube.com/watch?v=IrMw7MEgADk&t=241s

最近とこれからの Android 開発ツール・手法の話。最近の Android アプリはどうやって開発するといいのか、というのを知りたいときは見るといいかも。 それらが年を追うごとにどんどん変化しているのが紹介された。

今後は Single Activity にして、Activity はエントリーポイントとして利用される事になりそう。 アーキテクチャについては ViewModel + LiveData が良さそう。

After Party

お楽しみの After Party。 1 日目の After Party では Google I/O 会場全体がパーティー会場になって、さまざまな催しが行われる。

f:id:dexil:20180610210526j:plain f:id:dexil:20180610210552j:plain f:id:dexil:20180610210544j:plain f:id:dexil:20180610210535j:plain f:id:dexil:20180610210529j:plain

社内 Google I/O 参加報告会

slides.com

6/7 に社内で Google I/O の参加報告会をしてきた。

発表者自分だけなので、 Google I/O の雰囲気が伝わればと思って広く浅くという方針で作ったが、 やっぱりアンケート見ると紹介できなかった範囲が聞きたかったという反応が割と多い。 Firebase の話とかあっても良かったが、流石に対して聞いていないセッションの話をするのはやめておいた。

slides.com

個人で買った Office 365 のライセンスが切れたので、別のプレゼン資料を作るのに良さそうなサービス探していて見つけたのがこれ。 最初は Google Slides 使ってみようとしたが、コードの貼り付けができるようには見えず、結局他の人が使っていたこのサービスにしてみた。 完全とは言えないが、そこそこシンタックスハイライティングが効いているのでこれで良しとした。

とはいえ発表の一週間前に使うスライドツールを変更したのはあまり良くなかったんじゃないかとは思う。まだ使い方に慣れてない。

Google I/O 2018 Day 0

5 月上旬に行われた Google I/O 2018 に参加してきた。 Google I/O は 2016 に参加してから 2 回目の参加になる。今回も抽選での当選だった。

Google I/O の開催期間は 5/8 から 5/10 の 3 日間で、その間は朝から夜まで Google の技術にどっぷり浸かれる素晴らしいイベントである。

今回はなるべくキーノートを前の席で聞きたかったのと、前日に Intel のイベントがあるらしいと知ったため、バッジピックアップの前日 5/6 に到着する予定を立てた。 本来は 5/6 の昼ごろ到着の予定だったが、飛行機が遅延したのもあり、結局ホテルへの到着は 5/6 の夜頃になってしまった。

バッジピックアップ

f:id:dexil:20180521224856j:plain

バッジピックアップ、要するに参加登録は 5/7 の本番前日から開始していて、早めに登録したほうがキーノートを前の方で聞くことができる。 自分の到着は 11 時頃だったが、もうすでにかなりの人がバッジを受け取っており 自分は 103 グループの席(かなり前の方の席)を確保できた。

その後はすぐ近くの Google 本社とギフトショップを見てから一度サンフランシスコまで移動し、夕方にある Intel のイベントまで時間を潰した。

f:id:dexil:20180521224845j:plain

Intel's Google I/O Day Zero Party 5.0

f:id:dexil:20180521224833j:plain

Intel's Google I/O Day Zero Party は、 Intel による Google I/O 参加者向けの パーティで、食事と飲み物のほかに Intel の開発者による実機を使ったデモを見ることができる。 デモの解説をしているのは Intel の技術者なので、直接 Intel の技術者に質問をする機会がある。

なお参加は無料で、Intelノベルティグッズ etc もおみやげにもらえる。 以前の Day 0 パーティーだと Chrome book がおみやげに出たこともあったらしいが、今回はそれほど豪華な景品は出なかった。

今回のデモで紹介された内容としては:

といった感じで Intel も色々な分野に手を出しているのがわかる。

特に機械学習には力を入れているようで、組み込みと合わせたデモが多かった。

f:id:dexil:20180521224828j:plain

目立っていたのが Intel Movidius で、これがあれば Tensor Flow などのディー+ プラーニングを行えるようになる。 デモでは Rasberry Pi とこの USB スティックを組み合わせて機械学習や物体検出のデモを行っていた。 Movidius は後で調べたら秋月でも扱っているくらいなので、日本でも楽に手に入れられるようだ。 それ以外でも IoT + 機械学習の実例のようなデモが多く結構興味深いものが多かった。

食事も良かったので文句ないイベントだったが、ちょっと失敗だったのはホテルに帰ったのがかなり遅い時間になってしまったことで、翌日以降に結構響いてくることになる。

以下 Day 1 に続く。

ScalaMatsuri2018 3日目 メモ

Scala Matsuri 2018 の 3 日目。この日はアンカンファレンス形式だった。

結局圏論が理解出来なかった俺達の復習

圏論の話。 圏論を学ぶ理由として、「抽象」の見方が変わるという話があった。

  • proper value -> 即値みたいなもの
  • first order value -> \x -> x + 1
    • OR function
  • high order value(function)

  • 圏論がなぜ良く出てくるか

    • 上記のものを型でやる
  • proper type = 値を入れることができるもの

  • 型コンストラクタ = 1 order kinded type
    • 型は
      • 数学的には「*」と書くことが多い
      • Scala 的には「A」とだけ書いたり
    • Option の型
      • F[A]
      • * -> *
    • Either
      • F[A1, A2]
      • `* -> * -> *
    • Functor
      • `( -> ) -> *``
      • 高カインド型
      • 型コンストラクタを受け取る型コンストラクタ
      • F[G[A]]
  • Scala は higher kinded type を扱えるので、より関数型言語っぽいことができる
    • See 型システム入門
  • parametricity -> 多相性のひとつ?
  • 圏論を学ぶ理由
    • 少しかじると大切なことを学べる
    • 「抽象」が抽象的でなくなる
    • 圏論的な「抽象」
      • 圏論の公理を使って組み立てること
  • Product, 積 -> tuple, Co Product, 余積 -> Either

依存型プログラミング入門

Idris は Haskell ベースの関数型言語で、

  • 次の点でHaskell と違う
    • default eager evauation
    • type annotation
    • etc
  • 機能
    • Dependent type
    • Type depends on value 型の中に値を持っている
    • types are first class
    • Proof with dependent type

Idris 入門

  • Vect 型
    • list which contains number of elements in this type
    • Vect n a
      • n: number of elements
      • a: type of elment
      • Vect : Nat -> Type -> Type
      • Nil : Vect 0 elem

Vect に対する tail 関数は次のようになる

my_vect_tail : Vect (S n) a -> Vect n a
my_vect_tail (x :: xs) = xs

Vect に対する zip 関数は次のようになる

my_vect_zip : Vect n a -> Vect n b -> Vect n (a,b)
my_vect_zip [] [] = []
my_vect_zip (x :: xs) ( y :: ys) = (x,y) :: my_vect_zip xs ys

これだけで定義完了。 長さが等しいことをコンパイラがしっている

index 関数

my_index : Fin len -> Vect len elem -> elem
my_index FZ (x::xs) = x
my_index FS (x::xs) = index k xs
  • Fin len とすると、 0 以上 len 未満になる
  • my_index never fail

実際に my_vect_zip を呼ぶ際には、ユーザ側で引数のVect同士の長さが等しいことを示してあげる必要がある

ここらへんあまり追えてないが、EqNatというものを使ってどうにかしていた。

data EqNat : (num1 : Nat) -> (num2 : Nat) -> Type where
     Same: (num : Nat) -> EqNat num num
  • EqNat のコンストラクタは Same のみ
  • Same では型引数はひとつしかない。
  • -> EqNat の型引数 num1 と num2 は同じもの

以上のような自分でzip関数を書いてみるのはチュートリアルのなかであるらしい。

実践ScalaでDDD(改訂版) @crossroad0201

Scala での DDD の話。

たこ焼き屋に並んでたため、途中からしか見てない…

  • データと動作を分離させる
    • implicit で動作を分離させる
  • コーディング
    • 名前をちゃんとつける
    • prefix で型を知らせる (ex. maybeUser で option に包んだ User とか)
    • formatter を使う
  • レイヤー
    • 依存性の逆転を使う
    • Onion Architecture
      • Clean Archiitecture, Hexagonal Architecture
      • 原理は一緒(と思われる)
  • Error Handling
    • 例外は基本使わない。 Option を使う

DDD compmonents by Scala

  • Application Service
  • Entity
    • 1 Entity in 1 Aggregation
  • Value Objects
    • type alias
    • extens AnyValue
  • Role
    • DDD にはないモデル
    • リレーションを拡張する仕組み
    • 例えば、ユーザにたいして Author という関係が惹かれていた場合、 User にメソッドを入れるのではなく、Author とうロールを作って、 そこにメソッドを追加したい
    • implicit でうまくやる

Scala Design Patterns @gakuzzzz

Scala でのデザインパターンの話。

  • Builder Pattern → Scala では必要なし
    • 条件に合わない初期化をコンパイルエラーにする Type-safe Builder Pattern は finagle とかで使われている
  • Concept Pattern → 型クラス
  • Loan Pattern
    • リソースのクローズなど、処理忘れをしたくない時にやる
      • 言語機構としては try, finally
  • a la carte import
  • Aux パターン

あと3日でJava 10がリリースですが、興味ある人いますか?

Java 10 の話。

Java 10 はとりあえずいれてみた。 Docker aware になるのは 10 からで、それまでどうやってたか気になって調べたが、cpu を指定するオプションがあるもよう。

Dottyの新機能 @amaya382

Dottyの話。型推論が賢くなるのはいいね。