ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

KING JIM ポメラDM200単体でDropboxによる双方向自動ファイル同期ができるようにしてみた

      2018/11/15

Dropbox sync with dm200 00000

  • 変更履歴:
    • 2018/11/14: Synchronator.pyのアップデートで仕様が変わったので解説を修正
    • 2017/08/16: 多重起動防止を目的とした、cron.shと、crontabの登録内容を修正
    • 2017/08/14: cron.shの多重起動防止処理を強化

先日取り上げた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をDM200で使うとどんな感じ?

Synchronator.pyは、双方向ファイル同期が可能です。

  • DM200で更新したものをサーバ側へ反映すること
  • サーバ側で更新されたものをDM200側に反映すること

そのどちらもが可能です。

dropbox-sync-with-dm200-00005-1

更新の検知は自動で行なわれ、更新したファイルを指定するなどの手動の操作は不要です。

ただ、同期は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)

dropbox-sync-with-dm200-00007

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」ボタンをクリック。

Dropbox sync with dm200 00001

APIの初期設定では以下のように指定。

  1. Dropbox APIを選択
  2. App folderを選択
  3. 名前を決定。何でもいいが、他のユーザーとかぶる名前は指定できない。この名前でDropboxのアプリディレクトリ内に同期用のディレクトリが作られる
  4. 「Create app」ボタンをクリック

Dropbox sync with dm200 00002

遷移した先のページにある「Generated access token」の下の「Generate」ボタンをクリック。

Dropbox sync with dm200 00003

生成したトークンをテキストファイルに保存し、何らかの手段でDM200に送ります。

Dropbox sync with dm200 00004

時刻に関する重要な設定

Synchronator.pyは時刻を見て更新を判断しているため、以下の設定は必須となります。

初回の起動

Synchronator.pyの初回の起動はトークンの適用から始まります。

cd /mnt/vfat/Dropbox
python Synchronator.py /mnt/vfat/Dropbox

ここで取得したトークンをプロンプトに渡すのですが、コンソールにコピペする方法が限られていて難しいと思います。

dropbox-sync-with-dm200-00005

取得したトークンをテキストファイルに保存して、それを/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の双方向自動ファイル同期があると素晴しい

Dropboxの素晴しさは今さら言うまでもありません。

実際にDM200にSynchronator.pyを設定してみると、デバイス間にトンネルが開通した感覚になって素晴らしい。

DM200がまた使いやすくなりました。

キングジム デジタルメモ ポメラ DM200ブラック
キングジム(KINGJIM)
売り上げランキング: 1,344

 - DM200, ガジェット