2012年10月20日 星期六

Tomcat on QNAP TS-219P+

在Mac上運行Tomcat伺服器沒有問題。 但要將伺服器放在自己的NAS想就發覺有問題啦。因為我的NAS是行Marvel (ARM) 處理器的QNAP TS-219+。因為QNAP沒有出ARM 的QPKG Java Runtime(JRE),只有Intel處理器的JRE。

在網上搜尋好幾個討論區舊post都沒有成功的例子。不過在七月中,Oracle 出了自己的JRE(其實有左好耐XD)。細看之下發覺更新左Embedded JRE 並支援ARM 處理器喎,於是立即下載JRE 6和安裝。最後Tomcat 能在NAS 完美運行!以下分享簡單安裝步驟 :)


  • 在Oracle網站下載這個ejre-1_6_0_34-fcs-b04-linux-arm-sflt-eabi-headless-19_jul_2012.tar.gz Embedded JRE.
  • 把它抄入/share/Public/,並且把它解壓。
gzip -d ejre-1_6_0_34-fcs-b04-linux-arm-sflt-eabi-headless-19_jul_2012.tar.gz
tar xvf ejre-1_6_0_34-fcs-b04-linux-arm-sflt-eabi-headless-19_jul_2012.tar
  • 咁JAVA_HOME=/share/Public/share/Public/ejre1.6.0_34/。
  • 在伺服器創建 tomcat 户口,並建立一個 home directory。我把它設定在 /share/homes/tomcat。
  • 在tomcat .profile 裡設定 umask 027.
  • Tomcat網站下載最新版本(我只下載了Core tar.gz apache-tomcat-7.0.32.tar.gz),並把它抄入 tomcat home directory。同樣把它解壓。
gzip -d apache-tomcat-7.0.32.tar.gz
tar xvf apache-tomcat-7.0.32.tar
  • 咁TOMCAT_HOME=/share/homes/tomcat/apache-tomcat-7.0.32
  • 之後,設定tomcat port,在 $TOMCAT_HOME/conf/server.xml 中,揾8080並更改為你想要的port。
  • 記住一定要更改在 $TOMCAT_HOME/conf/tomcat-users.xml的tomcat密碼。
  • $TOMCAT_HOME/bin/startup.sh 和 $TOMCAT_HOME/bin/shutdown.sh 最前行加入以下幾句:

JAVA_HOME=/share/Public/ejre1.6.0_34
export JAVA_HOME
umask 027
  • tomcat身份執行 $TOMCAT_HOME/bin/startup.sh 便成。


如果你是以admin身份登入NAS,伺服器本身是沒有安裝su的,執行ipkg install coreutils便有了。之後可以su - tomcat來登入tomcat.

2012年9月15日 星期六

YUI fight ~~ 正!


頑張れ頑張れ
命燃やして
続く現実
生きてゆく
頑張れ頑張れ
限りある日々に…
花を咲かせる

加油呀加油呀
燃燒生命吧
繼續在現實
生存下去
加油呀加油呀
在有限的日子裡
讓花盛放吧

好聽,又勵志,大家快啲去買啦!YUI Y_Y



2012年9月2日 星期日

HKID validation in Java

Courtesy to http://keatonchan.blogspot.hk/2009/08/hkid-check-digit-calculation-algorithm.html for algorithm. Revised edition:

public class HKID { 
 public static boolean validate(String prefix, String serial, String checkdigit) 
   String prefixU = prefix.toUpperCase();
   long value = 0; if (prefixU.length() == 2) { 
     value += (prefixU.charAt(0) - 55) * 9 + (prefixU.charAt(1) - 55) * 8; 
  } else if (prefixU.length() == 1) { 
     value += 36 * 9 + (prefixU.charAt(0) - 55) * 8; 
   } 
   for (int i = 0; i < 6; i++) { 
     value += Integer.parseInt(serial.substring(i, i + 1)) * (7 - i); 
   } 
   long reminder = value % 11; 
   long valid_checkdigit = 11 - reminder;
   if ("A".equalsIgnoreCase(checkdigit) && valid_checkdigit == 10) 
      return true; 
   } 
   try { 
     if (valid_checkdigit == Integer.parseInt(checkdigit)) { 
       return true; 
     } 
   } catch (Exception e) { } 
   return false; 
 }  
}

PS> Objective-C version


#import "HKID.h"

@implementation HKID

+ (BOOL) validateWithPrefix:(NSString*) prefix serial:(NSString *) serial checkdigit:(NSString*) checkdigit {
    NSString* prefixU = [prefix uppercaseString];
    int value = 0;
    if ([prefixU length] == 2) {
        value += (([prefixU characterAtIndex:0] - 55) * 9) + (([prefixU characterAtIndex:1] - 55) * 8);
    } else if ([prefixU length] == 1) {
        value += 36 * 9 + ([prefixU characterAtIndex:0] - 55) * 8;
    } else {
        return false;
    }
    if ([serial length] != 6) return false;
    if ([checkdigit length] != 1) return false;
    for (int i = 0; i < 6; i++) {
        int tempValue = [[serial substringWithRange:NSMakeRange(i,1)] intValue];        
        value += tempValue * (7 - i);
    }
    long reminder = value % 11;
    long valid_checkdigit = 11 - reminder;
    NSCharacterSet *digitSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
    if ([[checkdigit stringByTrimmingCharactersInSet:digitSet] isEqualToString:@""]){ // all digits
        if ([checkdigit intValue] == valid_checkdigit) {
            return true;
        }
    } else if ([@"A" isEqualToString:checkdigit]) {
        if (valid_checkdigit == 10) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}
@end