ずっと やりたかったものの、大変そうだから延期し続けていたことが半分くらい片付いた。

Joplinは結構使い勝手が悪くて早く排除したかったので、業を煮やして「ちょっと」思い付いたことを試したら※意外にうまく行ったので(これが いつもの嵌まるパターン)、その方向で進めたら(これも悪手だ!)やっぱり大変だった。が、常々イライラしていたJoplinから どうにか脱却できそうなので、うれしい。

※結構前に、どういうふうに進めるか・するかを考えて居たが、ちゃんとやるのは大変な感じだったので進まなかった。そこで、一旦それを棚上げして思い付きを試してみた。テキトーに作るのは良くないが、停滞状態を変えるには こういうこともアリなのだろう。そのあとが大変だが。

以前書いたが、僕はJoplinをノートを書くために使っていない。MD(Markdown)で書くなんて面倒臭くてやってられないので、Zim(僕の改良版)で書いて※Joplinはスマフォ(サーバ)にノートを送ったり、画像をZimに貼り付けるためだけに使って居る。

※JoplinにもWYSIWYG編集モードがあるが、以前使ったら ひどいものだったので止めた。その他のWYSIWYGのMDエディタも僕には使いにくく、Zim(MDではない)だけが残った。

参考までに書くと、具体的な使い方は日々の買い物メモだ。それが90%以上だ。メモ用紙の削減に絶大な効果がある。詰まらないことだけど、例えば、日々変わる食品・日用品(例: レトルト食品)の有無・残量※は覚えられないし、紙に書いて更新・持参するのは非効率だ。

とは言え、紙のメモでなくてはならない場合もあるので、片方だけにすべきだとは思って居ない。適材適所だ。

※余談だが、ものの残量などを自分で調べてノートに打ち込むのは全くアナログだ。そこで、(半)自動で更新するようなシステムが便利そうだが、実現はなかなか難しい。冷蔵庫の中を調べる製品はあるようだが、そういうのでは全く不充分だ。

それから、良くあるアプリのパターンだが、それがスマフォだけでしか見たり更新できないのも不便だ。やっぱり、慣れたPCでも使えないと不便だ。もちろん、それらの間の転送も自動でないと面倒だ。

更に、気に入って使って居るのに、提供者の都合で勝手に改悪・終了されたりしたくないし、余計なお世話もされたくない!

それだけのことなのに、どうにも使いにくかった。Joplinや今までのシステムには以下の問題があった。

  • サーバとの同期が遅い、おかしい。
    • 特にスマフォでは、設定していてもバックグラウンドで同期することがない。
      • 電池の最適化をoffにすればいいかも知れないが(以前試して駄目だった気もする)、電池消費が激しくなりそうだ。
    • ノートを見る時に手動で同期するしかないが、2回連続して同期しないと最新版が表示されない。
    • 同期が すごく遅い。
      • 何をしているか分からないが、同期が始まるまでが特に長い(体感で1-2分くらい)。
      • 上述のように それが2回必要なので、とにかくスマフォでの同期は嫌だった。
  • スマフォアプリは使い物にならない。
    • 上の同期の問題以外に、遅い。大きなノートは まず開けない(実用的な時間では無理だし、大抵落ちる)。
    • 大きなノートのスクロールも困難。
      • 下のほうを見るには延々とスワイプし続ける必要がある。
        • ただし、ほとんどの他のアプリでも同様
  • メモリの大食い(特にPC)
    • Electronアプリのため、複数のタブ(ノート)を同時に開くのは全く実用的でない。
  • ディレクトリ構成が悪い。
    • すべてのノートの画像を一箇所(ディレクトリ)に格納しているため、僕の場合、そのファイル数が1万個を超え、負荷の増大や上述の同期速度の低下の原因になっていることが疑われる。
      • こんなに大きい画像ディレクトリはファイルマネージャでも容易には見られない。
    • この件以外にも、(技術的にはどうか分からないが、)システム構成を ちゃんと考えずに作った印象があり、将来性(ずっと使い続けられるか)は疑問だ。
      • 構成以外にも、独自のサーバを作ったりするのはいいけど、既存部分のサポートが いい加減な感じで、余り信用できない・付き合って居られない感じだ。
  • DBが不便かつ大きい。
    • ノートの文章はDB(sqlite)に格納されているが、Joplinなどを介さないと開けず不便なうえに、大きい(100MB以上)ので厄介だ。
      • インクリメンタルバックアップの容量が増大する。
    • その割には、サーバにはノートごとに格納しているようなのが謎。
    • DBの構成を見ると、似たようなフィールド(カラム)が沢山あって理解不能。
  • 勝手にバージョンアップして同期できなくなることがあった。
    • スマフォアプリのバージョンアップでサーバ内の構成が変わったらしく、PCにまで影響した。
      • PCのアプリには特にエラーが出ていなかったので、しばらく気付かなかった。
  • (Joplinだけでなく、JoplinとZimの関係による) 画像がZimのノートに手軽に貼り付けられない。
    • 主にJoplinとZimのディレクトリ構成の違いによるのだが、一旦 画像をJoplinのノートに貼り、そのノートをZimにインポートして、そこから本来のノートに貼り付ける必要があった。

今までの処理の流れ

今までは以下のようにして、PCで書いたノートをスマフォで見ていた。

  • PC
    1. Zim: 元のノートを書く。
    2. Zim+自作変換ソフト(zim2jop): ノートの更新を検出後、MDに変換してJoplinにエクスポートする。
    3. Joplin(PCアプリ): MD+画像をサーバに送る。
  • スマフォ
    • Joplin(Androidアプリ)
      1. MD+画像をサーバから取得する。
      2. 取得したMDを表示する。

なお、ZimやMDでなく、一般的なアプリ・ファイル形式を使えば良いと思われるだろうが、PCとスマフォでの操作性の良さの両立や規格のオープンさ(その会社・製品に依存しないために重要)などを重視して検討した結果 こうなった。

例えば、Evernoteなどは反オープンの極みだし、Office(Wordなど)は(特にスマフォで)煩雑だし余りオープンでない。HTMLはオープンだけど使い勝手が今一つだ。各社のメモアプリ(例: Google Keep)は汎用性・柔軟性がないし、フォーマットがオープンでないので その会社・製品に依存してしまう。

新しい処理の流れ(脱Joplin)

今回、以下のようにしてJoplinを排除することができた。

  • PC
    1. Zim: 元のノートを書く。
    2. Zim+自作変換ソフト(zim2md): ノートの更新を検出後、MDに変換してNextcloud(以下、NC)の同期ディレクトリに格納する。
    3. NCアプリ: MD+画像をサーバに送る。
    4. 自作同期プログラム(sync-zim-md-rem): MD+画像を直接スマフォに送る。 (7/31 6:09)
      • FolderSyncで定期的に同期させた時のスマフォの電池消費が気になったので追加した。 (詳細は後述)
  • スマフォ
    1. FolderSync: MD+画像をサーバから取得する。 (通常は上述の自作同期プログラムでPCから直接転送されているので、不要になった。: 7/31 6:09)
      • Zettel NotesのWebDAVでの同期に問題がある(後述)ので、それが直るまでは これを使うことにした。
      • 定期的な自動同期の他に、手動での同期も可能※
        • ※同期を開始するウィジェットをホーム画面に登録できるので、手軽に同期できる。
        • 使っていて分かったが、どういう仕組みか不明なものの、Zettel Notesでノート一覧を更新(下にスワイプ)すると同期が始まるようで、本当にそうなら上のウィジェットも不要で とても便利だ。 (7/21 17:21) ← 残念ながら、単にZettel Notesの更新中のマークが出ていただけだったようで、FolderSyncで同期は始まらない。 (7/22 18:27)
    2. Zettel Notes Epsilon Notes: 取得したMDを表示する。
      • 注: Zettel Notesの正当性が疑わしいため、使用を一旦止めてEpsilon Notesに切り替えた。 (下の「気になること」も参照のこと) (7/31 13:52)

実装などのメモ

  • このシステムではスマフォからPCへの逆同期も可能だが、スマフォで ちゃんと書く機会がほとんどないし、面倒で その気も起こらないので、今は実装していない。
    • スマフォでの簡単なメモは、(以前書いた)自作のメモシステムでPC(サーバ)に送れるので それで充分だし、書くたびに日時を手で入れる必要がないので便利だ。
  • MDへのエクスポート時のノートと画像のディレクトリ構成
    • ノート内の画像は、基本的にZimのエクスポートの仕様に従い、ノートと同じディレクトリにあるノートのファイル名+"_files"のディレクトリに格納するようにした。 (例: ノートのファイル名が"test"の時、画像ディレクトリは"test_files")
      • この時、同名(だけど中身が異なる)ファイルとの競合※を防ぐため、ファイルの中身のダイジェスト(またはハッシュ)をファイル名に追加するようにした。 (例: "image.png" → "image_726fa81814c56c6e.png")
        • ダイジェストにはCRC64を使った。
          • CRC64を計算するコマンドは ほとんどないが、調べたら7zでできることが分かった。 (→ 参照)
        • ※このディレクトリ構成ではZimに添付できている画像のファイル名が競合することはないが、仮に画像ディレクトリを共通にした時に効いてくる。
    • ただし、Joplinから取り込んだ画像は、従来との互換性維持と区別を容易にするため、ノートと同じディレクトリの"resources"というディレクトリに格納する。
      • Joplinの画像のファイル名は既にユニークなようなので(UUID?)、ダイジェストは追加せず、Joplinのものをそのまま使って居る。
      • これらは、将来 完全にZimに取り込んだ時に、上記のディレクトリに移る予定だ。
  • 更新されたノートの検出には、以前から興味があったinotifywaitを使った。
    • これにより、今まで無駄に定期的に(30秒にしていた)更新ファイルを検索していたのが不要になった。
    • また、ノートを書き込んでから変換を開始するまでの待ち時間※を、指定した値(今は3分にしている)に近付けることができた(ただ、そのメリットは余りない)。
      • ※書き込んですぐに変換開始すると、ノートの更新中に頻繁に変換することになって良くないので、こうした。
      • 待ち時間を実現するため、inotifywaitの出すファイル変更イベントの発生時刻とファイル名などをテーブルに保持するようにした。
        • 周期的なタイマーイベント(待ち時間の1/5にしている)やイベント発生時に、テーブルから待ち時間の経過したイベント(ファイル)を探す。
        • なお、イベントが頻繁に発生すると検索が無駄に多くなるので、前回の検索からの間隔がしきい値未満の場合は検索しないようにした。
      • この処理を独立のプログラム(スクリプト)にしたので、あとで何かに使えそうだ。
    • ただし、変換プログラムの起動時には前回の終了以降に更新されたノートが分からないため、従来の方法(指定時刻以降に更新されたものを検索)で検出している。
  • zim2mdはシェルスクリプトで、ずっと普通のsh(実際はdash)を使っていたが、配列が必要になってbashにしたら、原因不明のエラーが出て困った。
    • いろいろなオプションを試行錯誤しても直らなかったが、POSIXモード(--posix)にしたらエラーが出なくなった。特にPOSIXを意識して書いた訳ではなかった(「普通」に書いた)が、どこかにPOSIXだけでしか使えない記述があったようだ(そもそも、何がPOSIXか知らないw)。
      • ひどいのは、エラーの行番号がズレて出るため、本当にどこが悪いのか分からなかったことだ。
    • 気持ち悪いが どうにもならないので、とりあえずPOSIXモード専用とした。bash以外に配列が使える(軽い)shellがあれば良いのだが。
  • Zettel NotesやFolderSyncの電池消費が気になったが、頻繁に使わなければ問題なさそうだ。※
    • 電池の最適化のためか、スマフォが長時間スリープ中は同期間隔が伸びる(設定: 30分 → 3時間など)が、スケジュールなどと同様で、僕には好都合だ。 ← 使ってみたところ、どうやらFolderSync自体は きっちり間隔を守るようだ。長くなったのは、外から戻った時にWi-Fiがずっと繋がらなかったとか、一旦同期に失敗すると しばらく復活しないためではないか想像している。 (7/22 19:51)
    • ※その後、FolderSyncを動かしていると電池消費が高目(1%/h前後)になることがあるので、なるべく使わないような仕組みにした。別途または追って書きたい。 (7/27 17:28)
  • FolderSyncのWevDAVの接続情報(URLなど)の設定は難しい(謎)。
    • WevDAVサーバを標準ポートでなく、またサブディレクトリにインストールしている場合、「サーバーアドレス」にポート番号とサブディレクトリ(/remote.phpの前まで)を含めたURLを、「ポート番号」にポート番号をそれぞれ設定し、「ファイルパス」に/remote.php以降を設定する必要があった。
  • (7/31 6:09) 実際に使っていて、FolderSyncで定期的に同期させた時のスマフォの電池消費が大きくなることがあって気になったので、スマフォが家(LAN(Wi-Fi)内)にある時には、自作の同期プログラム(sync-zim-md-rem)でスマフォに直接送るようにし、FolderSyncでの定期的な同期は止めた。
    • sync-zim-md-remはシェルスクリプトで、上記のzim2mdが作ったMD+画像を定期的にrsyncでスマフォのMDのディレクトリ(FolderSyncの同期ディレクトリと同じ)に転送している。
    • 転送間隔が短いと電池消費が増える場合があったので、20分間隔にした。
    • 外出直前などにすぐに同期したい場合のために、ZimにMD変換と同期を行うカスタムツールを追加し、それを起動するボタンを付けた。
      • 仮に転送し忘れた場合でも、サーバからFolderSyncで同期することができる(可能性が高い: 外出の3分くらい前までPCを起動していれば良い)。
    • このプログラムは、元々、以前から使って居るスマフォ内の画像の自動取得プログラムに組み込もうとしていたが、自動取得プログラムの処理が複雑になってしまうので、(とりあえず)独立にした。
      • 自動取得プログラムと似た処理だが、近頃のLAN(Wi-Fi)構成の変化のためか随分簡単になったので、自動取得プログラムを改良できる余地がありそうだ。

昨日までに ここまで出来て、Zimにペースト・ドロップ・添付した画像をスマフォで表示できるようになった。そのため、通常はJoplinを使う必要が全くなくなり、すごく使いやすくなった。以下に表示例を示す。

まあ、何の変哲もない ただのノートアプリのキャプチャだし、ごく当たり前にできるはずのことだが、ここまで来るのは なかなか大変だった・・・

上のキャプチャを撮る時にも不具合が見付かり、芋づる式に いろいろ修正(仕様変更もあり・・・)して12時間以上掛かって、これを書くのの再開が今日になった。

残件

  • Joplinのノートを全部Zimに移す(引き上げる)。
    • 今は必要なものだけをZimに入れている。
      • Joplinのノートは全部で千個くらいあるようなので、自動化する必要がある。
    • Joplinの画像をZimに移すのが面倒。
      • ノート内の画像参照を変更する必要がある。
        • 今回も同様の処理(MD内の記述を書き換える)があったが、大変苦労した・・・
  • 細かい改良
    • 山ほどある・・・
  • 今までの不具合修正
    • これも多い・・・
      • 上の改良もそうだが、面倒なのと多少我慢すれば使えるので、延々と延期して来た。
    • 今回の変更で不要になったものも多そうだ。
  • デバッグ出力を減らす。
    • これが難しい。: 「出来た、大丈夫だ!」と思って減らすと問題が起こって、また出す羽目になることが多い。あと、通常時のチェック(たまに見ることがある)に必要な出力まで削ってしまって、役に立たなくなることもある。

気になること

  • Zettel NotesやFolderSyncの安全性(例: データ・アカウント情報の漏洩)と将来性
    • とは言え、Joplinが良かったかも不明
    • あと、近頃、ZNへの問い合わせ(Google groups)への回答が途絶えた。 → その後回答がなく、Google playのレビューで どうなってるのか聞いたら不可解な応答をしたため、怪しいアプリの可能性を疑い、使用を一旦止めてEpsilon Notesに切り替えた。 (7/31 13:52)
      • 今回のシステム構成は同期と表示を別のアプリにできるので、これが駄目なら別のもの(上記のように とても少ないが)に換えれば良い。
      • 別のもう1件には全く回答がないことも合わせて、今後も回答がないままなら、信頼できないから切ることもある。
        • 自分で作っているなら、問題の原因やヒントが分かりそうなものなのに、だんまりってのは怪しい。
        • ただ、外観や使い勝手を見る限り、これが何かのパクリとも思えないのが謎だ。
        • 課金する訳でもなくオープンソースでないのも、怪しさ(不信感)を増大させている。

 

おまけ: 試用したAndroidのMDエディタ・ビューアで良かったもの

Zettel Notesの次はEpsilonが良さそうな感じだ。 → (8/5 9:14) その後、Zettel Notesは不審なので止め、Epsilon NotesとObsidianを比較して全体的に少し良さそうな、Obsidianを使って居る。

  • × Zettel Notes (以下、ZN)
    • (8/5 9:14) MD表示の出来は一番良いものの、開発者が不審なので使用を中止した。推奨しない。
      • Google groupsでの問い合わせへの回答が突然止まった。回答のないものもある。
      • その件をGoogle Playのレビューに書いたら、Google groupsは知らん顔で別のところに書けという返事が来た。
    • 若干の問題はあるものの、いろいろ試した中では これが良さそうだったが、WebDAVでの同期に問題がある。
      • 問題の起こる詳細が分からないが、同期する画像ファイル数が多い場合、サーバから取得後、それらをサーバに送ってしまう。
    • 対応しているクラウドストレージとの使い勝手の比較
      • Dropbox: 変な("(",")"など、異常ではないが特殊な文字が使われている)ファイル名のファイルを無視する。無料の容量が小さ過ぎる。
      • (pCloud: 今一つメリットがない。パッとしない。): Zettel Notesは非対応。
      • Google docs: いつまで使えるの?? 信用できない。
      • sftp: 使い方が謎で使えなかった。
      • (DavX5のDAVマウント): Zettel Notesは非対応。
    • スマフォでの表示
      • 若干の問題はあるものの、いろいろ試した中では これが一番良さそうだった。
      • ただ、たまに変な表示になる。: キャプション(alt-text)の付いた画像を引用で表示すると、同じ画像が2つ表示される。下に問題の起こる例を示す。

> ![abc](resources/image.png)

        • MDへのエクスポート時にキャプションを出さないようにすれば解消するので、大きな問題ではない。
      • 大きいノートの表示は遅い。もたつく。
  • △ Epsilon Notes (以下、Epsilon)
    • ZNの画像の問題は起こらない。
    • メニューの構成が変
    • 設定のテーマが容易に変更できない。
    • ファイルマネージャ(CX File Explorer)のMDの「開く」に出るので便利そう。
    • Dropbox対応は有料
    • (8/5 9:14) MD(CommonMark)の解釈が厳密なため、いくつかの(Joplinに対する)互換性の問題がある(正しい動作だが、使いにくい)。
      • 「普通の」(または引用中の)改行が無視される。: 下の場合、行1と行2、あるいは行3と行4が繋がる。: CommonMarkでは間に空行(または空の引用)を入れるようだ。 → CSSを追加して緩和した。
行1
行2
> 行3
> 行4
      • 上・下付きに ^文字^, ~文字~ が使えない。: CommonMarkには ない。
      • 書式が空白を含んだり、英語・日本語が混ざると おかしい場合がある。Joplinや他のMDエディタでも起こったので、基本的な問題のようだ。: 下の場合、取り消し線が出ない。
~~aaa ~~bbb
  • △ Obsidian
    • ZNの画像の問題は起こらない。
    • ノートのフォルダが"Vault"なるものなのが面倒な感じ。
    • 表示は まあまあ。: (8/5 9:14) 全体的にはEpsilonより美しい。
      • 変な文字(異常ではないが、通常使われない文字)の表示が変。 (→ 例: Obsidian, ZN) ← フォントの変更で直る?
      • 大きいノート(test-diary-60)を開くのはEpsilonより遅いかも。
      • 設定したテーマが記憶されない?設定ファイルがサーバのもので上書きされたために起こったようだ。下を参照。 (8/5 9:14) ← 設定ファイルが上書きされなくても、勝手に設定が初期化されることがある。そうなる原因は分からない。 (8/11 14:31)
        • ただ、レビューでは そういう苦情を見ないので、僕の環境に原因があるのかも知れない。いずれにしても不便なので、再発したらEpsilonに移ろうと思っている。
    • Dropboxは非対応か有料
    • (8/5 9:14) MDの対応が異なる(CommonMark?)ため、いくつかの(Joplinに対する)互換性の問題がある。ただし、Epsilonよりは良い。
      • 上・下付きに ^文字^, ~文字~ が使えない。 (Epsilonと同様)
      • 書式が空白を含んだり、英語・日本語が混ざると おかしい場合がある。 (Epsilonと同様)
      • なお、Epsilonと違い、普通の(または引用中の)改行は無視されない。
        • 設定(Editor: Strict line breaksをoff)によるようだ。
    • (8/5 9:14) 設定ファイルがVaultに格納されるので、Vaultがサーバと同期されている場合、設定も同期されて予期せぬ問題となる。例: 上の「設定したテーマが記憶されない?」

他にもいろいろ試したが、まともに使えるものは本当になかった。なんで使えないものを出しているのだろうか?

 

おまけ: AndroidのMDエディタ(例: Obsidian, Epsilon Notes)で取り消し線の表示を見やすくする方法 (表示スタイルのカスタマイズ)

描画やフォントの関係だろうが、横線の多い単語(例: 牛丼)に取り消し(strikethrough)の書式を設定しても、見えにくい場合がある。僕の場合、PCはZimで、取り消しにすると文字の色もグレーになるから分かりやすいが、スマフォアプリは そうではないので見間違いやすい。

そこで試行錯誤したところ、アプリにCSSを追加設定すれば、色や線のフォーマット(太さや形状)が変えられることが分かった。方法はアプリごとに異なるが、以下にEpsilon NotesとObsidianの場合を示す。

Epsilon Notes

設定で追加のCSSファイルが指定できる感じだが、ファイル選択のダイアログは出ず、試行錯誤するのが面倒なので、標準のテーマ(Day)にスタイルを追加した。以下のように、del(CSSに詳しくないので、何というカテゴリか不明: タグ? セレクタ? クラス?)に設定すれば良い。

下のようにすると、取り消し線は茶色の太い波線になる。

del {
    text-decoration-style: wavy;
    text-decoration-thickness: 3px;
    text-decoration-color: maroon;

    /*text-decoration: line-through;*/
}

下では、Zimのように、取り消された文字が灰色になる。

del {
    text-decoration: line-through;
    /*text-decoration-style: wavy;*/
    text-decoration-thickness: 3px;
    color: gray;
    /* text-decoration-color: maroon; */
}

Obsidian

設定の"CSS snippets"に追加CSSファイルを指定する。そのファイルは(Vault)/.obsidian/snippets/*.css に置く。※ (設定の表記で誤解したが、"snippets.css"などではない。)

※スマフォ版では埒が明かず、Linux版で試行錯誤して ようやく分かった。

以下のように、.cm-strikethroughに設定するようだ。※ (念のためにdelにも追加したが、関係なさそうだ)。設定内容はEpsilon Notesと同様である。下のようにすると、Epsilon Notesの2番目と同様に、取り消し線が太線になり、取り消された文字は(Zimのように)灰色になる

※これもLinux版で開発者ツールで調べた。

.cm-strikethrough, del {
    text-decoration: line-through;
    /*text-decoration-style: wavy;*/
    text-decoration-thickness: 3px;
    color: gray;
    /* text-decoration-color: maroon; */
}

(7/21 17:21 少し追加、修正; 7/22 18:27, 19:51 修正; 8/5 9:14 「試用したAndroidのMDエディタ・ビューアで良かったもの」を修正・加筆; 8/9 9:35 おまけを追加; 8/11 14:31 Obsidianの設定が初期化されてしまう件について追記; 2024/12/3 13:24 アクセスが増えているので、期限で非公開にならないようにした。)

  •  1
  •  0
Keys: , , , , , , , , , ,

コメントを書く

名前    

メール 

URL