目前分類:Java Related (42)

瀏覽方式: 標題列表 簡短摘要

最近測試了如何在 android app 裡面產生 PDF 檔案,我們的需求是:



  1. 不透過app server,直接產生PDF,並寫入到 SD Card
  2. 必須要能顯示 繁體中文 簡體中文 及英文

yaocl 發表在 痞客邦 留言(0) 人氣()

在Activity中產生一個thread處理資料的時候,當遇到這個資料要回去更新Activity畫面上的UI元件時,會發生 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 這樣的錯誤。

這個問題弄了好久,試了幾個方法都不能處理掉,還email給"Android開發範例大全"的作者(昨天寄的,現在還沒有得到回應),結果其實很簡單,是要用android.os.Handler配合android.os.Message來處理。但也許這在android開發是一般常識,不過因為我們學習的方法,並沒有從基本原理學起,而是直接看許多範例程式,才會不知道要怎麼讓Model跟View互動。

在Activity中自訂一個Handler: myViewUpdateHandler

yaocl 發表在 痞客邦 留言(0) 人氣()

要產生Process執行command line程式,在java裡面是使用Runtime.exec,在JDK 1.5之後出現了另一個 ProcessBuilder,ProcessBuilder多了管理環境變數的方法,也能切換工作目錄。一般使用Runtime Process會先遇到IO Blocking的問題,這個可以參考這些文章:When Runtime.exec() won'tjava中呼叫.bat 卻沒有反應....StreamGobbler的詳細解釋,使用 StreamGobbler 解決。但另外遇到 shell command 裡面的保留字元時,就會產生了一些奇怪的問題。

最常見的就是空白字元,例如在命令的執行路徑上,出現了空白字元,以 windows 來說,如果直接在"命令提示字元"中,打上 c:\Program Files\xxx\xxx.exe,就會出現路徑的錯誤,因為shell沒辦法處理有空白字元的路徑,所以要執行的時候,就得加上 雙引號 變成 "c:\Program Files\xxx\xxx.exe",這樣就可以執行了。

在Linux環境也是一樣的,遇到空白字元,就會發生問題,除了用 雙引號的方法之外,單引號也可以,或是加上escape char \,例如 /home/root/bin/xx x.sh ,可以改成 "/home/root/bin/xx x.sh" 或是 '/home/root/bin/xx x.sh' 或是在空白前面加上escape char /home/root/bin/xx\ x.sh 就可以執行了。

yaocl 發表在 痞客邦 留言(0) 人氣()

寫程式的時候,通常會使用很多 library ,但是一旦遇到要把程式以 JNLP 的方式,送到client端的時候,產生jar的大小就很重要了,以LGPL license來看,我們的程式可以連結到LGPL license的library,我們不一定要以一個一個獨立的jar來散佈library,我們可以把所有classes集合在一個jar檔裡面,只要我們沒有修改到原始程式,就應該符合license的規定。

所以我們可以把程式沒有使用到的 binary classes 都去掉,Open Source 授權的關係,我們不修改 library 原始程式,不使用obfuscator,但也能達到縮小 jar 的目的。

首先要準備一個 使用到的 classlist 檔案,在執行程式的時候,加上 -verbose:class 參數,ex: java -verbose: Test ,把結果輸出到一個 classlist.txt 檔案檔案裡面會有類似這樣的資料,這就表示JVM從commons-logging-1.1.1.jar裡面載入了一個 class org.apache.commons.logging.LogConfigurationException。

yaocl 發表在 痞客邦 留言(0) 人氣()

最近上了一次有關「客戶服務」的課程,再加上又看了How To Design A Good API and Why it MattersKeynote)這一段教學,其實這都是在說明一件事情,就是不管發生什麼事情,都該要讓你的客戶高興。

身為軟體工程師,在設計與製作API的時候,就要一直思考一件事,因為API就是要讓其他的developer使用的,當然得致力於要讓API簡單、好用、不容易誤用、容易維護,而且一旦產出了錯誤的API,又已經交給客戶使用了,這個錯誤可能會影響好一陣子。但即使看過這個影片,要能身體力行也是很難,也痛苦的,回想去年曾經花了很久製作的ACL API,雖然這個API運作得不錯,也適當地簡化了ACL的開發,一直用到現在沒出問題,但其實這個API是很容易被誤用的,但短時間內就只能以code review的方式,盡量能在開發期間就發現錯誤。

在專案上,就是要面對所有stakeholders,這包含了sponsers, project team memebers與end users,在專案上的努力,最終都得要面對並滿足所有stakeholder的需求與期待,讓大家都高興。講很容易,但做起來就很難了,並不是有了技術一切都能解決的。

yaocl 發表在 痞客邦 留言(0) 人氣()

Master Data (主檔資料) 是企業內部最主要的資料檔,例如客戶資料、產品資料、員工資料等等,為了改善資料品質與一致性需求,提昇Master Data被運用與維護的效率,所以需要一個MDM的total solution。以一個小企業來說,一開始導入系統,應該是視情況與當時的需要,購入某些特定功能,跟主要業務有關的資訊系統,接下來企業慢慢地成長,資訊系統增加,這些資訊系統之間的資料轉換與溝通問題,就會慢慢地浮現。

對所有的資訊系統來說,一開始要面對的就是帳號跟權限,所以員工帳號應該是符合Master Data條件又最常見的一種資料,MIS遇到越多系統就有越多帳號得要整合,要整合帳號,就會想到帳號同步與SSO的產品,但如果公司的規模不夠大,或是業主無視於帳號同步的需求與重要性,SSO會是非常難推行的一種產品。

MDM所要面對的資料,是企業內部跟業務有關的核心資料,雖然用起來可能會跟帳號同步的概念很像,但得要更一般化地將所有可能的狀況,都規劃到產品的功能上,然而產品的規模越大,能夠運用的企業就越少,因為他們並沒有足夠的資訊人員能量可以撐住整個MDM的solution維護。

yaocl 發表在 痞客邦 留言(0) 人氣()

當我們在使用yui的dialog的時候,卻意外發現一個奇怪的問題,只有在Firefox才會發生,就是dialog裡面的input的cursor,在dialog放在一個iframe網頁上面的時候,即時用滑鼠點了一下input,但是cursor還是不會出現,經google後發現,這是firefox的一個bug,而且沒有一個適當的解決辦法。

Cursor disappears in Firefox這篇文章建議以調整 overflow 的style解決,我試過了沒有用。Infamous Firefox cursor bug - Info and possible workaroundsCursor (caret) sometimes fails to appear in input text fields這邊有人建議以 position:fixed 還有 overflow:auto; position:absolute的方式解決,但是dialog的位置就沒辦法任意地拖動了,目前的結論還是無解。

yaocl 發表在 痞客邦 留言(0) 人氣()

最近原本程式在Tomcat 5.5.25可以運作正常的Cookie,最近在Tomcat 5.5.26上測試卻發現出了問題,原因在我們在Cookie的數值上,是以Base64編碼,然而base64的編碼結果會在最後面產生多個 = 字元,這個等號,在Tomcat 5.5.26取得cookie value時,被視為cookie規格中的等號。

舉例來說 cookie1=value= ,應該取到有個cookie1,數值為value=,但在Tomcat5.5.26上卻是,有個cookie1,數值為value。在Cookie V0的規格中,他告訴我們cookie裡面的資料必須要自己用URL style %XX 的方式編碼。

我懶得再用java.net.URLEncoder去轉換,直接replace所有的 = 為 $,取到cookie資料時再把 $ replace 成 = 就可以解決了。

yaocl 發表在 痞客邦 留言(0) 人氣()

在使用 proxool 的時候,如果用JAXPConfigurator來啟動proxool,通常會用 JAXPConfigurator.configure(new InputStreamReader(proxoolInputStream), false); 這種寫法,但是java.io.InputStreamReader在遇到UTF-8 with BOM的檔案編碼格式的設定檔時,就會產生問題。

在遇到BOM(byte-order mark)的時候,通常都是找個支援修改檔案編碼的Editor來處理,例如我們常用的Emeditor或是EditPlus(參考網站 BOM (Byte Order Mark) 的問題BOM BOM BOMUTF-8),我們的作法,原本就是採Emeditor來使用,但是程式交出去的時候,就常常會遇到客戶直接使用Windows預設的文字編輯器notepad來編輯proxool.xml設定檔的狀況,導致程式在啟動DB Connection Pool就會出問題。

ROME實作了com.sun.syndication.io.XmlReader這個類別,在文件一開始就提到,"It looks for the UTF-8 BOM first.",另外這個類別又是extend java.io.Reader,這就省事多了,因為JAXPConfigurator.configure正好是需要一個java.io.Reader,所以只要把 JAXPConfigurator.configure(new java.io.InputStreamReader(proxoolInputStream), false); 這種寫法,改為 JAXPConfigurator.configure(new com.sun.syndication.io.XmlReader(proxoolInputStream), false); 就可以讓proxool設定檔也相容於惱人的BOM問題。

yaocl 發表在 痞客邦 留言(0) 人氣()

因為用了filter寫cookie登入,又因為用了RequestDispatcher作轉頁,又因為用了weblogic,從首頁進來的request,因為cookie登入,但cookie的資料因為別的原因錯誤了,本來寫清除cookie後,再用RequestDispatcher轉到首頁,出問題了,成了無窮迴圈。

這種寫法在Tomcat運作正常,Tomcat在我寫RequestDispatcher之後,並沒有再apply一次Cookie登入的filter,所以可以傳回首頁的網頁跟清除cookie的response,但是神奇的weblogic,在我forward到首頁時,又apply了一次cookie登入,哇,無窮迴圈出來了。

weblogic真的是神奇的ap server跟免費的就是不一樣,只好改用sendRedirect,強制把response送回到瀏覽器,這樣就能把cookie清掉,再讓瀏覽器取一次首頁,這就正常了。

yaocl 發表在 痞客邦 留言(0) 人氣()

最近開始在看鋼之鍊金術士,故事的設定背景,就是「等價交換」,也就是這句經典對白「人不付出犠牲,就無法得到任何回報。如果想要得到什麼,就必須付出同等的代價。那就是鍊金術中所說的等價交換。」也就是這樣一句深刻的對白,反應了整個故事的主旨,造就了這部經典的動畫。

網路服務也是一樣,每一個特別的網路服務通常都會有個核心的概念,例如Flickr就是相簿,Google就是搜尋等等。這個核心的概念,就等於專業的服務,在深耕這個服務概念之後,就造就了一個成功的網路服務網站。成功的網路服務,都能用一句簡單的話描述它。

上週末看到電視訪問群聯潘健成總經理(參考文章:創業成功因素),討論的主題是創業,主持人問他一個問題,群聯未來會不會走向建立品牌,他回答群聯的專業是在IC設計,未來還是focus在這個專業上,但希望未來能領導規格。設計是他們的核心價值。

yaocl 發表在 痞客邦 留言(0) 人氣()

原本我們都是使用JS framework的包裝,但在這兩篇說明javascript

Part I: Inheritance http://www.webreference.com/js/column79/
Part II: Methods http://www.webreference.com/js/column80/

yaocl 發表在 痞客邦 留言(0) 人氣()

當系統需要透過外部的帳號倉庫做帳號認證時,我們以Spring外接一段程式,處理系統登入與修改密碼的程序,連接外部的LDAP或AD。

當我遇到MS AD時,我必須要先把他安裝起來,這是我遇到的第一個困難,我參考了JNDI AD 備忘記的程序,先把MS Windows 2003標準版安裝在VM上,然後設定了AD,接下來設定了IIS,並安裝CA,把SSL搞定跟key store搞定,其中我以ldap browser測試過,可以連接AD成功,瀏覽整個AD Tree的資料。

後來就參考了java如何結合(呼叫)Win2000 ActiveDirectory,做出了AD認證的程式,這個認證有點奇怪,因為只要是合法的帳號,就可以瀏覽所有的使用者節點資料。

yaocl 發表在 痞客邦 留言(0) 人氣()

GoF中提到,Chain of Responsibility的實作方式有兩種,一種是製作successor串列(利用Composite的既有父節點指標,或是自己再另外寫一個,這個實作可以寫在Handler裡面或是定義在這些Event Handlers的外面),一種是直接連接successor。

Spring IoC提供使用者以XML定義的方式,初始化物件,假設我們先定義了一個Event Handler interface,接著先依照自己的需要實作多個物件,implements這個Handeler介面,而以Spring XML設定的方式,初始化多個物件實體。

再來就是靠Spring在ApplicationContext中提供的getBeansOfType這個method,一次將所有定義在xml裡面,實作了EventHandler介面的所有beans,然後依序將Event傳送給所有Event Handler處理。當然這種實作方式,沒有辦法彈性地設定這些EventHandler接收Event的前後順序,只能保證Event確實會傳送給每一個在XML中已經定義的EventHandlers。

yaocl 發表在 痞客邦 留言(0) 人氣()

過去在尋找設定檔的時候,總是得先用context.getRealPath("/")找到webapp實體的硬碟位置後,才能逐步以File的方式,尋找每一個設定檔,但是這種方法,在weblogic裡面卻行不通了,因為weblogic以context.getRealPath("/")回傳的結果跟tomcat不同。

這個時候突然想到先前在weblogic上設定spring-hibernate的方法(ex: classpath*:/**/mappings/mysql/**/*.hbm.xml),於是就先去把spring source code抓回來,然後trace這個部份是怎麼寫的。很幸運的是,這一切都是靠一個類別org.springframework.core.io.support.PathMatchingResourcePatternResolver就做完了,因此我就有了一個能在webapp上尋找設定檔的方式,連同在stand-alone的junit test也能運作。

至於這個PathMatchingResourcePatternResolver到底是怎麼做的,把spring framework log4j的 log level設定為info(log4j.logger.org.springframework=info),就能發現PathMatchingResourcePatternResolver把整個classpath裡所有的資源包含jar檔都能掃描一次,如果設定的參數為硬碟路徑(mappingDirectoryLocations),spring就能把該路徑下所有的子目錄都查過一次。至於classpath,包含jar檔的部分,spring則是以class loader提供的getXXXResource methods做出來的,詳細的實作方式我也不清楚,反正直接把PathMatchingResourcePatternResolver拿來就很好用了。

yaocl 發表在 痞客邦 留言(0) 人氣()

由於Hibernate3使用了ANRLR當作SQL語法的parser,但是weblogic裡內含了舊版的ANTLR,這兩個是不能共用的會相衝突,因此得用classpath設定的方式將weblogic的ANTLR蓋掉。

修改的步驟如下:

Step 1.

yaocl 發表在 痞客邦 留言(0) 人氣()

應該是職業傷害的關係,長久以來,我的肩膀總會覺得酸痛,還常常落枕,最近,左手肩膀又開始出毛病了,現在在左手上胳臂跟肩膀的連接處不是酸痛而是有一點刺痛,這是不是五十肩的症狀?我開始試著在沒事的時候將左手往上舉高,也稍微繞繞肩膀,不知道會不會有幫助。

不僅僅肩膀有問題,我可以感覺得到,因為長期低頭面對電腦銀幕的關係,我的脖子兩側因缺乏運動而覺得很緊,這或許是靜態工作者的原罪。現在的社會要求「專業」,但專業的成份得要一分努力一分收穫,得花時間培養這種專業,而經過了這麼久的時間,讓我們的生活養成習慣,可以為了一個搞不清楚為甚麼的bug,一直坐著想辦法解決問題,這是一種不可避免的惡性循環。

公司提供健康檢查的機會,希望大家注意身體健康,但治標不能治本,其實得要更積極地要求工程師,每1~2小時,就強迫離開電腦銀幕,離開座位10分鐘,看看窗外遠方,讓視線與心情暫時跳離一行一行的程式碼。

yaocl 發表在 痞客邦 留言(0) 人氣()

要對付XSS, SQL injection,How to add validation logic to HttpServletRequest這個網站提供了一個包裝HttpServletRequestWrapper的方式,可以封裝HttpServletRequest,然後再以filter的方式,把這個wrapper套用到 /* 所有網址上。

這篇文章提到的canonicalize與HTMLEntityEncode,我們並沒有採用,其實我還不大瞭解canonicalization的原理,或許在瞭解後會加上去。我們是利用regular expression pattern matching的方式,將一些已知基本的攻擊字元替代掉,也就是這篇文章BadInputFilterValve.java提到的方式,直接用String.replaceAll的方法,將reqest裡的參數都處理掉,把 \" 取代成 " ,把 document(.*)\\.(.*)cookie 取代成 document.cookie 。

yaocl 發表在 痞客邦 留言(0) 人氣()

最近遇到最棘手的事情,算是要提昇web app的防駭等級,網路上可找到的攻擊資料比較多,Input Validation Modules這個網站還提供視訊的攻防教學,XSS (Cross Site Scripting) Cheat Sheet列出了很多XSS的攻擊檢測方法。

但想要為自己的web app作防駭的時候,卻一直找不到適當的XSS與SQL injection的Regular expression,用來放在filter上過濾所有user的request parameters,.NET很貼心地提供了 validateRequest設定選項來幫助programmer杜絕駭客,而Java Solution在哪裡,我還找不到......

http://blogged-on.de/xss提供了一個XSS攻擊的遊戲,讓你試著找到XSS攻擊的輸入資料方式,據說有六關,目前我只過到第三關....通往第二關的密碼是:stage2,通往第三關的密碼是:closing_brackets

yaocl 發表在 痞客邦 留言(0) 人氣()

Portlet JSR-168 Note

************************
PLT.5 The Portlet Interface
PLT.5.1 Number of Portlet Instances

yaocl 發表在 痞客邦 留言(2) 人氣()

1 23