- 開発
週刊Railsウォッチ(20181225)Rails 6新機能第2弾「Action Mailbox」、url_forは慣れが要る、Ruby製サーバーレスフレームワークJetsほか
こんにちは、hachi8833です。12月早々からクリスマス気分が年末気分に追い越されてしまった心持ちです。
- 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
- 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
- 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください
2018年最後のウォッチ、いってみましょう。
⚓新年: 週刊Railsウォッチ「公開つっつき会#6」開催のお知らせ
次回の新春公開つっつき会は1/10(木)に開催いたします。皆さまのお気軽なご応募をお待ちしております🙇。
⚓臨時ニュース: Ruby 2.6リリース㊗️🎉🎉
Link: Ruby 2.6.0 Released: https://t.co/0YhlskXrZg
— Yukihiro Matsumoto (@yukihiro_matz) December 25, 2018
早速Ruby 2.7に関連したコミットをいれた
— k0kubun (@k0kubun) December 25, 2018
⚓Rails: 先週の改修(Rails公式ニュースより)
⚓新機能: Action Mailbox
Action Textに続くRails 6の目玉機能になるそうです。やはりBasecamp内でドッグフーディングしていたのが切り出されたとのこと。
今回Railsコアチームに加わったGeorge Claghorn氏が、Active Storageとともにこれまで手がけてきたそうです。
つっつきボイス:「先週のつっつきの後で発表されてました」「ほっほ〜?」「ちょうどWebチームの方がアドベントで書いてくださったAction MailとSendGridでの送信記事↓のあたりをカバーしている感じかな、と思ったらMailboxなので受け取る方だった💦」「なるほど、受信メールをモデルに保存して、そういうあたりを共通化する感じ!😃1通受け取るだけならともかく、結構な数のメールを受け取るなら運用していると欲しいときありそう」「やりたいことはワカル: これより小規模なものは前からあった気もするけど、コントローラっぽく処理できるようになったのが新しいのかも」
「あー、受信メールをAWS SESにも保存できるというのは確かにメリット: SESってメールをS3に保存するというオプションがあって、たぶんこのAction Mailboxを使うとSESに置いたメールを探したり取ってきたりできそう」「おー」「メールの自動応答的な機能に便利かも?: たとえばRedmineだと、コメントにメールで返信するとチケットのコメントに取り込んでくれる機能がありますね」「なるほど!」
「ところで、メールを受け取ってそれで何かをするみたいな仕組みって、現代ではかなり減ってきていますけどね☺️」「あーこの間のウォッチで話題に出たAS/400の話みたいな😆」「メールを使いたいひとたちはまだまだたくさんいらっしゃるので☺️」
InboundEmail
というシンプルなモデルが足されるそうです。
# 同記事より
class ActionMailbox::InboundEmail < ActiveRecord::Base
self.table_name = "action_mailbox_inbound_emails"
include Incineratable, MessageId, Routable
has_one_attached :raw_email
enum status: %i[ pending processing delivered failed bounced ]
def mail
@mail ||= Mail.from_source(source)
end
def source
@source ||= raw_email.download
end
def processed?
delivered? || failed? || bounced?
end
end
「昼にもちょっと話しましたが、Action Mailerって結構完成度高いというか枯れていて、ある意味ライブラリはこうあるべきみたいな感じなんですが、地味すぎてあんまり光が当たってない気がしますよね」「メール送信の処理自体がだいたい確立していますし☺️」「大変なのは運用の方😅」
参考: Action Mailer の基礎 | Rails ガイド
「今回、on-by-default incinerationという名目で、Incineratable
というモジュール↓が追加されてますね」「いんしねれーしょん?」「いかにも堅苦しそうな語だなと思ったら、焼却って意味だそうです: 処理済みのメールを焼却炉に入れるみたいな感じかなー?」「incinerationをジョブ化して後でまとめて処理もできるっぽい」
module ActionMailbox::InboundEmail::Incineratable
extend ActiveSupport::Concern
included do
after_update_commit :incinerate_later, if: -> { status_previously_changed? && processed? }
end
def incinerate_later
ActionMailbox::IncinerationJob.schedule self
end
def incinerate
Incineration.new(self).run
end
end
⚓Rails 6のRC版はRailsConf 2019で発表の見込み
ついでに、Rails 6のRC版を来年4月にミネアポリスで開催されるRailsConf 2019で発表する目標になったそうです。
- サイト: RailsConf 2019
つっつきの後で、改めて発表されました。
「果たしてRCをいくつ重ねるかな😆」「3とか😆」
⚓ActiveRecord::Base.connected_to?
が追加
?
付きです。
# 同PRより
ActiveRecord::Base.connected_to(role: :writing) do
ActiveRecord::Base.connected_to?(role: :writing) #=> true
ActiveRecord::Base.connected_to?(role: :reading) #=> false
end
つっつきボイス:「これもマルチDB対応ですね😋」「connected_to?
はもうそのまんま」「connected_to
は既に実装されたからか」「このrole: :writing
って書き込み専用DBのことかな?よくわかんね」「接続の名前かしら?」「スレーブがあるならここではスレーブにつなぎたい、みたいなときに使う感じ」
⚓小数の同値性バリデーションを修正
# activemodel/lib/active_model/validations/numericality.rb#L84
- def parse_raw_value_as_a_number(raw_value)
- return raw_value.to_i if is_integer?(raw_value)
- Kernel.Float(raw_value) unless is_hexadecimal_literal?(raw_value)
+ def parse_as_number(raw_value)
+ if raw_value.is_a?(Float)
+ raw_value.to_d
+ elsif raw_value.is_a?(Numeric)
+ raw_value
+ elsif is_integer?(raw_value)
+ raw_value.to_i
+ elsif is_decimal?(raw_value) && !is_hexadecimal_literal?(raw_value)
+ BigDecimal(raw_value)
+ end
end
つっつきボイス:「小数の同値性、特に小数以下1桁の数値の場合に不備があったみたいです」「ありそうな感じ☺️」「テストがわかりやすいかな↓」「FloatとBigDecimalの間のequalityの話」
# activemodel/test/cases/validations/numericality_validation_test.rb#L292
+ def test_validates_numericality_equality_for_float_and_big_decimal
+ Topic.validates_numericality_of :approved, equal_to: BigDecimal("65.6")
+ invalid!([Float("65.5"), BigDecimal("65.7")], "must be equal to 65.6")
+ valid!([Float("65.6"), BigDecimal("65.6")])
+ end
「今更だけど、浮動小数点って今どき欲しい人っているんだろか?」「毎年のように0.1+0.2 #=>0.30000000000000004
ってなるんですけどみたいな質問がネットで上がってますしね」「初心者向け意地悪クイズになりそう」「小数・分数はRationalで統一できたらいいのにー」「自分もそう思います😢」
参考: class Rational
(Ruby 2.5.0)
「少なくとも業務で浮動小数点がないと困ることってあんまり思いつかないし」「消費税計算なんかも?」「ああ、そういうところでFloatなんか使いません😎: 100倍して固定小数にするし」「やはりー」「あ、四捨五入はありますけど、どの桁で四捨五入するかというのは要件次第なので」「つまりビジネスロジックの領域?」「そそ、思いっきりビジネス要件」
「Javaも今は知らないけど自分がやってた頃はRational的なものはなかったし、JavaScriptも自作するとかしないとないし...」「そもそもRationalをサポートしている言語って自分はRubyぐらいしか知らないなー🤔」「そういえばPythonにもなかった気がする(ライブラリにありました)」「C#には通貨型っていう分数か小数みたいな型があった気がする↓」「つかあるべき😤」「Mathematicaみたいな数式処理ソフトウェアなら当然持ってるでしょうね」
参考: decimal
キーワード - C# リファレンス | Microsoft Docs
「こうしてみると、RubyってPrimeもあったりするし、割と数学方面に明るい気がする」「Matzは数学得意じゃなかったと控えめですけどね☺️」「実装したのは他の人かもしれないけど、自分がRubyに惹かれた理由のひとつは、そういう数学系のサポートが割ときちんとしていると思ったからですし」「なるほど!😃さすが数学科出身♾」
「昔語りで恐縮ですが、創刊間もないアスキーの書評で取り上げられてた『コンピュータ犯罪』↓で、銀行システムで利子計算の端数を全部自分の口座にこっそり転送していたのがバレて逮捕されたプログラマーの話をちょっと思い出しました」「あー、サラミ法っぽいヤツ😎」「今では古典中の古典の手口ですが😅」
参考: サラミ法 - Wikipedia
7
ここで『コンピュータ・セキュリティ 犯罪対策と災害対策』を紹介したい。ドン・パーカー氏が著し、日本情報処理開発協会が監訳を行っている。この本は1982年発行だが、原著は1981年に出版されている。#サイバー犯罪 #セキュリティ pic.twitter.com/I216QSzsZC— HHNews@トラキチ (@HHNewsReports) June 3, 2016
⚓Active Storageドキュメントのコードを更新
これはコミットから見繕いました。
prepend RemoveUploadedFiles
するように変更されました。
# guides/source/active_storage_overview.md#L745
+module RemoveUploadedFiles
+ def after_teardown
+ super
+ remove_uploaded_files
+ end
+ private
+ def remove_uploaded_files
+ FileUtils.rm_rf(Rails.root.join('tmp', 'storage'))
+ end
+end
+
module ActionDispatch
class IntegrationTest
- def remove_uploaded_files
- FileUtils.rm_rf(Rails.root.join('tmp', 'storage'))
- end
- def after_teardown
- super
- remove_uploaded_files
- end
+ prepend RemoveUploadedFiles
end
end
つっつきボイス:「これはドキュメントのリファクタリング」
⚓来年3月のsass-rails終了に伴う対応が進行中
これは6.0.0マイルストーンから見繕いました。
- PR: Ruby Sass End-of-Life: 26 March 2019 · Issue #32896 · rails/rails
- PR: Ruby Sass End-of-Life: 26 March 2019 · Issue #420 · rails/sass-rails -- こちらはrails-sassリポジトリです
既に今年4月のウォッチでRubyのSassが非推奨になった件を扱いましたが、その後5月に上のPRがオープンしていました。いずれもまだopenです。
つっつきボイス:「従来のRubyで書かれたsassライブラリは使うなと」「dart-sassになるかなと思ったら、C言語ベースのsassc-rubyになりそうな流れ」「確かにsassがライブラリごとに挙動が違ってたりするといろいろツライ😣」
- リポジトリ: sass/sassc-ruby
- リポジトリ: sass/dart-sass
⚓Rails
⚓koicさんの記事(Ruby Weeklyより)
つっつきボイス:「なぜかRuby Weeklyでkoicさんの日本語の記事が『日本語読めないけど』と紹介されていたので」「まさにRails 4.2とRuby 2.6の組み合わせはもうないからCIから外したのね」
⚓Gemfileの書き方次第でメモリを節約できる(Ruby Weeklyより)
# 同記事より
gem 'rails' # Used on both web and worker servers.
gem 'sidekiq' # Same here.
gem 'pundit', group: :web # Web-only gem.
gem 'image_magick', group: :worker # Worker-only gem.
つっつきボイス:「要するにワーカーでしか使ってないようなgemはGemfileから外せばその分メモリは節約できると: そりゃそうだ😆」「言われてみれば」「非同期ジョブでしか画像処理しないならImageMagickは書かなくてもいい、とか: そこまでやるかなと思うけど😆」「へーgroup:
って書けるんだ」「かなり前からありますね☺️」「こういうとこ普段いじらないので😅」
⚓Railsのポリモーフィックルーティング(Ruby Weeklyより)
# 同記事より
redirect_to :controller => "posts", :action => "show", :id => @post.id
つっつきボイス:「おおっとこの辺は鬼門のヤツ🧛🏻♂️」「記事小見出しのform_form
は明らかにform_for
のタイポだけどちょっとドキッとしました」「まあまあそのぐらいは☺️」
⚓url_for
は慣れが要る
<!-- 同記事より -->
<%= form_for [@post, @comment] do |f| %>
「そうそう、Railsをやってると、いずれこういうふう↑に書くようになってきますよね」「うんうん」「昔からある書き方」「でも割と思ったとおりにならなかったりする😅」「でも慣れてくるとこう書けるようになってくる」「そうっそうっ😁」「逆に言うと、慣れないとなかなか思ったとおりの挙動にならない: 自分はもう覚えたけどっ😆」
「これってform_for
特有の書き方でしょうか?」「他でも使いますね: これは結局url_for
↓の書式なので、そこで使える[@post, @comment]
のような配列渡しの書き方をうまく使えという話」「おー」
参考: url_for
-- ActionView::RoutingUrlFor
「Railsのurl_for
って、一種神がかっているというか⛩、どんな形式の引数でも受け取ってよしなに処理してくれるメソッドですね」「ある意味ダメメソッド🤣」「ActionPack系ヘルパーメソッドの中では挙動がかなりキモい👻」「*
とか**
使う引数コワい...😅」
「たとえばモデルを複数使っていてidも複数あるとすると、開発中にidがどれも1にしてみた場合に知らないうちにバグを埋め込んでいたとか、ね😭」「一度わかってしまえば、そんなにかっとんだ挙動にはなりませんけどね」「まあ確かに」
# 同記事より
post_comments_path(@post)
「最初上↑のような*_path
的な書き方でずっとやってると、下↓のように書けることに長らく気づかなかったりしますね」「そうっそうっ😤: 上のだとform_for
のurl部分が超絶長くなっちゃったりして、後になって何だ下みたいに書けるじゃないかって気づいたり」
<!-- 同記事より -->
<%= form_for [:admin, @post, @comment] do |f| %>
「あと、この[:admin, @post, @comment]
という書式を使うと、@post
や@comment
がpersistedかそうでないかによって自動的に挙動を変えて仕分けしてくれるようになるというメリットもある😋」「そうなんですよ~」「その意味でルーティングヘルパーよりも賢い🧐」「複数形のsが付くか付かないかも面倒見てくれるですよ❤️」「めちゃ高機能」「つかやりすぎだろうって🤣」
「実際[:admin, @post, @comment]
という書式の方がたいていシンプルに書ける」「DRYに書ける😎」「ドライ😎」「自分はこの書式で書くこと多い」
「ただ、モデルに名前空間が付いているとそれはそれで面倒くさい😅」「一個名前空間付ければいいとかじゃなくて?」「たとえば@comment
がHogeHogeモデルのcommentだったりするとHogeHogeも入ってきて、む〜ん残念という感じになったり😆」「type
も指定したりとか😆」「という感じでこれはこれでカオスになったり🤪」
⚓RailsのテンプレートレンダリングとAction Viewを理解する
# 同記事より
require "erb"
# let's pretend it's ActionView::Base
class View
end
class Template
def initialize(name, content)
@name = name
@content = content
end
def render(view)
compile(view)
view.send(@name)
end
def compile(view)
# we only need to compile it once
return if @compiled
# use erb as template engine
body = ERB.new(@content).src
src = <<-end_src
def #{@name}
#{body}
end
end_src
view.singleton_class.module_eval(src)
@compiled = true
end
end
view = View.new
template = Template.new("say_hi", "Hi!")
template.render(view) #=> Hi!
view.methods.first #=> :say_hi
つっつきボイス:「これは例のGobyのst0012さんが書いた、最近のRailsテンプレートレンダリングを解説する記事です: 近々翻訳しようと思います」「そういえばRailsのテンプレートレンダリングってある時期に変わったんだけど、その後は何か変わってるのかな?🤔」
「テンプレートレンダリングを素で使ってみる記事っぽい」「このあたりは、前に例のCrafting Rails 4 Applicationsの読み会↓をやったときに扱いましたね: 当時はRails 4ベースなので今はどうなってるかわかんないけど」「当時はRailsそのものの枠組みがいろいろわかってなくて振り落とされないようにするのが精一杯で、記憶がほとんどない...😅」
「st0012さんは記事の最後でAction Viewの設計はよくできてると述べてますね」「Rails 3までのテンプレートレンダリングは結構泥臭い感じだったんですが、Rails 4で汎用テンプレートライブラリ的に書き直されてかなり垢抜けてきて、フォーマットレンダラーを自分で代入したりもできるようになってた」「ほー!」「Crafting Rails 4 Applicationsは結構いい本だったので、Rails 5版もあるといいんだけど」「5は出てないみたいです...😢」
「お、ちょうど第1回読み会でこの辺扱ってた(スライドp18)↓: 自分でRendererを作って理解する章」「ほー、こういう感じですか!」
「こぼれ話ですけど、st0012さんが『次はどんな記事がいい?』と聞いてきたので、『Railsアプリの設計記事とかいいかも』と伝えたら『今仕事でやってるアプリでa "special" module patternが使われていてなかなか面白いので、許可出たら要点を記事にしてもいいよ』と言ってました」「モジュールパターンにもいろいろありますけどね😆」「a specialということしか私も聞いてなくて😅」
⚓ちょっと便利なRackミドルウェア(Ruby Weeklyより)
つっつきボイス:「自分でRackミドルウェアを作る感じ」「まずはbinding.pry
するだけのミドルウェアを作って、ミドルウェアスタックで一旦停止できるようにすると↓」「Potatoってミドルウェアがあるのかと思ったら手作りでしたか💦」
# 同記事より
class Potato
def initialize(app)
@app = app
end
def call(*args, &blk)
@app.call(*args, &blk)
rescue BasicObject => e
require 'pry'; binding.pry
end
end
use Potato
run Rails.application
「Stackprof
はファイラー的なヤツ: そうそう、この辺もさっきのCrafting Rails 4 Applicationsでやってるんですよ〜😎」「お恥ずかしや😅」
- リポジトリ: tmm1/stackprof
「こうやってRackミドルウェアの動作を知っておく価値は非常に高いっすね」「自分で作ったミドルウェアをproductionで使うのは結構勇気要りますけど😆よっぽど単純なものならともかく」「でしょうね〜」
「最後にあるunicorn-worker-killerって、以前のつっつきでbabaさんが昔よく使ったって言ってた、ワーカープロセスを殺しまくるヤツでしたっけ?」「今も使われてるかも: Unicornのワーカーが際限なくメモリを食いまくってたんで、強制的にメモリを解放するためにkillするヤツ」「やはり」
- リポジトリ: kzk/unicorn-worker-killer
⚓i18nをやってみた(Hacklinesより)
- 元記事: Setting up I18n for Rails with Locales from URL Params and Basic I18n Usage - DEV Community 👩💻👨💻
つっつきボイス:「まだ駆け出しだそうですが、非日本人が日本語アプリのi18n頑張ってるので珍しいなと思って」「やってることはまったく普通のi18nですね」「JA、オレにも読める...!😋」「プロファイル見ると、この人松本市に住んでるのかー」「女性」「skill languageにちゃんとJapaneseって書いてある」
⚓最近のRuby向けPDF生成ライブラリ(Hacklinesより)
つっつきボイス:「おー2018年版!」「wkhtmltopdf、まだあるんだ!」「すっごく昔からあるヤツって以前のつっつきにも出てましたね」「wkhtmltopdf最近使いましたよね😎」「覚えてない...😅」「ほら、透かしを入れるときに」「あー使ってたわ!」
- サイト: wkhtmltopdf
「prawnは知ってるけどHexaPDFって知らなかった!」「ずうっと前のウォッチにちょっと出てきてた」
- リポジトリ: prawnpdf/prawn
- リポジトリ: gettalong/hexapdf
- サイト: HexaPDF - Home
「HexaPDFはPDFのマニピュレーションやマージができるのか: 機会があったら試してみようかな😋」「relative newcomerとあるから新し目だし」
「PDFライブラリって、何をやるかによって全然ライブラリが違うんですよね: 既存のPDFファイルを開いて何か操作したいときって意外と選択肢が少ない😓」「そういう事情で当時はwkhtmltopdfしか使えなかった覚えがある」「日本語PDFもやっぱり大変でしょうか?」「うーん、フォント指定ができるライブラリならだいたい大丈夫だとは思うけど」「そういえばフォントはfontconfigから引っ張ってくるタイプと、cairoとかから引っ張ってくるタイプがあったけど、だいたいfontconfigでできるんじゃないかな」「カイロってこれかー↓」「二次元画像ライブラリですね」「この虫、フンコロガシ?」
参考: Fontconfig - TeX Wiki
参考: cairo - Wikipedia
なぜかナレーターが途中で吹き出してます↓。
⚓AWS LambdaでRubyとSinatraやってみた(Ruby Weeklyより)
つっつきボイス:「今旬のやってみた系記事です」「あーLambdaでSinatraかー、Sinatraだと軽いのかなーどうなんだろうな〜?🤔」 「ミドルウェアが重くなりそうだから、ミドルウェアを相当シェイプアップしないと厳しそうな気も」「Rackミドルウェア風にする必要がそもそもあるかどうか」「プロセスは毎回終了するだろうし」
「この辺については、はてブにも上がっていたこの記事↓がかなりよくできてて一読の価値がありますね」「おー!」「Lambda Custom Runtime周りをbashで詳細に追っていてありがたい🙏」「この記事が何を言っているのかが理解できればだいたい大丈夫☺️: 前提としてマイクロサービスやLambdaの知識が必要」
参考: Lambda Custom Runtimes上でbashを対話的に操作してその内部仕様を丸裸にする - misc.tech.notes
⚓その他Rails
つっつきボイス:「たまたま見つけたAction Cableクライアントです」「RubyのWebsocketクライアントってことですよね?RubyでWebsocketに接続しにいくことってなさそう〜」「テストのときぐらいでしょうか?」「テスト用ならワンチャンあるかもしれないけど、それこそJavaScriptでWebsocketを叩く方が確実☺️」「そうでしたか💦」「WebsocketをどうしてもRubyから叩きたい人が使うのかも」
「Action Cableはそんなに詳しく知らないんですが、はっきりとした専用プロトコルがあるわけでもなくて、ほぼ素のWebsocketに近い印象ある: このgemも、Action Cable Clientと名乗るより、ストレートにWebsocket Clientという名前にする方がアピールするかも?」
⚓Ruby
⚓🌟Jets: Ruby製サーバーレスフレームワーク🌟
- サイト: Jets Ruby Serverless Framework
- リポジトリ: tongueroo/jets
- Podcast: 5by5 | Ruby on Rails Podcast #253: Jets: Ruby Serverless Framework with Tung Nguyen
つっつきボイス:「Jets、聞き覚えがあるようなないような」「これはまさに、さっき上で話したみたいにミドルウェアが重くなったりしないよう軽量に構築する感じ」「Lambdaでも動く軽快なミドルウェアで、かつRailsライクなコードで書ける、という狙いっぽい」「お、お〜😳」
# 同サイトより: コマンド群
jets new
jets generate scaffold
jets db:migrate
jets server
jets console
jets deploy
jets routes
jets call
jets status
jets url
jets delete
# 同サイトより: コントローラ
class PostsController < ApplicationController
def index
# renders Lambda Proxy structure compatiable with API Gateway
render json: {hello: "world", action: "index"}
end
def show
id = params[:id] # params available
# puts goes to the lambda logs
puts event # raw lambda event available
render json: {action: "show", id: id}
end
end
「ローカルでもサーバーを起動できるし」「Active Record読み込んでるあたりは結構重そうな気もするけど😆、AR動くなら悪くなさそう」「ふむふむ」「ぱっと見Rails互換ぽく書けるというのはそれだけでちょっとありがたい感」
「今どき素でメッセージ展開とかしたくないし😆」「したくない〜」「単体のメッセージを処理するぐらいならともかく、ある程度Webアプリらしく複数のアクションをさばくようになってくると、こうやってRails wayっぽく進められる方が困りにくいというか設計がぶれずに済むし」「それはある」「こういうのならRailsエンジニアが移行するにもラクだろうし、宗教論争にもなりにくいだろうし⛩」
「これ↓みたいに完全にfunctionで書くこともできれば、上みたいにコントローラを書けばRailsのコントローラ的なこともできるようだ」
# 同リポジトリより: app/functions/simple.rb
def handler_function(event:, context:)
puts "hello world"
{hello: "world"}
end
「AWSのAPI Gatewayでもこんなふうに↓できるみたいだし」「あらステキ❤️」「デプロイもできる?」「デプロイコマンドありますね!jets deploy
」
「ちゃんと動くんならだけど😆、悪くなさそうに見える☺️」「冬休みに遊ぶのに手頃かも」「すごく新しいようです」「タイミング的にもLambda Custom Runtimeがリリースされてから出したんでしょうね」
期待を込めて久しぶりに🌟を進呈いたします。おめでとうございます。
⚓WebMock: Rubyでスタブやexpectation(Ruby Weeklyより)
- リポジトリ: bblimke/webmock
# 同リポジトリより
stub_request(:post, "www.example.com").
with(body: /world$/, headers: {"Content-Type" => /image\/.+/}).
to_return(body: "abc")
uri = URI.parse('http://www.example.com/')
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = 'image/png'
res = Net::HTTP.start(uri.host, uri.port) do |http|
http.request(req, 'hello world')
end # ===> Success
つっつきボイス:「これってあるとうれしいヤツでしょうか?」「HTTPのモックか〜: これってなかなか大変なんだよな〜」「というと?」「HTTPをどのレベルでモックするかは要件によって相当変わってくるんですよ: たとえばTCPソケットのような低いレベルでモックしたいときはあまりリッチなライブラリだと困るし、逆にHTTP requestレベルでモックしたいならリッチなものが欲しいし、とか」「確かに〜」「お、このwebmockは割と何でも扱うっぽい」「webmockって結構前からあった気がする」「一番古いリリースが2010年2月ですね」
「まあ普通にrequest specとか書く分には、今ならここまでHTTPモックすることはないですね」「でしょうね」「使うときがあるとすれば、文字通りHTTPレベルで細かくチェックしたいとき: こういうリクエストを送ったらこういうchunkedが返ってこないといけない、とか、HTTPヘッダーに特殊なものを差し込んでいてそれをチェックする、とか」「なるほど!」「Railsフレームワークのテストとかで使ってそう」「後はSSOサーバーをチェックするときとかかな」「それありそう〜」「SSOって、えっと」「シングルサインオン」
⚓Rubyの+=
と<<
(Hacklinesより)
「<<
のShovelってショベル?」「やっぱりそう思いますよね?自分も初めてその呼び方見ました」「ショベル演算子...」「他の呼び方はなかった気がする」
「Rubyの+=
や<<
って、慣れるまでは割と違和感あるというのはちょっとワカル」「+=
や<<
は、Stringに対して使うと挙動が同じなのに、Arrayに対して使うと挙動が違う」「あ〜そうそう!」
「あとは記事にもあるけど、=
は代入だから相手は変数だけど、<<
の場合は相手がオブジェクト」
「ここは推測だけど、+=
みたいなのってa = a + 1
のショートハンドだから、+=
の形のときだけオーバーライドするとかはできなさそう: <<
はできそうだけど」「記事ではそこまでは話してないけど」
参考: Ruby | 再定義できる演算子 で組み込み演算子風のメソッドを定義する #ruby - Qiita
⚓その他Ruby
- 元記事: How to calculate a Binary Tree’s height using array iteration in Ruby -- Rubyのarrayで二分木(Hacklinesより)
- リポジトリ: ganmacs/grpc_kit(Ruby Weeklyより)
つっつきボイス:「grpc_kitみたいなクライアントがあるとありがたいときがありそう」
(以下はRuby Weeklyより)
⚓Ruby trunkより
⚓非ASCII文字でのキャプチャ
# 同issueより
# rewrite_constant_by_named_capture.rb
class C
end
/(?<C>C)/ =~ "C"
p C
class 𝐂
end
/(?<𝐂>𝐂)/ =~ "𝐂"
p 𝐂
C.new
𝐂.new
つっつきボイス:「知ってる人が投げてるissueだったので」「非ASCII文字で攻めてる」「『これは意図的ですか?』って、切り込んでくるな〜😆」「これよく見つけた感」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓Kinsta: GCPベースでWordPressをホスティング
つっつきボイス:「WordPress向けのホスティングサービスですが、WordPress/PHP方面の知人が以下の点に強く関心を抱いていたのでピックアップしてみました」
- サイトごとにstaging環境をセットでき、確認後ワンクリックでLiveに持っていける
- GCPをフル活用
- LXDコンテナを使用
- sshログインしてフルカスタマイズも可能
「staging環境からワンクリックで本番に持っていけるというのはちょっとよさそう」「WordPressでサイトを構築し始めると、あっというまにサイトが数十個とかになりがちだし😆、その意味でこういうサービスに任せられるならいいかもしれない」「WordPressでやってるようなサイトは予算少なそうな印象🤣」「あとはこのサービスが今後なくならずに盛り上がってくれるかどうか、かな😆」「GCPそのものはあまり心配なさそうだけど」
⚓LXDとは
LXD は次世代のシステムコンテナマネージャです。 仮想マシンと同じようなユーザ体験を提供しますが、仮想マシンではなく Linux コンテナを使います。
LXD は、多数の Linux ディストリビューションが利用できる、あらかじめビルドされたイメージをベースとしています。そして、とてもパワフルでありながら、とてもシンプルな REST API を中心に構成されています。
LXD がどのようなもので、何ができるのかをよく理解するために、オンラインで使ってみることができます! さらに、LXD をローカルで実行したい場合は、「はじめに」 のページをご覧ください。
LXD プロジェクトは Canonical Ltd によって設立され、現在は様々な企業や個人のコントリビュータの貢献のもとで Canonical Ltd が主導しています。
同サイトより
つっつきボイス:「上のKinstaの話を聞いたときに最初LXCかと思ってさらっと見逃してたんですが、よく見たらLXDだったので」「次世代システムコンテナマネージャか: Dockerやsystemd-nspawnと同じようなレイヤかな?🤔」「UbuntuでおなじみのCanonical Groupがやってるんですね」「Go言語で書かれてる」
参考: LXC - Wikipedia
以下のスライドは2017年のですが、DockerとLXDの違いが手短に説明されていました。
- スライドの要点
LXDには今のところDocker Hub的なリポジトリはないようです。
⚓Windows Sandbox(Publickeyより)
- 記事: マイクロソフト、Windows Sandbox発表。デスクトップアプリを分離した環境で安全に実行可能に - Publickey
- 元記事: Windows Sandbox - Microsoft Tech Community - 301849
つっつきボイス:「babaさんが喜びの声を上げていたので」「Windows 10 Pro またはEnterprise専用で、Hyper-Vベース: Windowsのライセンスを追加で買わなくてもこの記事↓でやったようなWindows on Windowsができるということに😋」「それ重要😍!」
「後はどのぐらいちゃんと動いてくれるかというのと、Publickey記事の『そしてWindows Sandboxが終了すれば、すべてのソフトウェアはそのファイルや状態もろとも完全に削除される』という一文が気になる😅」「😅」「きっとイメージとかは作れるんだと思うけど、途中のイメージが作れなかったらどうしよう😅」
⚓SQL
⚓PlanetScale: YouTubeの元CTOが立ち上げたスケーラブルMySQLクラスタ(DB Weeklyより)
- 元記事: They scaled YouTube — now they’ll shard everyone with PlanetScale | TechCrunch
- サイト: Home – PlanetScale
つっつきボイス:「スケールできるMySQLクラスタサービスか: Percona版MySQLみたいな感じなのかな?🤔: ベースのVitessはオープンソースだから自分たちのサーバーでも動かせそう」「Vitess、★7000超え!」
「YouTubeのバックエンドではこの人のやってたVitessを使ってるという触れ込みでした」「ほほー!」「この辺は永遠のテーマ😎」「そういえばいつだったかTwitterがCassandraで失敗したみたいな話もあったし」「やっぱり名前が不吉だったんでは😆」
参考: Twitterが、Cassandraの本採用を断念。「いまは切り替えの時期ではない」 - Publickey
Twitterのアーカイブリポジトリにこんなのがひっそり置いてありました↓。
- リポジトリ: twitter-archive/cassie
⚓JavaScript
⚓Pika: npmの新し目のパッケージを検索するサービス(JavaScript Weeklyより)
つっつきボイス:「トリビアかなと思いつつ」「人気順で検索できると: ESモジュールかどうかがわかるのはちょっといいかも😋」
⚓CSS/HTML/フロントエンド/テスト
⚓パフォーマンス駆動開発とは(Frontend Weeklyより)
つっつきボイス:「また何とかドリブン開発が出てたので」「ざざっと眺めた限りでは、Performance AuditをCIで回しておくことで、パフォーマンスの問題を早期に把握して対応しようという趣旨でしょうね」「あーなるほど!」「実際それ大事だし🧐」「分野にもよるけど、めちゃくちゃ高いパフォーマンスを要求されるアプリなんかは、そうやって開発を進めないと、残念なコミットをデプロイした瞬間にサービスが落ちかねないので😇」「やってることはCIチェックなんだけど、こういうちょっとかっこよさげな名前を付けることで諸事動き出したりしますよね☺️」
⚓言語
⚓Rust 2018 Editionリリース(Publickeyより)
breaking changes入りだそうです。
つっつきボイス:「勇気あるbreaking changes」「Rust使ってる人たちならOKっしょ😆」「社内Rust勢も色めき立ってました」
「こうやってある程度普及した言語でbreaking changesが入ることで、その後の使い勝手がうんとよくなったりしますよね: Rubyも1.8から1.9でbreaking changesを決行しましたけど、あれをやってなかったら今Ruby使うのは相当つらかったと思うし😅」「わかりみ〜」「やはりbreaking changesはどこかで必要になってきますね☺️」「やるなら早いうち!」
参考: Ruby 1.8/1.9/2.0 系の違い - 君の瞳はまるでルビー - Ruby 関連まとめサイト
参考: Ruby 1.9に移行する際に注意すべき10のポイント - なんとなく日記
⚓Go言語が段階的に$GOPATH
から「Goモジュール」に移行
結構な大工事になりそうです。
- Go 1.11から1.13にかけてGoモジュールへの対応を段階的にすすめる予定
- 乱立しているlintツールを統合し、language serverプロトコルに対応させる予定
- モジュールの統合アクセスや認証を進め、中間者攻撃対策も行う
- 最終的にパッケージをGoモジュールに移行し、GOPATHの外でも使えるようにするのが目標
つっつきボイス:「Goモジュールに段階的に移行するそうです」「$GOPATH
もいろいろ無理が出てきたのかな😆」「今だと$GOPATH
の外に出ると扱えないし😢」
「推測ですが、今の$GOPATH
を使う設計はもっとささやかなマイクロサービスとかを作ることを念頭に置いてたんじゃないかって」「私もそんな気がします: Makefileを書きたくない、とか(自分もキライ😆)」「Makefileを書くような規模になったら、他の言語でやっとくれ、ぐらいの勢いだったりして😆」
参考: 2016年だけどMakefileを使ってみる - Qiita
「そして色んな人が大規模なGoコードをどかすか書いてるし😆」「Dockerとか😆」「やっぱり言語が人気を得てくると、言語設計者の当初の想定を超えた使われ方をするということで☺️」
⚓その他
⚓はんだ付け
- 元記事: 手実装の限界に挑戦!微細な電子部品のはんだ付けを練習できる教材が発売 - デザインってオモシロイ -MdN Design Interactive-
- 元記事: プロのはんだ付けのコツとテクニック - プリント基板実装|基板改造|基板改修
つっつきボイス:「こちらのアドベント記事↓ではんだ付けの話題になったので」「はんだ付けを練習できる教材のページ」「上の記事にある『NPO法人 日本はんだ付け協会』って😆」「初耳...!😆」
- サイト: NPO 日本はんだ付け協会
「はんだ付けっていっぱいやってました?」「そんなにやってないかなー: 一番やってたのはアマチュア無線部の頃で、それもいわゆる精密なはんだ付けなんかじゃなくて、屋外アンテナによじ登ってケーブルを60Wぐらいのでかいコテでえいやっと付けたり😆」「あーそっちの方ですか😆」「熱量要るヤツ」「ほとんど溶接」「後はたまに秋月電子のキットを組み立てたときぐらいで、ICのはんだ付けはしたことないかな」「小学校の頃に某ワンボードマイコンを喜び勇んではんだ付けしまくって組み立てたら、見事ICを1個逆に挿してたことありました😅」「あるある〜😆」
「はんだ付けは、慣れもあるけど道具が大事っすね」「先っちょはいいものを買おう!」
「はんだ付けの他にワイヤラッピングっていう結線法も自分の頃からあったんですが、何となく高そうで手が出ないうちに下火になりつつある感😢」「あー、こういう線を巻き巻きしてつなぐヤツ」「こう見えて、いったん巻くととても安定するらしいです」「携帯端末が毎月のように新しく出ていた頃なんかはこういうのでプロトタイプをどんどん組み立ててたかもですね☺️」「今もありそうだけど、今だと集積度上がりすぎてこうやって巻く余地がなさそう」
⚓番外
⚓土星の環は将来消えるのか
つっつきボイス:「1億年😆」「このスケールがもはやピンとこない😆」「人類いるのか😆」
参考: CNN.co.jp : 土星の環、1億年足らずで消滅か NASA研究
今回は以上です。
おたより発掘
週刊Railsウォッチ(20181225)Rails 6新機能第2弾「Action Mailbox」、url_forは慣れが要る、Ruby製サーバーレスフレームワークJetsほか
おお!Action Mailbox は昔欲しいと思ったことがある気がする😊https://t.co/xcTmwSk4yl
— fatal flaw (@yamukotonaku) December 25, 2018
バックナンバー(2018年度後半)
週刊Railsウォッチ(20181210)update_columnは要注意、DBカラムコメントは書こう、個人情報扱いの注意点、Capistranoはやっぱりいいほか
- 20181203 Railsのglobalidとは、AWS LambdaがRubyに対応、JSはPromiseを最初に学べほか
- 20181112 Ruby 2.6.0-preview3リリース、非同期スレッドのテストはつらい、MySQL 8のGROUP BYほか
- 20181105 DBマイグレーション9つのコツとハマった話、Railsのモデルとディレクトリの設計ほか
- 20181029 特集『肥大化したActiveRecordリファクタリング7つの方法』今ならどうなる?Redis 5のストリーム機能ほか
- 20181022 Railsの名前空間地獄とrequire_dependency、PostgreSQL 11がリリース、clean-rails.orgほか
- 20181015 Rails初心者と一発でバレる書き方、次のVue.js構想、RubyのOpenStruct、Twilioほか
- 20181001 Railsアップグレード記事と各種支援ツール、CLI向けRubyワンライナー集、Rubyアプリをワンバイナリ化ほか
- 20180925 Rails大規模支払サービス開発のノウハウ、RailsのMySQLがutf8mb4に移行、Rpush gemほか
- 20180918 ビューテンプレート探索が高速化、mini_scheduler gem、レガシコントローラのリファクタリングほか
- 20180910 公開つっつき会#2、RSpecは何を参考にするか、イベントソーシング、marginalia gem、負荷テストツールvegetaほか
- 20180903 次世代アップローダーgem「Shrine」、RSpecをどこまでDRYに書くか、Rubyのmainオブジェクトの秘密、GitLabのCookie利用許諾機能はエライほか
- 20180827 Ruby Prize 2018募集開始、Interactor gemとReader Object、書籍『Real World HTTP』、Basecampのヒルチャート機能ほか
- 20180820 Railsで構築されたサイト40選、Deviseはつらいよ、ARのスコープとクラスメソッドの使い分けほか
- 20180813 Rails 5.2.1リリース、sanitize_sql_arrayは5.2からpublicだった、Dev.toがRailsアプリのソースを公開ほか
- 20180806 Rails 5.2.1.rc1リリース、Railsガイド日本語版が5.1に対応、Regexp#match?ほか
- 20180723 Railsdm Day 3 Extremeを後追い、PSDにはZeplin.io、好みの分かれるJSX、負荷テストツール比較ほか
- 20180709 Rails Developers Meetup Day 3 Extreme今週末開催、RailsのSTI/キャッシュ/添付ファイル/Redis/PDF出力、ECMAScript 2018、プロフェッショナルIPv6ほか
- 20180702 Ruby 2.2メンテ正式終了、Ransackがつらくなるとき、書籍『Domain-Driven Rails』、GitHubの高可用MySQLほか
- 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など)です。