awk4j Android サポートは、
コンソールアプリケーションである awk4j を
Androidプラットフォームで動作させるためのフレームワークで、
コマンド実行環境と
SQLite database system への Java JDBC インターフェイスを提供する。
Android プラットフォームをサポートした awk4j により、
AWKスクリプト と Android による マルチリンガル環境での新しいスクリプティングの世界を体験ください。
« サンプル: PrimeNumber.awk »
BEGIN {
number = ARGV[1]
-0 # 求める素数の最大値
print
number " までの素数:" prime(number)
}
function isPrime(n, i) {
if (n == 2) return 1
if (n < 2 || n%2 == 0) return 0
for (i = 3; i*i <= n; i+=2)
if (n%i == 0) return 0
return 1
}
function prime(n, i, s) {
for (i = 2; i <= n; i++)
if (0 != isPrime(i)) s = s " " i
return s
}
Note: awk4j Android サポートは、
コンソールアプリケーション環境をエミュレーションするランチャー。
入力されたコマンドを実行して、 コマンドからの標準出力(stdout) データを表示する。
- コマンド選択ボタン (Spinner: 起動するコマンドの雛形を選択)
- コマンド入力領域 (EditText) 実行:
Enter, Runボタン,
PADのHomeボタンを押下
- 実行結果(stdout) の表示領域
- 標準エラー出力(stderr) は dummy、
標準入力(stdin) は画面からの入力およびリダイレクトは不可
Tip: コマンド入力時の操作
(EditText標準機能)
- マウスクリックして長押し: Cut & Past メニューを表示
- Shift + ↑: カーソル位置から先頭方向に文字を選択
- Shift + ↓: カーソル位置 から後方に文字を選択
- Alt + ↑: 文字列の先頭に移動
- Alt + ↓: 文字列の最後に移動
- 方向キー: フォーカス移動
- Back Space: 直前の文字を削除
インターネットにアクセスして RSS を閲覧、 XMLタグを HTMLに整形して出力する。
sample 2

« サンプル: News3.awk »
BEGIN {
RS="</[^>]+>" #
XMLの終了TAG</?>を行区切りに
}
{ gsub(/\n+/,"")
}
/<title>/ { sub(/^.+>/, ""); title = $0
}
/<link>/ { sub(/^.+>/, "");
link = $0
}
/<description>/ && "" != title {
gsub(/^.+>|<.+/, "")
printf "%s", "<a href='"
link "'>" title
"</a><br>"
$0 "<hr>"
}
Note: 実行結果の表示領域
(stdout) は、
WebVew (WebKit engine)であり HTM (単独の要素も可) を受け付ける。
↑↓でフォーカス移動、 Linkクリックで Androidブラウザが起動する (WebVewの標準機能)。
月齢計算 (unix ツール pom) サンプルの GUI 版。
NASA
の日替わり画像を取得して背景に表示する。
sample 3

« サンプル: Pom3.awk »
:
#
GUI部分のみ抜粋
{ # NASA (Astronomy Picture of the Day)
の画像を抽出
if (sub(/.*<IMG SRC=\"/, "")) {
baseurl = FILENAME; sub(/[^\/]+\.html$/,
"", baseurl)
sub(/\".*$/, ""); imageurl = $0
exit(0)
}
}
END { print "<html><body
link='cyan' vlink='cyan' style='background-color: black; width: 640px; height: 480px; background-image:
url(" baseurl imageurl ");'><h3><a
href='"
FILENAME "'>"
result "</a></h3></body></html>"
}
Tip: WebVew はマウスドラッグでスクロールする。
NASA
の日替わり画像一覧を、 抽出条件を指定して絞り込んで一覧表示する
(awk4j は、 URL指定をストリームとして入力可能)。
Tip: この一覧は件数が多いため全件アクセスとならないよう注意 !
キャンセルするときは、戻るボタンを 2回押す (^^)!)。
Note: 簡易grep機能の絞り込み条件指定
(AWKのコマンドラインからの変数代入機能を使用)
- e : e をパターンとして指定
- v : 結果を反転しマッチしなかった行を選択
- m : m個のマッチした行のあとファイルの読み取りを停止
- fmt : 出力編集フォーマット
- IGNORECASE : 大小文字の区別なしで比較
sample 4

« サンプル: Astronomy.awk »
/href/ && $0
~ e
{
if ("" == v
|| $0 !~ v) {
baseurl = FILENAME; sub(/[^\/]+\.html$/,
"", baseurl)
sub(/href=\"/, "href=\"" baseurl)
gsub("<br>", "")
print
if ("" != m
&& m-0
<= ++output) exit(0)
}
}
« サンプル: Grep.awk »
$0 ~ e
{
if ("" == v
|| $0 !~ v) {
$NF = $NF
if ("" == fmt)
rs = $0 ORS
else
rs = sprintf(fmt, $1, $2, $3, $4, $5, $6, $7,
$8, $9)
if ("" != n)
rs = NR OFS rs
printf rs
if ("" != m
&& m-0
<= ++output) exit(0)
}
}
Note: awk4j のコマンドラインは、
シェルのパイプ("|") と出力リダイレクト(">") をサポートしており、ローカルファイルへの出力も可能。
Note: ローカルファイルへのアクセスは、
アプリケーション・ディレクトリ {home}
以下のファイルについては、セキュリティ制限なしで入出力可能。
${Run} Astronomy e='2008'
m=30
http://antwrp.gsfc.nasa.gov/apod/archivepix.html
>
{home}/archivepix.txt
${Run} Grep e='star'
IGNORECASE=1 {home}/archivepix.txt
Note: 上記、 2つ以上のコマンドを パイプ("|")
で繋ぐこともできる。
${Run} Astronomy e='2008'
m=100
http://antwrp.gsfc.nasa.gov/apod/archivepix.html
| @ Grep e='star'
IGNORECASE=1 -
Note: "@"
は、 Java Class を内部プロセスとして実行させるための呪文
(コマンドラインでの `java Class` 指定に相当する awk4j 拡張機能)。
Android 組み込みの SQLite データベースを、
Java SQL フレームワーク (JDBC) でアクセスするためのインターフェイスで、
android.database.sqlite.SQLiteDatabase へのラッパ (Wrapper ) として実装している。
データベース URL指定によるストリーム入力 および 双方向パイプ(|&)によるDBアクセスが可能。
"jdbc:sqlite:
[${HOME}/databases/] DBファイル名; appId
[ ;; SQL文 ]”
- [ ${HOME}/databases/ ]
DBファイル名
- 接続先のデータベースのファイルパス (ex. webviewCache.db)
- appId
- データベースを使用するアプリケーションを識別する ID.
(複数の android.app.Activity からデータベースを使用する場合に
呼び出し元のコンテキストを識別する)
- ;; SQL文
- DB接続時に実行する SQL文 (オプション)
サンプル 4 (簡易grep) をデータベース化。
sample 5

ローカルDBを初期化する。
${Run} Astronomy -vd=init
Note: 以下の SQL にてテーブルを作成。
print "DROP TABLE archive" |& url;
print "CREATE TABLE archive (link TEXT, title TEXT,
description
TEXT, date TEXT, PRIMARY KEY (link))" |& url;
日替わり画像のインデックスを取得する。
${Run} Astronomy -vd=1
e='.' m=1000
http://antwrp.gsfc.nasa.gov/apod/archivepix.html
Note: 新規分データを追加、既に取得済みなら
メッセージを表示して終了する。
grep で編集フォーマットを指定して出力する。
${Run} Grep e='.' m=50
fmt='%4$s: <a
href="%1$s">%2$s</a>\n'
'jdbc:?:?;;SELECT * FROM archive ORDER BY date DESC'
Note: 編集形式の "%n$s"
は引数リストの番号で、AWK変数 $n、 DBのnカラム に対応しており、 "%4$s": date、 "%1$s":
link、 "%2$s": title を表示する。
Tip: "jdbc:?:?" の値は、
resources/awk4j.properties および
resources/sqlite.properties の規定値を参照する。 この機能により BDMS と
ファイル名に非依存のスクリプト記述が可能となる。
Android本体にはコンパイル機能がないため、
開発環境で事前にコンパイルしておく必要がある。
AWKスクリプトから Androidパッケージへの変換手順は、以下のとおり。
- .awk → .java:
- Java言語用トランスレータ (Awk2Java) で Javaソースに変換
- 変換されたJavaソースを UTF-8 に変換して src フォルダに
(テキストエディタなどで UTF-8, UnicodeサインBOM)なし形式で) 保存
- .java → .class → .apk:
Eclipse + Android
Development Tools Plugin 環境でビルドして実行すると .apk が作成される
#
awk4j-android-src を展開したディレクトリ
+-- bin
awk4jAndroid.apk
# Androidパッケージ
+-- res
strings.xml
# 起動コマンドメニュー定義
:
#
(サンプルで使用するメニューを定義)
+-- src
Astronomy.java
#
トランスレータで変換したサンプルスクリプト
Grep.java
#
(AWKスクリプトは、awk4j-binリリース参照)
News3.java
#
Pom3.java
#
PrimeNumber.java #
:
+-- resources
awk4j-core.jar
# awk4j.jar から Javaホスト言語用クラスを抽出したもの
Note: Java用トランスレータを使用して
AWKスクリプトを Javaソースに変換する。
(詳細は、 awk4j-binリリース MAKEFILE:sample/makead 参照)
トランスレータコマンド
${Awk2Java} [ options ] AWKスクリプト.awk
or
${Awk2Java} [ options ] -srcname 生成するクラス名
--source 'AWKスクリプト'
主なオプション
-include include-dir
インクルードライブラリ ("../lib/include")
-package package-name 出力パッケージ名
("")
-srcname sorce-name クラス名 ("Script")
-d
output-dir
Javaソース出力ディレクトリ ("")
or
> output-script-file
リダイレクトで出力