- Ruby / Rails関連
週刊Railsウォッチ(20210316後編)testdouble/standard gem、DockerfileベストプラクティスとDockerfileのlintツールhadolintほか
こんにちは、hachi8833です。
🔗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は最近 1.0になったというのをどこかで見たかも」「先週取り上げようと思って漏れてました😅」
このgemは、JavaScriptのstandard JSのエッセンスを移植したもので、以下の3とおりの方法で自分や他の人の時間を節約する。
- コンフィグ不要: プロジェクトに投入するだけで統合スタイルを矯正する最も簡単な方法
- コードのオートフォーマット:
standardrb --fix
を実行するだけでコードのばらつきとおさらば- スタイルの問題やプログラマーミスの早期発見: レビュアーやコントリビューターとのやりとりを減らして貴重なコードレビュー時間を節約
同リポジトリより大意
「testdouble/standardはコンフィグ不要が売りのひとつなんですね」「testdouble/standardはRubyMineやVSCodeなどでも動かせるのか↓」「お〜」「testdouble/standardはRuboCopのラッパーなんですね」
- IDE: Atom · testdouble/standard Wiki
- Emacs: julianrubisch/flycheck-standardrb: Flycheck checker for standardrb
- RuboCop—RubyMine
- IDE: vim · testdouble/standard Wiki
- IDE: vscode · testdouble/standard Wiki
「RuboCopがあるのにtestdouble/standardを使うのかという意見が出ることも予想されますけど、RuboCopは新しいルールがどんどん追加されていくので、あれについていくのが大変だと感じる人がいる気持ちもわかります」「たしかに」「Rubyで何か作ろうとすると、RuboCopを黙らせるのに時間がかかったりしますよね」「コンフィグ不要でやれるのはいい」「このツイート↓でも言っているように、RuboCopほどstrictにしないプロジェクトによさそう」
No configurationで動作するRuby Formatter. rubocopよりstrictにやりたくないプロジェクトでは良さそう » testdouble/standard: 🌟 Ruby Style Guide, with linter & automatic code fixer https://t.co/JGtIKxzref
— toshimaru (@toshimaru_e) November 17, 2020
「そういえば最近rufoってどうなってるのかな?」「あ、最近触ってなかった😅」
🔗 Ruby組み込みライブラリの型をRBSで書く
# 同記事より: 最終的な型定義
def self.chmod: (int mode, *(string | _ToPath) file_name) -> Integer
つっつきボイス:「永和システムマネジメントさんの技術ブログです」「Ruby 3.0のRBSが使われ始めているようですね」「この記事の組み込みライブラリはCで書かれたライブラリなのか」「RBSの記事がまだ少ないのでありがたいです🙏」
🔗 その他Ruby
🔗クラウド/コンテナ/インフラ/Serverless
🔗 Dockerfileのベストプラクティス Top 20
つっつきボイス:「はてブで知った記事です」「この記事はDockerfileのセキュリティを中心に解説しているのがいいですね: ざっと見た感じでは細かくなりすぎずにちゃんと書かれているようなので一度目を通しておくとよいと思います👍」
「この記事ではGoogleが公開しているdistrolessについても解説されてますね↓」
参考: 軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話 - inductor's blog
「よく言われているように、Dockerではマルチステージビルドして実行バイナリだけを集めるのが理想で、Go言語のシングルバイナリのようにシンプルな実行バイナリならやりやすいんですけど、Railsなどで外部ライブラリに依存していてファイル数が多いとマルチステージビルドが大変なんですよね」「たしかに!」
参考: マルチステージビルドの利用 | Docker ドキュメント
「そういえば日本語版の記事も英語版と同じドメインで公開されていますね↓」
参考: Dockerfileのベストプラクティス Top 20 | Sysdig
🔗 Dockerfileのlinter: hadolint
「お、記事の末尾にhadolintというDockerfileのlinterが紹介されている↓」「ホントだ」「Haskell言語で書かれているそうです」
「上のDockerfileベストプラクティス記事に書かれているようなチェックをhadolintでやれるのか」「hadolintのルールを見た感じではなかなかよくできていそう」「お〜」「メッセージのDL3000とかSC2002は何だろうと思ったらlinterのルール名だった」「SCはshell checkの略みたいだけどDLは何の略だろう?🤔」
「hadolintのオンライン版もあるんですね↓」「これはなかなかよさそう👍」「Dockerfileのlinterはたしかにあってもいいですね」
Need to #Lint check your #Dockerfile ? Easy online tool below. I just tested with #ibm #MAX (ML Asset Exchange) cancer detector ML image and it returns a few improvement ideas !
MAX Dockerfile input - https://t.co/ez5O6IhHWY
(see…https://t.co/XgnlL8CEkP https://t.co/9ilCn253kz— Walter Lee (@WalterLee16) March 4, 2020
後で自分の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を使っているらしいです」
🔗CSS/HTML/フロントエンド/テスト/デザイン
🔗 書籍『Web ブラウザセキュリティ』
- 元記事: 読書|Web ブラウザセキュリティ
つっつきボイス:「記事を書いているのはChromiumブラウザの開発に携わっている人だそうです」「Webセキュリティの新しい話題、特に最近のブラウザでやっているプロセス分離アーキテクチャについても詳しく解説されているのがよさそう👍」
「少し前の本ですが、この記事の中でも紹介されている『めんどうくさい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
QEMU - generic and open source machine emulator and virtualizerhttps://t.co/ADIwc51sun pic.twitter.com/3UOcx9nZGM
— Christopher Ackerman (@cackerman1) April 6, 2020
「こんなふうに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が使えるほか
- 20210309後編 RubyのIRBに隠れているイースターエッグ、Power Automate Desktop、SQLクエリのありがちなミス6つほか
- 20210303後編 Bundlerのセキュリティ修正、Rubyのガベージコレクション記事、Rubyが2/24に誕生日ほか
- 20210222 ActiveRecord::Relationの新メソッドload_asyncとexcluding、Active Jobのperform_laterの改善ほか
- 20210209後編 Rubyでミニ言語処理系を作る、Kernel#getsの意外な機能、CSSのcontent-visibilityほか
- 20210208前編 Rails次期リリースがバージョン7に決定、thoughtbotのアプリケーションセキュリティガイドほか](/hachi8833/2021_02_08/103801)
- 20210202後編 Ruby 3 irbのmeasureコマンド、テストを関数型言語のマインドセットで考えるほか
- 20210201前編 Webpackerのガイドがマージ、RailsはRuby 3でどのぐらい速くなったかほか
- 20210126後編 Google Cloud FunctionsがRubyをサポート、Ruby 3のパターンマッチングでポーカーゲームほか
- 20210125前編 Railsリポジトリのデフォルトブランチがmainに変更、Rails 6.1はMySQLのENUM型に対応済みほか
- 20210120後編 Ruby 3.0の新機能で遊ぶ、RubyスニペットをJSに変換するRuby2JS、rspec-parameterized gemほか
- 20210113後編 Ruby 3.0 Ractor解説記事、Vercelホスティングサービス、教育用OS xv6ほか
- 20210112前編 Active Recordの範囲指定バリデーション改善、soleとfind_sole_byメソッド、AlgoliaとRailsほか
今週の主なニュースソース
ソースの表記されていない項目は独自ルート(TwitterやはてブやRSSやruby-jp SlackやRedditなど)です。
週刊Railsウォッチについて
TechRachoではRubyやRailsなどの最新情報記事を平日に公開しています。TechRacho記事をいち早くお読みになりたい方はTwitterにて@techrachoのフォローをお願いします。また、タグやカテゴリごとにRSSフィードを購読することもできます(例:週刊Railsウォッチタグ)