週刊Railsウォッチ(20181225)Rails 6新機能第2弾「Action Mailbox」、url_forは慣れが要る、Ruby製サーバーレスフレームワークJetsほか

こんにちは、hachi8833です。12月早々からクリスマス気分が年末気分に追い越されてしまった心持ちです。

  • 各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを社内有志でつっついたときの会話の再構成です👄
  • 毎月第一木曜日に「公開つっつき会」を開催しています: お気軽にご応募ください

2018年最後のウォッチ、いってみましょう。

新年: 週刊Railsウォッチ「公開つっつき会#6」開催のお知らせ

次回の新春公開つっつき会は1/10(木)に開催いたします。皆さまのお気軽なご応募をお待ちしております🙇。

臨時ニュース: Ruby 2.6リリース㊗️🎉🎉

Rails: 先週の改修(Rails公式ニュースより)

新機能: Action Mailbox

Action Textに続くRails 6の目玉機能になるそうです。やはりBasecamp内でドッグフーディングしていたのが切り出されたとのこと。

今回Railsコアチームに加わったGeorge Claghorn氏が、Active Storageとともにこれまで手がけてきたそうです。


つっつきボイス:「先週のつっつきの後で発表されてました」「ほっほ〜?」「ちょうどWebチームの方がアドベントで書いてくださったAction MailとSendGridでの送信記事↓のあたりをカバーしている感じかな、と思ったらMailboxなので受け取る方だった💦」「なるほど、受信メールをモデルに保存して、そういうあたりを共通化する感じ!😃1通受け取るだけならともかく、結構な数のメールを受け取るなら運用していると欲しいときありそう」「やりたいことはワカル: これより小規模なものは前からあった気もするけど、コントローラっぽく処理できるようになったのが新しいのかも」

Rails: SendGrid(Web API)とAction Mailerでメールを送信する

「あー、受信メールをAWS SESにも保存できるというのは確かにメリット: SESってメールをS3に保存するというオプションがあって、たぶんこのAction Mailboxを使うとSESに置いたメールを探したり取ってきたりできそう」「おー」「メールの自動応答的な機能に便利かも?: たとえばRedmineだと、コメントにメールで返信するとチケットのコメントに取り込んでくれる機能がありますね」「なるほど!」


redmine.jpより

「ところで、メールを受け取ってそれで何かをするみたいな仕組みって、現代ではかなり減ってきていますけどね☺️」「あーこの間のウォッチで話題に出た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で発表する目標になったそうです。

つっつきの後で、改めて発表されました。

「果たして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

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マイルストーンから見繕いました。

既に今年4月のウォッチでRubyのSassが非推奨になった件を扱いましたが、その後5月に上のPRがオープンしていました。いずれもまだopenです。


つっつきボイス:「従来のRubyで書かれたsassライブラリは使うなと」「dart-sassになるかなと思ったら、C言語ベースのsassc-rubyになりそうな流れ」「確かに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@commentpersistedかそうでないかによって自動的に挙動を変えて仕分けしてくれるようになるというメリットもある😋」「そうなんですよ~」「その意味でルーティングヘルパーよりも賢い🧐」「複数形の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そのものの枠組みがいろいろわかってなくて振り落とされないようにするのが精一杯で、記憶がほとんどない…😅」

【勉強会報告】Crafting Rails 4 Applications読み会をはじめました+第一回資料

「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でやってるんですよ〜😎」「お恥ずかしや😅」

「こうやってRackミドルウェアの動作を知っておく価値は非常に高いっすね」「自分で作ったミドルウェアをproductionで使うのは結構勇気要りますけど😆よっぽど単純なものならともかく」「でしょうね〜」

「最後にあるunicorn-worker-killerって、以前のつっつきbabaさんが昔よく使ったって言ってた、ワーカープロセスを殺しまくるヤツでしたっけ?」「今も使われてるかも: Unicornのワーカーが際限なくメモリを食いまくってたんで、強制的にメモリを解放するためにkillするヤツ」「やはり」

i18nをやってみた(Hacklinesより)


つっつきボイス:「まだ駆け出しだそうですが、非日本人が日本語アプリのi18n頑張ってるので珍しいなと思って」「やってることはまったく普通のi18nですね」「JA、オレにも読める…!😋」「プロファイル見ると、この人松本市に住んでるのかー」「女性」「skill languageにちゃんとJapaneseって書いてある」

最近のRuby向けPDF生成ライブラリ(Hacklinesより)


つっつきボイス:「おー2018年版!」「wkhtmltopdf、まだあるんだ!」「すっごく昔からあるヤツって以前のつっつきにも出てましたね」「wkhtmltopdf最近使いましたよね😎」「覚えてない…😅」「ほら、透かしを入れるときに」「あー使ってたわ!」


同サイトより

prawnは知ってるけどHexaPDFって知らなかった!」「ずうっと前のウォッチにちょっと出てきてた」

「HexaPDFはPDFのマニピュレーションやマージができるのか: 機会があったら試してみようかな😋」「relative newcomerとあるから新し目だし」

「PDFライブラリって、何をやるかによって全然ライブラリが違うんですよね: 既存のPDFファイルを開いて何か操作したいときって意外と選択肢が少ない😓」「そういう事情で当時はwkhtmltopdfしか使えなかった覚えがある」「日本語PDFもやっぱり大変でしょうか?」「うーん、フォント指定ができるライブラリならだいたい大丈夫だとは思うけど」「そういえばフォントはfontconfigから引っ張ってくるタイプと、cairoとかから引っ張ってくるタイプがあったけど、だいたいfontconfigでできるんじゃないかな」「カイロってこれかー↓」「二次元画像ライブラリですね」「この虫、フンコロガシ?」

参考: Fontconfig - TeX Wiki
参考: cairo - Wikipedia


cairographics.orgより

なぜかナレーターが途中で吹き出してます↓。

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、聞き覚えがあるようなないような」「これはまさに、さっき上で話したみたいにミドルウェアが重くなったりしないよう軽量に構築する感じ」「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より)

# 同リポジトリより
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って、えっと」「シングルサインオン」

参考: シングルサインオン - Wikipedia

Rubyの+=<<Hacklinesより)

<<のShovelってショベル?」「やっぱりそう思いますよね?自分も初めてその呼び方見ました」「ショベル演算子…」「他の呼び方はなかった気がする」

「Rubyの+=<<って、慣れるまでは割と違和感あるというのはちょっとワカル」「+=<<は、Stringに対して使うと挙動が同じなのに、Arrayに対して使うと挙動が違う」「あ〜そうそう!」

「あとは記事にもあるけど、=は代入だから相手は変数だけど、<<の場合は相手がオブジェクト」

「ここは推測だけど、+=みたいなのってa = a + 1のショートハンドだから、+=の形のときだけオーバーライドするとかはできなさそう: <<はできそうだけど」「記事ではそこまでは話してないけど」

参考: Ruby | 再定義できる演算子 で組み込み演算子風のメソッドを定義する #ruby - Qiita

その他Ruby


つっつきボイス:「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

超シンプルなコンテナ管理systemd-nspawnを使ってみる

以下のスライドは2017年のですが、DockerとLXDの違いが手短に説明されていました。

  • スライドの要点
    • LXDはLXCの上のレイヤにあり、ubuntuホストで別のLinuxディストリビューションを実行する
    • LXDはVM alternativeであり、複数プロセスを扱うコンテナであり、OSであり、IaaSである
    • Dockerはアプリをカプセル化するシングルプロセスのコンテナであり、PaaSである

LXDには今のところDocker Hub的なリポジトリはないようです。

Windows Sandbox(Publickeyより)


つっつきボイス:「babaさんが喜びの声を上げていたので」「Windows 10 Pro またはEnterprise専用で、Hyper-Vベース: Windowsのライセンスを追加で買わなくてもこの記事↓でやったようなWindows on Windowsができるということに😋」「それ重要😍!」

Web開発環境をMacBook ProからWindows機に移行してみた話

「後はどのぐらいちゃんと動いてくれるかというのと、Publickey記事の『そしてWindows Sandboxが終了すれば、すべてのソフトウェアはそのファイルや状態もろとも完全に削除される』という一文が気になる😅」「😅」「きっとイメージとかは作れるんだと思うけど、途中のイメージが作れなかったらどうしよう😅」

SQL

PlanetScale: YouTubeの元CTOが立ち上げたスケーラブルMySQLクラスタ(DB Weeklyより)


同サイトより


vitess.ioより


つっつきボイス:「スケールできるMySQLクラスタサービスか: Percona版MySQLみたいな感じなのかな?🤔: ベースのVitessはオープンソースだから自分たちのサーバーでも動かせそう」「Vitess、★7000超え!」

「YouTubeのバックエンドではこの人のやってたVitessを使ってるという触れ込みでした」「ほほー!」「この辺は永遠のテーマ😎」「そういえばいつだったかTwitterがCassandraで失敗したみたいな話もあったし」「やっぱり名前が不吉だったんでは😆」

参考: Twitterが、Cassandraの本採用を断念。「いまは切り替えの時期ではない」 - Publickey

Twitterのアーカイブリポジトリにこんなのがひっそり置いてありました↓。

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とか😆」「やっぱり言語が人気を得てくると、言語設計者の当初の想定を超えた使われ方をするということで☺️」

その他

はんだ付け


つっつきボイス:「こちらのアドベント記事↓ではんだ付けの話題になったので」「はんだ付けを練習できる教材のページ」「上の記事にある『NPO法人 日本はんだ付け協会』って😆」「初耳…!😆」

Iris: はじめての自作キーボード 〜 失敗談とその解決方法 〜


handa-npo.comより

「はんだ付けっていっぱいやってました?」「そんなにやってないかなー: 一番やってたのはアマチュア無線部の頃で、それもいわゆる精密なはんだ付けなんかじゃなくて、屋外アンテナによじ登ってケーブルを60Wぐらいのでかいコテでえいやっと付けたり😆」「あーそっちの方ですか😆」「熱量要るヤツ」「ほとんど溶接」「後はたまに秋月電子のキットを組み立てたときぐらいで、ICのはんだ付けはしたことないかな」「小学校の頃に某ワンボードマイコンを喜び勇んではんだ付けしまくって組み立てたら、見事ICを1個逆に挿してたことありました😅」「あるある〜😆」

「はんだ付けは、慣れもあるけど道具が大事っすね」「先っちょはいいものを買おう!」

「はんだ付けの他にワイヤラッピングっていう結線法も自分の頃からあったんですが、何となく高そうで手が出ないうちに下火になりつつある感😢」「あー、こういう線を巻き巻きしてつなぐヤツ」「こう見えて、いったん巻くととても安定するらしいです」「携帯端末が毎月のように新しく出ていた頃なんかはこういうのでプロトタイプをどんどん組み立ててたかもですね☺️」「今もありそうだけど、今だと集積度上がりすぎてこうやって巻く余地がなさそう」

参考: ワイヤラッピング - Wikipedia

番外

土星の環は将来消えるのか


つっつきボイス:「1億年😆」「このスケールがもはやピンとこない😆」「人類いるのか😆」

参考: CNN.co.jp : 土星の環、1億年足らずで消滅か NASA研究


今回は以上です。

おたより発掘

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

週刊Railsウォッチ(20181210)update_columnは要注意、DBカラムコメントは書こう、個人情報扱いの注意点、Capistranoはやっぱりいいほか

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

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

Rails公式ニュース

Ruby Weekly

Hacklines

Hacklines

Publickey

publickey_banner_captured

DB Weekly

db_weekly_banner

Frontend Weekly

frontendweekly_banner_captured

JavaScript Weekly

javascriptweekly_logo_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の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ