2020 在宅ワーク環境まとめ

最初に勤めた会社では「どこでもオフィス」と称して月何回かの在宅勤務制度があったし、転職した先では子どもが産まれ看護を理由にした在宅勤務を毎週1日前後やっていたので、2020 年になって強制在宅勤務になってからも、さほど不便を感じず、在宅勤務を継続できている。

環境を共有するのが流行っているようなので、流行に乗っかって書く。久しぶりにブログを書くリハビリの意味でも(そろそろ続けたいなあ)

f:id:LaclefYoshi:20201230215526j:plain  

構成

オカムラ FALTE 2 (1200x600)

http://interior.okamura.co.jp/home/falte/8cae2d.html

机が狭いとその上でできることが限られることは分かっていたので、ある程度広さがあるものから、値段などを見て決めた。

配線を隠す(電源タップを収納する)ためのスペースが机下にあるので、必要な線を出しても机の上がごちゃごちゃせず、気に入っている。

デスクマットは 600x450 の透明なものを置いているが、ここが作業スペースである、という自分へのアピールのような意味合い。ラップトップでの仕事が終わったらラップトップはデスク横の本立てに立てかけて仕舞い、デスクマット上を一度リセットすることで、頭を切り替えている。ついでにメモ挟みスペース。

椅子

オカムラ VC1 (Village VC)

https://interior.okamura.co.jp/soho/village/vc/

ウレタンクッションでメッシュバック、リクライニングありという制限の中で選んだ。肘置きはかなり悩んだが、あるとキーボードを手前に持ってこれるのであってよかったと思う。

デスクと同時に買って 6 年以上座っているが、傷んでいるところはない。

ハローキティのひざ掛けはミスタードーナツでもらったもの。

ディスプレイ

BenQ E2200HD

(さすがにもう売っていないようなのでレビュー記事) https://www.itmedia.co.jp/pcuser/articles/0810/24/news063.html

12 年以上使っている年代物。HDMI が 1 ポートしかないので、Raspberry pi とか使う際の切り替えが面倒くさい。

デスクトップ

Mac mini (Late 2014)

https://support.apple.com/ja-jp/HT201894

仕事以外のメイン環境(副業、趣味等々)。

外付けの SSD からブートして、中の HDD をマウントしてストレージとして使っている。メモリは 16GB が載っているので、大抵のことはこなせる。

ディスプレイの裏で縦置きしている。

Web カメラ

Logicool C920

(後継機種) https://www.logicool.co.jp/ja-jp/product/hd-pro-webcam-c920s

Mac に接続されている。後述のラップトップを購入してからは、Web 会議はラップトップでするようになったので、ほぼ使っていない。

ラップトップ

Surface Laptop 3 (13.5 inch)

https://www.microsoft.com/ja-jp/p/surface-laptop-3/8vfggh1r94tm?activetab=overview

仕事環境(会社、副業の一部)。

今の会社は自分の PC (このラップトップ)を持ち込んで、会社のプロファイルをインストールして使うので、OS の中でもユーザーアカウントで会社の仕事かそうでないかを使い分けている。

何年かぶりの Windows 端末。WSL とか Windows Terminal とか進歩のおかげで、かなり楽に使えるようになった(Cygwin 時代と比較している)。

ラップトップとしては可もなく不可もなし。メモリはこちらも 16GB 載せているので、画面が小さいことを除けば、大抵の仕事はこなせる。

キーボード

Happy Hacking Keyboard Professional 2 (墨/英語配列)

https://www.pfu.fujitsu.com/direct/hhkb/detail_hhkb-pro2-b-kr01.html

馬の鞍。Lite 2 も持っているが棚で眠っている。

MacSurface の間を行ったり来たりしている。

HYBRID Type-S に興味はあるが、今のものに不満がまったくないので、ポチれない。

ラップトップスタンド

Nulaxy ノートパソコンスタンド

https://www.amazon.co.jp/dp/B07V27FHJY/

折りたたみができて、できるだけコンパクトなこと。角度調整ができること。の中で適当に選んだ。

ラップトップ単体で使っているときも手首の疲れがそんなにないし、HHKB を外付けしているときも画面を目の高さに持ってこれるので、良い姿勢の維持に貢献している。

ヘッドセット

WINTORY MG-1 ゲーミングイヤホン

https://www.amazon.co.jp/dp/B07DDGPCPR/

2020 年上旬までは上述の Web カメラかスマートフォンに付属していたマイク付きイヤホンで Web 会議をこなしていたが、Web 会議がメインになって、もう少しまともなものを買おうとして決めたもの。

オーバーヘッドタイプは耳を押さえるし、収納場所を取るので選択肢から外すと、これが Amazon の検索で上の方に出てきた。

Web 会議をほぼ毎週やっていて、音質云々で不満を持ったことも文句を言われたこともないので、多分問題ない。マイクが口元に持ってこれるので、服との衣擦れ音などが入る心配がない。

今度はマイクミュートができるやつが欲しいと思っている(これはスピーカー音量調整のみ)。

無線イヤホンも持っているが(通勤時用だった)、在宅で 1 日付けっぱなしにするにはバッテリーが不安だったので、有線にしている。

USB ハブ

Anker PowerExpand 8-in-1

https://www.amazon.co.jp/dp/B0874J3Y9T/

Surface Laptop 3 は USB-A 1 つ、USB-C 1 つ、電源ポート 1 つ、イヤホン端子 1 つというシンプル構成なので、ディスプレイを外付けするためにも必須だった。

HDMI が 2 つついているので、トリプルディスプレイ構成にもできる(自宅はディスプレイ 1 つのみなのでまだ試していないが)。

プリンタ

EPSON PX-S160T

https://www.epson.jp/products/ecotank/pxs160t/

写真には写っていないが、無線で繋いでいるモノクロプリンタ。

仕事のための ToDo リスト等の他、子どもの勉強プリントとか幼稚園で必要なもの、迷路、塗り絵などなど、印刷できる環境がすぐにあることで結構便利さを感じている(ちょっと前まではコンビニプリント派だった)。タブレットスマートフォンからも印刷ができる。

今日までで A4 で 500 枚ほどを印刷しているが、横から見えるインクタンクには初回に入れたインクがまだたっぷり入っている。

まとめ

ラップトップ(とできればキーボード)があれば仕事はできなくはないが、ミニマリストに生きるつもりはなく、自分で譲れないポイントを決めたり投資したりして、やはり、与えられた会社の環境と違って、自分らしい環境だなと振り返って思った。

2021 年もしばらくは在宅勤務が続きそうな雰囲気がしているが、ディスプレイの買い替え辺りから始めようと思う。

秋葉原のaitendoにBluetoothオーディオ部品がいろいろあった

制御マイコン不要で動くものがほとんどで、周辺部品がついた完成品とかだとスピーカを繋ぐだけでBluetoothスピーカが完成するから、結構お手軽・お得感ある。

モジュールのみ

名前 チップ リンク
BTオーディオレシーバ [BK3254P9] Beken BK3254-P9 http://www.aitendo.com/product/15761
オーディオBTモジュール [F-6888] Beken BK3254 http://www.aitendo.com/product/15382
オーディオBTモジュール [BK8000L] Beken BK8000L http://www.aitendo.com/product/14711

キット/完成品

名前 チップまたはモジュール 入力 出力 リンク 補足
BTオーディオレシーバキット [K-BK3254P9-A] Beken BK3254-P9 Bluetoothクライアント RCAx2、ステレオミニプラグ、3P端子 http://www.aitendo.com/product/15873 使える電源が4通り、出力が3通りと大抵のケースにマッチしそう
ブルートゥース搭載アンプモジュール [M3WBT09] ? Bluetoothクライアント 2P端子x2 http://www.aitendo.com/product/15603
ブルートゥース搭載アンプモジュール [AMP7492BT] Qualcomm CSR8635 Bluetoothクライアント 2P端子x2 http://www.aitendo.com/product/15937 この表にあげる中では一番ゴツい
ブルートゥース搭載mp3プレーヤー [BT3254MP3] Beken BK3254 Bluetoothクライアント、micro SDカード 2P端子x2 http://www.aitendo.com/product/11639 操作のために別途4つスイッチを接続する必要がある
ブルートゥース搭載メディアプレーヤー [BTMP5V-HP] ? Bluetoothクライアント、micro SDカード、USBストレージ ステレオミニプラグ http://www.aitendo.com/product/15938 チップの表面が丁寧に削られている。アンテナ線を繋げばFMラジオも聞ける
ブルートゥース搭載メディアプレーヤー [M3WS10] ? Bluetoothクライアント、micro SDカード 2P端子 http://www.aitendo.com/product/15604 形状と印刷などからたぶんgoogle:Foxnovo S10の中身

音質にこだわろうと思ったら、スピーカを選ぶとかアンプを変えると良いんだろうか。

Raspberry PiのOS管理をBerryBootベースにした

BerryBoot 配布サイトからzipをダウンロードして解凍、FAT32でフォーマットしたSDカードにファイル群を置いて、Raspberry Piに挿して起動。

ネットワーク設定や国設定を済ませれば、OS選択画面になる。

自分でビルドしたOSイメージもインストールできるようだが、Welcome to BerryServer ⇢ Berryboot OS Imagesに割と新しめのイメージがあるので、これを利用した。

yahoo/Pulsar (standalone) 用のDockerfileを作った

PulsarはYahooが作ったPub/Subシステム。マルチテナント環境で運用されることを前提にした設計、大量のトピック・パーティションがある時Kafkaよりパフォーマンスに優れる、などの特徴がある。

先日、Pulsar勉強会に参加して、そこそこに魅力が伝わってきたので、Dockerコンテナでサクッと試せるよう、Dockerfileを書いた。ついでにJavaでクライアントも書いた。

使い方

Brokerの起動

まずDockerコンテナでPulsar Brokerを立ち上げる(standaloneモードだと同時にZookeeperやBookKeeperも立ち上がる)。

$ docker run -d \
        -p 8080:8080 -p 6650:6650 \
        --env BROKER_HOST=192.168.99.100 \
        laclefyoshi/pulsar-docker-standalone

ポート8080はBrokerのHTTPエンドポイントのポート、ポート6650はBrokerのサービスのポートで、クライアントはHTTPエンドポイント(8080)からBroker情報を受け取り、実際にデータをやり取りするのはサービス(6650)を使う。クライアントが使うのはこの2つの通信経路だけ。

環境変数 BROKER_HOST はクライアントから見て、どのホストにBrokerがあるのかを指定するためのもの。Brokerとクライアントが同じマシンにあるのなら 127.0.0.1 でも可。

Javaクライアントの準備

GitHub - laclefyoshi/pulsar-docker: PulsarをDockerコンテナで使うの client-example に入り、Mavenでビルドする。

$ git clone https://github.com/laclefyoshi/pulsar-docker.git
$ cd pulsar-docker/client-example/
$ mvn clean package
$ ls target/
classes/
generated-sources/
maven-archiver/
maven-status/
original-pulsar-client-example-1.0-SNAPSHOT.jar
pulsar-client-example-1.0-SNAPSHOT.jar

トピックなどの設定は、standaloneモードで用意されているデフォルトのものがハードコーディングされている。

Concumerの起動

Brokerからメッセージを受け取るクライアントとしてConsumerを立ち上げる。BrokerのHTTPエンドポイントを引数で指定する。

$ java -cp target/pulsar-client-example-1.0-SNAPSHOT.jar \
       org.saekiyoshiyasu.PulsarConsumer http://192.168.99.100:8080
Producerの起動

Consumerとは別のターミナルで、Brokerへメッセージを送信するクライアントとしてProducerを立ち上げる。Consumerと同様、BrokerのHTTPエンドポイントを引数で指定する。

$ java -cp target/pulsar-client-example-1.0-SNAPSHOT.jar \
       org.saekiyoshiyasu.PulsarProducer http://192.168.99.100:8080
$
Consumerでのメッセージ受け取り

起動したままのConsumerは、Producerが送信したメッセージを受け取り、内容を出力する。

Received message: Hello 0
Received message: Hello 1
Received message: Hello 2
Received message: Hello 3
Received message: Hello 4
Received message: Hello 5
Received message: Hello 6
Received message: Hello 7
Received message: Hello 8
Received message: Hello 9

standaloneモードじゃないclusterモード

Pulsarのドキュメントによると、clusterモードでの起動には以下の手順が必要のよう。

  1. Zookeeperの設定&起動
  2. Global Zookeeperの設定&起動
  3. クラスタメタデータの更新
  4. BookKeeperの設定&起動
  5. Brokerの設定&起動
  6. Service Discoveryの設定&起動
  7. テナント設定

一筋縄ではいかなかったので、今後の課題とする。

リセットピンをIOピンとして使う

ATtiny13だとPB5、ATtiny2313だとPA2、ATmega8だとPC6がリセットピンになっているので、そのままだとIOピンとして使えないが、FUSE設定でRSTDISBL=0にすると(RisetDisabledが有効になり)IOピンとして有効になる。

RSTDISBLは、ATtinyだとHIGHの0bit目で、ATmegaだとHIGHの7bit目で設定する様子。

ESP8266であれこれする本を書いた

ESP8266で始めるWi-Fi IoTプロジェクト

という内容にした。ESPUSBなんてものが出ていたりするので、まだまだ紹介していないができることは多いのだろうけれど、一旦、すぐにできるところとか、応用が効くノウハウとかをまとめたつもり。

myThingsのIDCFチャンネルとESP-WROOM-02とのMQTT双方向連携 - DiaryExceptionを書いていた頃には概ね実機検証は完了していたのだけれど、それからいろいろあって半年以上延びてしまった。このタイミングでKindle Unlimited日本版が出たので、前に書いたものと同じようにセレクトに登録しておいた。

秋ごろにはESP-WROOM-32なるものも出るらしいし、まだまだESP8266系は楽しめそうな予感がある。

KPLでKinesisに投げたデータをboto3で取得してみた

KPLはKinesis Producer Libraryのこと。

受信したデータを処理してKinesisに流す処理をStormのトポロジ(Java)で実装した。で、Kinesisに入ったデータをPythonで処理するために、boto3を使ったのだが、思ったように動かず、試行錯誤したのでメモ。

Aggregated Recordのフォーマットドキュメントが古い

まず、boto3のAPIに書かれている通りに、Kinesisからデータを取得するプログラムを書いた

import boto3

for record in boto3.client("kinesis").get_records(...)["Records"]:
  data = record["Data"]
  print(data)

とすると、投入したデータが出てくると思ったが、実際はなにやら色々付いたものが出てきた。

少なくとも以下のようなパターンのデータを取得した。RECORD_DATAが実際に投げた文字列である。

  • \xf3\x89\x9a\xc2\n\nPARTITION_KEY\x1a...RECORD_DATA...
  • \xf3\x89\x9a\xc2\n\nPARTITION_KEY\n\nPARTITION_KEY\x1a...RECORD_DATA...
  • RECORD_DATA

どうやら、KPLを使うとデフォルトでAggregated Recordが有効になるらしく、上2つはKPL Aggregated Record Formatと突き合わせると、\xf3\x89\x9a\xc2というMagicNumberは一致するが、その後に続くデータはProtobufMessageではなかった。

\n\nPARTITION_KEYに出てくる値は、Aggregated RecordにまとめられたRECORD_DATAで指定されていたパーティションキーの集合のようだった。

それを読み飛ばして、\x1a以降がProtobufMessageで、末尾16バイトは確かにチェックサムだったので、どうやら正しくは下記の構造をしているようだった。

0               4                    M                  N          N+15
+---+---+---+---+---+---+....+---+---+==================+---+...+---+
|  MAGIC NUMBER | \n\nPARTITION KEY+ | PROTOBUF MESSAGE |    MD5    |
+---+---+---+---+---+---+....+---+---+==================+---+...+---+

なので、最終的にAggregated RecordからRECORD_DATAを取り出すために、PARTITION_KEYに\x1a が出てこないことを前提として、そしてこれからもProtobufMessageの始まりが\x1aであることを前提にして以下のようにした。

from generated.messages_pb2 import AggregatedRecord  # KPLのソースにある.protoファイルをコンパイルした

if data[:4] == "\xF3\x89\x9A\xC2":
  idx = data.index("\x1A")
  ar = AggregatedRecord()
  ar.ParseFromString(data[idx:-16])
  for record in ar.records:
      record_data = record.data
      print(record_data)
else:
  print(data)

1日分のデータを取得してみたが、とりあえず全件ちゃんと取れている。

もっと楽に解決できたかも

ここまでプログラムを書いて、KCL(Kinesis Client Library)とかkinesis-aggregationとかライブラリを見つけて、Deaggregationしてくれるとか書いてあるので、げんなり。