突然だが、あなたは以下のような悩みを抱えていないだろうか?
「覚えたいことがあるのにすぐに忘れてしまう…」
「復習は重要だけどなかなかやろうと思えなくて…」
長期記憶から情報を取り出すには反復練習が必要だが、一度覚えたものは2度と復習しないのが人間というものだ。だって復習は新奇性に乏しくイマイチモチベーションが上がらないんだもの。全くその通りだ。
しかし、記憶したい内容を定期的に通知してくれる仕組みがもしあるのなら手軽な復習ができる。今回は、Google Apps Script(GAS)を利用して、スプレッドシートの内容をLINE Notifyに通知するツールを作成した。
これであなたの記憶量は倍増する。嫌な定期テスト、昇進試験で100点満点、クイズミリオネアで1,000万円を獲得できるのは疑いようがない(誇大広告)。それでは順次内容を追っていこう。
エビングハウスの忘却曲線
そもそも僕がこんな面倒なことを始めたのは、読書で記憶した内容をすぐに忘れてしまうからだ。
僕は普段、Amazon(アマゾン)のKindleでダウンロードした本に興味深い内容が書いてある時は該当箇所をハイライトし、Evernote(エバーノート)に転写するようにしている。ただの流し読みよりは内容を頭にいれることができるはずだが、記憶への定着は悪い。一度転写した内容を復習する機会に乏しいからだ。
今から以下で偉そうなことを言いますが、実はエビングハウスの忘却曲線について詳しく調べたのはツールを作ったあとです(おい)。
エビングハウスの忘却曲線によれば、一度記憶した内容でも時間が経過するたびに思い出すまでの時間が増えてしまう。具体的には、20分後には58%、1時間後には44%、9時間後には36%、1日後には34%、2日後には28%、6日後には25%、1ヶ月後には21%という形で節約率が逓減する。
節約率とは、一度記憶した内容を完全に記憶するまでにかかる時間の節約の割合であって、時間の経過とともに記憶量がどれだけ忘却するかの割合ではないことに注意したい。節約率は以下の式で表される。
- (節約率)=(節約された時間または回数)÷(最初に要した時間または回数)
- (節約された時間または回数)=(最初に要した時間または回数)-(覚え直すのに要した時間または回数)
エビングハウスの忘却曲線の解釈は以下のブログがしっくり来たので参照されたい。
1980年代に改良された二重貯蔵庫モデルでは,1度でも理解すれば長期記憶へと知識が移行します.そして,これを意識する,つまりワーキングメモリに持ってくることが「思い出す」という行為に相当します.「思い出す」,つまり長期記憶に貯蔵された知識をワーキングメモリに持ってくるためには,検索という過程が必要です.
現代の認知心理学では,検索の成功率を高めるために反復練習が必要とされています.(中略)
経過する時間に対し,検索の成功率を測っているといえます.
エビングハウスの忘却曲線とは,現代風にいうと,検索の成功-失敗率曲線なんかといえるのではないでしょうか – 拡大解釈されたエビングハウスの忘却曲線とその現代的な解釈 – gomibako1205 @ ウィキ – アットウィキ
一度理解して長期記憶に保存した内容をワーキングメモリに持ってくるには検索という過程が必要で、エビングハウスの忘却曲線は時間の経過による検索の成功率を示したものだという訳だ。
いずれにせよ反復練習により検索の成功率は上がるため、一度理解した内容を定期的に通知するツールがあれば効率的に思い出せるのではないかという仮説の下ツールを作成しようと考えたのだった。
ただし、軽く調べただけですが、エビングハウスの忘却曲線は100年以上前に報告されたもので、様々な批判があるようです。
たとえば、ジェンキンスとダレンバックの実験(1924)による「記憶の干渉説」によれば、一定時間の睡眠を取った方が睡眠を取らなかった時よりも比較的よく記憶していたそうです。これは一定時間の経過で記憶が減衰するモデルを補強するものです。
また、適切な手がかりが与えられなかったために起こる「検索失敗説」によれば、適切な手がかりが与えられなかった場合に再生できなかった単語が、与えられた場合には再生できる場合があるようです。記憶は消去されるのではないことを示した点で、忘却曲線の反証・批判となります。
今回は「とにかく定期的に覚えたいことを通知するツールが欲しい」という前提の元、これらの説は無視して進めています。
Google Apps Script(GAS)でLINE Notifyに通知。果たして…?
という訳で、登場するのは僕が唯一触れる絶対神「Google Apps Script(GAS)」。環境構築でつまずくことがなく手軽に触れるためとても扱いやすいのだ。前回と同様、今回もスプレッドシートを使ってスクリプトを組んでいく。
- スプレッドシートの内容を取得する
- 記憶した内容をLINE Notifyで定期的(1日後、1週間後、1ヶ月後)に通知する
以下の画像のように、スプレッドシートにデータを置いた。ごちゃごちゃ色々と時間が書かれているが、使うのは実質B列の「content」、E列の「date」のみだ。
- content:記憶したい内容を入力。ちょうど脳はいいかげんにできている その場しのぎの進化が生んだ人間らしさを読んでいるので、本文のハイライトした内容を入力している。
- date:contentに入力した日付と時間を入力。なぜかMacのショートカットキーが使えないので、C列とD列を足している。
スクリプトは以下のように組んだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
var today = new Date(); // 今の日付と時間 Logger.log(today); function memory() { // スプレッドシートの内容を取得 var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet1 = ss.getSheetByName("DB"); for(var i = 2; i < 500; i++){ var content = sheet1.getRange(i, 2).getValue(); var date = sheet1.getRange(i, 5).getValue(); var dt = today - date; var day = Math.ceil(dt / 1000 / 60 / 60 / 24); Logger.log(day); if (2 <= day && day < 3 || 9 <= day && day < 10 || 39 <= day && day < 40){ sendHttpPost(content); } } } // LINE notifyへの通知 function sendHttpPost(content){ var token = [access_token]; var options = { "method" : "post", "payload" : "message=" + content, "headers" : {"Authorization" : "Bearer "+ token} }; UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options); } |
一応軽く説明しておくと、
1 2 3 |
for(var i = 2; i < 500; i++){ var content = sheet1.getRange(i, 2).getValue(); var date = sheet1.getRange(i, 5).getValue(); |
forを使ってB列とE列の2行目から500行目までを取得。
1 2 |
var dt = today - date; var day = Math.ceil(dt / 1000 / 60 / 60 / 24); |
プログラムを実行する時間からE列の時間を取得し、日にちに修正。
1 2 |
if (2 <= day && day < 3 || 9 <= day && day < 10 || 39 <= day && day < 40){ sendHttpPost(content); |
引いた日にちが1日後、1週間後、1ヶ月後の範囲にあるなら、sendHttpPost(content)を実行(LINE Notifyに通知)。
という具合だ。「sendHttpPost(content)」の部分はQiitaの記事を参考にさせていただいた。ありがとうございます!
ちなみにスクリプトを実行するトリガーは一旦12時間ごとで設定。1日2回も復習できる…!
LINE Notifyに通知した結果は果たして…?
ひとまずスクリプトを組んで1日経った結果がこちら。LINE Notifyに無事通知されたことがお分かりいただけるだろう。
ただ、先ほどの話が正しければ、「一度理解した内容を反復して練習すれば検索の成功率が上がる」のであって、理解していなければただの垂れ流しになってしまう。だから、まずは一度しっかり理解して長期記憶に情報を貯蔵することが重要だ。
リマインダとしても使えます。
ちなみにスプレッドシートのB列にやらなければならないことを入力しておけば、リマインダとしても一応使える。たとえば以下のように。
おしまい。
ド素人なんですがよろしいでしょうか?
スプレッドシートに変更があった場合、内容だけがその都度line notifyに通知するようにしたいのですが。。。
↑のスクリプトを参考にしてやってるのですが、なかなかうまくいかないのです。
よろしくお願いいたします。