Android端末の通知で光る富豪的BLEスカート作った

意味の分からないタイトルですが、タイトル通りです。 NeoPixelを搭載したスカートと、Raspberry Pi Zero、それとAndroid端末で、Android端末に届いた通知に応じて光るスカートを作りました。

動機

www.makuake.com こういうのを見てドール用にも欲しいなと思いました。

やってみた

ただ光らせるだけじゃ面白くないし、かと言って本家の機能と被っても面白く無いのでいつでもすぐそばにいてくれるドール的には同じいつでもそばにある携帯と、そこに届く通知によってなんかできないかと思いました。

Android端末の通知にはテーマカラーが設定できます。実際に使われている中では、Twitter公式が青だったりSoundCloudがオレンジだったりしますが、アイコンの背景の色と同じだと思います。そんなわけでそこから色を持ってきて、NeoPixelをその色で光らせるようにしました。

実ははじめ、BLE Nanoを使ってやろうとしていたのですが、どうしてもBLEが有効な状態でNeoPixelを点灯させることができず諦めてそこらに転がってたRaspberry Pi Zeroを使うことにしました。とても富豪的。まあそれでも$5で買えるし気にしない方向で……

USB接続のBluetoothドングルを変換アダプタ経由で繋いで使っています。サイズが大きくなってしまいましたがしょうがない。

RasPiの中では、Node.jsとBlenoを使ってBLEを待ち受けし、Pythonのコードを呼び出してGPIOを操作するという超残念仕様。PythonでBLE Peripheralとして動作できるライブラリがあればよかったのに。

Android端末側ではNotificationListenerServiceを利用して通知バーの変更を監視し、変更があった場合通知のカラーをRaspberry Pi Zeroに送信するという実装にしました。

動いてるところ↓

ESP-WROOM-02とWS2812

やってみようと思ったけどサンプル動かすまでに結構時間がかかりました。以下雑な自分用メモ

使ったもの

ハマリポイント

  • 電源足りない
  • ピンが固定されて指定したものと違うことがある

こうしたら動いた

NeoPixelBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod> strip(PixelCount, PixelPin);

としてpin02につなぐ 電源のほうは別に取る

YesodアプリをDockerのコンテナでうごかす

Yesodで書いたWebアプリをDockerのコンテナとしていい感じにデプロイできないんかなあと思って調べてたらちょっと良さそうな方法が見つかった(たぶんいまさら)ので自分用メモ。

参考:

Yesod hosting with Docker and Kubernetes

stack.yaml

docker:
    enable: true
image:
    container:
        name: user/container-name
        base: fpco/stack-run
        add:
            config: /config
            static: /static

こんな感じでstack dockerを有効にしたりイメージ化するときのベースイメージやら名前やらを設定して、stack image containerでほぼ自動的にDocker用のイメージを作ってくれました。 あとはこれを煮るなり焼くなりで大丈夫でした。

書いてから気づいたけど参考のURLのとおりやっただけですね。すばらしくべんりですし、この後kubernetes用のファイルも書いてkubernetes上で動かすことも簡単にできました。 めでたし。

HaskellでPasoriをたたいてみる

結構前にやってみたのですが、放置気味だったのでとりあえずメモ。

libpafeというlibpasoriから派生したPasoriを叩くためのライブラリ(結構古いっぽい)があったので、それのHaskellラッパーを書いてみました。

github.com

Hackageに0.1.0.0が上がっています。0.1.1.0をその内あげたい。

hsc2hsを使ってバインディングをしただけです。とりあえずお手軽に叩いてお手軽に動かすことができたのですが、

  • 型が守ってくれないつらい
  • ここでちゃんと型を定義しないと全部死ぬ

というのが印象的でした。まあ仕方ないかんが。 cabal runしてセグフォとか結構新鮮でした。

あとHackageにパッケージを上げたのも初めてだったんですが、登録した時期が結構前でまだ自動でアップロード権限が付与されてない時期だったので泣きながらメールしました。 完全に意味が伝わらなさそうな英語メールに対応してくださった管理者の方ありがとうございます。本当に助かりました。

Cabal+FFIでビルド時にハマった(とってもしょーもない話)

ハマった。 いまPasori用のライブラリであるlibpafeをHaskellから使えるようにラッパーを書いているのですが、ドはまりしました。 最初リンクに失敗しまくって涙目になっていたので、先人の知恵を借りようということでtanakhさんのhsmecabを参考にしながら書いていました。

github.com

  extra-libraries:  

という項目に外部のライブラリ名を書くことで簡単に使えるっぽいのですが、

  extra-libraries:  mecab

と同じノリで

  extra-libraries:  libpafe

と書いてもうまく動作しません。

そういえばmecabはlibmecabというファイル名でした。 liblibpafeなんて名前のものを探していることに気がつくまで30分くらいかかった…… 正解は

  extra-libraries:  pafe

だったようです。

github.com

(いまさら)個人用Redmineを導入した

これまでやりたいこと、買いたいものやらもろもろを全部Onenoteで管理するとかいうことをやってたのだけれど、いい加減限界がきたのでRedmineを自宅のサーバに導入しました。
最初WindowsServerに直にインストールしようとしたのだけれど、非公開のGitリポジトリでやってるもろもろに対する管理もRedmineに統一しようと思った時に色々面倒だったので、同サーバ上のHyper-VDebianを入れてその上に導入しました。
現状部屋を片付けるとか割とどうでもいいものばかり入ってるけど意外といい感じで進捗管理できそう。やりたいことのネタ帳だけではなくそれを実際にやり始めた時にプロジェクトを追加する形で進捗管理できるのもいいなあと。

あと、MacのTimemachineを保存する先にWindowsServerでSMBな共有フォルダを指定してたのですが、すぐぶっ壊れてくれるのでHyper-V上で割りと適当な感じにNetatalkを使ってAFP共有フォルダ作ってやるようにしました。
勝手にマウントしてバックアップとってくれるのは便利。

よりよいハトクラモナド

この記事はHaskellAdventCalendarの記事から派生したスピンアウト記事です。 ハトクラモナドの記事を上げたらちゅーんさんから愛のマサカリこっちのほうがいいのではって提案を頂いたので、それを踏まえてまだたりないものが何かを考えてみたり、自分でちょっとわからなかったことを聞いたのをメモったりします。

その1:モナドの中身を多相型にするべき?(という名の半分言い訳)

まず、ちゅーんさんの記事でも指摘してもらったとおり、モナドの中身が多相型じゃなくてCoins (=Int)になってます。
僕としてはハトクラに限定するんだったら絞っとかないと「ハトクラのモナドです!」って言い貼れなくなっちゃうのではないかという考えで、多相型ではなくCoinsを入れてしまったのですが、よくよく考えたら実用考えてなかったわ……(元から半分ネタというのは抜きにしても) 実用的には他のMonadインスタンスががそうしているように多相型にすべきでした。

その2:すでにそのフェーズでプレイされたカードが遡れない

ハトクラのカードの中にはその手番ですでに使われたカードに振る舞いが影響されるカードがあります。少なくとも>>=でただ単につなげただけじゃそれを遡ることはできないので、状態に持ってるFieldに持たせるといいのでは(by ちゅーんさん)という話を聞きました。

その3:カードを連結できない状態に陥った後の挙動が若干イケてない

というのも、カードが連結できない状態になったとしても、Left(またはNothing)で後続のカードが無視されるだけで、連結自体はできちゃうという状態になってるというのが問題です。 なんかそうなってくるとモナドの仕組み以外にもなんか色々必要な気がしてきちゃったのですが、どうしましょう。