週刊Railsウォッチ(20190514-2/2後編)Webpackerを現場で使う、Dockerfileベストプラクティス、SONYのユニークID生成ツールsonyflakeほか

こんにちは、hachi8833です。久々の雨ですね。

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

今回も5/9の令和初の公開つっつき会を元にしています。お集まりいただいた皆さまありがとうございます!🙇

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

マイクロソフトが怒涛のリリース


つっつきボイス:「マイクロソフトがどどどっと発表しましたね」「GW中にキューためてた感」

WSL 2といえば、今回お集まりの方でWSL使ってる方はいらっしゃいます?」「今のところまだ…」「自分は最近Dockerコマンドを使うためだけにWSL使ってます」「会場を見渡してみるとWindows勢が自分を含めて3名😆」「今回は意外にMacの人が多いですね☺️」「じゃさらっと次に😆」

「次はAzureにGitHubアカウントでサインイン可能に、これやってみた人います?」「やってみたらできました🎉: 途中なぜか一度つっかかりましたが、リロードしたらサインインできました」「自分はAzureとGitHubに同じ名前のアカウントが既にあるんだけど、その場合はどうなるんだろう?🤔」「あ、自分もそうでしたが『同じアカウントがあるけど紐づけていいですか?』みたいな感じで聞かれました」「そうすっと元のAzureアカウントはどうなるんだろ😆」「まAzure今のところ使ってないし😆」

「ちなみにAzure使ってる方は?」「つい最近顔認識関連のAPIを使うためにちょっと☺️」「あ〜なるほど、Azureのクラウドというよりそっちの方ですか」「.NET系のプロジェクトだとやっぱりAzureになるかも」「たしかに.NETとかActive DirectoryをAWSでやるのはつらそう😢」

「クラウドといえば、AWS使ってる人はこの中にいらっしゃいます?…やはり多いですね」「GCPは?」「ちょっとだけなら」「さくらのクラウドを使ってる人はいます?」「単なるレンタルサーバーならちょっとだけ個人的に」「なるほど〜、さくらのクラウドはちょっと割高ですし💰」「ありがとうございます、だいたいクラウドの使われ方の雰囲気が見えてきました☺️」

「次はオープンソースの.NET 5に集約される話」「割と前に1つ前ぐらいのバージョンの.NET Frameworkがオープンソースになったという話で自分の中では止まってました😆」「そういえばLinuxでも動くオープンソース実装がありましたね」「ですです、GitHubにあります」「Xamarin使ってる人はこの中に…さすがにモバイル系はいませんね☺️」

「後はVisual Studioがブラウザで使える話」「VSCodeならブラウザで動いても不思議ではない感じ」「もしVSCodeでない方のVisual Studioがブラウザで動いてたら相当神がかってますね⛩」「きっと無理😆」

参考: Visual Studio Code - Wikipedia
参考: Microsoft Visual Studio - Wikipedia

「そして江添さんの記事😆」「『無駄な抵抗をやめて』というあたりが😆」「まあWindowsでLinuxのAPIを無理やりラップしようとするのは自分も無駄な抵抗だな〜って思って見てましたし😆: おかげでファイルシステムが遅いし🐢」

参考: 本の虫: マイクロソフト、無駄な抵抗を辞めてWSLに本物のLinuxカーネルを同梱する

スライド: Dockerベストプラクティス


つっつきボイス:「この間BPSの社内Slackに貼っていただいたスライドです」「そうそう、これはなかなかいいスライドでした👍」

「そんなに新しい話は出ていませんが、Dockerfileを作るときのベストプラクティスがいい感じにまとまってます」「たとえば以下みたいに、apt-get updateapt-get -y installとか&& rm -rf /va/lib/apt/lists/*でアップデートリストを消すとかを別々のRUNで実行すると、そのたびにOverlayFSのレイヤーが増えてしまうので、そういうのはなるべくまとめて1つのRUNで実行するようにすることでレイヤーを増やさないようにする、といったよくあるテクニックが前半に整理されています」

参考: OverlayFS - Wikipedia

「後半はDockerの新し目の機能の話もしていて、たとえばこの--mount=type=cache, target=/root/.m2と書くと↓、ビルド中の中間ファイルのようにOverlayFSに置きたくないようなファイルを置けたりとか、--mount=type=secretとかも紹介されています」「=が重なってるあたりはちょっと気持ち悪いですが😆」

「ところで皆さんはDockerfileって書きます?」「あんまり😅」「だいたい誰かが書いてくれたDockerfileを使う感じでしょうね😆」「自分は書きますけど: じゃKubernetesは?まだいないかな☺️」「まあKubernetesはいろいろオーバーキルですし😆」

モバイル

GoogleがFlutter for WebとKotlinファーストを発表

Flutter: 標準ウィジェットをコピーして改造する


つっつきボイス:「FlutterでWebアプリも作れると聞いて、早速社内のFlutter勢が動かしてました」「あれ?Kotlinファーストは前からGoogleが言ってたような気がするけど?」「そういえばそうですよね🤔」「Kotlinは名前がかわいいのがいい🐤」「たしかにカワイイですね🐥」

「ところでここにいる方は基本的にWebアプリやってると思うんですが、モバイルやってる方はいます?」「今ちょっとやろうとしてます☺️」「やってる人少なそうなのでFlutterは飛ばしましょうか🤣」「🤣」

SQL

shiba: productionでよくないSQLクエリをキャッチするRuby製ツール(Ruby Weeklyより)


同サイトより


つっつきボイス:「shibaって何のことかなと思ったら柴犬のことでした🐶」「ポケモン四天王の方ではなかった😆」


同リポジトリより

「見た感じ、CIとかと連携してリポジトリに自動でコメント付けたりするようだけど、『Table Scan』なんて項目は実際にデータがないと出しようがないし🤔」「productionでやれるとあるからproductionがメインっぽいですね」「でこういう条件↓を指定しておくと条件に違反したときに柴犬が鳴いてくれると🐩」

users:
  count: 10000
  indexes:
    PRIMARY:
      name: PRIMARY
      columns:
      - column: id
        rows_per: 1 # one row per unique `id`
      unique: true
    index_users_on_email:
      name: index_users_on_email
      columns:
      - column: email
        rows_per: 1 # one row per email address (also unique)
      unique: true
    index_users_on_organization_id:
      name: index_users_on_organization_id
      columns:
      - column: organization_id
        rows_per: 20% # each organization has, on average, 20% or 2000 users.
      unique: false

「まあこういう感じのAPM系ツールはいろいろありますよね☺️」「おそらくこの条件ファイルをどのぐらい楽に書けるかがポイントかも: 自分でゼロから書くのはつらいし😆」

参考: アプリケーションパフォーマンス管理(APM)とは - IT用語辞典 e-Words

「条件を自分で書くぐらいならNew Relic↓入れてそっちで見る方が普通に考えて楽だと思うし😆」「あえてこのツールを使うとすれば、DBAがいるプロジェクトでDBAがこういう条件を書いて、SQL初心者なクエリが飛んできたら代わりに怒ってもらうとかかな〜🔰」


newrelic.co.jpより

CREATE USERに注意しよう(Postgres Weeklyより)

-- 同記事より
test=# CREATE TABLE a (aid int);
CREATE TABLE
test=# CREATE USER joe;
CREATE ROLE
test=# GRANT SELECT ON a TO joe;
GRANT

つっつきボイス:「PostgreSQLのユーザー作成をコンソールのSQLでやったことってあんまりない気がする: 普通createuserとかcreatedbみたいなコマンドでやるけど」「それもそうですね」

参考: PostgreSQLクライアントアプリケーション — コマンド一覧

「ちなみにMySQLではもともとユーザーがMySQLデータベースの形になっているのでコンソールからSQLでやれます」「PostgreSQLとMySQLで違っているのはなぜなんでしょう?」「わからん😆: 単なる歴史上の理由かと歴史も思想も違っているし」

参考: MySQL :: MySQL 5.6 リファレンスマニュアル :: 6.3.2 ユーザーアカウントの追加

「記事ではPostgreSQLでやるときはロールとかパーミッションに注意しないとだめだよみたいなことを書いてますね」「GRANTぐらいならPostgreSQLのコンソールでやったことはある気がするけど、普段コマンドでしかやってないしな〜」

「ついでですが、ここにお集まりの皆さんの中でぽすぐれ派の人は?」「お、意外に少ない😳」「じゃMySQL派の人は?」「おぉ〜圧倒多数!」「MySQLがこんなに強いとは!🦸‍♂️」「自分はぽすぐれ好きだけど今日は少数派😅」

JavaScript

Dart 2.3リリース


つっつきボイス:「Dartにspread演算子の...が入ったそうです」

Row(
  children: [
             ...northAmericanCountries,
             ...asianCountries,
             ...europeanCountries
            ],
)

「これまたついでですが、この中でフロント系(ReactとかTypeScriptとかVueとかAngularとか)をやってる方は?」「最近はVueとTypeScriptの組み合わせが多いですね」「ReactとES2015でやってます」「Dartはやってませんか?」「やってないですね〜☺️」「やっぱりFlutterやってないとDart触る機会あまりなさそうですね」

Webpackerを現場で使ってみた感触

「フロント話のついでにお伺いしたいんですが、皆さんはRailsでは素のWebpackとWebpackerのどちらを使ってます?あとRailsとフロントエンドのリポジトリは一緒か別々かというあたりも興味があります」

Rails 5: Webpacker公式README — Webpack v4対応版(翻訳)

「自分はWebpacker使ってます💪」「おお使ってるんですね!」「Webpackerを剥がしにかかる人多いですけど😆自分はWebpackerに乗っておくことにしました」「じゃTypeScriptなんかも全部Webpackerで?」「ですね: フロントの要件がそこまで大きくないので」「ということはRailsに詳しい人がメンバーに多い感じでしょうか?」「フロントに強い人が少ないのでそんな感じです: ググって多く出てくる方に寄せてます☺️」

「自分は4の頃は素のWebpackを使ってたんですが、5でWebpackerにしました💪」「おぉ、移行したんですか?」「まあ作り直したというか😆そんな感じで」「Webpackerで何か困ったりしました?」「いえ、意外に何もしなくても大丈夫な感じです😋: そんなに頑張って追従してるわけでもないですし、最新のWebpackでできることがWebpackerでできなくても特に不自由はしてません」「おーなるほど、とするとRailsエンジニアが中心になってやるというのが前提でしょうか?」「どちらかというとBabelが主軸ですね: 何かあったとしたら、Rails 6でBabelがバージョンアップしたときに今まで使えてたstage-0が使えなくなったことぐらいでした☺️」

参考: 【React】babelでbabel-preset-stage-0や使う方法「ES7 Property Initialiazers for Default Props and Prop 」を使いたい方へ | 武骨日記

「Webpackerにすると『フロントはわかるけどRailsとWebpackerはわからない』開発者が参加しにくくなるというような話をときどき耳にするんですけど、その辺で困ったりすることってあります?」「自分たちはRailsありきで開発してるのでまあ大丈夫です☺️」「Webpackerで一度インストールしたら基本的にアップデートとかしない感じでしょうか?」「基本しないですね」「バージョンをフリーズさせるためにWebpackerを使うとか?」「いえそんなことはないです🤣時々動かしてます」

「まあWebpackerを使うとWebpackの方のバージョンアップが相当遅れがちなので、フロント勢からこんな古いのをまだ使ってるのかみたいに言われそう😆」「Webpacker使っている現場の話、とても参考になりました!」

その他JS

※「disappearing」は「消えつつある」かと思いきや、よく見ると「ブラウザ側から姿が見えないタイプのJSフレームワーク」というニュアンスでした😅。

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

ChromeのPortalsタグ


つっつきボイス:「記事のこの表↓が見やすそうです」「iframe src=""ではなくportal src=""でやるのね」


Googleによると、iframeではセキュリティ上の理由から許可されないような、埋め込まれたコンテンツ内でのナビゲーションができるようになるとのこと。
同記事より大意

「これってWhatWGとかに仕様出してたりしないのかな?」「今のところChromeだけみたいなのでまだっぽいですね」「じゃまだGoogleの中だけでやってる段階ね☺️」

参考: Web Hypertext Application Technology Working Group - Wikipedia

参考: GoogleがiFrameに代わる遷移タグPortalsをデモ、サイト間の連携を大幅強化へ | TechCrunch Japan

その他フロントエンド

Thoughtbotの記事です。



同記事より


つっつきボイス:「これはフロントというより紙ベースのレビューのやり方の工夫的な記事でした: 物理のポストイットに赤青黄で色を付けて削除・変更・追加を表して、紙に印刷したWebページにそれを貼るみたいな感じです」「あーなるほど、レビューのプロトコルを決めるみたいな話か: こういうのを決めておくとレビューをスムーズに進めやすくなったりしますよね☺️」

コードレビューあれこれ

「そういえばちょうど今日BPS社内のWebチームミーティングで、コードレビューに付けるTODOとかFIXMEみたいなアノテーションコメントの運用を話し合ってたんですけど、いろいろきりがなくて結局その場では結論出せなかった😆」「😆」

「たとえばTODOは『修正しないとリリースできないものに付ける』という考え方もあれば、『リリースしてもいいけどいつか修正する』という考え方もあったり」「FIXMEも、『バグっているので直して欲しい』という意味で使うのか、『動いているけどパフォーマンスがよくない』みたいな場合に使ってもいいのか、とか議論してるとなかなか収束しない🤣」「細かく決めすぎると身動き取れなくなりそうだし、かといって決めないとばらつきそうで、難しいですね😢」

「一応決まってきた運用もあって、たとえば『MRやPRのタイトルにWIPを付ける場合は、WIPを外してよくなるための条件を書くこと』とか『squashはレビュアー側が行うこと』とか」「なるほど〜」「レビュイー(レビューされる側)がコミットをsquashしてしまうと過去の経緯とリポジトリのコメントが消えちゃって困るじゃないですか😭」「たしかにレビュー中はコミット単位で見たいですよね」「特に大きめのマージリクエストだと往復が増えるので、『あのときはこう言ってた』みたいな経緯を辿れないと困る😤」

「あと最近やり始めているのがMUSTSHOULDMAYというアノテーション: 修正しないとマージしないものはMUSTにして、修正すべきだけど急ぎなら後でもぐらいならSHOULDとか」

「皆さんのところでは、そういうアノテーションの運用って決めてあったりします?」「フィーリングでMUSTと、あとはリファクタして欲しいところとかはWANTを使ったりしてます☺️」「マージボタンはレビュアーが押すルールですか?」「さすがにそうですね😆」

「コミットメッセージの冒頭にFIXとか入れたり入れなかったりすることはあります☺️」「そっちはそっちでベストプラクティスがあったりしますね」

参考: Gitコミットメッセージのプラクティスまとめ | 酒と涙とRubyとRailsと

「そういえば、たしか@koicさんが以前Railsdmで話してたオープンソースのコミットメッセージのベストプラクティスだったと思うんですが、『コミットのコメントは、1行目をコミットメッセージにして、そこから1行空けて、3行目以降がマージリクエストのデスクリプションになるように、最初からMarkdownも含めて書くといいよ』というような話をしていたのを思い出しました」「お〜」「まあ画像貼り付けとかまではできませんけど😆、たしかにわかりやすくていいなと思いました🥰」

おそらくこれだと思います↓。

参考: [Day 1: A-6] Rails コントリビューションから学んだ Git / GitHub 術 | AMA

言語・ツール

sonyflake: snowflakeにヒントを得たunique IDジェネレータ

// 同リポジトリより
type Settings struct {
    StartTime      time.Time
    MachineID      func() (uint16, error)
    CheckMachineID func(uint16) bool
}

つっつきボイス:「最初snowflakeの見間違いかと思いました😆」「このsonyってあのソニー?」「あ、本当にあのソニーのリポジトリだ!」「さすがにこの名前は他がやらなさそう😆」「Sonyが作ったsnowflake実装ということなのね」「MITライセンスだから普通に使えますね😋」「よく見たらGo言語で書かれてました」


github.com/sonyより

「snowflakeは軽く説明した方がいいでしょうか?」「あ、お願いしまーす」「分散環境でユニークなIDを超高速に生成するやり方のひとつとして有名なのが、Twitterがやっているsnowflakeです↓」

参考: Twitter IDs (snowflake) — Twitter Developers

「たとえばWebサーバーがたくさんあると、必ずユニークであることが保証されたIDをRDBMSで作るのが難しくなります: MySQLだと内部でIDのmaxに+1する形でユニークIDを作りますし、PostgreSQLだとデフォルトでsequenceというものを使うんですが、どちらも生成時にロックされるので、Twitterの規模でそれをやったら生成が間に合わなくて使い物にならない😆」「お〜」

「以下はちょうど今見ているsonyflakeの方のユニークIDの仕様ですが、こんなふうにマシンIDをビットに含めることで、ホストが異なれば絶対に重複しないことが保証できるので、単一ホストでユニークIDを生成できるようになります」「なるほど!」

39 bits for time in units of 10 msec
8 bits for a sequence number
16 bits for a machine id

「しかし本当にソニーのロゴだ…」「ちょっと不思議な気持ち」

その他

クリエイティブ・コモンズの検索サービス


同サイトより


つっつきボイス:「クリエイティブ・コモンズの検索サービスは割と前からベータ版があるんですが、正直それほどでもなかった感じですね☺️」「ありゃ😆」

参考: クリエイティブ・コモンズが独自のサーチエンジン搭載開始 – HON.jp News Blog

AtCoderのABCの問題


つっつきボイス:「ABCの問題って数学上の難問か何かかなと思ったら、競技プログラミングで有名なAtCoderの予選的なA/B/Cランクの問題のことでした😅」「Aは誰でも解けるレベル、Bがちょい難しいみたいな設定の問題ですね☺️」


同サイトより

参考: ABC予想 - Wikipedia

「BPSだとAtCoderに参加したことのある人を何人か見かけるんですが、今回お集まりの中で、AtCoderとかで競技プログラミングをやったことある方はいます?」「特には…😆」「実は自分も競プロってあんまり興味なくて🤣」「制限時間がなければいいのに😆」「身も蓋もない😆」「たまにやってみたいかなと思うことはあるけど」

「ABCというとRuboCopでいつも悩まされるアレを思い出すんですけど😆」「あ〜ABC sizeですね↓🤣」「1つのメソッドの中に書くロジックが多すぎるときに出す警告😆」

参考: `Metrics/AbcSize` のデフォルト値 - koicの日記

Metrics/AbcSize:
# The ABC size is a calculated magnitude, so this number can be an Integer or
# a Float.
Max: 15
同記事より

その他のその他

つっつきボイス:「これは久々に面白い記事👍」「YouTubeのチームがひっそり『IE6使わないで』というバナーを表示したけど、社内で誰もIE6を使ってたのでバレなかったという😆」「しかもそれを見た別のチームまで『お、IE6使わないというメッセージ出していいことになったのか』と、承認されないうちに同じようにメッセージを出すようになってたという😆」

「これでちょっと思い出したんですけど、最近SlackがApp Storeで出していたメッセージ↓がなかなか気が利いていて割と好き❤️」「『さようなら平成、こんにちは令和』🤣」「座布団10枚🤣」「十中八九は英語をベースにしている気がするんですが、だとしたら訳文のこなれ方半端ない😆」「『人々の美しい調和を願う礼和の時代に』とかうますぎ😆」「さりげなさがまたいい☺️」「こういうメッセージを仕事っぽく翻訳すると面白くも何ともなくなりますよね☺️」「『古いソフトは危険!!』とか書くよりずっと気が利いてるし☺️」


‎「Slack」をApp Storeでより


番外

3つの立法数の和


つっつきボイス:「スクショは自分がRubyのpryでやってみた結果です」「二乗和じゃなくて立方和かー」「結局ブルートフォース的に無理やり結果を出したそうです😆」「😆」「こういうのって最初問題を出した人がもう生きてなかったりしますよね☺️」

参考: 33は3つの立方数の和で表せるのか——64年来の数学上の難題が解かれる | fabcross
参考: Sums of three cubes - Wikipedia
参考: 総当たり攻撃 - Wikipedia

「100以下の数値で解かれていなかったもののうち、33が攻略完了したので、次は42なんだそうです」「42ってよく引き合いに出される、世界のすべての秘密の根源ということになってるみたいな数値でしたっけ」「お、k=32の場合は解が存在しないことが証明されているんですって」「へぇ〜😳」「存在しないことを示すには証明するしかなくて、存在することを証明するにはブルートフォースでぶん回すでも何でもやってとにかく見つける、みたいな感じですね☺️」「立方だとブルートフォースは割としんどそう😭」「お、そこにちょうど数学科出てる人が😆」「証明に60年なんて、そんなの短い方ですよっ😎」

参考: 生命、宇宙、そして万物についての究極の疑問の答え - Wikipedia


Wikipediaより(CC BY-SA 3.0

「お、ちょうど時間だ」「ちゃんと時間見ながらやってますし😎」「お腹空いた〜」


後半は以上です。令和初の公開つっつき会の終了後も懇親会で盛り上がりました。ご参加いただいた皆さま、ありがとうございます!😊

バックナンバー(2019年度第2四半期)

週刊Railsウォッチ(20190513-1/2前半)6.0の地味に嬉しい機能、ActiveModelエラーの扱いが変更、Railsのリクエスト/レスポンスをビジュアル表示ほか

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

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

Ruby Weekly

Publickey

publickey_banner_captured

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探訪シリーズ