2011年6月20日月曜日
AndroidからAndroidの乗ったロボを操縦する
ABC2011sへ持ってく予定の新作です。
端末がいっぱいあったので、タブレットからAndroid携帯とBluetoothで通信して、
Android携帯からはMicroBridgeを使ってArduinoと通信するといった構成で
遠隔操縦ロボつくりました。
詳細は続きから
2011年6月10日金曜日
Amazonで買えるArduino関連商品
Amazonで買えるArduino関連商品をまとめた
・本体
Arduino Uno
¥2,995
言わずもがな、一番大切な本体。一番最初に買うなら一番オススメ。Unoからドライバを入れないとWinで認識してくれない。Macは何故かモデムとして認識する。
Arduino Fio
¥2,495
Zigbeeとかバッテリーが必要だとかで追加で買う物があったはず。
Netduino
¥3,495
.Net環境で開発ができる変わり種。一番最初に買うのはあまりオススメしないかな。
でもVC#で開発ができて、ステップ実行とかできるのでデバッグがすごく遣り易いらしい。
Seeeduino328
¥3,200
Arduino 互換らしいけど詳しくはしらないな。
Arduinoをはじめようキット
本当はこのキットがオススメなのだが、最近ずっと売り切れになってる。
ブレッドボードやLED等があってすぐに遊べるキットになってる。
・シールド
LCDシールドキット
¥1,980
ちょっと興味があるかな。まんまLCDを表示するためのシールド。
Arduino用ユニバーサル基板 UB-ARD01
¥704
自分で作った回路を載せるための基板
Arduinoイーサネットシールド(microSDスロット付)
在庫切れ
便利。Arduino に有線LANをつなぐ事ができる。ただノイズに弱いのか電源が貧弱なのかモータードライバと一緒にして動かすとリセットがかかってしまい使えない。
サーボ、LEDなら大丈夫だった。
PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01
と組み合わせれば、無線LAN化してArduino とAndroidを繋げられる。
・その他
RBT-001 Bluetooth evaluation kit
Bluetoothをシリアル通信化してくれるキット。技適もとってるから安心。
Prototyping Lab Kit Vol.1
Prototyping Lab Kit Vol.2
正直バラで買ったほうがオススメ。
・本体
Arduino Uno
¥2,995
言わずもがな、一番大切な本体。一番最初に買うなら一番オススメ。Unoからドライバを入れないとWinで認識してくれない。Macは何故かモデムとして認識する。
Arduino Fio
¥2,495
Zigbeeとかバッテリーが必要だとかで追加で買う物があったはず。
Netduino
¥3,495
.Net環境で開発ができる変わり種。一番最初に買うのはあまりオススメしないかな。
でもVC#で開発ができて、ステップ実行とかできるのでデバッグがすごく遣り易いらしい。
Seeeduino328
¥3,200
Arduino 互換らしいけど詳しくはしらないな。
Arduinoをはじめようキット
本当はこのキットがオススメなのだが、最近ずっと売り切れになってる。
ブレッドボードやLED等があってすぐに遊べるキットになってる。
・シールド
LCDシールドキット
¥1,980
ちょっと興味があるかな。まんまLCDを表示するためのシールド。
Arduino用ユニバーサル基板 UB-ARD01
¥704
自分で作った回路を載せるための基板
Arduinoイーサネットシールド(microSDスロット付)
在庫切れ
便利。Arduino に有線LANをつなぐ事ができる。ただノイズに弱いのか電源が貧弱なのかモータードライバと一緒にして動かすとリセットがかかってしまい使えない。
サーボ、LEDなら大丈夫だった。
PLANEX 手のひらサイズ 300Mbps ハイパワー無線LANルータ/アクセスポイント/コンバータ FFP-PKR01
・その他
RBT-001 Bluetooth evaluation kit
Bluetoothをシリアル通信化してくれるキット。技適もとってるから安心。
Prototyping Lab Kit Vol.1
Prototyping Lab Kit Vol.2
正直バラで買ったほうがオススメ。
2011年6月5日日曜日
2011年6月2日木曜日
2011年5月27日金曜日
AndroidとArduinoを使ってチョロQを操縦する ソース公開編
AndroidとArduinoをUSBホストシールドを使って通信するMicroBridgeを利用して
チョロQを操縦するアプリのソースを公開しました。
先人の知恵をお借りすることで簡単に操縦が出来ました。
http://code.google.com/p/iwatan-lab/downloads/list
ArduinoにMicroBridgeのライブラリを追加する方法は
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
を参照してください。
Google Codeで公開しているのはAndroid側のアプリのソースです。
Arduino側のソースはここを参考にさせて頂いているので改変部分のみ公開します。
以下のソースに参考元からコピペで追加してください。
- void setch(byte bb)
- void setbit(byte bb)
- void execpwm()
- void setpwm(int pwm)
- void runpwm()
- void sendpwm()
#include <spi.h>
#include <adb.h>
#define LED 2
// Adb connection.
Connection * connection;
int data[15];
int g = 0;
byte b = B001111;
// Event handler for the shell connection.
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data) {
// Data packets contain two bytes, one for each servo, in the range of [0..180]
if (event == ADB_CONNECTION_RECEIVE) {
char ch = data[0];
Serial.println(ch, DEC);
if (ch < 0x20) {
setbit(ch);
} else {
setch(ch - 0x20);
}
}
}
void setup(){
Serial.begin(57600);
Serial.println("Ready");
pinMode(LED , OUTPUT);
// Initialise the ADB subsystem.
ADB::init();
// Open an ADB stream to the phone's shell. Auto-reconnect
connection = ADB::addConnection("tcp:4567", true, adbEventHandler);
}
void loop(){
// Poll the ADB subsystem.
ADB::poll();
}
ここまでやっておいてなんですが、やはり標準のコントローラーの方が操縦しやすいです。2011年5月26日木曜日
AndroidとArduinoを使ってチョロQを操縦する その2
AndroidとArduinoを使ってチョロQを操縦する
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
上の続きです。
!追記
この記事のソース公開編
TVの音入っちゃってるけど気にしない。
配線を少し綺麗にしました(前のでは切れちゃったから)
アプリ側では複数チャンネルに対応して、チャンネルを切り替えることで
複数台のQステアを操縦することができるようにしました。
また、トグルボタンでターボのオン/オフも切り替えができるようにしました。
これで、Qステアへの充電以外の機能はすべて実装しました。
Qステアも少しドレスアップしちゃいました。
ボディを開けて、LEDを仕込みました。
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
上の続きです。
!追記
この記事のソース公開編
TVの音入っちゃってるけど気にしない。
配線を少し綺麗にしました(前のでは切れちゃったから)
アプリ側では複数チャンネルに対応して、チャンネルを切り替えることで
複数台のQステアを操縦することができるようにしました。
また、トグルボタンでターボのオン/オフも切り替えができるようにしました。
これで、Qステアへの充電以外の機能はすべて実装しました。
Qステアも少しドレスアップしちゃいました。
ボディを開けて、LEDを仕込みました。
2011年5月23日月曜日
AndroidとArduinoを使ってチョロQを操縦する
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
土日試した上の記事をもとにAndroid(IS01)を使ってQSteerを動かしてみました。
IS01には赤外線通信機能がついてはいますが、独自の信号を出すことが出来ないので諦めていましたが、ここに来て思いが再燃してきました。
わざわざIS01を使ったのは1.6でも動くことの確認とIS01だって未来へ行くことができることの証明です!
用意するもの
・日本が世界に誇るHENTAI端末 IS01
・Arduino
・Arduino USBホストシールド
・Qステア
Arduinoが約3000円、ホストシールドが約2500円、Qステアが約1500円なので、合計7000円ほどです。あと動画だとモバブー使ってますが、普通にPCのUSB電源からでも動きます。
ただ、このUSBホストシールドはここを参考にして電源周りをすこし修正しています。
半田をすこし触ったことがある方ならそんなに難しくはないと思います。
自信がない方はArduino用に外部電源を用意する必要があります。
Qステアとは赤外線で操縦するチョロQの事です。通信規格もいろいろな方が解析しているようで、公開されています。
参考にしたのはここです。
あと、Arduinoのスケッチの実装はここを参考にさせて頂きました。
コードはまだ完成していないので今回は載せませんが、比較的簡単に実装できてます。
先人の方々の知恵があるおかげで簡単にQステアが動かせました。
動作のイメージとしては
といった流れです。
ただ、onKeyDownメソッドを使用しているので、長押しを検出するまで時間がかかり、
少し動いたと思ったら止まってしまい、しばらくしたら動き続けるといった少し怪しい動きになってしまっています。
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
土日試した上の記事をもとにAndroid(IS01)を使ってQSteerを動かしてみました。
IS01には赤外線通信機能がついてはいますが、独自の信号を出すことが出来ないので諦めていましたが、ここに来て思いが再燃してきました。
わざわざIS01を使ったのは1.6でも動くことの確認とIS01だって未来へ行くことができることの証明です!
用意するもの
・日本が世界に誇るHENTAI端末 IS01
・Arduino
・Arduino USBホストシールド
・Qステア
Arduinoが約3000円、ホストシールドが約2500円、Qステアが約1500円なので、合計7000円ほどです。あと動画だとモバブー使ってますが、普通にPCのUSB電源からでも動きます。
ただ、このUSBホストシールドはここを参考にして電源周りをすこし修正しています。
半田をすこし触ったことがある方ならそんなに難しくはないと思います。
自信がない方はArduino用に外部電源を用意する必要があります。
Qステアとは赤外線で操縦するチョロQの事です。通信規格もいろいろな方が解析しているようで、公開されています。
参考にしたのはここです。
あと、Arduinoのスケッチの実装はここを参考にさせて頂きました。
コードはまだ完成していないので今回は載せませんが、比較的簡単に実装できてます。
先人の方々の知恵があるおかげで簡単にQステアが動かせました。
動作のイメージとしては
- AndroidのonKeyDownメソッドで上下左右のキー入力を受け付ける
- MicroBridgeを使用してArduinoへ押されたキーの情報を送信
- Arduinoが受信したキー情報に対応する情報を赤外線で送信
- Qステアが勝手に動く
といった流れです。
ただ、onKeyDownメソッドを使用しているので、長押しを検出するまで時間がかかり、
少し動いたと思ったら止まってしまい、しばらくしたら動き続けるといった少し怪しい動きになってしまっています。
2011年5月22日日曜日
AndroidとArduinoをつなぐライブラリMicroBridgeのデモアプリを動かす
Arduino側は File -> Example -> Adb -> Demoのスケッチをそのまま使用します。
Android側のアプリには少し手を加えました。
フォーマッタもmicrobridgeのArduinoに近いフォーマットからAndroidのフォーマットへ変更
MicroBridge.java
・初期化方法の変更
元のソースだとコンストラクタを使ってArduinoとの通信を行うServerを初期化してたのですが、
それをonCreate()へ移動した。理由はなんとなく。
・シークバー周りでの変更
シークバーの最大値を制限するあたりがスマートじゃなかったので、
SeekBar#setMax()で最大値をきって、Arduinoへの信号の送信もString#format()から変更
(String#format()は処理が遅いから)
動作確認した動画
Android側のアプリには少し手を加えました。
フォーマッタもmicrobridgeのArduinoに近いフォーマットからAndroidのフォーマットへ変更
MicroBridge.java
・初期化方法の変更
元のソースだとコンストラクタを使ってArduinoとの通信を行うServerを初期化してたのですが、
それをonCreate()へ移動した。理由はなんとなく。
・シークバー周りでの変更
シークバーの最大値を制限するあたりがスマートじゃなかったので、
SeekBar#setMax()で最大値をきって、Arduinoへの信号の送信もString#format()から変更
(String#format()は処理が遅いから)
seekBar.setMax(180);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
publicvoid onStopTrackingTouch(SeekBar arg0) {
}
publicvoid onStartTrackingTouch(SeekBar arg0) {
}
publicvoid onProgressChanged(SeekBar v, int progress, boolean flag) {
try {
byte[] data = {
(byte) progress, (byte) progress
};
server.send(new String(data));
} catch (IOException e) {<
Log.e("SEEK", e.toString());
}
}
});
Server.java ・Server#addListener()でのエラーに対処 理由は良く解らんが、なぜかMicroBridge.javaで、Server#addListener()を呼ぶと ClassCastExceptionがでたので、とりあえずの対処。 元ソースだとTreeSetを使ってリスナーの管理をしているのだが、 多分Listでも動くだろうと思って変更。 TreeSetを使ったことがないのでなんでClassCastExceptionがでたのか理解は出来なかったけど、 Listにしても問題なかったのでいいのかな? // private TreeSet<serverlistener> listeners = new TreeSet<serverlistener>(); private List<serverlistener> listeners = new ArrayList<serverlistener>();とりあえずこれだけAndroid側のアプリには変更を加えて実行。
動作確認した動画
2011年5月21日土曜日
AndroidとArduinoをUSBホストシールドでつなぐ(非ADK編)
巷はにわかにADK(Android Open Accessory Development Kit)で盛り上がっている中、
自分はN1やNSを持っていない為このBIG WAVEに乗りきれていません。
悔しいのでADKを使わなくてもAndroidとArduinoをつないでBIG WAVEにあやかろうと思います。
準備するもの(ハードウェア編)
非常に簡単にArduinoとAndroidがつながりました。
USBホストシールドはADKでも使うので、もしDesire HDに2.3.4が降ってくるなんて
奇跡が起きたとしても今後使えるので購入しても良いかと思っていた程度でしたが、
意外とこのままでも使い物になるんじゃないかと期待ができそうです。
自分はN1やNSを持っていない為このBIG WAVEに乗りきれていません。
悔しいのでADKを使わなくてもAndroidとArduinoをつないでBIG WAVEにあやかろうと思います。
準備するもの(ハードウェア編)
- Android(できればDesire HD
)
- Arduino Uno
かDeicimila。Megaとかでも動くみたい
- USBホストシールド(スイッチサイエンス、千石電商)
- USBホストシールドをArduino本体とつなぐ連結用のピン
これだけです。USBホストシールドは千石電商の店頭で購入しましたが、
連結用のピンが実装されていなかったので、これは個人でやらないといけなさそうです。
まとめ連結用のピンが実装されていなかったので、これは個人でやらないといけなさそうです。
準備するもの(ソフトウェア編)
- Arduinoの開発環境
- MicroBridgeのライブラリ
今回はArduinoでAndroidのlogcatを表示しようと思うので、特にAndroid側のソフトはつくりません。
Arduinoのライブラリをインストール
MicroBridgeのダウンロードのページ(http://code.google.com/p/microbridge/downloads/list)からMicroBridge-Arduino.zipをダウンロードしてきます。
解凍したらARDUINO/librariesの下にAdbというフォルダ名でソースを配置します。
logcatサンプルの実行
Arduino IDEを起動して File -> Example -> AdbからLogcatを選択して、サンプルを開きます。
開けたらコンパイルして、Arduinoへ書きこむ。
logcatを見る
ターミナルやシリアルモニターを起動して、通信レートを57600に設定する。
そしたら、AndroidとUSBホストシールドとをつなぐとLogCatが出力されてくる。
動作確認した端末の結果
Desire HD 正常に動作した
Optimus Pad デバッグ接続まで行ったが、logcatのメッセージが出力されなかった
Xperia mini pro うんともすんとも言わない
非常に簡単にArduinoとAndroidがつながりました。
USBホストシールドはADKでも使うので、もしDesire HDに2.3.4が降ってくるなんて
奇跡が起きたとしても今後使えるので購入しても良いかと思っていた程度でしたが、
意外とこのままでも使い物になるんじゃないかと期待ができそうです。
2011年5月17日火曜日
Optimus Padのケース
Optimus Padのケースを2つほど試してみました。
レザータイプとラバーコーティングタイプの2つです。
シリコンタイプはしばらく使うとべろべろになっちゃうので論外です。キリッ!
ラバーコーティングタイプ
本体を買うのと同時に買ったやつです。
プラスチック製で意外としっかりとハマる感じです。
手に持った感じサラサラでいい感じです。
・Good
ラバーコーティングタイプのいいところはやはりしっかりした作りです。
あと、重さもそれほど増えず、サイズもほぼ変わらないのがよいです。
・Bad
単体で立てることができないので、何かにもたれるようにしないといけないです。
レザータイプ
革製(人工かな?)でちょっと高級感ある感じ。
入れると本みたいな雰囲気になります。
・Good
高級感ある。単体で画面の保護もするので、かばんに無造作に入れることができる。
単体で立てることができるので動画見る際には便利。
・Bad
でかい。分厚い。重い。ちょっといただけない3拍子です。
あと、致命的なのが、立てるとUSB端子がそのまま刺さらないこと。
開発をやる際にはいただけないです。
あまり種類がないOptimus Padのケースですが、2つほど試してみてやはり、ラバーコーティングタイプがいい気がします。ただ、単体で立てれないので、何かしらグッズが必要そうです。
レザータイプとラバーコーティングタイプの2つです。
シリコンタイプはしばらく使うとべろべろになっちゃうので論外です。キリッ!
ラバーコーティングタイプ
本体を買うのと同時に買ったやつです。
プラスチック製で意外としっかりとハマる感じです。
手に持った感じサラサラでいい感じです。
・Good
ラバーコーティングタイプのいいところはやはりしっかりした作りです。
あと、重さもそれほど増えず、サイズもほぼ変わらないのがよいです。
・Bad
単体で立てることができないので、何かにもたれるようにしないといけないです。
レザータイプ
革製(人工かな?)でちょっと高級感ある感じ。
入れると本みたいな雰囲気になります。
・Good
高級感ある。単体で画面の保護もするので、かばんに無造作に入れることができる。
単体で立てることができるので動画見る際には便利。
・Bad
でかい。分厚い。重い。ちょっといただけない3拍子です。
あと、致命的なのが、立てるとUSB端子がそのまま刺さらないこと。
開発をやる際にはいただけないです。
あまり種類がないOptimus Padのケースですが、2つほど試してみてやはり、ラバーコーティングタイプがいい気がします。ただ、単体で立てれないので、何かしらグッズが必要そうです。
2011年5月2日月曜日
macでjavaのsplitを使うときの注意
macでjavaのsplitを使う際にハマりました。
splitに限らず正規表現での問題なんですが、エスケープ文字が「¥」だと思っていたら、
「\(バックスラッシュ)」じゃないと認識してくれないようで、ハマりました。
多分winの人から見るとわからない問題かもしれないです。
これだと動く
これだとダメ
splitに限らず正規表現での問題なんですが、エスケープ文字が「¥」だと思っていたら、
「\(バックスラッシュ)」じゃないと認識してくれないようで、ハマりました。
多分winの人から見るとわからない問題かもしれないです。
これだと動く
String url = "www.blogger.com";
String[] s = url.split("\\.", 0);
これだとダメ
String url = "www.blogger.com";
String[] s = url.split("¥¥.", 0);
2011年4月29日金曜日
javadocのdocletをEclipceで作る
自分用のメモだけど、javadocのdocletをちょっと作る機会があったのでメモ。
ここを参考にした
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/overview.html
Eclipseだと文字エンコードで怒られなくなる。なんでだろ?
・ListClass.java
ソースに含まれるクラスを標準出力へ吐き出してくれる。
パッケージをデフォルト・パッケージにすると実行時に楽みたい
ここを参考にした
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/overview.html
Eclipseだと文字エンコードで怒られなくなる。なんでだろ?
・ListClass.java
ソースに含まれるクラスを標準出力へ吐き出してくれる。
パッケージをデフォルト・パッケージにすると実行時に楽みたい
import com.sun.javadoc.*;
public class ListClass {
public static boolean start(RootDoc root) {
ClassDoc[] classes = root.classes();
for (int i = 0; i < classes.length; ++i) {
System.out.println(classes[i]);
}
return true;
}
}
・プロジェクトの実行の構成を変える メイン・クラス com.sun.tools.javadoc.Main 引数 -docletpath ${workspace_loc:doclet/bin} -doclet MyDoclet -sourcepath ${workspace_loc:対象になるソース} -subpackages パッケージ名 -private 2011年4月26日火曜日
ByteBufferの速度
ByteBufferはプリミティブな型の数値からbyte配列を簡単につくってくれる。
だけど、ByteBuffer.classの中身を見るとabstractとか使ってたりインスタンス生成したりするので意外とコストがかかる。
なので、自前でビットシフトを使って作ったメソッドを作ってみた。ByteBuffer.classの中身を追った感じは同じ用な考え方で実装してた。
速度を測ってみたら自前でつくったメソッドの方が早く動作した。
・Main.java
ByteBufferと自前でビットシフトをするメソッドで1000000回変換した場合の時間を測定
だけど、ByteBuffer.classの中身を見るとabstractとか使ってたりインスタンス生成したりするので意外とコストがかかる。
なので、自前でビットシフトを使って作ったメソッドを作ってみた。ByteBuffer.classの中身を追った感じは同じ用な考え方で実装してた。
速度を測ってみたら自前でつくったメソッドの方が早く動作した。
・Main.java
ByteBufferと自前でビットシフトをするメソッドで1000000回変換した場合の時間を測定
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
final int LOOP = 1000000;
final int value = 0x12345678;
ByteBuffer buf = ByteBuffer.allocate(16);
buf.order(ByteOrder.LITTLE_ENDIAN);
byte[] dat = new byte[16];
long s_time = System.nanoTime();
for (int i = 0; i < LOOP; i++) {
DataConverter.setValue(dat, 0, value);
DataConverter.setValue(dat, 3, value);
DataConverter.setValue(dat, 7, value);
DataConverter.setValue(dat, 11, value);
}
System.out.println("Convertor:" + (System.nanoTime() - s_time) / LOOP);
for (int i = 0; i < dat.length; i++) {
System.out.format("%02X ", dat[i]);
}
System.out.println();
System.out.println();
s_time = System.nanoTime();
for (int i = 0; i < LOOP; i++) {
buf.putInt(0, value);
buf.putInt(3, value);
buf.putInt(7, value);
buf.putInt(11, value);
// byte[] d = buf.array();
}
System.out.println("ByteBuffer:" + (System.nanoTime() - s_time) / LOOP);
byte[] d = buf.array();
for (int i = 0; i < d.length; i++) {
System.out.format("%02X ", d[i]);
}
}
}
・DataConvertor.java public final class DataConverter {
/** int型のバイトサイズ */
private static final int SIZE_INTEGER = Integer.SIZE / Byte.SIZE;
/** マスク */
private static final int MASK = 0xFF;
public static void setValue(final byte[] dest, final int offset, final int src) {
for (int i = 0; i < SIZE_INTEGER; i++) {
dest[offset + i] = (byte)(src >> Byte.SIZE * i & MASK);
}
}
}
●結果 Convertor:56 78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00 ByteBuffer:130 78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00どちらも出力の形は一緒になったけど、時間に差が出た。 10回やってみた結果。
cnt = 1 Convertor : 54ns ByteBuffer: 139ns cnt = 2 Convertor : 53ns ByteBuffer: 130ns cnt = 3 Convertor : 49ns ByteBuffer: 131ns cnt = 4 Convertor : 50ns ByteBuffer: 134ns cnt = 5 Convertor : 50ns ByteBuffer: 129ns cnt = 6 Convertor : 50ns ByteBuffer: 130ns cnt = 7 Convertor : 52ns ByteBuffer: 131ns cnt = 8 Convertor : 50ns ByteBuffer: 127ns cnt = 9 Convertor : 50ns ByteBuffer: 131ns cnt = 10 Convertor : 50ns ByteBuffer: 131ns
2011年4月24日日曜日
JavaのMapの動作
ちょっとJavaでMapの動作について気になったからテストしてみた。
気になったことはMapに同じキーでputしてからgetするとデータはどうなっちゃうのかなって。
結果としては、Mapはあとから同じキーでputされると以前設定されていた内容に上書きしてくれる。
Javadocにもそう書いてあった。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html#put(K, V)
気になったことはMapに同じキーでputしてからgetするとデータはどうなっちゃうのかなって。
結果としては、Mapはあとから同じキーでputされると以前設定されていた内容に上書きしてくれる。
Javadocにもそう書いてあった。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html#put(K, V)
Mapmap = new HashMap (); map.put(1, "1st"); map.put(2, "2nd"); map.put(3, "3rd"); map.put(4, "4th"); map.put(5, "5th"); map.put(6, "6th"); map.put(1, "いち"); for (int i = 1; i <= 6; i++) { System.out.println(map.get(i)); }
2011年4月23日土曜日
Javaのコールバック
abstractでextendsしたクラスへのコールバック?と、interfaceを使ったコールバックだとabstractの方が早い。
Core-i5で5倍ほど差が出た。
多分Android上だともっと差がでるんだろうかな。
多分Android上だともっと差がでるんだろうかな。
・AbstractThread.java
public abstract class AbstractThread extends Thread implements Runnable {
abstract public void run();
}
・CallbackThread.java
public class CallbackThread extends Thread implements Runnable {
public interface CallBack {
void onCallback(int value);
}
private CallBack lis;
void setCallBack(CallBack listener) {
this.lis = listener;
}
@Override
public void run() {
long startTime = System.nanoTime();
for (int i = 0; i < Main.LOOP; i++) {
if (lis != null) {
lis.onCallback(i);
}
}
long procTime = System.nanoTime() - startTime;
System.out.println("Callback:" + procTime / Main.LOOP + "[ns]");
}
}
・Main.java public class Main {
public static void main(String[] args) {
CallbackThread thread = new CallbackThread();
CallbackThread.CallBack call = new CallBack() {
@Override
public void onCallback(int value) {
// System.out.println(value);
}
};
thread.setCallBack(call);
thread.start();
AbstractThread athread = new AbstractThread() {
@Override
public void run() {
long startTime = System.nanoTime();
for (int i = 0; i < LOOP; i++) {
// System.out.println(i);
}
long procTime = System.nanoTime() - startTime;
System.out.println("Abstract:" + procTime / LOOP + "[ns]");
}
};
athread.start();
}
}
2011年4月12日火曜日
XOOMとOptimus Padを触ってみた
Optimus Padを買いました。
そしたら後輩がXOOMを買いました。
なので、ちょっと触って比べてみた。
・大きさ
XOOMは画面が10.1インチでOptimus Padは8.9インチ。
ただし、寸法的にはXOOMが幅で1センチほど大きいだけ。
大きさとしてはほぼ同じくらいに感じました。
それでも、XOOMはOptimusよりもでかい画面なので、画面周りの枠が細かったです。
・画面
そのサイズの違う画面。
輝度としてはXOOMの方が少し暗い感じ。画面サイズが大きい分でしょうか?
発色としては好みが分かれそうな感じ。
XOOMは少し淡い感じで、Optimusは色がきつい感じな印象でした。
・キーボード
XOOMとOptimus Padでなぜかキーボードの挙動が違いました。
XOOMは入力切り替えに表示される文字が英字キーボード表示時と、数字キーボード表示時は同じだったのですが、
Optimus Padは数字キーボード表示時に半角/全角で選べるようになりました。
見た目は同じなのですが、中身がちょっと違って意外です。どっちが新しいんだ?
・雑感
お昼休みとラーメン屋でちょっと比べただけなのであまり詳しくは観ていないのですが、
ほぼ同じといった印象。
重さで選ぶなら、Optimus。画面の大きさで選ぶならXOOM。
初期出資が少ないのを選ぶならOptimus。維持費で選ぶならXOOM。
といった感じでしょうか。
今度もうちょっと詳しく比べてみようかと思います。
そしたら後輩がXOOMを買いました。
なので、ちょっと触って比べてみた。
・大きさ
XOOMは画面が10.1インチでOptimus Padは8.9インチ。
ただし、寸法的にはXOOMが幅で1センチほど大きいだけ。
大きさとしてはほぼ同じくらいに感じました。
それでも、XOOMはOptimusよりもでかい画面なので、画面周りの枠が細かったです。
・画面
そのサイズの違う画面。
輝度としてはXOOMの方が少し暗い感じ。画面サイズが大きい分でしょうか?
発色としては好みが分かれそうな感じ。
XOOMは少し淡い感じで、Optimusは色がきつい感じな印象でした。
・キーボード
XOOMとOptimus Padでなぜかキーボードの挙動が違いました。
XOOMは入力切り替えに表示される文字が英字キーボード表示時と、数字キーボード表示時は同じだったのですが、
Optimus Padは数字キーボード表示時に半角/全角で選べるようになりました。
見た目は同じなのですが、中身がちょっと違って意外です。どっちが新しいんだ?
・雑感
お昼休みとラーメン屋でちょっと比べただけなのであまり詳しくは観ていないのですが、
ほぼ同じといった印象。
重さで選ぶなら、Optimus。画面の大きさで選ぶならXOOM。
初期出資が少ないのを選ぶならOptimus。維持費で選ぶならXOOM。
といった感じでしょうか。
今度もうちょっと詳しく比べてみようかと思います。
2011年4月8日金曜日
通知バーを消したり出したりする
通知バーを出したり消したりする方法
忘れないようにメモ
忘れないようにメモ
//消す場合 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //出す場合 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
2011年3月27日日曜日
Androidでアプリのサイズを取得する方法
Androidのアプリのサイズを取得する方法をメモ。
IPackageStatsObserverで取得が可能なようです。
ただ残念ながら非公開APIらしく、標準では取得が出来ないようなのでちょっと工夫が必要。
IPackageStatsObserverを使用する方法。
参考サイト リンク1、リンク2
IPackageStatsObserverを使えるようにする方法
IPackageStatsObserverで取得が可能なようです。
ただ残念ながら非公開APIらしく、標準では取得が出来ないようなのでちょっと工夫が必要。
IPackageStatsObserverを使用する方法。
参考サイト リンク1、リンク2
IPackageStatsObserverを使えるようにする方法
- プロジェクトのsrcにandroid.content.pmのパッケージを作成する
- IPackageStatsObserver.aidlとPackageStats.aidlの2つのAIDLファイルをコピーして先のパッケージへ追加する
アプリのサイズを取得する方法
- AndroidManifest.xmlへ<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>を追加する
- 以下のコードで取得が可能
Method getPackageSizeInfo =
packageManager.getClass().getMethod("getPackageSizeInfo",
String.class,
IPackageStatsObserver.class);
getPackageSizeInfo.invoke(packageManager, info.packageName, new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
Log.i("AppSize", "codeSize: " + pStats.codeSize);
}
});
2011年2月27日日曜日
Conversion to Dalvik format failed with error 1
Androidでプロジェクトのフォルダ構成を変更していたら
ネットを調べるとプロジェクトをクリーンするだとか、Javaのコンパイラーのバージョンを変えるといいとかとあったけど、自分の場合はJava Build PathでAndroidのライブラリにチェックが入っていないのが問題だったようだ。
なぜ、チェックが外れたのかは謎。フォルダ構成をいじったのがまずかったのか?
と表示され、コンパイルが通らなくなった。
Conversion to Dalvik format failed with error 1
ネットを調べるとプロジェクトをクリーンするだとか、Javaのコンパイラーのバージョンを変えるといいとかとあったけど、自分の場合はJava Build PathでAndroidのライブラリにチェックが入っていないのが問題だったようだ。
なぜ、チェックが外れたのかは謎。フォルダ構成をいじったのがまずかったのか?
2011年2月22日火曜日
登録:
投稿 (Atom)
