ClojureからのAndroidでHello World

おひさしです。

学会発表や課題の山をくり抜けて最近やっと時間出来たことと, なんか突然ClojureAndroidを弄るインスピレーションに駆られてタイトルのようにClojureAndroidを動かせるようにしましたよ的な。 以下が参照したページです。

簡単な出来合いのHello Worldエミュレータで動かせるようにするところまで今回掲載したいと思います。 Leiningenが使える前提で話を進めていきます。ちなみに私の環境はMacの10.7です。

まず必要なもの

以下から手順です。

今までAndroidの開発を行ってきたことがない方は, 上のリンクからSDKをダウンロードしてきて適当なところに置いてください。

~/.lein/profiles.clj に以下を記述します。

{:user {:plugins [ [lein-droid "0.2.0"] ]}}

次にプロジェクトを作ります。

$ lein droid new clojuroid org.stuff.clojuroid :activity MyActivity :target-sdk 17 :app-name ClojureMeetsAndroid

生成されたプロジェクトのproject.cljを編集します。 以下のように:sdk-pathのコメントアウトを消して, パスをあなたがSDKをおいてある場所に書き換えます。

[project.clj]  
:sdk-path "/SDKまでのパス/adt-bundle-mac-x86_64-20131030/sdk/"

このままだと後ほどkeystoreがどうのこうのと怒られるので, 今のうちに書き換えましょう。 同じくproject.cljです。コメントアウトをはずしてパスを設定してください。パスはMacの場合恐らく以下になります。(Linuxだとそのままでいいんだと思います。) あと, もしかしたら絶対パスの方がいいのかもしれません。

[project.clj]
:keystore-path "/ホームディレクトリ/.android/private.keystore"

このへんでlein depsしておきましょう。プロジェクトを作成した段階で依存関係は全てproject.cljに記述されてますので便利なものです。

$ lein deps

これでclojureの環境は揃いましたね!

次にエミュレータで実行するために必要な手順を踏みます。 今までにAVD作ったことがある人は飛ばして大丈夫だと思います。 まずtarget-versionを確認するために以下を実行してみてください。

$ android list target

ズラッと色々出てきましたね。 現在のところライブラリ的に17以上じゃないと面倒が増えるようです。 そのためandroid-19の部分に着目してください。id が 5と振られていますね。

次にAVDを作りましょう。 名前はsample_avdとします。それと上記の5というidを使います。

$ android create -n sample_avd -t 5

これでAVDが作れました。 これでエミュレータの実行もできます!

$ emulator -avd sample_avd

ここでようやく, Hello Worldができます。

以下を実行してください。コンパイルから何から何までやってくれます。

$ lein droid doall

もし細かい内訳が知りたかったら, ページ上部の参考のTutorial見てください。 これでドロイド君がぐるぐるしてるClojureロゴを持っていて, その後にHello from Clojure! と出たら無事起動出来たことになります! さてさて, これでclojureAndroidアプリ作れますね。 それでどうやってインターフェース周りをプログラムするのだろう。

ClojureからRedisを扱う(with Carmine)

こんにちは。
今回はClojureからNoSQLのRedisを利用する環境をどうこうしていたのでここにメモしておこうと思います。
ちなみにNoSQLを扱うのは初めてです。今までMySQLでやりくりしてきたのですが, 対話システムを構築している上で書き込みと参照処理が高速のものが必要になったので, Redisを試してみようと思います。
ちなみに対話のログを残す部分で使おうと思っています。堅牢性はある程度は犠牲にしてもいいというトレードオフで速さを得たことになりますね。
ではさっそく行きましょう。

$ redis-server
...省略...
... The server is now ready to accept connections on port 6379

Redisが起動しましたね。デフォルトでは6379のポート番号で起動されるみたいです。

簡単にRedisを試してみます。別のタブで開いてRedis付属のクライアントから操作してみます。

$ redis-cli
redis 127.0.0.1:6379> set a "B"
OK
redis 127.0.0.1:6379> get a
"B"
redis 127.0.0.1:6379> set 日本語 "カナ"
OK
redis 127.0.0.1:6379> get 日本語
"\xe3\x82\xab\xe3\x83\x8a"

以上は簡単なサンプルです。redis-cliから使うと日本語はわかりにくいですが, Clojureから使う分には読める形で表示されるので大丈夫でしょう。 次はリストを試してみます。

redis 127.0.0.1:6379> lpush list "A"
(integer) 1
redis 127.0.0.1:6379> lpush list "B"
(integer) 2
redis 127.0.0.1:6379> lrange list 0 -1
1) "B"
2) "A"

リストの返り値は要素数になっているみたいですね。0 ~ -1で指定することで要素全てを取得できるようです。

次にclojureからcarmineを使ってRedisサーバにアクセスします。

本家githubのページを参考にしてますのでこちらも是非覗いてみてください。 https://github.com/ptaoussanis/carmine

まずproject.cljの:dependenciesに以下を追加します。

[com.taoensso/carmine "2.2.1"]  ;(現時点での最新 2013/09/30)

次にredis.cljを用意して以下のスクリプトを書き込んでみましょう。

(ns redis  
  (:require [taoensso.carmine :as car :refer (wcar)]))  

(def server1-conn {:pool {} :sepc {:host "127.0.0.1" :port 6379}})  
(defmacro wcar* [& body] `(car/wcar server1-conn ~@body))

(defn setter  
  [key value]  
  (wcar* (car/set key value)))  

(defn getter  
  [key]  
  (wcar* (car/get key)))  

(defn add-list
  [key value]
  (wcar* (car/lpush key value)))

(defn all-list
  [key]
  (wcar* (car/lrange key 0 -1)))

ソースコードを少し眺めていただくとわかるのですが, Redisのコマンドがそのままの名前で関数名になってるようです。

次に読み込んで, 実行してみます。

=> (use 'redis)
nil
=> (setter "コーヒー" "美味")
"OK"
=> (getter "コーヒー" )
"美味"
=> (add-list "mylist" "value1")
1
=> (add-list "mylist" "value2")
2
=> (add-list "mylist" "value3")
3
=> (add-list "mylist" "value4")
4
=> (add-list "mylist" "こんなものか")
5
=> (all-list "mylist")
["こんなものか" "value4" "value3" "value2" "value1"]

リストの後ろに要素を詰めて行きたければrpushを使うだけですね。
とりあえずリストを使いたいだけなのでサンプルはこれだけですが, 他にsetやsorted-setなどのデータ構造が扱えるはずです!

また今度簡易な処理速度の比較も行ってみたいと思います。

おいしいClojure入門, データ解析のための統計モデリング入門一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

気になった本, 気になってる本, ということで池袋にある, あのでっかい本屋さん(ジュンク堂)に土曜日に立ち寄ってきたんですけど, そこで個人的に気になった2冊の本について書いてみようかなと思いました。

おいしいClojure入門 (Software Design plus)

おいしいClojure入門 (Software Design plus)

目に止まったので買ってしまいました。(その瞬間ではラスト1冊でした、ごめんなさい!
まだ完全に全部読んでいるわけではないのでざっくりの紹介です。読んでて気になった部分があればまたブログとして何か書きたいと思います。

まずタイトルに"入門"の文字列が入っていますけども, 内容としてはClojureの様々なライブラリについて簡単な紹介をしているだけなので, 普通の入門本のモチベーションで買うには危険かなと思いました。

中身は様々なライブラリに関して簡単な紹介(基本的にはライブラリのgithubのページにあるサンプルと同様のものだったりする)に留まっているだけなのが少し残念な気もしますが, その分本当にたくさんのライブラリについて触れられているので, 好奇心がくすぐられる感じがします。

Clojureが好きで, ある程度触れている方は興味を持つのではないのかな, と思います。

個人的に興味深かったのは, ニューラルネット遺伝的アルゴリズムのライブラリ, 音声合成や音声認識のライブラリについての紹介があったことですね。

上記のようにマイナなものを含めてWeb関係やデータベース関連などの王道的なものまであるので, 紹介されている対象の分散はかなり広いと感じました。

ただ反面, このような書籍で大切になるだろう目次が分かりにくくて機能しないのが難点ですね。本の最後にある索引にお世話になる本なのでしょうきっと!!
さーっと流し読みしてるとなかなか楽しいですよ!

なので対象読者はなんだろう, Clojureで用意されているライブラリで何ができるのか, そしてそれらで色々やってみたい人向けという位置づけでしょうか。人によってはここから世界が広がっていく人もいるかもしれません。自分の場合はNoSQLの一つであるRedisに興味を持ちました。

こっちの本は統計ですね。まだ買ってないのでこれから買いたいなーというところです。 買いたかったけど学生のお財布では...というこの現実!!

主にゼミの同期が最近, 一般化線形混合モデルについて五月蝿いので興味が湧いたというところです。

軽く立ち読みしただけですが, 全体的には, 結構わかりやすく書かれていたと思います。ステップバイステップで進んでいくオーソドックスな進め方ですね。難しい記述を嫌ってわかりやすさを目指していたことが感じ取れる好印象の本でした。

一般化線形混合モデルについてですが, 自分のイメージとしては固定効果を明示的にとりいれることで, できるかぎり様々な固定効果の集積であるランダムエフェクトを外すことを目的としているという認識です。 感覚的にはどこか分散分析に近いものを感じます。恐らくそれを含む形で抽象化されているのでしょうけど。

答え合わせはまた書籍を読み終わったらしたいと思います。

そういえばClojureと統計といえばIncanterですけど, 9ヶ月前あたりにt検定を扱っていた時に "あれ?Rと結果がぜんぜん違うぞ!" となっていたりしました。その時にIncanterのソースを覗いたら"誰か頼む"みたいなことが書いてあったような気がします。もっともうろ覚えですが。

そのうちもう一度覗いてみたいと思います。

それとそのうち構文解析+形態素解析をするCaboChaをClojureから(できればJavaからも)使ってどうこうするコードをgithubに投げてみようかと思います。

それではまたそのうち。

/usr/local/ か /opt/local/か, それが問題だった

mysqldumpを使おうと思ったら,

mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/opt/local/var/run/mysqld/mysqld.sock' (2) when trying to connect

なんてエラーがでるわけですよ。そのため今日はずっとMySQLと戯れていたわけです。 結果は単純に, MacPortsで以前にインストールしたMySQLが尾を引いてたみたいです。

$ which mysql
/opt/local/bin/mysql
$ which mysqldump
/opt/local/bin/mysqldump

現在は/usr/local/以下にあるMySQLを使ってるんですよねー。 ~/.bash_profile

alias mysql="/usr/local/mysql/bin/mysql"

原因は, 単純に普段のmysqlの使い方では/usr/local/以下にあるMySQLを使っているのに, mysqldumpは/opt/local/以下の方を参照しにいってしまった為, ということでした。 そのため追加で ~/.bash_profile に,

alias mysqldump="/usr/local/mysql/bin/mysqldump"

を書き込みました。

$ source ~/.bash_profile

で再度読み込んでおしまい!

今日は疲れたので, 夕食にイカスミパスタでも食べようと思います。手応えのない不思議な味わいが面白い。

お初に

勧められて"はてな"に登録してみました。

使い方はまだ未定なのでてきとーに。

明日(今日)は早起きして研究会に参加してきます。

今後主に, 対話システムとかClojureとかについて書いていったりするかもしれない。