2015年12月13日日曜日

MVNOを検討していてわかった事

自分の携帯は、ガラケーです。スマートフォンにすると通信料が高くつくので敬遠していました。 しかし、
  • ガラケーの端末が、強く閉じると電源OFFになってしまい、今にも壊れそう
  • 今時スマートフォンにしないとコミュニケーションにも支障をきたす
  • MVNOというサービスが出てきて通信費が手頃になってきた
というように、移行する条件が揃ってきたので、これを期にフリーSIMの使える端末について調べてみました。

 自分のライフスタイルに合ったスマートフォンというと、京セラのTORQUE G01, G02 あたりになります。ところが、こいつのフリーSIMの入手が厄介です。

 この機種は au から販売されていますが、フリーSIM化するためには、総務省の指針により購入後6ヶ月経過しないとダメです。auと契約しないで端末を購入できれば良いのですが、契約しないで端末を買う事はできません。

 中古の携帯が流通していて、その中で購入後6ヶ月以上経ってフリーSIM化されているものを買えば良い事になりますが、これがまたリスクが高い。フリーSIM化されていても、様々な要因で後から通信ロックを食らってしまう状況がある事がわかってきました。通信ロックを食らう状況は、以下のようなもの
  • 元の持ち主が手放した携帯がオレオレサギに利用され、その持ち主の携帯がブラックリスト扱いにされてしまう。
  • 元の持ち主が料金滞納をしてしまったため、巻き添えで通信制限を食らってしまう。
  • 元の持ち主が紛失したと嘘をついて携帯を売約したため、実はリモートロックがかかって外せない状態のまま
見ればわかるように、中古販売店からフリーSIM化された状態で買っても、いつ巻き添えを食って携帯が使えなくなってしまうか、予測できません。確率は低いにせよ、常に使えなくなる可能性があるわけです。
 こうやって考えて行くと、
  • 最初からフリーSIM化された機種を買う
  • 元の持ち主が判明していて、信頼できる携帯
の2択で行くのがリスクが無くて良いです。
スマートフォン、高いけど、リスクを考えたらフリーSIMの端末を選択するのが良さそうですね!
 Zenfone 2 なんか、コスパが良いなぁと思ってたんですが、日本の家電製品として販売するために取っておかないといけない「技適」マークを取得していないという理由で、MINEO の au プランで使えないんだとか…(使えるけど、使うと違反になる)

いやー、悶々としますね。

2015年10月25日日曜日

grep 拡張子を指定して検索 忘備録

自分用。 拡張子を指定して、今のディレクトリから hoge を再帰的に検索したい場合
$ grep hoge --include = "*.java" -r -n .

2015年10月9日金曜日

eclipseADT から Android Studio への移行

 mac が EL Capitan に変わって Java 6 とかゴッソリ削られて eclipse で build するのが面倒臭くなってきたのをきっかけに、Android 開発環境の移行をしました。 eclipse ADT がサポートを打ち切られるのも年内がリミットですしね。
 自分は、巷に解説されるように プロジェクトとサブプロジェクトでライブラリも構築するという事はやっていませんでした。 複数プロジェクトからライブラリを参照しているからで、基本 jar ファイルを参照する方式をとっていました。
|-- Application
|   |- Foo
|   |- Bar
|
|-- Libraries
|   |-- Hoge
|   |-- Fuga
|
|-- Ref
      |-- Java
      |      hoge.jar
      |      fuga.jar
      |
      |-- Key
             debug.keystore
             release.keystore
eclipse ADT は、こんな感じですわ。
それを
   |- Foo
   |- Bar
   |-- Hoge
   |-- Fuga
   |-- Ref
      |-- Java
      |      hoge.jar
      |      fuga.jar
      |
      |-- Key
             debug.keystore
             release.keystore
という構成に Android Studio では、しました。
まずは、ライブラリの移行です。
Android Studio から、 import project (eclipse ADT, gradle, etc) を選択しライブラリを変換します。
依存関係の構築を行うために
Hoge/app/build.gradle
ファイルを編集します。
apply plugin: 'com.android.application'

android {
    compileSdkVersion 13
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "jp.co.company.Hoge"
        minSdkVersion 13
        targetSdkVersion 13
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
}

// ここに依存関係で使用しているライブラリを指定します。
dependencies {
    compile files('../../Ref/Java/helper.jar')
    compile files('../../Ref/Java/calc.jar')
    compile files('../../Ref/Java/sqlcipher.jar')
}

// 古い jar ファイルが存在した場合は削除するタスク
task cleanDebugJar {
    def classes = new File('build/intermediates/bundles/debug/classes.jar')
    if( classes.exists() ) {
        delete '../../Ref/Java/hoge.jar'
    }
}

// debug でビルドした時は Hoge/app/build/intermediates/bundles/debug/classes.jar が
// 生成されるようになっているので、それを共通のディレクトリにコピーするタスク
task generateDebugJar(type: Copy, dependsOn: [cleanDebugJar,assembleDebug] ) {
    from 'build/intermediates/bundles/debug/'
    into '../../Ref/Java/'
    include('classes.jar')
    rename('classes.jar', 'hoge.jar')
}

/*
// debug でビルドされる jar ファイルは、そのまま流用できる。
// release で自前で作成しても debug で作成されるものと同じなので
// コメントアウトしている=必要ない。
// 将来的にデバッグ情報が付加された jar が生成されるとか
// 状況が変われば、この辺のコードは有用かもしれない。

// release でビルドした時は、jar ファイルが生成されない。
// よって、自前で jar ファイルを生成するためのタスク
task makeReleaseJar(type: Jar, dependsOn: assembleRelease) {
    from fileTree(dir: 'build/intermediates/classes/release')
    from fileTree(dir: 'src/main/resources/')
    into 'build/intermediates/bundles/release/classes.jar'
}

// 古い jar ファイルが存在した場合は削除するタスク
task cleanReleaseJar {
    def classes = new File('build/intermediates/bundles/release/classes.jar')
    if( classes.exists() ) {
        delete '../../Ref/Java/release/hoge.jar'
    }
}

// jarファイルを共通のディレクトリにコピーするタスク
task generateReleaseJar(type: Copy, dependsOn: [makeReleaseJar, cleanReleaseJar, assembleRelease]) {
    from 'build/intermediates/bundles/release/'
    into '../../Ref/Java/release/'
    include('classes.jar')
    rename('classes.jar', 'hoge.jar')
}
*/

// 間抜けな事に Android Studio のビルドから Java class ファイルを
// コンパイル生成した後に task を実行する手段が見つけられない。
// (Build -> Clean Project, Build -> Rebuild Project)
// これは、ビルド・プロセスにおけるクリーンナップが行われる前に、前回生成した
// *.class ファイルを jar 化したものに対して、コピー操作を行うという方法
// 2回ビルドしないと最新の jar にならない。
// IDEからビルドしただけでは動作しないので、皆ターミナルから、
// task を指定する形で実行している。
//assembleDebug.dependsOn(generateDebugJar)
//assembleRelease.dependsOn(generateReleaseJar)
コメントに書いてあるように、ターミナル・ウィンドウから
./gradlew generateDebugJar
を実行します。

2015年8月7日金曜日

MediaScannerService ファッキュー

  Android プログラミング、難しいですね。地雷の山。

Android のアプリケーションから、ファイルストレージにディレクトリを作成したり、ファイルを作成したりしても、PCからUSBで接続するとファイルが見えません。
これは、Android の ファイルシステムとは別に、MTP 接続でのファイル問い合わせが別管理になっているからなんです。
だから、Android のアプリケーションからファイル操作をファイルストレージに対して行ったら、いちいち MediaScannerService 様にお伺いを立てて登録をお願いする必要があります。
ところが、この MediaScannerService 様、登録をお願いしたものは、ディレクトリも含めて、全部「ファイル」として処理をして下さいます。
途中に登録されていない「ディレクトリ」が存在すれば、ついでに、それは「ディレクトリ」として登録してくださる親切仕様。
あ、存在しないファイルに関しては、いちいち通知しなくても、よしなに計らってくださいます。だから、ファイルやディレクトリの削除を通知してはいけません。

昔は、MEDIA_MOUNTED というのを通知してたんですが、今は、こうするのがベストなんじゃないでしょうか?
  public static void makeFileDiscoverable(File file, Context context){
    if( file.isDirectory() )  return;
    if( !file.exists() )  return;
    MediaScannerConnection.scanFile(context, new String[] { file.getAbsolutePath() }, null, null);
  }

ぼけーヽ(`Д´)ノウワァァァン!!

2016/2/2 追記:どうも、この static void MediaScannerConnection.scanFile を使用すると、LogCat に ConnectionのLeakが報告されるようです。
 Java エコシステムにおいて、Leak って言われてもね〜。
Intent を使って通知する方が良いかもしれません。
参考: MediaScanner ServiceConnectionLeaked
参考2:MediaScannerに登録を依頼する方法
  Uri contentUri = Uri.fromFile(newFile);
  Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri);
  context.sendBroadcast(mediaScanIntent);

2015年7月22日水曜日

iPadのBackupをTimeCapsuleへ備忘録

参考 http://osxdaily.com/2011/03/05/how-to-move-the-iphoneipad-itunes-backup-folder-to-an-external-hard-drive/

バックアップ先は
~/Library/Application Support/MobileSync/

なんで
ln -sf /Volumes/Data/Rev/okimiyuki/Backup/ ~/Library/Application\ Support/MobileSync/Backup

というように、シンボリック・リンクにしてしまう。
尚、TimeCapsule を Data という形でマウントしている。

ところで、TimeCapsule のマウントは自動で行われるが、毎回、必ず Data にマウントされるわけではなく、Data-6 だったりと面倒くさい。なんとかならんものか?

2015年6月29日月曜日

QGISの作るshapefileのdbf

しばしば ISO-8859-1 というコードページに解釈されるケースが多いので、そのようなファイルがどうなっているのか調べてました。

DBFファイルの先頭から 29バイト目 の0x0057 とかで入っていて、87=ISO-8859-1となってます。
日本語版のArcGISで、これを読むと、ちゃんとSJISとして解釈してくれる。もうたまりませんわ。
 ISO-8859-1が多数派なんで、自然な流れかと。

ちゃんとしてくれないツールが多くて閉口します。

2015年6月11日木曜日

UTime デザイン

ユニクロのTシャツをデザインしました
もし気に入ったら、こちらからどうぞ