読者です 読者をやめる 読者になる 読者になる

ようへいの日々精進XP

よかろうもん

2017 年 02 月 24 日(金)

日々

プラミアムフライデー

そっかー。そんな試みがあるのかーくらいのレベル感。

そろそろ

先週のフルマラソンの筋肉痛も和らいできた。

練習を再開しなければ。

フルマラソンは 30 キロからが難しいということを Python + Pandas と Excel で理解する(京都マラソン 2017 の結果を利用して)

python マラソン Excel

f:id:inokara:20170224201145p:plain

フルマラソンは 30 キロからが難しい

と言われていますが、本当なのか、そして、俺は何がダメで 3 時間を切れなかったかをランナーズアップデートで公開されている選手 5000 人の結果を利用して分析してみました。

p.kyoto-marathon.com

先日、走ってきた京都マラソン 2017 の結果を利用させて頂きます。

解析結果

5KM ラップタイムの遷移で見る 3 時間を切る人と切れない人

平均

f:id:inokara:20170225083956p:plain

まずは 5 KM ラップタイムを上位 10 人、ギリギリサブスリー 10 人、サブスリーまでもうひと頑張りの 10 人の各セグメントで平均を取って比較してみました。

上位 10 人

f:id:inokara:20170224202158p:plain

ゴールタイムは 2 時間 27 分〜 2 時間 43 分までの上位選手 10 人分。(25 キロは距離が短いので時間が短くなっている)

ギリギリサブスリーの 10 人

f:id:inokara:20170224202210p:plain

ゴールタイムは 2 時間 59 分台の選手 10 人分。(25 キロは距離が短いので時間が短くなっている)

サブスリーまでもうひと頑張りの 10 人

f:id:inokara:20170224202219p:plain

ゴールタイムは 3 時間 5 分台の選手 10 人分。(25 キロは距離が短いので時間が短くなっている)

見解

  • 上位 10 人は最初の 5KM通過時 と 40KM 通過時のラップタイムの差が小さい
  • サブスリーまでもうひと頑張り必要な人は最初の 5KM 通過時と後半の 5KM のラップタイムの差が大きい
  • 3 時間切れない人は一定したペースで 40KM 走りきる為の走力が備わっていないことが考えられる
  • 19 〜 21 分/5KMくらいの間でおさまるように走り切ることが出来ればサブスリー

フルマラソンは 30 キロからが難しい

最初の 5 キロ

f:id:inokara:20170224202323p:plain

最初の 5 キロはバラつきが多い。スタート直後なので自分のペースを探りながら走っているランナーが多いと思われます。(左にいくほど記録が良いランナー)

10 キロ

f:id:inokara:20170224202412p:plain

10 キロになるとペースが落ち着いてきています。(左にいくほど記録が良いランナー)

15 キロ

f:id:inokara:20170224202423p:plain

15 キロ以降は各ランナーは自分のペースを掴んで安定したペースで走り始めます。

20 キロ

f:id:inokara:20170224202432p:plain

25 キロ

f:id:inokara:20170224202439p:plain

30 キロ

f:id:inokara:20170224202447p:plain

フルマラソンの鬼門、30 キロ以降、各ランナーのペースが少しずつ乱れはじめているのがわかります。

35 キロ

f:id:inokara:20170224202455p:plain

40 キロ

f:id:inokara:20170224202716p:plain

35 キロ以降、最後の 10 キロに走力の差が歴然と出て来るように見えます。走力のある選手もラップタイムが下がってきてはいますが、ゴールタイムが遅くなる選手ほど最後の 5 〜 10 キロのタイムがそれまでの 5 キロと比べると下振れが大きくなっている(遅くなっている)ようです。逆に走力のある選手はタイムが上がっている選手もチラホラ見られます。

後半 15 キロのラップタイムの落ち込み

f:id:inokara:20170225084220p:plain

5 KM ラップタイムを上位 10 人、ギリギリサブスリー 10 人、サブスリーまでもうひと頑張りの 10 人の各セグメントで平均の平均を取り、最初の 5KM 通過時のタイムと 30KM と 35KM 及び 40KM 通過時の 5KM ラップの差分を比較してみました。40KM までの 5KM ではトップ選手でもラップタイムが落ち込んでしまっていることがわかります。但し、トップ選手の落ち込みよりも走力の低い選手の落ち込みが大きいように見られます。

見解

  • 通説通り、30 キロ以降は大体のランナーがラップタイムが下振れする(遅くなる)
  • 記録が芳しくないランナー(走力が無いランナー)程 30 キロ以降のラップタイムが大きく下振れする傾向が見られる

5000 人分の結果を csv ファイルに

結果の取得

ランナーズアップデートは各選手のゼッケン番号毎のページが存在していて、以下のように curlwget を使えばページの HTML を取得することが出来ました。

wget http://p.kyoto-marathon.com/numberfile/10265.html -O 10265.html

但し、頻度の高いアクセスは控えましょう

実際の結果ページは以下のようなページです。

f:id:inokara:20170224202842p:plain

Pandas ライブラリ

Pandas というライブラリを使えば HTML ファイルを解析して、テーブルデータに以下のようにアクセス出来るようになります。

$ python
Python 3.6.0 (default, Dec 24 2016, 07:27:52)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> url = 'http://p.kyoto-marathon.com/numberfile/10265.html'
>>> df = pandas.io.html.read_html(url)
>>> df[0]
           0                               1        2         3
0   地点名Point  スプリット (ネットタイム)Split (Net Time)   ラップLap  通過時刻Time
1        5km              00:23:45 (0:23:31)  0:23:31  09:23:45
2       10km              00:44:43 (0:44:29)  0:20:58  09:44:43
3       15km              01:05:07 (1:04:53)  0:20:24  10:05:07
4       20km              01:25:41 (1:25:27)  0:20:34  10:25:41
5        中間点              01:30:08 (1:29:54)  0:04:27  10:30:08
6       25km              01:46:28 (1:46:14)  0:16:20  10:46:28
7       30km              02:07:45 (2:07:31)  0:21:17  11:07:45
8       35km              02:29:29 (2:29:15)  0:21:44  11:29:29
9       40km              02:54:14 (2:54:00)  0:24:45  11:54:14
10    Finish              03:05:17 (3:05:03)  0:11:03  12:05:17
>>>

各要素へのアクセスは以下のように。

>>> df[0][1]
0     スプリット (ネットタイム)Split (Net Time)
1                 00:23:45 (0:23:31)
2                 00:44:43 (0:44:29)
3                 01:05:07 (1:04:53)
4                 01:25:41 (1:25:27)
5                 01:30:08 (1:29:54)
6                 01:46:28 (1:46:14)
7                 02:07:45 (2:07:31)
8                 02:29:29 (2:29:15)
9                 02:54:14 (2:54:00)
10                03:05:17 (3:05:03)
Name: 1, dtype: object

5000 人分の結果を csv ファイルに

wget で取得した 5000 人分のデータを以下のように csv ファイルに書き出しました。

import glob
import pandas
import csv

with open('output.csv', 'a') as c:
    writer = csv.writer(c, lineterminator='\n')

    file_list = glob.glob('./*.html')
    for file in file_list:
        bib_number = file.split('.')[-2].split('/')[-1]
        # print(bib_number)
        with open(file, 'r') as file:
            table = pandas.io.html.read_html(file.read())
            column = []
            for value in table[0][2]:
                column.append(value)

            # 途中でリタイヤした人対応
            if len(table[0][1]) == 11:
                column.append(table[0][1][10].split('\u3000')[0])

            column.insert(1, bib_number)

            print(column[1:])
            writer.writerow(column[1:])

ということで

サブスリーに向けて

現時点で走力が無い自分がどうするべきか。

  • 20 〜 21 分/5KM で走りきるように頑張る
  • 後半の落ち込みを考えると 19 分台で走れればなお良し
  • 京都マラソンでは前半の 5 KM が 23 分掛かっているので、最初から 20 分台、21 分台で押せるように心がける(トイレ注意)

Python + Pandas

ちょー便利です。

特定の EC2 インスタンスのみ操作出来る IAM Policy の一例

aws ショートメモ

要望

A という IAM ユーザーに特定のインスタンスのみ「起動」と「停止」と「再起動」を出来る権限を付与したい。

一例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:*",
                "ec2:Describe*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:ap-northeast-1::instance/${操作したいインスタンス ID}"
        }
    ]
}

他にもあるのかしら。

登録例

#
# Policy ドキュメントの作成
#
cat << EOT >> policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:*",
                "ec2:Describe*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:ap-northeast-1::instance/${操作したいインスタンス ID}"
        }
    ]
}
EOT

#
# Managed Policy にポリシーを登録する
#
_AWS_PROFILE=washino-profile
_POLICY_ARN=$(aws --profile ${_AWS_PROFILE} iam create-policy --policy-name Ec2OpePolicy --policy-document file://policy.json --query Policy.Arn --output text)
echo ${_POLICY_ARN}

#
# A ユーザーにポリシーを適用する
#
_USER_NAME=user_a
aws --profile ${_AWS_PROFILE} iam attach-user-policy --policy-arn ${_POLICY_ARN} --user-name ${_USER_NAME}
aws --profile ${_AWS_PROFILE} iam list-user-policies --user-name ${_USER_NAME}
aws --profile ${_AWS_PROFILE} iam get-user-policy --user-name ${_USER_NAME} --policy-name Ec2OpePolicy

以上

メモでした。

2017 年 02 月 23 日(木)

日々

そら豆

鹿児島から「そら豆」が届く。早速、奥さんに剥いてもらって茹でて食した。

綺麗な緑色で本当に美味しかった。

たんかん

こちらも鹿児島のおばさんから「たんかん」が届く。

有り難い。

そういえば

今日は思ったよりも冷えた一日だった。

2017 年 02 月 22 日(水)

日々

にーにーにー

2 月 22 日でにーにーにー。

引き続き

筋肉痛が続いている。

ランニングシューズを

新調しようと思って、近所のスポーツデポに出向いたが、イマイチだったので見送る。

2017 年 02 月 21 日(火)

日々

溜まっていた仕事

を片付けた。

筋肉痛

筋肉痛はだいぶん治まってきた。

従来に比べて体へのダメージが大きいような気がする。例えば、足の筋肉痛がだいぶん辛い。

ストレッチや軽い運動で少しずつ緩和出来たらなって考えている。

2017 年 02 月 20 日(月)

京都三日目

両親と二条城を散策。

歴史的な建造物等にあまり興味が無くてサラッと流して見たいのは父譲りだった。

錦市場

奥さんやお義母さん、両親とは全く別行動になってしまったので、錦市場の入り口のかき小屋的なお店で焼き牡蠣を食べる。

ということで

マラソンはきつかったけど楽しい京都旅行だった。

同じマンションのおじさんにごちそうになる

自宅マンションの下で同じマンション住んでいる気さくなおじさんに声を掛けられて、そのまま呑みに連れていってもらった。

色々とお話出来て本当に楽しかった。

2017 年 02 月 19 日(日)

日々

京都マラソン

サブスリーの壁は分厚くて高かった。

inokara.hateblo.jp

もはや、何も語るまい。

鹿児島マラソンで頑張るのみ。

久しぶりに

マラソンの後でお風呂に入ったら湯船でうたた寝。

ごけんしも

久しぶりに「ごけんしも」でご飯を食べた。

京・楽膳 五けんしも

AWS SDK for Ruby から Lambda の update_function_code を叩く時にハマったこと

ruby aws Lambda メモ

結局は…

  • ドキュメントよく読めってことだった

経緯

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1217

$ bundle exec ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]

$ bundle exec gem list | grep aws
aws-sdk (2.7.11)
aws-sdk-core (2.7.11)
aws-sdk-resources (2.7.11)
aws-sigv4 (1.0.0)

やりたいこと

ローカルの zip ファイルをアップロードしたい。

  • /path/to/zipfile.zip

ドキュメントには

update_function_code のサンプルには以下のように書かれている。

resp = client.update_function_code({
  function_name: "myFunction", 
  publish: true, 
  s3_bucket: "myBucket", 
  s3_key: "myKey", 
  s3_object_version: "1", 
  zip_file: "fileb://file-path/file.zip", 
})

オプションの zip_file: の説明は以下のように書かれていたりしたので…(IO, String と書かれている時点で気付くべきだった…)

:zip_file (IO, String) — .zip file containing your packaged source code.

なるほど、ファイルのパスを渡せばいいのね。

ところが…

Aws::Lambda::Errors::InvalidParameterValueException: Could not unzip uploaded file. Please check your file, then try to upload again.

なんでだろう。

解決

一つの issue

以下の issue がヒントをくれた。

https://github.com/aws/aws-sdk-ruby/issues/942

この issue 自体はドキュメントの誤り(zip ファイルって Base64 エンコードする必要あるの?、ないの?)を指摘するものだが、コメントを付けていた pchaganti 氏曰く、

ボクらは IO.read(path_to_zip) を使っているよ

ほう。そうなんや。

ということで

以下のように書くことで無事に zip ファイルをアップロードすることが出来ましたとさ。

def update_function_code(function_name, zip_file_path)
  client = Aws::Lambda::Client.new(region: 'ap-northeast-1', profile: ENV['_AWS_PROFILE'])
  zip_file = IO.read(zip_file_path)
  res = client.update_function_code({
    function_name: function_name,
    zip_file: zip_file
  })
end

以上

メモ

でした。

参考

サブスリーの壁を超えることが出来ずに悔しかった 〜 京都マラソン 2017 に走ってきた 〜

日々 マラソン

マラソン日和

www.kyoto-marathon.com

昨日までの天気予報が嘘のような快晴となったマラソン日和。

f:id:inokara:20170219180142j:plain

24 年振りくらいの西京極陸上競技場をスタートし、京都市内の観光名所をグルっとして平安神宮にゴールする京都マラソン 2017 に出走した。

結果

目標は当然サブスリー

昨年の鹿児島マラソンに走った際に記録した 3 時間 09 分 18 秒(ネットタイム)が自己記録だったので、今回は思い切ってサブスリーを目標として先頭付近からスタートさせてもらった。

inokara.hateblo.jp

が…世の中はそんなに甘くなく、35 キロ過ぎから足が動かなくなり、ジョギング状態。30 キロ過ぎるくらいまでは頑張ればサブスリーいけるかもと思ってしまっても、そのままゴール出来ないのがサブスリーの壁。以下は 5 キロごとのラップタイム。

f:id:inokara:20170219180051p:plain

残り 5 キロがジョギング以下。女性ランナーにもサクサク抜かれて泣きそうになった。

反省点

  • 5 キロ過ぎから 20 キロ過ぎまでのアップダウンに愚直に反応したことで足への負担が大きくなってしまった
  • ペース設定を行っていなかったので前半がオーバーペース気味
  • 当然のことながらオーバーペース

京都マラソンを走ってみて

景色を楽しめた

幸い、前半はあまりきつくなかったので京都の景色を楽しみながら走ることが出来た。名所や寺社仏閣等にはあまり興味無いので「あー、これが嵐山かー」、「おー、これが鴨川かー」、「なんか、厳格な雰囲気のお寺やなあ」くらいの感動しか無かったけど、車や電車を利用してグルっと回るよりは良かった。

途中に全国高校駅伝のコースを走ることが出来た

これも楽しみの一つだった。高校時代、都大路を走ることが出来なかったので、ずーっと憧れのコースだったので、もし、高校時代、自分がここを走っていたらどんな感じだったんだろうと沿道のショーウィンドウに写る自分の姿とダブらせて考えていた。

途切れない沿道の声援が暖かかった

鹿児島マラソンや福岡マラソンには所々、滅多に人が歩いて通ることのないような道があり人の声援が途切れてしまう箇所があったが、京都マラソンは市内をグルっと回ることから沿道の声援が途切れることが無くて声援に何度も背中を押された。

また、ボランティアの方々が大勢参加されていて大会の大きな支えになっていたと思う。

最後に

大会を支えてくれた役員の方、ボランティア、沿道で絶え間ない声援を送って下さった観客の皆さん、老人三人を引率して応援に声を枯らしてくれた奥さん、老体に鞭を打って応援してくれたお義母さん、両親、林田くんは難波で呑んだくれている中を応援に駆けつけてくれた奥さんの友人のガミ、本当に有難うございました。

また、来年も走りたいと思う。