« June 2007 | Main | August 2007 »

2007.07.30

[Windows Mobile]PythonCEをAdvanced/W-ZERO3 [es]で使ってみた

ここのところ、Advanced/W-ZERO3 [es]でのセルフプログラミング用言語の探索をしてます。

ZaurusではRubyを使っていますが、ruby-mswinceはsocket(ネットワーク系機能)が使えないのが残念だったので、別のプログラミング言語を調べ、PythonCEに行き着きました。
これが予想外にとても使えるものだったのでホクホク。
Advanced/W-ZERO3 [es]でも問題無く使えているよう。

インストールはcab一発。
今なら、「PythonCE-25-20061219.PPC2003_ARM.CAB」というファイルをインストールすればOK。

PythonCEを一度起動すると、拡張子pyへの関連付けがなされるようです。
Pythonスクリプトを拡張子pyのファイルとしてエディタで作れば、Explorer等から実行可能です。

PythonCEは独自にコンソールを実装しているので、cmd.exeを使う場合に問題になる、エラーメッセージが読めないというトラブル、標準出力に表示しなくなってしまうトラブルと無縁。

Python2.5がベースになっていてcodecsが標準で添付されており、日本語への対応OK。
内部処理はasciiかunicodeですが、shift_jisやeuc-jpなどの読み書きが可能。socketも動作を確認。

EmacsCEにpython-mode

Pythonのソースを書くには、python-modeを使うと便利。これをEmacsCEで動かします。

解凍して出てきた*.elをsite-lispにコピー。
EmacsCEには(というか、Emacs20.7には)python-modeに必要なansi-color.elが入っていないので、www.emacswiki.orgからもらってきて、site-lispに入れたらすんなり動きました。
ただ、EmacsCEではMule-UCSが動かないので、utf-8でソースを書けないのが困りもの。

普通は母艦でスクリプトを書いて、それを持ってくる方がいいと思いますが、Mac OS X Tiger標準のPythonはcodecsにshift_jis、euc_jpが入ってなかったりしたので2.5を入れて環境を合わせました。

マニュアルを用意

PyJUGに日本語マニュアルあり。
html版のアーカイブをダウンロードし、microSDに入れておき、ブックマーク。

動作確認スクリプト:Webページを取ってきてテキストファイルとして保存

import httplib, codecs, re

conn = httplib.HTTPConnection('www.google.co.jp', 80)
conn.request("GET", "/index.html")
res = conn.getresponse()
conn.close

body = res.read().decode('shift_jis')
body = re.sub("<.+?>", "", body, 0)
body = re.sub("&nbsp;", " ", body, 0)
body = re.sub("&copy;", "(c)", body, 0)

fout = codecs.open('/google.txt', 'w', 'shift_jis')
fout.write(body)
fout.close

動作確認スクリプト:Webページの一部を抜き出す

Rubyで言うところのopen-uriのようなurllibを使えば、より簡単にページを取得できます。

スクレイピングをするBeautifulSoupというライブラリがあり(sh1.2さんの紹介記事)これも動作しました。
こういう非標準ライブラリは、Libディレクトリに入れておくと使えるようになります。
最初に使われるときに、バイトコンパイルされるようですね。

ページ中のリンクを集めてファイルに書き出す処理です。

import urllib
from BeautifulSoup import BeautifulSoup

URL='http://www.google.co.jp/'
b = BeautifulSoup(urllib.urlopen(URL))

urls = []
for i in b.findAll('a'):
try:
if i.attrs[0][0] == 'href':
urls.append(i.attrs[0][1])
except IndexError:
continue

fout = open('/urls.txt', 'w')
for u in urls:
fout.write(u + "\n")
fout.close

動作確認スクリプト:メールを送る

SMTP認証あり、Message Submissionの例。
日本語のメールを送ることも可能と思われます。
PythonCEには、Pythonの一般事例がそのまま適用できるようなので、情報には事欠かないでしょう。

import smtplib

server = smtplib.SMTP('SERVER_ADDRESS', 587)
fromaddr = 'FROM@ADDRESS'
toaddr = 'TO@ADDRESS'
msg = 'PythonCE test'

server.login('USER_NAME', 'PASSWORD')
server.sendmail(fromaddr, toaddr, msg)
server.quit()

総評

立派なオブジェクト指向言語。ネットワークへの対応もバッチリ、日本語の読み書きもOKということで、かなり実用的と感じました。国内でももっと使われていいんじゃないでしょうか。
今回インストールしたPythonCEにはsqlite3.dllが添付されていて、sqlite3をimportできたので標準で使えるようです。かなり便利そう。

MortScriptやnScript/nScriptmと比較した場合、Windows Mobileにフォーカスした関数が乏しいのがウィークポイントですが、それを補ってあまりある基本機能とドキュメント、ライブラリ、情報があるので、必ずやAdvanced/W-ZERO3 [es]の力になってくれるはず。
足りないところはMortScriptと組み合わせて補うと、案配がいいんではないかと。

Win32apiのwrapperをPure Pythonで書けるようです。PythonCEにはwin32clipboardが無いんですが、クリップボードへのアクセスも拡張できるんですかね。

|

2007.07.27

[Windows Mobile]ruby-mswinceをAdvanced/W-ZERO3 [es]で使ってみた

Advanced/W-ZERO3 [es]でRubyが動いたら楽しいよね?

……ということでWindows Mobile向けのRubyであるuema2.さんのruby-mswinceをAdvanced/W-ZERO3 [es]で使うべく頑張ってみました。

ruby-mswinceのインストール

Windows Mobileにはコンソールが入ってないのでインストールします。

こちらを参考にしました。

Windows Mobile Developer Power Toysをダウンロード

・Windows Mobile Developer Power ToysをPCにインストール

・インストールディレクトリにある「PPC_Command_Shell\arm」ディレクトリから「cmd.exe、console.dll、shell.exe」をAdvanced/W-ZERO3 [es]のWindowsフォルダにコピー

TRE等でレジストリを編集

[HKEY_LOCAL_MACHINE\Drivers\Console]
"Font"="tahoma"
"Size"=dword:00000009
"OutputTo"=dword:00000000

・再起動

ruby-mswinceをダウンロード (2007.07.25現在はruby-1.8.6-armv4i-wm5-mswince070531.zip)

・母艦で解凍、デバイスにコピー

・ホーミンさんのSystem Pathで、<インストールパス>/ruby/binにパスを通します

使い方

/Windows/cmd.exeを起動し、

ruby <スクリプトへのフルパス>

としてスクリプトを実行するか、PocketTweakで拡張子rbをrubyに関連付けるか。

懸案のrequire問題を回避

ruby-mswinceは、PocketTweakで拡張子rbに関連付け、GSFinderなどからスクリプトを実行するとライブラリをrequireしても問題無いものの、なぜかコンソールから実行するとライブラリにパスが通っていない状態になります。コンソールから実行する場合は対策します。

$:(別名$LOAD_PATH)の中身がすべて相対パスになってしまうのが原因なので、絶対パスにします。
requireする前に、以下の2行を書きます。要するにパスの頭に「/」をくっつけてます。

temp_path = $:.map{|x| if x != "."; x = "/#{x}"; else; x; end}
$:.clear().concat(temp_path)

require 'time'
require 'date'
require 'digest/md5'

冒頭の2行を、例えばloadpath.rbなどという名前でファイルに保存し、<インストールパス>/ruby/binに置いておくと、上記は、

require 'loadpath'
require 'time'
require 'date'
require 'digest/md5'

こんな風にできて便利。
何でスクリプトの実行方法でこんな違いが出てくるんですかね。

インプレッション

uema2.さんがおっしゃるように、socketがコケるようです。この点はとても残念……。
zlibもrequireに失敗します。

でも、いつでもどこでもRubyスクリプティングができるのは幸せ。
コーディングにはEmacsCEを使ってます。

コンソール問題

上記の手順でインストールしたWindows Mobile Developer Power Toysに含まれるcmd.exeは、しばらく使っていると標準出力に何も出力しなくなり、直すにはリセットするしか無いよう。
横スクロールができず、折り返しもしないのでエラーメッセージが読めず非常に具合が悪いです。

代替のコンソールを探さなくては。

|

2007.07.22

[Windows Mobile]Advanced/W-ZERO3[es]と京ぽん2の周波数特性測定

これまでのW-ZERO3シリーズは再生音のサンプリングレートが22kHzで、音が悪いのが不満でした。
通常のオーディオ機器のサンプリングレートは44.1kHzなので、半分しかありません。

Advanced/W-ZERO3[es]の再生音の質はどうなんでしょうか?
目に見えないものゆえ諸説紛々で、聞きづてでは見えてきませんでした。

僕もAdvanced/W-ZERO3[es]を買ってきたので、EDIROL FA-66をノーパソにつないで、WaveSpectraで特性を見てみました。
接続は以下の通りです。

Advanced/W-ZERO3[es]-->平型toミニプラグアダプタ-->ミニプラグtoRCAピンケーブル-->EDIROL FA-66-->Firewireケーブル-->PC

Advanced/W-ZERO3[es]には、WaveGeneで生成した16bit 44.1kHzの1Hz〜20kHzのスイープ信号のWAVファイルと、通常の楽曲のMP3をWMPで再生させました。
WMPで最大音量にて再生させ、WaveSpectraにて-40dbを指すようEDIROL FA-66のアッテネータでレベル調整しました。
Advanced/W-ZERO3[es]システム音量は最大の一つ手前(デフォルト)でした。

デフォルト状態での周波数特性

まずはデフォルト状態の周波数特性を見てみることにします。
再生すればすぐ分かりますが、結論から言うとデフォルト状態ではサンプリングレートは22kHzです。

↓デフォルト状態で1Hz〜20kHzのスイープ信号を再生
Freq-Adv-Z3-Sweep-Before

やはり11kHz止まりで、それ以上の周波数を再生する部分では折り返しが聞こえます。

↓デフォルト状態で普通の楽曲を再生
Freq-Adv-Z3-Perfume-Before

普通の楽曲を再生させても同じです。

サンプリングレート22kHzでは単に高域が削がれるばかりか、音がボソボソとして荒く、鑑賞に耐えるものではありません。

\Windows\use44khz.exe実行&リセット後の特性

Advanced/W-ZERO3[es]の\Windowsディレクトリには、「use44khz.exe」という実行ファイルがあります。
これを実行すると以下のようなダイアログが出ます。「はい」と答えてリセットします。その後にさきほどと同じファイルを同様に再生するとどうなるでしょうか。

Use44Khz

↓use44khz.exe後に1Hz〜20kHzのスイープ信号を再生
Freq-Adv-Z3-Sweep-After

↓use44khz.exe後に普通の楽曲を再生
Freq-Adv-Z3-Perfume-After

use44khz.exe前は再生できなかった20kHzまでの高域が再生可能となっています。

スイープ信号の11kHz以上再生時に聞こえた折り返しの音も聞こえません。
明らかに音質が向上しています。

ZERO3音質補完計画にあるGSM610.DLL導入も試してみました。

↓GSM610.DLL導入後に1Hz〜20kHzのスイープ信号を再生
Freq-Adv-Z3-Sweep-Gsm610-After

↓GSM610.DLL導入後に普通の楽曲を再生
Freq-Adv-Z3-Sweep-Gsm610-Perfect

聴感上も特性上も有意差を感じませんでした。
やる必要は無いものと思います。

「EnableLowPassFilterは低音をカットするフィルターのよう」という説明がありますが、ローパスフィルタといえば実際は逆で高音をカットするフィルタです。サンプリングレート44.1kHz時20kHz、サンプリングレート22kHz時11kHz以上の雑音の領域を切り落とす働きをするものと思います。
サンプリングレート22kHz時にEnableLowPassFilter 0をやると雑音が聞こえそうです。

Advanced/W-ZERO3[es]音質まとめ

・デフォルトはサンプリングレート22kHzで音が悪い。
・\Windows\use44khz.exeを実行&リセットするとサンプリングレートが44.1kHzになり音が良くなる。
・use44khz.exeを実行&リセットすればGSM610.DLLの導入は不要

ただ、位置づけとしては隠し設定になっていることから、何らかのデメリットが発生しておかしくないです。

Advanced/W-ZERO3[es]の音はいいか?

use44khz.exe&リセット後は、不満を持つ人が少ないであろうレベルです。

use44khz.exeは旧機種で有効か

use44khz.exeは以下のレジストリを書き換えるだけのようなので、旧機種では無効でしょう。
また、実際に移植した人の話では、実行できないそうです。

HKEY_LOCAL_MACHINE\Drivers\BuiltIn\WaveDev\ShConfig\Use44kHz

オマケ:京ぽん2(WX310K)の周波数特性

Advanced/W-ZERO3[es]への機種変更で灰ロムと化した京ぽん2ことWX310Kの周波数特性も見てみました。

Freq-Kyopon2-Sweep

一度聴いて二度とヘッドホンをつなぐのをやめた、スカスカ音の実態がこれです。

|

2007.07.18

[Emacs]jsSellServerを使ってFirefoxとEmacsでJavaScript開発

Firefoxのアドオンをあさっていたら、jsShellServerという興味深いものを見つけた。

jsShellServer (JavaScript Shell Server)は、Firefox用のアドオン。
Firefoxで表示中のページに対して、XULで実装されたJavaScript ShellからJavaScriptを適用できる。
手動版GreaseMonkeyみたいな感じ。
Firefoxの中で閉じた形で使うこともできるが、これの素晴らしいところはEmacsからFirefoxに対してリモートでJavaScriptを実行させられるところ。
Emacsで「alert('test');」などと書いて、行末でC-c C-eとすると、Firefoxでダイアログが表示されるといった具合。

Mac OS X下、Carbon EmacsとFirefoxで動作を確認。

導入

導入は基本的には「Installation」に書いてある通り。

jsShellServer」からアドオン「shellserver.xpi」をFirefoxにインストール 。

js-mode.el」をダウンロード。ページ一番下の「Download in other formats」の下にある「Plain Text」からダウンロードできる。

js-mode.elをload-pathの通ったところにコピー。

.emacs.elに以下を追記。

;;;;;;;;;;;;
;;Sweet Sweet javascript mode
(add-hook 'javascript-mode-hook
'(lambda ()
(js-mode)
(turn-on-lazy-lock)
(c-set-style "ellemtel")))

;(add-hook 'javascript-mode-hook 'js-mode)
(autoload 'js-mode "js-mode" nil t)

FirefoxとEmacsを再起動。

使い方

Firefoxのメニュー「ツール>Javascript Shell Server」を実行。

「Start ShellServer」ボタンを押す。

このままだとJavaScriptの実行対象(Scope)はJavaScript Shellなので、「enumerateWindows()」ボタンを押して、Window(Tab)の一覧を得る。リンクが現れるので、実行対象にしたいものをクリック。

「Scope is now〜」と実行対象が切り替わった旨メッセージが表示される。

Emacs起動、「M-x js-connect」を実行。デフォルトのポート、4007で確定。「M-x js-mode」を実行。

Emacsで適当にJavaScriptのソースを書いて行末にカーソルを持っていき、C-c C-e、これで実行。そのほかの操作はC-h mを見るか、「js-mode.el」の冒頭を参照のこと。

FirefoxのJavaScript Shellの最下段のフォームにもJavaScriptを入力可能。行末でEnterを素早く2回押すと実行可能。Ctrl+上下で実行したJavaScriptのヒストリをたどることも可能。

関連URL

MozLabに含まれているMozReplというのもこれヤバいな。Firefoxにtelnet接続できるそうで。
しかも、Emacsからも接続できるよう、Elispが提供されている。
なおかつ、コマンドラインからMozRepを経由してFirefoxにJavaScriptを実行させるfresnoというコマンドを作った方もいらっしゃる。
これはやばすぎる。今回書いたJavascript Shell Serverもいいと思ったけど、MozReplが決定版ということになりそう。
http://dev.hyperstruct.net/trac/mozlab

Firefoxの拡張MozLabの中に含まれるMozReplがヤバすぎる件について - 最速インターフェース研究会
http://la.ma.la/blog/diary_200609280045.htm

JavaScript Shells - mozilla developer center
http://developer.mozilla.org/en/docs/JavaScript_Shells

Javascript ShellServer for Emacs - The Unwashed Meme
http://the.unwashedmeme.com/blog/2005/06/02/javascript-shellserver-for-emacs/

jsShellServer - Trac
https://trac.acceleration.net/JsShellServer

Extensions Developer's Extension
http://ted.mielczarek.org/code/mozilla/extensiondev/

JavaScript Shell - www.squarefree.com
http://www.squarefree.com/shell/

JsShellServer - Trac - malblue.tumblr.com
http://malblue.tumblr.com/post/4679983

|

2007.07.12

Flockからココログに投稿

ブログエディタ内蔵のブラウザということで、Flockを試してみた。

ココログにも無事投稿できた。

Add new blogで入力するURLは、APIのURLではなくて、「http://moyashi.air-nifty.com/hitori/」だった。

APIはATOM、MetaWeblog、MovableTypeから選択できるが、ココログではMovableTypeを選択。
ATOMでは全然、MetaWeblogではカテゴリが反映されなかった。

flickrのアカウントを持っていると、エディタにローカルの画像をD&Dでflickrに画像をアップしつつ、記事に画像を貼り込める。

flickr等でアップしている画像を一覧表示できるMedia Barというものがある。

Media Barを表示して画像をD&Dで、Flickrにアップロードできた。
複数画像をD&Dしたら連続的にアップロードできた。

普通のフォームにMedia BarからD&Dすると、imgタグが貼り込まれる。

flickrとココログを連動させるなんて考えていなかったけれど、これはかなり快適だ。


ただ、ブログエディタで改行を有効にする方法が無いようだなぁ。どうにかならないものか。
トラックバックもpingもできないみたいだから、内蔵ブログエディタを普段使いするかというと微妙かも。

|

« June 2007 | Main | August 2007 »