awk4j (AWK for Java Platform)

Android サポートとは

Android (アンドロイド) は Mobile Device 向けのオープンソースのプラットフォームです。

awk4j Android サポートは、 コンソールアプリケーションである awk4j を Androidプラットフォームで動作させるためのフレームワークで、 コマンド実行環境と SQLite database system への Java JDBC インターフェイスを提供する。
Android プラットフォームをサポートした awk4j により、 AWKスクリプト と Android による マルチリンガル環境での新しいスクリプティングの世界を体験ください。

さあ始めよう

 Android SDK に、awk4j Android サポートを導入して試す。
  1. Android SDK をダウンロードして適当なディレクトリ(ANDROID_HOME) に解凍。 Android エミュレータを起動して待ち受け画面を表示する。
    ${ANDROID_HOME}/tools/android create avd --target 2 --name NAME  (初回起動時に仮想マシンを作成)
    ${ANDROID_HOME}/tools/emulator -avd NAME  (エミュレータを起動)

  2. awk4j Android サポートをダウンロードして解凍、 エミュレータに awk4j パッケージ(.apk) を導入する。
    ${ANDROID_HOME}/tools/adb install -r [ディレクトリ/]awk4jAndroid.apk

  3. Android デバッグモニタを使用する場合は、 ddms を起動する。
    ${ANDROID_HOME}/tools/ddms

  4. 待ち受け画面上の awk4j アイコンをクリックして、 サンプルアプリケーションを起動する。

  5. awk4j パッケージを削除するときは、 待ち受け画面を表示した状態で、 uninstall コマンドを入力する。
    ${ANDROID_HOME}/tools/adb uninstall org.awk4j.droid

Note: 上記作業においてセットアップ等の作業は不要。 コマンドパス、環境変数を設定しない場合はフルパス指定すればよい。

サンプル 1 (素数を求める)

コマンドラインパラメータで指定された範囲の素数を求めて、 計算結果を 標準出力 (stdout) に出力する、 ごく普通の コンソールアプリケーション。

sample 1
PrimeNumber
${Run} PrimeNumber 1000
« サンプル: 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) データを表示する。

Tip: コマンド入力時の操作 (EditText標準機能)

サンプル 2 (RSS閲覧)

インターネットにアクセスして RSS を閲覧、 XMLタグを HTMLに整形して出力する。

sample 2
News3
${Run} News3 http://pheedo.nikkeibp.co.jp/f/nikkeibpjp_news_it
« サンプル: News3.awk »
BEGIN { RS="</[^>]+>"  # XMLの終了TAG</?>を行区切りに
}
  { gsub(/\n+/,"")
}
/<title>/ { sub(/^.+>/, ""); title = $0
}
/<link>/ {  sub(/^.+>/, ""); link = $0
}
/<description>/ && "" != title {
  gsub(/^.+>|&lt;.+/, "")
  printf "%s", "<a href='" link "'>" title "</a><br>" $0 "<hr>"
}

Note: 実行結果の表示領域 (stdout) は、 WebVew (WebKit engine)であり HTM (単独の要素も可) を受け付ける。
↑↓でフォーカス移動、 Linkクリックで Androidブラウザが起動する (WebVewの標準機能)。

サンプル 3 (月齢計算)

月齢計算 (unix ツール pom) サンプルの GUI 版。 NASA の日替わり画像を取得して背景に表示する。

sample 3
Pom3
${Run} Pom3 http://antwrp.gsfc.nasa.gov/apod/astropix.html
« サンプル: 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 はマウスドラッグでスクロールする。

サンプル 4 (簡易grep)

NASA の日替わり画像一覧を、 抽出条件を指定して絞り込んで一覧表示する (awk4j は、 URL指定をストリームとして入力可能)。

${Run} Astronomy e='2008' m=30 http://antwrp.gsfc.nasa.gov/apod/archivepix.html

Tip: この一覧は件数が多いため全件アクセスとならないよう注意 ! キャンセルするときは、戻るボタンを 2回押す (^^)!)。

Note: 簡易grep機能の絞り込み条件指定 (AWKのコマンドラインからの変数代入機能を使用)

sample 4
Grep3
« サンプル: 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 拡張機能)。

SQL スクリプティング

Android 組み込みの SQLite データベースを、 Java SQL フレームワーク (JDBC) でアクセスするためのインターフェイスで、 android.database.sqlite.SQLiteDatabase へのラッパ (Wrapper ) として実装している。 データベース URL指定によるストリーム入力 および 双方向パイプ(|&)によるDBアクセスが可能。

データベース URL

"jdbc:sqlite: [${HOME}/databases/] DBファイル名; appId [ ;; SQL文 ]
[ ${HOME}/databases/ ] DBファイル名
接続先のデータベースのファイルパス (ex. webviewCache.db)
appId
データベースを使用するアプリケーションを識別する ID. (複数の android.app.Activity からデータベースを使用する場合に 呼び出し元のコンテキストを識別する)
;; SQL文
DB接続時に実行する SQL文 (オプション)

サンプル 5 (DBアクセス)

サンプル 4 (簡易grep) をデータベース化。

sample 5
Astronomy

ローカル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 と ファイル名に非依存のスクリプト記述が可能となる。

AWKスクリプトから Android パッケージへ

Android パッケージの作成

Android本体にはコンパイル機能がないため、 開発環境で事前にコンパイルしておく必要がある。
AWKスクリプトから Androidパッケージへの変換手順は、以下のとおり。

  1. .awk → .java:
    • Java言語用トランスレータ (Awk2Java) で Javaソースに変換
    • 変換されたJavaソースを UTF-8 に変換して src フォルダに (テキストエディタなどで UTF-8, UnicodeサインBOM)なし形式で) 保存
  2. .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  リダイレクトで出力

Android 関連リンク


Android Support
  1. Android サポートとは
  2. さあ始めよう
    1. サンプル 1 (素数を求める)
    2. サンプル 2 (RSS閲覧)
    3. サンプル 3 (月齢計算)
    4. サンプル 4 (簡易grep)
  3. SQL スクリプティング
    1. データベース URL
    2. サンプル 5 (DBアクセス)
  4. AWKスクリプトから Android パッケージへ
    1. Android パッケージの作成
    2. トランスレータ
  5. Android 関連リンク