ipa ファイルから CFBundleVersion を確認するワンライナーのメモ。
ipa ファイルから CFBundleVersion を確認するワンライナーのメモ。
したいこと
ipa ファイル (iOS のアプリ) しかない状態で CFBundleVersion を確認したい。 中間ファイルとかは作りたくない。
確認する方法
CFBundleVersion は ipa ファイルのなかの Payload/<アプリ>.app/Info.plist
に記述されているので、それを確認すればよい。
Info.plist の中身はバイナリーだけど plutil で XML なり JSON なりに変換できるので簡単に読める。
個人的には XML よりも JSON のほうが扱いやすいので Info.plist の中身は plutil で JSON に変換して jq で CFBundleVersion を抜き出してる。
実際の確認
unzip -p <IPA ファイルのパス> Payload/<アプリ>.app/Info.plist | plutil -convert json -o - -- - | jq -r .CFBundleVersion
でいける。
↓ hoge.app
というアプリの CFBundleVersion を確認する例。
$ unzip -p hoge.ipa Payload/hoge.app/Info.plist | plutil -convert json -o - -- - | jq -r .CFBundleVersion 2.1.14
以上。
"草 API サービス" Pixela のブリーダーセットをいただきました!
pixela-client-go が v1.1.0 にバージョンアップしました。
pixela-client-go が v1.1.0 にバージョンアップしました。
v1.1.0 アップデート内容
optionalData プロパティに対応
日付ごとの要素 Pixel の optionalData
プロパティに対応しました。
optionalData
プロパティ の使い方に関しては 公式ブログ にとても詳しく書かれているので参照してください。
publishOptionalData プロパティに対応
Graph の publishOptionalData
プロパティに対応しました。
publishOptionalData
プロパティ の使い方に関しては 公式ブログ にとても詳しく書かれているので参照してください。
現場からは以上です。
Pixela の Go クライアントを作りました
Pixela の Go クライアントを作りました。
書くこと
- Pixela とは?
- 使い方
- インストール
- 動機
- まとめ
Pixela とは?
任意の数値を登録してアレのあれっぽくグラフを作れるクールな API サービスです。
詳しくは↓
使い方
package main import ( "log" "github.com/ebc-2in2crc/pixela-client-go" ) func main() { client := pixela.NewClient("YOUR_NAME", "YOUR_TOKEN") // 新しいユーザーを作る result, err := client.CreateUser(true, true, "") if err != nil { log.Fatal(err) } if result.IsSuccess == false { log.Fatal(result.Message) } // 新しいグラフを作る result, err = client.Graph("graph-id").Create( "graph-name", "commit", pixela.TypeInt, pixela.ColorShibafu, "Asia/Tokyo", pixela.SelfSufficientNone, false, false, ) if err != nil { log.Fatal(err) } if result.IsSuccess == false { log.Fatal(result.Message) } // ピクセルに値を記録する result, err = client.Pixel("graph-id").Create("20180915", "5", "") if err != nil { log.Fatal(err) } if result.IsSuccess == false { log.Fatal(result.Message) } // ピクセルの値をインクリメントする result, err = client.Pixel("graph-id").Increment() if err != nil { log.Fatal(err) } if result.IsSuccess == false { log.Fatal(result.Message) } // 新しい webhook を作る webhook, err := client.Webhook().Create("graph-id", pixela.SelfSufficientIncrement) if err != nil { log.Fatal(err) } if webhook.IsSuccess == false { log.Fatal(webhook.Message) } // webhook を呼び出す result, err = client.Webhook().Invoke(webhook.WebhookHash) if err != nil { log.Fatal(err) } if result.IsSuccess == false { log.Fatal(result.Message) } }
一応すべての API をサポートしています。
と書いておきながら 対応しました。Pixel
の optionalData
プロパティと Graph
の publishOptionalData
プロパティは自分が使っていないせいか今のところサポートしていません。
インストール
$ go get -u github.com/ebc-2in2crc/pixela-client-go
動機
Pixela はシンプルでいろんなことに応用できるとても便利な API サービスです。 最近は Go のコードを書く機会があったので Go から Pixela を使いたいと思って Go クライアントを探したのですが、なんとなく車輪を再発明してみたくなったので作りました。
まとめ
バグとかあると思いますし「こーしたら使いやすくなる」とかあったらイシュー作ったり声かけてもらえると嬉しいです。
ということで Pixela の Go クライアントの紹介でした。
AWS の CloudWatch ロググループの保持期限を一括で設定するメモ。
AWS の CloudWatch ロググループの保持期限を一括で設定するメモ。 コンソールからたくさんのロググループの保持期限を手で変更していくのが面倒くさかったので AWS CLI で一括設定。
やったこと
aws logs describe-log-groups
コマンドで全ロググループを取得できるので取得したロググループに対して aws logs put-retention-policy
コマンドで保持期限を設定するだけ。
たとえば以下のコマンドでロググループの保持期限を30日に一括設定できる。
$ aws logs describe-log-groups | grep 'logGroupName' | sed -e 's/.*logGroupName": "//' -e 's/",.*//' | xargs -n1 -I{} aws logs put-retention-policy --log-group-name {} --retention-in-days 30
jq を使うと上のコマンドと同じことをもう少し簡潔に書ける。
$ aws logs describe-log-groups | jq -r '.logGroups[].logGroupName' | xargs -n1 -I{} aws logs put-retention-policy --log-group-name {} --retention-in-days 30
参考ページ
AWS の CloudWatch Logs Insights の ispresent 関数でちょっとつまづいたメモ。
AWS の CloudWatch Logs Insights の ispresent 関数でちょっとつまづいたメモ。
つまづいたこと
CloudWatch Logs Insights は独自のクエリ言語を備えていてロググループを効率的に検索できる。 クエリ言語は便利ないろんな関数が用意されていてとても便利なのだが、そのうちの1つ ispresent 関数を使おうとしてちょっとつまづいた。
ispresent は一般関数に分類され、公式ドキュメント によると一般関数は filter コマンドと fields コマンドで使えることになっている。
一般関数は、filter コマンドと fields コマンドで使用できます。
サンプルのクエリ にも
filter eventName="UpdateTrail" and ispresent(errorCode) | stats count(*) by errorCode, errorMessage
filter コマンドで使えると書いてあるのだが、
fields @timestamp, @message | filter ispresent(@timestamp)
こんなクエリを実行すると
クエリの理解で問題が発生しています。
というエラーになる。
解決策
ispresent 関数は fields コマンドで使ってエイリアスをつけて、filter コマンドからはエイリアスを参照するとエラーにならずちゃんと動いた。
fields @timestamp, @message, ispresent(@timestamp) as exists | filter exists
自分の使い方がなにか間違ってるのかなー
参考にしたページ
バグの再現手順を共有するのに GIF がとても便利。
仕事でバグとかの再現手順や操作手順を共有するのに GIF を使うのが流行りつつある。 *1
もちろん動画でもいいのだがちょっとした手順なら GIF のほうがずっと手軽で便利と感じることが多い。
たとえばこんな感じ
CUI でも便利だけど GUI のバグ再現手順とかを共有するときに本当に便利さがある。
GIF の作り方
仕事では Mac を使ってるので GIPHY Capture というアプリを使っている。 直感的に使えて説明書いらずなうえに GIF のサイズが大きくなってくると「これは MP4 で出力したほうがサイズ小さくなるよー」とか教えてくれたりする親切機能付き。
以上、バグの再現手順を共有するのに GIF がとても便利という話。
*1:気がする