さくらVPSでCassandra 0.7.4にjmxでアクセスする
Attach APIを調べながら、Javaクラス実行時に、MBeanServerにserviceを登録するやり方を調べてみました。*1
そのついでに、Cassandraの健康チェックもできないものかと思い、さくらVPSに設定してあるCassandraにJMXで繋げてみました。
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の状態がわかるようになったので、いろいろ操作をしながら負荷状況を確認したいと思います。
githubを試してみる
ブログのソースをどこかにアップしたく、githubを利用する方法を調べていました。
Windowsでgitを利用する
Cygwinから利用をしてみます。
パッケージの選択
Search欄に「git」を入力し、必要なパッケージをインストールする
インストールしたものは、下記になります。
- git
- git-completion
- git-svn
- 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が表示されました。
WindowsのCygwinからgithubにアクセスしてみる
WindowsのCygwinから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」というツールを紹介しています。
WindowsのEclipseで試したことと、さくら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に関しても確認できればと思います。
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アプリを作ってみましたさんの記事を元に軌跡を追ってみました。
- itproの記事を試してみた(チュートリアル)
- codezineの記事を試してみた
- ここまでで習得、調べたこと
- AndroidでSQLiteを利用する
- ListViewをカスタマイズする
- Google Mapを利用する
中の人のスキル
- 最近、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アプリを動かす方法に関しては、下記のページを参考にしました。
AndroidでSQLiteを利用する
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をカスタマイズする
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()から呼ばれる