つばくろぐ @takamii228

知は力なり

2021年の振り返り的な何か

今年もやる。去年のはこちら。

takamii.hatenablog.com

2021年にできたこと

iOSAndroidアプリ開発の理解が深まった

2021年度もクライアントアプリ側を一式見る仕事を続けた。

iOSの証明書周りの細かいところも理解が深まった。細かい発見ネタはいくつかブログに起こしていた。

いい加減自分でアプリをサクッと作れるようになりたみ。

AWS SAPro を取得した

昇級要件を満たすためにずっと取ろう取ろうと思っていてサボっていたのだけど、今年ようやく取れた。

準備期間は3ヶ月ちょっとだったけどkoiwa clubを活用して無事一発で取れた。

takamii.hatenablog.com

ISUCONに出た

今年も同じメンバーでISUCONに出られた。少しずつ順位が上がっているので、来年度も開催されれば頑張りたい。

takamii.hatenablog.com

ブログを月1ペースで投稿できた

去年に引き続いて月1投稿ペースを維持できた。月一回くらいがちょうどいいな。

f:id:takamii228:20211231101858p:plain

振り返り

良かったこと・できたこと
  • iOSの証明書周りの知見が深まった
  • iOSAndroid、Flutterの知見が深まった
  • ISUCONで去年の成績を上回れたこと
  • ブログの月1投稿が継続できたこと

去年の知識貯金を使いつつ、いろんなプロジェクトをつまみ食いしつつそこで力を発揮できて、さらに知識を上乗せできたような気がする。

良くなかったこと・できなかったこと
  • 登壇発表しなかったこと
  • 積ん読が増えたこと
  • 業務環境的に開発系の作業率が大幅に減ったこと
  • 結局競プロを再開しなかったこと

今年は登壇発表を一切していなかった。業務ではCICDについて整理できたり、Flutterのメリデメとかをまとめられたので、またどこかでアウトプットしたい。

今年度は職場環境がわりと変化があって、業務内容も管理系の仕事の割合が増えてきた。もう1.0で一つのプロジェクトを見るということはないのだろうかと思うと悲しい気持ちになる。 いい感じにうまくやって、注力できるところに注力できるようにしたい。

2022年の抱負的な何か

  • iOS / Android / Reactで個人アプリを作ってみる
  • GCP Associate Cloud Engineer / Professional Cloud Architectを取る
  • AWS SA DevOps Proを取る
  • TOEICスコア(785)を更新する
  • AtCoderを再開する
  • ISUCONに出る(開催されれば)
  • 月1ブログ投稿を継続する
  • 3年後、5年後の自分の仕事・人生の具体的なイメージを持つ
  • 健康を維持・推進する

2022年はGCPも少しやっていこうと思う。このままだとスマホアプリの人になってしまうので、そろそろバックエンドもみたい。両方わかるからこそ見られる世界で何か知見が得られたらいいな。

あと夏頃に過去最高の体重を記録してしまったので10月11月と減量して7kgくらい痩せた。そして風邪引いた。まだ標準体重より少し多いので、もう少し減量したい。

まとめ

去年のブログでは上限の鬼の話をしていた、懐かしい。

2021年は人生に少し進捗があったので、2022年は人生の方もぼちぼち頑張りたい所存。

2021年にお金を払ったサービス一覧

2021年にお金を払ったサービスの一覧をまとめた。光熱費は除きます。

2020年版はこちら

takamii.hatenablog.com

新規に契約したもの

Netflix 1490円 / 月

自粛生活で見たい動画があったので契約した。ででーん。

TOHOシネマズシネマイレージ会員 300円 / 年

去年から契約してたけど書き忘れてたので記載した。シネマイレージ会員だと無料会員だと3日前の24時から座席予約できるのが3時間早い21時からできる。

SPGアメックスカード 34100円 / 年

Marriott Bonvoyのマイルとホテルステイに誘われて契約。メインカードもこれに移行した。

解約したもの

Evernote Plus 3100円 / 年

全然使わなくなったので解約してNotionに移行した。

IntelliJ IDEA Ultimate Personal 11110円 / 年

1年間全く使わなかったので更新をやめた。

新宿御苑年間パスポート 2000円 / 年

緊急事態宣言中の延長措置が訳わからなくなって結局更新していない。次回作るときは再作成だな。

継続で契約しているもの

Zoom 20145円 / 年

実家とのビデオ通話や友人とのZoom飲みで使っている。

Apple Music 9800円 / 年

2年目に突入。新曲がすぐに聞けるのがいい。

マネーフォワードME 5300円 / 年

安定。もうこれ無しじゃ生きられない。年金ネットを足したら資産がめっちゃ増えた。

Apple Developer Program $99 / 年

アプリ配信はしていないのだけど、仕事の検証を手元でさらっとやるのに大活躍した。

Amazon Prime 4900円 / 年

Prime Videoにお世話になった。Amazonでの買い物はだいぶ減ったなぁ...。

dマガジン 440円 / 月

今年もお世話になった。コスパいい。

Google One 2500円 / 年

Google Driveは100GBあるけどまだまだ空きがある。

To Me Card 2200円 / 年

利用頻度は減ってるけど、年会費分は今年も回収できた。

日本経済新聞Wプラン 5900円 / 月

実家と折半継続。

Nintendo Online 2400円 / 年

モンハンでお世話になった。

NHK 23891円 / 年

少し値下げされた。

Norton 360 デラックス 12100円 / 3年

前回買ったやつが期限が切れたので。

IIJ mio ギガプラン(15GB + 2GB) + 通話放題 3531円 / 月

今まで書いてなかったので記載。ギガプランの登場で安くなったのでSIMを1枚解約して2枚体制にした。通話放題も今度安くなるらしい。

インターネット代 990円/月 + 3465円/月

これも書いてなかったので。これがないと生きていけない。

以上。

macOSにインストール済みのプロビジョニングプロファイルの情報を確認する

Apple Developer Programで発行したプロビジョニングプロファイル(*.mobileprovisionのファイル)はXcode経由だったりファイル自体のダブルクリックでmacOS端末へインストールされ、ipaファイル作成のときに利用されます。

今回、複数のプロビジョニングプロファイルを複数のmacOS端末にインストールして管理する必要があったので、すべてのプロファイルがすべてのマシンにきちんとインストール済みか否かを確認したくなりました。そのときに調べた結果をまとめます。

プロビジョニングプロファイルのインストール先

プロビジョニングプロファイルはインストールすると以下のフォルダに${UUID}.mobileprovisionというファイル名で保存されます。

$ ls $HOME/Library/MobileDevice/Provisioning\ Profiles/*                                                  
/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/2f3a3f52-13af-4a6c-937d-10028146d5ae.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/3d943dc2-ce76-4fb1-a70e-aba05ad9fbc6.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/40acedbd-366c-405d-9a58-ff1b5bd7645e.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/4a898d9e-bae1-448f-b4d0-02fc90cb9bb5.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/701406dd-b5eb-45eb-8096-45bea60f8020.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/737b93bf-b562-4cc3-b8db-126b2e52016d.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/8eedc147-de04-437c-a0dc-00ce0c863764.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/900f557d-6536-46fb-8e17-9fe1b3b08a51.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/bcd30cf8-8386-4f88-9fca-d1128e144eac.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/c1d35546-c60e-40a7-9736-918613eecede.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/c5e116cc-2584-473e-ac67-75a723893266.mobileprovision
/Users/takami228/Library/MobileDevice/Provisioning Profiles/daacc73a-41ce-4367-b2b2-5b97bef776de.mobileprovision

プロビジョニングプロファイルの中身を確認する

プロビジョニングプロファイルの中身はそのままだと表示できません。securityコマンドを使うことでplistファイル形式のテキストに変換ができます。

$ security cms -D -i /Users/takami228/Library/MobileDevice/"Provisioning Profiles"/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>AppIDName</key>
    <string>flutteripatest</string>
    <key>ApplicationIdentifierPrefix</key>
    <array>
    <string>xxxxxxxx</string>
    </array>
    <key>CreationDate</key>
    <date>2021-07-02T04:56:27Z</date>
    <key>Platform</key>
    <array>
        <string>iOS</string>
    </array>
    <key>IsXcodeManaged</key>
    <false/>
         ...
</dict>
</plist>%  

plistファイルをJSON形式に変換してほしい情報を出力する

plistファイルはxmlチックなデータ形式になっているのでそのままだと扱いにくいです。PlistBuddyをコマンドを使っても良いのですが、securityコマンドとパイプでつないで利用したい場合は一度テキスト出力しないといけないので面倒です。

そこでplutilコマンドで無理やりJSON形式に変換してjqコマンドで必要な情報を出力することにします。

こちらのstackoverflowの記事が参考になりました。

stackoverflow.com

$ security cms -D -i "/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision" | \
    sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | plutil  -convert json -r -o - -- -
{
  "AppIDName" : "flutteripatest",
  "ApplicationIdentifierPrefix" : [
    "xxxxx"
  ],
  "CreationDate" : "2021-07-02T04:56:27Z",
  "DER-Encoded-Profile" : 
   ....
}%                                                                                                                                            

しかし出力されたjson形式のうちBundleIDを表すキーとして"application-identifier"があるのですが、こちらはハイフンを含むのでjqコマンドを通すとエラーになっています。そこで"application_identifier"というアンダースコアに置換することでjqコマンドをパイプすることにします。

$ security cms -D -i "/Users/takami228/Library/MobileDevice/Provisioning Profiles/1018cb3f-51c0-4ac2-9f70-81af1e7a52c1.mobileprovision" | \
    sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | plutil  -convert json -r -o - -- - | \
    sed -Ee s/"application-identifier"/"application_identifer"/g | \
    jq -r
{
  "AppIDName": "flutteripatest",
  "ApplicationIdentifierPrefix": [
    "xxxxxxx"
  ],
  "CreationDate": "2021-07-02T04:56:27Z",
  "DER-Encoded-Profile": 
  ....
  "Entitlements": {
    "application_identifer": "xxxxxxxxxx.com.takamiii.flutter.ipa",
    "com.apple.developer.team-identifier": "xxxxx",
    "get-task-allow": true,
    "keychain-access-groups": [
      "xxxxx.*",
      "com.apple.token"
    ]
  },
  "ExpirationDate": "2022-07-02T04:56:27Z",
  "IsXcodeManaged": false,
  "Name": "flutteripa",
  "Platform": [
    "iOS"
  ],
  "ProvisionedDevices": [
    "xxx",
    "xxx",
    "xxx"
  ],
  "TeamIdentifier": [
    "xxxx"
  ],
  "TeamName": "Masanori Takami",
  "TimeToLive": 365,
  "UUID": "1018cb3f-51c0-4ac2-9f70-81af1e7a52c1",
  "Version": 1
}

あとはmobileprovisioningファイルが置かれているフォルダでforループを回せばインストール済みのプロファイル情報一覧が取得できます。 例えばBundleID(application-identifier)とprovisining profileのUUIDと有効期限を一括出力する場合は以下のようにかけます。

#!/bin/sh

for filepath in $HOME/Library/MobileDevice/"Provisioning Profiles"/*; do
  security cms -D -i "${filepath}" | sed -Ee 's#<(\/)?dat[ae]>#<\1string>#g' | \
    plutil  -convert json -r -o - -- - | \
    sed -Ee s/"application-identifier"/"application_identifer"/g | \
    jq -r '. | .Entitlements.application_identifer + " " + .UUID + " " + .ExpirationDate'
done

出力は以下のようになります。

$ ./run.sh 
xxxxxxxxxx.com.takamiii.flutter.ipa 1018cb3f-51c0-4ac2-9f70-81af1e7a52c1 2022-07-02T04:56:27Z
xxxxxxxxxx.com.takamiii.appcentersample 2f3a3f52-13af-4a6c-937d-10028146d5ae 2021-04-05T06:11:07Z
xxxxxxxxxx.takamii228.GeoLocationTracking 3d943dc2-ce76-4fb1-a70e-aba05ad9fbc6 2019-03-08T12:29:30Z
xxxxxxxxxx.com.takamiii.xcodevalidate 40acedbd-366c-405d-9a58-ff1b5bd7645e 2021-12-05T05:52:12Z
xxxxxxxxxx.* 4a898d9e-bae1-448f-b4d0-02fc90cb9bb5 2021-12-05T06:44:01Z
xxxxxxxxxx.com.takamiii.firebaseAppDistribution 701406dd-b5eb-45eb-8096-45bea60f8020 2022-01-10T06:12:26Z
xxxxxxxxxx.com.takamiii.flutter.ipa 737b93bf-b562-4cc3-b8db-126b2e52016d 2021-12-05T05:52:12Z
xxxxxxxxxx.com.takamiii.appcentersample 8eedc147-de04-437c-a0dc-00ce0c863764 2022-10-18T11:46:36Z
xxxxxxxxxx.com.takamiii.firebaseAppDistribution 900f557d-6536-46fb-8e17-9fe1b3b08a51 2022-01-10T06:11:03Z
xxxxxxxxxx.com.takamiii.appcentersample bcd30cf8-8386-4f88-9fca-d1128e144eac 2022-10-18T11:45:27Z
xxxxxxxxxx.com.takamiii.xcodevalidate c1d35546-c60e-40a7-9736-918613eecede 2021-12-05T06:05:12Z
xxxxxxxxxx.com.takamiii.xcodevalidate c5e116cc-2584-473e-ac67-75a723893266 2021-12-05T06:43:38Z
xxxxxxxxxx.com.takamiii.push-test daacc73a-41ce-4367-b2b2-5b97bef776de 2021-07-13T04:32:53Z

あとは出力結果を比較すればプロファイルがインストールされているかのチェックコマンドとして活用できそうですね。