Serverless Webpack の Legacy configuration detected 対応

Serverless Webpack で、古い設定が存在するというメッセージが表示されていたので、対応したメモ。

Serverless: Legacy configuration detected. Consider to use "custom.webpack" as object (see README).

内容が分かりづらいのですが、何らかの項目を custom.webpack 以下に入れろとのこと。

対応

Serverless Webpack の README を眺めると、custom.webpackIncludeModulescustom.webpack.includeModules に移動されていました。 遅くとも 2018/3 には名前が変わっており、参考にした情報が古かったようです。

github.com

変更前:

custom:
  webpackIncludeModules: true
  webpack:
    # ...

以下のように変更したところ、メッセージが表示されなくなりました。

custom:
  webpack:
    includeModules:
      forceExclude:
        - aws-sdk
    # ...

ついでに aws-sdk をビルド対象から除外する

forceExclude オプションで aws-sdk を指定することで、ビルド対象から除外しました。 README に記載がありますが、AWS Lambda では aws-sdk が利用できる状態になっているためです。

https://github.com/serverless-heaven/serverless-webpack#aws-sdk

これによって、自分の環境では、デプロイパッケージのサイズが 9.3 MB から 2.5 MB まで削減できました。

テレビと Brooklyn DAC+ の音飛び対策

我が家では Mytek Digital の Brooklyn DAC+ を D/A コンバーター (以下、DAC) 兼プリアンプとして使用しています。

www.mytekdigital.jp

LG の OLED55B7P というテレビの光デジタル出力から、Brooklyn DAC+ の光デジタル入力端子に接続してテレビを視聴しています。 Brooklyn DAC+ の音質や使い勝手については満足しているのですが、テレビの視聴時に一つ不満があります。

不満なのは、テレビをしばらく (1 時間以上) 使っていると、音飛びが不定期に発生するところです。

この現象ですが、結論から書くと、一応解決できました。 解決するまで試したことを長々と書きますので、対策を知りたい方は下までスクロールしてください。

まず、サポートに問い合わせる前に、2 つのことを試しました。

光デジタルケーブルを別のものに変えてみる → 効果なし

昔買った 1000 円ぐらいの光デジタルケーブルを使っていたので、ケーブルの品質が悪かったり、劣化しているのかな、と予想しました。 そこで、AUDIOTRAK の GLASSBLACK2PLUS という、そこそこの価格で評判の良いケーブルに変えてみました。

www.wisetech.co.jp

しかし、効果はありませんでした。

光デジタルを同軸デジタルに変換してみる → 効果なし

オーディオテクニカの AT-HDSL1 という製品を使用し、光デジタルを同軸デジタルに変換して、DAC の同軸デジタル入力端子に信号を入力して試しました。

www.audio-technica.co.jp

構成を簡単に図にすると以下になります。

[テレビ] <-- 光デジタルケーブル --> [コンバーター] <-- 同軸デジタルケーブル --> [DAC]

信号の変換が行われることで何かしらの変化が起こるのではないか、というのと、値段が安かったので試しやすかった、というのがあります。

あとで判明するのですが、この製品は信号を中継するだけのようで、効果はありませんでした。

サポートに問い合わせた

ここで輸入代理店のサポートに問い合わせを行いました。 これまで試した内容と、他のプリメインアンプ (Marantz の PM7005 や、逢瀬の WATERFALL Integrated 250) では音飛びは発生していない旨を記載しました。

問い合わせに対しての回答を要約すると以下の通りです。

  • テレビの光デジタル出力のジッターが、Brooklyn DAC+ の光デジタル入力のジッター量の許容度を超えてしまう
    • その際に接続が切れて、再接続すると、音が途切れる現象が発生する
  • ジッター除去機能を持つ D/D コンバーター (DDC) を使用すると改善されるかも
  • 光デジタルを同軸デジタルに変換する AT-HDSL1 も、デジタル出力のジッター量を引き継いだ状態で出力すると思われる

ジッターというのは正直なところ体感したことがなく、ノイズが入ったり音のリズムが変な感じになるのかな、と思っていましたが、音が途切れるレベルとは。 テレビの光デジタル出力の品質がよほど悪いということなのでしょうか。

次に、ジッター除去機能を持つ DDC を探してみました。

デジタル信号を改善するアクセサリーを試す → 効果なし

DDC に何万円もつぎ込むのはちょっと気がひけるので、iFi audio の SPDIF iPurifier という、アクセサリーでよく目にするメーカーのそこそこの値段の製品を購入してみました。

ifi-audio.jp

製品ページにはデジタル信号を改善する、と書かれているものの、ジッター除去とは明記されていないので、ちょっと失敗したかもしれませんが... 一応、パッケージに Eliminate Jitter と書かれていました。

期待していたのですが、効果はありませんでした。 この製品は、同軸デジタル/光デジタル両方で出力できますが、いずれも結果は同様でした。

Brooklyn DAC+ のクロックの同期を Input (スレーブ) から 48 kHz (マスター) に変更してみる → 効果あり

諦め気味でしたが、Brooklyn DAC+ の設定をいじることで何か改善できないか試してみました。

「Sync」という、クロックの同期についての設定があります。初期設定では「IN (Input)」となっています。 これは、テレビのクロックがマスターとなり、Brooklyn DAC+ がスレーブになる、という認識です。

「IN」以外に「44.1 kHz - 192 kHz」を選択できます。これらは、Brooklyn DAC+ のクロックがマスターとなります。 そこで、光デジタル出力のサンプリングレートである「48 kHz」に設定してみました。

この設定で数日使用していますが、一度も音飛びは起きていません

素人考えですが、ジッターがひどくクロックの同期が切れると、音が途切れてしまう。Brooklyn DAC+ でクロックを固定することでそれを回避しているのでは、と予想しています (自分でも何を言っているか分からない)

原因はよく分かりませんが、自分のケースでは効果があったと言えます。

疑問点

いくつか疑問点が出てきました。

  • 手持ちの他の DAC では音飛びは発生しないのに、なぜ Brooklyn DAC+ では発生するのか?
    • 品質の悪い入力は相手にしていない?
    • 他の DAC のクロックがマスターになっていた?
  • しばらく (1 時間以上) 使用すると発生するのはなぜなのか?
    • 正確に時間を計測していないので、ただの偶然かもしれない
    • テレビ内部の温度の上昇によって音声出力に影響する?

技術的な理解ができるようになりたいな、と思いました。

終わりに

今回は解決しましたが、将来 DAC を買い換える際に、テレビとの相性を心配することになりそうです。

また、専門的な知識があるわけではないので、誤りなどありましたら、コメントをいただけると幸いです。

Load Average を表示する tmux-loadavg を (昔) 作った

2 年前のことですが、Load Average を表示する tmux プラグインを作っていました。

github.com

過去 1 分間の Load Average を表示するだけのものです。Linux と macOS に対応しています。

以前は .tmux.conf の中でプラットフォームで分岐して Load Average を取得していたのですが、プラグインにすると便利では、ということでプラグインにしました。

使い方

Load Average を表示したい箇所で cpu_loadavg を参照してください。 以下は Tmux Plugin Manager と組み合わせた例です。

set -g status-right "[#(whoami)@#H][#{cpu_loadavg}][%Y/%m/%d(%a)%H:%M]"
set -g @plugin 'chocoby/tmux-loadavg'

以下の画像のように Load Average が表示されます。

f:id:cho_co_by:20190614093220p:plain

よかったら使ってみてください。

参考までに、僕の .tmux.conf はこちらです。

dotfiles/.tmux.conf at master · chocoby/dotfiles · GitHub

Linux については対応していないディストリビューションがあるかもしれません。 CentOS では動作を確認しましたが、動かないものがあれば Issue や Pull Request で教えていただけるとありがたいです。

bcrypt gem が v3.1.13 で bcrypt 2b に対応した

タイトルの通りですが、bcrypt gem が v3.1.13 で bcrypt 2b に対応しました。

github.com

例えば他のシステムでハッシュを生成したなどで、それが 2b の場合は検証に失敗するので、必要な方は Gem をアップデートしましょう。

2b とは何

Wikipedia によると、2b はハッシュアルゴリズムのバージョンで、2014/2 にリリースされた、2019/06 現在最新のバージョンです。

en.wikipedia.org

bcrypt gem の GitHub リポジトリでは 2018/11 ごろに対応していたのですが、Gem として v3.1.13 がリリースされたのが 2019/5 末でした。

github.com

確認してみる

例えば Python の bcrypt ライブラリ は、デフォルトで 2b のハッシュが作成されます。(v3.1.6 で確認)

>>> import bcrypt
>>> bcrypt.hashpw(b'foobar', bcrypt.gensalt())
b'$2b$12$Ib0qlHDq/BCDvu7GzIJtw.uXfK7WZGSS2cNCVbOsa5xfGOcRT7WX.'

これを bcrypt gem で検証してみると...

v3.1.13 からは true が返ります:

[1] pry(main)> BCrypt::Password.new("$2b$12$Ib0qlHDq/BCDvu7GzIJtw.uXfK7WZGSS2cNCVbOsa5xfGOcRT7WX.") == "foobar"
=> true

v3.1.12 以前は false が返ります:

[1] pry(main)> BCrypt::Password.new("$2b$12$Ib0qlHDq/BCDvu7GzIJtw.uXfK7WZGSS2cNCVbOsa5xfGOcRT7WX.") == "foobar"
=> false

(半年前にこれにハマって、対応していないので注意しましょう、という記事を書こうと思っていたら半年経っていました。)

Zwift iOS アプリの使用感メモ

Tacx NEO 2 Smart から Bluetooth でペアリングして、iOS 版の Zwift アプリを使った感じをメモしておきます。 現状ハードな使い方はしておらず、ERG モードで 1 時間程度の低強度のワークアウトをこなしているだけです。

iPad Pro と iPhone XS Max 両方で試しており、どちらも iOS 12.3.1 です。

iPad Pro 11 インチ (2018)

  • グラフィックは問題なし
  • センサーについては、NEO 2 Smart からパワー・ケイデンスの送信が途切れることはなかった
  • iPhone / Apple Watch に Zwift Companion アプリ (Zwift 本体ではない) をインストール・起動することで、Apple Watch から心拍数を送信できる
    • 1 時間のうちに何度か心拍数の送信が一瞬途切れることがあるが、それ以外は正常に動いていた

iPhone XS Max (2018)

  • グラフィックは問題なし
  • センサーについては、1 時間のうちに 2 回ほど NEO 2 Smart からパワー・ケイデンスの送信が途切れることがあった
    • 復帰するまでに 30 秒ほど時間がかかったと思う
  • Apple Watch に Zwift アプリ (Companion アプリではない) をインストール・起動することで、Apple Watch から心拍数を送信できる
    • 1 時間のうちに何度か心拍数が一瞬途切れることがあり、加えて 30 分以上心拍数が更新されないことがあった
    • Apple Watch を確認したところ、Zwift アプリが終了しており、心拍数の測定が停止していた (センサーを目視で確認)
    • 再度 Apple Watch の Zwift アプリを起動したところ、再度心拍数が送信されるようになった

パワー・ケイデンスが途切れるのは、強度の高いワークアウトを行っている時に悲しい気持ちになりそうです。

センサー周りが不安定なのは、iPhone に複数の Bluetooth 機器が接続されていたのが問題なような気がしています。 NEO 2 Smart・Apple Watch に加えて、Bluetooth イヤホンも再生はしていないものの接続状態でした。次は Bluetooth イヤホンのペアリングを切断して様子を見てみます。

NEO 2 Smart の異音?について

NEO 2 Smart、100W ぐらいの出力で 80 - 90 bpm くらいのケイデンスで回していると、 不定期に小さく「ヒューヒュー」と風のような音が出ることがあるのですが、同じような現象に遭っている方はいらっしゃいませんか...?

CircleCI で postgresql-client パッケージをインストールできない問題

CircleCI でとある Rails プロジェクトをビルドする際、structure.sql を使っている関係で psql コマンドを実行する必要があり postgresql-client パッケージをインストールしています。

しかし 2019/05 上旬から bin/rails db:test:prepare を実行するタスクで Please check the output above for any errors and make sure that psql is installed in your PATH and has proper permissions. というエラーが表示されてビルドが失敗するようになりました。

CircleCI のビルドログを確認してみると、postgresql-client をインストールするタスクでエラーが発生していました。 バージョン 9.6.11 のパッケージをインストールしようとしたけど、パッケージが 404 Not Found になっているようです。

Docker イメージは circleci/ruby:2.6.1-node-browsers を使用しています。

#!/bin/bash -eo pipefail
sudo apt install -y postgresql-client
Reading package lists... Done


Building dependency tree       


Reading state information... Done

The following additional packages will be installed:
  postgresql-client-9.6 postgresql-client-common
Suggested packages:
  postgresql-9.6 postgresql-doc-9.6
The following NEW packages will be installed:
  postgresql-client postgresql-client-9.6 postgresql-client-common
0 upgraded, 3 newly installed, 0 to remove and 2 not upgraded.
Need to get 1416 kB of archives.
After this operation, 6001 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 postgresql-client-common all 181+deb9u2 [79.2 kB]
Err:2 http://deb.debian.org/debian stretch/main amd64 postgresql-client-9.6 amd64 9.6.11-0+deb9u1
  404  Not Found
Get:3 http://deb.debian.org/debian stretch/main amd64 postgresql-client all 9.6+181+deb9u2 [55.8 kB]
Fetched 135 kB in 0s (0 B/s)
E: Failed to fetch http://deb.debian.org/debian/pool/main/p/postgresql-9.6/postgresql-client-9.6_9.6.11-0+deb9u1_amd64.deb  404  Not Found
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

エラーメッセージの最後に apt-get update を実行してみて、と書かれています。パッケージ情報が古くなっていそうですね。

パッケージ情報を更新する

プロジェクトの .circleci/config.yml で、postgresql-client をインストールする前に apt update を実行し、パッケージ情報を更新するようにしました。

      - run: sudo apt update
      - run: sudo apt install -y postgresql-client

再度、ビルドを実行したところ、バージョン 9.6.12 がインストールされて、ビルドが成功するようになりました。

#!/bin/bash -eo pipefail
sudo apt install -y postgresql-client
Reading package lists... Done

Building dependency tree       


Reading state information... Done

The following additional packages will be installed:
  libpq-dev libpq5 postgresql-client-9.6 postgresql-client-common
Suggested packages:
  postgresql-doc-9.6 postgresql-9.6
The following NEW packages will be installed:
  postgresql-client postgresql-client-9.6 postgresql-client-common
The following packages will be upgraded:
  libpq-dev libpq5
2 upgraded, 3 newly installed, 0 to remove and 35 not upgraded.
Need to get 1767 kB of archives.
After this operation, 6007 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian stretch/main amd64 libpq-dev amd64 9.6.12-0+deb9u1 [216 kB]
Get:2 http://deb.debian.org/debian stretch/main amd64 libpq5 amd64 9.6.12-0+deb9u1 [136 kB]
Get:3 http://deb.debian.org/debian stretch/main amd64 postgresql-client-common all 181+deb9u2 [79.2 kB]
Get:4 http://deb.debian.org/debian stretch/main amd64 postgresql-client-9.6 amd64 9.6.12-0+deb9u1 [1281 kB]
Get:5 http://deb.debian.org/debian stretch/main amd64 postgresql-client all 9.6+181+deb9u2 [55.8 kB]
Fetched 1767 kB in 0s (61.2 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
(Reading database ... 41645 files and directories currently installed.)
Preparing to unpack .../libpq-dev_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq-dev (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Preparing to unpack .../libpq5_9.6.12-0+deb9u1_amd64.deb ...
Unpacking libpq5:amd64 (9.6.12-0+deb9u1) over (9.6.11-0+deb9u1) ...
Selecting previously unselected package postgresql-client-common.
Preparing to unpack .../postgresql-client-common_181+deb9u2_all.deb ...
Unpacking postgresql-client-common (181+deb9u2) ...
Selecting previously unselected package postgresql-client-9.6.
Preparing to unpack .../postgresql-client-9.6_9.6.12-0+deb9u1_amd64.deb ...
Unpacking postgresql-client-9.6 (9.6.12-0+deb9u1) ...
Selecting previously unselected package postgresql-client.
Preparing to unpack .../postgresql-client_9.6+181+deb9u2_all.deb ...
Unpacking postgresql-client (9.6+181+deb9u2) ...
Setting up libpq5:amd64 (9.6.12-0+deb9u1) ...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Setting up postgresql-client-common (181+deb9u2) ...
Setting up libpq-dev (9.6.12-0+deb9u1) ...
Setting up postgresql-client-9.6 (9.6.12-0+deb9u1) ...
update-alternatives: using /usr/share/postgresql/9.6/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (9.6+181+deb9u2) ...

apt update は 1 秒程度で完了する処理なので、パッケージのインストールが必要なビルドでは実行した方が良さそうです。

CircleCI で Mocha と TSLint を実行する

CircleCI で Mocha と TSLint を実行し、ビルドページにレポートを表示するまでのメモ。 Mocha と TSLint の設定は終わっている前提。

パッケージのインストール

JUnit 形式のテストレポートを出力するための npm パッケージを追加する。

www.npmjs.com

yarn add -D mocha-circleci-reporter

設定ファイルの編集

package.json

scripts に CircleCI で実行するコマンドを定義する。 JUnit 形式で reports ディレクトリにレポートを書き出すようにしている。 TypeScript プロジェクトなので、細かいオプションは環境によって異なる。

  "scripts": {
    "tslint:ci": "tslint --fix --force --format stylish --project ./tsconfig.json --format junit --out reports/tslint/test-results.xml ./*.{ts,tsx}",
    "test:ci": "mocha --require ts-node/register --reporter mocha-circleci-reporter --reporter-options mochaFile=reports/mocha/test-results.xml test/**/*.ts"
  },

.circleci/config.yml

主に後半がメインで、package.json に定義したコマンドを実行し、テスト結果を CircleCI にアップロードしている。

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8
    working_directory: ~/repo
    steps:
      - checkout

      - restore_cache:
          name: Restore Yarn Package Cache
          keys:
            - yarn-packages-{{ checksum "yarn.lock" }}

      - run:
          name: Install Dependencies
          command: yarn install --frozen-lockfile

      - save_cache:
          name: Save Yarn Package Cache
          key: yarn-packages-{{ checksum "yarn.lock" }}
          paths:
            - ~/.cache/yarn

      - run: mkdir reports

      - run:
          name: Run test
          command: yarn test:ci
          when: always

      - run:
          name: Run tslint
          command: yarn tslint:ci
          when: always

      - store_test_results:
          path: reports

      - store_artifacts:
          path: ./reports/mocha/test-results.xml

      - store_artifacts:
          path: ./reports/tslint/test-results.xml

これで設定は完了。 CircleCI のビルドが走って、テストや Lint が失敗していたりすると、以下のようにビルドページの「Test Summary」に失敗している項目が表示される。

f:id:cho_co_by:20190429121305p:plain