全力で怠けたい

怠けるために全力を尽くしたいブログ。

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 の Go クライアントを 作りました

作っているときは 100% 自分のために作っていたのですが、

blog.a-know.me

Pixela を開発・運営されている a-know さんから「"Pixela( https://pixe.la/ )の活用記事とかライブラリを書いてくれた方" 限定のノベルティグッズを差し上げます!」と連絡いただいたのでありがたく! いただきましたーっ!

f:id:ebc_2in2crc:20190716135833j:plain

下が通常のステッカーで上が Pixela ブリーダーズ限定のステッカーなんですが、サービス同様カッコいいデザイン♪ 缶バッジとあわせてどこに貼ろうか悩んでますw

a-know さん、ありがとうございました!

pixela-client-go が v1.1.0 にバージョンアップしました。

pixela-client-go が v1.1.0 にバージョンアップしました。

github.com

v1.1.0 アップデート内容

optionalData プロパティに対応

日付ごとの要素 Pixel の optionalData プロパティに対応しました。 optionalData プロパティ の使い方に関しては 公式ブログ にとても詳しく書かれているので参照してください。

publishOptionalData プロパティに対応

Graph の publishOptionalData プロパティに対応しました。 publishOptionalData プロパティ の使い方に関しては 公式ブログ にとても詳しく書かれているので参照してください。

現場からは以上です。

Pixela の Go クライアントを作りました

Pixela の Go クライアントを作りました。

github.com

書くこと

  • Pixela とは?
  • 使い方
  • インストール
  • 動機
  • まとめ

Pixela とは?

任意の数値を登録してアレのあれっぽくグラフを作れるクールな API サービスです。

詳しくは↓

pixe.la blog.a-know.me

使い方

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 をサポートしています。

と書いておきながら PixeloptionalData プロパティと GraphpublishOptionalData プロパティは自分が使っていないせいか今のところサポートしていません。 対応しました。

インストール

$ 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 CLI 便利。

参考ページ

put-retention-policy — AWS CLI 1.16.193 Command Reference

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

自分の使い方がなにか間違ってるのかなー

参考にしたページ

stackoverflow.com

バグの再現手順を共有するのに GIF がとても便利。

仕事でバグとかの再現手順や操作手順を共有するのに GIF を使うのが流行りつつある。 *1

もちろん動画でもいいのだがちょっとした手順なら GIF のほうがずっと手軽で便利と感じることが多い。

たとえばこんな感じ

f:id:ebc_2in2crc:20190514230642g:plain

CUI でも便利だけど GUI のバグ再現手順とかを共有するときに本当に便利さがある。

GIF の作り方

仕事では Mac を使ってるので GIPHY Capture というアプリを使っている。 直感的に使えて説明書いらずなうえに GIF のサイズが大きくなってくると「これは MP4 で出力したほうがサイズ小さくなるよー」とか教えてくれたりする親切機能付き。

以上、バグの再現手順を共有するのに GIF がとても便利という話。

*1:気がする