2014年6月7日 星期六

[Android] 技術網站分享


最近發覺一個很好的android 3rd party網站http://android-arsenal.com/,
裡面提供很多目前受歡迎的第三方library可以讓開發者使用,大部分都附上github的source code,因此可以直接從別人撰寫的套件裡學習程式架構與風格,對於技術上的提升有頗大助益。

2014年5月1日 星期四

[Android]正確的Handler寫法,避免造成Memory Leak

在Andorid開發過程中,Handler是很頻繁使用的類別,主要任務在處理Sub Thread與UI Thread的溝通,因為在Thread裡是無法直接更新UI的資訊,必須透過sendMessage方式,把資訊塞進Message類別中傳送出來,接著在Handler的handleMessage function裡就會接收到,並作後續的動作。

一般我們比較常用以下這樣的寫法
private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // ...
         }
    };

2014年2月15日 星期六

[Android] 讓ActionBar上的OverflowMenu always顯示出來

由於Android手機眾多,以前有實體的setting鍵,到最近的機種,大多把實體手機設定鍵移除了,因此ActionBar的OverflowMenu在有實體鍵的手機,預設會隱藏起來,由於工作上的需求希望可以不論是否有無實體按鍵都能夠顯示出來,找了一些資料,發覺可以使用下方的寫法,就可以解決此問題。

2013年2月2日 星期六

[Tool] 使用ccache可以加快build code的速度

在build android的source code,如果電腦硬體不夠好時,往往會build很久,google非常的貼心,針對此情況提供了ccache的機制可以減少編譯的時間,通常第一次clean build會花比較久時間,往後就會節省大約20%的時間,提升開發的效率。

●添加環境變數
export USE_CCACHE=1
●建立緩存的目錄
export CCACHE_DIR=<path-to-your-cache-directory>
●設定緩存的空間
prebuilts/misc/linux-x86/ccache/ccache -M 50G

2013年1月19日 星期六

[Android] RemoteView & AppWidget機制介紹

@ What is Widget
AppWidget framework通過broadcast intents和你的widget溝通,例如當需要更新Widget的時候。透過使用RemoteViews構建和發送。RemoteViews將Widget的layout和特定内容包裝後,藉由IPC傳送到Launcher,最後顯示到桌面上。

@ What is RemoteViews
RemoteViews並不是一個真正的View,而只是一個用於整合Widget裡layout呈現與view元件行為的一個Wrapper class(也就是appWidget所要長得樣子),透過RemoteView把建立該Widget需要的resource ID和各個元件的事件封裝起來。 RemoteViews會通過進程間通信機制傳遞給AppWidgetHost。

2013年1月5日 星期六

[Tool] Tmux(在家工作的好工具)

工作上有時需要假日連回公司,sync最新的code base或是build code的動作,可以節省隔天上班時等build code的時間,一開始都是直接用pietty或是ssh連回去,缺點就是當在build code時,家裡電腦上的console視窗不能關閉,這樣就中斷build code的工作了,所以就找尋看看有沒有可以關閉後還能夠繼續工作的tool。

2012年12月1日 星期六

[C++] A *a 和 A *aa = new A 的差別

在寫C++過程中,指標的使用與操作是最頻繁被使用的,有些難解的bug,通常point佔絕大多數,這裡複習一個很基本的概念。

如下面的例子,個別使用兩個a指標,也各自呼叫他們的member function test(),發覺都可以印出test的字串,但為什麼第一個指標明明是指向undefine的空間,為什麼不會出現問題呢,不是應該要出現Segmentation Fault嗎?

這裡隱藏一個很重要,也很容易被誤解的觀念,通常使用null point或不知指向何處的point時,操作member function是不會發生Segmentation Fault的,會產生Segmentation Fault是在操作它的member時,如果下面的程式碼多加上一段a->value的話,當程式運行到這一行就會發生crash了。

2012年11月11日 星期日

[Aadroid] Android版本控制工具---Repo(轉)

Android 原始碼下載及版本控制 - 使用git與repo

要取得Android的原始碼,會需要用到Git和Repo還有Gerrit。 以下解釋一些工具,太冗長,可直接拉到最下方看如何取得Android原始碼。

什麼是Git?

Git is an open-source version-control system designed to handle very large projects that are distributed over multiple repositories.

那Git for Android是?

In the context of Android, we use Git for local operations such as local branching, commits, diffs, and edits. One of the challenges in setting up the Android project was figuring out how to best support the outside community–from the hobbiest community to large OEMs building mass-market consumer devices. We wanted components to be replaceable, and we wanted interesting components to be able to grow a life of their own outside of Android. We first chose a distributed revision control system, then further narrowed it down to Git.

2012年11月1日 星期四

[Tool] Source Insight常用的快捷鍵

@Source Insight常用的快捷鍵:

  • Ctrl+= :Jump to definition
  • Alt+/ :Look up reference
  • Alt+分頁標題首字字母 : 切換至該標題的頁面
  • F3 : search backward
  • F4 : search forward
  • F5: go to Line
  • F7 :Look up symbols
  • F8 :Look up local symbols
  • F9 :Ident left
  • F10 :Ident right
  • Alt+, :Jump backword
  • Alt+. : Jump forward
  • Shift+F3 : search the word under cusor backward
  • Shift+F4 : search the word under cusor forward
  • F12 : incremental search
  • Shift+Ctrl+f: search in project
  • shift+F8 : hilight word

2012年10月27日 星期六

[Vim]常用的技巧記錄

@VIM外掛安裝方式

透過github
(1)使用git submodule add  "要安裝plugin的路徑"   bundle/plugin-name
frank@frank:~/.vim$ git submodule add https://github.com/vim-scripts/taglist.vim.git bundle/Taglist  ./bundle/Taglist

(2)輸入指令初始化外掛
frank@frank:~/.vim$ git submodule init

2012年10月13日 星期六

[C++]必須傳回物件時,別妄想傳回其reference

函數的回傳值使用上要非常的小心,雖然程式寫久了,這算是比較基礎的概念,但有時一疏忽,往往就會造成系統Crash,簡單來說,函式產生新物件的路徑有二,在Stack空間或是在Heap空間裡,以底下例子來說。

const Rational& operator* (const Rational& lhs,
                                        const Rational& lhs)
{
    Rational result(lhs.n * rhs.n, lhs.d* rhs.d)
    return result;
}

2012年9月21日 星期五

[C++]寧以pass-by-reference-to-const取代pass-by-value

在C++裡函式參數使用pass-by-value的話,會造成參數的傳遞成本增加,所以在C++應用程式或是component開發上比較少使用pass-by-value。

在Google C++ Style Guide裡有提到Google內部使用C++ coding的規則,從裡面也可以看到Google的rule為所有函式的參數必須是pass-by-reference,並且加上cosnt,表示傳入的參數是不可以變動的,這時你可能會有個疑問,如果函式的實作需要修改到傳入的參數怎麼辦,當然這應該是很常見的case,所以他們對於有需要更改操作的arguments,可以使用pass-by-point的方式。

2012年9月15日 星期六

[Android] 常用的adb指令


身處在開發Android的公司,adb指令可以說是跟mobile device有非常密切的關係,舉凡push, pull data到devices上,甚至debug除錯等,都會需要使用到adb工具,所以了解並熟悉adb的一些指令對於開發上具有非常大之幫助。


◎這裡列出官網上提到,以及比較常使用到的指令

1.adb devices (顯示目前有多少個模擬器正在執行) 

2.adb -s (指定模擬器來操作)  
    Ex:adb -s emulator-5554 install camera.apk

2012年8月25日 星期六

如何使用gsr偵測Memory Leakage

GSR是我們Project裡用來反覆執行相同動作的tool,主要可以用在系統開發階段後期,對於開發好的AP或是component進行壓力測試,順便也可以偵測記憶體使用情況,例如Lauhch與Exit某支AP,當這個動作運行5000次後,計算Memory的使用情況,藉此某個AP或是component 是否有Memory Leakage。


2012年8月4日 星期六

[Linux] 遞迴搜尋文字-grep

在Linux底下很常使用grep去搜尋某些特定字串,有一些使用方式記錄下來,可以方便以後快速查詢。

[root@www ~]# grep [-acinv] [--color=auto] '搜尋字串' filename
選項與參數:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
--color=auto :可以將找到的關鍵字部分加上顏色的顯示喔!


1.以 grep 尋找一個檔案中的文字:
grep "abc" file.txt
2.如果要在子資料夾間搜尋,可以用
grep -r "abc" .
來完成,以 -r 來表示要遞迴子資料夾,而 . 則是代表由所在資料夾開始搜尋。
3.還可以用 --include 來指示目標檔案名稱:
grep -r --include="*.php" abc .
或用 --exclude 來排除一些檔案:

2012年7月27日 星期五

[Git] 工作上常使用到的git指令


@可以看某個git check point的詳細紀錄 
git log -p -l 2afeedb08454260516db332d70e661c3ae35e216 

@git 退版 
git checkout -b GoogleReader 2afeedb08454260516db332d70e661c3ae35e216 
說明:新增一個GoogleReader的branch並還原到後面commit point的時間版本 

@建立git push rule的範本 
git config commit.template ~/git-template 

@建立新的branch 
git branch 'branch name' 
Ex. git branch working; //建立一個名字為working的branch 

@刪除branch 
git branch -D 

@只加修改過的檔案, 新增的檔案不加入 
git add -u

2012年7月21日 星期六

[Android] android debug tool - addr2line


一、目的
當程式運作遇到segmentation fault時,可以使用工具來偵測發生錯誤的位置。

二、範例如下所示
通常一旦出錯,錯誤訊息都會秀出這樣的log,只要記錄下address,就可透過addr2line偵測到程式碼哪一個function出錯。

I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   (   31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys'
I/DEBUG   (   31): pid: 378, tid: 386  >>> com.example.gltest <<<
I/DEBUG   (   31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG   (   31):  r0 001dbdc0  r1 00000001  r2 00000000  r3 00000000
I/DEBUG   (   31):  r4 00000000  r5 40a40000  r6 4051a480  r7 42ddbee8
I/DEBUG   (   31):  r8 43661b24  r9 42ddbed0  10 42ddbebc  fp 41e462d8
I/DEBUG   (   31):  ip 00000001  sp 436619d0  lr 83a12f5d  pc 8383deb4  cpsr 20000010
I/DEBUG   (   31):          #00  pc 0003deb4  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #01  pc 00039b76  /data/data/com.example.gltest/lib/libnativemaprender.so
I/DEBUG   (   31):          #02  pc 00017d34  /system/lib/libdvm.so

三、使用指令如下

格式:arm-linux-androideabi-addr2line -Cfi -e xxx.so 123456

實際使用:arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4

2012年5月25日 星期五

[Android] Android resource觀念整理

以下整理一下Android resource核心的觀念跟作法,android resource其實也是一個複雜的東西,包含Style與Theme的撰寫,兩者的差異在哪,
以下列出幾點問題如果可以釐清,我想對於應該就已經攻破android resource了。
1.Resource有哪些,String、Color、boolean.......
2.各個名詞解釋,style、theme、attr是什麼,要能夠口頭敘述出來。
2.AttributeSet跟TypedArray是什麼? 兩者有什麼關聯性,在程式碼中怎麼使用。
3.Styleable是什麼,跟style有關嗎?


2011年11月29日 星期二

dynamic linking library in linux

最近看到許多linux的新一點的project許多都使用dynamic linking來架構其C程式,其中dlopen這個系列雖然是很lightweight但是卻十分好用,幾年前看到dlopen的使用便覺得很酷,因此寫一個粗淺的文章來談談dlopen library。

不了解dynamic linking library嗎?我想一個例子便是Microsoft的COM架構,這類的方式有許多好處,首先是對於軟體設計人員可以更自由的與其他人開發的library獨立開發。這裡要知道的是他確實是dynamic的來連結,一般的library的linking多是在linker的階段完成,也就是說在你執行ld的時候(或是由gcc呼叫ld)便將library與執行檔的symbol link完成。因此就算你是用shared library依然在link stage後便會與特定的library有連結。

原本這樣的做法很OK,但是隨著軟體設計的彈性需求越來越被重視,一個問題開始出現:我們是不是可以在程式執行時期再來決定library的symbol link。因此一堆相對應的方式開始產生,Microsoft的COM元件便是很成功的一個方案,然而早期在linux卻苦無解決方案,直到dlopen這個library的出現。

其實他很簡單,大多數的動作都可以只用3個function便可以做完,分別是dlopen、dlsym與dlclose。dlopen當然是用來開啟一個動態連結的library,dlsym用來載入相關的symbol link,dlclose用來關閉library。我想這樣應該是有點難以了解,因此我們用一個簡單的例子來說明吧。假設我們有些情況需要求出一個連續整數的平方和,有時候卻要求立方和,現在假設求完和後的程式就跟求平方和或立方和的運算無關了,而且或許未來有4次方和或更高次方的需求,我想這是個可以考慮用dlopen來解決的狀況(好啦...這個例子太殺雞用牛刀...不過只是為了說明....睜隻眼閉隻眼吧)。

首先我們必須先定義好我們的dynamic linking library的interface,因此我們寫下了定義的include檔如下
struct integer_list {
        struct integer_list *next;
        int num;
};

typedef void(*show_info)();
typedef int(*begin_calc)(struct integer_list *l);

typedef struct _func_plugin
{
        show_info info;
        begin_calc calc;
} func_plugin;

typedef func_plugin*(*get_plugin_interface)();
首先,因為我們要有一串未定長度的整數,因此我們用linked list來儲存他(這時候就會很懷念C++ STL的vector),這個介面只需要一個計算的function,但為了說明清楚一點,我們再給他一個秀出自己訊息的function。將他包在一個結構中後,在定義一個回傳symbol的function就可以。

當我們要用到這些動態的library的時候,我們可以用剛剛提到的3個function來處理,這裡我定義一個function來計算如下
int use_plugin(char *plugin_file, struct integer_list *n)
{
        void* plugin;
        func_plugin *f;
        int result=-1;

        plugin = dlopen(plugin_file, RTLD_NOW);
        if (!plugin)
        {
                printf("Open plugin error\n");
                return -1;
        }
        get_plugin_interface get_func;
        get_func = (get_plugin_interface) dlsym(plugin, "get_plugin");

        if (!get_func)
        {
                printf("dlsym error\n");
                dlclose(plugin);
                return -1;
        }

        f = get_func();
        f->info();
        result =  f->calc(n);

        dlclose(plugin);

        return result;
}
你可以看到這個函數接受兩個參數,一個是我們要使用的library的位置,另一個是我們要計算的整數列,軟體開發者在開發階段已經可以利用dl library將程式編譯成執行檔而不用去在意library的實作,當然你在程式要去輸入你要使用的library位置(command-line參數或設定檔....隨你高興吧)。

最後是我們怎麼完成一個獨立的library的時候了,一個簡單的做法如下
#include 
#include 
#include 
#include "func_plugin.h"

void sqar_sum_info()
{
        printf("This plugin is about square sum\n");
}

int sqar_sum_calc(struct integer_list *l)
{
        int result=0;
        struct integer_list *tmp = l;

        while(tmp != NULL)
        {
                result += (tmp->num * tmp->num);
                tmp = tmp->next;
        }

        return result;
}

func_plugin square_sum_plugin =
{
        sqar_sum_info,
        sqar_sum_calc
};

func_plugin *get_plugin()
{
        return &square_sum_plugin;
}
很簡單吧,你只要去真正實作介面定義的函式便好,因此假設我們這個程式檔叫作square_sum.c,我們可以這樣製造出我們要的library
gcc -shared -fPIC -W1,-soname,libsqr_sum.so -o libsqr_sum.so square_sum.c 
這樣一來我們的簡單示範就完成啦,因此你可以發現你可以任意替換掉計算的部份,只要你傳入不同的library進去。下次要開始你的project之前或許先想想是否有一些部份也是有這方面需求,試試dl library來完成你複雜的架構吧。不過.....台灣的軟體開發好像最不給開始的規劃時間....ㄏㄏ.....算了,engineer們,玩的高興就好。

轉貼自:http://sites.google.com/site/joepasscheng/dynamiclink

2011年10月29日 星期六

[Flex]如何在tree中使用搜尋功能

Flex裡內建的元件非常豐富,都是能幫助我們能夠快速開發的好幫手, 今天要介紹一下tree此元件,有使用過的人都曉得,若目前要開發的功能 需要主副階層的呈現方式,那麼List可能就不符合我們所想要的囉!此時 tree就派上用場了,本文要介紹就是當tree的類別累積未來越多時,如何 透過搜尋的欄位,快速找尋到我們所要的項目。