- 健康になりたい
- 歩く時間を増やす
ref.
失敗例
↑ つまり失敗しているということである。具体的なことなく「なりたい」では目標は達成できないという例
日記を読みかえしてみたら今年もいろいろやっていた。年末にせめて自分で自分を承認してあげたい。おおまかには
の順に興味がうつりかわり、同時にウェブ技術とかNC切削とか、普段通りという感じのこともやっていた。振り替えってみると思ったより密度高く生きてるが、主観的にはそうでもないというかやる気がなさすぎて困っているという実感がある。なぜだろう……
h2 対応とか、このウェブサイトの最適化を結構やっていた。ハードウェア触る気力がなくなると、ノートPCだけでぼーっと最適化するみたいな流れ…… ウェブ技術はなんというか、仕事じゃなければあんまり気を張らなくても実装できるので、とりあえずやっておくというか、良い言いかたをすれば癒し的側面がある。
サーバサイドで Mathjax するあたりとかは結構がんばったし効果が高かった。
h2 対応のために h2o を導入したので、それ関係のエントリがかなり多い。
類似エントリみたいな、ちょっとアルゴリズムよりのこともやってみた。ただ実装するというより SQLite にこだわって工夫してやってみたところは良かった。仕事で SQLite 使うことはないので役には立たない。アルゴリズムの実装がものすごく苦手なんだけど (こういうこと言うとバカにされまくる……)、ちょっと頑張った例。TF-IDF なんてクソみたいに簡単なアルゴリズムではあるが……
仕事だと分業のおかげで、こういう上から下まで一貫してチューニングするみたいなのはやる機会がない。
おうちハック的なのもやっている。
デジタルSWR計。アンテナアナライザへの布石。
アンテナアナライザ関係。いろいろ勉強になっておもしろかった。 今年前半では一番大きなプロジェクトだったように思う。数学苦手なのだけれど面白いなと思えたところが地味な収穫かもしれない。
スペアナ最高に楽しい。でも最近高周波回路やってなくてあんまり起動してない……
ヤパチーからの流れで自作して、builderscon で発表させてもらった。今年後半の主なプロジェクトとなった。結果的には、カンファレンスできっかけをもらってカンファレンスのトークに還元した感じになって主観的には良かった。
ESP8266 結構触ってたなという感じ。安くなると夢が広がる。
ebay とかで買ったやつをとにかく動かすシリ〜ズみたいなのをやってた。意外と得るものが多い。そのときそのときで触ってる環境で動かしてるのでプラットフォームに一貫性がない。
ioctl を Ruby から呼ぶのを割とやってて、書いてないけどこれ以外にも SPI を Ruby でやるとかもやってたりした。Ruby は IO 処理書くのがかなり楽なのと全体的に可読性が良く、ビルトインメソッドが充実しているので「パフォーマンスはともかく理解しやすいコードを書く」みたいなときに Ruby で書くことが多い。
gem とか使わないとダメになってくると他の言語に逃げがち。gem、クオリティ低いものが大量にあって、どれを使うべきか?自分で実装すべきか?とか悩んでるうちに1日終わる。テキトーに動かしたいときはほんと時間の無駄。
消費電力可視化もいろいろやってみたが、今のところ実用に至ってない。
急に C++ と親密になって好きになった。組込みなら絶対 C++ で書きたい。
mbed 関係。結構さわったしコードも読んだ。
GPS DO を途中までつくった感じ。完成してない (必要性の無さに気付いて、やる気をうしなってしまった)
いろんなことで、かなり役に立っている。元はとったな〜というぐらいの気分でいる。grbl からmachinekit (beaglebone black) への移行が主なトピック。machinekit を収める筐体作りがまだ途中。
知見はかなり溜ってきた。
Fusion 360 導入で可能性がとてもひろがった。全く新しい分野の技術習得という意味では今年一番価値があったかもしれない。拘束によって作図するのはとても気持ちいい。
3D プリンタがない (置く場所がない) のが悩み。欲しんだけどなあ。
全く分類できないもの
cmake はプログラミング言語ってことはわかったけど結局役に立ってない。相変わらず他人の書いた CMakefile.txt は読む気がしない。
表題の通りでハマってしまった。
$ sudo rabbitmqctl status
...
{rabbit,"RabbitMQ","3.6.6"}
... $ cat /usr/lib/erlang/releases/18/OTP_VERSION 18.3
{versions, ['tlsv1.2', 'tlsv1.1', tlsv1]} openssl s_client で接続確認してみる。
$ openssl s_client -connect 127.0.0.1:5671 -tls1_2 < /dev/null
これ問題なかった。
どっちもなぜか同じように以下のようなエラーになる。
$ openssl s_client -connect 127.0.0.1:5671 -tls1_1 < /dev/null
CONNECTED(00000003)
139728874526360:error:1409442F:SSL routines:ssl3_read_bytes:tlsv1 alert insufficient security:s3_pkt.c:1472:SSL alert number 71
139728874526360:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.1
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1483074781
Timeout : 7200 (sec)
Verify return code: 0 (ok)
--- 結局これは Erlang の ssl ライブラリの問題らしく、基本的には Erlang のバージョンをあげる必要があるっぽい。しかしRabbitMQ 3.6.1 / Erlang 18.3 TLS insufficient security failures からリンクがある通り以下のようにするとうまくいった。
{versions, ['tlsv1.2', 'tlsv1.1', tlsv1]},
{ciphers, ["ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384",
"ECDHE-ECDSA-AES256-SHA384","ECDHE-RSA-AES256-SHA384", "ECDHE-ECDSA-DES-CBC3-SHA",
"ECDH-ECDSA-AES256-GCM-SHA384","ECDH-RSA-AES256-GCM-SHA384","ECDH-ECDSA-AES256-SHA384",
"ECDH-RSA-AES256-SHA384","DHE-DSS-AES256-GCM-SHA384","DHE-DSS-AES256-SHA256",
"AES256-GCM-SHA384","AES256-SHA256","ECDHE-ECDSA-AES128-GCM-SHA256",
"ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES128-SHA256","ECDHE-RSA-AES128-SHA256",
"ECDH-ECDSA-AES128-GCM-SHA256","ECDH-RSA-AES128-GCM-SHA256","ECDH-ECDSA-AES128-SHA256",
"ECDH-RSA-AES128-SHA256","DHE-DSS-AES128-GCM-SHA256","DHE-DSS-AES128-SHA256",
"AES128-GCM-SHA256","AES128-SHA256","ECDHE-ECDSA-AES256-SHA",
"ECDHE-RSA-AES256-SHA","DHE-DSS-AES256-SHA","ECDH-ECDSA-AES256-SHA",
"ECDH-RSA-AES256-SHA","AES256-SHA","ECDHE-ECDSA-AES128-SHA",
"ECDHE-RSA-AES128-SHA","DHE-DSS-AES128-SHA","ECDH-ECDSA-AES128-SHA",
"ECDH-RSA-AES128-SHA","AES128-SHA"]},
{honor_cipher_order, true}, ウェブページから JavaScript で MQTT ブローカーに送られてくるデータを取得したかったので、MQTT over WebSocket を試してみました。
Ubuntu のレポジトリのは 3.5.7 と古いので、Installing on Debian / Ubuntu にしたがって 3.6.6 にします。
既に古いのが入っていても、説明通りに RabbitMQの apt レポジトリを設定して、 apt-get update して install したら自動でアップグレードされます。
rabbitmq_web_mqtt をいれます。これは Community Plugins にありますが、 RabbitMQ のチームが作っているので安心感があります。プラグイン自体が比較的新しくて、RabbitMQ 3.6.1 以降でないと使えません。
$ wget --content-disposition https://bintray.com/rabbitmq/community-plugins/download_file\?file_path\=rabbitmq_web_mqtt-3.6.x-14dae543.ez $ sudo mv rabbitmq_web_mqtt-3.6.x-14dae543.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.6/plugins/ $ sudo rabbitmq-plugins list | grep web_mqtt [ ] rabbitmq_web_mqtt $ sudo rabbitmq-plugins enable rabbitmq_web_mqtt The following plugins have been enabled: cowlib cowboy rabbitmq_web_mqtt Applying plugin configuration to rabbit@stfuawsc... started 3 plugins. $ sudo rabbitmq-plugins list | grep web_mqtt [E*] rabbitmq_web_mqtt
デフォルトで 15675 が listen されています。このままでいいのですが、念のため設定を書いておくことにしました。
設定例がないのでソースを読むしかないようです。rabbitmq_web_mqtt.schema が設定ファイルのスキーマのようなので、これを参考に以下のようにしました。
{rabbitmq_web_mqtt,
[
{tcp_config,[{port, 15675}]}
]
} WebSocket 経路の TLS 化はリバースプロキシ (h2o) で行うので、このサーバ自体には TLS の設定を書いていません。
HTTP フロントエンドの h2o からポート 15675 にリバースプロキシするように設定しました。これで外部から接続可能になります。
なおh2oは定期的にWebSocket接続を切るようになっているので、クライアント側で再接続するコードが必須です。
認証はどうなるのか? という疑問があるところですが、MQTT レイヤーでのユーザ認証があります。Upgrade 時に Origin による制限などはかけられないようです。
rabbitmq-web-mqtt-examples というレポジトリがあり、これを参考にすれば簡単に接続できます。
ライブラリとして Eclipse Paho の JavaScript 版を使っています。WebSocket のエンドポイントを指定する以外は普通にMQTTするのと変わりません。
var TOPIC = "/foo/bar/baz";
var USER = "foo";
var PASS = "bar";
function mqttConnect() {
var client = new Paho.MQTT.Client(
location.hostname,
location.port || 80,
"/mqtt", "myclientid_" + Math.random().toString(32)
);
client.onConnectionLost = function (responseObject) {
console.log(responseObject);
// reconnect
setTimeout(mqttConnect, 1000);
};
client.onMessageArrived = function (message) {
var data = Number(message.payloadString);
console.log(data);
};
client.connect({
userName: USER,
password: PASS,
timeout: 3,
onSuccess: function () {
console.log('onSuccess');
client.subscribe(TOPIC, {qos: 1});
},
onFailure: function (message) {
console.log('onFailure', message.errorMessage, message);
}
});
} ブラウザ上の WebSocket の場合、TLS はブラウザ側でやってくれるので、普通の MQTT with TLS の接続で考えることよりも少なくて楽です。
RabbitMQ + MQTT で Pub/Sub サーバを立てることにしました。
いろいろなセンサーのグラフ化にあたって GrowthForecast へ直接 POST を行っていましたが、やはり一旦メッセージブローカー的なものをいれたほうがよさそうだという感じになってきました。
センサーデータを複数のプログラムから使いたい場合、特にほぼリアルタイムで情報を得たいようなケースだと、直接各アプリケーションに投げるのではなくて、センサーはある一箇所に値を投げることだけを考え、アプリケーションはある一箇所からデータを受けとることだけを考えるように分離したくなります。
例えば今まではセンサーデータをアプリケーションであるグラフサービスに直接投げていましたが、これだとセンサーデータをさらに別のデバイスから読みだして表示するといった場合に、本来の用途ではないグラフサービス側のAPIに問合せたりする必要があって不便です。
MQTT はキューがない (最後の値だけ保存する/Retain) Pub/Sub のメッセージ配信プロトコルで、組込み系だとそこそこメジャーなようです。ググってみるとクライアント実装はそこそこ充実しています。
サーバ実装がいまいちコレというのがない気がするのですが、RabbitMQ のプラグインに MQTT プロトコルサポートがあるので、これを利用するのが比較的よさそうでした。
これ系のプロトコルは MQTT 以外にもいろいろあって、RabbitMQ の本来の用途である AMQP も競合プロトコルになります。AMQP より MQTT が好まれるのはプロトコルのシンプルさのためですが、機能的には AMQP が勝ります。
ひとまず Ubuntu のパッケージをそのままつかうことにしました。
sudo apt-get install rabbitmq-server
Rabbit MQ は Erlang で書かれているので、Erlang 関係のパッケージが大量にはいります。
インストール直後から起動していて、rabbitmqctl status でステータスが見れます (root 権限が必要です)。デフォルトではクラスタリング用のポート25672と、AMQP 用のポート 5672 が listen されていました。
sudo rabbitmqctl status
続いて mqtt プラグインを有効にしておきます。
sudo rabbitmq-plugins enable rabbitmq_mqtt
このコマンドは自動的に設定が反映され、status を見ると mqtt を 1883 で listen していることがわかります。
適当に見てみると /etc/rabbitmq/rabbitmq-env.conf というのが最初からありますが、これは環境変数設定ファイルなのでとりあえずそのままにしておきます。
ログとして /var/log/rabbitmq/$node@$host.log というファイルがあり、これの冒頭に
node : rabbit@stfuawsc home dir : /var/lib/rabbitmq config file(s) : /etc/rabbitmq/rabbitmq.config (not found) cookie hash : log : /var/log/rabbitmq/rabbit@stfuawsc.log sasl log : /var/log/rabbitmq/rabbit@stfuawsc-sasl.log database dir : /var/lib/rabbitmq/mnesia/rabbit@stfuawsc
というログが出ています。この通り設定ファイルは /etc/rabbitmq/rabbitmq.config になりますが、まだないので作る必要があります。
サンプル設定ファイルがあるのでとりあえずこれをコピペしてつくるのがよさそうです。
# とりあえず眺める zless /usr/share/doc/rabbitmq-server/rabbitmq.config.example.gz # コピペからはじめる sudo sh -c 'zcat /usr/share/doc/rabbitmq-server/rabbitmq.config.example.gz > /etc/rabbitmq/rabbitmq.config'
Erlang の設定ファイル形式なのでちょっと読みにくいです。
ここでは方針として以下のようにします。
TLS の設定では取得済みの Let's Encrypt の証明書をそのまま流用します。ただ、Let's Encrypt がつくる /etc/letsencrypt/live 以下が root 以外読めないようになっている一方、RabbitMQ は証明書ファイルを rabbitmq ユーザで読もうとするようで eacces がでます。
しかたないので以下のようにしてアクセスを許可するように変えてしまいました。なにかもっとスマートに解決したほうがいいと思うのですが、思いつきませんでした。
sudo chmod 0755 /etc/letsencrypt/{live,archive} 以下のようにしてみました。
%% -*- mode: erlang -*-
%% ----------------------------------------------------------------------------
%% RabbitMQ Sample Configuration File.
%%
%% See http://www.rabbitmq.com/configure.html for details.
%% ----------------------------------------------------------------------------
[
{rabbit,
[
{ssl_listeners, [5671]},
{handshake_timeout, 10000},
{log_levels, [{connection, info}, {channel, info}]},
{ssl_options, [{cacertfile, "/etc/letsencrypt/live/cho45.stfuawsc.com/fullchain.pem"},
{certfile, "/etc/letsencrypt/live/cho45.stfuawsc.com/cert.pem"},
{keyfile, "/etc/letsencrypt/live/cho45.stfuawsc.com/privkey.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, false}]},
{auth_mechanisms, ['PLAIN', 'AMQPLAIN']},
{auth_backends, [rabbit_auth_backend_internal]},
{ssl_handshake_timeout, 5000}
]},
{rabbitmq_mqtt,
[
{allow_anonymous, false},
{vhost, <<"/">>},
{exchange, <<"amq.topic">>},
{subscription_ttl, 1800000},
{prefetch, 10},
{tcp_listeners, [1883]},
{ssl_listeners, [8883]}
]}
]. もともとある guest/guest は localhost からだけ接続が許されているのでそのままにして、外部から使う用のユーザを追加します。
# guest しかない $ sudo rabbitmqctl list_users Listing users ... guest [administrator] # ユーザ追加 $ sudo rabbitmqctl add_user tsun pass Creating user "tsun" ... # 確認 $ sudo rabbitmqctl list_users Listing users ... guest [administrator] tsun [] # パーミッションを追加 conf write read の順で指定する。これは正規表現。ここでは全権 $ sudo rabbitmqctl set_permissions tsun ".*" ".*" ".*" Setting permissions for user "tsun" in vhost "/" ...
クライアントに rubygems の mqtt を使ってみます
gem install mqtt
#!/usr/bin/env ruby
require 'mqtt'
require 'thread'
# MQTT::Client seems not thread safe
mutex = Mutex.new
pub_thread = Thread.start do
mutex.lock
MQTT::Client.connect(
host: '127.0.0.1',
port: 8883,
ssl: true,
username: 'guest',
password: 'guest',
) do |client|
mutex.unlock
p [:pub, client]
10.times do
sleep 1
p :publish
client.publish("test", "this is test", false)
end
end
end
sub_thread = Thread.start do
mutex.lock
MQTT::Client.connect(
host: '127.0.0.1',
port: 8883,
ssl: true,
username: 'tsun',
password: 'dere',
) do |client|
mutex.unlock
p [:sub, client]
client.subscribe("test")
client.get do |topic,message|
p [ topic, message ]
end
end
end
pub_thread.join こんな感じのコードで動いていることを確認できるはずです。ただし guest を指定しているので、同一ホストで動かす必要があります。
基本の動作確認ができたので、パブリックにアクセス可能にするためポートをあけます。ufw で 8883 (MQTT with TLS) だけをあけました。他はいまのところ使用予定がないので閉じたままです。listen 自体しないほうがより安全ですが、サーバ内でごにょごにょすることはありそうなのでそのままにしています。
sudo ufw allow 8883
外部から、さきほど作ったユーザで接続確認を行ってとりあえずセットアップ完了です。
寝室に置いてみたいので ESP8266 (ESP-WROOM-02) で動かして GrowthForecast にポストするようにしてみた。
MH-Z19 を PWM 経由で読んでいる loop 関数だけ抜きだすと以下のような感じ。とりあえず割込みは使ってない。
void loop() {
ArduinoOTA.handle();
static uint32_t prevTime = 0;
static uint8_t lastState = 0;
static uint32_t th;
static uint32_t tl;
int state = digitalRead(PWM_INPUT);
if (lastState == state) {
// nothing to do
} else {
lastState = state;
uint32_t now = millis();
if (!prevTime) {
prevTime = now;
return;
}
uint32_t interval = 0;
if (prevTime <= now) {
interval = now - prevTime;
} else {
interval = 0xffffffff - prevTime + now + 1;
}
prevTime = now;
if (state == 1) {
tl = interval;
if (tl && th) {
uint32_t cycle = tl + th;
if ((uint16_t)(1004 * 0.95) < cycle && cycle < (uint16_t)(1004 + 1.05)) {
uint16_t ppm = 5000.0 * ((float)(th - 2) / (float)(cycle - 4));
Serial.printf("%d ppm (cycle %d / th: %d, tl: %d)\n", ppm, cycle, th, tl);
gf.post("/home/sensor/co2_1", ppm);
// reset count
th = 0; tl = 0;
prevTime = 0;
} else {
// error
Serial.println("error");
}
}
} else
if (state == 0) {
th = interval;
}
}
}
Aliexpress で歪みゲージ (ロードセル 1kg) と、HX711 のモジュールを買ったので試してみました。
歪ませる必要があるので、このように上下に板をつけて挟みこみます。このとき、多少すきまが必要なのでワッシャーなどをかまします。
今回使った歪みゲージのスペックは以下の通りです。(コピペ) また、M4 と M5 のネジが切ってありました。
Rated Load: 1Kg Rated Output: 1.0mV/V±0.15mV/V Zero Output: ±0.1mV/V Creep: 0.03%F.S./30min Input End: Red+ (power), Black-(power) Output End: Green+(signal), White-(signal) Recommended operating voltage: 3 ~ 12 VDC Maximum operating voltage: 15 VDC Input Impedance: 1115±10%Ω Output Impedance: 1000±10%Ω Protection class: IP65 Total Size: approx. 3.15 x0.50 x 0.50 inch Cable: 0.8 x 20 cm (diameter x length) Material: Aluminum Alloy Weight: 30g
手に入れたのは↑のようなモジュールです。適当に配線して読みます。
以下のライブラリを使ってみました。
README の通りにスケールを設定する必要があります。
#include <Arduino.h>
// https://github.com/bogde/HX711
#include "HX711.h"
const int DT_PIN = 2;
const int SCK_PIN = 3;
HX711 scale;
void setup() {
Serial.begin(9600);
Serial.println("start");
scale.begin(DT_PIN, SCK_PIN);
Serial.print("read:");
Serial.println(scale.read());
scale.set_scale();
scale.tare();
Serial.print("calibrating...");
delay(5000);
Serial.println(scale.get_units(10));
scale.set_scale(-1536.00);
scale.tare();
Serial.print("read (calibrated):");
Serial.println(scale.get_units(10));
}
void loop() {
Serial.println(scale.get_units(10), 1);
scale.power_down();
delay(500);
scale.power_up();
} このようなコードを書いて、
という方法をとりました。
こんな感じで値が読めました。1円玉を1つずつ増やして5枚まで載せてみました。
同級生との飲み会で若干ハメをはずして飲みすぎて久しぶりに激しい二日酔いになってしまった。二日酔いになるたびに二日酔いをすみやかに解消する方法を調べてるけど、結局ないってことはわかっている。
必要なのは時間と水分(分解に必要)なので、スポーツドリンクをこまめに飲みつつ、梅干し純を舐めて、身体をあたためつつ布団で寝ていた。
アサヒグループ食品 梅ぼし純 24粒×10個 cho45
梅干し純は気持ち悪いのが軽減されるうえに塩分が得られる。スポーツドリンクにも塩は入っているけど、少なめになっているらしいので、ちょっと追加するのがちょうどいいのではないかという狙い。
MH-Z19 の個体差とキャリブレーションの必要性 | tech - 氾濫原 というのを書きましたが、とりあえず 400ppm 環境は比較的簡単に作れるのだから、それでキャリブレーションしてみることにしました。
その過程でこのセンサの「ゼロキャリブレーション」について誤解していたことがわかりました。 MH-Z19 という格安 CO2 センサを読んでみた | tech - 氾濫原 に追記してありますが、ここでいう「ゼロ」は 400ppm 環境のことであるらしく、0ppm の環境は必要ありませんでした。また「スパンキャリブレーション」は最低でも1000ppm以上、2000ppm以上推奨とのことでした。MH-Z19 のドキュメントではなく MH-Z19B のドキュメントのほうが詳しく書いてあり、こちらを参考にしました。
スパンキャリブレーションはそのような特定環境をつくるのが難しいので、今回は「ゼロキャリブレーション」だけを行ってグラフにしばらく投稿してみました。
窓をあけて換気扇をつけ、周辺環境をできるだけ400ppmに近付けます。最低でも30分ぐらいは換気します。室内であっても十分に換気ができていれば400ppm前後にはできるので、気をつけるのは息を吹きかけないようにする (自分が風上にいないこと) ぐらいです。人間の呼気中の CO2 は 4% (40000ppm) ぐらいなので、普通に影響します。
センサはシリアル経由で繋ぎました。起動に数分時間がかかるので放っておきます。
以下のスクリプトを実行します。
https://github.com/cho45/ruby-mh-z19/blob/master/examples/cal.rb
短いのでコピペすると
#!/usr/bin/env ruby
$LOAD_PATH << "#{File.dirname(__FILE__)}/../lib"
require 'mh-z19'
co2 = MH_Z19::Serial.new(ENV['PORT'])
# wait sensor startup
loop do
detail = co2.read_concentration_detail
p detail
case detail[:status]
when 0
p "booting"
when 1
p "startup"
when 64
break
end
sleep 1
end
co2.calibrate_zero_point
sleep 3
p co2.read_concentration_detail こんな感じになります。この MH-Z19 はドキュメントに書いてないのですが、ステータスビットや認識している温度も返すようで、read_concentration_detail だとそれらもとれるような実装にしてあります。
例によって1日ぐらい放置してみました。スパンキャリブレーションしていないので、やはり最大値に差があります。とはいえ 100〜200ppm 以内には入ってる感じなので、実用的にはとりあえず十分かもしれません。いずれにせよ何もしない場合よりは遥かにマシなので、必ずやったほうがよさそうです。
MH-Z19 という格安 CO2 センサを読んでみた | tech - 氾濫原 を書いたあと、追加で3つ買って、4つ手元にある状態ですべて繋げて値を読んでみると、でてくる値がとんでもないのが2つあった。窓全開で十分に換気されている状態でも 800〜900ppm になってしまう。
センサの種類 (2000ppm or 5000ppm) が違うのか? と思ったけど、UART の値も PWM の計算値も同じ (UART では ppm が直接出力されるので、計算値の答えあわせになる) なので関係なさそう。
その後よくよく比較してみると、どれも全く動きかたがちがう。傾き(感度)も違う。やっぱこれはキャリブレーションをなんとかしてやるしかない気がする。うーん。
ゼロ点とスパン点どっちも難しい。なんか簡単にできる方法がないか考え中
OWON デジタルオシロスコープSDS7102 超薄型 1Gsサンプリング100MHzFFT機能付カラーポータブルフルセット【国内正規品】 cho45
OWON SDS7102 大変つかってるが安いだけあって品質が微妙な点がいくつかある。特にロータリーエンコーダーがひどくて、ちゃんとレンジ切り替えができないことが多くあってイライラする。同様の現象が起きてないか検索したところいくつかヒットしたのでやってみた。
おおむね 500 Can't connect to www.candrian.gr:443 (certificate verify failed) を参考にすればいいのだが、ちゃんと外れないところがあった。
をはずす。裏蓋はハメこみなので、カードとかで隙間をひろげながらはずす。
電源スイッチがひっかかるので、これは押しながら抜く。
開きつつあると、裏蓋に繋がる電源線が3つあるので、基板側のコネクタとビスをはずす。
をはずす。これでモニタも含めてすっぽり外れる。フラットケーブルとかで繋がってるので慎重にやる。
赤丸部分がロータリーエンコーダなので、ここに 1608 サイズの 0.1μF を2つずつはんだづけする。
はずしたコネクタを通すところを間違えるとハメられないので気をつけてハメていく。それ以外はとくに問題ないはず。
全体的に変な動きは減った。しかし中央(2ch) のレンジをかえるロータリーエンコーダはそもそも不良っぽくて完全には治らなかった。
ref.
先にまとめておくと、おむつの支出が支配的で、それ以外だと直接子ども用のものをあんまり買ってない。絵本とかをあんまり買ってない気がする。
【おしりふき 詰替用】グーン 肌にやさしいおしりふき タップリッチ 840枚(70枚×12個) [ケース販売] 【Amazon.co.jp限定】 cho45
3ヶ月に1回ぐらい買ってるっぽい。
メリーズ L サイズ → グーン Big サイズ → グーン Big より大きいサイズ と変わった。「Big サイズ」と「Big より大きいサイズ」はまだ併用してて、保育園で昼寝のときに漏れる問題が発生して保育園用のだけワンサイズ大きくしている。
ざっと合計したら60454円だった。だいたい5000円/月ぐらい。だけど保育料の支配率が高いので誤差みたいなもの……
ゆっくといっしょ ぼくひゃっか cho45
くもん出版 くもんのジグソーパズル STEP1 だいすき どうぶつ 知育玩具 おもちゃ 1.5歳以上 KUMON cho45
くもん出版(KUMON PUBLISHING) くもんのジグソーパズル STEP2 はやいぞ しんかんせん 知育玩具 おもちゃ 2歳以上 KUMON cho45
OGK KABUTO(オージーケーカブト) 自転車 ヘルメット 子ども用 FR-KIDS スターホワイト 幼児・児童用(頭囲:50~54cm未満) SG認証 cho45
クリスマスプレゼント多くない? って感じだけど、祖父母分もはいっている (祖父母からは現金が渡ってきて、こちらで適当にあわせて買うという方式)
RiZKiZ 子供用絵本ラック 木目調 キッズブックシェルフ マガヒンラック 収納に便利な仕切り棚付き (3段タイプ/ダークブラウン) cho45
Stokke ストッケ ベビーチェア ハイチェア 本体 トリップトラップ 食卓 赤ちゃん 椅子 ウォールナットブラウン cho45
育児関係で大人用のやつ
ちょっと読んだ感じ小学生以降っぽいのでまだ読んでない。
Raspberry Pi で Wi-Fi が一度切れると二度と繋がらない、という現象に遭遇した。しかたないので変なことをした。
#!/bin/sh
msg() {
echo $1
logger $1
}
while true
do
if ifconfig wlan0 | grep -q "inet addr:"; then
sleep 60
else
msg "Network connection down! Attempting reconnection."
ifdown --force wlan0
sleep 5
ifup wlan0
/etc/init.d/dhcpcd reload
sleep 30
fi
done ifplugd とかも触ってみたけど、これが結局確実っぽい。なんかどうも dhcpd が ifup 時に反応してくれなくて、手動で reload してる。うーん。もっと一発で解決する方法があればいいんだけど……
systemd になって inittab が消滅したので途方にくれましたが以下のようにするとできました。
UART ピンからのログインの場合
sudo vim /lib/systemd/system/serial-getty@.service
ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM
となっているので
ExecStart=-/sbin/agetty -a pi --keep-baud 115200,38400,9600 %I $TERM
とする。
なお、この状態でシェルで reset を実行すると halt や reboot がハングするようになる。謎…… reset を殺して対応してるけど理由がわからなくて気持ちわるい。systemd がおかしいのだろうか?
ssh 経由とかの場合。
sudo raspi-config から設定可能です。なので基本的には raspi-config でやったほうがよさそう。
以下は手動でやる方法
sudo vim /lib/systemd/system/getty@.service
ExecStart=-/sbin/agetty --noclear %I $TERM
となっているので、以下のように
ExecStart=-/sbin/getty --noclear -a pi %I $TERM