Hatena::ブログ(Diary)

papamitra RSSフィード

2010-02-20

[][][] ClojureAndroidアプリ

ClojureJVM上で動くのだからもしかしたらAndroidアプリも作れるのではないだろうかと思い、いろいろ調べてみた結果とりあえず入り口には到達できたので備忘をかねて公開。

今回は基本的にeclipseとかandroid-modeは使わずにコマンドラインでいくことにした。(というかandroid-mode動かなかった…orz)


以下androidSDKとClojureインストール済みであることを前提とします。

参考にしたサイトとか書籍

あらかじめこのサイトを参考にしてAndroid用のclojure.jarを作成しておく。


プロジェクト作成

まずは使用できるターゲットの確認。

$ android

android SDK and AVD Manager」が起動するので、Installed Packagesで目的のターゲットがあるか確認する。なければAvailable Packagesからインストール

今回は現在(2010-2-20)最新のver2.1を使うことにする。

プロジェクト作成に必要なターゲットidを確認する。

$ android list target
(中略)
id: 11 or "Google Inc.:Google APIs:7"
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Revision: 1
     Description: Android + Google APIs
     Based on Android 2.1 (API level 7)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: WQVGA400, WVGA854, HVGA (default), WQVGA432, WVGA800, QVGA

ver2.1はid 11であることを確認。

プロジェクトを作成。今回は『初めてのAndroid』に載っているSudokuのプロジェクトを作る。

$ android create project --target 11 --path ./Sudoku --activity Sudoku --package org.example.Sudoku

プロジェクトをClojure用にカスタマイズ

dalvikVM用clojure.jarをコピー。

$ cd Sudoku
$ cp ~/opt/clojure-android/clojure.jar ./libs/

Clojurebuild.xmlダウンロードbuild.xmlから呼ばれるcompile.cljもダウンロード

$ mv build.xml build.xml.org
$ wget http://github.com/remvee/clojurehelloandroid/raw/master/build.xml
$ wget http://github.com/remvee/clojurehelloandroid/raw/master/compile.clj

build.xmlの2行目にあるプロジェクト名をSudokuにしておく。

<project name="Sudoku" default="debug">

同じく18行目のパッケージ名をorg.example.Sudokuにしておく。

    <property name="application-package" value="org.example.Sudoku" />

Sudoku.javaを消して代わりにSudoku.cljを作成。

$ rm src/org/example/Sudoku/Sudoku.java
; Sudoku.clj
(ns org.example.Sudoku.Sudoku
  (:gen-class
   :extends android.app.Activity
   :exposes-methods {onCreate superOnCreate}))

(defn -onCreate [this #^android.os.Bundle bundle]
  (.superOnCreate this bundle)
  (.setContentView this org.example.Sudoku.R$layout/main)
  (let [tv (new android.widget.TextView this)]
    (.setText tv "Hello Android from Clojure!")
    (.setContentView this tv)))

ビルドインストール

自分の環境だとbuild.propertiesに以下を追加してやらないといけなかった。

sdk-folder=/home/hoge/opt/android/platforms/android-2.1
android-tools=/home/hoge/opt/android/platforms/android-2.1/tools
apk-builder=/home/hoge/opt/android/tools/apkbuilder
adb=/home/hoge/opt/android/tools/adb

エミュレータが立ち上がっている状態で、

$ ant install

としてやればコンパイルしてインストールまでやってくれる。

以下エミュレータスクリーンショット。右上にSudokuが追加されている。

f:id:papamitra:20100220100803p:image

上書きインストールant reinstall、削除はant uninstallでできる。

2010-01-30

[][][] slime + swank-clojureではまった

プログラミング Clojure』を買った。

slimeが使えるらしいので環境を構築しようとしたら結構はまったので備忘をかねて記載。


基本的には

http://riddell.us/tutorial/slime_swank/slime_swank.html

ここにあるとおりに進めていけば良かったのだがいざM-x slimeすると

Clojure 1.0.0-
user=> nil
user=> user=> "2010-01-28"
user=> user=> Connection opened on local port  57111
#<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=57111]>
user=> user=> 

こんな感じでどうも接続できていない。

google先生に聞きつつバージョンを変えたりいろいろ試行錯誤してみたが、うまくいかず。

で、最後にたどり着いたのがこれ。

Yes, it was because Debian netbase package had an issue. It by default listens on an IPv6 address.

The solution is to do either of the following:

1. open /etc/sysctl.d/bindv6only.conf and make net.ipv6.bindv6only=0

2. Start Java with -Djava.net.preferIPv4Stack=true

Either of this will work fine

*

書いてあるとおりに/etc/sysctl.d/bindv6only.confを書き換え。

あと.emacs

(setq swank-clojure-extra-vm-args (list "-Djava.net.preferIPv4Stack=true"))

を書いたらなんとか動き出した。