takaiwa.net

Android、Java、Web系、Linux、マラソン等の備忘録

2012/12/24

android.widget 既存の操作音を消す

0 件のコメント
忘れがちなのでメモしておきます。
操作にSEを付ける場合、既存の操作音とかぶって邪魔するので消したい時などに。

動的にOFFすするにはwidgetに対して
setSoundEffectsEnabled(false);

xmlファイルでOFFするには、
android:soundEffectsEnabled=false

Eclipseのプロパティでは、「Show Advanced Properties」をクリックしないと出て来ないかもしれません。


追記:2014/10/05

ダイアログなどの場合は、AlertDialogからViewを取得して、setSoundEffectsEnabledをすれば良いようです。

AlertDialog.Builder builder = new AlertDialog.Builder(act);
builder.setSingleChoiceItems(R.array.entries_list, index, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
});

AlertDialog dialog = builder.create();
ListView list = dialog.getListView();
list.setSoundEffectsEnabled(false);
dialog.show();

ボタン操作音の場合は、以下のようにViewを取得します。

Button btn = dialog.getButton(Dialog.BUTTON_POSITIVE); 


参考
android - How to disable system sound effect on AlertDialog? - Stack Overflow http://stackoverflow.com/questions/13952495/how-to-disable-system-sound-effect-on-alertdialog

2012/12/20

背景をandroid:tileMode=”repeat”してるのに突然引き延ばされたようになる

0 件のコメント
ListViewの各項目の背景をdrawableで表題のように繰り返し表示をさせていたのですが、Andoidの2.1の実機で確認したら、それまで繰り返されてたはずの背景が引き延ばされたように表示されるようになりました。以下のような特徴があります。
  • アンインストールしても解消されず
  • 他のアプリではリピートが効いている
  • drawableのxmlファイルを変更しても解消されず
ググったら全く同じ症状の記事発見!
・android:tileMode=”repeat”が効かないケース – CEED
http://blog.ceed.jp/?p=339
確かにキャッシュっぽい感じではあるんですが、それを解く術がわからない.....
Stack Overflowではよくある質問のようで、
・background image not repeating in android layout - Stack Overflow
http://stackoverflow.com/questions/4077487/background-image-not-repeating-in-android-layout
 Honeycomb以前のバグのようです。もっとも支持されてる回答、

 public static void fixBackgroundRepeat(View view) {
      Drawable bg = view.getBackground();
      if(bg != null) {
           if(bg instanceof BitmapDrawable) {
                BitmapDrawable bmp = (BitmapDrawable) bg;
                bmp.mutate(); // make sure that we aren't sharing state anymore
                bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
           }
      }
 }

を適用したところリピートするようになりました。動的にリピートを指定してやらないといけないのですね。こういう再現させるのが不明なバグを発見できて良かったです。



2012/12/19

Eclipseの高速化メモ

0 件のコメント
Eclipseが重いと一言に言っても、いろいろな工程での話があると思いますが、過去記事のなども含めてこの記事にピックアップしておきたいと思います。以下はWindows環境での話です。

2012/12/18

android.graphics.Pathで紙が浮いてるような影を描画する

0 件のコメント
なかなかオリジナリティ溢れるやり方なんですが、紙が浮いてるような影が付いてる画像をGoogleで画像検索して、その画像を拡大しておそらくこうなってるだろうとpathで表現してみました。ただ単に影を付けるなら、PaintのsetShadowLayer()を利用すればすぐに付けられますが、今回はこのような



両端がちょっと浮いてるような影についてです。

また、Pathで描画するメリットは、
  • Android API Level 1からサポートされてる
  • 自由に座標を指定できるので、端末のサイズ等に合せて調節できるなど
があると思われます。座標を計算するのがややこしいですけど。


2012/12/15

Android CheckBoxをxmlでカスタマイズ

0 件のコメント
やりたい事、
  • 自前のチェックボックス画像にしたい
  • タッチした時だけ背景色を変更
分かればなんて事ないんですが....
後者は動的にやると、OnTouchListenerを使ってMotionEvent.ACTION_DOWNで背景を変更し、MotionEvent.ACTION_UPで背景を戻すというコードを書かなければならないのですが、XMLで書くとコード中で余計な事(onTouchメソッドのreturn値とか)を気にしなく良くなるので、スマートだと思います。


2012/12/13

猫柵を自作

0 件のコメント
( ゚∀゚)o彡°DIY!DIY!



以前は、ダンボールとかでバリケード作ってたんですけど、


高さがなくてもこんな風に本をのっけておくと滑るので超えられなかったんですが、さすがにその上までジャンプできるようになって、ホームセンターとダイソーで材料を買ってきました。


Android Mockでテストしてみる( ;ω;)

0 件のコメント
試行錯誤も、次の一手が残っていれば挑戦してみようと思えるのですが、流石に万策尽きた感が出て諦めようと思っていたのですが、何とか動いたのでメモしておきます。


[環境]
  • Eclipse IDE for Java Developers Helios Service Release 2
  • OS : Windows 7
  • Android Development Tools 21.0.0.v201210310015-519525
・Android Mockを利用してHTTP通信をテストするには(1/3) - @IT
http://www.atmarkit.co.jp/fsmart/articles/androidtest05/01.html

こちらの有り難い記事。サーバへの通信とかを疑似サーバを立てないでテストしたいと思ってたので、コレコレ!という事でやってみたのですが、次のページの、

・Android Mockを利用してHTTP通信をテストするには(2/3) - @IT
http://www.atmarkit.co.jp/fsmart/articles/androidtest05/02.html

を何度も熟読してもエラーが出て前に進めませんでした( ;ω;)


2012/12/08

ArrayAdapterで作ったListView上のリスト項目に動的にViewを追加する方法

0 件のコメント
マニアックな話なんですけど、

ArrayAdapterで作ったListView上に、カスタマイズしたViewを動的に配置したい場合、Android 2.x系にはちょっとクセがあるようで、Android 4.0.3や3.1では表示されるのに、2.2や2.1では表示されず試行錯誤したのでメモしておきます。

例えば、

(特に意味はないですけど)リストに「春、夏、秋、冬」と表示させ、リストをタップすると赤い円を描きたいような場合



ListViewや項目のレイアウトはこんな感じ



【たぶん】Android端末が頻繁に勝手にシャットダウンする問題について

2 件のコメント
---- 下端に追記 ----

古い端末なんですけど、

[環境]


  • Xperia SO-01B
  • Android 2.1
ここ3,4ヶ月くらいAndroid端末が急にシャットダウンして困ってたんですが、何となく原因が分かった気がします。

[シャットダウンのタイミング]
  • 写真撮影
  • 動画撮影
  • PCと繋いでアプリのデバッグ
検索すると、端末に負荷がかかったとか、バッテリーパックを抜き差しすれば直ると電話オペレータに言われただのありましたがwそんな、昔の家電を叩いたら直った的な対処を....きっと電話オペレータさんも大変なんだなと思います。僕もやってみましたけど

デバッグは直接関係なかったかもしれませんが、これのせいで端末に負荷のかかる処理でシャットダウンしてるのだと思ってましたが、どうやらmicro SDカードの状態が悪くなったように思います。接触不良なのか、カードが破損したのかわかりませんけど。

最近それが進行したのか、micro SDが破損していますというエラーが端末に表示され、フォーマットしますか?と迫られたので、フォーマットしましたが、写真を撮影しても保存できませんでした。

micro SDが死んだなかなと、デジカメのものと交換したら、何事もなかったかのように写真が撮影できて保存できました。今のところシャットダウンの兆しもありません。なので、シャットダウンしてお困りの方はmicro SDを交換するのも一つの手かもしれません。

Androidシステムは半損したmicro SDに保存しようと何度も試みているはずなので、その分電池の消費も多かったかもしれません。Evernoteあたりの同期処理で電池が一気になくなってたので。そして、処理速度にも影響があるでょうね。

ただし、このような問題の場合、上記の端末の電源ON中にバッテリーパックを抜き差しすると、micro SDの劣化を進行または破損させる危険性があるでしょう。

推測ですけど


追記
micro SDを交換するとEvernoteの同期が失敗するようで、一度サインアウトしてサインインすると同期できるようになりました

追記:2012/12/13

気のせいでしたすみませんm(_ _)m
やっぱり、カメラを何度か使うとシャットダウンします。

追記:2013/11/20

バッテリーの問題では?バッテリーの劣化による(フル充電でも)パワー不足で、システムがシャットダウンしてるのでは推測します。最近電池を買って取り付けたら、シャットダウンすることなく、位置情報記録アプリやカメラアプリなども普通に使えるようになりました。

追記:2015/01/17

ネットを見てるとバッテリー劣化というだけでなく、寒さで電圧の低下によるシャットダウンという可能性もあるかもしれません。

2012/12/05

部屋にあるもので猫がおもちゃにしてるもの

0 件のコメント
天気予報では雪マークが出たりして、寒い今日この頃ですが、猫の脚力と好奇心はとどまる事を知らないようです。

猫がおもちゃと見なしたものをピックアップしておきます。


  • 紙類
    • 新聞
    • ティッシュ(すぐにちぎれて、口に入れようとするし、まき散らすので注意が必要)
    • コピー用紙(特に丸めたやつは大好き)
    • レシート(同上)
  • 衣類
    • 臭い靴下
    • 服・洗濯物
    • ざぶとんの紐
    • カーテン
    • マフラー
  • 耳かきのふわふわ
    [before]

     ↓
    [after]
  • 電気のコード
  • ストロー
  • 釣り糸
  • 精密機械
    • パソコン(起動時の音)
    • プリンタの動作音
  • 梱包素材
    • 買い物袋
    • 緩衝材
  • ピンポン球(Youtube動画)
まとめると、
  • 臭いのするもの
  • 軽くて高い音がするもの
  • かみ応えのあるもの
基本的には消耗品として諦めてますが、寒くなったら大人しくなってくれるのでしょうか....一時しのぎでしょうけど


追記:2012/12/18

ピンポン球は跳ねるので遊ばせると面白いですが、体力も使うようですぐに飽きました。紙と布系は根強くじゃれます。

2012/11/27

猫を拾って1ヶ月 比較画像

0 件のコメント
比較できるようそれっぽく撮ってみました。

拾った日↓



今日↓



猫を隔離せずに寝てみることにした

0 件のコメント
そろそろ猫を拾って1ヶ月が経とうとしていますが、



前にも書いたように


・とびこみ日記: 猫がやってきて二週間 寝る時
http://www.takaiwa.net/2012/11/blog-post_10.html#nerutoki

夜一緒に寝ると安眠を妨害されてしまうので、部屋の一部(トイレとかエサ場のあるスペース)に家具やダンボールで隔離して寝るようにしていました。最初はドサドサ音を立てながら超えようとするのですが、ダメだとわかると諦めて毛布に入って寝るのでしばらくそうしていました。

とは言え、初日に40cmのダンボールを突破され、45cmまでアップし、1週間後にそれも突破され、隔離の壁はより複雑さを増し、毎夜毎夜壁を作るのも面倒だし突破されるのではという寝る前のドキドキも嫌になって、寄せ集めじゃなくてちゃんとした突破できない柵を作ろうと考えていたのですが....

昨日から何の変化があったのか、猫キックの時に爪を出さなくなりました。


今まで思いっきり爪を出してひっかかれていたのですが、爪をしまって蹴ってくるのでちょっと感動しました。

そんな事もあり、疲れもあってこの日は隔離しないで寝てみる事にしました。そうすると、引っかかれる事もなく安眠でき、猫はというと僕の横でちょこんと寝ていました。

寝たのが電気カーペットの上なので、布団の場合だと布団に入ってこようとするので、その影響もあったかもしれません。これで、毎晩壁を作る面倒さと突破されるかもという心配と、きっと猫のストレスも減ったのではと思います。


PR:ねこキック! 大 イエロー
PR:システムペットフェンス STF-609 ブラウン <35914>

2012/11/10

猫がやってきて二週間

0 件のコメント
肩によじ登るまでになれてくれました。爪が痛いんですけど....


最近の事をダラダラと書いていこうと思います。

2012/11/07

Enumの使い方メモ

0 件のコメント
今まであまりEnumを使う機会はなかったのですが、ちょっと調べたらこれは見やすなって事でメモしておきます。Androidに限った話ではないですが、Androidっぽさも交えながらサンプルを作りました。サンプルの特徴としては、以下の3点です。
  1. Enumの定義でswitch文を判定できる
  2. Enumの定義とstring.xmlのデータを紐付ける
  3. Enumの定義した順番で欲しい場合はvalues()メソッドで
特に何か意味のある実用的なサンプルではありませんが、上記特徴を表すために....

1は言わずと知れたことですが、それに加えてと2に関して。例えば以下のようなエラーコードとエラーのメッセージを取得できるように定義したとします。

public enum ResultCode {

    // エラーコード,エラーメッセージのID
    OK(200, R.string.result_code_ok),
    ERROR_FORBIDDEN(403, R.string.result_error_fobidden),
    ERROR_NOTFOUND(404, R.string.result_error_notfound),
    ERROR_INTERNAL_SERVER(503, R.string.result_error_internalserver),
    ERROR_UNKNOWN(999, R.string.result_error_unknown),;

    int code,id;
    ResultCode(int code, int id) {
        this.code = code;
        this.id = id;
    }

    // idからエラーメッセージを取得して返す
    public String getMessage(Resources r) {
        return r.getString(id);
    }

    // エラーコードを返す
    public int getErrorCode() {
        return this.code;
    }
}

これを任意のメソッドの戻り値として利用することができます。こんな感じで

    public ResultCode function() {
     
     String page_content = null;
     
     // .....
     
     if(null == page_content) {
      return ResultCode.ERROR_NOTFOUND;
     }
     
     return ResultCode.OK;
    }


2012/11/04

お皿に手を突っ込んで食べる

0 件のコメント
噛まれると痛いのですが、歯をよくみたら犬歯のような歯しか生えていないようなので、しばらくはエサをお湯でふやかして与えていることにしています。


そして、お皿に前足を突っ込んで食べます。エサをふやかしているので、手は汚れ、その足で僕の太ももへ乗ろうとします(#^ω^)ピキピキ

この前買い物へ行った時に、子猫の顔が入る程度の深さの面積の狭い小皿を探してみましたが、適当なのがありませんでした。

トイレは自分で行くので、部屋はそのうちエサ臭くなりそうです(;-∀-)

[追記]
2012/12/12
最近は体も大きくなって手を突っ込まなくなりました(;^_^A

PR:ネコあるある
PR:ネコの「困った!」を解決する むやみにひっかくのを止めるには? 尿スプレーをやめさせる方法は? (サイエンス・アイ新書)

2012/10/31

毎回VirtualBoxへadb connect 192.168...と打つのが面倒なので

0 件のコメント
ほとんど需要の無い話だと思いますが、以下2点をメモ。VirtualBoxでAndroidのデバッグを行う際にコマンドで毎回、
adb connect 192.168.1.3

のように打ち、VirtualBoxのAndroidと接続するわけですが、これを毎日のように打つのは、さすがに面倒通り越して飽きてくるので、バッチファイルで効率化したいと思います。その前に、

コマンドプロンプトのショートカット

今更メモするような事でもないかも知れません。PATHにadbのディレクトリを通してないので、どこでもadbコマンドが使えるわけではありません。そのため、コマンドプロンプト起動時にadbディレクトリから開始できるようにします。


コマンドプロンプトのショートカットを右クリック > プロパティ で作業フォルダに、

D:\android-sdk\platform-tools

のように記述してやります。これで適用ボタンを押せばおk

バッチファイル

adb connect 192.168.1までは毎回同じなので、テキストエディタで
if "%1" == "" goto error
adb connect 192.168.1.%1

と記述しました。これをac.batというファイル名で保存し、先ほどのコマンドプロンプトで、IPアドレスが192.168.1.3なら、
ac 3
スペース含め4文字でいけますね。disconnect側もadc.batファイルを作成して接続を解除するようにしました。

理想系は

理想は、VirtualBoxのAndroid起動と同事にコマンド打つことなく接続して欲しいですが...
まぁ考えられるところでは、バッチファイルを叩いてもIPアドレス末尾の数字1文字を入力待ちにしておいて、先ほどのコマンドプロンプトショートカットの作業フォルダにコマンドも書き込んでしまえば、
  1. ショートカットをダブルクリック
  2. 数字を入力してエンター
のステップでいけそうですね。そこまでしなくてもいいかと思って調べるのやめておきました(^^ゞ

トイレを覚えてくれた

0 件のコメント
子猫が我が家に来てから、トイレを1度もしてなかったので心配だったのと、トイレの躾をつけたいと思っていたのですが、この日ようやくウンチしてくれました。カーペットの上に(#^ω^)ヨシイイコダ

それをティッシュでくるみ猫砂の所へ置き、猫を連れて行って匂いを嗅がせ、カーペットは匂いが残らぬよう綺麗に掃除をしておきました。

すると、次回からは自分で猫砂の所へ行って排泄するようになりました。なんて優秀な子なんだ!理想を言えば、カーペットにされる前、催した兆候(猫が床の匂いをかいでウロウロする)らしきものがあったのを確認していたのですが、その時に連れていくべきでしたね。

これで一安心です。


ただ、

便秘が解消されて元気になってよくエサを食べるようになりましたし、機敏に動くようになったのですが、夜中にじゃれて欲しいのか手を噛んできたり、寝ている僕の胸あたりに乗って猫パンチしたりして、またもや寝不足です....

2012/10/30

子猫が我が家に来て一夜明け

0 件のコメント

ひょんな事から子猫を拾い、
・とびこみ日記: 子猫を拾った
http://www.takaiwa.net/2012/10/blog-post.html
飼うことになったのですが、当初は威嚇していた猫も緊張を和らげてくれた様子なので手のひらを近づけるとじゃれます。ただし、全力で噛みます(#^ω^)イタイヨ

子猫とは言え、歯が鋭利なのか時々指に血がにじむほど。昔、小学生だったか中学生の頃に猫を飼ってた経験から、これはそのうち加減を調節してくれるだろうととりあえず我慢。ググったら痛い!とリアクションするのが良いようですね。

とは言え、日常の生活に猫がいるなどというのは子供の頃ぶりなので、どうしていいか



子猫を拾った

0 件のコメント
考え事が捗るのでダイエットも兼ねて、小さい山に繋がる道路をよくウォーキングをしています。道路ができたのは、ここ十数年なのでそのせいか、トカゲやカマキリなどといった生物によく出くわし、遅い時間であれば鹿や猪も見たことあるで若干警戒しながら歩いているのですが、この日は茂みの中から何かの鳴き声がしました。


鳥かなにかだろうとスルーして折り返し地点を目指しました。で、折り返してまたここに来ると鳴いています。動かないという事は怪我した鳥なのだろうかと、ちょっと怖い物見たさで近寄ったら...

2012/10/27

ArrayAdapterで作ったListViewの行の更新

1 件のコメント
ArrayAdapterを継承したクラスでListViewを作る場合、些細な事ですが忘れがちなのでメモしておきます。基本的には、行の更新と言えどListViewはsetAdapterメソッドを叩いてやれば、ListViewを更新できますが、画面に収まりきらないほどのリスト項目を持ち、リストをタップする事でリスト項目を更新するような場合は注意が必要です。

具体例で言いうと、下図のような商品名が並んでいるリストがあり、ショッピングカートのボタンをタップすると、商品名の括弧内の数字(個数)が増えるようなアプリがあったとします。この場合は、下から2番目の”味付けカワハギ”までは、setAdapterでリストを更新しても特に問題はないと思いますが、”冷凍シメサバ”より下に項目が続く場合についてサンプルソースを基に注意点を見ていきたいと思います。




2012/10/26

AndroidでのXML解析と、Evernote本文のDocumentパースが激重い話

0 件のコメント

org.w3c.dom.Documentを使う場合

親ノードを辿れたり、タグの属性を指定して更新できたりしてコードがすっきりするのでこのAPIを使いたいわけですが、EvernoteのクラウドAPIで取得したnoteの本文を丸々突っ込むとパースがクソ重いです。コードは以下のようになるかと思います。

String content = "<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\"><en-note><div><p><en-todo checked=\"true\"></en-todo>チェック項目1</p></div><div>ほげほげ</div></en-note>";

InputStream in = new ByteArrayInputStream(content.getBytes());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(in);

パースが遅い故、デバッグもし辛いしorg.w3c.domの利用を諦めようとしていましたが、<en-note>~</en-note>を抜き取ったものを使うと劇的に速くなります。理由までは調べてませんが...
String contentとInput Streamの宣言の間に以下のように、文字列処理を行うと良いでしょう。

int index = content.indexOf("<en-note");
content = content.substring(index);

これで取得したdocumentを
NodeList node_list = document.getElementsByTagName("a");

のように指定したタグでリストを作ってくれるので、僕にとってはXMLをイメージしやすく扱いやすいです。

※ソースは現在実装中のものから抜き出し見やすくしているので、コンパイルは通してません。考え方の参考までに。

XmlPullParserを使う場合

ググるとAndroidではXmlPullParserを使う例が多いようです。
        try {
            xmlPullParser.setInput( new StringReader ( content ) );
        } catch (XmlPullParserException e) {
             Log.v(TAG, "Error");
        }

        try {
            int eventType;
            while ((eventType = xmlPullParser.next()) != XmlPullParser.END_DOCUMENT) {
                Log.v(TAG, "name:" + xmlPullParser.getName() + " text:" + xmlPullParser.getText());
            }
        } catch (Exception e) {
            Log.v(TAG, "Error:" + e.getMessage());
        }

ノートの本文は上記同様String型のcontentに。データを丸々突っ込んでも快適に動作します。直感的ですが、while文を回して取得して文字列を辿るのが今回は適さないので深くは見てません。

SAXParserとDefaultHandlerを使う場合

Java関連でググると軽量なXMLの解析はSAXが提案されてました。parseを実行すると以下のNoteSAXHandler内のメソッドが実行されます。

private final static String TAG = "testActionSampleSAX";

public void testActionSampleSAX() throws Exception {

    String content = (note本文);

    // SAXパーサーファクトリを生成
    SAXParserFactory factory = SAXParserFactory.newInstance();
    // SAXパーサーを生成
    SAXParser parser = factory.newSAXParser();
    //XMLパーサーを定義 別途DefaultHandler を継承したクラス生成必要
    NoteSAXHandler handler = new NoteSAXHandler();


    InputStream is = new ByteArrayInputStream(content.getBytes());

    //パーサー実行
    parser.parse(is, handler);
}


private class NoteSAXHandler extends DefaultHandler {
    // ContentHandlerの実装
    public void startDocument() throws SAXException {
        Log.v(TAG, "startDocument()");
    }
    public void endDocument() throws SAXException {
        Log.v(TAG, "endDocument()");
    }
    public void startElement(java.lang.String uri,
                       java.lang.String localName,
                       java.lang.String qName,
                       Attributes atts)
                throws SAXException {
        Log.v(TAG, "startElement()");
        Log.v(TAG, "namespace=" + uri);
        Log.v(TAG, "local name=" + localName);
        Log.v(TAG, "qualified name=" + qName);
        for (int i = 0; i < atts.getLength(); i++) {
            Log.v(TAG, "attribute name=" + atts.getLocalName(i));
            Log.v(TAG, "attribute qualified name=" + atts.getQName(i));
            Log.v(TAG, "attribute value=" + atts.getValue(i));
        }
    }
    public void endElement(java.lang.String uri,
                       java.lang.String localName,
                       java.lang.String qName)
                throws SAXException {
        Log.v(TAG, "endElement()");
    }
    public void characters(char[] ch,
                       int start,
                       int length)
                throws SAXException {
        Log.v(TAG, "characters()" + new String(ch, start, length));
    }

    // ErrorHandlerの実装
    public void warning(SAXParseException e) {
        Log.v(TAG, "警告: " + e.getLineNumber() +"行目:" + e.getMessage());
    }
    public void error(SAXParseException e) {
        Log.v(TAG, "エラー: " + e.getLineNumber() +"行目:" + e.getMessage());
    }
    public void fatalError(SAXParseException e) {
        Log.v(TAG, "深刻なエラー: " + e.getLineNumber() +"行目:" + e.getMessage());
    }
}


タグ名などはstartElementメソッドで取得でき、タグに囲まれたテキストはcharactersメソッドで取得します。このように、タグを探して中身を取得&更新みたいな事をしようとすると、若干トリッキーな実装になりそうだったのでちょっと扱いづらいです。しかし、本文を丸々突っ込んでも快適に動作します。

最後に

動作を試したのは、いずれも少ないデータでの話なので、決定的な速度の違いはありませんでしたが、データが大きくなれば特徴が現れるかもしれません。でも、一番上のやり方でちょっと触れたように、パースが遅ければ文字列処理で削るなどの方法でなんとかなるんじゃないかと思いますし、あまりトリッキーな事はバグの原因やテストが増えるので、一番上のやり方を使いたいですね。まあ単にデータを引っ張ってくるなら、下2つのいずれかが良いでしょう。

Android:Documentでparseしたものを文字列に戻したい

0 件のコメント

エラー

java.lang.NoClassDefFoundError: org.apache.xalan.processor.TransformerFactoryImpl

経緯

AndroidでEvernoteのクラウドAPIを使ってノートの本文(XML)を解析するにあたり、調べてみたら、SAXだとかいろいろあるみたいですが、org.w3c.domがノードをたどれるし、今まで使った事のある経験から採用しました。

※まぁparseが遅いとかいうのもチラっと見かけましたが、次の記事あたりに遅さを解消について書きたいと思います。大したことではありませんが。

で、parseしてデータを取得するまではいいんですけど、これをEvernoteのnoteとして反映させるためには、paerseしたものをまた文字列へ戻す必要があります。ググるとTransformerが使われている例が多かったので、試してみました。Javaで動いてるJUnitで動かしてみたら問題なさそうだったのですが、Androidで動かしたら上記のエラーが出てしまいました。

対応

parseできるなら戻せるようにしておいて欲しい所ですが....どうするかについては単純に3種類くらいでしょうか。
  • それでもTransformerを使うべくxlan.jarを導入する
  • 他のフレームワークを使う
  • 手動で解析
xalan.jarを入れるが楽ではあるんですけど、
ただでさえ、EvernoteのクラウドAPIとActionbarSherlockの導入で数MBに肥大しているので、たかだか文字列にしたいだけで1.7MB近くあるJARファイルを入れたくないですし、
・java.lang.NoClassDefFoundError: org/apache/xalan/processor/TransformerFactoryImpl - Simple difficult things in Java, J2EE, J...
http://simpledevelopment.weebly.com/2/post/2011/11/javalangnoclassdeffounderror-orgapachexalanprocessortransformerfactoryimpl.html
バッドソリューションなどと書かれてますし....

他のフレームワークは特に調べてはないですが、容量増やしたくないということで、手動でやろうかなと。でも、完全に自分でやるのはデバッグが大変そうなのでググったらこちらの下の方にあるDmitryさんが紹介されてるやり方がいいんじゃないかと。
・Writing XML on Android - Stack Overflow
http://stackoverflow.com/questions/2290945/writing-xml-on-android
先頭にxmlタグ付けてくれたり、空白が多かったりするので除去したものを載せておきます。

※注意:追記参照


    private static String getStringFromNode(Node root) throws IOException {

        StringBuilder result = new StringBuilder();

        if (root.getNodeType() == 3)
            result.append(root.getNodeValue());
        else {
            if (root.getNodeType() != 9) {
                StringBuffer attrs = new StringBuffer();
                for (int k = 0; k < root.getAttributes().getLength(); ++k) {
                    attrs.append(" ").append(
                            root.getAttributes().item(k).getNodeName()).append(
                            "=\"").append(
                            root.getAttributes().item(k).getNodeValue())
                            .append("\"");
                }
                result.append("<").append(root.getNodeName()).append("")
                        .append(attrs).append(">");
            }

            NodeList nodes = root.getChildNodes();
            for (int i = 0, j = nodes.getLength(); i < j; i++) {
                Node node = nodes.item(i);
                result.append(getStringFromNode(node));
            }

            if (root.getNodeType() != 9) {
                result.append("</").append(root.getNodeName()).append(">");
            }
        }

        return result.toString();
    }

パラメータがnodeですが、Documentのオブジェクトを突っ込んでやれば文字列を戻してくれます。

追記:2013/02/24 ---------
このサンプルソースは、セルフクロージングタグであっても、それを解いて通常のクロージングタグにしてしまうので注意が必要です。シンプルで良いのですが、安易に使うと危険な気がします。
原形をとどめて戻すやり方は調べたいですが、保留中です.....

2012/10/21

EclipseのGitのCommitショートカットを有効にする

0 件のコメント

環境

  • Eclipse IDE for Java Developers:Helios Service Release 2
  • Git:上記Eclipseのプリインストール版Egit
  • OS:Windows 7

対応

デフォルトでショートCtrl + #が割り当てられてますが、押した所で有効になってないので、Commitが行えません。

メニューから
Window > Customize Perspectiv で表示されるダイアログのCommand Groups AvailabilityタブにあるGitにチェックを付けてOKボタンを押下します。




[参考]
Eclipse, Git - Keyboard Shortcut, How to use? - Stack Overflow

[PR]
アリスとボブのGit入門レッスン
Gitポケットリファレンス
入門git

2012/10/19

Evernote SDK for Androidを使う時はEclipseのヒープサイズをアップさせた方がよさそう

0 件のコメント
前回の記事、
・とびこみ日記: Eclipseが重いのでバージョンダウン
http://www.takaiwa.net/2012/10/eclipse.html
で、動作は軽くなったものの、デバッグ時がやっぱり重い。特にEvernoteのクラウドAPIを実装したもの場合。実機と接続すると、

Unable to execute dex: Java heap space


というダイアログが表示されて、インストールまでたどり付かない。ヒープサイズが問題のようで、ググったら、

・eclipse起動時に「Unable to execute dex: Java heap space」エラー - ロロロッサ
http://d.hatena.ne.jp/zakkiver24+rororossa/20110612/1307888021
にあるように、eclipse.iniのサイズを変更しました。

CPUは貧弱ですが、メモリは無駄に8GB積んでるので大いに使って欲しいのですが、いくらがいいのか特にわからずこんな値にしておきました。

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1536m

以前は、実機デバッグのインストール時に、Eclipseの応答がありませんとか言われるほど動作が重かったのですが、難なく動くようになりました。

[参考]
android - Unable to execute dex: Java heap space Java heap space - Stack Overflow


[PR]
Intel SSD 330 Series Maple Crest 120GB MLC 2.5inch 9.5mm Reseller Box SSDSC2CT120A3K5Intel CPU Core i7 3770K 3.5GHz 8M LGA1155 Ivy Bridge BX80637I73770K【BOX】
Transcend JetRam ノートPC用増設メモリ PC3-10600(DDR3-1333) 8GB KIT(4GB×2) 永久保証 JM1333KSN-8GK

Eclipseが重いのでバージョンダウン

0 件のコメント
前回Androidアプリを作った時は、Eclipse IDE for Java DevelopersのIndigoを使っていたのですが、アプリをリリースして、Eclipseがしっちゃかめっちゃかなっているし、何故かハイライト機能が死んでたので現時点で最新のJunoを入れてました。

ところが、これが重い。別にCPUが占有されてるわけではないですが、何をするにも重い。Eclipse内のViewの挙動が変ってるのも使い辛かったのもじきになれるだろうと思ってましたが、重いのだけは勘弁ならなくて、検索したら、

候補にHeliosが出てきたので、バージョンをダウンさせてみることにしました。ちなみに、Eclipse IDE for Java Developersのパッケージ毎のサイズは、
ダウンロードして、eclipse.exeをダブルクリックすると、まず、起動が速い。Viewもストレスなく移動できる。マシンスペックが上がるまではしばらく使っていきたいと思います。

新規に環境を構築するのが面倒なので、今までJunoで使ってたWorkspaceを利用し、足りないのはAndroid Developer Toolsなのですが、まずEclipse MarketplaceからAndroid Developer Tools for Eclipseをダウンロード。この、Eclipse Marketplace経由からADTをダウンロードすると、どのEclipseでも共通にエミュレータを扱うようなので、今まで設定していたエミュレータもそのまま残っています。なので、以降もすぐでした。

追記:2012/10/19

ヒープサイズを変更するのも重さ解消に繋がりました。
Evernote SDK for Androidを使う時はEclipseのヒープサイズをアップさせた方がよさそう
http://www.takaiwa.net/2012/10/evernote-sdk-for-androideclipse.html
追記:2012/12/19

問題点
Heliosのせいかどうかわからないけど、Eclipseがファイルをつかんで離さない事がある。例えば、EGitでBranchをswitchする場合、Eclipseがファイルをつかんでいるため、エラーが出る事が多々ある。もしくは、リネームの時にリネーム元ファイルが削除されない。この場合は、プロジェクトをクリーンするか、Eclipseを再起動すると良い。Branchをswitchする方はちょっと試行錯誤中。


[PR:Eclipse高速化]
Intel SSD 330 Series Maple Crest 120GB MLC 2.5inch 9.5mm Reseller Box SSDSC2CT120A3K5Intel CPU Core i7 3770K 3.5GHz 8M LGA1155 Ivy Bridge BX80637I73770K【BOX】
Transcend JetRam ノートPC用増設メモリ PC3-10600(DDR3-1333) 8GB KIT(4GB×2) 永久保証 JM1333KSN-8GK

2012/10/18

ActionBarSherlockのsample demoを動かすまでにやった試行錯誤

0 件のコメント
あっちへぶつかりこっちへぶつかりやったので、ベストなやり方ではなないかもしれませんが、次回も試行錯誤しないようにメモしておきます。

プロジェクトのインポート

maven projectとしてsamples/demos/のプロジェクトをインポート

android-support-v4.jarの削除

前回もやりましたけど、同様にlibsフォルダのandroid-support-v4.jarを削除

dependency not found in workspace

下記エラーが発生したので、

dependency=[com.actionbarsherlock:library:apklib:4.1.0:compile] not found in workspace

こちらから、pom.xmlをコピー
・ActionBarSherlock/library/pom.xml at master · JakeWharton/ActionBarSherlock
https://github.com/JakeWharton/ActionBarSherlock/blob/master/library/pom.xml#

Project 'sample-demos' is missing required source folder: 'test'

このエラーに対して、右クリック Build Path > Configure build PathでSourceタブ内のtestをRemove


Conversion to Dalvik format failed with error 1

Androidアプリを起動しようとしてコンソールに表示されるエラー。ググったら
・android - "Conversion to Dalvik format failed with error 1" on external JAR - Stack Overflow
http://stackoverflow.com/questions/2680827/conversion-to-dalvik-format-failed-with-error-1-on-external-jar

これに困っている人がかなり居たのか、凄い数の回答と指示付いててワロタw
一番指示されている回答が
Go to Project » Properties » Java Build Path » Libraries and remove all except the "Android X.Y" (in my case Android 1.5). click OK. Go to Project » Clean » Clean projects selected below » select your project and click OK. That should work.
ですが、僕の環境での捕捉も足すと
  1. Configure build PathのLibrariesタブにて、全てのラブラリをRemove
  2. プロジェクトをクリーン
  3. プロジェクト上で右クリック > Android Tools > Fix Project Propperties

とりあえず、これで実機で起動できるようになりました。


[参考]
Eclipse Java Missing required source folder: 'src' - Stack Overflow
android - ActionBarSherlock + maven + eclipse: dependency not found in workspace - Stack Overflow
android - "Conversion to Dalvik format failed with error 1" on external JAR - Stack Overflow

[PR]
AndroidアプリUIデザイン&プログラミング  アイデア固めからユーザーフィードバック分析まで
Android UI Cookbook for 4.0 ICS(Ice Cream Sandwich)アプリ開発術

ActionBarSherlockの導入が一筋縄にいかなかったのでメモ

0 件のコメント
Pattern Calendarを作った時は、このライブラリの存在を知らなかったので、Android 2.xとICSとかと表示が違いなどに困っていましたが、とても有り難いライブラリということで、早速使ってみることにしました。

こちらを参考に
・Android 2.xでAction Barが使えるActionBarSherlockの使い方 - gabuchanの日記
http://d.hatena.ne.jp/gabuchan/20120227/1330302592
Githubはリンク切れてたので、入手先はこちらから
・ActionBarSherlock - Home
http://actionbarsherlock.com/index.html

@Overrideのエラー


まず、ライブラリをAndroid applicationのプロジェクトとして取り込むと、エラーが出ます。



ソース内の@Overrideの所でエラーが出ています。Eclipseの設定を開いて、Java CompilerにJava1.5を使ってるのが問題で、1.6にすれば解決できます。




android-support-v4.jarがかぶる


で、先の解説の通り、自分のアプリを
import com.actionbarsherlock.app.SherlockActivity;

public class MainActivity extends SherlockActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
     setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

と修正して、ビルドをかけるとソースに問題がないのにエラーが残ってます。



Jar mismatch! Fix your dependencies HelloActionBar Unknown Android Dependency Problem

エラーには上記のように表示されています。これは、ライブラリ側と自分のアプリに、android-support-v4.jarが存在しているのが問題のようです。パッケージエクスプローラーから自分のアプリのlibsディレクトリに入っているandroid-support-v4.jarを削除する事で解決できます。

2012/10/13

Evernote SDK for Androidサンプルを自分のプロジェクトで実装する時の注意点

0 件のコメント
Evernote SDK for AndroidのクラウドAPIサンプルを参考にしながら、自前のプロジェクト上で実装してみた際の注意点というかエラーについてです。今後SDKのバージョンアップがあれば発生しなくなるかと思われますが下記環境に関しては注意が必要です。

環境


実装

基本的には、こちらの

”Using the SDK in your app”の項目を参考にすれば良いと思いますが、見落としてました...

2012/10/12

Evernote SDK for AndroidのサンプルのOAuthで躓く

0 件のコメント

環境

経緯など

昨年くらいに、一度WebアプリケーションとかJavaの環境でEvernote連携を試してみようとして、API Keyを発行してノートの一覧やノートの投稿などやったくらいに触った事あったんですけど、今回Androidで連携してみようと久々に触りました。

Androidでは、以下の2種類の方法でEvernoteのリソースへアクセスできるようです。
  • Intents
  • クラウドAPI
これはPattern Calendarアプリの時も、Googleカレンダーで両方使えたんですけどIntentsで実装しました。IntentsはSQLite感覚で使えて楽なんですけど、その分端末内の同期を待たないといけないというデメリットもあり、今回はクラウドAPIを利用してみます。


以前はEvernoteの開発者ページは英語だったような記憶をしていますが、日本語が充実しているのと、わかりやすいデザインになってますね。

2012/10/11

Androidエミュレータ爆速環境を試そうとして「XD not supported」

0 件のコメント

Intelのx86 Emulator Accelerator(XAXM)の存在は知っていて、僕のマシンじゃダメだと知っていたのですが、先ほどタイムラインに流れてきた、
・【番外編】Androidの爆速エミュレータ環境を構築する | クラスメソッド開発ブログ
http://dev.classmethod.jp/smartphone/build-fast-android-emulator/
これは新しいやり方だろうかと試してみたら、Hardware Accelerated Execution Managerのインストールでこけました。

XD not supported
This computer does not support Intel Execute Disable Bit(XD) or it is disable int the BIOS. HAXM cannot be installed Please refer to the Intel HAXM documentation for more informaiton.

とのこと(´_`;)ヤッパリ

まぁVirtualBoxで爆速環境は作れたりしますけど、エミュレータで動かしたい。



2012/10/09

Bloggerの投稿で指定できる見出し

0 件のコメント
標準

見出し


小見出し


準見出し

2012/10/07

WordPressからBloggerへ移行で躓いた点など

1 件のコメント

経緯

Androidアプリを作った時に、オンライン情報ページを設ける事を考えました。それまで運営していたtakaiwa.netのWordpressのブログにアプリ用ページを作成しても良かったのですが、自宅サーバのため不安定だしスパムコメントやら「wordpressの新しいバージョンが利用できます」などメッセージに対するメンテナンスが煩わしいので、ブログを移転する事にしました。何故Bloggerかというと、今まで使ってて特にクセがなかったといった軽い感じです。 WordpressからブログデータをExport と行きたいころですが、ご丁寧にも未承認のスパムコメントまでエクスポートして、Bloggerに格納してくれるのでまずスパムコメントを消します。Bloggerでやってもいいですが、wordpressで消す方が楽だったように思います。スパムコメントを消し終わったら、[Tools] – [Export]を選択します。All contentsでも良いのですが、次の作業で1MB以内に抑える必要があったので、Postsだけにします。まあ特にPagesは作ってなかったのでExportはしません。


Bloggerへインポート

Wordpressほど有名ならインポートも余裕だろwwと思ってたら現実は甘くなくて、そのままだとインポートしてくれません。インポートできる形に変換してやる必要があり、そういうサービスを提供してくださってるありがたいサイトがありました。
・Wordpress2Blogger conversion utility
http://wordpress2blogger.appspot.com/
ここで、ファイルを指定してコンバートボタンを押せばおkです。では、インポートといきたいところですが、画像のURLが

http://takaiwa.net/wp-content/uploads~

というドメインのままインポートすることになるわけで、ドメインもそのまま移転させるので画像を別途移動させてやる必要があります。何か良いやり方があればいいのですけど、思いつかなかったのでDropboxのPublicフォルダを利用する事にしました。このフォルダだとディレクトリ構造が反映されたURLになります。



2017/03/03追記:
DropboxのPublicフォルダは2017/03/15に廃止になるのでこのやり方は使えません

上図のようにDropbox - Publicディレクトリ配下に適当なフォルダを作って、wordpressのuploads配下の画像ディレクトリを丸々起きました。これで、先ほどコンバートしたファイルをテキストエディタで開き、「http://takaiwa.net/wp-content/uploads」の部分を丸々「http://dl.dropbox.com/u/19515983/takaiwanet_wordpress/uploads」のように置換してやればOKです!
Bloggerを開いて、[設定] – [その他] ブログをインポートで、先ほど置換したファイルを読み込ませます。そうすると、[投稿]にインポートされたものが表示されます。

ドメインをtakaiwa.netにする ※不完全

ここで難儀をして未だに解決できていない事があるのですが、途中までを掲載しておきます。 ⇒下記追記
takaiwa.netはお名前.comで取得したのですが、どういう風に設定するかのやり方は、
・ブログでカスタム ドメイン名を使用するには - Blogger ヘルプ
http://support.google.com/blogger/bin/static.py?hl=ja&ts=1233381&page=ts.cs
上記リンクで、ラジオボタンに、
  • 既存のURLでブログをホストする
  • いいえ
  • トップレベル ドメイン(例: www.example.com)。
とチェックを付けると該当する手順が表示されるので、それに従って操作を行いました。




お名前.com側(レンタルDNSレコード設定)


で、Bloggerを開いて[設定] – [基本]で、www.takaiwa.neをメインとするようにできましたが、



takaiwa.netでアクセスできない。上記画面で編集ボタンを開くと、



takaiwa.net を www.takaiwa.net にリダイレクトする。というチェックボックスがあるので、チェックを付けて保存ボタンを押しても反映されません。エラーも出ないので、何が問題なのかわかりません。何度も見直しましたが、これ以上手を入れるような部分はなく、あきらめてBloggerの「ご意見・ご感想」にやり方がわからない旨を送信しておきました。ご丁寧に、個別には返信しませんと念を押されました……
かと言って、今更アプリに直に、http://www.takaiwa.net/p/pattern-calendar-for-android.htmlのURLを記述してしまったのでブログを移すわけにもいかず。日付は先月ですけど、なんか未だにできねーw風な書き込みもありました。英語そんなに読んでないですが(;^_^A
・Blogger redirect from naked top level domain to www domain still not working - Google グループ
http://productforums.google.com/forum/#!topic/blogger/IA8qooEdq2k
修正中なんでしょうか。とりあえず、www.takaiwa.netの方が機能してるので、それでとりあえずは良しとします。
大した事ではなくてちょっとした事なんですけど、



ブログを管理するページなのに、ツールチップが「選択した写真を~」と表示されたり、インポートするときに「インポートして公開する」にチェックを付けたのに、公開されてなかったり、なんか細かい部分まで行き届いてないほど手が足りてないんじゃねーの?と思ったブログ移転でした。

2012/10/22追記:
今日見たらtakaiwa.netがリダイレクトされるようになってました。


Bloggerのダッシュボードに表示されるアクセス元に、ゾンビドメインリストというサイト経由でやってくる方がいたので、Bloggerからも音沙汰ないし、自宅サーバにてリダイレクトしてやろうかと思った矢先、対応してくれました(;^_^A やり方は間違ってなかったということで。