2016年2月29日 星期一

關閉 Android Transfer 自動開啟服務 @ Mac OS X 10.11.3

好一陣子,每次手機插上 Mac OS X Usb 後,就會自動彈跳 Android Transfer ,有些不方便 :P 解法就是關閉相關程式,例如重新命名:

$ kill `pgrep "Android File Transfer Agent"`
$ cd $HOME/Library/Application\ Support/Google/Android\ File\ Transfer && mv Android\ File\ Transfer\ Agent.app/ Android\ File\ Transfer\ Agent-DISABLE.app/
$ cd /Applications/Android\ File\ Transfer.app/Contents/Resources/ && mv Android\ File\ Transfer\ Agent.app/ Android\ File\ Transfer\ Agent-DISABLE.app/


之後,有需要 Android Transfer 時,就自行去點擊開啟他吧!

2016年2月27日 星期六

Android 開發筆記 - 在 Android Studio 環境上,使用 Google Analytics SDK / Admob SDK

使用 Android Studio 1.5.1 版,原先參考 Google 官方文件,結果一直爆問題 :P 其中 Google Analytics SDK 跟 Admob SDK 都會需要 Google Service 的環境,而碰到 Google Service 的引入不斷出錯,以下單純記錄修正流程。

參考 https://developers.google.com/analytics/devguides/collection/android/v4/https://developers.google.com/admob/android/app 資訊,更新 AndroidManifest.xml 位置,添加:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


接著在 build.gradle (Project) 添加:

classpath 'com.google.gms:google-services:2.0.0-alpha6'

在 build.gradle (app) 添加:

dependencies {
//...
compile 'com.google.android.gms:play-services-analytics:8.4.0'
}
apply plugin: 'com.google.gms.google-services'


結果一直出錯:Gradle sync failed: Unable to load class 'com.android.sdklib.repository.FullRevision'. 這種很 general 的訊息。

甚至跑去看看 googlesample 檔案,如:
分別查看:build.gradleapp/build.gradle 和 gradle/wrapper/gradle-wrapper.properties 三個檔案。

改採用:

dependencies {
        //classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'

        classpath 'com.android.tools.build:gradle:2.0.0-beta5'
        classpath 'com.google.gms:google-services:2.0.0-beta5'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
}


仍是一樣的現象,最後靠直覺,嘗試亂改 classpath 'com.google.gms:google-services:1.0.0+' 後,會看到錯誤訊息引導說,可以查看 metadata 得知有哪些版本可用:

https://jcenter.bintray.com/com/google/gms/google-services/maven-metadata.xml

就這樣,直接挑沒有 beta/alpha 字眼:

dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
        classpath 'com.google.gms:google-services:1.5.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
}


以及 gradle/wrapper/gradle-wrapper.properties 使用:

#distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-all.zip

如此一來,終於解掉編譯問題。接續就可以參考 Google Analytics SDK/Admob SDK 的文件,例如產生 google-services.json 以及 AnalyticsApplication extends Application 等用法等。

最後,我自己的用法:

AndroidManifest.xml:
...
<application
        android:name=".MyApplication"
        ...
>
...
</application>


MyApplication.java:
import android.app.Application;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.Tracker;
public class MyApplication extends Application {
        private Tracker mTracker;
        synchronized public Tracker getDefaultTracker() {
               if (mTracker == null) {
                      GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
                      // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
                      //mTracker = analytics.newTracker(R.xml.global_tracker);
                      mTracker = analytics.newTracker("UA-XXXXXXX-XX");
               }
               return mTracker;
        }
}


build.gradle (app):
dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'

        compile 'com.android.support:appcompat-v7:23.2.0'
        compile 'com.android.support:design:23.2.0'

        // Google Analytics & Admob
        compile 'com.google.android.gms:play-services:8.4.0'
        compile 'com.google.android.gms:play-services-ads:8.4.0'
        compile 'com.google.android.gms:play-services-analytics:8.4.0'
}


build.gradle (Project):
dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'

        classpath 'com.google.gms:google-services:1.5.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
}


MainActivity.java:
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyApplication application = (MyApplication) getApplication();
        Tracker mTracker = application.getDefaultTracker();
        mTracker.setScreenName("main");
        mTracker.send(new HitBuilders.ScreenViewBuilder().build());
        //...
}

Android 開發筆記 - 在 Android Studio 環境上使用 NDK (JNI) @ Mac OS X 10.11.3

上一次把玩已經是 2011 年的事了 :P 這次再練一下。首先,我已經安裝好 Android Studio 1.5.1 版本。接著先下載 Android NDK:

Android Studio -> SDK Manager -> Android SDK -> SDK Tools -> 勾選 Android NDK (1.0.0) -> 進行下載。下載完後可以看到 Project -> local.properties 已經自動埋好 ndk.dir=/path/ndk 資訊啦,若一開始 local.properties 有 ndk.dir 資料,或許會造成問題。

接著,依照 http://tools.android.com/tech-docs/new-build-system/gradle-experimental#TOC-Ndk-Integration 簡介在 build.gradle (Module: app) 添加這一段:

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.2"
        ndk {
            moduleName "native"
        }
    }
}


Sync Now 後,立馬得到: Error:(23, 0) Plugin with id 'com.android.model.application' not found.

找了很久,最後參考 googlesample 範例(隨便挑一個,例如:https://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/app/build.gradlehttps://github.com/googlesamples/android-ndk/blob/master/MoreTeapots/build.gradle),做了很多動作:

先到 build.gradle (Project) 更新:

dependencies {
        //classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.android.tools.build:gradle-experimental:0.4.0'
}


再把 build.gradle (Module: app) 整段更新:

/*
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "YourAppPackageName"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
// */

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.2"

        defaultConfig.with {
            applicationId = "YourAppPackageName"
            minSdkVersion.apiLevel = 15
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
    }
    android.buildTypes {
        release {
            minifyEnabled = false
            proguardFiles.add(file('proguard-rules.pro'))
        }
    }
    android.ndk {
        moduleName = "native"
    }
}


按下 Sync Now 後,終於沒問題了,離 JNI 又更進一步了!

再點擊 app 目錄 => 按右鍵 New -> Folder -> JNI Folder ,再到 jni 目錄添加一下檔案 -> New -> C/C++ Source file -> 此例用 main.cpp/main.h 為例。

如此一來,只要 Build APK 後,跑去 unzip app-debug-unaligned.apk 後,可以看到以下的目錄結構:

$ tree lib/
lib/
├── arm64-v8a
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── armeabi
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── armeabi-v7a
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── mips
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── mips64
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
├── x86
│   ├── gdb.setup
│   ├── gdbserver
│   └── libnative.so
└── x86_64
    ├── gdb.setup
    ├── gdbserver
    └── libnative.so


其中 libnative.so 則是跟 android.ndk 裡定義的名字。

2016年2月20日 星期六

使用 Jubler 調整字幕 srt 時間軸 @ Mac OS X 10.11.13

VLC Subtitle Shift time

又有一陣子沒在看影片,都忘了當初也做過一樣的事,因此來紀錄一下 Orz

簡言之有一套免錢的軟體叫做 Jubler Subtitle Editor,這套需要 Java 執行環境,透過他就可以把字幕播放時間平移,以此達到修正字幕播放時間。

修正 Windows VLC UTF-8 字幕亂碼的問題 @ Windows 10

首先,字幕很確定是 UTF-8 了,因為在 VLC @ Mac OS X 是正常的,但一樣的檔案搬去 Windows 10 則無法正常顯示。

VLC Player -> 工具 -> 偏好設定:

  • 預設編碼: UTF-8
  • 字型:Microsoft YaHei
一開始以為換編碼就行了,接著以為字型換中文(細明體)的就行了,最後還是上網查別人的招數,竟然連字型也是個關鍵 Orz

使用 VLC 動態調整字幕時間軸 (Sub sync: set bookmark first) @ Mac OS X 10.11.13

很多播放軟體都有提供延遲或增快字幕的播放機制,但很多都是預先要設定個秒數,不見得方便。最近使用 VLC 後,發現他有非常人性化的設置,當你要處理字幕跟影片的落差時,假設字幕跑得比較快,可以先用 Shift+J 快速鍵記錄某字幕出來的時間,接著當你聽到對應聲音的時間時,請用 Shift+H 記錄,接著再按 Shift + K 後,VLC 就自動幫你同步好了!實在方便啊,紀錄一下。

若字幕或聲音沒有都設置 bookmark 時,直接按 Shift + K 會得到:Sub sync: set bookmark first 訊息。

筆記:

  • Shift + H:定位 Audio 時間位置
  • Shift + J:定位 Subtitle 時間位置 
  • Shift + K:將 Audio 跟 Subtitle 時間同步

2016年2月18日 星期四

[Linux] 使用 find -ctime 刪除指定時間區間的檔案 @ Ubuntu 14.04

find -ctime 指令非常方便,例如找時間大於七天的資料:

$ find /path -ctime +7

所以要刪除七天以上的資料,的確可以靠上述完成,但如果有備份程式掛了沒產出時,豈不是會刪光資料?所以又有一招可以找最新七天內的資料:

$ find /path -ctime -7

因此,我就把自動清空指令改成:先判斷備份程式是否正常,正常的話,則刪除某段時期的資料。

連續動作:

$ sh -c  'files=`find /data/jenkins-backup -maxdepth 1 -ctime -7 | wc -l` && test $files -gt 20 && find /data/jenkins-backup -ctime +7 -delete '

而這段意思就是在處理 Jenkins 自動備份機制,因為一天會備份多次,所以用 20 個當作七天內至少要有 20 筆備份資料,當備份資料有正常產出時,在刪除大於七天內的資料。而採用 sh -c 的方式是可以埋在 crontab 中來做事,包含指定 sudo -u user 來限制不小心砍錯資料。

AWS 筆記 - Godaddy 續約憑證 (HTTPS/SSL) 以及 Load Balancer 憑證更新方式

AWS ELB Certificate

購買了每兩年更新一次的憑證服務,然而,憑證更新的原理是所有機器的憑證都會替換掉的。所幸更新憑證時,新舊憑證都會共存的,而 Godaddy 給予 90 天的區間來處理。

官方文件:https://tw.godaddy.com/help/ssl-864
您需要執行幾個步驟後方能續約 SSL,續約操作視憑證類型及網站託管地點而定。 即使您的 SSL 是自動續約,您也需要套用續約積分,並透過帳戶完成續約請求。
您可以在 90 天續約窗口期內購買及套用 SSL 續約: 過期前 60 天至過期後 30 天內。
例如,若您的憑證在 6 月 15 日過期,則您必須在 4 月 15 日至 7 月 15 日間購買並套用續約積分。
在您購買續約積分或您的 SSL 自動續約後,您必須將積分套用至即將過期的 SSL,並完成續約請求。 倘 SSL 過期且您沒有在 90 天續約窗口期內完成續約請求,則之前正常的網站會出現錯誤訊息。
先走一輪 Godaddy 設定:
  1. 在 https://certs.godaddy.com/cert 挑選要續約的憑證,可以看有效日期 
  2. 檢視狀態
  3. 狀態: 續約憑證 -> 點擊後則是一些簡易流程、送單
  4. 接著就只需等待,大概10分鐘內,可以在 https://certs.godaddy.com/cert 看到有效日期被拉長了
  5. 進去檢視憑證,接著下載新的憑證資料(以 Apache 來說,內容物就 gd_bundle-g2-g1.crt 和 yourdomain.crt 兩個檔案)
接著 AWS ELB 的設定:
  1. 在 EC2 -> Load Balancers -> 挑選指定 ELB
  2. 切換至 Listeners 分頁 -> SSL Certificate -> 點選 Change 就可以上傳新的憑證資料
若有其他 ELB ,則直接 Change 到新設定的即可。

2016年2月11日 星期四

How Much Did They Pay You To Give Up On Your Dreams?


最近這一兩年,同儕不外乎追求著數字上的卓越,彼此分享的資訊大概都補足了台灣、大陸和美商的價碼,就是一張冷冰冰的薪資年資梯度表罷了,然而,這段影片就常常出現在我的耳邊:他們到底付了多少錢,讓你放棄夢想?

幾天前和學弟聊了幾句,有的夢想只剩下到國外掙更多的數字,有些人接近了資方,除了替自己的福利爭取時才會轉換勞方心態外,冰冷冷的心態還是沒啥兩樣。到底人是為了熱情工作呢?還是為了未來?還是,就單純的數字?就像玩世紀帝國,不斷地挖礦、搶礦,砍樹種田等,結果從頭到尾就只是數字一直爬昇著,接著就 Game Over 了?

想想未來,想想最初的那一刻吧 :) 這世上一定有更多有趣的事可以追隨的,想不起當年的夢想也沒關係,再找下一個夢想吧!新年快樂!