2016年2月6日土曜日

Androidで内部ストレージの容量が足りなくなったときの調査 (特にSHL21の場合)

概要
Android 4.1で使っているAQUOS PHONE SERIE SHL21で、「内部ストレージが足りない」というような通知がでました。 Androidのコンテンツマネージャーアプリで、内部ストレージに保存された、音楽、動画などをみてもさほど大きなものは入っていませんでした。(全部SDカードに入れています。) コンテンツマネージャーのメニューの「microSDと端末容量」を開くと、「その他」が4Gbyteほど占めていました。
コンテンツマネージャーアプリで調査しきれない内部ストレージ不足を調査しました。
手順
注意: ファイルを削除するとAndroidのアプリケーションが正常に動作しなくなることがあります。自己責任で、慎重に行ってください。
  1. duコマンドを使うために、BusyBox Install (No Root)をインストール。
  2. BusyBox Installの指示に従ってBusyBox、ターミナルアプリ を入れます
  3. BusyBoxの最初のコマンド(パス設定など)をクリップボードにコピー
  4. Androidのターミナルアプリを開いて、BusyBoxの最初のコマンドをペーストしてEnter
  5. ルートディレクトリからディレクトリごとの使用量を調査。コマンドを入力するため、Bluetooth キーボードを使うと便利です。
    cd /
    busybox du -hs * 2> /dev/null
    
  6. 使用量の多いディレクトリにcdして、busybox du を実行するのを繰り返します。
例: Android 4.1 SHL21でのディスク不足の原因
/storage/sdcard0/Android/data/jp.co.sharp.android.picturemanager.media/ にlocal-image-thumbs、 hires-image-cache というディレクトリが大量にあり、合計で4Gbyteほどになっていました。ギャラリー(画像閲覧アプリ)のサムネイルを保存しているようです。全て削除しました。削除した後もギャラリーは普通に動作します。

2015年10月17日土曜日

お茶缶3D: three.jsで円柱にテクスチャを貼りたいが、平らな面は貼りたくない時

概要
円柱型の間の側面に「お茶」と書きたいけど、蓋と底は書かなくていいような場合に、どうしたらよいか悩んでいました。
webページはこちら
普通に、「お茶」テクスチャをかぶせると全面を包んでしまうため、左の筒のように蓋の上にも文字が書かれます。困った。
解決方法

右のように側面だけにするには、 MeshFaceMaterialを使用します。そうすることで複数のMaterialを使い分けられます。 MeshFaceMaterialはそれらをリストにして持ちます。side_materialが0番目、end_materialが1番目のMaterialで、これをfaceIndexといいます。face(Geometryを分割したSegmentごとの面)に使うfaceIndexを変えることで、複数のface
  • side_materialはテクスチャつきの円周用のMaterial
  • side_materialは蓋と底と面でテクスチャのないMaterial
  • 右の円柱のコードの主要部分
    var side_material = new THREE.MeshPhongMaterial({ map: texture });
    var end_material = new THREE.MeshPhongMaterial({ color: 0x00ff00 });
    material = new THREE.MeshFaceMaterial([side_material, end_material]);
    
    //
    obj = new THREE.Mesh(geometry, material);
    
    //後ろ radialSegments*2個は end_material
    //それ以外は side_material
    for(var i = 0; i < geometry.faces.length-geometry.parameters.radialSegments*2; i++){
        geometry.faces[i].materialIndex = 0;
    }
    for(var i = geometry.faces.length-geometry.parameters.radialSegments*2; i < geometry.faces.length; i++){
        geometry.faces[i].materialIndex = 1;
    }
    
    コードはこちら
    おまけ
    どのfaceをend_materialにするかがポイントですが、今回はCylinderGeometryのコードの内部で、先に側面のfaceを追加し、後で蓋、底のfaceを追加していることを利用して、geometry.facesの配列上の位置で特定しました。
    本来なら、face(というかsegment)ごとに法線ベクトルを調べてcap/endを特定するのが良さそうではあります。
    "cap", "end"みたいな名前を指定してfaceの集合が得られるような関数(かそれに続けて関数をmapするとか)があると嬉しい。。?

    2014年9月27日土曜日

    時刻で支払額をプロット

    前回は日付ごとに支払額をプロットしていましたが、今回は 時刻ごとにしました。一日に数回支払いがあった場合のプロットが重なっていたのが分かれます。
    スクリプト
    options(error=function()traceback(2))
    d = read.csv("auWALLET_201409.csv", skip=17, fileEncoding="shift_jis", header=F, stringsAsFactors=F)
    names(d) = c("id","timestamp","kind","shop","amount","balance","campaign","foreign_amount","rate","dummy_column")
    d$time = as.POSIXlt(d$timestamp, tz="JST", "%Y/%m/%d %H:%M")
    tick = c("2014/9/1", "2014/9/5", "2014/9/10", "2014/9/15", "2014/9/20", "2014/9/25", "2014/9/30")
    ticklab = sub("^..../(.*)$", "\\1", tick)
    tickpos = as.numeric(as.POSIXlt(tick, tz="JST", "%Y/%m/%d"))
    d$paid = abs(as.integer(gsub(",","",d$amount)))
    # 支払のみをフィルタ
    dpaid = d[d$kind=="支払",]
    png("paid09.png")
    plot(dpaid$time, dpaid$paid, ylim=c(0, 2500), xaxt="n", xlab="time", ylab="paid amount(yen)", main="paid amount")
    # カスタマイズしたx軸を書く
    axis(1, at=tickpos, label=ticklab)
    lines(dpaid$time, dpaid$paid, ylim=c(0, 2500))
    abline(h=mean(dpaid$paid), col=2)
    abline(h=mean(dpaid$paid)+sd(dpaid$paid), col=3)
    dev.off()
    
    結果

    解説
    png画像を出力
    png(出力ファイル名) 
    ...
    dev.off()
    
    でpngからdev.offまでのプロットを画像ファイルとして出力できます。
    軸のカスタマイズ
    plotのxaxt="n"でx軸のtickを書かない設定にしておいて、axis関数を読んでx軸のtickを書いています。
    感想
    データをのせないと実行して試せないから面白くないよな....。

    2014年9月14日日曜日

    auWalletの明細をいじりつつR事始め

    auから出ているクレジットカードみたいなプリペイドカード auWALLET。支払履歴がWebで確認できたり、CSVとしてダウンロードできるので、Rで支払額をプロットしてみました。 auWALLETのページから、支払明細のCSVファイルをダウンロードして以下のRスクリプトを実行すると日毎の支払額のプロットが表示されます。(ここでは9月分のファイル auWallet_201409.csv をプロット)
    スクリプト
    d = read.csv("auWallet_201409.csv", skip=17, fileEncoding="shift_jis", header=F, stringsAsFactors=F)
    names(d) = c("id","timestamp","kind","shop","amount","balance","campaign","foreign_amount","rate","dummy_column")
    d$date = as.Date(d$timestamp, "%Y/%m/%d %H:%M")
    d$paid = abs(as.integer(gsub(",","",d$amount)))
    # 支払のみをフィルタ
    dpaid = d[d$kind=="支払",]
    plot(dpaid$date, dpaid$paid, ylim=c(0, 2500))
    lines(dpaid$date, dpaid$paid, ylim=c(0, 2500))
    abline(h=mean(dpaid$paid), col=2)
    abline(h=mean(dpaid$paid)+sd(dpaid$paid), col=3)
    abline(h=mean(dpaid$paid)-sd(dpaid$paid), col=3)
    
    結果

    赤い線が平均、緑の線は平均から標準偏差を足し引きした金額です。
    解説
    CSVの不要な行の読み飛ばし
    read.csvのskip引数で読み飛ばす行の数を指定できます。実は明細のヘッダになっている17行目も読み飛ばして、あとでカラム名をスクリプトでつけています。17行目のヘッダをそのまま使うとヘッダがずれからなんですが、なんでだろう。。。
    Shift_JISを含むCSVの読み込み
    read.csvのfileEndoding="shift_jis"
    カンマがついた数値(金額)の読み込み
    gsubを使ってカンマを削除するのがR流らしいです。
    MacにRをbrewでインストール
    RをMacにbrewでインストールするときにfortranのインストールでこける問題がありましたが、ここからバイナリ版のgfortranを入れました。(参考: homebrew install for gfortran fails for xcode 4.2)
    感想
    MacにRを入れて使うのはいろいろ面倒なことがある。Ubuntuで使うのが楽。
    一日に数回使っているところのプロットは合計した方が良いなぁ。
    日々、使った金額が見られるのでauWALLETいいかも。

    2012年10月1日月曜日

    AndroidのJUnitテストの結果をXMLとして出力 (→ Jenkinsで表示)

    Android JUnit Testって、Eclipseで実行すると進捗の表示も結果の表示も分かりやすいのだけれど、antやコマンドラインから実行したときは、ログからテスト失敗時のスタックトレースを探して対処せねばならず分かりにくいです。また、Jenkinsでテスト実行時にテスト結果を表示出来ないのはもったいないです。

    そんなわけで探してみたところ、Android JUnit results in Hudson にいいコードがのっていました。podplayerのテストであるpodtestで使っています。この方法ではテスト実行時に使用するInstrumentationTestRunner を置き換えなければならないのでちょっと注意が必要です。

    1. テストプロジェクトのAndroidManifest.xml のinstrumatation要素のandroid:nameを com.neenbedankt.android.test.InstrumentationTestRunnerに置き換える
    2. antから実行する場合、ant.propertiesに test.runner=com.neenbedankt.android.test.InstrumentationTestRunner という一行を加える。
    3. Eclipseから実行する場合、以前使っていたAndroid JUnit TestのRunの設定を削除する必要がある? (Projectの設定から Run/Debug setting)
    JUnitを実行すると、結果のファイルが実施したターゲット(エミュレータ/実機)のテストプロジェクトのディレクトリ (podtestだと /data/data/com.mamewo.podtest0.tests/files/ ) に保存されるので、 adb pullして、JenkinsにJUnitの結果のファイルとして設定するとテスト結果が表示されます。

    2012年7月25日水曜日

    Android: 複数の値を持つ設定をお手軽に作る

    「複数のWebサイトから好きなのを選ぶ」といった設定画面を作るのに、Webサイトごとに対応するPreferenceをつくってもいいのですが、設定画面のXMLが大きくなり、項目ごとに設定のキーを設定するため設定を取り扱うJavaのコードが煩雑になってしまいます。
    ここ で紹介されている設定画面を使うと、簡単に複数の値を持つ設定を作れます。

    • 選択された値がセパレータで連結された文字列として返る
    • 設定のキーは1つにまとめられる
    • 設定項目の表示文字列、値文字列はリソースとしてarrays.xmlに定義できる
    なかなか、便利。セパレータの定義で悩むことはありますが。。まらーむ で使用しています。
    Preferenceをカスタマイズして新たな設定画面を作るサンプルとしても参考になるかも?

    2012年7月3日火曜日

    Macがとても遅いとき

    ディスクユーティリティからハードディスクの検証、修復を行ったら解決しました。
    まずは検証行ってみるのがいいのかも。Mac起動時に CommandとRを同時押しして起動すると、ディスクユーティリティ単体を使用出来るので、検証してみるのがおすすめです。

    ちなみに僕のMacではファイルシステムに発生していた模様で、修復前はハードディスクの音が結構していて、backupdがCPUを食い、Safariが起動できないくらい遅くなってました。
    ハードディスク使用率が高いのも問題だな。。。。