Evernoteからの脱却の一環として先日作った、WriteNoteの代わりのメモアプリ・システム BNoteを改良、というか何度も作り直して居た。いろいろ試したものの、結局、25年くらい前を彷彿させる※素っ気ないwebとなった。
※でも、marqueeやアニメGIFは使ってないので許されそうだw
僕にとって一番重要なのは、主に外出先で手軽に「サッと」ノート(タイムスタンプ付きメモ)を書くことができる、しかも、入力欄が大きくて見やすい・書きやすいということで、それらは充分に満たしているし、自分だけで使うものなので、やり過ぎるのは疲れるうえに馬鹿らしいから、とりあえずは良しとした。
以下にその変遷を書く。
- Automagic版
- Automagicに問題はなかったが、この夏に終了になってしまったため、なるべく移行した方がいいと考えた。
- また、入力欄が小さい(ほとんど調整できない)のがちょっと気に入らなかった。
- Automate版: 初期の機能確認まで
- Automagicの代替アプリのひとつ、Automateを試してみた。
- 機能的には使えそうなことは分かった(入力欄はAutomagicより良かった)が、有料だし面倒(グラフィカルなプログラミングはスマフォでしかできないので、結構疲れるし、何をするにもやり方が違う)なので止めた。
- 入れたら電池消費が増えた(本当かは不明)気がしたのも、止めた理由の一つ。
- Web版 (作らなかったかも: 記憶が曖昧)
- 試しに作って動いたが、ちゃんと使うには認証が必要なので、WordPress版に移行した。
- WordPress版
- WordPress(以下WP)の非公開の投稿(ログインしないと表示できない)に無理やり(<pre>の中に入れた)HTMLとプログラム(PHP)を書いて、ノートが書けるようにした。
- WPで認証できるメリットがあったため、やってみた。
- Web版 (WPで認証)
- さすがに(中身が)綺麗でなかったので、単独のwebページにした。ただ、認証は必要なので、(無理やり)WPの認証を使った。
- どういう仕組みかは分からないが、wp-load.phpを取り込むと、ログインしているかの確認ができる。
- さすがに(中身が)綺麗でなかったので、単独のwebページにした。ただ、認証は必要なので、(無理やり)WPの認証を使った。
- Web版 (Joplinに保存): 中止
- サーバにJoplinアプリ(コマンドライン版)をインストールすれば、自動でJoplinに取り込めて便利だと考えたが、以下の理由で中止した。
- サーバにJoplinのストレージのNextcloud(以下NC)のアカウント情報を保存するのは良くない。
- Joplinアプリのキャッシュ(Joplinのノート全部が入る)は暗号化されないが、それではNCのストレージを暗号化している意味がなくなる。
- サーバにJoplinアプリ(コマンドライン版)をインストールすれば、自動でJoplinに取り込めて便利だと考えたが、以下の理由で中止した。
- Web版 (NC管理下に保存)
- ノートのファイルをNCの管理下に保存し、NCでデスクトップPCに同期できるようにした。
- NCの仕様により、ノートは平文で保存している。
- BNoteのノートは量が少ないので、許容することにした。
- NCのFormsアプリ改造版: 断念
- ファイルはNCに保存するのに認証がWPなのは変なので、NCの認証が効くNCのアプリを利用しようとしたが、断念した。
- Formsアプリ(アンケートなどに使うアプリ)が結果が見やすいので試してみた。
- Formsの入力ページを外のページのIFRAMEに入れて位置情報を追加しようとした。
- しかし、どうしてもFormsの入力フィールドに位置情報を設定(自動記入)できなかった(設定してもサーバに届かない)ので、諦めた。
- Formsの入力ページを外のページのIFRAMEに入れて位置情報を追加しようとした。
- NCの外部サイト版: 断念
- NCから外部サイトを開ける機能にBNoteのweb版を指定して、NCの認証を利用しようとしたが、手軽に使える認証情報はなかった。
- その情報(例: 外のNCのページのrequesttoken)とNCのDB内に保存された値を比較すれば、認証しているか確認できそうだと考えたが、DB内には見つからなかった。
- NCのOAuth2機能が使えそうだったが、それほど手軽ではなかったので断念した。
- NCから外部サイトを開ける機能にBNoteのweb版を指定して、NCの認証を利用しようとしたが、手軽に使える認証情報はなかった。
- WP版 (Basic認証+α) ← 今ここ
- 既にある手軽な認証機能を使うのを諦め、(昔ながらに)自分で認証することにした。
- HTTPSなら、Basic認証は(カッコ悪いけど)それほど脆弱でないので、そうした。
- また、愉快犯によるブルートフォース攻撃を避けるため、URLのパスを"bnote"のような分かりやすいものでなく暗号みたいな文字列にして、ログインを試すこと自体を難しくした。
- 仮にログインできても、ノートが書けるだけで読めないので、(DoS攻撃は別として)致命的な問題は起こらなそう。
- とは言え、変な引数やバッファオーバーフローなど、考慮していない脆弱性があるかも知れないので慎重を期した。
- BNote: Automateを試用
- BNote: WordPress版 (PC)
- BNote: NextcloudのForms改造版
- BNote: NextcloudのForms改造版: 保存されたメモの表示
- BNote: Web版 (スマフォ)
- BNoteの保存されたメモ (イメージ, 一部伏せた)
以下に、作った(出来た)ものについて書く。
BNoteの機能
- スマフォで(PCでも)短いノート(タイムスタンプ付メモ)が書ける。
- ブラウザで動くのでアプリのインストールは不要。
- ただし、スマフォの場合、Operaでは位置が取れず、Firefoxはなぜかハングして表示できないので、事実上はChrome系しか使えない。
- ブラウザで動くのでアプリのインストールは不要。
- 各ノートには時刻と位置(取得可能な場合)が追加される。
- 各ノート間は空行で区切られる。
- その日の最初のノートの前には日付も入る。
- 一日分のノートは1個のファイル(ファイル名に日付が入る)にまとめられる。
- ユーザ(一人しか居ないが)・年ごとに別のディレクトリになる。
- ノートのファイルはサーバに作成され、自動でデスクトップPCに同期される。
- ノートを新規作成・更新したらメールで通知が来る。(Joplinへの転記忘れを防ぐため)
実装メモ
- 認証: Basic認証
- 上記のとおり、HTTPSならそれほど脆弱でないと考えた。
- ノートの入力: HTML(FORM, textarea)
- ノートをJavaScriptで送るためPOSTは面倒だったので、GETを使っている(URLのクエリー文字列にノートを含めている)。それぞれのノートは短いので、GETでも大きな問題はなさそうだと考えた。
- 位置の取得: JavaScript
- 送信ボタンを押した時に位置を取得し、ノートと一緒にサーバに送る。
- 位置取得条件は「何でも可」(高精度でなくても可、無限に過去のものも可)にして、電池消費を増やさないようにしている。また、「あればいい」スタンスなので、取得タイムアウトを0.5秒と短めにした。
- ノートへの時刻・位置情報の自動付加: PHP
- ノートの送信時刻を各ノートの前に付け、位置(送られて来たら)を後ろに追加して、ファイルに記録する。
- 時刻は、クライアント(ブラウザ)から送られて来たらそれを使い、なければサーバでの受信時刻を使う。
- ノートの保存先: 通常のファイル (NCで同期)
- NC(暗号化ストレージ)以外で作成・更新したファイルの取り込みを容易にするため、「外部ストレージ」の機能を使った。
- ノートの同期: Nextcloudアプリ
- 今までは別のファイルをrcloneで同期していたが、こちらのほうがリアルタイム性があって便利なので、全部を切り替えた。
- 新規作成・更新ノートの通知: crontab+find
- 定期的に検索している。
- 最後に最新だったファイル名を保存しておき、それより新しいものを調べている。
- 定期的に検索している。
問題点・TODO
- サーバが停まっていたり、通信出来ない場合はノートが書けない。
- そういう時は、エディタやJoplinを使うとか、手で紙に書けばいいか。。。
- 通信できる場合は、元祖のWriteNoteを使ってもいい。
- ブラウザのローカルストレージを使う手もありそうだが、なかなか面倒そうだし、やり過ぎだろう。
- そういう時は、エディタやJoplinを使うとか、手で紙に書けばいいか。。。
- 複数のセッションで同時に書き込むと、きっと良くないことが起こる。
- 対応するとすれば、書き込む時に排他制御するのだろうが、一人で同時に別の端末から書き込むことは物理的にできないので、対処しなくても大きな問題ではない。
- 位置の取得条件などを変えられると便利かも。
- そういう設定を付けても、いじることはまずなさそう・・・
その他
- FirefoxのAndroid版は、上記のようにハングしたり位置が取れないだけでなく、viewportの動作がChromeやOperaと違っていた(textareaの幅がものすごく広くなった)ので、以前もそうだったが、相変わらず使えないと思った。
- Operaで位置が取れないのは、navigator.geolocation.getCurrentPosition()のオプションの高精度("enableHighAccuracy")を有効にしていないからかも知れない。(未確認: これを指定すると電池を食いそうなので、余りしたくない)
- 今はノートの記入にはChromeを使っていて、電池消費が気になるが、使いながら確認したい。
- JavaScriptを使うと、(セキュリティ上の条件はあるが)iframeの親(外)や子(中)にアクセスできることが分かり、なかなか強力だと感心した。
PS. Evernoteからの脱却はほとんど終わったようなものだ。近頃はEvernoteでノートを書くどころか、全然アクセスしていない。あとは残りのノートをJoplinに移行する「だけ」だからロボットにでも頼めばいいが、適当なものがないのでw、やる気が出た時にやろうと思っている。ノートの数が多いので、重要なものだけは目で確認し、残りは一括処理しようと思っていて、その準備は大体できている。あとは一括処理するスクリプトを書く「だけ」だ。これもロボットに頼みたい(爆)
なお、Joplinは最高とは言えないが、少なくともEvernoteの10倍は いい。自分でいろいろ いじれるのもいい。ただ、Androidアプリはもう少し頑張って欲しい(大きいノートではビューア以外に使うのはキツい)。今はデスクトップ版に注力している感じなので、今後に期待したい。
PS2. その後、Hacker newsを見ていたら、僕と同じようにタイムスタンプ付きメモをしたい人(→ 元のスレッド: jlduggerという人のコメント)が居ることを知り、そのためのツール(jrnl)があることを知った。ノートの記録(表示)のされ方がBNoteそっくりなのに驚いた。 (11/26 14:16)
コメントを書く