Category tech.

以下のような環境で日本語が化けるようになった。

  • macOS Sierra
  • リモートで screen を使っている
  • ssh host -t screen -r で復帰している

問題ないケース

  • Sierra にする前は問題なかった
  • ssh host して手動で screen -r

解決方法

どうやら ssh -t したとき、特定の環境変数がリモートに渡されなくなったみたいだった。以下のように ~/.ssh/config に追記した

SendEnv LANG

Sierra での man ssh から抜粋。複数書く場合はスペース区切りか SendEnv 自体を複数書けば良い。

Specifies what variables from the local environ(7) should be sent to the server. The server must also support it, and the server must be configured to accept these environment variables. Note that the TERM environment variable is always sent whenever a pseudo-terminal is requested as it is required by the protocol. Refer to AcceptEnv in sshd_config(5) for how to configure the server. Variables are specified by name, which may contain wildcard characters. Multiple environment variables may be separated by whitespace or spread across multiple SendEnv directives. The default is not to send any environment variables.

  1. トップ
  2. tech
  3. Sierra にしたらリモートの日本語が化けるようになった

Sequel はドキュメント見ると SQL そのまま書くやりかたもとクエリビルダを介すやりかたも許されていると感じるので (別に他のライブラリでも可能だろうが)、導入負荷が低くてよさそうです。結構機能はもりだくさんありますが必要なければ使わないのも許されてる感じもよさそうです。

Sequel でのクエリ発行のしかたは sequel/querying.rdoc at master · jeremyevans/sequel · GitHub を読むとだいたい網羅できるが、特に自分に重要なところだけ別途メモしておく。

モデルを使っても使わなくても SQL クエリはそのまま発行できる。複雑な JOIN も安心。

モデルを使わない場合

SQL を発行して Hash として取得できる。

dastaset = DB["SELECT * FROM foo"]
dataset.all # 全インスタンス化

モデルを使う場合

任意の SQL を発行しつつあるモデルとしてインスタンス化したい場合

class Foo < Sequel::Model(:foo)
end

dataset = Foo.with_sql("SELECT * FROM foo")
dataset.all # 全インスタンス化

Sequel::Model(:foo) の :foo はテーブル名を渡す。何も渡さないとクラス名を複数形にしたものを探そうとする。が明示したほうが良いと思います。

どういうときにモデルを使うか

使いたいときに使う。単にクエリ投げたいだけならモデルはいらないし、特に JOIN がからむなら余計なことせず Hash で返ってくるのは気楽で良い。

機能的な面からいえば、DBからひいてきたインスタンスにメソッドを生やしたいというときはモデルを使ったほうが楽。既存の行を update したいときもモデルがあったほうが楽。

Sequel のモデルも若干マジカルで、DBコネクションがないとモデル定義できなかったりする。キモいけどテーブル情報を使ってアクセサを定義したりするっぽい。

  1. トップ
  2. tech
  3. Ruby Sequel で生 SQL をメインに使う

https://github.com/mqttjs/MQTT.js

  • ブラウザ (MQTT over WebSocket) でも node.js でもほぼ同じ使いかたができる
  • 自動でリコネクトしてくれる
  • API がモダン

Eclipse Paho の JS 版を一時期使っていたが、完全に乗り換えました。

MQTT over WebSocket の場合

ドキュメントの通りだけど以下のようにする。TLS なら wss にするだけ。

		const client = mqtt.connect("ws://" + location.hostname + ":" + (location.port || 80) + "/mqtt", {
			username: USER,
			password: PASS,
			reconnectPeriod: 500
		});
  1. トップ
  2. tech
  3. JavaScript で MQTT するなら MQTT.js が良い