BDD, TDDを始めたいです・・・

先日、以下のような記事を書かせていたいただきました。

kz-ike.hatenablog.com

ようやくアプリをリリースできたわけですが、まだまだアプリは進化していく予定です!

さて、進化ということで「継続的にアプリを成長させる」ためには、アプリの品質も担保してかないとですよね。
私のアプリは残念ながら自動テストには対応していないため、実機を使った「手動」での動作確認しかできていません。

「アプリをapple storeにリリースする!」という気持ちが強かったので「品質」という観点での開発をあまり意識していませんでした。
なんとかリリースもできたので、このタイミングで「テスト環境」を導入していこうと考えています。

と同時に「先にテストコードを書いてあとで実装する」というTDD(テスト駆動開発)を、自作アプリの開発プロセスとして取り入れていきたいです。

本記事では、テストファースト開発プロセスである「TDD」及び「BDD」について概念を説明し、テストコードを書き始めようとした中で気づいたしくじり事例を書き留めたい思います。

ちなみに、私が参考にしている本は以下です。
PEAKS(ピークス)|iOSテスト全書

開発プロセス

What's TDD?

概念

最初に失敗するテストコードを書き、それを駆動源としてプロダクトコードを開発するスタイル。

メリット

1. テストを成功させるためにどのように実装するかではなく、「何が欲しいか」から考えることができる
 →「何が欲しいか」ということで、インターフェースの検討から始まる
 →インターフェースを使用することで、依存性注入を考慮したコードをかけるので
  テストダブル(モック。スタブなど)を実装しやすくなる

2. テストコードが必ず用意され、リファクタリングが楽になる
 →失敗のケースから始まるため、失敗時の処理も検討できる

What's BBD?

概念

TDDの派生系で、「振る舞い」と「要求仕様」価値を置いた開発プロセス

ポイント

BBDの概念で「振る舞い」、「要求仕様」という単語を出しましたが、もう少し深掘りします。
冒頭で挙げた書籍で、外側の品質、内側の品質と言った二つの考えが説明されていました。ざっとまとめると以下のようになります。

品質の種類 視点
外側の品質 利用者から見たソフトウェアの品質(要求仕様) 必要な機能が満たしているか、操作性など
内側の品質 開発者から見たソフトウェアの内部構造における品質(振る舞い) コードの可読性、クラス設計が適切であるかなど

筆者の知識がまだ浅くて申し訳ないのですが、

テストコードの意図が人間にとって解釈しやすいように(振る舞いとして理解できるように)にテストコードを実装しよう、
そのために専用のライブラリを使用しよう。

と言った考えが「振る舞い」のポイントかなと現時点で理解しています。

★BBDの枠組みを提供するテスティングフレームワークでQuicl/Nimbleというものがあるそうで使ってみようと思います。

しくじり事例(私のアプリで感じたこと)

  • 内部APIの振る舞い方が把握できていない

「要求仕様」に対する「振る舞い」のテストコードを明記することで、内部APIがどのように動いているか?把握しやすくなります。

残念ながら、今回私は欲しいと思った機能に対していきなり「実装」から始めてしまっていたため(ある程度プロトコルの設計はしていたものの)、今回テストコードを書いていこうと思った際に、自分の実装した機能が内部でどう振る舞っているかわからない状況になってしまっていました


内部の振る舞いが理解できていない

(新しい機能の追加・改造を実施する際に)既存機能にどの部分に影響するか判断つかなくなってしまう

大変


★現在、要求仕様(自身のアプリの機能)に対する、全ての内部APIにおける振る舞いをトレースする作業を始めております・・・

  • 失敗時のケースを実装できていない

TDDのメリット2. にて「失敗のケースから始める」と記載しましたが、失敗のケースから始まるということは失敗時の処理もその時点で検討できるということです。
自身のコードを振り返ると、正常時の動作が通るように実装してしていたため、バグは実際に動作確認している中で発見した物しか発見できていないということになります。

ですので、想定しないケースでアプリがクラッシュしてしまうといった問題が発生してしまうかも、と考えるとアプリを使っていただいているユーザには非常に申し訳なく思います。


★「内部APIのトレース作業」と並行して、失敗時の挙動を整理中・・・

最後に

現在本記事を執筆している時点で、まだBDDのライフサイクルを回せていません。
ある程度、内部での振る舞いを整理できたら、次の機能実装にてBDDの開発プロセスを取り入れていこうと思います。

まずは、簡単な機能追加でBBDを回してみよう・・・!

【AWS】lineにメッセージを送る方法のまとめ(lambdaの使用)

はじめに

こんにちは。
みなさまLineって使ってますか?私はLineを使い始めたのは大学2年くらいの頃でかれこれ10年くらい使っています。
高校の頃、友人や家族と連絡を取ると言ったら、電話以外ですと「メール」が主流でした。

ガラケーでぽちぽちメールをしてたのを思い起こすと懐かしさを感じます。
ガラケーのメールはPOPプロトコルで、携帯端末に保存する仕組みでした。メールの保存上限もあるため、大事なメールは大切に保管して・・・と言ったこともしてましたが、センチメンタルな行動だったたなーと思いキュンキュンします。


話は変わり、今ではそんなメールに変わりコミュニケーションツールの「Line」が主流になってるのかなと思います。
海外事情はよくわかりませんが、私の周りの方と連絡を取ると言ったらこのLineを通じてコミュニケートすることになります。
電話も無料でできちゃうので手放せないですよね。

さて、それなりにLineが普及しているわけですが、そんな中でもこのLineを使っていないユーザもいるかと思います(決して悪いといっているわけではないです!)。
そう言った方とは私のgmailなどのフリーメールに連絡を送ってもらっているわけですが、私はメールをメインにコミュニケートをすることはないので通知を見落としがちです。
→メルマガに埋もれてしまう・・・

そこで、今回はそんなLineをしていない方からにも、私のlineにメッセージを送ることを可能とする仕組みを模索しました。
自身のスキルアップも兼ねAWSなどのサービスを用いることにしましたので、そこで身に付けたことを本記事にまとめようと思います。

作るものの概要

 今回は「Line notify」AWS「lambda」、「レイヤー」の機能を使用します。
 Line notifyで「Line上でメッセージ送信したい相手に対するトークン」を発行し、そのトークンを用いてメッセージを送信するコードをlambdaに実装します。

 今回はここまでの機能のみをまとめますが、今後はAWSの「APIゲートウェイ」も利用し、webアプリを通じてlambdaを叩くような仕組みも実装したいと考えてます。

使用する機能一覧

Line notify

  • 概要

 webサービスからの通知をlineに通知するサービス

  • 今回の使用用途

 Lineで送りたい「個人」、「グループ」に対するトークを発行する。

AWS

Lambda
  • 概念

 EC2などのリソースを※プロビジョニングしなくても、ソースを実行できるサービス

 ※プロビジョニング:必要に応じてネットワークやコンピュータのリソースを予測し準備しておくこと

  • 今回の使用用途

 今回はpythonを選定し、pythonからline notifyで発行したトークンに対してメッセージを発信する。
 →数行でコーディングできて簡単!

レイヤー
  • 概念

 lambdaで選定した言語に対して、外部APIを設定することのできるサービス

  • 今回の使用用途

 pythonからLineに通知する際に「requests」モジュールが必要であるため、レイヤーに「requests」モジュールを設定することでlambdaから呼び出せるようにする。

作業手順

Line notify

 以下、line notifyのサイトにて通知を送りたい相手(グループ、個人)に対して、1対となるトークンを発行する
 https://notify-bot.line.me/ja/

 ★Line notifyは自身のlineアカウント(メールアドレス)にて、ログイン可能
 ★トークンは外部に公開しないこと!

  • テスト

 以下、curlコマンドを実行することで、Lineにメッセージを送信する。

curl -X POST -H 'Authorization: Bearer __YOUR_TOKEN__' -F "message=Hello!" https://notify-api.line.me/api/notify

AWS

Lambda
  1. AWSにて、lambda関数(python)を生成する
  2. 以下コードを入力し、デプロイする
import os
import requests

# Line Notify
ACCESS_TOKEN = os.environ["access_token"]
HEADERS = {"Authorization": "Bearer %s" % ACCESS_TOKEN}
URL = "https://notify-api.line.me/api/notify"

def lambda_handler(event, context):
    data = {'message': "send_test"}
    #lineに通知
    requests.post(URL, headers=HEADERS, data=data)
レイヤー
  • 以下の手順でレイヤーに設定する。

1. 事前に上記のモジュールをダウンロード・zip化する(python環境の構築方法は省略する)

pip install hoge
mkdir hoge
pip install -t ./hoge hoge
zip -r hoge.zip hoge

2. AWS上にて、任意のレイヤーを作成する
3. 2.に1.のzip化したデータをアップロードする(lambdaからimport可能となる)
4. lambdaで作成した関数に対して2.のレイヤーを紐付ける
 (AWSのlambdaページを開き)lambda→関数→(自分の作成した関数名)→設定→デザイナー(layers(0)を選択)
 
 上記を選択した後に登場する「レイヤー」フォームにて「レイヤーの追加」を選択し、今回作成したレイヤーを追加する

  • 注意事項

レイヤーにアップロードするzipは、以下構造を満たしてないとlambdaからimportできません!

pillow.zip 
| python/PIL 
└ python/Pillow-5.3.0.dist-info

 参考
docs.aws.amazon.com

最後に

ここまでやってみたら、lambdaのテストを実行することでlineに通知を飛ばせるようになるはずです。

私は、レイヤーからのimportがうまくできなくて数時間詰まってました。
zip化したファイルの中身の所有権も疑ってたりしましたが、公式のdocを見たらすぐに解決しました。
→やっぱ公式ドキュメントを読み込むことは大事と言うことですね

今回はlambdaを直接動かしてましたが、次回はAPIゲートウェイも用いてwebアプリから本機能を叩くことができるようにしたいと思います。


ここまで読んでいただきありがとうございました!

強化学習の勉強

はじめに

本記事は、機械学習の一つである「強化学習」について、勉強したことの結果をアウトプットとして残すことを目的とします。

強化学習とは?

概念

機械学習(Machine Learning)」のうちの一つの手法になります。
機械学習とは、コンピュータが大量のデータからそこに潜む特徴パターンを見つけそれを説明する「モデル」を作成し、そのモデルに基づいて高い正確性で予測を行うことになります。

この機械学習の種類には大きく三種類存在します。

強化学習」では、学習するための「環境」を与える必要があります。

この環境には、「行動」、「状態」、「報酬」が定義されています。

「行動」を試行錯誤して行う中で「状態」が変わり、最終的にゴールに到達する事ができれば「報酬」をもらう事ができます。

強化学習の目的は、「最終的(1エピソード)に得られる報酬の総和の合計を最大化する」モデルを模索することになります。

囲碁プログラムのAlphaGoでは、この強化学習のノウハウにより囲碁で勝利するためのパターンを学習した結果、世界王者を4勝1敗で下すと言った結果になりました(2016年3月時点)。

オセロでの例

上記で「環境」、「行動」、「状態」、「報酬」という単語ができてきたので、オセロに喩えて説明してみます。

  • 環境:オセロの盤(通常8×8)
  • 行動:石を打つする
  • 状態:プレイヤーが石を打つことにより、挟まれた石の色が変わる
  • 報酬:ゲーム終了時に、プレイヤーの石が敵の石より多く置いてある場合に得られる

オセロの強化学習では、プログラミングによって実際に石を置いていき、すべての石を置き切った時点での(すべての石を置いた状態)最終的な報酬を算出します。
この最後まで石を置き切ると言った行為は、環境でいうところの最終的な「ゴールに到達する」という状態を表します。

ゴールまでに到達するまでの一連の流れを「エピソード」といい、強化学習ではこのエピソードを何度も繰り返し試行錯誤する中で報酬をもらえるパターンをモデル化します

このオセロの例だと、報酬をもらえるケースはゲーム終了時にしかもらえないですが、環境によっては行動毎に報酬がもらえる(即時報酬)ケースがあります。

強化学習における問題設定 - MDP(Markoy Decision Process)

強化学習では、与えられた「環境」が「マルコフ性(Markov property)」というルールにしたがっていることを想定します。
このマルコフ性のルールに従うことで、上記で説明した「環境」の説明を数式で表現する事が可能となります。

数式を説明する前に、マルコフ性ルール構成要素について説明します。

ルール

  • 遷移先の状態は、直前の状態とそこでの行動飲みに依存する
  • 報酬は、直前の状態と遷移先に依存する

構成要素

s(state) 状態
a(action) 行動
T(Transition function) 遷移関数
R(Reward function) 報酬関数(即時関数)


上記を基に、価値の総和を最大にする数式を解説していきます。

補足

上記のMDPでは、報酬関数、遷移関数が登場しますが、これは強化学習において、「モデルベース」の考えを適応していると言えます。
対に「モデルフリー」という概念も存在しますが、こちらでは報酬関数、遷移関数が存在しないケースになります。
→本記事では説明省略します

数式

  • 報酬の総和(期待報酬(Expected reward)、価値(value))

ある時刻\displaystyle tからエピソード終了時刻\displaystyle Tまでの報酬を示します。
 \displaystyle
G_t = r_{t+1} + \gamma r_{t+2} + \cdots + \gamma^{T-t-1}r_T = \sum_{k=0}^{T-t-1} {\gamma^k r_{t+k+1}}\\ 
\gamma: 割引率(Discount factor)、0-1


報酬の総和は、エピソードが終了しないと計算できないため、「見積もり」としてその時点における状態を算出する必要があります。
見積もりはあくまで不確かな値であるため、この割引率により遠い将来の報酬ほど信頼の低い値として算出します。

  • 報酬の総和の期待値

上記の記載した数式では、以下二つの問題点があります。

その1 将来の即時報酬の値(\displaystyle r_{t+1}, r_{t+2} + \cdots)の合計を理解している必要がある
その2 将来の即時報酬が必ず得られる、と定義している

将来の即時報酬が「必ず登場する」ということを前提としています。実際は、行動してみないとその即時報酬がわからないという前提があるため、「期待値」として表現する事がふさわしいです。

「その1」に従い、「報酬の総和」を再帰的に表現すると以下のようになります。

 \displaystyle
G_t = r_{t+1} + \gamma G_{t+1}


次に、「その2」の期待値を算出するため、各時刻において「報酬を得られる確率」を掛け合わせます。

報酬の総和の期待値を \displaystyle Vと表します。
この時、戦略 \displaystyle \piによって状態 \displaystyle sから \displaystyle s'に移動する場合、行動 \displaystyle aをとる確率は \displaystyle \pi (a \mid s)、遷移先 \displaystyle s'へは遷移関数から導かられる確率は \displaystyle T(s' \mid s, a)とします。

上記を考慮すると、期待値Vは以下のように表す事ができます(policyベース)

 \displaystyle
V(s) = \underset{a}{max}  \sum_{s'} {T(s' \mid s, a)(R(s, s') + \gamma V(S') )}


また、報酬が状態sのみで決まる場合は以下のように表す事ができますvalueベース)

 \displaystyle
V(s) = R(s) + \gamma \underset{a}{max} + \cdots + \sum_{s'} {T(s' \mid s, a)V(S')}

これが基本的な式になり、この式から報酬の総和が最大になるよう、各状態において最適となる行動を求めます。

valueベースでは、ある状態sにおいて、価値が最大となる行動を必ず選ぶ一方で、policyベースでは、各行動を確率的に選択されると言った違いがあります。

この違いが、どう言った特徴(長所・短所)があるのかは、筆者が勉強不足でまだ理解できてないです。


今後、筆者自身も強化学習していく中で別途まとめたいと思います。

参考

本:pythonでまなぶ強化学習(著者、久保隆宏)

「Myトレ」リリースまでに身に付けた私のスキル

こんにちは。
先月、念願だった自作アプリをAppleStoreに公開できました!

今後このアプリの機能強化やバグ改修をガシガシ進めていく予定ですが、一旦ここで立ち止まり、改めて私がどんな技術を学んでたのか整理したいと思い、本記事を作成しました。

学習した技術の概要

その1 swift

iOSにてアプリ開発するのに必要とする言語です。
ほかにもObjective-Cという言語がありますが、swiftのが後続に登場した言語となっています。

上記のObjective-CもswiftもXcodeというAppleの公式開発ツール上で動作することが可能となります。
このXcodeMac上でしか動作させることができないため、iOS用のアプリ開発をするために必然とMacが必要になります。
windows上でも開発できるクロスコンパイラがあるそうですが、この記事では触れません

スマホのOSシェアという観点でいると、日本でもiOSよりAndroidのシェアが超えているという現状もありますので、
今後はAndroid開発も視野に入れて行こうと思ってます。
日本でのスマホのOSシェア、Androidが57.2%、iOSが42.8%に - iPhone Mania

Macはサイズも見た目もシンプルで好きなんですけどね笑

その2 Firebase

Firebaseはgoogleが提供するクラウドサービスであり、BaaS(Backend as a Service)のサービスを提供しています。
今回「Myトレ」のバックエンドに用意しました。

backend as a serviceという名前の通り、新しくサービスを立ち上げる上で必要なデータベース(以下DB)に対して、FirebaseのAPIを用いることでswiftから簡単にアクセスできます。

Firebase上の設定は「データベースの構造」と「セキュリティルール」の設定が必要になりますが、ここさえできてしまえば自分のアプリからアクセスできるようになります(ブラウザで設定します)。

ちなみに、udemyのとあるswiftの講義を受講してて、このfirebaseが登場してきたので今回はmyトレに使用してみました。

使用した機能

cloud firestore データベースの機能。Myトレのデータも本サービス上に格納されます!
認証 この機能が大変便利です。これがあるおかげで、gmailapple IDで自分のアプリのサービスへのログインが可能となります!

学習した技術の取得内容

  1. swift
  • udemy

 【Swift5対応】自動更新型ニュースアプリと名刺管理アプリを学ぼう!(
https://www.udemy.com/course/swift5_xcode_news/learn/lecture/14862845#overview
)

 開発環境(XCode)の立ち上げから、具体的なコーディングの話まで詰め込んでいて、swiftの初心者の私も一つアプリを作りきることができました。
 
 コードの話になりますが、UITableViewやUILabel, UIButtonなど、アプリを組む上で「絶対使うであろう」部品の使い方を説明してくれて他、前述したFirebaseとの連携するための手順、コーディング方法も紹介してくれています。

 そして、実際にサンプルとして作る画面が実用的(実際にありそうなアプリを作る)であるため、作っていて楽しかったです。

  • その他

ざっくりしてますが、
アプリの今後の拡張性や基本を理解したいと思い、以下の使用をググりながら学習しました。

CocoaPods 外部ライブラリ導入ツール
上記のudemyの講義内でも登場しますが、本ツールを用いることで外部のAPIを簡単に実装できます。FirebaseのAPIももちろんですが、アニメーションを楽に再現できるlottieも重宝しました。
VIPER iOSの開発で用いられるデザインパターン
一つの機能に対して、View, Interactor, Presenter, Routerのクラスに分けることで、クラス毎の役割を明確にすることができます。
また、クラス間へのアクセスはprotocolを介してアクセスするため、テストコードも描けるようになります。
今後のアプリの機能拡張し易くするために導入しました。
  1. Firebase
Cloud Firestore Firebaseのデータベースサービス
本データベースは「NoSQLドキュメント指向データベース」と呼称するそうです。「Myトレ」でユーザ毎のデータを管理するために、コレクション、ドキュメントの概念を抑えました。
余談ですが、データはマップ型(json型のようなものですかね)で扱うので、swift側もjsonを管理するコードをいくつか実装しました。
セキュリティ Cloud Firestoreに対するセキュリティルール実装
上記のudemyの講義ではこのセキュリティルール言語までは紹介してなかったので自力で取得しました。
ここを怠ると予期せぬケースでセキュリティを突破され自分のCloud Firestoreのリソースをめちゃくちゃにされてしまうため、ユーザ毎にアクセスできるリソースや投入できるデータの形式、認証状態等を実装しました。

最後に

2019年11月あたりから「Myトレ」の開発を行なってました。当初は半年くらいでAppleStoreに公開できたらいいなーなんて思ってましたが、なんやかんやで9ヶ月位かかりました。
具体的に何時間要したか計測できてなかったですが、VIPERのデザインパターンを取り入れたことや、FirebaseのAPI実装(Cloud Firestoreにget, create, update, deleteを発行する)、セキュリティルールの検討が大変でした(知らないことが多い状態で、一から実装してかないといけなかったので)。

とはいえ、無事一通りの機能を実装することができたので、今後はこれに対して新しい機能を追加していきたいと思ってます。

睡眠と友達になる!

睡眠を犠牲にして働くのはやめておこう。
とくに、あなたがクリエイティブな仕事をしたいのなら。

スタンフォード式 最高の睡眠」著者:西野精治の本の最後に記載されている言葉を引用しました。

今回、この本を読んで学んだことをまとめようと思います。

前回の記事で脳について触れましたが、私はドラムとプログラミングが好きでもっと時間を費やしたいです。
そのためには、1日の限られた時間の中でやりたいことに集中して取り組む必要があります。

ですが、平日で仕事が遅くなると寝てしまったり、土日でも昼寝をしてしまい気づけば数時間立っていた。。。
なんてこともありました。

ですので、この本の内容を実践する事で、1日の限られた時間のなかで自分のしたいことをしっかりやり切るようにしたいと思います。

  • 睡眠をしないとどうなる? 負債について
  • 睡眠の役割
  • 良質な睡眠を得るために必要な事
    • 良質な睡眠とは何か? 黄金の90分
    • 良質な睡眠を得るための意識すべきこと 脳と体温
    • 良質な睡眠を得るためのポイント
  • 終わりに
続きを読む

できるとき、できないとき

「なんでできないんだ怒怒!!!!!!」 

何かを取得しようとしたときや、人に教えているときなどに、そう思ってしまうときってありませんか?
僕はいままさにその状態で非常に辛い思いをしています。

プロフィールにも書いてありますが僕はドラムが好きで、現在高速にペダルを踏めるよう練習している最中です。


上に動画を載せましたが、これはできているときに撮影したものですが、いまはもう出来ません。やり方を思い出せないのです。
少し昔の話で私は学生時代卓球に謹んでましたが、ドライブを打ってよく入るときと、全く入らないときがありました。

なぜ、できるときがあってもできないようにもなってしまうのでしょうか?
→そんなこと全くないぜ!という方がいましたら羨ましい限りです…

ということで、今回はできるときできないときと言った状態はなぜ発生してしまうのか、私たち人間(人間以外も)なら誰しも所有している「脳」に着目して仕組みを調べてみました。

小脳と大脳

「体を動かすための指令は脳から電気信号として筋肉に伝わり、筋肉が収縮することで体が動く。」
といったことは一度でも耳にした方はいるかと思います。

そもそもその指令を出す脳ってどういったもので構成されているのでしょうか?

脳の構造

種類 役割 補足
大脳 精神などの高度な機能:運動を命じる、記憶や情動、認知といった精神をなどの機能を司る 哺乳類(中でも人間)が発達している
小脳 運動機能:大脳から受けた運動の命令に対して、力の強さやバランスを調整する 鳥類が発達している
脳幹 生存本能機能:生命維持に関わる、意識、呼吸、循環器系を調整する

私たちの体を動かす際に、「運動しろ!」という指令が大脳で生成されます。
その指令は小脳を経由して体の筋肉に信号が送られるのですが、小脳では大脳の指令を調整するやくわりがあるそうです。

小脳には、プルキンエ細胞という細胞が約3000万個存在しているそうです。
一つのプルキンエ細胞はたくさんの軸索が伸びていて、シナプスを介して「平行線維」とつながっています。

ファイル:Cerebellum circuit figure1.png - 脳科学辞典

この細胞の一連の繋がりのことを「小脳回路」と呼ぶそうですが、私たちは小さいころから多くの動作を取得した結果が、この小脳回路に反映されているとのことです。

ぎこちない動き、洗練された動きとは?

ぎこちない動きとは?

運動する指令は大脳から送られ平行線維を経由して小脳に送り出されると説明しましたが、「動きがぎこちない」とはどう言った状態なのでしょうか?

動きがぎこちない状態とは、「一つのプルキンエ細胞」に対して複数の平行繊維から情報をもらっている状態で、運動指令の
伝道効率が悪い「小脳回路」を形成されている状態と言えるそうです。

大脳から指令を送っているけど、情報を送る道が多すぎることで、大脳で描いた情報が思うように筋肉に届かず結果として
「ぎこちない」といった動作に繋がるそうです。

洗練されるとは?

先ほど、「ぎこちない状態」とは「伝道効率の悪さ」と説明しましたがどうすれば伝道効率が上がるのでしょうか。

プルキンエ細胞には「登上線維」というものと繋がっているのですが、間違った運動をした!と感じた場合、
登上線維からエラー信号がプルキンエ細胞シナプスに送られ、エラー信号が送られたシナプスは「抑制」されます。

つまり、身に着けたい動作の動きを繰り返すことで、平行線維と繋がるシナプスの数が限られて「伝道効率」が上がることにより、動きが洗練されていくそうです。

このシナプスが抑制される現象を「長期抑制(Long Term Depression)」と呼ばれているのですが、一度シナプスが抑制されると、長期抑制のなのごとくシナプスはつながらない状態が維持されるそうです。

例えば、一度乗れるようになった自転車を、久々に乗ったとしても「全く乗れなくなってしまった!」ということはありませんよね?

一度体で覚えた運動パターンは、長期抑制によって脳で永久保存されるためどんなにブランクがあってもできなくなることはありません。


小さい頃に自転車の練習をする中で、小脳の登上繊維がエラー信号をたくさん出してシナプスの繋がりを効率化してくれたおかげで私たちは今でも自転車に乗れているのです。

自分で指示したわけでもないのに、間違った!というエラー信号を必要なタイミングで出してくれるってほんと凄いです。

大事なこと、定着するまで繰り返す!

脳は一度定着できたことを忘れることはないのですが、何度も繰り返すことでようやく定着するそうです。
また自転車の例ですが、一度乗れるようになったあとも何度も練習を繰り返すことで当たり前のように乗れるようになると思います。

筆者も「たまたま?」理想とするペダルの踏みかたを取得しましたが、できないときがあるということ小脳がその動作の仕方を完全に理解できていない状態なんだと思います。

「大人の「運動音痴」がみるみるよくなる本」によると、覚えるためには以下のようなことが必要とのことです。
①目的を持つ:意識することで、神経パターンの定着率アップ
②繰り返す:神経パターンを脳に定着させる
③行き詰まったら休む:繰り返しても効果がない場合は休むことも大事とのことです。寝ることは脳内で情報整理する時間でもあるとのこと
④上達を客観的に確認する:間違った動作を覚えてしまわないように、定期的に自分のフォームを振り返り修正する

今の自分は「筋肉の使い方」が分からなくなってしまっているので、④により改めてペダルの動作に必要な筋肉はどこか?別の記事を参考に施行錯誤しています。
→そこを紹介しないんかーい!という突っ込みはいったんなしの方向で笑

①-④のメリットは、また別途深堀してみたいと思います。

終わりに

思うように動作を取得できない場合は、やみくもに練習するのではなくどういった筋肉が登場人物として登場するのか常に確認したいですね。
いま筋トレのタスク管理アプリを作っていますが、追々はそういったことをサポートする機能も搭載したいです。

ふと思いだしましたが、
ジブリの魔女宅にてキキが箒に乗れなくなってしまった際に、ウルスラが「書くのをやめてほかのことをする!」
みたいな発言をしてました。

決して間違っていない発言ですし、自分も行き詰ったらウルスラの顔でも思い出して休憩してみようと思います。

参考図書

・大人の「運動音痴」がみるみるよくなる本(著者:深代千之)
・プロが教える脳のすべてがわかる本(著者:岩田誠)

【初めまして!】アプリ製作に至った背景

こんにちは、池田和浩と申します!

初めてのブログ投稿です!

私は現在、「マイトレ(仮)」という筋トレのタスク管理アプリを開発しているのですが、本記事ではこのアプリを作ろうと思った「背景」についてお話ししていきたいと思います!


トピックス

  • 「記録する」という行為について
  • 「意識する」という行為について
  • 終わりに

「記録する」という行為について

プロフィールでも少し触れていますが筆者は今年で社会人6年目でして、20代もそろそろ終わろうとしています。

仕事は基本的にデスクワークのため体を動かす機会は少なく特にスポーツもしていないという状況が何年も続いてました。

社会人になってからたまに筋トレはしてたのですがどうも続かなく、例えば季節が変わり寒くなったらジムに行くのが面倒くさくなり自然消滅。。。
  
筋トレに限らないですが「継続的」に何かを続けるには、「結果」を振り返りやすいよな状況を作ることが大事であると考えています。
 

「昨日腕立てやったし、一昨日はスクワットこんだけやってたんだな。じゃあ、今日はこのトレーニングをやろう!」
 
といった具合に、過去の実績を振り返りやすい状況を作ることで、モチベーションを維持するのに役立ちます。
 
また、「記録する」といった行為は、オーバーワークによる怪我を防ぐことにも役立ちます。

超回復の理論があり、筋トレ後「48-72時間」程度の休息を与えることでより筋肉が成長するわけですが、記録しておくことでより定量的に把握することも可能となります。
 

どうやって記録するか?

さて、この「記録」ですが、皆様はどうった方法で「記録」していますでしょうか?

・ノート
・アプリ ← 筆者が作っているのも対象!
・頭 

他にもあるかもですが、こういった手段があるかと思います。
勝手に私の独断も入ってますが、ざっと特徴をまとめてみました。

メリット デメリット
ノート サッと記録できる(雑に書いても自分にわかれば良い) ・嵩張る
・グラフで成果を見ようとすると大変
 →自分で描いたり、excelなどに別途入力してあげて表を作ってあげる必要あり
アプリ ・嵩張らない(ノートよりは)
・グラフを自動で生成してくれる
フリック入力が面倒
 →筆者の市場調査が足りてないかもですので、もし良いのがありましたら教えてください!
・嵩張らない(スマホ以上に) ・忘れる
 →人間の脳は揮発性ですので信用してはなりません!
 


以前筆者は別のアプリを使っていましたが、トレーニングのインターバル中にするフリック入力することが面倒くさくてやめてしまいました。
頭で記録している時もありましたが、筆者は記憶力は決して優れてないので適当な管理になってましたね笑

やっぱ、慣れたアプリを使って記録すると良いと思います。
 

「意識」について

記録方法に関してピックアップしてみましたが、私は「記録」する行為をする上で如何にして「意識せずに記録できるか?」が大事であると考えています。

マインドマッスルコントロール(以下MMC)という単語があり、使用する筋肉を意識することでよりトレーニングの効果が得られるとのことです。

つまり、トレーニングにより成果を得たいとなる場合は、トレーニング中は筋肉に対して集中していることが必要となります。 
レーニングの種目にもよりますが、筋トレでは一つの種目に対して何度か実施します。大体セットのインターバルは30秒-60秒ってところでしょうか。
 
この短い時間の中でトレーニングに関係ない行為をしてしまったとしたら集中力が途切れてしまうので、次のセットに向けて集中力を戻す必要があります。

ちょっと小話で、一つ一つの物事を決断するという行為も集中力を妨げる要因になるとのことです。イチロー選手や五郎丸選手のルーティンは有名ですが、こう言った習慣化した行動をすることで「集中力を高める」ことに役立てているそうです」。 
ですので、トレーニングのセット間で行う「記録する」という行為も意識的に実施してしまうようでしたら、その時点で集中力が途切れてしまってると言えるのかなと思います。
 
というわけで、筆者の作るアプリには「意識せずに記録する」という思いを込めています。

音声による記録の模索

少しトレーニングと話がそれます。

脳の前頭葉には「ウィルパワー」という集中力に関する体力のようなものが存在していて、「自分を操る超集中力(著者:DaiGo氏)」によると、「ウィルパワー」は人間は物事に対して「決断」を下す際に消費されるようです。
 
ウィルパワーを消費続けることで集中力が途切れてしまうので、「ここぞ!」というタイミングでウィルパワーを使ってあげる必要があります。 
筋トレにおいては、負荷をかけているその瞬間に筋肉に対して意識を向け、休憩の間には無駄なことをしないいったことが大事になってくると思われます。
 
ですので、このセット間に「意識せずに記録する」ことが大事であると考えています。

書く、スマホをいじると言った行為はいずれも「手を動かしています」が、運動していると置き換えることができます。
手を動かして運動をすることは、それだけ「判断」の回数も増えているためウィルパワーは消費されます。
それに対して喋るという動作は、手を動かす動作に比べ、運動量も少なく「判断」する回数も少ないと思っています。

→ごめんなさい、この辺はまだ私の勉強不足で本当にそうなのか?と言われるとなんとも言えないです。ですが、現在作っているアプリにて音声による記録を試作して試した際には、フリック入力よりはるかに楽である!と感じた次第です
 

最後に

ということで、音声による記録が可能な筋トレのタスク管理アプリを作成している次第です。

アプリでは記録する以外にも「グラフで表示する機能」、「任意の種目を作成する」といった最低限必要と思われる機能も実装しています。

追々は、他の機能も追加したいと思ってますが、スマートウォッチのようなウェアラブルバイスを使用してよりノンストレスに記録ができるようなものを提供したいと考えています。
apple watchに話しかけて記録すると言ったシーンを思い浮かべてますが、スマホ以上に手軽さを演出できそうな気がしてます。そんでスタイリッシュ

 アプリのリリースは6-7月中を目標としてます。

が、私はiOSアプリ開発は初めてでして・・・

基本的な機能は完成してるのですが、リリース作業の手間取りそうと懸念してます。
とちょっと自分に保険かけちゃいましたが、なんとしてでもリリースしようと試みてます!

便利なものを提供できたらと思ってますので、リリースした暁には使っていただけたら幸いです。

機能改善要望も受け付けますし、より良いものになるよう改良し続けたいところです


そんなわけで、 ブログ初投稿でした。ここまで読んでいただきありがとうございました!