RubyGems からメンテナンスしていない Gem を削除した

RubyGems からメンテナンスしていない、というか作ろうと思って放置していた Gem を削除しました。

Gem を削除する方法は以下のページに記載があり、gem yank コマンドで削除できます。*1

help.rubygems.org

OTP コードが入力できない

多要素認証を設定していると、gem yank コマンドを実行できない問題に遭遇しました。OTP コードを聞かれませんし otp オプションも通りません。

% gem yank fake_delete -v 0.0.1.alpha.1
Yanking gem from https://rubygems.org...
You have enabled multifactor authentication but no OTP code provided. Please fill it and retry.
% gem yank fake_delete -v 0.0.1.alpha.1 --otp 123456
ERROR:  While executing gem ... (OptionParser::InvalidOption)
    invalid option: --otp

調べてみると、コードベースに対応したコードはあるものの、まだリリースされていないそうです。

github.com

github.com

仕方がないので、RubyGems の「MFA Level」を一時的に「UI」に変更し、再度コマンドを実行すると無事に実行できました。

% gem yank fake_delete -v 0.0.1.alpha.1
Yanking gem from https://rubygems.org...
Successfully deleted gem: fake_delete (0.0.1.alpha.1)

削除すると、RubyGems のページが以下のようになりました。 100 日後にネームスペースが開放されるそうで、それまでは新たなバージョンを push したり、オーナーを変更することができるそうです。

f:id:cho_co_by:20190929143417p:plain

何の Gem を作っていたのか

いい機会なので、何の Gem を作っていたのかメモしておきます。

  • fake_delete: 論理削除を行う Gem で、deleted_at カラムの型を timestamp にする (未削除は 0, 削除はタイムスタンプ) ことでデータベースのユニーク制約を効かせようと考えたもの
  • haguruma: あまり覚えていないが、GitHub などから受け取った Webhook を整形して Slack など複数の送信先に通知することを考えていたもの

*1:サポートフォーラムで依頼して削除してもらう方式かなと思っていました

AirPods を新調した

1 世代目の調子が悪くなってきたので 2 世代目を購入した。2017/8 に購入したので 2 年間頑張ってくれた。

何が不調だったかというと、

  • バッテリーがヘタってきた。1 時間ぐらいで電池切れのアラートが鳴るようになってきた
  • iPhone や MacBook 間の切り替えに時間がかかったり、切り替えられなくなってきた

購入したのはワイヤレス充電できるタイプ。今のところ快調。また、遅延も改善されているようだ(ポケストップをタップした時とか)

AirPods は

  • iPhone, iPad, MacBook でシュッとソースを切り替えられる
  • とりあえず良い感じの音で聴ける

というところがよい。 使っている人増えましたね。

「第一回 Ruby で LT しちゃわナイト」に参加&LT した

昔の同僚が「Ruby で LT しちゃわナイト」というイベントを開催するということで、LT させてもらいました。

corundum.connpass.com

LT した

speakerdeck.com

僕が開発している jp_prefecture gem をどうやってメンテナンスしていくか、という話で LT させてもらいました(誰得な話題ですね、ごめんなさい)。 スライドを作っている間に考えが整理できたので良かったです。変更点については改めて記事にしようと思います。

とても緊張していましたが、2 番目の発表だったので、発表後はリラックスして他の方の発表を聞くことができました。

改善点としては、他の方が聞きたくなるような内容にするのはもちろんのこと、イベントが始まる前にプロジェクターのチェックをしておけばよかったです。 いざ発表という時にミラーリングになってしまい、手元のディスプレイでタイマーの確認ができなかったので。

各発表の感想

簡単に各発表の感想を。

  • kbaba1001 さん
    • レガシー Rails 改善ガイド」を書いた方で、いくつか改善パターンを説明されました。
    • Sonic Pi というライブコーディング環境について紹介されました。音楽制作は全然できませんが、コードなら何だかできそうな気がして、試したいなと思いました。
  • nobu417 さん
    • ガワアプリで使うための自作フレームワークを紹介されました。Haml, CoffeeScript, CSS で作られているらしく、UI を構築できたりとか、ネイティブな機能との橋渡しができるとのことでした。
  • なおう さん
    • とある大企業で社内システムの Rails アプリをメンテナンスしている話でした。懇親会でも少しお話しましたが、社内システムならではの辛みがあるようで、うまく共有できたら有益な情報が多そうな気がしました。
  • TakekiFujinami さん
    • どうやって Ruby についての情報を収集しているかの話でした。「週刊 Rails ウォッチ」は僕も読んでいて、参考になる情報が多いです。「ruby-jp Slack グループ」は存在は知っているのですがまだ入っていません。
    • 上の 2 つで時間切れでしたが、ブラウザのタブを見る感じ、あとは Ruby Weekly か何かのメールマガジンな気がしました。
  • iberianpig さん
    • Linux のノート PC で mac のようなマルチタッチジェスチャーを可能にする fusuma という Gem について紹介されました。
    • mac を使う理由の一つに高機能なトラックパッドが使える、というのがあるので、この Gem を使うと Linux に移行しやすくなるなと思いました。
  • miya_0436 さん
    • 日付オブジェクトを文字列に変換する方法で、複数のやり方が出てきて議論して最終的に落ち着いたものの、それを議論している時間はプロダクトの価値に寄与していないよね、本当に強制するメリットはあるのか、という話でした。
    • 個人的にはできるだけ規約で縛りたい派なのですが、機械的に指摘できないルールは、新人が入ってきたときもそうですし、そうでなくても何度レビューしても定着しなかったりするので、耳が痛かったですw
    • ちょうど最近 Google Engineering Practices Documentation のコードレビューについてのガイド を読んでいたので、色々と考えさせられました。

全体の感想

事前に発表する時間を指定できるものの、時間が過ぎたら強制的に終了だったので、ほどよい緊張感がありました。 各発表の終了後に主催の方が感想を一言くれたのもいいなと思いました。

イベントはとてもスムーズに運営されていました。事前に色々な準備があったのだと思います。 運営の皆様、会場や飲食物を提供してくださった ClipLine 株式会社様、ありがとうございました。

f:id:cho_co_by:20190915184104j:plain
プログラマーの日っぽく「エンジニアさんの歌〜納期前〜」という曲が流れていた

f:id:cho_co_by:20190915184043j:plain
謎の構図

追記: 主催のたけきさんの雑感エントリーが公開されました。

note.mu

9/13 はプログラマーの日

9/13 は 1/1 から 256 日目にあたる日で、ロシアの祝日とのことです。

ja.wikipedia.org

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:その時は一瞬だったので特に印象はありませんでした