VSCode で Ruby のカバレッジを表示する

何をしたいか

RubyKaigi 2019 に行ってカバレッジに対しての意識が高まっているので、VSCodeRubyカバレッジ(どの行が実行されて、どの行が実行されなかったか)を表示したい。

VSCode 側の設定

Coverage Gutters という拡張を入れる。 Ruby は対応していなさそうだけど大丈夫。

プロジェクト側の設定

diff --git a/Gemfile b/Gemfile
index 2139148..b02f0e1 100644
--- a/Gemfile
+++ b/Gemfile
@@ -49,6 +49,8 @@ gem 'gretel'
 gem 'chart-js-rails'

 group :development, :test do
+  gem 'simplecov'
+  gem 'simplecov-lcov'
   # Use sqlite3 as the database for Active Record
   gem 'sqlite3', '~> 1.3.6'
   # Call 'byebug' anywhere in the code to stop execution and get a debugger console

忘れずに bundle install しておく。 次に spec_helper.rbsimplecov の設定を追加する。

diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index ce33d66..6dc7db9 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -93,4 +93,13 @@ RSpec.configure do |config|
   # as the one that triggered the failure.
   Kernel.srand config.seed
 =end
+
+  require 'simplecov'
+  require 'simplecov-lcov'
+  SimpleCov::Formatter::LcovFormatter.config do |c|
+    c.single_report_path = 'coverage/lcov.info'
+    c.report_with_single_file = true
+  end
+  SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
+  SimpleCov.start 'rails'
 end

カバレッジを表示する

$ bundle exec rspec

ファイルを開いて、右クリックメニューから「Coverage Gutters: Display Coverage」をクリックする。

f:id:mallowlabs:20190512104835p:plain

どの行が実行されてどの行が実行されていないかが表示される。

f:id:mallowlabs:20190512104846p:plain

まとめ

簡単に最高の結果を手に入れた。

macOS で 'pg' を含む Gemfile を bundle install する方法

mallowlabs.hatenablog.com

という記事を6年前に書いたが、久しぶりにやったら動かなかったのでメモ。

環境

  • macOS 10.14.4 (Mojave)
  • Postgres.app 2.2.2
  • Ruby 2.6.2
  • Bundler 2.0.1

手順

  1. Postgres.app をインストールする 素直に /Applications/ 以下にコピーする

  2. Gemfile があるディレクトリで以下のコマンドを実行

$ bundle config build.pg --with-pg-config=/Applications/Postgres.app/Contents/Versions/latest/bin/pg_config
$ bundle

前の記事と比較として bundle config に渡す pg_config のパスが変更になっている。

まとめ

Mac OS XmacOS になっていたり Ruby が v2 になっていたり、Bundler が v2 になっていたり、時の流れを感じる。

Java 向けの疑似 SMTP サーバの Web アプリを作った

疑似 SMTP サーバ

Ruby だと MailCatcher のような疑似(mock / fake / dummy) SMTP サーバがある。 開発中のアプリケーションでうっかり本番用のメールアドレスにメールを送信しないために便利である。 Java の現場では、疑似 SMTP サーバを入れるために Ruby をインストールするのはちょっと面倒である。 ランタイムが不要な言語で作られた疑似 SMTP サーバもいくつかあるが、文字コードの扱いがイマイチで日本語のメールを正しく扱えるものが少ないという問題もある。 そこで Java の現場で簡単に使える 疑似 SMTP サーバが必要だと考えた。

mail-baku

Java で使える疑似 SMTP サーバの Web アプリである mail-baku を開発した。

https://github.com/mallowlabs/mail-baku

ビルドした war は mail-baku/releases からダウンロードできる。

Tomcatwebapps に war ファイルを放り込んで、(Apache httpd を使っている場合には AJP の設定すれば) http://localhost:8080/mail-baku/ で mail-baku にアクセスできる。 この Web アプリケーションは Web アプリであると同時に SMTP サーバとしても動作している。 ポート番号は 1025 番で SMTP を待ち受けている。

f:id:mallowlabs:20190304205405p:plain

この Web アプリケーションが立ち上がった状態で、0.0.0.0 の 1025 番に向けてメールを送信するように開発中のアプリケーションを設定すれば、本番でうっかりメールを外部に送信することを防ぐことができる。

Tomcat を使ってない場合でもソースをクローンして、mvn ninja:run とすれば Web アプリケーションと SMTP サーバが立ち上がる。

制約事項

BCC のメールアドレスは見ることができない。 これは SMTP サーバに利用している subethasmtp の制限なので許して欲しい。

まとめ

Java の現場で使える MailCatcher 風の疑似 SMTP サーバを作った。 Tomcat が立ち上がっていて、Ruby は入っていないという環境でメール機能をテストしたいという場合には使ってみて欲しい。

Node-RED の OAuth2 で refresh token が再起動で消えてしまう件

環境

Node-RED v0.19.5

TL;DL

Node-RED は credential の値の永続化をデプロイのタイミングでしか行わない。 そのため、いくつかの OAuth2 のプラグインは Node-RED を再起動したタイミングで refresh token を忘れてしまうため、再度 OAuth2 の設定をしなおす必要がある。 該当の Issue は https://github.com/node-red/node-red/issues/1055

node-red-contrib-fitbit-token

私は Fitbit の OAuth2 の access token を expire なしで取れるノードを自作している。

https://github.com/mallowlabs/node-red-contrib-fitbit-token

f:id:mallowlabs:20190114122407p:plain

このノードで access token を取得して、FItbit API を叩くことで、Mackerel に心拍数を送ったり、Slack に送って体重を通知したりしている。

この Node が Node-RED を再起動すると、refresh token が invalid になってしまい、再度ログインが必要なるという問題に悩まされていた。

Node-RED のソースを読む

Node-RED のソースを読むと、credential の 永続化はワークフローのデプロイのタイミングでしか行われていないことがわかった。 つまり refresh token を更新した結果は、メモリ上でしか保存されないので、当然 Node-RED を再起動すると refresh token が失われて、access token を refresh できなくなる。

その知識をもとに、GitHub を見るとたしかに Provide a way to programmatically save Credentials nodes (OAUTH) #1055 という issue があった。 どうやら既知の問題なので今後に期待ということがわかった。

解決策

Node-RED の credential API を使っている限り、永続化はできないので、refresh token のみ別のストレージに保存する必要がある。 私は Node-RED を IBM Blumix 上で動かしているので、 Cloudant DB に保存することにした。

対応した diff がこちら

https://github.com/mallowlabs/node-red-contrib-fitbit-token/commit/8cc70027cc2ec6e5e356b0d2f1e65149fcba4cbd?w=1

これで IBM Blumix 上で動作させることが必須になる代わりに、 Node-RED を再起動しても Fitbit の再ログインが求められることはなくなった。

まとめ

Node-RED の OAuth2 を扱うノードが再起動によって refresh token を忘れてしまうという事実はあまり知られていないと感じたので、記事にしてみた。 これを知らずに自分の書いたコードがどこか間違っていると思い続けて調査に無限の時間を費やしたのでこの記事で誰かが救われると嬉しい。

Quick JUnit の Ruby 版っぽい VSCode 拡張作ってみた

この記事は Misoca+弥生 Advent Calendar 2018 2日目の記事です。 Misoca では Ruby を書くお仕事をしています。 Misoca にジョインする前はずっと Java を書くお仕事をしていたので、Ruby 開発について日々勉強中といった感じです。

Qucik JUnit Plugin for Eclipse

Java を書いていた時には Quick JUnit Plugin for Eclipse というプラグインを活用していました。 このプラグイン

  • Cmd+9 (Ctrl+9) で テストコードと実装コードをトグルできる
  • Cmd+0 (Ctrl+0) で テストコードを JUnit ですぐに実行できる
  • テストコードを実行する際に、カーソル位置のテストのみを実行できる

という特徴を持った Eclipse プラグインです。 Javaテスト駆動開発(TDD)をする時にとても重宝していました。

Visual Studio Code 拡張

現在 Ruby を書くときには VSCode を使っています。

  • VSCode でも Quick JUnit と似た操作感で RSpec を実行したい
  • VSCode の拡張を書いてみたい

という理由から VSCode 拡張を作ってみることにしました。

vscode-quick-rspec

できたのがこちらの拡張です → vscode-quick-rspec

動作イメージは以下のような感じです。

f:id:mallowlabs:20181202111700g:plain

Cmd+9 (Ctrl+9) で実装とテストを切り替えて、Cmd+0 で RSpec を実行しています。 もちろん RSpec の実行は現在のカーソル行を実行します。

これで Quick JUnit のような感覚で、Ruby で開発できるようになりました。

自分で使う用なので Marketplace には上げてませんが、使ってみたい場合には

$ git clone https://github.com/mallowlabs/vscode-quick-rspec.git
$ mv vscode-quick-rspec $HOME/.vscode/extensions/

して VSCode を再起動してください。 自分用なのでエラー処理とかは適当です(言い訳)

VSCode 拡張開発の所感

雛形のジェネレーターがしっかりしているので、すぐに開発をスタートできるのが好印象でした。 デバッガもあるし、言語も ES6 で async/await なんかも使えるのでとても快適です。 API も今回作った拡張に必要な分は揃っているという感じで、いろいろできそうだなと感じました。

作っている途中でもうあることに気づく法則

何かを作っていると途中ですでにそれがあることに気づくことはよくありますが、今回も作っている途中で似たような拡張がたくさんあることに気づいてしまいました…。

今回は VSCode 拡張の作り方の勉強になったのでよかった、ということにしたいと思います。

まとめ

VSCode 拡張は思いの外簡単に作れたので、生産性を向上させるような拡張を思いついたらまた作ってみたいです。

明日は @corocn が 「ALB + Lambda + Ruby をセキュアに」する話を書いてくれるみたいです。楽しみですね。

はてなダイアリーからはてなブログに引っ越した

2019年春「はてなダイアリー」終了のお知らせと「はてなブログ」への移行のお願い - はてなダイアリー日記 ということだったので、はてなダイアリーからはてなブログに引っ越してきた。

旧 URL: http://d.hatena.ne.jp/mallowlabs
新 URL: https://mallowlabs.hatenablog.com/

またボチボチ記事を書いていきたい。

Windows 10 Creators Update にアップデートしたら WMDC と ckw-mod が壊れた

以下の2点が壊れて仕事で困ったので、対応策を共有。

  1. Windows Mobile Device Center が起動しなくなった
  2. ckw-mod の表示が壊れた
環境
  • Windows 10 Home / バージョン 1703 / OS ビルド 15063.138
  • Windows Mobile Device Center v6.1
  • ckw-mod 0.9.1.0

Windows Mobile Device Center v6.1 が起動しなくなった

Windows Mobile Device Center v6.1 が起動しなくなって困った。
再インストールしようとしたらインストーラすら起動しなくて更に困った。

対処法
  1. 「サービス(services.msc)」を起動する
  2. Windows Mobile 2003 ベース デバイスの接続」を右クリックして「プロパティ」を開く
  3. 「ログオン」タブを開き、「ローカル システム アカウント」にチェックし、「デスクトップとの対話をサービスに許可」にチェックを入れて OK をクリックする


ckw-mod の表示が壊れた

git diff して日本語を含む内容を表示すると表示が崩れるようになって困った。
Console2 に乗り換えようとしたら Console2 も壊れてて更に困った。
コマンドプロンプトの API が壊れているらしいコマンドプロンプトの設定でなんとかなるらしい ので設定を変更する。

2017.05.28 追記

KB4020102 で修正されたらしい ので、Windows Update を 当てよう。

対処法
  1. コマンドプロンプト(cmd.exe)を開き、タイトルバーを右クリックして「プロパティ」をクリックする
  2. 「従来のコンソールを使う(再起動が必要)」にチェックを入れて OK をクリックする


まとめ

Windows 10 Creators Update 何が変わったのかわからない割にはいろいろ壊れていてとにかく最高!