文字っぽいの。

文字を書いています。写真も混ざります。

#iOSDC Japan 2022で『 サポートiOSバージョンを定期的にあげる仕組みづくり』というLTをします。

今年もiOSDC Japanの季節がやってきましたね!ありがたいことにLTが採択されたので、登壇します!5年連続登壇することができるので、うれしみに舞い踊っております。

fortee.jp

プロポーザルは

サポートOSバージョン、どんどんあげていきたいですよね? しかし、サポートバージョンを減らすとユーザーも減るため、プロダクトオーナーに渋られることもよくあります。

加えて、開発の現場では「サポートOSバージョンあげたいけど、結構気合で解決できるし……」というエンジニアと、 「エンジニアから要望も来ないから、あげなくてもいいか」というプロダクトオーナーという、お見合い状態になることもあります。 実はサポートOSバージョンをあげてもよさそうなのに、キッカケがない……そんなことはありませんか?

このトークではこういった課題を解決するため、 ・アクティブユーザーのOSバージョン割合で判断するのは悪手!?本当に見るべき指標 ・定期的にサポートOSバージョンアップを検討できるキッカケの仕組み について話します。

このトークが皆さんのアプリのサポートOSバージョンアップにつながると嬉しいです。

という内容です。

大手の企業ではこういった仕組みがすでにできあがっていることが多く、あまり参考にはならないかもしれません。一方で、少数のチームで開発している場合には、明確な基準を決めるのが難しく、なかなかサポートOSバージョンをあげられないことがあります。

このLTではそういった人たちに向けて「こういう基準と仕組みを使うと便利でしたよ」という内容を話せたらと思います。

今回はオフラインでの開催も予定されており、自分も現地でLTをする予定なので、会場で会ったらぜひ声をかけてください!また、サポートOSバージョンをあげていく仕組みについて「うちではこうしてるよ」という話を聞けると嬉しいです。

ではみなさん、会場とインターネットでお会いしましょう!

ラーメン→スーパー銭湯→ラーメン

ゴールデンウィークのほとんどが飼い猫の看病と通院で消失してしまったので、ちょっとしたお出かけをした。「ラーメンと、温泉やな。」ということになり、弟と2人で電車で行ける範囲で出かけた。

味噌っ子 ふっく

朝の10時30分に荻窪駅に集合して、味噌っ子ふっくに向かった。

tabelog.com

開店は11時なので、もう並んでいそうだなぁと思っていたけど、予想以上に長い行列ができていた。開店時間から1時間半ほど並んで着席。

辛味噌らーめん(もやし大盛)

うまい。東京はうまい味噌ラーメンのお店が少ないので貴重。もやしが無料で大盛にできるのが嬉しい。汗をかく程度には辛いので、辛いのが苦手な人は普通のが良さそう。

なごみの湯

荻窪には駅前にでかいスーパー銭湯があるので、ここで夕飯のラーメンまで時間をつぶした。

www.nagomino-yu.com

館内着を着て、漫画スペースや仮眠室があって、時間を長くつぶせるタイプのスーパー銭湯。お風呂とサウナを楽しむ。外気浴コーナーの椅子はリクライニングタイプのチェアと、オットマン的に踏み台がおいてあって完璧感が高かった。

サウナ後はオロポ。

ポカリがでかい缶だったので、配分が難しかった。

このあとは夕飯のラーメンまで暇を潰すしかなく時間がありあまっているので、マッサージサービスを使ってみることにした。痛くて死ぬかと思った。

元祖スタミナ満点らーめん すず鬼

夕飯の時間になったので、荻窪駅から三鷹駅に電車で移動してすず鬼へ。

tabelog.com

外待ち12人でそこそこ並んでいたけど、回転が早くて1時間経たないくらいで入店。

スタ満ソバ(トッピング全部)+まさお+魚玉

スタ満ソバ(トッピング全部)、まさお、魚玉。すげぇうまい。スープを一口すすって半ライスを頼むかハチャメチャに迷ったけど、麺量280gあってそれだけで腹一杯になりそうなのでやめておいた。実際、麺に加えて上に乗っている豚肉がゴロゴロ大量に入っていて腹パンパンになったので良い判断だった。上の肉とスープだけでご飯3杯食べられる勢いだけど、お腹に入らないのが悲しい。近場にあったら毎週通ってしまうし、お腹ペコペコにしてライスを追加したい。

コンビニで黒烏龍茶を買って帰った。

Apexでソロダイヤを達成するために、買ってよかったゲーミングデバイス。

去年の2月にApexデビューをしてからコツコツ続けて、ようやく今年の3月にソロダイヤを達成しました。めでたい。

この記事では、ソロダイヤを達成するまでに買ってよかったと感じているデバイスを紹介します。

新しいPC

いやPCは持ってて当然でしょって感じですが、Apexをやり始めた頃は「なんでこの骨董品でApexが動くの?」というレベルのPCで遊んでいました。しかし、さすがに30fpsでれば御の字な環境だといろいろが厳しく、たまにクラッシュするようにもなってしまったので、TSUKUMOでBTO PCを買いました。

www.tsukumo.co.jp

詳しいスペックなどは下記の記事にまとめています。

fromatom.hatenablog.com

これでようやく快適な環境でApexができるようになったわけです。新しいPCにして画質や処理速度があがったのはもちろんですが、GeForce Experienceが使えるようになったのも良かったです。これにはインスタントリプレイの機能がついていて、保存ボタンを押したタイミングから過去最大20分の録画を保存してくれます。PS5やSwitchにも似た機能がありますね。これのお陰でゲームプレイの様子を録画して、あとから反省会をすることができるようになりました。

キーボード

LogicoolのG913を買った。色々と探してみたけども

  • USBワイヤレス(Bluetoothでない)
  • カニカル
  • テンキーレス

という条件で探すとほとんど候補がなく、自然とこれになった。特にBluetoothではないワイヤレスのものはほとんどない。

ゲーミングよろしく虹色に光る。最初はいらないと思っていたけど、ゲームごとの設定をする時に色も設定しておけば「ちゃんと切り替えできたかな?」というのが色の変化でわかって良い。Logicool製品用ソフトであるG HUBは結構挙動が怪しく、たまに設定が反映されなかったりするので、色でちゃんと効いているのが分かって便利。

自作パームレスト

G913にちょうどいいサイズのパームレストがなかったので自作した。詳しくは下記記事で紹介している。

fromatom.hatenablog.com

これはかなり満足度が高くて、今でも良い選択をしたと感じる。ただ、どうしても手汗や摩擦によって毛羽立って来てしまったので、防水ニスなどを塗布するか検討中。

マウス

世の中ではG PROが人気なようだけど、「サイドボタンが2つだけは不便だなぁ」と思ったので、もうちょっとボタンがあるやつを買った。結果として、サイドボタンの数もちょうど良かったし、使い心地も申し分ない。高いけど。

ちなみに、仕事では同じくLogicoolのAnywhere3を使っている。Apexを始めたての頃は、ゲームもAnywhere3でやっていたけれど根本的に手の使い方が違うので変えることにした。

Anywhere3は小型なのでつまむようにもって、指の動きだけでカーソルを動かしているけれど、FPSゲームにおいてこの感度が高い設定は相性が悪い。いわゆるハイセンシになるので、これで上手い人もいるけど平均的な値ではなくなる。そこで、ミドルセンシにすると、マウスをかなり動かすことになるので、指先でマウスを動かすのではなく、手でしっかりつかんで腕も使ってマウスを動かす。こういう動きのときにはAnywhere3の小ささが逆に使いにくくなり、G502の大きさがちょうどよくなる。

マウス用アンチスリップテープ

マウスに貼って滑り止めになるシール。最初は「いるのか?」と思っていたけど、かなり効果があった。マウスがマウスパッド端に来てしまったときに、素早く浮かせる動作をするとき、親指と小指で持ち上げるのだけど、その時の安定感が凄まじく上がる。前までは滑って落ちないように結構小指に力が入っていたけど、このシールのお陰でグリップが強いのでとても楽になった。

また、右クリック・左クリックにグリップがあるのもかなりいい。クリック時の指の動きは真下に行くのではなく、手前に指が曲がりながらクリックする動作をする。このため、指先が滑るとクリックが思ったタイミングとずれたり、指切りを失敗したりする。グリップテープがあると指先はちゃんと止まってくれているので、力のかけ具合が毎回一定になって良い。

レビューにも書いてあるけど、貼るのがちょっと難しいので頑張る必要がある。

マウスパッド

Logicoolのでっかいやつ。FPSを始める前は「こんなでかいマウスパッドとかいらんやろ」と思ってたけど必要だった。てか、このマウスパッドがおける程度に机にスペースがないとFPSをするのは大変になる。

上述したように、FPSと普段の仕事ではマウスの使い方が全く異なるので、マウスパッドもサイズが異なるやつを使うことになる。このマウスパッドはでかいので普段は巻いて片付けて、ゲームをするときだけ広げている。

イヤホン

もともと持っていたBOSEのインイヤーを使っている。

古いモデルなので今これを買う必要はないと思うけど、音はいいし、長時間つけていても耳が痛くならないのでとても便利。ヘッドホンだとどうしても耳が痛くなるし、夏場蒸れたりして大変だったけど、インイヤーなら余裕だった。

ただ有線なのが不便なので、AnkerのBluetoothレシーバーを利用してなんちゃって無線化をしている。

これが地味に便利で、ちょっと扇風機をつけたい時や、水をくみたい時にイヤホンを外したりつけたりしなくて良くなる。不便な点としては、充電が必要になること。

ちなみに、FPS界隈では同じくBOSEのノイキャン付きインイヤーが人気らしい。

充電ケーブル

これだけ周辺機器を揃えていくと、充電も大変になってくる。毎回USBの上下を確認して、充電ケーブルを差すのもアホらしくなってきたのでマグネット式のものを買った。

これがかなり効果的で、今まで自分は結構気合を入れて充電作業をしていたんだと気づくことができた。これを買ったら「とりあえずくっつけとこ」で充電が始まるので、非常に簡単かつノーストレス。

問題点としては、このマグネット式の充電ケーブルは軒並み品質が怪しく、どこのを買っても外れそうだし壊れそうという点。上で紹介しているケーブルも燃えたというレビューもある。かなり便利だけど、このメーカーのが良いよと勧めることができなくて不便。

ちなみに、G502は充電口が奥まっていて使えないので、仕方なく直接差して充電している。

KovaaK's

store.steampowered.com

これはデバイスじゃないけど、エイム練習ソフト。ゲームをするのに練習?とおもうかも知れないけど、FPSはeスポーツの1ジャンルにもなるジャンルなのでスポーツ同様にある程度練習が必要。普通にApexをしているだけでもある程度うまくなるけど、どうしても頭打ちするのでこのソフトで練習した。

バスケのドリブルやラケット競技でボールを思った方向に打つのが最初は難しいように、FPSでもエイムを練習しないと思ったように弾を当てられない。

自分はこの動画を見て、同じ練習メニューでコツコツ練習を続けた。

www.youtube.com

買わなかったもの

Apexコイン

スキンとかと交換できる課金アイテム。Apexは基本無料で遊べて、このコインで課金アイテムを買うタイプのやつ。

スキンが変わろうと、エイムが上手くなったり立ち回りが良くなるわけじゃないので要らない。銃のスキンの中には若干見やすさが上がるやつもあるけど、それが影響を及ぼすレベルのエイム力になるにはマスター帯を目指してる頃なので今はいらないかな。ガチャで当たったら嬉しいなというレベル。

あと、愛用レジェンドのヒューズくんのスキンはなんか微妙なのばっかりなので、そのために課金する気も起きない感じ。ヒューズのスパレジェが出たらその時に課金する予定。いつになるやら。

ミックスアンプ

正直不要だと思っている。ゲーミング界隈のYouTubeとか見ていると、

とか

が人気で良く紹介されている。これらを使うと、音の定位が良くなり足音が分かりやすくなるらしい。ただ個人的にはWindowsに標準搭載されているWindows sonic for headphones機能で十分だと思う。これをONにするだけで、かなり足音の方向はわかりやすくなるので、使ったことがない人は使ってみてほしい。最初はちょっと違和感があると思うけど、すぐ慣れると思う。ただ、普通にYouTubeとか見るときには邪魔なので普段は切っておくと良い。

UISegmentedControlを角丸にする

できたもの

f:id:FromAtom:20220404230101g:plain

コード

import UIKit

final class RoundedSegmentedControl: UISegmentedControl {
    private let segmentInset: CGFloat = 5

    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = bounds.height / 2.0

        let foregroundIndex = numberOfSegments
        if subviews.indices.contains(foregroundIndex), let foregroundImageView = subviews[foregroundIndex] as? UIImageView {
            foregroundImageView.bounds = foregroundImageView.bounds.insetBy(dx: segmentInset, dy: segmentInset)
            foregroundImageView.image = generateImage(color: selectedSegmentTintColor ?? .white)
            foregroundImageView.layer.removeAnimation(forKey: "SelectionBounds")
            foregroundImageView.layer.masksToBounds = true
            foregroundImageView.layer.cornerRadius = foregroundImageView.bounds.height / 2.0
        }
    }

    private func generateImage(color: UIColor) -> UIImage? {
        let size = CGSize(width: 1, height: 1)
        let rect = CGRect(origin: .zero, size: size)
        let renderer = UIGraphicsImageRenderer(bounds: rect)
        return renderer.image { context in
            context.cgContext.setFillColor(color.cgColor)
            context.fill(rect)
        }
    }
}

参考にしたサイト

https://stackoverflow.com/a/60661794/17132714

APNs証明書に「証明書は信頼されていません」と出る問題の解決法

起きること

恒例行事のAPNs用証明書更新作業。いつもの手順で作って、ローカルで.cerファイルとKeychainに追加すると、下記の画像のように「証明書は信頼されていません」と出てくる。

f:id:FromAtom:20220309202030p:plain

このままでも特に問題なく.p12ファイルは作れるけども、なんだか不安がある。

対応方法

developer.apple.com

このニュースにある "Apple Worldwide Developer Relations 中間証明書(G4)"をローカルのMacに入れてあげれば良い。

ここからダウンロードできる。

https://www.apple.com/certificateauthority/

横断型テックリードという働き方

f:id:FromAtom:20220208042049p:plain みなさんこんにちは。FromAtomです。

自分は今『モバイルアプリ分野テックリード』という肩書で仕事をしています。世の中のテックリードの皆様におかれましては「"分野" テックリードって?」「横断型テックリードって?」という感じかと思います。そんなテックリード業を2019年末から2年ちょっとやってきたので、この記事では自分がやっていることの説明と、分野テックリードが置かれた経緯を紹介します。

なぜモバイルアプリ分野テックリードが必要になったのか

弊社では、全部で12つのiOSAndroidアプリを開発しています。これだけあると、各アプリのプロダクトオーナー毎に意思決定の精度にばらつきが出てきます。例えば、Appleのレビューリジェクトに対する姿勢が異なると「まぁ適当にごまかして通せば勝ちや!」というチームと「BANリスクもあるからちゃんとやるか。面倒だけど。」というチームが生まれる可能性があります。

Apple的にはアプリが別でも提供してる会社が同じなら同じ扱いをするので、1つのアプリのレビュー対応が粗野なせいで巻き添えを食って会社のアカウント自体BANされ、全アプリ死亡してしまう可能性もあります。ここまで極端なズレはないんですが、なにも手を打たなければここに至ってしまう可能性もあるわけです。こういったズレを無くして全社的に意思決定を担う役割が必要になります。

また、Webからサービスインした企業の多くは、Web技術をメインとしていたエンジニアがCTOをしていることが多いと思います。「Web屋にスマホアプリが分かるかよ!」みたいな話がしたいわけではなくて、ひとりの人間がカバーできる技術範囲には限界があるということです。

スマホアプリという技術領域は単純なプログラミング能力だけでなく、AppleGoogleというプラットフォーマーによる制約をどのように解決していくかという能力も必要になります。例えばアプリのリジェクトに対する対応方法でも、「レビュアーがこういう文面でリジェクトしてくる場合の対応はこう」といった、ググっても出てこない経験値が効いてくる場面が多々あります。また、WebでGDPR対応が大変なように、iOSでのATTやAndroidでのData Safety Sectionなど、担当のアプリエンジニアだけでは解決が難しい課題もしばしば発生します。

そのため、モバイルアプリ分野テックリードというミニCTOのような役割を設けることで、技術や経験に基づく判断や全社的な方針決定を素早く行うことが可能になります。

ぶっちゃけ弊社のCTOは頭良くてバチバチに優秀なので、自分がいなくてもスマホ分野も余裕でカバーできそうなのですが、いかんせん『人間の身体を持っている』という弱点があります。24時間365日寝食休憩排泄皆無で働けるのであれば良いのですが、人間はそれをすると死んでしまいます。そういう意味では、適切に役割分担ができていると感じています。

事業部型テックリードと横断型テックリード

f:id:FromAtom:20220208040424p:plain

弊社には事業部型のテックリードと横断型のテックリードの2タイプのテックリードがいます。事業部型テックリードは、各事業部もしくは部に所属しています。例えばプロダクトAやサービスBのテックリードみたいな感じですね。世の中的にはこちらが一般的なテックリードだと思います。プロダクトやサービスとしての技術的戦略と、会社全体としての技術的戦略でブレがないようにすり合わせ、その思想や方針をチームに浸透させ牽引していく役割を担うことが多いでしょう。そのため、事業部型のテックリードはプロダクトオーナーやマネージャーと密に連携して、目指すべき方向性を示したり、将来を見据えた先行投資を技術面から行っていきます。

このタイプのテックリードについてはこちらの記事が参考になります。

テックリードという役割 | by Shimpei Takamatsu | Medium

一方で横断型テックリードは特定のプロダクトやサービスに所属せず、特定の技術領域を担当しています。技術領域型テックリードとも言い換えられそうです。モバイルアプリ分野のテックリードはこれにあたります。特定のプロダクトやサービスに属さないため、サービスの成長戦略・人材の育成・キャリアパス・人事評価などには関与しません。特定の技術領域(例えばアプリ)に携わるエンジニア全員が、統一された意思決定方針をもって働けるように、技術的な方針を言語化し布教する仕事をします。

モバイルアプリの横断型テックリードがやってること

アプリに関する技術的な相談窓口

自分で答えられる範囲なら答えたり、明るくない分野については「Aさんが詳しいですよ」と伝えています。リジェクトに対する対応方針とATT関係の相談が多いです。また、経営判断が必要だったりセキュリティ上の懸念がある場合は、然るべき役職へのエスカレーションも行います。

言語化・文章化

アプリエンジニア目線から見た常識を、経営層やマネジメント層にも分かるように言語化・文章化しています。今までに文章化した内容としては、

  • 人員計画
  • 中長期的技術戦略
  • アプリを作る・作らないの判断基準
  • レビューリジェクトとの向き合い方
  • PWAがネイティブアプリの代替にならない理由とPWAの活かし方
  • なぜ弊社はネイティブアプリで開発をするのか

などがあります。入社すると読めます。

スマホアプリエンジニア全員1on1

弊社には10人程度1の正社員アプリエンジニアがいるのですが、半年毎に全員と1on1をしています。普通のキャリアや悩み系1on1はチームのマネージャーやメンターが行っているのため、この1on1では、スマホアプリ開発面での困り事をヒアリングすることを主目的にしています。

例えば、「ビルドが遅くて……」と言われたらPCのスペックを聞き、不足しているようなら2両手を振り回しながらマネージャーに「こいつに新しいのを買ってあげてください!メモリはなにも考えずに一番多いので!」みたいな動きをしています。

法律・プライバシー・レビューガイドラインプラットフォーマー対応

多分ここが一番大きい業務領域です。わかりやすい例ではATTやData Safety Sectionなどで、提出する情報を揃えるために奔走します。なにぶんアプリ数が多く、それに伴ってステークホルダーも増えるため、説明・調整・調査・ヒアリングをぶん回しまくることになります。

他には、どこかの国が法律を変えると、それに伴ってAppleGoogleが書類提出やフォーム入力を求めてくるのでその対応方針を決めたり、レビューガイドラインの変更に伴った要件定義と各所への実装依頼を出したりします。

最近では、Appleがレビューガイドラインでアプリ内にアカウント削除機能を求めてきたので、その対応方針やリジェクトリスクの検討をし、実装方針をあちこちと相談して決めたりしてました。余談ですが、Appleの指定した時期に間に合うように急いであれこれ調整したのに、結局直前で延長されたので「おまえおまえおまえぇ!」ってキレました。

モバイルアプリの横断型テックリードがやらないこと

アプリの機能変更に関する意思決定

アプリに新しく機能を加えたり、削除したりといった意思決定は、そのアプリを開発しているプロダクトオーナーが意思決定するべきです。自分はあくまでも「なにか困ったら聞いてね」という存在でいます。もちろん「それリジェクトリスクが高いですよ」といったものは口をだすようにしています。

マネジメント

テックリードはマネージャーではありません。あくまでも現場にいるチームメンバーの目線から、プロジェクトやチームをゴールに向けて技術面でリードしていくのが、テックリードの役割です。そのため、給与に関する評価を行ったり、エンジニアの抱える技術的ではない問題を取り除くのは、役割の外になります。もしその仕事をテックリードがするのであれば、マネージャーが不要になってしまいますからね。

なおかつ、横断型テックリードにはマネージャー権限・人事権がありません。「横断的に特定職種のエンジニアに関わる諸問題を解決してくれる」と勘違いされがちですが、実はそこまでの権限がないので動けません。各事業部のアプリに関する問題や事業部をまたいだタスクの依頼、人員の配置などの問題を主導して解決するのはあくまでも事業部です。これを自分が行ってしまうと、コミュニケーションパスがハチャメチャになってしまうので、意識してやらないように気をつけています。

もしその仕事を横断型テックリードに求める場合、関係するエンジニアを全員集めて1部署を作る必要があります。たとえば「アプリ部」みたいなものを作り、テックリードがアプリ部エンジニアリングマネージャーとして働く形になると思います。こうすれば、アプリ分野テックリードがマネージャー権限を得られるためアプリエンジニアのタスク管理をしたり、各部署へのリソース配分を調整することができます。ただ、弊社的にはこの職能縦割り方式はまだ規模的に早いので、現時点で導入する気はありません。

一方で、「アプリ基盤」のような部署を作るのはありかもと考えています。プロダクト開発を行うエンジニアとは別に人員を確保して、各プロダクトの開発速度を底上げしていく感じですね。その人員を確保するのが難しいのですが……。

キャリアパスやチャレンジの支援

すべての事業部に所属しているわけではなく、情報が不足しすぎているため実質不可能です。というか、ここらへんの領域は事業部型テックリードやマネージャーが考えてくれているので、自分がやる必要はないんですよね。もちろん、自発的に動いていないだけなので、相談されたら1on1などをしています。

なんかすごいライブラリとか作る

基本的には自分で手を動かすのではなく、作りたい人が作れる環境構築をするのがメインだと考えています。

仮説・検証方法・実装の妥当性やビジネス面での利点などを確認した上で、CTOや偉い人にかけあったり、必要な物資を調達します。もちろん、かけるコストに対する対価が得られることが前提ですが、そこらへんをいい感じにする仕事もします。事業部型テックリードがやってくれる場合もありますが、判断が難しい場合もあります。

まとめ

モバイルアプリ分野テックリードという横断型テックリードの紹介と、生まれた経緯を紹介しました。スマホアプリ開発はコードを書く以外の面倒事があまりにも多いです。その面倒事をなるべく引き受けることで、スマホアプリ開発者がアプリの改善に集中できる環境を作ることを目指してテックリード業を行っています。

もし、こういった環境で働いてみたいという方や、自分がテックリードやってやるぜという方がいましたらTwitter@FromAtom までご連絡ください。ただ話を聞いてみたい方や、カジュアル面談(突然面接が始まるタイプではない)をしてみたいという方もぜひぜひ〜。

最後に、文字ばかりの記事を読んでいただいて、ありがとうございました。


  1. マネジメント挑戦中だったり、ジョブチェンジ中だったりもしてぼやっとした数字です。

  2. 入社時に最新PCが得られるんですが、遠慮したのか中くらいのスペックで買ってしまう人がいて、そのまま言い出せない場合があるんですよね。