2016年 10月 27日

IFTTT の通知チャンネルに LINE が増えたので家庭内BOTを作った

家庭内 Slack とかやってる人は結構いますね。羨しいなと思ってましたが、うちの妻は英語と技術的なことがさっぱりわからないので Slack ですら敷居が高く、インストールしたり説明 (チャンネルの概念とか、それがどういうノリで機能するかとか……) するのもめんどうなので家庭内チャットボットみたいなのは全くやる気がしなかったわけですね。Slack って英語だったけ?と思うかもしれませんね。普通気にもとめないでしょうが英語なんです。ウェブ系IT企業のノリって一般的じゃないんですよ、知っていましたか。

それはともかく、最近 IFTTT の通知先に LINE が増えたり、LINE への通知の API ができたりしたので、家庭内チャットでワンチャンアルデと思ってちょっと頑張って試すことにしました。

つくった IFTTT レシピ

エリアを抜けたらグループへ通知

帰宅しはじめを自動的に伝えるようにというやつです。

出勤時にエリア近くに入ったときにも通知されることがあってやや難があります。あとなんかちゃんと通知されないこともある。まぁでもこれぐらい曖昧なぐらいが位置トラッキングではちょうどいいのではないか……

どちらかというと、定時になっても会社にいるとき30分ごとに通知とかのほうがいいかもなあ。IFTTT ではできなそう。

Dropbox の共有ディレクトリに写真が追加されたら通知

子供の写真を Dropbox で共有してるけど、今まで特に通知する方法がありませんでした。自動的にプッシュされるようになって便利になりました。追加されると LINE に写真もちゃんと表示されたので、基本的に Dropbox 見なくても良いぐらいです。

共有カレンダーに予定が追加されたら通知

これも特に今まで通知する方法がなくて、口頭で伝えるなりこまめにカレンダーをチェックする必要がありましたが、プッシュできるようになりました。良い。

IFTTT 以外の通知

Gmail をパースする系

  • Amazon.co.jp 配達中 通知
  • 佐川配達通知
  • ヤマト配達通知

これらは VPS に置いた gmailnotify.pl (そのうち公開しますが未公開) という自作スクリプトを cron でキックすることで、LINE Notify 経由で通知するようにしたもの。Gmail に OAuth + IMAP でアクセスして、必要なメールを検索してパースしています。

アマゾン通知はいいんですが、妻へのプレゼントをアマゾンで買えなくなるという罠があります。

アマゾンに登録している住所とヤマトに登録している住所が微妙に違うせいか、アマゾンからの荷物に対してはヤマトの配達通知がこない状態なので、通知が重複することはありません。

キーワード反応

LINE Notify と IFTTT だけでも簡単な割にはまあまあ便利ですが、LINE Notify だと誰かの発言をひろって反応するみたいなのは不可能なので、そこらへんだけ Messaging API でやってみることにしました。いちばんチャットボットって感じのトコです。

全体のアーキテクチャ

VPS で Webhook を受けていますが、実際には家庭内サーバ (Raspberry Pi) で応答を生成したいので、以下のように若干ややこしいことをしています。

  • VPS 上のサーバは WebSocket で待ち受けている
  • 家庭内にある Raspberry Pi から VPS 上の WebSocket で繋ぎにいく
  • VPS 上のサーバは LINE から Webhook を受けとったら接続済みの WebSocket にイベントをそのまま送る
  • 家庭内にある Raspberry Pi がイベントを処理し、リプライを送るように WebSocket 経由で通信する。

なぜこんなことをしているかというと

  • 経路を暗号化したい (websocket のサーバも h2o の裏にいて、https / wss での通信になっています)
  • DDNS とかを使いたくない

からです。WebSocket は接続時のヘッダで認証をかけています。

なお特定グループの発言にだけ応答するようになっています。

エアコンのオン/オフ

IrKit を設置しているので、それのAPIを呼びます。

IrKit に関してはウェブサービス経由でもAPIを呼べるので、VPS 経由から直接叩けますが、うちでは上記のように家庭内の Raspberry Pi でメッセージを処理するようにしてあるので、直接呼んでます。

なんとなくテンプレートメッセージでやってみました。ボタンをタップした結果自分の発言として再度発言できる (発言内容が再度 Webhook に通知される) のでチャットボット的には実装が楽です。

自宅の室温

「室温」で自宅の現在の室温をかえします。Raspberry Pi に I2C 接続の温度センサーをつけてます。

単体では実用性ないけど、センサー類は増やしていきたい。エアコンのオンオフするときの目安として使えるかなという意図です。

喋らせる

Raspberry Pi に OpenJTalk を入れて喋るようにしてあるので、これを LINE 経由で呼べるようにしてあります。自宅にいると案外 LINE を見てないことが多いのと、通知がきても無視しがちなので、より強めの通知をかけるという用途です。

まぁ使わない気がします。 意外と面白がって使ってます。。。

その他やりたいこと

おくすり手帳連携

今のところおくすり手帳がデジタル化されてないので難しい。家族の服薬状況とかいちいち把握するのは面倒くさいけど、万が一のときは把握してないと困るので、さくっとBOTから教えてもらえるようにしたい。

災害連携

なんらかの災害情報と連携して、災害時の連絡手段・集合場所を自動的にプッシュさせたい。普段からプッシュしておけば万が一 LINE もろとも使えなくても刷り込みで覚えられないかという感じ。Yahoo からくるメールをトリガにするかとかで考えている。

電気料金の通知

1日のはじまりに前日の電力消費量および概算料金を LINE Notify 経由で通知。節約意識高める用。でもあんま意味ない気もするので保留。

スマートメータから値を読み出したいんだけど、設置場所まで電波が届かないので難儀してる。

クレカ使用通知

インフラ料金系は即座に通知してもよさそう。全部通知するとDMMでエロ動画買ったのが自動でバレるみたいになって辛いのでなにかしらのフィルタが必要。パーサーはあるんだけど、まだやってない。

感想

技術系のノリがわからない人向けだと、技術的にはおもしろいけど微妙な機能つけてもウザがられるだけで辛いので特にプッシュ通知に関しては実用的なことしかできない。

テンプレートメッセージが思ったより面白いので、もうちょっとなんかしたい。

2016年 10月 19日

Autoleveller を使ってリカバリ可能なオートレベリングをする

pcb2gcode のオートレベリングを使ってみる | tech - 氾濫原 というエントリを書いた。この方法は楽なのだけど、リカバリしにくいという欠点がある。

ということで、Autoleveller を使ってみる。

Autoleveller を使ってリカバリ可能なオートレベリングをする

Autoleveller のビルド方法

hg clone https://bitbucket.org/daedelus1982/autoleveller

IntellIJ で autoleveller.iml か pom.xml を開くとプロジェクトが開かれる。
pom.xml を認識するように設定し、maven の依存が解決するまでしばし待つ。

依存が解決すれば com.cncsoftwaretools.autoleveller.Autoleveller の main メソッドを Run することでとりあえず動かしたりデバッグしたりはできる。

jar に固める場合、Cmd-; で Project Structure を開き、Artifact として JAR を追加する。

  • Artifact → JAR → From modules and dependencies...

ここで Main Class に com.cncsoftwaretools.autoleveller.Autoleveller を入力し、JAR files from libraries は extract to the target JAR にしておく (fat JARとする)

これでOKを押す。

Artifact の設定画面で Build on make にチェックをいれておく。

なぜか MANIFEST.MF の場所がおかしい (main/java/META-INF にある) ので、main/resources/META-INF に移動する。

これで make すれば実行可能な jar ができる。MANIFEST.MF が正しくなくても、メインクラスを指定すれば実行はできるのでどっちでもよい。ただ、Finder からダブルクリックしたときにちゃんと起動するようにしたい場合は MANIFEST.MF の設定が必要。

# ちゃんとできてたら動く
java -jar autoleveller.jar

# MANIFEST.MF がうまく設定できない場合
java -cp autoleveller.jar com.cncsoftwaretools.autoleveller.Autoleveller 

使いかた

ここでは

  1. Probe する gcode をつくる
  2. Probe 結果をもとに切削用の gcode をつくる

というステップを踏む。2段階だと面倒だが、こうすることで安全目にパラメータをふって切削すれば、Probe 結果を使いまわして何度か試行錯誤することができる。

Probe する gcode をつくる

切削する gcode を読みこむ。pcb2gcode で作った back.gcode を読みこむ。

自動的に設定が埋まるので、必要なところを変える。Probe Clearance は 0.5〜1、Z Safe Height は 1 とかでいい。無駄に動かすと時間がかかる。Z feed は 50 ぐらいにしておく。

create probe file only にチェックを入れて、Create Levelled Gcode ボタンを押すと、ALProbeback.ngc ができる。

Probe する

ALProbeback.ngc を Machinekit で読みこむ。原点を適当に設定して Touch Off する。Z 座標も Probe して Touch Off したほうが良い。

実行開始すると Probe される。

終わったら、.ini と同じディレクトリに RawProbeLog.txt というのができているので、コピーしてどこかに置いておく。

Probe はまだ付けたままで良い。

Probe 結果をもとに切削用の gcode をつくる


切削する gcode を読みこんだうえで、Browse for Probe Log ボタンから RawProbeLog.txt を選択する。

create probe file only のチェックをはずし、Create Levelled GCode ボタンを押す。これで ALback.ngc ができる。

切削

ALback.ngc を Machinekit に読みこませる。実行開始すると「Probe をつけろ」と言われるので付けて Resume する。これで原点がセットされる。「Probe をはずせ」と言われるので、外して Resume すると切削がはじまる。

やってみたもの

(エントリ冒頭の写真と一緒)

かなり細いラインも切れずに一応再現することができた。ただ、extra-passes が少なすぎるせいでヒゲが多い。とはいえ自力でカッター使えば対応できる範囲なのでやりなおしてはいない。

実装

カッターで修正のうえ部品をのせたもの

注意点

基板を両面テープで固定するとき、しっかり貼り付けること。捨て板の面出しできていればこれだけで±0.1にはおさまるはず。

オートレベリングしたあとは一切基板に手を触れないこと。特に抑えつけたりしないこと。

誤差発生要因

  • Vカッターの先端精度
    • 最小 0.2mm ぐらいだと思ったほうが良い
  • オートレベリングのとき多少基板に食いこむ?
    • 直接接触させているので数μmは食いこむはず…
    • 無視できるレベルかは微妙
  • オートレベリング後の環境変化
    • 接着したときの歪みの戻りなど
    • 切削開始すると基板がエンドミルの影響をうけるので、あらかじめ強く接着するのがとても大事

今のところ、Vカッターは 0.2mm 程度であるとして、pcb2gcode 実行時にoffset=0.1267949192431123 を指定するのでうまくいく感じ。また、extra-passes は最低でも2は必要。でも2だと結構細かい削り残しが多いので、3〜5 ぐらいにはしたい。加工時間がかなり増えてしまうけど、2倍になっても増やす価値はある気がする。

2016年 10月 17日

EOS 5D MarkII や EOS M (初代) での HDMI 出力

要約:これらには ミニHDMI (HDMI Cタイプコネクタ)がついており、HDMI 出力ができる。ただし、この映像は背面液晶に映るものと全く一緒で、それ以上のものではない。

HDMI 経由で Full HD で出せないの?

5D Mark II では出せない。EOS M でも無理。

なお 5D Mark III だとファームウェアアップデートで HDMI 出力が強化されており、非圧縮 YCbCr 422 で出せるようになっている。

そして 5D Mark III はおいそれ買える値段ではない……

Canon デジタル一眼レフカメラ EOS 5D Mark III ボディ EOS5DMK3 - キヤノン

キヤノン

5.0 / 5.0

2016年 10月 13日

さくらのVPSにMondo Rescueのリストアができなかった (未解決)

前々から準備していて、いよいよ新しく契約を追加してリストアするぞ! と思ったらできませんでしたので顛末を記す。敗戦は惨め。

Ubuntu 12.04 で生成

バックアップをとったサーバは大阪リージョン、HDD 100GB メモリ1GB (さくらのVPS(v3) 1G) です。

sudo mondoarchive -O -i -N -d /tmp/backup -s 30g

こんな感じで生成しました。HDD 100GB ですが Used: 12GB です。

$ mondoarchive -v 
mondoarchive v3.2.2-r3578

$ uname -a
Linux stfuawsc.com 3.2.0-88-generic #126-Ubuntu SMP Mon Jul 6 21:33:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

さくらのVPSで復元する

東京リージョン、SSD 30GB、メモリ 1GB プランを申し込みました。お試し期間での操作です。

VPSのコントロールパネルに行き、該当するホストの「OSインストール」から「ISOイメージインストール」を選択します。

公式のサポート情報を見ながら sftp でアップロードします。

元々さくらのVPS 上で mondo のイメージを作っているので旧サーバから直接 sftp しました。だいたい 10MB/s ぐらいでコピーできました (80Mbps)。

$ sftp user@xxxx.sftp.sakura.ad.jp:/iso
$ put /tmp/backup.iso
$ bye

これでインストールを開始します。VirtIO はオンでもオフでも関係ないようでしたので無視します。

このあと、まず Mondo Rescue のブートローダが起動します。nuke とか interactive とか選択できる画面です。まぁ何を入力しても、その後 Linux のブートで死にます。

initrd.img をロードしたあと、スタックトレースと共に Fixing recursive fault but reboot is needed というメッセージがでてしばらく止まり、再起動したあとに再度スタックトレースが出て止まります。

原因を探すために

VNC コンソールだとログが流れてしまって原因がわかりません。スタックトレースの最後だけ表示されてる状態です。これではどうしよもないので以下のようにしました。

ブートオプションにシリアルポートの設定を加えます。

boot: interactive console=ttyS0,115200n8

これで起動直後に VPS の管理画面から「シリアルコンソール (β版)」を起動しておきます。boot ローダが表示されているときにやればよさそうです。これでカーネルメッセージが全てシリアルコンソールのほうに出るようになるので、ログの履歴が辿れるようになります。

原因

以下のようなカーネルパニックでした。ググっても解決しそうな情報がありませんでし た。BUG で明示的に死んでるなのでカーネルに問題がありそうですがよくわかりません……

なおブートオプションに acpi=off とか ramdisk_blocksize=1024 をつけても無駄でした。

[    0.071064] Trying to unpack rootfs image as initramfs...                    
[    0.072286] BUG: unable to handle kernel NULL pointer dereference at 00000000
00000008                                                                        
[    0.074357] IP: [<ffffffff811a4c76>] __mark_inode_dirty+0x186/0x2a0          
[    0.076004] PGD 0                                                            
[    0.076004] Oops: 0002 [#1] SMP                                              
[    0.076004] CPU 0    

露頭に迷う

とりあえず申し込みを即日キャンセルして対策を考えています。

  • Mondo Rescue のカーネルバージョンを変える?
    • Mindi のカーネル? わからない → Mindi は実行中システムのカーネルをデフォルトで使う。システムにまずインストールされていないとカーネルを変えられない
  • そもそも Mondo 使うのをやめてイチからセットアップする?
    • そんな気力はない…

備考:シリアルコンソール(β版)

スクロールするとDOMの内容が全て入れ替わるためコピペが異常にやりにくい…… そして使ってる JS のオブジェクトが関数スコープで閉じているので Developer Console からも手が出せずめんどうくさい。

備考:さくらのVPSのVNCが繋げないとき

ISO インストール前に管理画面を一旦リロードしないと、VNC がちゃんと開けない。

正確にはマシンの強制停止をしたあと、リロードしたあと再度起動させると VNC が開けない? っぽい。よくわからんけど小まめにリロードしたほうが安心。これだから SAP は……

2016年 10月 10日

Fusion 360 の練習 - 神明鳥居


鳥居の中だと最も単純な形だけど、柱に少しだけ傾斜(転び)がついているので、モデリングするときに若干面倒くさい。

何気なく見ていたけど、笠木が思ったより長いなと思った。

伊勢鳥居は笠木が五角形だけどモデリングしたのは丸いもの。

鳥居の図面以下の書籍を参照した。

神社仏閣図集(1) [神社建築編1] - 建築資料研究社

建築資料研究社

5.0 / 5.0

2016年 10月 08日

BeagleBone Black の LED をはんだゴテなしで延長する

BBB には USER LED という青色 LED が基板上4つあって、デフォルトではフラッシュアクセス時に点灯するような設定になっています。基板上にあってすぐ使えるので便利です。

ただ、この USER LED のロジックピンはピンヘッダに出ていないため、USER LED をそのまま基板の外に表示させておきたいなんて場合には少々やっかいです。

ということで表題のようなことをやってみました。

基板につけるアダプタをつくる

こんな感じのを作ります

裏から見るとこう

CAM です。φ0.8 のエンドミルで加工しました。

どうつけるか? こうつけます。

いい感じにする

アダプタには4つ、φ1mm の穴があいています。ここに適当なφ1 の光ファイバーを挿しこみむとこうなります。

可愛い感じに延長できました。T=2mm の白のプラ版なので結構透けてますが、思ったより隣に影響を与えることなく分離できました。

ZenFone 3 がきた

ZenFone 2 に Marshmallow アップデートがこないまま ZenFone 3 が発売されてしまった。ヨドバシで予約してちゃんと発売日に到着しました。

国内価格が台湾価格より結構高いんですが、台湾版がちゃんと国内で技適適用になるのかよくわからんので普通に国内発売を待って買いました (技適厨なんで…)

国内版の認証画面を表示させたところですが、日本以外の認証マークは表示されてません。台湾版はハードは一緒みたいですが、技適マークが表示されないんじゃないかという気がしますね。

今のところの感想

  • パフォーマンスは明確に上がったことを実感できる
    • 特に写真・動画はとても高速になったと感じる
    • Pokemon Go もスムーズになった (最近やってないけど)
  • デザインがだいぶ良くなった
    • ZenFone 2 はかっこいいとは言えないデザインだったがだいぶ改善された
    • フロントガラスに丸みが追加され・背面がガラス仕上げになったのがいいところ
    • 背面にめっちゃ指紋がつくのは悪いところ
  • 電源ボタンの位置が改善された
    • 改善と思うかは人によると思うけど、自分としては改善
    • ZenFone2 だとポケットに入れるときに頻繁に電源ボタンを誤操作することがあって不満だったところ
  • 指紋認証は便利
  • カメラの画質は値段なり
    • いうほど高画質ではない。ZenFone 2 よりは良い
    • 動画は思ったより綺麗
    • パフォーマンスが改善されてマニュアルモードがかなり使いやすくなった
  • 机に置いておくと掴みにくくなった
    • ZenFone 2 は中央が盛りあがっていたので(これがダサいんだけど)、机に置いておいても掴みやすかった
    • ZenFone 3 だとフラットなので掴みにくい (iPhone とかに近くなった)

充電がいよいよ Type-C になったので、Type-C のケーブルを買う必要がある (1つは付属している)。

2016年 10月 07日

Fusion 360 - HDMI パネルマウントメス

HDMI の図面は割と見易い。けどそもそも図面の見方でわからんことがあって、それを調べる方法がないことに気付いた。基本的な部分 (4-R0.5 とか) はわかるけど、何をどう調べたらいいかわからない表記もある。

2016年 10月 06日

中華製の J-Link OB を使い OpenOCD で nRF51 に書きこむ

ebay で売っていたもの。 J-Link OB と書いてあってかなり怪しい製品。STM32 に J-Link として動くファームが書いてあるっぽいがよくわからない。試した感じは使えることは使えそう。

接続までの基本

ケーブルが色分けされているが赤がGNDで白がVCC(3.3V)だったりするので気をつける。逆挿しされてんのか? と思ったけど、逆挿しできないコネクタだったので、ケーブルの配線が適当なんじゃないか。

試しに BLE Nano と接続してみた。nRF51 なので

openocd -f interface/jlink.cfg -c "transport select swd" -f target/nrf51.cfg

で繋げることができる。

ただし、NRF_POWER->RESET = 1; していると SWD の信号でリセットがかかりまくるっぽいので外しておくこと。

書きこむには

#!/bin/sh

set -x

# SoftDevice を .bin 形式にしておく
arm-none-eabi-objcopy -I ihex -O binary mbed-dev/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/Lib/s130_nrf51822_1_0_0/s130_nrf51_1.0.0_softdevice.hex .build/softdevice.bin

# Softdevice S130 でのアプリケーションスタート位置 リンカの FLASH ORIGIN
STARTADDRESS=0x0001C000

# write softdevice
openocd -f interface/jlink.cfg -c "transport select swd" -c "set WORKAREASIZE 0" -f target/nrf51.cfg -c "init; reset halt; nrf51 mass_erase; sleep 500; flash write_image .build/softdevice.bin 0x0; verify_image .build/softdevice.bin 0x0; mww 0x4001e504 1 ; mww 0x10001000 $STARTADDRESS; mww 0x4001e504 0; reset run; shutdown"

# write application
openocd -f interface/jlink.cfg -c "transport select swd" -c "set WORKAREASIZE 0" -f target/nrf51.cfg -c "program .build/keyboard.bin $STARTADDRESS verify reset exit"

SoftDevice は一回書きこんだら基本的に変えないのでコメントアウトしても良い。

書きこみに時間がかかる。アプリケーション 45KB で 14秒ぐらいかかった。

gdb 使うのはまた今度 (ほんとは gdb したくて ebay で買ってみたんだけど、届くのに時間がかかってる間に熱がさめてしまった)

ref.

↓ の Makefile 使うと簡単に書けそう。結局ここから最低限抜き出した感じになった。program で .elf 書けば一発だろと思ったけど、そんなことはなくてダメだった (たぶん余計な情報があるから?)。

Fusion 360 - RCサーボモータ S03T 2BBMG

これは思いのほか大変だった。。本体部分が途中で微妙に膨らんでいて、なおかつ線が全周に入っているので、それをどうフィーチャにするかで悩んだ。結局側面にスケッチを書いて push/pull したけど、完全に正しいモデルではない感じ。まぁ見た目の問題だけだからいいんだけど……

オフセット平面とか、中立平面とか、3Dでのコンストラクションを使ってフィーチャをミラーするみたいなのに多少は慣れてきた。ヒストリーの編集もだいぶ使っている。ヒストリー編集してるときは後続フィーチャがぶっこわれないかヒヤヒヤする。

図面的に、最初にできるだけ1枚のスケッチに複数平面にわたる全てのジオメトリを書きがち。これだととからオフセットさせてスケッチをコピーみたいなのがやりたくなるけど、スケッチのコピーというのはできないっぽい。コピーではなく、プロジェクト(投影って意味のほう)を使って別のスケッチのジオメトリを新規オフセットスケッチに投影するのが正しいっぽい? やりたいことはこれでできることがわかった。


あと、これとは関係ないけど、コンポーネントのインスタンス化のとき、ユーザパラメータを指定することはできないんだろうか? コンストラクタ引数を渡したいという感じなんだけど…… コンポーネント自体をコピペするしかないんだろうか?