| @Mac/iPhone

iPhone を買い換えた。 14 Pro → 17 Pro 。カメラの出っ張り面積がでかくなり、横にボタンが増え、 iPhone でも Apple Intelligence が使えるようになり、充電が USB-C ケーブルになった( MagSafe を使うのでケーブルで充電することはほぼないが)。

iPhone 17 Pro の感想はごまんとネットにあるので買い換えて困ったこと、特に CarPlay について書く。

うちの車は 2020 年に買った Jeep の Compass で、 CarPlay に対応している。もうちょいあとのモデルだと車側のジャックは USB-C になるが、うちのはまだ USB-A 。これまでは USB-A → Lightning ケーブルで問題なくカーナビに接続して CarPlay を使えていた。

iPhone 17 Pro になったので、家に適当にあった USB-C → USB-A ケーブル(リズムのハンディファンについてきたもの)を使ってみたところ、充電はされるがカーナビ側から iPhone が認識されない。

NIKON Z6 を買ったときに同梱されていた USB-C → USB-A ケーブルを使ったところ、カーナビから認識はされるが 10 秒ほどで接続が切れる。 CarPlay 側の解像度も低くて嫌な感じ。

これはきっと転送速度が不足しているのだろうと、 USB 3.0 に対応した Anker の USB-C → USB-A ケーブルを買って試してみた。転送速度は 5Gbps なので速度不足になることはないだろうと思っていたが、 Z6 の付属ケーブルに比べれば多少長く接続されるものの、 20 秒もすると接続が切れてしまう。

ここに来て ChatGPT に相談すると、 USB 3.0 はカーナビのチップが認識できずハンドシェイクで失敗している可能性があるので、 USB 2.0 対応で転送速度が 480Mbps 、 Anker などの信頼できるメーカーのものを買えとアドバイスされた。

4 回目のチャレンジで Anker の高性能すぎない 480Mbps の転送速度に対応した USB-C → USB-A ケーブルを買ってみたところ、これまでで一番長く接続が維持されたが、それでも時々接続が切れて不安定になる。 USB-C ケーブルは端子が同じでも品質・規格が同じとは限らず、地獄のような状況だと思い知らされた。ハイスペックなものを買えばいいという訳ではないというのが何より地獄。これだったら MFi 認証が必要な Lightning ケーブルの方が品質が安定していてマシではないか。

「車自体を買い換えないともう CarPlay は使えないのかなぁ、 iPhone のために車買い換えるとかどんだけアホなんだ」と諦めかけていた日にぼーっと Instagram を見ていると、自分の検索履歴を知っているのか、広告で CarPlay を無線接続できる機器が出てきた。最近の新しい車は CarPlay の無線接続に対応しているらしいが、旧型の車のカーナビでも無線接続できるデバイスがあるようだ。その製品は Ottocast MINI Slim という製品で、 Amazon で 6999 円で売られていたので購入してみた。

Ottocast MINI Slim

Amazon のレビューでわずかに遅延すると書かれていた。確かに有線接続に比べたら遅延するが、ブチブチ接続が切れるよりも遙かにまし。何より CarPlay が無線で使えることがこんなに便利だとは思わなかった。車に乗って iPhone をケーブルで接続して、とやらなくても勝手にカーナビに接続されて CarPlay の画面になる。ちまちま乗り降りして買い物して回るときなど煩わしかったが、ケーブルの抜き差しが不要になってとても便利。しかもとっても小さくて邪魔にならない。これは買ってよかった。

Instagram にターゲティングされて広告を出されるのムカつくと思っていたが(メンタル病んだ中年男性向けのセラピーアプリの広告がやたら表示される)、今回ばかりは便利だった。

| @登山/ランニング

Garmin Epix Pro

検証用に会社の予算で Garmin の Fenix 7 Pro を買ってもらって 3 ヶ月ほど使ってみた。かなり気に入ったので個人で Garmin の Epix Pro を買い、 Apple Watch から乗り換えることにした。

これまで自分は、走ってる時間よりも日常を過ごす時間の方が長いから、日常生活で便利な Apple Watch を使うのがいいと思ってきた。しかしハードウェア的な設計の良さとランニング支援機能で Garmin の便利さが身にしみてわかり、 Apple Watch から Garmin へとスイッチするに至ってしまった。

これまでのスマートウォッチ遍歴

自分はランニングをはじめて以来、 Apple Watch をずっと使ってきて、 Ultra も買ったが、普段のランニングで使うには重すぎて定着しなかった(ノーマルの Apple Watch だとバッテリーが持たない長いトレランのレースでは重宝した)。

日常をともにする時計としては Apple Watch が便利なのだが( Apple Pay 、 Siri 、 Mac の認証・ロック解除、プッシュ通知の受け取り)、トレーニングについてのサポート機能が不足していると感じて COROS の Pace 3 も買ってみた。

COROS Pace 3 を使ってみて感じたこと

COROS はトレーニングの指南をしてくれるのは便利だと思ったが、 Apple Watch を置き換えるほどでもないなと思った。なにより COROS Pace 3 は軽いのはいいのだがプラスチッキーで質感があまりよくなく、バックライトの点灯やバイブレーションといったハードウェア部分の作り込みが甘いと感じた。

バッテリーは Apple Watch よりかは断然持つが、ナビゲーションをオンにして使っていると 24 時間くらいしかバッテリーが持たず、 100 マイルのトレランレースで使うのは厳しい。自分は 112km の ASO VOLCANO TRAIL に COROS Pace 3 を着けて出走したが、 25 時間かかったのでバッテリーがギリギリになり、最後の 20km くらいはナビゲーションをオフにして走った。

Fenix 7 Pro で一気に解消された不満

Garmin Fenix 7 Pro を使ってみたところ、 Ultra を含む Apple Watch や COROS Pace 3 に対して感じていたソフトウェア・ハードウェア的な不満が解消されてとっても気に入ってしまった。

スマートフォン用アプリのビジュアルデザインは COROS の方が優れているのだが、健康管理とかトレーニング指南的な機能は Garmin Connect の方が優れていると感じる。 Apple Watch の場合、 Apple のヘルスケア・フィットネスアプリは iOS 26 になって以前よりかはマシになったとは言え、踏み込んだアドバイスをしない。

一方で Garmin Connect では Body Battery や Training Readiness なる指標があって、トレーニング状態と睡眠時間、 HRV (心拍変動)からその日の体調を推測し、最適なトレーニングメニューまで提案してくれる。

タフなハードウェアと圧倒的なバッテリー

ハードウェアもよくて、 Fenix 7 Pro はチタンベゼルでガラスはサファイアガラスなのでめっちゃ頑丈。全然傷が入ったりしない。

バッテリー時間もメチャ長い。結構ランニングするタイプの人でも一週間に一回充電すれば十分。 3 ~ 4 日程度の出張なら充電のことを気にする必要がない( Apple Watch は充電器を忘れないように気をつけないといけない)。

COROS Pace 3 はバックライトの点灯やバイブレーションが野暮ったいとは先ほど書いた通りだ。これらは Apple Watch が最も洗練されているが、 Garmin は COROS と Apple Watch の中間といった感じ。 Apple Watch ほどよくはないが、うんざりするほどでもない。

重さは気になるかなと思ったが、シリコンベルトと本体の重量配分がちょうどいいのか、走っていて重たいと感じたことはない( Fenix 7 Pro は 73g )。

地味だけど圧倒的に便利な「LEDフラッシュライト」

そして Garmin Fenix 7 Pro で最もよいと思っているのが LED フラッシュライトで、夜に帰宅して玄関周りの暗がりを照らすときや、夜中に目が覚めてトイレに行くときにも便利。山に行ったときに下山が遅くなってヘッドライト付けたらまさかの充電忘れで点灯せず、暗闇のなかを Fenix のフラッシュライトを頼りに下山したことが一回あった。

フラッシュライトが付いてるだけでも素晴らしいが、仮に Apple Watch にフラッシュライトが付いてたとしても、 10 時間近い山行で使った後であればおそらくバッテリー切れ寸前で、フラッシュライトに使える電力は残っていないだろう。 Garmin Fenix 7 Pro なら 10 時間使ってもバッテリー残量はまだ 50% 以上あって、余裕でフラッシュライトを使うことができた。

こういう経験があって、山に入るときは Garmin は非常に頼りになるというか、「もはや欠かせない存在」と思うようになった。

心配だったこと: 音声コントロールと Apple Pay

Apple Watch で便利なのが音楽や Podcast のコントロールだ。走りながら聞いてる Podcast を 10 秒戻したいことが多々あるが、そういうときに Apple Watch は 1 スワイプと 1 タップで操作ができて便利だった。 Garmin だとチャプタースキップしかできないし、音楽コントロールは DOWN ボタンの長押しが必要で面倒。

しかし音楽や Podcast を聞いている時間は走っているときよりも電車に乗っているときや歩いているときが圧倒的で、そのときは iPhone をポケットから出して操作すればいい。

自分は電子マネーは iD 派だが、 Garmin は Suica しか使えないので不便になると危惧していたが、 iD を使うのはコンビニくらいだし、iPhone の Apple Pay で iD は使えるので問題なかった。

唯一の不満:Siri がいない

唯一不満があるとすれば「 Hey Siri 」と時計に向かって言っても反応がないことだ。 Apple Watch は料理するときにキッチンタイマーとしてフル活用していた。手が塞がっている状態でタイマーをセットできるのはとても便利だ。 Garmin の場合は手で時計を操作するか、 iPhone 側の Siri を使うしかない。

まとめ

iPhone 、 Mac との連携や Apple Pay が使える点などはやっぱり Apple Watch の方が便利だ。でも山やランニングで使う場合は Garmin の方が便利だ。ハードウェアとソフトウェアを同じメーカーが作ってる強みを感じる。 Apple Watch はサードパーティーがアプリを提供できるが、ランニング支援や健康管理は本体のハードウェアや OS の設計に依存する部分があるため、 Garmin ほどにはアウトドアアクティビティに特化したアプリが作りづらく、 Apple Watch は Garmin を置き換えられる存在にはならないだろう。皮肉にも Mac や iPhone 、 iPad の使い心地の良さと同じ構造がアウトドアウォッチでも働いている。

お買い得情報

Garmin は Fenix 8 が出てめっちゃ値段が上がった。検証用に買った Fenix 7 Pro は在庫一掃の売り切りセールで 78000 円くらいで買えた。 Epix Pro も現行の Gen 2 は 2023 年に発売されたのでもうそろそろ新モデルが出るかもしれないが、おそらく価格がガッと上がると思われる。一方で Fenix 8 と同じ進化だとすると音声コントロール機能がつくくらいだろうと思われ、ぶっちゃ音声コントロールとかは Apple Watch の方がよくできてるはずなので大して期待できない。現行の Epix Pro を安く買うのがおすすめ。 Amazon アウトレットで 7 万円台で出てることもある(自分もそれで買った)。

| @写真

2025 年 9 月の出来事

  • iPhone 17 Pro を買った
  • 冷や汁をよく作って食べた
  • 月蝕を見た
  • コテンラジオで伊藤野枝のエピソードを聞いた(伊藤野枝は今宿出身)
  • Audible で『国宝』を聞き始めた
  • Docker イメージの手入れカテゴリー・タグ検索の実装
  • 8 月に引き続いてあまり走れず、月間走行距離は 123km

| @ブログ

カテゴリー検索

ふと思い立ってカテゴリーで検索できるようにしたら便利だろうと改修してみた。 Tantiny には facet_query というものがあって、カテゴリー名などは検索インデックスの型を facet にしておくと、カテゴリーだけを検索対象にできる。実装してみたところ便利。カテゴリー内の記事一覧ページを表示する機能はあるが、本文やコメントなども読み込むため遅い。タイトルだけ一覧でがっと欲しいときにカテゴリー検索は便利。

同様にタグでも検索できるようにしてみた。こちらは term_query を使っている。本文の検索は検索キーワードを形態素解析してトークナイズされた文字列で検索しているが、タグ名での検索は exact match をするようにしている。なので過不足あればヒットしない。完全一致で検索したいときに便利。

ただ、これまで記事にタグを設定してこなかったのでタグ未設定の記事が多い。ということで ChatGPT に記事の内容を読ませてタグを自動生成してもらうようにした。ちょっとへんちくりんなタグを設定することもあるが、文脈を読んでタグを設定してくれる。本文中にキーワードはないけど記事の内容に合致するタグを選んできたりもする。賢い。

ちなみに今回 ChatGPT のモデルを gpt-4o から gpt-5-mini に変更した。 GPT 5 系に移行するためには Chat API から Responses API への移行が必要だった。最初それがわからず難儀したが、 Responses API の方がパラメーターがシンプルで使いやすい。例えば JSON のフォーマットを指定したいとき、 Chat API だと JSON Schema で定義を書いて渡す必要があったが、 Response API であればプロンプト中に「こういうフォーマットでくれ」と書けばそのフォーマットで返してくれる。すごい。

require 'openai'

class EntryTagGenerator
  MODEL = 'gpt-5-mini'
  PROMPT = <<~EOF
添付のブログ記事に関して、文章の内容を反映したタグを付与してください。ただし、以下の条件を遵守してください。

1. ブログ全体のタグの一覧は「 %s 」です。ふさわしいものがあればそこから利用してください。なければ新しいタグを考えて設定してください。
2. タグの数は最大で 5 個までとします。
3. すでにタグが付与されている場合は、現在のタグを加味して 5 個までタグを付与してください。現在のタグが内容にふさわしくなければ削除しても構いません。
4. タグは極力一語で構成されるようにしてください。固有名詞の場合はその限りではありません。
5. 略語は避けてください。固有名詞の場合はその限りではありません。
6. 「減量ダイエット」のような意味が重複する二つの単語で構成されるタグは付与しないでください。固有名詞の場合はその限りではありません。
7. タグは半角スペースを含んでも問題ありません。"GoogleAnalytics" ではなく "Google Analytics" でよいです。
8. レスポンスは JSON フォーマットで、以下のような形式にしてください。

\```json
{
  "tags": ["tag1", "tag2"...]
}
\```

# ブログ記事 #

## タイトル ##

%s

## 本文

%s

## すでに付与済みのタグ

%s
EOF

  attr_reader :response

  def initialize(title, body, tags)
    @title = title
    @body = body
    @tags = tags
    @client = OpenAI::Client.new(access_token: ENV['OPENAI_API_KEY'])
  end

  def generate
    @response ||= begin
                    request = @client.responses.create(
                      parameters: {
                        model: MODEL,
                        input: input,
                        reasoning: { effort: 'minimal' }
                      }
                    )
                    JSON.parse(request.dig("output", 1, "content", 0, "text").strip)
                  rescue => e
                    puts "タグ生成エラー: #{e.message}"
                    nil
                  end
  end

  def input
    PROMPT % [Tag.joins(:entries).pluck(:name), @title, @body, @tags]
  end
end

| @技術/プログラミング

いろいろあって手元で docker build が通らなくなってしまったので ChatGPT に相談したら Alpine Linux はビルドが遅くなるので Debian Slim に変えた方がよいと言われてガチャガチャやった。BuildKit を使ってキャッシュせよとも言われたけど、逆にビルドにめっちゃ時間かかるようになったので BuildKit は使わずに普通にビルドしてる。 Apple Silicon の Mac で Linux で動かすように linux/arm64 でビルドしてたけどこれが遅い原因だと散々言われた。クロスプラットフォームで BuildKit のキャッシュを使うとめっちゃ遅くなるらしいので逆効果だった(半日以上ビルドしても終わらないてことがざらだった)。

Docker 、これまで Alpine ベースのイメージを使ってたせいで自前でいろいろコンパイルしたりインストールしたりしてたけど、ビルド済みのものをダウンロードしてくる運用はやっぱり楽。 Alpine 使っても最終的なイメージサイズは膨大になってたし、もっと早めに Debian ベースに変えればよかった。

ちなみにビルドが通らなくなったのは tantiny が依存する rayon という Rust のライブラリが Rust 1.8 以降でしか動かなくなったため。 tantiny は Rust 1.77 までしかサポートしてないので Rust のバージョンを 1.77 で固定していたが、このせいでビルドにこけるようになった。なので tantiny をフォークして rayon と rayon-core のバージョンを古いバージョンに固定した。

tantiny および tantivy は楽に運用できる非常に優れた全文検索ライブラリだと思うけど、 tantiny のメンテナーの人が仕事で使わなくなったそうでメンテナンスされてないのが悲しい。自分でできるならやりたいが、職業プログラマーではないし Rust わからんちんなのでどうしたもんか…。

| @写真

2025 年 8 月の出来事

  • 東京出張のついでに山と道、ハイカーズデポ訪問。高尾山にも登った
  • 会社の TGIF にローストビーフ持って行った
  • 実家に帰省した際に杵島岳に朝駆け
  • 国見岳山頂祠再建の歩荷ボランティアに参加
  • 国見岳ボランティアの帰りに甲佐のたこやき大阪蜂来饅頭でたこ焼きを買い、亡き祖母を偲ぶ
  • 月間走行距離は 107km (6ヶ月連続月間 200km オーバーならず 😢)

| @登山/ランニング

福岡マラソンにまた今年も出る。昨年はネットタイムでギリギリサブフォーだったが、グロスタイムでは4時間を切れていなかった。ゴール後、やっとサブフォーできたと思って携帯を開いたら元同僚の速いランナーから「サブフォー惜しかったですね」とメッセージが届いていた。ガチラン勢からするとネットタイムの記録は正式なものではないらしい。なので今年こそはグロスタイムでもサブフォーやったろうと思う。

走り込みなどの練習をやるのはもちろんだが、今年は体重をできる限り落とそうと思う。以前読んだランニングについての本で、体重を1kg落とせばフルマラソンのタイムは3分縮められると書いてあった。減量を決意したタイミングで69kgくらいだったので5kg落として64kgを目指したい。本の理屈に従うなら、体重を5kg落とすだけで15分タイムを縮められることになる。BMIは21.6、体脂肪率は15%を目指したい(それぞれ現在は23.3、20.9%)。

この要件を ChatGPT に伝えたら計画を立ててくれた。

ChatGPT による減量計画

これを Numbers に転記して週次で体重、体脂肪をトラッキングしている。

週次減量計画

計画・実績グラフ

ダイエットアプリは何がよいかも相談して、 MyFitnessPal とあすけんだったら日本人には和食のデータが充実してるあすけんの方がよいと教えてくれたのであすけんを使うようになった。あすけん、ポップアップが断続的に表示されて UI は良くないしサーバーが遅くてイライラするけど、アプリ内の飽きさせない企画とかはよく考えられてるし(職場でプロダクトマーケティングしてる同僚に使わせたい)、食品データの豊富さも便利。

週次のグラフには現れてないけど、先週結構頑張って体重が 65kg 台になったので引き続き頑張って体を絞っていきたい。

ダイエットだけでなく、ランニングの目標管理・レビューも ChatGPT にしてもらってる。 ChatGPT が適度に励ましてくれるおかげか、 5 ヶ月連続で月間 200km オーバーの走行距離を維持できてる。これまで専門的なトレーナーとかコーチにつかないとやる気を引き出すのって難しかっただろうけど、 AI がそれを肩代わりしてくれるようになってきてる。

AI が肩代わりできるのは知識の領域だけで、人を励ましたりするのは人間にしかできないと思ってたけど、 AI でもやれるっぽい。どんどん人間ができることが減ってきてる。ちょっと恐ろしくもある。