星期六, 4月 27, 2013

取得外掛字幕 srt 的內容


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.R.integer;
import android.content.Context;
import android.util.Log;

/**
 * class for read and parse srt subtitle
 * 
 * This class is used to read and parse srt subtitle 
 * 
 */
public class VNSubtitleSRT {
 private static Matcher srtMatcher = null;
 
 public VNSubtitleSRT() {
  // do something
 }
 // --------- read srt file contents ----------
 /**
  * get subtitle srt file contents
  * @param filename SRT filename
  * @return SRT file contents
  */
 public static String getSRTContents(String filename) {
  StringBuilder text = new StringBuilder();
  try{
      //Get the text file
   BufferedReader br = new BufferedReader(new FileReader(filename));
         String line;
         while ((line = br.readLine()) != null) {
          text.append(line);
          text.append("\r\n");
         }
         br.close();
   return text.toString();
     }catch(Exception e){
         e.printStackTrace();
     }
  return "";
 }
 // --------- parse srt contents ---------------
 /**
  * parse srt file contents to ArrayList
  * @param contents srt file contents
  * @return false:parse error, true:parse correct
  */
 public static boolean parseSRTContents(String contents) {
  String pat = "(\\d+)\r\n(\\d{2}\\:\\d{2}\\:\\d{2},\\d{3}) --\\> (\\d{2}\\:\\d{2}\\:\\d{2},\\d{3})\r\n([\\s\\S]*?\r\n\r\n)";
  Pattern p = Pattern.compile(pat);
  srtMatcher = p.matcher(contents);
  if (srtMatcher.find(0)){
   return true;
  }
  return false;
 }
 // --------- get subtilte from CurrentPosition -------------
 public static String getSubtitle(int currentPosition){
  String sequence = "";
  int start = 0;
  int end = 0;
  String text = "";
  if (null == srtMatcher){
   return "";
  }
  if (!srtMatcher.find(0)){
   return "not find matcher";
  }
  while(srtMatcher.find()){
   sequence = srtMatcher.group(1);
   start = timeToInt(srtMatcher.group(2));
   end = timeToInt(srtMatcher.group(3));
   text = srtMatcher.group(4);
   if (currentPosition > start && currentPosition < end){
    return text;
   }
  }
  return "";
 }
 // --------- time to int ------------
 private static int timeToInt(String ctime){
  int hours = Integer.valueOf(ctime.substring(0, 2));
  int mins =  Integer.valueOf(ctime.substring(3, 5));
  int secs =  Integer.valueOf(ctime.substring(6, 8));
  int msec =  Integer.valueOf(ctime.substring(9, 12));
  
  return (hours*60*60 + mins*60 + secs)*1000 + msec;
 }
}

Android Debug Bridge

Adb 全名是 Android Debug Bridge,是開發或使用 Android 時很常用到的工具。使用者可以從Android 官方站下載 SDK,在其中的 platform-tools (原本在 \Tools) 中找到。

當機器上有打開 USB debug mode 時,使用者即可通過adb 進行各種 debug 、底層(linux user space)的 Android 功能。比較常用的功能:
- tools\ddms.bat: Android AP/Framework 層最主要的 debug tool
- 安裝 Android 應用程式
- 連接機器,使用 linux userspace 的功能。 ex: ping, ssh, ftp ... blah blah.

adb的工作方式比較特殊採用監聽Socket TCP 5554等端口的方式讓IDE和Qemu通訊,預設情況下adb會daemon相關的port。

這篇文章主要是整理了一些adb 的基本功能,後面補上一些開發時常用的功能。

文件參考:

- 官方的說明文件: http://developer.android.com/tools/help/adb.html
- Android模擬器adb命令介紹

- Source code: system/core/adb/ ,除了 adb client 跟 adbd (Android 系統內負責處理 adb 功能的 daemon)的實作外,裡面包含了 service 跟 overview 的文件。

功能介紹
1. 通過adb 進入機器或模擬器的shell模式
adb shell
也可以執行各種Linux的命令,其命令格式為:adb shell command

PS: 當 adb shell 之後提示字元為"#"時,表示使用者為 root (最大權限),若是 "$" 則是以shell 權限工作

adb shell ls 就是列出目錄
adb shell dmesg 會列印出Linux kernel log
adb shell cat /proc/kmsg 持續印出 kernel log (需要 root)
adb shell keyevent 1 輸入 keyevent,可輸入的內容參考 adb shell keyevent

2. 安裝Android 應用程式(*.apk)
可執行adb install android123.apk,這樣名為android123的安裝包就會安裝到Android模擬器中,前提是android123.apk文件需要放到SDK\Tools目錄下。
比較特殊的安裝方法還有:
"-r": 當已經安裝過舊版本的程式時,可以使用 -r 去覆蓋。
"-f": 強制安裝,通常在安裝程式時會遇到相容問題,可使用此參數解決。

3. PC 端與Android 機器的檔案傳輸
除了使用記憶卡模式外,還可使用下面命令可以進行檔案傳輸:
把android123.txt 傳到機器上的/tmp/ 資料夾中:
adb push android123.txt /tmp/android123.txt

從機器上把 android123.txt 抓到PC端:
adb pull /tmp/android123.txt android123.txt

4. 顯示系統資訊 - dumpsys
除了直接輸入 adb shell dumpsys 外,也可以另外指定要顯示的 service,簡列一些參數,用法如:
adb shell dumpsys SurfaceFlinger
battery: 列出基本的電池資訊
batteryinfo: 各種功能使用 power 的狀況,同About Phone 裡面的電池使用狀況。
SurfaceFlinger: 系統的 Surface 使用情況
power: 列出 Power Manager 的參數,如 wakelock 時間等
alarm: 列出目前有註冊 alarm 者

5. 其他
- Android 預設可編譯成三種模式: eng, userdebug, user。一般使用者拿到的機器多是 user 版,當然如果是開發人員,可能會使用 eng 或 userdebug 版 進行debug。或是使用者自行 root 機器後,可使用下列指令取得 root 權限

adb root
- 一般為了防止系統出問題,所以 /system 通常在掛載時會設定為唯讀(read only),當使用者有root權限時,可使用下面指令將系統重新掛載成 R/W 模式,可對 /system 內的檔案做修改
adb remount
- 如果在使用 adb 時發現有* daemon not running. starting it now *的提示可以結束adb
adb kill-server
- 顯示 android 機器連接狀況
adb devices
- 等待正在運行的設備
adb wait-for-device
- Port forwarding,在某些應用如模擬器的網路連接使用、VNC時,會用到這項功能。主要是用來將機器上的的TCP port 5555 轉發到 port 1234
adb forward tcp:5555 tcp:1234
- 擷取系統內的各種資訊,產生 bug report
adb bugreport


香水

其實大約從高中時期開始, 我就對身上散發某種迷人淡淡香水味道的女生特別喜愛,
感覺非常有女人味, 對我有絕對的吸引力, 每次碰到這種女生, 都好想撲到她身上 (羞).

前一陣子, 我太太帶我去挑選男用香水, 首先去百貨公司的 Christian Dior 專櫃,
試聞了幾款香水, 發現都沒有喜愛的 (其實是該櫃姊服務有待加強), 於是就再到莎莎去找看看.
該莎莎的店員服務很不錯, 推薦一款 Ferre 男用淡香水, 還蠻對味的, 於是就決定是它了.

最近每天都噴一些此香水在身上, 自己聞的都覺得心情似乎也會變更好, 哈~~
我太太則是用 Novae Plus 紫貓物語的香水, 味道非常迷人, 不過她不太愛塗香水,
只有爾偶在某些場合才會用, 其實我還蠻希望她能每天用.

夏天快到了, 或許再找個時間去挑選一下適合夏天的香水也不錯.

星期日, 4月 07, 2013

同理心

“看一個人不順眼, 是自己的修養不夠”
的確, 每一個都有很多面向, 不能只依自己主觀的看到單一面向來評斷一個人,
而是要有同理心, 多站在對方的角度來思考.


以前因為讀書的時候, 看過”舒淇”的一些不雅照片, 直覺就對這個女影星很反感,
覺得她自甘墮落, 為了金錢, 成名而出賣自己的肉體甚至靈魂, 所以始終感覺她面目猙獰,
看了就討厭.
近來由於自己心態的改變, 也想到也許”舒淇”當初會拍那些不雅的電影或照片,
純粹是被騙, 或是被利用, 就算是因為想快速成名而做這些事, 也是因為當時還太年輕.
當我開始這樣想的時候, 再來看這些年 “舒琪” 演的一些電影, 發覺其實已不再討厭她了,
而且還覺得她散發出的氣質越來越好, 也難怪會愈受歡迎.
當然, 相信她也一直努力想擺脫過去, 且用心在自己的本位上, 才會有今天的好成績.


所謂相由心生, 不只是別人看你的相貌, 你看別人的相貌也都是取決於心啊.

星期六, 4月 06, 2013

色不迷人人自迷, 情人眼裡出西施

也許是年紀有了, 對很多事情常會感觸良多, 看個電影, 讀個書籍經常會感動莫名.
今天再次看了電視播出的 "霍元甲" 其中一段對話, 內容大致如下:
"茶品的上下高低,並不是由茶來對我們說,倒是人來決定的。不同的人,有不同的選擇,我不願做這個選擇"
"喝茶是一種心情。如果你的心情中了,茶的高低還有這麼重要嗎?"

月慈對霍元甲說:
"我不需要知道你的名字, 也不需要知道你從哪裡來, 要到哪裡去, 我只要知道你叫阿牛就行了"


很多事情其實都取決於我們的心, 所謂色不迷人人自迷, 情人眼裡出西施,
多用點心來體驗這個世界, 你將會發覺很多美好的事物其實一直都在身邊.