mattintosh note

Hello Raspberry Pi!

Linux で qaac がさくっと使える Docker コンテナを作った

C93 で CD を色々買ってきたので PC に取り込もうとしたんだけど、新しい PC に qaac の実行環境を作ってなかったので Docker で作れるようにしてみました。

github.com

qaac って何?

(ざっくり言うと)iTunes なしでコマンドラインから AppleAAC/ALAC エンコーダーを使えるようにするもの。

Docker コンテナイメージを作成する

Docker コンテナを作る前に qaac のセットアップが必要です。(コンテナ内で qaac のセットアップをしようと思ったのですが、セットアップ用のパッケージを入れるとイメージサイズが大きくなるのでホスト側で作成することにしました)

$ git clone https://github.com/mattintosh4/docker-qaac64
$ cd docker-qaac64
$ ./qaac_builder.sh

イメージを作成します。qaac は Wine 経由で実行するようになっているため、Wine のセットアップに多少時間がかかります。Wine は Ubuntuリポジトリではなく WineHQ のリポジトリを使うようになっています。(後日、時間が出来たら依存関係の数を減らす予定)

$ docker build -t qaac64 .

qaac は GitHubAPI から常に最新版の情報を取得するので最新版が落ちてきます。

iTunes のバージョンは 12.7.2 ですが、Apple の配信が終了すると使えなくなる可能性があります。その場合、iTunes64Setup.exe をブラウザでダウンロードし、qaac_builder.sh と同じディレクトリに置いて iTunes64Setup.exe.sha1 を更新してもらえらば好きなバージョンが使えます。

$ sha1sum iTunes64Setup.exe > iTunes64Setup.exe.sha1

qaac64.exe を使う

docker images でイメージが作成されていることを確認します。

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
qaac64                    latest              c6e8b5ada977        6 hours ago         985 MB
ubuntu                    xenial              00fd29ccc6f1        2 weeks ago         111 MB

コンテナ内で qaac を使ってエンコードをするわけですが、肝心のオーディオファイルはホスト側にあるので Docker のボリューム機能を使ってコンテナ内にホストのディレクトリをマウントさせる必要があります。

基本的な書式は下記の通りです。作業用ディレクトリ等を作成せずに使う場合はパスにスペースが混入する可能性があるので $PWD 部分を "$PWD" としておいた方が安全かもしれません。--rm を忘れるとエンコードの度にコンテナが増えていくので気をつけましょう。 (WINEPREFIX をイメージを作成する際に実行していたのですが、何故かそのあと qaac64.exe を実行するとアクセス出来ないというエラーになってしまうため毎回 WINEPREFIX の作成に数秒かかります)

docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe

以下、カレントディレクトリに BIN や CUE ファイルがある場合の例です。BIN は cdrdao で抽出した状態のもので、フォーマットは s16b になります。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 cdda.bin

CUE シートを使う場合はオプションに --text-codepage 65001UTF-8の場合)を追加します。--fname-format 等でアーティスト、アルバム名の指定ができます。詳しくは qaac のヘルプを読んでください。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 --text-codepage 65001 cdda.cue

毎回 docker run と書くのが面倒な場合

~/.bashrc などに関数を書いておくとよいです。

qaac64(){ docker run --rm -v "$PWD":/mnt qaac64 wine qaac64.exe "$@"; }

qaac の準備が面倒くさいのでスクリプト化した

LinuxiTunesAAC/ALAC エンコーダーを使うために WINE 経由で qaac を使うんだけど、qaac の準備がめんどくさかったのでスクリプト化した。

Linux で qaac を使う方法は過去記事参照。

mattintosh.hatenablog.com

qaac のバージョンは執筆時点では 2.64。引数に WindowsiTunes 64-bit 版のインストーラーを指定すればいいだけにしてある。

2.64 固定番と最新版の2種類がある。git ls-remote で最新のタグを拾おうかと思ったけど、GitHubAPI で最新版の名前と URL が取得できたので jq で済ますことにした。

  • p7zip、curl が必要。latest の場合は jq も必要。
  • 2.64 固定番で qaac のバージョンを上げたければ QAAC_VERSIONQAAC_SHA1SUM を変更する。

■ 2.64 固定版

$ git clone https://gist.github.com/mattintosh4/d5116168d0743d437ea1150cf11588d7 qaac_builder
$ cd qaac_builder
$ bash qaac_builder_2.64.sh ~/Downloads/iTunes64Setup.exe

■ 最新版

$ git clone https://gist.github.com/mattintosh4/d5116168d0743d437ea1150cf11588d7 qaac_builder
$ cd qaac_builder
$ bash qaac_builder_latest.sh ~/Downloads/iTunes64Setup.exe

WINE で qaac64.exe を実行してエラーが出なければOK。

$ wine qaac_2.64/qaac64.exe --check
qaac 2.64, CoreAudioToolbox 7.10.9.0
libsoxconvolver 0.1.0
libsoxr-0.1.3b1

Docker イメージでも作るかな…。

■ 2.64 固定版スクリプト

■ 最新版スクリプト

なお、最新版の JSONhttps://api.github.com/repos/nu774/qaac/releases/latest で取得することができる。

{
  "url": "https://api.github.com/repos/nu774/qaac/releases/6441962",
  "assets_url": "https://api.github.com/repos/nu774/qaac/releases/6441962/assets",
  "upload_url": "https://uploads.github.com/repos/nu774/qaac/releases/6441962/assets{?name,label}",
  "html_url": "https://github.com/nu774/qaac/releases/tag/v2.64",
  "id": 6441962,
  "tag_name": "v2.64",
  "target_commitish": "master",
  "name": "v2.64",
  "draft": false,
  "author": {
    "login": "nu774",
    "id": 489444,
    "avatar_url": "https://avatars3.githubusercontent.com/u/489444?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/nu774",
    "html_url": "https://github.com/nu774",
    "followers_url": "https://api.github.com/users/nu774/followers",
    "following_url": "https://api.github.com/users/nu774/following{/other_user}",
    "gists_url": "https://api.github.com/users/nu774/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/nu774/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/nu774/subscriptions",
    "organizations_url": "https://api.github.com/users/nu774/orgs",
    "repos_url": "https://api.github.com/users/nu774/repos",
    "events_url": "https://api.github.com/users/nu774/events{/privacy}",
    "received_events_url": "https://api.github.com/users/nu774/received_events",
    "type": "User",
    "site_admin": false
  },
  "prerelease": false,
  "created_at": "2017-05-19T12:21:05Z",
  "published_at": "2017-05-19T12:29:11Z",
  "assets": [
    {
      "url": "https://api.github.com/repos/nu774/qaac/releases/assets/3912283",
      "id": 3912283,
      "name": "qaac_2.64.zip",
      "label": null,
      "uploader": {
        "login": "nu774",
        "id": 489444,
        "avatar_url": "https://avatars3.githubusercontent.com/u/489444?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nu774",
        "html_url": "https://github.com/nu774",
        "followers_url": "https://api.github.com/users/nu774/followers",
        "following_url": "https://api.github.com/users/nu774/following{/other_user}",
        "gists_url": "https://api.github.com/users/nu774/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/nu774/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/nu774/subscriptions",
        "organizations_url": "https://api.github.com/users/nu774/orgs",
        "repos_url": "https://api.github.com/users/nu774/repos",
        "events_url": "https://api.github.com/users/nu774/events{/privacy}",
        "received_events_url": "https://api.github.com/users/nu774/received_events",
        "type": "User",
        "site_admin": false
      },
      "content_type": "application/x-zip-compressed",
      "state": "uploaded",
      "size": 3055646,
      "download_count": 2190,
      "created_at": "2017-05-19T12:28:48Z",
      "updated_at": "2017-05-19T12:29:09Z",
      "browser_download_url": "https://github.com/nu774/qaac/releases/download/v2.64/qaac_2.64.zip"
    }
  ],
  "tarball_url": "https://api.github.com/repos/nu774/qaac/tarball/v2.64",
  "zipball_url": "https://api.github.com/repos/nu774/qaac/zipball/v2.64",
  "body": "Fixed regression of 2.63: HE-AAC frames were incorrectly multiplexed."
}

Mac や Linux でコミケカタログROM版は使えるのか?

だいぶ前から「Mac で Nihonshu や EasyWine.app でコミケカタログは見れるのか?」というお題を立てていましたが、C93 で遂に DVD-ROM 版を買いましたので、いざ検証。

まずはイメージ化。

$ dd if=/dev/rdisk3 of=C93.iso bs=64m

イメージをアタッチします。

$ hdiutil attach C93.iso

Wine Explorer で Z:¥Volumes¥CCC93 を開きます。いくつか EXE ファイルがありますが、ここでは STARTUP.EXE を実行します。

f:id:mattintosh4:20171230122952p:plain

[インストール]をクリックします。なお、[ディスクから起動]でもカタログは利用可能です。

f:id:mattintosh4:20171230123537p:plain

ここは何も表示されないので[次へ]をクリックします。

f:id:mattintosh4:20171230123746p:plain

インストールを進めていきます。

f:id:mattintosh4:20171230124046p:plain

f:id:mattintosh4:20171230124133p:plain

Mac ではデスクトップショートカットを作成しても使えない(はず)なのでチェックを外してもいいでしょう。

f:id:mattintosh4:20171230124211p:plain

f:id:mattintosh4:20171230124239p:plain

f:id:mattintosh4:20171230124315p:plain

[起動]をクリックします。

f:id:mattintosh4:20171230124410p:plain

[DVDROMカタログを起動する]をクリックします。

f:id:mattintosh4:20171230124500p:plain

情報送信については任意で選択します。

f:id:mattintosh4:20171230124539p:plain

Circle.ms に登録しているメールアドレスとパスワードを入力します。

f:id:mattintosh4:20171230124604p:plain

カタログに付属しているシリアル番号を入力します。

f:id:mattintosh4:20171230124626p:plain

データベースを作成します。

f:id:mattintosh4:20171230124700p:plain

f:id:mattintosh4:20171230124728p:plain

無事に DVDROMカタログが起動しました。

f:id:mattintosh4:20171230124808p:plain

検索やチェックリストの書き出しなども問題なく動きます。

f:id:mattintosh4:20171230124839p:plain

次回からは C:¥Program Files¥コミケット¥カタログブラウザ93¥ccatalog.exe でカタログを開けるようになります。(.desktop ファイルは Linux 向けなので Mac では使用できなかったはずです)

Linux 版の Wine でも同様に問題なく使うことができました。

ここ数回はマップだけ印刷してツイッター見つつフラフラ回る感じでしたが、ROM版めちゃめちゃ便利ですね。2,500円で下調べに必要な時間がかなり短縮されるので非常に助かりました。

C93 も明日で最後ですが皆さん頑張りましょう(*゚∀゚)

Windows 版との差については確認していません。

Raspberry Pi で AC100V を制御する

先日参加した「IoT もくもく会」で SSR(ソリッド・ステート・リレー)の存在を教えていただいたので早速、秋月電子SSR キットを買ってきた。お値段250円。

https://screenshots.firefoxusercontent.com/images/8cd5f241-e88d-4d53-8406-760ff5168f83.png

akizukidenshi.com

この製品はトライアック、フォトトライアック、サージ吸収素子、抵抗、基板がセットになったもの。各部品を別々にも買えるけど多分キットで買ったほうが安い。AC100V 側の穴が M2(か M2.6 だったような気がする)なので M3 の丸型端子を接続するには穴を拡張する必要がありそう。時間なくてそのへんの部品を買いにいけていないのでまた来週末にでも考える。

リレーとして使うので接続は簡単。十数ワットなのでいまのところ放熱板はつけていない。とりあえず Raspberry Pi Zero の GPIO からフォトトライアック側の回路に接続してシェルから操作してみる。

おぉ…感動。

DC12V なら車で扱ってたから平気なんだけど AC100V はちょっと不安。(感電はもちろん発火とか)

で、Google Home を買ったついでに Raspberry Pi に Home Assistant を入れてボタンを作る。Home Assistant の設定はこちらのページが非常に参考になった。

qiita.com

Raspberry Pi で Home Assistant を起動できたら ~/.homeassistant/configuration.yaml にボタンの設定を追加する。

switch:
    platform: command_line
    switches:
        arest_pin_four:
            command_on : "echo 1 >/sys/class/gpio/gpio16/value"
            command_off: "echo 0 >/sys/class/gpio/gpio16/value"
            friendly_name: IKEA の LED ランプ

これで PC でもスマホでもブラウザから操作ができるようになった。

https://screenshots.firefoxusercontent.com/images/91160444-b7cc-4ccc-82ff-c80f8b089471.png

いざ実験。

おぉ…か(ry

Home Assistant は始めて使ったけど、Google Home アプリのようにアクティビティログが残るので「いつ起動した?」っていうのが確認できて便利。

https://screenshots.firefoxusercontent.com/images/d5594eae-aa22-4073-8067-3dfc8e9d03d9.png

https://screenshots.firefoxusercontent.com/images/91eca051-0708-4f1e-a058-0def7476931c.png

あとは Google Home と連携して「ねぇ、Google。居間の電気をつけて」ができれば完璧。

なんだけど時間が無いのでそれはまた今度。

Node-RED から Zabbix にデータを連携する

始める始めると言いつつまだ始めてない FlashAir Lua。Zabbix は Zabbix Sender が無くてもソケット通信ができればデータを送れるのは前に試したときにわかったけど、FlashAir の Lua からソケット通信が出来るかどうかがわからない。とりあえず HTTP で何かするのは出来そうなので Node-RED の勉強がてらインターフェイスを準備しておく。

今回は Docker の node-red-docker を使用。

$ sudo docker run -it -p 1880:1880 --name node-red-alpha nodered/node-red-docker

http://localhost:1880 を開いて Node-RED へ。

https://screenshots.firefoxusercontent.com/images/1da8feef-b58b-4d7e-b84f-e8f8be064180.png

まずは入力になるノードを作成していく。HTTP GET と HTTP POST は両方作る必要はなく、用途に合わせて作成。

入力で HTTP GET ノードを作成。

https://screenshots.firefoxusercontent.com/images/d88d3bbb-9142-4499-a74a-4d180708163f.png

入力に HTTP POST ノードを作成。

https://screenshots.firefoxusercontent.com/images/452224bf-bb5f-457b-a28a-de6d8cd0fa0a.png

中間に JSON ノードを作成。

https://screenshots.firefoxusercontent.com/images/eb706692-1ef6-40f2-bf62-c22f3f5034bd.png

その次に TCP リクエストノードを作成。ポートは Zabbix の待受ポートを指定する。

https://screenshots.firefoxusercontent.com/images/8900e8c9-f675-4371-8590-b58ade174df6.png

一通り出来上がるとこんな感じ。あとはデプロイしておしまい。

https://screenshots.firefoxusercontent.com/images/5274ced3-d902-4246-ab11-fcf49c5321c3.png

テストで GET、POST 両方試してみる。Zabbix に送る JSON はこんな感じ。ホストは raspberrypi-zero、キーは test を作成してある。

{
    "request": "sender data"
,   "data": [
        {
            "host": "raspberrypi-zero"
        ,   "key": "test"
        ,   "value": "0"
        }
    ]
}

まずは GET。data は配列で送る必要がある。$RANDOM はシェルの変数で適当な数値が入る。

curl -g -X GET "http://localhost:1880/get?request=sender+data&data[0][host]=raspberrypi-zero&data[0][key]=test&data[0][value]=${RANDOM}"

次に POST。Content-Type: application/json を忘れずに。

curl -X POST -H 'Content-Type: application/json' --data \
'{
    "request": "sender data"
,   "data": [
        {
            "host": "raspberrypi-zero"
        ,   "key": "test"
        ,   "value": "'${RANDOM}'"
        }
    ]
}' http://localhost:1880/post

いずれも成功すれば Zabbix からメッセージが返ってくる。このメッセージが返ってこなければ TCP リクエストに失敗している可能性がある。また、 processed ではなく failed になってしまう場合は host や key が間違っていたり、JSON の内容が間違っている可能性がある。

ZBXDZ{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000064"}

Zabbix のダッシュボードでデータを確認してみる。

https://screenshots.firefoxusercontent.com/images/e3b3106f-0d5f-4bc1-a6b4-24f0eb74c1a1.png

Node-RED はデータを視覚的に繋げられて、モニタリングやデバッグがもできるので面白い。