2013年8月30日 星期五

UltraEdit 出現 Enable 錯誤

這幾天不知道為什麼,用了好久的Ultraedit 開中文檔名檔案時,一直跳出 Enable 視窗(如下圖),煩死人了。




















研究好久才發現,原來是我手賤開了 Tab 檔名排序功能的原故,關閉此功能即可。
(看來 Ultraedit 對非英文檔名的排序處理有點問題)

關掉 Tab 檔名排序的地方如下:

Advanced --> Configuration --> Application Layout --> File Tabs --> Miscellaneous --> Sort Tab on File Open.





 








注意:設定完成要重新開啟 UltraEdit 後才不會再出現該錯誤。


2013年2月22日 星期五

Using p6spy in GlassFish


P6Spy is a framework that enables database data to be seamlessly intercepted and manipulated with no code changes to existing application.

It's easy to replace jdbc driver with p6spy in GlassFish (I've tried in GlassFish 2.1.1), just few steps:

2012年12月4日 星期二

Windows 7 使用藍芽(bluetooth)耳機 (32 bit / 64 bit)

近來買了 Sony Ericsson MW600 藍芽耳機,除了用來與手機披配無線通話外。另一個目的是利用它聽 desktop 的音樂。

沒想到...沒想到...

Windows 7 雖然內建 bluetooth driver, 但是抓不到耳機而無法使用MW600。

上網查了一下,似乎還需要 bluetooth stack 什麼的軟體,這玩意兒Windows沒有內建,有名的 CSR / IVT / Widcomm (已被 Broadcom 併購) 軟體,都要錢或是你要使用他們家的晶片才能用。


本人推薦下面這個解決方案(32 bit / 64 bit 都可以用)。

*****************************************************************
去華碩的網站下載華碩 laptop 的 bluetooth driver 安裝。
*****************************************************************


詳細步驟如下:

2012年3月11日 星期日

支援 ZIP 密碼加密的 Java 函式庫 (ZIP password encryption for Java)

Java 原生不支援 ZIP 檔加密這件事已經很久了, 之前遇到ZIP加密需求都是用 Runtime.exec() 來處理.

最近又遇到了這個問題, 查了一下, 原來已經有個 Zip4j 的函式庫可以處理.

Zip4j 的功能如下:
  • Create, Add, Extract, Update, Remove files from a Zip file
  • Read/Write password protected Zip files
  • Supports AES 128/256 Encryption
  • Supports Standard Zip Encryption
  • Supports Zip64 format
  • Supports Store (No Compression) and Deflate compression method
  • Create or extract files from Split Zip files (Ex: z01, z02,...zip)
  • Supports Unicode file names
  • Progress Monitor


使用方式參考他提供的範本即可, 簡單好用. 強力推薦.


2012年3月4日 星期日

VLC Media Player 字幕亂碼 解決之道

VLC media player 是個不錯的播放器, 但在 Windows 平台預設播放的中文字幕都是亂碼.

原因是字幕檔編碼跟字型不披配.


依據測試結果, 使用UTF-8編碼的字幕可以正常顯示(Big5編碼字幕要如何不亂碼,抱歉我試不出來), 說明如下:

1. 字幕檔編碼必須是 UTF-8
通常下載到的srt字幕檔都是 ascii (也就是 big5) 編碼格式.
請先轉成 UTF-8.

轉檔可以用Windows內建的筆記本完成, 方式如下:
筆記本開啟字幕檔後, 選擇"另存新檔". 編碼選擇"UTF-8"後 存檔即可.
(注意字幕檔會被存成結尾為.txt的檔案, 請手動更名)




2. VLC media player 的字幕/OSD設定中, 預設編碼請選擇 "Universal(UTF-8)"


3.字型請選擇支援 UTF-8 的字型, 一般常見的細明體、新細明體都不行的.

我測試的結果, 如圖中的 SimHei、SimSun, 或其它像Microsoft YaHei、KaiTi 都可以正常顯示.




2012年1月6日 星期五

GTAC 2011: Closing Keynote - Secrets of World Class Software Organizations



世界級軟體公司的秘辛
演講者 Steve McConnell (經典書籍 Code Complete 的作者)


提到的公司有 Microsoft (1990年代的MS), Google (講google有專用Bus原因時超酸滴...XDDD), MDA (講者作為顧問奉命解決這公司專案預估的能力, 講者看完後說你們是我看過最好的公司之一, 到底有什麼問題 ? 這公司說他們"只有"93%的專案能依預期達成, 所以他們想找出剩下的7%專案是怎麼回事...現場的觀眾都大笑...), NASA, Boeing, Symantec 等.

很有趣的一場演講, 值得一聽.

2011年9月30日 星期五

apache tiles 2 學習筆記

Apache tiles是一個版型模組化的工具.

通常網頁至少會將版型切割為4個區塊, 例如下圖:


tiles 的定義檔如下:
<tiles-definitions>
  <definition name="indexTemplate" template="/WEB-INF/views/tiles/indexTemplate.jsp">
    <put-attribute name="title" value="Welcome" />
    <put-attribute name="header" value="/WEB-INF/views/tiles/header.jsp" />
    <put-attribute name="category" value="/WEB-INF/views/tiles/category.jsp" />
    <put-attribute name="browse" value="/WEB-INF/views/tiles/browse.jsp" />
    <put-attribute name="footer" value="/WEB-INF/views/tiles/footer.jsp" />
  </definition>
</tiles-definitions>


而頁面變更的時候, 通常都只是更換整頁中的某一個區塊, 其它區塊不需要變化.

例如登入時, 只需要將右邊的區塊變更為登入頁.


登入頁 tiles 的設定如下, 只要更換 title 及 browse 二個變數的定義即可.
<!-- Login Page -->
<definition name="login" extends="indexTemplate">
    <put-attribute name="title" value="Login Page" />
    <put-attribute name="browse" value="/WEB-INF/views/tiles/login.jsp" />
</definition>


但考慮更複雜一點的情況呢?

例如電子商務中常見的, 點擊商品目錄.

此時商品目錄會展開, 且右邊會列出該目錄下的所有商品.

示意圖如下:


這時候就得在同一個 controller 裡處理商品及目錄的邏輯.
然後分別放入不同的 tiles 變數中.

等一下下...似乎有點奇怪, 目錄跟商品雖然有關係, 但畢竟各自有不同的處理邏輯.
放在同一個 controller 內處理似乎怪怪的...

如果再回頭看一下登入頁的例子, 目錄的頁面雖然不需變動, 但此時目錄頁應呈現第一層目錄結構.

第一層目錄結構的邏輯, 跟登入有什麼關係呢 ?


是否有辦法將各區塊的內容獨立處理, 讓彼此不相干的邏輯不要混在一起呢?


還好, tiles 提供了 View Preparer 來處理這種情況.


2011年9月28日 星期三

Spring MVC 的怪事一椿

今天遇到怪事一椿, 其實已經困擾我一陣子了, 只是今天才發現原因所在.

Spring MVC 的 @RequestMapping 註解可用來標示 Url, 例如:


@RequestMapping(value={"index"}, method=RequestMethod.POST)
public ModelAndView index(HttpSession session) {
    ...
}


如果同時有二個相同的註解, spring 會報錯, 訊息如下:

2318 [main] ERROR org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.IllegalStateException: Cannot map handler 'xxxxController' to URL path [/index]: There is already handler of type [class yyyyController$$EnhancerByCGLIB$$349da4f8] mapped.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:900)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:455)
at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:294)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:215)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)


但有一個例外, 就是 / , 一般看到網站的 / 會參考 tomcat 的 web.xml中 welcome-file 的設定.

若是下面的寫法, spring 不會報錯, welcome-file也不會生效, 但會連到那個 URL 就不知道了...


@RequestMapping(value={"/", "index"})
public ModelAndView index(HttpSession session) {
...
}


@RequestMapping(value={"/", "login"})
public ModelAndView login(HttpSession session) {
...
}

2011年9月20日 星期二

動態載入圖示 Animated Logo

今天才知道, 原來常見的動態載入小圖示, 如圖:

Throbber





有個名字, 叫做 Throbber

還有網站可以幫忙製作呢.


搭配 jQuery 的 BlockUI Plugin
可以很快做出不錯的效果.

範例如下:

$.blockUI({ message: '<h3><img src="/images/ajax-loader.gif" /> Please wait...</h3>' });


實際操作的時候, 發現圖常常出不來, 應是圖片載入過慢, 需將圖檔做預載(pre-load)處理, 作法如下:

$(document).ready(function() {
throbber = new Image() ;
throbber.src = "/images/ajax-loader.gif" ;
}) ;




2011年9月5日 星期一

tomcat jsessionid url problem

Spring MVC 可以 cache static content, 例如圖檔, js, css...

參考文件

但我之前遇到一個問題, 就是原本應顯示為 /appbased/static-1.0.0/images/xxx 的 URL

在第一次執行時, URL 卻會變成 /appbased/static-1.0.0?jsessionid=481AFDE46F818357ED2096824F250AFF/images/xxx

需重新 reload 一次才回復正常.

當時我的作法是, 在首次登入頁面的 jsp 前面加一行
<% request.getSession(true).invalidate(); %>
即可.


但最近又遇到另一個問題, 就是首頁有可能是登入狀態, 也有可能是未登入狀態, 總不能老是把 session 抓出來幹掉裝作沒事, 故查了一下解法.