valid,invalid

関心を持てる事柄について

MutationObserver

JavaScriptでDOMを監視して何かしらのコールバックを実行する際にMutationObserverが使える。

仮想DOM全盛時代でなくとも、jQueryでもvanilla JSでもイベントハンドラを自由に設定できるようなWebフロントエンドの世界で使い道あるか?と思っていたが、利用しているSaaSASPにユーザースクリプトを埋め込むケースなど、自身ではコントロール下にないサイトで何かやるときに使える。

Example

.cardセレクタで取得できるDOMに子要素が追加されたのをトリガーにコールバックを実行する例。

.cardの下に消したい要素.noiseがいたら取り除く。

 const mutationObserver = new MutationObserver(() => {  
   if ($('.noise').length) {
     $('.noise').remove();
   }
 });
 
 mutationObserver.observe(document.querySelector('.card'), { childList: true });

他にも属性・テキスト・子要素など監視対象を細かく指定できる。


直近で役に立ったのは、Zendeskヘルプセンターの表示を動的に切り替えるカスタムスクリプトを書いたとき。

ユーザー操作に応じてZendeskが何らかのDOM操作を行うのをトリガーとし、DOM操作に追従して見た目をコントロールしたいときにMutationObserverが使えた。

Zendesk本家の挙動はブラックボックス*1で、動的に謎のDOMが減ったり増えたりするのでシンプルなイベントハンドラでは対応ができなかった。


試してないけど、はてなブログJavaScriptを実行して広告を消したりもできるのかもしれない*2

*1:正確にいうと多少はリバースエンジニアリングできるが

*2:僕は広告表示されて構わないので無課金ですが、広告非表示は有料会員の機能なので消したいならちゃんと課金しましょう

NameError uninitialized constant ActiveStorage::Analyzer::ImageAnalyzer::MiniMagick

ActiveStorageで画像アップロードを行ったあとに非同期に実行される画像の解析処理で NameError ActiveStorage::AnalyzeJob uninitialized constant ActiveStorage::Analyzer::ImageAnalyzer::MiniMagick エラーが出た。

処理を行っているのはActiveStorage::Analyzer::ImageAnalyzer#read_imageの中。

https://github.com/rails/rails/blob/v6.1.4/activestorage/lib/active_storage/analyzer/image_analyzer.rb#L31-L49

def read_image
  download_blob_to_tempfile do |file|
    require "mini_magick"
    image = MiniMagick::Image.new(file.path)

    if image.valid?
      yield image
    else
      logger.info "Skipping image analysis because ImageMagick doesn't support the file"
      {}
    end
  end
rescue LoadError
  logger.info "Skipping image analysis because the mini_magick gem isn't installed"
  {}
rescue MiniMagick::Error => error
  logger.error "Skipping image analysis due to an ImageMagick error: #{error.message}"
  {}
end

raiseされるのはL46のrescue節の中でMiniMagick::Error定数を参照しようとしたとき。 このタイミングでrequire "mini_magick"されていないので定数探索のときにActiveStorage::Analyzer::ImageAnalyzer以下を探すが見つからず、ActiveStorage::Analyzer::ImageAnalyzer::MiniMagick

L33でrequire "mini_magick"されているはずなのに...と思ったが、発生原因は以下の通りだった。

  • ブロック内の処理以前、download_blob_to_tempfile内で別のエラーがraiseされている
  • L33でrequire "mini_magick"する前にL46に到達し、定数が見つからずにNameErrorになる

別のエラーが何かというと、workerを実行するコンテナがS3の特定バケットに対する権限を持っておらず403 Forbiddenが返されている、というものだった(よくよくbacktraceを見ればAws::S3::Errors::Forbiddenが出力されていたことに同僚が気付いた)。

バケットを作るときに、アクセスするコンテナの指定を僕が忘れていただけだったので、権限をつけてもらって解決。


Sentryに飛んできたエラークラスが事象の根本となる問題を表していない(まれによくある)ので戸惑ったが解決できてよかった。

"腰を破壊する自宅デスク環境"を改善して健康被害から卒業した

この数ヶ月で自宅のデスク環境を大きくアップデートしたので記録に残しておきます。

当記事がリモートワークないし家で作業する機会が多い人の参考になれば幸いです*1

変更前後のようす

Before

作業環境にこだわらずガジェットにも興味が薄い人間だったので聞く人によっては卒倒しそうな環境で2020末までずっと仕事や自宅作業をしていました。

変更以前の写真がなかったので当時の自宅のようすを超技術で再現すると、こうです*2

すでに腰痛や肩こりを抱えている方、つまりHPが1桁台で状態異常の方が利用したら1ヶ月と持たずに身体が破壊されるのではと思える環境でしたし、かくいう私も何度か破壊されました

破壊されつつも自宅に机やイスを設置するスペースがなかったので、リモートワークがメインになった2020年からも1年ぐらいこの環境で働いていました。まぁ、世間が急速にリモートワーク対応していった昨年の2020年4~7月頃は無職だったので、デスク環境にさほど関心を払っていなかったのでした。乗り遅れたな…からのもう今更いいかな…っていうレイトマジョリティ以下のアレでした。

After (HEAD)

変更後、2021年7月現在の状態はこんな感じです。めっちゃ映える感じでもないですが実用性十分で健康被害を80%ほど抑制(体感比)するのにも成功しています。

着席時: デスク高さ 71.5cm

スタンディング時: デスク高さ 104.0cm

机上にはディスプレイとラップトップのみ。かなり殺風景ですが実用性重視なのでヨシ!

デスク下にはテレビ台を流用した棚+筆記用具、ケーブルボックス、シュレッダー、ルーター(死角)などを置いています。

シュレッダーは個人情報の破棄用途ですが、たまに書き物をしたあとに即シュレッドできて便利です。

かかった費用

かかった費用の合計は152,492円。フリマアプリに眠っていた"銭こ"が少しあったのでそのぶん割り引いて、実際の支出は93,706円でした。

No 品名 購入価格 定価
1 LG 27インチ ディスプレイ 46,890 57,980
2 FlexiSpot EJ2 脚 + 天板 32,650 46,800
3 Umi チェアマット 2,999 2,999
4 モニターアーム 8,953 12,101
5 オカムラ コーラルチェア (used) 61,000 195,250
小計 152,492 315,130
ポイント利用 -58,786 -
総計 93,706 -

ギリ「給付金で整備した」と言えるレベルの出費。

個別に購入したときは気にならなかったのに振り返ったら意外とかかったな…と思ったものの 定価と比較したら221,424円も得してるな! と考えたら気分が明るくなってきました。

変更履歴

ここから、After (HEAD) に至るまでの履歴です。

v1: こたつと座椅子

  • 山善のこたつテーブル
  • 座椅子、ときどき骨盤クッション

外付けディスプレイもキーボードもマウスもありません。 漢は黙ってラップトップ単騎。

冬場のこたつでプログラミングは良いものでした。

v2: LG 27インチディスプレイ導入

LG モニター ディスプレイ 27UK850-Wはたしか2021年1月にAmazonのセールで見かけて購入しました。

デカさをケチりたくはなかったのですが、こたつテーブルの上に他にもいろいろ置かなければならなかったのでこのサイズしか置けなかった…。

いやまぁ、さすがにオフィスワーク時はディスプレイ使っていましたし、業務上必要な資料なりWebサイトなりコードなりを読み込む時にあると便利なことぐらい、知っていましたが…15インチのラップトップ単体のときより視線移動が減って目が疲れにくくなるとは、ね…。

v3: FlexiSpot EJ2 導入

2021年6月、引越。ここから改革の狼煙が上がる

引越しに伴ってこたつテーブル・座椅子を手放すことになり、作業環境の改善が急務になりました。

作業環境として優れていないとはいえ机と椅子の両方を一度に手放すという暴挙の背景には、「限界を決める"部屋-ハードウェア-"は前住居よりやや広くなり机やイスを置くスペースが作れたので、せっかくなら以前よりマシな環境を作ろう」という漆黒の意思。あと、 たった数日でもストレッチと運動をサボると身体のどこかのパーツが軋むのでそろそろ逆張りも潮時かな? という気持ち。

スタンディング状態で仕事をしたり、PC作業よりも高さが必要な手書き作業をやったり、体格が異なる家族が使う可能性も考慮して、電動昇降式デスクを絶対買うと決意しました。

「毎回調整するのは大変なので高さを記憶するメモリ機能がついていてほしいが、それ以外での要求は特にないーーー」その程度の軸で電動昇降式デスクをいくつか調べた結果、FlexiSpotかサンワサプライの製品が良さそうとわかってきました。

最終的には価格で決め、FlexiSpot EJ2と天板のセットを購入。 天板DIYに興味はあったが環境の改善が急務だったので速度を優先。

FlexiSpotのサイトでセール & クーポンを使って32,650円。

購入した2日後にAmazonプライムデーセールでEJ2がさらに安い25,000円で販売しているのを見たときは気絶しそうだったが、天板をつけると35,000円になっていたので何も問題なかった。システムオールグリーン...

注文から3日後に到着。組み立ては1時間ぐらいかかったのと、机を起こす作業は1人ではかなりきつかったので妻に手伝ってもらいました。

机の高さに合う椅子が家になかったためピアノ椅子を高くして暫定的に使うことにしたのですが…これは大間違いだった。この時期は2週間ぐらいだけどめっちゃ辛かった。本当に辛かった。ピアノ椅子をオフィスチェアとして利用するのはおすすめしません

座椅子でも壁でもなんでもいいのですが、座り作業で背中を預けられないと一日中自力で上半身を支えなければならない。それが不可能なので気づくと机に肘をついたり悪い姿勢を取るようになっていました。1日が終わるころには疲労困憊です。

スタンディングデスクに切り替えたり、ラップトップをデスクから離れたところに持っていって布団や膝上に置いたりしましたがなかなか厳しいものがあった。

良い机だけあってもダメということがよくわかった。

v3.1: チェアマット

乗せるオフィスチェアもないのにチェアマットとは…と思いつつ、FlexiSpot EJ2がかなり重いのでフローリングが心配になって購入。

うちは掃除機ないので(主にクイックルワイパーで床掃除をしている)チェアマット上の掃除は粘着カーペットクリーナー(通称コロコロ)とファブリーズなどで対応しています。

今回はデスクもチェアマット上に置いていますが、フローリングに直置きする場合はデスクの足にカグスベ〜ルのような緩衝を置くと傷もつかず移動も楽で良いらしいとのことです。

v3.2: モニターアーム

LGのディスプレイにもともと付属していたモニタースタンドで十分と思っていたが、自在に位置・角度・距離を制御でき、デスクも広くなってとても良いものです。

難点を挙げるなら

  • 机と壁の間に距離を開けないといけないこと
  • 天板が痛む可能性があること

今のところ机に傷はついてないけれどもモニターアームを動かしたときに机との接触部が動くことがまれによくあるんですよね〜。天板を気遣うあまりネジを締めきれていないのかもしれない。気になってきたら補強プレートを買うかもしれません。

v4: オカムラ コーラルチェア

これが最大のメジャーアップデート。

ピアノ椅子があまりに辛かったのでイスならなんでも良いと思いかけていたが、せっかくなので椅子のことも色々調べてみた。にわか知識ながら、自分にとってMUSTな要求は可動肘・ハイバック・座面調整・シンクロロッキングあたりらしい。

あまりにこだわると沼っぽいこと、どんなに高級な椅子でも身体に合わないものは辛いらしいことがわかった。なので、アイリスオーヤマ新宿に一度だけ出向いて「シンクロロッキング...シンクロロッキング...」とつぶやきながらオカムラ・イトーキ・ハーマンミラーエルゴヒューマン等々の名前だけは聞いたことあるブランドの椅子に試座してみた。

けっこう人が多くて落ち着いて見られなかったのと、知識不足で細部まで機能を余すことなく試すことはできなかったが、正直、展示されているようなブランドの椅子ならどれでもいいのでは? と思えた。強いて言えば、出社していた頃にオフィスで使っていたバロンチェアやそれに近いやつは"馴染む"感じがあった。

新品に十数万かける度胸はなかったので中古で正常稼働するものを、~6万円の予算で探すことにした。

オフィスバスターズを見ながら各製品の中古相場をだいたい把握し、最終的にはオカムラのコーラルチェアをフリマアプリで61,000円で購入した。"オフィスチェアについて語るスレ"民いわく「アンチオカムラでもコーラルだけは認める」ぐらい優秀らしい(ネットの情報を鵜呑みにするの図)。

  • 型番 CQ8ABW-FSH3
  • メーカー希望小売価格: 195,250円
  • 新品実売価格: 130,000~140,000円

個人間売買よりも専用業者(オフィスバスターズ etc.)から買ったほうが安心だったかもしれないが、コーラルはバロンやシルフィーほど多く出回っていないのでオフィスバスターズに在庫がなかったこと、中古相場より安めだったこと、フリマアプリの残高があったのでシュッと使えて出費が抑えられることが決め手になった。

最後の点は市場関係なく完全に個人的なファクタ。引越しで諸々を売却処分した結果、アプリ内に売上残高が60,000円近くあったので実質2,000円ちょっとの出費で済みました。

到着後は以下の動画を参考にしつつ椅子と机の高さを調整したり、座面をセルフクリーニングして"仕上げ"ました*3

www.youtube.com

前環境が悪すぎたので伸びしろしかなかった わけですが、コーラルで数日過ごした結果、やはり 1日の終りの疲労感が圧倒的に違う

ピアノ椅子では終業後は「もう座っていたくない」という気持ちでベッドに倒れていたが、今や業務が終わったあとでもそのまま読書や趣味でPC触ったり、「オレは今、コーラルに座っている」という多幸感に包まれたりしている。

あとは妻を椅子に乗せてグルグル回すアトラクションをやっている。

総合的な感想

もともとデスク環境へのこだわりはまったくなく、むしろ こだわらないほうがかっこいいとまで思っている逆張りのフシ があったわけですが、ある程度整備した現状の自宅デスクを改めて見ると..."愛-かな-"しい...。

出社メインで仕事していた頃、当然そこにはデスクやイスやディスプレイがあった。しかしながら環境が整備されたオフィスで仕事しても自宅の上記のような環境でやっても別に生産性はさほど変わらないなと思っていた。

まぁ、劣悪な環境は健康に影響を及ぼし、長期的には生産性を損ねるんですが…。そう、健康面でいうと良い環境で仕事していようとデスクワークしてる時点で腰痛や肩こりとの戦いは続くし、4年前ぐらいからずっと冒されていて結局のところ運動や生活習慣の改善でなんとか改善しつつ運用している。

良い道具は身体へのダメージを軽減はするが回復はしない、道具よりも生活習慣のほうがはるかに大事だという考えは継続したいと思います。

今後の課題

ラップトップ単体で作業しているときは気にならなかったものの、椅子と机が揃うと適切な位置に置けるキーボードやトラックパッドや良質なコンデンサマイクが欲しくなってくるし、デスク上に何らかを置くスペースはあるので実用性ありそうな機器や道具の追加も検討の余地がある。

ただしこれらは本稿では十分に論じることができなかったので今後の課題としたい

参考

*1:と言いつつ今回の出費を少しでもまかなえればと思い、当記事の商品リンクはおおむねアフィリエイトリンクになっています

*2:いらすとや https://www.irasutoya.com/ の画像を使用しています

*3:セルフクリーニングはけっこう大変だったので別途記事にしてみたい

セカンドシングルをリリースしました

ローペースですがリモートでバンド活動をやっておりまして、昨年に引き続いてセカンドシングルを各種配信サービス上でリリースしました。

Spotify, Apple Music, YouTube Musicを始めとした各種配信サービスで視聴することができます。

各種配信サービスへのリンクは以下から↓

linkco.re

イラスト

今回シングルジャケットのイラストは我喜屋位瑳務さんに依頼させていただきました!

f:id:ohbarye:20210704225045p:plain
性別のわからない女の子と謎の生物、というオーダーにお応えいただいた

ご存知の方も多いと思いますがタッチの幅が広い(ref ご本人のギャラリー)のでどのような仕上がりになるか非常にわくわくしながら完成をお待ちしておりました。

個人的に我喜屋さんを知るきっかけになったYUKIのグッズイラストやジャケットビジュアルも好きだし

https://gakiworks.tumblr.com/post/158351123999/yuki-costume-illustration
gakiworks.tumblr.com

椎名林檎トリビュートアルバムやフジファブリックの『F』もクールで印象に残っていました。

https://gakiworks.tumblr.com/post/174343812579/%E6%A4%8E%E5%90%8D%E6%9E%97%E6%AA%8E%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%83%88%E3%82%A2%E3%83%80%E3%83%A0%E3%81%A8%E3%82%A4%E3%83%B4%E3%81%AE%E6%9E%97%E6%AA%8E-design%E6%9C%A8%E6%9D%91%E8%B1%8A
gakiworks.tumblr.com

https://gakiworks.tumblr.com/post/182318656834/%E3%83%95%E3%82%B8%E3%83%95%E3%82%A1%E3%83%96%E3%83%AA%E3%83%83%E3%82%AFf
gakiworks.tumblr.com

最終的にはBiSHメンバーのアユニ・Dさん率いるバンドPEDROのグッズのイラスト(これもすごく良い)に近いタッチで仕上げていただきました。

f:id:ohbarye:20210704225045p:plain

楽曲の歌詞世界観にもマッチしていてとても気に入っています。

ミックス / マスタリング

『赤』は前回に引き続きバンドリーダーのエア氏がミックス〜マスタリングをやってくれ、『渡月橋』のほうは Studio Chapter H[aus] の樫村さんに依頼させていただきました。

今回はじめて専門のエンジニアにミックス・マスタリングをお願いしたところ、プロの仕事の速度・仕上がりに度肝を抜かれました。いや、本当にすごいんですよね。

今後

コロナ禍が続く以上は引き続き楽曲のレコーディングと配信をやっていきます。

また、今回もこんなに素晴らしいアートワークが付くとは作曲やレコーディングの時点ではメンバーの誰もが予想していなかったので、すごいこともあるもんですね。

今後も楽曲がアートワークに負けないよう頑張らねば…!


楽曲の視聴、Twitterアカウントのフォローよろしくお願いします!

P.S. ファーストシングルもよろしくお願いします!!

ohbarye.hatenablog.jp

linkco.re

ActiveRecordのgroupクエリの結果の件数取得、count vs size vs length添え

ActiveRecordでgroupクエリの結果の件数をスマートに取得したいだけ。

SELECT COUNT(*) 
FROM (
    SELECT "users"."id"
    FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
    GROUP BY "users"."id"
    HAVING (count(1) > 5)
  )

前提: count vs size vs length

ActiveRecord length vs size vs count でググるとたくさん出てくる。ここではRails v6.1.4のコードで確認した結果をメモする。

RailsActiveRecordではrelationに対してlength, size, countのいずれでもクエリの結果の件数を取得できるが、挙動に違いがある。

使い分けの結論

  • キャッシュを使うならsize
  • キャッシュを使わないならcount
  • lengthはクエリの結果をloadするので件数取得のためだけには使わない

length

def records # :nodoc:
  load
  @records
end
 def load(&block)
   unless loaded?
     @records = exec_queries(&block)
     @loaded = true
   end

   self
 end

つまり、クエリを実行し、その結果として返ってきたArrayArray#lengthを呼ぶ

count

  • ActiveRecord::RelationincludeしているActiveRecord::Relation::Calculations#count
  • relationがloaded?かどうかはチェックせずにSQLCOUNTをDBに発行する

size

def size
  loaded? ? @records.length : count(:all)
end

loadされていたらキャッシュしている@recordsArray#lengthを呼ぶ

loadされていなければActiveRecord::RelationincludeしているActiveRecord::Relation::Calculations#countを呼ぶ


2015年のActive Record の size vs count vs length をコードレベルで見てみた - Qiitaの頃と比べるとだいぶActiveRecord::Relationのコードがすっきりしていた。

group byの結果の件数を得る場合

group byするとHashが返る

上記の前提はrelationでgroupを使っていない(grouped_valuesが存在しない)場合の話。

ActiveRecord::QueryMethods#groupを呼んだあとに(sizecount経由で)ActiveRecord::Relation::Calculations#countを呼ぶと、primitiveな数値ではなくHashが返るようになる。

ここで分岐してexecute_grouped_calculationが実行され、結果はHashとなるため。

困るケース

たいてい便利なのだが、group byしたあとに欲しいのがHashではなく、プリミティブなIntegerなこともある。

たとえば、group byをグループ集計のためでなく絞り込みのためだけに使っているケースなど。

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end

User has_many Postsという関係のときに、5件以上のPostsを持つUserの件数が知りたい。

> User.joins(:posts).group(:id).having('count(1) > 5').count
=> {1=>8, 6=>8, 9=>10}
-- 実行されるSQL
SELECT COUNT(*) AS count_all, "users"."id" AS users_id
FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
GROUP BY "users"."id"
HAVING (count(1) > 5)

そういうときは返ってきたHashに対してHash#sizeHash#lengthを呼べばいいだけなのだが…

> User.joins(:posts).group(:id).having('count(1) > 5').count.size
=> 3

ActiveRecord::Relation#sizeの呼び出しが外部モジュールで、結果をコントロールできないケース。

relation = User.joins(:posts).group(:id).having('count(1) > 5')

# このモジュール内で`count`が呼ばれる
ExternalModule.awesome_method(relation) 

できないというと嘘で、モンキーパッチなどの回避策はあるが、当面は自分側のモジュールだけで解決したく、group byのクエリをサブクエリとしてラップした新規のrelationを作って渡すことで回避した。

group_query = User.joins(:posts).group(:id).having('count(1) > 5')
relation = User.where(id: group_query)

ExternalModule.awesome_method(relation)
-- 実行されるSQL
SELECT COUNT(*) 
FROM "users" 
WHERE "users"."id" IN (
    SELECT "users"."id"
    FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
    GROUP BY "users"."id"
    HAVING (count(1) > 5)
  )

まぁ、本当に欲しいSQLは以下なのだけど。

SELECT COUNT(*) 
FROM (
    SELECT "users"."id"
    FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"
    GROUP BY "users"."id"
    HAVING (count(1) > 5)
  )

環境

関連

GitHub Actions workflowが完了したらデスクトップ通知を出す

Work with GitHub Actions in your terminal with GitHub CLI - The GitHub Blogにてアナウンスされた通りGitHub公式CLIghでworkflowの情報を取れるようになった。

記事中で紹介されているようにworkflowの実行が終わったらデスクトップ通知を出したりできる。

We’ve made it easier to stay on top of in-progress workflow runs with gh run watch, which you can use to either follow along as a workflow run executes or combine with other tools to alert you when runs are finished. Combining gh run watch with, on Ubuntu, a command like notify-send means more time to wander off from your keyboard and do something like pet a cat or gaze at a plant.

macOSではosascriptを使うことでデスクトップ通知を出せる。

function notify-github-actions-ci-finish() {
  gh run watch -i10 && osascript -e 'display notification "run is done!" with title "Terminal"'
}

alias nci=notify-github-actions-ci-finish

上記のようなaliasを.zshrcに登録し、git pushしたあとに呼び出す。するとworkflowが終わったタイミングで通知が来る。

f:id:ohbarye:20210501230345g:plain
通知のようす

git commit message でハッシュ # から始まるメッセージを残す

git commit コマンドでメッセージを入力する際、デフォルトでは # から始まる行は commit message から取り除かれる。この挙動を変更し、commit message にハッシュ # から始まるメッセージを残す方法について。

結論

git config で設定可能な以下のいずれかで対応できる。

  1. core.commentChar# 以外の文字、または auto を指定する
  2. commit.cleanup で cleanup mode をwhitespaceに指定する

StackOverflowの以下の質問に詳しい。

stackoverflow.com

なぜ消えるのか

これは cleanup と呼ばれる message の余分な文字列を取り除く仕組みによるもの。 cleanup が持ついくつかの mode のうち、ほぼデフォルトで使用されるstrip mode では空行や行末の空白やコメント行を取り除く。

cleanup mode は git config で設定するか、commit のたびにgit commit --cleanup=<mode>で指定することができる。

--cleanup=whitespaceを指定した場合の挙動はstrip mode とほぼ同じだがコメント行は残される。

利用可能な mode はman git-commit などで確認するとよい。

ref Git - git-config Documentation

コメント行とは

core.commentChar で指定した文字から始まる行はコメント行として認識される。core.commentCharのデフォルトは#

# 以外の文字を指定することで、#から始まる行はコメント行とみなされなくなるので commit message に残すことができる。

または auto を指定すると、git-commit は既存のコミットメッセージのどの行の先頭文字でもない文字を自動的に選択するようだ。賢い。

ref Git - git-config Documentation

個人的設定

global な.gitconfigに以下をcommentChar = ";"を設定した。たぶんセミコロン;始まりの commit message を書いたことがない…はず。

autoも面白そうだけど自動的に文字が選択されるのもちょっと挙動が読めなくて、問題が起きたときに気づけず混乱しそう…と日和った。

[core]
    commentChar = ";"

環境

$ git --version
git version 2.28.0

This article is for ohbarye Advent Calendar 2020.