さつきのつきあたり

やってみたことをそのままメモするところ

無計画に計画されたSFC修行2023の振り返り

この記事は....

adventar.org

mhidakaが建立した Advent Calendar 2023 の12/16分になります。 mhidaka-sanとはイベントスタッフで関わりがあります。

今朝は飛行機内で書くぞとこんなに意気込んていたのに、あえて狙った78M機材が機内WiFi使えず、さらに睡眠不足により機内サービスを受けることなく爆睡してしまいました。南無

ということで、沖縄県内のとあるカフェからこれを書いています。 タイミングが良いので、今年挑戦したSFC修行についてまとめたいとおもいます。

SFC修行ってなんだ

SFCと言われると 慶應義塾大学 湘南藤沢キャンパス のことか?と思う方もいるかと思いますがそうではありません。

SFC修行と言った際は スーパーフライヤーズカード というクレジットカードのことを指しており、これはANA マイレージクラブのクレジット機能付き有料年会費のカードとなっています。

www.ana.co.jp

上記ページにおいて

スーパーフライヤーズカードは「ダイヤモンドサービス」メンバー、または「プラチナサービス」メンバーのお客様がお申し込みいただけるクレジットカード機能付・年会費有料のカードです。

と説明のある通り、一定の条件を満たした会員のみがその申し込みを許される特別なカードとなっています。

つまり、スーパーフライヤーズカードの申し込みができるように一定の条件を満たす行為のことをSFC修行と呼んでいるわけです。

なぜ人はSFC修行をするのか

各航空会社では、優良顧客に対して飛行機に搭乗前後でより手厚いサービスを提供しています。 例えば、ANAでは国内線プレミアムクラスに搭乗する際、通常の保安検査場とは別に特定の乗客だけが利用可能な保安検査場を用意しています。(ANA PREMIUM CHECK-IN)

www.ana.co.jp

ほかには、ANAが提供するラウンジが利用できるようになります。 よくあるゴールドカードで入場可能なラウンジ(カードラウンジ)とは異なり、ラウンジの立地がよかったり、アルコールやおつまみが提供されていたりします。国際線利用時に入場できるANA LOUNGEは軽食の提供もあるなど、より良いサービスを受けることができます。

そして、飛行機への搭乗時に優先的に機内に入ることができます。 国内線では

  • 最上位のダイアモンドメンバーがGroup1
  • プラチナメンバー、プレミアムクラス、SFC、スタアラGOLDがGroup2
  • 窓側席がGroup3
  • 中央席がGroup4
  • 通路側席がGroup5

という順序で機内に入ります。ステイタス持ちはGroup1 or Group2で搭乗となるので、焦らず騒がず落ち着いて着席することが可能です。

他にも色々ありますがここでは省略。 詳しくはSFC修行の解説ブログを探してみてください。


と、ここまではマイレージクラブのステイタス保有者のサービスを紹介してきました。 SFCはどういう扱いになるのか?というと、ざっくりプラチナステイタス保有時と同等になります。 つまり、年会費を払ってSFCを維持するだけで、常にプラチナステイタス同等のサービスを受けることができます。 1年間頑張ってステイタスを獲得しSFCを発行することで、翌年以降は年会費だけで修行せずとも優遇してもらえるというわけです。常に優遇されたい。

SFC修行は何をするのか

ルールは至ってシンプルで、ANAマイレージクラブにおいて 「ダイヤモンドサービス」メンバー、または「プラチナサービス」メンバー になることができれば終了です。

ANAマイレージクラブでは3つのステイタスがあります。下から順に

  • ブロンズ
  • プラチナ
  • ダイヤモンド

となっています。 先のスーパーフライヤーズカードの申し込み条件を参照すると、2番目のプラチナ、もしくは3番目のダイヤモンドのステイタスを獲得できれば良いことになります。SFC修行に挑む人々(これを修行僧と呼んだりします)は少なくともプラチナ獲得がMUSTになるので、多くの人々はここを目指して綿密に計画を立てて挑戦します。

自分は、新卒入社したCyberAgent, Inc.を2023年3月で退社、4月からDeployGate Inc.に入社しました。 (DeployGateに入社したぞpostはしていなかったことに気がつきました)

DeployGateでは週休3日制度を運用しており、水曜日がお休みです。 転職を機に生活スタイルが変わり、時間に余裕ができたことがSFC修行を始めるきっかけでした。 以前から興味はあったこと、知り合いにSFCJGC(これはJALでのSFCみたいなもん)保有者がなぜか多くなんとなく情報は仕入れていたのもあったことが後押しし、じゃあやるかと無計画に勢いよくはじめました。

修行僧、50kPPを目指しHND-OKA往復祭りの日々

プラチナ獲得のためにはプレミアムポイント(PP)を5万貯めることが求められます。 プレミアムポイントはマイルをベースに各種パラメータを適用した計算式によって求められます。 ANA公式がシュミレーターを用意しています。

cam.ana.co.jp

1PP=10円程度*1とすると、およそ50万円分の航空券を購入し実際に搭乗しなければなりません。 買うだけじゃダメです。乗らないといけないのです。

新型コロナウィルスや円安による燃料代高騰の影響もあって、1度に距離の稼げる国際線を用いた修行はコスパが悪くほぼ国内線で修行することとなりました。*2

国内線修行において最も利用される路線、それが 羽田[HND]-沖縄(那覇)[OKA] 路線です。 一度に稼げる距離が国内線においては最長級で、かつ本数も十分に確保されているため修行しやすいのです。

自分も例に漏れず、このHND-OKAをひたすらに往復しました。 管理が大変なのでspreadsheetでカウントしていたのでその様子をご覧ください。

怒涛のHND-OKA往復祭り

4月は毎週水曜日にHND-OKAを2往復するというクレイジー修行僧をしていました。 1本目は早朝過ぎて電車では辿り着けないのでクルマで前入りし待機。4本乗り終えた後にクルマで帰り、着くのは深夜。 予約の取り方次第ではあるものの、ほとんど空港から外に出られず、カードラウンジや空港内飲食店で時間調整。

終わるころには息をするように羽田空港P4立体から始発便のゲートへ行けるぐらいになっていました。 ここまで詰め込みだと大変そうに見えるとおもいますが、はい大変です。 ですが乗り物に乗ること自体は好きな人だったのが功を奏し、全く苦ではありませんでした。 機内はWiFiも使えるし、時間を選べばモニターやACコンセントがついてる機材に乗ることもできたのも良かったと思います。

往復だけではない!修行の楽しみ方

出費は増えますが、旅行として、ワーケーションとして、という感じで現地での楽しみをうまく取り入れながら修行するとより楽しめると思います。どうせ大金払って飛行機乗るのですから、ついでに楽しまない手はありません。

自分は現地宿泊のパターンも何度かやりました。 現地でレンタカーを借りて走り回ったり、ロードバイクを持ち込んでみたり、前職の同僚と飲みに行ったり。

左ハンドルのレンタカーを借りて爆走してみたり

買い替える前のcorattecちゃんを連れて行ったり

こういう楽しみができたのも、よい機会だったなと思っています。

現状の修行進捗

12/16現在、私のAMCステイタスは ブロンズ となっています。つまり 終わっていません 。 なんとも無計画な修行となっており恥ずかしい限りです。

終わってねえじゃん!

このままでは未達となりここまでの修行が水の泡になってしまうので、ギリギリ滑り込みでHND-OKAをこの週末に1往復します。これで晴れてプラチナ達成、解脱となります。くぅ〜疲れました!

完走した感想は完走したときにXでpostしようとおもっています(無駄に引き伸ばす)

さいごに

SFC修行に興味を持った方、ちゃんと解脱まで完璧にルート計画してから挑みましょう(1敗)

*1:PP単価といいます。単価10円は目安と言われています

*2:12/16現在、国際線は12/31までの期間限定でPP倍付けキャンペーンをしているため、上手に活用することで国際線でも修行ができます

AndroidTVでユーザにおすすめコンテンツを提案する方法

業務でAndroidTVのホーム画面にレコメンドを表示する機能の改修があり、その中で色々と調べたので少しずつ残していきます。
今回は実装コードはないのであしからず。

AndroidTVデバイスとホーム画面

AndroidTVには、スマホAndroid)のランチャーのような画面はありません。 代わりに、アプリの一覧やアプリがそれぞれ自由におすすめコンテンツを訴求できる枠などがまとめられたホーム画面が提供されています。

ホーム画面は各行が横にスクロールできるようなUIになっており、行ごとに一括りにされた情報が列挙されています。

f:id:satsukies:20200310023823p:plain ホーム画面のチャンネル | Android デベロッパー | Android Developers より引用

アプリの開発者は、仕様に沿っておすすめコンテンツを組み立てContentProviderへ登録する事で、このホーム画面に任意のコンテンツを並べてユーザへ訴求することができます。

また、これらのおすすめの表示はユーザの操作によって並び順のカスタマイズや、表示されているコンテンツの削除などができるようになっています。1

ホーム画面でコンテンツを表示できる枠について

開発者がコンテンツを登録することで表示できる場所はいくつか存在します。 以下にそれぞれ簡単にまとめておきます。

Watch Nextチャンネル

このWatch Nextチャンネルは、先に示したホーム画面で2行目の位置に表示されている行です。
このチャンネルはAndroidOSが自動的に作成しており、管理もOSが行っています。

ここには、アプリから視聴途中の動画コンテンツや、それに関連したコンテンツを表示したり、ユーザが自分で操作することで登録されたコンテンツなどが表示されます。

このチャンネルは後述するレコメンデーションチャンネルとは異なり、チャンネル自体の並び順を変えたり、チャンネルを削除したり非表示にしたるすることができないようになっています。

つまり、適切にコンテンツを登録する事で、ユーザにコンテンツを効率よく訴求できると思います。 なぜなら、常にファーストビューにコンテンツが表示されることになるからです。

developer.android.com

レコメンデーションチャンネル

Watch Nextチャンネルと比較すると、活用パターンに幅がありそうなチャンネルになります。
こちらはアプリが自由に作成することができるタイプのチャンネルで、チャンネルそのものの登録や削除、更新と言った管理もアプリ側から行うことになります。

チャンネルはいくつでも提供することができます。
例えば、YouTubeアプリの場合は以下のように3つのチャンネルを提供しています。

  • あなたへのおすすめ
  • 急上昇
  • 登録チャンネル

f:id:satsukies:20200310130619p:plain
YouTubeアプリが提供しているRecommendation Channel

目的やコンテンツのくくりごとなどで適切にチャンネルを作成し、コンテンツを登録してあげることで、ユーザにとって価値のあるホーム画面を構築する手助けができると思います。

developer.android.com

Android N以前でのおすすめ表示

旧OSでのおすすめ表示は、ここまで紹介してきたチャンネルという概念がないので、別途開発が必要になります。
今後このおすすめを表示するデバイスは減っていくと思いますが、まだLollipop(API 21)のAndroidTVデバイスが多く存在する以上、こちらの対応も実質的に必須要件になってくることは避けられないと思います。

レコメンデーションチャンネルとの最も大きな違いは、行が1つしかないことです。
アプリごとの行ではなく、全てのアプリが登録したおすすめコンテンツが同じ行に混在する形になります。

f:id:satsukies:20200310032150p:plain Android N 以前でのおすすめの表示 | Android デベロッパー | Android Developersより引用

登録できる情報に大きな差はないですが、登録するコンテンツの組み立て方などが微妙に異なるので、実装に注意が必要です。

developer.android.com

まとめ

とりあえず、AndroidTVでのおすすめコンテンツの訴求方法について簡単にまとめました。
Oreo(API 26)以上か、それ未満かによって表示形式も登録手法も大きく変わります。
今後、Oreo以上のOSを搭載したデバイスが増えていくことは自明だと思いますが、現時点ではOreo未満のデバイスが多く存在しています。そのため、それぞれに合わせた実装を混在させることが求められます。
これがそこそこ面倒です… ですが、この機能への対応によって得られる訴求効果、特にリテンションに大きく貢献してくれる可能性がとても大きいと思っています。

具体的な実装の手法については、追って記事にしたいと思います。 それでは。


  1. ただし、この操作ができるのはAndroid O(API 26)以降のOSを搭載したAndroidTVデバイスに限られます。市場に出回っている製品だと、Android Oよりも古いOSを搭載したデバイスがまだ多いです。

What's Android Jetpack: Navigation

Google I/O 2018のkeynoteで発表されたAndroid Jetpackの1機能であるNavigationについて調べました。

CA.apk #6で発表したときの資料

大体はGoogle I/O報告会でLTした際のスライドにまとまっているので、こちらをどうぞ。

いくつか気になった(気になってた)ことについて

このスライドに載せられなかったけど気になっている部分などを、少し書いておきたいと思います。

特殊な表示条件の画面の対応はどうするのか

スプラッシュスクリーンのように起動時だけ表示させておきたい画面だったり、ログインが必要な場合は最初にログイン画面に遷移させたい、というような状況ってよくあると思います。

LTでは紹介できなかったのですが、ドキュメントにはこれらの画面の取り扱いについて説明があります。

https://developer.android.com/topic/libraries/architecture/navigation/navigation-conditionaldeveloper.android.com

Conditional navigation、条件付きナビゲーションだそうです。

具体的な実装方法が明記されてないのでまだ試せていないですが、特定条件下で遷移するnavigation graphを別途実装してそちらへ飛ばすみたいな感じになるんでしょうか。 条件付きといいつつ、現状は自分で状態評価して必要なら別画面に飛ばすとなるとちょっと面倒?

スプラッシュ画面に至っては下手すると一瞬Starting Destinationの画面が見えてしまうという残念な感じに… 今後に期待しておきたいと思います。

Deep Linkでアプリを起動した時の戻り先 is どこ?問題

スライド中でも説明していますが、Principle of Navigationの1つにDeep Linkによる遷移と通常操作での遷移は同一のスタックが生成する必要がある、という項目があります。

developer.android.com

この原則に従うのであれば、Deep Linkで起動した画面がStarting Destinationでない限りは、通常操作で当該画面まで遷移した場合と同じスタックが生成されなくてはいけないということになります。 結果的に、自身のアプリ内でのBackキーやUpボタンの挙動は、画面への遷移手段に関わらず一定となるはずです。

さらに、Principle of Navigationには「Upはアプリを終了させることはない」「BakcとUpはアプリ内で同等な操作となる」という原則が書かれていて、これらを考慮するとDeep Linkでのアプリ起動時だとしてもBackキーで元のアプリへ戻る挙動は、"Principle of Navigation"的には間違い、と解釈できると思います。

ただ一方で、Google PlayアプリやGoogle MapアプリのようなGoogle謹製アプリをはじめ、多くのアプリは違う挙動を示しているので、この原則が本当に正しいのかはまだ 🤔という感じです。 ちなみにAbemaTVはブラウザのURL踏んだ際の起動でも、Backキー押下で親画面に戻る挙動になっていました。

いずれにせよ、こちらについても今後の動向を見守る必要がありそうです。

Toolbarの扱いどうすんの問題

このようにwasabeefさんが言っています。これはGoogle I/O現地で一緒に行動していた方も同じ疑問を持っていました。 Single Activityなアプリにする場合で、各面でToolbarに出したいものが異なる場合どうするのか、ということです。 ToolbarはActivityが持っていることが多い?と思うのですが、一方で表示するFragmentごとにToolbarの表示内容を調整したいという気持ちになるので、どっちに持たせるの?という疑問。

これの答え?を探してみました。 Codelabのコードを見ていると、Navigationでの遷移対象となっているFragment側で onCreateOptionsMenu()をオーバーライドして、画面固有のメニューを生成しています。例えば、MainFragment.ktでは以下のような感じになってます。

  override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    inflater?.inflate(R.menu.main_menu, menu)
  }

一方で、遷移先のFlowStepFragment.ktでは上のような記述はない状態です。

menu/main_menu.xmlは以下のような感じです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/main_2"
        android:icon="@drawable/ic_shopping_cart_white"
        android:title="@string/shopping_cart"
        app:showAsAction="ifRoom" />
</menu>

この状態で実機へdeployしてみると、MainFragmentが表示されている状態ではmain_menuに定義されている項目がToolbarに表示され、FlowStepFragmentへ遷移するとMainFragmentで表示されていた項目は表示されなくなりました。

f:id:satsukies:20180525114006g:plain

右上のカートボタンが、MainFragment側で定義されていたmenu項目です。 Toolbar自体はActivity自体にもたせているが、表示される項目をFragmentごとに指定できるみたいなので、結果アニメーションも含めていい感じになっているように見えます。解決かな?

multi moduleにした場合

Navigationでは、遷移先として以下が指定できます。

  • Fragment
  • Activity
  • Navigation Graph

Multi moduleの場合、各moduleにはエントリーポイントとなるActivityがいるのかな?と思うので、そこへのActionを定義することで画面遷移を追加できる気がしています。もしくは、別のmoduleに含まれるnavigation graphへの遷移でもいいかもしれないです。

これは別途検証したいなと思ってます。

まとめ

Navigationと上手に付き合えると、画面遷移を楽に実装できそう。Good-bye Fragment Transaction 👋 一方で、既存の構成だと場合によっては大規模なマイグレーションが必要なので、pros&consをちゃんと理解した上で入れたいですね。

potatotips #48 に参加してきました

あけましておめでとうございます(2ヶ月経過) 今年もちょいちょいいろんなことを発信していければと思います。

タイトルの通り、2/22(木)にpotatotips #48にまとめ枠で参加してきました。 毎度まとめるまでに時間がかかりすぎていることをお詫びしたいです。運営さんすみません。

続きを読む

ネットワークが低速な環境を再現したい

先月はデータ通信を使いすぎまして、見事速度制限を喰らいました。キッチリ128kbpsに制限されていて、AWAやLINE Musicのようなストリーミング配信サービスがほとんど機能しなくて人権ない状態でした。

その時ふと、ネットワークが低速な状態のデバッグを任意のタイミングでしたいと思ったのでメモ。

続きを読む