ページ

2014/10/29

[SublimeText] Sublime Text 3 の検索で日本語をエンターすると文字が消えるのを防ぐ

Sublime Text で地味に困るのが検索窓に日本語を入力した時。
エンターを押した瞬間、入力した文字が消えるので全然検索ができない。
ずっと困ったまま放置していたんだけど
たまたま Twitter で解決方法が流れてきたのでメモ。

参考

Sublime Textの検索窓に日本語を入力する方法
Sublime Text 3 で日本語を検索したとき文字が消える不具合を直す - MEMOGRAPHIX

キーマップを変更してエンターで動作しないようにする

参考元ではコメントアウトされていましたが使えないのは面倒なので
ctrl + enter に全て置き換えました。
// Find panel key bindings
{ "keys": ["ctrl+enter"], "command": "find_next", "context":
    [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
},
{ "keys": ["shift+enter"], "command": "find_prev", "context":
    [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
},
{ "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
     "context": [{"key": "panel", "operand": "find"}, {"key": "panel_has_focus"}]
},

// Replace panel key bindings
{ "keys": ["ctrl+enter"], "command": "find_next", "context":
    [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
},
{ "keys": ["shift+enter"], "command": "find_prev", "context":
    [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
},
{ "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
    "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
},
{ "keys": ["ctrl+alt+enter"], "command": "replace_all", "args": {"close_panel": true},
     "context": [{"key": "panel", "operand": "replace"}, {"key": "panel_has_focus"}]
},

// Incremental find panel key bindings
{ "keys": ["ctrl+enter"], "command": "hide_panel", "context":
    [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
},
{ "keys": ["shift+enter"], "command": "find_prev", "context":
    [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
},
{ "keys": ["alt+enter"], "command": "find_all", "args": {"close_panel": true},
    "context": [{"key": "panel", "operand": "incremental_find"}, {"key": "panel_has_focus"}]
},

2014/10/24

AndroidStudio で APK を特定のフォルダにコピーする Gradle の設定

AndroidStudio で APK のファイル名を変更する Gradle の設定 | DevAchieve
APK をリネームしましたが、
出力されるフォルダが build/outputs/apk/ なので
変更したいことがあるかと思います。
Gradle の Task を定義してあげれば
任意のフォルダにコピーする処理を実行することができます。

Gradle で Signed APK とProGuard 関連ファイルをコピーするタスクを設定する


Add move apk task and move proguard task · c7cdd90 · wada811/Android-Material-Design-Colors

applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
        variant.outputs.each { output ->
            if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                // Rename APK
                def applicationId = defaultConfig.applicationId
                def versionCode = defaultConfig.versionCode
                def versionName = defaultConfig.versionName
                def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
                def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"

                def publish = project.tasks.create("publishAll")

                // Move and Rename APK
                def task = project.tasks.create("publish${variant.name.capitalize()}Apk", Copy)
                task.from(output.outputFile)
                task.rename(output.outputFile.name, newName)
                task.into(file("${variant.name}/apk").getAbsolutePath())

                task.dependsOn variant.assemble
                publish.dependsOn task

                // Move ProGuard
                if (variant.buildType.runProguard) {
                    def copyTask = project.tasks.create("copy${variant.name.capitalize()}MappingText", Copy)
                    def buildTypeName = variant.buildType.name
                    copyTask.from(file("build/outputs/proguard/${buildTypeName}").path)
                    copyTask.into(file("${variant.name}/proguard").getAbsolutePath())

                    copyTask.dependsOn variant.assemble
                    task.dependsOn copyTask
                }
            }
        }
    }
}

実行

./gradlew publishAll
app/release/apk/ に Signed APK が、
app/release/proguard/ に ProGuard 関連ファイルがコピーされます。

参考

AndroidStudioでAPKを作ったあとに特定のディレクトリにAPKをコピーする - Qiita

2014/10/23

AndroidStudio で APK のファイル名を変更する Gradle の設定

Android Studio で Sigined APK を生成するには
ツールバーの [ Build > Generate Signed APK... ] から
ガイダンスに従えば生成できます。
しかし、GUI からではファイル名は app-release.apk などになるので
変更したい場合などは Gradle の設定が必要になります。

Gradle で Signed APK のファイル名を設定する

Generate signed APK has been named by program · bc41551 · wada811/Android-Material-Design-Colors

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.1"

    defaultConfig {
        applicationId "at.wada811.android.material.design.colors.sample"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 2
        versionName "1.1.0"
    }
    signingConfigs {
        release
    }
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release")) {
            def file = variant.outputFile
            def applicationId = defaultConfig.applicationId
            def versionCode = defaultConfig.versionCode
            def versionName = defaultConfig.versionName
            def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
            def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"
            variant.outputFile = new File(file.parent, newName)
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21+'
    compile project(':library')
}

./gradlew assembleReleaseすると
at.wada811.android.material.design.colors.sample_r2_v1.1.0_20141022_173737.apk
のようなファイル名で app/build/outputs に生成されます。

参考

gradle - AndroidStudioでAPKのファイル名にバージョン番号などを入れる設定 - Qiita

追記: Android Gradle Plugin 0.13, Gradle 2.1 で outputFile が deprecated になっている

WARNING [Project: :sample] variant.getOutputFile() is deprecated. Call it on one of variant.getOutputs() instead. が表示されるので書き直しました。

applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
        variant.outputs.each { output ->
            System.println("* output.outputFile.name : ${output.outputFile.name}")
            if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                // Rename APK
                def applicationId = defaultConfig.applicationId
                def versionCode = defaultConfig.versionCode
                def versionName = defaultConfig.versionName
                def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
                def newName = "${applicationId}_r${versionCode}_v${versionName}_${date}.apk"
                output.outputFile = new File(output.outputFile.parent, newName)
            }
        }
    }
}

outputs というから複数あるのかとおもいきや apk しかありませんでした。
無駄にネストが深くなる…。

参考

android - Gradle warning: variant.getOutputFile() and variant.setOutputFile() are deprecated - Stack Overflow

2014/10/22

AndroidStudio で APK の署名の設定を gradle.properties に記述する

Android Studio で Sigined APK を生成するには
ツールバーの [ Build > Generate Signed APK... ] から
ウィザードに従えば生成できます。
しかし、CUI から Signed APK を生成したいことがあるかと思います。
また、そのプロジェクトを public リポジトリで管理している場合に
署名に関する設定を公開しないようにするにはどうすればいいのかという問題もあります。

以下に示す方法では、証明に関する設定を gradle.properties に記述し、
.gitignore で gradle.properties を公開しないようにすることで
署名に関する情報を秘密にしておくおことが可能です。

Generate signed APK has been named by program · bc41551 · wada811/Android-Material-Design-Colors

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.1"

    defaultConfig {
        applicationId "at.wada811.android.material.design.colors.sample"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 2
        versionName "1.1.0"
    }
    signingConfigs {
        release
    }
    buildTypes {
        release {
            runProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
}

...

if (project.hasProperty('storeFile')) {
    android.signingConfigs.release.storeFile = new File(System.getenv('HOME'), storeFile)
}
if (project.hasProperty('storePassword')) {
    android.signingConfigs.release.storePassword = storePassword
}
if (project.hasProperty('keyAlias')) {
    android.signingConfigs.release.keyAlias = keyAlias
}
if (project.hasProperty('keyPassword')) {
    android.signingConfigs.release.keyPassword = keyPassword
}

storeFile=/path/to/your.keystore
storePassword=keystorePass
keyAlias=appAlias
keyPassword=appPass

gradle.properties

new File(System.getenv('HOME'), storeFile) がキモで、
file(storeFile) にするとプロジェクトの相対パスで認識されるから
プロジェクトに keystore を含めるか、無理やり相対パスからたどるかになるんだけど
前者はプロジェクトごとに keystore を入れなければならなくて一元管理できないし、
後者は環境によってパスが変わりうるから微妙になります。
その点、new File(System.getenv('HOME'), storeFile) は $HOME からの絶対パスになるので統一しやすいです。

参考

AndroidStudio - Android Studio(Gradle)でapkファイルを作成する時にstorePassword/keyAlias/keyPasswordの指定方法をいくつか検証してみた。 - Qiita

2014/10/15

[Android]ActionBar のタイトルの文字色を変更する

ActionBar のタイトルの文字色を変えるメソッドはないので
あまり変えてやろうと思うこともないかと思いますが
気まぐれに文字色を変えたくなった時のためにメモしておきます。

Theme でActionBar のタイトルの文字色を変更する

普通の方法ですが、動的に変更することができません。
<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="actionBarStyle">@style/AppTheme.ActionBarStyle</item>
    </style>

    <style name="AppTheme.ActionBarStyle" parent="Widget.AppCompat.Light.ActionBar">
        <item name="titleTextStyle">@style/AppTheme.ActionBar.TitleTextStyle</item>
    </style>

    <style name="AppTheme.ActionBar.TitleTextStyle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
        <item name="android:textColor">@color/red</item>
    </style>

</resources>
<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:actionBarStyle">@style/AppTheme.ActionBarStyle</item>
    </style>

    <style name="AppTheme.ActionBarStyle" parent="Widget.AppCompat.ActionBar">
        <item name="android:titleTextStyle">@style/AppTheme.ActionBar.TitleTextStyle</item>
    </style>

</resources>

Programmatically

String title = getResources().getString(R.string.title);
int titleColor = getResources().getColor(R.color.titleColor);
String htmlColor = String.format(Locale.US, "#%06X", (0xFFFFFF & Color.argb(0, Color.red(titleColor), Color.green(titleColor), Color.blue(titleColor))));
String titleHtml = "<font color=\"" + htmlColor +  "\">" + title + "</font>";
getSupportActionBar().setTitle(Html.fromHtml(titleHtml));

Html とかウケる。こんな方法があったとは。

参考
android - ActionBar text color - Stack Overflow

2014/10/05

git diff で JSON を整形して比較する

Git でJSON を整形して比較できるらしいのでメモ。
JSON だけでなく Word や ODT、 Jpeg や PNG なども
実ファイルを比較時に変換させることができるみたいです。

参考
Git - Git Attributes
Git - gitattributes Documentation

設定

*.json diff=json
[diff "json"]
 textconv = "jq ."