There's an echo in my head

日々のメモ。

Claude Code がコミットメッセージや pull request に含める署名みたいな記述を無効にする方法

署名みたいな記述とは、

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

Generated with [Claude Code](https://claude.com/claude-code)

みたいなやつのこと。

調べてみたところ、 https://code.claude.com/docs/en/settings#attribution-settings によると ~/.claude/settings.json に次のように書けば良いらしい。

{
  "attribution": {
    "commit": "",
    "pr": ""
  }
}

includeCoAuthoredBy は非推奨になっていた。

macOS の Notes.app で装飾を省いたペースト(Cmd+Shift+V)っぽいことをする

Edit メニューの "Paste and Match Style" がそれっぽい動きをしてくれる。*1

ただこのショートカットキーがデフォルトだと Cmd+Ctrl+V に割り当てられて使いづらい。そこで、 macOS のキーボードショーカットの変更機能から割り当てを変更する。

  1. System Preferences → Keyboard → Keyboard Shortcuts... → App Shortcuts と開き、
  2. "+" ボタンから下図のように設定する

参考

*1:ちゃんと試していないけど、 Match Style とあるからには、装飾を一切省くというよりはペースト先の装飾に合わせて挿入するという動きなんだろう。どちらにせよ便利なのでこれで良い。

3泊5日のパリ旅行に行ってきた 〜Tips編〜

5月のゴールデンウィークの翌週に、パリに旅行に行ってきた。主な目的はELLEGARDENFEEDERのヨーロッパツアーのパリ公演に参加すること。フランスに行くのは初めてで、コロナ禍後の初めての海外旅行でもあった。

旅程

おおまかな日程は次のような感じ。合計3泊5日。

今回は日数が少ないので、パリ市内だけに絞って巡った。

移動手段

空路

飛行機は行きと帰り共にANAの羽田〜シャルル・ド・ゴール直行便を利用した。片道14時間。

なお、シャルル・ド・ゴール空港内では無料Wi-Fiが提供されている。もし現地での通信回線を事前に契約できていなかったなら、空港内でひとまずWi-Fiを繋いで、適当に契約すると良い1。回線は十分使える品質だった。

シャルル・ド・ゴール〜パリ市内

シャルル・ド・ゴールに着いてからパリ市内に向かうまでは次のように移動した。

  1. Terminal 1からCDGVALに乗って、Terminal 3に向かう(無料)
    • シャルル・ド・ゴール空港にはTerminal 1,2,3とあって、Terminal間は無料のシャルトルCDGVALが運行している
    • ANAが発着するのはTerminal 1
    • パリ市内に移動するRERのB線はTerminal 2,3から発着している
  2. Terminal 3でRERのB線に乗り換えて、パリ市内にある北駅(Gare du Nord)に向かう(有料)
    • Terminal 3はRERとしてはAirport Ch. de Gaulle 1という駅名になっている
    • チケットはカウンターでNavigo Easy(後述)と一緒に購入した

パリ市内の移動には地下鉄(Metro)を使った。バスも使えるが、今回は利用しなかった。

パリ市内のメトロでの移動には、Paris Visitéの5日券をNavigo Easyにチャージして利用した。このおかげで細かい交通費や切符購入のことを考える必要がなかった。ありがたい。

もうちょっと詳しく書くと、パリ近郊で利用できる交通系ICカードのNavigoシリーズは

  • カード(Navigo Easy, Navigo Découverte, など)
  • そこにチャージされるチケット(鉄道1回券、バス1回券、乗り放題券、など)

の二つを組み合わせて使うことになる。今回はその中でNavigo Easy(旅行者向け、証明写真が不要)というカードを買って、Paris Visité(市内や空港、ヴェルサイユ宮殿あたりまでが乗り放題)の5日券をチャージしたという感じ。カードの購入やチケットのチャージはメトロやRERの改札近くにあるサービスカウンターや券売機から行える。スマホのアプリからもチャージもできるらしい。券売機は英語が使えるし、空港のカウンターの担当者は英語が通じる2

この辺については、下記のブログ記事が参考になった。

なお、過去にはパリ中心地からの距離に応じて料金が変わるゾーン制というものが実施されていたが、これが2025年1月から廃止されて一律の料金体系に変わったらしい。そのため、古い記事にはゾーン制に基づいた古い情報が載っていることがある。また、過去にはMobillisという名称で一日乗車券が提供されていたらしいが、これも廃止されたらしい。ややこしいので要注意。

気候

5月のパリは寒い。今年のゴールデンウィーク前後の東京は昼が25度、朝晩が15度ぐらいだったと思う。それに対してパリは昼が20度、朝晩が10度ぐらいまで下がった。そのため、昼間はシャツ一枚でちょっと暑い、朝晩はその上にパーカーを着てもちょっと寒いし、なんならコートやダウンを着てもいいぐらいだった。3感覚としては、北海道に行くぐらいで考えると良い。

そして日は長くて、夜7時はまだまだ明るく、9時に陰ってきて、10時には真っ暗になっている。なので東京とは時間の感覚がちょっと違うように感じた。よく「パリは治安が悪いので、暗くなったら無闇に出歩かないように」と言われるけど、この時期なら9時までは全然気軽に出歩けるように思う。46月の夏至まではまだまだ日が長くなるんだろうな。

お金と貴重品

パリでは現金は一切使わなかった。5駅や空港はもちろんのこと、街中の小さい食料品売り場でもカフェでも本屋でも、ブラッスリのチップにもクレカのタッチ決済が使えた。6

加えて、スリが多いので財布やiPhoneはなるべく見せびらかさないほうがいい、ポケットにも入れない方がいいという事前のアドバイスもあり、次のようにお金と貴重品を運用した。

  • 決済は全てApple WatchのVISAタッチ決済を使う
  • 電車の移動にはポケットに入れてあるNavigo Easyを使う
  • 貴重品はボディバッグに入れて、バッグが胸側に来るように肩にかけておく。人が多い場所ではなるべく手をかけておく
    • 財布はボディバッグに入れておく。中身は最小限の現金(ユーロ)とクレカのみにする
    • iPhoneも基本的にボディバッグに入れておく。頻繁に利用するときにはポケットに入れるが、一緒に手を突っ込んでおいて抜かれないようにする
    • パスポートもボディバッグに入れておく。これは唯一のIDのため常に携帯する
  • 予備の貴重品はバックパックの見つけにくい奥深くに入れておく7
    • 残りの現金(ユーロ)とクレカ2枚
    • 帰国の渡航書に必要な写真と本籍地が記載された住民票、緊急時の連絡先8、保険の証券9、日本円とユーロ、クレカ1枚

このへんは出発数日前に見た https://www.youtube.com/watch?v=D_NKJDo0pP8 を参考にさせてもらった。10

なお、現地のお兄さんは結構尻ポケットにiPhoneを突っ込んでいたんだけど、こっちはアジア系の旅行者なので舐められるだろう…という感覚もあり、あまり真似しない方がいいだろう。

また、現地到着直後で雰囲気のわからない頃や、ライブハウスなど特に人混みが予想される場所では、腹巻き型のセキュリティポーチにパスポートと多少の現金、クレカを入れていた。バッグに入れている財布やiPhoneにもチェーンをつけて抜き出せないようにしていた。

フランス語

パリでは、ほとんどの人が英語を喋れる。フランス語でだけ話しかけられたのは、本屋ですれ違った70-80近いおばあちゃんぐらいだ。それ以外の、カフェやホテル、観光地、交通機関のスタッフ、本屋や雑貨屋の店主、観光地の押し売りも英語が話せる。しかも英語が聞き取れなくても丁寧に説明し直してくれる。すごく懇切丁寧だ。なので、英語が少しだけ喋れて聞き取れて、フランス語は全くできない自分でもなんとかなった。

それでもフランス語の、次の言葉は覚えておいてよかった。疑問形にしたいときは、英語と同じように末尾を上げれば良い。

  • Bonjour(こんにちは)
  • Bonsoir(こんばんは)
  • Merci(ありがとう), Merci beaucoup(どうもありがとう)
  • S'il vous plaît(お願いします)
  • Excusez-moi(すみません)
  • Pardon(もう一度言ってもらえますか)
  • Toilette(トイレ)
  • Laddition(お会計)

特に、英語が通じるにせよ、最初と最後の挨拶(Boujour, Bonsoir, Merici)だけはフランス語で伝えた方がいい。いきなり英語で始めるとぶっきらぼうに感じて、人によっては態度が一変するらしい。11

それとは別に、フランス語の発音ルールを覚えておくと、電車で駅名がアナウンスされたときに見当がつくので便利だった。自分は、世界一簡単なフランス語の本の冒頭に書かれている発音のルールを行きの機内で読んでiPhoneのメモ帳にメモっておき、↑のような頻出単語の発音と照らし合わせたり、駅名がアナウンスされるたびにチェックするというのを繰り返していたらなんとなく覚えた。

フランス語は英語にも取り込まれているし(例えば restaurant)、ラテン系の言語でイタリア語やスペイン語とも近いから応用が効くし、メジャーなブランド名でも目にすることが多いので、触れておくと便利だと思っている。12

旅行の内容はまた次回…

Tips 的な情報をまとめるだけで結構な文章量になってしまったので、具体的な旅行の内容はまた次回。

なお、今回旅行するにあたって「地球の歩き方 パリ&近郊の町」を参考にさせてもらった。2024〜2025版でも前述のゾーン制の説明が残っていたりするけど、全体感を得るのに便利だった。


  1. docomo(irumo)の国際ローミングを有効にしていたつもりが全然接続できなかったので、当日かなり慌てた。結局現地でdocomoのSIMを選択し、Wi-Fiを切った状態で https://roaming.docomo.ne.jp:444/ を開いて契約することでdocomo(irumo)を使うことができた。以前イギリスや北欧に行った際に利用していたahamoでは別個の契約をする必要がなかったので、不便だ。念のため予備でAiraloを使ってOrangeのeSIMも契約した。
  2. シャルル・ド・ゴールでParis Visitéを買うためにカウンターで注文した時、自分の英語がうまく伝わらず、鉄道1回券をチャージしてしまった。そのため、Gare du Nordで改めて券売機でParis Visitéをチャージした。
  3. あいにく下着、シャツ、パーカーしか持っていかなかったので、朝晩はちょっと寒かった。ただ歩きが多かったので、移動しているうちに暖かくなったなのでなんとかなった。
  4. なお、後述するように危ない人や押し売りは明るい観光地や地下鉄構内でも現れるので、明るいから無警戒になることは無い。
  5. 安全に済んだのは嬉しくありつつも、1ユーロ180円ぐらいの相場で1ユーロ400円かけて数万円を外貨両替して持ち込んでいたので、手数料ぶん手持ちが減ったので悲しい…。なお、羽田空港の手荷物検査場前にある空港運営の両替所を利用した。
  6. ちなみにクレカのブランドとしてはVISAとMasterが全ての店で使えた。AMEXとJCBは稀に使えるかなーぐらいだったので、基本使えないと思っておいた方が良い。
  7. ホテルにはセキュリティボックスがあったけど、ちゃんと開けられる自信がなかったので使わなかった…。
  8. ホテルや、日本大使館日本語の通じる病院などの電話番号と住所。タクシーに見せられるように現地語で。
  9. 今回は航空券をクレカで決済したので、その旅行保険が付帯される。それに加えてエイチ・エス損保で契約した。ただ、今見返してみると、クレカの旅行保険の傷害死亡保険金額が5000万円を超えているので、エイチ・エス損保の契約条件を満たしていなかった…。何もなくてよかった。
  10. 前述のAiraloもこの人の動画で紹介されていたので、事前にインストールしてあった。
  11. この辺の事情は帰りの飛行機で乗り合わせた日本人のおばちゃんも言っていた。「地方の人も英語は喋れる。ただし挨拶だけはフランス語にするのが大事」
  12. 一方で、今回の旅行で自分の英語の使えなさが身にしみてわかったので、まずはそっちを鍛える必要があると痛感している…。

分割したGemfileを読み込むときにはeval_gemfileを使う

https://r7kamura.com/articles/2022-06-13-eval-gemfile で紹介されているとおりなんだけど、 Gemfile を複数ファイルに分割して読み込むときには eval_gemfile を使うと良い。

例えば

your-app
├── gemfiles
│    └── Gemfile.common.rb # 複数 Gemfile 間で共通の gem が宣言されている
└── Gemfile # Gemfile.common.rb に加えて追加の gem が宣言されている

みたいな構成をしているとき、 your-app/Gemfile には次のように記述できる。

eval_gemfile "gemfiles/Gemfile.common.rb" # 相対パスで指定できる

gem "foo"

これは次のような eval を使った書き方とほぼ同一である。

eval File.read(File.expand_path("../gemfiles/Gemfile.common.rb", __FILE__))

gem "foo"

ただし、 dependabot を利用している場合には eval_gemfile を使う必要がある。これは、 dependabot が読み込むファイルをリストアップする際に eval_gemfile を使って依存関係を辿る(今回だと Gemfile.common.rb の存在を検知する)*1ためである。

もし eval_gemfile を使っていない場合には、このリストアップ対象から除外され、 dependabot の処理対象から除外されて次のようなエラーが発生する。

Bundler::Dsl::DSLError with message: [!] There was an error parsing `Gemfile`: No such file or directory @ rb_sysopen - dependabot_tmp_dir/gemfiles/Gemfile.common.rb. Bundler cannot continue.

位置引数とキーワード引数の互換性を考慮した YAML.safe_load の aliases オプションの指定方法

RubyYAML (およびその実装である Psych)の safe_load メソッドでは、 エイリアスの記述を許可するために aliases オプションで true を指定する必要がある。

ただし、 safe_load メソッドの aliases オプションは、 YAML のv3.0までは位置引数、v3.1からはキーワード引数に変わっている点に注意する必要がある。

そのため、互換性を考慮すると、次のようにバージョンに応じて呼び出し方を切り替える必要がある。

major, minor, _ = YAML::VERSION.split(".")
if major >= "4" || (major == "3" && minor >= "1")
  YAML.safe_load(source, aliases: true)
else
  YAML.safe_load(source, [], [], true)
end

ちなみに、v3.0以前で aliases キーワードを使うと次のような例外が発生する。

ArgumentError:
       unknown keyword: aliases

MONOEYES / The Unforgettables Tour 2024 at Zepp DiverCity Tokyo

17時ぐらいに現地に着いて、ロッカー確保、そしてフードコートで早めのごはんに広島焼き。

開場から少し遅れて入り口へ移動。後ろでゆっくり見るつもりだったけど、整理番号が3xxと意外と早かったので、せっかくの機会だしと一番前のブロックに行った。上手側、トディ前。

途中まで手すりのところにいたんだけど、いつのまにかモッシュの中にいてダイバーを持ち上げていた。去年の浜松窓枠では眼鏡が吹き飛んで途中から何も見えなかったけど、今年は忘れずコンタクトで来たから大丈夫。

トディのギターはSagoではなくGibsonのSGだった。ウェザーチェックの反射がかっこいい。アンプはFriedman。これは細美さんも同様で、Diezelから乗り換えたのかな。

気付けばもみくちゃの汗だくだったので、元々事後通販する予定だったTシャツを急遽買い、着替えて帰った。ハードな時間だったけど、一瞬だったなあ。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。