$ grep hoge --include = "*.java" -r -n .
2015年10月25日日曜日
grep 拡張子を指定して検索 忘備録
自分用。
拡張子を指定して、今のディレクトリから hoge を再帰的に検索したい場合
2015年10月9日金曜日
eclipseADT から Android Studio への移行
mac が EL Capitan に変わって Java 6 とかゴッソリ削られて eclipse で build するのが面倒臭くなってきたのをきっかけに、Android 開発環境の移行をしました。
eclipse ADT がサポートを打ち切られるのも年内がリミットですしね。
自分は、巷に解説されるように プロジェクトとサブプロジェクトでライブラリも構築するという事はやっていませんでした。 複数プロジェクトからライブラリを参照しているからで、基本 jar ファイルを参照する方式をとっていました。
それを
まずは、ライブラリの移行です。
Android Studio から、 import project (eclipse ADT, gradle, etc) を選択しライブラリを変換します。
依存関係の構築を行うために
自分は、巷に解説されるように プロジェクトとサブプロジェクトでライブラリも構築するという事はやっていませんでした。 複数プロジェクトからライブラリを参照しているからで、基本 jar ファイルを参照する方式をとっていました。
|-- Application | |- Foo | |- Bar | |-- Libraries | |-- Hoge | |-- Fuga | |-- Ref |-- Java | hoge.jar | fuga.jar | |-- Key debug.keystore release.keystoreeclipse 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 というのを通知してたんですが、今は、こうするのがベストなんじゃないでしょうか?
ぼけーヽ(`Д´)ノウワァァァン!!
2016/2/2 追記:どうも、この static void MediaScannerConnection.scanFile を使用すると、LogCat に ConnectionのLeakが報告されるようです。
Java エコシステムにおいて、Leak って言われてもね〜。
Intent を使って通知する方が良いかもしれません。
参考: MediaScanner ServiceConnectionLeaked
参考2:MediaScannerに登録を依頼する方法
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/
なんで
というように、シンボリック・リンクにしてしまう。
尚、TimeCapsule を Data という形でマウントしている。
ところで、TimeCapsule のマウントは自動で行われるが、毎回、必ず Data にマウントされるわけではなく、Data-6 だったりと面倒くさい。なんとかならんものか?
バックアップ先は
~/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が多数派なんで、自然な流れかと。
ちゃんとしてくれないツールが多くて閉口します。
DBFファイルの先頭から 29バイト目 の0x0057 とかで入っていて、87=ISO-8859-1となってます。
日本語版のArcGISで、これを読むと、ちゃんとSJISとして解釈してくれる。もうたまりませんわ。
ISO-8859-1が多数派なんで、自然な流れかと。
ちゃんとしてくれないツールが多くて閉口します。
2015年5月8日金曜日
キーボード入力雑感
プログラミングするには、やっぱり英語キーボードの方が {} [] \ ¥ が打ちやすい。
なんだけども、職業上、雑多な環境でキーボードを打たなくてはいけないので、結局、もう日本語キーボードで良いです。ってなってしまいました。
ローカルBBS時代には、自分は、T-Code 使いでした。
なんでも統計的にタイプ数の多い文字をうまく組み合わせて、2ストロークで自然と左右で打鍵できるように配置された手に負担の少ない配列というのに惹かれました。
けれども、全部を覚えきる事なく、MS-DOS から WINDOWS へと時代が変わりIME自体がしばらくサポートされないまま、廃れていきました。
友人は、「風」を使っていました。今にして思えば、日本語を1ストロークのカナ入力で行うので、断然タイプも速く、自分も、こちらを覚えれば良かったかなと…。
今は、だらだらとローマ字入力を使ってます。
これを機に、風とか探してみようかな・・・
登録:
投稿 (Atom)