rastam’s blog

東京在住のマレーシア人 Rubyist

エンジニアの CS 対応メモ

この間、CS からのお問い合わせ対応のやり方について新卒に説教することになりました。 せっかくなので書き落としておきました。

手順は

  1. 何の問題なのか完全に理解すること
    • 不明な場合は、お客様に聞くように CS 担当者に依頼すること。
    • 必要があればスクショ撮ってもらう。
  2. 再現すること(できれば)
  3. リクエストログが追えれば、追うこと
    • 本当にその現象が起きた証拠を集めて参考にするために。その中にある情報で何かが分かるかもしれないから。あと人聞き悪いですが、クレーマーが嘘を付くことがたまにある。
  4. 原因調査すること
  5. 解決すること
  6. CS 担当者に連絡すること
    • 砕けた文章で OK。お客様向け文章を書くのは CS 担当者の仕事なので。
    • 五月雨式の連絡を避けて、出来るだけ連絡内容をまとめてから投げる。
      • お客様に何回も連絡すると、お客様がめんどくさくなる。
      • CS 担当者の負担を増やさないように。エンジニアを理不尽なクレーマーから守ってるのは CS 担当者だから。

Rails Needs Active Deployment: 日本語サマリー

先週の Ruby Rogues ポッドキャストで取り上げられた熱い記事。

medium.com

Active Storage、Active Job、Action Cable、Action Mailbox で超楽になってきたが、デプロイという難関が未だに残ってる。Heroku だと簡単に出来ちゃうけど、それ以外はハードルがかなり上がる。

初心者がやり方ググっても、大量のチュートリアルが出て来て、どれも微妙に違ってて結局自分で大量の決断をすることになり、標準化されてなくて保守しづらいインフラが生まれてくる。

Docker は一見簡単だけど、チュートリアルが大量にありすぎて、ほとんど中途半端かつ開発環境に特化した手順にすぎない。

社内にインフラのプロがいなくても、エンジニアが一人で簡単に本番環境構築できるのは Rails 流ではないでしょうか?Convention over configuration で標準化したデプロイできる Active Deployment 的なものニーズは十分ある。コミュニティで実装方法を議論しましょう。

という主張論の記事。

インフラが怖いと思っている僕はものすごく同感。非現実的だという反論はあるとはいえ。(Ruby Rogues でも実際この点でプチ喧嘩にもなった)

Growing Rails Applications in Practice: 日本語サマリー

leanpub.com

読破しましたのでサマリー書いておきました。

  • コントローラの設計を標準化せよ
  • ユーザーの各インタラクションをCRUDリソースで表現せよ
  • コントローラの責務は4つのみ
  • モデルのAPIをvalidation、コールバックで表現
  • ActiveModel のモデル積極的に作れ
  • クラス切り出してロジック整理せよ
  • ファットモデルをダイエットさせてスリムモデル切り出せ
  • インタラクションロジックをフォームオブジェクトに切り出せ
  • 他オブジェクトモデルから呼ばれる、Active Recordを必要としない単一責務POROのサービスオブジェクトをきり出せ
  • モジュールの使い道はファイル構造化のみ
  • モデルを積極的にネームスペース・サブフォルダに配置せよ
  • CSSはBEMで整理せよ
  • 生きたスタイルガイドを用意せよ
  • Railsバージョンアップせよ
  • Edgeは2〜3パッチレベル成長するまではバージョンアップするな
  • モンキーパッチ、gemが多ければ多いほどバージョンアップのコストが高くなる
  • 単体テスト結合テスト書け
  • テスト駆動設計せよ

Ruby Weekly #411: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/411rubyweekly.com

Highlights

Visualizing Ruby Execution

Ruby コードのロジックをフロー図に変換してくれる VisualizeRuby gem。

Changing the Way Ruby Creates Objects

.new メソッドをオーバーライドしてみた話。

  • #initialize 前にシングルトンクラスに対してモジュールを include
  • #allocate で子クラスにも include されるように。

Finding Where STDOUT/STDERR Debug Messages Are Coming From

Discourse デバッグ中の Sam Saffron 先生が STDERR モンキーパッチでエラー発生元を出力させた話。

Rails 5.2.1 Released

Rails 5.2.1 リリース!

How to Use Bundler in a Single-File Ruby Script

require 'bundler/inline'gemfile ブロックだけで、単独ファイルの Ruby スクリプトでも Bundler 使えちゃう。

First Beta of Hanami 1.3 Released

Hanami v1.3.0.beta1 リリース。v1.3.0 は 10 月リリース予定。

  • RSpec がデフォになった

Articles & Tutorials

Designing Services with dry-rb

dry-rb でサービスクラス実装。

  • Dry::Initializer で注入する依存性定義。
  • Dry::Validation で注入した依存性のルール定義。
  • Dry::MonadsSuccess Failure オブジェクトを返す。

Ruby 2.6's Dir#each_child and Dir#children Instance Methods

Ruby 2.5 の Dir.each_child Dir.children に該当する Dir#each_child Dir#children インスタンスメソッドが Ruby 2.6 で登場。

Improving Partial Loading Performance

partial パフォーマンス向上方法 2 つ。

  • bullet で N+1 クエリ検知・撲滅。
  • ビューからの SQL 発行を検知してくれる自前 concern。

How Can I Use Ruby 2.6 JIT?

JIT の紹介。

  • JIT とは、Ruby 稼働中によく呼ばれるメソッドの特定・コンパイル
    • メモリが倍ぐらいかかっちゃう
    • コンパイル完了までは重い
  • 今までの JIT 実装
    • JVMコンパイルを先にやるせいで、起動が重い
    • Rubinius などの JIT がいろいろ提案されてきたが、起動速度とメモリのせいで却下
  • 許容範囲内の保守性・起動速度・メモリを誇る MJIT は、いよいよ Ruby 2.6 で登場。
    • 稼働中にバックグラウンドで少しずつコンパイルすることで、起動は速くなるが、高速化するまでは時間がかかる
    • 現時点 Rails は重くなるだけ
    • MJIT はデフォ無効

Back to the Primitive. Testing with Simplicity

テストの期待値は、ヘルパーなどの戻り値ではなく、プリミティブにしようという主張。

Code & Tools

Paraspec: Parallel RSpec Test Runner

RSpec テスト並列実行用 gem。ファイル単位だけではなく spec 単位でも分散できる。

Groupdate: Group Temporal Data with Active Record, Simply

ActiveRecord や Enumerable を年、月、日付、曜日、時間などでグループしてくれる gem。

Xcode::Install: A Ruby Tool to Install and Update Xcode Versions

XCode 最新バージョンをインストールしてくれる CLI 用 gem。

TTY::Screen: Cross-Platform Terminal Screen Size Detection

ターミナルのサイズを検知してくれる gem。

capybara-screenshot: Automatically Save Screen Shots When a Capybara Scenario Fails

Capybara テストが落ちたらスクショを保存してくれる gem。

Ruby Weekly #410: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/410rubyweekly.com

Highlights

Stop Shipping Untested Ruby Code with Undercover

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる undercover gem の機能紹介。

Generating Random Numbers in Ruby

乱数生成いろいろ。

  • rand
  • srandrand のシード指定
  • Random.rand
  • rubystats gem の Rubystats::NormalDistribution正規分布に従った乱数生成

Evaluating Scala and Sticking with Ruby

Scala で新規アプリ開発してみた REA 社が最終的に関数型 Ruby にした話。

  • 生産性向上を期待していたが、そこまで変わらなかった
  • パフォーマンスは確かに Scala 圧勝
  • 関数型プログラミングで保守性の改善を期待していたが、、ボイラープレートが多くて可読性暴落

Rails 5.2.1 RC 1 Released

Rails 5.2.1.rc1 リリース。Rails 5.2.1 は今日中にリリース予定。

Articles & Tutorials

Building a Testing Framework Similar to RSpec in Ruby

RSpec 風テストフレームワークの作り方。

Rails 5.2 Encrypted Credentials Cheat Cheat and Tips

Rails 5.2 Credentials 備忘録。

  • config/credentials.yml.enc はコミットしても OK
  • config/master.key はコミットするな!.gitignore、.dockerignore に入れること!
  • CI ログには RAILS_MASTER_KEY 環境変数を出すな!
  • キー変更手順

Ruby 2.6 Added Some Options to Exception#full_message

Ruby 2.6 で Exception#full_message に追加されたオプション引数まとめ。

  • highlightエスケープ文字を消す
  • order

Send Emails with Style in Rails

HTML メールの CSS をインライン style 属性として当ててくれる gem まとめ。

Ruby 2.6 Adds Option to Not Raise Exception for Integer and Float Methods

変換できない文字列を渡されたら ArgumentError を投げる Integer()Float() メソッドは、Ruby 2.6 以降、exception オプション引数で例外を抑えれるようになる。

Using Rails Encrypted Credentials with Docker

Docker で Rails Credentials を使う方法。

  • 開発用コンテナ上で rails credentials:edit が実行できるための設定
  • マスタキーの渡し方

Code & Tools

Undercover: Like RuboCop But For Code Coverage

指定コミットの中に、テストのカバー率が足りないソースがないか検知してくれる gem。

MiniI18n: Minimalistic Internationalization for Ruby

簡易 i18n 用 gem。

Orbacle: A Ruby 'Language Server' for Code Editors

vimemacsAtom などにコード補完やリファクター機能を提供してくれる Ruby 言語サーバ。

Ruby Weekly #409: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/409rubyweekly.com

Highlights

Pundit 2.0 Released: The Pure Ruby Authorization Library

認可用 Pundit gem は v2.0 リリース!

Tweaking Ruby's Global Method Cache

グローバルメソッドキャッシュいろいろ。

  • メソッドの定義元クラス・モジュールをマッピングするキャッシュ。定義元を毎回評価するのにコストがかかるから。
  • RUBY_GLOBAL_METHOD_CACHE_SIZE 環境変数でキャッシュするメソッドの数を指定(デフォ 2048)。
  • メソッド数増やしても高速化は 2%〜3% しかない。

Faker: The Library for Generating Fake Data

ダミーデータ生成用 gem。

Articles & Tutorials

Painlessly Managing Long Running Processes in Your Views

fie フレームワークで ActiveJob の進捗をプログレスバーとして表示。

Adding Authorization to Sinatra with Pundit

Sinatra アプリで pundit gem を使う手順。

Ruby 2.6 Adds Binding#source_location

ファイル名、行番号を返してくれる、Ruby 2.6 の Binding#source_location

Hiding .gemrc Credentials in Dotfiles

コミット対象の .gemrc の中の認証トークンなどを隠す方法。

  1. トークンを dotfile に移す
  2. GEMRC 環境変数で dotfile を指定することで、.gemrc の設定が dotfile の設定とマージされる

Making Ruby Yours with the pretty_ruby Gem

コアメソッドに可読性向上の拡張をしてくれた pretty_ruby gem。拡張はモンキーパッチではなく、安心安全な refinement で。

  • .map { |x| x.join('-') }.map(:join, '-')
  • .map { |x| x.next.upcase }.map(:next >> :upcase)
  • .reduce(['']) { |m, x| m << m.last + x }.drop(1).scan
  • #take #drop のマイナス引数対応

11 Books Every Ruby on Rails Developer Should Read

Rails 開発者必読の書籍 11 冊。

Code & Tools

TTY::Box: Draw Frames and Boxes in Your Terminal Window

CLI で四角い枠を描画してくれる gem。

FastJsonapi: A Super-Fast JSON:API Serializer for Ruby Objects

v1.3 がリリースされた高速 JSON:API シリアライズ用 gem。

Crystalball: Run Only the Specs You Need to Run

カバー率測定で、修正したファイルの関連 RSpec テストを特定してくれる gem。

OpenStreetMap: Ruby Gem for OpenStreetMap API Integration

OpenStreetMap API クライアント gem。

graphql-ruby: A Ruby Implementation of Facebook's GraphQL

GraphQL API フレームワーク用 gem。

Terraforming: Export Existing AWS Resources to Terraform Style

既存の AWS リソースを元に Terraform 用 .tf、.tfstate 設定を生成してくれる gem。

Ruby Weekly #408: 日本語サマリー

職場の Slack 窓で Ruby Weekly メルマガが毎週配信されます。その中から面白そうなものをピックアップして、日本語で簡単なサマリーを書くようにしています。そのサマリーをここでまとまさせていただきます。くだけた日本語で失礼いたします。

http://rubyweekly.com/issues/408rubyweekly.com

Highlights

Don't Step on a Rake, Use Rake::DSL

Rake タスク群の DRY 化は、メソッド抽出ではなく、Rake::DSL のクラスを抽出しよう。

TruffleRuby Now Easily Installable via RVM, rbenv, and ruby-install

TruffleRuby は rvm、ruby-build、ruby-install でインストールしやすくなった。

Ruby 2.6 Adds String#split with Block

Ruby 2.6 の String#split にブロック引数を渡せるようになった。"hoge".split { }"hoge".split.each { } は挙動的に変わらないが、ブロック引数のほうは Array オブジェクトを作らないためパフォーマンス最適化に使える。

How to Replace wkhtmltopdf for PDF Generation from Ruby

HTML → PDF 変換用 CLI ツール wkhtmltopdf の問題点と別案まとめ。

JavaScript-'Sprinkled' Rails Applications

フラグメントキャッシュを活かしたビューを、turbolinks:load イベント内 Ajax でユーザ毎にカスタマイズした話。

Articles & Tutorials

The Forwardable Module in Ruby

Forwardable#def_delegator#def_delegators#delegate メソッド解説。

Thin and Maintainable Rails Mailers

Rails 5.1 の ActionMailer::Base#params ハッシュで Mailer をリファクターした話。defaultbefore_action から params ハッシュが呼べるようになったおかげで、アクションメソッドの中身をインスタンス変数の代入と #mail 呼び出しのみに減らせた。

Everything You Need to Know About Ruby Operators

Ruby演算子まとめ。

How to Write a Case Expression in Ruby

case 文の使い方。

Code & Tools

SmartEnum: Enums for Ruby That Aren't Just Symbols

メソッドが生やせる enum 定義用 gem。enum のダックタイプまでチェックしてくれる。(未安定)

Pragmatic Segmenter: Rule-Based Sentence Boundary Detection

10 ヶ国語対応のセンテンス単位セグメンテーション用 gem。

XmlMatchers: Validate Your XML API Responses against XSD XML Schemas

XML レスポンスを XSD で検証するための RSpec Matcher を提供してくれる gem。

Easy GraphQL Caching with GraphQL Cache

graphql-ruby gem のフィールド別キャッシュ用プラグイン

InSpec: An Auditing and Testing Framework for Infrastructure

インフラ周りの RSpec 記法テストフレームワーク