2013年12月9日 星期一

死生契闊‧與子成說

http://blog.udn.com/liecloud/3970231

《詩三百‧邶風‧擊鼓》中有一段話如此寫道:『死生契闊,與子成說;執子之手,與子偕老。』
  用白話說就是:「無論生死離合多麼遼遠,我都跟妳約定好了,要牽妳的手一起到老。」
  這是幾千年前先人的浪漫,也是丈夫對妻子深切的思念。
  在早期台灣,平埔族與原住民的婚俗中,「牽手」一詞是指對妻子的稱呼,在連雅堂所撰的《台灣語典》中寫道:「土番娶婦,親至婦家,攜手以歸;沿山之人習見其俗,因謂妻曰牽手。」執子之手與牽手兩者之間,似乎冥冥之中有了呼應。
  「執子之手,與子偕老」與「牽手」兩字都是最美的文字之一,也都代表著男人對女人一生的承諾。
  然而曾幾何時,這種美凋零了,被電光石火的愛情與水逝雲卷的承諾所取代,一切都變成得之容易、失之不難。或許在這個愛情太氾濫的年代,兩性關係需要檢討,對生命的態度也值得省思。
  今時男女,在花前月下傾訴著綿綿不絕的甜言蜜語,宛如星飛電掣般纏綿在一起,口中輕輕吐出「我愛你」三個字,看似如此堅定不移,甚至以為可以海枯石爛、至死不渝,但實際上那只因當下一觸即發的慾望,而併發出短暫且絢麗的煙火而已,不過曇花一現、海市蜃樓般不切實際。
   所謂未經一番寒徹骨,哪得梅花撲鼻香的道理,即是世界太多元,很多「速食」觀念的形成,導致許多事情被本末倒置化,而無法去體會細水長流的美,更無法領 略《上邪》詩中的那份執著與堅定。現今多數的年青男女很難懂得「我愛你」的真諦,大部分年青男女只為了心中那股慾望,就像乾柴遇上烈火般,用盡氣力燃燒耗 竭,一地成灰後,原以為昇華了彼此愛情的模樣,實際上卻是愛情的原貌始終不曾看見。
  所以一個人若是沒有歷經過愛情真正的洗禮,是很難體悟何謂:『死生契闊,與子成說。執子之手,與子偕老。』這份願意用一生一世與愛人廝磨的渴望。更無法去理解樂府詩歌中那句:『我欲與君相知,長命無絕衰!』這種不因時間流逝而有所遞減的情感。
  所以走過愛情,回頭看看來時路,是否我們都曾不留遺憾,且遇見過生命裡真正的那份愛呢?我相信,對天地合、乃敢與君絕這樣的愛情渴望,應該不分男女老少都想擁有的,對執子之手,與子偕老的這份期盼,應該也是存活在每個人內心深處吧!


以下收錄兩首原篇
《詩經‧邶風‧擊鼓》
擊鼓其鏜,踊躍用兵。土國城漕,我獨南行。
從孫子仲,平陳與宋。不我以歸,憂心有忡。
爰居爰處?爰喪其馬?于以求之?于林之下。
死生契闊,與子成說。執子之手,與子偕老。
于嗟闊兮,不我活兮。于嗟洵兮,不我信兮。

《上邪》
上邪!我欲與君相知,長命無絕哀。
山無陵,江水為竭,冬雷震震,夏雨雪,天地合,乃敢與君絕。



http://tw.myblog.yahoo.com/jw!JXtfR4iXFBJibPnil02kvQ--/article?mid=7

《詩經·邶風·擊鼓》
擊鼓其鏜,踴躍用兵。土國城漕,我獨南行。
從孫子仲,平陳與宋。不我以歸,憂心有忡。
爰居爰處?爰喪其馬?於以求之?於林之下。
死生契闊,與子成說。執子之手,與子偕老。
于嗟闊兮,不我活兮。于嗟洵兮,不我信兮。
--------------------------------------------------------


譯文

  敲鼓聲音響鏜鏜, 鼓舞士兵上戰場。 人留國內築漕城, 唯獨我卻奔南方。


  跟從將軍孫子仲, 要去調停陳和宋。 長期不許我回家, 使人愁苦心忡忡。


  安營紮寨有了家, 繫馬不牢走失馬。 叫我何處去尋找? 原來馬在樹林下。


  無論聚散與死活, 我曾發誓對你說。 拉著你手緊緊握, 白頭到老與你過。


  歎息與你久離別, 再難與你來會面。 歎息相隔太遙遠, 不能實現那誓約。
 
 
解釋
 
長年行役於外的將兵思念家鄉和妻子。
 
孫子仲:當時衛國的元帥。

平:《集傳》:「平,和也。合二國之好也」。有說當時陳、宋二國作亂,孫子仲平之,則「平」應為「平伏」,或不戰而使蕃國歸順,並不是兩個平等的國家締結和盟。孫子仲當時是「天子師」的出兵,不是衛國戰爭。

 
爰居爰處,爰喪其馬:《傳》:「有不還者,有亡其馬者」。《箋》:「不還,謂死也,傷也,病也。今於何居乎?於何處乎?於何喪其馬乎?」爰(ㄩㄢˊ) ,即哪裡。
 
契闊:離合。馬瑞辰《通釋》:「契當讀如契合之契,闊當讀如疏闊之闊。……契闊與死生相對成文,猶雲合離聚散耳」。契即合,闊即離。

 
成說:《通釋》:「成說即成言也。……《傳》訓說為數者,蓋為預有成計,猶言有成約也。」即已有約定。
 
洵(ㄒㄩㄣˊ):遠。

 
信:即「言而有信」的信。(一說古「伸」字,志不得伸,一說極,信、極連讀,猶言終古。按通篇意旨,均不從)

[ 執子之手,與子偕老] :子,你的意思 ~
 
        在《詩經》的註解裡,契為合,闊為離,死生契闊就是生死離合的意思。「生死相依,我與你已經發過誓了;牽著你的手,就和你一起白頭到老。」這是一個征戰在 外不能歸的士兵,對妻子分別時誓言的懷念,兩情繾綣,海誓山盟,痛徹心扉。從此,「執子之手」成了生死不渝的愛情的代名詞。千百年來,斗轉星移,滄海桑 田,多少語匯老去,這個詞卻依然煥發著讓人怦然心動的生命力。

2013年12月6日 星期五

Regular Expression (RegExp) in JavaScript

http://blog.roodo.com/rocksaying/archives/2670695.html

Regular Expression (RegExp) in JavaScript

javascript regexp
Regular Expression (以下簡稱 REGEX) 是以一組特定字元符號描述字串樣式規則的記述語法。簡單地說, REGEX 用於表達字元符號在字串中出現的規則。舉個例子說明,在 REGEX 中,字元 '^' 放在第一個位置表示字串開頭位置,當我寫下 ^A 的記述時,便表示必須是一個開頭為 A 的字串,如 Adam,才符合此一規則。這個表達規則通常稱為 pattern 。 ECMAScript/JavaScript 以內建的 RegExp Object 提供 REGEX 功能。See also: ECMA-262 15.10 - RegExp Objects
要產生一個 RegExp 個體有兩種方式。第一種是直接以斜線 (/) 包住 pattern ,例如 /^A/ 。注意不要再用單引號或雙引號包在斜線外圍,一但用了引號圍住,就只是一個 String 而非 RegExp 個體。 "/^A/" 就是錯誤寫法,這只是一個普通字串。第二種是向系統要求建立一個 RegExp 個體,即 new RegExp(pattern) ,引數 pattern 可以是一個字串也可以是另一個 RegExp 個體。第一種方法只能使用常值的 pattern ,我們不能用斜線包住一個變數或一個字串運算結果。如果 pattern 保存在變數之中,則必須使用第二種方式。
RegExp 個體提供兩個主要行為,即 exec() 和 test() 。 exec() 會對引數字串進行比對運算,並將匹配的字串內容記錄在陣列中回傳。而 test() 則僅僅測試引數字串是否符合規則,只回傳 truefalse 。此外,RegExp 個體也可以作為 String 個體的 match(), search(), replace(), split() 之引數。 String 的 match() 其實就是調用 RegExp 的 exec() ,兩者的結果相同。
ECMAScript/JavaScript 的 REGEX 規則是以 Perl 的規則為範本 (PHP 中稱為 PCRE 的內容) ,本文僅簡短說明幾個常見的字元意義。想了解更多用法者,請參看 Perl/PHP 的相關書籍,以及 ECMA-262 15.10 的內容。
  1. ^
    寫在 pattern 第一個位置時,表示其後一符號必須出現在字串開頭的位置。寫在 pattern 中間位置時則為否定之意,表示字串中不可有 ^ 之後一符號的內容。
  2. $
    寫在 pattern 最後一個位置時,表示其前一符號必須出現在字串尾端的位置。寫在 pattern 中時無特別意義。
  3. *
    表示字串中有 0 到無數個其前一符號的內容。
  4. +
    表示字串中有 1 到無數個其前一符號的內容。
  5. ?
    表示字串中有 0 到 1個其前一符號的內容。
  6. { }
    表示前一符號在字串中的重覆次數。例如 /A{2}/ 表示 'A' 重覆兩次 (即 'AA') ;/A{2,}/ 表示字串含有 2 到無數多個 'A' ;/A{2,5}/ 表示含有 2 到 5 個 'A' 。
  7. .
    表示一個任意字元。
  8. [ ]
    表示字串含有括號中任一字元的內容。可以 - 表示一組連續字元,例如 /[a-z]/, /[0-9]/ 。注意, [] 僅代表一個字元,例如 /[abc]/ 表示 'a' 或 'b' 或 'c' ,而不是 'abc' 。
  9. ( )
    表示一個 sub pattern ,符合 sub pattern 的字串內容會被存放在匹配陣列中,並依序指派數字代表此 sub pattern 。可以此數字在 pattern 的其他地方引用內容,例如 /The h([0-9]) means Title (\1)/ 表示第 1 個 sub pattern 是 0 到 9 的任一字元,而 \1 表示匹配的內容。故 'The h1 means Title 1', 'The h2 means Title 2' 到 'The h9 means Title 9' 符合規則。
  10. \
    表示轉義 (escaping) ,將其後的字元視為一般字元。例如要表示字串中含有 '/' 字元時,就必須寫作 /\//
  11. |
    「或」意,字串中含有 '|' 之前一符號或後一符號的內容。例如 /image\.(jpg|png)/ 表示 'image.jpg' 或 'image.png' 。通常會用 () 括住 '|' 的前後符號。
  12. \d
    表示任何一個數字,意同 [0-9] 。
  13. \D
    表示任何一個非數字,意同 [^0-9] 。
  14. \w
    表示任何一個字元與數字以及 '_' ,意同 [a-zA-Z0-9_] 。
  15. \W
    表示任何一個 \w 以外的字元。
  16. \s
    表示任何一個空白符號,包括 \t, \v 等。
  17. \S
    表示任何一個非空白符號。

2013年12月4日 星期三

Java 有 3rd party class 時,應該如何放

http://tw.myblog.yahoo.com/l314kimo/article?mid=338&prev=346&next=337&l=f&fid=10

今天總算釐清了一些困擾我很久的東西,所以做個簡單的筆記。

一、安裝單一版本的jdk時,通常會有:

4個java.exe:

   1.WINDOWS\system32\java.exe
   2.[JRE_location]\bin\java.exe
   3.[JDK_location]\bin\java.exe
   4.[JDK_location]\jre\bin\java.exe

2個JRE:
   1.Public JRE (指[JRE_lcation])
   2.Private JRE (指[JDK_location]\jre)

前兩個java.exe使用的是Public JRE,後兩個java.exe使用的是Private JRE




二、classpath無需設定rt.jar的路徑,因為jdk會預設載入。(參考六)

可以在console mode 輸入java -verbose得之。
(verbose 可以顯示JVM會依序load哪些Class)
不知道是幾版之後才如此。總之,我試了又試,有沒有設rt.jar路徑真的無差別,
很好奇為什麼大家都說要在classpath設定rt.jar,而我在google上卻找不到答案。
也有人提倡最好少設classpath。




三、path用來設定指令的前置位址,如下:

(可以在console mode 輸入set path 或 path以顯示)
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
C:\Program Files\Microsoft SQL Server\90\Tools\binn\;
C:\Program Files\Java\jdk1.6.0\bin;
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin;

所以當我們在console mode 輸入java XXX 時,如果current目錄沒有java這指令時,
便會依序嘗試path下的路徑。




四、jdk目錄下之所以安置了一個jre,原因在於jdk下的工具大都是用java開發的。

如:java.exe , javac.exe jar.exe..等,(這些工具都放在jdk\lib\tools.jar中)
外表雖然是用RPC包裝成.exe檔,但其實它們都需要呼叫JRE的library。
所以JDK下就放了一個專供JDK使用的JRE,
但也可以透過path的設定讓[JDK_location]\jre被一般使用者使用。




五、在console mode使用java 這指令時,它使用的是哪個jre呢?

1.先找自己的目錄下是否有jre.

2.父目錄底下的jre目錄.(jdk\bin下的工具便是如此找到jdk\jre)

3.查詢Windows Registry
(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\)

所以這時path的順序設定將決定採用的是哪一個jre。

case1:
若path的順序是\WINDOWS\system32 在 \[JDK_location]\bin 之前。
java指令便是執行\WINDOWS\system32\java.exe
由於windows下無jre目錄,所以會參考Window Registry下的jre。
(即前述的Public JRE)

case2:
若path 的順序是\[JDK_location]\bin 在\windows\system32 之前。
那麼java指令便是執行C:\[JDK_location]\bin\java.exe
由於jdk下有一個jre目錄,所以java會參考jdk\jre。
(即前述的Private JRE)

最常發生的問題是當path的順序如case1,
java指令找到的jre與javac找到的jre是不同的。
產生的問題待第六點解釋。




六、java找尋class的順序

根據JDK 文件說明, java以下面3種順序找尋class的順序
1.Bootstrap classes

2.Extension classes

3.Users classes



Bootstrap classes指的是java在啟動時載入的class,
這些class主要是rt.jar 和 jre/lib 目錄下的一些class。
(所以rt.jar可以不須加入classpath)

下面列出系統中預設的Bootstrap classes:
jre\lib\rt.jar; jre\lib\i18n.jar;
jre\lib\sunrsasign.jar; jre\lib\jsse.jar;
jre\lib\jce.jar; jre\lib\charsets.jar;
jre\classes


Extension classes 指的是jre/lib/ext 目錄下的jar或zip檔。
third-party 的 library通常會放在這目錄下,如java3d, jogl..等。
當classloader 需要resolve class時,jre會自動來此目錄下找。
如果不同名字的jar,卻包含了相同的class,那麼哪一個class被載入是不一定的。

第五點最後提到的問題,常常跟Extension classes扯上關係。
當我們使用third-party的library時,如果只將jar檔放在Private JRE/lib/ext中,
javac指令因為使用Private JRE,所以能夠找到third-party library,得以順利compile。
但java指令使用的是Public JRE,Public JRE找不到 third-party library,
以致無法順利執行,原因是無法import package。

解決的方法有:
1.將third-party library jar檔 在 private JRE/public JRE 各放一份。
2.設定path時,使用第五點的case2。使java及javac指都優先使用Private JRE。

Eclipse可以很方便使用third -party library,
Project->Properties->Java Build Path->Libraries->Add External JARs
(陶百學長教我的)



User classes便是指我們在classpath設定路徑下的class。
如:若總是使用c:\java\的class,或是需要使用c:\lib\test.jar裡的library,
便可以set classpath =.;c:\java\;c:\lib\test.jar
(.jar檔須將完整路徑名加入classpath, jre才會進入該jar檔裡找尋target class)

user classes尋找的優先序:
(1)若無設定classpath, jre預設找(.)目前目錄是否存在target class.
(2)若有設定classpath, jre只找classpath設定的路徑是否存在target class.
(3)在console mode下使用-cp 或 -classpath, 則jre只找參數後的路徑是否存在target class.
(4)在console mode使用-jar來指定jar檔時, jre只找尋jar中是否存在target class.

2013年11月30日 星期六

如何限制只有某些IP才能使用Tomcat Manager

http://zhumeng8337797.blog.163.com/blog/static/100768914201292215550664/

如何限制只有某些IP才能使用Tomcat Manager  

2012-10-22 13:55:50|  分类: apache_tomcat |字号 订阅
Tomcat 所附的manager application可以讓網站管理者透過存取/manager/html的方式隨時去reload一個webapp,基本的安全性保護是透過conf /tomcat-users.xml的帳號跟密碼認證,如果還要進一步要求安全性的話,可以修改manager.xml,加上使用IP或主機名稱來限制來 源主機,底下是用IP作限制的例子: 
01<ContextdocBase="${catalina.home}/server/webapps/manager"
02         privileged="true"antiResourceLocking="false" antiJARLocking="false">
03  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
04                allow="127.0.0.1,192.168.1.*"/>
05 
06  <!-- Link to the user database we will get roles from -->
07  <ResourceLink name="users" global="UserDatabase"
08                type="org.apache.catalina.UserDatabase"/>
09 
10</Context>


只需要對原來的manager.xml加上 
<Valve className="org.apache.catalina.valves.RemoteAddrValve" 
allow="127.0.0.1,192.168.1.*"/> 
的設定,其中allow是允許的來源IP,如果有兩個以上時用逗號(,)隔開,同一個網段,可用萬用字元星號(*)來表示。 

參考資料: 
The Apache Tomcat 5.5 Servlet/JSP Container - Manager App HOW-TO 
Apache Tomcat Configuration Reference - The Valve Component

Tomcat 7.0的設定方法: 
在manager.xml中加入下列設定到Context 
1<Valve className="org.apache.catalina.valves.RemoteAddrValve"
2                allow="114\.\d+\.\d+\.\d+"/>

如: 
1<Context docBase="${catalina.home}/webapps/manager"
2         privileged="true" antiResourceLocking="false" antiJARLocking="false">
3        <Valve className="org.apache.catalina.valves.RemoteAddrValve"
4                allow="114\.\d+\.\d+\.\d+"/>
5</Context>


參考資料: 
http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Remote_Address_Filter