2009年 07月 11日

ぼくの親程度の世代だと、インターネット日常でつかうようなことがないので、インターネットの技術がいくらプッシュな技術であっても、全く意味がない。コンピュータを開いて、なんかするっていう、能動的にプルする行動が必要だ。

そういう意味で、手紙、郵便、電話は、まだしばらくは、最強のプッシュ技術なのだと、ウェブフックなんていう少々不毛なことをやりつつ考えた。

gerry++

Android で Hello World するまで

cd ~/project/hello-world-android
android create project --target 3 --path . --activity HelloWorld --package com.example.HelloWorld
ant debug
adb install bin/HelloWorld-debug.apk

次からは

adb install -r bin/HelloWorld-debug.apk


src/com/example/HelloWorld/HelloWorld.java をみると、R.layout.main というのが view に設定されてる。res/layout/main.xml が実体っぽい。適当に書きかえて

adb debug
adb install -r bin/HelloWorld-debug.apk

するととりあえず自動的に起動中のアプリが終了してインストールが走るようになる

ファイルシステム

adb install されたアプリケーションは /data/app に入っている。これは

$ adb shell
# ls /data/app
# exit

とかでわかる

開発

adb shell "am start -a android.intent.action.MAIN -n com.example.HelloWorld/.HelloWorld"

.HelloWorld の部分は AndroidManifest.xml の /manifest/application/activity/@android:name っぽい?

http://gist.github.com/145085 Rakefile

Scala, ant

ant の compile タスクを修正して scalac が走るようにする。

カレントディレクトリの tools 以下に scala-compiler.jar を、libs 以下に android-library.jar をおいて

build.xml の最後に

    <target name="compile" depends="dirs, resource-src, aidl">
        <javac encoding="ascii" target="1.5" debug="true" extdirs=""
            srcdir="gen"
            destdir="bin/classes"
            bootclasspath="${android-jar}">
        </javac>

        <javac encoding="ascii" target="1.5" debug="true" extdirs=""
            srcdir="src"
            destdir="bin/classes"
            bootclasspath="${android-jar}">
        </javac>

        <taskdef resource="scala/tools/ant/antlib.xml" classpath="tools/scala-compiler.jar:libs/android-library.jar" />
        <scalac
            force="changed" deprecation="on"
            srcdir="src" includes="**/*.scala"
            destdir="bin/classes">
            <classpath>
                <pathelement location="${android-jar}"/>
                <fileset dir="libs" includes="*.jar"/>
            </classpath>
        </scalac>
    </target>

を書く、これだと scala-library.jar の変換で死ぬので

$SDKHOME/platforms/android-1.5/tools/dx 

に javaOpts="-Xmx512M" とか書くととりあえず通る。20秒ぐらいかかる

2009年 07月 07日

本当にコード書くのが遅くて困る…… もともとプログラムを早く書くのが得意とはいえないが、それにしてもひどいだろう。気が落ちている。

Scala で書いてる個人的なアプリケーションは、今月中にどこかでリリースしたいなぁ。書こうと思ってから数ヶ月経っているわけだし…… しかし仕事も詰まってる。

仕事で Perl, JS, AS と書いて、個人的に Scala, Ruby をそれなりに書く生活が続いてる。飽きなくて良い。それぞれ良いところ、使い所があると思う (好き嫌いはあるけれど……)。


僕は最近 Scala が結構いいと思っていて、なんでかっていうと

  • 変数に型がある。コンパイル時にそれなりに考慮される (安全)
  • 必要以上に型を書く必要がない (型推論)
  • 既存の資産の上に乗っている (Java)
    • Java のクラスはいまいち使い勝手がよくないけど……
  • 関数型的にも、オブジェクト指向的にも書ける (TIMTOWTDY)
    • 逆に、Scala のコードを全てちゃんと理解しようとするならどちらも知ってないといけない
  • implicit def
    • 安全なオープンクラスのようなもの

あたりが気にいってる。十分に書きやすいなら、型がついていたほうが安心できていいし、Java という巨大な既存資産を無駄にしない姿勢が好きだ。

一方で、LL として使おうとするとちょっとやりにくい部分もある。

  • コンパイルが遅い (かなり遅い)
  • 正規表現リテラルがない
    • メタキャラクタをエスケープするかしないかでとても重要
    • """regexp""".r とか書きたくない
  • LL なら普通はあるようなメソッドがない。あるいは名前が違う
    • replace (search:Regex, replace:(Matcher => String)) みたいなのとか……
    • List#join 的なものは mkString という高機能なものになっている
  • scaladoc がダメすぎる
    • 書きなおそうと思ったら scaladoc がそもそもビルドできなかった……

簡単なスクリプトを書くような分野には向いてないと思うけど、軽めのウェブアプリケーションとかだとちょうどよくて、Java と LL の中間ぐらいにピッタリとハマる言語だと思う。

また女生徒読んだし……素で泣くし……

Ruby っぽいブロックのとりかた

object Main extends Application {
	def rubylike (s:Int, e:Int)(f:Int => Unit) = {
		(s to e).foreach { i =>
			f(i)
		}
	}

	rubylike(1, 10) { i =>
		println(i)
	}
}

部分的にカリー化して最後に関数をひとつだけとるようにすると、いい感じに書ける

2009年 07月 06日

ケータイのメールで起こされる夢をみた。なんか女の子からメールがきて、とても切ない気分になった。ふと時刻をみると昼の11時で、「やばい、遅刻だ!!!」

というところで現実にガバッっと起きて、急いで時計を確認したら、午前4時