週刊Railsウォッチ(20190107)Railsのパフォーマンス改善Tips集、Rubyの`&:シンボル`ほか

あけましておめでとうございます。hachi8833です。今回のつっつきは年末に行われました。

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

狙ったわけではありませんが日本語記事が多めになりました。英語techニュース系サイトも年末ムードでまとめ記事が多そうです。

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

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

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

今回はコミットリストから見繕いました。

Action Mailboxのコミットが導入

9月のDHHコミットがずらっと並んでいてギョッとしましたが、これだったんですね。


同PRより


つっつきボイス:「Action Mailboxは先週話題にのぼったRails 6の新機能ですね」「今週のコミットの大半はAction Mailboxでうずまってる感じでした」「コミット212件とかスゲー😆」「丁寧に追えばDHHがどんなふうにコードを書いているかわかりそうですね」「Basecamp社内でドッグフードしてたのがどどっとやってきた感じ」「デカすぎて全貌は追いきれない😅」

「amとかacとか何かと思ったらActive ModelとかAction Cableとかか↓」「さすがにここまで略されると意味不明ですね😅」「asがActive Supportとかヤバい😆: こういうのが直ったのはうれしいし、フルネームで書くのがダルかった気持ちもわかる」

# .travis.yml#L58
  matrix:
-   - "GEM=ap,ac"
-   - "GEM=am,amo,as,av,aj,ast"
-   - "GEM=as PRESERVE_TIMEZONES=1"
-   - "GEM=ar:sqlite3"
+   - "GEM=actionpack,actioncable"
+   - "GEM=actionmailer,activemodel,activesupport,actionview,activejob,activestorage,actionmailbox"
+   - "GEM=activesupport PRESERVE_TIMEZONES=1"
+   - "GEM=activerecord:sqlite3"
+   - "GEM=guides"
-   - "GEM=ac:integration"
+   - "GEM=actioncable:integration"

「コンポーネントがひとつガツンと入った感じか: ビューまであるし、ちゃんと見ないとわからないけど、もしかするとAction Mailboxはマウンタブルエンジンとして導入されたのかな?」「不要だったらオフにできるといいですね」「Railsの他のコンポーネントにもオフにできるものがあるし、できるんじゃないかなー🤔」

フォームビルダーのAPIドキュメントを追加

# actionview/lib/action_view/helpers/form_helper.rb#L1683
      ##
      # :method: text_field
      #
      # :call-seq: text_field(method, options = {})
      #
      # Wraps ActionView::Helpers::FormHelper#text_field for form builders:
      #
      #   <%= form_with model: @user do |f| %>
      #     <%= f.text_field :name %>
      #   <% end %>
      #
      # Please refer to the documentation of the base helper for details.
...

つっつきボイス:「これはy-yagiさんのコミットで、今のままだとAPI Docがなくて不便だから追加したということみたいです」「ドキュメントが自動生成される?」「でしょうね: これはRailsガイド向けかな?API向けかな?: 見た感じYardでもRDocでもないように見える🤔」「そういえば独自っぽい」「そういえばRailsガイドにAPI Docの書き方が載っていた覚えが↓」「実際のAPI Docとはまた別っぽいしなー」

参考: API ドキュメント作成ガイドライン | Rails ガイド

ルーティングテストからFacebook認証を削除

# actionpack/test/controller/routing_test.rb#L
  def test_route_with_regexp_for_action
    rs.draw { ActiveSupport::Deprecation.silence { get "/:controller/:action", action: /auth[-|_].+/ } }

    assert_equal({ action: "auth_google", controller: "content" }, rs.recognize_path("/content/auth_google"))
-   assert_equal({ action: "auth-facebook", controller: "content" }, rs.recognize_path("/content/auth-facebook"))
+   assert_equal({ action: "auth-twitter", controller: "content" }, rs.recognize_path("/content/auth-twitter"))

    assert_equal "/content/auth_google", url_for(rs, controller: "content", action: "auth_google")
-   assert_equal "/content/auth-facebook", url_for(rs, controller: "content", action: "auth-facebook")
+   assert_equal "/content/auth-twitter", url_for(rs, controller: "content", action: "auth-twitter")
  end

つっつきボイス:「Facebook-freeっていうからぱっと見Facebookがキライなのかと思った😆」「Twitterならいいのかと🤣」「珍しくサムダウン👎がある」「ポリティカルコレクト云々というより宗教的な話っぽい雰囲気?: Facebookってアカウントがないと見ることもテストもできないから、それを敬遠してるんじゃないかしら」「ぶっちゃけ積極的な意味はないし自分的にはどうでもいいし😆: サムダウンも『本質的でないコミットは入れるな』的なものなのかも」

参考: Become A Facebook-Free Business – Signal v. Noise

  1. 私たちはFacebook/Messenger/Instagram/WhatsAppの広告を購入しません。
  2. 私たちはFacebook/Messenger/Instagram/WhatsAppで宣伝もしくはビジネス活動もしくは顧客とのやりとりを行いません。
  3. 私たちはFacebookのいいねボタンやFacebookログインの提供を介してFacebookのデータ収集体制を支援することはしません。
    同ブログより

直接関係ありませんが、smoking-freeが「喫煙自由」と誤訳されるのは定番ですね。

参考: 毎日Eトレ!【145】知らないと危険! Smoking Freeは喫煙してもいい?

Rails 6で必須になるRuby 2.5のFrozenErrorに対応

# activerecord/test/cases/aggregations_test.rb#L28
  def test_immutable_value_objects
    customers(:david).balance = Money.new(100)
-   assert_raise(frozen_error_class) { customers(:david).balance.instance_eval { @amount = 20 } }
+   assert_raise(FrozenError) { customers(:david).balance.instance_eval { @amount = 20 } }
  end

つっつきボイス:「なるほど、ビルトインのFrozenErrorが使えるようになったからそっちに変えようという話」「上の2つ目の古いコミットはfrozen_error_classが一時的に導入されたときのですね」「バージョン互換のために独自のfrozen_error_classを使っていたのね」

参考: class FrozenError (Ruby 2.6.0)

Object#freezeされたオブジェクトを変更しようとした時に発生します。
docs.ruby-lang.orgより

不要なメソッドを削除

# actionpack/test/controller/rescue_test.rb#L65
- rescue_from ActionView::TemplateError do
-   render plain: "action_view templater error"
- end

- rescue_from IOError do
-   render plain: "io error"
- end

つっつきボイス:「これもy-yagiさんの年末大掃除っぽいコミット」「b00mとか謎すぎるメソッド名」「何だろね😆テストコードの消し忘れっぽいけど」「GitHubで追えるかな…GitHubではコミットidで検索できなかったorz」「全部のコミットidをチェックアウトできるようにするとめちゃ重くなりそうではあるけど: でもGitLabだとできた気がするなー」(つっつきの合間にいろいろ試した結果)「うまく見つからん😢」「とりあえず次いきましょー」

# actionpack/test/controller/rescue_test.rb#L354
   def b00m
      raise "b00m"
    end

GitLabだとできるようです↓。

参考: Allows to search within project by commit’s hash #24833 (!8028) · Merge Requests · GitLab.org / GitLab Community Edition · GitLab

roleがない場合のエラーをわかりやすく改善

# activerecord/lib/active_record/connection_handling.rb#L160
    def with_handler(handler_key, &blk) # :nodoc:
+     unless ActiveRecord::Base.connection_handlers.keys.include?(handler_key)
+       raise ArgumentError, "The #{handler_key} role does not exist. Add it by establishing a connection with `connects_to` or use an existing role (#{ActiveRecord::Base.connection_handlers.keys.join(", ")})."
+     end

      handler = lookup_connection_handler(handler_key)
      swap_connection_handler(handler, &blk)
    end

つっつきボイス:「roleの話なのでこれもマルチDBがらみっぽいですね」「そういえば前は標準エラーで済ませてたような気がする」「connected_toのインターフェイスはどうやら今の感じで落ち着くのかな?」

# activerecord/test/cases/connection_adapters/connection_handlers_multi_db_test.rb#L332
+     def test_calling_connected_to_on_a_non_existent_handler_raises
+       error = assert_raises ArgumentError do
+         ActiveRecord::Base.connected_to(role: :reading) do
+           yield
+         end
+       end

+       assert_equal "The reading role does not exist. Add it by establishing a connection with `connects_to` or use an existing role (writing).", error.message
+     end
+   end

Rails

Railsのパフォーマンス改善Tips集(Ruby Weeklyより)


つっつきボイス:「パフォーマンスの話をするときにちゃんと測定の話から始めているのはいいな」「ビューのフラグメントキャッシュ、DBのカウンタキャッシュ、HTTPのetagとlast_modifiedと」「このetagって何でしたっけ?」「これはHTTPのレスポンスに付けられるetagで、リクエストにこのetagを含めて送信してetagが変わっていなければレスポンスを全部返さなくてもよくなるWebの標準機能😎」「そうでしたか😅」

参考: HTTP ETag - Wikipedia

ETag: “686897696a7c876b7e”
Wikipediaより

「ActiveStorageを使うとパフォーマンスがよくなるというのはまた別の話の気がするけどなー?」

「HTTP/2を使えというのは納得」

「HTTP/2をCDNで使うのは不便という話: そもそもCDNってあんまりHTTP/2に対応していなかった気がするし、今のCDNでHTTP/2を使うと逆に遅くなるんじゃなかったかなー🤔」「おー?」「おそらくですが、今のインターネットではHTTP/2のように1つのTCPセッションですべてをやりとりするより、従来のように複数のTCPセッションを開く方が帯域を広く取れる気がする」「ふむう」

「Brotliって初めて見るけど何だろう?」「Gzip vsとあるから圧縮アルゴリズムか↓」「発音わからない😅」

参考: Brotli - Wikipedia

「へー、Brotliって最近のブラウザで使えるのか↓: まあGzipがいにしえの圧縮アルゴリズムだし😆、新しい方がいいのかも」

Can I Use brotli? Data on support for the brotli feature across the major browsers from caniuse.com.

Brötliは「パン」「(ハンバーガーの)バンズ」のことみたいです。

参考: Spanisch Brötli - Wikipedia

「Heroku vs Bare Metalはそのとおりで、Herokuを大規模案件で使うとめっちゃハマるし☺️☺️」「やっぱりー」「記事にもあるけど、Herokuはさくっとサービスを立ち上げるにはいいけど、パフォーマンス面ではよい選択肢とは言えない: おっしゃるとおり」「この間のRailsdmでもそんな話があった気がしました」

「やる前から十分予測できることなのに、ハイパフォーマンスを要求する案件にHerokuを使うというのは、正直インフラの見通しが甘いと言わざるを得ない🧐」「Herokuで最大に課金して操縦桿をめいいっぱい引いてもダメですか?」「もう全然足りないですね😇: そのためにもシステム構築の段階でインフラエンジニアに参加してもらうべきだし、その費用をケチると後々泣きを見ます」「でしょうね😅」

Resource Hints: prefetchって最近見かける」「prerenderとかpreconnectなんてのもあるのか!」「ブラウザによってサポートまちまち…」「Resource Hintsを使うとしたら、もうミリ秒単位で速度を追求するときでしょうね」

<link rel="prefetch" href="(url)">
<link rel="prerender" href="(url)">
<link rel="preconnect" href="https://example-domain.com/">

参考: Resource Hints: prefetch
参考: Resource Hints: prerender
参考: Resource Hints preconnect

「記事は下の方に行くほど改善幅が小さくなるっぽい」「その分下の方にいくほど機能も新しい感じですね😋」

SSRFとは


つっつきボイス:「徳丸先生の記事です」「Server Side Request ForgeryがSSRFか: CSRFになぞらえた感じの命名」

参考: クロスサイトリクエストフォージェリ - Wikipedia
参考: サイボウズ脆弱性報奨金制度で認定されたSSRF

「SSRFはおそらく概念としては前からある感じなんだろうけど…あーなるほど、これはもうおっしゃるとおりとしか」「というと?」

ここまで説明したように、任意のURLを対象とする処理はSSRF攻撃を受けやすく、また完全な対策は難しいのが現状です。
言い換えれば、「完全な対策が難しい」からこそ、今SSRFが注目されているとも言えます。
そもそも任意URLを受け取る処理が必要かどうかという仕様面の検討をした上で、実装の際にはできるだけ安全側に倒した処理と、アプリケーションとネットワークの両面からの対策を推奨します。
blog.tokumaru.orgより

「EC2には、URLを使って自分のインスタンスの情報(インスタンスメタデータ)を取れるという機能があるんですが、ここで例に使っているはてなブックマークみたいに、任意のURLを受け取ってそのコンテンツを取り出すサービスなんかだとこうやってEC2のメタデータを取ることができてしまう↓」「どっひゃー😱」


blog.tokumaru.orgより

「メタデータを抜かれてどのぐらいヤバいかだけど…起動の変数とかcredentialとか抜かれたらエグいな😇」「ですね😢」「これは知らないと防げない脆弱性: そしてインスタンスメタデータを取れるというのは、どちらかというとAWSの知識」

「対策といってもURLの検証で完全にカバーするのは難しいしなー: 実際記事にも書いてあるし、URLの検証は結構奥が深い」「ネットワーク的な保護も有効です、とあるけど今度はプロビジョニングで詰まることもありそうだし、痛し痒し😅」「何らかのバリデーションは必要そう」

「これは確かに知っておくべき脆弱性👍」「対策は大変なんでしょうか?」「わかってしまえば対策そのものは大したことはないですね: 知っておかないとハマるヤツ」「なるほど!」

Yuguiさんが解説するソフトウェアの設計手法


つっつきボイス:「お、これははてブで上がってたgrpc-gateway記事」「RubyやRailsと直接つながっているわけではありませんが、設計の参考になりそうに思えたので」

意図せざる技術的負債は厄介の種ですが、返済計画を立てた上で負債を選択すれば初期のアイディア検証段階にかけるコストを抑えられます。
同記事より

「技術的負債も薄い層でやってる分には問題ないだろうし、今後いつ問題になるかという見通しがちゃんと立っていれば、返済計画を立てて負債を選ぶというのはいいと思いますね」「ふむふむ」「アプリ側のインターフェイスでgrpcも使いたいしRESTも使いたいしJWTも使いたいみたいなことになってきたら、それぞれで薄いミドルウェアを実装するよりもこうやって間にgatewayをはさんで全部やらせる方に切り替えるというアプローチは、実装の手間をトータルで減らす方法としては悪くないと思います🧐」「なるほど!」「もちろん集中によるリスクも考慮したうえで、ね」

その他Rails


railsdm.github.ioより


つっつきボイス:「論理DHH氏って一瞬そういうハンドル名の人がいるのかなと考えちゃいましたが、次回のRailsdmにDHHがリモートで質問に答えるということでした☺️: amatsudaさんが通訳で」「この通訳はRailsをわかっている人でないと務まらなさそう☺️」「試験的にで構わないから、リアルタイム英語字幕サービスを使ってくれたらうれしい」「あれ、このタイムテーブルだとDHHの時間が5分しかないことにw」「ホントだ🤣」(注: その後修正されています)

参考: UDトーク | コミュニケーション支援・会話の見える化アプリ

「そして秒速さんと神速さんが横に並んでるの図↓😆」「それでk0kubunさんがこのツイートを↓😆」


railsdm.github.ioより


Ruby

ko1さんとmameさんによるRuby 2.6解説


つっつきボイス:「これこれ、さすがコミッター🎊」「これで言い尽くされてる本命感」「Rubyはこういうコアな情報が日本語で出てくるのがいいっすね~😋」「ホントホント」「😋」「英語苦手な人にも読んでもらえるし」「このお作法も初めて知りました↓」

完全に余談ですが、Unicode の大文字・小文字の話題になると、「Dz」という字の話をするのがお作法です。これは D と z の 2 文字ではなく、D と z が合体した 1 つの文字です。こういう文字を、digraph、二重音字と言います。この文字には、大文字・小文字に加え、タイトルケース(先頭の文字だけが大文字)の 3 種類があります。
同記事より

「そういえば2.6.に入れたけどやっぱり外す方がいいかな〜みたいなmameさんのツイートをさっき見た気がする」「どれどれ」「あったあった🎯↓」「2.6と3.0のポリフィルが意図せぬ破壊的変更にー😢」「こんなコードはたぶん書かないけどっ😆」

Rubyの演算子優先順位でやんちゃする


同記事より


つっつきボイス:「動物イラストと関数型言語大好きのBrandon Weaverさんの記事ですが、&Proc coercion operatorと呼ばれているって初めて知ったので」「マジですか!😳」「proc化する演算子だからわかるけど」

そういえば技術用語じゃないcoercionは基本的にネガティブな意味ですね。

{名-1} : 強制、無理強い
{名-2} : 抑圧、支配
{名-3} : 強制力、支配力

「名前あったんだー」「Rubyでは一応こういうものにはひととおり名前は付いているはずですが、検索しにくいという😆」「ホントホント」「Rubyを知った頃、&でprocになるのって直感的でないなーって思った」「ホントホント」「慣れるまでは」

# 同記事より
[1, 2, 3].select(&:even?)

「それにしてもRubyはなぜ&でprocになるのかと😆」「ましてや&:シンボルという合わせ技になると余計考えちゃった」「そもそものselectはブロックを取るメソッドだからまあいいとしてもー」「きっと当時空いてた記号を使ったんではないかと🤣」「🤣」

「もしやメソッド定義のブロック引数&が起源なんじゃ?」「そんな気がする!😤」「にしても&:の後ろがシンボルでないといけないし」「しかもこの&:の組み合わせに呼び名がないし(ないよね?)」「&:シンボルを組み合わせたときだけこういう挙動になるというのがまた直感的でないし😅」「🤣」「🤣」「さすがにもう慣れたけど☺️、特に他の言語からRubyにやってきた人が最初にギョッとしそう」「でも慣れると便利なショートハンド」「それは確か」

「ただこのショートハンドは書くのは楽だけど、中ではprocが動いてるので、そこは意識しておかないといけない」「そうっそうっ😤」「&:なんちゃらをメソッドチェインしてさらに&:なんちゃらとかやるとprocオブジェクトが大量に発生するするので、コードレビューでも気をつけてないといかんヤツ😅」

「procは速度的にも不利だし」「何と比べて遅いんでしょうか?」「もうprocするだけで何やっても遅い🐢」「上のコードはselect!じゃないからselectでprocオブジェクトを作るコストは確かに無駄: でもねー、こうやって書けるとキレイキレイって個人的に思っちゃう❤️」「ちょっとわかるー: チェインしなければ気持ちイイ!」

「表記はこんなにシンプルなのに、予想を超えて重いのが&:シンボル」「めちゃくちゃデカいarrayに対して使うと詰んだり、ね☺️」「詰む詰む😅」「Integerのarrayなのに何でこんなに遅いんだ?みたいな」

「そしておなじみ、↓シンボルなしの&渡し」「こっちはlambda作って渡すヤツ」「あんま使わないけど🤣」「カリー化星人にはなくてはならないヤツか🍛」「デバッグのときによくRailsコンソールでこれ使ってるのー🥰: ただproductionではやりすぎ感あるけど」「たしかに: 例外が起こったときにほぼ読めなくなるし😅」「その場で生成された一時オブジェクトの例外になるから、デバッガーシンボルに名前がついてないみたいな状態になっちゃう😭」「みんな名無しさんに🤡」「メソッドチェーンって基本デバッグがやりづらくなる😅」

# 同記事より
[1, 2, 3].map(&do_both)
=> [6, 11, 16]

「Mfって何だ?」「Modifier Function?!」「どことなく数学用語の匂い」

# scalaの書き方
List(1, 2, 3).map(_ + 5)

「Rubyだとたしかこの_、直前に評価された結果が入るんじゃなかったっけ?」「そんな$で始まる特殊変数みたいな微妙なものが?」「その_は絶対使わないという宣言とかじゃなくて?」「Rubyにもそういうのがあるんだったかなー?🤔」

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

「Stackoverflowにこんなのあったし↓」「ひえぇ🤪」「簡単にアクセスできない呼び出し元にこうやってサクッとアクセスできるという感じかな」「JavaScriptにもこんなのがあった気が😅」「仕事のコードでは書いて欲しくない😅」

参考: ruby - Where and how is the _ (underscore) variable specified? - Stack Overflow

lambda { |x, x| 42 }            # SyntaxError: duplicated argument name
lambda { |_, _| 42 }.call(4, 2) # => 42
lambda { |_, _| 42 }.call(_, _) # NameError: undefined local variable or method `_'
lambda { |_| _ + 1 }.call(42)   # => 43
lambda { |_, _| _ }.call(4, 2)  # 1.8.7: => 2
                                # 1.9.3: => 4
_ = 42
_ * 100         # => 4200
_, _ = 4, 2; _  # => 2

「で、さっきのproc coercionの&:even?↓って、&:のどっちが先に結合するんだろうか?」「ここはASTを調べてみるか」

[1, 2, 3].select(&:even?)

require 'ripper'して)「&:even?:args_add_block:symbol_literalだから&はやっぱりブロックか」「ということは…スペース入りの& :even?とやってもASTがまったく同じだっ↓🥶」「ホントだ」「やべー」「やべー」

irb(main):007:0>  Ripper.sexp('[1, 2, 3].select(&:even?)')
=> [:program, [[:method_add_arg, [:call, [:array, [[:@int, "1", [1, 1]], [:@int, "2", [1, 4]], [:@int, "3", [1, 7]]]], :".", [:@ident, "select", [1, 10]]], [:arg_paren, [:args_add_block, [], [:symbol_literal, [:symbol, [:@ident, "even?", [1, 19]]]]]]]]]
irb(main):008:0>  Ripper.sexp('[1, 2, 3].select(& :even?)')
=> [:program, [[:method_add_arg, [:call, [:array, [[:@int, "1", [1, 1]], [:@int, "2", [1, 4]], [:@int, "3", [1, 7]]]], :".", [:@ident, "select", [1, 10]]], [:arg_paren, [:args_add_block, [], [:symbol_literal, [:symbol, [:@ident, "even?", [1, 20]]]]]]]]]
irb(main):009:0> 

「まあこうやってASTをチェックすればわかるというのがいいところ😋」「あーびっくりした」

Pryでコピペしたい


つっつきボイス:「この辺は.pryrcで割とどうにかなりそう」「この人はtmuxのコンフィグも使ってますね」

Ruby trunkより

Date.parse('2018')がエラーになるなんて


つっつきボイス:「Date.parse('2018')と書いたらそうなりそうだし」「'2018'ってDateじゃないし😆」「ヨーロッパのdd.mm.yyyy形式とかその辺が絡んでるっぽい」「1.1.のどっちが月でどっちが日かとか😢」

「むしろissueで参照されている以下の動画↓が気になりました」「コードもスライドもなしでタイムゾーンを10分間熱く語ってるっぽい」「動画じゃなくていいんじゃね?😆」

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

EKSが東京リージョンに


つっつきボイス:「そうそう、EKS来ましたね」「KはKubernetesなんですね」「そう、AWSのマネージドクバネテ⚓」

「AWSのECSはあくまでクローズドなサービスだけど、EKSはKubernetesなので、EKSで動けばGoogleの同種のサービスであるGKEでも原理的には動く、はず🙃」「おー」「厳密にはロードバランサーとかの仕様が違いますが、Kubernetesのレイヤは同じはずなので」「AWSにEKS、GoogleにGKEができたことでロックインされずにやれそうなのはうれしい😋」

その他インフラ


つっつきボイス:「これもはてブから」「レイヤーゼロって物理層ですよね?」「いや、物理層よりさらに下です😎」「あ、そっちか!」「ビルとか土地とか立地条件とか」「↓こういうのがレイヤーゼロだそうです」「なるほどー」「レイヤーとは言わない気もするけど😆」


同記事より

SQL

MySQL 8.0解説


つっつきボイス:「単なる機能紹介じゃなくて、割と運用面の具体的な注意点にも触れていてよさそうだったので」「ウィンドウ関数やっと入ったか」「おすすめはRANK関数…って、なかったの?」「そういえばRANK関数はじめて使ったのはぽすぐれだった」

参考: ウィンドウ関数

「そしてJSON機能と独特の記法↓…MySQLもとうとうJSON地獄に仲間入り👹」「きた〜」「きた〜」「こないだPostgreSQLでJSON地獄見た〜」

-- 同記事より
SELECT 
    doc ->> '$.firstname' AS firstname,
    doc ->> '$.lastname' AS lastname,
    doc -> '$.score' AS score
FROM
    students
WHERE
    doc->'$.score' > 80;

「リソースグループは、MySQLをカリカリにチューニングしたい人によさそう」

「お、認証プラグインがcaching_sha2_passwordに変わるのか」「しゃーつー」「古いMySQLクライアントからだと8に接続できなくなると: これは知らないとハマる😅」

「え、クエリキャッシュ消えるの?」「一度入ったのに消える?」「クエリキャッシュはかなり昔からあって、しかもよく使われてました😭」「あ、記事にもあるけど5.6からデフォルトで無効化されていたかも」

log_binのデフォルトが1になった: これは注意しないとディスクがあふれる🚰」「log_binはバイナリログなんですが、トランザクションログというか実行された更新系SQLがすべて入っているのですんごい量になります」「ひょえー」「逆に言うとlog_binがあればデータを巻き戻せる」「おー」「AWSだとデフォルトで8GBぐらいだからlog_binで割と簡単に死ねます😇」「記事には大丈夫ですよって書いてるけど」「どうかなー😆」「用途とかlog_binのローテーション設定にもよるけど、でかいバッチをぶん回したときとか危ないかも」「log_binを文字列で出すと容量が増えるので注意⚠」

ぽすぐれびとに聞きました: お気に入りのツールや技は?(Postgres Weeklyより)

このgemはRubygemではありませんでした(´・ω・`)。


つっつきボイス:「ぽすぐれは知られざる機能がもう多すぎて😆」「この間のcitextもある」「psql -xとか」「row_number() over()とか」「FDWとか」「GIN Indicesとか」「この記事↓にあったヤツですね」「psqlでvimも使えるのか」「Unix的に普通に使えそうですね☺️」

PostgreSQLの機能と便利技トップ10(2016年版)(翻訳)

「pl/brainfuck😆」「マジで😆」「brainfuckでストアドプロシージャ書くやついるのか😆」

参考: Brainfuck - Wikipedia

「ぽすぐれはこういう機能がいろいろあっていいですね〜😋」

JavaScript

TypeScript Deep Dive


つっつきボイス:「これもはてブから」「もうそろそろ、TypeScriptがブラウザでそのまま動くようになればいいのに」「そうっそう思うっ👍」「デバッグのときにTypeScriptがコンソールで動いたらどんなにいいかと😂」「こっそりでいいから入れといて欲しいの😍」「Googleならやる😆」

その他JavaScript


つっつきボイス:「おー、ブラウザだけじゃなくてNode.jsとかのHTTPリクエストを扱うライブラリか」「Fetchもあるし」

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

WindowsのIME切り替え


つっつきボイス:「この記事見たかも」「今英語キーボードだからもともと半角/全角キーないし😆」

Macのコマンドキーだけ搭載したノートPCが欲しいのは私だけなのでしょうか。

言語

機械学習あるある


つっつきボイス:「これはいろいろわかりみ☺️」「わかりすぎる😆」「新しいものが出てくると割とこういう道を辿る感じですね」 「Railsもある意味似たような道を辿ってるし: 『Railsなら何でもあっという間に作れます』とか😆」「全部scaffoldでやるとか😆」

その他言語


つっつきボイス:「これもすっごくわかりみ〜」「かと思うと、あえてこの時期の古い情報が欲しい、というのもある😎」「これってRails 3ではどう書くんだっけ?とか」「たしかにー」


その他

コンクリートの平成史


つっつきボイス:「これもはてブで見た」「ジャンルは違うけどエンジニア記事としていいなと思って」「視点が割と固定気味かなとも思うけどいい感じの記事👍」「どの世界でも専門家の話はやっぱり面白い😋」

「これで連想したんですが、ちょっと前に自宅付近の道路でアスファルト張替え工事が終わったら、自動車の走行音がびっくりするほど静かになってたので(体感で1/3ぐらい)、きっとこういうの↓をやったんだろうなと思って」

社名変更


つっつきボイス:「ダイナブックといえば大昔にアラン・ケイが提唱した『ダイナブック構想』↓でしょう」「私もー」「ダイナブックという名前もだいぶくたびれてきた感」

参考: ダイナブック - Wikipedia

「シャープといえばMURAMASAっていう当時としてはうっすいノートPCがありましたね」「あったあった!」「知らなかった〜」「↓記事の写真はまだもりっとしてますね」「これじゃなくてA4サイズの大きいヤツだったはず」

参考: 【モバイラーが憧れた名機を今風に蘇らせる】シャープ「MURAMASA PC-CV50F」 ~暗黒時代を生き抜いたEfficeon搭載小型モバイル - PC Watch

「当時はこれちょっといいなって思ったことあり😋」「ネーミング的にそっちの路線の方が好き😍: スズキのカタナみたいで」「名前負けしたらそれはそれで恥ずかしいかも😆」「こうなったのはシャープがチャイナブランドになったからなのかなー」「チャイナブック😆」「😆」

群衆の英知もしくは狂気


同サイトより

今日の社内勉強会で紹介されていました。


つっつきボイス:「これも実はちょっと前にはてブでバズってましたね」「勉強会の後Macbookからずっと音がしててどのタブだろうと思ったらこのサイトでした😅」

番外

ロボット手術@築地


つっつきボイス:「リモート手術は日本でもだいぶ始まってますね: しかも海外だとさらに普及してるし」「実用性はクリアしていて、後はコストだけだって記事にもありました」「さすがに全自動ではない?」「ゲーセンのコントローラみたいなので操作するみたいです: 手ブレとか危険な動きを完全にキャンセルしたり」


今回は以上です。

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

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

Rails公式ニュース

Ruby Weekly

Hacklines

Hacklines

Postgres Weekly

postgres_weekly_banner

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ