kumamotone’s blog

iOS/Android アプリエンジニアです https://twitter.com/kumamo_tone

2016年4月に新卒で入社したヤフー株式会社を退職しました。

半年の丁寧なOJT形式の研修のあと、主にiOSAndroidアプリの開発を担当させていただきました。期間としては3年と8ヶ月になりますが、かなりいろんな経験ができて、成長できたと思います。Yahoo! JAPAN アプリをはじめ、多くの人に使ってもらえるプロダクトの機能開発に携わったり、新規プロダクトの開発に携わったり、社内ハッカソンで数人チームでプロダクトを作ったり、大小様々な規模の開発に携わることができました。副業は申請を出せばOKになっていて、副業で請けていたアプリ開発では、個人で1年強で200〜300万ほど稼ぐこともできました。(この頃に関してはそれなりにハードワークだったのできつかったですが…)。

また、社内での定期勉強会の主催や、大きなミートアップの主催をやらせてもらえたり、業務でカンファレンスに参加、登壇などさせてもらったりなどするうちに、自然と社内外の繋がりも増えてきて、社外からのお誘いや、経験の機会につながることもありました。学生のときにJavaC#などでGUIを書いていたのが経験として活きたのはありますが、入社したころはアプリ開発は完全に未経験だったことを考えると、かなりの変化だと思います。

この個人事業主でも稼げるし社外からもオファーがもらえるという経験はかなり精神的に良くて、大学院のときは「これで卒業できなかったら結構きついだろうし、中退したらどうやって生きていけばいいんだ…」という感じだったのに対して、今は「最悪やめてもなんとかなるかも」という感じで積極的にリスクが取れるようになり、精神的に楽になりました。(学び続けないとすぐ役に立てなくなりそうというプレッシャーもあるので、完全に楽という感覚もないですが…)

全体的にいわゆるホワイト気質で、フリーアドレスやリモートワークも推奨されているので働きやすく、毎週の1on1などで振り返りの機会が得られるし、社食など福利厚生も充実していて、こういった点などもかなり良かったと思います。

じゃあなんでやめるのかというと、ひとつは現状関わっているプロダクトの方向性とやりたいことの方向性が合わず、社内異動も叶わなかったこと、また、これはよくある話だとは思うのですが、(自分の場合)新卒の給与テーブルからちまちま昇給するのを待つより、一度転職する方が大きく収入を増やせてしまうということなどが大きな要因でした。その他の細かいネガティブな面などに関しては、こういったところに一方的に書くのはフェアじゃないと思いますし、退職時のインタビューなどで概ね正直にフィードバックさせていただいたので、内部でできるだけ受けとめてもらえることを願っています。あっでもこれだけは言いたい。週休3日制ってどうなったんですか?

人事発令が出てからは、退職を惜しんでくださる方がいたり、退職するにも関わらず、たくさんの人に前向きなメッセージをいただき、とてもありがたかったです。この会社でソフトウェアエンジニアとしてのスタートを切れて本当に良かったと思います。これからも引き続き頑張っていきます。

potatotips #65 に参加しました (Androidブログまとめ) #potatotips

potatotips #65 に参加させていただきました。

f:id:kumamotone:20191001200750p:plain

自分が所属しているヤフーで開催しました。

Android ブログまとめ枠の人がいなかったので軽く書いてみます。

5分でわかる Kotlin Contracts

speakerdeck.com

手前味噌ですが Kotlin Contracts を5分でわかるようにまとめてみました。

嬉しかった感想を拾います。

GitHub Actionsを用いたDeployGateアプリ配布の自動化

speakerdeck.com

デザイン確認用のアプリの配布が面倒だったので、Pull Request をダストデザイン確認用アプリが自動配布される仕組みを作った。

CIサービス、BitriseとかでもできるけどGitHub Actionsを検証を兼ねて利用してみた。

使い方や、つまずいたところなどを解説。

Secretが新しく生えている。

便利そう

TargetSdkVersion29で BottomNavigationが点滅する件

speakerdeck.com

TargetSdkVersion29(Android 10)で、BottomNavigation がちらつくバグがあった。

再現するリポジトリを用意しました。

github.com

パッチを上げたがすでにissueが上がっていた。モンキーパッチを当ててなんとかすることもできるが、基本対応されるのを待ったほうが良いかも

そのほか

のみもの

たべもの

おつかれさまでした。

iOSDC 2019 に参加しました #iosdc

iOSDC 2019 に参加者として参加しました。

愛社精神のある服装で参加したりブースのお手伝いをしたりしました。

pixivの社員さんにリジェクト除御守もらいました。凝りすぎててやばい。

ブースでCyberAgentさんから大吟醸いただきました。こんな載せてもらったり景品もらえたりで光栄ですがもっとスコア出せると思ってたのでちょっと悔しいぜ

今回結構いい写真取れたと思うのでみて↑

とくにお気に入りの発表

今回見れていない発表も多いので、たまたま見れた範囲の話になります。また、厳選3本になります。

speakerdeck.com

iOSアプリ設計パターン入門の著者でもあるtakasekさんのLT。著書でも説明されていたSOLID原則について、わかりやすい比喩をもとに説明されていました。

よくプログラミングの勉強をしていて「これって人生と同じだよな」みたいなことよく思うので共感できました。

speakerdeck.com

個人的にモバイル決済に興味があるので、モバイル決済アプリをとりまく社会的背景、法律の話、Apple PayやJPQRの話などが、かなりわかりやすくコンパクトにまとまっていて大変良かったです。

個人的にこういったカンファレンスでは、自分の知識の幅を広げたいという側面もあるため、自分の中のそういったニーズにこたえてくれる発表でした。

また、プレゼンテーションのスピードや、話し方がとても聞きやすく、話に集中できました。

speakerdeck.com

SDKを使わずにiOSの機能を使ってデジタル化粧をどのように実現するかという内容でした。

ハイパスフィルターや階調反転、オーバーレイなどおそらくこういった画像処理では基本的なテクニックを、実装を見ながらわかりやすく説明されていました。

PhotoShopチュートリアルを参考にフィルターを実装するというのが、なるほど色々応用がきいて(よくある話なのかもしれませんが)かしこい方法だなー!と思いました。

OSSという、わかりやすく、人に役立つフォーマットでちゃんとアウトプットを出しているという点も素晴らしいと思います。

そのほか

まとめありがてぇ

ぼやき

良いところもある一方で、もやもやした気持ちになるところもありました。

たとえば、今年はなんとか反省を生かして自分は取ることができたのですが、懇親会のチケットが取りづらい、チケットの存在に気づけなくて悲しい思いをしている人を見て悲しい、という経験は、一昨年、去年に続いて今年もありました。このフィードバックは過去にもアンケートなどを通じて行っているのですが、今年は(JOKERチケットの存在はあるとはいえ)さらにわかりづらくなっているように感じました。

おそらく個人的にこういったカンファレンスによく参加するようになって、過剰に色々なことが気になってしまうようになってしまっているだけのような気はします。他にももやもやした部分に関しては色々あるのですが、オープンな場に書いて炎上するようなことは自分も望まないので、アンケートがオープンしたらできるだけ静かにフィードバックさせていただければと思っています。

ただ、こういったネガティブな感想は、SNSなどでオープンに発言してしまった結果、「なんで運営に直接フィードバックしないんですか?」みたいなツッコミを食らっているところも、個人的によく散見します(あとはフード関連にコメント飯食いに来てるわけじゃないんだからwみたいな)(特定の個人や発言を指したものではありません)。

誹謗中傷はもちろん駄目なのですが、こういった問題意識に対して「運営が頑張ってくれてるんだから文句言うなよ!」的な同調圧力のようなものも(勝手に)感じていて、若干の生きづらさを感じています。より意見しやすい、風通しの良い風潮になることを望んでいます。

おわりに

f:id:kumamotone:20190908095913j:plain

なんやかんや書いてしまいましたが、新しい知見を得たり、色々な方と交流することもでき、大変ありがたいカンファレンスでした。 色々な人の努力や気持ちで成り立っていると思います。みなさまおつかれさまでした。ありがとうございました。

potatotips #64 に参加しました #potatotips

potatotips #64 のオーディエンス枠で参加させていただきましたのブログです。

Reproさんのオフィス駅近で最高!

ゼロカフェインコーラ最高!

ブログ枠じゃないので気軽に行くぞ!

Object指向でFatViewControllerをなくす

speakerdeck.com

github.com

テキスト入力制御へのアプローチ for Android

speakerdeck.com

f:id:kumamotone:20190827204517p:plain

どこがはみ出てるか教えてあげるやつは

f:id:kumamotone:20190827204440p:plain

最大文字数を超えた文字にBackgroundColorSpanを設定して

f:id:kumamotone:20190827204502p:plain

リスナーに追加すればOK

github.com

コントロールセンターとたたかう

speakerdeck.com

Event Recap from DroidconKE 2019 

ケニアでDroidconがあったので行った話

アフリカの人陽気で良い

Conditional Content in SwiftUI

speakerdeck.com

TruthとAssertJを比較してみた

speakerdeck.com

github.com

iPhoneFeliCaを読み取ってみた

speakerdeck.com

github.com

www.wdic.org

AACで犯しがちな間違い

speakerdeck.com

note.mu

DIKitで人間がクラス間の依存関係解決するのを終わらせる

github.com

DIKitを使うとDIができます

SwagGenのススメ

github.com

SwagGen を使うと OpenAPI/Swagger 3.0 対応の形式のパースと生成ができる

Chucker で GraphQL の通信ログを見やすくした

speakerdeck.com

f:id:kumamotone:20190827210715p:plain

見やすいわね

GraphQL のサポートがほしかったので、 issue を出してプルリクを送った。

github.com

macOS アプリを2年ぶりにメンテしたら原型がなくなった話

speakerdeck.com

Flutter Pluginを作る

speakerdeck.com

あとCordovaとの比較をしていた Flutterのプラグインシステムは開発体験が良い


感想とか

意外と最後まで集中力が持ってよかった ブログ枠のときもこのくらいの気軽さでやってもいいかもしれない

以上です!

Kotlin Fest 2019 に参加しました #kotlinfest

f:id:kumamotone:20190824215157j:plain

開催2度目の KotinFest に行ってきました。めっちゃ良かった。

セッションのメモを取ったので共有です。

セッション

11:00-11:10オープニング・セッション / 長澤太郎

テーマは Kotlin を愛でよう!

3トラック 15セッション 7LT 来場者380人+ 協賛企業18社 運営スタッフ35人。

セッション終了後、ホワイエのAsk The Speaker ブースで質問可能。

11:10-12:00 What's new in Kotlin Svetlana Isakova

スピーカー は Jetbrains の人で Kotlin in アクションの著者でもあるSvetlana Isakovaさん。

Principles of Pragmatic Evolutionというのがある。

  • keeping the language modern
  • comfortable updates
  • feedback loop

KEEP は Kotlin Evolution and Enhancement Process の略。

新しい機能は皆納されている。 freeCompilerArgs +=で追加して、実験的な機能を有効にできる。

最近のKotlinの機能の紹介。以下のような新機能が紹介されていた。

  • inline classes
  • Contract
  • Flow
  • Kotlin Multiplatform

深堀りしたければ午後からのセッションで拾うことができるという、基調講演らしい内容だった。

13:30-14:15 Kotlinの型実践入門 / 佐藤 隼(ホールC)

speakerdeck.com

型に関するあれやこれや。

たとえば以下のような話があった。

  • スマートキャスト
  • Any, Nothing
  • 共変、反変、不変について
  • sealed class について

かなり広範囲ながらコンパクトにまとまっていた。

TIPS

  • KotlinのスマートキャストはFlow-sensitive typing (flow typing) とよばれる
  • mutableだとあぶないのでスマートキャストできません 束縛する必要がある
  • contract { returns false / false のときは / implies this@isNullOrEmpty != null / null じゃないことを保証する / }
  • Anyはwait、notifyメソッドがないが、(s as Object).notify() とかすれば呼べる
  • NothingはすべてのKotlinクラスのサブクラス キャストがいらなくなるところがありうれしい

14:30-15:15 改めて学ぶContracts / 富田健二(ホールC)

speakerdeck.com

現時点での構文はEarly Prototype、しかし標準ライブラリでも多数利用されている Contracts についての丁寧な説明だった。ほどよい分量でわかりやすい。

TIPS

  • スコープ関数で使われている
  • 1.3.0では18メソッド、1.3.50では26メソッドで対応
  • 入力と出力を記述する句の集合 = 契約

Java にある、 @ Contract アノテーションというのがある @ Contract はorg.jetbrains:annotations @ Contract で、メソッドが満たす必要がある契約を定義するために使用される。注釈をつけるとIDEが契約を満たしているかチェックしてくれる

  • @ Contract("_, _ -> fail") は任意の引数が2つあり、例外を返す契約を定義
  • @ Contract("null -> fail; !null -> !null") は引数がnullの場合→例外を投げる 引数がnullでない→null以外を返す

@ Contract を Kotlinで使うようにするという案もあったとKEEPに書いてあるが、IDEの字句解析、構文解析、強調表示などいろいろやることがあるので 本質的にインジェクションであるため事態をさらに複雑にするので見送られた

関数がContractを持つ。ContractはEffectの集まり。という構造になっているEffectには

・CallsInPlace(callsInPlace) ・ConditionalEffect(implies) ・SimpleEffect(returns) ・ReturnsNotNull(returnsNotNull)

がある。

InvocationKindの種類としては、

・EXACTLY_ONCE  ・blockの処理を1回だけ実行するという契約 ・AT_LEAST_ONCE  ・処理を1回以上実行するという契約 ・AT_MOST_ONCE  ・処理を高々1回だけ実行するという契約(成功したときだけとか)  ・Resultとかで使われている ・UNKNOWN  ・デフォルト

がある。

Contractの制約として、

・関数の最初に書かないといけない ・トップレベルの関数にしか使えない ・関数ブロック内でのみ有効 ・getter/setterにもセットできない ・空のContractは定義できない ・if/whenやtryは式だけどcontractの中身に書くことはできない

がある。

15:30-16:15 Kotlin Multiplatform Project入門 荒谷光(ホールA)

人類の夢Kotlin MPPに関する発表。MPPの概要から、やり方について詳細に説明という盛り沢山な内容。

speakerdeck.com

TIPS

Kotlin MPP は「UI部分は提供せず、ロジックのみ提供する」ので、Viewも共通化しようとするReactive Native、Flutter、Xamarin(Forms)とは方針が異なる。

MPPとは ・Kotlin/JVM ・Kotlin/Native ・Kotlin/JS の総称

・Kotlin/Native はLLVM Toolchainを使用して各プラットフォームのバイナリを作成 ・VM環境が不要 ・Linuxx86_64, arm32, arm64, MIPS, MIPS LE, Raspberri PI)も対応

なのでもちろん Kotlin/Native ≠ iOS

サンプルリポジトリがすごい

github.com

フルKotlinで書かれた、今すぐ使える Kotlin Multiplatform なライブラリたち

github.com

16:45-17:30 もっと Kotlin × Spring 木原 快 / 17:45-18:30 公募によるLT大会

www.slideshare.net

聞いてたけどまとめる体力が切れました すみません たぶん後日書きます

企業ブース・懇親会など

運営のホスピタリティが高すぎる

ランチないけど全くこまらなかった

これは懇親会

その他

CAさんのブースで寿司打やったら運良く1位になって良さそうな品をもらった。ありがとうございます

Tシャツが住友さんとかぶった

以上です!

「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」の書き起こし

先日、Bonfire iOS #6 というイベントで、「SwiftUI を理解するために必要な Swift 5.1 の新機能 (some View編)」という15分のトークをやりました。

Bonfire iOSは自分で立ち上げて毎回企画してきたイベントで、今回は後輩に運営の旗振りをお願いしたところ、自分も発表する流れになり、不安を感じつつもなんとか発表にこぎつけることができました。

ありがたい反応もいただいています。

資料は Speaker Deck にありますが、資料だけだと分かりづらい部分もあるかと思うので、今回は実験的に書き起こしを用意してみました。

当日来られなかった方や、発表の復習に使いたい方などに使っていただければ幸いです。

続きを読む

potatotips #61 に参加しました (Androidブログまとめ) #potatotips

超遅刻投稿です。申し訳ありません。

potatotips #61Androidブログまとめ枠で参加させていただきましたのブログです。Wantedly さんでの開催。

遅れて参加になってしまったので最初の2本は聞いた内容ではなくスライドを読んで書いてます>< 最近は両OSとものまとめを書いていましたが今回は素直にAndroidトークのみまとめています。

[Android] Clip, Elevation, ViewOutlineProvider

speakerdeck.com

ImageViewを角丸にしたり丸にくり抜いたりとかすることがある。

BitmapTransformation(Picasso/Glide)は簡単に使えるが、transformation animationをつくるのが難しい。Canvasを使ってclipするのはCanvasの知識が必要でなかなかむずい。さらに、これらはelevationでの影がが適切に反映されない。

developer.android.com

ViewOutlineProviderというのを使う手があって、これを使うと elevation もうまく反映されている。ただしAPI 21+。簡単にclipやtransformができる。

[Android] CameraXとMLKitの関係や如何に

www.slideshare.net

CodelabsでCameraXとFirebase MLKitをさわった

Camera2では全部コールバックで順序関係あり、しかも画面のライフサイクルい依存しているのがつらかった Camera Xは設定さえすればLifecycle-awareである 便利!

Firebase MLKitではシンプルなインターフェイスで物体認識や文字認識ができる

Codelabsはそれぞれ30〜60分ぐらいでこなせる量 くっつけて、カメラをつかった物体認識や文字認識が簡単にできた 便利!コードはこちら↓

github.com

[Android] 外部SDKのViewにマスク処理をする方法と罠

speakerdeck.com

f:id:kumamotone:20190515194757p:plain

歌詞表示Viewの上下にグラデーションをかけたい ただし、歌詞表示Viewは外部SDKのもので手を入れることはできない

ViewGroup#dispatchDraw で子Viewの描画をフックすれば子Viewにエフェクトがかけれそう ただし super.dispatchDraw(canvas) のあとに単に canvas にマスク処理するのはすでに後ろのViewがcanvasに描画されているためNG

オフスクリーンバッファ(ViewGroupと同じ大きさのBitmapとCanvasを用意)すればよい

ViewGroup#dispatchDraw で オフスクリーンバッファをクリア→オフスクリーンバッファに子Viewを描画→オフスクリーンバッファを加工(LinearGradientとPorterDuffを使う)→オフスクリーンバッファの内容をcanvasに描画 というようにすればよい

罠として、対象のViewがalphaを持っている場合はそのalpha値が反映されてしまい、意図しないエフェクトになってしまうことがあるので注意

Githubにコードがあるので参考にしてください

github.com

[Android] アニメーション実装の新しい選択肢 MotionLayoutが中々便利で期待できそう

speakerdeck.com

MotionLayout便利 最初の状態と最後の状態を制約で指定することでアニメーションをひとつのXMLで実現することができる

とくにすごいのはSwipeとClickのTransitionが指定できることで、これをやるとスワイプやクリックをトリガーにしてアニメションすることもできる

alphaの状態でスライドを作成したが2019/05/09 にbeta1が出たとのこと

[Android] Google Play Consoleの時間指定公開のハマりポイント

speakerdeck.com

通常の公開は公開ボタンをクリックしてからGoogleでアップデート処理があり、その後ストアに反映される。一方、時間指定公開はGoogleでアップデート処理が。名前がわかりにくいが、時間指定公開というのは時限式という意味ではない

時間指定公開した場合、リリーストラックの変更のログが反映されないが、市場公開されているわけではない。公開ボタンを押すまでは市場公開されないので安心するとよい。

[Android] Recommend Widgetを作った話

おすすめ記事を出すView?を作った CTRを計測するためにViewTreeObserverを使用したらしい

[Android] Androidの開発とFlutterの開発を比較してみる

AndroidとFlutterを比較してみる

  • 言語
  • Viewのコード
    • 似てる
  • APIコール
    • 似てる
  • テストコード
    • 似てる
  • アプリサーズ
    • 現在のところFlutterはでかいことがある

[Android] Flutter 1.5 Features(Overview+Alpha)

Flutter 1.5 の新機能。 Dart 2.3、バグフィックス、Material & Cupertio widget sets、アプリ課金(in-app purchases)サポート、Flutter for Web。

Flutter for Webは現在Technical Previewという状態で、Githubにコードが上がっている。

github.com

Hello Flutter for Web の方法はGithubにあるがそのままやるとうまくいかない場合もあるのでQiitaとかにもやり方が書いてあったりする。

そのほかの資料

github.com

感想とか

f:id:kumamotone:20190525010702j:plain

AndroidGoogle I/O 後ということで新しいトピックが多くて面白かった。iOS も fromkkさんが Dark Modeを実現するライブラリ を作っていたりして、新しいトピックないのでとか言ってないで自分もなんかやらんとなぁと思いました。