週刊Railsウォッチ(20180806)Rails 5.2.1.rc1リリース、Railsガイド日本語版が5.1に対応、Regexp#match?ほか

こんにちは、hachi8833です。梅干しがこんなに沁み渡るほど美味しく感じたのは初めてです。きっと塩分が不足していたのでしょう。

「公開つっつき会 第1回」開催しました

先週の8/2(木)に開催した「公開つっつき会 第1回」はおかげさまで、いつもどおりのリラックスした雰囲気でつっつきおよびその場での懇親会ともに盛り上がりました。平日にもかかわらず参加いただいた皆様、ありがとうございました!🙇


つっつきボイス: 「今日はようこそいらっしゃいました😃」「やーさっきAWS SQSが6年ぶりにコケて焦りました💦」「SQSがコケるなんて珍しい😲」

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

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

先週見繕った改修がいくつも先回りしていたので、masterの他のコミットからも見繕いました。

Rails 5.2.1rc1リリース

7/30にRail 5.2.1rc1がリリースされました。リグレッションがなければ8/6、つまりウォッチの公開日である本日リリースされるそうです。日本時間だとおそらく今夜でしょう。


rubyonrails.orgより

今見てみるとブランチ名から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


jruby.orgより

「そういえばこのPRは@tenderloveさんだし: きっと自分が計測したいから入れたんだな😎」「きっとその気持が大事なんですよ❤️」「DHHは基本『オレが使うから入れる』だし」

Ruby内部の文字列を共有してスピードアップする(翻訳)

ドキュメントの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のドキュメントには書かないでしょうね😆」「書かない書かない😆」

[Ruby] Bundler 1.15の全コマンド

「まあドキュメントがbin/railsからrailsに変わってハマる人はいないだろうけど」「でも初心者は意外とこういうのにハマったりするし」「『bin/付けるの?付けないの?』とか🤓」「…ハマったことあります😅」

「ドキュメントの”rake task”って言葉が”rails command”に書き換えられたり」「そっちの文言修正もやってますね」「今はrailsコマンドでrakeと同じことできますからね」「えっ自分いつもrakeでやってた!」「実は自分も😆」「rakeの方は変わってないはずだからrakeに慣れてる人はそのままrake使っててよくて、新しく覚える人はrailsコマンドでやってね、って感じかな」「きっと初心者にはrailsで統一する方が紛らわしくなくていいでしょうね: 『rake db:migrateは動くのにrake sだと起動しない!』みたいに困らなくて済むだろうし」「それはありますね」

[Rails 5] rakeタスクがrailsコマンドでもできるようになった

正規表現の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?の方が速いんだっけ?=~とかだとグローバル変数($~などの特殊変数↓)の置き換えでオーバーヘッドあるみたいな話があったけど」

[Ruby] Kernelの特殊変数をできるだけ$記号なしで書いてみる

「お、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

StringRegexp=~演算子を使うと、マッチした場合に$~グローバル変数が設定される。
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(兵器)に」「サッカーチーム思い出しちゃう」「そういえばイギリスにありますね」

サッカー狂いの知人から「日本の野球で言うと巨人みたいな位置付け」と聞いたことがあります。

参考: アーセナルFC - Wikipedia

Rails 6のデフォルトJavaScriptコンパイラはWebpackerになる

先週もちょっとだけ触れましたが。サムダウンは1人もいませんね。


つっつきボイス: 「おーもしかしてSprocketsともお別れ?」「SCSSとかでまだ必要だってDHHが書いてますね

参考: アセットパイプライン | Rails ガイド

「ところでWebpacker使ってます?」「いやー😅」「BPSでは新しいプロジェクトでWebpacker使うようにしてます」「Webpacker、あるのは知ってるけど、フロントエンドほぼまったくやらないから😆APIばっかりなんで敬遠してたというか」「🤣」「🤣」「まーSprocketsはつらいっすからね: といってWebpackerがつらくないのかというとそういうわけでもないし😎」「つらさの質が違うというか」「つらくないものってあります?なんて」「そりゃもうAPIに徹するしか🤣」

【保存版】Rails 5 Webpacker公式ドキュメントの歩き方+追加情報

「そういえば今日の社内勉強会で『エンタープライズアプリケーションアーキテクチャパターン』(通称『PoEAA本』)を読むシリーズの最終回だったんですが」「いいなー: それ読みたいと思ってました」「で、この本が出版された2002年頃のWebアプリにはMVCしかなくて😆、当時は平和だったなーって思ったり」「MVCだけ😆」「Active Recordパターンとかが載ってる本でしたっけ?」「ですです: Railsのライブラリではない、一般的なパターン名としてのActive Recordパターン」

しばらくEAAP本の日本語訳の話題になりました(以下の記事参照)。

エンタープライズアプリケーションアーキテクチャパターンを読む: 1.概要

「横道にそれましたが、まだWebpackerでつらみは踏んでない感じですか?」「今の所は☺️」「BPS社内では約2名ほどWebpackerのつらみ踏んでます😆」「BPSではフロントエンドとサーバーサイドを皆さんどっちもガッツリやってる感じですか?」「そうでもありませんが、ほとんどの場合どこかで最低限のJavaScriptやCSSを書かないといけないんで、せっかくだからこの頃流行りのWebpacker使ってみようぜという感じで: 今更CoffeeScriptでもないでしょうし🤣」「🤣」「🤣」「DHHはCoffeeScript好きなんでしょうかね?」「案外単に消す理由がないだけだったりして: BasecampにCoffeeScriptのコードがあるからとか」

Rails

Railsガイド日本語版がRails 5.1に完全対応


つっつきボイス: 「この数か月隙を見て更新翻訳してましたが、やっとリリースできましたー」「あざっす!」「しみじみこれは偉大な仕事💪: ちゃんとした日本語訳があればそれに越したことはないっすね」「問題があればGitHubのissueに投げてもらえれば反映できる体制にしてもらってます」

早くも小さな対応漏れが見つかってるので近々に対応しますです🙇。

BootstrapのjQueryを殺せるか


bootstrap-vue.js.orgより


つっつきボイス: 「これは先週からの続きですね: ご存知のとおり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より)


  • 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ってそのままフレンチカンカンなのかー」

フレンチカンカンといえば「天国と地獄」が後ろでかかりますね。日本だと運動会の徒競走なんかでよくかかる曲です。

参考: 地獄のオルフェ - Wikipedia


同リポジトリより

「ついでに基本的なこと聞いちゃいますけど」「どぞどぞ🤗」「PunditとCanCanCanより前にもこういうライブラリってありましたっけ?」「CanCanはかなり昔からあったと思います」「PunditやCanCanCanって、Deviseとはまた違うものですか?」「Deviseはまた違いますね: Deviseはログインの認証(authentication)のgemだけど、PunditやCanCanCanはユーザーのパーミッションというか権限を管理するものですね(authorization): このユーザーはこれとこれはやっていい、このリソースにはアクセスしていいみたいな」「なるほどー、Deviseとは役割が違うんですね☺️」

[Rails] Devise Wiki日本語もくじ1「ワークフローのカスタマイズ」(概要・用途付き)

「CanCanCanはコントローラとアクションのペアに対して割りと直感的に権限を設定できる: Punditは対照的にモデルに対して権限を設定する: ただねー、個人的にこの設計は性に合わない😆」「😆」「BPS社内でPundit好きな人いた気がします🤔」「Punditだとモデルにアクセスして蹴られたときに例外が発生するし、コントローラやアクションを見ても今どんな権限が設定されているのかわからないし😅」「今度アプリ作るときにPundit人柱やってみますw」

「もしかするとAPIサーバーだとPunditも合うのかな…?: アクション単位で権限を設定するならCanCanCanだし、同じアクションでもユーザーによって権限を変えたいとかならたぶんPunditが向いてるかもしれないですね🧐」「ということはPunditはルーティングとは関係ない?」「Punditはモデル(おそらくActiveModelあたり?)に権限ポリシーを設定するものなので、ルーティングからは切り離されてます🧐」「今思いましたが、Punditの方がドメインロジックっぽくはある」「正しそうなヤツ😆」「よりオブジェクト指向っぽいと」

肥大化したActiveRecordモデルをリファクタリングする7つの方法(翻訳)

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のコマンダー経由で継続的な通信を行えるようにするのがポイントみたい」「リッチなプログレスバーをやりたい人向け😉」


同記事より


fie.eranpeer.coより

Rubocopのパフォーマンス/正規表現チェック(Hacklinesより)

ちょうど上の改修にも絡んでそうなので。
上の記事はPockeさんの日本語記事の英訳だそうですが、日本語記事どこだろう…?


つっつきボイス: 「確かにさっきの改修に絡むRubocopマッチャーの話っすね」「そういえばRubocopはRailsとあまり強結合しないようにしているらしいという話があります」「中立を保つ感じですね」「今回はRuby本体に機能が加わったからRubocopにそれが入り、そしてRailsでもチェックを加えたという流れのようです」「Railsの都合で入れたものじゃないよ、みたいな」「DHHはRubocopをものともしてないみたいだし😆」「😆」「Rubocopももう少しお手柔らかにやってくれればなーと」

参考: Railsと同じRuboCopの設定が利用できるrubocop-rails gemを作った - Hack Your Design!

『テスト駆動開発をやめて、なお残すべき習慣とは』シリーズ完結


つっつきボイス: 「永和システムマネジメントさんのブログでこのシリーズがついに完結したそうです」「TDDはどこまでやるかというのは悩みどころですねー」「ともすると原理主義的になりやすいし」

Railsのレイアウトレンダリングチートシート

短い記事です。

<!-- 同記事より -->
<!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


つっつきボイス: 「みんなの夢😆」「何やかやで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日かかるとかスゴすぎ🤣」「🤣」

参考: 本の虫: GCCのgit移行が難航中

「そういえば以前の職場でも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 2.5.0はどれだけ高速化したか(翻訳)

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」


confidentruby.comより

  • 自信を持てるコードを書くための32のパターン
  • 「MacGyver method」を避けるには: すぐ散らかる積み木のようにではなく、ストーリーを語るという視点からメソッドを考える方法を丁寧に解説
  • Rubyの変換メソッドやプロトコルに重点を置く(#to_a#to_aryの違いなど)
  • Special CaseパターンやNull Objectパターンで条件の繰り返しをなくす
  • いまいましいNoMethodError for NilClass例外を排除するためのシンプルな習慣
  • メソッドにデータではなく振る舞いを渡すことで柔軟性を高める
  • 成功/失敗の通知よりも表現力の高い結果通知方法
  • 本書のパターンをRubyのオープンソースプロジェクトに実地に適用した例
  • 豊富なコード例と充実の300ページ

つっつきボイス: 「Avdi Grimmさんの本だそうです」「『MacGyver methodを避けるには』のMacGyverって?」「いい意味でないのはミエミエだけど何だっけな: あー冒険野郎のアレか↓」「身近にあるものを手当たり次第使って危機を脱出するみたいなドラマでしたっけ」「そういう書き方するなってことでしょうね😎」

参考: 冒険野郎マクガイバー - Wikipedia

Terraforming: クラウド設定を書き出すgem


つっつきボイス: 「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ドキュメント


petstore.swagger.ioより


つっつきボイス: 「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ってあまり使われてないかも」


apiblueprint.orgより

参考: API Blueprint で API 仕様書を書いて、配布用の HTML を自動生成する方法 | GMOアドパートナーズグループ TECH BLOG byGMO
参考: RailsのAPIをswaggerでドキュメント化してみる - Qiita

その他Ruby


つっつきボイス: 「ELFを直接ロードはかなり変態度高い」



つっつきボイス: 「違う言語で書くのはいろいろ楽しいっすね」「Go言語で書くとか」「いやそれはやめた方がw」「シェルスクリプトで書いてみるとか」



つっつきボイス: 「こうやって脈動しているのは特徴的ですね」「実はユーザー数の多い言語って初心者の数もめちゃめちゃ多いから、それだけで検索数増えているかもしれませんしね🤣」「🤣」「🤣」

「技術書も似たようなところがあって、毎年ものすごい量の本が出版されている一方で、エンジニアが本当に欲しい本に限って在庫のあるうちに買っとかないと永遠に買えなくなる😭」「ほんに」「ちょうど今日のBPS社内勉強会でも出た話なんですけど、いい技術書をいろいろ出していたピアソン・エデュケーションは日本の出版社が一度なくなってその後技術書から撤退しちゃいましたしね」「そういえばRubyの本、オライリーので買ったことなかったなー: 自分Rubyistなのに」「オライリーにめちゃ古いRuby本はあったけど」「あれ古すぎて実家に置きっぱなしです😀」「😀」

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

「Google Build」とGitHub連携


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


つっつきボイス: 「へーBigQueryにクエリを投げて学習させられるみたいなヤツか」「どうせどこかでデータベースに保存するでしょうし」「まだベータ版ですね」「ですです」

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


つっつきボイス: 「変わり種でこんなの見つけました」「あ、moriyoshiさんだ」「お、有名な方なんですか?」「仕事で少々」「moriyoshiさん、普通に自分も知り合い😎」「何だかスゲー😲」

参考: ルーター | 製品情報 | ヤマハネットワーク製品

モバイル/Android/iOS

Nuxt.jsとFirebaseでSPA×SSR×PWA×サーバーレス

ついでにThe Firebase Blogも見つけました。Firebaseの情報が不思議なぐらい日本語ばかり目に付くことに気づきました。

firebase {名} : 《軍事》発射基地


つっつきボイス: 「先週のウォッチでFirebaseスゲーという話になったので」「Firebase使ってます?」「まだですねー」「Firebaseあればサーバーサイドエンジニアもういらねみたいな勢いで」「新しいのが出るとよくそういう話になりますよね😆: AWSがあればインフラエンジニアはいらねとか」「誰かを殺さないと気がすまないみたいな🤣」「🤣」「一体何があったんだって勘ぐっちゃう😆」「そういえばFirebaseで検索してみるとほとんど日本語の情報ばかりでちょっと不思議でしたね: ↓これもすっと出てこなかった」

参考: Firebase - Wikipedia

SQL

Hasura: PostgreSQLだけでGraphQLするエンジン


hasura.ioより

知り合いから教わりました。


同リポジトリより


つっつきボイス: 「先週取り上げようと思って忘れてたので」「やはりぽすぐれが何でもできるマンすぎるw」「これを教えてくれた人はこれがGraphQLの本命かもって熱狂してました」「認証周りとか考えるとポスグレだけでやるのはつらいんじゃね?🤣」「🤣」「Kintoneとかに置くシンプルなデータベースならこれでやれるかも」「Kintone?」「サイボウズのクラウドサービスで、バックエンドエンジニアなしで業務アプリが作れるという」「またバックエンドを殺しにかかってるw」「Kintoneは結構頑張ってよく作り込んであるみたい」「割と前からありますよね」「自分は使わないけど、使っているところ結構あるみたいですよ」


kintone.cybozu.co.jpより

参考: kintone - サイボウズの業務改善プラットフォーム
参考: Kintone - Wikipedia

データ処理スケジューリングでcronを使うべきときといけないとき(Postgres Weeklyより)

tapoueh.orgは他の記事もよさそうです。

JavaScript

TypeScript 3.0リリース

  • --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

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

ダブルクリックで効くリンクをCSSだけで作る(Frontend Weeklyより)

See the Pen CSS-only double-click by Martijn Cuppens (@MartijnCuppens) on CodePen.

普通のHTMLの書き方(JSer.infoより)


つっつきボイス: 「基本的な内容なんですけど、こんなにみっちり書かれているのは初めて見ました」「皆さんまだ普通のHTMLを書かないんですかね?😆」「こういう情報は最新版であることが重要っすね😎」

言語よろずの間

Rust 2018のリリース前情報

参考: Rust 2018のリリース前情報 - Qiita


つっつきボイス: 「言語のバージョンに西暦を使うのがちょっと珍しかったので: Microsoft Officeみたいだなって」「Python 3000とかね🤣」「🤣」「ES2016とかもあるし」

その他言語




つっつきボイス: 「コンパイラを作るのは学習にはとてもいい❤️」「これはセキュキャン↓で使うのかな? 例のTuring Complete FMでRuiさんが講師をやるとか言ってたし」「あー、ありそう」

参考: [セキュリティ・キャンプ全国大会2018 プログラム:IPA 独立行政法人 情報処理推進機構


ipa.go.jpより

「そういえばGo言語で低レイヤを学ぶみたいな本もありましたよね?」

↓これですね。

参考: ASCII.jp:Goならわかるシステムプログラミング — こちらで連載されていました

その他

ChromebookのCM


つっつきボイス: 「ちょっと前にバズってたやつです」「アイコンがWindows XPだし😆」「😆」

爆弾マークはさすがにもうありませんでした。

参考: Googleが他社OSのエラー画面やブルースクリーンを揶揄するようなChromebookのCMを公開 - GIGAZINE
参考: 爆弾マークとは - IT用語辞典 Weblio辞書

SlackがHipChatとStrideを買収


atlassian.comより


つっつきボイス: 「HipChatといえばいわゆるChatOps系の元祖みたいなものだったのに…時の流れは早い」

追いかけボイス: 「AttlasianがHipChatを手放したというのがむしろニュース感ありますね: Attlasianは開発コラボレーションツールのポートフォリオで売ってる所なので」

文章校正に役立つ情報


同記事より


つっつきボイス: 「私のオレオレサービス↓が載ってたのでつい☺️」「へー😲」「まあこういうサービスってなかなかないですからね」「Yahooの校正APIもいろいろ制約があって大変なんだそうです」

参考: Enno.jp — 日本語の文章のタイポ/変換ミス/誤字脱字エラーをチェック/校正

その他のその他


つっつきボイス: 「おーQrioね」「『剥がれて落ちた』ってw」「このQrioを鍵に取り付ければ手動でもスマホでも開けられるし」「ドアに近づくだけで開けられるのか」「設定によりますね」「あと『時間限定で1回だけ開けられる』みたいな設定もできるので、民泊や会議室で重宝されてるみたいですよ😋」「あーなるほど!」

番外

色は同じなのに

参考: 同じ色なのに違って見える 「ムンカー錯視」画像が話題 (ねとらぼ)


つっつきボイス: 「というわけで今週の公開つっつき会は以上でした: お集まりいただきありがとうございました!🙇」「お疲れさまでーす」「お疲れさまー」「次はいつやるんですか?」

次回の公開つっつき会を現在段取り中です。どうぞお楽しみに!

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

週刊Railsウォッチ(20180730)Rubyの速い書き方集、最近登場のRailsアプリたち、RubyWorld Conference受付開始ほか

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

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

Rails公式ニュース

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

Frontend Weekly

frontendweekly_banner_captured

JSer.info

jser.info_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の書いた記事

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ