2018年 07月 09日

ping の結果にタイムスタンプをつける

なんか簡単にできる方法がないっぽい

ping -i 1 localhost | ruby -analpe '$_[0, 0] = Time.now.to_s + " "'
2018年 07月 08日

LAN 内の mDNS に応答するホストを列挙したい

  • PTR _services._dns-sd._udp.local.
  • A/AAAA [ソースアドレス].in-addr.arpa.

をやりたい。node 付属の dns で mdns クエリを行うとうまくいかなかった。mdns のライブラリを使うと以下のようになった。_services._dns-sd._udp.local. ひいたときにソースアドレスがなぜか取得できないので若干めんどうなことになっている……

//#!/usr/bin/env node

const mdns = require('mdns');

function getServiceWithBrowser(browser, timeout) {
	if (!timeout) timeout = 500;

	return new Promise(function (resolve, reject) {
		const ret = [];
		browser.on('serviceUp', function(service) {
			ret.push(service);
		});
		//browser.on('serviceDown', function(service) {
		//	console.log("service down: ", service);
		//});
		browser.start();
		setTimeout( () => {
			browser.stop();
			resolve(ret);
		}, timeout);
	});
}

function getAllServices(timeout) {
	return getServiceWithBrowser(mdns.browseThemAll(), timeout);
}

function getServiceForType(type, timeout) {
	return getServiceWithBrowser(mdns.createBrowser(type), timeout);
}

async function run () {
	const services = await getAllServices();
	const results = await Promise.all(services.map( (s) => getServiceForType(s.type)));
	const hosts = results.reduce(
		(r, i) => (
			i.forEach((i) => r.set(i.host, i.addresses)),
			r
		),
		new Map()
	);
	for (let [name, addresses] of hosts.entries()) {
		console.log(name);
		for (let address of addresses) {
			console.log("\t", address);
		}
	}
}

run();
2018年 07月 07日

IPv6 ネイティブ環境に移行 (IPoE + DS-Lite)

excite光をつかってたので、移行が楽な excite MEC光 という IPoE サービスにしてみました。IPv6 ネイティブかつ DS-Lite による IPv4 接続サービスです。

事前に調べてもさっぱりわからない点があったのでまずそれを検証しました。

ルーターの挙動

  • 貸与ルーター (Aterm WG1810HP) の挙動
    • LAN側は IPv6 ネイティブ接続されるのか? → される。ルーターがRA+DHCPv6 stateless をやってくれる。グローバルIPアドレスが割り当てされる。
    • LAN側の IPv4 アドレスはどうなるのか? → ルータで設定したプライベートIPアドレスがDHCPでくばられる。
    • これまで通りに IPv4 PPPoE セッションははれるのか?
      • レンタルルータだとそもそも設定がなくて貼れない。PPPoE 接続情報自体 excite からもらえない。

この Aterm WG1810HP(MF) は DS-Lite 対応品となっている。DS-Lite 対応ルーターなら他のものも利用可となっているが、このルーターは常に強制的にレンタルする必要がある。

強制レンタルはまぁ許せるけど、それならレンタル料金 (100円/月) を月額料金に含めて書けよと思う。

DS-Lite IPv4 で UPnP のポート解放はできるか

答: できない

DS-Lite では NAT が自宅内ルーターではなく VNE ゲートウェイ (AFTR) 側で行われる (CGN/キャリガグレードナット)ので、手動でポート解放というのが原理的に不可能。それでは UPnP には対応しているのか?という疑問

iijmio ひかりでも答えている。「IPoE接続サービスのDS-Lite方式でのIPv4サービスでは、UPnPによる外部ホストからお客様宅のコンピュータへの通信路確立は行えません。外部へのサービス公開が必要な場合、PPPoE接続を併用されるか、IPv6の利用をご検討ください。」

Mac

デュアルスタック

インターフェイスで IPv6 を有効にすればそれだけで IPv6 ネイティブで繋がるようになる。

なぜか設定でリンクローカルだけの割当になっている端末があったのが罠かった。

Android

デュアルスタック

ZenFone3 (Android 8.0.0)

無線LAN経由で IPv6 接続される。特に設定はなし。

PS4

IPv4 接続

NATタイプ: 2

Nintendo Switch

IPv4 接続

NAT タイプ: B

nasne

IPv4 接続

torne mobileアプリから自宅nasneへ直接接続する機能があるが、機能するか?

アプリから nasne 設定を開くと「通信モード」が表示される。これがNATの状況っぽい? これまでの PPPoE だと通信モードA だった。

IPoE/DS-Lite だとにした直後は通信モード Cで、視聴不可だったが、同一ネットワークから一度つないだら通信モードBになって見れるようになった。

DS-Lite の挙動の理解

おおざっぱにいうと

  • 家庭内のルーター(B4)で IPv4 パケットを IPv6 にカプセル化 (IP IP tunnel)
  • IPv4 ネットワーク接続点 (AFTR) でカプセル化を解き、アドレス変換 (NAT) をして外にアクセスする

だけ。

細かいところで疑問点があったので RFC6333 を見てみた

AFTRのNATの挙動

RFC6333 の B.1.2. Translation Details あたりにAFTR のNATとしての挙動が書いてある。

  • B4 は IPv4 パケットを、AFTR 向け IPv6 パケットにする
  • AFTR は IPv6 パケットから IPv4 パケットをとりだす
  • AFTR はB4グローバルIPv6アドレス・プライベートIPv4アドレスと、グローバルIPv4アドレス・ポートなどをマッピングする
  • AFTR はパケットのIPv4ヘッダを書きかえて IPv4 ネットワークで送信する
  • AFTR はやってくるパケットの宛先グローバルIPアドレス・ポートをもとに、マッピングテーブルから送信すべき B4 IPv6 アドレス・プライベートIPv4アドレスなどを得る
  • AFTR はパケットのIPv4ヘッダを書きかえて、IPv6 パケットにして B4 へ送信する
  • B4 は IPv6 パケットから IPv4 パケットをとりだす
  • B4 は IPv4 パケットを LAN に送信する

NATテーブルは例は RFC6333に書いてあるので引用しておく。結局一番知りたいのはこれだった。

        +------------------------------------+--------------------+
        |         Softwire-Id/IPv4/Prot/Port | IPv4/Prot/Port     |
        +------------------------------------+--------------------+
        | 2001:db8:0:1::1/10.0.0.1/TCP/10000 | 192.0.2.1/TCP/5000 |
        +------------------------------------+--------------------+

            Dual-Stack Lite Carrier-Grade NAT Translation Table

B4側のプライベートIPv4アドレスは勝手に決めていいのか

だいたいいいけど、 DS-Lite では 192.0.0.0/29 が予約されているので、ルーターのLAN側のDHCPでこのレンジが払出されないようにしないとまずいっぽい。

DS-Lite ルーターがデフォルトで 192.168.10.0/24 とかになっているのはこのへんの事情なんだろう。

2018年 07月 02日

おうちハックで必要なこと

  • 既存のインターフェイスを妨げない
    • 今まで使えるものはそのままにする。アクチュエーターが既存の操作の邪魔をしないこと
    • 「生活」に持ちこむ学習コストを最小限にする。少しずつ便利にする
  • 必要ないならインターフェイスを変えない
    • 今までと似た体験にする。アフォーダンス (形の意味) を変えない
    • 必要がないならインターフェイスを追加しない (ゼロクリックを動くことを目指す)
  • それ手でやればよくない?
    • 意味がないことを自動化しても意味がない。家族にも便利であること

インターフェイスの罠としては「定期的に音声で通知する」みたいなのは意外と使えない。というのも、人間だんだん慣れてきて、同じ音が定期的に鳴っていても聞こえなくなるため。視覚に訴えるほうがいいのかも?

2018年 06月 19日

Lightroom 用ハードウェアの自作

mbed USBMIDI で Lightroom 用の MIDI インターフェイスを作る | tech - 氾濫原 の続きで、実際に使えるものを作りました。まぁもう作ったの一ヶ月ぐらい前なんですが……

回路図

機械式インクリメンタルロータリーエンコーダー (スイッチ付き)を19個、Gateron 緑軸スイッチ (Cherry MX 互換スイッチ) 7 個を使います。ロータリーエンコーダーはA相・B相・スイッチと3接点あるので 19 * 3 + 7 = 64 接点あります。キリのいい数字ですね。

ロータリーエンコーダーのA相・B相も単にスイッチとみなせるので、ダイオードを使ったキーマトリクスを構成し、16bit I2C GPIO (MCP23017) 1つを使って順次全て読み出します。その際、同一エンコーダーのA相B相は同時に読めるようにマトリクスの配線に注意します。

USB を繋げるメインのマイコンは LPC11U35 です。

基板

上段にある8個のエンコーダーは色別の色相・輝度・彩度に対応することを想定しています。その上にある3つのスイッチはレイヤー切り替えを想定して、エンコーダーの数を仮想的に3倍に増やしています。

かなり配線が面倒ですが、この回路では特にシビアなところはなく、繋がってさえいれば動くと思われるので FreeRouter で自動配線したものをほとんどそのまま使っています。ジャンパとして配線しやすいように、via の位置を多少変更したぐらいです。

切削で基板を作る都合上、片面基板+ジャンパとしたいため、FreeRouter 上ではtopのコストを100ぐらいに設定しています。なので、かなり無理に遠まわりしている配線が多々あります。それでもジャンパは34個ぐらいあるので面倒ですね。

製造は CNC 切削です。6時間ぐらいかかりました。

ファームウェア

基本は I2C GPIO のキーマトリクスを読むだけですが、ロータリーエンコーダーのデコード処理が入っています。

とても安いタイプのロータリーエンコーダーを使っているのですが、どうも挙動がおかしくて綺麗に相を得られないことがあります。これで困った結果、以下のようなロジックになっています。

  • エンコーダー1クリックで4パルス発生するので、相対値として LR に送るときに 1/4 する
  • 相が綺麗に発生しないので、不正なステートになったら「前回の値」が繰替えされているとみなす

これで割とうまくいったように思います。しかし完全に不良品みたいな、正相と逆相が常に対応して発生するエンコーダもあって、安物は厳しいですね。こういうのは捨てるしかない。ロータリーエンコーダーはちゃんとしたのを買ったほうがいいことは分かってるつもりなんですが、ちゃんとしたのはやはり高いですね。

ケース

基板設計時から Fusion360 でモデリングしつつすすめていたので、KiCAD 側から再度基板データを出力して Fusion360 でインポートし、ケース設計に役立てました。

モデルは 3D プリンタで出力しました。下側は一発でいい感じにできたのですが、上側がなかなかうまくいかず3回ほど出力しなおしています。

コスト概算

安く作ることではなく欲しいものを作るのが目的なので、あまりコストは大事ではありませんが以下の通りかかります。

  • ロータリーエンコーダー 19個
    • 単価42円
  • スイッチ 7個
    • 単価35円
  • MCP23017
    • 110円
  • 生基板 250x150
    • 500円
  • LED 3個
    • 単価15円
  • キーキャップ7個
    • 単価70円
  • フィラメント 200g
    • 600円
  • M3 15mm ビス
  • M3 ナット
2018年 06月 08日

オペアンプ大全、無料ダウンロードできるようになってた!!!

オペアンプ大全は2002年〜2003年ぐらいにアナログデバイセズによって書かれた本の日本語翻訳版で、ものすごい分量がある本。たぶんオペアンプ関係で一番まとまってる本だと思う。

で、とりあえず本題だけど今はAnalog Devicesのサイトで無料で PDF がダウンロードできる。(ただし個人情報の入力が必要)

OPアンプ大全: オーディオ/ビデオから計測/通信まで (アナログ・テクノロジ・シリーズ) - アナログ・デバイセズ

アナログ・デバイセズ

5.0 / 5.0

アマゾンで買うと13000円ぐらいする本。CQ出版社の電子書籍サービスだと章ごとに買えるけど、やっぱ全巻買うとだいぶ高価な本になる。それがなんとPDFで普通に配布されている…… なんだこれは合法なのかと疑うレベル

2018年 06月 05日

第二種電気工事士 筆記試験

日曜日が試験日だった。近所の大学が試験会場だった。思いのほかたくさん受験者がいてびっくりしてしまった。学生が結構いたかな。工業高校とかの生徒なのかな?


正直いって事前の勉強でいまいちモチベーションが起きなくて、特に絶縁抵抗や接地工事の種類とかが全然覚えられてなかった。ということでそのへんの問題を落としてしまい4問を間違った。1問2点なので、自己採点だと92点(合格点60点)のよう。

で、問題は次の技能試験なので、これはほんとちゃんと予習していかなければならない。技能試験は1ミスで不合格かつ時間制限が厳しいので、かなり不安。実際の工事でも1ミスで事故に繋がるわけだから特別厳しいわけではないとは思うがミスできないってのはかなりプレッシャーになる。

2018年 05月 30日

趣味の電子工作

趣味の電子工作には1つ溝がある

  • 回路を組立てる (製造工程の趣味)
  • 回路を設計する (設計工程の趣味)

で、両方混ざってることもある。設計する人は組立もすることが多い (基板製造・調達実装まで外注できるので、やらない場合もある)。いずれにせよ「てがけたものが動くのは楽しい」が原動力だと思う。

小学生とか中学生の電子工作はだいたい前者で、はんだ付けのスキルを養うみたいな感じ。プラモデルの組立と似てる。キットの組立とかはまさに。綺麗に正確に作れるかという分野で、これはこれで楽しい。

けど製造工程なので、設計工程やってる人からマウンティングされることがある。ほっとけやという感じだけど、意図としては「他人が考えたもの製造して何が楽しいの?」といったところだろう。まぁ楽しいものは楽しいんだけど。お前はジグソーパズルって何が楽しいの?とか言うのか? みたいな。特定の誰かを思い浮かべていってるわけではありません。


回路設計にも幅があるけど (大きくわけてアナログかデジタルかとか)、製造とはまるで使う頭が変わるので、同じ「趣味は電子工作」でもやってることが全然違ってくる。こっちは限られたリソースの中でやりたいことを実現するベストの組合せは何か?という感じ。プログラミングに似てる。どこまで電子工学を理解して、目的にあわせてどんな回路を採用するか、みたいなスキルなので、そういう引き出しが多くなると楽しくなる。


まぁとにかく「趣味で電子工作やってます!」には結構幅があって油断できない。

2018年 05月 25日

日記に楽譜を表示できるようにした。

日記に楽譜を表示できるようにした。

この日記ははてな記法で書いてるので、super pre 記法でABC記譜法を書くと、該当箇所を abcjs でレンダリングしなおすという実装にした。

MathJax のようにサーバサイドでSVG変換して埋め込むようにしたいけど、すぐできることではなくて面倒なので、今のところクライアントサイドでやっている。

abcjs のデモページで書いてからコピペするのがよさそう。意外と対応してない記法とかもある。

abcjs で大譜表

以下のようにするとピアノ用の大譜表にできる。

M:4/4
L:1/4
K:C
K:
%%staves {1 2}
V:1 treble
!1!CDEF | EDCz | EFGA | GFEz
V:2 bass
!5!!1![G,C,]2 [G,C,]2 | [G,C,]2 [G,C,]2 | [G,C,]2 [G,C,]2  [G,C,]2 [G,C,]2

こんな感じにする。 V:1 treble と V:2 bass でそれぞれト音記号・ヘ音記号になる。%%staves {1 2} で2つをまとめる。

指番号は !0! のように指定できる。けど abcjs だとあんまり見やすくないかな。

M:4/4
L:1/4
K:C
K:
%%staves {1 2}
V:1 treble
!1!CDEF | EDCz | EFGA | GFEz
V:2 bass
!5!!1![G,C,]2 [G,C,]2 | [G,C,]2 [G,C,]2 | [G,C,]2 [G,C,]2  [G,C,]2 [G,C,]2