こんにちは、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)
ドキュメント更新関連
- commit: Add missing documentation about `config.action_mailer.preview_interce… · rails/rails@91ae653
- commit: Remove backticks around proejct names · rails/rails@b2d9c3f
- PR: Update “Active Support Core Extensions” Guide by bogdanvlviv · Pull Request #33131 · rails/rails
つっつきボイス: 「今回は夏枯れなのか、ドキュメントの細かな更新が多かったです」「話逸れるけど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に載っているようなマッチャー↑をシンプルに使って単純なフォームを作っているうちはいいんですが、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を使うのもヤバイです: この構造なら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シリーズ
- リポジトリ: github.com/RubyMoney
# 同リポジトリより
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以外にもあるんですね。
つっつきボイス: 「もう名前で遊んでる」「monetize
とかMoney
を作るとか」「新しい動詞が誕生した感」
RailsのDateTimeフォーマットのサイト
つっつきボイス: 「開いてみるとわかりますが、本当にこの情報だけが載ってます: もしかしてDateTime
でググる人をキャッチする用かなと?」「」「これ何だったっけなーと思ったら、Date
やTime
のi18n変換にこうやってシンボルを指定したときにそれぞれこういうフォーマットで表示されるってことね: まあ普通手元で試すけどねっ」
「これ見てて、以前MMDDYY
とかDDMMYY
みたいな日付表記で地雷踏んだのを思い出しちゃいました: ずっと前に海外の複数拠点と初めて仕事でやりとりしたとき、日付が02-05-08みたいな感じで指示出しされて2月5日なのか5月2日なのかが解釈が入り混じってとうとう…」「あーこういうやつですね↓」「それそれ」「DMY
にMDY
にYMD
…こんなにあるし…」「その時以来日付は必ず02-May-2008みたいに誤解の余地のない書き方にしてます」
maily: 送信メールをプレビューするRailsエンジン
- リポジトリ: markets/maily
つっつきボイス: 「おーHTMLメールもプレビューできるのか: 悪くなさそう」「このmaily
という名前を見てて思い出したんですけど、いつだったか『Rubyのgemはキラキラネームが多い』みたいな記事を見たのを思い出しちゃいました」「まー他所のライブラリだってそんな変わらないし: ただよく言われるけどライブラリにいい名前をつけるって実はとっても大事で、いい名前がつくと開発のモチベーションが続いて最後まで作り切るみたいなところがありますね」「」「ときどき名前から全然機能が推測できないライブラリとかありますけど…」「よほど単機能ならともかく、機能をズバリ推測できる名前を付けるのがこれまた難しいという: 後はもうSEO的に頑張るぐらいしか」「」
その他Rails
- 元記事: Making Tests Go Faster - Ryan Bigg — テストを速くするちょっとしたコツ(Ruby Weeklyより)
GraphQLの "graph" と "QL" は両方共誤解を与えるのでよくない命名の典型みたいになってる。GraphQLで操作するリソースはgraphじゃなくていいし、QLといってもSQLとは全然違うレイヤーでむしろウェブアプリのインターフェイス記述言語なので、ResourceIDL みたいな名前のほうが適切。
— FUJI Goro (@__gfx__) 2018年6月27日
つっつきボイス: 「これも名前つながりで」「IDLってなんだっけ: インタフェース記述言語か」「まあ確かにGraphQLってクエリか?っていうとそうも言い切れないし、雰囲気的にはIDLとかXSLT的なものに似てる感ちょっとある: 型を指定するとそれに合わせて返ってくるあたりが」「」「ともあれGraphQLという名前がキャッチーなのは間違いないっすね: ResouceIDLだったら果たしてどうだったか」「」
こないだ勉強会の懇親会で「Railsの次は何が来ると思うか?」と聞かれて、自分でもそのとき初めて言語化したんだけど「Railsの次というのはない。フルスタック自体が少しずつ死んでいく。BaaS, FaaSのサーバーレスが主体で足りないところをGoとかNodeのマイクロサービスで埋めることになる」と言った
— WAKASUGI 5T111111 (@5t111111) June 27, 2018
Firebase 使えるエンジニアは市場価値が高いみたいな意見を見たけど、価値が高いのは技術選択をしっかりできるエンジニアであって、特定のサービスを使いこなせるエンジニアではないと思う
— Takeshi Arabiki (@a_bicky) June 26, 2018
ちょうどFirebaseで流出ありましたね。
Apps Vulnerable Through Firebase Endpoint https://t.co/izrzjvY3Ii
— Arturo Navarro ㋡ (@arnavarr) June 26, 2018
つっつきボイス: 「FaaS(Function as a Service)ってまた新しい言葉が」「何とかaaSって多すぎ」「中身はだいたい既存の概念だったりすること多いし: FaaSもRPCとどう違うんだか」
先生「ここ単体テストに出るからしっかり実装しておけよ〜」
— ドッグ (@Linda_pp) June 26, 2018
つっつきボイス: 「」「」
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 OPEN — O_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向けカバレッジツール
- リポジトリ: deep-cover/deep-cover
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より)
- 元記事: Add support for TruffleRuby · Issue #4297 · rvm/rvm
- 元記事: ruby-build で TruffleRuby がインストールできるようになった - HsbtDiary(2018-06-18)
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がリファレンスですからねー」
Rubyコードをフローチャート化(Ruby Weeklyより)
追いかけボイス: 「もしかしてダックタイピングってフローチャートにしづらい?」「フローチャートには乗せようがないヤツ」
Rubyにパターンマッチング構文がまだないから試しに作ってみた
Link: Quest for Ruby Pattern Matching: https://t.co/l3bwVm4uac
— Yukihiro Matsumoto (@yukihiro_matz) June 27, 2018
おなじみzverokさんの記事です。
つっつきボイス: 「あー、この↓感じ、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?..
型を変数名に含めるとは
ハンガリアン記法の復活 https://t.co/8BNE47Ioa2
— Yukihiro Matsumoto (@yukihiro_matz) June 27, 2018
一度は誰しも考える気がしました。
つっつきボイス: 「変数名に型をねー、と思ったら、抄録↓見ると構文からの型推論が難しいから名前から型推論しようよって趣旨か」「ハンガリアン記法って何だったっけと思ったら、i
で始まると整数、みたいなやつでした↑」「RubyでそれやったらRubyの特徴が失われちゃう気がしますね」「まあRubyだとそうなっちゃいますけど、この感覚はJavaの世界なら割とありますよ: 一時的に使うインスタンスなんかでクラス名を_なんちゃら
みたいに付けたりとか」「へー!」「その書き方を常に強制されるんならやめて欲しいけど、特定の書き方に沿っていれば型チェックしてくれるぐらいのレベルなら元Java書きとしてはまあ悪くないんじゃね?とは思う」
型推論は,構文パターンから型を推論する方法で,型アノテーションなしで静的型付けを実現する.ただし,構文パターンからの型推論はアルゴリズムが複雑になりがちですべての言語に採用しにくい問題がある.本発表は,よりお手軽に型推論を実現するため,名前からの型推論を提案する.まず,実際のソース・コードを解析し,型と名前の法則性を調べる.それに基づき,名前からの型を推論するシステムと言語設計を定義した.我々は,これらのアイディアを関数型スクリプト言語konoha 5λに実装し,その使いやすさを検証し報告する.
IPSJ-TPRO1102006.pdf論文抄録より
Rubocopのケツカンマ
> Obviously a trailing , in a method invocation is always a bad idea,
自明ときたもんだ
— Urabe, Shyouhei (@shyouhei) June 26, 2018
つっつきボイス: 「スタイルはどう転んでも揉めますね」「まー自分も個人的にはtrailingカンマありが好きなんだけどRubocopのデフォルトはそうじゃないし: これはもうプロジェクトに置いてあるrubocop.ymlにみんなで従うしかないっしょ」
書籍「Kestrels, Quirky Birds, and Hopeless Egocentricity」
- 書籍: Kestrels, Quirky Birds, and Hopeless Egocentricity: Reg “raganwald” Braithwaite [PDF/iPad/Kindle]
ただいま翻訳中のFunctional Programming in Ruby — State – Brandon Weaver – Mediumという記事で紹介されていました。Rubyのメタプログラミングでコンビネータ論理する本だそうです。
つっつきボイス: 「ブログ記事を書籍化したものらしくて、無料でダウンロードできるというので」「謎の本…」
その他Ruby
- 元記事: フルタイムのコミッターとして企業に属しながらオープンソースのプログラミング言語を開発するということ - GeekOut — Urabeさんが書いた記事です。
- サイト: DevMemo — RubyのEnumerableを学ぶサイト
つっつきボイス: 「↑このDevMemoっていうサイト、本当にRubyのEnumerableを学ぶためだけのサイトなんだそうです」「単機能シングルドメイン」「ログインして使ってみないとわかりませんが」
昨日のTuring Complete FMミートアップ、参加者110人の大きな会になりました。またそのうち第2回やりましょう。
— Rui Ueyama (@rui314) June 26, 2018
#tcfm ミートアップに来たらなんと @yukihiro_matz さんが!!Ruby誕生のお話や今使っているキーボードの話、エディタ作るかも?みたいな色々なお話を伺ってしまった! pic.twitter.com/NSdXC6Vwwc
— Hidehiro Nagaoka (@hid9hiro) June 25, 2018
参考: Turing Complete FMミートアップ|IT勉強会ならTECH PLAY[テックプレイ]
つっつきボイス: 「先週のウォッチでTCFMミートアップのことを取り上げたのがきっかけで私もしれっと参加したんですが、Matzが本当に楽しそうでよかったなーと思っちゃいました」「」「Matzは普段よそのイベントに仕事抜きで顔を出す機会がなかなかなさそうなんでなおさらかなと」
なお、最新のTCFM第25回をうつらうつら聞いてたら、そのうちMatzがTCFMに出演するかもと言ってたような気がします(違ってたらごめんなさい)。
こんなところに、まつもとゆきひろさんが!!! pic.twitter.com/gyBaBb50xU
— わたるデッドエンド (@tiwu_wataru) June 27, 2018
クラウド/コンテナ/インフラ/Linux
WPA3といえば
Wi-Fiセキュリティの新規格「WPA3」が登場、WPA2の脆弱性にも対応しハッキングが困難に https://t.co/SIAmyRISNP
— 雑u (@matsuu_zatsu) June 27, 2018
つっつきボイス: 「今度のWPA3って大丈夫なんかいな〜」「IPA試験でWPA2が出題された翌日に脆弱性が見つかったんでしたっけ?」「そうそうw あれ翌日だからよかったけど前日に見つかってたら『安全性の高い方式を選べ』問題が解なしになるところだったし」「」
参考: Wi-Fi Protected Access - Wikipedia — WPA2やWPA3の解説
GitLabがAzureからGCPに移行中
aws-sdk-ruby
- リポジトリ: aws/aws-sdk-ruby
- サイト: AWS SDK for Ruby | AWS
つっつきボイス: 「これはもうすっかり定着?」「ですね: 何しろ公式なんで最新の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 (Envoy proxy)、Istio とは? - Qiita
その他クラウド/コンテナ/インフラ/Linux
某弊社『社会と情報』教科書で(私の担当箇所ではないが)SSLをやめてHTTPSで統一したら,SSLが載ってないと言われた https://t.co/ROt6IkjHhs
— Haruhiko Okumura (@h_okumura) June 26, 2018
つっつきボイス: 「あーちょうど今日こんなやりとりしてたわ: 『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
「記事の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
Honestly BDE is giving me joy in this otherwise depressing world
— Camille Fournier (@skamille) June 26, 2018
これで合ってるのかな?
参考: BDE,SQL Linkとは
GitHubのMySQL可用性が高い秘密(WebOps Weeklyより)
つっつきボイス: 「GitHubがMySQL使ってるって初めて知った!」「」「」「これ翻訳してみたいです」「あくまで推測だけど、GitHubは単一のクラウドじゃなくてマルチクラウドでやってるんじゃないかなーって想像: あれだけの規模だし、シングルクラウドには依存しないんじゃないかな?」「それにGitHubはユーザーアクセスにローカリティがあるしブロードキャスト的なものもないから、分割するのは実はそんなに大変じゃないのかもしれない: あくまで推測ですが」
JavaScript
Node.jsのworker
RedashがReactへの移行を検討?
Redash が Angular から React への移行を検討中なのかな?https://t.co/dvGvXWoHW6
— Takuya Arita (@ariarijp) June 27, 2018
- 元記事: React migration & an experiment with less DI - Development - Redash Discourse
- サイト: Redash helps you make sense of your data | Redash
- リポジトリ: getredash/redash
つっつきボイス: 「Redashはねー、ユーザー管理機能がもうちょっと使いやすければいいのにと思ったりする」
一瞬Reduxと取り違えそうになりました。
Vue.jsプロジェクトを爆発させる方法
[発表資料] Vue.js プロジェクトの爆発させかた #ichigayageek / How to explosion Vue.js project – Speaker Deck https://t.co/o7loelcjEX
— hatebuholic (@hatebuholic) June 26, 2018
つっつきボイス: 「私はとても参考になりました」「Vue.jsってそもそもそんなに小さく作るものじゃないし、ねー: Reactならもっと縛りはかけられるけど、何を使おうと結局スコープをどこまで絞れるかにかかってくるし、爆発させようと思えばどれだって爆発させられるし」「」
CSS/HTML/フロントエンド/テスト
バグだらけのWebアプリでバグを理解する
メモリリーク、デッドロック、リダイレクトループ、JVMクラッシュ…バグだらけのWebアプリケーションを使ってバグを理解する on @Qiita https://t.co/UatkXl4SWK
— 荒木敦 (@applideveloper) June 26, 2018
つっつきボイス: 「セキュリティでおなじみの徳丸先生が脆弱性をわざと仕込んだサンプルアプリを作ってたけど本物には勝てないってツイートしてたのを思い出したので」「そういえば何のイベントだったかなー、インフラをひたすらチューニングしていく競技イベントなんかでもこんなふうに出発点をひどい設定にしておかないと競技が成り立たないから、同じようなつらさがあるかも」「そういうひどいコードをわざと書くのって手が拒否したりしません?」「するするw」「普段から普通のコードを書くことだけを心がけてると、普通じゃないコードを書くのが極端に難しくなる」「」
↑バイオリンの神演奏者ハイフェッツが映画の中でわざと下手に演奏してみせた動画です。ニコリともせずに笑いを取ってて最高です。
「まー確かに、習得していない人が習得した人のふりをするってのはもしかするとハナモゲラ的に可能なのかもしれないけど、習得した人が習得してない人のフリをするってのは逆に難しい気がする」「そういえば名人の寿司職人が何もできないふりをして海外の寿司屋に弟子入りしてみせるみたいな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より)
- 元記事: CSS Basic User Interface Module Level 3 (CSS3 UI)
- 元記事: Accessibility inspector - Firefox Developer Tools | MDN — Firefox DevToolsのアクセシビリティインスペクタ(Frontend Weeklyより)
つっつきボイス: 「また新しい仕様が」「outline
とかresize
とかcursor
とかcaret-color
とか、いろいろプロパティが追加されるようだ」
その他CSS/HTML/フロントエンド/テスト
- 元記事: Firefox 61 – Quantum of Solstice – Mozilla Hacks – the Web developer blog — FirefoxがパラレルCSSパースを導入(Frontend Weeklyより)
つっつきボイス: 「パラレルCSSパース!: あーでも最近のCSSはminifyしても数KBになったりすることがあるからパラレル化も効果あるのかな?」
言語よろずの間
一般ピープル向けの「λ」
つっつきボイス: 「これはプレゼンでしゃべるときのスライドっぽいですね」
flutterリンク集
- リポジトリ: Solido/awesome-flutter
つっつきボイス: 「これは社内flutter勢に教えを乞うか」
Haskellを学んでRubyコードを改善しよう(Ruby Weeklyより)
Emojicode: 絵文字でプログラミング
- サイト: Emojicode
あるかなと思ったらやっぱりありました。個人的には囲み系の記号(⟦⟧
とか⟬⟭
とか⟪⟫
)がもう少しASCIIにあればよかったのにと思います。
🐇 🙋 🍇
🍰 name 🔡
🐈 🆕 🍼 name 🔡 🍇🍉
🐖 🌕 🍇
😀 🍪🔤Good night, 🔤 name🍪
🍉
🐖 ☀ 🍇
😀 🍪🔤Howdy, 🔤 name🍪
🍉
🍉
🏁 🍇
🍦 greeter 🔷🙋🆕 🔤Spencer🔤
🌕 greeter 👴 Prints “Good night, Spencer” to the console
🍉
つっつきボイス: 「出たー」「前にもこんなの見た気が」「Rubyなら絵文字使うDSL作ればすぐできますね」
「ところで囲み記号を増やすのはパーサーそのものに影響するから単純な絵文字を足すより大変だと思う: それこそRubyでパーサーを書いてその上で動かすぐらいの勢いが必要かも」「Rubyだけでは難しいこともあると」
その他言語
Python 3.7.0 is released! Bring out the celebratory libations. Thanks @baybryj and a cast of thousands on python-dev and GitHub. https://t.co/wEG4vO76Rd
— Guido van Rossum (@gvanrossum) June 28, 2018
つっつきボイス: 「たまにはPythonもと思って」「日本だとRubyはWebアプリを書く軽量な言語として結構メジャー感あるけど、海外だとPythonでDjangoとかの方がメジャーですね」
「ところで日本の大学は最近RubyよりはPythonを教えたがる傾向があって、言語そのものを追求するならRubyの方が楽しみが多いと思うけど、データ処理のツールとして使うとなるとPythonの方に分があるからかもしれないですね」「ふむふむ」「Pythonで学んだことはRubyでもだいたい使えるけど、Rubyで学んだことは必ずしもPythonで使えるとは限らないという面もありますしね」「それはあるかも」「なるほどー」「今でもC言語を教えているところがあるのもたぶんそれで、C言語でできることは間違いなく他の言語でもできるから」「たしかにー」
その他
ASIMOも終了→終了しません
つっつきボイス: 「これは誤報だったってやつ↓」「おやー」「そうでした」
いまホンダの広報の方に電話で確認しました。ざっくり言うと、これは誤報という理解で良いようです。二足歩行ロボットの開発も続けているし、いわゆるASIMOの活動も従来どおり。新型などが出るかどうかはわからないとのこと。追加詳細(というほどでもないですが)はニーズがあるようならどこかで https://t.co/gS6WprWaOQ
— 森山和道 (@kmoriyama) June 28, 2018
はやぶさ2も現地到着
ついに、☆リュウグウ☆に到着したよ
打ち上がってから1302日。
長かったけど、あっと言う間という感じも。
これがリュウグウ(約22kmから撮影)
これからが探査の本番だね。 pic.twitter.com/OWYJe3h0W8— haya2kun (@haya2kun) June 27, 2018
リュウグウ到着を確認しました。化学推進スラスタが予定通り噴射されたこと。距離が20.7kmになったこと、相対速度が1cm/s以下であること、はやぶさ2が正常であることを確認しました。以上4つをもって到着を確認。
— 大貫剛 (@ohnuki_tsuyoshi) June 27, 2018
クイーンのブライアン・メイ氏(博士)がリュウグウの立体視画像を創って話題ですが、彼の話は、みすず書房が出してる『スターゲイザー アマチュア天体観測家が拓く宇宙』という本のなかにも出て来ます。https://t.co/8kfCwpkRwT
— 森山和道 (@kmoriyama) June 27, 2018
Planned poolingとは
編み物とプログラミングって接近しそうでしないですね。
つっつきボイス: 「おー、一本の糸が途中で色が変わってたりするのか!」「動画の途中で毛糸を切って繋ぎ変えていたのもびっくりでした」「それはいいのかw」「イカサマ?」
その他のその他
同じグループの漢字が同じような形をしているというのは、もともと漢字をコマンドとして使う場合の弱点ではないか。たとえば、エレベーターの開閉ボタンの文字はこれくらい違っていたほうがいいとおもうし、漢字がわからない人でも機能がピンときそう。 pic.twitter.com/rVcjx8dmRW
— 大西科学 (@onisci) June 27, 2018
最近は"rm -r .git"が、権限もそんなに要らない割に酷いことができると僕の中で話題に。
— 馬 (@Goryudyuma) June 27, 2018
KPT以外を使って振り返りを行った話 – KCF Labo Blog https://t.co/ZtBICLdpKV
— (@y_yagi) June 26, 2018
番外
行き来できるワームホール?
このMaldacenaさんの話、量子的なところと古典論を繋げてるところが微妙に思ったけど、hbar展開でちゃんとなってるんかな。論文が出るのを待とう https://t.co/GMn3B2NPeW
— 橋本幸士 Koji Hashimoto (@hashimotostring) June 27, 2018
「因果律は損なわれない」という一文が目に付きました。
Strings 2018というイベント名が素敵すぎます。沖縄科学技術大学院大学で開催されたそうです。
45年に渡る研究
これマジおすすめ
昔、アポロ13号のジム・ラベル船長が日本で講演したとき、聴衆からの「危機に備えて普段からやるべきことはありますか」という質問に「どこへ行くにもガムテープは持って行け」と答えたのを思い出した。
— 大貫剛 (@ohnuki_tsuyoshi) June 26, 2018
参考: 【非常時に】「布ガムテープをコンパクトに収納する方法」を警視庁が伝授! さらに “ガムテのプロ” 元テレビ局ADが女子向けの裏ワザを教えてくれたよ | Pouch[ポーチ]
災害時に工夫次第で役立つ布ガムテープ。添え木を患部に固定したり、連絡メモとして壁に貼ったり重宝しますが、かさばることが難点。そこで、芯の部分を柔らかくなるまで押し潰して取り除き、平らにして輪ゴムで束ねると、非常用持出袋の隙間でも入れることができます。追加をお薦めします。 pic.twitter.com/g6rzbc5909
— 警視庁警備部災害対策課 (@MPD_bousai) July 18, 2017
今回は以上です。ハードだった…
バックナンバー(2018年度後半)
週刊Railsウォッチ(20180622)Railsの需要未だ巨大、Unicode 11.0リリース、WebDriverがW3Cで勧告、Flutter.io、2封筒問題ほか
- 20180615 TTY gemとHTTPClient gemは優秀、Rubyの謎フリップフロップ、ちょいゆるRubyスタイルガイドほか
- 20180608 特集「RubyKaigi 2018後の祭り」、
Enumerable#index_with
は優秀、コントローラから@
を消し去るほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやRSSなど)です。