« January 2007 | Main | March 2007 »

2007.02.28

[Windows Mobile] MortScriptで遊ぶ

昨日に引き続きMortScriptネタ。

Window関連の関数を使うと、MortScriptでAppleScriptで言うGUI Scriptingみたいなことができます。

SNTPクライアントのコンパネであるところのGreenSoftwareさんのgstadjust.cplによる時刻合わせを自動化してみることにしました。

「gstadjust.mscr」をダウンロード

ネットワーク非接続時はダイヤルアップ

gstadjust.cplを起動

ボタン押す

処理中は待ち

処理が終わったらまたボタン押してウインドウ閉じる

このスクリプトでダイヤルアップしていた場合は
ダイヤルアップ切断

といった流れ。処理中はボタンのテキストが「キャンセル」になるということを利用して、ダイヤルアップ切断までの待ちのタイミングを作っているのがポイント。
座標で指定してそのポイントにあるコントロールのテキストを読むので、画面サイズや向きに依存するはずです。
自分はiPAQ h2210を使っているので、QVGA縦が前提の動作しか書けませんが。
screen()という関数で判定できるので、対応は可能です。

>screen landscape|portrait|vga|qvga
>Checks whether the display is in the given mode.
>Be aware "screen vga" will be true if a VGA display is used, no matter if "double resolution"
>(WM2003 SE default) or "real VGA" (SE_VGA, OzVGA, ...) is used.

x = screen("qvga")
y = screen("vga")

をh2210で実行するとxに1、yに0が代入されます。

|

2007.02.27

[Windows Mobile] QMAIL3でサスペンドから起きて自動定期巡回(メール送受信)

かねてより、Windows Mobile / Pocket PC等でサスペンドから自動的に起きて(レジュームして)、メールソフト(僕の場合主にQMAIL3)にて自動定期巡回(間欠巡回)をしたいと思っていました。

Windows Mobile内に常に最新メールが入っていると、利用価値が飛躍的に高まるからです。
メールを見たいと思ってから受け取るのでは遅いのです。

QMAIL3(や、そのほかのメールソフト)の自動巡回機能はサスペンド中は機能しません。

Windows Mobile / Pocket PC / Win32等で動くインタプリタ「MortScript」で、サスペンドから起きつつ巡回、ということが実現できたので、スクリプトを置いておきます。

以前エントリしたZaurusでCronInetとMewによるメールの定期巡回のWindows Mobile版ですね。

「AutoMail.mscr」をダウンロード

「AutoMailUnReg.mscr」をダウンロード

免責

責任は取りません。

スクリプトの性質上、WM5以前の機種では最悪RAMが飛ぶとかいうことは起き得ます。

能書き

今はW-ZERO3があり、メールを受動的に受け取れますが、僕はh2210をずっと使っているので恩恵にあずかれていません。

これを使うと、設定した間隔を置いて、

サスペンドから起きる

QMAIL3が実行中かどうか判定

バッテリの残量が指定%以上になっているか
もしくは外部電源供給されているか判定

巡回開始

ということが繰り返せます。例えば、30分ごとに巡回するよう指定した場合、30分ごとにWindows Mobileデバイスがサスペンドから起きて、QMAIL3でメールの送受信が自動的にできます。

手元にはCASSIOPEIA E-2000とiPAQ h2210しか無いのですが、それらでは動作しています。
意味があるか分かりませんが、W-ZERO3などでも動くと思います。

インストール

※すべてのファイルはパスに日本語が使われていない場所にインストールした方がいいと思います。

MortScriptのインストール

上記のスクリプトはMortScript用なので、MortScriptをインストールします。
RAMないし、サスペンドからの起き抜け実行でも不安定でない場所にインストールしてください。

mort.sto-helit.deへ行って現時点の最新版MortScript 4.0 RC9、もしくは「Temporary」からダウンロードできるMortScript RC10 (Test)をダウンロードしてきて、PPC用をインストールします。

QMAIL3のインストール

QMAIL3が動くように設定します。外部ストレージの寝起きが悪い機種では、これも実行ファイルはRAMないし内蔵メモリにインストールしましょう。Mailディレクトリは外部ストレージでも問題無いと思います。

QMAIL3の「巡回」の設定

QMAIL3の「ツール>同期>巡回>巡回」を設定します。設定項目のダイヤルアップでは「ネットワークに接続していないときにダイヤルアップ接続する」を設定しておきます。このスクリプトではダイヤルアップの接続/切断を面倒見ません。「自動巡回」ではなく「巡回」の方なので注意してください。
巡回名は、念のため1バイト英字のみで付けておいてください。

本スクリプトのインストール

上のリンクから「AutoMail.mscr」、「AutoMailUnReg.mscr」をダウンロードしてきます。
中身はShift-JIS、CR+LFのテキストです。

これを、とりあえず「\Program Files\MortScript\」にコピーします。
二つのスクリプトを起動しやすいようにLauncher、スタートメニュー等に登録します。

スクリプトの設定

「AutoMail.mscr」をテキストエディタで開くと、以下のような部分を見つけることができるはずです。巡回名の方は、さきほど設定した巡回の名前です。ダブルコーテーションで囲む必要があるので注意してください。

# Configure ########

# QMAIL3で実行する巡回名
s_course = "YOUR_COURSE_NAME"

# QMAIL3のパス(フルパス指定)
s_qmail3 = \
"\Program Files\QMAIL3\Q3U.EXE"

これを自分の環境に合わせて書き換えます。

QMAIL3が無いとか言われる場合は記述を確認、もしくはパスに日本語が使われていないか確認してください。

実行

QMAIL3を実行します。(QMAIL3が実行中でないと自動巡回しないようにしています)

「AutoMail.mscr」を実行します。

特に問題無ければ、バッテリ駆動時30分間隔、外部電源時15分間隔の定期巡回が始まるはずです。
巡回開始直後にバッテリ駆動時2回、外部電源時3回LED、バイブレータが動作すると思います。
これが嫌だということで0にすると永久ループになりますので、注意してください。

自動巡回の中止

「AutoMailUnReg.mscr」を実行します。
特に問題無ければLED、バイブレータが5回動作すると思います。

注意

「AutoMail.mscr」は、自分自身を未来の日付で呼び出すことで間欠実行を実現しているので、自動実行継続中はファイル名の変更、ファイルの移動をしてはいけません。

「AutoMail.mscr」で自動実行を開始したら、「AutoMailUnReg.mscr」で停止させるまでいじらないようにしてください。

また、「AutoMailUnReg.mscr」が参照するためにファイル「\My Documents\AutoMailScriptName.txt」というファイルを作ります。これも「AutoMailUnReg.mscr」で自動実行を停止させるまで削除してはいけません。

基本的にはARM CPUを搭載したWIndows Mobile / Pocket PCで動くと思いますが、中には省電力機能の出来によって動かない、動くが不安定、という機種もあると思います。

おかしくなった場合

えーと、たまったイベントを消すユーティリティがあったと思うのですが……。

Task Manager v2.7でできました。Notificationsタブから削除などできます。
MortScripterおすすめのユーティリティです。

付記

カスタマイズ

「AutoMail.mscr」の冒頭に以下の項目があるので適当に書き換えてください。

# Configure ########

# QMAIL3で実行する巡回名
s_course = "YOUR_COURSE_NAME"

# QMAIL3のパス(フルパス指定)
s_qmail3 = \
"\Program Files\QMAIL3\Q3U.EXE"

# バッテリー駆動時のインターバル(分)
n_s_interval = 30

# 外部電源時のインターバル(分)
n_l_interval = 15

# 自動巡回実行
# バッテリーレベルしきい値(%)
n_batt_lv = 50

# サスペンドから起きてQMAIL3で
# 巡回するまでのウェイト(秒)
n_wait = 3

# wavファイルのパス
s_wav_file = \
"\Windows\KeyDown.wav"

省電力機能の設定

動作が不安定な場合は、「設定」の「バックライト」の「デバイスを使用していない時にはバックライトを切る」を30秒以上にしてください。

インプレッション

まだ全然実用してないので(してから書けよ)実用度は分かりませんが、夢の「サスペンドから起きての自動実行」なので、かなり感激してます。

別にQMAIL3に限った話でなく、いろんなことができると思います。例えばUK-TaniyamaさんのUKTenkiとか。
ダイヤルアップの接続・切断と、その同期方法を考えないといけないですが。

一応、MortScriptにはConnect()、Disconnect()、Connected()などの関数があります。(PDF)
同期方法が考えどころです。

|

2007.02.25

[Zaurus] マップ対策?

この時期、マップをダウンロードしまくっている人が多いみたいですね。

ダウンロードには認証がかかっていて、なおかつhttpsのやりとりということで、調査に制限がかかってきます。
Etherealでキャプチャしてみると、当然横から見ているものだから暗号化されていて中身が見えない。

フォームの解析だけでは限界があって、うまく認証が通らない。
https通信の内容を知り得るのはブラウザ自身のみ、ならばFirefoxの拡張で何とかなるんでは、と調べてみると、

LiveHTTPHeadersというものを発見しました。

これはとても素晴らしい一品で、httpsのやりとりでもバッチリ分かります。
いや、勉強になった。
みなさん、こういう場合はどういう手法で調査してるんですかね。

|

2007.02.23

Zaurusで音声合成によるニュースの読み上げ

zmuDaTTS.rb実用の一例として、ニュースの音声ティッカーというのはありだろうな、と考えてました。
音声合成でニュースの読み上げをするわけです。

イヤホンを耳に突っ込みっぱなし、Zaurusはカバンの中、定期的にZaurusがニュースをチェックし、新着ニュースがあれば読み上げる、という利用形態はありだろうなと。

zmuDaTTS.rbをインストールして動作する環境を作った後、以下のRubyスクリプトを実行してみてください。

一応うんこスクリプトですが、利便性を図ってパッケージ用意しました。

「asahi.rb_0.1_arm.ipk.bin」をダウンロード

インストール後、ターミナルを起動して、

asahi.rb

とタイプして実行します。
おっと、swapはバリバリにONに、ネットワークに接続しておいてください。
asahi.comのRSSをターミナルに表示しつつタイトル読み上げを開始します。

差分だけ読み上げるようにして、後からブラウザで見られるようにして、CronInetでサスペンド状態からの自動巡回ができるようにすれば、何となく実用っぽくなるのかな。

何でasahi.comなのかといえば、商品名、英単語があんまり出てこないニュースソースの一つだからです。ChaSenやKAKASIフレンドリーというか。

#!/opt/QtPalmtop/bin/ruby -Ke

$KCODE = "e"

require 'open-uri'
require 'rss/1.0'
require 'rss/dublincore'

asahi = 'http://www3.asahi.com/rss/index.rdf'

rss = open(asahi){
|file| RSS::Parser.parse(file.read, true)
}
rss.output_encoding = "EUC-JP"

puts rss.channel.title
puts rss.channel.link

rss.items.each do |i|
puts i.dc_date
puts i.title
puts i.description
puts i.link
system("echo #{i.title} | speak")
end


|

Zaurus ext2フォーマットのSDカードで消せないフォルダを修復

なんかのソフトのconfigureの最終段階、ガリガリとSDカードに書き込みまくりのタイミングで、あろうことか省電力設定の都合サスペンドしてしまい、その余波で消せないディレクトリが発生。

さて困った困った。ext2フォーマットのSDなので、

sudo umount /mnt/card
sudo e2fsck /dev/mmcda1

その後にSDカードを抜き差しして復活しました。
危ない危ない。

|

2007.02.21

Zaurusで日本語音声合成 zmuDaTTS.rb v 0.2

多言語対応音声合成エンジンMBROLAに日本語読み上げをさせるフロントエンド、muDaTTS.rbのZaurus向け改変版であるところのzmuDaTTS.rbをバージョンアップしました。

「zmudatts_0.2_arm.ipk.bin」をダウンロード

前のバージョンをアンインストールしてからインストールしてください。
自分で単語を登録している場合は、/home/zaurus/Documents/Text_Files/zmudatts_wordlist.txtは退避しておいてください。
(一応/home/zaurus/Documents/Text_Files/zmudatts_wordlist_old.txtとリネームしてバックアップしますが)

登録単語をケースインセンシティブに

/home/zaurus/Documents/Text_Files/zmudatts_wordlist.txtに登録する単語は、ケースインセンシティブに扱うようにしました。

zaurus<TAB>ザウルス

と登録しておけば、ZaurusにもZAURUSにもヒットします。(Regexpのコンストラクタでiを立てただけです)

全角英数字を半角に変換するように

これまでは全角英字は読まれず、全角数字は1桁ずつでしか読まれませんでしたが、全角英字が読まれるように、数字は桁数に応じた読まれ方をするようになりました。

アルファベット対策

たまにアルファベットの単語が不正な発音記号として扱われていましたが、それを回避する手を打ちました。

|

2007.02.19

(実践編)Zaurusで日本語音声合成 MBROLA+muDaTTS

だれでもmuDaTTSとMBROLAによるZaurus上での日本語音声合成ができるよう、再現性を高めた記事を書いてみました。

はけさんの記事も参考になると思います。

MBROLAと音素ファイルjp2のパッケージを作りました。金銭の授受を伴わない再配布は自由とのことなので。

muDaTTS.rbはなりゆきで改変したので、本版はzmuDaTTS.rbと名乗ることにしました。

ライセンスはオリジナルに倣うことにします(記載がありませんが)。

必要なもの

zmuDaTTS
「zmudatts_0.2_arm.ipk.bin」をダウンロード(v 0.2に差し替えました)
Ruby
Ruby 1.8.5-p12 (FocVさんのPrivate Packagesより)
KAKASI
KAKASI 2.3.4-3 (FocVさんのPrivate Packagesより)
Ruby/kakasi拡張モジュール
ruby-kakasi 20020928 (FocVさんのPrivate Packagesより)
ChaSen
ChaSen 2.3.3 (FocVさんのPrivate Packagesより)
ipadic
IPADIC 2.7.0 (FocVさんのPrivate Packagesより)
MBROLA
以下のどちらかだけでOKです。通常はダイナミックリンク版で動くと思いますが、ダイナミックリンク版でダメならスタティックリンク版を試してみてください。いずれも「/opt/QtPalmtop/bin/mbrola」で入りますので、注意してください。
ダイナミックリンク版「mbrola_3.01h_arm.ipk.bin」をダウンロード
スタティックリンク版「mbrola-static_3.01h_arm.ipk.bin」をダウンロード
音素ファイルjp2
「mbrola-voice-jp2_0.1_arm.ipk.bin」をダウンロード
「/opt/QtPalmtop/lib/voices/jp2」で入ります。
SoX
sox 12.18.1 (FocVさんのPrivate Packagesより)

インストール

「必要なもの」に挙げたものを全部インストールします。

全部パッケージなので難しいことはないはず。

ただ、ipadicはサイズが大きくて、システムの状態によってはインストールが失敗することがあると思います。
僕自身も最初は失敗して、システムをまっさらにした状態では成功という経験をしました。
どうしてもダメな場合は、tarで解凍して手で入れる感じでしょうか(他にいいパッケージの展開方法があるような気がしますが)。

試してみる

テキストファイルを用意します。一言程度の短い文章推奨。

エンコーディングはEUC-JPにします。(後で何でもOKなように直します)直しました。「zmudatts_0.1_arm.ipk.bin」を同名の修正したファイルに差し替えました。

例えば/home/zaurus/test.txtに保存したとします。

ターミナルを起動。以下のコマンドを打ちます。

speak test.txt

しばらくするとしゃべり始めるはず。

ぶっちゃけメモリ的に厳しいので、swapをONにするか、起動中のアプリケーションを落としてから試してください。

しゃべらない単語がある場合は、zmudattsをインストールすると入る/home/zaurus/Documents/Text_Files/zmudatts_wordlist.txtに単語登録してください。

形式は見ての通りですが、

単語<TAB>よみ

です。単語は正規表現として解釈しますので、よく分からない人で半角記号を使う場合は、それぞれバックスラッシュ(円マーク)を直前に付けてください。

基本的に記号は読まないので、読ませたい場合は全部登録してください。

インストール時にzmudatts_wordlist.txtが存在している場合はzmudatts_wordlist_old.txtとしてバックアップしますので、しかるべき処置をしてください。

あとがき

muDaTTS.rbには、ChaSenが読めない未知語を、かな/カナであっても読まない問題があったので対処しました(未知語は、かな/カナであると見做す強引な方法なので、問題出るかも)。

また、記号類も一切読んでくれないので、単語登録できるようにしました。
前述の通り、/home/zaurus/Documents/Text_Files/zmudatts_wordlist.txtから読みます。

LinuxDevices経由での音出しを断念して、muDaTTSからはマクロの出力にとどめ、soxを使った再生に切り替えました。

一連の処理をするシェルスクリプトspeakを添付しました。
全部一本のパイプにつなぐこともできましたが、メモリ的に厳しいのと、処理中/dev/dspが開きっぱなしになるのもどうかと思ったので、$HOMEにテンポラリファイルを書くことにしました。

Zaurus向けにmuDaTTS.rbを改変(改悪)したので、zmuDaTTS.rbと名乗ることにしました。

|

ruby-mswince再始動?

旧聞にて失礼します。

今さらRubyのWindows Mobile向けポートであるruby-mswinceが久しぶりにバージョンアップしていることに気が付きました。
はけさんも言及してますね。
現バージョンは1.8.5ベース。

以前試したときはrequireができなくて使うのをやめてしまいました。
乾電池駆動のMobile Gear IIでも起動したから、かなり色めき立ったのですけどね。
しかし、ちゃんと動くのであれば要注目の処理系。WM5機を持っていないので、試すことができていませんが。

WM5向けながら、一縷の望みをかけてSigmarion IIIとh2210で試してみましたが、残念ながらダメでした。

uema2.さんのサイトが残念な感じになっていたものの、はてなダイアリーに生存を確認
しかもruby-mswinceの.NET Compact Frameworkバインディングに挑戦中とのこと。
また新しくサイトを立ち上げるおつもりもあるようで、uema2.さんの動向には今後も要注目ですね。

|

2007.02.18

Zaurus Ruby/Qteとruby-sqlite3で簡単データベースアプリ

SHIMI.INFOさんのWikiにあるsqlite3とSQLite3/Rubyが気になったので使ってみました。
以前からRuby + データベースというのものに興味があったのです。

sqlite3はファイル指向のデータベースで、MySQLやPostgreSQLなどと違ってサーバを立てたりする必要が無く、扱いがとっても簡単です。
データベースは、主立った処理系には付いてきます。ほとんどのアプリケーションに必要なデータ処理を代行してくれるからですね。

SQL文を書くだけでデータの格納、取り出し、検索、削除、ソート等ができるので、一度データベースを使ったことがある人なら、ファイルの読み書きによるデータ保存/復帰、配列やハッシュベースのデータ管理などやりたくなくなるはずです。

Rubyにsqlite3とSQLite3/Rubyを追加すると、Rubyからsqlite3データベースが操作できるようになります。

ちょっとしたテストと覚え書きにある、 ruby-sqlite3-1.1.0と、sqlite3_3.2.1-2_arm.ipk(ipkのある階層をリンクしていいものか分からなかったので直リンにしてみました)をダウンロード、これをインストールします。

Rubyは、FocVさんからダウンロードしたものを使っています。

ただ、SHIMI.INFOさんのRubyとFocVさんのRubyではディレクトリ構成がちょっと違うので、SHIMI.INFOさんのruby-sqlite3-1.1.0をFocVさんのRubyで使う場合、ファイルの移動が必要でした。FocVさんのRuby向けの構成にパッケージし直したものを置いておきます。

「ruby-sqlite3_1.1.0-1_arm.ipk.bin」をダウンロード

インストールしたら、やはりここはRuby/QteでGUI表示などしてみて感じをつかむに限るでしょう。
新規データベース作成、データベースのテーブル定義、レコード挿入、それをQListViewに表示してみます。

試しに書いてみたソースコード。utf-8で保存します。
(ruby-modeでシンタックスカラーリングしたものをhtmlize.elでhtml化しました。maruさんEmacsメンテナンスありがとうございます)

Scrn001_1

サンプルはテーブルにプライマリーキーを設定していませんが、プライマリーキーを定義しておけば特定レコードの削除、編集、アップデートなどが簡単です。プライマリーキーには大抵重複の無い連番を入れておきます。よくサンプル見たらプライマリーキー設定してた(w

登録画面、1件表示画面、リスト表示画面、それに検索、削除、ソート関係の機能を作れば、すぐ実用アプリができるでしょう。大量のレコードがある場合、limit節を使ったページング等の処理、それにともなうUIの工夫が必要になるかと思いますが。

Ruby + Ruby/Qte + SQLite3/Ruby + sqlite3ってZaurusコンフォータブルだと思います。
機会があったら何か作ってみたいと思います。

ある処理系からデータベースを使う場合、バックエンドとなるデータベースが別のエンジンに差し変わってもソースの修正が最小限に押さえられるよう、抽象化するDBIを間に入れるのが普通です。ruby-dbiがそれですが、sqliteにも対応してますね。ちょっと牛刀な感じがしなくもありませんが。

|

2007.02.14

Zaurusで日本語音声合成 MBROLA+muDaTTS

このエントリには続編があります。こちらをどうぞ。(実践編)Zaurusで日本語音声合成 MBROLA+muDaTTS

Linux Zaurusで日本語テキスト読み上げをやってみました。

以前紹介したMBROLAmuDaTTSです。

MBROLAは多言語対応の音声合成エンジン、muDaTTSはMBROLAで日本語を発声させるためのマクロを生成するプリプロセッサです。MBROLAとmuDaTTSの組み合わせで、日本語で書かれたテキストを合成音声で読み上げすることができます。

今回Linux Zaurusでの動作を確認しました。

再現性に欠けるインストールメモ

Zaurusで動くMBROLAのバイナリ(ソース配布は無し)は、LINUX / Pocket PC版で、中に以下の三つの実行ファイルが入っていますが、

mbrola-linux-strongarm
mbrola-linux-strongarm2
mbrola-linux-strongarm2-static

最初のものは使えないようでした。
実行ファイルのほかに音素ファイルが必要です。マクロを生成するmuDaTTSは、jp2 (jp2: Japanese Female (5.6Mb) Tomohisa Tachiki)を前提としています。jp1では音声生成時にエラーが出ました。

muDaTTSの動作には、Ruby、KAKASI、Ruby/kakasi拡張モジュール、LinuxDevices拡張モジュール、ChaSen、ipadic、そしてもちろんMBROLA、音素ファイルjp2が必要です。Ruby、KAKASI、ChaSen、ipadic、Ruby/kakasi拡張モジュール(ruby-kakasi)はFocVさんのPrivate Packagesから持ってきました(maruさんruby-kakasiありがとうございます)。

FocVさんのところにあるipadicのパッケージは自分の環境ではipkgからもインストールが失敗したので、手で入れました(あなたのZaurusでは大丈夫かもしれません)。

LinuxDevicesのSoundDSPクラスの定数の案配か、muDaTTSからSoundDSPクラスを経由して音声を出すということはできていませんが、

cat test.txt | ~/muDaTTS.rb > test.pho

などとしてマクロを生成した後(不要な部分を削り)、

./mbrola-linux-strongarm2 jp2/jp2 test.pho test.wav

こんな風に音声ファイルを作り、それを、

cat test.wav >/dev/dsp

とすれば音が出ますが、ピッチが速くなっちゃってこのままだとダメ。soxで変換しつつ/dev/dspに流し込んでやるとうまくいくことは知っているんですが、とりあえず今日はここまで。

(02.15追記)SoXのパッケージ作りました。
「/opt/QtPalmtop/bin/sox」と、「/opt/QtPalmtop/bin/play」が入ります。playはsoxのシェルスクリプトによるWrapperです。

「SoX_12.17.3_arm.ipk.bin」をダウンロード

sox test.wav -t ossdsp /dev/dsp

とやると、MBROLAで作ったwavでも、ピッチがちゃんとした状態で音が出ます。SoXって高機能な音声ファイル加工ソフトで、コーラス、フランジャー、エコー、ローパスフィルタ、バンドパスフィルタ、ハイパスフィルタなどをかけたりが可能です。音版のImageMagickのconvertみたいな感じです。

母艦にてlameで、

for i in *.wav;do lame $i `basename $i .wav`.mp3;done

みたいにして変換したものをアップしておきます。まとめると、

テキスト->ChaSenで形態素解析->KAKASIでローマ字に変換->muDaTTSでMBROLAのマクロ生成
 ->MBROLAでマクロから音声を合成->/dev/dspで再生

といったフローになります。一言程度でもChaSen->KAKASI->muDaTTSのところで数秒〜10秒ぐらいがかかります。

サンプル音声

抑揚が無い以外は、高品質だと思います。

「メールがモヤシさんかから到着しました」

「ザウルスで日本語音声合成ができました」

「この1時間のアクセス数は23件でした」

ココロクのエントリ「MBROLAで日本語音声合成」にコメントが付きました(自虐)

「グ」でエラーが出てしまうので、「ココロク」でやってみました。

僕の脳内は妄想でいっぱいです。
ニュースの音声ティッカーを作ってCronInetで定期巡回させて〜などといろいろ考えてます。

mpfe、Ruby/MPlayerなるものがあったので、TCP/IP経由でメソッドを実行できるようサーバ化すれば、読み上げ時に演奏を止める、といったこともできますなー。(Ruby/QteでQcop受信実行できるpublicなslotって実現できるんですかね?)
“iPod DJ Mixer”「DJ-2.20」でiPodとZaurusの音をミックスしてしまうという手もありますね。

DTalker Mobile Ver3.0 for Windows Mobileなるものがとても気になります。

そのうちドキュメントトーカ開発システム 日本語音声合成エンジン for Windows CEを買ってみたいですね。.NETなら手が届きます。

ところで、.NET+WMでスリープから起きて何かして、またスリープ移行というCronInetみたいな動作ってできるんでしょうかね。API等をご存じの方がいらしたら教えてください。

(2007.2.18追記)
CeRunAppAtTimeでできるようですね。それはObsoleteで、今はWindows CE 通知 API(CeSetUserNotificationEx)に関連APIが統合。.NET Compact Frameworkからも使えるようです。

参考

通知アプリケーションと時刻指定アプリケーション
スケジューラの使用とユーザーへの通知

|

2007.02.10

(修正)Zaurus無線LAN自動再接続スクリプトwlan-re-establish 2007.02.10版

先日アップしたLinux Zaurus用無線LAN自動再接続スクリプトを修正しました。

無線LANを接続したままサスペンド。レジューム時に再接続をしにいったように見えて、実はつながっていないという現象への対策をするスクリプトです。

もっと根源的な解決策があるんでしょうが、それを追及する実力は僕にはありません。

無線LANを接続中にサスペンド、サスペンドしている間に無線LANカードを抜き取った場合への対策として、カードの存在のcardctlでの確認を入れました。

ファイルのダウンロードは以前のエントリでどうぞ。

Zaurus無線LAN自動再接続スクリプトwlan-re-establish

いしじまだいさん経由、河村商店さん(LPガス販売店用のRuby/Qte製検診ツールを配布されているとってもHackyな方)経由で知ったOESFのBluetoothセクションにあるsusp-resume_0.9-3.1.ipkというのを入れると、suspend時とresume時に/etc/apm.d/suspend.d/S*、/etc/apm.d/resume.d/R*を実行できるようになるので、NetHelper Appletの代わりにこれを使う手もあるかもしれません。bluetoothのカードでは、単純にcardctl eject、cardctl insertで対策してますね。

|

2007.02.04

Zaurus無線LAN自動再接続スクリプトwlan-re-establish

Linux Zaurusで無線LANを使用中にサスペンドして、その後にレジューム(電源を投入)すると、無線LANの再接続をしたそぶりを見せながら、実際はつながっていない、ということがあるようです。

僕の無線LANカードではそうですね。

自分だけかなあと思っていたところ、同じ症状を訴える人がいるようなので、自動再接続する対策スクリプトを公開します。

あんまりテストしていないので、不具合が出る可能性はありますが(例えば再接続中にサスペンドした場合等)、これを元に改造などしてみてください。

インストール

(2007.02.10 追記:無線LANカードを、電源を切っている間に抜いていた場合につながないようにしました)

「wlan-re-establish_2007.02.10-1_arm.ipk.bin」をダウンロード

これをダウンロードして普通にインストールします。Rubyスクリプトなので、Rubyが必要です。僕はFocVさんのPrivate Packages for Sharp Zaurus SL-C seriesにあるパッケージを入れています(メンテナンス感謝しています>dipusさん)。

インストールすると、スクリプト「wlan-re-establish.rb」が「/opt/QtPalmtop/bin/」に入ります。

使い方

コマンドラインから、

wlan-re-establish.rb WLAN.conf

などとして使います。
"WLAN.conf"は僕の環境でのファイル名なので、適当な無線LAN用のconfファイルを指定する必要があります。confファイルは以下のパスにあるので、調べてみてください。

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

コマンドラインから実行したい人などいないでしょうが、次のステップに進む前に、実際に動作するかどうか確かめてください。

NetHelper Appletと併用すると、レジューム時に自動実行できます。
yaktyさん、素晴らしいソフトウェアの数々をありがとうございます。

/home/zaurus/Settings/nethelper.conf

を新しく作るか、追記します。NetHelper Appletをインストールしただけでは設定ファイルは作られないので、最初は自分で作る必要があります。
設定例は以下です。[Run_WLAN]は、WLAN.confを使う場合のセクション名です。
confファイル名に合わせる必要があります。

---------[nethelper.conf] from here---------

[Environment]
PERL_BADLANG = 0
[Global]
Enabled = 1
[Run_All]
[Run_Off]
[Run_WLAN]
resume00 = /opt/QtPalmtop/bin/wlan-re-establish.rb WLAN.conf

---------[nethelper.conf] to here---------
「wlan-re-establish_2007.02.10-1_arm.ipk.bin」をダウンロード

|

2007.02.02

ZaurusのNetFrontを強化! QCopでJavaScriptを実行

QCopメッセージでLinux ZaurusのNetFrontにJavaScriptを実行させる、というのをやってみました。

NetFrontに送るQCopメッセージとしては、

qcop QPE/System 'execute(QString,QString)' netfront3 "http://www.google.co.jp/"

これが基本形でしょう。僕はこういうのをいくつかKeyHelper Appletに登録して、Googleやらmixiやら駅探SSに、いついかなるときでもバシっと一発でジャンプできるようにしてあります。

qcop QPE/System 'execute(QString,QString)' netfront3 "mailto:hoge@hoge.com"

みたいなのも通ります。しかし、「?subject=test&cc=hoge2@hoge.com」といった引数はqtmailに通らないようでした。

qcop QPE/System 'execute(QString,QString)' qtmail "mailto:hoge@hoge.com"

でも同じですね。よくメールを送る人をKeyHelper Appletに登録しておいてはいかがでしょうか。
この延長上で、

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:alert('hoge');"

というのも通りますよ、と、こういう話です。
bookmarkletと違って、実行方法はいろいろです。KeyHelper Appletを使うのが一番便利かと思います。

ただ、一つ問題があります。ロケーションバーに実行したスクリプトの内容が流し込まれてしまうんですね。
実行前に退避しておいて、window.locationなどで復帰したりとやってみましたが、うまくいっていません。

応用例をいくつか作ってみましたので、参考にしてください。可能性は無限大です。
JavaScriptが書けないとダメですが……。

スクロール系

以下はKeyHelper Appletのkeyhelper.confの[Launch]セクションのフォーマットで書いてあります。
行頭のGとかTとかは僕の適当な設定ですので、適宜読み替えてください。<TAB>はタブ文字を入力です。

上方向にスクロール (スクロール量調整可能)

G = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollBy(0,-200);"

下方向にスクロール(スクロール量調整可能)

H = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollBy(0,200);"

ページトップにジャンプ

T = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollTo(0,0);"

ページボトムにジャンプ

B = @qcop<TAB>QPE/System 'execute(QString,QString)' netfront3 "javascript:window.scrollTo(0,100000000);"

スクロールさせる方は、「scrollBy(0,X)」のXの数値を大小させるとスクロール量を調整できます。
「ページボトムにジャンプ」はページのheightを計算してスマートにジャンプさせる方法があるかと思いますが、格好悪く非現実的な数値を入れてます。

フォームの自動入力系

フォームの解析が必要ですが、フォームに自動入力できると便利な局面もあるでしょう。
モバイラーはSNSとかにいろんなところからログインするので、勝手にログアウトしてイラっとすることが多いかと思いますが、そんなときに一発でログインできると快感。

あらかじめフォームに値を入れて、submit()をFireするローカルページを用意しておけばいいんですけどね……。動的にページを生成するサイトなどでは使えなかったりするので、そういった場合のサンプルということで。

EMAILADDRESS、USERNAME、PASSWORDを自分のものに書き換えてください。
Gmailのはアカウントを取っ替え引っ替えしている人に便利かな。
ログインできさえすればいいなら、全部まとめてdocument.URLで判定して、実行すれば何でもログインスクリプトにすれば便利ですね。
これ以降はコマンドラインやシェルスクリプトから実行する場合のフォーマットで書きます。

mixiログイン

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:m='EMAILADDRESS';p='PASSWORD';f=document.forms[0];if(f.email){f.email.value=m;f.password.value=p;f.sticky.checked=1;f.submit()}else{exit()}"

Yahoo! Auctionのパスワード再確認画面

(これはSafariでしか確認してません。うまくいかない場合は「document.title=='パスワードの確認'」をtrueにしてください)

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:if (document.title=='パスワードの再確認'){document.forms[0].passwd.value='PASSWORD';document.forms[0].submit();}"

Amazonログイン

(http://www.amazon.co.jp/gp/yourstore/?signIn=1)

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:df=document.forms[0];if(df.name=='sign-in'){df.email.value='EMAILADDRESS';df.action[1].checked='1';df.password.value='PASSWORD';df.submit()}"

Gmailログイン

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:m='USERNAME';p='PASSWORD';d=document;e=d.getElementById('Email');if(e){e.value=m;d.getElementById('Passwd').value=p;d.forms[0].PersistentCookie.checked=1;d.forms[0].submit()}else{exit()}"

Js_scrn005

Js_scrn006

Js_scrn007

ユーティリティ系?

ページの要素を抜き出してきて、別ページを生成、そこに一覧、みたいなのもできます。
とりあえず画像へのリンクと通常のリンクの一覧を抜き出してきて、別ページを開いてtextareaの中にダダっと貼り込むというのを作ってみました。

リンクを抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:dl=document.links;if(dl.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Links</title><form><textarea cols=85 rows=20>');for(i=0;i<dl.length;i++){w.write(dl[i].protocol+'//'+dl[i].hostname+dl[i].pathname+'\n')};w.write('</textarea></form>');w.close();"

画像を抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:di=document.images;if(di.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Images</title><form><textarea cols=85 rows=20>');for(i=0;i<di.length;i++){w.write(di[i].src+'\n')};w.write('</textarea></form>');w.close();"

正規表現にマッチする画像を抜き出して別のウインドウで一覧

qcop QPE/System 'execute(QString,QString)' netfront3 "javascript:di=document.images;if(di.length==0){exit()};w=window.open('',(new Date()).getTime());w=w.document;w.open();w.write('<title>Images</title><form><textarea cols=85 rows=20>');for(i=0;i<di.length;i++){if(/gif/.test(di[i].src)){w.write(di[i].src+'\n')}};w.write('</textarea></form>');w.close();"

Js_scrn001

Js_scrn002_1

Js_scrn003

「if(/gif/.test(di[i].src)){}」なので、「gif」が含まれる画像リンクだけ抜き出した一覧になっています。
ほとんど可読性ゼロの状態ですが、何もbookmarkletのようにOne Linerでなくてはいけないわけでなく、例えばShell Scriptから実行する場合は、以下のような形でOKです。

#!/bin/sh

# 「javascript:」の直後、文無しで改行を入れてはいけない
# 文字列リテラルの中で改行してはいけない (基本)
# 最近のECMAScriptでは改行できるみたいですが。

qcop QPE/System 'execute(QString,QString)' netfront3 "
javascript://;
di = document.images;
if (di.length == 0) {exit();}
w = window.open('', (new Date()).getTime());
w = w.document;
w.open();
w.write('<title>Images</title>' +
'<form><textarea cols=\"85\" rows=\"20\">');
for (i = 0; i < di.length; i++)
{
if (/gif/.test(di[i].src))
{
w.write(di[i].src + '\n');
}
}
w.write('</textarea></form>');
w.close();
"

Shell ScriptのKeyHelper Appletからの実行は、以下のようにします。keyhelper.confの[Menu]セクション形式の記述です。

10_img list = @exec<TAB>/bin/sh /home/zaurus/bin/js.sh

あとがき/情報募集

かように、いろいろなことができます。ページのソースを表示するとか、リンク先を抜き出すにしても最初っからwgetを頭に付けておいてダウンロード補助するとか、抜き出したリンク先を貼ったページを前面に出して、selectして、InputHelper AppletなどでCtrl + Cを発行してクリップボード経由でダウンロードまで自動でやっちゃうとか。絞り込みの正規表現を途中で入力するようにするとか。

KeyHelper Applet + QCop経由でのJavaScript実行は、他のモバイルプラットフォーム/ブラウザに無い強みですので、ぜひ活用してみてください。

「document.readyState」が使えないようです。存在するべきElementの存在判定をすればいいのかもしれませんが、汎用性が無いので、動的にページを生成するスクリプトで面倒です。
代替案等がありましたら教えてください。

それと、今フォーカスしているリンクを取得する方法があればと思うんですが。

|

Zaurus用iTunesネットワークリモコンRCTunes(3)

Zaurus用iTunesネットワークリモコンRCTunes(2)に引き続き。

Linux Zaurusからネットワーク経由でMac用iTunesをリモートコントロールするソフト。
無線LAN環境での使用を想定しています。
うちはAirMac ExpressでiTunesがワイヤレス環境なので、そういうのが欲しくなった也。

今日はRCTunes ServerのIPアドレスと、ポート番号を設定するダイアログと、ファイルへの保存、保存した初期設定の読み込み機能。

Scrn001

そして、再生中の曲情報のクリップボードへのコピー機能を付けてみました。

Scrn003

Scrn006

設定の保存関係にはQSettingsを使うつもりでいたんですが、Ruby/Qteでは残念ながら未定義でした。

とりあえずClientの方はこんぐらいにしといて、Serverの方をマシにしようかな。
二つ作らないといけないのが大変ですね。

ところで、長年の悩みが晴れました。

#!/bin/env ruby -Ku

ができなくて変だなあと思っていたのですが、シェバング行の機能はOSによって違うんですね。
パスを決め打ちしたら負けかなと思っていたんですが、ZaurusではOKってことですね。

BGM: 薔薇と野獣/細野晴臣(Hosono House)

|

« January 2007 | Main | March 2007 »