« [Windows Mobile]ruby-mswinceをAdvanced/W-ZERO3 [es]で使ってみた | Main | [Window Mobile]WX310K(京ぽん2)からAdvanced/W-ZERO3 [es]にアドレスとブックマークを転送 »

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が無いんですが、クリップボードへのアクセスも拡張できるんですかね。

|

« [Windows Mobile]ruby-mswinceをAdvanced/W-ZERO3 [es]で使ってみた | Main | [Window Mobile]WX310K(京ぽん2)からAdvanced/W-ZERO3 [es]にアドレスとブックマークを転送 »