Home | Index | Changes | Diaries

Palm Sync

PalmSyncは、UNIXで Palm と双方向シンクロ(HotSync)するための Ruby で書かれたアプリケーションです。

Datebook, Address, Todo, Memo などの標準アプリや、いくつかの PalmWare のコンジットが 用意されているほか、Ruby で自由にコンジットを自作できます。

下の方でいろいろいじる方向で書いてますが、基本的にこれは Ruby で Palm のコンジットを簡単に書けるという、 素晴らしいソフトです。Cakeは作者のにゃすさんをリスペクトしています。

インストール

大雑把に書くと、

  1. 先に pilot-link をインストール
  2. PalmSync の配布ファイルをもらって来て
  3. Ruby拡張ライブラリをコンパイル
  4. DBMSのインストール(標準ではMySQL)
  5. DBMSの準備(データベースやテーブルの作成、ユーザーの設定など)
  6. シンクロ用スクリプトのカスタマイズ

…といった作業を経て使えるようになります。

FreeBSD 4.4-RELEASE で PalmSync ver 1.9 をコンパイル

インストールと動作確認ができました。 extconf.rbで生成されるMakefileを下記のよーに修正して make&&make install


thinkpad:~/palm/src/palmsync1.9/lib $ ruby extconf.rb

checking for dlp_OpenConduit() in -lpisock... no

checking for /usr/local/pilot/include/pi-socket.h... yes

checking for main() in -l/usr/local/pilot/lib/libpisock.a... no

creating Makefile

thinkpad:~/palm/src/palmsync1.9/lib $ diff -u Makefile Makefile.FreeBSD

--- Makefile    Tue Jan  1 23:06:52 2002

+++ Makefile.FreeBSD    Tue Jan  1 03:06:18 2002

@@ -9,10 +9,10 @@



 CC = cc



-CFLAGS   = -fPIC -O -pipe  -fPIC /usr/local/pilot/include

+CFLAGS   = -fPIC -O -pipe  -I/usr/local/pilot/include

 CPPFLAGS = -I$(hdrdir) -I$(srcdir) -I$(prefix)/include -DHAVE__USR_LOCAL_PILOT_INCLUDE_PI_SOCKET_H

 CXXFLAGS = $(CFLAGS)

-DLDFLAGS = -Wl,-soname,$(.TARGET) -L$(exec_prefix)/lib

+#DLDFLAGS = -Wl,-soname,$(.TARGET)

 LDSHARED = cc -shared

 LIBPATH =



@@ -33,8 +33,8 @@



 #### End of system configuration section. ####



 LOCAL_LIBS =

-LIBS = -L. -l$(RUBY_INSTALL_NAME) -lc

+LIBS = -L. -lc -lpisock -L/usr/local/pilot/lib

 OBJS = palm0.o palmapp.o palmfile.o palmutil.o



 TARGET = palm

@@ -70,7 +70,7 @@





 .c.o:

-       $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<

+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $<



 .cc.o:

        $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<

こんな感じ。 FreeBSDが特殊なんでしょうか?

使う

メモデータベースを Ruby でなめるスクリプト。

にゃすさんのドキュメント(PalmSync/README.sjis)にちょっとだけ加筆。


#!/usr/local/bin/ruby



require "lib/palm"



pa=PalmPilot.new("/dev/pilot")

db=pa.openDB("MemoDB", PALMDB_READ | PALMDB_WRITE | PALMDB_SHOWSECRET)



for rec in db

  print rec.contents

end



pa.closeDB(db)

pa.close

カスタマイズ

MySQLをEUCで使う

データベースにMySQLを使うようになっていますが、日本語文字列のコードがPalmのままShift-JISです。 僕はEUCで使いたいので、このようなクラスを作ってみました。


require 'mysqldb'

require 'kconv'



class EucMysqlDB < MysqlDB

  def strEscape(s)

    quoting(Mysql.quote(Kconv.toeuc(s)))

  end



  def strUnEscape(s)

    Kconv.tosjis(s) if s

  end

end

MySQL以外のデータベースを使うには。

♯最近結構MySQLのことを気に入って来たので、当分乗り換える気は起きないでしょう。

でもPalmとシンクロするのにいちいちRDBMSをインストールするのはおおげさ…、 という人に、Ruby 標準の dbm を使った簡易データベースがあったほうがいいかもしれませんね。

結構簡単に書けます。 このへん を参考に、$PalmSync/lib/Database.rb や $PalmSync/lib/mysqldb.rb などを 読んでみるといいかも。

標準のは全レコードメモリに読み込んで処理する方式ですが、 必要な箇所だけ取り出すやり方でもいいと思います。

新しいデータベースの設計

PalmSync1.9のPC側データベースの設計について気がついたこと。

アーカイブ用、バックアップ用のテーブルがない

O'RELLYの「Palmプログラミング」を読むと、PC側のデータベースは、

ということになっています。前者は一つのテーブル内でフラグとして管理しても それほど影響はないかもしれませんが、後者については、 職場と自宅の二つの母艦を行き来する場合、 また更新の衝突時に diff3 によるマージを考えた場合、 やはり必要という気がします。 → HotSync

Palm内のレコードIDをそのままプライマリキーとしている

これはPalm側に登録するまでIDが分からないという点が困ります。

PC側で新しいレコードを追加したい時は、 空いているIDを適当に探して一時的に格納しておいて、シンクロ時に採番されてから あらためて登録しなおすというトリッキーなことをしなければなりません。

テーブルの検討

PalmWiki(Memo)のデータを格納するためのテーブルについて、 ちょっと考えてみました。

create table PalmWiki (

   pcid         INTEGER UNSIGNED not null AUTO_INCREMENT,

   lastmod      TIMESTAMP,

   palmid       INTEGER UNSIGNED not null default 0,

   category     INTEGER not null default 0,

   attr         INTEGER not null default 0,

   PRIMARY KEY  (pcid),

   INDEX        (palmid),



   Memo         TEXT,



   updateflag   INTEGER not null default 1

 );



create table PalmWikiBKUP (

   pcid         INTEGER UNSIGNED not null AUTO_INCREMENT,

   lastmod      TIMESTAMP,

   palmid       INTEGER UNSIGNED not null default 0,

   category     INTEGER not null default 0,

   attr         INTEGER not null default 0,

   PRIMARY KEY  (pcid),

   INDEX        (palmid),



   Memo         TEXT,



   updateflag   INTEGER not null default 1

 );



create table PalmWikiARCH (

   pcid         INTEGER UNSIGNED not null AUTO_INCREMENT,

   lastmod      TIMESTAMP,

   palmid       INTEGER UNSIGNED not null default 0,

   category     INTEGER not null default 0,

   attr         INTEGER not null default 0,

   PRIMARY KEY  (pcid),

   INDEX        (palmid),



   Memo         TEXT,



   updateflag   INTEGER not null default 1

 );

あとこの他に、コンジットやDBのクラスについても考えていきたいと思っています。