jobs:lint:runs-on:ubuntu-latesttimeout-minutes:10steps:-name:Checkout codeuses:actions/checkout@v4-name:Set up Rubyuses:ruby/setup-ruby@v1with:ruby-version:.ruby-versionbundler-cache:true-name:Lint code for consistent stylerun:bin/rubocop -f github
Windows Terminalのデフォルトの日本語表示は、文字と文字の間に隙間があり、見にくいと感じる方も少なくないと思います。
Windows Terminalでは、複数のフォントを利用可能にする改良が2024/03/27にマージされています。
ですので、それ以降のバージョンでは、コンソール用欧文フォントに続けて好みの和文フォントを設定することで、日本語表示を改善できます。
jobs:scan_ruby:runs-on:ubuntu-latesttimeout-minutes:10steps:-name:Checkout codeuses:actions/checkout@v4-name:Set up Rubyuses:ruby/setup-ruby@v1with:ruby-version:.ruby-versionbundler-cache:true-name:Scan for common Rails security vulnerabilities using static analysisrun:bundle exec brakeman --no-pager
オプションのマニュアルには「特定のメソッドが適切にエスケープされた値を出力し、そのメソッドがXSSチェックで警告されないようにするためには、次の(--safe-methods)オプションを使います。」と書かれていますし、BrakemanのGitHubのディスカッションでも、「--safe-methods is really only for use with cross-site scripting checks.」という回答が寄せられています。
既存のRailsアプリへのRuboCopの導入
Rails 7.2からRuboCopが新規アプリケーションでデフォルトで有効になりました。 このTopicでは、7.1以前で作成した既存RailsアプリにRuboCopを後から導入して、RuboCopに関して7.2の新規アプリ相当の状態にセットアップする方法をご紹介します。
RuboCop (Omakase Ruby styling for Rails) のインストール
基本的にはrubocop-rails-omakaseの公式ドキュメントのインストール手順に従います。
まず以下のように、Gemfileの
group :development, :test
のところにrubocop-rails-omakaseを追加します。次に
bundle install
を実行して、RuboCop等をインストールします。さらに、必須ではありませんが、
bin/rubocop
でRuboCopを実行できるように、以下のコマンドを実行します。最後に
.rubocop.yml
という名前でファイルを作成し、以下の内容を記述します。以上でRuboCop (Omakase Ruby styling for Rails) のセットアップが出来ました。
ローカル環境でのbin/rubocopの実行とその結果に対する対応の進め方
以下のコマンドでbin/rubocopを実行でき、omakaseのチェックを行えます。
このチェックでの指摘事項が多かった場合、以下のオプションを付けて実行することで、 無視設定を記述した
.rubocop_todo.yml
というファイルが作成され、.rubocop.yml
にもこの無視ファイルを参照する設定が追加されますので、 とりあえず全ての指摘事項を無視するように設定が出来ます。設定が出来たら、
bin/rubocop
を実行して、とりあえず指摘事項の数が0となることを確認します。1つずつ指摘事項へ対応
ここから先は、以下の手順を繰り返します。
.rubocop_todo.yml
から1項目を削除bin/rubocop
を実行して指摘内容を確認して対応bin/rubocop -a
もしくはbin/rubocop -A
を実行して自動修正できるものは自動修正し、その修正内容で問題ないことを確認-a
は安全なもののみ、-A
は安全で無いものも含めて自動修正を行います。.rubocop.yml
にてExclude:
を用いて設定# rubocop:disable
等を用いて設定.rubocop.yml
にてEnabled: false
の記述を用いて規則を無効にする1項目ずつ対応を進め、
.rubocop_todo.yml
の中身が無くなったら、.rubocop_todo.yml
を削除すると共に、.rubocop.yml
内で.rubocop_todo.yml
を参照している設定を削除します。ここまで終わればRuboCopの諸規則への対応は完了となります。お疲れ様でした。GitHubワークフロー(CI)でのrubocopの実行
.github/workflows/ci.ymlに相当するファイルがなければ作成します。 この.ymlファイルを編集して、以下のようにjobsの下にlintジョブを追加します。
注意点
timeout-minutes:
の設定は、実行時間に対して十分余裕を持たせて下さい。ruby-version: .ruby-version
という設定は、プロジェクトルートにある.ruby-versionという名前のファイルで指定されているrubyのバージョンという意味になります。この設定について詳しくはこちらのTopicをご覧下さい。-f github
オプションは、出力フォーマットをGitHub Actionsに適したものにするオプションです。公式情報
RubyのArrayやHashのリテラルをdeep freezeするshareable_constant_valueマジックコメント
概要
Rubyでは、以下のように
shareable_constant_value: literal
というマジックコメントを記入することで、 以下の例のように、定数に代入したArrayやHashのリテラルを深く(deeply)freezeすることが出来ます。少し詳しい話
shareable_constant_value
マジックコメントはRuby 3.0で導入されました。注意点
このマジックコメントのliteralモードでfreezeされるのは定数が対象であるため、 以下のように、代入先が変数である場合にはfreezeされません。
また、このマジックコメントのliteralモードを指定したファイル内では、以下のように、 「freezeされていないオブジェクト」や「freezeされていないものを含むオブジェクト」を定数に代入しようとするとエラーが発生します。
裏を返せば、以下のように、freezeすればエラーが回避できます。 また、freezeする定数とfreezeしない定数でファイルを分けるという自然なアプローチでもエラーを回避できます。
参考文献
既存のRailsアプリでのDependabotへの対応
Rails 7.2から新規アプリケーションにおいてDependabotがデフォルトで有効になりました。 具体的には、
rails new
で生成される新規アプリにおいて、Dependabotの設定ファイルである.github/dependabot.yml
が生成されるようになりました。Dependabotとは
Dependabotとは、GitHubのサービスであり、リポジトリで使用しているソフトウェアを最新の状態に保つことをサポートしてくれるサービスです。 具体的なDependabotの機能としては、以下の3つがあります。
Dependabotの詳細な理解にはクイックスタート ガイドなどをご利用ください。
既存のRailsアプリでのDependabotへの対応方法
脆弱性の通知機能(Dependabot alerts)は、GitHubのWebページから設定を変更するだけで利用できます。
脆弱性に関するpull requestの自動生成機能(Dependabot security updates)も、GitHubのWebページから設定を変更するだけで利用できますが、詳細な設定が必要な場合はdependabot.ymlを通して行います。
脆弱性対応以外も含めて最新の状態にするためのpull requestを自動生成する機能(Dependabot version updates)は、dependabot.ymlを通した設定が必要です。
(参考)デフォルトのdependabot.ymlの内容
このリンク先で閲覧できる
rails new
で生成される新規アプリのdependabot.ymlの設定内容は、既存アプリでも参考になるかもしれません。 このdependabot.ymlには、Rails 7.2の時点では、railsアプリで利用しているgemとGitHub Actions(GitHubのCI)で利用しているアクションを最新に保つための設定が記述されています。BootstrapとTurbo Driveを組み合わせたときの問題と対処法
問題
HotwireのTurbo Driveでは高速化を図るために、ページ遷移時に全体をリロードせずに<body>タグ内のコンテンツを置き換える動作が基本となっています。 そのためか、Turbo Driveを有効にしていると、JavaScriptの動作が必要なBootstrapのコンポーネントが適切に動作しない場合があります。
例えば、タブのコンポーネントにおいて、ページ遷移の直後はカーソルキーでのタブの切り替えが動作しません。
対策
HotwireのStimulusを利用して、必要なBootstrapオブジェクトをページ遷移時に作成します。
対策の具体例
タブ・コンポーネントの場合、まず以下のようにタブの各要素を対象にして
getOrCreateInstance()
をconnect内で呼び出すStimulusコントローラapp/javascript/controllers/foo_controller.js
を作成します。次に以下のように、このStimulusコントローラ
foo
を指定したhtmlタグでタブコンポーネントを囲みます。以上で、Turbo Driveによるページ遷移時に、このタブ・コンポーネントを含むHTMLがロードされると
connect()
が呼び出され、 タブ用のBootstrapオブジェクトが存在していなかった場合には作成されるようになり、 その結果タブ・コンポーネントが正しく動作するようになります。Windows Terminalの日本語表示は複数のフォントを指定することで改善できます
複数のフォントが設定出来たのですね。単一のフォントしか使えないのに比べると、意図した表示の仕方に大分しやすくなりますね。良い情報をありがとうございます。
ちなみに、Microsoftは現在Cascadia Nextという日本語に対応した等幅フォントを開発しているそうですので、このフォントの採用などでWindows Terminalの日本語表示がデフォルト設定のままでも良い感じになると良いですね。
Windows Terminalの日本語表示は複数のフォントを指定することで改善できます
Windows Terminalのデフォルトの日本語表示は、文字と文字の間に隙間があり、見にくいと感じる方も少なくないと思います。 Windows Terminalでは、複数のフォントを利用可能にする改良が2024/03/27にマージされています。 ですので、それ以降のバージョンでは、コンソール用欧文フォントに続けて好みの和文フォントを設定することで、日本語表示を改善できます。
具体的には、Windows Terminalの設定を開き、「プロファイル」の「既定値」を選択し、「追加の設定」の「外観」を選択、「フォントフェイス」のところにカンマで区切って利用したいフォントを並べ、設定を保存すればOKです。
例えば、「フォントフェイス」のところを以下のように設定した場合、英数字や記号は「Cascadia Code」 フォント、日本語の文字は「MS Gothic」フォントで表示されるようになります。
Brakemanの--safe-methodsオプションはXSSチェック専用
役立つ情報ありがとうございます。
リンク先のGitHubのディスカッションを覗いてみたのですが、「poor naming」という表現があり、
--safe-methods
というオプション名が紛らわしいということは認識されているみたいですね。それから、"use the ignore file instead"というポリシーだそうですので、XSSチェック以外のタイプの警告は、1つずつ無視の設定をして欲しいというのがBrakemanの開発側の考えのようですね。
既存のRailsアプリへのBrakemanの導入
Rails 7.2から新規アプリケーションにおいてBrakemanがデフォルトで有効になりました。 このTopicでは、7.1以前で作成した既存RailsアプリにBrakemanを後から導入して、Brakemanに関して7.2の新規アプリ相当の状態にセットアップする方法をご紹介します。
Brakemanのインストール
まず以下のように、Gemfileの
group :development, :test
のところにbrakemanを追加します。次に
bundle install
を実行します。以上でBrakemanのインストールが出来ました。
ローカル環境でのBrakemanの実行
以下のコマンドでBrakemanを実行でき、デフォルトのチェックを行えます。
全てのチェックを実行する場合には、以下のオプション付けて実行します。
警告の無視に関する設定と管理を行う場合は、以下のオプション付けて実行します。
以下のように、これら2つのオプションを同時に指定して実行することも出来ます。
なお、Brakemanの詳細については公式ドキュメントをご覧ください。 また、brakemanコマンドのオプションについては日本語訳もあります。
GitHubワークフロー(CI)でのBrakemanの実行
.github/workflows/ci.ymlに相当するファイルがなければ作成します。 この.ymlファイルを編集して、以下のように
jobs
の下にscan_ruby
ジョブを追加します。ymlファイルの設定に関する注意点
timeout-minutes:
の設定は、実行時間に対して十分余裕を持たせて下さい。ruby-version: .ruby-version
」という設定は、プロジェクトルートにある.ruby-versionという名前のファイルで指定されているrubyのバージョンという意味になります。この設定についての詳細はこちらのTopicをご覧下さい。Brakemanの--safe-methodsオプションはXSSチェック専用
こちらの公式ドキュメントを読むと、
--safe-methods
オプションでメソッド名を指定することで様々なタイプの警告を抑制できるように思えるのですが、このオプションで抑制できるのはXSS (cross-site scripting)チェックのみです。オプションのマニュアルには「特定のメソッドが適切にエスケープされた値を出力し、そのメソッドがXSSチェックで警告されないようにするためには、次の(--safe-methods)オプションを使います。」と書かれていますし、BrakemanのGitHubのディスカッションでも、「--safe-methods is really only for use with cross-site scripting checks.」という回答が寄せられています。
IrfanViewがv4.70になってからwingetソースでのインストールが上手く行かない
問題
2024年10月26日現在、以下のコマンドのように、wingetがソースとなっている方のパッケージIDを指定してwingetからインストールを試みても、IrfanViewが起動できないので、インストールが上手く行っていないと思われる。
対応策
最新版になるのが多少遅れても良いのであれば、Microsoft Storeからインストールする。なおMicrosoft Storeからであれば、Microsoft StoreのGUIからインストールしても、Microsoft Storeの方のパッケージIDを指定してwingetコマンドからインストールしても、どちらでも大丈夫のようである。