My Favorite Things - Coding or die.

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

Androidで利用されるGradleバージョンの確認方法

AndroidでGradleのバージョンと言った場合、以下の2種類がある。

Gradle本体

Gradle本体のバージョンは、File > Project Structure > Projectから確認できる。 f:id:yu_dotnet2004:20170804131110p:plain

利用可能なバージョンは以下のURLから確認可能。 https://services.gradle.org/distributions/

gradle/wrapper/gradle-wrapper.propertiesdistributionUrlを変更することで、新しいバージョンの利用が可能。(gradlewがラッパーになっており、自動的に記載されたバージョンがダウンロードされる仕組みになっている)

#Mon Apr 17 18:32:32 JST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip

例えば上記のように指定して、./gradlew buildすると自動的にダウンロードされてbuildタスクが実行される。

$ ./gradlew build
Downloading https://services.gradle.org/distributions/gradle-3.5.1-all.zip
...
$ ./gradlew --version

------------------------------------------------------------
Gradle 3.5.1
------------------------------------------------------------

Build time:   2017-06-16 14:36:27 UTC
Revision:     d4c3bb4eac74bd0a3c70a0d213709e484193e251

Groovy:       2.4.10
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_121 (Oracle Corporation 25.121-b13)
OS:           Mac OS X 10.12.6 x86_64

Android Plugin for Gradle

GradleのPluginとして実装されているもの。

トップレベルのbuild.gradleに利用するバージョンが書かれている。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'

利用可能なバージョンは以下から確認できる。(Gradle本体の必須バージョンも書かれている) https://developer.android.com/studio/releases/gradle-plugin.html

Gradle本体のケースと同様にファイルを書き換えて、Android Studio上からSyncすればOK。

参考URL

http://qiita.com/izuki_y/items/3c20cd1c655fc4fc6127

platform-tools について復習

なんか微妙に理解が怪しくなったので復習。

なに?

adbとかfastbootといったコマンドが含まれるツール群。

インストール

Android StudioSDK Manager からインストール・アップデートできる。 f:id:yu_dotnet2004:20170804122624p:plain

最近は SDK Manager を利用せずとも単独でダウンロードできるらしい。 https://developer.android.com/studio/releases/platform-tools.html

含まれている主なコマンド

adb

android debug bridgeの略。 apkをインストールしたりデバッグしたりまぁいろんなことに使う。

fastboot

  • Fastbootモードという、PCでいうところのBIOS画面のようなものがある
  • 端末がそのFastbootモードで起動していれば、fastbootコマンドで操作することが出来る
  • adb reboot bootloaderコマンドで、再起動後にfastbootモードで立ち上がる
  • フラッシュメモリへの書き込みや、フラッシュメモリ上のパーティションの管理などが行える
  • カスタムリカバリの書き込みを行うことも出来る

参考URL

https://jagadgetaholic.blogspot.jp/2015/12/fastboot-command.html http://news.mynavi.jp/column/androidnow/043/

iOSDC JAPAN 2017 に CfP を出してみた

iOSDC JAPAN 2017 に CfP を 3本出しました。 iosdc.jp

”当たらなければどうということもない”なんて名セリフもありますが、たしかに当たらなければ発表できません。 (悲しいけどこれ抽選なのよね)

なのでせっかくなのでシェアしたいと思います。 もし「これ聞きたいかも」と思うものがあれば、リンク先のページでブックマークやらTweetしていただけるとです。

実践テスト駆動開発 in iOS 15分 or 30分

iosdc.jp

TDD(テスト駆動開発)をご存知の方も多いかと思いますが、iOSではあまりテスト駆動開発の適用例を聞かない気がしています。 おそらくその理由の一つとして「UIが頻繁に変わるから向いてない」ということなのでしょうが、果たして本当でしょうか?

iOSにおけるUIテスティングは確実に進化しています。

本セッションではライブコーディングを取り入れながら、 実際にどのようにテスト駆動開発を適用していけるかをステップ by ステップで紹介したいと思っています。

UIテストの実行時間の短縮に挑戦する(LT)

iosdc.jp

UIテストを作成することで、リグレッションテスト(回帰テスト)の自動化といった恩恵を受けられるようになります。

しかし、往々にしてUIテストは実行時間がネックになります。 個人的な意見ですが、”実行に時間がかかる”というのは見た目以上のコストがかかっており、実際に掛かった時間以上のものを奪うと思っています。 (モチベーション、集中力低下によるパフォーマンスの低下、etc)

本セッションでは、UIテストの実行時間をどこまで短縮できるか挑戦した結果を発表したいと思います。 それによって、実際の開発にUIテストを導入する障壁を少しでも低くすることができればと思っています。

Swiftzで学ぶ関数型プログラミング

iosdc.jp

ここ数年で関数型プログラミングはかなり注目され始めています。

Swiftを作る際には関数型言語Haskellが参考にした言語の一つとして紹介されていますし、 実際、Swiftは関数型プログラミングパラダイムとしてサポートしています。

しかしながら、関数型プログラミングなかなかとっつきづらく難しいテーマであるのも事実です。

本セッションではSwiftでの関数型プログラミングをサポートするライブラリである「Swiftz」を用いつつ、 関数型プログラミングとはどういうものかという入門的なお話をできればと思っています。

最後に

まぁそんな感じです。よろしくお願いします。

ブログデザインを変更

ひと目で気に入ったので、導入させていただきました。
hitsuzi.hatenablog.com

Otemachi.swift #01 に参加してきた

参加してきました。 nikkei.connpass.com

今回はブログ枠ではないですが、簡単にダンプした内容をメモです。

会場

発表に集中しやすい落ち着いた雰囲気の会場でした。

すべての椅子にテーブルがついていて参加者にもやさしい感じだと思いました。 (ただし僕が座った椅子のテーブルは3度くらい傾斜があったような気がします・・・)

ちなみに懇親会は隣にあったタリーズで行ったのですが、タリーズとは思えないオシャレ感(失礼)で驚きました。 (ちなみに僕はカフェの中でもタリーズの利用率が一番高いです)

発表

WWDCの感想

  • 難易度
    • ハード
    • 抽選に当たる必要がある
    • チケット代高い(20万)
    • 周辺のホテルがめちゃくちゃ高い
    • 一泊$300
    • 早めに確保しよう
    • 10時間
  • 工事中だからサンフランシスコじゃなかった(らしい)
  • 空港についてから1.5h
  • 受け入れムード?
    • Uberの運転手でもWWDC知らない人はいた
  • 前日チェックイン
    • 入館証と上着をもらう
  • Keynote
    • 入るまでも並ぶ(2, 3時間)
    • CEO、役員クラスが話す
    • 開発者よりビジネス向け
    • 新しいiOSバージョン
    • ハードウェア
  • OPムービー
    • The world is depending on you.
  • Keynote
    • Mac/iOS11/iPad Proあたりが盛り上がった
    • HomePodもわりと盛り上がっていた
  • あと
    • 会場に残って、偉い人と写真撮影
    • 昼食を早めにゲット
  • Platforms State of the Union
    • 開発者向けの内容
    • Keynote よりは断然座れる
    • What’s new をまとめた内容
  • ハンズオン
    • 芝生エリアもあった
  • ラボ
    • Appleのエンジニア、デザイナなどに質問したりレビューしてもらう
    • 達人はBashで再開するらしい
    • 当日の7時くらいに予約しないと
  • ふりかえり
    • 乾燥していて意外と涼しい

開発中のアプリをXcode9 & Swift4に移行しました

speakerdeck.com

  • ハマったところ
    • ライブラリがコンパルエラー
  • Xcode9
    • コンパイル速度
      • Swift 1万step
      • クリーンビルドでは全く変わっていなかった
      • 差分コンパイルが気持ち速くなった?
      • エディタは速くなっていたので快適になった
    • Wireless Development
      • クリーンだと2〜3倍遅い
      • 差分ビルドだとWifiの方が速い場合もある
    • まとめ
      • Xcode9は素晴らしい
      • 開発者にも目を向けて改善してくれた

Swift Package Manager

speakerdeck.com

  • WWDC
    • San Jose には行った
    • いろんな人に会えたので良かった
  • Version 4 での変更内容
    • 殆ど語られていない
  • What’s New in Swift
    • 02:25/slide7
    • 7000+
    • サーバサイドで使われることが多い
  • 大きな変更があった(と語られたが)
    • そんなになさそう?
    • Swiftの言語バージョンを指定するのは前から
  • Swift Evolution を調べた
    • SE-0158
    • SE-0162
    • SE-0149
    • SE-0150
      • ワークフローの改善?
      • Gitブランチも指定できるように
    • SE-146
      • プロダクトを定義できるようになった
      • 他のパッケージに対してどのターゲットを公開するか?
    • SE-175
      • .resolvedのファイルが出来た?
  • マニフェストファイルの変更
    • exclude がなくなった?
  • まだ試してない
  • まとめ
    • コマンドラインツール/サーバサイドあで活用
    • Version4への移行がスムーズっぽい?
    • Linux上でほぼおなじライブラリが使えるから使う
      • ほぼの話
    • まだまだ発展途上?

Codableことはじめ

speakerdeck.com

  • 自己紹介
    • takasek
  • Codableとは
    • Swift4の機能
    • JSON/plistをエンコード・デコード
    • いろいろなところで発表されてる
      • 3日連続のピックアップ
  • イケメンポイント
    • Codableを宣言するだけでOK
    • カスタマイズも出来る
    • どんなEncoder/Decoderでも利用できる
  • CSVデコード出来る
  • カスタマイズ
    • コンパイラが型のメンバを自動生成している
    • 既存実装を上書きできる
    • キー名のカスタマイズ(codingKey)
    • デコードロジック(init)
  • とにかく自動生成してくれる
    • クラスの継承も考慮してくれる
    • Encoding Strategiesを決められる
  • 組み込みのエラー制御
    • 詳細なエラー情報を投げてくる
    • 予期しないエラーはこない
    • 独自のチェックも入れられる
  • エンコーディングの詳細をカプセル化
  • 抽象化されたフォーマット

XCTest.framework

  • 自己紹介
    • 学生
    • アルバイト
    • テストを書いていないって人が多いから
  • Xcode 9.0
    • 非同期テスト
      • 実装がXCTestCaseから独立
      • 非道記事のエラーが具体的に取れるようになった
      • タイムアウトでも成功になるような処理が書ける
      • 何をwaitするのか明確に
      • waitForExpectations
        • XCTestErrorが返ってくる
      • func wait
      • XCTWaiterのfunc wait
        • delegateを書ける様になったり
      • 扱いやすくなった
    • teardown
      • 個々のメソッドにteadownを入れられるようになった
      • 積むタイミングには注意
    • 名前ありアクティビティ
      • サブステップに分割出来るようになった
      • runActivity
      • ログが分かりやすくなる
    • マルチApp
      • 複数のアプリを扱えるようになった
      • launch()に加えて、activate()が増えた
      • 列挙型で状態が取れる
    • UI Elements
      • wait処理が増えた(existsがtrueになるまで待つ)
      • firstMatchで早く処理できる
    • screenshot
    • 保存
      • XCTAttachment
      • テスト中の情報を保存できるようになった
      • 成功時に残しておく場合は.keepAlwaysする必要あり
      • まとめて保存する方法ない?

High Efficiency Image File Format (HEIF)について話します

speakerdeck.com

  • 自己紹介
  • 新しい画像フォーマットに対応
    • HEIF
    • 今日は概要とデモだけ
  • JPEGデファクト
    • 連続した画像をうまく保存できない
    • 深度情報を保存できない
  • Appleが求めた画像フォーマット
    • HEVC
      • コーデック形式
      • H.264に比べて2倍の圧縮性能
      • 今後10年はサポート
    • HEIF
      • 連続する画像の保存圧縮
      • アニメーション
      • 国際規格
  • HEIFファイル
  • HEIF作成にはNokiaのライブラリを使う?
  • 実験
    • 朝刊の紙面情報を試してみた
      • 3000 x 4044 px
      • JPEG > HEIF > WebP
      • JPEGと比較しても拡大ノイズが少ない
    • 電子版アプリ
      • JPEGとくらべて20%通信量削減
  • 最後に
    • WebPと違ってハードウェアアクセラレーションが効く
    • 通信量をJPEGより削減できる
    • 素数が多い画像だと効果が高い?
    • ドキュメントが少ない

More Swift App Startup Time

speakerdeck.com

  • アプリの起動速度を高速化
  • 困っていること
    • dLibを増やすとアプリの起動速度が遅くなる
    • SwiftのライブラリはDynamicFrameworkとしてリンクされる
      • Carthage
      • CocoaPods
    • 増やすと遅くなる
  • おすすめセッション
    • App Startup TIme
    • Optimizing App Startup Time
      • 計測と改善
  • dyld3(現状2.x)
    • 新しいDynamic Linkerを作ってる
    • 実用段階になったらリンク早くなる
  • 計測手法と改善方法
    • Optimizing Startup Time Lab
      • めちゃくちゃニッチなLabがあった
  • Labで聞いたこと
    • dLib増やしすぎると遅くなる?
      • YES
    • namespaceないし、frameworkないとつらい
      • Prefixつければ?
    • iOS11で入るか?
      • まだ言えない
  • 起動時間の計測方法
      1. Instruments を使う
      2. Time Profiler
      3. Static Initializer Call
      4. 見られる
      1. Instruments via CLI
      2. 出力データはGUIじゃないと閲覧できない
      3. バイナリなのでパースできない
      1. task_info + UI Test
      2. didFinishLaunchで起動時間をとる
      3. CPU時間をとる(スマートではないけれど)
      1. DYLD_PRINT_
      2. dylibの読み込み時間が出力されるようになる
  • まとめ
    • 遅いのはどうしようもない
  • Labで生き残る方法
    • 台本を作っていく
    • ゆっくり喋ってくれ
    • 同じことを2人以上に聞く

Core ML

  • 自己紹介
  • Vision Framework/NLP
    • 学習済みモデルをAppleように変換?
  • CoreML in depth をみれば分かる
  • Q
    • なぜこれを作った?
    • マルチスレッドで使える?
      • 動かせた
    • モデルを分けて同時に利用できる
    • モデルファイルは500MBくらいある
  • まとめ
    • 使うのは簡単
    • モリーはめちゃくちゃ食うよ

5分でわかる Password AutoFill for Apps

speakerdeck.com

  • 自己紹介
  • Password AutoFill for Apps
    • Safariのパスワード自動入力と同じものをアプリで
    • Safari上のWebでログイン済みで無いとダメ
  • なぜこの機能に注目した?
  • 実装方法
    • アプリ
      • ContentTypeにusername/passwordが追加された
      • Associated Domains にWebサービスを設定
      • アプリ側にも設定
    • サーバサイド
      • ファイルを置く
  • 実装したけど鍵マークが表示されない
    • シミュレータでも実機でも出ない
  • まとめ

CoreNFC

speakerdeck.com

  • NFCAPIが来た
    • セッションはなかった
  • メリット
    • 直感的
    • 互換性
    • 安い
  • Reader/Writerモード(実装必須)
  • 八重洲NFC専門ショップ
  • ユーザをトラッキングしたり(イベント)
  • Wiiのコントローラーにも
  • iPhone7とiPhone7+

感想

全体的に濃い内容が多く、非常にためになる内容ばかりでした。 個人的には新しいXCTestの内容に非常に興味をもちました。

CAMPFIRE iOS #2 に参加してきた。

CAMPFIRE iOS #2に参加してきました。

ブログ枠です。 多忙でまとめるのが遅くなってしまいました。

WWDC2017 レポート & Quick Look Preview Extension について

  • WWDCに行った感想
    • 英語の勉強にもなるし良い経験になる
  • メリット
    • 1週間、WWDCに集中できる(業務から離れられる)
    • 参加者の日本人同士で交流できる
    • 新機能について不明点があったらLabsに聞ける
  • デメリット
    • 業務溜まったり
    • 飛行機が
  • Bash
    • 有名なアーティストの演奏を聞きながらお食事
    • すごく楽しかったのでぜひ
  • WWDC Labs
    • 既存アプリについてアドバイス
    • 新機能の説明
    • 実装の相談
    • マーケティング関連の質問
      • 英語力がなくて伝わらない場合はタイピングしてもらった
      • やはり英会話は必要
  • UIKitラボ
    • 記事詳細の実装方法について
    • HTMLをUITableViewにマッピングしている
      • UIWebViewの描画だと遅かったから
      • WKWebViewだと速くなった
    • どちらが良いの?
      • サービスの方向性次第だよ
      • UITableView/WebViewどっちでもたくさん使われてるから大丈夫だよ!
    • TRILLのUIについての相談
      • タブ化したほうがよい
      • ユーザに見せたい画面がどれだか分からない
      • 参考に出来るものとしてAppStoreを見ればいいんじゃない?というアドバイスを貰った
    • CoreMLとか
    • Labsは素晴らしい
  • Quick Look Preview Extension
    • 現地でも人気がなかった・・・
    • TRILLではCore Spotlightを導入しているのでチェックした
    • 動画ででも紹介
      • フォースタッチでクイックルック
      • (会場の反応が薄い・・・)
      • 今後は対応端末も増えてくるし、バカにできないんじゃないと思う
  • CoreML
    • デモ
      • 動物をランダムで表示して、それを解析する
      • 機械学習の部分は完全にオフライン
        • ユーザのプライバシーを考慮
        • サーバサイドの実装が必要ない
      • 40行くらいのデモ
  • Day1対応
    • 去年行ったこと
      • Swift3対応
      • UNNotification対応
      • Widget
    • うまく行けばフィーチャー枠に乗っけてくれる
    • 3回くらい特集に組み込まれた
      • Day1の対応をしたおかげ?
    • Swift化は企画も納得してくれたのでやりやすかった
  • まとめ
    • 英語力が必要
    • Quick Look すぐにサービスに使えるのでおすすめ
    • Day1対応

WWDCについてのリアルな感想が聞けて良かったです。

ちなみに Quick Look Preview Extension は正直あんまり興味をそそられませんでした。私がフォースタッチの端末を持っていないのと、フォースタッチ自体あまり良い機能とは感じないためですが。(SteveJobsだったら絶対につけない機能だと思ってます)

マスティフ: (for Xcode Beta) バージョンアップ対応を軽減するためのサービス

  • イントロ
    • マスティフ
    • 今日は Xcode β について
  • 宣伝
    • iOS Test Night #5
    • 今の人数は把握済みです
    • WEB-DBに寄稿しました
      • Espresso / XCTest / Appium
      • UIテスト自動化
  • WWDCについて思うこと
    • Xcode9になってようやくまともなIDE
    • アプリの動作確認とか既存の動作については?
  • WWDC2017の影響
    • 既にリリース
      • 自動アップデート
      • サブタイトル
      • プロモーション用テキスト
    • そのうち
      • Xcode9
      • iOS11
  • マスティフとは?
    • バージョンアップ対応軽減サービス
    • ライブラリのバージョンアップを自動的に行なってくれる
    • 既存ライブラリが動くことを定期的に動作確認
      • 使えなくなったことを早めに知りたい
    • 大きな流れ
        1. バージョンチェック
        1. バージョンで動作確認(Jenkins)
        1. 通知
    • 1日1回、現行バージョンの動作確認
    • 新しいリリースの検知
      • Xcodeとか自動的にインストールされる
      • Fastlane/gem
    • 朝来て通知を見たら落ちるのが分かってた
      • Firebase
    • セマンティックバージョンに従っているものは少ない
  • WWDC2017初日の出来事
    • deliverが失敗してた
    • 出社するまでには全ての対応が終わっていた
  • Xcode βとの生活
    • 1.ベータ版はn回リリースされる
      • info.plistのバージョン番号は変わらない
      • buildNumberを見る
    • 2.ベータ版のGM
    • 3.正式版
    • マスティフ
      • Xcode β は通常フロートは別で用意
      • 古いのは残さない
      • 散布アプリを元に動作確認
        • 既存
        • 新規対応
  • SWETとして
    • テスト周りと中心に見ていく
  • 最後に
    • WWDC2017お疲れ様でした
      • GM版が出るまでが勝負
      • バージョンアップ対応における不安とコストは極力下げていこう
    • フィーチャー
      • iOSバージョンアップも自動化出来ないかを検討中
        • AWS Device Farm での利用を検討したがベータ版が無い
        • 新しいテストの仕組みで自動化できるかも?
          • うまく行ったらシェアします

Mastiff、OSS化が楽しみです。

Essential for What’s new in Distribution

  • イントロ
  • Distribution で何が変わったか?
  • Report
    • 新しいAppStore
      • 俺達が作った最強のAppStoreという話
    • iTunes Connect
    • StoreKit
    • Device Configuration Deployment And Management
      • ATS対応が2018年に必須化される(さらっと)
    • Advanced StoreKit
      • レシートのバリデーションやSandboxの話
  • AppStore
    • タブが増えた
    • IAPが可能に
    • サブタイトル
    • 動画プレビューが勝手に再生される
    • プロモーションテキスト
  • iTunesConnect
    • 段階的リリース
    • TestFlight
    • 90日間有効
    • 外部テスターが10000人
    • AppStoreで閲覧可能
  • Phased Release
    • 設定しているユーザのみ
    • StoreにアクセスすればDL可能
    • 最大7日で100%リリース
    • Pause可能
      • 何か問題があったら止められる?
      • 制限があるのでAndroidほどではない
  • StoreKit
    • レーティングの話
      • すべてのバージョンのレビューのみ表示
      • バージョンアップ時にリセット可能
        • 日本のユーザのせい?
      • Rating/Reviewを求められるように
      • AppStoreRviewへのDeepLink
      • 1行だけのAPI
        • 適切なタイミングでしか出せない
        • 年3回
        • ボタンを使うならDeepLink、アラートを使うなら、SKStoreReviewControllerを使うこと
          • アラートはNG?
  • レビューのガイドラインが変わった
    • App Review Guideline
      • diffが見れるサイト
  • 本編(WWDC2017)
    • Dub-Dubという略し方だった
    • サンノゼ
    • WWDC Extended、ここでやった
  • AltConf 2017
    • 隣の建物でやってた
    • 今年は結構ガラガラだった
  • Swift Panel
    • Swiftを作った人のパネルディスカッション
    • 待ってる人がやたら多い
    • 2ショット写真が取りたかった
  • Beer Bash
  • 写真
    • いろんな開発者と会いました
    • アメリカ人はNBA大好き
  • 犬?
    • Zaku-K9
      • 麻薬とかを見つける警察犬

いやはやWWDCは楽しそうです。

段階的リリースはAndroidほど自由度は高くないようですが、ブランドを大切にしているAppleとしてはよく導入したものだなぁと思います。これもSteveJobsなら絶対にやらないことでしょうが・・・まぁ開発者にとっては楽になるので良しとするのもありでしょうか。

クックパッドiOS更新との付き合い方

  • イントロ
  • 過去のiOS/Xcode更新の対応事例の紹介
    • Handoff対応
      • iOS/Macの体験を引き継ぐ(iOS8)
      • レシピ画面を共有
      • 自動アップデートに連動して辛いことも
    • AppleWatch
      • レシピで指定された時間のタイマーを
    • Swift
      • かなり慎重に導入した
      • レガシーコードのリファクタリングやnullabilityも利用した
      • 現在は35%がSwift
    • 新しい機能を導入・利用する理由
      • 利便性
        • 4.7/5.5インチ
        • Spotlight
        • Shared Web Credential
          • 楽にログインできるように
    • プロモーションのため
      • Handoff対応
      • AppleWatch対応
        • Appleのサイトに載せてもらえる
      • 新機能を利用したアプリはAppStoreで目立つ
    • 開発効率向上の為
      • Swiftの利用
      • AutoLayout、UIStackView、WebView
      • 非推奨になったAPIは利用しないように(負債になる)
    • 変更点の情報収集
      • 公式ドキュメント、API diff
      • iOS/Xcodeのベータ版をすぐに試す
      • Beta版でドキッとしたこと
        • Safariからのリンクが全てアプリに遷移みたいな
          • 途中で動きが変わった
        • アプリ削除でKeychainの情報も消える
      • バグかと思ったらバグレポートを送ったり、フォーラムを見ると良い
    • 事業への影響
      • コンテンツブロッカー
        • スマホWebの広告はどうなる?
        • アプリのことだけ気にすればいいわけではない
      • ATS
        • どこまで対応すればいいのか・・・
        • 広告SDKの通信など自社だけで解決しないものもある
    • 開発環境の変化に追従する
      • Xcode/Swiftバージョンアップ
      • 常に情報収集して追従していく
      • 開発を続けられない状況にならないように気をつける
    • サポートバージョンの見直し
      • 新機能が使えるのは新しいバージョンだけなので
      • 基本は直近2バージョン
      • OS更新の案内をきちんとする(慣れていないユーザもいるので)
    • 新機能導入の判断基準
      • ユーザが便利になったり、影響サービスとマッチするものは積極的に
      • 機能リリース後に取り下げることもある
        • サービス拡大像をうまく描けなかった
        • 中途半端に残してもユーザ・サービス提供側、双方に不利益
      • 開発効率やパフォーマンス、セキュリティ向上なら
      • 明らかにやらないと行き詰まるものはやるしかない
        • 最新のSDKを使う
  • まとめ
    • ユーザが便利になる機能は積極的に採用していく
    • バージョン・アップによる変更点の情報はしっかりと
    • 安定したリリースサイクルを回すために、開発環境に関わるところは早めに

かなりボリューミーな発表内容だった気がします。

iOSでの新機能に関してうまくいかなかった点も含めての発表内容だったのでとても参考になりました。

iOS11対応に向けて - Yahoo! JAPANアプリiOS10対応事例紹介

  • イントロ
  • iOS 10 の話
    • どのように新OSと向きあっていくか?
    • 失敗や試行錯誤
  • 65
    • WWDC終了〜iOS10リリースまでの営業日
  • 全体スケジュール
    • 6月:キックオフ
    • 7月:アイディア出し
    • 8月:開発
    • 9月:リリース
  • 6名体制
    • YJの中でも珍しい(力を入れてる)
  • キックオフ
    • 過去、リリースに間に合わないことがあった
      • 完成度にこだわってしまった
    • トレードオフスライダーを作って方向性を
      • スケジュール ※一番
      • API対応
      • 特集掲載
      • 途中から入ってくるメンバーにも必ず共有するようにした
  • アイディア出し
    • 良いアイディアが欲しい
    • 1.有志の協力者募集
      • デザイナーが4名入ってくれた
    • 2.デザインスタジオ
      • ブレストでペーパープロトタイピング
      • あとでみんなで発表
    • 良いアイディアはたくさん出た
      • トレードオフスライダーによりスケジュールが大切だという判断が容易にできた
  • 品質チェック
    • 社内SDKの取り込み
    • 課題
      • 取り組む温度感がまちまち
      • 多対多のコミュニケーションでコストがかかった
    • テスト計画
      • 課題
        • コスト大(7,000件) ※手動のテストです
          • かけ過ぎだと怒られた
      • 改善策
        • 社内SDKの対応に期限を設ける
          • タイミングを揃える
        • マスターテストケースに優先度付
    • まとめ
      • 成功するためのルールを作って自立したチームへ
      • テスト計画は効率とコストバランスを見て早期に立てる
        • これでiOS11も万全

YahooでのiOS新機能対応についての戦略的な内容が聞けて、大変貴重だと感じました。

みんなでアイディア出しをしたり、トレードオフスライダーを作ったり、すごく面白そうなことをやっているなぁと感じました。

まとめ

WWDCに関する情報や感想、iOS新機能対応、Mastiff、など、様々な発表が聞けて非常に有意義な勉強会でした。

会場(LODGE)も広くてキレイ、かつ懇親会でのお寿司も美味しかったりと、なかなかにリッチな勉強会でもありました。

メタプログラミングRuby - 2章 月曜日:オブジェクトモデル(その1)

前回に引き続きRubyメタプログラミングについて学んでいきます。

オープンクラス

既存のクラスにメソッドを追加する

Rubyのクラスは標準ライブラリも含めて「オープン」であり、 あとからメソッドを追加したり、既存のメソッドを置き換えたりすることが可能である。

class String
  def emphasize
    self + '!!'
  end
end

p "Hello, world".emphasize # => "Hello, world!!"

ここでは標準ライブラリのStringに対してemphasizeを追加している。

既存のメソッドも置き換えられる

注意すべきなのは既存のメソッドを置き換えても何の警告も出ないことである。

p "Apple".length # => 5

class String
  def length
    1
  end
end

p "Apple".length # => 1

ここでは既存のメソッドString#lengthを再定義して、1を固定で返す実装にしている。

こうした場合でもRubyは何の警告も表示しない。

つまりこれは強力で機能であると同時にかなりのリスクも伴うことが分かる。 間違って既存のメソッドを置き換えようものなら、簡単にシステムを壊してしまう。

クラス定義は他のコードと違いはない

他の多くの言語では「クラス宣言」は専用の構文であることが多いが、 Rubyでは通常のコードと変わらない。

3.times do
  class Foo
    puts "Hello"
  end
end

ここでは 1.ループ構文の中でクラスを定義しているし、2.クラス定義の中で特定の処理を呼び出している。

class構文は、もしそのクラスがまだ定義されていなければそのクラスを新たに作成し、そうでなければ既存のクラスをオープンする、という挙動となっている。

オブジェクトモデル

インスタンス変数

他の多くの言語では、クラス定義に含まれるインスタンス変数は固定であるが、Rubyにおいては動的である。

class Foo
  def bar
    @x = 1
  end
  attr_reader :x
end

f = Foo.new
p f.x                  # => nil
p f.instance_variables # => []

f.bar # これを呼び出すことによりインスタンス変数`@x`が追加

p f.x                  # => 1
p f.instance_variables # => [:@x]

ここでは@xに値を代入するコードがFoo#barに定義されているが、 これを呼び出すまでは@xは存在しない。

コード中にあるようにinstance_variablesを呼び出すことで、定義されているインスタンス変数の一覧を得ることが出来る。

メソッド

インスタンスの中身はオブジェクトによって異なるためオブジェクトごとに用意されるが、 メソッドは全オブジェクトに共通なのでクラスに定義される。

class Bar 
  def foo
    puts "foo"
  end
end

b = Bar.new
p b.class                          # => Bar
p Bar.instance_methods.grep(/foo/) # => [:foo]

Bar.newしたbオブジェクトは、クラスオブジェクトBarへの参照を持ち、 fooBarクラスオブジェクトのインスタンスメソッドとして宣言されているのが分かる。

実際に呼び出されるメソッドの特定には「メソッド探索」という仕組みが使われるが、 それについては後ほど。

クラスはオブジェクト

既に簡単に触れてしまったが、Rubyにおいてはクラスも単なるオブジェクトである。

p "hello".class # => String
p String.class  # => Class
p Class.class   # => Class

"hello"Stringクラスのオブジェクトであり、StringClassクラスのオブジェクトである。 (Classの先はずっとClassのオブジェクトである)

Rubyでは#newを呼び出してオブジェクトを初期化するが、これはClassクラスに定義されたインスタンスメソッドである。

# `false`は継承されたメソッドを表示しないという意味
p Class.instance_methods(false) # => [:new, :allocate, :superclass]

つまり、String.newとした場合、Stringオブジェクトに実装されたnew、より具体的にはClass#newメソッドを呼び出していることになる。

ちなみにallocateというメソッドは、インスタンス生成時にinitializeを呼び出さないところがnewと異なる。

superclassメソッドは親クラスを取得するのに利用できる。

p Array.superclass        # => Object
p Object.superclass       # => BasicObject
p BasicObject.superclass  # => nil

継承ツリーとしては以下のようになる。

Array --> Object --> BasicObject

BasicObject.superclassnilであることから分かるように、 BasicObjectRubyにおけるルートクラスである。

モジュール

Classクラスの親クラスはModuleである。

p Class.superclass  # => Module

つまり、Class is a Module、すべてのClassModuleであると言える。

Classにはnewallocatesuperclass というインスタンスメソッドが定義されていることが確認できたが、 Moduleとの違いはこれだけである。

定数

Rubyにおいて大文字から始まる変数はすべて定数である。 すなわちStringといったクラスについても、ただの定数であると言える。

もっともRubyにおける定数には強制力がなく、 書き換えようとした時に警告が表示されるくらいであるが。

ツリー構造

定数はツリー構造を持つ。

X = "::X"
module M
  X = "M::X"
  class C
    X = "M::C::X"  
  end
end

p ::X     # => "::X"
p M::X    # => "M::X"
p M::C::X # => "M::C::X"

ここでは以下のような階層を持っている。

  • Root
    • X
    • M
      • X
      • C
        • X

つまり同じ定数名Xでも所属しているスコープが異なるのである。

::

先のコード中で示したように定数のパスは::で記述する。

Y = "::Y"
module M2
  Y = "M2::Y"
  p Y   # => "M2::Y"
  p ::Y # => "::Y"
end

定数ツリーの中間にいた場合、相対パスでアクセスするため ルートからアクセスしていることを明示する場合には先頭に::を記述する。

ネームスペースとしての定数

あるクラスを新たに定義しようとした時、 既に同名のクラスがあると既存クラスをオープンする形になってしまう。

いわゆる名前の競合である。

それを避けるために定数ツリーが利用できる。

module Editor
  class String
  end
end

p String == String          # => true
p String == Editor::String  # => false

ここでは標準ライブラリと同じ名前のStringを宣言しているが、 Editorモジュールの内部であり定数ツリー上の位置が異なるため別のものとして扱われている。

このように定数をネームスペースとして利用することで、 名前衝突を割けたり、分かりやすい階層にクラスを配置することが出来る。

今回のまとめ

  • Rubyオープンクラスである
  • Rubyにおいてクラス定義に紐付いたインスタンス変数というものは無い(動的)
  • RubyのクラスはClassクラスのオブジェクトである
  • Classクラスの親クラスはModuleである
  • ClassクラスはModuleに加えてnewallocatesuperclassを定義したクラスである
  • RubyのルートクラスはBasicObjectである
  • Rubyのクラスは単なる定数である
  • 定数はツリー構造を持つ