PalmSyncは、UNIXで Palm と双方向シンクロ(HotSync)するための Ruby で書かれたアプリケーションです。
Datebook, Address, Todo, Memo などの標準アプリや、いくつかの PalmWare のコンジットが 用意されているほか、Ruby で自由にコンジットを自作できます。
下の方でいろいろいじる方向で書いてますが、基本的にこれは Ruby で Palm のコンジットを簡単に書けるという、 素晴らしいソフトです。Cakeは作者のにゃすさんをリスペクトしています。
…といった作業を経て使えるようになります。
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
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
でもPalmとシンクロするのにいちいちRDBMSをインストールするのはおおげさ…、 という人に、Ruby 標準の dbm を使った簡易データベースがあったほうがいいかもしれませんね。
結構簡単に書けます。 このへん を参考に、$PalmSync/lib/Database.rb や $PalmSync/lib/mysqldb.rb などを 読んでみるといいかも。
標準のは全レコードメモリに読み込んで処理する方式ですが、 必要な箇所だけ取り出すやり方でもいいと思います。
ということになっています。前者は一つのテーブル内でフラグとして管理しても それほど影響はないかもしれませんが、後者については、 職場と自宅の二つの母艦を行き来する場合、 また更新の衝突時に diff3 によるマージを考えた場合、 やはり必要という気がします。 → HotSync
PC側で新しいレコードを追加したい時は、 空いているIDを適当に探して一時的に格納しておいて、シンクロ時に採番されてから あらためて登録しなおすというトリッキーなことをしなければなりません。
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のクラスについても考えていきたいと思っています。