#potatotips 26は筋トレマシンがあるSupership社で開催! iOS/Android開発Tipsのまとめ!
26回目のpotatotipsに参加してきました。いつもはブログまとめ枠で行っている事が多いのですが、今回はなんと初の登壇者枠で行ってきました!!!
登壇者枠ですが、例に漏れずちゃんとまとめもやります。
もう既に以下のたくさんの素敵なまとめが上がっているので私のまとめは不要ではありますが、完全に自分用の備忘録です。
最近はまとめるのもすごく皆さん速いですね・・・
Android
【Android】Kotlinでアプリ作ってみた
アプリの紹介
- HBFavというアプリを作った
- テストはあまりかけてない
ここがよかった
- varとvalでmutable/immutableを使い分けられやすい。基本はval
- nullable: 型の後ろに?がつくとNullが許容される
- スコープ関数: Kotolin スコープ関数 用途まとめという記事を参照
- DataClass: 名前付き引数が使えるので、引数が多くてもわかりやすく書ける
- List操作が楽: 言語レベルでmapやfilterがサポートされている
ここが困った
- IDEのプラグインのエラーの通知がでる
- DataBindingを使うとき、IDEからBinding用のクラスが参照できなくなる時がある
- DataBindingでBindingAdapterを使ったり、xmlから使いたい時参照できなかった
- →シングルトンにJvmStaticアノテーションをつけるとxmlから見えるようになります
まとめ
- Javaでかくより短く安全コードが書ける
- CircleCIからも使えます
- IDE上では多少不安定
- ソースはこちら
FAQ
- フルKotlinにしないのは?
- →xmlから参照するときにアノテーション付けてjavaの見え方が出来るようにしている
【Android】動画のあれこれ
動画のあれこれ from Takumi KASHIMA
- 撮影はMediaRecorderと再生はTextureViewでやってみたがいくつか問題が発生した
- フレームレートが設定できない問題が発生した
- MediaRecorderのsetVideoRateに設定してもきかなかった
- 動画の同時再生ができなかった
- 3つまでしか再生できない、緑の線がはいったりなどなど
- プレビューのサイズと実際に撮影されるサイズが別物だったりした
- 通常画質だと5秒で2MBくらいになって実用に耐えない
対策
- FFmpeg-Android-Javaでで変換
- 1度に再生できる動画を1つだけにした
- 必要な引数などを実装した
- 撮影周りをJavaCV、再生周りをExoPlayerを使ってやっている
まとめ
- 動画の知見が少ない
- Androidで動画は険しさがある
- 正直に実装すれば動く
FAQ
- ExoPlayerを触った時サンプルも動かなかったのだが、どれくらいのバージョンでアプデートしているか?
- →カスタマイズはできるが使いにくいのでExoMediaというラッパーを使っていてこれは頻繁にアップデートされている
【iOS】Can we live in a pure Swift world?
- obj-cは古いメンテの時しか使ってないので書かなくていいかなという気持ちでいたが、pure swiftではできないことがあった
- SwiftのなかではObjCで使えない機能があったりする
- Generics, Tuples, protocol extensionなど
- swiftだけ書いていれば問題ないと思っていたが、obj-cから呼べないだけではなく、pure swiftでも制限があった
- obj-cでよべないものはselectorで指定できない!!
- performselector指定できない
- add-target指定もできない
- @nonobjcを使うとobjcから使えなくなるが、これをつけてもselectorで使えなくなる
- →ボタンアクションになにか指定する場合は古い機能を使ってないといけない
- まとめ
- swiftに移行しているが、UIKitを使っている限り移行が難しい
【Android】最近出会った面白い挙動紹介
- 運用サポートのFragmentの話
- ListViewをタップすると詳細のページに移動するものでListが1件しかない場合にListを飛ばしたい時
- アダプターを作って、アイテムをいれるが、1件の時は飛ばそうとしてみたところ、間違えてnotifyDataSetChangedを先に読んだら、詳細のページに前のページにレンダリングしてしまった
- しかし再現はしませんでした
- 原因追求のためのソースを追ってみた
- ソースを追ってみたところ、Fragmentは結果StableつきのViewだった
- ListViewも普通のviewでやっていた
- 現象の原因はupdateDisplayListDirtyを読んだ時にcanvasにレンダリングしている間にビューツリーが削除されたが、renderNodeのdestroyDisplayListData()が呼ばれる前だったのではないか
【Android】AndroidアプリのUI/UX改善例
- ユーザに満足してもらえるアプリは必要な機能が備わっていることと心地よいUI/UXがあること
- セカイフォンというアプリで、UI/UXを改善してみた
サイドメニューの変更
- スワイプするとサイドメニューを出したり、ボタンを押したらメニューをだしたりなどを実装した
- DrawerLayout、Toolbar、NavigationViewを使って実装
検索の操作性改善
- 翻訳結果を履歴で検索したり、名前を検索したりする機能があるが、検索用のビューを作り、タイトルバーのところにキーワードを入れるとずらずらと予測がでるようなものを作ってみた
- SearchView、OnQueryTextListener、Realmを使って実装
アップナビゲーション対応
- 左上に矢印がのっているが、押すと前の画面に戻れる機能を作った
- プレイストアのアプリもわざわざ実装されている
- UpAction、ParentActivityなどで実装
【iOS】5分でわかるTextKit
- iOS7からUITextViewはTextKitベースになりました
- 文字のレンダリング(文字列→Bitmap画像)をするようになった
- データ上のAは様々な形のA(一番レンダリングされる小さい単位のグリフ)に変換される
- 文字とグリフは1:1ではない
- ためしにflyをレンダリングするとflで連結されていたりする
- 文字列 != グリフの列
- 文章をレンダリングする際にはレイアウト(表示領域、文字と文字の間など)を考える必要がある
- レイアウトは表示領域のサイズ、文字の間隔、改行のスタイルなどを用いてグリフの座標を求めること
- (String→NSAttributedString→UIFont+CGGlyph) + NSTextContainer = NSLayoutManagerな形
- NSLayoutManagerがNSAttributedStringを監視しており、レンダリングを行っている
- タッチイベントからさらに座標をとったりもしている
- 文章中の文字をタップされたという挙動を実装できる
FAQ
- 自分でtextviewを実装して難しかったところは?
- Glyphの変換で書くコードの量が多い
- 型の変換が多い
- 一部を自前に実装することでレイアウトの情報をキャッシュしたり、コピーをキャンセルできないところをできるようにしたりなどのメリットは有る
【Android】Android: テストメソッドの命名規則について考えてみた
テーマを選んだ背景
- 可読性が低かったり、何のテストしているのかわからなくなったり、粒度が荒かったりした
- テストコードを書いたら負債にならないようにする必要がある
- 命名規則をしっかりすれば解決できると思った
テストを構築する4つの要素
- テストは事前準備、実行、宣言、後処理で構成される
どのようにテストコードがかわっていったか
- テストexecuteの粒度を考える
- validでこけたら下のテストが通らなくなるのは粒度が粗いので、1つのテストで1つの結果に分割するようにした
- しかしexecute_ok, execute_ngというメソッド名だと、どういう引数の時にNGやOKが帰って来るのかがわからない
- execute_ok_200URLなど、前提条件をメソッド名に含めるようにした
- 5xx系のテストやっていないなどがきづけるようになった
- メリット:粒度が保たれ、テスト失敗時の原因究明や修正がしやすくなる
- 命名規則:テスト対象メソッド名期待される振る舞い前提条件
- まとめ
- テスト全体のルール作りは必須
- 命名規則、粒度、ツールなど最低限のルールを決める
- makeやgradleでビルドするときはテストも走らせなるようにすると忘れない
【Android】アンサー Androidの話
アンサー対応範囲
- Android2.3、3、wear、6などなど対応していた
- 2015.12末にAndroid4.0.4以上対応になりました
ライブラリ
- 2.3まで対応してたのでライブラリが使えなかったが、切ったことで、いれられるようになった
- Android View Animations, Butterknife, Gson, PermissionsDispatcher v2, RxJava/RxAndroidを使っている
- 通信周りはVolleyを使っているのでRetrofitに変えていきたい
Androidエンジニア
- 開発体制は基本ずっと一人だったが、2月に2人になりました
【iOS】PUSH通知の許可をよりもらうためのUI考察など
PUSH通知をどうするか
- OneSignalというサービスが楽そうだった
- 沢山のplatformに対応している
- 特徴
- 完全無料
- マルチプラットフォーム
- APIが使える+ドキュメントがいい
- APIを使えば他のサービスに移行できる
- 不安点
- 通知の配信速度は遅いかも
- ビジネスモデルがよくわからないから継続するかわからない
PUSH通知をもらうためにはどうすればいいか
- 唐突に表示する系はTRILL、Yahoo, LINE, Facebook, newspick
- 唐突が多いのは意外に何も考えずに押さずにおす人が多い?
- 事前に説明する系はグノシー、スマニュー、NewsDigest, minneなど
- 事前説明+擬似アラート系:Mery、Ameba FRESH、ハッカードールなど
- 通知許可系:通知をONにしてくださいアラートが出てOKを押すと通知許可が出る
- 2回出してるのでUIは良くないかもしれない
- 注意
- Push通知がリセットされた場合の処理を忘れない
- cf : PUSH通知の許可をよりもらうための技術調査+スクリーンショット
FAQ
- →ユーザ数が少ない時は頑張ってもそんなに変わらないので唐突でいいと思う
【Android】Replace EventBus with RxJava/RxAndroid
- EventBusはAndroidでイベントを送ったりするものだが、Rxで同じようにやってみた
- 導入はgradleでできます
- RXEventBusのクラスのインスタンスをみれるようにしないといけないので、RXEventBusProvider経由でイベントをどこからでもなげられるようにした
- インスタンスの取得はproviderからとってpublish, subscribeする
- unsubscribeしないとリークするので注意
Tips
- RxAndroidでobserverする機能でbackgroundでメインスレッドで呼ぶことができるようになりました
- どこからイベントをとってるのかわからなくなるので、eventのクラスをinnner classとして作るとわかりやすい
Appendix
【iOS】NSURLProtectionSpace Autification Method,, iOSの通信と認証
- 認証が必要なメソッドでdelegateをちゃんと実装しないと通信できません
- delegateが来たらNSURLCredentialというものをつくって返す
- NSURLCredentialはユーザ名とパスワード、サーバ証明書、クライアント証明書の3種類で作ったものをかえせばいい
- 認証が必要になっている状態をchallengeというが、その状態で何の認証がかかっているかを確認できるので、それをみて必要なCredentialを作って返す
認証の種類
- NSURLAuthenticationMethodHTTPBasic:Basic認証で、総当りですぐやぶられます
- NSURLAuthenticationMethodDefault:昔Basic認証の時に呼ばれていたが、突然NSURLAuthenticationMethodHTTPBasicがよばれるようになった
- NSURLAuthenticationDigest:Digest認証
- NSURLAuthenticationHTMLForm
- ダミー認証方式でユーザーカスタマイズ用になる
- 自分のアプリでログイン画面で勝手に入力してやるみたいなことが出来そう・・・?
- NSURLAuthenticationNegotiate:Kerberos認証でWindowsサーバでやる
- NSURLAuthenticationNTLM:Kerberosの弱いバージョンでWIndows認証用
- NSURLAuthenticationClientCertificate
- 端末側が証明書を渡すパターン
- 端末に証明書をいれて、それをもった端末だけがアクセスできる
- iphoneなどにもp12ファイル形式でインストールしてアクセスできます
- NSURLAuthenticationServerTrust
- httpsから始まるSSL/TLS認証
- ios8でdelegateに飛んでこない罠もあったりする
- IPでアクセスしたりなどしたいときは独自実装する必要がある
- 証明書が期限切れのときはどうすうるかは要自前実装
- 実装ではOSが認識してくれるのでデフォルトにやればいい
【Android】チュートリアルをリッチにしよう
ViewPager
- 横にスワイプできるやつで、ListViewと同じくAdapterでつなぐ
- 今いる画面の左右2つを保持してる
インジケータをつける
- チュートリアルの進捗を可視化したい
- OnPageChangeListenerを実装すると、下の現在ページを表示できる
- onPageScrolledで、position, positionOffset, positionOffsetPixelsを指定する
- onPageScrolledで次のメソッドを作って呼び出す
背景をグラデーションさせる
- シームレスな画面遷移が出来て、動きのあるものに注目させられる
- ArgbEvaluatorを使うと実装できる
- 2色間の色を返してくれる
- onPageScrolledでスクロールとともに色を計算して設定する
視差をつける
- parallax効果でかっこいい
- ViewPager#PageTransformerを実装する
- スクロール中にViewPagerが保持しているViewの数だけ何度も呼ばれる
- transformPageメソッドで視差を生み出す
- pageはViePagerが保持しているViewが入る
- positionはViewPagerが保持しているViewの左端までの距離が入る
まとめ
- 悪魔で手段でしかない
- 手段を用いてアプリを理解してもらうのが大事
- サンプル
【iOS】皆に相談したい「私の現場での試行錯誤後のiOS開発方針」
- 4人で開発していて、iPadアプリのプロダクト3個
- 本題
- 画面生成、コントロール生成、画面遷移はコードで行う
- storyboard使用しない
- sizeclassは使用しない
- autolayoutは少し使用
- オープンソース使用は控えめ
- viewdidload内で画面レイアウト生成
- 画面表示更新用メソッドを用意して使用
- 重い画面はviewDidAppearでレイアウト生成 → 個人的にはベストプラクティス
- 意見1→よくあるやり方
- storyboard, xib使用
- sizeclass使用してない
- autolayoutはヘビーに使う
- storyboardは1~3画面につき1ファイル
- コードでの画面系制御は本当に必要最低限にする
- FAQ
- 1から設計するとしたらこの方針でやるか?
- swiftでくるのは頭にくる
- storyboardの使い方は同じで、storyboardはおまけ的な使い方でやる
- アプリが復活した時にstoryboardでやらないといけない部分がある
- storyboardを採用しないのはなぜか?
- storyboardを画面でつくるのが好きじゃなかった
- コードで生成と背景のタイミングを制御したかった
- どういうメンバー構成か?
- ios専任が一人、ベテランが一人いるが、サーバサイドもやっていて、中級者と初級者がいる
- チーム内にデザイナがいない
- ざっくりのデザインを元に組み立てる
- @niwatakoさん曰く、b2b時代ではコードでUINavigationControllerを自前で実装したりしていた。
- はてなではstoryboardに任せられるのはstoryboardに任せるようにしている
- デザイナにstoryboardにやってもらっていったりしているチームもある
- 1から設計するとしたらこの方針でやるか?
開発ブランチはどうわける?
※残念ながら今回は欠席となってしまいました。
【iOS】脱swift初心者するための2つのきっかけ
筆者の人生初勉強会での発表(!!)
- 関数型言語のfilter、 indexOf、mapを紹介しました
- 関数型言語を使ってコードを短く書こう!
- ですが、Swiftのmap, filter, reduce(などなど)はこんな時に使う!の記事が詳しく書かれてます
- {}を減らすためにguard letと、whereをうまく使ってみよう!というお話でした
【Android】Foreground検知
kato_takaharu様
- ActivityのLifecycle、ApplicationにForeground検知できるものはあるとおもったがなかった
- タスクにあるとおもってみたら、getRunningTasksはProductionで使うなとあったのと、ロリポップから使えないとコメントがあった
- AndroidでSDKではforeground検知がない・・・!?
- stackoverflowの方法は微妙だった
- Application.ActivityLifecycleCallbacksは却下
- UsageStatsManager.queryEventsはロリポップからしか使えないので却下
- Activity補完計画
- 画面の構成をFragmentに移すことでActivity.onResumeでForegroundを取得する
【iOS】HTTPリクエストをフックしてハック
- WebAPIできてないけどアプリ側の実装を始めないといけない時に、HTTPリクエストのスタブを簡単に仕込めるライブラリ「Kagee」を作った
- NSURLSessionがアクセスする時にNSURLProtocolの間にはいり、自身が処理したいものはレスポンスを返却できる
- canInitWithRequestが自分の範疇かどうかを返す
- canonicalRequestFoRequestでリクエストを返す
- どういうレスポンスを返すかはstartLoadingの中で返す
【Android】元Railsエンジニアが現場でKotlinプロジェクトと引き継いでみての感想
- Javaの動くとこであればどこでも動くKotlinを使ってみた
Mix-inでクラス構成が直感的で楽
- Mix-inは自分以外のモジュールから継承などでメソッドを集めてきてクラスを作ること
- Kotlinの場合は同じようなことを出来るクラスがあった時に、共通する「やること」をインターフェースにして、インターフェース名にラベルのように書くとMix-inできる
- メリット
- メソッドの実装が付いているので、実装にズレがないか気にしなくていい
- スーパークラスの継承と違っていくつでもつけれる
- Compositionと違ってインスタンスをさらに呼び出す必要が無い
さくさくかけて気持ちいい
- FABにクリックリスナーを設定するまでJavaとKotlinで比較してみるとステップが1/3くらいになる
- 入力も保管も減るのでコーディングが早くなるかも?
- →しかしビルドは遅い
- 大きな変更がないときは30s~1minだが、クラスやメソッド構成を変えた時は2~3min
- しかし全部Javaでもそういうことはあるらしい
まとめ
- Mix-inで暮らす拡張が直感的にできる
【iOS】古き良きsendAction
- UIApplication sendActionはiOS2からあるけどあまり使われない
- UIApplicationからsendActionをよぶと指定したメソッドを呼び出せる
- いいところはUIKitの構造を遡る(ResponderChain)されること
- 末端でsendActionすると階層のどこでもうけられる
- Delegateのようにreceiverを受け渡す必要が無い
- UIViewがどこのUIViewControllerに所属するのを取るのは大変!なのでこれはイイ
- 好きなところでハンドリングできる
- いいところ
- 疎結合な仕組みで画面構成が変わっても利用できる
- 根幹となるしくみのなので流行に左右されない
- わるいところ
- インターフェースが古い
- 引数に特定のObjectを使いにくい
- →使うなら新しいインターフェースでラッピングしてみよう
- まとめ
- 場合によっては有用
- 古い機能だが、画面構成が複雑な現代でこそ利用価値がある
- 昔からある機能にも意外と使えるものがあるかも
- FAQ
- responderChainは実装者からみえるのか?
- みえません
- みえないので使いづらくなかったか?
- 1年位つかってるので使いやすいです
- イベントの伝播は止めれるのか?
- とめられないです。うけなければスルーされます
- responderChainは実装者からみえるのか?
iOS Developers Conference Japan 2016
- 2016/08/20開催予定
- スポンサー企業募集しています
【出張】ゆとり世代エンジニア交流会【ひな祭り】
- ゆとりの心があれば誰でも参加可能な交流会
@mogmetの所感
Kotlinがいよいよ正式デビューしましたが、書き方が思いの外swiftに似ている感じでかけるのでとてもKotlinでAndroidを書いてみたいなと感じました。
filterやら、mapなども使えて結構さくさく書けそうな感じがしますね。めちゃめちゃ試したいです。
余談ですが、会場にある筋トレグッズが中々謎でしたが、supershipにきたらムキムキになれそうですね。