Archive for the ‘Android’ Category

Joplin(特にエディタ)がクソで使い物にならなくなったので※、他を探してみたのだが(試したものを付録に書いた)、結局、Zettlrしか残らなかった。エディタの機能ではJoplinは足りているのだが、遅かったり表示がジャンプしたりと邪魔されて普通に文章が書けないという点で、使うことができない。

※想像して欲しい。1文字打つ・消すたびに5秒くらい待たされるので、記憶と予想で新しいカーソル位置を想定して作業する苦しさを。30年前のviだって、そんなことはなかったよ。もちろん、何か大きなことをすると(いつ起こるかは不明)いきなりカーソルが行方不明になって、文章を書くレベルじゃねえ!

前回候補に挙がったTriliumは、(いろいろな問題はあるけど一番大きいのは、)内部的にMDでない(HTMLのようだ)※せいかJoplinのノートを開くと書式が変わってしまう。Triliumを使うために全部のノートを見て修正するなんてやってられないので、やっぱり使いものにならない。

※どうしてそうしたかは分からないが、推測してみると、MDよりHTMLのほうが 幅広い表現が可能なためかも知れない。が、世の中の標準に合わせずに自分だけの(詳細が不明な)仕様で通そうとしても先は ない。そういう点で、Triliumはセンスが悪い。

更に、PC(Linux)だけの話なら まだいいが、僕はスマフォ(Android)でもノートを共有して開きたい。すると、ノートの同期システムが必要になるのだが、こちらも(僕には)まともなものがなかった(例: ちゃんと同期しない、電池を食う)。また、同期するといっても、常に全部のノートをスマフォに入れておく必要はなく、見たいものだけ適宜ダウンロードすればいいのだが、そういうものは なかなかない。Dropboxは近いのだが、その上のノートをMDエディタで開いた時に画像が開けない問題があった。Dropbox対応のMDエディタなら可能かも知れないが、有料である。※

※高いものではないから、ちゃんと使えるなら買ってもいいけど、買わないと確かめられないので どうにもならない。

すると、PCとサーバとスマフォでノートを同期するという点では、Joplinは必要充分で なかなか良いことに気付いた。

なお、JoplinのAndroidアプリはLinux版と同様に重くて(EvernoteのAndroidアプリと同様) ほとんど編集はできず、表示専用と割り切っている。

そこで考えたのは、いつものように、JoplinとZettlrで「何とかする」ことだ。それぞれの得意な(「使える」)ところを使い、以下のように分業させるのだ。

JoplinとZettlrの分業

  • Joplin
    • (Linuxアプリ) ノートの管理
    • (スマフォアプリ) スマフォでのノートの表示
      • 重いので、編集は元から諦めている。
      • ノートの編集(書き込み)の代わりに、自作のメモ記録システム(BNote)を使っている。
        • 必要なら、そのメモをPCでノートに貼り込む。
    • ノートのサーバとの同期
  • Zettlr
    • ノートの編集

試しに上記の分業システム(のPoCかプロト)を昨日作り、どうにか動くようになった。以下に基本的な動作を示す。

動作

  1. Zettlrで編集したいノートに対して、Joplinで外部エディタでの編集を設定する(ノート名で右クリック → "Edit in external editor")。
    • あらかじめ、Joplinの設定の外部エディタに、JoplinとZettlrを連携させるためのコマンド(「コネクタ」?)を指定しておく。
  2. JoplinとZettlrを連携させるコマンド(zettlr.sh)は以下を実行する。
    1. 編集用にJoplinからエクスポートされたノート(「元ノート」)を作業ディレクトリにコピーする(→ 「作業ノート」)。
      • 元ノート自体をZettlrに指定してもいいのだが、Joplinの他のファイル(設定やログ)が見えるのが嫌だし、それらを誤って変更したり削除してしまうのを防ぐために こうしている。
      • また、下にも書いたが、Zettlrは単にファイル名を指定しても開けない場合があるので、(仕方なく)作業ディレクトリを作ることにした。
      • 更に、Zettlrはsym-linkは開けないようなので、(仕方なく)編集するノートを作業ディレクトリにコピーすることにした。
        • このために かなり面倒になった。。。
        • 調べたら、ワークスペースやノートのあるディレクトリにsym-linkがあると うまく動かないことがあるようで(→ 参照)、実際に この環境でもしばらく使っていたらノートが開けなくなってしまった(なぜか、Zettlrを再起動すると開ける)ので、(仕方なく)作業ディレクトリ直下からsym-linkを排除し、ノート中のリソース(画像)を抽出してJoplinのディレクトリからsym-linkして(サブディレクトリにある分には大丈夫なようだ)表示できるようにした。これで様子を見ることにした。
    2. 作業ノートを指定してZettlrを起動する。
      • あらかじめ、Zettlrに作業ディレクトリをワークスペースとして設定しておく。
        • 設定しないと、Zettlrが起動中に新たにノートを開く時にエラーで開けない場合が多い。
    3. 作業ノートの更新または元ノートが削除されるのを待つ。
      • 作業ノートの更新の場合、少し更新を「ためて」からJoplinのディレクトリにコピーする。
        • ノートを書いている時は頻繁に作業ノートのファイルが更新され、そのたびにコピーするのは無駄だし重そうなのでそうした。
        • 現状は、10回以上更新があったか、10回未満でも約20秒間更新がなかった場合にコピーするようにしている。
      • 元ノートが削除された場合(Joplinで外部エディタでの編集が解除された)、作業ノートを削除して終了する。
        • 作業ノートを元ノートにコピーしていない場合(上記の保留された更新が未反映の場合)には、エラーダイアログを出す。 → あとで手で反映させるなどが必要。
    4. 3に戻る。
  3. ノートの編集を終える時は、Joplinでノートの外部エディタでの編集の設定("Edit in external editor")を解除する。 → 元ノートが削除され、上の「元ノートが削除された場合」が実行される。

使っている時の画面を見ても、単に「2つのMDエディタが動いているだけ」だが、背後では上のような複雑な処理をしている。そのおかげで、Zettlrでノートを変更すると少し経ってJoplinの表示も更新される。

Zettlr(左)でJoplin(右)のノートを編集している様子

 

効果・良かったこと

  • 操作性: Zettlrは高速(というか、当たり前の速さ)だし、MDエディタとしての挙動も概ね一般的(Joplinに近い)なので、書く時にストレスがなさそうだ。
    • 今までのところ、機能不明・不足以外のストレスはない。
      • 他のエディタのようなプレビュー画面はない(印刷プレビューのみ)のだが、それで充分使えるところがZettlrの表示の すごい・うまいところだと思う。やたらに機能を増やさず、着実に進めている印象がいい。
    • 一方、Joplinのエディタは まさに"disturbance/distraction-ful"だ。
  • メモリ量: JoplinもZettlrも同じElectronで動いていると思われるが、Zettlrは随分まとも(というか普通)。
    • 開いているノートの数と使用メモリ量(アイドル時)の比較例
      • Joplin: 1ノート(サイズ: 約40KB): 約1.2GB
      • Zettlr: 5ノート(サイズ: 合計約1MB): 約680MB
    • Joplinはエディタの他にノート管理や同期の機能があるとは言え、メモリを食い過ぎる。多くのノートを開くと、簡単に2GBを超える。
    • Joplinのメモリは減ることがないが、Zettlrは作業状態に応じて ちゃんと減るのが いい(というか、それが普通だ!)。

処理速度もメモリ量も、同じElectronなのにZettlrは ちゃんとしているが、Joplinは全然「なってない」。Zettlrができているので、やればできるはずのことをしていない(Androidアプリも同様にひどい)。作者は、手を広げるよりも、まず こういう基本的なところを詰めるべきだと思う。

惜しいこと

  • ノートを編集するたびにJoplinで外部エディタでの編集を設定するのが面倒。
    • Joplinを終了しなければ設定は維持されるので それほど煩雑ではないが、(可能ならZettlrに組み込まれた)シンプルなメニュー的なものが欲しい。
  • JoplinとZettlrの管理情報(タイトルの設定方法やタグやノートのIDやマークダウンリンクなど)が別々なので煩雑。
    • ノートIDの統合はできないだろうから、Joplinをベースにするしかなく、必要になるたびにJoplinに戻るのが面倒そうだ。
    • 書いていて気付いたが、Zettlrで貼り込んだ画像をJoplinに戻す必要があることを忘れて居た。面倒かも知れない。。。
    • 同様に、新規ノートはZettlrでは作れない(Joplinに入れる機能がない)。: なかなか先が長そうだ・・・
  • Zettlrの編集機能が「もう一声」。
    • 総合的には、試した他よりは ずっといいのだが・・・
      • 書式設定の機能・メニューが少ない。
      • 日本語処理は特にしていないようで、日本語中の英語の単語選択(ほとんど文章全部が選択される)もスペルチェックも誤動作する(ノートのほぼ全体が真っ赤になるw)。
    • このブログ(WordPress)のエディタくらいの機能があれば言うことないが、なかなかうまく行かないものだ。
      • 何度もブログでノートを書くことを考えているのだが、エディタの機能だけで済むものでもなく、なかなかうまく行きそうにないので諦めている。
    • あと、テーマがどれもイマイチ。自分でCSSをいじれるが、もう少し普通の感覚のものを用意して欲しかった。
      • もしかすると、日本(というか、僕?)以外では、用意されたものがごく普通なのかも知れないw が、特に色遣いの趣味が悪い。明る目の緑とかキツい赤とか止めて欲しい・・・
  • "Zettlr"の綴りが いつも分からないw
    • Zettler? Zottler? Zottero? ヒ○ラー? デスラー?などと、最初の"Z"しか分からない。

メモ・残件

  • ファイル更新の検出は、inotifywaitというコマンドを使った。これをモニターモードで動かし、出力されるイベントを読み込んで処理する。
    • ファイルのコピー中などに起こったイベントを落とさないように、モニターモードで動かすことにした。
  • 連続した複数のイベントを保留してまとめる処理は、イベントの読み込み(bashのreadコマンド)にタイムアウトを指定することなどで実現した。
  • 現状では、編集中のノートごとに上のファイル更新の検出処理が起動されてイマイチなので、いつか統合したい。
    • ただ、基本的に待っているだけなので、負荷は高くない。が、無駄にプロセスが多くなって気分が悪い。
  • 上に書いたように、Zettlrで追加した画像や新規ノートをJoplinに入れる処理が必要だが、作るのは容易ではない。対応できるまでは適宜Joplinを併用するしかない。

 

付録: 試して却下したMDエディタ

以下のもの(すべてLinux版)を試したが、どれも僕には今ひとつだった。次点的なものはMark TextとAbricotineとReTextだった。

(書いたあとで再度試して分かったが、)Mark Textはキーの挙動と勝手な修正とメモリ量などを我慢すればZettlrより良さそうで、乗り換えたくなっている。が、更に少し試したら結構バグがあるようだし、ノートを勝手に修正されるのは困るので、保留した。Abricotineはメモリを食うのが惜しい。ReTextは いろいろ惜しい。いったい何を考えているのか分からない。そこを直せばいい感じだ。

  • Remarkable: パッケージ不足でインストール不可だった。
  • ReText: タブキーで箇条書きがインデントしない。
    • プレビューの画像のサイズが大きい(リサイズされない)。
    • ライブプレビューの表示位置がエディタと同期せず、不便。 (← レンダラーにWebkitを使えば同期する。)
    • 改行の解釈・処理が違うようで、改行だけで次に空行がないと、行が繋がってしまう。
    • メモリ量は少なそう。
  • Mark Text: MDを勝手に変更(修正)する。カーソルがノート内にある場合、Page Up/Down, 上下キーの動きがおかしい。
    • MDの箇条書きの子要素の前に余計な空行が入る(MDを勝手に変更する)。
      • その他も勝手にいろいろ(空行や空白など)書き換わる。「正しいMD」に修正してしまうようだ。
    • MDの空行が無視される。入れてもなくなる。
    • 細かいバグが多そう。
      • Ver. 1未満なので仕方ない? (結構時間は経っているが・・・)
    • 日本語対応は一番良い。
    • 雰囲気はZettlrに似ている。
    • メモリ量は多目だが、Joplinよりは少なそう。
  • MindForger: PPAがUbuntu 20.4 LTS(focal)に非対応でインストール不可だった。
  • Abricotine: 開くノート(ウインドウ)の数に応じてメモリがかなり増える。約340MB+200MB/ノート。
    • 複数のノートは別ウインドウ
    • 設定がファイル
    • 表示は綺麗。
    • Zettlrに近い。
    • 古い: 2015年。ただし、GitHubでのリリースは2020年。
  • Notable: ワークスペース型で、ノートのインポートが必要。
  • Haroopad: タブキーで箇条書きがインデントしない。
    • 複数のノートは別ウインドウ
    • なぜか、メニューのフォントが汚い。
    • 雰囲気が、僕が使っているエディタjEditに似ている。
    • メモリ量は少なそう。
    • 寄付の表示が消せない。 (← ボタンを押せば消える)
    • 古い: 2015年。
  • GhostWriter: 複数のノートが同時に開けない。
  • QOwnNotes: 最初に何か(MDは不可)開かないと起動しない。
  • Markdownify: ライブラリが合わないようで、起動しない。
  • Znote: Joplinで作ったMDの画像が表示できない。
  • Apostrophe: Joplinで作ったMDの画像が表示できない。
    • 機能が貧弱
    • Flatpakなので、インストール・起動・アンインストールが面倒
  • StackEditPro: サイトが開けなかった。
  •  1
  •  0

シンドバッドとかエリーとかタコみたいな顔は関係ない(古過ぎるw)し、好きじゃない。

結構前から時々動悸がする。近頃は、なぜか、寝ている時も夜中に目が覚めて動悸がすることが多い。寝ている時は心臓に負担は掛からないはずなのに なんかおかしいと思って調べたら、SAS(睡眠時無呼吸症候群)で息苦しくて目が覚めた可能性があることが分かった。

SASは高血圧も引き起こすとのことで、仮にそれが治れば高血圧も治る可能性があるが、そういう甘い話ではないだろう。それに、SASというほど昼間に眠くなったりしないから、ひどくもないのだろう。

↑ と書いてから気づいたが、良く考えると昼は眠いことが多い(日記には毎日数時間おきに、「眠い」と書いている)w でも、昔からで、気づいたら寝て居たということはないので病的ではないと思うが・・・

この、「眠い」と思ったり書いたりするのは、一般的な、あるいは、SASの自己診断での眠気と同じレベルなのか、疑問だ。実際、昼に眠くて横になっても眠れないことが多いので、僕は単に眠い気がするだけで(、「だるい」などと同様 口癖で)、本当は、あるいは、一般的には眠くないのかも知れない。

なお、上の自己診断は5点で「日中の軽度の眠気あり」だったが、質問の「ときに眠くなる」の条件が分からない。その「眠くなる」と僕の「眠い」が同じなのかが分からず、最初は無意識のうちに ほとんど「決して眠くならない」にしていたくらいだ。

それで、とりあえず、スマフォの睡眠チェックアプリで試してみた。沢山出て来て どれがいいか分からなかったので、以下の3種類を(3夜に渡り)試した。

  • Sleep (Sleep as Android)
  • いびきラボ
  • 睡眠アラーム

それらで調べて分かったのは、寝始めて数時間後に突然大きないびきが出て、そのあと(おそらく いびきが終わった時)に目が覚めているらしい(いびきの終わりが夜中に目が覚めた時刻に近いため)ことだ。なので、最初に書いたように、呼吸が停まって苦しくなって目が覚めているのかも知れない。

意外だったのは、ほとんどの時間はいびきをかいておらず、一晩に数回だけだったことだ(これは眠りが浅かったせいかも知れない)。あと、自分では全然寝付けないと思っていても、実は寝て居た(と記録されていた)ことが多い(寝付けない状態が長くて、いびきが少なかったのかも知れない)。

ただ、どのアプリでも本当に呼吸が停まったのかは分からなかった。というのは、いびきの音量や睡眠の質はグラフなどで出るが、呼吸の有無(停まったかどうか)は出ないからだ。いびきの音が再生できるアプリでも、最初だけしか聴けない(有料板なら可能)ので、いびきが終わる時の状態は分からないし、いびきがない時は録音されていないから、仮に呼吸が停まったとしても、その時の状態は分からない。

今流行りのスマートウォッチや「手首に付けるやつ」なら分かるかも知れない。パルスオキシメーター付きだと完璧そうだ。

↑Amazonで調べたら、睡眠のチェックや血中酸素濃度が測れるものが数千円からあるが、どれにも悪いコメントがあって ひいた(Apple watchですら)。そういうコメントは少ないのだが、それが正しい気がしてならない・・・

結局、(手持ちで調べるなら、)PCとマイクで録音して、波形でいびきを見付けて、終わる辺りの音をチェックするのが良さそうだと思うが、面倒なのでやってない。

そういえば、以前も数回録音してみたことがあるが(確か、興味本位で寝言を聞こうとしたのだと思うw)、当時はダイナミックマイクだったりゲインの大きいマイクアンプがなくて音量が小さ過ぎたので、役に立たなかった。

 

アプリを試して分かったのは、どれも電池を食う(一晩で30-40%くらい)ので、毎晩使ったらすぐ電池が駄目になりそうなことだ。特に、いびきラボは電源に繋げて使うように指示され、なんと一晩中画面がonだった(そのためか、画面を下にして置けと出る)のでひどい作りだ。

試して良さそうだったのは、Sleep as Androidと睡眠アラームだった。ただ、どちらも一長一短で、それらが一緒になるといい気がする。

Sleepは、見た感じは分かりやすそうな まとまった表示なのだが、本当の意味(グラフの見方)が良く分からないところがある。また、録音は聴けない(無料版だから?)。有料版があるはずだが、その支払いの情報がない(有料板でないとできない機能の時に出るのかも知れない)。

睡眠アラームは睡眠の質といびきについて評価されるのがいい感じで、無料版でも先頭だけだが録音が聴ける。

それから、いびきラボは名前のとおり、いびきしかチェックできない。

一つ選ぶとすれば、Sleep as Androidだと思う(使わないが)。

 

その後、PCとマイクで寝ている間の音を録音して、いびきや無呼吸を調べた。2晩実施した。比べるつもりは なかったが、片方は飲酒して寝た。数時間にもおよぶので、全部を確認した訳ではなく、目ぼしい(例: 音量が大きい)いびきの辺りと無音の箇所をいくつかピックアップした。すると、以下のことが分かった。

  • アプリの時と同様、常にいびきをかいている訳ではないようだが、小さい いびきをかいている時間が結構長い。
  • 想像だが、息をしていて いびきをかいていない時間(音が聞こえない時)は鼻呼吸なのではないか。
    • というのは、昼間に呼吸の音は聞こえないからだ。まあ、寝ている時は呼吸が深いから音が大きくなるのかも知れないし、自分で自分の息の音は意識できないのかも知れない。
  • そのため、無呼吸かどうかは確実には分からない。ただ、いびきのあとよりも前のほうが起こりやすい気がした。
    • というのは、無呼吸が続いて苦しくなって大きく呼吸をし、それがいびきになると思うからである。
  • いびきの音にはいくつかの種類があり、ゴロゴロ・ブルブルと振動するような音は いかにも危ない気がした。
    • ゴロゴロしたいびきの前は息の音が聞こえず、無呼吸の可能性がありそうだった。
  • 目が覚めて動悸がした時の前は、無呼吸ではなかった。
  • 飲酒といびきのひどさなどは 余り関係なさそうだったが、2回では分からないと思う。
    • いびきの頻度は同様だった。
    • 飲酒した夜は いびきの音量が小さかった(約30%減)が、単に録音の関係かも知れないし、たまたまかも知れない。

なので、SASの可能性はあるが、それと動悸は余り関係なさそうだ。だったら原因は何かと思うが、ホルター心電計(下記)では問題なかったので、余り気にしないほうが良さそうだ(もちろん原因は知りたいが、何かない限り、これ以上調べるのは難しい)。

動悸とは別に、naokiさんがコメントに書いて下さったように、SASなら何とかしたい気はする。それで熟睡できて、昼に眠くなることが減りそうだからだ。もしかしたら血圧も下がるかも知れない。ただ、SASは鼻や喉の構造が主な原因だろうから薬では治りそうもなく、今度ずっと呼吸補助の機械を付けて寝るのは面倒な気はする。 (9/18 10:13)

 

そして、そもそもの動悸についでであるが、昼も起こるからSASが直接の原因ではないだろう。実は、少し前に健康診断で心電図に軽い不整脈が出たので、医師に相談してホルター心電計※というので24時間測定したところ、たまに不整脈があるが連続・頻繁でないから大きな問題ではないとのことだった。加齢によるものなのだろうか。あるいは、高血圧が関係しているのか(調べたら自覚症状の一つのようだ)。

そうすると、SASと高血圧と動悸・不整脈が相互作用しているのか分からないが、まあ複雑な(というか、解決は諦めたほうがいい)感じだ。

※夏だったせいか、これのシールやベルトが痒かった。僕は普通だと思ったが、外す時、看護師さんが「真っ赤」だと驚いていた。確かに、2週間くらい跡が消えなかった。

  •  1
  •  0

以前ちょっと書いたように、Androidスマフォでの自動処理などに便利に使っていたAutomagicが終了になってしまったので、他の同等なアプリに移るか使わないで済むようにしようとしていた。具体的には、それまで使っていた2つの処理: スマフォ内の画像のPCへの自動転送とWriteNoteの代わりのメモ作成・送信が対象だった。

調べてみると、有名なTaskerは余りにも操作性が悪いとのことだったし(あと、デモ版がない)、ちょっと試したAutomateは まあ悪くなかったが、またいつか使えなくなる可能性があるのは嫌だし、電池を食う可能性があったので、そういうアプリを使わないで済む方法を考えた。

WriteNoteの代わりについては、以前も書いたように、比較的容易にBNoteという自分用サービスができた。自分のサーバでノートを記録するサーバプロセスを動かしておき、スマフォのブラウザで書き込むものである。

残ったのはスマフォ内の新規画像(動画、音声も可能)のPCへの自動転送だが、これがなかなか難しかった。技術的には全然高度ではないが、Automagicなどのようなアプリなしでスマフォを外から状態取得・制御することは不可能なので、そこを「なんとか」するのが難しかった。具体的には、スマフォ内に新規画像が出来たことはスマフォしか知っていないが、AutomagicなどがないためPCに通知することができないのだ。

それでも、いろいろ考え、試行錯誤やAndroidの動作を確認して、以下のような処理にした。スマフォ側アプリは使わないので、全部Linux PCからの処理だが、念のため、処理の主体として"[PC]"と書いた。

  1. [PC] スマフォがLANに接続され、sshが通じるまで待つ。(= スマフォが室内に入ったか、スリープが解除されるまで待つ。)
  2. [PC] スマフォ内の新規画像の有無を調べる。
  3. [PC] 新規画像があれば取り込む。
  4. [PC] 少し(今は3分)待つ。
  5. [PC] スマフォがLANに接続されていてsshが通じていたら、2へ。
  6. [PC] スマフォにsshが通じなくなったら、1へ。

最初に書いたように、元々Automagicのプログラムからの通知を契機に画像をPCから取得するプログラム(システム)があったのだが、それを上のような処理もできるように変更(機能追加)した。従来のはサーバーモード、今回のはpull(またはポーリング)モードと呼んで居る。今回は、上の処理の3以外の部分を作った(正確には、共通部分=3は同じものを使いたかった)。

なお、「スマフォ側アプリは使わない」と書いたものの、実際にはsshサーバアプリ(SimpleSSHD)を使っている。これにより、PCからスマフォに接続してコマンド(多くのLinuxコマンドが使える)を実行したり、スマフォのストレージにアクセスしたりする。sshサーバ(sshd)はとても汎用的なので、Automagicのようにディスコンになって困ることはまずない。ある製品がディスコンになっても、互換の別のものに置き換えることが容易なためだ。

スマフォ内に新規画像が出来たことをスマフォから通知できないので、PCから定期的に調べる(ポーリング)ことにした。この方法はほとんどいつも無駄にファイルを検索するので好きでないが、仕方ない。頻繁にストレージにアクセスすることで電池消費率が増えなければ良しとしたが、今のところ問題なさそうだ。Androidの仕様なのか、スリープ状態の時は処理が遅くなる(例: 新規画像の検索(の開始)に1分以上掛かることがある)ので、GUIでないプログラムも省電力化されているようだ。

それから、外から帰って来た時などに、スマフォへの接続がなかなかできない問題があった。いろいろ調べたら、スマフォがルータに接続していないためで、当たり前のことだった。Androidはあまり頻繁にWi-Fiをチェックしないようだ。帰宅して画面を点灯しないでいると数十分は繋がらないので、15-30分間隔だろうか(それで、以前は即座に繋げるようなフローをAutomagicで作ったのだが、電池を食うので止めた)。

もう一つの問題は、やはり省電力化に関係すると思われるが、sshで繋がっても、コマンドによって処理が遅いものがあることだ(速いコマンド・場合があることが謎である)。具体的にはrsync(新規画像の取得に使う)が遅くなることが多かった。また、find(新規画像の検索に使う)も遅くなることがある。正確には、どちらも実行が遅いのでなく、起動するのが遅いようだ。rsyncは数分間掛かることがあり、普通の設定だとタイムアウトしてしまう。かといって、タイムアウトを10分などにするのも今ひとつだ。

それで、試しに、sshfsでスマフォのストレージをPCにマウントして画像取得してみたら、マウントされるのが遅いことがあるものの、その後は高速に処理できたので、画像取得はsshfs+rsync(スマフォのストレージをローカルととして扱う)で行うことにした。

ただ、そんなことは(今まで使っていて、今回も使っている)画像取得プログラムは想定していないので、いろいろな対処(「調整」)をした。それらを場当たり的でなく、なるべく汎用的にするのが大変だったが、「まあまあ」だ。

その他に、スマフォの処理状況をPCは分からないので、書き込み中の中途半端な画像を取り込んでしまうのを防ぐことにした。これも どう実装するか悩んだ。結局、ファイルの更新時刻が新し過ぎるものは取り込まないようにした。※ 具体的には、ファイルの更新時刻が現在時刻より1分以内のものは次回(約3分後)に取り込むようにした。

※他の方法として、画像ファイルなどの中身(が正しいか)をチェックすることも可能だが、既存のプログラム(例: ffmpeg, ImageMagickのidentify)で最後の数バイトが欠けても分かるものはなさそうだったので、止めた。

ただ、3分待たずに画像を取り込みたいこともあるかも知れないので、以前同様に手動取り込みもできるようにした。スマフォ側からは、ブラウザでPC側のサーバに(従来と類似の手順で)アクセスする(通知を送る)ことでできるようにした。PC側からは、上の2と3の処理を(周期的なタイミングでなく、)僕のしたいときにするような処理にしている(従来と同じ処理)。

細かい工夫として、スマフォのIPアドレスはルータの設定や交換などで変わる可能性があるが、そのたびにPCの画像取得の設定を変えなくても済むように、スマフォをMACアドレスで管理し、通信する時にarpコマンドでIPアドレスを調べるようにしている。なお、スマフォやPCが起動直後などでarpテーブルに登録されていない場合は、broadcast pingなどで調べるようにした。

 

作って(正確には既存プログラムの改良)出来て、それなりにちゃんと動き出した。手前味噌だが、スマフォで写真を撮影したり画面キャプチャして少しすれば(忘れて居たりするw)勝手にPCに来て、digiKamで"New"のタグが付けられていて一目で分かるので、かなり便利だ。

 

という訳で、めでたく(というか、多くの場合と違って何も問題はなかったので、めでたくはないのだが)Automagicを使わなくすることができた。

 

(バックグラウンドで動く、純然たるサーバプログラムなので全く画像がない。出すとしたら、(ハッカー映画みたいな)ターミナルにデバッグ文字列が流れる動画?w)

  •  0
  •  0

少し前の話だが、2要素認証のワンタイムパスワード(TOTP)生成用のアプリAuthyを止めた。それ自体は便利だったのだが、Linux版が嫌いなSnapというソフト配布システムを使っていて、Snapを止めるために止めることにした。

乗り換え先のアプリを検討したが、Authyのように、LinuxとAndoroidで動いてTOTP生成用データを共有・共用できるアプリはなかった。ただ、パスワードマネージャのKeePassXC(Linux)とKeePassDX(Android)はTOTPに対応しており、それらはクラウド経由でデータが共有できるので、使えそうなことが分かった。

一方、同じアプリでパスワードとTOTPを管理するのでは、2要素認証の意味がなくなって脆弱な気がしたので、次の方針にした。

KeePassXCとKeePassDXでパスワードとTOTPを管理するが、マスターパスワードの異なる別のDBに格納する。

そのため、実際のログイン時の操作は少し面倒で、以下のようになる。

  1. パスワードのDBを開き(パスワードDBのマスターパスワードを入れる)、目的のサイトなどにユーザ名とパスワードを入力する。
  2. 2要素認証のサイトではTOTPのDBを開き(TOTP DBのマスターパスワードを入れる)、目的のサイトなどにTOTPをコピー・ペーストする。

マスターパスワードが増えて なかなか面倒だ(その他にもPCやサーバのログインなどのパスワードがあり(これらもDBに入っては居るが、開くのが面倒なので覚えている)、記憶の上限に近くなっていて、時々こんがらがる)。Linux対応の指紋読み取り装置があれば使えるだろうか? 他にもっと便利な仕組みはあるだろうか?

近頃はFIDOとかいうのが有名だが、名前しか知らない。 → LinuxではYubiKeyというのが使えるそうだ。それを買うのもいいが、スマフォの指紋読み取りシステム・デバイスをLinuxにも使えれば手軽でいいが・・・ (これはおもしろそうだが、セキュリティ的にはどうなんだろうか? それに、きっと「root化」しないと無理だろう。)

なお、Andoroidには(TOTPには対応していないが)上記のアプリとDBが共用できるKeepass2Androidというパスワードマネージャもある(KeePassDXの前に使っていた)ので、パスワードはKeepass2Androidで、TOTPはKeePassDXでアクセスすることにして、アプリ内でDBを切り替える手間を省いた(KeePassDXは切り替えが面倒)。それから、Andoroidでは指紋認証でDBが開けるのでLinuxよりは楽だ。ただ、指紋を共用することで2要素認証の意味がなくなる気がしないでもないことに今気付いたが、どうなんだろう?

 

それから、以前も書いたが、Authyはデータをエクスポートできないので、移行する際は、Authyに登録している全部のサイトのTOTPを設定し直す手間があった。また、退会を申し込んでも30日間は保留され、毎週リマインダのメールが来るのが結構鬱陶しい。

  •  2
  •  0

(題は微妙に違うかも。題と「毒を喰らわば−」と「背に腹は−」を足して3で割った感じかw)

先日の、IPv4(以下v4)だけがネットに繋がらなくなったトラブルの予防的対処のため、仕方なく、IPv6(以下v6)が使えるところは使って行くことにした。

いや、僕はそんな仕様はどっちでも良くて、そもそも「アドレス枯渇する・した」とか「遅いからv6にする」なんてのがおかしいと思って居るので、積極的にIPv6を使う気持ちはさらさらなかったのだが、ああいうトラブルがあると、さすがに全面移行とまでは行かないが、代替手段を用意して可用性を高めておく必要性を痛感したのだ。※ それが無料(自分の時間は別)で実現できるし、各アプリ・プロセスの通信速度が向上・安定する可能性がある(といっても、IPoEにしてから全体でも個々でも速度が遅いと感じたことはほとんどないが)から、まあ悪い話ではない。

※そもそも、可用性を高めることが必要なことをしているかどうかは別でw、「気分の問題」であろう。

それで、まずは、自分のサーバから始めた。サーバは、プロバイダがv6対応の環境で提供してくれていて、OSも対応しているので、設定すれば使える状態だったが、面倒なので今までは有効にしていなかった。

最初にサーバのv6関係の設定をした。普通にできて、デスクトップPCからpingが通った(v6のアドレスを直接指定した)。試しにwebサーバにアクセスしてみたが、通らなかった。Webサーバの設定をしていないので、v6では接続を受け付けていないためだ。

次に、設定を誤ると面倒なことになるwebサーバの、比較的単純な部分をv6対応の設定にした。試しにブラウザからv6のアドレスでアクセスしたら、例によって「怪しいサーバです。これ以上は駄目よんw」みたいなのが返って来て(HTTPSでSSL証明書がおかしいため)、めでたく繋がった。

それからDNSサーバにv6用のホスト名(サブドメイン)を登録した。今はv4とv6のホスト名を共通化する(同じ名前で両方に対応)のが一般的だろうが、予期できないさまざまな問題が起こりそうだったので(実際に問題は起こった(後述))、ひとまず別にした。作業としては、v6用のサブドメインにAAAAレコードだけを設定した。設定してから数分で反映され、ホスト名の検索(nslookupコマンドなど)に出るようになった。

次に、HTTPSをちゃんと使えるようにするために、Let's EncryptのSSL証明書にv6用のサブドメインを追加した。証明書の生成時にサーバの設定の調整が必要だった。証明書を作る時には、確認のためそのサーバにアクセスされるのだが、それを忘れていてwebサーバはHTTPSだけ有効にしていたが、真っ当な証明書(これを作ろうとしている!)がないのでアクセスされず、HTTP接続しようとして失敗した。それで、仕方なくHTTPも有効にして、無事(でもないけど)作れた。新しい証明書を作ってからブラウザでアクセスしてみたら、ちゃんと"404 Not found"が返って来た。

設定が複雑なので間違うと面倒なことになるブログは落ち着いてからにすることにして、まずは、普通のweb(BNoteを含む)とDAV(カレンダー・アドレス帳やJoplinで使っている)をv6対応にすることにした。とは言え、webサーバに関しては証明書を作るために調整してほとんど出来ているので、DAVサーバやクライアントアプリなどの設定変更や追加がほとんどだった。クライアント側の機器やアプリが多いので手間は掛かったものの、ほとんど問題なく終わり、ちゃんとv6でアクセスできるようになった。

とりあえずできたので、しばらく使って問題がないかをチェックすることにした。使っているうちに、以前から気になって居た、v6のプライバシーの問題※の解決策が見付かった。デスクトップPC(Linux)のv6の設定に、"IPv6 privacy extensions"というものがあるのに気付き、調べてみたら、僕の懸念を解消できそうなものだった。

※IPv6のアドレスは全世界でユニーク(かつ、不変なものもある)なので、そのクライアント(PCなど)からアクセスしている個人の特定や追跡が容易そうだという僕の懸念。

その機能を有効にし、モードを"Prefer temp. addr."にしたら、PCのv6のアドレスが増えた。今までのもの(通常のグローバルアドレス)に加え、一時アドレスが表示されている。このアドレスは通常のアドレスより秘匿性(?)が高いらしく、また、定期的に(1日-1週間のようだ※)変わるので、個人の特定や追跡が困難になるとのことだ。

※設定後1日経った今現在でもアドレスが変わっていないので、しばらくは観察する必要がありそうだ。 → 忘れると嫌なので、愛用のcrontabで自動チェックするようにした。

→ (12/2 19:35) 昨日くらいからアドレスが変わるようになった。大体30時間で変わった。設定変更後、OSの再起動またはNW IFの切断と再接続が必要だったようだ。

ただ、これには欠点もある。アドレスがコロコロ変わるので、僕がサーバのログを見て、本当に自分でアクセスしたのか分からないということだ。でもまあ、他の情報から判別できるし、プライバシーの問題の方が重要なので、Privacy extensionsを使うことにした。

一方、Androidはその点はどうなのかと調べたら、結果的には問題なさそうだ。rootになれないのでprivacy extensionsを有効にしたりすることはできないが、挙動を調べたら、v6アドレスが結構頻繁に変化することが分かった。

そもそも、Androidスマフォには2つ(以上)のv6アドレスがある。モバイル(LTE)とWi-Fiである。モバイルは、詳しいタイミングは分からないが、基地局に接続するたび(基地局が変わるたび?)に変わるようだ(機内モードをon/offした前後でアドレスが変わっていた)。Wi-Fiも同様に、APに接続するたびに変わる。

だから、僕の観察が間違っていなければ、Androidに関しても、v6で概ね問題なさそうだということになった。

なお、僕のスマフォ(AQUOS sense lite)はAPN登録時にはv6は無効になっていたが、APN設定でv4/v6のモードに切り替えたら、v6が使えるようになった。MVNOの場合、プロバイダによってはv6が使えないことがあるらしいが、僕は(IIJが下回りらしい)イオンモバイルで、全く問題なく使えた。

随分調子良かったので、このあともこの調子でスルッと行くかと思って気を良くして居たが、やっぱり、そうは問屋が卸してくれなかった。問屋というのは そんなに厳しいのだろうか?w 作業面での手間はなかったが、原因不明で解決が難しそうな問題が残っている。

切っ掛けは、欲を出して早くも(サブ)ドメインをv4/v6両用にしたくなって、v6用に作ったものをそうしてみたところ、一見うまく動いているのだが、Joplinだけがおかしかったことだ。本来の動作は全く問題ないのだが、なぜかサーバのv4のアドレスにアクセスしてしまうのだ。PCのOS(Linux)のv4とv6の優先順位がおかしいせいだろうと考えて、いろいろ調べて調整しても、結局直らなかった。

それで、Joplinのフォーラムに質問を出しつつ、更にJoplinのソースなどを調べたら、確定はできないが、どうやらJoplinの下回りのNode.jsのnode-fetchという通信用モジュールの仕様(または「現状」)によるのではないかと推測している。というのはnode-fetchのcustom agentオプションのうち、v4とv6の切り替えに関係するfamilyは、socket.connectによって以下のように規定されている。

family <number>: Version of IP stack. Must be 4, 6, or 0. The value 0 indicates that both IPv4 and IPv6 addresses are allowed. Default: 0.

字義通り解釈すれば、デフォルトの0で、v4/v6どちらも使える場合に、どちらが使われるか不明(不定)だ。※ 「普通」ならOSの優先順位(Linuxではv6が優先)と同じになると期待するが、実際の動作はそうではない。もちろん、Joplinに「v4優先」という意思や仕様があれば別だが、そうする理由は全くない。また、familyには優先順位が指定できないので、「v4優先」を実装するのは面倒だ。

※Node.jsのそこのソースを読めば分かるだろうが、なかなか面倒だ。一体、Joplinから何階層下がらせるつもりだ!?w

そこで想像してみると、OSまたはシステムコールまたはライブラリからホスト名に対応するIPアドレス一覧を得たあと、familyが0以外ならv4かv6でフィルタリングする。そして、残ったものを使う。複数あっても気にせず、「最初の1個」を使うのだろう。

結局、OSなどからどういうふうにIPアドレス一覧が来るかが問題だ。どうも、単にソートされているだけのような気がする。その場合、v4が先に来る可能性が高そうだ。 (まあ、余計なこと考えてないで、実物を読めば速いのだがw)

(11/29 0:01) 書いた後で更に調査・実験して、ほぼ原因が分かった。Node.jsのDNSモジュールのdns.lookupという関数は、ホスト名からIPアドレスを取得する(これをnode-fetchが使っているかは未確認だが、おそらく使っていると思う)。そのデフォルトの動作はDNSリゾルバの結果をv4のアドレスをv6より先に並べ替えて出すため、Joplinはv4/v6両用ホストに対しては(Linuxの標準・通常動作とは逆に)v4のアドレスにアクセスする。参考のため、dns.lookupの設定を行うオプションverbatimの説明を引用する。

verbatim <boolean> When true, the callback receives IPv4 and IPv6 addresses in the order the DNS resolver returned them. When false, IPv4 addresses are placed before IPv6 addresses. Default: currently false (addresses are reordered) but this is expected to change in the not too distant future. New code should use { verbatim: true }.

確認のため、簡単なプログラム(→ 参照: そのページ下部の"Live Demo"から開けるOnline Node Compilerが便利。ただし、そこではDNS検索は失敗してしまう)で、dns.lookupをv4/v6両用ドメインに対して実行したら、本当にv4アドレスが返って来た。そして、オプションを追加してverbatimをtrueにして実行したらv6アドレスが返って来た。。。

どういう理由か知らない(IPv6の実装が今一つだった頃からの経緯?)が、折角OSが苦労して(そのうえ、ユーザから文句を言われたであろう: )RFCに準拠して並べ替えたIPアドレスを、ライブラリごときが勝手に並べ替えてしまうなんて、余計なお世話もいいとこだ! 上の説明に「近い将来は逆になる」と書いてあるが、現行版ですらこの勝手な動作なので、当面は直りそうにない。ということは、Joplinの問題も直りそうにない。

直すとすれば、自分でNode.jsに手を入れることだろうが、そもそもビルド環境を作るのが面倒だ。更に、Node.jsは結構更新されそうなので、僕の修正を残すようにするのが難しい(でも、できれば爽快だろうな・・・)。

(11/29 12:57) 直し方を検討したが、「まあ不可能」という結論になった。まず、dns.lookup(DNSモジュール)はNodeに埋め込まれている(コンパイルされているようなので、パッチはまずできない。さらに、NodeはJoplinに埋め込まれている)ので、Node(この場合、Joplinも)をビルドし直さない限り入れ替えられない。

次に、dns.lookupは最終的にはLinuxのgetaddrinfo()を呼ぶが、これはlibcまたはlibnssに入っているようで(未確認)、どちらも大変基本的なライブラリなので安易には改造できない。うまくしてライブラリとNodeの間に割り込めばいいが、さすがに、いくら暇でもクソのためにそんな面倒なことはやってられない。

ってことで、気に入らないけど我慢するのがベストだ。

 

てな訳で、別に大きな問題ではないが、喉に魚の小骨が刺さったような気持ち悪さが残っている。しかし、そもそも論とか現実問題としては全く問題ない。というのは、最初に書いたように、v4が使えなくなった時の代替手段が欲しかった。そして、この仕様では、v4が駄目になったら自動でv6に切り替わる(正確には、アクセスする時に、生きているであろうv6が使われる)はずだからだ。

が、通信速度の向上・安定化とか、前回書いた、JPNEのMAP-Eのv4のポート数の上限の問題も改善したいという欲があるので、気に入らない。それで、今は、v6用に作ったドメインをやっぱりv6専用に戻して使っている(他の方にすれば「は?」って感じだろう)。

まあ、(気分は悪いが、)自分用サーバはv6専用でも何も問題ないから、このままでもいいかという気はしている。一つだけ問題が起こる可能性としては、何らかのトラブルでv6だけ通らなくなった場合にアクセスできなくなることだ(そんなことが本当に起こるのか、検討の余地はあるw ただ、ルータ故障時にv6非対応の物に交換したらそうなる)。その時はv4/v6両用の方がいい。ということは、そもそも論で言えば、v4/v6両用にして、Joplin(と他のNode.jsのアプリ?)だけはv4でも見逃すべきなのだろう。もう少し考えよう。

→ 全体的には、しばらくv6用ドメインで試して問題なければ、基本ドメインをv4/v6両用に変更し、v6用ドメインに換えた自分用サーバを使っているアプリの宛先をそっちに戻すのが一番美しそうだ。多くのアプリの設定を戻すのは手間だが、これなら、v6用ドメインは本当にv6用で筋がとおるし、基本ドメインはv4/v6両用で今風になるし、可用性も高まるから、いいことづくめだ。 (本当に?w)

それから、Joplinと似たような問題がEvolution(メーラー)でも起こった。通常時はv6をアクセスするのだが、スリープからの復帰後にv4に戻ってしまうのだ。どうやら、Linuxの動作なのだろうが、復帰時にv6が使えるようになるのが少し遅れるようで、※その関係で先に使えるようになったv4にアクセスしてしまうようだ。

※推測だが、v6の初期化の処理が多いために遅くなるのかも知れない。確かに、普通の処理(v6アドレスの取得・調整?)ですら重そうだし、上に書いたPrivacy extensionsは複雑そうだ。そういう処理はv4には全くないので、時間差ができても不思議はない。

それで、効果確認中だが、Evolutionのネットの設定の"Method to detect online state"を"Always online"にして試している(今まではNet Managerから取得するようにしていた)。これは他の普通のアプリと同じ動作(ネットの状態には関知しない)と考えられるから、一旦v6にアクセスしたら、そのまま使い続けることが期待できる。気になるのは起動時で、その時にv4だったら嫌だから、ログイン時の自動起動では数秒送らせて起動するようにした(ログイン時はスリープと違ってOSは普通に起動しているので、必要ない気もするが・・・)。

 

最後に、v6化した効果というのか、v4のポート数の削減率を調べたところ、当然ながらあった。僕のサーバ以外にもv6対応のサーバ・サイト(例: メールサーバ)があるため、アイドル時(例: Webブラウズしていない時)のv4のポート数が半分くらいに減り、その分がv6になった。以下に例を示す。

デスクトップPCで使っているTCPの全ポート数

  • アイドル時
    • v4: 15
    • v6: 15
  • アクティブ時
    • v4: 38
    • v6: 14

デスクトップPCで使っているTCPのポート数(自分用サーバとプロバイダのメールサーバ宛のもの)

  • アイドル時
    • v4: 3
    • v6: 10
  • アクティブ時
    • v4: 15
    • v6: 10

v6を使わない場合に比べ、v4率は、全ポートでは約27-50%減少し、自分用サーバなどに関しては約40-77%減少した。

とはいえ、もちろん、「Webの表示やJoplinの同期が倍速になった!」とかいうことは全くないw

 

という訳で、少し前までは使いたくもなかったIPv6を頼まれてもいないのにゴリゴリ使うことになって、いつものように疲れたでござるw

  •  0
  •  0

Evernoteからの脱却の一環として先日作った、WriteNoteの代わりのメモアプリ・システム BNoteを改良、というか何度も作り直して居た。いろいろ試したものの、結局、25年くらい前を彷彿させる※素っ気ないwebとなった。

※でも、marqueeやアニメGIFは使ってないので許されそうだw

僕にとって一番重要なのは、主に外出先で手軽に「サッと」ノート(タイムスタンプ付きメモ)を書くことができる、しかも、入力欄が大きくて見やすい・書きやすいということで、それらは充分に満たしているし、自分だけで使うものなので、やり過ぎるのは疲れるうえに馬鹿らしいから、とりあえずは良しとした。

以下にその変遷を書く。

  1. Automagic版
    • Automagicに問題はなかったが、この夏に終了になってしまったため、なるべく移行した方がいいと考えた。
    • また、入力欄が小さい(ほとんど調整できない)のがちょっと気に入らなかった。
  2. Automate版: 初期の機能確認まで
    • Automagicの代替アプリのひとつ、Automateを試してみた。
    • 機能的には使えそうなことは分かった(入力欄はAutomagicより良かった)が、有料だし面倒(グラフィカルなプログラミングはスマフォでしかできないので、結構疲れるし、何をするにもやり方が違う)なので止めた。
    • 入れたら電池消費が増えた(本当かは不明)気がしたのも、止めた理由の一つ。
  3. Web版 (作らなかったかも: 記憶が曖昧)
    • 試しに作って動いたが、ちゃんと使うには認証が必要なので、WordPress版に移行した。
  4. WordPress版
    • WordPress(以下WP)の非公開の投稿(ログインしないと表示できない)に無理やり(<pre>の中に入れた)HTMLとプログラム(PHP)を書いて、ノートが書けるようにした。
    • WPで認証できるメリットがあったため、やってみた。
  5. Web版 (WPで認証)
    • さすがに(中身が)綺麗でなかったので、単独のwebページにした。ただ、認証は必要なので、(無理やり)WPの認証を使った。
      • どういう仕組みかは分からないが、wp-load.phpを取り込むと、ログインしているかの確認ができる。
  6. Web版 (Joplinに保存): 中止
    • サーバにJoplinアプリ(コマンドライン版)をインストールすれば、自動でJoplinに取り込めて便利だと考えたが、以下の理由で中止した。
      • サーバにJoplinのストレージのNextcloud(以下NC)のアカウント情報を保存するのは良くない。
      • Joplinアプリのキャッシュ(Joplinのノート全部が入る)は暗号化されないが、それではNCのストレージを暗号化している意味がなくなる。
  7. Web版 (NC管理下に保存)
    • ノートのファイルをNCの管理下に保存し、NCでデスクトップPCに同期できるようにした。
    • NCの仕様により、ノートは平文で保存している。
      • BNoteのノートは量が少ないので、許容することにした。
  8. NCのFormsアプリ改造版: 断念
    • ファイルはNCに保存するのに認証がWPなのは変なので、NCの認証が効くNCのアプリを利用しようとしたが、断念した。
    • Formsアプリ(アンケートなどに使うアプリ)が結果が見やすいので試してみた。
      • Formsの入力ページを外のページのIFRAMEに入れて位置情報を追加しようとした。
        • しかし、どうしてもFormsの入力フィールドに位置情報を設定(自動記入)できなかった(設定してもサーバに届かない)ので、諦めた。
  9. NCの外部サイト版: 断念
    • NCから外部サイトを開ける機能にBNoteのweb版を指定して、NCの認証を利用しようとしたが、手軽に使える認証情報はなかった。
      • その情報(例: 外のNCのページのrequesttoken)とNCのDB内に保存された値を比較すれば、認証しているか確認できそうだと考えたが、DB内には見つからなかった。
    • NCのOAuth2機能が使えそうだったが、それほど手軽ではなかったので断念した。
  10. WP版 (Basic認証+α) ← 今ここ
    • 既にある手軽な認証機能を使うのを諦め、(昔ながらに)自分で認証することにした。
    • HTTPSなら、Basic認証は(カッコ悪いけど)それほど脆弱でないので、そうした。
    • また、愉快犯によるブルートフォース攻撃を避けるため、URLのパスを"bnote"のような分かりやすいものでなく暗号みたいな文字列にして、ログインを試すこと自体を難しくした。
      • 仮にログインできても、ノートが書けるだけで読めないので、(DoS攻撃は別として)致命的な問題は起こらなそう。
      • とは言え、変な引数やバッファオーバーフローなど、考慮していない脆弱性があるかも知れないので慎重を期した。

以下に、作った(出来た)ものについて書く。

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を使ってもいい。
    • ブラウザのローカルストレージを使う手もありそうだが、なかなか面倒そうだし、やり過ぎだろう。
  • 複数のセッションで同時に書き込むと、きっと良くないことが起こる。
    • 対応するとすれば、書き込む時に排他制御するのだろうが、一人で同時に別の端末から書き込むことは物理的にできないので、対処しなくても大きな問題ではない。
  • 位置の取得条件などを変えられると便利かも。
    • そういう設定を付けても、いじることはまずなさそう・・・

その他

  • 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)

  •  0
  •  1

近頃はPCなどに掛かりっ切りで随分篭っていた感じなので、昨日散歩した。ふと思い出した、ちょっと離れた公園の銀杏がまだあれば、それを観たかった。あと、先日作った、WriteNoteの代替(BNoteと名付けた)の屋外での動作確認や使い勝手の評価も兼ねた(実はこっちが主な動機だった?)。

着いたら、間に合ったのが分かったので ちょっとうれしくなった。いつもながら、ここの銀杏は なかなか綺麗だ。多くはなかったが、紅葉も綺麗だった。

その並木の下で、中国のイケメン(?)と女の友達数組が、ポーズを付けて(銀杏の葉の上に脚を伸ばして座ったりなど)撮影会(ってこともないだろうが)をしていた。いかにも中華系の若い人たちの元気な雰囲気で、なかなか楽しそうだった^^

公園を歩いて居たら、小さい保育園児4人くらいが(全然うるさくなく)おとなしく※並んで縁石にちょこっと座って、保育士さんたちに話し掛けられながらおやつを食べていた。何とも のどかで良かった。

※まだ歩くのもおぼつかなくて、うるさく走り回れないだけなのかも知れない。確かに、その子たちの大半は、あの柵付きトロッコのような手押し車に乗って来たようだ。

それにしても、あそこまで無口でおとなしいと(実際には、内心はそうでもないのかも知れないが)、さすがの僕も不思議と優しい目で見てしまう。そして、そういう幼い子どもの行動は、実は自然の本能なのかも知れないと、余計な想像を巡らせて仕舞った。

歩きながら、ラフマニノフのピアノ協奏曲 第2番 第1楽章の行進曲のようなところ(指示が長いなーw)が浮かんで来た。そこら辺は以前はそれほど好きではなかったが、近頃はいい(うまい)演奏を聴いたせいか、なかなかいい感じに思える。短い和音が連続するのを いかに滑らかに弾けるか(これはすごく難しそうだ)、しかも、行進曲のようにはガチガチにせず、ロマンティックな感じを残す、それでもパワーはちゃんと出すのがポイントのような気がしている。

それから、眺めがいいだけあって、カメラ女子(昔の能年的な雰囲気)と同オヤジw(例: 一眼+一脚+帽子+ベスト)が結構居た。平日だけど若い子は休みなのだろうか? 多いと言えば、赤ちゃんや幼児や犬を連れた人も多かった。一方、猫連れはもちろん おひとりさまの猫も見掛けなかった。

帰路、ちょっと遠回りして川沿いを歩いたが、なぜか、以前良く見た鯉も鳥も居なかった。

全部で2時間くらい歩いた。なかなか気持ち良かった。帰ったら昼時だったが、暑かったので とりあえずブローリーを飲んだ。

AQUOS sense liteで撮影

 

BNoteは問題なく使え、動作していた。散歩の経路を記録したり写真撮影してGPSが頻繁に更新されたためか、ノートに記録される位置情報もほとんど正しかった。ノートが、撮影した写真と一緒にPCに取り込め、メールで通知もされて、(細かい改良に結構苦労した甲斐あって)なかなか便利だと悦に入ったw そして、そのノートをそのままJoplinの日記に貼り込み、更に、この投稿の元ネタにできているのも便利だ。

なお、電池消費が少し多いようだったので、ノートのDropboxへの保存は止め、スマフォ内だけに保存するようにしてみた(でも、GPSやカメラの方が電池を食うので、変わらない気はする)。ただ、ミッションクリティカルな場合(例: 潜入取材)にはDropboxにも保存した方が確実そうだが、果たしてそういう機会はあるだろうか?w

 

PS. 歩いている途中で、埃っぽかったり目が痛くなることがあったので、部屋でたまに少し臭うのは(環境騒音と同様に)仕方ないのかも知れない。ただ、ジジイが吸って居た電子(加熱式)タバコの臭いは、部屋でもしたように思う。あの臭いも結構強く、しかも、煙草とは違った特性があるようで、始末が悪い感じだ。

  •  1
  •  0

数日前には「やらない」と書いたのだが、やっぱり、できそうなことはやってみたいので、WriteNoteの代わりを作ってみた。

最初は、書いた内容をオープンなフォーマットのファイル(例: プレーンテキスト)に保存できるチャットとかメモアプリがあればいいと思ったが、そういう都合のいいものはなかった。チャットだと受け側のログをコピー・ペーストすればいいが、書き始める時に相手(= 受け専用の自分)を指定するのが面倒だし、間違って他の人を指定する可能性もあるので止めた。メモアプリは内部データの場所が分からないのと、わざわざ「エクスポート」しなければ外部フォーマットのファイルには書き出せないものばかりだった。

それで、Automagicで作った。処理は簡単で、以下のようなものだ。

  1. [僕] アイコンをタップして起動する。
  2. [僕] ノートのテキストを入力する
    • "CANCEL"を押すと書き込まれない。
  3. (GPSで)現在の位置を取得する。
    • 新しく位置を取得するのに時間が掛かるので、通常はそれ以前に得られた位置を使うようにした。
    • ただ、移動中など、特別に正確な位置を取得したい場合に備えて、位置の取得を待てるようにもした。
  4. 入力されたテキストに現在時刻(※)を前置し、位置を追加して、毎日分のファイルに追記する。

※書いていて誤りを見つけた。前置するのは時刻だけでいいのに、日付も入れている。まあ、その方がJoplinに転記する時に日の間違いが起こりにくいからいいか。あとは、その日の一番最初に日付を書くのも良さそうだ。 → そうした。

更に、PC側は既存の自作の画像自動取り込みプログラムでノート取り込めるようにした。そうすれば、外から帰宅したら、撮影した画像(あれば)と一緒に自動で取り込まれる。まだやっていないが、取り込んだノートの有無や更新を調べて通知すれば、Joplinに取り込み忘れることもない。

この方式の欠点は、ノートを書くたびにクラウドサーバに送られる訳ではない(帰宅してPCに転送するまでスマフォの中にある)ので、何かのトラブル(スマフォの故障・紛失、プログラムの誤動作※)でノートが消える心配があることだ。その代わり、ずっと通信できなくても問題ないので一長一短だろう。

※誤動作に関しては、追記する前にノートのバックアップを作るようにした。

あと、テキストの入力欄が小さくてちょっと不便かも知れないが、使って試してみたい。

(11/12 16:16) その後、ノートをDropboxに送信するようにして、ローカルだけでなくクラウドへの保存も可能にした。まあ、単なる興味からで、オーバースペックであるw

それから、Automagicの入力欄をカスタマイズできないか調べていたら、この夏にAutomagicが提供終了してしまったことを知った。便利に使っていたのに残念だが、仕方ないので代わりを探すことにした。すると、早くもAutomateというのが良さそうな感じだ。外観や機能がAutomagicより整理されているのがいい。もう一個、Taskerというのがあるが、多くの人が使いにくいと言っているので余り使いたくない。

ただ、今度はなるべくこういうツールを使わず実現できる方法を探したい。PCではいろいろ作り込むとしても、スマフォ側はなるべく標準機能だけで実現したい。今回のノート記録は(散々探してなかったので)難しそうだが、もう一つの用途の、画像のPCへの自動転送では、Automagicは基本的にはPCに転送できる(Wi-Fiで通信可能な)ことを通知しているだけなので、できそうな気がする。

 

(23:50 わずかに加筆・修正)

  •  0
  •  1

マークダウン(MD)を使うクラウドノートツール(≒ Evernoteの代替) Joplin。もちろん名前が大嫌いな系統だけどw※、中身はなかなかいい。検索すると、近頃Evernoteの代わりに使い出した人が多い印象だ。

※どういう由来か知りたくもないから調べてないが、なんか名前がフランス的なので、直感で作者はフランス人だと思っていたが、どうもそんな感じだ。フランスにJoplinという有名な人が居た・居るのかも知れないが、全然知らない。 → 調べたが、2人居てどちらもUSの音楽関係の人(Scott- (c.1867-1917), Janis- (1943-1970)のようだ。作者が好きなのだろうか。だとしたら後者かな。

まだ一週間も使っていないが、日記や買い物リストなど、毎日使うものを移行して実際に使っているが、まだ大きな問題(「こりゃ駄目だ!」ってもの)はない。

また、Evernoteからの乗り換えがほとんどできた。もちろん全部のノートを移した訳ではなく、各種ツールを作って、やろうと思えばできる状況になった。あと、懸案だったWriteNoteの代替については、無理に代わりを用意するのでなく、WriteNoteを使って書いたノートを容易にJoplinに転載(インポート)できるようにした(詳しくは後述)。

以下に、使った感想とtipsなどを書く。

  • 試し始めた時にも書いたが、MDは面倒だけど、ショートカットやボタンやメニューである程度のフォーマットができてプレビューが横に出るので、それほど大きな手間ではない(そういう使い方はWordPressに近いので馴染みがある)。
    • ただ、ショートカットなどのない書式(例: 取り消し線 → <s>..</s>または~~で囲む)には難儀する。近頃は結構覚えてしまい、まんまと はまった感があるw
  • Evernoteのweb版(Evernote web)と違って、見たり書いたりしている時にノートやアプリがおかしくなることがまずないので、ストレスは少ない。
    • ノートの表示が簡素なのもいい。
  • 大きいノート(例: サイズが3MBなど)の操作性はEvernoteのwebやそのAndroidアプリよりいい。「かなりいい」とは言えないが、見ているだけなのに気付くとノートがおかしくなってしまうことがあるEvernote webやAndroidアプリのようなイライラはなく、安定感・安心感がある。
  • MD特有の癖はあるが、Evernoteよりは論理的で好ましい気がしている。
    • 昔のLaTeXのような感じ。
    • 例えば、空白や空行の扱いがEvernoteよりずっと「まとも」(プログラマー?に親和的とかTeX的)。
      • 例: HTMLと同様に、空白や空行を何個入れても1個の扱いになって不便なことはあるが、それはそれで理解できる。
    • MDはフォーマット(書式)の機能が少なくて不便な点はある(MDはプログラムなどの資料を書くにはいいが、普通のドキュメント・ノートを書くには不充分なので失うものが少なくなく、ダウングレードだと思うから、決して満足していない)が、オープンなフォーマットなので、「つぶしが利く」し自動化しやすいのもいい。ENEXでは全然駄目だ。しかも、web版ではそのエクスポートすらできない。
  • Linuxデスクトップアプリについて
    • "(“などを入れると自動的に閉じ”)"が出るのが便利。(こういうのを書いている時のように、)不便なこともあるが、ほとんどの時は便利。
      • もちろん、日本語の「」などには対応していないw
    • Evernote webは、ノートが大きい場合、表示が文字入力に追いつかなくて入力が激遅になったり、ブラウザの状態が変になってイライラすることが多いが、そういう問題は今までのところない。
      • ただし、プレビューを表示している時や、同期が開始した場合は若干遅くなる。
        • プレビューしながら大きいノート(の途中)を変更していると、表示のリフレッシュとリンクするせいか、勝手にスクロールして今書いているところが見えなくなるのが惜しい。
        • それでも、Evernote webのもたつきよりはいい。
    • プレビュー表示をコピーして、フォーマットを維持したままWorPressにペーストできるのが便利。
      • Evernote webは変なタグ(<div>がやたらに多い)が大量に付いてしまって書式がおかしくなるため、プレーンテキストでペーストして再度書式を付けるのが不便だった。
      • また、ブラウザからのペーストもフォント情報(サイズ、使用フォント)が無視されるので気楽・便利(MDにはそういう属性がないため)。
        • 例えば、タイトルのような大きな文字をそのままペーストしても全く問題ないw
    • 他のノートの参照がEvernoteのようにはできない? できるとして、どうやってする? HTMLのリンクにようにする? → 左側のノート一覧ペインのノート名で右クリック → "Copy Markdown link"で可能。 (11/7 6:41)
      • もう少し調べれば分かるかも知れない。
    • 変更したノートは、文字入力が終わってから30秒くらいで自動的にサーバに同期されるようだ。
      • この点はEvernote webと同様だが、同期の状態が分かるのがいい。
      • Evernote webは、「同期が終わりました」などと出ても まだサーバにないことがある(数分遅れる)。
    • ローカルに保存されたノートや設定はDB(sqlite3)に入っているので、Joplinのコマンドになくても手軽に閲覧・操作できる。
    • 正しい使い方かは分からないが、デスクトップ版とコマンドライン版のDBを(sym-linkで)同じものにすると、コマンドライン版でデスクトップ版にノートをインポートしたり(DBが別々でも、サーバ経由で双方は同期される)、コマンドライン版でデスクトップ版の情報が取得できるので便利だし、ディスク使用量を節約できる。
      • また、画像ファイルなどを置くリソースディレクトリも同じものにすれば、ディスク使用量を節約できる。ただ、何らかの競合が起こる可能性はある。
      • DB: $HOME/.config/joplinとjoplin-desktopのdatabase.sqlite
      • リソースディレクトリ: $HOME/.config/joplinとjoplin-desktopのresources
    • まだまだ不足な点やバグがあるが、かなり熱心に開発している感じ。毎日のように(仮)リリースがある。
      • この状態がずっと続くとありがたい。
    • 今までに気付いたバグ・問題など
      • タグでのノートのフィルタリングができないことが多い。 → 一旦別のタグを選択すると直る(= タグが2個以上ないとフィルタリングできない)。
        • そのタグを持つノートが表示されている時が駄目?
      • 取り消し線(~~)がうまく動かない場合がある。なぜか<s>はOK。
      • メモリリークしているのか、使っていると使用量が大きくなる。
        • 簡単に1GBを超え、大きく減ることはなさそう。
      • DBにノート保存先サーバ(クラウド)のパスワードが平文で入っている。
        • 最新では直したようだが、Linux版では対応していないのか、新たに登録する必要があるのか。
      • インポート直後などに書式を設定できなくなる(ボタンなどが無効になる)。 → 一旦ノートを変えると直る。
      • フォーマットのショートカットやボタンを増やして欲しい・増やせるようにして欲しい。
        • 特に取り消し線。
      • 日本語(と英語の混じったテキスト)の処理には対応していないようで、例えば、英単語を選択するつもりでダブルクリックすると、それを含む1行全体が選択されてしまう。まあ、無理もないと思う。
        • もしかして、僕が英語(+一部日本語)環境で使っているせいか?
  • Androidアプリについて
    • 電池消費はそれほど大きくない。
      • 長時間スリープ時に動作が停まって同期しないためか。
        • 電池の「最適化」を無効にしても、長時間スリープ中は全然同期しないが、電池消費が少ない方がいいので、僕は気にしない。
    • (Evernoteと違い、)ノートを見ている時に間違って編集にならないのが すごくいい。
      • 編集ボタンを押さないと編集にならないため。
    • 大きいノートも待てば表示されるようなので、(永遠に出ない)Evernoteよりもずっといい。
      • ただ、メモリは食うようで、最大で1GB近くまで使っていた。
    • 一度、アプリを開いても暗いままのことがあったが、他のアプリもそうだったので、OS全体がおかしくなっていたようだ(それで、スマフォを再起動した)。
      • その原因がJoplinかは不明。
    • 時々、ノートが同期しないことがある。
      • データ量が多い場合に途中で止めているのかも知れない。
      • 試しに省電力(最適化)をoffにしてみたが、消費電力は増えなかったものの、長時間スリープ中に同期していなかったので、意味がないようだ。
    • アプリにはデスクトップ版のようなフォーマット(書式設定)のボタンやメニューがないので、MDを手で入れるのだろうか。今はスマフォでは見るのが主だし、書くのはWriteNoteが主だし、Joplinで書くとしてもプレーンテキストが主だからまず問題ないが、仮にフォーマットを付けたい場合は面倒だ。
      • そのうちフォーマットボタンが付くのを期待する。
    • AndroidでのWriteNote(Evernoteに手軽にメモするアプリ)の代わりが要る。 → なんとかした。下を参照のこと。
      • 例えば、ノートの編集時にノートの一番上に行くのが面倒。
      • あと、現在時刻を自分で入れるのも面倒だし、Mazec(手書き文字入力)では「いま」を変換して現在時刻が出ないのも不便。
  • Joplinではないが、pandoc(ドキュメントフォーマット変換プログラム)はすごく大きい。コマンド1個で80MB近くもある・・・
    • あと、いろいろな癖があって、使う時に苦労した。
  • EvernoteからJoplinに移行する場合にノートのデータ量が気になる(大き過ぎるとサーバが容量不足になる)が、Evernoteのバックアップディレクトリは約600MB、約800ノートなので、まあ大丈夫そうだ。
    • ただ、手で一個ずつインポートするのは現実的でないので、いつかは一括処理する必要がある。

という訳で、Joplin(とMD)にはいろいろ癖などがある(だから、誰にでも勧められる訳ではない)が、Evernoteのクソさに比べれば充分我慢できる(それどころか3倍くらいいい※)っていうのが、今の感想である。

※例えば、書くことに集中できる度合いとかイライラの少なさはそのくらい上に感じる。あと、コマンドライン版があってフォーマットがオープンなので、プログラムとの親和性(→ 自動処理の可能性)や将来Joplin後の何かに移る場合の楽さは、100倍いいと言えよう。

それから、僕はブラウザ(= JavaScript)で まともに文書作成をするのはすごく無理があるし※、使い勝手が良くないと思う。Firefoxで使っているとメモリ使用量は10GB近くに膨れ上がり、上に書いたように大きなノートの操作性は最悪だし、しばらく使っていると動かなくなってしまってウインドウを一旦閉じなければならない。そんなのものは実用には程遠い。

※書いたあとで調べたら、デスクトップ版のJoplinもJavaScript(正確にはTypeScript)で書かれているので、JavaScriptかどうかは大きな問題ではないのかも知れない。あと、大量のメモリを消費するのはそのせいかも知れない・・・

 

以下、僕の考えた作業手順や作ったプログラムなどについて書く。

EvernoteからJopplinへの移行方法

JoplinはEvernoteのエクスポートファイル(ENEX)をインポートできるが、そもそもWindowsを起動して今の全ノートを同期するのは面倒だし、ENEXからだとMDでなくHTMLになってしまって※、(外見では分からないが、)ソースが汚くて あとあと不便なので、MDで取り込むことにした。

※実はENEXからMDにインポートできることに今気付いたがw、(ノートを更新・インポートするたびに)Windowsを起動したくないし、既にLinuxにバックアップが揃っていて自動更新されるのでなかったことに良しとする。

そのため、自作のEvernoteバックアッププログラム(en-backup)の作成したENMLもどき(EvernoteのHTMLもどき)をMDに変換し、それをJoplinにインポートするようにした。以下に手順の概要を書く。なお、Joplin(デスクトップ)は1.3.15、pandocは2.11.1を使った。

  1. バックアップしたEvernoteのノート(ENMLもどき)をHTMLに変換する。
    • バックアップしたノートをブラウザに表示するビューア(enb_viewer: 自作)を改造し、ファイルに出力できるようにした。
    • EvernoteのインデントとチェックボックスのMDへの変換のために特別な処理をするようにした。
      • インデントはMDに丁度いいものがなさそうだったので、">"(Block quote)を使うことにした。
        • Evernoteはインデントを"<div style="padding-left: Xpx>"のように書くので、インデント量(px)を">"の個数に変換した。
        • ただし、HTMLとして見た時(実際にはそんな機会はまったくないが・・・)もおかしくしたくなかったので、この段階では特別な目立たない記号("﹎﹍﹎"にした)に変換し、MDへの変換後(pandocの後)に">"に変換することにした。
      • インデントと同様に、チェックボックス(実際には不便なので全然使っていないが・・・)は、HTMLでは特別な記号("☐"と"☑"にした)に変換し、MDへの変換後(pandocの後)にMDのチェックボックス([ ], [X])に変換することにした。
  2. そのHTMLをpandocでMDに変換する。
    • 使用可能なMDのフォーマットはいくつかあるが、markdown_mmdやgfmがいいようだ(最新版の場合。古い版ではmarkdown_mmdが良かった)。
      • 少し比較したところ、gfmだと、Linuxのコマンドなどアルファベット・記号が羅列している時に文字が斜体になってしまうことがあるので、markdown_mmdを使っている。
      • それに、自動改行を止める--wrap=preserveオプションを指定した。
    • pandocはHTMLのチェックボックス(<input type="checkbox" ...>)をMDに変換できないようなので、上述のとおり、pandocの前後に処理を追加して、うまくMDに変換できるようにした。
    • Evernoteは空の<div>を大量に付けているので削除する。
    • 画像(<img src=...>)のパスを修正する。
      • pandocはimgタグにwidth(heightも?)が指定されているとMDの画像("![]()")に変換せずにそのまま出すようなので、変換前にwidthまたはheightを削除するようにした。
      • 画像の指定を絶対パスから相対パスに直す。
        • pandocでMDへの変換後にMDの記述を修正するようにした。
        • 画像をMDと同じディレクトリに置き、[](image.png)のように書けばいい。
        • ただし、Joplinは画像はsym-linkでなく実体でないと駄目なようなので、バックアップディレクトリから作業ディレクトリにコピーするようにした。
        • また、Joplinはインポートする画像にsuffix(".png"など)がないと駄目なようなので、追加した。追加すべきsuffixはHTML(ENML)中のimgタグに書かれているもの(例: "type=image/png")を抽出して設定した。
          • ただ、MIMEタイプがsuffixにならない特別な場合(例: svg: ただし、Evernoteでは使われていないと思う)は、別途、テーブルで定義した。
    • Evernoteとpandocの相性なのかどちらかが悪いのか、HTMLのネストした箇条書き・リスト(ulやol)の最上位がなくなってしまうので、暫定的に"</li>"(リストの項目の終わり)を削除して対応した。
      • HTML的には全然正しくなく、構造を正しく修正すべきだが、中間的なものなので良しとした。
      • 調べた感じでは、Evernoteが入れる"</li>"の位置が正しくないようで、子のリストの<ul><ol>が始まる前に入っているのが良くないようだ。
        • EvernoteはENMLであってHTMLでないと言うことは可能だが、であれば、「そんな変な物を作るのはセンスがないし無駄だし迷惑だから止めろ!」と言いたい。。
  3. できたMDをJoplinにインポートする。
    • メニューのFile → Import → MD - Markdown (file)に上でできたMDを指定する。
    • コマンドライン版では"joplin import -f --format md MD-path"でインポートできるはずだが、未確認。

オーバースペック・やり過ぎなところ、逆に間抜けなところはいろいろあるが、趣味とMD(、そしてsedも!)の勉強には丁度良かった。こういうのを作っておけば、今後もいろいろできそうな気がする。

それから、ENMLからMDへの変換を手軽にするため、Evernoteのバックアップの一覧・プレビューページに変換ボタンを追加し、それを押せば自動的に上の1と2の作業が行えるようにした。3のインポートもやれば可能だが、変換処理に誤りや問題があるかも知れないので、今のところは手で行うようにしている。

 

JoplinでのWriteNoteの代わりについて

Evernoteを完全に止めること自体に大きな意味はない(使えるところ・使える間は使えばいい)ので、外出時などに手軽にメモするのにはWriteNote(とEvernote)を使うことにした。そして、帰宅後に、外で書いたノートを忘れずにJopplinに取り込めるような仕組み(以下に概要を書く)を作った。

  • 定期的(今は1時間に1回)にEvernote中のWriteNoteで作ったノートを検索し、見付かったらそのノート名(タイトル)やGUIDなどをメールで通知する
  • 同じノートが何度も通知されるのは嫌なので、検索した日時を記録しておき、次回はそのあとに作成されたノートだけを検索する。
    • なお、上にも書いたが、ノートの作成・更新がEvernoteに反映されるのに数分間の遅れがあるため、今回検索した時刻の数分(今は5分)前を次の検索開始時刻として記録している。
  • この仕組みはclinote(3rdパーティ製コマンドライン版Evernote)とcrontabで(結構な力技でw)実現した。
  • 通知があったノートは、上述の手順でJoplinに取り込む。
    • ノートが既にバックアップされていたら、一覧からMDに変換できる。
    • 自動でJoplinに取り込むようにもできるが、いつノートの編集を終えたかの判定が難しいので、通知だけにした。
      • WriteNoteのノートができるのは高々1日1個で多くないので、通知だけで充分だと考えた。

 

(11/8 21:20, 11/9 11:35 [画像] WriteNoteの通知メールのコマンド列にバグがある件を追記, その内容を本文に更新)

  •  0
  •  0

さすがに誇張があるが、例によってなんとかした^^

電池が寿命になったNexus 4。互換電池は粗悪品だったようで復活せず、仕方なくiPhoneを使ったが、とんでもなくどうしようもないシロモノで、Nexusを蘇らせたくなった。が、まともな電池が(手頃な価格で)手に入らないことにはどうしようもない。と思って居たのだが、今日の午後に思い付いた:

電池を使わなければいいのだ。

問題は、どうしてかスマフォは(PCなどとは違い、)外部電源だけでは起動せず、電池が必要なことだ。が、そこは「ダミー電池」をでっち上げればいいのだw 検索してみると、別の機種ではあるが実際にやられている方が居て(例1, 例2)、可能性はありそうだった。Nexus 4も海外の方がしていた

ダミー電池とは、簡単に言えば、外部電源を電池の端子から出してスマフォ本体に入れるだけのものだ。とても単純なものだが、実際には いろいろな問題がある。

  • 電圧を電池(例: 3.8V)に合わせる必要がある。
    • → 実際には、3.8Vの電池の端子に5Vを直結しても問題ないようだが、一応、ダミー電池の端子の手前に手持ちのダイオードを1-2個入れて、適宜電圧を下げることにした。
  • 電池の温度センサ(サーミスタ)もダミーを作る必要がある。
    • → 10kΩ程度の抵抗を繋げばいいようだ。
  •  外部電源(USB)を繋いだ場合、電池に充電しようとするので、電流の逆流対策が要りそう。 (これが書いてあるページはなさそうだった。)
    • → ダミー電池の端子の手前にダイオードを入れれば回避できそうな気がする。
  • スマフォを使用中は、絶対にダミー電池の電源を落とせない。つまり、普通のスマフォらしい使い方は全くできなくて、かなり不便になりそう。 (これが書いてあるページもなかった気がする。)
    • → ACアダプタと一体になったモバイルバッテリー(例: Anker PowerCore Fusion)を使えば、結構「普通」に使えそうだと思った。ただ、何か落とし穴がありそうだ。
  • Nexus 4の場合、電流と使用時間から電池残量を計算しているようで、長時間使うと電池が「空」になったとみなされて落ちてしまう。(上記の海外の方のページを参照)
    • → 電池だけでなく、外部電源も接続して、スマフォは電池を充電していると思わせて使う必要がある。
      • この場合、電池に使う電源を外部電源(USB)にも繋げば良さそうだが、何か落とし穴がありそうだ。例えば、上記の逆流防止のダイオードが逆効果にならなければいいが・・・

気になることはあるが、上記のように、問題への対処を概ね考え付いたので、ちょっと試してみることにした。

まず、スマフォの電池の端子に接続するため、壊れた電池(廃棄する予定だったが、まだ残っていた)を分解して端子を取り外した。端子は電池とは別の基板に載っていたので、その基板ごと取り外した。基板は結構広い金属箔で電池本体に繋がっており、過電流防止用チップとサーミスタが載っていた。なお、その本物のサーミスタがそのまま使えたので、ダミー電池の温度センサ用抵抗は不要だった。

最初は金属箔に電源(ACアダプタ)を繋げて試したのだが、電流制限用チップが間に入るせいか うまく動かなかったので(実際には、接触が悪くて電流が良く流れなかったからのように思う)、チップを外して+端子の根本に電源を接続した(-端子は金属箔がそのまま使えた)。試してみると、結構大電流が流れるらしく、細い線を使ったり、ワニ口クリップで接続したのでは うまく起動しなかったり、不安定だった。それで、太目の配線を基板や箔に半田付けしたら、何とか安定して起動し始めるようになり、設定やGoogleのログインをしたら、再び、使える状態になった。なお、ダイオードは ない方が動作が安定する感じだったが、1本接続した。

試して分かった大きな問題は、電池から流れる電流が結構大きいようで、普通のUSB電源アダプタ(約1A)では足りなくて(ダイオードを入れなければ大丈夫だった)、使用中に落ちてしまうことがあった。それで2Aのに換えたら落ちなくなった。どうも、スマフォは外部電源(USBは基本的には最大0.5A)だけでは消費電力を賄い切れないようで、メインの電源は電池で、外部電源は主に電池の充電に使っているのではないか。

良く考えると、これはおかしい。というのは、スマフォに添付のACアダプタだって1Aしか出ないが、例えば、電池の容量を2000mAhとし、残量50%の場合に充電が2時間で終わるとすれば、充電に使われているのは平均0.5Aで、その時に本体は残りの0.5Aを使える。充電に1A全部を使うとしても、充電しながら電池から本体の電力を取るという芸当ができるとしても、結局、その分充電電流を減らすことに相当するので、やっぱり、外部電源だけでも消費電力は賄えるのではないか? 負荷が高い時に不足するのかも知れないが。

それを除けば、とりあえず復活できることが分かった。以下に細かい問題などを書く。
  • Nexus 4は背面パネルにWi-Fiのアンテナが付いているようで、裏蓋(背面パネル)を付けないと(Wi-Fi接続はできても)通信がうまくできず、Googleへのログインに失敗した。
  • 意外なことに、Nexus 4の電池周りのフレームは金属で、ケーブルを通す穴が容易に開けられない(当然ながら、ニッパの刃が立たなかった)・・・
    • 今は、無理やりパネルの隙間を通している。
  • なぜか、アプリや細かい設定がリストアされなかった。。。 (Googleにバックアップされているはずだったのだが。スマフォの名前が違うせいだろうか?)
    • 互換電池が動かない時に工場出荷状態に戻してしまったため、再度設定やアプリのインストールをし直す必要がある。
  • システムとしては電源に繋がっていない(電池だけ)と思い込んでいるので、電力を食う作業をする時に電源接続を促されることがある。
  • やはり、使っていると「電池」が減る
    • 対策をしないと数時間で切れるようだ。
    • 設定や開発者モードを探したが、「電池が空でも動き続ける」とか「電池なしで動かす」のような都合のいい設定はなかった。
  • ダイオードは意外に熱くなる。流れる電流が大きいのだろう。
  • Androidが古くてDropboxが非対応・・・ → CX file explorerで繋がった。

あとは、上記のように、ダミー電池用の外部電源をUSBにも繋げて常時「充電状態」にすれば、基本的には「できあがり」なのだが、果たしてうまく行くだろうか? どうも悪い予感がするのだが・・・

(7/26 4:56) 外部電源をNexusのUSBにも繋ぐ前に、どうなるか考えてみた。Nexusはダミー電池を充電しようとするが、ダイオードがあるので、充電電流は流れない。すると、以下のいずれかになるのではないか。

  • 謎の原理で残量が増えてウマーw
    • 例えば、下記の「「満充電」と判断」であろうか。
  • 永遠に電池残量が増えず、いつか落ちる。
  • ただし、空になる前から繋いでおけば、電池からは電流が流れず(負の向き)、かといって充電電流も流れず(正の向き)、増えも減りもしないので、空になることはない?
    • 充放電の仕組み(アルゴリズム)上、いつかは空になる?
    • ずっと充電電流が0だと充放電アルゴリズムが「異常」と判断して、いつか使えなくなる?
    • ずっと充電電流が0だと充放電アルゴリズムが「満充電」と判断して、OK?
  • 充放電回路が壊れて、いつか使えなくなる。

なお、USBをPCなど別の電源に繋ぐ場合に備えて、ダイオードは必要だと思う。逆に、繋いだPCなどが壊れる可能性もあって怖いが、さすがにそうならない回路が入っているのではないか。

それから、(Androidを停止してから)ダミー電池の電源を切ると、次回の起動時に電池が抜かれたと判断し(実際にはスリープ中のシステム制御処理が再起動するので)、残量100%から始まると思われる(→ その後試したら そうなっていた。下のグラフの8時頃以降)。ただ、一旦停めないといけないので連続稼働には効果がない。

(7/26 9:24) 実際に試してみたところ、USB(外部電源)を繋いでいても、アプリ: 3C Battey Managerで見ると電池の状態は「放電中」(設定では「ACで充電しています」)になり、電池残量は減り続けた。上の予想の中では「永遠に電池残量が増えず」や「充放電の仕組み(アルゴリズム)上、いつかは空になる」に近い。消費電流は常に500mAを超えている訳ではない(一時的に超えることはある)から、(アプリの表示が正しいとすれば)USBで足りていない訳ではないはずだが。謎は多い。

(7/26 20:15) その後更に試してみたが、ダミーバッテリーが減るのは解消できなかった。分かったのは、Nexusが意外に電流を食うようで、2Aの電源アダプタでは足らず、別の電源アダプタをUSBに接続したら、電池消費率が最低になったことだ。試しに定期撮影をして電池消費率を測ったところ、2Aの電源アダプタだと約1.7%/hだったが、電源アダプタを2つ使ったら、約1%/hになった。

いくら消費率が低くても最後に停まってしまうのでは意味がないので、この方法は保留にし、いい案が出るまではiPhoneを使うことにした。

 

(7/26 5:29, 7:14 若干加筆; 7/26 9:24, 9:43 外部電源を接続して試した結果を追記、修正, 20:15 追加の試行を追記)

  •  1
  •  1