ひとりぶろぐ

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

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

      2017/08/16

Dropbox sync with dm200 00000

  • 変更履歴:
    • 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がシステムに常駐してファイル更新を常時監視するわけではありません。

そこで、コマンドの定期的な実行が可能なcronをインストールし、cron経由でSynchronator.pyを定期的に実行して、疑似リアルタイム同期を実現させました。

僕の例では1分毎に実行させています。

これでMacでのDropboxの動作に肉薄した動作状況となります。

Synchronator.pyのあるディレクトリに作業用のテキストファイルを置き、それをテキストエディタを使って編集。

テキストエディタの保存コマンドを実行後、しばらくすると同期処理が始まり、Mac側でも受信が始まります。

dropbox-sync-with-dm200-00006

MacでのDropboxの動作と遜色ありません。

僕はSynchronator.pyをSDカード上に置いています。具体的な設置状況は以下の通り。

/mnt/vfat/Dropbox/Synchronator.py

この場合、以下のディレクトリが同期対象となります。

/mnt/vfat/Dropbox/

Mac側では、Dropboxディレクトリ内、アプリディレクトリ内のSynchronator用のディレクトリが対になります。

/Users/ユーザー名/Dropbox/アプリ/Synchronator-hitoriblog/

つまり、下記のディレクトリの間で同期が実行されるわけです。

「/mnt/vfat/Dropbox/」(DM200)←→「/Users/ユーザー名/Dropbox/アプリ/Synchronator-hitoriblog/」(Mac)

dropbox-sync-with-dm200-00007

DM200側の「/mnt/vfat」とは、SDカードのルートディレクトリです。Linux側のみならず、ポメラ側からも見えるディスク領域です。

Mac側の同期ディレクトリは、Dropboxで設定したアプリケーション名に依存します。

アプリケーション名は他のユーザーと同じ名前が使えないため、「/Users/ユーザー名/Dropbox/アプリ/Synchronator/」というスッキリしたディレクトリ名は使えません。

なお、もちろんSynchronator.pyはポメラ側を起動している際に使うことはできません。

ポメラ側ではLinux側と共用できるSDカード上に作ったDropboxディレクトリにテキストファイルを保存し、頃合いを見てLinuxを起動。

WiFiを接続するとほどなくして自動的に同期が始まるといった感じになります。

ダウンロード

まずは必要なパッケージをインストールし、Synchronator.pyを入手します。

$ sudo apt-get install unzip wget python python-setuptools cron
$ 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が依存するPythonのdropboxモジュールをインストールします。

$ sudo easy_install dropbox

2017/07/27現在ではdropbox 8.0.0がインストールされます。

アプリの作成とトークンの取得

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の初回の起動はトークンの適用から始まります。

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

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

dropbox-sync-with-dm200-00005

取得したトークンをテキストファイルに保存して、それを/mnt/vfat/Dropbox/token.txtとして保存。しかる後に次のようにするとコピペいらずで簡単です。

cd /mnt/vfat/Dropbox
cat token.txt | ./Synchronator.py

うまくいっていれば同期が始まるはずです。

cronの設定

続いてcronを設定します。

Synchronator.pyが複数同時に起動してしまわないよう、既に起動中の場合は起動を抑止する排他処理を行なうシェルスクリプトを間に入れました。

また、Synchronator.pyは同期対象のディレクトリがカレントディレクトリになっていないと動作しないので、cron.shでは実行前にcdでカレントディレクトリを移動しています。

#!/bin/bash

# cat /proc/net/wireless

count=`grep 'OPER_STATE=routable' /var/run/systemd/netif/state | wc -l`
if [ $count == "0" ]; then
    exit
fi

if [ ! $(pgrep -fo "Synchronator.py") == "" ]; then
    exit
fi

cd /mnt/vfat/Dropbox
/mnt/vfat/Dropbox/Synchronator.py >/dev/null 2>&1 &

ついでに、WiFi未接続時にも同期処理が走らないようにもしてあります。

これにcron.shという名前を付けてSynchronator.pyと同じディレクトリに設置しました。

つまり、/mnt/vfat/Dropboxに、

  • Synchronator.py
  • DropboxSetup.py
  • cron.sh

の三つがあることになります。

crontabの設定。

$ crontab -e

1分毎の実行を指定。

*/1 * * * * user if [ "$$" = "`pgrep -fo cron.sh`" ]; then  /mnt/vfat/Dropbox/cron.sh; fi

デスクトップ通知の設定

ここに同期終了時にデスクトップ通知を表示するSynchronator.pyの改造版を後で載せるかもしれません。

想定外の動作について

しばらく使ってみて、Synchronator.pyで気になる動作も出てきました。

大きくは、Synchronator.pyで同期している側で消したファイルやディレクトリが、新規作成のファイルだと勘違いされて復活してしまうこと。

消えてしまう側に倒れた判断にならないのはいいですが、消しても消しても復活してしまいます。

リネームした場合も同様です。この場合は、リネーム前とリネーム後というコピーができてしまうことになります。

消したりリネームしたりする場合は、iPhoneアプリなどの公式クライアント側でしないと、この問題の発生は回避できなさそうです。

公式クライアント側でリネームしたり削除したものについては、Synchronator.py側でもきれいに反映されるため、消す、リネームするを公式クライアントで行なえば運用上問題なさそうです

Dropboxの双方向自動ファイル同期があると素晴しい

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

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

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

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

 - DM200, ガジェット

dropbox_sale_banner evernote_sale_banner_03