週刊Railsウォッチ(20180702)Ruby 2.2メンテ正式終了、Ransackがつらくなるとき、書籍『Domain-Driven Rails』、GitHubの高可用MySQLほか

こんにちは、hachi8833です。これまで金曜夕方に刊行していた週刊Railsウォッチを月曜夕方に移動いたします。今後ともどうぞよろしくお願いします。

7月最初のウォッチ、いってみましょう。

各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ

Rails: 先週の改修

というわけで「今週の改修」改め「先週の改修」となります。

先週は公式の更新情報はなかったのでmasterから見繕いました。今回は一息ついたのかドキュメント更新の方が盛んです。

Date#wdayの対応付けを修正

DeepCoverというカバレッジツールによると、wday != 0 ? wday - 1 : 6一貫していない部分があったそうです。

# activesupport/lib/active_support/core_ext/date_and_time/calculations.rb#L5
 module DateAndTime
   module Calculations
     DAYS_INTO_WEEK = {
-      monday: 0,
-      tuesday: 1,
-      wednesday: 2,
-      thursday: 3,
-      friday: 4,
-      saturday: 5,
-      sunday: 6
+      sunday: 0,
+      monday: 1,
+      tuesday: 2,
+      wednesday: 3,
+      thursday: 4,
+      friday: 5,
+      saturday: 6,
     }
     WEEKEND_DAYS = [ 6, 0 ]

つっつきボイス:monday始まりがsunday始まりに変わったみたいです」「この辺ってPOSIXで決められてなかったっけ?🤔」

後で調べたら以下のようになってました。

%w Weekday as a decimal number [0,6] (0=Sunday).
pubs.opengroup.org dateより

「なんでもDeepCoverというカバレッジツールで見つかったんだそうです(後述)」「あーRubyKaigi 2018で説明されてましたねそれ😀: 確かにcurrent_day_number = wday != 0 ? wday - 1 : 6だと悲しい😆」「😆」「😆」「この数値がデータベースに入ってたりするとつらいだろうけど、そのまま使うことはないだろうしねー」

「そういえば週の日曜始まりと月曜始まりも文化圏で違ってますね」「そういえば🧐」

参考: 曜日 - Wikipedia

週が始まる日を、日曜日とすることもあり、また月曜日からとするところもある。アメリカ製のカレンダー、ヘブライ語、ポルトガル語、アラビア語、ペルシア語、ベトナム語などでは前者であり、フランス製のカレンダーなどは後者である。イスラム圏では金曜日が公休日になっていて、カレンダーも土曜日から始まるものがある。【中略】日本で販売されているカレンダーには日曜始まりのものと月曜始まりのものが混在している。

fetchでエラーハンドリングを改善

# activesupport/lib/active_support/core_ext/date_and_time/calculations.rb#L265
     def days_to_week_start(start_day = Date.beginning_of_week)
-      start_day_number = DAYS_INTO_WEEK[start_day]
+      start_day_number = DAYS_INTO_WEEK.fetch(start_day)
       (wday - start_day_number) % 7
     end

これも上のdd7f8caに関連しているっぽいです。


つっつきボイス: 「これは普通に#fetchでやるやつですね🕶: fetchだとハッシュの値がnilならデフォルトでnilを返す」「ぼくちょうど今日#fetch調べてました❤️たしか第2引数にデフォルト値を設定できるんですよね」「お〜いいタイミング!😋」

#fetchってstrong_parametersで使われたりしますよね?」「まあそれに限らずハッシュにアクセスするときには#fetchっていろいろ便利ですね」「😃」

Rubyスタイルガイド「7-14【統一】ハッシュのキーの存在を前提にする場合はHash#fetchを使うこと」から一応。


heroes = { batman: 'Bruce Wayne', superman: 'Clark Kent' }
# 不可 - キーが無効でもエラーにならない
heroes[:batman] # => 'Bruce Wayne'
heroes[:supermann] # => nil

# 良好 - KeyErrorでキーがないことを検出できる
heroes.fetch(:supermann)

参考: instance method Hash#fetch (Ruby 2.5.0)

# ruby-lang.orgより
h = {one: nil}
p h[:one],h[:two]                        #=> nil,nil これではキーが存在するのか判別できない。
p h.fetch(:one)                          #=> nil
p h.fetch(:two)                          # エラー key not found (KeyError)
p h.fetch(:two,"error")                  #=> "error"
p h.fetch(:two){|key|"#{key} not exist"} #=> "two not exist"
p h.fetch(:two, "error"){|key|           #=> "two not exist"
    "#{key} not exit"                    #  warning: block supersedes default value argument
  }                                      #  警告が表示される。

h.default = "default"
p h.fetch(:two)                          # エラー key not found (KeyError)

ドキュメント更新関連


つっつきボイス: 「今回は夏枯れなのか、ドキュメントの細かな更新が多かったです🌞」「話逸れるけどbogdanvlvivというお名前が凄っ」「ボグダンってブルガリアとか東ヨーロッパのあたりの名前な気がしますね」「プロフィール見るとウクライナでした」

ついこの人の名前を思い出してしまいました↓。

参考: Bogdan Maglich - Wikipedia — MIGMAを考案したユーゴスラビアの核物理学者(故人)
参考: Migma - Wikipedia — 原子を1個ずつ核融合させる発電方式

MIGMA、未だに実用に達していないようで残念です😢。

Rails

書籍『Domain-Driven Rails』

翻訳記事でお世話になっているArkencyが昨年出した本です。


同記事より

  • クラスがいつしかカラム50個/メソッド数百個になる理由と回避方法
  • Service Object/Form Object/シリアライザなどの水平層を加えるだけではうまくいかない理由: むしろ垂直の境界に着目すべし
  • ドメインからオブジェクトをモデリングする3つの技
  • ドメインロジックに関係ないコードをどこに置くか
  • Service Objectには2種類ある: どちらをどう使い分けるか
  • コマンドとイベントは何が違うか
  • Service Objectの爆発を避けて凝集度を下げないようにする方法
  • システムを拡張可能にし、癒着をドメインイベントやハンドラで切り離す方法
  • 長大なビジネスプロセスの流れを整理する
  • 副作用をハンドラに切り出してクラスをスリムにする
  • 「控えめなレポート出力」を構築する
  • イベントソーシングを行うドメインで、一時的な側面に対する洞察を提供する

つっつきボイス: 「昨年からあった本なのに気づいてませんでした💦: 上は概要を雑に訳したものですが、以前から社内でおっしゃってた『Service Objectは実は2種類あるのでは?』的なことが書かれてるようです: これ他では今まで見かけたことがなくって」「おー、そう思ってるのが自分だけじゃなくてちょっと安心したー😋: 何というか、みんながService Objectと信じているものが実は2種類あって、それが混じったまま話されるからややこしくなってるんじゃないかなって😆」「どんな2種類でしたっけ?」「まあざっくり思っているのはひとつがFacadeパターン的なもので、もうひとつはCommandパターン的なもの」「ともあれこの本は良さそう❤️クーポンどっかなかったかな…」「これ読みたい人きっと多そうですね(翻訳してみたい…)」

「この本の価格体系見ると、練習問題とか動画付きのもあるナ: 動画使ってまで見ようとはあまり思わないけど😎」「大学のコースなんかでは動画は重宝されそうですね」「動画は見るのに時間かかるんで😆」「字幕があればいいんですけどね」

Ransackで検索フォーム

<-- 同記事より -->
<%= search_form_for @q do |f| %>
  <%= f.search_field :id_eq %>
  <%= f.submit  %>
<% end %>

つっつきボイス: 「これはまあ普通のRansack紹介記事かな」「ですね: これは枕で、Ransackってどのあたりからつらくなるのかなというのがちょっと知りたくて」「なるほど: Ransackはですねー、割と早い段階でつらくなりますよ😎」「あーやっぱり😆」

「Ransackはいわゆる検索フォームを簡単に作れるやつで、上のようにsearch_form_forを使って、たとえば_eqなら完全一致とか_gteqなら大なりイコールというふうに条件を指定できる」「ふむふむ」


READMEより

「で、READMEに載っているようなマッチャー↑をシンプルに使って単純なフォームを作っているうちはいいんですが、Ransackで複雑なSQLを検索しようとするとどんどん大変になっていく」「😓」「JOINとかやりはじめるとデータ構造がみるみる複雑になっていくんですよこれが: 一応できるんだけど、つらい😭」「Ransackを1個のテーブルに対して使っているうちは全然大丈夫なんですが、JOINすると一気にフォームパラメータがネストで読みづらくなる」「ひえー🤮」

「ちょうど今日の勉強会でも話したんですが、JOINしたテーブルをRansackで使うなら、まずビューでJOINしておいてそれに対してRansackを使えばずっとシンプルになるはず、理論上は🕶」「なるほどー」

# READMEより
def index
  @q = Person.ransack(params[:q])
  @people = @q.result.includes(:articles).page(params[:page])

  # or use `to_a.uniq` to remove duplicates (can also be done in the view):
  @people = @q.result.includes(:articles).page(params[:page]).to_a.uniq
end

「上みたいに元テーブルに対してincludesなんかでJOINしたものをひとたび作ってしまうと、フォーム側がname_or_description_or_email_or_articles_title_contみたいに長大になってしまうんですよ↓」「…これはひどい😰」

# READMEより
<%= search_form_for @q do |f| %>

  # Search if the name field contains...
  <%= f.label :name_cont %>
  <%= f.search_field :name_cont %>

  # Search if an associated articles.title starts with...
  <%= f.label :articles_title_start %>
  <%= f.search_field :articles_title_start %>

  # Attributes may be chained. Search multiple attributes for one value...
  <%= f.label :name_or_description_or_email_or_articles_title_cont %>
  <%= f.search_field :name_or_description_or_email_or_articles_title_cont %>

  <%= f.submit %>
<% end %>

「上はまだRailsのヘルパーだからましなんですが、これをAjaxで扱おうとすると途端にJSONの構造まで複雑になる: えーとどこかにそれっぽいものはあるかな…これだっ↓こういうJSONになっちゃう」「😹」

参考: Ransackで簡単に検索フォームを作る73のレシピ - 猫Rails

params[:q]
=> {
  "c" => {
    "0" => {
      "a" => { "0" => { "name" => "id" } },
      "p" => "eq",
      "v" => { "0" => { "value" => "1" } }
    }
  }
}

「あとRansackでANDとかORを使うのもヤバイです(特にOR): この構造ならconditionで絞り込んだビューを作っておけば楽にできるんだけどなあ…」「勉強になった!😀」

SPAでCSRFを効かせるには(Ruby Weeklyより)


つっつきボイス: 「へーみんなどうやってんのかな?: ちなみにRailsのCSRFトークンはMETAタグの中に入るんで取り出すこと自体は難しくないですが、ただCSRFトークンには何回でも使えるCSRFトークンを使う方法と、1回しか使えないCSRFトークンを毎回発行する方法の2種類があって、後者はSPAでたぶん毎回Ajaxで更新しないといけないでしょうね: その分後者の方がセキュアですが」「😀」「ページを戻ってPOSTすると失敗するのはたいていこれで、自分の好きでないやつ😤」

# 同記事より
class ApplicationController < ActionController::Base

  after_action :set_csrf_cookie

  def set_csrf_cookie
    cookies["my_csrf_token"] = form_authenticity_token
  end
end

RubyMoney gemシリーズ

# 同リポジトリより
require 'money'

# 10.00 USD
money = Money.new(1000, "USD")
money.cents     #=> 1000
money.currency  #=> Currency.new("USD")

# Comparisons
Money.new(1000, "USD") == Money.new(1000, "USD")   #=> true
Money.new(1000, "USD") == Money.new(100, "USD")    #=> false
Money.new(1000, "USD") == Money.new(1000, "EUR")   #=> false
Money.new(1000, "USD") != Money.new(1000, "EUR")   #=> true

# Arithmetic
Money.new(1000, "USD") + Money.new(500, "USD") == Money.new(1500, "USD")
Money.new(1000, "USD") - Money.new(200, "USD") == Money.new(800, "USD")
Money.new(1000, "USD") / 5                     == Money.new(200, "USD")
Money.new(1000, "USD") * 5                     == Money.new(5000, "USD")
...

以下の記事にも載っているmoney-rails以外にもあるんですね。

Ruby on Railsで使ってうれしい19のgem(翻訳)


つっつきボイス: 「もう名前で遊んでる🤣」「monetizeとかMoneyを作るとか😆」「新しい動詞が誕生した感🕶」

RailsのDateTimeフォーマットのサイト


同サイトより


つっつきボイス: 「開いてみるとわかりますが、本当にこの情報だけが載ってます: もしかしてDateTimeでググる人をキャッチする用かなと?」「😆」「これ何だったっけなーと思ったら、DateTimeのi18n変換にこうやってシンボルを指定したときにそれぞれこういうフォーマットで表示されるってことね: まあ普通手元で試すけどねっ😎」

「これ見てて、以前MMDDYYとかDDMMYYみたいな日付表記で地雷踏んだのを思い出しちゃいました: ずっと前に海外の複数拠点と初めて仕事でやりとりしたとき、日付が02-05-08みたいな感じで指示出しされて2月5日なのか5月2日なのかが解釈が入り混じってとうとう…😭」「あーこういうやつですね↓」「それそれ」「DMYMDYYMD…こんなにあるし…」「その時以来日付は必ず02-May-2008みたいに誤解の余地のない書き方にしてます😤」


Date format by country - Wikipediaより

maily: 送信メールをプレビューするRailsエンジン


同リポジトリより


つっつきボイス: 「おーHTMLメールもプレビューできるのか: 悪くなさそう❤️」「このmailyという名前を見てて思い出したんですけど、いつだったか『Rubyのgemはキラキラネームが多い』みたいな記事を見たのを思い出しちゃいました😆」「まー他所のライブラリだってそんな変わらないし😆: ただよく言われるけどライブラリにいい名前をつけるって実はとっても大事で、いい名前がつくと開発のモチベーションが続いて最後まで作り切るみたいなところがありますね」「😃」「ときどき名前から全然機能が推測できないライブラリとかありますけど…」「よほど単機能ならともかく、機能をズバリ推測できる名前を付けるのがこれまた難しいという: 後はもうSEO的に頑張るぐらいしか😆」「😆」

その他Rails


つっつきボイス: 「これも名前つながりで」「IDLってなんだっけ: インタフェース記述言語か」「まあ確かにGraphQLってクエリか?っていうとそうも言い切れないし、雰囲気的にはIDLとかXSLT的なものに似てる感ちょっとある: 型を指定するとそれに合わせて返ってくるあたりが」「😀」「ともあれGraphQLという名前がキャッチーなのは間違いないっすね: ResouceIDLだったら果たしてどうだったか😆」「😆」


ちょうどFirebaseで流出ありましたね。

つっつきボイス: 「FaaS(Function as a Service)ってまた新しい言葉が😆」「何とかaaSって多すぎ🤣」「中身はだいたい既存の概念だったりすること多いし: FaaSもRPCとどう違うんだか😆」


つっつきボイス: 「🤣」「🤣」

Ruby trunkより

DevelopersMeeting20180718Japan

いつもと毛色の違うIssueが掲載されていたので何だろうと思ってしまいました。コアコミッターがオフラインで集まってチケットを解決するというイベントのようです。

参考: Main - Ruby - Ruby Issue Tracking System
参考: DevelopersMeetingRealtimeGuidelines - Ruby - Ruby Issue Tracking System — ガイドライン


つっつきボイス: 「そうそう、前からこれ定例でやってますよ: RubyKaigiでも話してなかったっけ?」「今まで全然気づいてなかった💦」「2014年から結構回数重ねてますね😃」

O_CLOEXECフラグが使えないLinuxがある


つっつきボイス: 「お、また知らないフラグが😲フラグってほんといろいろあるからなー」「このissueはRubyのせいではなかったと」

参考: Man page of OPENO_CLOEXECはLinux 2.6.23 以降となっています。

デフォルトでは、新しいファイルディスクリプターは execve(2) を実行した後も オープンされたままとなる (つまり、 fcntl(2) に説明がある FD_CLOEXEC ファイルディスクリプターフラグは最初は無効である); 後述の O_CLOEXEC フラグ を使うとこのデフォルトを変更することができる。 ファイルオフセット (file offset) はファイルの先頭に設定される (lseek(2) 参照)。
上man pageより

Process.waitとMJITコンパイラ

Rubyが子プロセスをウェイトしようとすると、MJITのgcc/clangプロセスがそのメソッド呼び出しに捕まってしまう可能性がある。これはRubyユーザーにとってもMJITワーカースレッドにとってもうれしくないので、Process.waitやその関連機能は何らかの形でウェイトを避けるべき。
同issueより


つっつきボイス: 「スレがかなり伸びてて今はちょっと追えない感じ」「例のnormalpersonさんも登場している」「お、normalpersonさんの名前がカッコ書きで表示されてる: 前はなかった気がするけど」「ほんとだ」「これで謎の人感が少しは和らぐかな😉」

Ruby

Ruby 2.2がメンテナンスモードも終了(Ruby公式ニュースより)

今年3月のウォッチでRuby 2.2がメンテナンスモードに入ったことをお知らせしましたが、この度完全にサポート終了しました。

  • 2.5シリーズ: 現在通常メンテナンス
  • 2.4シリーズ: 現在通常メンテナンス
  • 2.3シリーズ: セキュリティメンテナンス(極めて重要なセキュリティ修正のみ対応)

つっつきボイス: 「もう2.2終わりかー、月日の流れるのは早い🌙🌠」「お知らせに気づくの遅れました😓」

deep-cover: Ruby向けカバレッジツール

Rubyビルトインのカバレッジより手広くチェックしてくれるそうです。

Feature MRI DeepCover
Line coverage partial
Node coverage no
Branch coverage partial
Method coverage ~
Slowdown < 1% ~20%
Platform support Ruby 2.5+ Ruby 2.1+, JRuby
Branch coverage MRI DeepCover
if / unless / ?:
case / when
❘❘ / && no
foo&.bar
{❘foo = 42, bar: 43❘} no
while / until !

TruffleRubyがRVMとruby-buildでサポート(Ruby Weeklyより)

TruffleRubyといえばRubyKaigi 2018のキーノートで圧倒的な印象を残しましたね。今更ですが、RubyKaigiの動画またはスライドはひととおり出揃ったようです。


同リポジトリより

TruffleRubyをインストールするには原則としてGraalVMが、GraalVMをインストールするにはLLVMやzlibやlibsslが必要だそうです。

以下を参考にrbenvでインストールしてみました。LLVMさえインストールしておけば割とすっとできました。

参考: TruffleRubyを動かしてみた - Qiita

しかしbundle installでRails 5.2をインストールしようとするとこれと同じエラーが発生してnokogiriでコケました(´・ω・`)。


つっつきボイス: 「TruffleRubyはOracleが手がけてるJavaベースのRuby実装でむちゃくちゃ速い: あれ?rbenvでは前から動いてなかったっけ?」「そういえばそんな気も…」「さすがにTruffleRuby上でRailsはとりあえず動きませんでした↑」「そりゃまあねー、結局JavaなんでgemのC拡張に対応してないから🧐」「やっぱりそうだったかー」「RubyのCライブラリは.soのマッピングとか要するに普通のLinuxプロセスのマッピングになってるからそのままじゃまず動かないと思いますよ: 確かMySQLクライアントなんかも動かなかったと思うし(最近はどうだったかな…)そういうのも動かないのはなかなかキツイ🤔」「ふーむ」「将来は対応する予定とか何とか言ってたと思うけど😉」

JRubyもTruffleRubyと同様Javaベースで速いみたいですね」「JRubyはエンタープライズ領域で使われてるし歴史もあるし」「JRubyでしか起きないエラーを踏んだときの解決がつらいって何かの発表で聞いた覚えあります」「そこはもうマイナーの宿命で、本家Rubyがリファレンスですからねー😎」


jruby.orgより

Rubyコードをフローチャート化(Ruby Weeklyより)


同記事より


追いかけボイス: 「もしかしてダックタイピングってフローチャートにしづらい?」「フローチャートには乗せようがないヤツ🕶」

参考: ダック・タイピング - Wikipedia

Rubyにパターンマッチング構文がまだないから試しに作ってみた

おなじみzverokさんの記事です。

Ruby: ありそうでなかったRubyリファレンスの決定版を作った(翻訳)


つっつきボイス: 「あー、この↓感じ、Elixirか何かで見たような覚えが🤔」「記事はあくまで提案で、これをたたき台に議論しましょうという趣旨ですね」「テストできるシンプルなAPIなんかをこれっぽく書けたりするといいかも」

# 同記事より
when ((Numeric, Numeric), Hash) # nested sequences
  # call-sequence may have been `parse_coordinates([57.0, 32.0], strict: true)`
when (:skip, _, _, Numeric)     # as in method args, _ has a special meaning of "ignore this"/match anything
when (*Numeric)                 # array of any size, but all numerics
when (*/\d+(\.\d+)?/)           # array of number-alike strings, of any size
when (Numeric, Numeric, radius: Numeric, **) # are we too far yet?..

型を変数名に含めるとは

一度は誰しも考える気がしました。

参考: ハンガリアン記法 - Wikipedia


Wikipediaより


つっつきボイス: 「変数名に型をねー😅、と思ったら、抄録↓見ると構文からの型推論が難しいから名前から型推論しようよって趣旨か」「ハンガリアン記法って何だったっけと思ったら、iで始まると整数、みたいなやつでした↑」「RubyでそれやったらRubyの特徴が失われちゃう気がしますね」「まあRubyだとそうなっちゃいますけど、この感覚はJavaの世界なら割とありますよ: 一時的に使うインスタンスなんかでクラス名を_なんちゃらみたいに付けたりとか」「へー!😲」「その書き方を常に強制されるんならやめて欲しいけど、特定の書き方に沿っていれば型チェックしてくれるぐらいのレベルなら元Java書きとしてはまあ悪くないんじゃね?とは思う」

型推論は,構文パターンから型を推論する方法で,型アノテーションなしで静的型付けを実現する.ただし,構文パターンからの型推論はアルゴリズムが複雑になりがちですべての言語に採用しにくい問題がある.本発表は,よりお手軽に型推論を実現するため,名前からの型推論を提案する.まず,実際のソース・コードを解析し,型と名前の法則性を調べる.それに基づき,名前からの型を推論するシステムと言語設計を定義した.我々は,これらのアイディアを関数型スクリプト言語konoha 5λに実装し,その使いやすさを検証し報告する.
IPSJ-TPRO1102006.pdf論文抄録より

Rubocopのケツカンマ


つっつきボイス: 「スタイルはどう転んでも揉めますね😓」「まー自分も個人的にはtrailingカンマありが好きなんだけどRubocopのデフォルトはそうじゃないし: これはもうプロジェクトに置いてあるrubocop.ymlにみんなで従うしかないっしょ😇」

Rubyスタイルガイドを読む: コレクション(Array、Hash、Setなど)

書籍「Kestrels, Quirky Birds, and Hopeless Egocentricity」


leanpub.comより

ただいま翻訳中のFunctional Programming in Ruby — State – Brandon Weaver – Mediumという記事で紹介されていました。Rubyのメタプログラミングでコンビネータ論理する本だそうです。

参考: コンビネータ論理 - Wikipedia


つっつきボイス: 「ブログ記事を書籍化したものらしくて、無料でダウンロードできるというので❤️」「謎の本…」

その他Ruby

つっつきボイス: 「↑このDevMemoっていうサイト、本当にRubyのEnumerableを学ぶためだけのサイトなんだそうです😆」「単機能シングルドメイン🤣」「ログインして使ってみないとわかりませんが」


参考: Turing Complete FMミートアップ|IT勉強会ならTECH PLAY[テックプレイ]

つっつきボイス:先週のウォッチTCFMミートアップのことを取り上げたのがきっかけで私もしれっと参加したんですが、Matzが本当に楽しそうでよかったなーと思っちゃいました❤️」「😃」「Matzは普段よそのイベントに仕事抜きで顔を出す機会がなかなかなさそうなんでなおさらかなと」

なお、最新のTCFM第25回をうつらうつら聞いてたら、そのうちMatzがTCFMに出演するかもと言ってたような気がします(違ってたらごめんなさい)。


クラウド/コンテナ/インフラ/Linux

WPA3といえば


つっつきボイス: 「今度のWPA3って大丈夫なんかいな〜🤤」「IPA試験でWPA2が出題された翌日に脆弱性が見つかったんでしたっけ?」「そうそうw あれ翌日だからよかったけど前日に見つかってたら『安全性の高い方式を選べ』問題が解なしになるところだったし😆」「😆」

参考: Wi-Fi Protected Access - Wikipedia — WPA2やWPA3の解説

GitLabがAzureからGCPに移行中

aws-sdk-ruby


つっつきボイス: 「これはもうすっかり定着?」「ですね: 何しろ公式なんで最新のAPIにすぐ対応してくれるのがエライ😋」「後は早くLambdaでRubyが動くようにして欲しいな〜😆」「😆」

APIゲートウェイにEnvoyを選んだ理由(WebOps Weeklyより)


つっつきボイス: 「Envoy?知らないなー🤔Nginxやもちろん、HAProxyも前から使われているけど」「こういうハイパフォーマンスを要求されるミドルウェアはGo言語で書くのもひとつの手かも」「記事の中に出てくるL7プロキシって何でしょう?」「まあ多少余分に仕事をするプロキシというか」「コンテンツに手を突っ込むとか?」「あーそこまでは普通しないかな(やることもなくはないけど)ヘッダーを書き換えたりとか」

Nginxは気をつけないと容易に地獄化するヤツ: RubyKaigi 2018でもNginxの設定があまりにつらいからmrubyで書く方がいいよみたいな発表があったぐらい、Nginxの設定はマジつらい😵」

「もしかしてsendmail.cf並につらい?」「あそこまでひどくはないけど🤣、sendmail.cfは人間が読むもんじゃないw」「機械語みたいな?」「いやーいわゆる古典的なマクロなんですね: あるいはSELinuxのポリシーファイルを生で読むのに近いレベルというか、機械にやさしくて人間につらい書き方😹」

参考: Envoy Proxy - Home


envoyproxy.ioより

参考: Envoy (Envoy proxy)、Istio とは? - Qiita


haproxy.orgより

その他クラウド/コンテナ/インフラ/Linux

つっつきボイス: 「あーちょうど今日こんなやりとりしてたわ: 『SSL化』って言葉と『HTTPS化』って表記ゆれしてるなーと思いながら資料書いてた😅」「😆」「何しろ今はSSLというものはもう世の中にはないということになってるから🤣」「せっかく世間に浸透し始めた言葉なのにハシゴ外されてしまった感😆」

「そういえば応用情報処理試験の教科書には『SSL/TLS化』って書いてましたね」「おーさすがIPA: BPS社内でIPAの試験を推している理由のひとつは、問題を作っている人たちのレベルが高くてそのあたりの正確さをちゃんと担保しているからなんですね」「確かにー」「誰が読んでも誤読しようのない問題を作っているところとかマジ凄い: 別の某認定試験なんかだと『これ、答え存在しないんじゃ?』としか思えない問題ありますからねー😎」「歴史が長いから?」「というよりレビューがみっちり行われているからでしょうね: あの問題をきれいに解けるようになった人なら、そういう表記ゆれ/解釈ゆれのない文章を書けるようになるんじゃないかな」「😃」

「SSLって用語も俗称として残しちゃえばいいんじゃ?って思っちゃいます😆」「『狭義のSSL』と『広義のSSL』とかね😎」「JavaScriptだって厳密なことを言えば『狭義のJavaScript』はNetscapeのJavaScriptしかないわけですから」「あ、そっか!😲」「広義の意味ではECMAScriptってことになるけど、ただしECMAScriptという実装は、ないw」「🤣」

SQL

PostgreSQLが遅いと思ったらやること(Postgres Weeklyより)


つっつきボイス: 「PostgreSQLが遅くなる原因で割とあるのがコネクションが詰まるというパターンですね: だからなのかPostgreSQLはコネクションプールも一緒に使われることが多くて、詳しくはわからないけどMySQLではあまりコネクションプールって使われないんですよ」「おー😲」「もしかするとMySQLと比べて新しいコネクションを張るのが重い傾向があるのかもしれないですね」

「記事にもあるけどPostgreSQLはpg_stat_*系が充実してて、ここをチェックするのがいいですね: MySQLはこの辺の情報があまりなくて、スロークエリをゼロ秒にして全クエリを再生して統計を取るとかPercona Toolkitを使うとかしないと追いかけづらい」「ふむぅ🤔」

「ちな最近PerconaはPostgreSQLもサポートしてます↓: あとPercona版のMySQLも出しててクエリチューニングのときに便利😋」「へー!」「MySQLで1個のクエリが遅いだけなら単独でもわかるんですが、たとえばとてもよく似たクエリが100個あって結果として全体が遅い、なんてのはスロークエリを調べても取れないので統計を調べないといけない」

参考: Percona Support for PostgreSQL


percona.comより

「記事の4.1にあるSystem load↓、普通これを真っ先に見ると思うな😎」

# 同記事より
load average: 3.43, 5.25, 4.85

「あと可用性がめちゃめちゃ高いデータベースだとログ出力のところが詰まるというのもよくある話で、syslogだとそれをさばききれなくてつらくなるとかありますね」「😃」

PostgreSQLで日付を扱うときのコツ(Postgres Weeklyより)


つっつきボイス:interval演算子!こういうのがあるからぽすぐれエライ!」「ほんと何でもある感じですね❤️」「ほんにそう:やばいぐらい何でもある」

「前にも話したし今日の勉強会でも話したんですけど、データベース研究者が参考実装にPostgreSQLを使うというのが長年広く行われていて、新機能がOracleよりも先に導入されることもしょっちゅうだし: まあ商用データベースは新機能をほいほい入れないものですけど、PostgreSQLは論文が出たと思ったらもう機能足されてるなんてざらで、その分バグもあったりしますが😆」「😆」

「そういえば最近Google CloudのBigQueryはこのintervalみたいな柔軟なクエリが多くてなかなかいいと思いましたねー」「おー😲」「ウィンドウ関数とかでちょっと感心するようなものがいろいろある: 使いこなしには気合いが必要でしょうけど🕶」

Googleクラウドのロゴ引用は何だか面倒くさそうなので止めておきます(´・ω・`)。

BDE

これで合ってるのかな?

参考: BDE,SQL Linkとは

GitHubのMySQL可用性が高い秘密(WebOps Weeklyより)


githubengineering.comより


つっつきボイス: 「GitHubがMySQL使ってるって初めて知った!😲」「😲」「😲」「これ翻訳してみたいです」「あくまで推測だけど、GitHubは単一のクラウドじゃなくてマルチクラウドでやってるんじゃないかなーって想像: あれだけの規模だし、シングルクラウドには依存しないんじゃないかな?」「それにGitHubはユーザーアクセスにローカリティがあるしブロードキャスト的なものもないから、分割するのは実はそんなに大変じゃないのかもしれない: あくまで推測ですが」

JavaScript

Node.jsのworker

RedashがReactへの移行を検討?


github.com/getredash/redashより


つっつきボイス: 「Redashはねー、ユーザー管理機能がもうちょっと使いやすければいいのにと思ったりする」

一瞬Reduxと取り違えそうになりました。

Vue.jsプロジェクトを爆発させる方法


つっつきボイス: 「私はとても参考になりました😋」「Vue.jsってそもそもそんなに小さく作るものじゃないし、ねー: Reactならもっと縛りはかけられるけど、何を使おうと結局スコープをどこまで絞れるかにかかってくるし、爆発させようと思えばどれだって爆発させられるし💣」「😆」

CSS/HTML/フロントエンド/テスト

バグだらけのWebアプリでバグを理解する

つっつきボイス: 「セキュリティでおなじみの徳丸先生が脆弱性をわざと仕込んだサンプルアプリを作ってたけど本物には勝てないってツイートしてたのを思い出したので」「そういえば何のイベントだったかなー、インフラをひたすらチューニングしていく競技イベントなんかでもこんなふうに出発点をひどい設定にしておかないと競技が成り立たないから、同じようなつらさがあるかも😆」「そういうひどいコードをわざと書くのって手が拒否したりしません?」「するするw」「普段から普通のコードを書くことだけを心がけてると、普通じゃないコードを書くのが極端に難しくなる🤣」「🤣」

↑バイオリンの神演奏者ハイフェッツが映画の中でわざと下手に演奏してみせた動画です。ニコリともせずに笑いを取ってて最高です。

参考: ヤッシャ・ハイフェッツ - Wikipedia

「まー確かに、習得していない人が習得した人のふりをするってのはもしかするとハナモゲラ的に可能なのかもしれないけど、習得した人が習得してない人のフリをするってのは逆に難しい気がする」「そういえば名人の寿司職人が何もできないふりをして海外の寿司屋に弟子入りしてみせるみたいなTV番組ありましたね😆」「そんでつい無意識にまな板をキレイに拭き上げてしまってすぐ見破られちゃったりとかね🤣」「🤣」「本当にちょっとした仕草でバレるヤツ😇」「そういうのって隠すのも難しいしアレルギーとか蕁麻疹出ちゃいそう😵」

Faye: pub/subベースのWebメッセージング


同サイトより

Bayeux(バイユー)というプロトコルを用いるそうです。RubyやNode.jsで使えます。

参考: The CometD Reference Book – 3.1.4 — Bayeux 1.0の仕様

参考: Bayeux プロトコルの仕様について - Green Software Engineer Blog


つっつきボイス:ActionCable以外にもこんなのがあるんだなと思って: Bayeuxってもろフランス語だけど読みすぐ忘れちゃう💦」「へー、ミニマムなpub/subってことかな: pub/subそのものは実は割とそんなに難しくなく作れるんですが、タイムアウトやらID重複やらの仕様を固めていく方が大変ですね」「😃」

「やっぱりCometか、久々に聞いたなこの名前: Cometだと確かにHTTP/2でなくても通るみたいな良さはあるし、サーバー間で使うぐらいならCometでもいいのかも?」「CometというのはAjax的なものなんでしょうか?」「昔のAjaxというかAjaxの手法のひとつですね: サーバーがレスポンスをすぐに返さないで、イベントが発生したら初めて返すみたいな形でTCPセッションを持ちっぱなしにするんですね」「へー!」「当然TCPセッションが開きっぱなしだしサーバーもワーカーを使いっぱなしになるしで、どうしてもリソースを食ってしまう: ま昔の技術ですね😎」

参考: Comet - Wikipedia
参考: Comet, Pub Sub, ActionCable - Women Who Code.

CSS Basic User Interface Moduleが勧告へ(Frontend Focusより)


つっつきボイス: 「また新しい仕様が」「outlineとかresizeとかcursorとかcaret-colorとか、いろいろプロパティが追加されるようだ」

その他CSS/HTML/フロントエンド/テスト

つっつきボイス: 「パラレルCSSパース!: あーでも最近のCSSはminifyしても数KBになったりすることがあるからパラレル化も効果あるのかな?」

言語よろずの間

一般ピープル向けの「λ」


lambdaland.codemiller.comより


つっつきボイス: 「これはプレゼンでしゃべるときのスライドっぽいですね😋」

flutterリンク集


同リポジトリより


つっつきボイス: 「これは社内flutter勢に教えを乞うか😋」「よろしくお願いしまーす❤️」

Haskellを学んでRubyコードを改善しよう(Ruby Weeklyより)

Emojicode: 絵文字でプログラミング


同サイトより

あるかなと思ったらやっぱりありました。個人的には囲み系の記号(⟦⟧とか⟬⟭とか⟪⟫)がもう少しASCIIにあればよかったのにと思います。

🐇 🙋 🍇
  🍰 name 🔡

  🐈 🆕 🍼 name 🔡 🍇🍉

  🐖 🌕 🍇
    😀 🍪🔤Good night, 🔤 name🍪
  🍉

  🐖 ☀️ 🍇
    😀 🍪🔤Howdy, 🔤 name🍪
  🍉
🍉

🏁 🍇
  🍦 greeter 🔷🙋🆕 🔤Spencer🔤
  🌕 greeter  👴 Prints “Good night, Spencer” to the console
🍉

つっつきボイス: 「出たー🍪🍇🍉」「前にもこんなの見た気が」「Rubyなら絵文字使うDSL作ればすぐできますね」
「ところで囲み記号を増やすのはパーサーそのものに影響するから単純な絵文字を足すより大変だと思う: それこそRubyでパーサーを書いてその上で動かすぐらいの勢いが必要かも😆」「Rubyだけでは難しいこともあると」

その他言語

つっつきボイス: 「たまにはPythonもと思って」「日本だとRubyはWebアプリを書く軽量な言語として結構メジャー感あるけど、海外だとPythonでDjangoとかの方がメジャーですね」
「ところで日本の大学は最近RubyよりはPythonを教えたがる傾向があって、言語そのものを追求するならRubyの方が楽しみが多いと思うけど、データ処理のツールとして使うとなるとPythonの方に分があるからかもしれないですね」「ふむふむ」「Pythonで学んだことはRubyでもだいたい使えるけど、Rubyで学んだことは必ずしもPythonで使えるとは限らないという面もありますしね」「それはあるかも」「なるほどー😀」「今でもC言語を教えているところがあるのもたぶんそれで、C言語でできることは間違いなく他の言語でもできるから」「たしかにー😃」

その他

ASIMOも終了→終了しません


つっつきボイス: 「これは誤報だったってやつ↓」「おやー」「そうでした」

はやぶさ2も現地到着

Planned poolingとは

編み物とプログラミングって接近しそうでしないですね。


つっつきボイス: 「おー、一本の糸が途中で色が変わってたりするのか!😲」「動画の途中で毛糸を切って繋ぎ変えていたのもびっくりでした」「それはいいのかw」「イカサマ?🎲」

その他のその他



番外

行き来できるワームホール?


同PDFよりp3

「因果律は損なわれない」という一文が目に付きました。


indico.oist.jpより

Strings 2018というイベント名が素敵すぎます。沖縄科学技術大学院大学で開催されたそうです。

45年に渡る研究

これマジおすすめ

参考: 【非常時に】「布ガムテープをコンパクトに収納する方法」を警視庁が伝授! さらに “ガムテのプロ” 元テレビ局ADが女子向けの裏ワザを教えてくれたよ | Pouch[ポーチ]


今回は以上です。ハードだった…

お便り発掘

https://twitter.com/ryo_katsuma/status/1013706918949355520
https://twitter.com/popmac1451/status/1014863915610599429

バックナンバー(2018年度後半)

週刊Railsウォッチ(20180622)Railsの需要未だ巨大、Unicode 11.0リリース、WebDriverがW3Cで勧告、Flutter.io、2封筒問題ほか

今週の主なニュースソース

ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。

Ruby 公式ニュース

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

WebOps Weekly

webops_weekly_banner

Postgres Weekly

postgres_weekly_banner

Frontend Focus

frontendfocus_banner_captured

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ