暮らしの技術

暮らしを豊かにする技術や、特に暮らしを豊かにしない技術があります

mackerel でギガを監視する

ギガっていうの受け入れちゃったね*1

こうなります。検証のために追加クーポン(200円)を買いました、これって経費で落とせますか?

数年前 IIJmio に乗り換え、以来便利に使っているのだけれど、最近は気がつくと月のデータ通信量を使い切って破滅、と言ったことが増えてきた*2

それほど困っているわけではないが、一体いつ使い切ったのか調べようとすると、公式のアプリでは5日ほどしか遡れず、また1日単位でしか確認ができないのでよくわからない。

調べてみると API があるとのことなので、mackerel にサービスメトリックとして投稿することで可視化してみた。

IIJmioクーポンスイッチAPI | クーポンについて | IIJmio

これをみながら実装する。

認証周りをエイヤし、`/mobile/d/v2/coupon/` API を叩くとのようなレスポンスを得られる*3

{
  "returnCode": "OK",
  "couponInfo": [
    {
      "hddServiceCode": "XXXXXX",
      "coupon": [
        {
          "volume": 0,
          "expire": "202209",
          "type": "bundle"
        },
        {
          "volume": 4000,
          "expire": "202210",
          "type": "bundle"
        },
        {
          "volume": 0,
          "expire": "202209",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202210",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202211",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202212",
          "type": "topup"
        }
      ],
      "hdoInfo": [
        {
          "couponUse": true,
          "coupon": [
            {
              "volume": 0,
              "expire": null,
              "type": "sim"
            }
          ],
          "hdoServiceCode": "XXXX",
          "sms": true,
          "number": "090XXXXXXXX",
          "regulation": false,
          "iccid": "XXXXXXXXXXXXXXXX",
          "voice": true
        }
      ],
      "plan": null
    }
  ]
}

あとは好きな方法で mackerel に投稿できるフォーマットへ変換する。以下のようなコードを書いた。

const input = require("fs").readFileSync(process.stdin.fd, "utf8");

const couponResponse = JSON.parse(input)
const targetServiceCode = 'XXXXXXXX'
const coupon = couponResponse.couponInfo.find(e => e.hddServiceCode === targetServiceCode).coupon
const body = coupon.map(c => {return {'name': `iijmio.${targetServiceCode}.${c.type}-${c.expire}`, "time": Math.floor(Number(new Date())/1000), 'value': c.volume}})
console.log(JSON.stringify(body))

最終的に、 `curl IIJmio APIリクエスト` | node format.js | `curl mackerel サービスメトリック投稿` と言った風にパイプをつなげた shell script を cron で実行すれば終わり。

ここまでできれば、最初の画像のようなグラフが自動で生成されます。

さらに mackerel の機能を使うことで、例えば過剰に使っている時にアラートを出すなども簡単に実現できますね。

それでは皆様、よき監視ライフを!

*1:実際ギガって呼ぶのに慣れちゃうといちいちデータ通信量って呼ぶのだるいよね。ということでデータ通信量の話です。

*2:時代が変わったのか私のスタイルが変わったのか

*3:ドキュメント通り

CO2 監視復活させた

去年の秋ぐらいに raspberry pi が不調になり、そのタイミングから自室のco2モニタリングが動かなくなっていた。

当初いくつか試したところハードウェアのトラブルが疑わしいように感じた。ので、新しく CO2mini を購入し直すことにしたがメーカー欠品ということでこの春まで手に入らなかった*1

時は流れ、春先に新品が届いたのだがAmazonの袋に入った状態で半年ほど寝かしていたところ、昨晩急にやる気が発生したのでやっと開封した。こういうやる気任せなのがダメなんだよな、多分、わかっちゃいるんだけど、、、。

で、新しいデバイスでもやっぱり動かない。これはソフトが怪しいということで既存の Python モジュールで動かしてみると普通に値が読み取れる。

どうやら自作のソフトがダメだったっぽい。不思議なこともある*2新しいハードウェアでは暗号化が解かれているらしいけど、当時はハードも変えてないわけだし。

ともかくハードの問題じゃなさそうだし、もし新しいハードが非暗号化版だとすると逆に古いコードは動かないことがわかったので https://github.com/heinemml/CO2Meter/ で mackerel の拡張を作り直した。

udev ルールは上記のリポジトリの README をそのまま利用させてもらった。作り直した拡張は以下の通り。

実行時は以下のような形で co2mini の置き場所とデバイスがマウントされているパスを指定する。

./mackerel-plugin-co2mini --local bed-side --path /dev/co2mini0

*1:新型コロナウィルスの流行に伴い、店舗等での換気レベルの確認用途でかなりの需要が発生したのだと思われる

*2:golang で書いたので実行ファイルはバイナリで、再ビルド等はしてないので壊れる余地がほとんどない

GitHub Actions で Google App Engine Project の自動デプロイを構成する

サービスアカウントのロール付与で試行錯誤が必要だったのでメモです。ロールで権限付与していくならこれが一番コンパクトだと思う。

  1. ServiceAccount の作成
    1. サービスアカウントへのロール設定
      • App Enging デプロイ担当者 or App Engine サービス管理者
        • デプロイだけする場合はプロイ担当者、トラフィックの切り替えまで行う場合はサービス管理者を付与する
      • Cloud Build サービスアカウント *1
    2. デプロイに使われるCloud Storageバケットへの権限設定
      • <project_id>.staging.appspot.com のストレージのオブジェクト管理者として 1. で作成した ServiceAccount を設定する
  2. .github/workflows/actions.yml の定義

*1:1年ぐらい前に go のプロジェクトで同じことやったときは不要だった気がする、今回は node だから使ってるのかな?

アジャイルレトロスペクティブズ 強いチームを育てる「ふりかえり」の手引き を読んだ

読んだ。社会人になって5年ぐらい、大体のチームでふりかえりはやってきたけど、ちゃんと勉強したこと無いことに気がついて正月ぐらいからちまちま読んでいた。

ふりかえりの効果について整理できたことや、ファシリテータの役割や進行時の注意点について学べたこと、イテレーションごとのふりかえりとプロジェクトのふりかえりの違い、みたいなのを確認できてよかった。

また、3章にあった「あなたの管理」っていう節はいいこと書いてあったので定期的に読みたい。

それ以降はアクティビティカタログみたいな感じで、ふりかえりのフェーズごとにアクティビティが紹介されている。ここはやってみたいとわからないことが多そうだったのであんまり理解できなかった。

付録のCにこの本で紹介されているアクティビティを俯瞰できる表があるので、ここをみながら気になるアクティビティについて読んで見る、ぐらいの距離感が良さそう。


ところでこの本は読むにあたってなぜかめちゃくちゃ目が滑って大変だった。文章と僕の相性の他、過去の失敗したふりかえりや計画が思い出されて意識を奪われる感じ。

そこで Scrapbox でガツガツメモを取りながら読むというアプローチをとった。

f:id:side_tana:20200217095803p:plain
様子


章を進むごとにページを作り、メモを取りながら読み進めて、最後にメモのまとめを上記の様にまとめて終わり、というスタイル。4章以降はカタログっぽかったのでやめたけど、メモを取りながら読むのはハイカロリーな反面、うまく頭に入らない内容でも読み進めることができてよかった。