東京エクストリームウォーク 100 に参加して100キロを歩いてみた

下書きで2ヶ月くらい放置していたので公開します。 まだまだ色々思い出はあったのですが、出さないよりは良いでしょうということで。

はじめに

東京エクストリームウォーク 100 というイベントに参加しました。

www.asahi.com

100kmを26時間制限で歩くというイベントです。

結果としては完歩できたものの、後半は完全に痛みとの戦いでした。

ただ、他の参加者との会話にかなり助けられ、最後は無事にゴールすることができました。

時系列に色々なことをつらつらと記載していきます。


準備

普段は運動も全然できてないので、ノリで申し込んだはいいものの、連続で10キロも歩いたことがありませんでした。 GWにちょうど時間があったので、練習として家からいける範囲で事前に20キロ、26キロを歩いて調整をしていました。

26キロは歩いた時は、筋肉痛にはなるものの、他の部分はそれほど痛みがでませんでした。 とはいえ、それほど長距離を歩ける自信はなかったので、いったん50キロを目標としていました。 でも今回の大会には50キロはなく、100キロのみだったので、100キロで申し込みをしています。


ちなみに、申し込んだ動機は、

人生変わるかもしれないから

です。 人生は変わりませんでしたが、いい修行になったなと思います。 1人ではもう二度とやりたくない。


スタート前

前日は「早く起きなきゃ」というプレッシャーで寝付きが悪かったです。 旅行の前日など、イベント前日はだいたい毎回こうなります。

会場は家からそこまで遠くなかったので当日入りにしましたが、寝不足の状態で電車に乗ったせいか、移動中はちょっと気持ち悪くなっていました。

食欲もあまりなく、朝はウィダーを飲んだ程度でした。

駅を降りた時点でゼッケンをつけた人がちらほら。どこにゼッケンをつけるんだろうと思っていたのですが、後ろはカバンにつけるんですね。

会場について、入口付近でゼッケンを付けてスタートしようと思ったところで、携帯をなくしたことにきがつきました。 ゼッケンつけるときに、地面にスマホを置きっぱなしにしていました。危ないあぶない。

グミをもらったりして、スタート地点についた時点でちょうどいい時間だったので、そのままスタートすることにしました。 ただ、ちゃんと準備をしてなかったので、靴紐をちゃんと調整していませんでした。 スタート直前に慌てて簡単に結び直して、そのままスタートしました。 9:46分スタートだったと思います。

マスコット的なやつ

慌ててないつもりだったのですが、改めて文字にしてみるとバタバタしているなと。


CP1(21km)まで

スタートしてまず思ったのが、「複数の参加が多いな」ということでした。 自分はちょうど団体の間に挟まれていたようで、前後で話をしているようでした。

一方で、速い人は本当に速い。かなりのスピードで早歩きしていて一気に抜かれます。 まあ競歩とかを考えたら、そんなものなのかと勝手に納得していました。

また、実際に歩き始めると、思っていたより細かいアップダウンが多く地味にきついなと感じていました。

5km

序盤はまだ余裕があったので、開始30分もしないうちからポッドキャストを聞きながら歩いていました。 全部を聞き逃さないようにするほどのものじゃないけど、聞くことで頭のリソースをいい感じに消費してくれてよかったです。

10km

途中、公式マップに公衆トイレの記載がありましたが、坂を下った先にあったせいか、誰も向かっていなかったので自分もスルー。 その後に入ったコンビニのトイレはかなり混雑していて、10分近く待った気がします。 導線としてはあまり良くないなと思いました。

とはいえ、大きなロスもなく、最初のチェックポイントまでたどり着きました。 13:00ごろだったようです。

最初のCPでは、入口にいたスタッフのお兄さんのテンションがかなり高く、それだけで少し元気が出ました。

この時点では、まだ「歩いたことのある距離」の範囲だったので、余裕はありました。


CP2まで

この区間は、ひたすら海岸線を歩くルートでした。

遠くに江の島が見えていて、「少しずつ近づいてるんだろうな」と思っていたのですが、体感では全然近づかない。

景色の変化も少なくて、「全然進んでない感覚」がじわじわストレスになってきました。

音楽はそのまま流していたんですが、1曲終わっても距離が全然進んでない感じがして、だんだんメンタルにきいてきました。

ただ、茅ヶ崎のあたりは沿道からの応援がかなり多くて、すごく元気をもらいました。

最後の区間を除けば、一番応援してもらった区間だった気がします。

CP2で靴を脱いでみたら、足にマメができていました。 マメ対策のパッドを貼ってみたものの、靴下を履くときにずれてしまい、正直どれくらい効いたのかはよくわかりません。


CP3

かなりきつかった区間です。

このあたりから左膝が痛み始めて、階段を普通に下れなくなりました。

もともと個人的な目標が「50km地点まではいく」だったので、とりあえずCP3までは頑張ろうという気持ちで進んでいました。

ただ、このあたりではもう「つらい」以外の感情がほとんどなかった気がします。

疲れや痛みに加えて、思っていたよりずっと時間がかかっていることが、精神的にかなりきていたんだと思います。

最後の坂も、「これ本当に登れるのか」と思いながら、ほぼ気合だけで登りました。

CP到着後、ちょうど子供が寝る時間だったので電話したのですが、「もう無理」と言っていたくらいにはダメージを受けていたようです。

周りの参加者の会話から「痛み止めを飲むとかなり違う」という話が聞こえてきて、ここでロキソニンを投入。

さらに風が強くなって寒くなってきたので、カイロをお腹に貼りました。 これがかなり良かったです。

腕は寒いままでしたが、お腹が温まるだけでだいぶ違いました。

なお、このあたりからコンビニでポケモンカードをちょこちょこ買い始めていました。 疲れすぎて謎行動が始まっていたんだと思います。


CP4

ロキソニンが効いてきたのか、一時的に痛みはかなり軽くなりました。

とはいえ膝自体は完全に壊れていて、階段は手すりにつかまりながら降りる感じでした。

この区間では、保土ヶ谷バイパスや横浜など、知っている景色が出てきたのがかなり良かったです。

知っている場所を歩いているというだけで、精神的にだいぶ楽になりました。

ただ、保土ヶ谷バイパスからそのまま横浜に向かうわけではなく、少し遠回り気味のルートで、「なんでこっちなんだろう」と思いながら歩いていました。

横浜スタジアム付近まで来たあたりで、ぱらぱらと雨が降り始めました。

ここでゴアテックスの帽子がかなり役立ちました。 頭が濡れなかったおかげで体まで大きく濡れる感じはなく、レインウェアをちゃんと着たのはCP4を出てしばらくしてからでした。

CP4では足裏の状態を確認して、マメができていることを再確認。 ただ、もともとダメージが出ていた指先については、怖くてちゃんと見られませんでした。

また、このあたりから右膝も痛み始めます。

CP4で食べたカップラーメンはかなり救いでした。

さらに、靴紐を結ぶのを手伝ってくれるスタッフの方がいて、地味に癒やされたのを覚えています。


CP5

この区間は雨がかなり強くなる時間があって、歩きながらレインウェアを取り出していました。

市街地に入って信号も増えてきたのですが、信号で止まるたびに参加者みんながストレッチをしていたのが印象的でした。

止まると身体が固まるので、少しでも回復しようとしてたんだと思います。

深夜帯だったこともあり、コンビニ前で体育座りしたまま寝ている人もいました。

「なんだこの状況」と思いつつも、どこか他人事みたいな感覚で見ていました。

足はかなり痛かったものの、そこまで大きくペースが崩れる感じではなく、休憩を挟みながら進んでいました。

東京都に入る看板を見たときは、「そろそろゴールが近い」と感じてかなり元気が出たのを覚えています。

このあたりで、「残り距離を頻繁に確認すると精神的にきつい」ということに気づいて、あまり見すぎないようにしていました。

これはかなり良かった気がします。

CP5では鍼を受けられるということで、到着してすぐ並びました。

土踏まずが痛いという話をしたら、ふくらはぎや腰のあたりに鍼を打ってもらいました。

その瞬間、足にビリビリっとした感覚があって、一気に血が流れるような感じがしました。

鍼すごい。

少し元気が戻ったのと、残り14kmという距離が見えてきたことで、「焦らず進めばゴールできそう」という感覚が出てきました。


最後の10km

最初の数キロは、知っている場所も多くて、比較的元気に歩けていました。

ただ、90kmを超えたあたりから、突然左足首と足の付け根に激痛が出始めます。

普段なら歩くのをやめるレベルの痛みでした。

とはいえこの時点で残り10km、制限時間には3時間半以上の余裕がありました。

なので、「とにかく少しずつでも進もう」と、休んでは歩いてを繰り返していました。

この区間は、5km進むのに1時間半以上かかっていたと思います。

とにかく痛かったので、「どう歩けば一番痛みが少ないか」を模索しながら歩いていました。

ただ、かばって歩くと別の場所に負担が来ます。

結局、しばらくすると右足首まで痛くなってきました。

信号のたびに座れる場所を探して座り、なんとか残り5km地点まで到達。

そこで、近くにいた参加者の方に「つらいですね」と声をかけました。

そのあと一緒に話しながら歩くようになったのですが、不思議なくらい元気が戻ってきました。

痛み自体は残っているのに、最後の5kmは休憩せず歩き切ることができました。

最後の1kmは、その方を応援しに来ていた、前日にリタイアした方も一緒に歩いてくれました。

一人だと、どうしてもつらい方向ばかり考えてしまいます。

でも誰かと一緒に歩くだけでこんなにも頑張れるんだなと、素直に驚きました。

そのまま、無事にゴール。

ゴール後にも鍼があって、本当は受けたかったのですが、30分待ちだったので断念しました。

なお、ゴールして終わりではありません。

足は完全にボロボロの状態だったので、公共交通機関で帰るのがかなり大変でした。

幸い電車では比較的座れたのですが、駅構内の移動や家まで歩く時間が本当にきつかったです。

たぶん人生で一番ゆっくり歩いていました。


感想

100kmウォークは、単純な体力勝負というより、痛みとか、時間感覚とか、孤独とか、メンタルとか、寒さとか、補給とか、いろんな要素が積み重なるイベントだったなと思います。

特に後半は、元気かどうかより、壊れた状態でどう前に進むかの戦いだった気がします。

一方で、沿道の応援や、他の参加者との会話にはかなり助けられました。

一人だったら折れていたかもしれませんが、人がいるだけでこんなに違うんだなと強く感じました。

しばらくはもう歩きたくない気持ちですが、時間が経ったらまた出たくなるのかもしれません。

clasp + TypeScriptで作成したときの変換の挙動をメモする

zennに書こうと思ったけど、ほとんど自明なことなのでブログにメモとして残します。

残課題はarrayの関数の変換

claspとは

googleが作成しているGASをローカル上で開発できるようにしているツールです。 - https://github.com/google/clasp

TypeScriptにも対応しているため、型の恩恵等を受けることができます。 - https://github.com/google/clasp/blob/master/docs/typescript.md - 内部的にはts2gasを利用しているそうです。 - https://github.com/grant/ts2gas

初期設定

まずはプロジェクトの初期設定をします。 プロジェクトを作成して、型定義のnpmを追加します。 clasp系の設定はリンク等を参照してください。 - https://qiita.com/HeRo/items/4e65dcc82783b2766c03

npm init -y
mkdir src
npm i -S @types/google-apps-script
clasp create --type standalone --rootDir ./src
  • 公式のドキュメントにしたがって、tsconfig.jsonも設定します。
{
  "compilerOptions": {
    "lib": ["esnext"],
    "experimentalDecorators": true
  }
}
  • 最初の挙動を確かめるために、サンプルにあったソースをそのまま利用します。
const greeter = (person: string) => {
  return `Hello, ${person}!`;
}

function testGreeter() {
  const user = 'Grant';
  Logger.log(greeter(user));
}
  • GASにプッシュします。
clasp push
  • GASのコンソールから結果を確認してみます。
  • constがvarになっているのと文字の連結が変わっています。
// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var greeter = function (person) {
    return "Hello, " + person + "!";
};
function testGreeter() {
    var user = 'Grant';
    Logger.log(greeter(user));
}

各種挙動を確認する

  • class等の記法がどのような形で変換されるのかを見ていきます。

class

  • 変換前
class Clazz {
  constructor(private member: number) {}

    get item() {
        return this.getItem();
    }

    getMember() {
        return this.getMember();
    }

    private getItem() {
        return 'item';
    }

    static factory(member: number) {
        return new Clazz(member);
    }
}
  • 変換後。prototypeベースに置き換わっています。
// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var Clazz = /** @class */ (function () {
    function Clazz(member) {
        this.member = member;
    }
    Object.defineProperty(Clazz.prototype, "item", {
        get: function () {
            return this.getItem();
        },
        enumerable: false,
        configurable: true
    });
    Clazz.prototype.getMember = function () {
        return this.getMember();
    };
    Clazz.prototype.getItem = function () {
        return 'item';
    };
    Clazz.factory = function (member) {
        return new Clazz(member);
    };
    return Clazz;
}());

import/export

変換前

  • module.ts
export const hoge = () => 'hoge';

export const constTest = 'test'
  • sample.ts
import { hoge, constTest } from "./module";

function test() {
    console.log(hoge());
    console.log(constTest);
}

変換後

  • module.gs
// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var exports = exports || {};
var module = module || { exports: exports };
exports.constTest = exports.hoge = void 0;
var hoge = function () { return 'hoge'; };
exports.hoge = hoge;
exports.constTest = 'test';
  • sample.gs
// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var exports = exports || {};
var module = module || { exports: exports };
//import { constTest, hoge } from "./module";

hoge();
  • sample.gsは実行すると失敗します
ReferenceError: constTest is not defined
  • よくよく見てみると、export const で定義したfunctionは成功しますが、変数はエラーになっています。
  • これは、module.tsでhogeはvarとして定義されているために、global変数だとみなされているため参照できるようになっています。
  • ただし、constTestはexportsのメンバ変数として定義されているので、exports.constTestのように呼び出ししないとうまく動作しません

    • にしても、exportsがグローバルなので、変数の競合があると意図しない動きになると思います。
  • 解消方法としては以下の3点があります。ここでは詳細では取り上げません。興味があれば公式のドキュメントを見てみてください。

    • exportsを明示的に変数として定義して、そこから読み込むようにする
      • なんかトリッキーな書き方ですね。複数のモジュールをimportしたいときにうまく動かなそうな感じがする。
    • namespaceを利用する
      • namespace使っていいのか問題はあるが、割と簡単。
    • 先にwebpack等でトランスパイルしてからGASにプッシュする
      • GAS上で見にくくなってもいいならよさそう

namespace

変換前

namespace Module {
  export function foo() {}
  function bar() {}  // this function can only be addressed from within the `Module` namespace
}

変換後

// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var Module;
(function (Module) {
    function foo() { }
    Module.foo = foo;
    function bar() { } // this function can only be addressed from within the `Module` namespace
})(Module || (Module = {}));
  • Moduleという変数が定義されていて、それの変数として、foo、barが定義されています。
  • そのため、moduleは外からの呼び出しにも対応できます。

array

変換前

const number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

number.find((i) => i === 10);
number.findIndex((i) => i === 10);
number.filter((i) => i % 2);
number.map((i) => i ^ i);
number.reduce((pre, cur) => pre + cur, 0);
number.some((i) => i % 2);
number.slice(0);
[...number].sort((a, b) => b - a);
number.forEach(a => a);
number.every(i => true);

変換後

// Compiled using clasp-test 1.0.0 (TypeScript 4.3.5)
var __spreadArray = (this && this.__spreadArray) || function (to, from) {
    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
        to[j] = from[i];
    return to;
};
var number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
number.find(function (i) { return i === 10; });
number.findIndex(function (i) { return i === 10; });
number.filter(function (i) { return i % 2; });
number.map(function (i) { return i ^ i; });
number.reduce(function (pre, cur) { return pre + cur; }, 0);
number.some(function (i) { return i % 2; });
number.slice(0);
__spreadArray([], number).sort(function (a, b) { return b - a; });
number.forEach(function (a) { return a; });
number.every(function (i) { return true; });
  • スプレッド変数のみ変換がかかっていて、ほかのarrayはそのままになっています。
  • ES3相当の変換なのに、ES3で存在しないはずの変数が残っている。。ここではまったので別の機会に解消の仕方を書きます。

育休からはや半年経過

育児休暇から早くも半年がたとうとしています。 色々振り返ってみたことを記載しておきます。

育休はやっぱりいい

平日はどうしても仕事が大半の時間を占めるので、子供と向き合える時間は結構少ないと改めて感じている。

特に生まれてすぐは成長が早いので、日ごとにできることが変わっていく。

最近だと、ずりばい覚えたらすぐに家じゅうを動き回るようになったり。

そんな中で、子供とゆっくり(夜に強制的に起こされたりはするけど)接する時間を持てたことはとてもありがたい。

仕事について

家でコロナの感染者が出ると、色々と大変なので、在宅勤務をメインとしている。

長女が保育園から帰った後に一気に家事の負担が増えるので、なるべく仕事を早い時間に終わらせたい。

そのため、朝5時~7時で仕事をすることによって18時までには仕事を終わらせるようにしている。 7時~9時は家族と一緒にすごして、9時ごろからまた仕事している。

朝の時間は勉強や技術記事書いたりする時間にあてていることも多いので、めっちゃ仕事しているわけではないが。。

変則的な働き方でも特に文句言われたりしないので、今の会社で働けていることにとても感謝している。

ちなみに、夜は子供と一緒に寝ることにしているので、22時くらいに寝ることが多い。

働き方について

子供と過ごす時間が以前と比べてだいぶ長くなった。 以前だったら、朝ご飯を食べさせて、保育園に一緒行くくらいしか時間がなかった。夜は帰ったら大体寝ているか寝かしつけの途中で話す時間はなかった。 子供とかかわれる時間が増えたことはうれしい。ご飯食べたら一緒に遊んだり、お風呂はいったり。

一方で、自分の時間がめっちゃ減っている。 今までは通勤の時間は自由だったので、読書など好きなことをしていた。 今は在宅勤務なので、移動時間がない。そのため、家事 → 仕事 → 家事のようにやることが常にあって、のんびりする時間がない。 子供が一人遊びうまくなってきたので、もうちょっとすれば、夕食後に時間が取れるようになるのかもしれない。 まあ、一緒に遊んでくれるのもそんなに長くないと思うので、できる限りは遊んであげたいとは思う。

体重を定期的に計測して1年が経過した

前職の健康保険組合ではポイントが毎年付与されていた。

健康に関するもの限定ではあったが、交換する商品は幅広く、医薬品以外にもApple Watchやキャンプ用品など結構なんでもありだった。

前職を辞めるときに使い切る必要があり、色々買ったものの中に体重計があった。

www.amazon.co.jp

ずっと前に、体重を毎日はかるだけで痩せるっていう紹介がテレビでされていた。

その際にしばらく体重を毎日はかってみたが、特に効果がなかったのでそれ以来は体重をはかる習慣はなかった。

今回はスマホ連携できる体重計を手に入れたので、体重を毎日記録することにした。

記録するコストが小さいので、1年以上たった今でも毎日体重測定ができている。

1年間体重測定だけした結果、体重がグラフのようになった。

f:id:nyaonyaoto:20210910055712p:plain
体重測定

数値だと大体75kg → 68kg。

一時期、リングフィットして運動していたにしても、基本的に在宅勤務で全然動かないのに体重はだいぶ減った。

良かったのは以下の3点なのかなと考えている。

  • 定期的に体重計に乗ることによって、その日に食べたもののフィードバックができる

    • 体重が増えると、その日に食べ過ぎたのか、何か別の要因があるのか考えさせられる
    • 大体の場合、平日は体重が減って、土日にちょっと戻るっていうのを繰り返している
    • 平日はお昼ご飯をぱっと済ませることが多いので、その影響が大きいのだろう。
    • リングフィットした当日は体重はちょっと増え気味で、翌日から減るパターンが多かった気がする。あれ、筋肉量減っているってことか?  
  • ご飯の量を減らした

    • お米の量をはかることが増えた。今は1食130gくらいかな。
    • ただ、長女が残したやつも結構食べているので、150gくらいな気がする。
    • そうめん茹でると何故か目測を誤って茹ですぎるらしく、体重が増える。
  • 単純に体重が減るとうれしいので正のフィードバックが働く

    • 今日はお菓子食べなかったから体重減っているなーとか考えるの楽しい

どうでもいいけど、markdown記法で日記っぽく書くのなんか難しい。

AppSyncでnodeクライアントアプリを作成後、webpackでバンドルすると「realFetch.call is not a function」というエラーが発生する

何度かはまったので、メモです。

  • isomorphic-fetchの特定のバージョンでwebpackした場合にうまく動作しなくなるエラーが発生します。

github.com

  • isomorphic-fetchが3.0.0だと発生するので、2.2.1以下のバージョンに変更してあげる必要があります。

  • おそらく、このチュートリアルをなぞって開発すると発生します(未検証) docs.aws.amazon.com

  • 以前のチュートリアルだとisomorphic-fetchのバージョン指定があったのだが、いつの間にかなくなってる。。

余談

  • はじめてPR送ったけど、数か月だった今でも反応なし。。

github.com

npm7にバージョンアップした後にserverless frameworkでエラーが出るようになった

メモです。

概要

npmのバージョンを7にしました。

そのあとに以前から使っていたプロジェクトでserverless deployをしたところ以下のようなエラーが出ました

npm.cmd ls -prod -json -depth=1 failed with code 1

環境

  • Operating System: win32
  • Node Version: 14.17.0
  • Framework Version: 2.55.0 (local)
  • npm 7.20.6

エラー詳細と調査

Error: npm.cmd ls -prod -json -depth=1 failed with code 1
      at ChildProcess.<anonymous> (C:\workspace\xxxx\node_modules\serverless-webpack\lib\utils.js:91:16)
      at ChildProcess.emit (events.js:376:20)
      at ChildProcess.emit (domain.js:470:12)
      at maybeClose (internal/child_process.js:1055:16)
      at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5)
  • エラーの文字文字列を調べてもなかなかわからず、node_modulesを削除してみたり、yarn.lockを削除したりしました。が全然解消しませんでした。
  • serverless offlineは起動するのとエラーの発生した部分がwebpackだったのでその周辺を調査すると原因がわかりました。

解決

  • 以下のリンクと同じ原因でした。なので、serverless webpackのバージョンを上げるか、serverless-webpackのpackeagerをyarnに変更してあげればOK github.com

  • serverless-webpackのプラグインは一部のエラーは無視するように作られているようです。

  • npm7でエラーの出力形式が変わったために、従来は無視できていたエラーが引っかかるようになってしまったために発生するエラーのようです。

最後に

  • うまく検索できれば一発で解決できたのに。。勘所が鈍っている気がします。

育休2か月

本当は3月の最初に書こうと思っていたのですが遅くなってしまった。。。 育児休暇を取得して2か月がたちました。備忘としていろいろ書いていきます。

子供の成長について

  • 表情が豊かになってきた気がする。不満があると泣くのではなく、文句を言うのが何となくわかる感じ
  • 体重は 30g / day くらいで増えるらしいので、順調に成長している。まだ全然重くないけど、長時間抱っこしていると頭側が重くなってくる
  • ミルクは相変わらずあんまり飲まない。最初にやる気があっても、5分くらい飲んでいると満足するらしく寝てしまう。そのままではまずいので、1時間くらいかけて何とかして飲ませている。
  • ミルクの感覚が3時間おきから、4時間、夜には5時間になったのでちゃんと寝れるようになった。

時間について

  • 保育園は引き続き自粛していたので、制約なく自分の自由な時間があるのは1日1時間ないくらい。スマホ触るくらいであればちょいちょい時間はあるけど、子供の面倒見ないでそんなことしいて言いていいのか?ってなる。大体見ちゃうけど。
  • 義母に来てもらう間隔を隔日にしたので、家事をしているときなどは長女に我慢してもらうこともしばしば。家事と子供複数人の世話を一人でやっている世の中のお母さんってすごいなと改めて思う。

仕事について

  • スマホにslackが入っているのでslackのみ定期的に見ている。自分だけ仕事をしていないのにほかの人は仕事をどんどん進めているので、おいてかれる感じが強い。割り切ってあんまり見ないほうが良かったかもしれない。