2015年4月21日 星期二

設計模式(自我測試版本,撰寫中)

  試著以我的語言來解釋不同設計模式:

題目是由非關語言: 設計模式這裡去出

Chapter A: Creational 模式 
  根據我對Design pattern的理解,Creational主要是探討建立物件設計之間的一些方法,這些方法可以幫助我實做一個新的物件時,更精確達成我所想要達成的目標。
  1. Simple Factory 模式
      這個模式簡而言之,就是隱藏一個具體物件的細節設定。
    例如我如果在程式中建立了一個蘋果,那我應該將其內容如「顏色」、「口感」、「重量」...,都在建構子裡面處理掉,而不是讓第一次撰寫程式的人員花時間去了解這些設定的意思,及如何去設定他。
  2. Abstract Factory 模式
      這個模式蠻令我映象深刻的,因為我剛開始求職時,遇到一位面試官出了這題,請用一個for迴圈印出圓形、方形、三角形的圖案,那時的我還沒有經驗,學生時期也沒有碰過設計模式的相關概念,只好殘念下一間。
      簡而言之,這個模式就是使用不同物件繼承一個抽象類別,然後在使用這個抽象類別的時候可以讓各自的不同物件按照自己設定的情況去執行。
      例如:馬、貓、狗,都是動物,因此都繼承在動物的類別下,我們可以依據每個動物去實作他跑的細節,但最後程式執行時只要寫,動物跑即可。
  3. Factory Method 模式
      這個模式的概念是在設計的過程中,先將程式的大綱寫好,在實際實做的時候再補充細節,譬如我寫一篇文章先把起、承、轉、合的綱要擬好,然後再開始寫這幾個章節的內容。
      通常這個模式我都是在程式寫完後,才思考哪些功能是可以抽出來集合在一起的Factory,比較少在寫的過程中去思考可以先寫這個模式,然後在補充內容。
  4. Builder 模式
      我覺得連結中的比喻非常好了(暫時想不到比迷宮更能描述的說法),這個模式比較注重的是建立的子物件其內容比較完整,不像Abstract Factory還有留白的空間,這個比較適合已經確定子物件有哪些,然後透過排序或種種的使用方法去使用這些物件的時候。
  5. Prototype 模式
      這個建立物件的概念,其實就是實做繼承物件中不同的參數之間的窗口,例如我在專案中曾經遇過從韌體傳來的參數方式 跟資料庫所需要的資料格式不同,但資料是同一份,那我就必須在繼承的同時,告訴這個物件你的某某資料,他需要繼承的是父類別的某某資料,並且應該如何複製。
  6. Singleton 模式
      這個模式簡而言之就是設定一個程式中的全域變數,程式中的每個地方都能呼叫這個變數,而且不會有不一樣的數值﹔反之,每個地方都可能改變這個變數。
  7. Registry of Singleton 模式
      有時候我們希望這個全域變數是可以被註冊,被誰?在甚麼時候?因為甚麼事情?而註冊,然後在程式結束的時候可以取消這個註冊之類的情境即需要這個設計概念。

2014年10月20日 星期一

淘汰的Network 用法

HTTP GET
public static void Setdata(String urlStr) { Log.i("Ten", "Device Edit Done"); HttpUriRequest request = new HttpGet(urlStr); // Or HttpPost(), depends // on your needs String credentials = account_password; String base64EncodedCredentials = Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); request.addHeader("Authorization", "Basic " + base64EncodedCredentials); httpclient = new DefaultHttpClient(); try { HttpResponse response = httpclient.execute(request); HttpEntity httpEntity = response.getEntity(); String state = EntityUtils.toString(httpEntity); Log.i("Ten", "Ten: " + state); } catch (ClientProtocolException e) { Log.i("Ten", "ClientProtocolException:" + e); e.printStackTrace(); } catch (IOException e) { Log.i("Ten", "IOException:" + e); e.printStackTrace(); } }



HTTP POST

public static String HttpPing(String urlStr) {
String responseBody = "";
try {
String credentials = account_password;
String encoding = Base64.encodeToString(credentials.getBytes(),
Base64.NO_WRAP);
HttpPost httppost = new HttpPost(urlStr);
httppost.setHeader("Authorization", "Basic " + encoding);
List<NameValuePair> postParams;
postParams = new ArrayList<NameValuePair>();
postParams.add(new BasicNameValuePair("GetJson", ""));

HttpClient httpclient = new DefaultHttpClient();
HttpResponse response;

UrlEncodedFormEntity urf = new UrlEncodedFormEntity(postParams,
HTTP.UTF_8);
httppost.setEntity(urf);
response = httpclient.execute(httppost);
int code = response.getStatusLine().getStatusCode();
if (code == 200) {
responseBody = EntityUtils.toString(response.getEntity());
}
} catch (ClientProtocolException e) {

} catch (IOException e) {

}
//Log.i("Network reponse:",responseBody);
return responseBody;
}

2014年10月7日 星期二

動態修改以動態建立的view視圖 layoutInflater.inflate

解法:
view.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener(){
              @Override
public void onGlobalLayout() {

}
});

解釋:
 通常是在動態宣告 layoutInflater.inflate後又立刻需要變動 layoutInflater.inflate
 (譬如取得剛宣告完的view圖的長寬或上下左右邊界,但系統還沒建立出來)的時候,
會遇到這個問題,
解法是利用getViewTreeObserver這個觀察者(android本身有的內建函式),
去透過Interface的方式在畫面確實被畫出來的時候再返回你所Override的 onGlobalLayout函式去執行你想做的動作。

這個解法蠻漂亮的,所以記錄一下,但我後來發現因為每當畫面更新的時候這個函式就會被觸發,所以還是需要一些參數來控制,詳細就不多贅敘囉!


參考網址:
http://stackoverflow.com/questions/7517636/viewgroup-finish-inflate-event

http://blog.csdn.net/guolin_blog/article/details/12921889

2014年2月25日 星期二

Android 軟體鍵盤無法改enter成next 或其他按鈕(android setimeoptions not working)

可能原因:請限制加上single line。
        android:imeOptions="actionNext"
        android:singleLine="true"

2013年11月25日 星期一

Android pdf renderer lib (將pdf out 到android 的views上)

2015/08/25
更新
Android API 21就釋放出可以直接處理pdf的資訊了

https://developer.android.com/reference/android/graphics/pdf/PdfRenderer.html


Android pdf renderer lib
2013/11/25

因為剛做完一個段落,紀錄一下

-----------------------------------------------------------------------------------------------
如果你只是要在Android程式上打開PDF檔的話(可以接受使用其他的軟體的話),
那並不是本文章所想講的內容,Google上有許多簡單call Intent外部資源的資料。
-----------------------------------------------------------------------------------------------

Renderer的翻譯是渲染,
一開始我並不知道這個單字的意思,
但是這個單字在資訊上的意思應該是將文件輸出至銀幕上顯示的意思,
也就是將文件渲染至銀幕上,
所以在此解釋一下,
幫助未來一些像我這樣不太懂的人了解。

這篇是記錄 "我如何解決PDF解析並且renderer到Android的行動裝置銀幕上" 的文章。

一開始我去Stack flow 上找了許多人介紹的 PDF library 包括
 iText ,    http://itextpdf.com/
PDFViewer (jblough的) , https://github.com/jblough/Android-Pdf-Viewer-Library
GHOST 4J , http://www.ghost4j.org/
9PDF , (現在不知道去哪找了...)
Jpedal , http://sourceforge.net/projects/jpedal/
pdf box, http://pdfbox.apache.org/
ApachePOI, http://poi.apache.org/ (也有其延伸的 Tika http://tika.apache.org/)
等等的

甚至還去找了PDF的格式
(因為我忘記在哪找到的了,所以我上傳我保留的到雲端)
https://docs.google.com/file/d/0B4ygFvrB4o3VTUh5allqNVFFMHc/edit
這好像是某一年Adobe公布的標準,詳細情況請在自行Google

其中我有實作出來並可以run的demo檔是 PDF Viewer,
不過做出來的顯示畫面並不是很好,
會有顏色跑掉或是模糊的情況。

(應該是在這行造成的
Code:
page.compress( Bitmap.CompressFormat.PNG, 100, stream);

可以使用 PNG或 JPEG的格式,但輸出的效果我認為都不好。)

其他的函式庫大多會遇到一個我認為蠻大的問題,
就是他們都引用了JAVA 的 awt或 swing函式庫,
這兩個函式庫都是Android上所沒有支援的畫圖函式庫,
也因此這些函式庫大多可以完整的解析PDF檔案,
但是無法 renderer到Android的銀幕上。

(Android本身是使用Google 公布的 Graphics2D 函式庫,幾近完全拋棄JAVA的原生函式庫,雖然有人試圖編譯awt to Graphics2D....但...自行Google...)

未來如果這幾個解析器都發展完整Android相關的函式庫出來的話,
我個人認為GHOST 4J這個解析器應該是最簡單且人性化的函式。

(可能半個月內、半年內、或者一兩年內突然就有完整的解決方案了。)
(當然也可能早有人寫出來免費的PDF render且有公布在網路上,
但我這個接觸JAVA Android 不到一個月的人沒找到的資源也說不定。)

-------------------------------------我如何解決這個問題------------------------------------
我本來要使用的是
muPDF 這個函式庫,這也是網路上最多人推薦的 PDF renderer (http://mupdf.com/docs/)
不過
1.他並沒有提供很簡易的使用方式,
2.他是利用JAVA去調用Linux實做底層的C語言程式去實做PDF轉換及java image格式接口,我們的程式如果包含如此多的額外資源的話,可能會造成後續的延伸問題。

因此,我在與公司討論後(因為我的工作與韌體有點關係)
就將PDF to image 這個步驟切到韌體上面去執行,

我使用的是Fedora 系統 ,切成fedora系統以後轉換pdf to image這個步驟就簡單了許多,使用的library是 他的Imagemagick 函式

程式碼也相當的簡單
$ convert  INPUT.PDF out.png
如此而已

有不同需求的人也可以去找一找pdftoppm 這個函式
(我是沒有實作出來,但似乎也是一種解決方案)

嚴格說起來,我並沒有使用Android上的程式去解決PDF renderer的問題,
但有短時間內要解決此問題的需求的話,
可以參考看看我解決的策略。

而有中長期解決這個問題的需求的人,可以考慮研究mupdf這個函式庫,
或者自行參與某個open source去實作出來這部分。

-----------------------------------------抱怨---------------------------------------------
我在研究不同lib的時候發現每個lib對於renderer的解釋似乎並不一樣
這樣其實很不好,
有些renderer是被定義成輸出給影印機影印,
而有一些則是被定義成輸出成xtml,
甚至有一些lib打開renderer source後發現裡面空空如也....

另外PDF FILE ,Document這些關鍵字的定義都很不好,
很難讓使用者在網路上搜尋到,
我每次打iText Document的相關搜尋的時候,
第一個跳出來的文章總是他的API 函式Document ,
而實際的Document使用就很難找到,
更不要說某些散布在網路上不同的函式庫對於同一個關鍵字的標準不同了。
(簡單來說就是資訊標準並沒有被定義好。)
對於查資料而且根本不熟的人怎麼會知道

"喔!!!原來 PdFfile 跟 PDFFILE 跟pDfFile 是不的lib 裡的關鍵字,
而且其定義資料格式完全不同而且還不能互通!!!"

也因此可以看到網路上有人拿了A lib的 sample code 去問B lib 為何不能執行?
使用B lib的人則非常困擾 怎麼可能不能run???

有些lib好像處理好了如何renderer 的問題,
但是並沒有完整解析pdf格式的lib,
而有些則相反,但又因為彼此定義資料格式不同的關係,
最後也是無法直觀使用的函式庫,
真的很讓人沮喪。

--------------------------如果你的公司可以接受付費函式庫的話-------------------
網路上有蠻多這類的函式庫的
例如:
ASPOSE(http://www.aspose.com/),
OliveDoc(http://www.olivephone.com/m_page.php),
QPDF ( 我一度以為這個函式庫是免費的,直到他在Demo程式上出現了浮水印...   http://sourceforge.net/projects/qpdf/)

如果有人願意指點迷津給小弟一個在Android上的完整解決函式或demo code的話,
小弟也會虛心接受的,感謝有仔細觀看這篇文章的人,
歡迎回應。

---------------------------------補充----------------------------------------------------
我突然在想是不是有人會將ImageMagick寫到android上?
找了一下,發現仍然有call awt的問題,
不過也有高手寫出了fake awt 解決部分的lib function
https://github.com/subicura/android-lib-magick
不過只有jpg轉png...