ようへいの日々精進XP

よかろうもん

2018 年 11 月 16 日 (金)

ジョギング

  • 山王公園を往復 30 分くらい
  • 回復傾向, やっぱり体を動かした方が回復具合は良いような気がする

日課

  • お休み

免許更新

  • 久しぶりのゴールド返り咲き
  • 安全運転を肝に命じて, ゴールドの免許に恥じないドライバーになるぞ

Serverless Meetup Fukuoka

今日もさくらインターネットさんのオフィスで.

Serverless という文脈でこれほどの人が集まるのか (Serverless に興味があるのか) ということを再認識した.

簡単なお疲れ様会は「串カツ田中」で. お腹いっぱい食べて飲んだりしたけど 3000 円弱ということで, このコスパの破壊力に驚いた.

AWS リソースを Backlog Wiki によしなにドキュメント化 (一覧化) するツール, その名も furikake を作った

tl;dr

ギョームにて AWS リソース一覧を Backlog WikiExcel にまとめる度になんて不毛な作業をやっているんだろうと自問自答を繰り返しておりました.

そう, EC2 を追加したり削除する度にそれらの WikiExcel 表は誰がいったい更新するんだ, きっとそのうち誰もこの WikiExcel 表はメンテナンスされなくなるんだろう, そして, なにかトラブルが起きた時には情報が古いままになっているとか...せめてコマンド一発でこれらの WikiExcel 表が更新できたらどんなに嬉しいものかと...思いは強くなっていきました.

ということで, JAWS-UG もくもく会を利用して, この不毛な状態から脱すべく俺得ツールをざくっと作ってみました.

作ったもの

furikake

github.com

名前は「ふりかけ」です. 特に意味は無いつもりでしたが, 実装している間に思いついたのが, 白いごはんに彩りを添える「ふりかけ」のように, 真っ白な WikiExcel シートに各種情報という彩りを添えるという意味をこじつけてみました.

とりあえず,「ふりかけ」には以下のような機能を実装しました.

  • 指定した AWS アカウントの指定したリソース一覧を取得して Backlog Wiki に投稿する
  • 一覧を取得したい AWS リソースは出来るだけ簡単なコードで追加出来ること (とりあえず, 自分が確認したかったリソースは追加した, AWS リソース以外にも対応可能だと思う)
  • 投稿先は出来るだけ簡単なコードで追加出来ること (とりあえず, 現状は Backlog Wiki だけ)
  • シンプルなコマンドラインツール

ひとまず, 自分がやりたいことは実現出来たので, 今後は色々と便利そうな機能を追加していきたいと考えています.

使い方

インストールは git clone でしばらくはお願い致します.

$ git clone git@github.com:inokappa/furikake.git
$ bundle install --path vendor/bundle

リソース一覧を貼り付けたい Backlog Wiki を作成します. この時に Wiki 名は適当で構いません. また, Wiki の本文は適当な文字を入れて下さい. (コンテンツが無いと Wiki は作成できないようです) 作成した Wiki の ID を控えておきます.

Wiki を作成したら, 以下のような .furikake.yml を作成します. (.furikake.yml の名前は固定しています)

backlog:
  projects:
    - space_id: 'your-backlog-space-id'
      api_key: 'your-backlog-api-key'
      top_level_domain: 'your-backlog-top-level-domain'
      wiki_id: your-wiki-id
      wiki_name: 'your-wiki-name'
      header: >
        # Test Header
      footer: >
        # Test Footer

headerfooter はリソース一覧の上下に挿入されるコンテンツとなります. 上記の例では # Test Header# Test Footer がリソース一覧の前後に挿入されますので, 実際の出力は以下のような内容にとなります.

# Test Header

# リソース一覧

## EC2

...

## ELB

# Test Footer

尚, Backlog Wiki への投稿については, 以下のライブラリを利用していますので, パラメータ名等はこのライブラリに依存します.

github.com

.furikake.yml を作成したら, 以下のコマンドを実行して投稿される予定のリソース一覧を確認してみます.

$ bundle exec furikake show

以下のように出力されます.

$ bundle exec furikake show
# インフラ構成 (自動更新テスト用)
## 全体構成
ここに構成図なんかはっちゃったりして
## リソース一覧

### EC2

Name|Instance ID|Instance Type|Availability Zone|Private IP Address|Public IP Address|State
:-|:-|:-|:-|:-|:-|:-
...

## 詳細情報
### リポジトリ
* ソースコードの URL とか張ったりして

特に問題無いようであれば, 以下のコマンドを実行して Backlog Wiki にリソース一覧を投稿します.

$ bundle exec furikake publish

今のところ, 失敗する以外は, 特にメッセージが出ません. 冒頭で作成した Backlog Wiki を見ると, 以下のようにいい感じでリソースの一覧 (図では EC2 だけですが...) を確認することが出来ます.

f:id:inokara:20181116143637p:plain

いい感じです.

ちっぷす

Tips というか, 「ふりかけ」は利用者のニーズによって, 出来るだけ拡張し易く作ったつもりです (まだ, たくさんの改善の余地はありますが...). 例えば, リソース一覧に含めたい AWS リソースがある場合, ソースコードlib/furikake/resources/ 以下に簡単なコードを置くことでリソースの種類を追加することが出来ます. 以下, README にも記載していますが, ELB (Classic Load Balancer) のリソース一覧を取得するコードです.

module Furikake
  module Resources
    module Clb
      def report
        resources = get_resources
        headers = ['LB Name', 'DNS Name', 'Instances']
        if resources.empty?
          info = 'N/A'
        else
          info = MarkdownTables.make_table(headers, resources, is_rows: true, align: 'l')
        end
        documents = <<"EOS"
### ELB (CLB)

#{info}
EOS
        
        documents
      end

      def get_resources
        elb = Aws::ElasticLoadBalancing::Client.new
        elbs = []
        elb.describe_load_balancers.load_balancer_descriptions.each do |lb|
          elb = []
          elb << lb.load_balancer_name
          elb << lb.dns_name
          elb << (lb.instances.map(&:to_h).map {|a| a[:instance_id] }).join(',')
          elbs << elb
        end
        elbs
      end

      module_function :report, :get_resources
    end
  end
end

report というメソッド名を遵守して頂いて, 且つ, 以下のようなフォーマットのデータを返すように実装するといい感じになります.

[['ID', 'Name', 'Status'], ['ID', 'Name', 'Status'], ['ID', 'Name', 'Status']]

ただし, 現在はソースコードを追加した後で, lib/furikake/resource.rbtypes にリソース名を追加する必要があります...ごめんなさい.

module Furikake
  class Resource
    def initialize
    end
    
    def generate
      types = %w(
        ec2 alb clb lambda elasticsearch_service
        kinesis rds directory_service
      )

      documents = ""
      types.each do |type|
        require "furikake/resources/#{type}"
        eval "documents.concat(Furikake::Resources::#{type.camelize}.report)"
        documents.concat("\n")
      end
      documents
    end
  end
end

以上

まだまだ

「ふりかけ」には改善の余地がたくさんあります. 例えば, Backlog Wiki 以外の Github Wiki や Gist 等に投稿出来るようにしたいなと考えています. また, Excel 表も考慮して CSV 出力も出来ればなあと考えています. また, 機能以外にもエラー処理が残念ながら不十分ですので, 今後, ぼちぼち整備していこうかな〜と思っています.

awspec

「ふりかけ」の実装にあたり, awspec の実装をめちゃくちゃ参考にしてみました. めちゃくちゃ参考にした割には...残念な感じになっているかもしれませんが, awspec は AWS リソースを取得して色々する処理を書く時にとても参考になると思います. そして, awspec 同様にリソースの種類の追加は比較的容易に行えるようになっているはずですので, awspec のような成長を遂げてくれるとやばい感じになると思います.

ということで,「awspec だ〜いすき♡」(ハズキルーペ CM 風)

ということで

興味を持って頂けた方, ぜひ, 触って頂いてフィードバックを頂けると嬉しいでござります.

2018 年 11 月 15 日 (木)

ジョギング

  • 山王公園を往復 30 分くらい
  • 右足がめちゃくちゃ張っていて痛いことに今更気づく

日課

  • お休み

JAWS-UG 福岡もくもく会

今日はさくらインターネットさんのオフィスで.

ざっくりやりたいコードは書けたので, あとは拡張し易くしつつ, テストを書いて gem 化してみようと思う.

あと, 青柳さんが, 明日の Serverless Meetup 福岡で喋る資料を使って LT をしてくれた. 毎回, 青柳さんの資料は丁寧な作りで話も解りやすくて勉強になった.

夕飯

もくもく会の後, 近所の気になっていた焼き鳥屋さんにて. 板わさを頼んだらワラジみたいは蒲鉾が出てきたのには笑ってしまったが, 焼き鳥自体は自分の口では 40 点くらい.

アルゴリズムとプログラミング 「第 7 章 配列の操作」の予習とまとめ

これは

放送大学教養学部の「アルゴリズムとプログラミング」という授業で使われる「アルゴリズムとプログラミング」という教材書籍を自分なりにまとめたものです.

1. 配列のデータ挿入

既にデータが挿入されている配列に要素を追加する場合を考える.

添字 0 1 2 3 4 5 6 7 8 9
データ 100 300 500 400 700 800 600

添字 6 にデータを追加する場合, データを追加するだけなので特に難しいことは無い. ところが, 以下のように添字 0 にデータを挿入する場合, 各添字のデータを右に 1 つずつ移動して添字 0 にデータを挿入する為の空きを作る必要がある.

添字 0 1 2 3 4 5 6 7 8 9
データ 600 100 300 500 400 700 800

このデータ移動について, 配列内のデータの数を n とすると, 運が良ければデータ移動は不要であるが, 最悪の場合には $n$ 個のデータを移動させて配列の空きを確保する必要がある. この時に必要な平均の計算量は O(n) となる.

2. 配列からのデータ削除

挿入と同様に, 既にデータが挿入されている配列から添字を指定してデータを削除する場合を考える. また, この削除ではデータを削除した後にデータが配列の先頭から連続的に並ぶような操作を行う.

添字 0 1 2 3 4 5 6 7 8 9
データ 100 300 500 400 700 800 600

データ 600 を削除する. この削除は簡単でデータを削除した後でも既にデータが配列の先頭から連続的に並んでいる為, 特別な操作は不要である.

添字 0 1 2 3 4 5 6 7 8 9
データ 600 100 300 500 400 700 800

ところが, 上記のように添字 0 のデータ 600 を削除した場合, 削除した後は添字 0 に空きが出来てしまう為, データを 1 個ずつ順番に移動して配列先頭からデータが連続的に並ぶようにする必要がある. この場合, 挿入と同様に配列内のデータの数を n とすると, 最良の場合はデータの移動は不要であるが, 最悪の場合では $n$ 個のデータを移動させる必要がある為, 平均の計算量は O(n) となる.

3. 探索

線形探索, 二分探索

配列のデータを探索する手法として, 線形探索 (linear search) と二分探索 (binary search) について検討する.

3.1 線形探索

添字の値を順番に増加させながら, 配列の要素となるデータと, 探索キー (search key) となるデータを順番に比較していくことで探索出来る. 以下のコードは線形探索を行う実装例となる. (chapter 07 (Algorithms and Programming 2016) より引用.)

/* code: ex7-1.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 13
 
/* ------------------------------------------- */
int linear_search (int array[], int n, int key)
{
  int i;
  for (i = 0; i < n; i++) {
    if (array[i] == key) {
      return i;
    }
  }
  return -1;
}
 
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
 
/* ------------------------------------------- */
int main ()
{
  int index, key;
  int array[ARRAY_SIZE] = {
    900, 990, 210, 50, 80, 150, 330,
    470, 510, 530, 800, 250, 280
  };
  key = 800;
  print_array (array, ARRAY_SIZE);
  index = linear_search (array, ARRAY_SIZE, key);
  if (index != -1) {
    printf ("Found: %d (Index:%d)\n", key, index);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}

これをコンパイルして実行してみる.

root@0be431eebb77:/work# gcc ex7-1.c -g3 -o ex7-1
root@0be431eebb77:/work# ./ex7-1
900 990 210 50 80 150 330 470 510 530 800 250 280
Found: 800 (Index:10)

このコードの linear_search 関数は, 配列内から線形探索によって探索キーと一致するデータを探し, データが見つかれば, 見つかったデータの配列の添字の値を返す.

これを少し改修. 検索対象のデータ (key) を scanf 関数で入力出来るようにして, 探索対象となる配列のデータは rand 関数を利用して乱数で生成するようにした.

/* code: ex7-1a.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 1000000

/* ------------------------------------------- */
int linear_search (int array[], int n, int key)
{
  int i;
  for (i = 0; i < n; i++) {
    if (array[i] == key) {
      return i;
    }
  }
  return -1;
}

/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}

/* ------------------------------------------- */
int main ()
{

  int key;
  printf ("Enter an integer: ");
  scanf ("%d", &key);

  int index;
  int array[ARRAY_SIZE];
  int i;
  for (i = 0; i < ARRAY_SIZE; i ++) {
    array[i] = rand () % ARRAY_SIZE;
  }
  // print_array (array, ARRAY_SIZE);
  index = linear_search (array, ARRAY_SIZE, key);
  if (index != -1) {
    printf ("Found: %d (Index:%d)\n", key, index);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}

これをコンパイルして実行する.

root@0be431eebb77:/work# gcc ex7-1a.c -g3 -o ex7-1a
root@0be431eebb77:/work# ./ex7-1a
Enter an integer: 456
Found: 456 (Index:757414)

3.2 二分探索

二分探索 (binary search) は, 整列済みの配列に対して探索を行う. 整列 (sorting) とは, データを値の大小関係に従って並べる操作で, 整列された配列は順序配列 (ordered array) と呼ぶ. 二分探索では, 配列の中央の値と比較し, 検索するキーの値との大小関係を基に探索を進める.

検索したい値が中央の値より大きいか, 小さいか調べ, 二分割した配列の片方には, 目的のキーの値が存在しないことを確かめながら検索を行う. 二分探索は整列済みの配列でなければならないという制約があるものの, 平均の計算量は線形探索よりも高速である.

以下, 11 個の要素を持った順序配列に対して二分探索が行われる様子を図示したもの.

まずは, 配列の要素はソートされて 100 から順番に格納されている.

添字 0 1 2 3 4 5 6 7 8 9 10 11
データ 100 200 300 400 500 600 700 800 900 990 999

この配列からデータ 800 を二分探索していくと, まずは添字 5 のデータ 600 と探索対象の 800 を比較し, 600 以下のデータは探索の対象外となる.

添字 0 1 2 3 4 5 6 7 8 9 10 11
データ 100 200 300 400 500 600 700 800 900 990 999

次に残った配列の要素の中央値である添字 8 の 900 と探索対象の 800 を比較し, 800 よりも大きい為, 添字 8 以上のデータは探索の対象外となる.

添字 0 1 2 3 4 5 6 7 8 9 10 11
データ 100 200 300 400 500 600 700 800 900 990 999

という流れで二分探索によって 800 が探索されるが, 処理の過程で配列の探索範囲が半分になっていく為, データが多くなると, 二分探索は線形探索と比べると圧倒的に高速に処理されることが解る.

以下のコードは二分探索を行うコード例である. (chapter 07 (Algorithms and Programming 2016) より引用. 若干, 上の図に合わせて改変している.)

/* code: ex7-2.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 11

/* ------------------------------------------- */
int binary_search (int array[], int num, int key)
{
  int middle, low, high;
  low = 0;
  high = num - 1;
  while (low <= high) {
    middle = (low + high) / 2;
    if (key == array[middle]) {
      return middle;
    }
    else if (key < array[middle]) {
      high = middle - 1;
    }
    else {
      low = middle + 1;
    }
  }
  return -1;
}

/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}

/* ------------------------------------------- */
int main ()
{
  int index, key;
  int array[ARRAY_SIZE] = {
    50, 80, 150, 210, 250, 280, 330,
    470, 510, 530, 800
  };

  key = 210;
  print_array (array, ARRAY_SIZE);
  index = binary_search (array, ARRAY_SIZE, key);
  if (index != -1) {
    printf ("Found: %d (Index:%d)\n", key, index);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}

これをコンパイルして実行してみる.

root@0be431eebb77:/work# gcc ex7-2.c -g3 -o ex7-2
root@0be431eebb77:/work# ./ex7-2
50 80 150 210 250 280 330 470 510 530 800
Found: 210 (Index:3)

このコードは, 前の線形探索と同様に配列の要素をランダムに生成するようにして, 且つ, 探索の対象は画面から入力出来るように改造する余地は十分にある.

尚, 線形探索 (ex7-1) と二分探索 (ex7-2) で実行速度を比較してみると, 配列の要素数が 13 と小さいものの以下のような若干の差異が見られた.

root@0be431eebb77:/work# time ./ex7-1
900 990 210 50 80 150 330 470 510 530 800 250 280
Found: 800 (Index:10)

real    0m0.004s
user    0m0.000s
sys     0m0.000s
root@0be431eebb77:/work# time ./ex7-2
50 80 150 210 250 280 330 470 510 530 800 900 990
Found: 210 (Index:3)

real    0m0.003s
user    0m0.000s
sys     0m0.000s
root@0be431eebb77:/work# time ./ex7-1
900 990 210 50 80 150 330 470 510 530 800 250 280
Found: 800 (Index:10)

real    0m0.005s
user    0m0.000s
sys     0m0.000s
root@0be431eebb77:/work# time ./ex7-2
50 80 150 210 250 280 330 470 510 530 800 900 990
Found: 210 (Index:3)

real    0m0.004s
user    0m0.000s
sys     0m0.000s

演習問題

問 7.1

順序配列について説明しなさい.

  • データが整列された配列を順序配列 (ordered array) と呼ばれている

問 7.2

線形探索と二分探索で探索に必要な平均の計算量について答えなさい.

探索手法 平均の計算量 メモ
線形探索 O(n) データ量に応じて計算量が増える
二分探索 O(log\ n) 処理の度に処理対象を減らすようなアルゴリズム

問 7.3

二分探索の特徴を簡単に述べなさい.

  • 順序配列に対して探索を行う
  • 配列の中央値との値を比較し, 検索キーの値との大小関係を基に探索を進める
  • 検索したい値が中央の値よりも大きいか, 小さいかを調べ, 二分割した配列の片方には, 目的のキーの値が存在しないことを確かめながら検索を行う
  • 平均の計算量は O(log\ n) で高速である

問 7.4

C 言語のライブラリに含まれる lsearch 関数を利用したプログラムを作成しなさい.

こちら より引用.

/* code: q7-1.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
 
#define ARRAY_SIZE 10
 
/* ------------------------------------------- */
int compare (int *x, int *y)
{
  return (*x - *y);
}
 
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
 
/* ------------------------------------------- */
int main ()
{
  int key;
  int *r;
  size_t elements;
  int array[ARRAY_SIZE] = {
    12, 19, 70, 44, 16, 38, 10, 30, 28, 98
  };
  key = 16;
  elements = ARRAY_SIZE;
  print_array (array, ARRAY_SIZE);
 
  r = (int *) lsearch (&key, &array, &elements, sizeof (int),
               (int (*)(const void *, const void *)) compare);
  if (r != NULL) {
    printf ("Found: %d\n", key);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}

これをコンパイルして実行してみる.

root@0be431eebb77:/work# gcc q7-1.c -g3 -o q7-1
root@0be431eebb77:/work# ./q7-1
12 19 70 44 16 38 10 30 28 98
Found: 16

問 7.5

C 言語のライブラリに含まれる bsearch 関数を利用したプログラムを作成しなさい.

こちら より引用.

/* code: q7-2.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
 
#define ARRAY_SIZE 10
 
/* ------------------------------------------- */
int compare (int *x, int *y)
{
  return (*x - *y);
}
 
/* ------------------------------------------- */
void print_array (int array[], int n)
{
  int i;
  for (i = 0; i < n; i++) {
    printf ("%d ", array[i]);
  }
  printf ("\n");
}
 
/* ------------------------------------------- */
int main ()
{
  int key;
  int *r;
  int array[ARRAY_SIZE] = {
    10, 12, 16, 19, 28, 30, 38, 44, 70, 98
  };                /* ordered array! */
 
  key = 16;
  print_array (array, ARRAY_SIZE);
 
  r = (int *) bsearch (&key, &array, ARRAY_SIZE, sizeof (int),
               (int (*)(const void *, const void *)) compare);
  if (r != NULL) {
    printf ("Found: %d\n", key);
  }
  else {
    printf ("Not found: %d\n", key);
  }
  return 0;
}

これをコンパイルして実行してみる.

root@0be431eebb77:/work# gcc q7-2.c -g3 -o q7-2
root@0be431eebb77:/work# ./q7-2
10 12 16 19 28 30 38 44 70 98
Found: 16

問 7.6

コード (q7-3.c) は, 1 節と 2 節で述べた配列操作に関連するコードである. このコードは, データ挿入, データ削除, データ挿入可能な場所の探索を行う関数からなっている. gprof 等のプロファイラで関数を分析しなさい.

こちら より引用.

/* code: q7-3.c   (v1.16.00) */
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
 
/* ------------------------------------------- */
void array_print (int a[], int max)
{
  int i;
  for (i = 0; i < max; i++) {
    printf ("%02d ", a[i]);
  }
  printf ("\n");
}
 
/* ------------------------------------------- */
int array_find_empty (int a[], int max)
{
  int i;
  for (i = 0; i < max; i++) {
    if (a[i] == -1) {
      return i;
    }
  }
  return -1;
}
 
/* ------------------------------------------- */
void array_insert (int a[], int max, int index, int empty, int data)
{
  int i;
  if (empty > index) {
    for (i = empty; i > index; i--) {
      a[i] = a[i - 1];
    }
  }
  else {
    for (i = empty; i < index; i++) {
      a[i] = a[i + 1];
    }
  }
  a[index] = data;
}
 
/* ------------------------------------------- */
int array_delete (int a[], int index)
{
  int data;
  data = a[index];
  a[index] = -1;
  return data;
}
 
/* ------------------------------------------- */
int main ()
{
  int i, j, index_ins, index_del, empty, data;
  int a[MAX];
 
  for (j = 0; j < MAX; j++) {
    a[j] = rand () % 100;
  }
  data = a[MAX / 2];
  a[MAX / 2] = -1;
 
  for (i = 0; i < 1000; i++) {
    index_ins = rand () % MAX;
    index_del = rand () % MAX;
    /* printf("ins:%d  del:%d\n", index_ins, index_del );  */
 
    empty = array_find_empty (a, MAX);
    /* printf("empty:%d\n", empty ); */
 
    array_insert (a, MAX, index_ins, empty, data);
 
    data = array_delete (a, index_del);
    /* array_print( a, MAX ); */
  }
  return 0;
}

とりあえず, これをコンパイルして実行してみる.

root@0be431eebb77:/work# gcc q7-3.c -g3 -o q7-3
root@0be431eebb77:/work# ./q7-3
root@0be431eebb77:/work#

何も出力されない. gprof で解析してみたが...解答のような結果が出力されないので要調査.

以上

  • 今まで何気なく配列にデータの出し入れを実装していたけど, その裏でこんなことが行われていたのかー, 面白い
  • 線形探索, 二分探索の違いについて理解出来た
  • 実際にコードを書く際には lsearch 関数, bsearch 関数を利用すれば良い
  • gprof の解析がうまく動かない (解答のような結果が出力されない) ので調査しよう

2018 年 11 月 14 日 (水)

ジョギング

  • 引き続き, 足の痛み (と言っても筋肉痛) が引かないのでお休み
  • 自宅から博多駅の筑紫口まで散歩する, 往復で 30 分くらい, ヨドバシに行くときにはこのルートで歩こうと思った次第

日課

  • お休み

奥さん, 風邪のひきはじめ

  • 先日の応援等で疲れが出てしまったんだと思う
  • あまり無理はしてほしくないものの, 明日は仕事で鹿児島に行かないといけないとのこと

夕飯

  • 適当鍋
  • 引き続き, 茅乃舎のだしを使ったので優しい味で美味しかった

2018 年 11 月 13 日 (火)

ジョギング

  • お休み
  • 30 分程散歩する

日課

  • お休み

マッサージ

  • お昼休みを利用して近所のマッサージ屋さんにて
  • 時間があれば 2 時間くらいやって頂きたい気分...

夕飯

  • 根菜鍋
  • 茅乃舎のだしを使ったので優しい味で美味しかった

別府大分毎日マラソン

来年の 2/3 に行われる, 第 68 回別府大分毎日マラソンにエントリーした.

www.betsudai.com

2018 年 11 月 12 日 (月)

ジョギング

  • お休み
  • 流石に朝起きると激しい筋肉痛で歩くのもままならない状態で...

日課

  • お休み

両親

  • 昨日の福岡マラソンを応援にきてくれた両親が鹿児島に帰っていった
  • 本当に有り難いし, いつまで自分が走る姿を見せられるかなと思いつつ見送った

終日

  • 体調がイマイチな状態だった
  • 好きで走っているので, こんなことくらいで体調崩すわけにはいかんざき

久しぶりの #福岡マラソン で #ムラムラ大作戦が功を奏して 2 回目のサブスリー達成できたのでメモ

久しぶりの #福岡マラソン

明日は青山学院大学に倣って #ムラムラ大作戦 で完走を目指します。皆さん、心のなかで応援をお願い致します。#福岡マラソン2018

2015 年に出場して以来の福岡マラソン. 今年の 3 月の鹿児島マラソンサブスリーを達成していたので, 今回の目標ももちろんサブスリー.

ところが...

先週の木曜日あたりに右の胸の下あたりに強い痛みがあり, 病院にいくと肋軟骨損傷という診断. 呼吸をすればするだけ肋骨がきしむように痛む状況になってしまいました. また, 金曜日の夜中にベッドから降りる際に左足の筋を激しく伸ばしてしまい, あるくと強い痛みが出る状況になり... 万事休すかと思いましたが, それぞれの患部をあっためたり, 痛み止めを飲んだりしながら, なんとかスタートラインに立つことができました.

スタートラインに立てたことに感謝して走ってきまーす。#ムラムラ大作戦 #福岡マラソン

ムラムラ大作戦

日々のトレーニン

週 5 〜 週 7 で 30 分ジョッグがメインです. トレーニングでこれ以上走ることはほとんどありません. しかし, フルマラソン後半の足の攣りなどを考えると月に 2 回くらいは長い距離を走ったほうがいいかもしれません...

5 キロ毎のスプリット

f:id:inokara:20181111173126p:plain

ペースランナーに引っ張ってもらって 4'15"/Km 平均で走り切ることが出来ました.

ペースランナー

今回もペースランナーにずっとついて走りました. ペースランナーについて走ることでペースだけでなく走りのリズムもうまく合ってくるのでとても走りやすかったです. また, ペースランナーについて走ることで, 呼吸はほとんど乱れず走り続けることが出来ました. ペースランナーが引っ張っているグループで走っていると, ランナー同士で会話したり出来るので不思議な一体感も生まれてくるのでサイコーです. ただ, 大きな集団になるので前のランナーとの接触には気をつけたいところです.

35 キロ以降, 足が棒

ペースランナーに引っ張ってもらっていても, やはり, マラソンの鬼門, 35 キロ以降になると足が攣り始めて足が完全に棒になってしまい, 足を前を出す度にピキピキと音がするくらいに足が攣ってとても辛かったです. 特に鬼門と思っていたのらん坂を意外に簡単に登ることが出来ましたが, 下図 (福岡マラソンサイトより引用) のようにのらん坂以降に続く細かいアップダウンがかなり足に堪えました.

f:id:inokara:20181112062455p:plain

後半から終盤にかけての足の痛みをどの程度抑えることが出来るかがサブスリーへの鍵になると思います. また, 足の攣りについては, 以下のサイトに詳しく書かれていました.

www.kobayashi.co.jp

レース中に芍薬甘草湯を摂ることで, 足の攣りをある程度は回避出来るようです. 次のマラソンでは試してみたいと思います.

ムラムラ大作戦

沿道の若い女の子を目で追ってムラムラ..という作戦ではありませんが, 今回はマラソンシーズンの初戦ということで楽しく走ることを目標にしていました. 終盤は足が棒になりつつも楽しくゴールすることができたと思います.

最後に

福岡マラソンに限ったことではありませんが, 大会運営に携わっているたくさんの方々, ボランティアスタッフ, 沿道の皆さんの声援があってこそ無事に完走することが出来るんだなと思いました. この場をかりてお礼を申し上げたいと思います. 本当に有難うございました.

皆さんの応援のおかげで無事にゴールしました。#ムラムラ大作戦 #福岡マラソン ありがとうございました~。北島サブスリーです。

そして, マネージャー兼応援団長をやってくれる奥さん, わざわざ鹿児島から応援に来てくれた両親にスーパー有難うございました.

2018 年 11 月 11 日 (日)

ジョギング

  • 福岡マラソン出走
  • 2 回目のサブスリー 2 時間 58 分 01 秒, ベストタイムには及ばなかった
  • 色々と体を痛めてしまい, 一時は出場を辞退しないといけないという状況だったので (言い訳) このタイムには満足している

日課

  • お休み

応援

  • マネージャー兼応援団長の奥さんが頑張ってくれた
  • 本当にありがとう

2018 年 11 月 10 日 (土)

ジョギング

  • 40 分くらい
  • 走って明日の福岡マラソンのゼッケンなどを取りに行く

日課

  • お休み
  • 完全に痛みが引いたら再開する

両親

  • 両親が福岡マラソンの応援に駆けつけてくれた
  • 奥さんが一生懸命にもてなしてくれるので本当に有り難い

明日は