rastam’s blog

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

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

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

http://rubyweekly.com/issues/395rubyweekly.com

Highlights

Ruby 2.5 Enables Thread.report_on_exception by Default

例外発生時にスタックトレースなど吐かずに無言で終了してたスレッドは、Rails 2.5 移行デフォで吐くようになった。

GraalVM: Oracle's Universal Virtual Machine

実験的な高パフォーマンス TruffleRuby がベースにしてる GraalVM。

NGINX Unit 1.0: An App Server That Supports Ruby (and Others)

NGINX のアプリサーバ NGINX Unit v1.0 リリース。

Running a Government Department on Ruby for Over 12 Years

Sequel、Roda のメンテナー Jeremy Evans 先生がカリフォルニア州監査局で 12 年も働いた経験を語ったスライド。

  • 政府機関発注の IT システムはほとんど高コストの巨大 SAP システムだが、カリフォルニア州監査局は低コストの小規模 Ruby ウェブアプリ
  • アプリが 3 つある:
    1. 局員管理などの局内処理用イントラネットサイト
    2. 入局試験や応募者評価用の採用サイト
    3. 監査完了後の政府機関への改善案の遂行までのワークフロー管理サイト
  • セキュリティ第一

Legend of The Sourcerer: A Ruby Text Adventure Game

Ruby 製テキストベース RPG

Tutorials

Full Text Searching Linux Man Pages with Elasticsearch and Ruby

Linuxman ページの ElasticSearch 検索機能実装手順。

Stop Robots and Crawlers From Causing Errors in Rails

ボットや検索エンジンクローラーが発生させたエラーを is_crawler gem で抑える方法。エラーログのノイズなどを減らすように。

For Want of Pattern Matching in Ruby: The Creation of Qo

実験的なパターンマッチング gem。

Where Are They Now? Revisiting Ruby 2.3's Goodies

2 年も前に Ruby 2.3 で導入された機能の振り返り。

  • &.
  • Hash#digArray#dig

Ruby's SignalException Exception

kill -9 などしたら、SignalExceptionrescue していても、処理が終わる前に強制終了してしまう。ちゃんと処理するには Signal.trap が必要。

Refactoring for the 'Tell Don't Ask' Pattern

漢字フラッシュカードゲームの正解判定ロジックを「求めるな、命じよ」パターンでリファクターした話。

Migrating from state_machine to AASM in Rails

メンテされなくなった state_machine gem から aasm gem に移行した手順。

Code & Tools

WordpRSS: Pull Any WordPress RSS Feed with Ruby

WordPress ブログの RSS フィード取得用 gem。

ActionPolicy: Authorization Framework for Ruby and Rails Apps

RubyRails アプリ向け認可フレームワーク gem。Pundit の物足りないところを補ってくれるらしい。

JSONAPI::Consumer: ActiveModel-Compliant Framework for Consuming JSON API Services

JSONAPI クライアント gem。インタフェースは ActiveModel 同等。

kms_encrypted: Simple, Secure Key Management for attr_encrypted

attr_encrypted gem がキー管理までやってくれないので、この gem が KMS 方式で管理してくれる。Amazon KMS、Google KMS 対応。

render_async: Render View Partials Asynchronously via Ajax

Rails ビューの partial を AJAX で非同期ロード、レンダー高速化してくれる gem。

jwt_sessions: XSS/CSRF-Safe JWT Auth for Single Page Apps

SPA 向け JWT セッション用 gem。XSSCSRF 対応付き。

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

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

http://rubyweekly.com/issues/394rubyweekly.com

Highlights

Rails 5.2 Released

Rails 5.2 リリース!Basecamp、Shopify で絶賛稼働中。

  • Active Storage
  • Redis Cache Store
  • HTTP/2 Early Hints
  • Bootsnap
  • CSP 用 DSL
  • Credentials
  • Webpack 3.0 対応

Measuring Branch and Method Coverage in Ruby 2.5

行カバーレッジのみ分析していた Coverage クラスは、Ruby 2.5 でメソッド、ブランチのカバレッジまで分析してくれるようになった。

A Dive into Ruby CVE-2017-17405: Identifying a Vulnerability in Ruby's FTP Implementation

Net::FTP が裏で呼んでいた libcurl 脆弱性の解説。

How to Migrate a Rails App from Heroku to Dokku

Heroku から安いクラウドに移行する手順。Heroku の便利な devops ツールは Dokku に。

Profiling Ruby's Memory Allocation with TCmalloc

Google 製の gperftools スイートの tcmalloc で Rubymalloc プロファイリング。SVG の図で可視化までしてくれる。

Hanami 1.2.0 Released

Hanami 1.2.0 リリース!

  • HTTP/2 Early Hints
  • UJS
  • REPL 付きの開発環境エラーページ
  • CLI フック
  • 外部 gem から操作可能なプロエクトレベルの Rack ミドルウェア
  • Hanami::Repository でカスタムの書き込みコマンドが定義可能に

Articles & Opinion

Interactive Debug Sessions in RSpec with Capybara

Launchy gem + binding.pry で Capybara のテストをデバッグする便利ヘルパー。

Add SMS Notifications to Your Rails App Using Twilio

Twilio で Rails アプリ発 SMS 通知機能実装。

面白いと思ったのはそもそもの課題。ニューヨークは道路掃除のため、駐車が許可されている路上スペースが定期的に変わる。変わったタイミングの通知が欲しかったらしい。車を移動させて罰金から逃れるように。

Adding Bash Completion to 'db:migrate:down'

migration のバージョン番号を補完してくれる .bash_profile 用スクリプト

5 Commercial Use Cases Continue to Prove the Value of Rails

意外と Rails だった 5 サイト。

Do You Really Need WebSockets?

複雑な WebSocket しかないと思われがちリアルタイム通信だが、サーバからの一方的なプッシュだけなら、比較的シンプルServer-Sent Events で十分。

  • HTML5 標準
  • RailsSinatra、Roda ではサポートされてる
  • 再接続機能完備
  • デメリットは、クライアント切断検知機能がない

ポーリングとも比較している。

豆知識:Facebook Messenger (ブラウザー版)は意外とポーリングで実装されている。

Code, Tools & Demos

sidekiq_profiling_middleware: A Tool for Profiling Sidekiq

stackprof または memory_profiler で Sidekiq をプロファイリングしてくれるミドルウェア gem。ダンプは S3 にエクスポート可能。

qo: Pattern Matching and Fluent Querying in Ruby

実験的なパターンマッチング gem。

The Ultimate Guide to Ruby Timeouts: Timeouts for Popular Ruby Gems

人気 gem のタイムアウト設定方法まとめ。

mysql2: A Modern, Simple and Fast MySQL Library

mysql2 gem は v0.5 リリースで Ruby 2.0+、MySQL 5.5+ 以外対応しなくなった。

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

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

http://rubyweekly.com/issues/393rubyweekly.com

Highlights

An In-Depth Look at a Ruby Vulnerability

String#unpack 脆弱性の解説。

ImageProcessing 1.0: Image Processing Helper Library

Shrine でお馴染みの ImageProcessing gem が 1.0 にバージョンアップ。

  • ImageProcessing::MiniMagick がチェーン可能な API になった。
  • EXIF メタデータを元に自動回転補正。
  • サムネールをよりシャープにする後処理。
  • ImageProcessing::Vips でサムネール生成高速化。

News

Ruby Sass to Be 'Put to Pasture' on March 26, 2019

sass gem が deprecate され、来年メンテ終了。Dart Sass へ移行推奨。

Isle of Ruby 2018: A British Ruby Event on April 13-15 (Exeter, UK)

今週末はイギリス・エクセター市の Isle of Ruby カンファレンス。

Tutorial

Graceful Errors in Ruby SDKs

SendGrid、Twilio、Stripe、Contentful の SDK gem のエラー処理比較。

SendGrid は 400、401 発生時に例外を投げず、その後のヌルポなどで初めてエラーが発覚。

Twilio は Twilio::REST::TwilioError を投げるが、エラークラスでもエラーメッセージでもエラー内容が分からない。

Stripe は 400、401 それぞれ専用のエラークラスを投げ、分かりやすいエラーメッセージを添えてくれる。

Contentful は 400、401 それぞれ専用のエラークラスを投げ、API レスポンスをパースしてエラーメッセージに埋め込んでくれる。

The Local Variable Aversion Antipattern

ローカル変数アレルギーはアンチパターンだという主張。

Tools

Gemsmith: A Command Line Interface for Smithing New Ruby Gems

gem 開発用 CLI

Code

Blueprinter: A Declarative and Fast Object to JSON Serializer

JSON シリアライズ用 gem。

Grape: An Opinionated Framework for Creating REST-like APIs

RESTful API 開発用 DSL を提供するフレームワークRailsSinatra と併用可能。

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

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

http://rubyweekly.com/issues/392rubyweekly.com

Highlights

A New Ruby Application Server: NGINX Unit

NGINX のアプリサーバ NGINX Unit が Ruby にも対応できるようになった。

Fuse Panel: A Graphical Interface for Passenger

Passenger の新しい Fuse Panel 管理画面紹介。

News

Gotham Ruby Call for Papers

ニューヨークの GORUCO 2018、CFP はあと 2 週間。

Tutorial

How to Deploy Rails Apps with Ansible, Capistrano and Semaphore

  • Ansible で AWS 上サーバ構築する手順
  • CapistranoRails アプリをデプロイする手順
  • Semaphore で CI をセットアップする手順

Share Your Gem's Changelogs on RubyGems.org

gemspec の metadatachangelog_uri を指定することで、RubyGems.org からリンクを張る。

Focused 'puts' Debugging with STDERR

デバッグ中に出力ノイズを省く戦略。

  1. 標準出力を /dev/null にリダイレクト。
  2. $stderr.puts でログを吐く。

Tools

Alki: A Dependency Injection Framework for Ruby

コンフィグやサービスオブジェクトを管理してくれる依存性注入フレームワーク

Code

Strong Migrations: Catch Unsafe Migrations at Dev Time

オンラインメンテで問題を起こしそうな migration を検知してくれる gem。

PpSql: ActiveRecord SQL Query Log Beautifier

ActiveRecordSQL ログやコンソール出力を pp のようにフォーマットしてくれる gem。

Envizon: A Network Visualization Tool Written with Rails

ネットワークをスキャン・可視化・管理する Rails アプリ。Docker イメージ付き。

Ruby Event Store 0.27 Released

イベント駆動アーキテクチャーのイベント永続化 Ruby Event Store gem。

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

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

http://rubyweekly.com/issues/391rubyweekly.com

Highlights

Rails 5.2.0 RC2: The (Hopefully) Last RC Before RailsConf

Rails 5.2.0 RC2 新機能まとめ

  • Active Storage
  • Redis Cache Store
  • HTTP/2 Early Hints
  • Bootsnap
  • CSP 用 DSL
  • Credentials

Managing DB Schema Changes Without Downtime

Discourse がゼロダウンタイムで DB スキーム変更を実現できた秘密。

  • schema_migrations テーブルに git_version などのカラム追加
  • カラム・テーブル削除は migration ではなく seed で
  • migration でカラム・テーブル削除ができないように pg gem をパッチ

デプロイ手順は

  1. migration 実行
  2. 新規 Docker イメージ作成
  3. 旧 Docker インスタンス停止
  4. 新規 Docker インスタンス起動
  5. seed 実行

Browser: A Browser Detection Library

ブラウザー検知 gem。

Rails Jumpstart: A Quick Way to Start New Rails Apps

新規 Rails アプリ作成用テンプレート。

News

RailsConf 2018 Schedule is Live

RailsConf 2018 スケジュール公開。

Tutorial

JSONify your Ruby Translations

DB 内 i18n データ永続化用定番 gem Globalize では、各モデルに紐付いた モデル名_translations テーブルで i18n データを保存。しかし取得時には、JOIN する負荷がかかってしまう。

Mobility gem の JSON・JSONB ストラテジーだと、モデルと同一テーブルの JSON 型カラムに保存することで、JOIN なしで取得できる。

なお Globalize 流ストラテジーなども完備している Mobility は多様性・拡張性抜群。

Better Passwords in Ruby Apps with the Pwned Passwords API

Pwned Passwords API を叩くことで、パスワードが流出しているかどうかの validation を実装する手順。

Quick Tip: Inspecting Ruby Gems

gem の中身を確認する方法 2 つ。

  1. リポジトリgit clone
  2. bundle show のパスに cd

How to Test Logs using RSpec Expectations and StringIO

StringIO を注入することで、ログ出力をテストする手順。

Story

From Rails to Clojure, to Java, then Back to Rails

6 年間の職歴を経て、Rails 2.3 → ClojureJava 8 → Rails 4.2 で開発した経験談

  • Rails 2.3 のモノリスを 40% ぐらいリファクター・改善してから Clojure 屋さんに転職。
  • Clojure は高速 + エンジニアの生産性が良かったが、エンジニアの採用が難しくて事業がなかなか成長できなかった。
  • 意外とリーンな Java 屋さんに転職して、エンジニアの生産性も意外と良かった。何でもかんでも POJO 作るのがちょっとめんどくさかったのにもかかわらず。静的言語のおかげで大規模リファクターができた。
  • Rails 4.2 は使い勝手が 2.3 とはそんなに変わらない割には、アップグレードが辛い。後方互換性の優れている ClojureJava に比べて。
  • いろんな言語の経験はエンジニアリング・マネージャには必須だが、シニア・エンジニア募集案件に応募するには特定言語の専門知識が足りない。

Code

Rails-DB-Interactive: Interactive Database Diagrams for Rails

Rails アプリのモデル図を生成する JavaScript アプリ。

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

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

http://rubyweekly.com/issues/390rubyweekly.com

Highlights

Why Won't Bundle Update?

bundle update の謎メッセージ Bundler attempted to update 〇〇〇 but its version stayed the same を調べて解消した話。gem の古いバージョンに依存している gem があることが原因だが、どの gem なのかは bundler だけでは知り得ない。bundler-stats gem で邪魔な gem を特定し、両 gem 一気に bundle update することで解決。この機能はこれから bundle show に入る可能性があるらしい。

We Demand Serverless Ruby

Ruby に対応するように、AWS Lambda や Azure Functions などの FaaS への請願。

Using 'yield_self' for Composable ActiveRecord Relations

yield_self を活かすことで、複雑な ActiveRecord クエリオブジェクトをリファクターした ThoughtBot。

25 Years of Ruby Commits, Visualized

25 年もの Ruby へのコミットを可視化した動画。

An Overview of Ruby GUI Development in 2018

RubyGUI アプリ開発ツールまとめ。

News

Parallel Testing Coming in Rails 6.0

テストの並列実行を Rails 6.0 に追加したプルリクエスト。デフォールトでは、プロセスのフォークで実現しているが、スレッドでの実行も任意で選べる。

Coinbase Funding Ruby Projects with its Open Source Fund

Coinbase OSS 基金は今月 Ruby 関連プロジェクトに献金することになった。補助対象プロジェクトは Ruby Together、RSpec、Rubocop。

Tutorial

Ruby 2.5's New Exception#full_message Method

Ruby 2.5 の Exception#full_message でフォーマットされた例外とバックとレースを取得できるようになった。

The Proxy Pattern Revisited

プロキシデザパタは昔、Ruby では method_missing で実装されていたが、デメリットとしては:

  • プロキシオブジェクトを呼ぶ手間があった
  • パフォーマンスのコストがかかった
  • クラスメソッドまで対応するには別のプロキシオブジェクトが必要になった
  • どんなメソッド呼び出しでも拾ってしまい、責務の範囲が広すぎた

Ruby 2.0 以降は prepend上記問題点解消。

Run Capybara Feature Specs with Selenium and Headless Chrome

CircleCI 2.0 で Chrome Headless + Selenium の Capybara feature spec を実行する手順。おまけに並列実行の CircleCI 設定。

Yes, Ruby 1.9 Can Support TLSv1.2

TLSv1.0、v1.1 が非対応になったせいで、バージョンアップを迫られてきた Ruby 1.9 ユーザだが、それでもバージョンアップがまだできないというユーザ向け一時しのぎの手順。

Tools

Test Kitchen: An Integration Tool for Testing Infrastructure Code

インフラコードのテスト用のテストフレームワーク(ServerSpec など)や実行先(Vagrant、Docker、EC2、GCE、DigitalOcean など)を管理するツール。

Code

FasterPath: Faster Pathname Handling for Ruby with Rust

Rust で Pathname を高速化した FasterPath gem が最近更新されている。

Doorkeeper: An OAuth 2 Provider for Rails and Grape Apps

OAuth 2 用 Rails Engine。

pwned: A Ruby Wrapper for the Pwned Passwords API

パスワード流出確認用 Pwned Passwords APIRuby クライアント。

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

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

http://rubyweekly.com/issues/389rubyweekly.com

Highlights

Timeasure: A New Transparent In-Production Profiler

メソッドレベルのプロファイリング用 gem Timeasure を実装した経緯。

  • NewRelic より柔軟なインタフェース提供
  • ruby-prof gem より軽くて本番環境でも使える

An Epic Collection of Ruby One Liners

ruby CLI コマンドのワンライナー集。

How Ruby 2.5 Prints Backtraces and Error Messages

Ruby 2.5 のバックトレース出力順のデモ。

Rack::Reducer: Map URL Params to Functions That Filter Data

絞り込み条件用 URL 引数を scope などにマッピングしてくれる gem。

Using Genetic Algorithms in Ruby

Ruby遺伝的アルゴリズム実装。

News

Ruby Up From 12th to 9th in the Latest TIOBE Index

プログラミング言語人気ランキング TIOBE で Ruby が 12 位から 9 位に上昇。

12 Ruby Conferences You Should Attend in Spring 2018

今年前半の Ruby カンファレンスまとめ。

Tutorial

Ruby Memory Usage Vocabulary Explained

Ruby のメモリ関連用語解説。

Implementing a Basic Debug Mode for Your Ruby CLI

Ruby CLI アプリのデバッグモード実装。

Solving CAPTCHAs with TensorFlow and Ruby

TensorFlow ライブラリの機械学習CAPTCHA を突破した話。

Considerations When Upgrading a Rails App from 4.2 to 5.0

Rails 4.2→5.0 バージョンアップ時の懸念点まとめ。

Opinion

Why Ryan Bigg Likes Hanami

Ryan Bigg 先生が Hanami を試した感想。

  • Repository パターンのおかげで、モデル層関心の分離ができるのが良い
  • Action 別クラスのおかげで、コントローラ層関心の分離ができるのが良い(params の validation とか)
  • View クラスのおかげで、ヘルパーがグローバルで公開されないのが良い

Tools

Licensed: Cache and Verify the Licenses of Dependencies

依存している gem のライセンス管理用 gem。

Server Timing Response Headers for Rails

Rails サーバ側パフォーマンス計測データをレスポンスのヘッダーに埋め込み、Chrome コンソールで確認できるようにしてくれる gem。

Code

semantic_logger: A 'Next Generation' Logging System

スループット・低レイテンシーのログ処理用 gem。NewRelic、Sentry、HoneyBadger、ElasticSearch などのログ出力先に対応。

Invisible Captcha: Unobtrusive Spam Protection for Rails

honeypot 型 captcha 用 gem。非表示チェックボックスでボット排除。

Flipper: Fast and Simple 'Feature Flipping' for Ruby

フィーチャフラグ定番 gem の最新リリース。