| @登山/ランニング

今宿から見る百道の夕景

2024 年シーズンのマラソンの振り返り。 2024 シーズンは以下のレースに出た。

  1. 福岡マラソン
  2. 宮崎青島太平洋マラソン
  3. 熊本城マラソン

福岡マラソンに関しては個別に記事を書いた。ギリギリだがネットタイムでサブフォーできた。

福岡マラソンはなかなか良かったのだが、その後がダメダメだった。

青島太平洋マラソン

おぐらのチキン南蛮

シーズン二本目は青島太平洋マラソン。フラットなコースで記録を出しやすいと聞いていたのでエントリーしていた。福岡マラソンでサブフォーできなかったときにサブフォーを狙うための本命レースだと捉えていた。しかし想定外にもシーズン一発目の福岡マラソンでサブフォーできてしまったので練習に身が入らず、 30km 走もやらないままに本番を迎えてしまった。

前日入りした宮崎ではサウナに入ってチキン南蛮の名店おぐらに行って大盛りご飯を食べて食べ過ぎ状態となり、スタート直後からずっとお腹が重く、なんとレース中に初めて💩をしてしまった。ドン引き。

アオタイは 2023 年は暖かかったと聞いていたので Teton Bros. の Elv 1000 Sleeveless で走ったら、この年は寒く、特に高架の道路を走る区間で海風にさらされて体が冷えた。寒い時期のマラソンは汗抜けの良さよりも体幹部の温度を過剰に失わない工夫の方が大事だと思い知らされた。

32km 地点くらいで💩を出してからはペースを落として最後はファンランのようなペースでゴール。マラソン初挑戦したときの福岡マラソンよりも遅いタイムだった。

アオタイは高架道路を緩やかに登るのを繰り返すし、カーブ部分では路面が傾斜しているので足首に負担が来る。遮るものがないので海風をもろに受ける。各所でスライドが多く、歩行者の横断のためにコースが所々狭まったりするので結構走りづらいと感じた。福岡から宮崎はだいぶ遠いので、一回出たらもういいかなというのが正直なところ。観光しに来て朝こどもの国のあたりを緩くジョグするのは楽しそう。

熊本城マラソン

ゴール後の著者

こちらも二年連続出走できた。去年悔しい思いをしたのでリベンジを果たしたかったのだが、マラソンワースト記録を樹立するという屈辱的な結果となってしまった。

敗因は色々ある。まずは練習量の圧倒的な不足。仕事が忙しく、なかなかランニングのリズムを生活のなかに作れなかった。年末に風邪を引いたことも良くなかった。これで完全にランニング習慣が途絶えてしまった。加えて本番一週間前の牡蠣の食あたり(ノロウイルス)。一月から二月にかけては一週間の練習回数が一回、週間走行距離は10kmのようなていたらくだった。

次にシューズのミス。なんとマラソン用のシューズ( ASICS MAGIC SPEED 2 )と間違えてトレランシューズ( ALTRA OLYMPUS 4 )を持ってきてしまっていた。詳しくは個別に記事を書いた。

シューズがベアフットシューズだったこともあり、 20km 手前で力尽きてペースを落とした矢先に計測マットに足を引っかけて激しく転倒してしまった。右肩と肘のあたりを強打して結構血が出ていたし、靴も転倒で破けてしまったのでここでやめようかなとも思ったけど、とりあえず救護所まで行こうと走っているとなんとか走れた。ハーフ地点の救護所に寄って傷の応急処置をしてもらい、その後ゴールまでゆっくりジョギングすることにした。転倒時につった両足ふくらはぎが痛み、歩いたり走ったりを繰り返した。

転倒したせいで開き直って、記録を狙うマラソンでは食べない給食を積極的に食べた。熊本城マラソンはランチパックとか菓子パンとか一杯あった。いちごもいっぱいあったのでたくさん食べた。

去年走ったとき異常につらかった熊本港方面への直線は去年ほどつらくは感じなかった。去年は誰も知ってる人がいないためとても孤独に感じたが、足がハチャメチャにつっていたので沿道で冷却スプレーを持って応援してる人のところに駆け寄ってスプレーをしてもらうのを何度もやって、親戚のおばちゃんに励まされながら走ってるような気持ちになった。熊本を離れてもう 15 年も経つが、故地のような感覚はずっと持っている。もし熊本で就職していたらどんな人生を送っていたんだろうと想像しながら熊本城への道を走った。

最後、第一高校の裏手から熊本城への登りはきつかった。今年はかなり歩いたが、最後の最後の二の丸広場へ駆け込む登りはつって言うことを聞かなくなってるふくらはぎにむちを打って無理矢理走った。

練習不足、意図せずベアフットシューズで走ることになったこと、 20km 地点での転倒などトラブルだらけのマラソンだったが、リタイヤせず最後まで走れたことは福岡マラソンでのサブフォーよりも達成感があった。

熊本城マラソンに関してはめっちゃ悔しいので来年もう一回チャレンジしてみたい。熊本でサブフォー達成して故郷に錦を飾りたい。

総括

福岡マラソンでギリギリサブフォーできたのはよかったが、課題の残るマラソンシーズンだった。月間 200km 走れていないのはまずい。週末のロング走が足りてない。 COROS アプリによると、ランニングレベル分析のうち、乳酸閾値レベル、スピード持久力、スプリントは 77 以上あるのに、有酸素レベルが 74 しかない。閾値走やインターバル走よりも、有酸素持久力ゾーン( 5'46" ~ 6'51" )でのジョグをみっちりやるべきなのだと思う。 10km くらいではなく 20km くらい。

とりあえずマラソンシーズンは終わったのでトレランしたり登山したりしていこうと思うけど、来年悔しい思いをしないよう、週末のロング走を今年はちゃんと頑張りたい。

| @登山/ランニング

XERO SHOES HFS

熊本城マラソンに出場した。意図せずベアフットシューズで走ることになってしまった。なんとマラソン用のシューズ( ASICS MAGIC SPEED 2 )と間違えてトレランシューズ( ALTRA OLYMPUS 4 )を持ってきてしまっていたからだ。 OLYMPUS は重いし微妙にサイズが合っていないので、迷ったあげく、普段ばきや短い距離でのランニングに使っている XERO SHOES の HFS (ベアフットシューズでソールの厚みが 7.5mm )でフルマラソンを走ることにした。

ベアフットシューズでの生活はもう 3 年くいらいになるが、ランニングでベアフットシューズを使うのはせいぜい 20km くらいの距離までで、フルマラソンをベアフットシューズで走るのは未体験だった。

スタートしてから前半の 18km 地点くらいまでは 5:45/km ~ 5:50/km くらいのネガティブスプリットでサブフォーを狙えるくらいのペースで走れていたが、後半にペースを上げるのは厳しいだろうという感触があった。 18km 地点でこのままではゴールまで足がもたないと悟り、真面目に走るのを諦めてジョグのペースに切り替えた。その後転倒したりもしたが、歩きを挟んでなんとか完走することができた。

ベアフットシューズはふくらはぎのヒラメ筋への負荷がすさまじいので、フルマラソン完走となるとかなり鍛えていないと難しいと思う。普段はベアフッ党の方でも本番はちゃんと厚みのあるソールのシューズを履くことを激しくおすすめする。どうしてもベアフットシューズでマラソン走りたいなら、当然に 30km 走をベアフットシューズでこなしておくべきだと思う。ワラーチや裸足でマラソン完走する人はマジですごい

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

先週末と今日ガチャガチャやって、ようやく Ruby 3 にアップグレードすることができた。 Ruby 2.7.3 → Ruby 3.1.6 。ただ Ruby 3.1 は今年の 5 月に EOL を迎えるみたいなのでこちらもさっさと新しいバージョンの Ruby に上げないといけない。

やったことは一つ前の記事に加えて以下。

kaminari-sinatra の SinatraHelpers が Ruby 3 & ActionView v6 対応していなかったのでちょこちょこと修正した。

次に padrino-helpers が Ruby 3 と Haml v6 に対応していないのを対応させた。具体的には form_tag の中身のタグが過剰に escape されてしまうので、あんまり良くないかもだが capture_html したやつを html_safe した。 form_tag の内側に来るものはユーザー投稿コンテンツではないはずなのでエスケープはサイト管理者側でできるはず。

ドキュメントでは

= form_tag

!= form_tag

にしろとは言われているが、 form_tag の中身で concat_contet してる片方( capture_html(&block) の結果)が html_safe? => false になるので、 View テンプレート側で何かやっても意味がない( Buffer が汚染されると View で html_safe しても汚染された部分の文字列はエスケープ済みになっている)。

kaminari-sinatra も padrino-helpers も本家にパッチを送ると良いのだろうが、職業プログラマーではなくなったのでなかなか腰が重い。 kaminari-sinatra はテストが通らないし、 padrino-helpers は git clone で submodule の clone に失敗するのでテストが実行すらできないかもしれない。

心の余裕ができたらやってみる。

ちなみに Ruby 3 化するにあたり sinatra-cache を完全に捨てたので負荷が上がるかも。オリジナルの gem は 15 年くらいコミットされてなくて fork して使い続けてきたけど Sinatra や Haml の変更に追従できる気がしないのでいったん捨ててみる。

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

このブログは Ruby 2.7 でずっと動かしていた。コミットログをたどると 2020 年の 1 月から Ruby 2.7 のようだ。 Ruby 2.7 は 2023 に EOL を迎えている。

さすがにまずいと思ったので Ruby 3 にしようと一日頑張ってみたが、なかなかうまくいかない。Ruby 3 の キーワード引数の仕様変更はかなり対応がきつい。どこで ArgumentError が起こっているのかが極めて追いかけづらい。他のメソッドに委譲している場合などは特に。

ガチャガチャやってトップページと個別記事ページまでは Ruby 3 化できたので Ruby 3 でデプロイしてみたが、動かない画面があることに気がついたので Ruby 2.7 に戻した。 Kaminari がちゃんと動かない(具体的には kaminari-sinatra と actionview v6 系の互換性がない)のが原因でページネーションするページがちゃんと動かなそうだったので Ruby 3 化は諦めた。 kaminari-sinatra の ActionViewTemplateProxy#initialize を actionview v6 対応させないと無理っぽい。

kaminari のような有名な gem の派生 gem ならきちんとメンテされてるかなーと思っていたが、 kaminari-sinatra の最終コミットは 4 年前だった。

Ruby で View まで作る人たちはほとんどいなくなってるのだろう。

なお動かないところのデバッグは ChatGPT と対話しながらやった。めっちゃ便利。一人だと気がつかないような部分のコードを見てみろと ChatGPT が言ってくれて、そこにデバッグコードを入れてみるとビンゴだったりする。便利な世の中になった。

忘れないようにやったこと・気づいたことをメモっておく。

  • sinatra は v4 にあげないといけないのでパスの正規表現から ^$ は消さないといけない
  • better_errors の REPL がちゃんと動かないので Backtrace を見たいときはログを開くか better_errors を使うのをやめる
  • fork していた sinatra-cache は sinatra 4 では動かないので外した(キャッシュできない部分をどうするかは要検討)
  • capistrano-puma も Ruby 3 対応させないといけない(期待される systemd のフォーマットが変わっているので単にデプロイするだけではだめで一部手作業が必要)
  • tilt は v2.1.0 に固定( Tilt::ErubisTemplate クラスが消えるため、 padrino-helper がエラーを出す)
  • concurrent-ruby は 1.3.5 未満に固定
  • compass は 1.0.3 に固定
  • SESSION_SECRET は 64 文字以上にする
  • haml の過剰な escape を抑制
  • kaminari-sinatra の ActionViewTemplateProxy#initialize を actionview v6.1.7.8ActionView::Base#initialize に対応させる

| @ブログ

人気記事を確認できるようにしたという記事を以前書いている。もう 7 年も前のことのようだ。

調べればこういうログ集約・集計系のサービスはあるようだったが、個人ブログなのでなるべくお金はかけたくない。

しばらくの間は集計後のログを捨てていたが、 2 年半前からログローテートするタイミングで日付ごとのファイルを書き出し保存するようにしていた。日付ごとのログファイルは Amazon の S3 にアップロードしてさくらの VPS サーバーからは待避させている。現状、 2022 年の 6 月 13 日のログから S3 上にデータが残っているので、その日以後の日ごとの人気記事を確認できるようにした。こんな感じ。

日付の選択は最初 React のライブラリを使って作ろうかと思ったが、そういや最近のブラウザーは <input type="date" /> とすると結構ちゃんとしたカレンダー UI と日付選択の機能を提供してくれるので楽をすることにした。

max と min を指定すると選べない日付は非活性にされるし、無理に選択すると form を submit したときにバリデーションしてくれる。

選べない日付は非活性に
max と min を指定すると選べない日付は非活性にされる
バリデーション
選べない日付で無理に submit されたときにはバリデーションもしてくれる

ブログの閲覧者からしたらいつどの記事が読まれていたかなんて興味ないだろうけど、著者である自分には興味深い情報になる。セルフホストのブログだからできる機能だ。

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

YouTube の OGP が読み込めない問題があって、回避策をいろいろ考えていた。

YouTube は未ログインで bot っぽい User Agent でアクセスすると OGP のタグが入ってないページを返すようだった。

検索すると facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) という UA でリクエストすれば OGP タグ入りのページを返してくるようだった。

このやり方を試してみようとしたが、使っている gem が UA の上書きに対応していないので面倒くさそうだった。

追加でいろいろ調べてみると、そもそも YouTube は埋め込み用の HTML 片を返す API を用意しているようだった。

動画の ID がわかっているなら https://www.youtube.com/oembed?url=動画のURL という風に GET リクエストを投げると、動画のメタ情報に加えて埋め込み用の iframe スニペットを返してくれる。こんな感じ。

{
  "title": "Ride - Vapour Trail (Live on KEXP)",
  "author_name": "KEXP",
  "author_url": "https://www.youtube.com/@kexp",
  "type": "video",
  "height": 113,
  "width": 200,
  "version": "1.0",
  "provider_name": "YouTube",
  "provider_url": "https://www.youtube.com/",
  "thumbnail_height": 360,
  "thumbnail_width": 480,
  "thumbnail_url": "https://i.ytimg.com/vi/9bVS9j8NoZ0/hqdefault.jpg",
  "html": "<iframe width=\"200\" height=\"113\" src=\"https://www.youtube.com/embed/9bVS9j8NoZ0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen title=\"Ride - Vapour Trail (Live on KEXP)\"></iframe>"
}

結果はこんな感じ。

こういう仕組みは標準化されていて oEmbed というっぽい。そういえば一昔前に聞いたことがあるような気がする。

OGP カードのようにしようかなと思ったけど、 YouTube 動画ならその場で再生できた方が便利かなと思ったので、 YouTube 動画の URL はすべて埋め込みとして表示することにした。

ちなみに YouTube にまつわる何かを検索しようとするとなかなか知りたい情報にたどり着けなくて困った。 YouTube OGP みたいなキーワードで検索すると、大量に OGP について解説している YouTube 動画がヒットする。技術寄りの内容というよりマーケターっぽい人向けの情報。これは地獄みがある。 Google だけでなく DuckDuck Go でも同じような結果だった。相変わらずインターネットは不便になってきている

| @雑談

1 月

根子岳と祖母山

正月早々、山に登った。二年連続阿蘇山。砂千里側から登って仙酔峡に下山した。北面は日が当たらず凍っており、傾斜の急なバカ尾根を下るのは怖かった。

ブログには書いていないが確か正月の初売りで Mac mini の M2 Pro モデルを買った。 Apple Silicon の速い Mac を手に入れたので Whisper CPP を使って Castro を作っていた Supertop の Podcast の文字起こしをしてブログに書こうとしていたが、未完のまままだ公開できてない。年末年始で書き上げたい。

仕事はアプリのダウンロード数をどうやったら増やせるかを延々考えていた。開発をしてダウンロードを増やすなんて無理ゲーだろうと思ってたが、頭を使って何個か施策を考えた。あとは企業向けの機能をテコ入れしていた。

2 月

多良岳から見る雲仙方面の山

熊本城マラソンに出てる。サブフォーを狙っていたが練習不足で果たせなかった。一人で出て誰も知り合いのいない熊本城マラソンは孤独だった。来年雪辱を果たしたい。

中旬のやたら寒い時期に佐賀と長崎県境の多良岳・経ヶ岳に登山に行った。パラパラと落ちてくる樹氷の下を歩くのは楽しかった。花粉がやたらきつくて寒かったけど楽しい登山だった。

仕事はやたらネットワーク効果について考えてたが、まだ思考が甘かった。その後ハイパー起業ラジオを聞いたり本を読んだりしてネットワーク効果についての知見を深めていく。

3 月

今津湾

3 月から 6 月にかけてはブログ記事がない( 3 月に熊本城マラソンの記事を書いているが、それ以外は何もない)。

3 月の頭に糸島であったトレランのレースに出た。ショートレースであまりパッとしない成績だった。まだ 300km も走ってないアルトラのトレランシューズ Outroad が破れて悲しかった。

仕事は新規ユーザーの継続率を伸ばすための A/B テストをやってた。

4 月

長垂海岸

平尾台のトレランレースロングに出た。雨降りでコンディションが悪く、関門タイムギリギリのゴールだった。このときからギリギリグセが付いている。

家の近くの山で有名なトレランチームの人たちを招いて緩い練習会をやった。グループ位置共有を宣伝できてよかった。

仕事はどうやって EC を伸ばすかを考えていた。やはり基本はネットワーク効果だと思って、ユーザーがレビューを書ける機能の土台を作っていた。日の目を見るのはだいぶ先のことになる。

あと、ユーザー登録数を劇的に増やす施策をリリースして、毎月の新規ユーザー数をかなり上積みできた。

5 月

退勤からの都市高速

南畑里山トレイルというトレランのレースに出た。楽しかったがショートレースは出し惜しみをしてしまう。レース後、体力が有り余っていた。

仕事ではこの頃から組織変更が計画されていて、自分の役割がちょっと変わりつつあった。

顧客起点を本格的に取り入れることになり、 N1 インタビューをやったりもしてた。

6 月

久住三俣山

仕事で久住に登山に行った。ミヤマキリシマ終わったあとの平日の久住は静かでよかった。

組織変更の荒波に揉まれたり、 EC のシステムをどうするかを考えたりしてた。もはや単なるプロダクトマネージャーではなくなりつつあった。

7 月

通勤風景

キリエビのロングに出た。こちらも関門 10 分前のギリギリゴール。最後の 15km くらいを近くにいた人たちと励まし合いながら一緒に走った。とても良い思い出。

仕事はなんと平社員からいきなり部長になってしまった。やることが大きく変わり、隣の部長から厳しいご指摘を賜りながら歯を食いしばって働いた。

この頃からハイパー起業ラジオを聴いて積読していたネットワーク効果の本をちゃんと読むようになった。

8 月

阿蘇山

脊梁ピストントレイルというトレランのレースに出たが、初めてリタイヤした。登りが急で、また水場がなく、とても消耗するレースだった。折り返し地点の関門時刻に間に合わず、失格となってしまった。めっちゃ悔しい。まだまだ自分は雑魚だと思い知らされたレースだった。来年は完走したい。

仕事では相変わらず EC のシステムをどうするかとネットワーク効果について考えていた。ユーザーインタビューではなく、山を歩いている人に話しかけて話を聞かせてもらうというのもやった。山を歩いてる人たちはほとんど自社アプリを使ってくれているのではないかと思っていたがそうでもなくてショックを受けた。

9 月

長垂海岸の夕焼け

PayPay ドームリレーマラソンに出た。リレーマラソン前の二週くらいは休みの日の朝に大濠公園に集まってみんなで練習したりしてた。大濠公園から西公園や南公園に走りに行った。

仕事は相変わらずゴタゴタの整理をしていた。この頃はあまり戦略的な動きができず、目の前の仕事に右往左往していた。

10 月

七ツ釜

翌月の福岡マラソンに向けて 30km 走を 2 回やりたかったが 1 回しかできなかった。しかし、初めて一人で大濠公園で 30km 走をやったのは自信になった。一人だと諦めないか心配だったけどちゃんと最後まで走れた。

仕事は相変わらずゴタゴタ処理。この頃から MAU を自分たちの力でどれくらい伸ばせるかにチャレンジすることになって、年末に怒涛の機能リリースをすることに。仕込みを始めた。

11 月

南阿蘇外輪山

オアシス再結成の報を受けてオアシスをよく聞くようになってた。その流れでアンディー・ベルがオアシス加入前にやってたバンド RIDE の曲を聞くようになった。 Vapour Trail めっちゃよい。

ランニングは福岡マラソンに出てきた、ネットタイムではあるかサブフォーをギリギリ達成した。 8 秒差。

また 11 月から会社の人たちと週に 1 回大濠公園を走るようになった。部活みたいで楽しい。

仕事ではリリースする機能の狙いや目的を社内で共有するのが難しくて難儀した。プロダクトマネージャー間で認識をそろえるのも難しいし、他部署の人と認識をそろえるのも難しかった。

12 月

会社からの景色

11 月に引き続き宮崎であった青島太平洋マラソンに出たが、記録更新はならなかった。初めてレース中にうんこしてしまった。最悪。そもそも想定外に福岡マラソンでサブフォーできてしまったせいでその後のランニングのモチベーションが落ちてしまって全然走れてなかった。

仕事は仕込んでいた機能が次々リリースされた。炎上した割に期待した効果が得られない機能や、そもそも使ってもらえない機能もあったが、一つは結構当たって成果を出せた。加えて失敗のリカバリーで出した機能も大きな成果につながった。例年、 12 月になると利用が落ち込むが、 MAU を自分たちでコントロールすることは出来なくはないということがわかったのは収穫だった。いままで大雑把に捉えていた MAU を細かく分解して、それぞれの要素ごとの継続率なんかを分析してる。まだこれといった施策はないが、来年はこの知見を活かしてさらにサービスを成長させていきたい。

2025 年の抱負

仕事

去年のふりかえりでは「何者にもなれない人生だった」と書いていた(2023 年のふりかえり)が、いきなり部長になってしまった。

プロダクトマネジメントとピープルマネジメントは別物と本には書いてあるけど、人に頼んで何かやってもらうという点ではあまり変わらないとも思う。人から信頼してもらい、自分の言葉や考えを信じてもらって行動してもらうという点は変わらない。

それを言い始めたらエンジニアだろうが営業職だろうが同じかもしれない。仕事をしていく上で人から信頼してもらうことは重要だ。そんなの誰でも知ってそうだけど、意外とそれができない。

たまたま年末に買った『プロダクトマネジメントの教科書』という本が良くて、この辺のスキル(人から信頼される、リーダーシップやオーナーシップを発揮する)ことについて実践的な内容が書かれていた。

役割に応じた働きができるよう、もうちょい戦略的に動きたい。

ランニング

ランニング実は去年に比べて距離が伸びていない。これまで毎年距離を伸ばせていたが、今年は夏くらいから走る距離が短くなっている。毎月 200km は走りたいのに、部長になってからみるみる前年同月比の走行距離が落ちている。

年間走行距離

ただ、ランニングのペース(スピード)は上がっている。去年だったらできなかったような、キロ 5 分を切るペースで 20 分間走をやれたりはしてる。なので練習の質は上げられていると思う。

来年こそは距離を伸ばして、月間 200km をコンスタントに超えていきたい。できればマラソンで 3 時間 45 分くらいでゴールできるようになりたい。少なくとも 2 月の熊本城マラソンではサブフォーを再現したい。

ブログ

2024年のブログ執筆状況

実はこの記事を含めても 11 記事しか書けていない。もう少し気負わずに日記感覚で気楽に書きたい。クソみたいな記事でも書かないよりは書いた方がマシ。書かなければ何も残らないしふりかえることすらできない。

Twitter が X になったり、 Threads や mixi2 が登場したりしたけど、セルフホストのブログが一番表現力が高く自由度も高い。死ぬ間際に Twitter や Instagram を見返すより自分のブログを見返した方が良いと思える状況にしておきたい。