Categories

Latest comments

既存のRailsアプリへのBrakemanの導入

wakairo @wakairo
Last edited

Rails 7.2から新規アプリケーションにおいてBrakemanがデフォルトで有効になりました。 このTopicでは、7.1以前で作成した既存RailsアプリにBrakemanを後から導入して、Brakemanに関して7.2の新規アプリ相当の状態にセットアップする方法をご紹介します。

Brakemanのインストール

まず以下のように、Gemfileのgroup :development, :testのところにbrakemanを追加します。

group :development, :test do

  # Static analysis for security vulnerabilities [https://brakemanscanner.org/]
  gem "brakeman", require: false

end

次にbundle installを実行します。

bundle install

以上でBrakemanのインストールが出来ました。

さらに、必須ではありませんが、bin/brakemanでBrakemanを実行できるように、以下のコマンドを実行します。

bundle binstubs brakeman

ローカル環境でのBrakemanの実行

以下のコマンドでBrakemanを実行でき、デフォルトのチェックを行えます。

bin/brakeman

全てのチェックを実行する場合には、以下のオプション付けて実行します。

bin/brakeman -A

警告の無視に関する設定と管理を行う場合は、以下のオプション付けて実行します。

bin/brakeman -I

以下のように、これら2つのオプションを同時に指定して実行することも出来ます。

bin/brakeman -IA

なお、Brakemanの詳細については公式ドキュメントをご覧ください。 また、brakemanコマンドのオプションについては日本語訳もあります。

GitHubワークフロー(CI)でのBrakemanの実行

.github/workflows/ci.ymlに相当するファイルがなければ作成します。 この.ymlファイルを編集して、以下のようにjobsの下にscan_rubyジョブを追加します。

ymlファイルの設定に関する注意点
  • timeout-minutes:の設定は、実行時間に対して十分余裕を持たせて下さい。
  • ruby-version: .ruby-version」という設定は、プロジェクトルートにある.ruby-versionという名前のファイルで指定されているrubyのバージョンという意味になります。この設定についての詳細はこちらのTopicをご覧下さい。
jobs:
  scan_ruby:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: .ruby-version
          bundler-cache: true

      - name: Scan for common Rails security vulnerabilities using static analysis
        run: bin/brakeman --no-pager
0
Raw
https://www.techtips.page/en/comments/418
🔧3
😄2
💡1
💯1
❤️1

Brakemanの--safe-methodsオプションはXSSチェック専用

takuma_tech Takuma @takuma_tech
Last edited

こちらの公式ドキュメントを読むと、--safe-methodsオプションでメソッド名を指定することで様々なタイプの警告を抑制できるように思えるのですが、このオプションで抑制できるのはXSS (cross-site scripting)チェックのみです。

オプションのマニュアルには「特定のメソッドが適切にエスケープされた値を出力し、そのメソッドがXSSチェックで警告されないようにするためには、次の(--safe-methods)オプションを使います。」と書かれていますし、BrakemanのGitHubのディスカッションでも、「--safe-methods is really only for use with cross-site scripting checks.」という回答が寄せられています。

0
Raw
https://www.techtips.page/en/comments/417
😄3
🔧1
😿1
❤️1

項目20におけるfetchを利用したコード例の代替案

wakairo @wakairo

(hash[key] ||= []) << value、私は普通に読めて大丈夫なコードですが、一般的にはどうなのでしょうね。

ちなみに私の場合、こちらのコードよりもfetchのコードの方が読むのに時間がかかるかもしれません。というのも、Rubyの公式ドキュメントを読んで、fetchの仕様を確認して、なぜfetchを使ったのかしばし考えて、というように時間をかけてしまいそうだからです。

0
Raw
https://www.techtips.page/en/comments/416

項目20におけるfetchを利用したコード例の代替案

kenicode SatoKen @kenicode
Last edited

Effective Rubyの「項目20 ハッシュのデフォルト値を利用することを検討しよう」では、
a. ハッシュにエントリが存在しない場合には配列作成してから配列に要素を追加し、
b. ハッシュにエントリが存在する場合にはそのエントリである配列に要素を追加する
という動作をするコードとして、fetchを使う以下のようなコードサンプルが提示されている。

hash[key] = hash.fetch(key, []) << value

このコードを実際に動かす簡単な例として、自然数を偶数と奇数に分けるコードを以下に示す。

10.times.reduce({}) do |hash, value|
  key = value.odd? ? :odd : :even
  hash[key] = hash.fetch(key, []) << value
  hash
end
=> {:even=>[0, 2, 4, 6, 8], :odd=>[1, 3, 5, 7, 9]}

さて、このhash[key] = hash.fetch(key, []) << valueと同じ動作をする別のコードとして、以下の代替案があるのだが、本書では触れられていない。

(hash[key] ||= []) << value

こちらのコードの方が、keyが2回登場しないという面でDRY原則的には優れている。 具体的には、2カ所で同じにしないといけないところをうっかり違うものにしてしまうというミスを防ぐことができる。

なお、Rubyの式がオブジェクトを常に返すことを利用したこのような書き方に慣れていないプログラマには、このコードは理解しづらいかもしれず、それがデメリットになるかもしれない。そういうときには、以下のように2行で書くと良いかもしれない。

  ary = (hash[key] ||= [])
  ary << value
0
Raw
https://www.techtips.page/en/comments/415
💡1
❤️1

APGのPatternsはWeb部品の実装コードのサンプルとしても参考になる

teatea1024 TeaTea @teatea1024
Last edited

ARIA Authoring Practices Guide (APG)にはPatternsというページがあり、こちらでカルーセルやタブ、ツールチップといったWeb部品の実装コードのサンプルが紹介されています。

これらのコードサンプルは、HTMLのaria属性の付与方法について参考になるのはもちろんのこと、実際に動作するHTML・CSS・JavaScriptのコードが一通りそろっているため、こういったWeb部品の実装方法の一事例として参考になります。

例えば、タブのコードサンプルはExample of Tabs with Automatic Activationのページで「Open In CodePen」のボタンをクリックすることで見られます。

0
Raw
https://www.techtips.page/en/comments/414
❤️3
😄1

ChatGPT searchのTips

wakairo @wakairo
Last edited

ドメイン(Webサイト)を指定しての回答生成

「~ドメインから」とプロンプト(質問文)に入れることで、特定のドメイン(Webサイト)の情報を基にした回答を生成してくれます。情報ソースを指定したいときなどに便利そうです。

備考

このTopicとCommentは、11/11に全面的に改定しました。

0
Raw
https://www.techtips.page/en/comments/413
💡3
😄1
🔄1
🔧1

Placekittenはサービス終了?

teatea1024 TeaTea @teatea1024

2024年に入って、Placekittenはもう何ヶ月も上手く動作していない模様。なので、ダミー画像用のサービスとしては、他のサービスに乗換が必要そう。

ちなみに、Placekittenに近いサービスとして、 https://placecats.com/ というサイトがあるそうです。

参考

0
Raw
https://www.techtips.page/en/comments/381
🔧1
😿1

IrfanViewがv4.70になってからwingetソースでのインストールが上手く行かない

wakairo @wakairo
Last edited

問題

2024年10月26日現在、以下のコマンドのように、wingetがソースとなっている方のパッケージIDを指定してwingetからインストールを試みても、IrfanViewが起動できないので、インストールが上手く行っていないと思われる。

winget install --id "IrfanSkiljan.IrfanView"

対応策

最新版になるのが多少遅れても良いのであれば、Microsoft Storeからインストールする。なおMicrosoft Storeからであれば、Microsoft StoreのGUIからインストールしても、Microsoft Storeの方のパッケージIDを指定してwingetコマンドからインストールしても、どちらでも大丈夫のようである。

0
Raw
https://www.techtips.page/en/comments/380
🔧1

minitestにおける不等号などの二項演算子を用いたアサーション

wakairo @wakairo
Last edited

minitestにおいて、不等号などの二項演算子(例:<, >, <=, =>)を用いたアサーションをしたいときには、 assert_operator()が利用できます。

assert_operator()を用いるメリット

assert_operator()を用いるメリットとして、アサーションが失敗した時の情報が多くなることが挙げられます。

以下のように、assert_operator()を使用した場合は、

x, y = 0, 1
assert_operator x, :>, y

アサーション失敗のメッセージにおいて、以下のように変数の中身も表示してくれます。

Expected 0 to be > 1.

比較して、以下のように単純に記述した場合は、

x, y = 0, 1
assert( x > y )

以下のようにアサーションに失敗した以外の情報を得ることが出来ません。

Expected false to be truthy.

(参考)assert_not_operator

ちなみにrailsのテスト環境では、assert_not_operatorもあります。

0
Raw
https://www.techtips.page/en/comments/347
🙋1
❤️1

rails 7.0からrails 7.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo

Rails 7.1で追加されたパスワード関連エラーメッセージへの対応

has_secure_passwordを利用しているモデルがあり、かつ、英語以外のロケールへ対応している既存アプリでは、 rails 7.1で追加されたエラーの種類であるpassword_too_longに対応するエラーメッセージの訳文を追加する必要があります。 (追加をしないとパスワードが長すぎた場合のエラーメッセージが英語で表示されます。)

なお、本件の詳細についてはこちらをご覧下さい。

0
Raw
https://www.techtips.page/en/comments/333
❤️1