壊れた矢印キーをAIとAutoHotKeyで不要にしたら、他人のPCを触れないカラダになった

きっかけは、会社PCの矢印キーが壊れたこと。

会社の管理者から修理までの一時しのぎで「ChangeKey」を教えてもらい、調べているうちに、HJKLやIJKLを矢印キーとして使うお作法を知る。そのうち、「これならホームポジションから手を動かさなくて済むのでは?」と思い、先人の知恵を漁るうちAutoHotKeyにたどり着いた。

しかし、私はプログラムを書けない。ネットの先人たちのサンプルを見よう見まねで試してもうまくいかず。そこで、ArduinoやM5Stack電子工作で体感したAIの破壊力を思い出し、分からないところはChat君やGemini君に質問して試行錯誤を始める。(試験勉強中に部屋を片付けてしまう状態)

最初はF13+IJKLによるカーソル移動だけだったものが、次第に、マウス操作、テキスト編集、一発Google翻訳(和訳英訳ですごく便利)、タイムスタンプ、定型文入力(3種を同じキーで実現)、ショートカットのリンク先を1キーでたどる機能(共有フォルダの密林を一発でたどれて便利)など、どんどん機能が増えてゆく。

途中、出張時の借用PCではF13が使えない問題も発生し、F13・無変換・変換をそれぞれ別「レイヤー」として使う構成に方針を変更。

その結果、最初の目的だった「壊れた矢印キーへの対策」はどうでもよくなり、キーボードが修理されても、IJKLでカーソルを動かし、無変換や変換を押しながら各種操作をするのが当たり前になってしまった。もはや自分のAutoHotKey設定なしには、他人のPCを使ってまともに作業できないカラダになってしまった。

結局、半年ほどかけて、「できるだけホームポジションから手を動かさない」ための、自分専用AutoHotKeyキーボード設定が完成した。

プログラムを書けない自分でも、AIに相談しながらここまで作れたのはよくやったと感じる。先人の記録でアイディアがわき、それをAIが急速に増幅させるループを体感。コードを書かない職の自分でも、楽しめて役立ちました。(14年ぶりに更新したくなるくらいに面白かった。)

こうした経験もお役にたてばと思い、現在使っている設定を記録として公開しておきます。以下、README(AIで作成)と実際のAutoHotKeyスクリプトです。

AutoHotKey設定

今回作成したAutoHotKeyの設定です。

README

AutoHotKey v2 キーボードカスタマイズスクリプト

Windows上で、できるだけホームポジションから手を動かさずに、カーソル移動・テキスト編集・マウス操作・ウィンドウ操作などを行うためのスクリプトです。

無変換、変換、F13を修飾キーとして使い、複数の操作をレイヤー化しています。

また、SpaceキーにはSandS(Space and Shift)を設定しています。Spaceを単独で押すとSpace、押しながら別のキーを操作するとShiftとして動作します。

主な機能は以下の通りです。

  • F13レイヤー

    • I/J/K/Lによるカーソル移動
    • Enter / Delete / BackSpace
    • マウスカーソル移動
    • 左クリック・右クリック・ホイール操作
    • Explorer関連操作
  • 無変換レイヤー

    • カーソル移動
    • 行単位の削除・コピー・カット
    • F1~F12
    • タイムスタンプ入力
  • 変換レイヤー

    • ブラウザのタブ切り替え
    • ブラウザの戻る・進む
    • Alt+Tabによるアプリ切り替え
  • Google翻訳

    • 選択した文字列をAlt+Shift+Eで英訳
    • 選択した文字列をAlt+Shift+Jで和訳
  • SandS

    • Space長押しでShift
    • Space単独では通常のSpace
  • ホットストリング

    • ;;+キーワードによる定型文入力

F13キーは通常のキーボードにはないため、ChangeKeyなどを使ってCapsLockなどのキーをF13に割り当てています。ただし、出張先などF13を使えない環境でも使用できるよう、無変換・変換レイヤーを組み合わせた構成にしています。

動作環境:Windows 10 / 11、AutoHotKey v2.0以降

AutoHotKeyスクリプト

#Requires AutoHotkey v2.0
#SingleInstance Force

; ==============================================================================
; キーボード設定 / AutoHotKey v2
; ------------------------------------------------------------------------------
; 基本方針
;   F13       : カーソル移動・マウス操作・Explorer操作(F13はChengeKeyで作る事)
;   無変換    : カーソル移動・編集・F1~F12・日時入力
;   変換      : タブ/アプリ切替・ブラウザの戻る/進む
;   Space     : SandS(SpaceをShiftとして使用)
;   単独キー  : 翻訳・定型文
;
; 変更時の注意
;   ・#HotIf の範囲を意識してホットキーを追加すること。
;   ・* は Shift/Ctrl/Alt 等が同時に押されても反応させる指定。
;   ・{Blind} は、押されている修飾キーの状態を維持してキーを送信する指定。
; ==============================================================================


; ==============================================================================
; 1. F13 ベースのショートカット
;    F13 を押している間だけ有効
; ==============================================================================

#HotIf GetKeyState("F13", "P")

; ------------------------------------------------------------------------------
; カーソル移動 / ページ移動
; ------------------------------------------------------------------------------

*i::Send "{Blind}{Up}"       ; F13 + I     → ↑
*j::Send "{Blind}{Left}"     ; F13 + J     → ←
*k::Send "{Blind}{Down}"     ; F13 + K     → ↓
*l::Send "{Blind}{Right}"    ; F13 + L     → →
*u::Send "{Blind}{PgUp}"     ; F13 + U     → Page Up
*o::Send "{Blind}{PgDn}"     ; F13 + O     → Page Down
*h::Send "{Blind}{Home}"     ; F13 + H     → Home
*n::Send "{Blind}{End}"      ; F13 + N     → End

; ------------------------------------------------------------------------------
; テキスト編集 / システム操作
; ------------------------------------------------------------------------------

*m::Send "{Blind}{Enter}"        ; F13 + M     → Enter
*,::Send "{Blind}{Delete}"       ; F13 + ,     → Delete
*.::Send "{Blind}{BackSpace}"    ; F13 + .     → BackSpace
*z::Send "{Blind}{Volume_Mute}"  ; F13 + Z     → ミュート切替

; ------------------------------------------------------------------------------
; マウス操作
; ------------------------------------------------------------------------------

*Space::
{
    ; Space を押している間は左クリックを押しっぱなしにする。
    ; → F13 + Space をドラッグ操作として使用。
    Click "Down Left"
    KeyWait "Space"
    Click "Up Left"
}

*v::Click "Right"        ; F13 + V → 右クリック
*r::Click "WheelUp"      ; F13 + R → ホイール上
*f::Click "WheelDown"    ; F13 + F → ホイール下

; ------------------------------------------------------------------------------
; マウスカーソル移動
; 押し続けると徐々に加速
; ------------------------------------------------------------------------------

*w::MouseContinuousMove(0, -1)  ; F13 + W → 上
*a::MouseContinuousMove(-1, 0)  ; F13 + A → 左
*s::MouseContinuousMove(0, 1)   ; F13 + S → 下
*d::MouseContinuousMove(1, 0)   ; F13 + D → 右

; ------------------------------------------------------------------------------
; Windows Explorer / デスクトップ操作
; ------------------------------------------------------------------------------

; F13 + 0
; デスクトップアイコンの表示 / 非表示を切り替える
*0::
{
    ToggleDesktopIcons()
}

; F13 + 1
; 選択した .lnk のリンク先、または選択したファイルを Explorer で表示
*1::
{
    OpenSelectedPathInExplorer()
}

; F13 + 2
; 選択したファイルのショートカットを同じフォルダに作成
*2::
{
    CreateSelectedFileShortcuts()
}

; F13 + 3
; 選択したファイル・フォルダのフルパスを引用符付きでコピー(エクスプローラでのみ有効)
*3::
{
    CopySelectedLinePath()
}

#HotIf


; ==============================================================================
; 2. 無変換キー ベースのショートカット
;    無変換キーを押している間だけ有効
; ==============================================================================

; 無変換キー単体の本来の動作を抑制する。
*vk1D::Send "{Blind}{vkE8}"

#HotIf GetKeyState("vk1D", "P")

; ------------------------------------------------------------------------------
; カーソル移動
; ------------------------------------------------------------------------------

*i::Send "{Blind}{Up}"       ; 無変換 + I → ↑
*j::Send "{Blind}{Left}"     ; 無変換 + J → ←
*k::Send "{Blind}{Down}"     ; 無変換 + K → ↓
*l::Send "{Blind}{Right}"    ; 無変換 + L → →
*h::Send "{Blind}{Home}"     ; 無変換 + H → Home
*n::Send "{Blind}{End}"      ; 無変換 + N → End

; ------------------------------------------------------------------------------
; ページ移動
; ------------------------------------------------------------------------------

*u::Send "{Blind}{PgUp}"     ; 無変換 + U → Page Up
*o::Send "{Blind}{PgDn}"     ; 無変換 + O → Page Down

; ------------------------------------------------------------------------------
; Enter / Delete / BackSpace
; ------------------------------------------------------------------------------

*m::Send "{Blind}{Enter}"       ; 無変換 + M → Enter
*,::Send "{Blind}{Delete}"      ; 無変換 + , → Delete
*.::Send "{Blind}{BackSpace}"   ; 無変換 + . → BackSpace

; ------------------------------------------------------------------------------
; 行単位のテキスト編集
; ------------------------------------------------------------------------------

*w::Send "{Blind}{End}+{Home}{BackSpace}"  ; 無変換 + W → 現在行を削除
*r::Send "{Blind}{End}+{Home}^{c}"         ; 無変換 + R → 現在行をコピー
*e::Send "{Blind}{End}+{Home}^{x}"         ; 無変換 + E → 現在行をカット
*s::Send "{Blind}+{Home}"                  ; 無変換 + S → 行頭まで選択
*f::Send "{Blind}+{End}"                   ; 無変換 + F → 行末まで選択
*d::Send "{Blind}{End}{Enter}"             ; 無変換 + D → 行末で改行

; ------------------------------------------------------------------------------
; F1 ~ F12
; ------------------------------------------------------------------------------

1::Send "{Blind}{F1}"    ; 無変換 + 1 → F1
2::Send "{Blind}{F2}"    ; 無変換 + 2 → F2
3::Send "{Blind}{F3}"    ; 無変換 + 3 → F3
4::Send "{Blind}{F4}"    ; 無変換 + 4 → F4
5::Send "{Blind}{F5}"    ; 無変換 + 5 → F5
6::Send "{Blind}{F6}"    ; 無変換 + 6 → F6
7::Send "{Blind}{F7}"    ; 無変換 + 7 → F7
8::Send "{Blind}{F8}"    ; 無変換 + 8 → F8
9::Send "{Blind}{F9}"    ; 無変換 + 9 → F9
0::Send "{Blind}{F10}"   ; 無変換 + 0 → F10
-::Send "{Blind}{F11}"   ; 無変換 + - → F11
^::Send "{Blind}{F12}"   ; 無変換 + ^ → F12

; ------------------------------------------------------------------------------
; 入力モード切替
; ------------------------------------------------------------------------------
; 無変換 + 変換 → 半角/全角
vk1C::Send "{Blind}{vkF3sc029}"

; ------------------------------------------------------------------------------
; タイムスタンプ
; ------------------------------------------------------------------------------
; 無変換 + T を短時間に連打
;   1回 → yyyy-MM-dd
;   2回 → yyyyMMdd
;   3回 → yyyyMMdd_HHmm
*t::InsertTimestamp()

#HotIf


; ==============================================================================
; 3. 変換キー ベースのショートカット
; ==============================================================================

; 変換キー単体の本来の動作を抑制する。
*vk1C::Send "{Blind}{vkE8}"

#HotIf GetKeyState("vk1C", "P")

; ------------------------------------------------------------------------------
; タブ / ブラウザ履歴
; ------------------------------------------------------------------------------

*o::Send "{Blind}^{Tab}"       ; 変換 + O → 次のタブ
*u::Send "{Blind}^+{Tab}"      ; 変換 + U → 前のタブ
*n::Send "{Blind}!{Left}"      ; 変換 + N → 戻る
*,::Send "{Blind}!{Right}"     ; 変換 + , → 進む

; ------------------------------------------------------------------------------
; アプリ切替
; ------------------------------------------------------------------------------

*j::Send "{Alt Down}{Tab}"     ; 変換 + J → Alt + Tab(選択画面を保持)
*l::Send "{Alt Down}+{Tab}"    ; 変換 + L → Alt + Shift + Tab

; 変換 + K → Alt + Tab を一度だけ実行して即切替
*k::
{
    Send "{Alt Down}{Tab}"
    Sleep 10
    Send "{Alt Up}"
}

#HotIf

; 変換キーを離した際、Alt が残っていたら解除する。
*vk1C Up::
{
    if GetKeyState("Alt")
        Send "{Alt Up}"
}


; ==============================================================================
; 4. SandS(Space and Shift)
;    F13 を押している間は無効
; ==============================================================================

#HotIf !GetKeyState("F13", "P")

; Excel 等で Ctrl + Space / Shift + Space を使う場合は、そのまま送信。
+Space::Send "+{Space}"
^Space::Send "^{Space}"

; Space を押している間 → 右 Shift
*Space::
{
    Send "{RShift Down}"
}

; Space を離したとき
*Space Up::
{
    Send "{RShift Up}"

    ; Space 単体の短い押下だけを「通常の Space」として入力する。
    ; Shift / Ctrl と同時押しの場合は通常の修飾キー操作を優先。
    if (
        A_PriorKey == "Space"
        && A_TimeSincePriorHotkey < 200
        && !GetKeyState("Shift", "P")
        && !GetKeyState("Ctrl", "P")
    )
    {
        Send "{Space}"
    }
}

#HotIf


; ==============================================================================
; 5. Google 翻訳
;    Alt + Shift + E : 英訳
;    Alt + Shift + J : 和訳
; ==============================================================================

+!e::TranslateSelectedText("en")
+!j::TranslateSelectedText("ja")


; ==============================================================================
; 6. 定型文(ホットストリング)
; ==============================================================================

; 「;;」+ キーワードで定型文に置換

:*:;;best::
(
Best regards,
(名前)Hogeta Hogekichi
Hogehoge Company
)

:*:;;mail::メールアドレス
:*:;;mobile::携帯電話
:*:;;sig::署名(hogehoge株式会社 hoge hogeo 電話番号)
:*:;;name::名前(hoge hogeo)


; ==============================================================================
; 7. 共通関数
; ==============================================================================

; ------------------------------------------------------------------------------
; Explorer / デスクトップ
; ------------------------------------------------------------------------------

ToggleDesktopIcons()
{
    hProgman := WinExist("ahk_class Progman")

    if !hProgman
        hProgman := WinExist("ahk_class WorkerW")

    if !hProgman
        return

    try
    {
        control := "ahk_id " hProgman

        if ControlGetVisible("SysListView321", control)
            ControlHide("SysListView321", control)
        else
            ControlShow("SysListView321", control)
    }
    catch
    {
        ; Explorer の状態によって ControlGetVisible/Show/Hide が失敗する
        ; 場合があるため、Windows のメッセージをフォールバックとして使用。
        PostMessage(0x111, 0x7402, 0, , "ahk_id " hProgman)
    }
}


OpenSelectedPathInExplorer()
{
    clipSaved := ClipboardAll()

    try
    {
        A_Clipboard := ""
        Send "^c"

        if !ClipWait(1)
            return

        path := StrReplace(A_Clipboard, '"', "")

        ; .lnk の場合はリンク先の実体へ変換。
        if (SubStr(path, -4) = ".lnk")
        {
            try
            {
                FileGetShortcut(path, &targetPath)
                path := targetPath
            }
        }

        if (path != "")
            Run 'explorer.exe /select,"' path '"'
    }
    finally
    {
        A_Clipboard := clipSaved
    }
}


CreateSelectedFileShortcuts()
{
    try
    {
        shellApp := ComObject("Shell.Application")
        activeHwnd := WinActive("A")

        for window in shellApp.Windows
        {
            if (window.hwnd != activeHwnd)
                continue

            selectedItems := window.Document.SelectedItems

            if (selectedItems.Count == 0)
                return

            for item in selectedItems
            {
                filePath := item.Path

                SplitPath(
                    filePath,
                    &name,
                    &dir,
                    &ext,
                    &nameNoExt
                )

                shortcutPath := dir "\" nameNoExt " - ショートカット.lnk"
                FileCreateShortcut(filePath, shortcutPath)
            }

            return
        }
    }
    catch
    {
        ; Explorer 以外で実行した場合などは何もしない。
        return
    }
}

CopySelectedLinePath()
{
    try
    {
        shellApp := ComObject("Shell.Application")
        activeHwnd := WinActive("A")
        pathList := ""

        for window in shellApp.Windows
        {
            if (window.hwnd != activeHwnd)
                continue

            selectedItems := window.Document.SelectedItems

            if (selectedItems.Count == 0)
                return

            ; 選択されたすべてのアイテムのパスを収集
            for item in selectedItems
            {
                pathList .= '"' item.Path '"`n'
            }

            ; 最後の余分な改行を削除してクリップボードに格納
            A_Clipboard := RTrim(pathList, "`n")
            
            ; コピー完了を音(ピピッ)で通知(不要なら削除してください)
            SoundBeep 1500, 100
            return
        }
    }
    catch
    {
        ; Explorer 以外(デスクトップなど)でのフォールバック処理
        ; 通常の Ctrl+C でパスが取得できる性質を利用
        clipSaved := ClipboardAll()
        try {
            A_Clipboard := ""
            Send "^c"
            if ClipWait(0.5, 1) {
                formattedPaths := ""
                loop parse, A_Clipboard, "`n", "`r" {
                    if (A_LoopField != "")
                        formattedPaths .= '"' A_LoopField '"`n'
                }
                A_Clipboard := RTrim(formattedPaths, "`n")
                SoundBeep 1500, 100
            }
        } catch {
            A_Clipboard := clipSaved
        }
    }
}


; ------------------------------------------------------------------------------
; タイムスタンプ
; ------------------------------------------------------------------------------

InsertTimestamp()
{
    static pressCount := 0

    pressCount++

    ; 300ms 以内に次の T が押されなければ確定。
    SetTimer(InsertTimestamp_Commit, -300)

    InsertTimestamp_Commit()
    {
        IME_SET(0)

        switch pressCount
        {
            case 1:
                Send FormatTime(, "yyyy-MM-dd")

            case 2:
                Send FormatTime(, "yyyyMMdd")

            case 3:
                Send FormatTime(, "yyyyMMdd_HHmm")
        }

        pressCount := 0
    }
}


; ------------------------------------------------------------------------------
; Google 翻訳
; ------------------------------------------------------------------------------

TranslateSelectedText(targetLanguage)
{
    clipSaved := ClipboardAll()

    try
    {
        ; 選択文字列をコピー。
        A_Clipboard := ""
        Send "^c"

        if !ClipWait(1)
        {
            MsgBox(
                "テキストのコピーに失敗したか、文章が選択されていません。",
                "エラー",
                48
            )
            return
        }

        encodedText := WinUriEncode(A_Clipboard)

        url := (
            "https://translate.google.co.jp/"
            "?hl=ja"
            "&sl=auto"
            "&tl=" targetLanguage
            "&text=" encodedText
            "&op=translate"
        )

        Run url
    }
    finally
    {
        ; 翻訳処理で変更したクリップボードを元に戻す。
        Sleep 100
        A_Clipboard := clipSaved
    }
}


WinUriEncode(str)
{
    ; 日本語を含む文字列を URL に安全に埋め込むため、
    ; Windows の UrlEscapeW を使用する。
    maxLen := (StrLen(str) * 3) + 1
    outBuff := Buffer(maxLen * 2)

    status := DllCall(
        "shlwapi\UrlEscapeW",
        "Str", str,
        "Ptr", outBuff,
        "UInt*", &maxLen,
        "UInt", 0x00002000,
        "Int"
    )

    if (status == 0)
        return StrGet(outBuff, "UTF-16")

    ; 変換に失敗した場合は元の文字列を返す。
    return str
}

; ------------------------------------------------------------------------------
; マウス連続移動
; ------------------------------------------------------------------------------

MouseContinuousMove(xDir, yDir)
{
    ; ホットキー名から * などを除いて、押されているキーを取得。
    currentKey := RegExReplace(A_ThisHotkey, "[\*\#\!\^\+]")

    startTime := A_TickCount

    while GetKeyState(currentKey, "P")
    {
        elapsed := (A_TickCount - startTime) / 1000

        ; 長押し時間に応じて加速。
        speed := 3 + (elapsed ** 2 * 20)

        MouseMove(
            xDir * speed,
            yDir * speed,
            0,
            "R"
        )

        Sleep 10
    }
}


; ------------------------------------------------------------------------------
; IME
; ------------------------------------------------------------------------------

IME_GET(WinTitle := "A")
{
    hwnd := WinExist(WinTitle)

    if !hwnd
        return 0

    ptrSize := A_PtrSize
    stGTI := Buffer(24 + 6 * ptrSize, 0)

    NumPut("UInt", stGTI.Size, stGTI, 0)

    if !DllCall("GetGUIThreadInfo", "UInt", 0, "Ptr", stGTI.Ptr)
        return 0

    hwndCaret := NumGet(stGTI, 8 + ptrSize, "Ptr")
    targetHwnd := hwndCaret ? hwndCaret : hwnd

    return DllCall(
        "SendMessage",
        "Ptr",
        DllCall(
            "imm32\ImmGetDefaultIMEWnd",
            "Ptr", targetHwnd,
            "Ptr"
        ),
        "UInt", 0x0283,
        "Ptr", 0x0005,
        "Ptr", 0,
        "Ptr"
    )
}


IME_SET(setState, WinTitle := "A")
{
    hwnd := WinExist(WinTitle)

    if !hwnd
        return 0

    ptrSize := A_PtrSize
    stGTI := Buffer(24 + 6 * ptrSize, 0)

    NumPut("UInt", stGTI.Size, stGTI, 0)

    if !DllCall("GetGUIThreadInfo", "UInt", 0, "Ptr", stGTI.Ptr)
        return 0

    hwndCaret := NumGet(stGTI, 8 + ptrSize, "Ptr")
    targetHwnd := hwndCaret ? hwndCaret : hwnd

    return DllCall(
        "SendMessage",
        "Ptr",
        DllCall(
            "imm32\ImmGetDefaultIMEWnd",
            "Ptr", targetHwnd,
            "Ptr"
        ),
        "UInt", 0x0283,
        "Ptr", 0x0006,
        "Ptr", setState,
        "Ptr"
    )
}

※このスクリプトは、Web上の様々な人の例をもとに半年ほどかけてAIと相談しながら改造したものです。AutoHotKeyを使いはじめた方の参考になれば幸いです。ChangeKeyでF13作成や、AHKインストールなどは例が多く転がっているので検索してみてください。

第15回雁坂峠越え秩父往還143km走

2012雁坂15th総括

  • Start-CP1 10時39分着

2012年9月16日朝6時、いつものように記念写真を撮ってスタート。晴天で暑い。抑え気味を意識するのかなりきつさは感じる。ダムまでが長い。胃に気をつけて塩タブレットを水と共に摂る。

  • CP1-CP2 13時34分着

登山道にとりつくまでの林道が果てしなく遠く感じる。それほどにほど暑い。走る力が残っていない。登山道でオーバーヒート状態なのがよくわかる。沢の冷水が待ち遠しい。数回目の渡渉時に沢で頭を冷やしていなければ昨年よりも雁坂小屋着は遅れていただろう。そうなったら諦めていたかもしれない。つづら折りの登り道へ出て、涼しくなる。ようやく先が見えた。なんとか雁坂峠を越える。

  • CP2-CP3 15時26分着

つばっきーさんと女将さんの元気な声で送り出される。つばっきーシュミレーションでは深夜0時に正丸峠を越えれば、フルマラソン6時間以内ペースでゴールできるという。正丸峠をどんな状態で超えるかが山場。下りではいつものように体力が回復。雨がぱらつく。靴を幅がフィットしているアディダスに変えたためつま先へのダメージはそれほど感じない。下り途中でゼオン鉄人会の角栄さんと挨拶し先に通過。山を降りたら川俣エイド。

  • CP3-CP4 17時36分着

エイドではカレーを小盛りで食する。そこから秩父往還道の旧道へ。いつもの通り下りが続くのでノンストップでゆっくり走る。少々オーバーヒート気味でスピードが落ちる。秩父湖の周辺は工事されており、いつもアイスを買う一つ目の商店が閉店している。パピコを補給できずがっくり。道の駅を過ぎてからがかなり長く感じる。ドライフルーツはもう受け付けない。

  • CP4-CP5 20時26分着

エイドに到達しヘッドランプを装着。いつもと似たタイミング。あまり食べれず果物をメインに食す。胃腸薬の粉がよく効く感じ。オーバーヒート気味が継続していたところ、もう一つの常連商店でアイスタイム。ガリガリ君梨味とパピコを買う。持参した手ぬぐいにパピコを入れて後頭部とおでこを冷やす必殺技。オーバーヒート状態が緩和し大きく回復。溶けてきたら食べるというサイクルが最高に楽しみ。秩父市内でもう一度購入。勢いを持って秩父の熊野商店跡地のエイドへ到着。

  • CP5-CP6 22時56分着

エイドを出てすぐのコンビニでパピコと氷を購入。途中の駅に水道がありそこで頭を冷やし回復。久保の交差点から正丸峠への登りへ。氷に水をいれて冷水にしたカップとLEDハンドランプをそれぞれに持って、前を走って登るランナーをパワーウォーキングで追う。あっさりとエイドへ到着。

  • CP6-CP7 0時40分着

正丸エイド恒例のつばっきーさんはガイコツ姿。カップラーメンしょうゆ味を頼んだがつゆは飲めず。出る前に飲んだブレンディーは美味しかった。深夜0時前にはスタートでき順調。峠を下って国道299をひた走る。

  • CP7-CP8 2時57分着

エイドで食べたヨーグルトが美味しすぎて2杯食べたのは失敗。ついでにコーヒーも飲んでしまい、出発してすぐ吐き気を催す。スピードはかなり落ち、一回うずくまって吐く。症候状態が続きながら、去年諦め3人組でたどり着いた小江戸大江戸ランニングワールド私設エイドに到着。コーラを少しもらって来年も走ると言い残し出発。小走りながらだんだん見覚えのあるエリアへ。今回は完走できそうだ。雨が降り出す。

  • CP8-Goal 5時41分着

エイドでついに憧れのイクラ丼を完食。雨が土砂降りになるなか出発。雨の中気分が高揚する。日高のあたりで止む。後は時間との勝負。ゆっくりフルマラソンペースで余裕があるはずだが、足が止まると危ない。地図が雨で溶けて見れないため、ひた走るのみ。高速の下を通過し、ミニーちゃんと話す。そこから入間川までがすごく長く感じる。だが川を渡ればもうすぐだ。まだ30分以上残っている。今成交差点を超えていつもの高架橋にたどり着く。今年からは危険のない下道。歩道ができていた。先行者に追いつき、去年もちょっと声をかけさせてもらった話したゼオン柳田さん、行の高速バスで一緒だった佐藤さんと話しながら、なんとか完走できそうだと安堵。川越の街へ。最後くらいは格好つけようと三人で走り、最後は手をつないでみんなでゴール。2年ぶりの時間内完走。23時間41分。硬い握手をしあい達成感を味わうことができた。


説明会に女装で登場したマロンさんが現れ今年も声をかけてくれ感謝。スタッフのみなさんに挨拶し、しばらくしたら去年一緒にリタイヤした寺さんがゴール。風呂場で同じくモトチカさんとも話し、ベスト更新とのこと。去年のドナドナ3人組が揃って完走でき嬉しかった。帰りに5位の藤井さんとちょっとお話をしながら商店街を歩き、自分は日高屋でいつもの一人打ち上げ。ビール2杯も飲んでしまった。

  • 所感

今年も雁坂が終わった。仕事が忙しくて十分なトレーニングができず苦しかった。何度も諦めそうな局面があったが、山登り中盤から涼しくなったこと、胃腸に気を使い薬を備えてきたこと、パピコ手ぬぐいと氷が機能したことが大きかった。また、同じ方向を目指す雁坂ランナーは皆同じ苦しみ喜びを分かつ仲間だという一体感がより一層深まった。これまでもらってばかりの自分なので、来年はもう少し自信を持ってみなを元気付けながら完走したい。また、3月には小江戸大江戸200kにチャレンジしてみたい。終わってすぐにアイルランドでセールスミーティング、帰ってきてISO内部監査に国内出張と多忙だが、何とか乗り切れる気がする。(アイルランド帰りのフライト中に作成@2012/09/24)

第14回雁坂峠越え秩父往還143km走

今年で3回目の雁坂はCP8でリタイア。戦績は1勝1敗1分(勝:完走、敗:リタイア、分:時間外完走)。前週にウィルス性胃腸炎になり抗生物質を飲み続け弱っていたこと、当日の暑さ、8月は奥武蔵ウルトラDNSで走りこまなかったことなど、不十分な自己管理が原因。CP2-7までは復活し時間外完走はできるかと思ったが、CP7-8間で胃の中のものすべてを嘔吐しリタイアを決めるに至った。来年は初回のような気持ちで準備を重ねて完走したい。また一年がんばろう。


■第14回雁坂峠越え秩父往還143km走
■日付:2010年9月18日午前6時スタート
■結果:CP8にてリタイア(23時間33分 DNF)

チェックポイント 距離 時刻 経過 区間
スタート(甲府駅北口) 0.0km 06:00
CP1(広瀬湖畔) 33.3km 10:39 04:39 4:39
CP2(雁坂小屋) 42.0km 14:03 08:03 3:24
CP3(川又) 52.0km 16:26 10:26 2:23
CP4(大達原) 67.5km 18:39 12:39 2:12
CP5(秩父) 85.0km 21:16 15:16 2:36
CP6(正丸峠) 99.3km 00:05 18:05 2:49
CP7(西吾野) 110.2km 01:43 19:43 1:37
CP8(高麗) 124.6km 05:33 23:33 3:50
ゴール(湯遊ランド) 143.0km DNF


前日受付で再会できたまろんさん、正丸手前でお話したトランスアメリカさんペア、正丸峠からCP7でご一緒したつばっきーチームのお姉さん、手負いのモトチカさん、おととし風呂場で倒れ今回驚きの再会となったてらさん。そのほか道中で声を交わしあった皆さん。大会を最後まで運営してくれたスタッフの皆さん。一人一人にありがとう。

ランナーは貧血に注意

週末に献血に行ったら8月同様の時と同様ヘモグロビン値が低いため断られた。前回は12g/dl前半、今回は11.7で男性標準値13.3〜17.4にくらべて低く、問診の医師からは「これじゃ記録でないよ」とおどさた。


ヘモグロビンは血液中で酸素運搬を担う赤血球の主成分で、主に鉄からできている。ヘモグロビンが減って酸素を身体に行き渡らせる機能が低下すれば、疲労も蓄積され、回復も遅くなり、いわゆる貧血になる。


最近ときどきめまいがすることもあったので、念のため内科に行ってきた。


内科でこの検査結果とこれまでのスポーツ暦を説明し、尿や便からの出血はないかなどの質問に答えると、このヘモグロビン値の低さの原因は鉄欠乏性貧血だろうと診断された。少なくとも13はないとランナーとしては辛いらしい。


鉄欠乏性の貧血は長距離ランナーに多いそうで、発汗による鉄分の損失や、走ることによる衝撃で赤血球が破壊されることにより引き起こされ、それが血液中のヘモグロビン値として現れる。


対策として、鉄を含んだ増血剤フェロミア錠50mg(鉄50mg)を1か月分処方された。1ヶ月間飲み続けた後、ふたたび血液検査をしましょうということになった。


ランナーで最近調子が悪いと思ったら、貧血を疑ってみること、献血に行って見ることをお勧めします。


●貧血について参考になるサイト:
http://www.mental-tr.com/eiyouindex.html
http://www.logical-running.com/archives/2005/06/post_25.html

●フェロミアについて参考になるサイト:
http://www.qlife.jp/meds/rx9759.html

第13回雁坂峠越え秩父往還143km走メモ

去年に引き続き完走かと思いきや、時間外準完走となりました。
来年の参考に記録を残します:

■第13回雁坂峠越え秩父往還143km走

■日付:2010年9月19日午前6時スタート

■結果:24時間21分(制限時間外の準完走)

チェックポイント 距離 時刻 経過 区間
スタート(甲府駅北口) 0.0km 06:00
CP1(広瀬湖畔) 33.3km 10:06 04:06 4:06
CP2(雁坂小屋) 42.0km 13:02 07:02 2:56
CP3(扇屋山荘) 52.0km 15:09 09:09 2:07
CP4(大達原バス停前) 67.5km 17:19 11:19 2:10
CP5(熊野商店) 85.0km 19:57 13:57 2:38
CP6(名栗げんきプラザ先) 99.3km 22:57 16:57 3:00
CP7(ロックガーデンカフェ) 110.2km 01:10 19:10 2:13
CP8(久保交差点手前) 124.6km 03:45 21:45 2:35
ゴール(湯遊ランド) 143.0km 06:21 24:21 2:36

■レース前:
6月の入院、7-8月の走りこみ不足(月110-130km)、左ひざ痛、貧血気味、夏ばての胃腸の不調など、少々不安要素あり。新宿発の高速バス(1950円)にて甲府入り。午後4時の説明会を聞き、前回一緒に走った方や前夜祭で話した方、レース後にやり取りをした方々に挨拶。説明会の終わりに一人一人名前を呼んでみんなに紹介してくれるので、顔と名前が一致してとてもよかった。

■当日:
朝4時起床。胃腸に不安があるのでとろろそばなどおなかに優しい食事を摂り、5時半に甲府駅北口へ。ファイナルコールをして記念撮影。


■スタートからCP1:
ゆっくりと走り出すが、今年は暑かった。昨年はスタート前はアームウォーマーをするほど涼しかったが、今回はスタート時から汗ばむ。塩山のハーフマラソン会場を通り過ぎ、だらだらのぼりが広瀬湖まで続く。同じ景色。登りが始まると脚がすぐパンプしてしまい、歩いて走っての繰り返しで広瀬湖CP1着。そばを少々食べたが入って行かない。


■CP1からCP2:
CP1エイドを出発したころの日差しはすでに激しく汗だく。なかなか引き続き歩き走りを繰り返して雁坂峠への林道へ。ここでは割り切って歩く。ゴロ岩登山道に入る頃からふらふらしだす。沢の水で体を冷やして、何度か休憩。アクエリアスを飲むと吐き気がする。道を譲りながらようやく峠へ。視界は利かないがやっぱり登りきるといい気分。CP2の雁坂小屋エイドで、一番に所望したのは雁坂水。冷えた水を飲むと少しお腹がが和らぐ。ここでアクエリアスをやめて雁坂水を1L補給。名物スタッフカメリアさんの軽妙な応援を聞き元気付けられスタート。


■CP2からCP3:
ここからは山の下り区間。北側で湿気があり、霧も出ていて気温が下がり体調は少し回復しだす。しかし、下りが1時間も続くと前腿がパンプして踏ん張りが利かず、重力に任せて落ちる感じの下り。筋力と筋持久力が落ちたことを実感するが、吐き気がしないので気分は上々。一人旅が続いて心細くなった頃、昨年ゴール後にお話したゼオン鉄人会の方に追いつき色々話が出来てとても嬉しい。登山道から車道に下りてCP3へ。胃が落ち着きを取り戻したせいか、やたらとお腹が空き、カレーを大盛りにして食べた。これが後々聞いてきた。出発前に靴下を一回脱いで下りで入った泥を落とす。右かかとにくつずれあり。

コースで発見した動物の骨


■CP3からCP4:
栃本の関所を越え、秩父湖を越え単調な下り。自販でウーロン茶を補給。前にいいペースを刻む2人の年配ランナーの後ろにつかせてもらい少し走る。この2人はまさにウルトラランナーの走りで、決して早くないが力を出しすぎず、息を上げずにマイペースで脚を刻んでいくウルトラ走り。途中で自分の足が切れてひとりになってから、同じように実践しなんとかCP4へ。CP4では胃が食べ物を受け付けず飲み物のみいただく。座って休んでいると、ここからはライト必要ですねと声をかけてくれたのは沖縄からのKさん。そういえば去年も同じように声をかけてくれた。彼とCP6の手前まで助け合いながら行くことになる。

突然襲ってきたニホンザル


■CP4からCP5:
これまた単調な下りが続き、CP5の秩父を目指すのだが、何度か吐き気で脚が止まる。調子を取り戻してペースを刻むと今度はオーバーヒート気味。前方にランナーが4−5人集まっている商店があり、そこで自分もアイスを調達。カルピスウォーターのパピコみたいな氷シャーベット。いきなり食べると胃によくないので、首筋に入れて体を冷やすと、熱し気味の頭が冷えて調子を戻す。ここで一気に山を下って、秩父市外への平地に。途中でKさんに追いつく。先方は足の痛み、こちらは胃の痛みで苦しんでいたが、元気づけあうことで歩き最小限にできCP5へ。CP5でもあまり食べられず。


■CP5からCP6:
K氏と一緒にスタートしたが、脚が回らないので先に行ってもらったが、すぐにこちらが追いつきまた同行。最後のコンビニで氷を調達して首を冷やしながら、K氏と順番に主導権を取って電柱何本走ったら歩きのようなことを繰り返し、正丸トンネルに迫る。しかし、こちらは吐き気に見舞われ立ち止まり、残K氏とはここで別れる。旅の道連れ・戦友と別れるような気分だ。歩きベースになりながら正丸峠への分岐へ。ここで気分が悪くなり10分くらい路肩で休息。今度は睡魔も敵になる。去年はこの区間を走って登れたのだがと少々苦々しく思う。ここでもうリタイアしようと何度も思った。だがここは正丸峠、暴走車が時々駆け抜け、安全に寝れる路肩がなかったことが幸いし峠のエイドへ到着。安全に横になれるのだけが本当に嬉しかった。ここでも何も食べられず。23時30分出発が完走の境目と言われ、直前に出発。正味30分寝ていた。


■CP6からCP7:
正丸峠からの下りでK氏発見。脚の痛みで途中でリタイアするつもりとのこと。こちらも時間内完走は難しいかもしれないが、いけるとこまで行くと伝え別れる。走りより歩きの時間が長い。ここでも吐き気を何度も催したが、もはや何も出ず。正丸トンネル出口について、携帯の電波が入ったので電車を調べたが深夜0時を過ぎて朝まで電車はない。なのでリタイアの誘惑もとりあえずなくなる。とともに少し力が出てきて走れるようになっりCP6へ。お腹に優しいヨーグルトとおかゆを食べ、エイドのみんなに勇気付けられ出発。まだ望みはゼロではないらしい。


■CP7からCP8へ:
初めは動いていた足も2キロも行かないうちに止まり、再び吐き気で全部出た。歩きベースで何とか前へ進む。高麗川沿いの道をものすごいスピードでコーナーリングしていく自動車とバイクの暴走が恐ろしい。ハンドル操作を誤られたらこちらへ突っ込んできそうでひやひやする。ずっと一人旅。CP7まであと1.5kmくらいというところでまだ元気そうなおじさんに追い抜かれ、エイドまで追いかける。CP7では名物イクラ丼が出るのだが、何とかいただく。その後にいただいた葛湯の甥しことと言ったらない。先にエイドインしていた方はもうリタイアだという。去年自分と同じくらいに完走した人で、雁坂は2回目に失敗する人多いんだよねといっていた。練習不足の自分も一緒だ。タイム的に2時間15分でハーフを走ればいいのだが、120キロ走った後ではちょっと厳しい。と思いつつ出発。


■CP8からゴールへ:
高麗から15号線に入り高麗川の跨線橋まで走り通そうと思ったが、すぐに脚が切れる。武蔵高萩手前の130km付近からサイドチャレンジしそこから2kmくらいいいペースで走れてこれあら間に合うんじゃないかとひそかに期待したがペースが続かず。歩き走りの繰り返しで関越自動車道のガード下を通過。少なくとも、去年の走りよりこの区間は動けていると思ったり。入間川を渡った頃についに24時間の制限時間を超過。あとはゴールを目指して川越へ。ゴールへの目印とスタッフがもう少しでゴールと手を振ってくれ、やっと帰ってきたとしみじみ思う。そして、湯遊ランド駐車場で143kmを制限時間24時間から21分遅れでゴールした。ゴールで実行委員長の館山さんを初め多くのスタッフの皆さんがまだ残っていてねぎらってくれ本当にありがたかった。


■レースを終えて:
胃の不調は本当に苦しかったが、リタイヤせずになんとかゴールまでたどり着けたのは、元気付けてくれたエイドや大会を裏方で支えてくれたスタッフ皆さん、途中で互いに元気付けあったKさん、途中で声を掛け合ったみんなのおかげだった。来年はもう少しトレーニングを積んで(積みすぎて楽勝でもつまらないので)完走したい。そして、ゴール後に言われた「川の道」でも待ってるからねという一言が心に響いた。まだ早いにせよ、いつの日かチャレンジすることになるだろうと思う。

  • 携行品:シューズ、ソックス、タイツ、ランパン、Tシャツ、キャップ、時計、GPS、リュック(20L)、ハイドレーションチューブ、プラティパス(2Lアクエリアス, 1L空の予備)、行動食(カーボショッツ4個、ソイジョイ4個、ヴィダーインゼリー2個、塩飴、せんべい)、薬(下痢止め、胃腸薬2粒)、ヘッドランプ、ハンドライト、予備電池、レインウェア、アームウォーマー、レスキューシート、財布、地図、ボールペン、iPhone、iPhone予備バッテリー。

インラインスケート講習会に参加

ランニングに加えて新たに始めたインラインスケート。自分で適当に滑っていても上手くなりそうもないので、ハロスケ(hello.to/sk@ter)経由で発見した富士見台ファンスケート初心者講習会に参加してみた。場所はティーンズプラザ富士見台という児童館の屋上で、中延駅から歩いて8分程度。子供や親子連れだけかなぁと思っていたら、受付で自分のような大人も2人くらいいて少し安心。


立ち方・転び方から始まって、Aフレームターン、ゆりかご、Aフレームブレーキ、スウィズルまでインストラクターさんが説明して、一人一人実践し、最後にスキルチェック。残念ながらAフレームブレーキが上手く出来なかったが、スウィズルのコツが分かって大満足。一人で適当に滑っているのと違って、教えてもらうと上達が速い。将来は多摩川をロングランできるようになりたいものだ。暑いくらいのいい天気の下、子供も大人も楽しく練習できた。


講習後にインストラクターさんからウィール交換すると滑りやすくなるよとアドバイスをもらう。今のブーツは中古で手に入れたRollerblade社のTRS Lighteningで15年もの骨董品。後でウィール(70mm/78A)を見てみたらかなりすり減っていた。パンクしたタイヤで走っている車のような状態という指摘に確かに納得。教えてもらったインラインスケートのショップsk4に早速行ってみよう!ちなみにネットでウィールの値段を見てみたら4個で3000円以上する。8個変えたら中古で買ったブーツの2倍しちゃうなぁと思いつつ、楽しくて仕方がない今だから買う方向で検討中。


とにかく、講習会に参加してとても実りが多かった。インラインスケートはストリート系って感じで初心者への敷居が高いと思っていたが、今回のような気軽に参加できるイベントがあるのにはとても助かった。こうやってそのスポーツの楽しみを少しづつ発見していけると長く続けられるんだろうなぁ。運営者の皆さんに感謝。