暮らしの技術

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

trade-static-normalizer をリリースしました

github.com

財務省貿易統計という資料が公開されておりまして、HSコードごと、年月ごとに輸出入金額やさまざまな数量を調べることができるわけです。

HSコードというのは「商品の名称及び分類についての統一システムに関する国際条約」で定められている品目ごとのコードで、例えば 綿製のTシャツであれば 6109.10.900 が割り当てられているようですが、素材やプリントの有無でも変わるようなので、もし何か輸入しようと考えておられる方は通関士の方や関税局の方とよくよくご確認をされるのが良いでしょう。

ともかく、そういった分類ごとに輸出入の統計が出ているものですから、特に輸入に頼っているような商品であれば、国内のマーケットがどの程度あるか、と言ったことを実際のデータをベースに考える材料になります。輸出は輸出で、相手国ごとのデータもあるようですから、自社で取引のない国でも実は大きなマーケットが、、、と言ったことを調べるヒントになるかもしれません。

ともかく使い出がありそうなデータなのですが、いかんせんフォーマットが計算機で処理しにくい。

ということで正規化するためのツールを作りましたのでここに公開するものであります。よかったですね。

自分が使う前提で考えられているか

ソフトウェアを開発する上で機能要件の話に終始してしまうことがあると思う。特に開発者が利用者ではない場合は悲惨だ。

ユースケースヒアリングは合意が取りやすい一方、非機能要件、とりわけ使い勝手の部分については、担当者がどのように業務を遂行しているかつぶさに観察する必要がある。その点、開発者が利用者である場合はヒアリングもインタビューも必要なく、どうすれば自分(達)が使いやすいかを考え抜けばいいから幸いである。

このような幸いな状況は作り出すことができて、つまり開発者を実際に利用者の立場にしてしまい、半年なのか一年なのか、あるいはもっと長い時間実際に業務に取り組んでもらうのが現実的なのだと思う。逆パターンももちろん可能なのだけれど、より難易度が高い気がする。

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 で書いたので実行ファイルはバイナリで、再ビルド等はしてないので壊れる余地がほとんどない