選択の痕跡

音楽・テクノロジー・哲学

Evernoteのメモの復習をPythonで(少し)効率化した話

Evernoteのメモの復習をPythonで(少し)効率化した話を、自分の整理のためにもまとめておく。


昨今は空前のメモブーム。
時代に流されている感もあるが、自分もこれまでアウトプットの意識が低いなーと思うところが多々あり、最近は頻繁にメモを残すように心がけている。


メモの手法としては、紙だと絶対に面倒になったやらなくなるのが目に見えていたので、主にEvernoteを利用し、日々のメモとか読書メモをまとめている。
その中には記憶したい知識などの内容もまとめてあり、定期的に復習する習慣をつけたかったのだが、
Evernoteの機能では、そういうニーズを満たす方法は見当たらず、
単純に適当に過去のメモを見返すのは、あまりにやりづらかったため、そのやり方を試行錯誤していた。


世の中には、似たような悩みを抱えている人が居るだろうと思い、ググってみた。
ランダムで過去のメモを表示するようなサービスがあればそれで良いかと思ったが、意外としっくりくるものがない。


いくつか見つけたものだと、「Reflect for Evernote」は使えそうだったし、UIも良いなぁと思ったのだが、
新しく追加したメモが更新されない点と、自由度が低い点が気になり、採用はしなかった。
u2pinkfloyd.blog.fc2.com


こちらの「RandomEver」は、シンプルにランダムでメモを取得してくれるが、試してみてはいないものの、1件ずつしか取得できなさそうだったので、こちらも採用はしなかった。
myenigma.hatenablog.com


他にもアプリでは色々ヒットするものはあったが、有料だったり、すでにアプリがなくなっていたりすることも多かった。


ということで、インターネット上では、なかなか良い感じのものが見つからなかった。
こうなったら、SEの端くれとして、ちょっと自分でやりやすいようにプログラム作ってみるかと考えてみたのである。
満たしたいのは、
・過去のメモをランダムで抽出する
・抽出する件数は自由に選べる

という2点。
理想は、ユーザの数字をインプットに、ボタンひとつクリックするだけで、引数の数字分のメモを、特定のノートブックからランダムで抽出して、テキストに表示してくれるみたいな感じ。


でもそれは完全に実現するのは、自分の技術力ではしんどかったため、手運用含めて、以下みたいな方法を考え、実装してみたので、参考までに紹介する。
※ちなみに仕事ではコード自分で書かない系SEであり、技術力はほぼ皆無のため、とにかく色々ググってみて、実装してみた。


1.ノートブックごとにエクスポート【手運用】
2.ランダムにメモを抽出【python
3. ひとつのテキストに統合【bat】

※Windows10、Python3.6.5の環境で実施。


「1.ノートブックごとにエクスポート」については、以下を参考に「複数のWebページファイル(.html)でエクスポート」を行う。
自分は、各ノートブックごとに抽出する件数を変えたかったので、
その点を考慮し、フォルダごとに、htmlファイルを格納する。
よっぽど件数が多かったり、ノートブックの数がめちゃくちゃ多くなければ、そんなに時間はかからないはず。
help.evernote.com


「2.ランダムにメモを抽出」は、1で格納したhtmlファイルからランダムで、指定の件数分のhtmlファイルを取得し、別フォルダにコピーする仕組み
詳細は、以下のソースを参考にしていただきたい。
ソースの可読性や効率性は度外視の自分用プログラムのため、その点はご容赦いただきたい。
こうしたほうがいいよ、みたいなアドバイスはめっちゃありがたいので、もしあれば教えていただきたいです。

import glob
import random
import shutil
import os
import codecs
from pathlib import Path

#日付ごとにフォルダを切っておくようにして、そのフォルダ名を活用している。
day = os.getcwd().split('\\')[-1]

#コピー元フォルダとコピー先フォルダ。
path_copy_from = 'copy_from'
path_copy_to = 'copy_to'

#コピー元のフォルダ。フォルダはノートブック単位。
path_skill = 'C:/Users/yagis/Downloads/evernote_html/'+ path_copy_from + '/' + day + '/スキル/*'
path_tech = 'C:/Users/yagis/Downloads/evernote_html/'+ path_copy_from + '/' + day + '/テクノロジー/*'
path_biz = 'C:/Users/yagis/Downloads/evernote_html/'+ path_copy_from + '/' + day + '/ビジネス/*'
path_book = 'C:/Users/yagis/Downloads/evernote_html/'+ path_copy_from + '/' + day + '/読書/*'

#フォルダごとに、抽出したいメモの数を定義。
skill_number = 30
tech_number = 50
biz_number = 100
book_number = 5

dictionary = {
    path_skill: skill_number, 
    path_tech: tech_number, 
    path_biz: biz_number, 
    path_book: book_number
}

for path, number in dictionary.items():
    reportfiles =  glob.glob(path)
    select_files = random.sample(reportfiles,number)
    path_copy = select_files[0].replace(path_copy_from, path_copy_to).split('\\')[0]
    if not os.path.exists(path_copy):
        os.makedirs(path_copy)
    for select_file in select_files:
        path_copy = select_file.replace(path_copy_from, path_copy_to).split('\\')[0]
        shutil.copy(select_file, path_copy)


最後の「3.ひとつのテキストの統合」は、この状態だとhtmlファイルがたくさんフォルダごとにある状態なので、
復習しやすく、ひとつのファイルにまとめるだけである。
ファイル形式は何でもよかったのだが、Evernoteからエクスポートされるファイルがhtmlだったので、
そのままシンプルに、batファイルでひとつのファイルにまとめてみた。
せっかくbatファイルを使うので、pythonの実行もこのファイルで行うようにしてある。

if exist concat.html del concat.html

python copy.py

for /F "delims=" %%F in ('dir /b /s *.html') do (
type "%%F" >> concat.html
)

pause


とりあえずやりかったことは、これで十分満たせたかなと思う。
実装の際には、文字コードにハマったりして、たったこれだけでもめちゃくちゃ大変だったので、
もっと技術力を身につけなければ、、、と改めて感じた。
そのため、コードを書く機会をもっと増やす所存。


今後は、ワンクリックでこれができたらいいなぁと思いつつ、まずはEvernoteAPIを使えば、もう少し良い感じに出来るのでは、
と思うところがあるので、試してみたいところ。
エクスポートの部分とか自動化出来るだけでも大分違うのではと思っている。
codezine.jp


おわり。
何かアドバイスやご意見、ご指摘等ありましたら、是非よろしくお願いいたします。