さくらVPSでCassandra 0.7.4にjmxでアクセスする



Attach APIを調べながら、Javaクラス実行時に、MBeanServerにserviceを登録するやり方を調べてみました。*1
そのついでに、Cassandraの健康チェックもできないものかと思い、さくらVPSに設定してあるCassandraにJMXで繋げてみました。
 

前提

  • Cassandraのバージョンは、0.7.4を利用している。
  • iptablesで外部からアクセスできるようにポートに穴を開けた。

 

iptablesの設定

本当は、sshトンネリングで試そうと思ったがどうやらjmxは、「-Dcom.sun.management.jmxremote.port=$JMX_PORT」で
指定したポート番号以外にも任意で、ポート番号を利用するみたいです。仕方ないので、以下の様に許可をだしました。

 $vi  /etc/sysconfig/iptables
      -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp -s *.*.*.* --dport 8080:65535 -j ACCEPT

 
ーs にアクセス元のIPアドレスを指定します。
ーーdportは、jmxremote.portで許可したポート番号(8080)から65535までを利用する許可だと思います。*2

「/etc/rc.d/init.d/iptables restart」コマンドで設定を反映後、設定がされているか確認をします。

 $/sbin/iptables -L
      ACCEPT     tcp  --  *.*.*.*  anywhere            state NEW tcp dpts:8080:65535

 
きちんと、設定内容が表示されていれば、問題はないと思います。
 

Cassandraの設定

cassandra-env.shにjmxの設定があるので、そこで、任意のポート番号を編集します。
86行目辺りに、以下の記述があるので、iptablesのルールで指定したポート番号とあわせておきます。*3

 $vi conf/cassandra-env.sh
  JMX_PORT="8080"

 
設定後、Cassandraを再起動します。
 

ローカルPCからアクセスしてみる

ローカルPCにインストールしているJDKから、JMXアクセスをしてみます。
なお、ローカルPCとサーバ環境のJDKは、JDK6であることが、前提です。*4

リモートプロセスのサービス名は、次のような感じです。

  service:jmx:rmi:///jndi/rmi://*.*.*.*:port/jmxrmi

 
「*.*.*.*」には、監視したいサーバのIPアドレス(Cassandraサービス)、port番号は、jmxremote.portで指定したポート番号(8080)を指定します。
 
jconsoleの概要は、以下のような感じで表示がされます。

 
jconsoleのMBean情報は、以下のような感じで表示がされます。

Cassandraが利用しているJVMの状態がわかるようになったので、いろいろ操作をしながら負荷状況を確認したいと思います。
 


*1:この言い回しであっているか分かりませんが¨

*2:詳しく調べてないがこんな意味だと思う¨

*3:ポート番号の8080はお勧めできないがサンプルなので勘弁してほしい¨

*4:私の環境は、java version "1.6.0_24"です

githubを試してみる



ブログのソースをどこかにアップしたく、githubを利用する方法を調べていました。
 

Windowsでgitを利用する

 Cygwinから利用をしてみます。

 
 パッケージの選択
 Search欄に「git」を入力し、必要なパッケージをインストールする

 
インストールしたものは、下記になります。

  1. git
  2. git-completion
  3. git-svn
  4. gitk

 

Windowsでとりあえず、gitを試してみる

Cygwin版Gitの環境構築を参考にいろいろコマンドを実行してみました。

#Subversionリポジトリの作成
mkdir ~/svn_repos
cd ~/svn_repos
svnadmin.exe create .

#作業用ディレクトリの作成
mkdir ~/work
mkdir ~/work/svnwork
mkdir ~/work/gitwork

#Subversionへコミット
cd ~/work/svnwork

svn checkout file:///cygdrive/d/usr/home/svn_repos/
Checked out revision 0.

cd svn_repos
echo aaaa > file1.txt
svn add file1.txt
svn commit -m"initial"

#Gitへsvn cloneする
cd ~/work/gitwork

git svn clone file:///cygdrive/d/usr/home/svn_repos/

#Gitからsvn dcommitする
cd svn_repos/

ls

echo eeee>>file1.txt

git status

git commit -a

git log

git svn dcommit

#Subversion側で確認

cd ~/work/svnwork/svn_repos/
svn update
svn log
cat file1.txt

 

githubを利用する

なにはともあれ、githubにユーザー登録します。
 

ユーザー登録を行う

 「Create your free personal account」から新規ユーザー登録を実施します。
 

SSH Keysを登録する

 help.githubの「Set Up SSH Keys」ページを参考に、SSH Keysを設定します。
 SSHようのKey設定に関しては、「さくらVPSからgithubに接続してみる」時にキーを作成するのでそこで一緒に登録をおこないます。
 

リポジトリーを作成する

 help.githubの「Create A Repo」ページを参考に、リポジトリーを作成します。

リポジトリーを登録すると下記のような形で、コマンドのチュートリアルが表示されます。

---
全体設定
 ダウンロードおよびインストール Git
  git config --global user.name "happytann"
  git config --global user.email happytann@gmail.com
        
次の手順:
  mkdir blog_source
  cd blog_source
  git init
  touch README
  git add README
  git commit -m 'first commit'
  git remote add origin git@github.com:happytan/blog_source.git
  git push -u origin master
      
すでにGitリポジトリがありますか?
  cd existing_git_repo
  git remote add origin git@github.com:happytan/blog_source.git
  git push -u origin master
      
Subversionのリポジトリを取り込みたい?
  ここをクリック
      
終わったら
  続ける
---

リポジトリーができました。
 

さくらVPSからgithubに接続してみる

Github用のキーを設定する

ssh-keygen -b 2048 -t rsa -f ~/.ssh/github_rsa

 
~/.ssh/configに以下の内容を記載する

Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/github_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

~/.ssh/github_rsa.pubの内容をgithubの管理画面から公開鍵を登録します。
 
「~/test」ディレクトリを作成し、一通りコマンドを確認してみました。

git init
git add test.txt
git commit -m 'first commit'
git remote add origin git@github.com:happytan/blog_source.git
git push -u origin master

 
pushすると下記のようなメッセージが表示されるようです。

Enter passphrase for key '/home/username/.ssh/github_rsa':
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:happytan/blog_source.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

 
公開されている自分のリポジトリーを確認するとtest.txtが表示されました。

リポジトリー


WindowsCygwinからgithubにアクセスしてみる

WindowsCygwinからgithubにアクセスしてみます。CygwinについてくるTerminalだと
日本語表示が不便そうなので「MinTTY」というものをいれてみました。
 

CygwinにMinTTYをインストールする

code.googleからダウンロードできるみたいです。mintty
mintty-0.9.6-cygwin17.zipを解凍し、「mintty.exe」「create_shortcut.js」を「cygwin\bin」に配置します。
その後、create_shortcut.jsを実行し、「mintty」というショートカットを作成します。
 

minttyからgithubにアクセスしてみる

「~/work/gitwork」でgithubの環境をコピーします。
 

git clone git@github.com:happytan/blog_source.git

リポジトリーのコピーができました。「~/work/gitwork/blog_source」
 

$ cd blog_source/
$ ls
test.txt
$ vi hoge.txt
$ git add hoge.txt
$ git commit -m 'second commit'
$ git remote add origin git@github.com:happytan/blog_source.git
$ git push -u origin master

上記のコマンドを実行すると、新たにhoge.txtがpushされたようです。

Enter passphrase for key '/home/username/.ssh/github_rsa':
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 270 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:happytan/blog_source.git
   f90123a..43c0822  master -> master
Branch master set up to track remote branch master from origin.

 
公開されている自分のリポジトリーを確認するとhoge.txtが表示されました。

リポジトリー


Jboss CommunityのBytemanを利用してみる



昨年末に「BytemanによるJava黒魔術」という記事をみて、どうやって実現しているのだろうかと興味津々でした。

「BytemanによるJava黒魔術」では、Jboss Communityの「Byteman」というツールを紹介しています。

WindowsEclipseで試したことと、さくらVPSで動かしているCassandraで実行した内容を書いていきたいと
思います。
 

Bytemanをインストールする

bytemanのDownloadsページからbyteman-1.5.1.zip(byteman binary + docs)をダウンロードします。

まずは、ローカルのWindows環境にダウンロードしたbyteman-1.5.1.zipを任意のパスに解凍しました。

 drive:\usr\local\byteman_1_5_1

docs\ProgrammersGuide.pdfにガイドがあったので、流し読みでながめてみました。
 

EclipseでBytemanを試してみる

試しにBytemanで利用してみるクラスは、下記の通りです。
 
BytemanSample.java

public class BytemanSample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		CoordinatorEngine ce = new CoordinatorEngine();
		ce.commit();
		String value = ce.commit("ce");
		
		ParticipantEngine pe = new ParticipantEngine();
		String value2 = pe.commit("pe");
		
	}

}

 
Engine.java

public interface Engine {
	public void commit();
}

 
CoordinatorEngine.java

public class CoordinatorEngine implements Engine {

	@Override
	public void commit() {
		System.out.println("CoordinatorEngine#commit() do ");
	}
	
	public String commit(String value) {
		System.out.println("CoordinatorEngine#<String>commit(String) do ");
		return new String("bk ce");
	}
}

 
ParticipantEngine.java

public class ParticipantEngine implements Engine {

	@Override
	public void commit() {
		System.out.println("ParticipantEngine#commit() do ");

	}

	public String commit(String value) {
		System.out.println("ParticipantEngine#<String>commit(String) do ");
		return new String("bk pe");
	}
}

 
BytemanSampleクラスのmainメソッドを実行する時にVM引数として以下を付与します。

-javaagent:drive:\usr\local\byteman_1_5_1\lib\byteman.jar=listener:true,script:drive:\usr\local\byteman_1_5_1\rule\rule.txt,boot:drive:\usr\local\byteman_1_5_1\lib\byteman.jar -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.debug

 
rule.txtでは、Bytemanで挿入したい処理(ルール)を記述します。

RULE BytemanSample debug
CLASS jp.co.sample.common.sandbox.byteman.CoordinatorEngine
METHOD commit
AT EXIT
IF TRUE
DO traceln("bytemanDebug()"), traceStack()
ENDRULE

 
実行すると下記の様なログを出力します。

CoordinatorEngine#commit() do 
Default helper activated
Installed rule using default helper : BytemanSample debug
bytemanDebug()
Stack trace for thread main
jp.co.sample.common.sandbox.byteman.CoordinatorEngine.commit(CoordinatorEngine.java:8)
jp.co.sample.common.sandbox.byteman.BytemanSample.main(BytemanSample.java:11)
CoordinatorEngine#<String>commit(String) do 
Installed rule using default helper : BytemanSample debug
bytemanDebug()
Stack trace for thread main
jp.co.sample.common.sandbox.byteman.CoordinatorEngine.commit(CoordinatorEngine.java:12)
jp.co.sample.common.sandbox.byteman.BytemanSample.main(BytemanSample.java:12)
ParticipantEngine#<String>commit(String) do

 
Bytemanでは、下記の様なルールを設定することができます。(# rule skeleton)

No ルール 概要
1 RULE
2 CLASS
3 METHOD
4 BIND
5 IF
6 DO

 
rule2.txtでは、INTERFACEに対して処理を追加します。

RULE BytemanSample debug
INTERFACE jp.co.sample.common.sandbox.byteman.Engine
METHOD commit
AT EXIT
IF TRUE
DO traceln("bytemanDebug()"), traceStack()
ENDRULE

Bytemanの詳しいルールに関しては、まだためし中で良くわかりません。
(いろいろできるみたいですが、読みきれて、試しきれていません)
 

さくらVPSで動かしているCassandraにbytemanを試してみる

wgetでbyteman-1.5.1.zipを取得します。

wget http://downloads.jboss.org/byteman/1.5.1/byteman-1.5.1.zip

 
任意のパスに展開し、Cassandraのenvスクリプトに追加します。
byteman-1.5.1.zipを展開する

unzip byteman-1.5.1.zip
/usr/local/byteman/

 
Cassandraのenvスクリプト(cassandra-env.sh)に追加する

JVM_OPTS="$JVM_OPTS -javaagent:/usr/local/byteman/lib/byteman.jar=listener:true,script:/usr/local/byteman/rule/rule.txt,boot:/usr/local/byteman/lib/byteman.jar -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.debug"

 
rule.txt

 RULE cassandraDebug
 CLASS org.apache.cassandra.thrift.CassandraDaemon
 METHOD setup()
 AT EXIT
 IF TRUE
 DO traceln("bytemanDebug()"), traceStack()
 ENDRULE

 
起動ログ

 INFO 16:02:26,053 Using TFramedTransport with a max frame size of 15728640 bytes.
Default helper activated
Installed rule using default helper : cassandraDebug
bytemanDebug()
Stack trace for thread main
org.apache.cassandra.thrift.CassandraDaemon.setup(CassandraDaemon.java:114)
org.apache.cassandra.service.AbstractCassandraDaemon.activate(AbstractCassandraDaemon.java:217)
org.apache.cassandra.thrift.CassandraDaemon.main(CassandraDaemon.java:134)

上記の例では、「org.apache.cassandra.thrift.CassandraDaemon#setup()」メソッド実行時にbytemanに
処理をトレースさせています。
 

Bytemanの仕組み

Bytemanは、JDK(5以降)の-javaagentというJVMオプションを利用して、処理を実施しているようです。

Instrumentationという処理を利用して実施しているようです。

JavaDocにそれらしい説明がないか探してみましたがみつけられませんでした。
かわりに、「java.lang.instrument」というインターフェイスがあることをみつけました。

IBMのdeveloperworksに「エージェントを作成する」という部分で使い方を説明しているようです。

機会をみていろいろ引き続きいろいろ試してみたいと思います。


Executorsを利用してみる



JDK5から「java.lang.Thread」を直にnewしなくてもスレッドを扱えるようになりました。

Executorsクラスでは、スレッド処理に必要なクラスを生成します。ファクトリの役割を担ってくれてます。
ExecutorService」の実装クラス、「ScheduledExecutorService」の実装クラスを生成します。
 

メソッド)newSingleThreadExecutor()、newFixedThreadPool(int nThreads)、newCachedThreadPool()をみてみる

ExecutorService」の実装クラスを生成するには、3つのメソッドがあります。
 

No クラス名 概要
1 newSingleThreadExecutor 単一スレッドを作成する
2 newFixedThreadPool 固定数のスレッドを再利用するスレッドプールを作成する
3 newCachedThreadPool 必要に応じ、新規スレッドを作成するスレッドプールを作成する。60 秒間使用されなかったスレッドは、終了して、キャッシュから削除される。

java.util.concurrent.Executorsクラスのソースをみてみると、それぞれのメソッドの実装は下記のようになっています。
 
newSingleThreadExecutorの実装

 new ThreadPoolExecutor(1, 1, 0L, 
                          TimeUnit.MILLISECONDS,
                          new LinkedBlockingQueue<Runnable>())


newFixedThreadPoolの実装

  new ThreadPoolExecutor(nThreads, nThreads,
                          0L, TimeUnit.MILLISECONDS,
                          new LinkedBlockingQueue<Runnable>())


newCachedThreadPoolの実装

 new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                         60L, TimeUnit.SECONDS,
                         new SynchronousQueue<Runnable>())


それぞれのメソッドをみてみると、実際の生成は、「ThreadPoolExecutor」クラスで行っています。
 

ThreadPoolExecutorをみてみる

 
ThreadPoolExecutorクラスには、下記のようなコンストラクタがあります。
 

 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 

 
それぞれの引数の意味は、下記の通りです。

No 引数 概要
1 corePoolSize アイドルであってもプール内に維持されるスレッドの数
2 maximumPoolSize プール内で可能なスレッドの最大数
3 keepAliveTime スレッドの数がコアよりも多い場合、これは超過したアイドル状態のスレッドが新しいタスクを待機してから終了するまでの最大時間
4 unit keepAliveTime 引数の時間単位
5 workQueue タスクが超過するまで保持するために使用するキュー。このキューは、execute メソッドで送信された Runnable タスクだけを保持する

 
引数をながめていると自分でいろいろ組み立てることもできそうです。
 

メソッド)newSingleThreadExecutor()、newFixedThreadPool(int nThreads)、newCachedThreadPool()を生成してみる

newSingleThreadExecutorメソッド、newFixedThreadPoolメソッド、newCachedThreadPoolメソッドを利用して
それぞれの実装の仕方をみていきたいとおもいます。
 
まずは、newSingleThreadExecutor()メソッドの利用の仕方をみていきます。

        ExecutorService e = Executors.newSingleThreadExecutor();
        e.execute(new RunnableClass()); 
        e.shutdown();

 
RunnableClass*1クラスをExecutorServiceのexecuteに渡してあげることにより
別スレッドで処理を実行してあげることができます。ExecutorService内で実行しているスレッドを終わらせる為に
shutdownメソッドを呼び出す必要があります。
 
次に、newFixedThreadPool(int nThreads)メソッドの利用の仕方をみていきます。

        ExecutorService e = Executors.newFixedThreadPool(3);
    // RunnableClassで処理を追加していく
        for (int i = 0; i < 5; i++) {
            e.execute(new RunnableClass("Task" + i));
        } 
        e.shutdown();

 
固定数のスレッドを3としているので、3以上のスレッドは作成されません。
実行中のスレッドの上限は、常に3となります。

    java.lang.ThreadGroup[name=main,maxpri=10]
        Thread[main,5,main]
        Thread[pool-1-thread-1,5,main]
        Thread[pool-1-thread-2,5,main]
        Thread[pool-1-thread-3,5,main]

 
最後に、newCachedThreadPool()メソッドの利用の仕方をみていきます。

        ExecutorService e = Executors.newCachedThreadPool();
    // RunnableClassで処理を追加していく
        for (int i = 0; i < 5; i++) {
            e.execute(new RunnableClass("Task" + i));
            try {
                Thread.sleep(1500L);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
        }
        e.shutdown();

60 秒間内ならば、生成された既存のスレッドを利用して、処理を順次実行してくれます。
 
RunnableClassは、下記の様な実装としてます。

    class RunnableClass implements Runnable {
        private String name;

        public RunnableClass(String name) {
            this.name = name;
        }

        public void run() {
            System.out.println(name + " Starts.");

            try {
                Thread.sleep(1000L);
            } catch (InterruptedException ex) {
                System.out.println(name + " is Canceled");
                return;
            }
            System.out.println(name + " is Done.");
        }
    }

 

CassandraDaemonで利用されているExecutorService

Cassandraのソースをみていたときに、org.apache.cassandra.thrift.CassandraDaemonというクラスで
ThreadPoolを作成している箇所がありました。その時に、java.util.concurrentパッケージのExecutorService
クラスが出現し、一度、java.util.concurrentパッケージを眺めて理解しないとソースが理解できなさそうだったので、
確認をしてみました。
 

            // ThreadPool Server
            CustomTThreadPoolServer.Options options = new CustomTThreadPoolServer.Options();
            options.minWorkerThreads = MIN_WORKER_THREADS;

            ExecutorService executorService = new CleaningThreadPool(cassandraServer.clientState,
                    options.minWorkerThreads,
                    options.maxWorkerThreads);
            serverEngine = new CustomTThreadPoolServer(new TProcessorFactory(processor),
                    tServerSocket,
                    inTransportFactory,
                    outTransportFactory,
                    tProtocolFactory,
                    tProtocolFactory,
                    options,
                    executorService);

Cassandraは、結構、thriftのクラスをそのまま利用しているところが多々見受けられたので、
どこかのタイミングでthriftに関しても確認できればと思います。
 


*1:Runnableインターフェイスの実装クラス

java.util.concurrentパッケージを眺めてみる。



 
Cassandraのソースを読んだり、Androidの実装を試したりしているとどうしてもマルチスレッドのプログラミングがでてきます。
java.lang.Threadクラスや、java.lang.Runnableインターフェイスに関しては、その昔、トイプログラムで試したことはあります
がそんなに詳しくありませんでした。
JDK5で、java.util.concurrentパッケージができ、マルチスレッドプログラミングの実装の仕方が変わったようです。
そこで、Cassandraのソースを読んだり、Androidの実装をしていく上で、土台となるJAVAのマルチスレッドプログラミング
について眺めていこうと思います。
 

Executor インタフェース

JDK5のJavadocの引用です。

送信された Runnable タスクを実行するオブジェクト。このインタフェースは、
タスク送信を各タスクの実行方式 (スレッドの使用やスケジューリングの詳細などを含む) から分離する方法を提供します。
通常、Executor は、明示的にスレッドを作成する代わりに使用されます。
たとえば、各タスクセットごとに new Thread(new(RunnableTask())).start() を呼び出す代わりに、以下を使用できます。

説明を読んでも良くわかりませんでした。
 
どんなメソッドを実装する必要があるのか眺めてみます。

execute(Runnable command) 
将来のある時点で指定されたコマンドを実行します。

Runnableを引数にとるexecuteメソッドだけのみみたいです。
 

executor.execute(new RunnableTask());

引数で渡すRunnableの実装が実行内容になります。
 
Executorの実装クラスでは、次のように実装することができます。

実装その1

	public void execute(Runnable r) {
		r.run();
	}

この場合は、そのまま同期実行になります。

実装その2

	public void execute(Runnable r) {
		new Thread(r, "ThreadPerTaskExecutor").start();
	}

別スレッドを生成し、そこにRunnableを渡すことにより、非同期実行を実現することができます。
 
java.util.concurrentパッケージには、その他にもいろいろクラスがあるので、順次使い方を
試していきたいとおもいます。
 


一週間で初めてのAndroidアプリの開発を試してみました。(003SH GALAPAGOS)



もとまか日記さんの一週間で初めてのAndroidアプリを作ってみましたのエントリーを元に
道筋をたどってみました。途中で、codezineに掲載されていたGoogle Mapの虜になりいろいろ試してみました。
 

本エントリーで実施したこと

一週間で初めてのAndroidアプリを作ってみましたさんの記事を元に軌跡を追ってみました。

  1. itproの記事を試してみた(チュートリアル
  2. codezineの記事を試してみた
  3. ここまでで習得、調べたこと
  4. AndroidSQLiteを利用する
  5. ListViewをカスタマイズする
  6. Google Mapを利用する

 

開発環境

一般的な開発環境です。

  1. Eclipse3.6.1
  2. 003SH GALAPAGOS(実機テスト用)

 

中の人のスキル

  • 最近、jdk6までの文法をキャッチアップしていた。
  • モバイルデバイスの開発は、未経験。
  • その昔、AWT・Swingでの開発経験はある。
  • Swingの「Observer パターン」は、なんとなく理解している。

 

itproの記事を試してみた(チュートリアル

とりあえず、一通り記事の内容を試して、動作するものを作成しました。
 
 第4回 簡単なRSSリーダーを作ってみる - Androidで広がる,携帯アプリ開発の世界:ITpro
 第5回 RSSリーダーの要、パース機能を知る
 第6回 詳細画面を付けて、簡易RSSリーダーの完成
 

とりあえず、どうやったら動くか、どういうファイル構成か慣れる為にいろいろ
試してみました。2010年5月頃に一度、試したことはあるのですが当時は全く分からずのことをすっかり忘れていました。
とりあえず、そのまま「moto_maka」さんの記事どおりに進めようと思いました。
 

itproの記事を試してみた

とりあえず、記事に沿っていろいろ試してみました。
レイアウトの作成手順をマスターする!〜速習! Androidアプリケーション開発(3)〜
 


 

ここまでで習得、調べたこと

とりあえず、ここまででつまづいていろいろ調べたことをまとめてみたいとおもいます。
 

003SHをUSBで繋ぐには専用のドライバが必要(っぽい?)

 
 SH Developers SquareからUSBドライバとvirtual deviceをダウンロードし、設定した。
 SHARP共通 ADB USBドライバ
 usb_driver_SHARP_r2.zipをダウンロードし、インストールしました。
 また、「SHARP SDK AddOn」をダウンロードし、インストールしました。
 sharp_addon-JNDK01_r1.zip
 sharp_addon_2_for_API8.zip
 

 android list target
 
 id: 5 or "SHARP Corporation:JN-DK01:4"
 Name: JN-DK01
 Type: Add-On
 Vendor: SHARP Corporation
 Revision: 1
 Description: SHARP JN-DK01 Add-on
 Based on Android 1.6 (API level 4)
 Libraries:
  * jp.co.sharp.android.hardware (hardware.jar)
  * jp.co.sharp.android.io.obex (obex.jar)
  
 Skins: WVGA854, HVGA, WVGA800, QVGA, JNDK01 (default)
 Adds USB support for devices (Vendor: 0x04DD)
 
 id: 10 or "SHARP Corporation:sharp_addon:8"
 Name: sharp_addon
 Type: Add-On
 Vendor: SHARP Corporation
 Revision: 2
 Description: SHARP Add-on
 Based on Android 2.2 (API level 8)
 Libraries:
 * jp.co.sharp.android.hardware (hardware.jar)

      * jp.co.sharp.android.io.obex (obex.jar)

      * jp.co.sharp.android.stereo3dlcd (stereo3dlcd.jar)

     Skins: WVGA854, WQVGA400, HVGA, WQVGA432, WVGA800 (default), QVGA
     Adds USB support for devices (Vendor: 0x04DD)

ついでに「AVD」をコマンドラインで作成をしました。

以下例では、AVD名:SHARP2_8、SDカード容量:128MB、Target ID: 10を指定してAVDを作成しております。

 $ android create avd -n SHARP2_8 -t 10 --sdcard 128M

 $ android list avds
 
 ---------
 Name: SHARP2_8
 Path: C:\Documents and Settings\xxx\.android\avd\SHARP2_8.avd
 Target: sharp_addon (SHARP Corporation)
     Based on Android 2.2 (API level 8)
  Skin: WVGA800
 Sdcard: 128M

前ステップで作成したAVD “SHARP2_8”を指定して、エミュレータを起動します。

 $ emulator @SHARP2_8

実機でAndroidアプリを動かす方法に関しては、下記のページを参考にしました。

実機(xperia)で開発中のアプリを動かす
 

AndroidSQLiteを利用する

codezineの次の記事を元に、いろいろ試してみました。

Androidアプリでのデータベース基礎〜速習! Androidアプリケーション開発(4)〜

はまったこと。記事の「adb.exe実行時の表示例」を元にdatabases配下のsqliteファイルを参照
しようとするが、パーミッションエラーがでてしまう。

 $ adb shell
 
 $ cd data
 cd data
 $ ls
 ls
 opendir failed, Permission denied

いろいろ調べてみると接続するdeviceを選択できるらしい

$ adb devices
List of devices attached
353019xxxxxxx   device
emulator-5554   device

$ adb -s emulator-5554 shell
# cd data
cd data
# ls
ls
misc
local
app-private
anr
backup
property
data
dontpanic
dalvik-cache
app
system
lost+found

無事rootになりdeviceの中にアクセスすることができた。
確認の仕方が分かるとEclipseでファイルエクスプローラーを利用し確認することもできた。

 

ListViewをカスタマイズする

Techfirmさんの記事を参考にカスタマイズしてみました。
ListViewをカスタマイズする

 

Google Mapを利用する

Androidアプリ 実践テクニック」さんの「マルチスレッドでグーグルマップ」を参考に
GoogleMapを利用してみました。

マルチスレッドでグーグルマップ

実際は、ここで3日間ぐらいはまってしまい半分くらいのパワーを消費してしまいました。
 
とりあえず、1週間でこんなことができました。
GoogleMapに関しては、もう少し詳しく掘り下げていきたいと思います。 
 


Cassandra 0.7の「CassandraDaemon」クラスを読む。



thriftのデータオブジェクト「class Column」等を眺めようとしたのだが、
具体的な処理・構造が分かりにくかったので、とりあえずCassandraの起動クラスからクラス図を
作っていくことにした。
 

 

対象パッケージに関して

「org.apache.cassandra.thrift」ぺっケージのクラスを対象としてとりあえず読んでいくことにしました。
 

対象パッケージに関して

cassandra/bin/cassandraのスクリプトをみると「org.apache.cassandra.thrift.CassandraDaemon」
で起動が始まっている。

とりあえず、このクラスを起点に確認していくことにした。
 

実装に関して

「CassandraDaemon.java」は、1つのクラスと1つのinterfaceを実装している。

No クラス名 概要
1 org.apache.cassandra.service.AbstractCassandraDaemon 認証用?
2 org.apache.cassandra.service.CassandraDaemon commons daemonを利用しているようだ


ところどころ、「this is a hook for JSVC」とコメントがあるので、JSVC(commons daemon
で必要なメソッドがある模様。
 
「public interface CassandraDaemon」では、シンプルなinterfaceになっており
importクラスが「java.io.IOException」の為、パッケージ依存があまりない形になっている。
 
「public abstract class AbstractCassandraDaemon」も「protected void setup()」に
処理が実装されていたが、他はシンプルな内容だった。*1
 
「public class CassandraDaemon」では、「org.apache.thrift」系のクラスを利用して
いろいろ処理をしていた。
「org.apache.thrift.server.TServer」クラスが、核のようで、interface 「java.util.concurrent.ExecutorService」
を渡していた。
 
実際のサーバ処理などは、下記のクラスのようでした。

// now we start listening for clients
final CassandraServer cassandraServer = new CassandraServer();
Cassandra.Processor processor = new Cassandra.Processor(cassandraServer);

もう少しいろいろ見ていきたいと思う。
 


*1: setup()は、start()から呼ばれる