« February 2007 | Main | May 2007 »

2007.03.29

[Zaurus] Exif Jpegヘッダー/サムネイル操作プログラムjhead Version 2.7のZaurus向けパッケージ

Exif Jpegヘッダー/サムネイル操作プログラムであるところのjhead 2.7のLinux Zaurus向けパッケージを作りました。

exiftags、Exiv2の類いのものです。Exif等のメタデータ好きなもので……。

以前パッケージを作ったexiftagsと違ってExifの操作ができます。
サムネイルの抽出、置換、生成ができたりと高機能です。
普通のJpegにExifを新しく埋め込んだりできます。
あるJpeg画像に埋め込まれたExifをほかのJpeg画像に移したりできます。
Exifの削除ができます。

「jhead_2.7-1_arm.ipk.bin」をダウンロード

使い方一例

Exifタグを標準出力に表示

$ jhead dscf0001.jpg

File name : dscf0001.jpg
File size : 789239 bytes
File date : 2007:03:29 18:31:04
Camera make : FUJIFILM
Camera model : FinePix40i
Date/Time : 2001:12:31 14:24:56
Resolution : 2400 x 1800
Flash used : No
Focal length : 8.7mm (35mm equivalent: 31mm)
CCD width : 10.08mm
Exposure time: 0.015 s (1/69)
Aperture : f/9.8
ISO equiv. : 200
Metering Mode: matrix
Exposure : program (auto)

サムネイルを書き出し

$ jhead -st thumb.jpg dscf0001.jpg

Exifタグによるファイルマッチング(FinePix40iで撮影したファイルをリストアップ)

$ jhead -model 'FinePix40i' *.jpg | sed -e '/File name \+: /s///p;d'

関連するエントリは以下です。jheadと併用が前提になっているjpegtranを含むパッケージがあります。
jpegtranは無劣化で画像の回転ができたりして便利ですが、Exifに対応しておらず、これで加工するとExifタグが落ちてしまいます。しかし、jheadの「-cmd」オプションを使うと、jheadが事前にExifタグを退避し、加工後のファイルにExifタグを再び埋め込んでくれます。「-cmd」オプションの引数にjpegtranのコマンドラインを書けば、Exifタグ対応のjpegtranの出来上がりです。jpegtranにとどまらず、汎用に使うことができるのでとても便利ですね。しかも、ワイルドカードが使えるのでシェルスクリプトの「for in」ループ要らずです。

jpegtran(JPEG加工ツール)
cjpeg(JPEGエンコーダ)
djpeg(JPEGデコーダ)
wrjpgcom(JPEGコメントライター)
rdjpgcom(JPEGコメントリーダ)

JPEG加工ユーティリティ集jpeg-progs 6bのZaurus向けパッケージ

高速JPEG縮小ライブラリEpeg 0.9.0とコマンドepegfe 0.0.1、EXIF情報表示exiftags 1.00のZaurus向けパッケージ

2007.03.28

[Mac OS X] Mac OS X用2画面ファイラーXfind

Interfaceの5月号に付録のV850基板が気になって調べていたところ、Mac OS X用2画面ファイラーであるところの「Xfind」を「なんでも作っちゃう、かも。」さんで発見。

X68k育ちの自分としては、ファイル操作は2画面ファイラーに限ると思っているんですが、なかなかMac OS X上にそういったものを求める声が聞かれないので、いつしかそういうものを求めていること自体忘れていました。

PDA好きならhp 200LX用のX-Finderを想起することでしょう。
名前は似ていても、目指すところがちょうど逆のような関係で面白いですね。

hp 200LX用X-Finder→200LXにもMacOSのFinderのような環境を!!
Mac OS X用Xfind→Mac OS Xにも(Human68k/MS-DOS由来の)ファイラー文化を!!

2007.03.22

[Emacs] Emacsでココログ(Emacsでブログ) mapae環境を作る (Mac OS X / Windows XP)

長年特に疑問を持たずにココログのWebインターフェイスを使って更新してきましたが、どうもココログのWebインターフェイスを使ってエントリするのはもっさい感じで、実際重くて嫌な感じです。

Yet Anotherな手段を開拓した人が居るに違いありません。

そのような確信の元に「emacs ココログ」でググって出てきたEmacs用のMovable Type:: Emacs フロントエンドである「mapae」を使ってみました。

要するにEmacsからココログの読み書きをしようというわけです。

正直な話、2ちゃんねるブラウザよろしく、出来あいのブログサービスというものをWebブラウザ以外のアプリケーションを使って更新できるということを知りませんでした。
XML-RPCというプロトコルがあり、ココログもまたそれに対応しているのですね。

案外簡単にできたので、二次情報としてレポートしておこうと思います。

使ってみた感じ、とても快適で気に入りました。
Emacsからシームレスにココログへエントリできるので、とっても楽。

また一つEmacs上のマストなアプリケーションが増えました。

あまりにも快適なので、Windows XPマシン、Mac OS Xマシン両方にインストールしてしまいました。

Windows XPでのインストール作業

Windows XPへのインストールは簡単です。

Meadow3をインストールします。
今はNetinstallが整備されているのでインストーラ一発で簡単です。
僕は「d:\Meadow」にインストールしました。

ActivePerlをインストールします。僕は「c:\Perl」にインストールしました。インストーラで簡単にインストールできます。

mapaeのサイトに行ってmapaeをダウンロードしてきます。現在の最新版は「Ver.0.11 20051017」です。

解凍して出てくるmapae.plとmapae.phは、僕は「d:\Meadow\bin\」に置きました。
mapae.elは、適当なload-pathが通ったディレクトリに置きます。僕は「d:\Meadow\site-lisp\」に置きました。

.emacs.elに以下を追加します。パスは上記の僕の環境にならったものになっています。

(require 'mapae)

(setq mapae-perl-command "c:/Perl/bin/perl")
(setq mapae-command "d:/Meadow/bin/mapae.pl")
(global-set-key "\C-cwn" 'mapae-new-post)
(global-set-key "\C-cwr" 'mapae-get-recent-post)
(global-set-key "\C-cwg" 'mapae-get-post)
(global-set-key "\C-cwl" 'mapae-get-recent-titles)

mapae.phを書き換えます。詳細はオフィシャルサイトを参照してください。
最低限書き換える必要があるのは以下の4行だけです。簡単です。
ココログのベーシックなのでこのような設定になってます。

$RPCSERVER = 'http://app.cocolog-nifty.com/t/api';
$BLOGID = 99999;
$USERNAME = 'ログイン時に入力しているユーザーネーム';
$PASSWORD = 'ログイン時に入力しているパスワード';

BLOGIDは、ココログの管理画面のcgiの引数に付いている「https://app.cocolog-nifty.com/t/app/weblog/manage?blog_id=99999」の9999の部分の数字です。

cmd.exeを起動して、

perl d:\meadow\bin\mapae.pl getRecentPost

を実行して最新のエントリが表示されたらOKです。

インストールは以上です。

Mac OS X (Panther / Tiger)でのインストール作業

Mac OS Xへのインストールはちょい面倒です。

Xcodeをインストールしておくのが大前提です。

XcodeはApple Developer Connectionからダウンロードできますが、無料の会員登録が必要です。
古くてよければMac OS XのインストールCDに入ってますが。

Expatをインストールします。
tarballをもらってきて、適当なディレクトリで解凍、make installします。

$ tar xvzf expat-2.0.0.tar.gz
$ cd expat-2.0.0
$ ./configure; make
$ sudo make install

CPANでLWP、MIME::Parser、XMLRPC::Liteをインストールします。
途中でいろいろ聞かれますが、全部Enterで済みました。

$ sudo perl -MCPAN -e shell
$ cpan> install LWP
$ cpan> install MIME::Parser
$ cpan> install XMLRPC::Lite
$ bye

CarbonEmacsをインストールします。
銭谷さんによりパッケージが整備されているので/Applicationsにコピーするだけです。銭谷さんってNASAの人なんですね。スゴイ。

Pantherの場合は、Saikiさんのサイトからパッケージがダウンロードできます。

mapae.pl、mapae.phは、パスを通した~/binに置きました。
mapae.elは、以下のように.emacs.elに追記し、load-pathを通した~/elispに置きました。

(setq load-path (append '("~/elisp") load-path))

Pantherの場合はPerlのパスは「/usr/local/bin/perl」なので、mapae.plのシェバング行を書き変えます。
Tigerの場合は「/usr/bin/perl」なのでそのままでOKでした。

mapae.phの書き換え内容、.emacs.elへの追記内容はパスこそ違えどWindows XPの解説と同じです。

ターミナルで以下を実行して最新のエントリが表示されたらOKです。

mapae.pl getRecentPost

インストールは以上です。

mapaeの使い方

C-cwlで最新のエントリ15本のサブジェクトを取得します。
M-x mapae-modeみたいなものは必要無く、いきなりC-cwlします。

取得したサブジェクトのうち、編集したいエントリ名の行にカーソルを合わせてfでエントリの編集ができます。
dired-modeみたいな感じですね。

C-cwsで編集結果の保存です。ただし、公開内容は更新されません。

つまり、C-cwsで保存すると、mapaeで編集した内容と、公開内容の間に不一致が生じます。
Webインターフェイスから見てもmapaeで編集した内容になっていますが、公開内容は古いままという状態になるわけです。
ココログのWebインターフェイスを使っていては起こりえない状態なのでとまどうかもしれません。

C-u C-cwsで編集結果を保存しつつ、公開内容も更新します。

新規エントリの登録はC-cwnです。
項目を埋めてC-cwsで編集結果の保存(下書き相当)、C-u C-cwsで編集結果を保存しつつ、公開内容も更新です。

これ以外の機能についてはマニュアルを参考にしてください。

あとがき

これをZaurusで使いたいがためにPerl5.8.7のZaurus用のパッケージを作ったのですが、ZaurusではCPANするのが大変です。
もしZaurusで動かせたら教えてください。

2007.5.9追記

聖アンドレアスの失敗さんでも、エントリ「mapaeというのがあるらしい」でmapaeについての言及が。ココログフリーはapiのurlが違うとのこと。

2007.03.20

[Zaurus] Linux Zaurus向けPerl5.8.7パッケージ(幾霜版)

すいません。しばらく403で落ちていました。理由は恥ずかしくて言えない……。

幾霜さんのところにあるビルド済みPerl5.8.7を入れてみたくなったので、そのまんまパッケージにしてみました。

SDへのインストールが完了することを確認しています。SDにインストールすると、膨大な数のシンボリックリンクを張るので、相当時間がかかります。
画面が真っ白になることもあるかと思いますが、自分のところではその状態を経た後インストール完了することを確認しています。

perl-man_5.8.7-1_arm.ipkは、manが不要なら入れないで大丈夫です。

CPANができるのも確認してますが、これswap入れてもメモリが逼迫してターミナルが吹っ飛びますね。特に初回CPAN時の./cpan/Metadata生成時は必ず吹っ飛びます。ターミナルが吹っ飛んでも作業を続行していたので、放置していたら終わりました。「init 2;chvt 1」して生コンソールに落ちてからやった方がいいのかもしれません。はけさんの日記「Qtopiaを抜けて」経由で知りましたが、Qt上だと、swapをONにしていても勝手に終了させられてしまうそうで。
CPANするには、少なくともGNU Makeが必要です。

「perl-bin_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-lib1_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-lib2_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-lib3_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-lib4_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-lib5_5.8.7-1_arm.ipk.bin」をダウンロード

「perl-man_5.8.7-1_arm.ipk.bin」をダウンロード

2007.03.14

[Windows XP] Windows XPでもサスペンド/ハイバネーションから定期的にレジュームして(起きて)QMAIL3で自動メール送受信

Windows XP搭載のノートパソコンでも、サスペンドやハイバネーションから定期的にレジュームして、メールチェックなどしてくれたらとてもいいだろうな、ということでチャレンジしてみました。

結果、実現できたのでレポートしておきます。

僕のブログの中では、このエントリは大きな流れの中の一つになっています。関係するエントリは以下の通りです。

ZaurusでCronInetとMewによるメールの定期巡回
Windows Mobile QMAIL3でサスペンドから起きて自動定期巡回(メール送受信)
[Windows Mobile] Sigmarion III / jornada720でMortScriptを動かす

カバンの中のサスペンド(ハイバネーション)させたノートパソコンが、定期的に動き出して最新のメールを自動的に受け取ってくれるのです。ノートパソコンを開くと、移動中に受信したメールが出迎えてくれます。素晴らしきモバイル体験。

Windows XPでもsnak氏の超高性能男前メールソフト、QMAIL3を使った解説をしたいと思います。長い年月を経過してなお止まぬ氏の情熱には感服します。

もちろん、QMAIL3に限らず何でも可能でしょう。Meadow上のMewだってgnuclientを使えばいけると思います。

ただ、起動中でもコマンドラインオプションから送受信開始させることができ、ダイヤルアップ、切断を勝手にやってくれるQMAIL3は、このテーマにうってつけなのです。

ハイバネーション(休止状態)の抑制

僕のVAIO U3は、ハイバネーションからでもゾンビのように起き上がってタスクの実行が可能です。すべての機種がそうなら幸せなことですが、僕が知るノートパソコンには限りがあります。

ハイバネーションからのレジュームができない機種では、ハイバネーション移行の抑制をしないといけないかもしれません。

時間経過等でハイバネーションに移行しないよう、電源管理ユーティリティで設定します。
僕はPC/AT互換機はVAIOのノートしか持っていないので、専用ユーティリティ「Power Panel」の説明になりますが、以下のような設定になります。

Winxpqmail30008

アイドル状態で放置されても、ハイバネーション(休止状態)への移行はせず、サスペンドへの移行だけするようにします。

このユーティリティには、バッテリ残量がヤバいときだけハイバネーションへの移行をするという、誠に都合のいい設定項目があります。それだけは設定しておきました。

各社それぞれに独自のユーティリティが添付されているはずなので、それぞれのツールの作りに解釈してください。

もちろん、ハイバネーションへの移行をやめるということは、バッテリの消費が多くなる、ということを意味します。

「タスク」を使う

Windows XPではこのようなことを実現する場合、「スタートメニュー→すべてのプログラム→アクセサリ→システム ツール」とたどって出てくる「タスク」を使います。

Winxpqmail30007

タスクは定形処理を一定時間間隔を置いて繰り返させるのに使う一種のランチャです。タイマー付ランチャ。
UNIX環境には似たような働きをするcron(at?)というdaemonがありますね。

タスクを使いさえすればサスペンド/ハイバネーションからレジュームして(起きて)何かする、ということはできてしまいます。従って、そのことを指摘しつつ説明を終ってもいいのですが、タスクは細かい設定ができていい半面、高機能ゆえにちょっと分かりにくいかもしれません。
また、いくつか引っかかるポイントがあります。そこをかいくぐる説明をします。

QMAIL3でサスペンドから起きて自動巡回する設定例

「QMAIL3で30分に1回サスペンドからレジュームして(起きて)巡回し、巡回が終わったら再度サスペンドする」という内容の設定を例示してみます。

QMAIL3の設定

巡回名は、最初は英字のみのものを付けてください。

設定の要諦は、「巡回」を作ること。「アカウント」の「ダイヤルアップ」タブの「ネットワークに接続していないときにダイヤルアップ接続する」のラジオボタンを選択して、有効なダイヤルアップのエントリ名を選んでおくことです。

Winxpqmail30006

実行用VBScriptの用意

QMAIL3は、コマンドライン引数「-g "巡回名"」で巡回開始が可能です。
また、最新のNightly Buildでは、「-g」のみを引数として付けることで、すべてのアカウントの送受信をすることができるようになっています。
詳しくはQMAIL3の「コマンドライン」を参照してください。

QMAIL3が起動していない場合は、起動しつつ巡回を開始します。
既にQMAIL3が起動していた場合は、起動中のQMAIL3が巡回を開始します。

しかし、タスクに実行させるのは、QMAIL3そのものではまずいのです。
なぜなら、タスクは、実行したアプリケーションが終了するのを待ち続けるからです。
タスクに直接QMAIL3を実行させると、毎度QMAIL3を終了させなくてはならないことになってしまいます。

アプリケーションの終了を待たず、自身はすぐ終了する実行手段を探す必要があります。

一番身近なのは、cmd.exeの内部コマンドであるstartです。
startはShellに実行を委任した後、コマンド/アプリケーションの終了を待たずに自身は終了します。
startを使う場合、タスクへの登録は以下のようになります。

cmd.exe /c start c:\bin\q3u\q3u.exe "-g 'COURSE_NAME'"

これで基本的に問題無いのですが、cmd.exeの黒いウインドウがチラっと表示されるので格好悪い。

オンラインソフトを探せば同じ働きをするコマンドを見つけることができますが、ここはWSHのRun()を使うことにします。
Runは第3引数にfalseを指定すると、実行したアプリケーションの終了を待たなくなります。

実行時にPHSカードが差さっていなかったり、ネットワークに接続されていなかった場合に実行を抑制した方がきれいなので、処理を加えたVBScriptを用意しました。それが以下です。

「qmail3.vbs」をダウンロード

あちこちからもらってきたスクリプトのハリボテです。WMIとか言われてもよく分かりません。
QMAIL3のパスや巡回名は仮のものですので、自分の環境に合わせてテキストエディタで書き換えてください。

これをタスクに登録して、定期的に実行することになります。

スクリプトのタスクへの登録

タスクを起動し、タスクを新規登録します。僕はウィザードがうざいので「ファイル→新規→タスク」から作りました。

Winxpqmail30001

「QMAIL3」などの名前に変えて、プロパティを開きます。

Winxpqmail30002

タスクの新規登録ダイアログには、「タスク」、「スケジュール」、「設定」の三つのタブがあります。

まずは「タスク」から片付けます。

「実行するファイル名」には、前出のVBScriptを指定します。
「ログオンしている場合のみ実行する」、「実行する」のチェックボックスをONにします。

Winxpqmail30003

続いて「スケジュール」のタブ。
「タスクのスケジュール」は「日単位」、「開始時刻」は「9:00」、「タスクのスケジュール(日単位)」の「間隔」は「1」にします。
これで、毎日1日1回9:00からタスクが開始されます。
もちろん、これだけでは1日1回9時から実行されるだけなので不十分です。

Winxpqmail30004

「詳細設定」ボタンを押します。
「開始日」は過去の日付を。「終了日」のチェックボックスはOFFに。
「タスクを繰り返し実行」のチェックボックスをONに。
「間隔」は「30分」にします。
「継続時間」のラジオボタンをONにし、「24」時間を指定します。

Winxpqmail30009

最後に「設定」のタブ。
「タスクの継続時間を指定する」のチェックボックスをONにし、「1分」を指定します。
「アイドル時」のグループ内は全部OFFにします。

「電源の管理」グループ内では、「タスクの実行時にスリープを解除する」のチェックボックスのみONにします。

Winxpqmail30005

OKボタンを押して、登録を完了します。
登録したタスクを右クリックして、「タスクの実行」を選択すると、登録したタスクのテストができます。

これでタスクが正常に動作するか確認してください。

一時的に「間隔」を5分程度の短いものにして、テストのためにサスペンドし、実際にサスペンドから起き出して動作するか確認してみてください。

ハイバネーションからも起き出してタスクの実行ができたらもうけものです。

プラスアルファの情報

ダイヤルアップ、ダイヤルアップの切断機能を持たないアプリケーションの定期巡回を仕込む際、特に恣意的にダイヤルアップを切断する方法を探すことになるかもしれません。

Windows XPではコマンドラインからダイヤルアップのコントロールができるようになっていますので紹介します。

■ダイヤルアップの状況表示

rasdial

■ダイヤルアップ

rasdial DIAL_UP_NAME USER_NAME PASSWORD

■切断

rasdial DIAL_UP_NAME /D

DIAL_UP_NAMEは、実際には設定済みのエントリ名です。
USER_NAMEは、実際にはそのエントリに登録しているユーザ名です。改めて指定する必要があります。
PASSWORDは、実際にはそのユーザに呼応するパスワードです。平文で、改めて書く必要があります。

サスペンド、ハイバネーションへの移行を急ぎたい場合は、MSのsuspend.exeを使います。いまどきはACPIでしょうから、suspend -s 3(サスペンド)、suspend -s 4(ハイバネーション)といった感じで使うことになります。

あとがき

タスクでこんなことができることをもっと早く知っていれば、モバイルライフが充実したものになっていたでしょう。
みなさんも、QMAIL3にとどまらず、いろんなアプリケーション、スクリプトのサスペンド/ハイバネーションから起きての定期実行を試してみてください。

2007.03.12

[Zaurus] SKK用辞書サーバskkserv2 20051107パッケージ

そういえば、Linux Zaurus向けのskkserv2のバイナリパッケージが無いようなので置いておきます。

gcc2.95ではコンパイルできなかったので、gcc3.3でコンパイルしました。

ダウンロード

skkserv2のほか、libgcc3.4.4、libstdc++.so.5が必要です。

「skkserv2_20051107_arm.ipk.bin」をダウンロード

「libgcc_3.4.4-1_arm.ipk.bin」をダウンロード」

「libstdc5_3.4.4_arm.ipk.bin」をダウンロード

「libstdc5_3.4.4_arm.ipk.bin」は、「libstdc++5_3.4.4_arm.ipk.bin」というファイルなんですけどねぇ。アップロード時に名前が変わってしまいます。

別途SKK辞書が必要です。FocVさんのところにパッケージがあります。
FocVさんのパッケージを入れると、辞書は以下のパスに入ったと思います。

/opt/QtPalmtop/share/skk/SKK-JISYO.L

インストール

skkserv2に用がある人に説明不要でしょう。

「/opt/QtPalmtop/bin/skkserv2」として入ります。

僕は、

skkserv2 -p 1179 /mnt/card/SKK-JISYO.L &

などとして実行してます。

skkserv2 -d -p 1179 /mnt/card/SKK-JISYO.L &

といったように -d を付けるとデバッグメッセージが表示されるので、動作を確認しやすいです。
skkserv2にSKKからアクセスがあると、都度表示されます。

.emacs.elの記述は以下。下二つはいらないと思いますが。

(require 'skk-setup)
(setq skk-server-host "localhost")
(setq skk-server-portnum 1179)
(setq skk-server-prog "/opt/QtPalmtop/bin/skkserv2")
(setq skk-server-jisyo "/mnt/card/SKK-JISYO.L")

結構メモリを食うようなので、swapが必要かもしれません。

2007.03.11

[Zaurus] Rubyを使って現在位置の地図を一発表示 RQPosition.rb

2007.5.30追記

ほかの環境だと動かないみたいですね。ご迷惑おかけします。
僕の環境は、SL-C3200 + AH-S405Cです。端末が違うとダメなんでしょうかね。
協力していただける方がいらしたら、端末からの出力のログを取るスクリプトを置こうかと思います。
「ざうもに」は多くの端末に対応できているようなので、あれを参考にするといいのかな。
でも、ざうもにはC言語なんだよなー。

結局、KeyHepler Appletからrequireを通す方法が分からないので、そのうちRuby/QteでGUI付けようかと思ってます。

本題

RQPosition.rbというLinux Zaurus用Rubyスクリプトを作ったので置いておきます。

本スクリプトはPHSから位置情報を取得して、それを元にマピオンで現在位置の地図表示をします。
ブラウザはNetFrontを使用していますが、Operaでも大丈夫なんではないでしょうか。

特徴は、実行一発で地図表示することです。

いちいちダイヤルアップしたり切断したりをしなくていいようになっています。

また、Rubyスクリプトなので、容易に変更が可能です。

GUIはありません。KeyHelper Appletに登録して実行……してほしいところですが、うまくいっていません。こちらのエントリをどうぞ「[Zaurus] RubyとKeyHelper Appletで質問」。

免責

責任取りません。

ダウンロード

「rqposition.rb_2007.03.10_arm.ipk.bin」をダウンロード

使い方

rqposition.rb DialUp.conf

などといった感じで、ダイヤルアップのコンフィグファイル名を引数に与えます。
コンフィグファイルは以下のパスにあります。ここを調査して、適当なコンフィグファイルを指定します。

"/home/zaurus/Applications/Network/modules/"

-rw-r--r-- 1 zaurus qpe 838 Oct 1 20:08 DialUp.conf
-rw-r--r-- 1 zaurus qpe 838 Oct 1 20:02 DialUp0.conf

上記パスは内部処理で足しますので、ファイル名だけ指定すればOKです。

KeyHelper Appletへの登録は現状うまくいかなくとも、Shell Scriptから呼び出したり、aliasに登録するなどは可能です。

インストール

上のリンクからダウンロードしたパッケージをインストールします。

Rubyとruby-serialport、libgcc3.4.4が必要です。

「ruby-serialport_0.6_arm.ipk.bin」をダウンロード」

「libgcc_3.4.4-1_arm.ipk.bin」をダウンロード」

ruby-serialportのパッケージはFocVさん版のRubyパッケージのディレクトリ構成を前提としているので、RubyはFocVさんのものを使うと不便が無いかと思います。

KeyHelper Appletへの登録

これできないと意味無いですよね……。

注意点

処理中に電源を切るとstopして確実におかしくなるので、処理中は電源を切らないでください! それでも切った勇敢なあなたは、WhatsUpOnZ、kill等で当スクリプトをkillしてください。

これに対処すべくTrapでSIGSTOPを捕捉しようとしましたが、スペカ入れているせいか捕捉できないorz...。同時に監視スクリプトを起動してstopしてたらkillって感じですかね? それともスレッド化でしのげるものなのだろうか。

活用

パッケージをインストールすると、/opt/QtPalmtop/bin/rqposition.rbにスクリプトが入ります。
これを適当な場所にコピーして、編集するといいんではないでしょうか。

主処理はPhsという名前のモジュールに分割しているので、そのメソッドを呼び出すと簡単に使えます。
ただ、低品質だし、モジュールの作法とか分かっていないので、ファイルを分けることはやってません。
あくまでも「俺スクリプト」です。

「Phs.position_info」を呼び出すと返り値で位置情報が取得できます。

LatLon.pc # 郵便番号
LatLon.n1 # N{ココ}.nn.nn Enn.nn.nn
LatLon.n2 # Nnn.{ココ}.nn Enn.nn.nn
LatLon.n3 # Nnn.nn.{ココ} Enn.nn.nn
LatLon.e1 # Nnn.nn.nn E{ココ}.nn.nn
LatLon.e2 # Nnn.nn.nn Enn.{ココ}.nn
LatLon.e3 # Nnn.nn.nn Enn.nn.{ココ}

できなかった場合はfalseが返ります。できなかった場合も空のオブジェクトで返した方がいいんだろうか。
緯度、経度が取得できても郵便番号が取得できないことがあるので、その場合は「0000000」を返すことにしてます。

スクリプトのmain()を抜き出したのが以下です。Phsモジュールのメソッドを呼び出してます。
簡単にカスタマイズが可能なことが分かると思います。
例えば、Yahoo!地図の場合は、「url = 」を以下のようにすればOKです。

url = "http://map.yahoo.co.jp/pl?nl=#{p.n1}.#{p.n2}.#{p.n3}&el=#{p.e1}.#{p.e2}.#{p.e3}"

現在地の郵便番号から住所を検索したい場合は

url = "http://search.post.japanpost.jp/kt/zip/e7.cgi?z=#{p.pc}&xr=1"

でOKです。Operaを使いたい場合は、最後のやつを以下のようにすればOKなはずです。
Operaを使っていないので確認してませんが。

system("qcop QPE/System 'execute(QString,QString)' " +
"opera '#{url}'" )

main()を抜き出したもの

# 位置情報を取得、変数pに代入
p = Phs.position_info

# 位置情報が取得失敗した場合はfalseが返るので
# 事前処理が必要
if(p == false)
#タスクバーにメッセージ表示
Phs.mes("Failed get position info.")
#実行終了
exit
end

# URLを生成 とりあえず日本測地系で、セグメントごとにバラしてます
url = "http://www.mapion.co.jp/c/f?uc=1&nl=" +
"#{p.n1}/#{p.n2}/#{p.n3}&el=#{p.e1}/#{p.e2}/#{p.e3}" +
"&scl=10000&size=665,460&grp=Air"

# 郵便番号(postal code)の取得(取得できなかった場合は"0000000"が返る
#puts "postal code: " + p.pc

# ダイヤルアップ開始
# 引き数無しの場合は"DialUp.conf"になります
# /home/zaurus/Applications/Network/modules/ にあるダイヤルアップの
# confを指定します
if(Phs.connect(ARGV[0]))

# ブラウザで表示
system("qcop QPE/System 'execute(QString,QString)' " +
"netfront3 '#{url}'" )

一応ソース

ruby-serialportのサンプルがkodersとかにもあんまり無くて苦労したので、一応載せておきます。

「rqposition.html」をダウンロード

予定等

ここを見てMolodensky法のサブルーチンを移植したので、世界測地系への対応も可能ですが、NetFrontでGoogle Mapが見られないみたいで、実装はやめました。
Google Mapのメリットって何かありますかね。

あとは、緯度、経度を10進の小数で使うところもあるみたいで、そのメソッドは付けようかと思ってます。

[Zaurus] RubyとKeyHelper Appletで質問

Rubyで現在位置をマピオン等で表示するLinux Zaurus用スクリプトを書いたはいいんですが、KeyHelper Appletから実行できなくて困ってます。

10_position = @exec/opt/QtPalmtop/bin/ruby /opt/QtPalmtop/bin/rqposition.rb DialUp.conf

keyhelper.confへの登録は上記のようにしますが、requireが通りません。requireのあるスクリプトはエラーコード1で終わります。

/opt/QtPalmtop/bin/ruby -I /opt/QtPalmtop/lib/ruby/site_ruby/1.8/arm-linux/ /opt/QtPalmtop/bin/rqposition.rb DialUp.conf

といったように-Iオプションを加えてみましたが、どうもだめなようです。
もしお時間あったらどなたか教えてください。

#!/usr/bin/env ruby

require 'date'

テストコードは上記で十分です。
これすらKeyHelper Appletから起動するとエラーコード1となります。

よろしくお願いします。

2007.03.08

[Windows Mobile] Sigmarion III / jornada720でMortScriptを動かす

H/PCでもサスペンドから起きてQMAIL3で定期的にメールの送受信(定期巡回)ができたらどんなにいいことか、ということでMortScriptをH/PCで動かすべく頑張ってみました。

結果、NTT DoCoMo Sigmarion III、hp jornada720で動かすことができましたのでレポートしておきます。

まずはMortScriptの動作に必要なDLLは何か、という調査から。
僕がよく使う手である、GNU binutilsに収録されているstringsによるテキストの抜き出しを試みてみます。

strings MortScript.exe | grep dll >~/mortscript.txt

これは、ホーミンさんのサイトからダウンロードできるExecutabilty Check toolでチェック可能です。

COREDLL.dll
AYGSHELL.dll
cellcore.dll
CEShell.DLL
mfcce300.dll
ole32.dll
toolhelp.dll
WININET.dll

上記8つのdllがリストアップできました。これに依存しているんでしょう。

mfcce300.dllのダウンロード

詳しくは後述しますが、MortScriptの起動に必要なmfcce300.dllを置いておきます。

手元に無ければ、あるいは手元のmfcce300.dllではうまく動かない場合に使ってみてください。Pocket PC 2003用です。

「mfcce300.zip」をダウンロード

NTT DoCoMo Sigmarion IIIでのMortScriptの起動

MortScriptはWindows Mobile / Pocket PC用のアプリケーションなので、ホーミンさんのところに行ってダミーDll(H/PC2000以降用)を\Windowsに入れておきます。ROM上に既にあるファイルは入れ替える必要はありません。

GSFinder+TQでROMファイルを含む全ファイルを表示し精査していくと、ダミーDLLを入れてなおmfcce300.dllが足りないことが分かります。

HDDをあさってみると、Pocket PC 2003 SDKの中にmfcce300.dllがありました。パスで言うと以下です。

"C:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Mfc\Lib\armv4\mfcce300.dll"

これをSigmarion IIIの\Windowsに入れてみました。

MortScriptのcabは、Sigmarion IIIでは例によってCabPatcherでパッチを当てないとインストールできないので、処置しておきます。MortScriptの配布アーカイブの中にはcabのほか生でファイルが入っていますが、拡張子の関連付けのこともあるので、cabからインストールした方がいいと思います。

パッチを当てたらインストール。MortScriptはSDではなく、RAMの方にインストールしてください。

これで起動できました。RunAt()、Message()、PlaySound()、PowerOffなど試してみましたが、動きました。

既にH/PC用のmfcce300.dllを使っている場合、これに入れ替えるとほかのアプリケーションの動作に支障が出るので、続いて説明するjornada720の場合と同様、MortScript.exeのあるディレクトリにmfcce300.dllを入れて、ほかのアプリケーションが使わないように隔離するか、ホーミンさんのExecutabilty Check toolでMortScript.exeを、例えば「mfcce30p.dll」を読むよう書き換え、「mfcce30p.dll」にリネームしたPocket PC 2003用mfcce300.dllを\Windowsに共存させる、といった手を使って問題を回避してください。(ホーミンさんアドバイスありがとうございます)

これは既に確立されたTIPSのようですね。

hp jornada720でのMortScriptの起動

Sigmarion IIIと同じく、ホーミンさんのダミーDLLを\Windowsに入れます。既にROM上にあるファイルは入れなくて大丈夫です。

jornada720にはmfcce300.dllが\Windowsに最初から入っています。ROM上にあるファイルです。
ダミーDLLを入れると必要なdllはそろうので、MortScriptをcabからインストールします。
MortScriptはCFではなく、RAMの方にインストールしてください。

MortScript.exeを起動してみると、出るはずのダイアログが出ません。また、ハングアップしたようになってしまいます。

MortScript.exeと同じディレクトリにPocket PC 2003 SDKから抜いてきたmfcce300.dllを入れて、こっちを優先して使わせてみました。すると、起動できました。

\Windowsにmfcce300.dllをコピーできないjornada720の場合も、ホーミンさんのExecutabilty Check toolを使ってMortScript.exeを書き換え、リネームしたmfcce300.dllを\Windowsに置く手が使えます。

H/PCでサスペンドから起きての定期的メール送受信(定期巡回)

さて、これでMortScriptを動かす準備はできました。現時点での最新バージョン、RC11の起動を確認しています。

後は、以前のエントリ「Windows Mobile QMAIL3でサスペンドから起きて自動定期巡回(メール送受信)」を見て設定すれば、QMAIL3でサスペンドから起きての定期的メール送受信(定期巡回)ができると思いますよ!

常に最新のメールがInboxに入っていることになるので、H/PCのメール端末としての有用性は、これで100倍でしょう。

恐らく、jornada728、jornada710でも可能だと思います。

MortScriptをH/PCで動かすことに主眼を置いた説明することにも意味があると思ったのでこういったエントリにしてみました。

大体似たような内容を、「Sigmarion III / jornada720でもQMAIL3でサスペンドから起きて自動定期巡回(メール送受信)」とタイトルを変えて再度エントリしたいと思います。

2007.03.03

[Zaurus] Rubyからシリアルポートをコントロール ruby-serialport

Rubyからシリアルポートをいじれると、ぜってーおもしれーと思い、ruby-serialport 0.6をコンパイルしてみました。ruby-termiosを最初にいじってみようとしましたが、わけ分かんな過ぎて諦めました。

FocVさんの配布しているRubyのパッケージ向けのディレクトリ構成です。パッケージにはruby.hがいっしょに入っていたので助かったです。

開発環境をgcc3.3ベースにしたので、使う場合はlibgcc_3.4.4をインストールする必要があると思います。

「ruby-serialport_0.6_arm.ipk.bin」をダウンロード

「libgcc_3.4.4-1_arm.ipk.bin」をダウンロード

一応ruby-termiosもパッケージ置いときます。

「ruby-termios_0.9.4_arm.ipk.bin」をダウンロード

とりあえずPHSから位置情報を取得するのはOKでした。CFGPS2からもOKです。
CFGPS2の方は、

sp = SerialPort.new(port, 4800, 8, 1, SerialPort::NONE)

と4800bpsでOKかと思います。
ちょっとテストしてみたうんこRubyスクリプト置いておきます。

「ruby-serialport01.html」をダウンロード

可能性は無限大ですね。手始めに測地系の簡易変換関数でも移植しようかな。

2007.03.02

[Windows Mobile] Windows Mobile用クロスコンパイラ、CeGCC再び

以前のエントリCygwin/i386 Linux用Windows CE(PocketPC)クロスコンパイラCeGCCを試すの続編です。

そういえば、Cygwin / i386 Linuxで動作するARM CPU搭載Windows Mobile向けクロスコンパイラであるところのCeGCCの様子は最近どうかいな、ということで見に行ってみると、ちょうど2007年2月リリースのブツ0.10.0がアップロードされていました。

早速昨年10月にインストールした0.1.0と入れ替えてみました。

CeGCCのCygwin環境へのインストール

仔細は説明を省きますが、Cygwinをインストールします。その後に、

SourceForgeの当該ページへ行き、「cygwin binaries, svn 0.10.0.20070208」を落としてきます。

自分のとこではd:\cygwinがCygwinのルートなので、d:\cygwin\以下に上記のtarballを展開。
(以後、パスは自分の環境に読み替えてください)

展開すると、optから始まるディレクトリツリーが出来上がります。

~/.bashrcをいじるなどして、d:\cygwin\opt\cegcc\binにパスを通します。

自分の環境ではシンボリックリンク(0バイトのファイル)が機能していなかったので、それぞれ手動で実体と差し替えました。

シンボリックリンクはd:\cygwin\opt\cegcc\binに存在し、同一ディレクトリにあるツールや、d:\cygwin\opt\cegcc\arm-wince-cegcc\binにあるツールに向かって張られているようです。

要するにd:\cygwin\opt\cegcc\binにある0バイトのファイルの実体をd:\cygwin\opt\cegcc\binとd:\cygwin\opt\cegcc\arm-wince-cegcc\binから探して、シンボリックリンクの名前にリネームして置き換えるわけです。

もちろん、シンボリックリンクが機能する環境ではそんなことをする必要はありません。

いや、機能しなくとも、こんな頭悪くない解決策があるに違いません。

基本的に、これで基本的なインストールは完了(のはず)です。

Cのソースのコンパイルは、例えばtest.cというファイル名のソースを書いたとして、

arm-wince-cegcc-cc test.c -o test.exe

でできるはずです。

試しにQKCをコンパイル

QKCのソースがたまたまあったのでコンパイルしてみることにしました。

UNIX向けの「QKC - Quick KANJI code Converter C Version 1.0」というやつですね。
Makefileを編集して、コンパイラ指定を「CC = arm-wince-cegcc-gcc」に書き換えます。

そしてmake。何と! 何事も無かったようにコンパイルが通ります!

ActiveSync中のh2210にcecopyを使って出来たqkc.exeをコピー(いや別に普通の手段でファイルをコピーすればいいと思います)。

QKCを動かしてみる

CeGCCでコンパイルしたバイナリの実行にはDLLが必要です。

d:\cygwin\opt\cegcc\arm-wince-cegcc\lib\device\cegcc.dll
d:\cygwin\opt\cegcc\arm-wince-cegcc\lib\device\cegccthrd.dll

この二つのDLLをデバイスの\Windowsにコピーします。

とりあえずShift-JISで書いたテキストqkc.txtを用意して、MortScriptから実行してみます。

Run("\qkc.exe", "-e \qkc.txt")

確かにqkc.txtがEUC-JPにナッテル!!!

標準出力に表示されるヘルプなんぞを見たいなと思ってDOS窓Openをインストール。しかしqkc -Hしても何も表示されず。

どうやら、PocketConsoleを使うといいようです。(参考)

PocketConsoleをインストールしたら、\Windows\CMD.exeを起動します。

qkc -H

ヘルプ出ました! やべー、マジやべー普通に使えてます。

20070302054020

type qkc.txt | qkc -s >qkc2.txt

パイプ、リダイレクト、使えてます。typeなんて使ったの何年ぶりだよ。

その他の戦績

Debian JPのsed-ja-3.02.orig試しました。

CC=arm-wince-cegcc-gcc ./configure --host=arm-wince

でmake。とりあえず動きました。

echo test | sed -e 's/^.//'

est

p2conv試しました。

CC=arm-wince-cegcc-gcc

コンパイルできたっぽいです。

nkfコンパイルを試しました。MakefileのCCを

CC = arm-wince-cegcc-gcc

に書き換えてmake。コンパイルは通りましたが、出力が空です。正常な動作をしません。
ヘルプは表示されたので、スクリーンショットを貼っておきます。

20070302054059

wgetのコンパイルを試しました。

CC=arm-wince-cegcc-gcc ./configure --host=arm-wince

でとりあえずやってみました。コンパイルは順調に進むものの、リンク段階でundefined reference toが出ます。何のリンクが必要なんだ?

host.o:host.c:(.text+0x8a0): undefined reference to `__h_errno_location'

あとがき

分からない人には全く分からないでしょうが、これはかなり楽しいことになってきました。

ハードルの高くなさそうなもののコンパイルを試してみたいと思います。

2007.03.01

[Windows Mobile] Windows Mobileでも英文音声合成ソフトウェアfliteで遊ぶ

Windows Mobile / Pocket PC / Window CEでも音声合成がやりたくなり、EmacsCEの作者で有名なRainerさんがポートした英文音声合成ソフトウェアfliteを使ってみました。
EmacsCEが動くなら、恐らくfliteもW-ZERO3で使えるのではないでしょうか。

サンプル音声

iPAQ h2210上で読み上げたものを置いておきます。

Pocket PCで再生すると切れませんが、Mac OS X上のFirefoxから再生すると後ろが切れますな。
変換が必要かも……。

You need more practice.

Alice Through the Looking Glass

GNU is Not UNIX

The GNU Project was launched in 1984 to develop a complete UNIX operating system which is free software: the GNU system. (GNU is a recursive acronym for “GNU’s Not UNIX”; it is pronounced “guh-noo.”)

Variants of the GNU operating system, which use the kernel Linux, are now widely used; though these systems are often referred to as “Linux”, some say they are more accurately called GNU/Linux systems because of the suite of GNU tools they use.

サンプルスクリプト

fliteはコマンドラインインターフェイスであるため、MortScriptから呼び出して使ってみます。

サンプルをいくつか書いてみましたので参考にしてみてください。

(1) クリップボードの英文を読み上げる
「FliteClip.mscr」をダウンロード

(2) 英文のテキストファイル「\FliteFile.txt」を読み上げる
「FliteFile.mscr」をダウンロード

(3) 英文のテキストファイル「\FliteFile.txt」を読み上げたものをwavファイルに保存する
「FliteFile2Wav.mscr」をダウンロード

(4) 現在時刻を英文で読み上げる
「FliteWatch.mscr」をダウンロード

fliteのインストール

fliteをインストールします。

General Paranoyaxc Softwareにあるfliteのページから、flite-wince-arm-hpc-wce300.tar.gzcelib-3.13-dll-bin-all-platforms.tar.gzをダウンロードしてきます。

flite-wince-arm-hpc-wce300.tar.gzからは、

flite.exe
flite.dll

を。celib-3.13-dll-bin-all-platforms.tar.gzからは、wince-arm-pocket-wce300-releaseフォルダの中の、

celib.dll

を取り出してきて、三つまとめて「\SD Card\FLITE\」にコピーします(上記スクリプトのデフォルトパス。異なる場所にインストールする場合はスクリプトの該当個所を書き換えてください)。

既にEmacsCEなどを使っていて、celib.dllを\Windowsディレクトリにコピーしている場合はcelib.dllは必要ありません。

ほとんどの人はARM CPUのマシンをお使いでしょうから、それを前提に説明しています。
MortScriptはARM用しかありませんが、fliteは各種CPU用がありますので、ARM CPU搭載機種以外でも使うことができます。

MortScriptのインストール

Downloads - MortScript (PC, PPC, Smartphone, PNA): ProgramからMortScript 4.0 RC10(現時点最新バージョン)をダウンロードしてきてPPC用をインストールします。
拡張子mscrのファイルがMortScriptに関連づけられるので、以降スクリプトの実行はダブルクリック等でできるようになります。

実際に試してみる

ここまで来たら、後はスクリプトを実行するだけです。

(1) クリップボードの英文を読み上げる

クリップボードに英文をコピーして実行してください。

(2) 英文のテキストファイル「\FliteFile.txt」を読み上げる

ルートディレクトリに「FliteFile.txt」という名前の英文テキストファイルを用意し、実行してください。

(3) 英文のテキストファイル「\FliteFile.txt」を読み上げたものをwavファイルに保存する

ルートディレクトリに「FliteFile.txt」という名前の英文テキストファイルを用意し、実行してください。
wavファイルのファイル名を問い合わせるので入力してください。
ルートディレクトリにファイルを保存します。

(4) 現在時刻を英文で読み上げる

ただ実行するだけで時刻を読み上げます。

注意点

スクリプト中では対策してますが(対策というか、エラーを出してます)、fliteは空白を含むパスにあるファイルを読むことができないようです(バックスラッシュでエスケープしてもだめ)。

「\My Documents」以下とかでもだめ。

改行を含まないテキストファイルを読むこともできません。(-tオプションを伴うテキストを読むことは可能)

あとがき

本当はQMAIL3で着信メールのアドレスを読み上げたかったのですが、Windows Mobile / Windows CE上ではQMAIL3のマクロから外部コマンドを実行できるんですかね?
Win32ではWSHのShellオブジェクトを呼び出して実行する手が使えるようですが。

ご存知の方がいらしたら、ぜひ教えてください。

« February 2007 | Main | May 2007 »

blogparts

  • Last.fm
  • twitter

Recent Comments

無料ブログはココログ