Android 強制安裝至 sd card

09 November 2011

下指令讓"所有" android app強制安裝到sd card中,
其實這個指令我還蠻常用到的,蠻常幫朋友下的。
但是每次都會稍微忘記!
所以記錄一下。

首先要先下載android sdk
下載以後,解壓縮放置您要放的目錄,
這裡假設放置在C槽,假設目錄名稱為android-sdk,
然後將手機插上USB線!
接著打開cmd (命令提示字元),
cd到C槽底下的android sdk目錄,在cd到platform-tools底下,
完整指令為
cd android-sdk/platform-tools

接著利用底下的adb.exe去執行強制安裝至sd card的指令,
指令如下:
adb shell pm setInstallLocation 2

2:代表讓所有app可以安裝至sd card
0:就是初始值,可以自己選擇
1:強制安裝在ROM裡面

所以如果要恢復初始值的話,指令如下:
adb shell pm setInstallLocation 0

read more »


Integer.valueOf的Cache機制

26 October 2011




如果有一個Integer的物件要宣告,
大部分的人宣告方式會是如下
Integer a = new Integer(2);

但如果其value是介於-128~127之間,
某些時刻可以使用下面的宣告方式
Integer a = Integer.valueOf(2);

某些條件下,速度較快一點點點!!
為什麼呢?? 我們來看下面的例子!

/*
* 如果不是用new Integer()去賦予值,
* 如果是下方的宣告方式,都會去call Integer.valueOf()這個method
* 也就是說下方的宣告方式,a=2 如同 a=Integer.valueOf(2)
*/
Integer a = 3;
Integer b = 3;
System.out.println( a==b ); //印出來會是什麼?

如果你的答案是false,只能說不完全錯
因為你的想法,可能是認為==是用來比較2個物件的位址是否相同。
如果你是這樣想,那你觀念對了,可是就是忽略掉了valueOf的cache機制。
這算是一個陷阱。

如果你的答案是true,只能說不完全對
因為得取決於你的想法,

  1. 如果你認為因為a是3,b也是3,3等於3阿,所以是true,那就大錯特錯了。你的觀念需要加強。因為==是比較2個物件的位置是否相同,也就說用來判斷是否為同個物件,並不是判斷value是否相同。
  2. 如果你是認為因為==是比較位置,且知道valueOf有cache機制,所以為true,那你答對了。

因為在call valueOf這個method時,
此method裡面會有判斷是否要調用cache的code,
如下,
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}

也就是說如果value是介於-128~127之間,
就會掉入到if裡面,而IntegerCache為一個class,
在使用這個class時就會去new 256個Integer的物件,並放入cache中,
所以在上面的例子a跟b的value都是3,
自然會調用同一塊cache,所以用==在比較時,他們的記憶體位置自然為同一塊。
因此答案為TRUE。

最後!!!
或許有人會覺得奇怪,cache會去new 256個Integer物件耶!!
這樣用valueOf怎麼會比較快呢??
上面有說到某些條件下,該條件就是,
如果是大量宣告的話,此時調用valueOf比較快的條件就成立了。


我們可以寫一小段code來判斷執行時間,如下
long lStart = System.nanoTime();
for (int i = 0; i < 1000000000 ; i++) {
Integer a = new Integer(3);
}
long lEnd = System.nanoTime()-lStart;

System.out.println((float) lEnd/1000000000);

lStart = System.nanoTime();
for (int i = 0; i < 1000000000 ; i++) {
Integer a = Integer.valueOf(3);
}
lEnd = System.nanoTime()-lStart;
System.out.println((float) lEnd/1000000000);

可以發現上面的例子,
用new Integer的方法大概都快要1秒鐘,差不多為0.6秒,
但調用Integer.valueOf()的方法大概0.003秒,
當然其實人感覺不太到差異啦。
只是說硬要評比的話,valueOf的方法較為快。
但記得!! 必須符合大量資料的前提才成立。





read more »


切割子網域(subnet)

24 October 2011

前一篇中,提到了IP分級以及網域的概念。

在這篇中,將說明切割子網域的概念!

IP分級是為了管理方便,但今天假設我們有一個Class A的IP,

我們不可能將一個Class A的IP僅僅設定一個區網!很浪費!

且該區網底下也很容易發生壅塞的情形!效能會不好

那麼這時候就得運用切割子網域的概念!


假設我們有個Class C的IP(192.168.0.0~192.168.0.255),

且我們要將該Class C的IP切割成4個子網域!

那麼該怎麼做?

我們知道Class C的IP的net_id有24個!

先假設我們要將一個Class C的IP細切割成4個子網域!

那麼我們可以跟host_id2個bits!(2的2次方,所以是借2個)

也就是說net_id變成26個!

如:11000000.101010000.00000000.0000000(192.168.0.0)

這樣就會有00, 01, 10, 11 這樣就會有4種組合,

這樣就可以切成4個子網域了!!

而每個子網域,就會剩下2的6次方個ip(64)。


















read more »