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

週刊Railsウォッチ(20210316後編)testdouble/standard gem、DockerfileベストプラクティスとDockerfileのlintツールhadolintほか

こんにちは、hachi8833です。

週刊Railsウォッチについて

  • 各記事冒頭には🔗でパーマリンクを置いてあります: 社内やTwitterでの議論などにどうぞ
  • 「つっつきボイス」はRailsウォッチ公開前ドラフトを(鍋のように)社内有志でつっついたときの会話の再構成です👄
  • お気づきの点がありましたら@hachi8833までメンションをいただければ確認・対応いたします🙇

TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)

🔗Ruby

🔗 RuboCopがオーガニゼーションをgithub.com/rubocop-hqからgithub.com/rubocopへ移行(現在は完了)


つっつきボイス:「そうそう、これまでrubocop-hq/rubocopだったのがrubocop/rubocopに変わるそうですね🎉」「これまで他で取得されていたrubocopオーガニゼーションを昨年10月ぐらいに譲渡してもらったんですって」

従来の rubocop-hq オーガニゼーション経由でのアクセスでも、GitHub の方で良きにリダイレクトしてくれるのでユーザー影響はあまりないと思いますが、無駄なリダイレクトを挟むこともないので rubocop-hq になっている箇所があれば rubocop に指定し直すと良いです。
同記事より


その後見に行ってみると、rubocop-hqにあったリポジトリは3日ほど前にrubocopに移行完了していました(2021/03/16時点)。

特に設定を変えずに手元でgem updateしても問題なくRuboCopをアップデートできました。

...
Updating rubocop
Fetching rubocop-1.11.0.gem
Successfully installed rubocop-1.11.0
...

🔗 testdouble/standard: Rubyスタイルガイドとlinterとフォーマッタのセット(Ruby Weeklyより)

testdouble/standard - GitHub


つっつきボイス:「testdouble/standardは最近 1.0になったというのをどこかで見たかも」「先週取り上げようと思って漏れてました😅」

このgemは、JavaScriptのstandard JSのエッセンスを移植したもので、以下の3とおりの方法で自分や他の人の時間を節約する。

  • コンフィグ不要: プロジェクトに投入するだけで統合スタイルを矯正する最も簡単な方法
  • コードのオートフォーマット: standardrb --fixを実行するだけでコードのばらつきとおさらば
  • スタイルの問題やプログラマーミスの早期発見: レビュアーやコントリビューターとのやりとりを減らして貴重なコードレビュー時間を節約
    同リポジトリより大意

「testdouble/standardはコンフィグ不要が売りのひとつなんですね」「testdouble/standardはRubyMineやVSCodeなどでも動かせるのか↓」「お〜」「testdouble/standardはRuboCopのラッパーなんですね」

「RuboCopがあるのにtestdouble/standardを使うのかという意見が出ることも予想されますけど、RuboCopは新しいルールがどんどん追加されていくので、あれについていくのが大変だと感じる人がいる気持ちもわかります」「たしかに」「Rubyで何か作ろうとすると、RuboCopを黙らせるのに時間がかかったりしますよね」「コンフィグ不要でやれるのはいい」「このツイート↓でも言っているように、RuboCopほどstrictにしないプロジェクトによさそう」


「そういえば最近rufoってどうなってるのかな?」「あ、最近触ってなかった😅」

RuboCop作者がRubyコードフォーマッタを比較してみた: 前編(翻訳)

🔗 Ruby組み込みライブラリの型をRBSで書く

# 同記事より: 最終的な型定義
def self.chmod: (int mode, *(string | _ToPath) file_name) -> Integer

つっつきボイス:「永和システムマネジメントさんの技術ブログです」「Ruby 3.0のRBSが使われ始めているようですね」「この記事の組み込みライブラリはCで書かれたライブラリなのか」「RBSの記事がまだ少ないのでありがたいです🙏」

ruby/rbs - GitHub

🔗 その他Ruby

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

🔗 Dockerfileのベストプラクティス Top 20


つっつきボイス:「はてブで知った記事です」「この記事はDockerfileのセキュリティを中心に解説しているのがいいですね: ざっと見た感じでは細かくなりすぎずにちゃんと書かれているようなので一度目を通しておくとよいと思います👍」

「この記事ではGoogleが公開しているdistrolessについても解説されてますね↓」

GoogleContainerTools/distroless - GitHub

参考: 軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話 - inductor's blog

「よく言われているように、Dockerではマルチステージビルドして実行バイナリだけを集めるのが理想で、Go言語のシングルバイナリのようにシンプルな実行バイナリならやりやすいんですけど、Railsなどで外部ライブラリに依存していてファイル数が多いとマルチステージビルドが大変なんですよね」「たしかに!」

参考: マルチステージビルドの利用 | Docker ドキュメント

「そういえば日本語版の記事も英語版と同じドメインで公開されていますね↓」

参考: Dockerfileのベストプラクティス Top 20 | Sysdig

🔗 Dockerfileのlinter: hadolint

「お、記事の末尾にhadolintというDockerfileのlinterが紹介されている↓」「ホントだ」「Haskell言語で書かれているそうです」

hadolint/hadolint - GitHub

「上のDockerfileベストプラクティス記事に書かれているようなチェックをhadolintでやれるのか」「hadolintのルールを見た感じではなかなかよくできていそう」「お〜」「メッセージのDL3000とかSC2002は何だろうと思ったらlinterのルール名だった」「SCはshell checkの略みたいだけどDLは何の略だろう?🤔」

「hadolintのオンライン版もあるんですね↓」「これはなかなかよさそう👍」「Dockerfileのlinterはたしかにあってもいいですね」

参考: Dockerfile Linter


後で自分のDockerfileに試しにhadolintをかけてみたらだいぶ怒られました😅。

hadolint .dockerdev/Dockerfile
.dockerdev/Dockerfile:10 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
.dockerdev/Dockerfile:23 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
.dockerdev/Dockerfile:27 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
.dockerdev/Dockerfile:30 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check
.dockerdev/Dockerfile:35 SC2046 warning: Quote this to prevent word splitting.
.dockerdev/Dockerfile:35 SC2002 style: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
.dockerdev/Dockerfile:35 DL3005 error: Do not use apt-get upgrade or dist-upgrade
.dockerdev/Dockerfile:35 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
.dockerdev/Dockerfile:35 DL4006 warning: Set the SHELL option -o pipefail before RUN with a pipe in it. If you are using /bin/sh in an alpine image or if your shell is symlinked to busybox then consider explicitly setting your SHELL to /bin/ash, or disable this check

🔗 git cloneに脆弱性(StatusCode Weeklyより)


つっつきボイス:「gitの脆弱性、久しぶり」「自分も今brew upgrade gitで更新中です」

「この脆弱性はgit LFSに関連しているのか: git config --global core.symlinks falseでシンボリックリンクをオフにするとリスクを軽減できるとあるので、その部分がLFSで問題があったんでしょうね」「git LFSというと、動画やAdobe系ファイルのようなdiffがうまく取れない巨大なバイナリ系ファイルをgitリポジトリの外で管理するしくみでしたね」「BPSのアプリチームではgit LFSを使っているらしいです」

参考: Git LFS をちょっと詳しく - Qiita

🔗CSS/HTML/フロントエンド/テスト/デザイン

🔗 書籍『Web ブラウザセキュリティ』


つっつきボイス:「記事を書いているのはChromiumブラウザの開発に携わっている人だそうです」「Webセキュリティの新しい話題、特に最近のブラウザでやっているプロセス分離アーキテクチャについても詳しく解説されているのがよさそう👍」

参考: Chromium - Wikipedia

「少し前の本ですが、この記事の中でも紹介されている『めんどうくさいWebセキュリティ』↓はBPS CTOのbabaさんが推していました」


「Webのセキュリティは、Web技術自体が歴史的に大きく進化していく中で建て増しを繰り返しているので複雑になりがちですね」「HTML5でだいぶリセットはかかった感じはありますけどね」「そういえばDOCTYPEにHTML 4.01 Transitionalとか書いてた頃もありましたよね」「そうそう」

参考: HTML5 - Wikipedia
参考: <!DOCTYPE>-HTMLタグリファレンス

「記事を見ていて、若手向けにWebの歴史も含めて詳しく解説してくれる本もあるといいなと思いました」「今のWebはなぜこうなっているのかを知ろうと思うと、歴史を調べることになりますよね」「歴史を完全に網羅しなくてもいいんですが、現在までにWebの歴史にどんなものが現れて何が消えていったかというざっくりした流れだけでも脳内地図を作れるといいですよね」「XMLが華々しく登場してその後JSONが台頭した流れとか」

参考: Extensible HyperText Markup Language - Wikipedia -- XML
参考: JavaScript Object Notation - Wikipedia -- JSON

🔗言語/ツール/OS/CPU

🔗 QEMUでARMエミュレータ


つっつきボイス:「プログラミング言語のSlackで、ARMのエミュレータを構築するにはQEMUしかないんでしょうかという質問にこのリンクが貼られていたので拾ってみました」「ARMのエミュレーションだけなら他にもありそうですけど、フリーで速度もそこそこ出せて、かつ広く使われていて実績があることを考えるとQEMUがやりやすいでしょうね: 特にARMのバージョンを切り替えてエミュレーションしたい場合とか」「なるほど」

参考: QEMU - Wikipedia

「こんなふうにgccに長いプレフィックスを指定してビルドするとか昔やりましたよ↓」「懐かしいですね」「クロスコンパイル用のgccは通常のgccと名前がかぶらないようにこんな名前になっていました」「Zaurus SL-C700のIntel XScaleで動かすためにクロスコンパイルしたことがあったのも思い出した」

# 同記事より
sudo apt-get install gcc-arm-linux-gnueabi

参考: GNUコンパイラコレクション - Wikipedia - gcc
参考: Zaurus - SL-C700|仕様表
参考: XScale - Wikipedia


後編は以上です。

バックナンバー(2021年度第1四半期)

週刊Railsウォッチ(20210315前編)Active Recordのenum関連改修、Active SupportのEnumerableでpluckが使えるほか

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

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

Ruby Weekly

StatusCode Weekly

statuscode_weekly_banner


CONTACT

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