Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

週刊Railsウォッチ(20200115後編)Ruby 2.7関連情報、Bootstrap 5は今年前半リリースか、PostgreSQLでやってはいけないリストほか

こんにちは、hachi8833です。Sprocketsは外してWebpackに一本化する決心がつきました。

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

今回も第18回公開つっつき会を元にお送りいたします。ご参加いただいた皆さん、ありがとうございます!

Ruby

Ruby 2.7関連ドキュメントや記事など

2.7情報は今年最初のRubyWeeklyを見る方が早そうです↓。


つっつきボイス:「Ruby Referenceは、英語の公式Rubyドキュメントの新しい部分をzverokさんがセミオートでかき集めてビルドしているドキュメントサイトです(ウォッチ20180413)」「そういえばあったな〜」

Ruby Referenceを眺めて

「ちょうどRuby Referenceで見えたけど、このOpen3↓ってなぜ3なのかが一見わからないけど使ってみるとああなるほどってわかるヤツ😆」「これ何でしょう?」「stdinとstdoutとstderrを同時に開くライブラリですね☺️」「だから3なのか〜」「と思うんですけどね(他に考えられない)😆」「capture3とかcapture2も謎😆」「もう少しマシな名前なかったのかと😆」


rubyreferences.github.ioより

「たしかOpen3ってRuby以外にもあったはず↓」「なるほどPerlでしたか😳」

参考: IPC::Open3 - perldoc.perl.org

RubyのJITとパターンマッチ


つっつきボイス:「上はk0kubunさんのJITプログレス記事です」「2.6でJITが入ってから2.7までの進捗!」

見出しより:

  • Ruby 2.7リリース
  • Ruby 2.7で自分が実装した部分
  • Ruby 2.7で自分がコミットしなかった部分
  • Ruby 3.0で自分がやる予定の部分

「RailsでのJITは手こずってるみたいですね」「そこは確かに難しいでしょうね」「たとえば最適化をRubyに全部おまかせにするんじゃなくて、JITを走らせる/走らせたくないタイミングとかについてコードの側からある程度ヒントを与えるとかしないと、Railsみたいなリクエスト/レスポンス型のアプリの最適化は難しいのかなってちょっと思いますね🤔」

後でk0kubunさん記事を急いで読んでみると「JITでのRails最適化はまだやれると思う」「以下の戦略でRailsベンチマークによく効く最適化の導入を考えている」とありました。

  • インストラクションベースの最適化を推し進める
  • インライン化を推し進める
  • Cで書かれたメソッドの種類の自動識別

さっき拾ったツイートより

つっつきボイス:「kamipoさんがRailsのコード例で回答してくれてますね」「なるほど、インスタンス変数でチェックしてメソッド呼び出しを避ける最適化↓」「Rubyのメソッド呼び出しの遅さはライブラリのコードだと気になるでしょうね☺️」「こういう部分にJITが効いてくれたら嬉しい!」

# 同PRより
      def read_attribute_before_type_cast(attr_name)
-       sync_with_transaction_state
+       sync_with_transaction_state if @transaction_state&.finalized?
        @attributes[attr_name.to_s].value_before_type_cast
      end

self.classで呼ぶと参照し直しになって遅くなる面もありますね」「20%速くなるってスゲエ😳」「それだけ呼び出し回数が多いということか😳」

# 同PRより
      def pk_attribute?(name)
-       name == self.class.primary_key
+       name == @primary_key
      end

Ruby Trunkより

いずれもまだcloseしてないissueです。

つっつきボイス:「#16488はAction Mailerに絡んだruby2_keywords周りの修正のようです(#38105)」「こういうエッジケースは指摘をもらわないとなかなか気づけないでしょうし☺️」「そういえば2.7でruby2_keywordsが入ってましたね😳」「Ruby 3でbreaking changesになる部分をRuby 2.6以下のロジックでアクセスできるようにするものだったと思います」「後方互換性用でしょうか?」「あと移行もですね☺️」

# 同リポジトリより
require 'ruby2_keywords'

module YourModule
  ruby2_keywords def delegating_method(*args)
    other_method(*args)
  end
end

「#16468はちょっと毛色を変えて素数判定周りです」「Prime.prime?のアルゴリズムを変更すると速くなるぞと😋」

参考: ミラー–ラビン素数判定法 - Wikipedia

unodos: 数列を推測するgem


つっつきボイス:「ruby-jpで見かけました」「なるほど、フィボナッチ的な数列を渡すと式を推測してくれると」「数学科出身のkazzさんにこのgemの話をしたら、そんなに大変じゃなく作れそうって言ってました」

# 同リポジトリより
require 'unodos'
Unodos[1,2].take(5) # => [1,2,3,4,5]
Unodos[1,2,4].take(5) # => [1,2,4,8,16]
Unodos[1,1,2,3,5].take(8) # => [1,1,2,3,5,8,13,21]
Unodos[1,1,2,4,3,9,4,16,5].take(10) # => [1,1,2,4,3,9,4,16,5,25]

「推測結果をruleで見られる↓のがいいですね😋」「自分の期待する式になるかどうかはわかりませんけど😆」「数列からどこまで複雑な式を生成できるかを遊んでみたら楽しそう❤️」「ああやっとわかったかも😆」「つかそうやって遊ぶためのgemなのかなって😆」「コードゴルフ的にどれだけ長い式を出せるかという飛距離を競うとかありそう😆」

# to see the generated rule
Unodos[4,1,0,1,4,9].rule # => "a[n]=4-4*n+n**2"
Unodos[1,2,4,5,7,8].rule # => "a[n]=-a[n-1]+3*n"

「と言ってる間にピザが到着しました🍕」「21:00になったら飲み食いしながらウォッチドラフトを眺めましょうか😆」

その他Ruby


つっつきボイス:「おおWindowsのRubyInstallerだ」「今もメンテされてるのがエライ🙏」「WSL2が出た後の世界で使うことがあるかどうかですけど😆」「そもそも矢印キーで履歴辿れなかったんですね😳」「Windowsのターミナルに対応するのは大変ですよ〜😆」

参考: WSL2で劇的に変わるあなたのWebアプリケーション開発環境【その2:導入編】 | SIOS Tech. Lab


つっつきボイス:「公開つっつき会もアンチハラスメントポリシーを設定してもいい頃かも🤔」「RubyKaigiに準拠でおk😆」「公開しておくことに意義がありますし☺️」

後で見つけたツイートの「ぼっち対策」ってどんな感じで行われたのか気になります。私もぼっちなので。

DB

(公式)PostgreSQLでやってはいけないことリスト(Postgres Weeklyより)


つっつきボイス:「何しろ公式なので😆」「『table inheritance使うな』とか」「table inheritance、実はそんなにキライじゃないです😆: productionで使ったことありますし」「おぉ😳」「そういえばGitLabで問題になったことありませんでしたっけ?😆」「まあまあ😆」「moneyって型があるとは」「ぽすぐれはいろんな型ありますし☺️」

「そういえば!=という条件が遅いっていう話をkamipoさんがどこかにMySQLがらみか何かで書いてた気がします: 実際そうで、!=は基本的にデータを全精査しないと取れませんし」「言われてみればという感じ☺️」

参考: パフォーマンスの遅いSQL。インデックスを使わないSQLとは? | Oracle初心者でもスッキリわかる

使ってはいけないもの(同Wikiより):

  • エンコード
    • SQL_ASCII
  • ツール
    • psql -W or --password
    • rule
    • table inheritance
  • SQL
    • NOT IN
    • 大文字のテーブル名やカラム名
    • BETWEEN(特にtimestampで)
  • Date/Time
    • タイムゾーンなしのtimestamp
    • timez
    • CURRENT_TIME
    • timestamp(0)timestamptz(0)
  • テキスト
    • char(n)(固定幅のidにも使わないこと)
    • 上限指定のあるvarchar(n)をデフォルトにする
  • その他
    • money
    • serial

PostgreSQLのささやかなベストプラクティス(Postgres Weeklyより)


つっつきボイス:「短い記事で、割と定番かなと」「運用向けという感じですね」

見出しより:

  • 接続文字列と環境変数を使う
  • credentialは定期的にローテートする
  • 主キーにはBIGINTかUUIDを使う
  • connection poolingを使う

「そういえば主キーにUUIDを使うのってどのぐらい普及してるんでしょうね: RailsでもUUID使うべきという人がいたりしますけど、ルーティングのURLがめちゃめちゃ長くなりますし😆」「😆」「まあRailsデフォルトの推測可能なサロゲートキーはそれはそれで悩ましいですけど😅」

参考: UUID - Wikipedia

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

AWSのモダンアプリケーション開発ホワイトペーパー


つっつきボイス:「はてブであがってた記事で、昨年末のre:inventでの発表内容にさらに手を加えたものだそうです」「まあこういうドキュメントは3年経っても『モダン』がついたままだったりしますけど😆」「最新はすぐ最新でなくなるの法則😆」「年号でやろう😆」「2020年版とか😆」「会場の本棚にもある定番のタネンバウム本↓も、いつのモダンやねんという感じですし🤣」「名著ですけど😆」「それは間違いない😆」「本の奥付見ると2004年ってなってるし😆」「モダンジャズが全然モダンじゃないのと同じ😆」「最早モダンにレトロな響きしか感じられない😆」

参考: モダンオペレーティングシステム Tanenbaum, Andrew S(著) - ピアソン・エデュケーション | 版元ドットコム

その他クラウド

つっつきボイス:「そもそも今まで無料だったとは💰」「今の請求項目はダミーみたいですけどもう少ししたら本気出すみたいです」「そういえばAWSのEIPだと、使っているIPは無料で使ってないIPは有料ですね🧐」

参考: AWS Elastic IP の料金を理解する
参考: GCP 外部 IP アドレス料金

GCPは無料枠に該当しない場合に料金がかかるようになるようです。

JavaScript

Bootstrap 5は今年前半にリリースされそう


getbootstrap.comより

v4の12カラムはv5でも変わらないようです。


つっつきボイス:「個人的にこれが気になってました」「おそらくearly 2020リリースだろうということで、あとjQueryとIE10以下サポートが消えるそうです」「ついに消えますか!」「かつてはflexboxすら使えないIE9の地獄のブラウザハックを避けたかったのでBootstrapが欲しかったというところがありましたけど、その頃に比べれば、ないとやっていけないというほどではなくなったかもですね☺️」「Bootstrap 3から4への移行に比べれば4から5への移行はそんなに大変ではないのかなという雰囲気ですね」「逆に5にしないといけない理由もそんなにないかも😆」

v5でのJekyllからHugoへの移行ってBootstrapとどう絡むんだろうと思ったら、主にドキュメントサイトの話のようでした(#28014)。

その他JS

つっつきボイス:「~.構文ってまだ確定じゃないですよね?」「プロポーザルの段階みたいです」「皆さんもRubyでやってるみたいに記号があるとつい使いたくなったりしません?😆」「あると使いたくなる的な😆」

参考: ハンマーを持つ人には全てが釘に見える - 橋本商会


つっつきボイス:「社内Slackで見かけました: 前にもウォッチで取り上げたJSのprivate記法がついに入ったそうです(ウォッチ20190902)」「例の#でprivateを表すヤツ😆」「あくまでTypeScriptの中でですけど☺️」

class Greeter {
    #name: string;
    constructor(name: string) {
        this.#name = name;
    }
    greet() {
        console.log(`hello ${this.#name}`);
    }
}

const greeter = new Greeter("world");
console.log(greeter);                 // logs 'Greeter {}'
console.log(Object.keys(greeter));    // logs '[]'
greeter.greet();                      // logs 'hello world'

「変数がprivateかどうかを名前でわかるようにしたいという気持ちはちょっとワカル: たいてい物議を醸しますけど😆」

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

HTTP関連の動向

上の記事で言及されているWeb Authenticationのガイドも別途見つけました↓。


つっつきボイス:「asnokaze.hatenablog.comさんのブログがHTTPの仕様に関する記事が豊富だったので」「この人は有名ですね☺️」「Web PackagingとかSigned HTTP Exchangesとかいろいろ提案されてるみたいでクラクラしてきました😅」「や〜っぱりHTTPは難しいですよ😆: 大学の授業で教えるときに去年動いたコードが今年突然動かなくなったりするの勘弁して欲しい😭」「Web Authenticationって一般用語かと思ったら固有名詞でした😅」「WebAuthnはブラウザの機能としてだいぶ前から進めているヤツですね☺️」

参考: WebAuthn - Wikipedia

去年の流行りのスニペット


つっつきボイス:「楽しいスニペットがいろいろ並んでて、いたずら系も混じってます😆」「CodePenはプログラマーじゃなくても動かして楽しめるあたりがやっぱりよくできてますね😋」「こういうCSSアニメーションとか定番↓」

See the Pen
CSS Loading Animations
by Alex (@AlexWarnes)
on CodePen.

「ちょうど昨日学生にanime.js↓の話しましたよ😎」「お、こんなのあるんですね」「キレイなものを作るには相当気合が必要ですけどって学生にも言いましたし😆」(以下学生向けのコーディング課題などについて延々)

See the Pen
Easings animations with anime.js
by Julian Garnier (@juliangarnier)
on CodePen.

その他フロントエンド

つっつきボイス:「パスワードチェックアップ拡張!」「お漏らし済みのパスワードを使うとChromeで怒られるようになるそうです」「ハッシュが一致するかどうかをチェックする感じでしょうね」「早速インストールしよっと😋」「だいぶ前に米国のPSNで流出したときにガチで引っかかったことあったから怒られる自信あるっ😆: お大丈夫と出た🎉」「私も『あんたのパスワード知ってるよ』って大昔に使ってたパスワードを通知する英文メール受け取ったことあります😅」「平文パスワードを保存している業界は天に召されて欲しい😇」

参考: PlayStation Network個人情報流出事件 - Wikipedia


つっつきボイス:「お、このドキュメント良さそう❤️」


apple.comより

言語・ツール

乱数

参考: メルセンヌ・ツイスタ - Wikipedia -- 通称「MT」


つっつきボイス:「MTって何だろうと思ったらメルセンヌ・ツイスタでした」「ちょうど弊社のメンバーが昨年のアドベントカレンダーで乱数記事出してましたね↓」「乱数は結構楽しいですよ〜😋: 速い乱数とか真の乱数とは何かとか」「Unixの/dev/random/dev/urandomの違いとか😆」「なんで2つあるんだろうと思って調べて納得するという」「そして忘れる🤣」「違いがあるということだけ覚えてる😆」

参考: /dev/random - Wikipedia

記事のLaTeXや埋め込みがリニューアル後にちょっと乱れてますが近々修正します🙇。

乱数について本気出して考えてみる

「他にも/dev/st0(巻き戻し可能なテーブデバイス)と/dev/nst0(巻き戻ししない)の違いとかね😆」「自宅でDDS3のテープデバイス使ってたことありますけど、音を立てて動くのが楽しいですよ❤️: tarコマンドを文字どおりにテープバックアップに使ってましたし😆」「tarコマンドってtape archiveの略なんですよね😆」「mtコマンドで頭出ししたりとか😆」「仕事でDATにバックアップしてたことならありました😆」(以下延々)

参考: tape backup
参考: 【 tar 】コマンド――アーカイブファイルを作成する/展開する:Linux基本コマンドTips(40) - @IT
参考: mt - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
参考: デジタル・データ・ストレージ - Wikipedia

その他

このあたりからは親睦会で飲み食いしながらのつっつきとなりました😋。

2020年問題たち


つっつきボイス:「あ〜ガラケーのね😆」「絶賛発生中😆」「Perlでも2020年にバグが出たそうです」「ありゃ〜😆」

「ガラケーで撮った写真を捨てられなくて持ち続けてる人って結構いると思いますよ」「メモリカード挿せないタイプだと捨てるに捨てられない😇」「大事な人の写真だったりするとなおさら😢」「ガラケーの時計が0時で止まるってひどい😆」「わかりやすく止まるだけマシかも😆」

その他のその他

つっつきボイス:「EnChromaは眼球保護メガネの研究中に偶然発見されたそうです」「矯正できるのが驚き😳」「そのままだと見えない色を認識可能な帯域に変換できればやれそうな感じですね」


つっつきボイス:「バッテリー爆発しない?😆」「数年で動かなくなるとか?😆」「そういえばSONYも昔NEWSっていうワークステーション出してましたね: たしか最初期のRubyはNEWSで開発したとか」

参考: NEWS (ソニー) - Wikipedia


つっつきボイス:「年末年始にまどマギの劇場版を見返してたら、こんな感じの赤外線キーボードをまどかが普通に使ってたな〜😆」「まどかマニアック😆」

参考: 魔法少女まどか☆マギカ - Wikipedia

「こういうのだと、割と前からLeap Motionっていうジェスチャー入力デバイスがあって実は家にもあるんですけど、スキャンの解像度が高いせいなのか、触れないぐらいアツアツになるやんちゃデバイス🔥」「😆」「😆」「でも結構よくできてますし単価も安いし、何よりも注文するとすぐ届くのがエラくて、大学のUI系研究室とかに結構売れてましたね☺️」「へぇ〜」「あと最近のOculus QuestっていうVRゴーグルは、インカムのカメラだけで手の動きをトラッキングできるようになってますし」「そういうの欲しいなってずっと思ってるんですけど、目ぼしいアプリがどのぐらいあるかが心配で😆」「自分はもっぱら寝ながらNetFlix見るのに使ってます😆」「PS VRで寝ながら動画を見たことならありますけどゴーグルがでかすぎて邪魔で😅」

参考: Leap Motion - Wikipedia
参考: Oculus Questの機能 | Oculus


つっつきボイス:「コラッツの問題は、偶数だったら2で割って奇数だったら3かけて1足すとどんな数でも最後に必ず1, 4, 2, 1...となるかどうかという超難問」「へぇ〜」「ポール・エルデシュさんも『あの問題に関わると人生棒に振るからやめとけ』って言うレベル😆」「数学の難問ってそんなんばっかですか😆」「棒振り系多いですね😆」

参考: コラッツの問題 - Wikipedia
参考: テレンス・タオ - Wikipedia


つっつきボイス:「LiDARってライダーって読むみたいで、ジャングルに埋もれた遺跡を空中からスキャンして発見するとかで大活躍してるらしいです」「自動車の自動運転で外界を認識するのにも使ってるみたいですね☺️」「そんな凄いセンサーが10万以下で買えるということでIoT界の好き者たちがアツい眼差しを注いでいますね: そのツイートした方もIoT強者なんですけどその人のライブラリを使ったことあります😋」

参考: LIDAR - Wikipedia
参考: ペルーのマチュピチュより古い遺跡の発見 - trendswatcher.net

「こういう長距離センサーは精度とかよりもノイズ除去周りの技術が決め手になったりしますね: 謎の誤検出を除去するのは大変😅」「最後はノイズとの戦いなんですね☺️」「ライブラリのノイズ除去がイケてないとフィルタから自作しないといけなくなったりしますし😢」「自分はIoTでライブラリに助けてもらった経験ってあんまり覚えがありませんけど😆」「最近はかなりインテリジェントに処理してくれますよ☺️: 特に屋外で使うセンサーは太陽光反射とかに対応しないといけませんし、そういうのはハードウェアで処理できないとソフトウェアだけではつらい」「そういえば大学でlaser range finder使ってた人いたな〜」「光波測距儀って書くと何だかカッコいい😍」(以下延々)

参考: TeraRanger One ToF Rangefinder B型(フレーム) - ロボショップ
参考: 光波測距儀 - Wikipedia

番外

3Dの次は

つっつきボイス:「変形ロボ!🤖」「ターミネーター2!」

不気味の谷を超えたか


つっつきボイス:「このフェイク人間が個人的にヒットでした😆」「これはジワるw」「似すぎてて何だかチューリングテストされてる気分😆」「中国語の部屋でしたっけ」「紅白のAI美空ひばりですか😆」「あれってAIじゃないと思うんだけど😆」

参考: 中国語の部屋 - Wikipedia

「この方面はやっぱりゲーム業界が進んでますね: レンダリングをそれっぽく見せる技術と、人間らしく振る舞わせる手法とか特にネトゲが強い💪」「映画の方が進んでるかと思ってました」「状況に合わせて最適に振る舞う手法はやっぱりゲーム業界が進んでると思いますね☺️」「あ〜そうかも」「FPSとかMMO系なんかだと、たとえば20人が参加している状況で通信がちょっと途切れたりしても、キャラクターを人間らしく振る舞わせておくと通信が切れてないように見える、というのを昔からやってたりしますし☺️」「演出の妙というか😆」「最近の映画も凄いですよ: 最新のスター・ウォーズで、役者が既に物故したモフ・ターキンをフルCGで再現してたんですけど自分マジで全然気づきませんでした😳」「たしかに精緻な表現は映画の方が進んでるかも☺️」

参考: ファーストパーソン・シューティングゲーム - Wikipedia
参考: MMORPG - Wikipedia
参考: グランド・モフ・ウィルハフ・ターキン - Wikipedia

ダークエネルギーもなかった?

つっつきボイス: 「ダークマターではなくて?」「ダークエネルギーは宇宙の全エネルギーの3/4を占めてるとか見積もられてたんですけど、その仮定ががっつり違ってたみたいでした」「宇宙物理界隈は5年もするとがらっと変わったりするから大変😆」

参考: ダークエネルギー - Wikipedia


後編は以上です。ご参加いただいた皆さまありがとうございました!😂

おたより発掘

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

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

Ruby Weekly

RubyFlow

160928_1638_XvIP4h

Postgres Weekly

postgres_weekly_banner


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。