- Ruby / Rails関連
週刊Railsウォッチ(20180806)Rails 5.2.1.rc1リリース、Railsガイド日本語版が5.1に対応、Regexp#match?ほか
こんにちは、hachi8833です。梅干しがこんなに沁み渡るほど美味しく感じたのは初めてです。きっと塩分が不足していたのでしょう。
「公開つっつき会 第1回」開催しました
先週の8/2(木)に開催した「公開つっつき会 第1回」はおかげさまで、いつもどおりのリラックスした雰囲気でつっつきおよびその場での懇親会ともに盛り上がりました。平日にもかかわらず参加いただいた皆様、ありがとうございました!🙇
つっつきボイス: 「今日はようこそいらっしゃいました😃」「やーさっきAWS SQSが6年ぶりにコケて焦りました💦」「SQSがコケるなんて珍しい😲」
SQS死んだ時に、めっちゃ困るのがdelete_messageが失敗するケースで、そこで失敗されると処理自体はコミットされてるケースがほとんどで、これどうにかしようとすると、RDB(最低redisとか)に記録しとかないと駄目じゃんってなってきつい……。
— joker1007 (アルフォートおじさん) (@joker1007) August 2, 2018
各記事冒頭には⚓でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
⚓Rails: 先週の改修(Rails公式ニュースより)
先週見繕った改修がいくつも先回りしていたので、masterの他のコミットからも見繕いました。
⚓Rails 5.2.1rc1リリース
7/30にRail 5.2.1rc1がリリースされました。リグレッションがなければ8/6、つまりウォッチの公開日である本日リリースされるそうです。日本時間だとおそらく今夜でしょう。
今見てみるとブランチ名からrc1
が取れているのでもうすぐですね。
つっつきボイス: 「5.2.1rc1だからそんなに時間かからずにリリースされそう: メジャーなアップグレードだとrc2とかまでかかることが多いけど」「予想以上にコミット数ありますね」「コントリビューター26人とか書いてあるけどそんなにたくさん変更入るの!?って思ったり」
rails new
するのは5.2.1が出てからにするのがよさそうですね😋。
⚓Instrumentationの項目を追加
# activesupport/lib/active_support/notifications/instrumenter.rb#L54
class Event
attr_reader :name, :time, :transaction_id, :payload, :children
attr_accessor :end
def initialize(name, start, ending, transaction_id, payload)
@name = name
@payload = payload.dup
18:00 = start
@transaction_id = transaction_id
@end = ending
@children = []
@duration = nil
+ @cpu_time_start = nil
+ @cpu_time_finish = nil
+ @allocation_count_start = 0
+ @allocation_count_finish = 0
+ end
つっつきボイス: 「Railsでinstrumentationっていうと...」「CPU timeとかが追加されてるから計測周りですね」「これはActiveSupport::Notifications
が持ってるとてもシンプルなpub/sub機能ですね: ほらサブスクライバもある↓」「ほぉお」「このサブスクライバにinstrumentをセットして時間計測なんかができるヤツ」「で今回の改修で細かいCPU Timeとかが取れるようになったのか❤️: むしろ今までなかったとは」「😃」
# activesupport/lib/active_support/subscriber.rb#L81
def start(name, id, payload)
- e = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload)
+ e = ActiveSupport::Notifications::Event.new(name, nil, nil, id, payload)
+ e.start!
parent = event_stack.last
parent << e if parent
event_stack.push e
end
def finish(name, id, payload)
- finished = Time.now
event = event_stack.pop
- event.end = finished
+ event.finish!
event.payload.merge!(payload)
method = name.split(".".freeze).first
send(method, event)
end
参考: Active Support の Instrumentation 機能 | Rails ガイド
つっつきボイス: 「おーちゃんとCLOCK_MONOTONIC
使ってるナ🕶: 正しいベンチマークを取るには単純にタイムを取ってはいかんので」「さりげにJRubyのコードあるし😆」「そういえばJRubyって使ったことあります?(自分はないけどなっ)」「あります: 起動とっても遅いです💦何でJavaの上でRuby動かすんだって思ったり」「🤣」「JITが効いてきたら速いんでしょうけど」「オンメモリだから速いですけどねー」
# activesupport/lib/active_support/notifications/instrumenter.rb#L120
+ private
+ def now
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
+ end
+ def now_cpu
+ Process.clock_gettime(Process::CLOCK_PROCESS_CPUTIME_ID)
+ end
+
+ if defined?(JRUBY_VERSION)
+ def now_allocations
+ 0
+ end
+ else
+ def now_allocations
+ GC.stat :total_allocated_objects
+ end
+ end
「そういえばこのPRは@tenderloveさんだし: きっと自分が計測したいから入れたんだな😎」「きっとその気持が大事なんですよ❤️」「DHHは基本『オレが使うから入れる』だし」
⚓ドキュメントのbin/rails
コマンドがrails
に変更
ドキュメントやメッセージが広範囲に更新されています。
#
Here's how to get started:
1. Configure your database in config/database.yml.
- 2. Run `bin/rails db:create` to create the database.
- 3. Run `bin/rails db:setup` to load your database schema.
+ 2. Run `rails db:create` to create the database.
+ 3. Run `rails db:setup` to load your database schema.
end_warning
つっつきボイス: 「bin/rails
みたいなbinstubには自分でパスを通せってことなのかな?🤔」「bundle exec
はRailsのドキュメントには書かないでしょうね😆」「書かない書かない😆」
「まあドキュメントがbin/rails
からrails
に変わってハマる人はいないだろうけど」「でも初心者は意外とこういうのにハマったりするし」「『bin/
付けるの?付けないの?』とか🤓」「...ハマったことあります😅」
「ドキュメントの"rake task"って言葉が"rails command"に書き換えられたり」「そっちの文言修正もやってますね」「今はrails
コマンドでrake
と同じことできますからね」「えっ自分いつもrake
でやってた!」「実は自分も😆」「rake
の方は変わってないはずだからrake
に慣れてる人はそのままrake
使っててよくて、新しく覚える人はrails
コマンドでやってね、って感じかな」「きっと初心者にはrails
で統一する方が紛らわしくなくていいでしょうね: 『rake db:migrate
は動くのにrake s
だと起動しない!』みたいに困らなくて済むだろうし」「それはありますね」
⚓正規表現のRubocopチェックを追加
# .rubocop.yml#L197
+ Performance/StartWith:
+ Enabled: true
+ Performance/EndWith:
+ Enabled: true
+ Performance/RegexpMatch:
+ Enabled: true
多数の=~
や!~
がmatch?
に置き換えられています。
print "[verify] #{file} is a UMD module "
- if pathname.read =~ /module\.exports.*define\.amd/m
+ if /module\.exports.*define\.amd/m.match?(pathname.read)
puts "[OK]"
else
$stderr.puts "[FAIL]"
fail
end
つっつきボイス: 「.rubocop.ymlに追加されたか」「match?
の方が速いんだっけ?=~
とかだとグローバル変数($~
などの特殊変数↓)の置き換えでオーバーヘッドあるみたいな話があったけど」
「お、if value.match(regex)
がif value.match?(regex)
に変わってるのってロジック違うし🤣」「?
なしはバグ🤣」「こっそり直した感🤣」
「#start_with?
や#end_with?
の方が速いのか」「正規表現の方が全般に遅いですもんね: #trim
の方が#gsub
より速い的な」「正規表現、ナマで書いたことあんまりない😅メソッドで書きたい方」「メソッドで書けるならその方がいいでしょうね😉」
参考: instance method String#start_with?
(Ruby 2.5.0)
参考: instance method String#end_with?
(Ruby 2.5.0)
その後調べてみると、Stack Overflowによると、Ruby 2.4.0の#8110↓でRegexp#match?
の後方参照作成と$~
変更が行わないようにしたことでオブジェクトのアロケーションが減ったとあり、これによって速度がかなり向上したようです。それ以前は~=
の方が速かったようです。
参考: Feature #8110: Regex methods not changing global variables - Ruby trunk - Ruby Issue Tracking System
String
やRegexp
の=~
演算子を使うと、マッチした場合に$~
グローバル変数が設定される。
Class:Regexp
(Ruby 2.5.0)より大意
Stack Overflowの以下のベンチマークでは、MRI 2.4.0ではRegexp#match?
が高速です↓(パターンの複雑さによってはこの限りではない可能性があります)。
$ ./bench-re.rb | sort -t $'\t' -k 2
user system total real
re.match? str 0.690000 0.010000 0.700000 ( 0.682934)
re =~ str 1.040000 0.000000 1.040000 ( 1.035863)
str =~ re 1.040000 0.000000 1.040000 ( 1.042963)
str[re] 1.340000 0.000000 1.340000 ( 1.339704)
re.match str 2.040000 0.000000 2.040000 ( 2.046464)
str.match re 2.180000 0.000000 2.180000 ( 2.174691)
MRI 2.5.1でも同じような結果でした。マッチするかどうかを知りたいだけならRegexp#match?
を使うべきですね。
⚓不要になったrequire "active_support/core_ext/regexp"
を削除
Rails 6でRuby 2.4.1以降が必須になった(#32034)のと関連しているそうです。
# activesupport/lib/active_support/configurable.rb#L3
require "active_support/concern"
require "active_support/ordered_options"
require "active_support/core_ext/array/extract_options"
- require "active_support/core_ext/regexp"
つっつきボイス: 「#32695のmatch?
置き換えと関係あるのかなと思って」「今まではActiveSupportの#match
でオーバーライドしてたってことかな?(とおもむろにRubyMineを開く)」「お、Railsのコードを追ってるんですか?」「ですです: あったー🎯↓」
# rails/activesupport/lib/active_support/core_ext/regexp.rb
class Regexp #:nodoc:
def multiline?
options & MULTILINE == MULTILINE
end
def match?(string, pos = 0)
!!match(string, pos)
end unless //.respond_to?(:match?)
end
「今まであったのはmultiline?
とmatch?
だけか」「!!
は、えーと」「!!
はbooleanへの強制変換」「なるほど、これは#match?
メソッドがRubyになかった時代のActiveSupportの対応ですね」「あーなるほど😲」「この//
って昔見たときマジでわからなかったけど、これはRegexp
オブジェクトを取ってくるためだけの書き方」「あー//
は正規表現リテラルだからか: ぱっと見JavaScriptなんかのコメンアウトかとおもた😆」 「そんなん初めてみたわー」「理解できるけど個人的にはキモい🤮」
「でこのコミットは、Ruby 2.4が必須になってネイティブのRegexp#match?
が使えるようになったのでrequire
から外したということ」
⚓gemからの不要なログ出力を抑制
ActiveRecordクエリのログ出力で
verbose_query_logs
をオンにすると、ActiveRecordと一緒に入っているgem(ActiveStorageなど)で生成されたクエリがactive_record/log_subscriber
が呼び出し元のときにすべてログ出力されてしまう。
ActiveStorage::Blob Load (7.0ms) SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1 LIMIT $2 [["id", 4], ["LIMIT", 1]]
↳ /Users/xxxxx/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
従来のコードでは、無視されていないものが見当たらない場合に
caller_locations
の最初のエントリにフォールバックしてしまっていたのが原因。
本PRでは、呼び出し元の正しい位置がわからない場合は呼び出し元をログ出力しないようにした。ついでにテストの実装の都合上、無視されるパスを設定可能にした。
PRより大意
つっつきボイス: 「上で雑に訳してみました」「どれどれー: ignored_callstack_paths
でgemのコールスタックを追わないようになったってことですね」
# activerecord/lib/active_record/log_subscriber.rb#L122
RAILS_GEM_ROOT = File.expand_path("../../..", __dir__) + "/"
+ class_attribute :ignored_callstack_paths, default: [RAILS_GEM_ROOT, RbConfig::CONFIG["rubylibdir"]]
+
def ignored_callstack(path)
- path.start_with?(RAILS_GEM_ROOT) ||
- path.start_with?(RbConfig::CONFIG["rubylibdir"])
+ ignored_callstack_paths.any? do |ignored_path|
+ path.start_with?(ignored_path)
+ end
end
「つまりこういうの↓を出さないようにしたってことですね」「なるほどなるほど😀」「今まではverbose_query_logs
をオンにするとgemのコールスタックまで全部吐いてた」「verboseだから出てきそうではあるけど」「油断するとログでディスクがいっぱいになっちゃったりするし🌊」
# 同PRより
% bin/test test/cases/log_subscriber_test.rb -n test_vebose_query_logs
Using sqlite3
Run options: -n test_vebose_query_logs --seed 38744
# Running:
[:regex, /\A(\/Users\/kamipo\/src\/github.com\/rails\/rails\/|\/Users\/kamipo\/.rbenv\/versions\/2.5.1\/lib\/ruby\/2.5.0)/]
[false, "/Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/log_subscriber.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/activerecord/test/cases/log_subscriber_test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/activerecord/lib/active_record/log_subscriber.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/activerecord/test/cases/log_subscriber_test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest/test.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/railties/lib/rails/test_unit/line_filtering.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
[false, "/Users/kamipo/src/github.com/rails/rails/vendor/bundle/ruby/2.5.0/gems/minitest-5.11.3/lib/minitest.rb"]
F
Failure:
LogSubscriberTest#test_vebose_query_logs [/Users/kamipo/src/github.com/rails/rails/activerecord/test/cases/log_subscriber_test.rb:180]:
Expected: 2
Actual: 1
...
⚓ActiveSupport::Notification
にイベントオブジェクトサブスクリプションを追加
# 修正前
ActiveSupport::Notifications.subscribe('wait') do |*args|
@event = ActiveSupport::Notifications::Event.new(*args)
end
ActiveSupport::Notifications.instrument('wait') do
sleep 1
end
p @event.duration # => 1000.138
# 修正後
ActiveSupport::Notifications.subscribe('wait') do |event|
@event = event
end
ActiveSupport::Notifications.instrument('wait') do
sleep 1
end
p @event.duration # => 1000.138
p @event.allocations # => 7
p @event.cpu_time # => 0.256
p @event.idle_time # => 1003.2399
つっつきボイス: 「さっきの#33449と関連するやつですね」「そうでした: 同じパラメータあるし」
「ActiveSupportのこのpub/subって、Railsと関係なくRubyコード書いているときにも便利そうかなってときどき思いますね😋: マルチスレッド周りうまくやってくれそうだし」「うはは😆」「require 'active_support/all'
するだけで使えるから、雑にロガーっぽいもの書きたいけど新しくgem入れるほどでもないときなんかに😆」「こういうのがあるって知っとくと何かのときに使えるかも」
参考: Active Support コア拡張機能 | Rails ガイド
ついでにI cannot spell · rails/rails@9954ce5というのも見つけました。
「うは😆」「artisanal(職人芸)と書きたかったところがarsenal(兵器)に」「サッカーチーム思い出しちゃう」「そういえばイギリスにありますね」
サッカー狂いの知人から「日本の野球で言うと巨人みたいな位置付け」と聞いたことがあります。
⚓Rails 6のデフォルトJavaScriptコンパイラはWebpackerになる
先週もちょっとだけ触れましたが。サムダウンは1人もいませんね。
つっつきボイス: 「おーもしかしてSprocketsともお別れ?」「SCSSとかでまだ必要だってDHHが書いてますね」
- リポジトリ: rails/sprockets-rails
「ところでWebpacker使ってます?」「いやー😅」「BPSでは新しいプロジェクトでWebpacker使うようにしてます」「Webpacker、あるのは知ってるけど、フロントエンドほぼまったくやらないから😆APIばっかりなんで敬遠してたというか」「🤣」「🤣」「まーSprocketsはつらいっすからね: といってWebpackerがつらくないのかというとそういうわけでもないし😎」「つらさの質が違うというか」「つらくないものってあります?なんて」「そりゃもうAPIに徹するしか🤣」
「そういえば今日の社内勉強会で『エンタープライズアプリケーションアーキテクチャパターン』(通称『PoEAA本』)を読むシリーズの最終回だったんですが」「いいなー: それ読みたいと思ってました」「で、この本が出版された2002年頃のWebアプリにはMVCしかなくて😆、当時は平和だったなーって思ったり」「MVCだけ😆」「Active Recordパターンとかが載ってる本でしたっけ?」「ですです: Railsのライブラリではない、一般的なパターン名としてのActive Recordパターン」
しばらくEAAP本の日本語訳の話題になりました(以下の記事参照)。
「横道にそれましたが、まだWebpackerでつらみは踏んでない感じですか?」「今の所は☺️」「BPS社内では約2名ほどWebpackerのつらみ踏んでます😆」「BPSではフロントエンドとサーバーサイドを皆さんどっちもガッツリやってる感じですか?」「そうでもありませんが、ほとんどの場合どこかで最低限のJavaScriptやCSSを書かないといけないんで、せっかくだからこの頃流行りのWebpacker使ってみようぜという感じで: 今更CoffeeScriptでもないでしょうし🤣」「🤣」「🤣」「DHHはCoffeeScript好きなんでしょうかね?」「案外単に消す理由がないだけだったりして: BasecampにCoffeeScriptのコードがあるからとか」
⚓Rails
⚓Railsガイド日本語版がRails 5.1に完全対応
#Railsガイド のすべての記事が Rails 5.1 以上に対応しました! 🆙✨https://t.co/wjUAaCtxSf
📑 差分更新した箇所https://t.co/qphAMTU9xK
過去バージョンは電子書籍で引き続き提供していきます📚✨https://t.co/59TkwKRjzd
💖Rails 5.2 への更新も鋭意対応中です 🏃💨https://t.co/HOAriHrrIO pic.twitter.com/UQTYcsubGt
— YassLab 株式会社 🏝 (@YassLab) August 2, 2018
つっつきボイス: 「この数か月隙を見て更新翻訳してましたが、やっとリリースできましたー」「あざっす!」「しみじみこれは偉大な仕事💪: ちゃんとした日本語訳があればそれに越したことはないっすね」「問題があればGitHubのissueに投げてもらえれば反映できる体制にしてもらってます」
早くも小さな対応漏れが見つかってるので近々に対応しますです🙇。
⚓BootstrapのjQueryを殺せるか
- サイト: Bootstrap Vue
- リポジトリ: bootstrap-vue/bootstrap-vue
- リポジトリ: thednp/bootstrap.native -- こんなのもありました
つっつきボイス: 「これは先週からの続きですね: ご存知のとおりBootstrapのJavaScriptではjQueryが必須なんですが、上のbootstrap-vueっていうのが前からあって、これを使ってjQueryをVueに置き換えれば、Bootstrapのダイアログ機能なんかをjQueryを入れずに使えるというヤツ」「みんなjQueryキライなんですかね...」「jQuery殺したい人は結構いるみたい: 自分はそんなに嫌いじゃないけど」「役割は終わったのかしら?」「簡単な管理画面ぐらいだったら今でもjQuery便利ですけどねー」「今はVanilla JSでもだいたい書けちゃいますけどね: ブラウザ互換とかを別にすれば」
「自分ところのフロントエンジニアとかは『生JSを書く時代は終わった: お前らはもうJavaScript書くな😤』なんて言ったりw」「そういうところはTypeScript使ってたりしません?」「当たり🎯」「TypeScript使う人はReact.js方面に行くことが多い印象」「うちはVue使ってる人はいないかなー?」「うちはフロント寄りの人が少ないのもあって、Reactはオーバーキルでつらそうだし、かといってjQueryもなー、という感じでVue使い始めてる」「その分、Reactを使うのはオーバーキルが必要なときぐらい、という目安にはなりますね」「BPSだとiOSやAndroidアプリのチームはReact Nativeも使ってるなそういえば」
⚓Pundit 2.0がリリース(Ruby Weeklyより)
- リポジトリ: varvet/pundit
policy_class
のポリシーををauthorize
でオーバーライド可能に(#441)- ポリシーのスコープを
policy_scope_class
オプションでオーバーライド可能に(#441) - 配列が渡された場合の
param_key
の問題を修正(#529) - ポリシーやスコープに「名前空間配列」の最後の要素を渡すようになった(#529)
NilClassPolicy
の仕様を許可(#525)- 配列が渡された場合に
policy_class
が呼ばれるように修正(#475) - コンストラクタが不正なポリシーやポリシースコープが呼び出されたら
InvalidConstructorError
を出すようになった(#462) params[:action]
ではなくaction_name
を使うようになった(#419)pundit_params_for
でparamsのフェッチをカスタマイズしやすくなった(#502)#authorize
メソッドから渡されたオブジェクトを返すことでチェインできるようになった(#385)
つっつきボイス: 「おーPundit、使いたいなーと思ってそれっきり放置してました😆」「自分はCanCanCan派」「CanCanってメンテ終わったんでしたっけ?」「CanCanは随分前に終わったけど、後継のCanCanCanはまだ終わってなかったはず: うん、今も動いてる💪」「CanCanCanってそのままフレンチカンカンなのかー」
フレンチカンカンといえば「天国と地獄」が後ろでかかりますね。日本だと運動会の徒競走なんかでよくかかる曲です。
「ついでに基本的なこと聞いちゃいますけど」「どぞどぞ🤗」「PunditとCanCanCanより前にもこういうライブラリってありましたっけ?」「CanCanはかなり昔からあったと思います」「PunditやCanCanCanって、Deviseとはまた違うものですか?」「Deviseはまた違いますね: Deviseはログインの認証(authentication)のgemだけど、PunditやCanCanCanはユーザーのパーミッションというか権限を管理するものですね(authorization): このユーザーはこれとこれはやっていい、このリソースにはアクセスしていいみたいな」「なるほどー、Deviseとは役割が違うんですね☺️」
「CanCanCanはコントローラとアクションのペアに対して割りと直感的に権限を設定できる: Punditは対照的にモデルに対して権限を設定する: ただねー、個人的にこの設計は性に合わない😆」「😆」「BPS社内でPundit好きな人いた気がします🤔」「Punditだとモデルにアクセスして蹴られたときに例外が発生するし、コントローラやアクションを見ても今どんな権限が設定されているのかわからないし😅」「今度アプリ作るときにPundit人柱やってみますw」
「もしかするとAPIサーバーだとPunditも合うのかな...?: アクション単位で権限を設定するならCanCanCanだし、同じアクションでもユーザーによって権限を変えたいとかならたぶんPunditが向いてるかもしれないですね🧐」「ということはPunditはルーティングとは関係ない?」「Punditはモデル(おそらくActiveModelあたり?)に権限ポリシーを設定するものなので、ルーティングからは切り離されてます🧐」「今思いましたが、Punditの方がドメインロジックっぽくはある」「正しそうなヤツ😆」「よりオブジェクト指向っぽいと」
⚓Railsのビューで時間のかかるプロセスを楽に扱う(Ruby Weeklyより)
# 同記事より
class LongRunningJob < ApplicationJob
include Fie::Manipulator
queue_as :default
def perform(connection_uuid)
@fie_connection_uuid = connection_uuid
is_job_finished = -> { state.long_job_progress >= 100 }
if commander_exists? && !is_job_finished.call
state.long_job_progress += 10
sleep(1.second)
LongRunningJob.perform_later(connection_uuid)
else
state.is_long_job_running = false
end
end
end
つっつきボイス: 「これはプログレスバーを実装してみた記事みたい」「ActionCableとかを使ってるのかな?と思ったら、この間ウォッチでも取り上げたfieを使ってfieのコマンダー経由で継続的な通信を行えるようにするのがポイントみたい」「リッチなプログレスバーをやりたい人向け😉」
⚓Rubocopのパフォーマンス/正規表現チェック(Hacklinesより)
- 元記事: Overview and Implementation of Performance/RegexpMatch Cop
- 関連PR: Add new `Performance/RegexpMatch` cop by pocke · Pull Request #3824 · rubocop-hq/rubocop
ちょうど上の改修にも絡んでそうなので。
上の記事はPockeさんの日本語記事の英訳だそうですが、日本語記事どこだろう...?
つっつきボイス: 「確かにさっきの改修に絡むRubocopマッチャーの話っすね」「そういえばRubocopはRailsとあまり強結合しないようにしているらしいという話があります」「中立を保つ感じですね」「今回はRuby本体に機能が加わったからRubocopにそれが入り、そしてRailsでもチェックを加えたという流れのようです」「Railsの都合で入れたものじゃないよ、みたいな」「DHHはRubocopをものともしてないみたいだし😆」「😆」「Rubocopももう少しお手柔らかにやってくれればなーと」
参考: Railsと同じRuboCopの設定が利用できるrubocop-rails gemを作った - Hack Your Design!
⚓『テスト駆動開発をやめて、なお残すべき習慣とは』シリーズ完結
つっつきボイス: 「永和システムマネジメントさんのブログでこのシリーズがついに完結したそうです」「TDDはどこまでやるかというのは悩みどころですねー」「ともすると原理主義的になりやすいし」
⚓Railsのレイアウトレンダリングチートシート
- 元記事: Rails Layout Rendering Cheatsheet – Kevin Kim – Medium
- サイト: Rails Layouts And Templates - Learn.co
短い記事です。
<!-- 同記事より -->
<!DOCTYPE html>
<html>
<head>
<title>Your project</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>
<body>
<%= yield %>
</body>
</html>
つっつきボイス: 「そういえばTurbolinksって今もRailsにデフォルトで入るんでしたっけ?」「自分は今もrails new
で--skip-turbolinks
打って殺してます😎」「よかったー😆自分だけじゃなかった」「で、うっかり入れてしまったときは黙ってJavaScriptの方でインクルードタグを見つけて消すと😆」「rails new
した後で変える方法の記事もいろいろあるし」
「Turblinksってバージョン3になってだいぶマシになったという話があった気が: 自分は使わないけど🕶」「何だかLinuxのSELinuxみたいな扱われ方っすね😆」「最初にオフにするやつ😆」「Turblinksは初心者がつまずきやすいところだし、なぜか動かないときの原因の筆頭だったりしますね」
参考: Security-Enhanced Linux - Wikipedia
⚓その他Rails
アクティブレコードみんなの夢が詰まりすぎてて毎日見てないとすぐ壊れるからしつけ甲斐がある
— Ryuta Kamizono (@kamipo) July 26, 2018
つっつきボイス: 「みんなの夢😆」「何やかやでActiveRecordはあれだけ壮大なものがちゃんと動き続けているというのはやっぱりスゴイ💪」
⚓Ruby trunkより
⚓svnの古いブランチを削除
削除されたブランチ↓
half-baked-1.9
KEIJU
KOSAKO
matzruby
mvm
new_gc
rexml_adds_tests
ricsin
RUBY
ruby_m17n
SER
SHIGEO
SPCOLTRIN
testunit
unlabeled-1.1.1
unlabeled-1.39.2
v1_0r
v1_1dev
v1_1r
win32-unicode-test
つっつきボイス: 「matzrubyっていうブランチ、RubyKaigiで話題に出た気がします: Matzの遊び場的なものだったような」「でもこのたび消されるという😆」
「そういえばSubversionのリポジトリってもしかして壊れやすいとかあるのかな?」「例の江添さんのGCC記事でもそんなこと書いてましたね」「そうそう」「ESRのマシンのメモリが足りなくてビルドできなかったとか」「bisectを1回やるのに18日かかるとかスゴすぎ🤣」「🤣」
「そういえば以前の職場でもsvnからgitへの移行やりましたね」「お、git-svn使いました? svnリポジトリにgitコマンドでアクセスできるというヤツで、正確には移行ツールではないんですが😆」「それは使ったことなかったかも」「git-svnがあればひとまずgitでも運用できるから、凌ぐには便利」
「ちなみにBPSも最初はSubversionで、その後Gitosis、そしてGitLabと移り変わってます」「Gitosisって知らなかったー」
「自分はもうSubversionには戻りたくないけどね😢」「😆」「😆」
⚓RubyVM::MJIT.pause
に:wait
オプションを追加
# 同issueより
# Wait for finishing all of queued compilations, and pause MJIT worker (different from the current behavior).
# This will be convenient for most of micro benchmarks. So I wanna make it default. It will be breaking but MJIT.pause is not released anywhere.
RubyVM::MJIT.pause
RubyVM::MJIT.pause(wait: true)
# Wait only for a currently-compiled method, and pause MJIT worker immediately (the current behavior).
# This will be convenient when there are many methods, like on Rails.
RubyVM::MJIT.pause(wait: false)
つっつきボイス: 「MJITの実行タイミングをずらすためっぽいですね」「パフォーマンス計測中にMJIT動いたらつらいだろうし」「MJITがRailsだと遅い問題があるってk0kubunさんのブログ↓にもありましたね」「Optcarrotだと速いのに」「ファミコンエミュレータ使いすぎでっしょ🤣今世界で一番激しく動いているファミコンエミュレータかも」
参考: RubyのJITに生成コードのメモリ局所性対策を入れた話 - k0kubun's blog
⚓Ruby
⚓Rubyのグローバルメソッドキャッシュをチューニング(Ruby Weeklyより)
つっつきボイス: 「これはおなじみNoah Gibbsさん記事」「RUBY_GLOBAL_METHOD_CACHE_SIZE
っていう変数、前からあったかな?」「k0kubunさんのQiita記事↓を見ると前から定義されてるみたい」「環境変数から設定できるんですね」
参考: RUBY_GLOBAL_METHOD_CACHE_SIZE
「これを増やすとちょっと速くなると↓」「『害はなさそう』って書いてますね」「これを変えて害があるようなコードならヤバイ😆」
# 同記事より
RUBY_GLOBAL_METHOD_CACHE_SIZE Mean req/sec Std deviation Speedup vs Default
1024 155.3 1.7 -1%
2048 156.8 1.5 0%
4096 158.3 2.3 1%
8192 159.5 3.2 1.7%
16384 160.3 3.4 2.2%
⚓Rubyのここが好き(Ruby Weeklyより)
割とマニアックに見えます。
つっつきボイス: 「upto
ってありましたねそういえば: 指定の数に達するまで繰り返すヤツ」「たまに使いますね」「最初知ったときは感動しました: Rubyの自然言語的な表現なんだなーって」「upto
は知ったらそれで満足しちゃった😆普段はtimes
があるからいいやって」
参考: instance method Integer#upto
(Ruby 2.5.0)
# 同記事より
pry> 1.upto(5) { |i| puts /#{i}/o.source }
1
1
1
1
1
pry> 3.times.map { |i| /#{i}/o.object_id }
=> [70135960411140, 70135960411140, 70135960411140]
「なぜかRubyのエンコーディングの挙動にキライな部分があるという記述もありますね: タイトルと違う😆」
# 同記事より
# encoding: utf-8
s = "\xff"
puts s.encoding
puts s.valid_encoding?
puts s.bytes
$ ruby test.rb
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
UTF-8
false
255
「ヒアドキュメントをネストできるって初めて知った: んー、irbに貼ってもうまく動かないし?」「ファイルで実行しないといけないとか?」「もしかしてブログのシンタックスハイライトでおかしくなってるのかも」「まあこんなコードが来たら即rejectするけどなっ」
「あーこのself[1] { 2 }
↓、この書き方一応できるんですよね: 配列添字の[]
はメソッドだからブロックも渡せる」「おー😲」「できるけどやったらいかんやつなのかも🧐」「できるだけならいろんな書き方できちゃいますしね」
# 同記事より
def [](idx, &block)
puts idx + block.call
end
self[1] { 2 }
「またヒアドキュメント: 途中に改行文字"\n"
を入れられるってことかな」「しかしヒアドキュメントって、JetBrainsのIDEですらまともにシンタックスハイライトできませんからねー😅(RubyMineを開いて)ほら」「こういうパースはつらそう...」
# 同記事より
p <<"HERE
"
content
HERE
「この1if true
って...?」「もしかして後置のif
にスペースがない?」「ひえーそんな書き方通っちゃうって...」「もはやパーサーいじめ🕶」「さすがにrationalの1rif
だとエラーになるか」
pry> 1if true
1
pry> 1rescue nil
1
「この記事長いのでとりあえず次へ行きましょうー」
⚓書籍「Confident Ruby」
- サイト: Confident Ruby
- サンプル: confident-ruby-sample.pdf
- 自信を持てるコードを書くための32のパターン
- 「MacGyver method」を避けるには: すぐ散らかる積み木のようにではなく、ストーリーを語るという視点からメソッドを考える方法を丁寧に解説
- Rubyの変換メソッドやプロトコルに重点を置く(
#to_a
と#to_ary
の違いなど) - Special CaseパターンやNull Objectパターンで条件の繰り返しをなくす
- いまいましい
NoMethodError for NilClass
例外を排除するためのシンプルな習慣 - メソッドにデータではなく振る舞いを渡すことで柔軟性を高める
- 成功/失敗の通知よりも表現力の高い結果通知方法
- 本書のパターンをRubyのオープンソースプロジェクトに実地に適用した例
- 豊富なコード例と充実の300ページ
つっつきボイス: 「Avdi Grimmさんの本だそうです」「『MacGyver methodを避けるには』のMacGyverって?」「いい意味でないのはミエミエだけど何だっけな: あー冒険野郎のアレか↓」「身近にあるものを手当たり次第使って危機を脱出するみたいなドラマでしたっけ」「そういう書き方するなってことでしょうね😎」
https://www.youtube.com/watch?v=1c-KWYYbqWM
⚓Terraforming: クラウド設定を書き出すgem
- サイト: Terraforming by dtan4
- リポジトリ: dtan4/terraforming
つっつきボイス: 「Terraformじゃなくって?」「既存のAWS S3の設定とかを解析して書き出せるってことみたい」「あ、それ便利かも: Terraformにはその機能なかったし」「たしかなかったはず」「ちょうどうちもTerraform使おうとしたときに、逆のことをやるとシステムを飛ばすからヤメロって言われたりしてます😆」「もうできちゃってるシステムにTerraformかけるのはコワイですよね😆」「ELB吹っ飛ばしたら殺される🔪」
# 同リポジトリより
$ terraforming s3 --tfstate
{
"version": 1,
"serial": 1,
"modules": {
"path": [
"root"
],
"outputs": {
},
"resources": {
"aws_s3_bucket.hoge": {
"type": "aws_s3_bucket",
"primary": {
"id": "hoge",
"attributes": {
"acl": "private",
"bucket": "hoge",
"id": "hoge"
}
}
},
"aws_s3_bucket.fuga": {
"type": "aws_s3_bucket",
"primary": {
"id": "fuga",
"attributes": {
"acl": "private",
"bucket": "fuga",
"id": "fuga"
}
}
}
}
}
}
「Terraforming、ちょっとよさそう」「これで書き出したものがメンテナンス可能かどうかはさておいても、こうやって書き出してバックアップできるという意味ではいいかも❤️」
「ところでTerraformって使ってます?」「一応使ってますけど、作って消して作って消してみたいな感じで😆」「はー、そういう使い方ならTerraformがいいのかも: 最近はAWSのCloudFormationがyamlに対応したしそっちでやっている人が多いのかなーと思ったり」「...CloudFormation使ったことなかった」「先週にCloudFormationの話題出てましたね」「Terraformで設定作っても実際に複数クラウドで使うことってあるんだろうか?🤔」「あ、メルカリさんがやってますね」「へー!?あ、リージョンごとにクラウドが違うのか」「確か日本と米国と英国で、さくらとAWSとGCPを使い分けてますね」
参考: メルカリ Microservices Team による Terraform 運用とその中で開発したOSSの紹介 - Mercari Engineering Blog
⚓pretty_ruby: Rubyの構文改変(Ruby Weeklyより)
# 同リポジトリより
require 'pretty_ruby'
using PrettyRuby
# 引数が必要なメソッドをmapする
arr = [ ['a', 'b', 'c'], ['d', 'e', 'f'] ]
arr.map(:join, '-') #=> [ 'a-b-c', 'd-e-f' ]
# >> をパイプライン演算子として使う
arr = 'hello'.chars
arr.map(:next >> :upcase).join('-') #=> "I-F-M-M-P"
# takeとdropで負の数をサポート
arr = [1, 2, 3, 4, 5]
arr.take(-2) # => [4, 5]
arr.drop(-2) # => [1, 2, 3]
# tailやinitを追加
arr.tail # => [2, 3, 4, 5]
arr.init # => [1, 2, 3, 4]
# 引数なしでscan
'abcde'.scan #=> ["a", "ab", "abc", "abcd", "abcde"]
# 引数ありでscan
arr = [1, 2, 3, 4, 5]
arr.scan(:+) #=> [1, 3, 6, 10, 15]
arr.scan(:*) #=> [1, 2, 6, 24, 120]
つっつきボイス: 「refinementでRubyの構文を改変?」「ネストしたarrayも扱ってる」「言語拡張的なこともやってるのか」「TODOがどっさりあるからまだまだやる気ですね」「Railsではまず使わないけど単発でなら使いみちあるかな?」「これRailsに入れられたら途方に暮れる😢」
⚓Rubyのソートは安定か?
日本語公式ドキュメント↓には「安定ではないが、以下のようにすると安定にできる」とあります。なぜか英語版のドキュメントにはこの記載がないことに気づきました。
# docs.ruby-lang.org/jaより
i = 0
ary.sort_by {|v| [v, i += 1] }
参考: instance method Enumerable#sort_by
(Ruby 2.5.0)
つっつきボイス: 「MRI 2.2.0からはソートが安定してるのか↓: ただしLinuxでは、とある」「こういうのはプラットフォームに依存するから」「Unix一般ではなくてLinuxなんでしょうね」「ですね: たぶんglibcとかに依存してると思うので」
# StackOverflowより
["java", "1.8.7", 357, false]
["java", "1.9.3", 551, false]
["x86_64-linux", "1.8.7", 374, false]
["x86_64-linux", "1.8.7", 374, false]
["x86_64-linux", "1.8.7", 376, false]
["x86_64-linux", "1.9.3", 392, false]
["x86_64-linux", "1.9.3", 484, false]
["x86_64-linux", "1.9.3", 551, false]
["x86_64-linux", "2.0.0", 643, false]
["x86_64-linux", "2.0.0", 648, false]
["x86_64-linux", "2.1.0", 0, false]
["x86_64-linux", "2.1.10", 492, false]
["x86_64-linux", "2.1.1", 76, false]
["x86_64-linux", "2.1.2", 95, false]
["x86_64-linux", "2.1.3", 242, false]
["x86_64-linux", "2.1.4", 265, false]
["x86_64-linux", "2.1.5", 273, false]
["x86_64-linux", "2.1.6", 336, false]
["x86_64-linux", "2.1.7", 400, false]
["x86_64-linux", "2.1.8", 440, false]
["x86_64-linux", "2.1.9", 490, false]
["x86_64-linux", "2.2.0", 0, true]
["x86_64-linux", "2.2.1", 85, true]
["x86_64-linux", "2.2.2", 95, true]
["x86_64-linux", "2.2.3", 173, true]
["x86_64-linux", "2.2.4", 230, true]
["x86_64-linux", "2.2.5", 319, true]
["x86_64-linux", "2.2.6", 396, true]
["x86_64-linux", "2.3.0", 0, true]
["x86_64-linux", "2.3.1", 112, true]
["x86_64-linux", "2.3.2", 217, true]
["x86_64-linux", "2.3.3", 222, true]
["x86_64-linux", "2.4.0", 0, true]
["x86_64-linux", "2.4.0", -1, true]
["x86_64-linux", "2.4.0", -1, true]
["x86_64-linux", "2.4.0", -1, true]
["x86_64-linux", "2.4.0", -1, true]
["x86_64-linux", "2.4.1", 111, true]
Macbook proで試してみると、2.5.1でもfalse
でした。
# Stackoverflowより
Foo = Struct.new(:value, :original_order) do
def <=>(foo)
value <=> foo.value
end
end
size = 1000
unsorted = size.times.map do |original_order|
value = rand(size / 10)
Foo.new(value, original_order)
end
sorted = unsorted.sort
stably_sorted = unsorted.sort_by do |foo|
[foo.value, foo.original_order]
end
p [RUBY_PLATFORM, RUBY_VERSION, RUBY_PATCHLEVEL, sorted == stably_sorted]
VirtualBox上のUbuntuだとtrue
でした。
⚓swagger-blocks: SwaggerスタイルのAPIドキュメント
- リポジトリ: fotinakis/swagger-blocks
- デモサイト Swagger UI
つっつきボイス: 「Swaggerは結構いい❤️」「このswagger-blocksはswagger_path
でSwaggerのエンドポイントをこう書けるのか↓」「へー、こんなふうに書けるのかー?!純粋に面白い😋」「コントローラにビューが入ってるみたいで少々キモいといえばキモいけど」「schema do
なんて書き方もあるし」「だいたいどう書けるか想像つきますね」
# 同リポジトリより
class PetsController < ActionController::Base
include Swagger::Blocks
swagger_path '/pets/{id}' do
operation :get do
key :summary, 'Find Pet by ID'
key :description, 'Returns a single pet if the user has access'
key :operationId, 'findPetById'
key :tags, [
'pet'
]
parameter do
key :name, :id
key :in, :path
key :description, 'ID of pet to fetch'
key :required, true
key :type, :integer
key :format, :int64
end
response 200 do
key :description, 'pet response'
schema do
key :'$ref', :Pet
end
end
response :default do
key :description, 'unexpected error'
schema do
key :'$ref', :ErrorModel
end
end
end
end
「Swaggerはどこかでちゃんと使ってみたい: そういえば一度API Blueprintというのを使ってみたことあるけど思ったより泥臭いというかファジーな印象」「お、私試してみようかな?🤔」「markdownで書くとSwaggerの形式で出せるんですけど、API Blueprint方言になってて、ドキュメント化されてない書き方がいろいろあるので、動くようになるまで割と手こずった: 今はAPI Blueprintってあまり使われてないかも」
参考: API Blueprint で API 仕様書を書いて、配布用の HTML を自動生成する方法 | GMOアドパートナーズグループ TECH BLOG byGMO
参考: RailsのAPIをswaggerでドキュメント化してみる - Qiita
⚓その他Ruby
- 元記事: Ruby 2.6 adds option to not raise exception for Integer, Float methods | BigBinary Blog(Hacklinesより)
- 元記事: MJIT で dlopen 使わずに ELF オブジェクトを直接ロードする話 - 兼雑記
- typedruby/typedruby
-- Rubyの静的型チェック(今は小休止中)(Ruby Weeklyより) - リポジトリ: swistak35/orbacle Ruby Language Serverの別実装(RubyFlowより)
つっつきボイス: 「ELFを直接ロードはかなり変態度高い」
なんと #プロを目指す人のためのRuby入門 の例題をC#で解いてくれた方が!違う言語で解いてもらうのは面白いですね〜。いろんな言語の解答例を見てみたい😍「Ruby プログラマーでなくても勉強になる」と書いてもらえたのも嬉しい!
【C#】RGB変換プログラムでテスト駆動開発 https://t.co/y6IED6xoDU— Junichi Ito (伊藤淳一) (@jnchito) July 30, 2018
つっつきボイス: 「違う言語で書くのはいろいろ楽しいっすね」「Go言語で書くとか」「いやそれはやめた方がw」「シェルスクリプトで書いてみるとか」
RubyのMAU絶対数推移を見ていて面白かったのは、他の言語にはない年周期的な脈動。年末の新バージョンの定期的なリリースが“カンフル剤”wになっているのだとすればとても興味深いですね。2015年のみ例外的にこの傾向が見られないのは前年のRuby3構想による話題作りが奏功したからとの解釈は穿ちすぎ? pic.twitter.com/g71RsIaibl
— sumim (@sumim) July 28, 2018
つっつきボイス: 「こうやって脈動しているのは特徴的ですね」「実はユーザー数の多い言語って初心者の数もめちゃめちゃ多いから、それだけで検索数増えているかもしれませんしね🤣」「🤣」「🤣」
「技術書も似たようなところがあって、毎年ものすごい量の本が出版されている一方で、エンジニアが本当に欲しい本に限って在庫のあるうちに買っとかないと永遠に買えなくなる😭」「ほんに」「ちょうど今日のBPS社内勉強会でも出た話なんですけど、いい技術書をいろいろ出していたピアソン・エデュケーションは日本の出版社が一度なくなってその後技術書から撤退しちゃいましたしね」「そういえばRubyの本、オライリーので買ったことなかったなー: 自分Rubyistなのに」「オライリーにめちゃ古いRuby本はあったけど」「あれ古すぎて実家に置きっぱなしです😀」「😀」
⚓クラウド/コンテナ/インフラ/Linux/Serverless
⚓「Google Build」とGitHub連携
- 元記事: Cloud Build | Docker コンテナ イメージの作成 | Google Cloud
- 元記事: Google Cloud Platform Blog: Google Cloud and GitHub collaborate to make CI fast and easy
つっつきボイス: 「Googleのツールは、もうちょっとドキュメントとかチュートリアルが充実して、あとサポートの応対が向上すれば、絶対もっと流行るのにと常々思いますね」「😀」「サポートは残念なんですか?」「今の所残念ですね: 何しろAWSがそのあたりとてもしっかりしてるので」「GCPのドキュメントも古い情報が残ってたりしましたね: 最近はわかりませんが」
「AWSのすごい点は、こちら側で原因のわからない問題が起きたときに有料サポート登録してなくてもちゃんと調べて回答してくれるところ」「へー😲」「もちろんAWS側の問題に限りますけど😉自分はインフラもやっているんで、自分で面倒を見るときのことを考えるとそういうのが大事っすね」
参考: Google、「Cloud Build」発表。ビルド/テスト/デプロイの実行をマネージドサービスで提供、1日あたり120分まで無料。GitHubと提携も - Publickey
⚓AWS FargateでRailsを動かす
つっつきボイス: 「Fargateはいいっすね❤️: まだ使ってないけど使ってみたい」「私もまだですね」「Kubernetesがちょっとオーバーキルなんで、もっと気楽に使えるコンテナが欲しいなって思いますけど」
参考: AWS Fargate – サーバーやクラスターの管理が不要なコンテナの実行
参考: AWS Fargateのデプロイパイプライン(Gitlab > S3 > CodePipeline)を構築してみた - エムスリーテックブログ
⚓Googleの「BigQuery ML」
- ドキュメント: Introduction to BigQuery ML | BigQuery | Google Cloud
- 元記事: 「Bigquery ML」でSQLを書いて機械学習モデルを構築&予測できる! - Qiita
つっつきボイス: 「へーBigQueryにクエリを投げて学習させられるみたいなヤツか」「どうせどこかでデータベースに保存するでしょうし」「まだベータ版ですね」「ですです」
⚓その他クラウド/コンテナ/インフラ/Linux/Serverless
- リポジトリ: moriyoshi/yamaha-rt-simulator -- YAMAHAルーターRTシリーズのシミュレーター
つっつきボイス: 「変わり種でこんなの見つけました」「あ、moriyoshiさんだ」「お、有名な方なんですか?」「仕事で少々」「moriyoshiさん、普通に自分も知り合い😎」「何だかスゲー😲」
⚓モバイル/Android/iOS
⚓Nuxt.jsとFirebaseでSPA×SSR×PWA×サーバーレス
ついでにThe Firebase Blogも見つけました。Firebaseの情報が不思議なぐらい日本語ばかり目に付くことに気づきました。
firebase {名} : 《軍事》発射基地
つっつきボイス: 「先週のウォッチでFirebaseスゲーという話になったので」「Firebase使ってます?」「まだですねー」「Firebaseあればサーバーサイドエンジニアもういらねみたいな勢いで」「新しいのが出るとよくそういう話になりますよね😆: AWSがあればインフラエンジニアはいらねとか」「誰かを殺さないと気がすまないみたいな🤣」「🤣」「一体何があったんだって勘ぐっちゃう😆」「そういえばFirebaseで検索してみるとほとんど日本語の情報ばかりでちょっと不思議でしたね: ↓これもすっと出てこなかった」
⚓SQL
⚓Hasura: PostgreSQLだけでGraphQLするエンジン
- サイト: GraphQL on Postgres | Hasura
- ドキュメント: Hasura GraphQL Engine Documentation | Hasura 1.0 documentation
- リポジトリ: hasura/graphql-engine
知り合いから教わりました。
つっつきボイス: 「先週取り上げようと思って忘れてたので」「やはりぽすぐれが何でもできるマンすぎるw」「これを教えてくれた人はこれがGraphQLの本命かもって熱狂してました」「認証周りとか考えるとポスグレだけでやるのはつらいんじゃね?🤣」「🤣」「Kintoneとかに置くシンプルなデータベースならこれでやれるかも」「Kintone?」「サイボウズのクラウドサービスで、バックエンドエンジニアなしで業務アプリが作れるという」「またバックエンドを殺しにかかってるw」「Kintoneは結構頑張ってよく作り込んであるみたい」「割と前からありますよね」「自分は使わないけど、使っているところ結構あるみたいですよ」
参考: kintone - サイボウズの業務改善プラットフォーム
参考: Kintone - Wikipedia
⚓データ処理スケジューリングでcronを使うべきときといけないとき(Postgres Weeklyより)
tapoueh.orgは他の記事もよさそうです。
⚓JavaScript
⚓TypeScript 3.0リリース
🎉 TypeScript 3.0 is here!!!! 🎉
Check out project references, extractable parameter lists, easier errors, and more! https://t.co/CtNIvumwLl pic.twitter.com/Da2CbPE9xn
— TypeScript (@typescript) July 30, 2018
--build
モードで用途に応じたファイル配置を指定- tupleの強化(パラメータ切り出しや展開など)
- エラーメッセージの改善
unknown
型(予約型となる)- JSXの
defaultProps
サポートやJSXタグ補完 /// <reference lib="..." />
ディレクティブ- APIレベルのbreaking changesが若干
参考: Microsoft、「TypeScript 3.0」を正式公開 ~プロジェクト参照やunknown型を導入 - 窓の杜
つっつきボイス: 「TypeScriptが出た当時はここまで普及すると思ってなかったけど、Webpackerとか使えるようになるといつの間にか真っ先に入れる感じに」「CoffeeScriptは不甲斐なかったですね...😢」「役割は終えたのかも」「Railsだとその昔RJSなんてものもありましたね」「RJSって初めて聞いた😲」「Rails 3.0までしか存在してませんけどね🤣」「この記事↓も2008年かー」「RJSで書かれたコードを全部直すという地獄を見たこともありますよ😭」「うわー」
参考: RJSなら数行のRubyコードでAjaxアプリを作成できる (1/4):Ruby on RailsのRJSでかんたんAjax開発(後編) - @IT
⚓その他JavaScript
- 元記事: Vue.js で XSS を作り込まないために気を付けること - SSTエンジニアブログ
-
元記事: Do's and Don'ts for Javascript Newbies - DEV Community 👩💻👨💻 -- JavaScript初心者がやってはいけないこと
⚓CSS/HTML/フロントエンド/テスト
⚓ダブルクリックで効くリンクをCSSだけで作る(Frontend Weeklyより)
See the Pen CSS-only double-click by Martijn Cuppens (@MartijnCuppens) on CodePen.
⚓普通のHTMLの書き方(JSer.infoより)
- 元記事: 普通のHTMLの書き方
つっつきボイス: 「基本的な内容なんですけど、こんなにみっちり書かれているのは初めて見ました」「皆さんまだ普通のHTMLを書かないんですかね?😆」「こういう情報は最新版であることが重要っすね😎」
⚓言語よろずの間
⚓Rust 2018のリリース前情報
つっつきボイス: 「言語のバージョンに西暦を使うのがちょっと珍しかったので: Microsoft Officeみたいだなって」「Python 3000とかね🤣」「🤣」「ES2016とかもあるし」
⚓その他言語
高齢者向けプログラミング言語市場
— Yukihiro Matz (@yukihiro_matz) August 1, 2018
低レイヤを知りたい人のためのCコンパイラ作成入門(仮題)、いま5.5万字。一週間前から+1.5万字。
— Rui Ueyama (@rui314) July 29, 2018
つっつきボイス: 「コンパイラを作るのは学習にはとてもいい❤️」「これはセキュキャン↓で使うのかな? 例のTuring Complete FMでRuiさんが講師をやるとか言ってたし」「あー、ありそう」
参考: [セキュリティ・キャンプ全国大会2018 プログラム:IPA 独立行政法人 情報処理推進機構
「そういえばGo言語で低レイヤを学ぶみたいな本もありましたよね?」
↓これですね。
参考: ASCII.jp:Goならわかるシステムプログラミング -- こちらで連載されていました
⚓その他
⚓ChromebookのCM
https://www.youtube.com/watch?v=2xryaZF1Z4w
つっつきボイス: 「ちょっと前にバズってたやつです」「アイコンがWindows XPだし😆」「😆」
爆弾マークはさすがにもうありませんでした。
参考: Googleが他社OSのエラー画面やブルースクリーンを揶揄するようなChromebookのCMを公開 - GIGAZINE
参考: 爆弾マークとは - IT用語辞典 Weblio辞書
⚓SlackがHipChatとStrideを買収
つっつきボイス: 「HipChatといえばいわゆるChatOps系の元祖みたいなものだったのに...時の流れは早い」
追いかけボイス: 「AttlasianがHipChatを手放したというのがむしろニュース感ありますね: Attlasianは開発コラボレーションツールのポートフォリオで売ってる所なので」
⚓文章校正に役立つ情報
- 元記事: 校正お役立ち情報
つっつきボイス: 「私のオレオレサービス↓が載ってたのでつい☺️」「へー😲」「まあこういうサービスってなかなかないですからね」「Yahooの校正APIもいろいろ制約があって大変なんだそうです」
参考: Enno.jp -- 日本語の文章のタイポ/変換ミス/誤字脱字エラーをチェック/校正
⚓その他のその他
古いQrioがドアから剥がれて落ちたので、新しいQrioをインストールした。古いバージョンの不満点がほぼすべて解消されてる。すばらし。https://t.co/JeJRT4Nkd8
— Yukihiro Matz (@yukihiro_matz) July 27, 2018
つっつきボイス: 「おーQrioね」「『剥がれて落ちた』ってw」「このQrioを鍵に取り付ければ手動でもスマホでも開けられるし」「ドアに近づくだけで開けられるのか」「設定によりますね」「あと『時間限定で1回だけ開けられる』みたいな設定もできるので、民泊や会議室で重宝されてるみたいですよ😋」「あーなるほど!」
⚓番外
⚓色は同じなのに
Correct. The green differences are due to copy-paste, and the minor changes in the size of the bands is due to the limits of my abilities to get good alignment. Here's a version with most of this fixed. I didn't anticipate the original image getting 10k likes! pic.twitter.com/GykAQraDJf
— David Novick (@NovickProf) July 19, 2018
参考: 同じ色なのに違って見える 「ムンカー錯視」画像が話題 (ねとらぼ)
つっつきボイス: 「というわけで今週の公開つっつき会は以上でした: お集まりいただきありがとうございました!🙇」「お疲れさまでーす」「お疲れさまー」「次はいつやるんですか?」
次回の公開つっつき会を現在段取り中です。どうぞお楽しみに!
バックナンバー(2018年度後半)
週刊Railsウォッチ(20180730)Rubyの速い書き方集、最近登場のRailsアプリたち、RubyWorld Conference受付開始ほか
- 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など)です。