Protocol Buffers の oneof をリストする (+テンプレートで) プラグイン作った

Protocol Bufferにて、あるoneofフィールドについてケースごとに処理の振り分けをしたいことがあった。 これ、いくら探しても簡単にできるいい方法が見つからず (探し方が悪いのかもしれない)、結局簡単なプラグインを作った。

別のプログラムのサブプログラムとして作ったんだけど、他にPythonとかでさっと使える簡単な例も見つからず、微妙に苦労したので一応 protobuf-oneof-listing-plugin としてその部分だけGithubで公開しておくことにした。

簡単な実装例程度のソースなので読めば必要なさそうだけど、軽くソース抜粋して作り方をメモしておく。

まずprotobufライブラリをインストールしておく。

$ pip install protobuf

環境によっては--userなどをつける必要がある。あとレポジトリ内のやつはテンプレートによる生成のためもうちょっと色々インストール必要。

protobufのpluginをインポートする。

from google.protobuf.compiler import plugin_pb2 as plugin

リクエストはstdinから来るようなので、それを読み取って CodeGeneratorRequest としてパースする。

import sys

data = sys.stdin.buffer.read()
request = plugin.CodeGeneratorRequest()
request.ParseFromString(data)

入力されたファイルはパースされた状態でrequest.proto_fileに入っている。配列になっていて、複数個ファイルの場合もあるので注意。

リクエストパラメータ (protoc実行時に--hoge_out=XXXXX:./out/とするときのXXXXXの部分) は request.parameter に入っている。この部分はパースとかされず : の前そのままの文字列。

生成結果は同様に CodeGeneratorResponse として生成して、stdout。

response = plugin.CodeGeneratorResponse()

# ... responseに生成結果を色々書き込む ...

output = response.SerializeToString()
sys.stdout.buffer.write(output)

このresponseにはfileフィールドがあり、そこにaddしていくことで結果となるファイルの生成ができる。

f = response.file.add() # f の型は response.File
f.name = "test-output-file.txt"
f.content = "Generation result"

エラーが起こった場合は error フィールドに書く。

response.error = "エラーです"

今回作ったプラグインの主目的であるoneofの場合の処理などは protobuf-oneof-listing-plugin レポジトリ にある protoc_oneof_listing_plugin.py が参考になるかもしれない。

その他 CodeGeneratorResponseCodeGeneratorRequest のフィールドなどは Google の plugin.proto などを参考に頑張る。

実行は基本的には protoc に実行ファイル名を与えるだけ。プラグインの例えばファイル名が test_plugin.py だったら

$ protoc test.proto --plugin="protoc-gen-test=./test_plugin.py" \
    --test_out=templates=hoge:./out/

といった感じ。

参考文献

[ZFS] 自宅サーバーのRAID-Zのハードディスクリプレースのメモ

// どうでもいいけど自宅サーバーって響きが既に年季を感じる時代になってしまいました。

宅サバのZpool (ZFS) にあるHDDからずっと異音がしてるのでリプレースすることにした。 何度かやってるけど、そのたびに調べ直すことになって結構面倒なので、その時のメモを残す。

(以下はzpoolのPool1にある、DiskId11をDiskId22に交換する場合のコマンド例)

ディスク除去まで

今回は交換先ドライブがまだないので、まずディスクをoffline。

(既に手元にあって、マシンに接続されている場合はスキップしてbadblock後いきなりreplaceでok)

# zpool offline Pool1 DiskId11

状態確認

# zpool status
  pool: Pool1
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
    Sufficient replicas exist for the pool to continue functioning in a
    degraded state.
action: Online the device using 'zpool online' or replace the device with
    'zpool replace'.
  scan: resilvered NNNK in N days NN:NN:NN with 0 errors on NN NN:NN:NN NNNN
config:

    NAME                                          STATE     READ WRITE CKSUM
    Pool1                                         DEGRADED     0     0     0
      raidz2-0                                    DEGRADED     0     0     0
        ata-XXXXXXXXXXX-XXXXXX_DiskIdAA           ONLINE       0     0     0
        ata-XXXXXXXXXXX-XXXXXX_DiskId11           OFFLINE      0     0     0
        ata-XXXXXXXXXXX-XXXXXX_DiskIdCC           ONLINE       0     0     0
        ata-XXXXXXXXXXX-XXXXXX_DiskIdDD           ONLINE       0     0     0
    logs    
      nvme-XXXXXXXXXX-XXXXXX_XXXXXXXXXXXX-part5   ONLINE       0     0     0
    cache
      nvme-XXXXXXXXXX-XXXXXX_XXXXXXXXXXXX-part6   ONLINE       0     0     0

必要であればIDからデバイスファイル名を確認

# ls -lah /dev/disk/by-id/*DiskId11*

デバイスの停止

# echo 1 > /sys/block/sdX/device/delete

ディスク停止の確認

# dmesg
[日  5月 23 08:59:09 2021] sd X:X:0:0: [sdX] Synchronizing SCSI cache
[日  5月 23 08:59:09 2021] sd X:X:0:0: [sdX] Stopping disk
[日  5月 23 08:59:10 2021] ataX.XX: disabled

RMA

SeagateのディスクだったのでSeagateのサイトからRMA申請。(微妙に分かりづらい場所に申請フォームがあったりするのは嫌がらせだろうか)

Seagate ST3000DM001 の RMA 制度でクロネコヤマトの「宅急便コンパクト」で送ってみた - What I Know ~ワッタイナ」あたりを参考にさせていただいて、ヤマトの宅配便コンパクトで送った。

ディスク追加

今回はマシンをoffにしてHDD追加作業したけど、onのまま刺したりしても認識されたと思う。(M/Bとかによるはず)

作業後マシン起動して、追加されたディスクの確認。

一応smartctlやhdparmなどでシリアル番号を見て、追加したディスクのラベルと一致するデバイスを探して確認。

# smartctl -a /dev/sdY
smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.4.109-gentoo-x86_64] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate IronWolf
Device Model:     XXXXXXXXXXX-XXXXXX
Serial Number:    DiskId22
...

念の為、パーティションテーブルが空っぽいことを確認 (ディスクによってはWindows用にフォーマット済みのpartが一つあったりするかも)

# gdisk -l /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
GPT fdisk (gdisk) version 1.0.6.1

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.
Disk /dev/disk/by-id/ata-XXXXXXXX-XXXXXX_DiskId22: NNNNNNNN sectors, N.N TiB
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is NNNNNNNN
Partitions will be aligned on 2048-sector boundaries
Total free space is NNNNNNNN sectors (N.N TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

ディスク検査

注意: 以下実行するとディスクにかかれていたデータは消えます

とりあえず毎回badblocksフルで実施している (時間かかるのでscreenやtmux上で)。 大容量ディスクの場合そのままやると以下のようなエラーが出る

# badblocks -wsv /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
badblocks: Value too large for defined data type invalid end block (NNNNNNNN): must be 32-bit value

なので、ブロックサイズを確認・指定して実行する。

ブロックサイズ確認

# blockdev --getbsz /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
4096

ブロックサイズ指定してbadblocks。

badblocks -wsv -b 4096 /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22

(ここでかなり時間かかる。1TBごとに半日ぐらいかな)

Zpoolのディスクreplace

badblocks完了後、zpoolに追加するまえに一応再確認。

# gdisk -l /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
GPT fdisk (gdisk) version 1.0.6.1

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.
Disk /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22: NNNNNNNN sectors, N.N TiB
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 64A78E1B-26D3-4E32-940C-2693C69A9A10
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is NNNNNNNN
Partitions will be aligned on 2048-sector boundaries
Total free space is NNNNNNNN sectors (N.N TiB)

Number  Start (sector)    End (sector)  Size       Code  Name

zpool replaceを実行してresilver開始。

# zpool replace Pool1 ata-XXXXXXXX-XXXXXXXX_DiskId11 /dev/disk/by-id/ata-XXXXXXXX-XXXXXXXX_DiskId22
# zpool status Pool1
  pool: Pool1
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
    continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since NN NN:NN:NN NNNN
    NN.NG scanned at N.NNG/s, NNNM issued at NN.NM/s, N.NT total
    0B resilvered, 0.00% done, N days NN:NN:NN to go
config:

    NAME                                          STATE     READ WRITE CKSUM
    Pool1                                         DEGRADED     0     0     0
      raidz2-0                                    DEGRADED     0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdAA           ONLINE       0     0     0
        replacing-1                               DEGRADED     0     0     0
          ata-XXXXXXXXX-XXXXXXXX_DiskId11         OFFLINE      0     0     0
          ata-XXXXXXXXX-XXXXXXXX_DiskId22         ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdCC           ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdDD           ONLINE       0     0     0
    logs    
      nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part5    ONLINE       0     0     0
    cache
      nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part6    ONLINE       0     0     0

errors: No known data errors

しばらくしてresilverが完了したことを確認してDone。

# zpool status Pool1
  pool: Pool1
 state: ONLINE
  scan: resilvered N.NNT in N days NN:NN:NN with 0 errors on NN NN:NN:NN NNNN
config:

    NAME                                          STATE     READ WRITE CKSUM
    Pool1                                         ONLINE       0     0     0
      raidz2-0                                    ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdAA           ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskId22           ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdCC           ONLINE       0     0     0
        ata-XXXXXXXXX-XXXXXXXX_DiskIdDD           ONLINE       0     0     0
    logs    
      nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part5    ONLINE       0     0     0
    cache
      nvme-WDS100T2X0C-XXXXXXXX_XXXXXXXX-part6    ONLINE       0     0     0

errors: No known data errors

昔にこういうのでデータ飛ばしたことは数え切れないほどあるので、この手の作業は毎回ヒヤヒヤする。

とはいえZFSは全体的に安全に使えるように考慮されている感じがあって、安心感はある。

自分でバイク (CBR250R) のメーターの修理してみたよ

CBR250RはメータのバックライトLEDがやたら壊れやすいらしく、ウチのやつも数年前ぐらいに たまにチカチカするようになり、最近ほとんどつかなくなってしまった。

タコメーターはまぁいいかというか感じだが、速度表示は夜にちょっと困る。 というか捕まる。(らしい。バイク屋さん談)

これ、交換になると何万円かは掛かるらしい。

貧乏性なのでLEDごときで・・・と思ってしまったため自分で修理しました。

// という事を参考メモとして書いておこうとずっと思いながら半年放置してしまった。ようやく書いた。

LEDの用意

LEDは秋月電子に売っていた 高輝度白色チップLED OSW5DLS1C1A を使った。

偉大なる先駆者たち (参考参照) がこれ使ってたから。

LED装着面まで解体

まずは表面から見えるボルトを外してメーター部分をバイク本体から外す。 裏のケーブルさえ気をつければそんなに難しくない。

次にメーター裏から見える三盆のネジを取り外して、カバーからメーター本体を取り外す。

裏側から8本のネジを外す。 一箇所Warrantyがどうのこうのって書いてあるが、もはやWarrantyもクソもないので気にせず除去。

全て外すと、メーター部・基板から、カバーが取れます。

タコメーターの針を外す。

正しいやり方はわからんのですが、僕はペンチで掴んでメリッと外しました。結構硬かった。

あとは、基板側のツメを外せるよように真っ直ぐにする。これもペンチでやった。

↑これを↓

こうする。(戻すときは逆)

こういう止めかたって初めてみたが、自動車関連では一般的なんだろうか。

残りは液晶の部分のた端子がつながってるので、その部分を折らないように引き離す。 この端子は多分刺さっているだけなので、まっすぐ引き離せば素直に離れる。 剥がすときに、表示切り替えとかのボタン部分のパーツが外れるので注意。

(ちなみにこのボタンの部分、戻すときの取り付け方を間違え手戻りしたりして苦労したので、 初めのうちからどうついていたかよく確認しておいたほうがいい)

剥がした後。赤い部分が端子

ここまでしてようやくLED部分にたどりつく。

(どうせすぐ壊れるならもう少しアクセスしやすい作りにしてくれてもいいのに・・・ととか思ってしまう。)

回路の状態確認と付け替え

ここから先は電子工作的な領域です。

まずは、壊れているのがLEDだけか?というのをある確認。

本体の配線に、分解した基板部分だけ接続して、通電してみる。

下にある4つが速度計のLED。N灯とかはついてますが、ここは見事に消灯してる。

消えているLEDの端子電圧をそれぞれ測り、ついでに極性も見ておく。とりあえず今回は4つとも電圧があったので、回路自体は多分大丈夫なんでしょう。 ここで電圧が来てなかったりすると、結局付け替えても治らず、という悲しいことが起こります。 (実際どの程度あり得るのかはわかりませんが・・・)

電圧が来てることまで分かったので、あとは頑張って付け替える。

うちにはハンダごてが一本しか無いので、挟んで外す、みたいな上品なことは出来ません。

破壊上等って感じで壊れたLEDごと溶かす勢いで焼いた上で、半田吸収線を併用して外しました。 (良い子は真似しないでね)

LED側はどうでもいいけど、基板側でショートした状態にならないようには注意したほうが良いとは思う。

後は秋月で手配したLEDをハンダ付ける。 そして再度基板のみ本体とコネクタをつないで、動作確認。

今回は面倒なのでメーターの方は交換せず。 面倒と言うか、わざわざ危険を犯してまで光らせなくてもいいかな、という感じ。

あとは分解した逆の手順で戻していくだけ。 先述したボタンの付け方以外では特に苦労すること無くできた。

その他

作業中にバイク内に蜂の巣を発見した。ずっと一緒にツーリングしてたのかな・・・。

偉大なる先駆者たち (参考文献)

10期目のスナガラボ株式会社です

10期目です。まだやってます。以下、なんて事はない近況です。

  • さっさと木更津に移住してたおかげで、大流行のコロナはなんだかんだ弊社(我が家)には影響ほとんどなし。
    • 仕事内容的にも影響しないし、もともと都内に行きたくなくて打ち合わせ極力避けていたし。ていうか引きこもり。
    • 今までよく行ってた旅行だけど、子供がまだ小さいからコロナ関係なくそもそも行けてなかった。まぁそろそろ行きたいけど。
    • 都内ではけっこう保育園が閉鎖とかしてらしいけど、木更津はフツーにやってた。
  • みんな早く木更津に移住すればいいのに

うみほたる

  • 会長が無事に人間らしくなってきました。

買い物に行く会長

  • 子供生まれてからもずっと車中心の生活。都心で車なしで子育てとかもう考えられないわって状態になってます。
    • おかげで早くから子供は車に慣れました。よく寝ます。
    • そしてコロナでよりいっそ車が必需品になってしまった。

車に乗る会長

  • ここ最近はよくRustとかElixirとかさわってました。あとちょっと前にESP32とかで家中センサ作ったり、車のコンパネ改造したり。
  • 仕事の幅はあんまり広がらないね。ずっと開発(と投資)。別に広げようともしてないけど。
    • コロナの影響で持ってる株式とか投信が一時期かなりやばかったけど、生活に関わるモノを重点的に買ってたおかげで既に持ち直しました。
  • 東京オリンピックに合わせて日本脱出する予定だったんだけど、コロナのおかげで無理そうです。
    • というかオリンピック自体が無くなったので脱出する必要も無くなった。
    • 来年かな。オリンピック無くてもちょっと脱出したいね。
    • それに備えて子供のパスポート取ってたんだけど、もう写真がゼロ歳児だからおもちゃみたいでかわいくて面白い。大公開したいぐらい。

0歳児のパスポート

  • 去年の台風もうちは奇跡的に無傷だったけど、今年は一応なんか対策しときたい。(何すんだろう)
    • とはいえなんかもう、全員が無事であれば後はどうでも良いかなっていう感じもする。

台風で崩れた太田山。だいぶ木が伐採された。

  • チャチャンは今日も元気にドロボウネコです。

覗きチャチャン

  • だいぶ久々にブログかいた。ずっとサボり気味。いけませんいけません。

今後ともよろしくお願いいたします。

Let's Note RZ6をUSB-PD (USB-C) 充電対応するアダプタ作った

Let's Note RZにUSB PD充電できるようにするアダプタを作った。

そもそもなんでわざわざという感じだが、「なるべく小さめのPC」でかつ「かな打ちが苦なくできるPC」となると RZシリーズぐらいしかない。GPDとかYogaとか色々と経由したが、どれもキーボードがキツイ。 今のところはここに落ち着いてます。最新のやつ買うと高いので、中古の型落ち。

で、これ、全体的にまぁまぁ良くて、ベゼルだのキーボードだのは我慢できるレベルだが、 僕にとって最大の難点がUSB-PD充電に対応していないこと。純正の16V充電器での充電にしか対応していない。

小さいのはいいのだが、これがないと充電できないのはちょっと不満。うちは家のあちこちにUSB PDのポートがあるので、 それが使えるし、車とかモバイルバッテリとかからも充電できるようにしたい。 そして旅行時にも余計なACアダプタは持って行きたくない。

ということで方法は無いか調べたところ、既に先行している方が居た。

USB-PD トリガーデバイスによる15V出力とノートPCの充電 (by 塩田紳二氏)

よしこれだ、と思ってZYPDSというトリガーデバイスを探したのだが、AliExpressにしか無く、上記記事に有るように時間も掛かる。 ちょっと代用物がないかとAmazonを探していたら、良さそうなものを見つけた。

Microsoft Surface PD 急速充電電源ケーブル TYPE-C/USB-C アダプタ

調べた所、Surface Proは15Vを使うらしい。上記ケーブルの説明にも15V 45W以上と書いてある。これはきっと中にトリガーデバイスが有るに違いない。 容量的にも十分そうだ。

さっきの記事のトリガーデバイスよりちょっと高い (送料入れればトントンぐらい?) けど、ケーブル部分付きなのでその部分の工作が必要ない。

早速購入して分解した。

!!! 毎度ですが、危険なので良い子は真似しないでね。!!!

構造を調べるため、Surfaceケーブル側をマイナスドライバーとかで慎重に剥がして中身を出す。結構複雑だった。 これでこのSurfaceコネクタ側の基板にトリガーデバイスがあると、そっから電源を取らなければいけないので結構キツイ。

とはいえ、既に左側に赤黒ケーブルが見えている。 USB-C側をつないだままここの部分を電圧をはかってみると、15Vだった。よし。

千石電商でコネクタ部分を買う。買ったのは 「マル信無線電機 MP-122C DCプラグφ2.5(8角)」です。

これでコネクタの芯部と赤いケーブル、外部と黒いケーブルがつながるように接続する。

一旦この状態のまま充電できるか、また充電速度の差がどれぐらいかどうか確認する。

上記塩田氏の記事には15Vでも充電できるとあったが、一応長めの時間充電してみて、純正のアダプタと比較した。

充電速度の比較

上記画像はGnomeの充電モニタを適当に加工しました。上が純正、下が今回のやつの線です。10%のところで揃えてます。

目測ですが、10%の時点から一時間後で、純正だと77%、USB-PDだと74%ぐらい、という感じかな。気持ち遅いかな、ぐらい。 細かく調べては居ないけど、あまり差は無さそう。問題ないでしょう。(バッテリに与えるダメージとかはよくわからない)

そしてコネクタのカバーをするのだが、ショートしたりすると良くないので、セメダイン詰め込んでから完全密封した。

これで完成。

この後色々試したのですが、やはり相性は厳しめかもしれない。 どーもケーブルによっても使えなかったりしそう。 うちだと充電OnlyのケーブルだとOKなのに、Cable MatterのThunderbolt3対応ケーブルだとダメだった。逆なら分かるけど意外。

ちなみに車につけてあったシガーソケットのUSB PD充電器でも使えた。 シガーソケット側は MAXWIN QC3.0 PD 充電 カーチャージャー ってやつ使ってる。 もう売ってないみたいだけど、多分45W以上あれば大丈夫かと。

モバイルバッテリは45W以上のやつがないのでまだ試せてないです。いつかきっと買うのでそのときに試そう。

とりあえず、ある程度使えるものが出来たので満足。

ベビーサークルを作ったよ

アルミフレームで作った。子供が怪我してはいかんので結構真面目に荷重の計算した。 ニュートンっていう単位を初めて真面目に使ったかも知れない。

既成品も色々有るけど、色々な制約と部屋のサイズ感にあういい感じの安いサークルが無かったので、自作してみました。

// いやよく探せばあったかも知れない。作りたかっただけかも知れない。

G-Funってやつ使いました。これ簡単に作れていいね。 子供が成長したら大きくできるし、要らなくなったら組み替えて違うもの作れる。

クッションは床用の緩衝マットを大きめの結束バンドと養生テープでとめました。 結束バンドは切り方雑だとさわって怪我する (というか怪我した。製作中に。) ので、しっかり奥で切ります。爪切りで切るとイイよ!

結束バンドは結構重さ耐えられるみたいです。(確か小さいやつ一つで8kgfって書いてあった)

危険がいっぱいだぜ★

台風が来たせいで消費電流メーターを作ることに

三行でまとめると:

  • アンペアが足りない。
  • 台風15号が来た。
  • 電流メーターを自作した。 (良い子は真似しないでね)

夏の我が家の電力不足

もともと電気は沢山使う傾向があったが、子供が出来てからさらに色々と家電が追加されいよいよ30Aでは足りなくなり、 しょっちゅうブレーカーを落とすことになっていた。

常時起動のサーバー、エアコン×2、洗濯乾燥機、食洗機、除湿機あたりが比較的多くの時間帯で電気を食い、 それらが動いているときに更にヘビーな電気ポットやコーヒーメーカー、ドライヤーなどが入るとアウトな感じ。とくに灼熱の日とかはキツイ。

で、先々月(台風15号の前)にさすがに契約アンペア数上げよう、ということにした。 しかし(建物が古いせいで?)うちに入っている電気が単相2線式で、東京電力持ち分含めて結構大掛かりな工事が必要だということになった。 その上にどうも電気屋さんが混んで忙しいらしく、なかなか時間がかかるらしい。

少し待って9月になり、なんとかとりあえず調査に来てくれて、屋内配線の調査などして東京電力に申請してもらい、ようやく二週間後ぐらいに工事が始まる?、という所まできた。

台風襲来

がしかし、ここで台風15号の直撃である。

幸いうちは停電しなかったが、うちの周りは停電だらけ。うちの周りだけではなく(ご存知の通り)停電が千葉県中で置きていて大変なことになった。 もちろん東京電力もフル稼働なんだろうが、それでも足りないようで日本中から電力会社の応援やら自衛隊の災害派遣やらが来ていた。 おそらく木更津中の電気屋さんも色々な対応に駆り出されていたに違いない。

そして電気屋さんからの音沙汰はなくなったのであった・・・。

(まぁ状況が状況なのでこちらからも特に催促もしてないけどね)

自給自足

多少アンペア足りないぐらいでピーピー騒ぐなという感じですね。死者が出る程の危険な状況での大停電だし。

こういうときは自分でなんとかするしかない。

とはいっても自前で電気を作るのはムリ。金がかかりすぎる。ムダも多くなるし。

そして考えたのは、電気は増やせなくても、家全体の消費電流メーターがあれば目安がわかるので、ブレーカー落ちは防げそう、という事。

今まではこの辺をカンに頼っていたり漫然と使ってたりしていたけど、警告してくれるものがあれば自分たちで家電の利用時間を調整できるので大分よくなりそう。

どんなものを作ろうか

  • 家全体の電流値と、ついでにサーバー関連の消費電流を計測する。
  • クランプセンサーを使って作る。家の回路側は一切改造しないようにする。(賃貸だし、そもそも危険)
  • 家全体の電流がどれぐらい消費されているかが大体わかる表示をする。
  • 特に30Aに近づいたらわかりやすく警告されるように。
  • スマホとかで具体的な値も確認できるといい。

今回はArduinoを使用してつくった。食わず嫌いしていたのですが、これめっちゃ楽で良いね。

!!注意!!

以下では比較的危険なことをやっていて、怪我や死亡事故につながる可能性があるため十分注意すること。

真似したり参考にしたりした場合ももちろん僕は責任を一切責任を負いません。

使ったパーツ

  • ESP WROOM 02の開発ボード
    • Arduinoが使えて、Wifiも使えるボード。Wifiでデータ送信とかしてスマホとかPCと連携できる。
    • 今回はSwitch ScienceのESP-WROOM-02開発ボードを使用しました。
    • 秋月電子やその他の開発ボードだったり、自前で同等の回路を作ったりしても良さそう
  • 秋月電子のADS1015モジュール
  • CTセンサー SR-3702-150N
  • 100Ωの抵抗 × 4
  • 180Ωの抵抗 × 4
    • LED用抵抗, 1/6Wのカーボンとかで十分。精度不要。
  • 2.7kΩの抵抗 × 2
    • 電位調整用の抵抗。カーボン抵抗使っちゃったけど、精度高いほうが良かったかも。
  • セラミック キャパシタ 0.1μF
    • IC電源の安定化用、多分無くてもいい
  • セラミック キャパシタ 10μF
    • 計測の基準電位の安定化用。今回の場合あったほうが計測値は安定した。パーツ配置によっては良いかも知れないし、 別容量のが良いかも知れない。
  • 警告表示用のLED × 4
    • 5〜10mAぐらいで使えるやつ。赤・黄・緑・青の4つ使ってカラフルにしました
  • 適当なユニバーサル基板、ハンダ、線材
  • 必要であれば適当な(2接点以上の)コネクタのオス+メス etc.

試作

とりあえず試しにブレッドボード上で試作してみました。

ブレッドボードでの試作

基本的にはESPボードにADCのADS1015をI2Cでつないで、 そのADCに(抵抗とか入れつつ)クランプをつなぐという感じです。

ついでにブレーカーの方も。

(注意) これオープンしたり内部に触ったりするのは大変危険ですのでご注意ください。っていうかおやめくださいってブレーカーの蓋に書いてあったよ!

こんな感じに計測したい回路の部分にクランプすればOK。家全体の電流と、一つの子系統 (サーバーマシンなどがつながっている系統) の電流を計測するようにしました。上図ではデバッグのために家全体計測のクランプが2つつながっています。

うちは単相2線だったからどこからとっても良かったけど、単相3線の場合はどうすればいいんですかね。。。

先行例を参考に実装したのですが、安定してきれいな波形を出した上で 正しく計測できるようになるまでは結構色々と試行錯誤しました。とりあえず引っかかったポイントだけ書くと

  • ADS1015やADS1115でGNDからの負電位を計測しようとしている記事も有る (参考 [5], [6]) が、それは正しくない。 (GNDに対して)負電圧が計測できる、と誤認されているのかもしれないが、そうではなくて差分計測においてその基準電圧 (A1やA3に入れた電圧) に対しての 負電位が計測できる、という話である。
    • そもそも ADS1015のデータシート によると、AINxに印加していい電圧はGND-0.3Vまでで、それ以下の電圧を掛けるとぶっ壊れるカモ、と書いてある。 (ADS1115も同様)
    • したがって、CTセンサーの基準電位はGNDではなくて、適当な電圧を掛ける必要がある。
    • それか整流して正電位だけ計測して計算するとか? (マイコン側で負圧を無視する、というのはNG)
    • 僕も最初は負電位計測できると思ってたんですが (そしてある程度まで結構正しく計測できる)、 高負荷かけた状態だと波形がかなり乱れたり-2048 (最低数値)固定になっちゃったりして安定しません。
    • 低負荷だったら-0.3Vに収まるので計測できる、とかいう話かもね
  • Single EndedよりもDifferential Inputを使ったほうが精度が1ビット増えるので良い。ただし最大3入力しか使えなくなる。
    • 今回はとりあえず2入力使えればよかったので差分計測にした。
    • 逆に4入力使用する場合は、Single Endedにしてオフセットをプログラムで計算する必要が有る。
  • 回路構成にも依るが、結構激しくノイズが乗っていたようだったので、色々と試した上でCTセンサーの基準電位とGNDに10μFのキャパシタ噛ませたら比較的波形がきれいになった。
    • もしかしたら安定したのではなくて単になめただけかも知れない。(=値が正確になったわけではないのかも)
  • 波形はArduinoのシリアルプロッタ使って見てました。Arduino便利。

シリアルプロッタによる波形

  • サンプリングはADS1015側は3300SPSに設定し、ESP側で概ね全サンプル取れるように調整した。
  • サンプル値から電流値の計算方法は二乗平均平方根でよさそう。
  • 東京の商用電流は50Hzなので、サンプル長は20msの倍数になるようにするとよさげ。そうすればサンプル開始時の位相とかあまり気にしなくていい
    • 今回は12周期 (240ms) にした。
  • 電流値が正しいかどうかは、家にあった別のクランプメーターを使用して見てました。ただこれも古かったり安物だったりして精度がよくわからないから、どの程度正しいのか分からない。
    • だいたいこのクランプメーターと8%誤差ぐらいにまでは出来た。どっちがどうずれているのかは不明。

試作機と、クランプメーターによる同時計測

最終的に作った回路

回路図的なものを書いてみました。

回路図

  • 中央のESPとADCはI2Cで接続する。 I2Cの信号線はプルアップが必要なので、AE-ADS1015のI2Cプルアップジャンパをショートさせるか、プルアップ抵抗を追加する必要がある。

  • 左側の4つのLEDで消費電流状態を表示するようにESPの適当なIOピンに接続する。 ESP8266のIOピンは12mAまで流せるようなので、それ以下になるように抵抗をつける。

  • 右側ではCTセンサーとADCの各チャンネルを接続。電圧は正負にかかり、またADCの電位はGND以上にする必要が有るので、CTセンサのベース 電位が3V3とGNDの中間になるように適当な抵抗 (R5,R6) を配置した。

一応基盤の写真も貼っときます。

ちょっと基盤実装後でも色々と試行錯誤してしまったため、不要なピンヘッダがあったりとか、配線が変だったりする。

(それにしても見事な芋ハンダですね)

プログラム例

消費電力量0A〜30Aで点灯するLEDの色がかわったり点滅したりします。

(実際に使っているプログラムからコードを削ったものです)

完成!

完成したもの

100均で買ってきたアクリルケースを頑張って穴あけ加工して、その中に完成品を入れました。結構湯気とか近いのでケースが無いと不安だったので。

うちの場合は大体電気使うもの、かつON/OFFよくするものはブレーカーがある台所に有るので、きっと大体問題ない。

色んな色が光って比較的楽しいぜ。

カラフルだぜ

あとデータサーバーも適当にこしらえた上で、スマホから現在値を確認できるようにしたり、時系列データをプロットしてみたりしました。 あんま用途無いけど、とりあえず良い感じ。

消費電流をプロットしたもの

そして・・・

結構良いものが出来たと思ったのだが、結局10月になってしまい猛暑も落ち着いてしまった。

自然とブレーカーが落ちることも無くなったのであった。

めでたしめでたし。

参考

台風15号備忘録

若干今更感があるけど、忘れないうちに台風15号で身の回りにおこったことを書き留めておく。

台風当日 (9/9)

  • 深夜に風がすごく強くなった
  • 雨戸がバタバタいったり、家がミシミシいったりしていて結構うるさい。子供 (9ヶ月) がおきて大分興奮してしまって寝なかった。(泣いたりはせずで、ずっとニタニタ笑ってたけど・・・)ボロ小屋の難点ですね。
  • 家付近の道路にレンガが飛散していたり、倉庫が置いてあったりして、車が通れなさそうな箇所があった

レンガ飛散

転倒した倉庫。ギリギリ車が通れ無さそう。

  • 玄関が若干浸水していた。まぁ弱い構造の玄関だしね。。。
  • あちこち停電していた。築地や潮見も停電したため、イオンモール木更津とかクリーンセンターも停電。
    • イオンモール木更津のスーパーは営業し続けていたようである。非常電源とかあるのかな
    • コンビニも閉まっているところが多かった。
    • 16号の信号も停電。車はあちこちから来るので危なっかしい状態だった。

国道16号の交差点。車が全方位から出てくるが、16号側はそれなりの交通量で速度も出ているためヒヤヒヤする

  • 水道・ガス・インターネット (NTTの光ファjイバー) はうちでは問題なかった。
  • モバイル (docomo MVNO IIJ) はうちの近所でもインターネットができなくなっていた。電波表示は辛うじてあったので、色々な通信が輻輳して利用不能になったっぽい。SMSは利用可能だったため、家族とのやり取りはそれにした。電話は未確認。
  • ソフトバンクMVNOのb-mobileは比較的通信可能だった。
  • 最寄りのガソリンスタンドは停電で休業。そのほかのガソリンスタンドも、10日ぐらいまでは在庫切れが多くて給油できずな感じ。軽油だけは比較的あったっぽい。

停電していた16号のGS

翌日 10日

  • 食料調達に向かう。子供の離乳食とかミルクとかはヤックス文京に徒歩でいった。ついでに道路の様子を調べる。
    • すごく暑かった。。。
  • あちこち渋滞していた。特に幹線道路は酷い。
  • 国道16号の信号が停電した
    • 当初は交通量が少なかったため結構流れが早く、16号をクルマで横断するのは大変そうだった。
    • 時間が経つに連れて渋滞していったが、渋滞が袖ヶ浦方面のみで、逆方向の交通は早かったため、横断が大変そうであるのは変わらずであった。

渋滞する国道16号。停電しているため信号もついていない。

町中でもあちこちで渋滞していた

  • ガソリンスタンドには列が出来ていたが、タンクローリーが来ないようで給油できないらしい。ただし軽油はあったらしい。
    • これが原因で激しく渋滞している道路もあった

市街のほうのGS。こちらは営業はしていたものの、タンクローリーが来ないようで軽油のみの販売になっていた。

  • その後マックスバリュー太田にバイクで買い出し
    • このとき16号の信号はついていた。おそらく非常電源 (発電機?) が接続されていた。
    • 弁当やカップラーメンは無くなっていたが、生肉とか野菜・果物その他の調理すれば食べれるものは十分にあった。

11日

  • 11日はイオンモール木更津も概ね営業していた。レストラン系はほとんどやっていなかった (食材が傷んでしまった?) けど、フードコートはやっていたので食事出来た。
  • イオンモールのスーパーは長蛇の列だった。
  • 台風より前にネット通販で買ったモノが1日遅れで今日届く。こんな状況でもたった一日遅れでちゃんと届いた。というか発注タイミングが悪かった。

ネットから得た情報

  • 木更津よりも君津のほうが被害が多そう。
  • 木更津市内、中心部も含めてもかなり停電した
    • 9/10の段階で2万件以上停電していた。木更津市の世帯数が全部で六万件ほどなので、1/3ぐらいが停電したようである。
    • 9/14の段階でもところどころ停電している(5000件ほど)。人口が多そうなところでは金田近辺と、羽鳥野周辺 (羽鳥野、大久保、八幡台) は結構まだ停電している。
  • コンビニが停電して営業していないみたいなことをツイートしたら、そのコンビニに盗難が入ってしまった。
    • ニュース記事
    • 12日AM2:00ごろに、ガラスが割れていてクルマが突っ込んでいたらしい
    • 灼熱で歩きながら食料とか色々探さなければならない中、店がやっているかどうかの情報は結構死活問題なので、良かれと思ってツイートしたのですが、こういうことに情報が利用されていたとすると考えもの。

その他

  • 電気があるなしはかなり死活問題。今回の場合、数日間は灼熱だったので、うちみたいな小さい子供がいる家は特に。
  • 車もガソリンさえあればエアコンが使えて充電もできて一時的な避難所として使えるのでとてもいい。
  • とはいえ、車があったとしてもこういうときは徒歩圏内で生活できないとキツイ。(幸いうちは徒歩20分圏内にスーパーが4件 + ドラッグストアが3件あるので大丈夫だった)
  • 災害時にバイクはすごい役立つ。渋滞のすり抜けが便利と思われがちだがそうではなくて、
    • 行ったこと無い細い道でも気兼ねなく安全に通れる
    • 道に大きな障害物があっても大丈夫
    • Uターンがいつでもすぐにできるため、「あ、この道ダメだった→Uターン」みたいなトライ&エラーが気軽にできる
    • いざとなったら歩行者に変身できる
    • 駐車場が満車でも停められることが多い。(今回のマックスバリューはまさにそうだった)

大変役立った我がバイク

  • しばらくするあちこちのスーパーでサトウのご飯とかペットボトルのお茶が大量入荷されていた。
  • 太田山公園は木を切りまくったり、新しい道っぽいものが出来たりとだいぶ大規模に工事している。どうなるんだろうか。。。

太田山公園

  • チャチャンは元気だよ

チャチャン

木更津に爆誕したアクアコイン使ってみたぞ

今年三月ぐらいから試験導入していた木更津市の電子地域通貨アクアコイン (AQUACOIN) 、 今月からいよいよ本導入になったので、何はともあれとりあえず使ってみた。

登録

まずはアプリをダウンロードします。以下のリンクからいけます。


Google Play で手に入れよう

なんか現時点ではGoogle検索しても本家サイトもアプリサイトも出てこないので、とても探しづらいです。 しかも、「iOS アクアコイン」でググると中国語版のストアリンクが一番上に出てきました・・・。 僕のアカウントのせいかな・・・?それとも誰か中国語ネイティブの人が紹介ページ作ってリンクしてんのかな。

アプリ自体は使いやすいので登録すぐできると思います。 アカウント作るのがちょっと手数があって、 メールアドレス登録→メールで来るリンククリック→パスワード登録する→再度アプリ側でメールアドレスとパスワードいれる という流れでした。リンク踏むだけでは自動的にリンクされないようなので注意。

入金 (チャージ) する

ちょっとチャージに関しては僕がチャージした時点 (2018/10/1) では色々と厳しい。

公式サイトとか色々読んだんだけど、とりあえず

  • 君津信用組合の窓口で入れる (銀行口座とかは必要ないです)
  • プリペイドカードを買う
  • チャージ専用マシンでチャージする (木更津駅の木更津市観光案内所、イオンタウン木更津朝日1階)

の三つがあるらしいが、まずチャージ専用マシンは10月中旬設置らしく使えない。 プリペイドカードは存在するらしい (かつ3-4箇所で売ってるらしい) ということは書いてあるが、 どこで売っているかが書いてないから買えず (あとで君津信用組合の人に聞いたら「まだどこでも売ってない」とのこと・・・) 。

結局、君津信用組合の窓口でチャージしました。今回はお試しで5000円。

ここの窓口で「アクアコインチャージしたい」といえばやってくれます。

窓口で出された小さい紙に金額とアクアコインのアカウント番号と、 氏名電話番号、希望金額とか書いて、アプリでQRコード読んでふたたび希望額とか入れて完了します。微妙に二度手間。

ちなみにどうでもいい話なんですが、本家サイトのQ&AのQ1には「氏名・住所等の個人情報の登録は不要です。」 とあるんだけど、あっさりここで個人情報(氏名・電話番号)書かされました。チャージする手段がここしかない現時点では、これはちょっと詐欺的。 (まぁ全然これぐらい書いてもいいんだけど、だったら最初からこんなこと書かなければいいのに。。。)

この一点除けば、確かに他のサービスとして登録のために情報入れる量は比較的少ない感じはする。

しかしまぁ、色々と書いたり、わざわざ銀行に出向くのは面倒なので、やっぱりチャージ専用マシンがあちこちにないときついですね。

あとクレカとか、どこにも行かずにチャージできる手段がないとね。。。

使う

今回は木更津駅前にあるワシントンホテルのクロワッサンで昼食がてら、試してみました。

会計時には、アプリを起動→レジ付近にあるQRコードを読み込む→自分で金額打ち込む→店員に画面見せる→店員が何か操作する?、という手順。

店員さんもちゃんと方法覚えてて (たぶん開始したてすぐなので・・・) 、特に手間取ることなくスムーズに会計できました。

ちなみに店員さんに「昨日今日でアクアコイン使った人いますか?」と聞きましたけど、たぶん僕が最初です、みたいなこと言われました。 まぁ、でしょうね・・・。

ということで、無事に店内でパンをいただくことができました。めでたし。

残額はアプリ起動時に確認できます。

履歴も使用した店レベルまでは確認可能。

感じた課題

アプリインストールまでたどり着きづらい

現時点ではGoogle検索してもいい感じにサイトが出てこないので、せっかく興味持ったひとでも、けっこうな熱意がないとインストールまでたどり着かなそう。

会計しているお客さんとかちょっと観察してたんですが、レジにあるアクアコインの表示を多少興味を持って読んでいる人はいるようです。

(しかし、そのあとふつーに会計してスマホも触らず帰ってしまったので、きっと忘れ去られているだろう・・・)

チャージが絶望的に面倒

とりあえず10月中旬のチャージ専用マシンが設置されればましになるかな?

・・・とはいっても、設置予定が木更津駅とイオンタウン朝日にしかなく、それでも面倒そう。 僕は太田に住んでいて、けっこうイオンタウンいくのでまぁいいけど、 例えばほたる野とか、羽鳥野とか、あと金田に住んでる人はきっとどっちも普段行かない場所だし、相当面倒そう。

やっぱりクレカチャージができないと辛いね。 それかチャージ機がせめてそれぞれの団地に一箇所は欲しい。 (ほたる野→アピタ、羽鳥野→おどや、金田→ベイシアorアウトレット、とかね)

店舗での操作が面倒

店舗でQRコード読むだけで買えるぐらいだと便利でサイコーって感じですが、 アクアコインは「アプリ起動→読み込み画面だす→QRコードを読み込む→自分で金額打ち込む→店員に画面見せる→店員が何か操作」と、 結構手順があります。

たとえばApply PayのiDであれば、「Homeボタンダブルタップ→カード選択→タッチ」だけなので、これと比べちゃうとだいぶ面倒。 Suicaに至ってはiPhoneで触るだけ。

たぶん、このシステムは事業者側の負担 (端末の整備とか) を減らして、その分ちょっとユーザー側に負担させる、という考えなんでしょう。 その辺のトレードオフなんですかね。

でもレジ側に数万円のスマホ1台用意すれば、もうちょっと便利に仕組み作れると思うんですが、どうなんでしょう。。。 たとえば、レジと連動して動的に金額情報いれたQRコードをレジスマホに表示→ユーザーが読み込む→レジ側スマホで「支払いOK!」と出す、とかね。

あと人によってはスマホの画面人に見せるの微妙に抵抗ある人もいるんじゃないかな・・・いないかな・・・。 まぁ僕は別に無いんだけど、そういう微妙な抵抗が流行を妨げそうな感じはする。

みんな大好きイオンで使えない

自前プリカもってる、大手チェーンは厳しいのかな。イオン以外にも、セブンとか、ユニーとか。 まぁそりゃーふつに考えてやりたがらないでしょうね・・・。(すでにアクアコインが大流行してるなら別だけど)

そもそもアクアコインに地域性を強く持たせるために外してたりするのかな。 そうだとしたら利便性を下げるだけだし、むしろ逆効果なような。

返金できません

一度アクアコイン買っちゃうと現金に戻せないようです。これは結構抵抗感ある。

上に書いたようにチャージ面倒だし、いっぺんにいれちゃえー、みたいなことができないですね。

Suicaでよくね・・・

現金しか使えない店ではまぁ多少便利なんですが、Suicaとか使えるならそっちでいいじゃんという感じもします。 Apple PayにSuica登録しておけば、わざわざアプリ起動したり、QRコード読んだり、金額入れたりせずワンタッチなのでちょー楽。

もちろん、現金をたくさん入れても数百円の手数料払えば返金してもらえます。(ちょっとチャージ上限が低いけどね・・・)

まとめ

無事にスムーズに使えたものの、正直、現時点では色々とツラいです。ユーザビリティも悪いし、利用メリットもわかりづらい。

やっぱり事業者側の手数料が安いとかあるんですかね。あるいは今後ポイントとかでお得になっていったりするのでしょうか。

まぁきっと徐々に便利になっていくでしょうから、今後に期待という感じでしょうか。

8期目のスナガラボ株式会社です。(まだやってます)

8期目です。特に長くやるつもりも、でっかくするつもりもなかったんですが、 まぁ就職したくもないし、零細会社のままずっとやっています。 ジャンルでいうなら、しょぼい起業です。

もうちょっと早く、三、四年でくたばるかなと思っていたんですが、案外地を這うように生き続けています。 世の中なんとかなるものです。

なんですかね、最近も相変わらずシステム開発アプリ開発ばっかりやってるんですが、 最近の会社的ハイライトといえば、(僕ではないですが) デザイン関連の仕事をぼちぼちやったりしてます、という感じです。

Webデザインのみならず、本の表紙描いたり、店舗の内外装デザインとかをやってみたりしてます。

まぁ、そんなかんじです。 いろいろやりながら引き続きだらだらと続けてまいりますので、よろしくお願いします。