7月21日下午免費在科博館聽了一場曾志朗校長的演講,他在第一個小時,只用了那一張演講主題的投影片,而一開始他瀏覽投影片時,我發現他總共準備了80張,這似乎是一個專業演講者的通病,順手拈來就能長篇大論,準備的總遠比講出來的多,我不知道他準備的那些投影片中,後面的到底有沒有用過,但這不是我們能挑戰的地方,因為我們多數都希望,他能多講一點多講一點。
曾校長提到他的第一篇科普文章"Who murdered the dinosaur?"『誰謀殺了恐龍?』,他提到他以謀殺案的方式,兩條平行線索,討論究竟是什麼原因造成恐龍在短時間內滅絕。後來他就講到,在寫這篇文章的一開始,他先講了一個"The Lost World"的故事,他在美國授課時,曾經看過第一版的"The Lost World"。
這本小說,在講亞馬遜河的一塊高原,上頭可能有遠古的恐龍還在那裡生活。後來他在霍金斯研究室竟然看到在那本小說中,手繪高原圖片的真實照片,也提到他跟霍金斯在一起的一些故事,還提到阿里來他們實驗室參訪,決定是否要贊助他們的研究。
科普就是在說明科學的本質,定義問題,尋找共通的標準,測量或實驗,得到結論,被推翻或成為定論。這一連串的過程,就是要透過這些科普文章,潛移默化地傳遞給所有人。不管是什麼科學,能以最貼近大眾生活的方式類比,就能讓這篇科普文章,獲得最大的效益。
但曾校長也提到,既然是科學,讀者就必須要花心力去讀,要不然像很多人買了「時間簡史」,就把書供在書架上,其實是一點用處都沒有的,要有優良的科普作家與作品,也要對應有認真的讀者。一個好作家就得讓大家願意去了解與接受,一個科學知識的新概念,這樣就成功了。
有特殊貢獻的人才,多有「超強的記憶力」,這似乎是不可或缺的一項技能,而這種記憶力,並不單只是記住事情而已,而是能夠舉一反三,從某些事情的特徵,快速地在記憶庫中撈出相關的記憶經驗,當然也要生活經驗夠豐富,才能在瞬間類比出多件事物。
2007/7/23
2007/7/6
Spring提供的資源搜尋器 PathMatchingResourcePatternResolver
過去在尋找設定檔的時候,總是得先用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拿來就很好用了。
但因為class loader本身的限制,先前這種pattern的寫法**/config/**/mappings/mysql/**/*.hbm.xml,得把一開始的prefix路徑寫上去,改成classpath*:config/**/mappings/mysql/**/*.hbm.xml。
最後,先把大多數可能的package prefix都列出來
String[] prefix={"config", "tw", "com" ... };
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
for (int i = 0; i < prefix.length; i++) {
if (prefix[i] != null & !prefix[i].equals("")) {
Resource[] resources = resolver.getResources("classpath*:" + prefix[i] + "/**/configsomething/config-*.xml");
}
}
這樣就能找到在classpath裡面包含jar檔裡面,所有符合/**/configsomething/config-*.xml這個pattern的資源,回傳的資源類別為org.springframework.core.io.Resource,只要用getInputStream()這個method就能取得該資源檔案的InputStream。
ps. 這種方式只適合在app server打開時,init webapp時使用,換句話說,Spring的ApplicationContext在一個webapp裡面只需要建立一次,大家共用就可以了。
這個時候突然想到先前在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拿來就很好用了。
但因為class loader本身的限制,先前這種pattern的寫法**/config/**/mappings/mysql/**/*.hbm.xml,得把一開始的prefix路徑寫上去,改成classpath*:config/**/mappings/mysql/**/*.hbm.xml。
最後,先把大多數可能的package prefix都列出來
String[] prefix={"config", "tw", "com" ... };
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
for (int i = 0; i < prefix.length; i++) {
if (prefix[i] != null & !prefix[i].equals("")) {
Resource[] resources = resolver.getResources("classpath*:" + prefix[i] + "/**/configsomething/config-*.xml");
}
}
這樣就能找到在classpath裡面包含jar檔裡面,所有符合/**/configsomething/config-*.xml這個pattern的資源,回傳的資源類別為org.springframework.core.io.Resource,只要用getInputStream()這個method就能取得該資源檔案的InputStream。
ps. 這種方式只適合在app server打開時,init webapp時使用,換句話說,Spring的ApplicationContext在一個webapp裡面只需要建立一次,大家共用就可以了。
2007/6/22
Weblogic with Spring - Hibernate
由於Hibernate3使用了ANRLR當作SQL語法的parser,但是weblogic裡內含了舊版的ANTLR,這兩個是不能共用的會相衝突,因此得用classpath設定的方式將weblogic的ANTLR蓋掉。
修改的步驟如下:
Step 1.
把Spring使用的ANTLR jar,原本放在WEB-INF/lib/antlr-2.7.6rc1.jar,複製到C:\bea\wlserver_10.0\samples\domains\wl_server\lib
Step 2.
修改 C:\bea\wlserver_10.0\samples\domains\wl_server\bin\setDomainEnv.cmd
在 set CLASSPATH=%PRE_CLASSPATH%; 的後面加上 C:\bea\wlserver_10.0\samples\domains\wl_server\lib\antlr-2.7.6rc1.jar; 如同下面的範例
set CLASSPATH=%PRE_CLASSPATH%;C:\bea\wlserver_10.0\samples\domains\wl_server\lib\antlr-2.7.6rc1.jar;%WEBLOGIC_CLASSPATH%;%POST_CLASSPATH%;%WLP_POST_CLASSPATH%
另外在設定spring跟hibernate的時候,程式裡面要取得Spring的ApplicationContext可以將spring設定檔放在classes/config裡面,並將路徑設定為:
ApplicationContext springContext = new ClassPathXmlApplicationContext("config/bean/bean-config*.xml");
在spring設定檔中,要建立org.springframework.orm.hibernate3.LocalSessionFactoryBean的sessionFactory bean的時候,可以把hibernate設定檔中資源路徑的地方,設定為以下的方式,總共有四種mappingResources、mappingLocations、mappingDirectoryLocations與mappingJarLocations可以使用,因為weblogic會自動將classes裡面的設定檔跟.class檔案都jar在_wl_cls_gen.jar這個檔案裡面,以前用mappingDirectoryLocations classpath:/config/mappings/mysql這個寫法,是不能運作的,改成這個也不行 mappingLocations classpath*:/**/mappings/mysql/**/*.hbm.xml,最後才試出這種寫法,在tomcat跟weblogic都可以正常運作
Spring的資源處理比我想像的還厲害,Chapter 4. Resources Chapter 4. 資源,在指定資源路徑的時候,支援類似ANT的資源指定方式。
修改的步驟如下:
Step 1.
把Spring使用的ANTLR jar,原本放在WEB-INF/lib/antlr-2.7.6rc1.jar,複製到C:\bea\wlserver_10.0\samples\domains\wl_server\lib
Step 2.
修改 C:\bea\wlserver_10.0\samples\domains\wl_server\bin\setDomainEnv.cmd
在 set CLASSPATH=%PRE_CLASSPATH%; 的後面加上 C:\bea\wlserver_10.0\samples\domains\wl_server\lib\antlr-2.7.6rc1.jar; 如同下面的範例
set CLASSPATH=%PRE_CLASSPATH%;C:\bea\wlserver_10.0\samples\domains\wl_server\lib\antlr-2.7.6rc1.jar;%WEBLOGIC_CLASSPATH%;%POST_CLASSPATH%;%WLP_POST_CLASSPATH%
另外在設定spring跟hibernate的時候,程式裡面要取得Spring的ApplicationContext可以將spring設定檔放在classes/config裡面,並將路徑設定為:
ApplicationContext springContext = new ClassPathXmlApplicationContext("config/bean/bean-config*.xml");
在spring設定檔中,要建立org.springframework.orm.hibernate3.LocalSessionFactoryBean的sessionFactory bean的時候,可以把hibernate設定檔中資源路徑的地方,設定為以下的方式,總共有四種mappingResources、mappingLocations、mappingDirectoryLocations與mappingJarLocations可以使用,因為weblogic會自動將classes裡面的設定檔跟.class檔案都jar在_wl_cls_gen.jar這個檔案裡面,以前用mappingDirectoryLocations classpath:/config/mappings/mysql這個寫法,是不能運作的,改成這個也不行 mappingLocations classpath*:/**/mappings/mysql/**/*.hbm.xml,最後才試出這種寫法,在tomcat跟weblogic都可以正常運作
Spring的資源處理比我想像的還厲害,Chapter 4. Resources Chapter 4. 資源,在指定資源路徑的時候,支援類似ANT的資源指定方式。
2007/6/21
不舉 的左手
應該是職業傷害的關係,長久以來,我的肩膀總會覺得酸痛,還常常落枕,最近,左手肩膀又開始出毛病了,現在在左手上胳臂跟肩膀的連接處不是酸痛而是有一點刺痛,這是不是五十肩的症狀?我開始試著在沒事的時候將左手往上舉高,也稍微繞繞肩膀,不知道會不會有幫助。
不僅僅肩膀有問題,我可以感覺得到,因為長期低頭面對電腦銀幕的關係,我的脖子兩側因缺乏運動而覺得很緊,這或許是靜態工作者的原罪。現在的社會要求「專業」,但專業的成份得要一分努力一分收穫,得花時間培養這種專業,而經過了這麼久的時間,讓我們的生活養成習慣,可以為了一個搞不清楚為甚麼的bug,一直坐著想辦法解決問題,這是一種不可避免的惡性循環。
公司提供健康檢查的機會,希望大家注意身體健康,但治標不能治本,其實得要更積極地要求工程師,每1~2小時,就強迫離開電腦銀幕,離開座位10分鐘,看看窗外遠方,讓視線與心情暫時跳離一行一行的程式碼。
ps.
才剛解決weblogic與tomcat中,getRealPath的差異(以getResourceAsStream取代),又發現Hibernate 3跟weblogic中舊版的ANTLR相衝這個大問題,得儘快解決。
weblogic這麼昂貴的AP server,在我們的伺服器上卻得耗掉200~300MB的記憶體,速度很慢跑不大動,每一次重開Server就得花掉5 mins(還是Tomcat好用多了),又遇上Hibernate的大問題,真的很麻煩,功能多了反而問題更多,這似乎又是軟體的另一樁原罪。
不僅僅肩膀有問題,我可以感覺得到,因為長期低頭面對電腦銀幕的關係,我的脖子兩側因缺乏運動而覺得很緊,這或許是靜態工作者的原罪。現在的社會要求「專業」,但專業的成份得要一分努力一分收穫,得花時間培養這種專業,而經過了這麼久的時間,讓我們的生活養成習慣,可以為了一個搞不清楚為甚麼的bug,一直坐著想辦法解決問題,這是一種不可避免的惡性循環。
公司提供健康檢查的機會,希望大家注意身體健康,但治標不能治本,其實得要更積極地要求工程師,每1~2小時,就強迫離開電腦銀幕,離開座位10分鐘,看看窗外遠方,讓視線與心情暫時跳離一行一行的程式碼。
ps.
才剛解決weblogic與tomcat中,getRealPath的差異(以getResourceAsStream取代),又發現Hibernate 3跟weblogic中舊版的ANTLR相衝這個大問題,得儘快解決。
weblogic這麼昂貴的AP server,在我們的伺服器上卻得耗掉200~300MB的記憶體,速度很慢跑不大動,每一次重開Server就得花掉5 mins(還是Tomcat好用多了),又遇上Hibernate的大問題,真的很麻煩,功能多了反而問題更多,這似乎又是軟體的另一樁原罪。
2007/6/14
Anti-Hack 的解決方案
要對付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 。
這篇文章提到的canonicalize與HTMLEntityEncode,我們並沒有採用,其實我還不大瞭解canonicalization的原理,或許在瞭解後會加上去。我們是利用regular expression pattern matching的方式,將一些已知基本的攻擊字元替代掉,也就是這篇文章BadInputFilterValve.java提到的方式,直接用String.replaceAll的方法,將reqest裡的參數都處理掉,把 \" 取代成 " ,把 document(.*)\\.(.*)cookie 取代成 document.cookie 。
訂閱:
文章 (Atom)