2010年5月30日 星期日

Motorola Droid 輸入法

Motorola輸入法比較麻煩, 他有檢查裝置, 也有多個螢幕解析度的設定。

所以, 就算跳過了檢查機制, 也可能因為螢幕解析度不符合, 而載入錯的(480x320)螢幕設定, 弄出一個超小鍵盤。或是手寫輸入法, 根本找不到正確的設定而掛掉...。

DisplayMetrics

2010年5月29日 星期六

蒙恬輸入法 for Acer Liquid

蒙恬輸入法 for Acer Liquid Android
網路上流傳的是1.0版的, 有些地方不是很好用。例如, 按enter的時候他不會自動變成瀏覽器的Go, 或是搜尋的Search, 所以都要自己去按畫面上的按鈕。
新版的1.0.4在Acer的網站可以下載, 除了修正bug以外, 多了檢查機器的機制, 只能在Acer Liquid上面執行。
當然, 搜尋一下關鍵字Acer Liquid Model MODEL ...
...
...
...
...
然後就能在任何機器上面執行了。

2010年5月28日 星期五

HamiAPP for Android 驗證機制

HamiApp開放第一天的晚上, 下載了遠流字典通安裝之後卻沒辦法通過認證, 所以根本不能執行, 所以...。
Android的軟體都是Java語言編譯成Dalvik VM的bytecode然後交由虛擬機器來執行。每支程式都會有各自的VM環境互不影響。
也可以呼叫binary .so 。
不過中華電信Hami App 的認證機制是做在Java裡面, 所以破解起來非常容易, 因為bytecode很容易disassemble。
  1. 機器應該要先root, 才能把安裝在系統上的apk讀出來。
  2. 解開apk,裡面有一些resource檔, manifest, 跟classes.dex 主程式。
  3. classes.dex是所有class包裝在一起, 有點像是jar檔。可以用 baksmali 解開還原成assembly code, 修改完之後用smali包裝回去.dex
  4. net/emome/hamiapps/sdk/utility/LicenseUtility.smali 裡面有一個method checkValidLicense, 會連線檢查你的IMEI, 軟體授權等等, 只要有一項不通過的話, 就會丟出一個exception。要讓他通過的話, 想辦法讓這個method不會送出任何exception就好了。
  5. 之後就用smali打包成classes.dex。
  6. 丟回去原本的apk, 這邊不能直接用zip壓縮, 因為需要修改manifest裡面的簽章跟每個檔案的hash, 直接壓縮可以安裝, 但是是不能執行的。
  7. 就按照這裡的教學, 隨便生出一個key pair, 然後用signapk 去簽章就可以了。
我沒有教你怎麼破解, 也沒有教你怎麼不付錢就下載, 千萬不要自己想出來然後把軟體變成免費版的放到網路上到處給人家下載。
軟體既然都要線上認證了, 就不要單純的只用signature有沒有通過來認證, 這樣太好破解了。

2010年5月21日 星期五

Google IO 2010

說了很多東西,到底有什麼呢...。

我對技術的比較有興趣, 例如新的JIT加速程式運行, 新的API讓瀏覽器可以使用手機裝置, 相機...。

然後就是一堆很複雜的東西, 可以怎麼樣搜尋商店啦, 新的廣告形式啦, 甚至Google TV啦...。 雖然這些很多再台灣都弄不太起來啦, 有鑑於台灣的網路跟科技環境。

資訊整合是一件好事, 可是我們真的需要這麼多資訊嗎?

如果我要在嘉義找聚餐的餐廳, 可以上ptt, 當然也可以用google map, 然後就可以找到一家看起來不錯的, 不一定是最好吃的, 不過誰知道什麼是最好的呢。

如果住在一個地方久了, 就變成會有習慣去的地方了。

Google TV, 今天如果我想看House, 我去打開電腦, 連上CBS, 看線上免費串流, 這樣真的還不夠好嗎。電腦可以自動出現Amazon, Hulu, CBS, ... 很多選擇, 可是最後我還是只會選一個阿, 而且是選平常常用的那個。

(圖) Google Voice Search 很酷, 有很多功能的遙控器很酷, 有一天是不是連遙控都不用, 坐在輪椅上面就可以操控一切了呢。

PastedGraphic-2010-05-21-00-51.jpg

歐巴馬批媒體 淪為娛樂形式

【聯合晚報╱國際新聞組/綜合報導】        2010.05.10 02:42 pm

美國總統歐巴馬9日感嘆,在iPad和Xbox產品充斥的時代,資訊已讓人轉移焦點,對民主政治造成新的傷害。這是歐巴馬對當今媒體最新的批評。

歐巴馬過去經常痛批記者和有線電視新聞網沉迷政治惡鬥,而不重視議題的報導;他向一群大學畢業班學生致詞時表示,教育才是進步的關鍵。

歐巴馬在維吉尼亞州漢普敦大學(Hampton University)表示:「你們置身於媒體一周7天、每天24小時輪番報導的環境中,被各種新聞疲勞轟炸,接觸到所有的爭辯,但有些內容根本不值得過度報導。」

歐巴馬說:「在iPod、iPad、Xbox和PlayStation使用普及之際,我不懂得如何運作其中任何一項產品,而資訊已成為分散注意力、轉移焦點的主因,並且淪為一種娛樂形式,而非增長智慧的工具。」

歐巴馬並且感嘆,當前「一些最瘋狂的聲明常會快速引發注意」,並在某些部落格和電子媒體談話性節目中大肆渲染。他說:「所有這些報導不僅給你們新的壓力,同樣也對我們的國家和民主政治形成新的壓力。」

歐巴馬警告,這個世界已處在驚人改變的時刻。他說:「我們不能停止這些改變,但要適應改變。」他還指出,美國勞工已面臨接受良好教育的外國勞工的挑戰。

歐巴馬說:「教育能讓你更堅強,就如同前輩一樣,以因應時代的考驗。」

不知道歐巴馬到底是念什麼的, 不知道他念書到底好不好, 不過他講的真的是有道理...。

2010年5月3日 星期一

Garbage Collection in GraphicsMagick

Using GraphicsMagick, when you want to rotate, scale, normalize... or doing anything to the image.




/* A line to fill table x-axis in html A line to fill table x-axis in html A line to fill table x-axis in html*/
InitializeMagick(argv[0]);
ImageInfo *info=new ImageInfo;
ExceptionInfo * excp=new ExceptionInfo;

GetImageInfo(info);
GetExceptionInfo(excp);
strcpy(info->filename,argv[1]);
Image * ii = ReadImage(info,excp);

ii=RotateImage(ii,270,excp);
/* The original ii is lost!!! */

Using a tmp variable




/* A line to fill table x-axis in html A line to fill table x-axis in html A line to fill table x-axis in html*/
Image * tmp = RotateImage(ii,270,excp);
DestroyImage(ii);
ii=tmp;
/* To much trouble... */

Using Boehm Garbage Collector


/* A line to fill table x-axis in html A line to fill table x-axis in html A line to fill table x-axis in html*/
#define GC_DEBUG
#include <gc/gc.h>
#define CHECK_LEAKS() GC_gcollect()

GC_init();
/*for GM*/
MagickAllocFunctions(GC_free,GC_malloc,GC_realloc);
/*for IM*/
SetMagickMemoryMethods(\
(AcquireMemoryHandler)GC_malloc,\
(ResizeMemoryHandler)GC_realloc,\
(DestroyMemoryHandler)GC_free);
        
/* Set Memory Alloc/Dealloc function to GC before calling any IM/GM function */
InitializeMagick(argv[0]);

/* Call GC anytime you like */
CHECK_LEAKS();


2010年5月1日 星期六

static reference to vector->head,tail

#include <vector>

#include <iostream>

using namespace std;

template<class T>

class myvector:public vector<T>{

public:

T tail;

T head;

void push_back ( const T& x ){

std::vector<T>::push_back(x);

head=this->front();

tail=this->back();

}

void pop_back (){

std::vector<T>::pop_back();

head=this->front();

tail=this->back();

}

};

int main(){

class myvector<int> myv;

int & i=myv.head;

int & j=myv.tail;

myv.push_back(100);

cout<<i<<","<<j<<endl;

myv.push_back(200);

cout<<i<<","<<j<<endl;

myv.push_back(300);

cout<<i<<","<<j<<endl;

myv.pop_back(300);

cout<<i<<","<<j<<endl;

return 0;

}