/system/lib/libm.so を差し替えて Python が動くようになったというつぶやきを発見。root 化が必要なのと、他のソフトへの影響が心配だったため、自分では試していなかったが、興味深い。
自分の方は、IS01 で Python が動くようになったものの、SL4A の画面から直接動かすことはできておらず不便だったので、root 化せずに何とかしてみることにした。
修正版の libm.so を SL4A の管理下に置いて、LD_LIBRARY_PATH を設定した上で Python を起動すれば、うまくいくはず。SL4A のソースコードを取得して、以下のように修正。
$ hg diff android/PythonForAndroid/src/ diff -r df7231eb4aca android/PythonForAndroid/src/com/googlecode/pythonforandroid/PythonDescriptor.java --- a/android/PythonForAndroid/src/com/googlecode/pythonforandroid/PythonDescriptor.java Fri Nov 19 16:59:52 2010 +0100 +++ b/android/PythonForAndroid/src/com/googlecode/pythonforandroid/PythonDescriptor.java Tue Dec 14 20:37:42 2010 +0900 @@ -105,6 +105,7 @@ values.put(ENV_HOME, getHome(context)); values.put(ENV_PATH, getExtras()); values.put(ENV_TEMP, getTemp()); + values.put("LD_LIBRARY_PATH", getHome(context) + "/../../lib"); return values; } }
次に、android/PythonForAndroid/libs/armeabi/ に、修正版 libm.so をコピー。さらに、PythonInProcessInterpreter.java は使用されていないようなので、ビルド対象から除外した上で、eclipse を使ってビルドした。
PythonForAndroid.apk ができあがったので、adb uninstall com.googlecode.pythonforandroid として元の版をアンインストールしてから、adb install PythonForAndroid.apk でインストール。これにより、/data/data/com.googlecode.pythonforandroid/lib/ に修正版 libm.so がインストールされ、LD_LIBRARY_PATH もこのディレクトリが設定された状態で Python が呼び出される。
SL4A のサンプルスクリプトを早速試したところ、ばっちり動作した。
IS01 で Python と Vim を動かすための設定のまとめ。
まずは、「MobileHackerz再起動日記: au IS01をデバッグモードで接続しbusyboxをインストールする」に従い、busybox をインストール。次に、「AndroidでVimを使う。 - rattcvの日記。」に従い、Vim をインストール。
次に、SL4A の Python をインストール。limb.so を、adb 等を使って ~/lib にコピーし、chmod 755 libm.so を実行。
ConnectBot の「ログイン後の自動実行」には以下のように設定。
export USER=ken export HOME=/data/home/$USER export LANG=ja_JP.UTF-8 cd /data/busybox/clear exec /data/busybox/bash
.bashrc は、以下の通り。
export PS1='\[\e]0;\w\a\]\n\[\e[32m\]$USER@\h \[\e[33m\]\w\[\e[0m\]\n\$ ' export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python export PYTHONPATH=/sdcard/com.googlecode.pythonforandroid/extras/python export PATH=$PATH:/data/busybox:$PYTHONHOME/bin export LD_LIBRARY_PATH=$HOME/lib export VIMRUNTIME=/data/busybox/vimruntime export TERMINFO=/data/busybox/terminfo #export LANG=ja_JP.UTF-8 # History Options # ############### # Don't put duplicate lines in the history. export HISTCONTROL="ignoredups" # Ignore some controlling instructions export HISTIGNORE="[ ]*:&:bg:fg:exit" # Whenever displaying the prompt, write the previous line to disk # export PROMPT_COMMAND="history -a" #alias ls='ls --color=auto --show-control-chars' alias ll='ls -l -a' alias la='ls -a'
これで、ConnectBot から Python と Vim が使えるようになる。ただ、残念ながら SL4A 上から直接 Python を使うことはできず、そのため、SL4A のサンプルスクリプトも動作しない。
ちなみに .vimrc は、以下のようにしてみた。ただ、この Vim は iconv が有効になっていないため、Shift_JIS などのファイルが扱えない。何とかしたいところである。
syntax enable set encoding=utf8 set fileencodings=iso-2022-jp,sjis,euc-jp,utf8 "indent settings set autoindent smartindent set tabstop=4 set shiftwidth=4 set softtabstop=0 "show line number set number set ruler "search settings set incsearch set hlsearch "list mode settings set list set listchars=eol:$,tab:>-,extends:\ "cursor behavior set whichwrap=b,s,<,>,[,]
IS01 で SL4A の Python が起動しないのは、libm.so が原因だと思われるため、libm.so を自分でコンパイルすることにした。
まずは、Ubuntu 10.10 上に、Android 1.6 (donuts) のフルビルド環境を用意する。git, zlib1g-dev, bison, flex, g++, libncurses5-dev, libx11-dev, gperf 辺りのパッケージを追加インストールし、さらに JDK1.5u22 もインストールする。
"Get Android Source Code | Android Open Source" の Installing Repo の項にしたがって、repo を用意してから、以下のコマンドを実行。
$ mkdir mydroid $ cd mydroid $ repo init -u git://android.git.kernel.org/platform/manifest.git -bdonut $ repo sync $ export ANDROID_JAVA_HOME=<JDK1.5u22をインストールしたディレクトリ> $ . build/envsetup.sh
ここで、libm.so を prelinked させないようにするために一部のファイルを修正する。
その後、make を実行。なお、"First Android platform build « CodePainters" にあるように、gcc 4.4 以降は rindex() などの一部の関数宣言が変更されているためにそのままではコンパイルが通らないソースがある。自分の場合は、trace_reader.cpp, dmtrace.cpp 辺りのファイルが引っかかった。それほど数は多くなかったので、string.h ではなく、ソースファイルを修正してコンパイルした。
out/target/product/generic/system/lib/libm.so を IS01 にコピーし、chmod 755 を実行してから、LD_LIBRARY_PATH を設定して python を実行したところ、無事に立ち上がった。ただしそのままでは、環境変数の設定ができていないために、ライブラリが読み込めず、exit() すら使えない。
環境変数を以下のように設定することで正しく動作するようになる。
export PYTHONHOME=/data/data/com.googlecode.pythonforandroid/files/python export PYTHONPATH=/sdcard/com.googlecode.pythonforandroid/extras/python
IS01 で Python を動かそうといろいろ格闘。
まずは、IS01 では動かないと言われている SL4A を実際に試してみた。sl4a_r3.apk をインストールしてから、python_for_android_r1.apk をインストールして実行すると、自動的に必要なファイルをダウンロードしてきて Python 環境がインストールされる。
SL4A から MENU → View → Interpreters → Python 2.6.2 を実行してみたが、"Python 2.6.2 exited." と表示されて、確かに使えない。
Python の実行ファイルは /data/data/com.googlecode.pythonforandroid/files/python/bin にあった。(/data/dataが見えないため、見つけるのに一苦労。) シェル上から実行してみたところ、次のようなエラーが出た。
reloc_library[1302]: 3149 cannot locate '__aeabi_dcmpun'...CANNOT LINK EXECUTABLE
エラーメッセージで検索してみると、SL4A の掲示板(?)が引っかかった。(Issue 307 - android-scripting - Python interpreter doesn't work on Sony Ericsson Xperia X10 - Project Hosting on Google Code) これによると、同じ Android 1.6 の Xperia でも動かないが、Android 1.6 のエミュレータ上では動作するらしい。
次に、自分で Python をコンパイルしてみることにした。
まずは SL4A の Python ソースを hg で取得。
$ hg clone https://android-scripting.googlecode.com/hg/ android-scripting
python/COMPILING にコンパイル方法が書かれているので、それを参考に python/src/hostpython と python/src/Parser/hostpgen を用意してから、Android NDK r5 でコンパイル。
$ export NDK_TOP=~/android-ndk-r5 $ export SYSROOT=$NDK_TOP/platforms/android-5/arch-arm/ $ export PATH=$PATH:$NDK_TOP/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin $ cd android-scripting/python/src/ $ ./configure arm-linux --target=arm-linux --prefix=/home/ken/android_out --host=linux build_alias=arm-linux host_alias=linux target_alias=arm-linux "CC=arm-eabi-gcc -mandroid --sysroot=$SYSROOT" "CXX=arm-eabi-gcc -mandroid --sysroot=$SYSROOT" "LD=arm-eabi-ld -mandroid --sysroot=$SYSROOT" 'BASECFLAGS=-DANDROID -msoft-float' $ make python
posixmodule.c で I_PUSH が定義されていないと言われてコンパイルエラーになったため、とりあえず問題の3行をコメントアウトして、再度 make python を実行。これで Python 本体の実行ファイルだけはできあがった。IS01 にコピーして実行してみたところ、やはり __aeabi_dcmpun のエラーが出てしまった。
なお、クロスコンパイルには以下のサイトも参考にした。
できあがった Python の実行ファイルをバイナリエディタで見ると、__aeabi_dcmpun という文字列の周辺に libm.so という文字列や数学関数の名前がある。そこで NDK の libm.so を調べてみると、確かにこちらにも __aeabi_dcmpun という文字列がある。次に、IS01 から /system/lib/libm.so を取り出して調べてみると、こちらには __aeabi_dcmpun という文字列がなかった。
どうやら IS01 の libm.so はいくつか関数が足りないようだ。
NDK の libm.so を IS01 にコピーして、LD_LIBRARY_PATH を設定して python を実行したところ、今度は次のようなエラーが出た。
prelinked library 'libm.so' mapped at 0x2aaab000, not at 0xafc00000
libm.so を NDK から持ってくるだけでは駄目か。
IS01 で Vim が使えるらしい。
以上のサイトを参考に設定を行い、IS01 で Vim が使えるようになった。ただ、terminfo.zip と vimruntime.zip は、IS01 の unzip では解凍できなかったため、PC 上で解凍し、再圧縮してから IS01 に持って行った。なお、vim20101107 は ruby が使える環境でないと動かないようだ。ruby は使っていないので、vim は 10/27 版をインストールしておいた。
まともなエディタとシェルが使えるようになったので、Python などが使えるようになればもっといろいろと遊べそうだ。
Intel の SSD を買ってから2週間以上経つが、今頃 インテル® Solid State Drive Toolbox というものの存在を知った。Intel の SSD で Trim を有効に使うには、SSD Toolbox の中の Intel SSD Optimizer を使う必要があるらしい。
Windows 7 では、OS が標準で Trim に対応しているのでは?と思い調べてみたところ、MS の AHCI ドライバを使った場合で、非 RAID 構成に限り Trim に対応しているとのこと。しかし、MS のドライバはスリープからの復帰で HDD が見えなくなることがあるので使い物にならない。一方、Intel のドライバだと、Intel Rapid Storage Technology 9.6 からは、非 RAID 構成で Trim に対応しているそうだ。(Intel® Rapid Storage Technology (Intel® RST) ― Is there TRIM support for RAID configurations?)
現在の環境は Trim に対応した構成になっているようだが、念のため、Intel SSD Optimizer も使う設定にしておいた。
GA-X58A-UD3R のスリープからの復帰が不安定な件をもう少し調べてみることにした。
まずは電源の容量不足を疑い、2台付けてあった光学ドライブのうち 1台を外してみたが改善しなかった。今の電源は 12V 出力が 3系統あるので、HDD をそれぞれ別系統につないでみようとも思ったが、ケーブルが足りず試せなかった。もっとも、1系統当たり 19A 使えるらしいので問題ないはずだが。(HDD のスピンアップ電流を調べたところ 2A 程度のようだ。)
電源容量の問題ではなさそうだが、念のため、PUIS (Power Up In Standby) という機能が使えないか試してみた。WD10EADS は、ジャンパーピンで 3-4 を接続すると PUIS を有効にできるようだが、WD20EARS は PUIS の設定に関する記載がない。試しに、3-4 を接続してみたところ(危)、POST 画面では HDD を認識しているように見えたが、Windows 7 では認識されなかった。どうやら WD20EARS でも PUIS の設定は有効だったようだが、起動時から認識されないのならばスリープ復帰対策どころではない。
次に、HDD を 1台 Intel チップセット内蔵の SATA から、外付けチップの JMicron JMB36X 経由につなぎ替えてみた。スリープからの復帰がかなり遅くなったが、今のところ認識の失敗は起きていない。
なお JMB36X は、以前 GA-EX58-UD5 で eSATA をつないだときと同様に、GBB36X として認識されていた。CrystalDiskInfo 3.9.3x を使ったところ、以前とは異なり、温度すら認識されなかった。以前と同じ JMicron の最新ドライバ (R1.17.59) をインストールしてみたところ、今度は S.M.A.R.T. 値が全て正しく取得できるようになっていた。ドライバとして GBB36X を入れる利点は何だろうか。
ところで、Intel チップセット内蔵の SATA コントローラを使う場合、ドライバは MS と Intel のどちらがよいのだろうか。ずいぶん前から疑問に思っているが未だに分からない。と思って、少し調べてみたところ、「Windows7 Professional x64 スリープ状態復帰後、Dドライブが見えなくなる。」というものを発見。なんと、今回のことは MS 製 AHCI ドライバが原因だったか。
インテル® ラピッド・ストレージ・テクノロジー 9.6 をインストールしたところ、完全に問題は解決されたようだ。MS 製 AHCI ドライバを使っていたときは、内蔵 HDD も取り外し可能デバイスとして認識されてしまい、デバイスの取り外しのところに表示されていたが、その不具合もなくなった。JMB36X 経由でつないだ HDD も元に戻して、スリープからの復帰時間も元に戻った。
Android 2.3 が発表された。ソースも公開されたのかと思い、git を使ってダウンロードしてみたが、ソースの公開はまだだった。
git を使って、Android のソースをダウンロードする場合、通常は Get Android Source Code にあるように、git プロトコルでダウンロードするようだが、https でのダウンロードを試してみた。
まずは repo コマンドを用意。
$ cd ~/bin $ wget http://android.git.kernel.org/repo $ chmod a+x
作業ディレクトリを作成。
$ mkdir ~/mydroid $ cd ~/mydroid
git-config(1) を使って、git で使用するプロキシを設定。(http_proxy 環境変数でもよい)
$ git config --global http.proxy http://〜
適当なブラウザで https://android.git.kernel.org/ にアクセスし、サーバー証明書を保存。Firefox の場合、ページ内で右クリック →「ページの情報を表示」→「セキュリティ」タブ → 「証明書を表示」→「詳細」タブ →「エクスポート」→「ファイルの種類」で「証明書パスを含む X.509 証明書 (PEM)」を選択し、適当な名前を付けて保存する。
保存した証明書を git-config で指定する。
$ git config --global http.sslCAInfo git_kernel_org.crt
リポジトリの初期化。
$ repo init -u https://android.git.kernel.org/platform/manifest.git
.repo/manifests/default.xml ファイルを開くと、ファイルの先頭の方に、"git:android.git.kernel.org/" という URL が記載されているので、https: に修正する。
ソースファイルを取得する。
$ repo sync
Google Chrome 8 に PDF ビューワーが内蔵されたということで、少し試してみた。表示やスクロール、検索などはかなり速い。特に検索は見つかった部分のスクロールバーに色が付いて分かりやすい。しかし機能は少なく、しおりやツールバーもない。ローカルの PDF ビューワーに使うには少々足りない。
10年も前に買った AEC-7720UW を再利用することになった。数年前に Ra20 が壊れて起動しなくなり、数ヶ月前に廃棄したが、その際 AEC-7720UW が余っていた。6年半前に買った 160GB HDD をつないだ。
古い測定器の HDD の空きが少なくなったため、HDD を増設したかったのだが、USB は 2.0 ではなく 1.1 なので、USB 接続は使い物にならない。外付け用に SCSI ポートがあるが、今時 SCSI の HDD は簡単には手に入らないので、このような手段を使うことになった。
先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 428通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものが 7通(1.6%)。