serverless-offline でサーバー起動時にエンドポイントをテストする

serverless-offline でサーバー起動時にスクリプトを実行する方法をメモ。 sls offline start コマンドに --exec オプションを指定する。

ヘルプから抜粋:

% yarn run sls offline --help
offline start ................. Simulates API Gateway to call your lambda functions offline using backward compatible initialization.
    --exec ............................. When provided, a shell script is executed when the server starts up, and the server will shut down after handling this command.

例えばサーバーを起動したあとに curl コマンドを叩くことができる。

yarn run sls offline start --exec "curl --fail 127.0.0.1:3000"

CircleCI の例ですが、こういう感じでエンドポイントにリクエストが通るかを雑にチェックすることができる。

- run:
    name: Check response
    command: yarn run sls offline start --exec "curl --fail 127.0.0.1:3000"
    when: always

Serverless Framework + TypeScript なプロジェクトを手っ取り早く始められるテンプレート的なプロジェクトでこの方法を使っています (宣伝)

github.com

アキヨドの有隣堂にて本を購入。 有隣堂は広くてぶらぶらするだけで楽しい。

宝石の国 2 巻

https://www.amazon.co.jp/dp/406387950X

漫画はレンタルすることが多いのだが、宝石の国の表紙は綺麗でつい買ってしまった。

クマにあったらどうするか

https://www.amazon.co.jp/dp/4480431489

「書店員の趣味コーナー」に置いてあった。

自転車で峠を登ると「クマ注意」という看板が置いてあることもあり、他人事ではないので気になって買ってみた。

Zeitwerk で特別なパターンのモジュール/クラス名をオートロードする

Rails 6.0 から Zeitwerk がオートローダーとして導入されました。 Zeitwerk の README に書かれている通り、ファイルパスからモジュールやクラスを読み込みます。

github.com

モジュール/クラス名がファイルパスになっていれば良いのですが、特別なパターンだと名前を解決できない場合があります。

クラス名に頭字語を使っている場合

例えば、クラス名に頭字語を使っている場合です。

以下のログがその例で、lib/ridgepole/dsl_parser.rb というファイルパスを Zeitwerk は Ridgepole::DslParser と想定しています。 しかし、実際のクラス名は Ridgepole::DSLParser なので名前の解決に失敗しています。(bin/rails zeitwerk:check は Zeitwerk が使用できるかチェックするタスク)

% bin/rails zeitwerk:check
Hold on, I am eager loading the application.
expected file lib/ridgepole/dsl_parser.rb to define constant Ridgepole::DslParser,

対応方法

どうすればいいかというと、Rails ガイドのオートロードについて書かれているページには、config/initializers/inflections.rb をカスタマイズしましょうとあります。

If you need to customize any of these inflections, for example to add an acronym, please have a look at config/initializers/inflections.rb.

guides.rubyonrails.org

ActiveSupport::Inflector モジュールには活用形をカスタマイズする機構があるので、Zeitwerk もそれを参照する形になっているようです。 以下は Zeitwerk が ActiveSupport::Inflector の設定をテストしている箇所です。

rails/zeitwerk_integration_test.rb at d05f1f036ff4987918c907eb7e78ef8e8eedd6ea · rails/rails · GitHub

今回の場合は、dslDSL と解決したいので、config/initializers/inflections.rb を以下のように定義します。

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym "DSL"
end

再度 bin/rails zeitwerk:check を実行してみると、無事に解決できました。

% bin/rails zeitwerk:check
Hold on, I am eager loading the application.
All is good!

今回は Rails アプリ側で対応しましたが、理想を言うなら、ライブラリ側の名前を変更するほうが使う側にとって良いのでは、と思ったりもします。

MAGICO M2 と YG Acoustics Sonja 2.2 を聴いてきた

f:id:cho_co_by:20190825154328j:plain

2 年ほど前からスピーカーで音楽を聴くようになって*1、スピーカーやトランスポートや DAC を変えたりしていますが、 「自分の目指す音とは何なのか?」というのが分からず、この先どうしていくのか目標がない状態でした。

ある日、電車でブログを巡回していたところ、以下の記事が目に留まりました。

sisaudio.blogspot.com

以下の文章にドキッときて、「自分の目指す方向が何かしら見つかるのではないか」と思い、電車から降りてすぐに SIS さんに試聴の予約をお願いしたのでした。

これはもはや誰もが一度は体験しておくべき、ハイエンド・オーディオの究極のアトラクションです。お時間のある方、ぜひこの機会にご来店ください。初めてエスアイエスにご来店の方、お若い方も大歓迎です。日本の全オーディオファンは、このチャンスを逃してはなりません。この音は、決してオーディオショウでは体験できないものです。この音をハイエンド・オーディオの一つの到達点として、耳に、心に刻み込んでください。ここで聴く音は、きっとこれからオーディオをやっていく上での確かな目標になると思います。若い方ならなおさらです。ヘッドフォン・オーディオファンの方も、スピーカー・オーディオの真髄を、身体全体で、皮膚で感じる音楽の凄さを、いまここでご体感ください。

SIS さんは、千駄木にあるオーディオショップです。山手線田端駅からバスで 5 分程です。

www.sisaudio.co.jp

MAGICO M2

(以下、M2)

今回試聴したのは、今年発表された M2 です。 M シリーズの中で一番小さいモデルです。 MAGICO のスピーカーは見た目が好きで、特に M シリーズはサイドパネルにカーボンファイバーを使っていてかっこいいです。

magico.net

MAGICO には M シリーズ、S シリーズ、Q シリーズなどがありますが、それぞれ何が違うのか分かっていません...

M2 を鳴らすのは以下の布陣です。値段は調べないほうがよいです。

  • トランスポート: MSB Technology SELECT TRANSPORT + POWER BASE
  • DAC: MSB Technology SELECT DAC
  • プリアンプ: FM ACOUSTICS FM255MkIIR
  • パワーアンプ: FM ACOUSTICS FM411MkIII
  • インターコネクトケーブル: Nordost Odin 2
  • スピーカーケーブル: Nordost Odin 2
  • ラック: YG Acoustics Rack 1.3

音について

語彙力がないので、うまいことは言えません。ごめんなさい。 あと、スピーカーについての感想になります。

文句なしに良い音だと思います。低域の中に今まで聴いたことのない音が聴こえてきて、新鮮な体験でした。 試聴室のエアボリュームがあるせいか想像していたより低域は控えめかな、と思いましたが、部屋の大きさやセッティングで変わりそうな気もしました。

YG Acoustics Sonja 2.2

(以下、Sonja 2.2)

担当していただいた店員さんのご厚意で、Sonja 2.2 も試聴させていただくことができました。

www.yg-acoustics.com

YG Acoustics は 2017 年の東京インターナショナルオーディオショウで少し聴いただけですが*2、Twitter でフォローしている方にも愛用者が多く(?)、気になっているメーカーです。

f:id:cho_co_by:20190825160305j:plain

スピーカーの入れ替えが大変なのでは、と心配でしたが、慣れた感じで 10 分ほどでスピーカーの入れ替えが終わりました。 スピーカー以外は M2 と同じ構成です。

音について

よく、YG Acoustics について、ドライな見た目とは反した音が出てくる、とった話を見かけますが、その通りで明るい音が聴こえてきました。とてもリラックスできる音です。 また、低域の量感がすごくて、聴いていて楽しかったです。ビビりなので大きい音は出せませんでしたが、ボリュームを大きくしても音が破綻しないとのことです。

大好きな Aimer の Brave Shine が今までで一番良い音で聴けました。場所とお金が許せば今すぐにでも買いたいなと思いました。

試聴した曲

女性ボーカル物を中心に試聴しました。いくつかピックアップして感想を書いておきます。

  • 宇多田ヒカル「Be My Last」: 歌声はもちろん、アコースティックギターの生々しさとか、沈み込むようなドラムを M2 や Sonja 2.2 は聴かせてくれました。
  • Aimer「Brave Shine」: Aimer で一番好きな曲です。この曲のサビは爆発力が欲しいなと思っているのですが、Sonja 2.2 は自分の理想に近いものでした。
  • 水樹奈々「No Limit」「終末のラブソング」: 残念ながらパッとしませんでした。もしかしたら音量が小さかったのかもしれません。MAGICO で水樹奈々さんの楽曲をうまく鳴らしている方もいるようなので、いつか聴いてみたいものです。
  • THE IDOLM@STER CINDERELLA GIRLS STARLIGHT MASTER 29「クレイジークレイジー」: デレステの楽曲でよく聴いている曲です。Sonja 2.2 で聴くサビがとてつもなく気持ち良かった。

目指す方向

今回の試聴で YG Acoustics の音が目標になりました。ただ、Sonja 2.2 が良いのは分かっていますが、お値段を考えると Hailey 2.2 や Vantage が現実的かなと思っています。それでもいつ買えるか分かりませんが...。 そもそもスピーカーの前にオーディオルームを用意しなければならないので、道のりは長そうです。

1, 2 年でどうにかなるものではないので、気長に取り組んでいきたいですね。機会があればオフ会に参加して、いろいろな音を聴いてみたいです。

SIS さん、今回は貴重な機会をありがとうございました。

おまけ

f:id:cho_co_by:20190825160219j:plain f:id:cho_co_by:20190825160240j:plain f:id:cho_co_by:20190825160203j:plain

*1:それ以前はヘッドホンとイヤホンがメインでした

*2:その時は一瞬だったので特に印象はありませんでした

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 で教えていただけるとありがたいです。