My Favorite Things - Coding or die.

とある技術者の経験記録、的な。

potatotips #40 に参加してきました。

はじめに

(2017/05/27追記) 新たに公開された発表資料を追加しました。

以下のイベントに参加してきました。 potatotips.connpass.com

実は当日まで参加予定ではなかったのですが、 偶然にもAndroidのブログまとめ枠が一人空いたとのことで急遽参加させていただきました。 (ちなみに「ブログまとめ枠」での参加は初めてです)

ちなみにここ数年はiOSエンジニアとしての活動が多いので、ポテチには一度は参加したいと思っていました。 本当は発表者として登壇したいという欲望もあったのですがそれは別の話。

Androidのブログまとめ枠での参加でしましたが、iOSも含めて記事にしちゃいたいと思います。 (大丈夫ですよね?)

箇条書きはリアルタイムで頑張って書いたものなので、間違いとかあるかもです・・・ご容赦を。 またスライドとかは後日公開とかもあると思うので、アップされしだいリンク追加していきます。

乾杯

まずは乾杯、というかもう飲んでる人多数。 Swift愛好会といい最近の勉強会は最初に乾杯ってパターンが多いんですかね?

事前説明

Rettyの中川さんより会場説明。

CMタイム、スポンサーだから当然許されます。 engineer.retty.me

iOSDCやPyConなどのスポンサーもやっているらしいです。 イベントスペースなどもレンタルもやっているとのこと。

Retty Android もくもく回?なるものもやっている、 勉強会などのコミュニティ活動もサポートしてくれる、とのこと。ふむふむ。

では、各発表のまとめです。

どうしたらログがちゃんと管理できるのか?(kosako)

speakerdeck.com

  • アプリの分析
    • GA
    • DB
    • 自前(TD?, BigQuery)
      • 今回はこれのお話
  • よくあるパターン
    • ここの数字をみたい
    • ボタンのタップ数ってどっちが多いの?
  • よくあるパターン
    • 都度埋め込まれるログ
    • 取りたいデータが取れない
    • 後始末がされにくい
    • etc
  • アプローチ
    • ログを送るメソッドを1つに
    • コールする場所ではどこに送るか指定しない
    • 送信設定ファイルを用意して集約
  • イメージ
    • ボタンタップ
    • 送信メソッド(ここで設定ファイルを見る)
    • 送信
  • 設定ファイル(log.json
    • ログの設定を集約する
  • ポイント
    • JSONファイルを用意すれば
    • ログの意味が分かりやすい
    • ログ同士の対応表がそこにある
    • 設定ファイルを変更すればOK
  • 今後の野望

「ログをどう管理するか?」という課題に対して、1つの設定ファイル(JSON)に集約するというアプローチ。 個人的にはコード上に値が分散するよりも断然良いと感じたので、良いアプローチだと感じました。

Modern Java Libraries with Kotlin(Keisuke Kobayashi)

  • 無料送金アプリ(Kyash)
  • 今日
    • JavaライブラリをKotlinでも
    • 特別に対応が必要なケース
  • Dagger2 + Orma
    • kaptで自動生成されるクラスはDaggerでprovideできない
    • OrmaDatabase
  • OrmaDatabaseをラップすればOK
  • Dagger Module
    • ラップしたクラスを返す
  • Data binding
    • dependenciesにkaptを追加する
    • Androidバージョンに依存するのでバージョン番号も書く
  • Parceler
    • Parcelableのボイラープレートを自動生成
    • Kotlinのデータクラスで使いたい
  • data class
    • toString, hashCodeの実装が不要
  • @Parcelをつけるだけでは動かない
    • Kotlinのプロパティはフィールドではない
  • @Parcel(Parcel.Serialization.BEAN)ってやつ
  • おまけ
    • サンプル作ったよ(2ヶ月くらい)

JavaライブラリをKotlinで使う際に特別な対応が必要になるケースの紹介でした。 私はAnrdoid初学者でDaggerくらいしかライブラリを知らなかったのですが、なんとなくイメージは伝わってきました。

個人的に、Kotlinのプロパティはフィールドではない、というのは勉強になりました。

ゲームアプリの「ドット絵」をディープラーニングで自動生成(shu223)

qiita.com

  • 結論:失敗したorz
  • DCGAN
    • アイドルの顔画像を大量にあつめて自動生成
    • スライドに写されたのは元データではなく実際に生成された画像!!
  • DCGAN-tensorflow
    • サンプルデータだとセレブっぽい顔の画像をせいせい
  • 自前のデータを食わせてみたい
  • スーパークエス
    • ドット絵モンスターを自動生成できないか?
  • やってみた
    • 基本的にフォルダに置いて動かすだけ
  • epoch
    • 学習の進み具合
    • 途中経過が面白い
  • 学習は順調に見えた
  • 過学習
    • 学習データを元にしちゃってる?
  • 何が違っていたのか?
    • セレブは20万枚
    • 目も鼻もある、だいたい似てる
    • アイドルデータも似てる
    • 学習データの量も変化も違う
  • まとめ
    • ダメだった
    • 問題設定が悪かった&データ量が少なかった
  • QA
    • もう一度チャレンジしますか?
      • しません。(ドット絵の題材はもうやらない)
    • 解析にかかった時間
      • MacBookProでまる1日くらい

ドット絵ディープラーニングで自動生成しようとしたけれどダメだったというお話。 結果はさておき、失敗要因の分析がとても良いと思いました。

ちなみに epoch の過程を見るのは確かに楽しそうだと思いました。

Kotlin Reflection(hikaru_satoh)

  • 自己紹介
  • リフレクションのKotlinバージョン
    • KClass、KPropertyを利用する
  • プロジェクト設定
    • app/build.gradleに追加する
    • 書かなくてもビルドエラーにはならなかったが、エラーログとか
  • 4.8kb多くなった
  • Class References
    • KClass型
    • User::classで取得
  • member.properties
  • private
    • privateなプロパティがあると例外スロー
    • isAccesible = trueってやれば見られるようになる
  • Property References
    • kProperty型
    • User::firstName.get(user)みたいな感じで使える
    • privateメソッドは見られないのでコンパイルエラーになる
  • KProperty1
    • p:KProperty1<User, *>
  • KPropertyの種類
    • 0: static変数を取得
    • 1: メンバーのプロパティ取得
    • 2: (聴き逃した)
  • まとめ
    • Javaと同じような感じでアクセスできそう
    • 他にもリフレクション機能はいろいろ使えそう
  • QA
    • リフレクションの具体的な利用事例は?
      • デバッグ出力を簡単にしたり、ホットパッチ?

Kotlinでのリフレクションの使い方についての説明。 Java8におけるメソッド参照みたいなことが出来る分、Kotlinのリフレクションは安全なのだなと感じました。

シークバーサムネイル作成Tips共有(satoshi0212)

  • AbemaTVの人
  • 何を作ったのか?
    • シークバーのサムネイル表示機能
  • アトラス画像表示
    • サムネイル画像をまとめたもの
    • APIを用意してもらって、番組ID、サイズ、時間
    • 1枚で600秒分
    • シークバーを初めて触った時に取得
    • 再生時間を元に特定
  • デザインの作り込み
    • デザイナさんが思い入れ
  • DEMO
  • まとめ
    • アトラス画像方式はわりと軽めで実装できた
    • 画像取得タイミングを遅らせてみた
  • 蛇足
    • 作り込みたいけれど締切はあるね
    • そういう部分を作る担当になる
  • QA
    • 画像の切り出しタイミングって?
      • 実際に表示しようというタイミングで切り出してUIImageを生成している
      • けれど質問されて、UIImageで切り出す必要はないかもと思った

動画再生においてシークバーをスライドするとサムネイルが表示される例のアレ。 アトラス画像といった考え方や、データ取得を遅延させるといったテクニックなどが聞けて面白かったです。

ちなみに、そういう部分を作れる担当になれるかが重要、というのはまさにだと思いました。

Android Instant App(Sam)

www.slideshare.net

  • 自己紹介
  • Android Instant Appとは
    • インストール不要のAndroidネイティブアプリ
    • URLの起動に応答してインストール不要でアプリ起動
    • PlayStoreとは全然別
  • 仕組み
    • 機能ごとにダウンロードしてくる
    • URLからの要求に対して必要な機能だけをダウンロード
  • 2つのAPK
    • Base Feature APK
      • 2回目以降のダウンロードは不要
    • 機能のAPK
  • 機能ごとにモジュール化させる
    • 1つのモジュールは4MBまで
  • 制限されている機能
    • フアグラウンドは実行できる
    • 外部ストレージアクセス
    • 明示的インテント
    • ブロードキャスト
  • 使えない機能
    • コンテンツプロバイダ使えない・・・
  • コンテンツプロバイダ
    • DAO使えない
    • Realmは3MB
    • Firebase Realtime Database
      • Googleが使っていいよ、と。
      • データベースの時代はクラウドになったんだぜ、と。
  • 現状
    • 50個以上のアプリが対応済み
  • ぶっちゃけ?
    • 情報が少なすぎる。。。
    • 導入する場合はユースケースを決める必要がある
      • どんな体験を?どこの機能を?

Android Instant App についての紹介。 今まで噂に聞いたことがあるレベルだったので、具体的な内容が知れて良かったです。

ユーザにとっての利点は納得できるものの、これだけ制限が多い中、開発者的にはそんなに美味しいかしら、とも思いました。 日本のブロードバンド事情を考えると、Instant App を開発して公開するメリットを感じるアプリは少ない印象を受けました。

ちなみに私も暴君ハバネロは大好きで、箱買いしたこともあるレベルなので懇親会で話そうと思いつつ、 まとめに疲れてすっかり忘れてしまいました・・・またの機会に。

Universal Links 対応した話(Ridwy)

www.slideshare.net

  • 自己紹介
    • 音声処理技術が好き
  • モチベーション
    • iOS9以降の機能
    • iOS10が普及したので
    • 実際に対応して得られた知見
  • Universal Linksとは
    • ユーザから見て
      • Webのリンクをタップした時に、ドメインに対応するアプリが起動する
    • ステータスバー
      • 左:遷移元へ
      • 右:Safariで開く、ってやれば今後もSafariで開かれる
      • 正直ユーザにはわかりづらい印象
  • アプリが起動する条件
    • Safariで開くことを選択していない
    • iOS9以降
    • アプリがインストールされている
      • インストールされていないとそのまま遷移(ストアは立ち上がらない)
    • 同一ドメイン内の遷移ではない
  • おさらい
    • Entitlementにドメイン追加
    • アプリが開かれた時に呼ばれるメソッドを実装
    • 扱えないURLはopenで開きなおす
      • でも見た目はいまいち
  • サーバ側の対応
    • AASAファイルを配置
      • ルートまたは.well-knownサブディレクトリ配下に
      • HTTPSで直接アクセスできるようにする
      • HTTPはNG、リダイレクトもNG
      • アプリのインストール時に取得される
  • AppIDのプリフィックス
  • SKIP
  • iOSが何をしているか?
  • QA
    • AASAファイルの更新が必須

iOS9から導入された「Universal Links」についての詳細な発表。 UI/UXに関わる意見や、内部的な実装がどうなっているかの予測など、なかなか深いところまで突っ込んだ内容でした。

発表者の方も言っていましたが、UIはもうちょっとどうにかならないかと感じました。

フル Kotlin で Mastodon クライアントを作ってみて(tomoya0x00)

qiita.com

  • 自己紹介
    • 組込系がメイン
    • 最近アプリとかも
  • Mastodonクライアント
    • MVVM x フルKotlin
  • なぜ?
    • SwiftやってたらJava辛くなった
  • どういったところが嬉しい?
    • Realmとの親和性良いよ
      • プロパティ名が取得できる
      • lazyで遅延取得が出来る
    • 拡張関数でUtilityクラス乱立防止
    • coroutineで簡単非同期処理
  • ハマリポイント
    • 無名くらいのインスタンス
    • DataBinding方法
      • @get:Bindableみたいな
    • 例外処理
      • 普通に囲めばOK
    • UIスレッド実行
      • coroutineビルダー
      • launchUI()を使う
    • coroutineのライフサイクル
      • onDestroyでキャンセルするには
      • async時に取得できる?
  • QA

フルKotlinでMastodonクライアントを作ってみて得られた知見のシェア。 ハマリポイントとかの紹介があって、これからKotlinを使う人には役立つと感じました。

質問の回答でもありましたが、TwitterよりMastodonクライアントの方が作るのが楽、というのはなかなか意外でした。

ちなみに関係ないですが、最近良く聞く「coroutine」を未だに理解していません。 Go言語とかでもよく聞きますし、今度ちゃんと調べねばと思います。(たぶん、Promiseとは違うんですよね?)

いまから使えるSpreadsheetView(pancake)

speakerdeck.com

  • 自己紹介
    • パンケーキの人
    • スプレッドシートは岸川さんが作ったやつ
    • iOSエンジニア
    • 東京にいるわけではないので今日はホテルに帰る
  • OSS
    • 公開後1,500スター
  • 作ったアプリ
  • 機能
    • ヘッダ固定
    • 無限スクロール
    • グリッド線とか枠線とか
    • UICollectionView like
  • サンプル付き
  • UICollectionView likeなAPIなので使いやすいかも?
  • セルのマージ機能
    • 5分刻みのセルを作ってみた
  • ほかのライブラリは?
    • ある
    • セルのマージ機能があるのはスプレッドシートだけ?
    • 標準だとリニアな探索のところ、2分探索が実装されている
  • QA
    • 結合されたセルのタップイベントはどうやって拾う?(インデックスとかどんな感じで?)
      • 現状だと左半分しか反応しない?(実装ミスかも)

岸川さんが開発されたSpreadsheetViewを使ってみたというお話。 github.com

私もiOSエンジニアなので噂は聞いていましたが、具体的にどういうことが出来るのか知らなかったので良かったです。 そしてセルの結合機能があるOSSは(おそらく)唯一なのですね。

しかしスター数1,490とは・・・凄まじいですね。

「Lottie」でお手軽アニメーション実装(shanonim)

speakerdeck.com

  • Lottie
    • 意外と知ってる人が多い
    • アニメーションのライブラリ
    • Adobe After Effectsで作ったJSONをアプリで読み込める
    • そのままアプリに組み込めちゃって楽ちん
    • iOS/Android/ReactNativeすべてに対応
  • AfterEffects
    • 映像分野ではメジャーなソフト
    • CM作成とかでも利用されているらしい
  • アプリに組み込む(Android
    • build.gradle
    • Activityはノータッチ
    • レイアウトXMLJSONを指定する
    • 複雑なアニメーションでもJSONを読み込むだけ
  • 利用ケース
    • ローディングとかアイコンとか
    • 画面全体とかは微妙かも
  • 導入までのハードル
  • LottieFiles.com
    • CCライセンスで公開されている
    • 見てるだけで楽しそう
  • まとめ
    • Lottie楽しい
    • アニメーションでUXをあげよう
  • QA
    • 画面全体には向かない?
      • アニメーションの作成コストが掛かるだけ
    • バイスサイズの対応は?
      • dpで指定すればそれに収まるようになる
      • SVGっぽい感じで、拡大してもぼやけないとのこと

Adobe After Effectsというツールで作成したアニメーションをJSONでエクスポートして、そのままアニメーション出来るLottieについての紹介。 airbnb.design

不勉強なものでAfter Effects自体知らなかったのですが、デザイナさんがそれを利用してアニメーションを作成し、 それを殆どゼロコストで導入できる(デザイナの意図が100%反映される)というのは便利だと思いました。

CCライセンスで公開されているLottiefiles.comは、たしかに見ているだけで楽しいですし、何かアイディアに繋がりそうな気がしました。 www.lottiefiles.com

Lightweight Dependency Injection Tips(Motoki Narita)

speakerdeck.com

  • 放送事故(放送終了)
    • (発表開始直後にディスプレイが消えてしまった)
  • 自己紹介
    • メルカリカウル
    • 本、CDとかに特化した姉妹アプリ
    • クラッシュレート1%を下回る
  • 今回DIを取り入れた
    • AppleでもDIのベストプラクティスをまとめている
    • Qiita記事にもまとめている
  • イケてない気がするところ
    • Segueで依存オブジェクトを渡す必要がある
  • “良い設計は誤った用法をコンパイルエラーにする"(ishikawa)
  • ルール
  • 経緯
    • アッテの開発のなかでそういう話になっった
  • 作り方
  • 作っていく中でリファクタリングを繰り返していった
  • まとめ
    • 良かったこと
      • インスタンス化の方法が統一される
      • 統一されることでDRY
      • 再利用が楽に
    • 良くなかったところ
      • Storyboardを使っているけれど画面遷移が見えない
  • 告知
    • iOSDC(今年は2.5日)

LightweightなDIを使うと良いかもよ、という話。 個人的には今日のLTの中で一番面白く感じた内容でした。

Lightweightというのは誇張ではなく、本当に最低限の仕組みであるにも関わらず、 そこに本質がきれいに表現されていると感じました。

時間の関係上リファクタリングの過程が見られなかったので、発表資料の公開が待ち遠しい限りです。

Protocol Buffers(TakuSemba)

  • 自己紹介
    • 最近ProtocolBufferを使うことがあった
    • CyberAgent, Inc.
  • Protocol Bufferとは
    • Google制のデータ通信の使用
    • JSONではなくバイナリで通信する
  • Quick Start
  • Proto fileの定義
  • スクエア制のツール
    • Javaファイルが書き出される
    • プロジェクトに追加する
  • Let’s 通信
    • dependenciesに追加
    • Retrofit
  • まとめ
    • メリット
      • データ量が少ないので早い
      • Proto fileで共通認識が取れる
    • デメリット

最近何かと話題に上がるProtocol Buffer の話。 やはりデバッグしづらかったり、API変更が面倒だというのは、どこでも共通認識のようです。

Proto fileで共通認識が取れる、という視点は今までなかったので勉強になりました。

LicensePlist(mono)

www.slideshare.net

  • 自己紹介
    • mono
  • LicensePlist
    • ライセンス管理を自動的にやってくれる
  • 今まで決定版がなかった
    • 決定版を目指して作った
    • SPMで管理
    • 手動で入れたものまで検出してくれる
  • 仕組み
    • LICENSEファイルをかき集めている
  • Cocoapods
    • plistを解析すればOK(ローカルにある)
    • Cartfile.resolvedから依存ライブラリのGitHubを見に行く
    • ライセンス取得APIGitHubから
  • plistの生成
    • PropertyListSerializationというものがある
    • 最初は自分で書いてしまったら真っ白になることも
    • YAMLファイルで柔軟性を担保
  • install
    • Homebrewに対応してます
  • 設定
    • Buildのpre-actionに設定するのがおすすめ
  • QA
    • 他の設定を生成したい場合は?
      • 出力形式を変更するだけなので要望があれば対応する(ViewControllerとか)

ライセンス管理自動化の決定版的ライブラリを作ったよ、という話。 その宣伝文句に違わず、CocoaPods、Fastlane、手動など、様々なケースに対応していてとても良さそうでした。

懇親会

窯焼きのピッツァ(!)

最後に

ポテチの参加は初めてだったのですが、多彩な発表が聞けてとても楽しかったです。 会場、飲み物、食べ物を提供してくださったRettyさん、主催者、発表者、の方々、本当にありがとうございました。 (もちろん懇親会で話してくださった方も)

ちなみに勉強会では結構メモるタイプなので、ブログまとめなんて楽勝だと思っていたのですが、 LTはテンポが非常に早くて、メモをしながら発表についていくのは思ったよりもハードでした(笑)

ではまたの機会に参加できることを楽しみにしつつ、締めたいと思います。