KING JIM ポメラDM200単体でDropboxによる双方向自動ファイル同期ができるようにしてみた
2018/11/15
価値ある情報をユーザー視点で発信するブログ
2018/11/15
先日取り上げたDebian Linux on KING JIM ポメラDM200。
良質なキーボード、軽さ、たたずまい。
これにLinuxの取り合わせが醸す作業環境としての素晴らしさは、家電店店頭に置いてある状態からはおよそ想像できないでしょう。
分かりやすいメリットの一例として、今回はDropboxによる双方向の自動ファイル同期を取り上げます。
Linuxが動作するようになって以来、Dropboxによる双方向の自動ファイル同期ができないものかと試行錯誤していたのですが、Synchronator.pyというPythonスクリプトがDM200上で使え、それで実現できました。
Synchronator.pyは、本来iOS上で動作するPython開発環境であるPythonista向けに作られたスクリプト。
DropboxのARM Linux版は提供されていない
Dropbox公式もLinuxに対応した版を出してしていますが、対応はx86のみ。
DM200のARMに対応したものは出ていません。Pythonで書かれたインストーラがダウンロードできるため、Pure Pythonの実装なのかと勘違いしますが、このインストーラがプロプラなx86バイナリをダウンロードしてくるようになっています。
Raspberry Pi界隈では恐らくQEMUベースの有料x86バイナリ実行環境を使う習わしとなっているようです。
もくじ
Synchronator.pyは、双方向ファイル同期が可能です。
そのどちらもが可能です。
更新の検知は自動で行なわれ、更新したファイルを指定するなどの手動の操作は不要です。
ただ、同期はSynchronator.pyを起動したときのみに単発で行なわれ、Synchronator.pyがシステムに常駐してファイル更新を常時監視するわけではありません。
同期対象のディレクトリはSynchronator.py実行時の引数で決定されます。
引数省略時の同期対象はホームディレクトリ(/home/dm200/)にあるDocumentsディレクトリになります。
/home/dm200/Documents/
Mac側では、Dropboxディレクトリ内、アプリディレクトリ内のSynchronator用のディレクトリが対になります。
/Users/ユーザー名/Dropbox/アプリ/Synchronator-hitoriblog/
つまり、引数なしでの実行では下記のディレクトリの間で同期が実行されるわけです。
「/home/dm200/Documents/」(DM200)←→「/Users/ユーザー名/Dropbox/アプリ/Synchronator-hitoriblog/」(Mac)
Mac側の同期ディレクトリは、Dropboxで設定したアプリケーション名に依存します。
アプリケーション名は他のユーザーと同じ名前が使えないため、「/Users/ユーザー名/Dropbox/アプリ/Synchronator/」というスッキリしたディレクトリ名は使えません。
同期対象のディレクトリは、ポメラ側から見えるところに指定した方が利便性が高くなります。
筆者の場合はポメラ側から見える「/mnt/vfat」以下に作ったDropboxディレクトリを同期対象に指定しています。
/mnt/vfat/Dropbox/
「/mnt/vfat」とは、SDカードのルートディレクトリに相当します。「/mnt/vfat/Dropbox/」は、ポメラ側からはSDカードに作ったDropboxディレクトリとして見えます。
ポメラ側ではSDカード上に作ったDropboxディレクトリ内にテキストファイルを保存し、頃合いを見てLinuxを起動。
Synchronator.pyを起動して同期を開始すると、ポメラ側で作成したテキストファイルがDropbox上にアップロードされることになります。
まずは必要になるものをダウンロードし、必要なPython用モジュールをインストールします。
sudo apt-get install unzip wget python python-setuptools cron sudo easy_install dropbox bs4 wget https://github.com/markhamilton1/Synchronator/archive/master.zip
先述の通り、Synchronator.pyはポメラ側で作成・更新したファイルをスムーズに同期するためにSDカード上に置くのをおすすめします。
通常は以下の操作でSDカードのVFAT領域がマウントできますが、これだとファイル操作にルート権限が必要。
$ sudo mount /mnt/vfat
SDカードのVFAT領域はデフォルトでは/etc/fstabの記述によってルート権限がないとファイル操作ができない状態でマウントされるため、以下のスクリプトを使い、一般ユーザでもファイル操作ができる状態でSDカードのVFAT領域マウントすることをおすすめします。
筆者は~/.bashrcの最後に追記してログイン時に自動マウントするようにしています。
#!/bin/sh count=`mount | grep /mnt/vfat | wc -l` if [ $count = 0 ]; then echo dm200 | sudo -S mount -t vfat /dev/mmcblk1p1 /mnt/vfat -o rw,sync,dirsync,noatime,utf8,umask=000 >/dev/null 2>&1 fi
筆者はsdという名前で~/bin/に設置し、~/bin/にパスを通して使っています。上記のスクリプトでSDカードのVFAT領域をマウントした後、Synchronator.pyをSDカード上に移動します。
$ unzip master.zip $ cd Synchronator-master/ $ mkdir /mnt/vfat/Dropbox $ mv DropboxSetup.py Synchronator.py /mnt/vfat/Dropbox
Synchronator.pyは動作にトークンが必要です。
DropboxのDeveloper向けWebサイト内にある「My apps」にアクセス。
「Create app」ボタンをクリック。
APIの初期設定では以下のように指定。
遷移した先のページにある「Generated access token」の下の「Generate」ボタンをクリック。
生成したトークンをテキストファイルに保存し、何らかの手段でDM200に送ります。
Synchronator.pyは時刻を見て更新を判断しているため、以下の設定は必須となります。
Synchronator.pyの初回の起動はトークンの適用から始まります。
cd /mnt/vfat/Dropbox python Synchronator.py /mnt/vfat/Dropbox
ここで取得したトークンをプロンプトに渡すのですが、コンソールにコピペする方法が限られていて難しいと思います。
取得したトークンをテキストファイルに保存して、それを/mnt/vfat/Dropbox/token.txtとして保存。例えばトークンの取得、token.txtへの保存、SDカードのDropboxディレクトリに保存するところまでをPC上でやるといいでしょう。
しかる後に次のようにするとコピペいらずで簡単です。
cd /mnt/vfat/Dropbox cat token.txt | python Synchronator.py /mnt/vfat/Dropbox
うまくいっていれば同期が始まるはずです。
以降、以下のようにコマンドを実行すれば同期ができますが、これをいちいち手で打つのは面倒。
cd /mnt/vfat/Dropbox python Synchronator.py /mnt/vfat/Dropbox
~/bin/dbなどとしてシェルスクリプトを置いておくといいでしょうね。
#!/bin/sh cd /mnt/vfat/Dropbox python Synchronator.py /mnt/vfat/Dropbox
iPhoneとのBluetoothテザリングについての設定を解説しました。
Debian Linux on DM200起動時に自動的にBluetoothテザリングするように設定できるので、.bashrcから自動実行するように書いておくとDebian Linux on DM200を起動するだけで同期が完了して便利です。
2018.11.14追記: 現在のバージョンでは、Synchronator.py側で削除したりリネームした場合でも、ちゃんと正常な同期結果が得られるようになっていました。最新が一月前の更新だし、進化しているようですね。
しばらく使ってみて、Synchronator.pyで気になる動作も出てきました。
Synchronator.pyで同期している側で消したファイルやディレクトリが、新規作成のファイルだと勘違いされて復活してしまうこと。
消えてしまう側に倒れた判断にならないのはいいですが、消しても消しても復活してしまいます。
リネームした場合も同様です。この場合は、リネーム前とリネーム後というコピーができてしまうことになります。
消したりリネームしたりする場合は、iPhoneアプリなどの公式クライアント側でしないと、この問題の発生は回避できなさそうです。
公式クライアント側でリネームしたり削除したものについては、Synchronator.py側でもきれいに反映されるため、消す、リネームするを公式クライアントで行なえば運用上問題なさそうです
Dropboxの素晴しさは今さら言うまでもありません。
実際にDM200にSynchronator.pyを設定してみると、デバイス間にトンネルが開通した感覚になって素晴らしい。
DM200がまた使いやすくなりました。