2010年5月31日 星期一

Concurrent

1. 不太懂的 class,
其中 ExecutorService 為一個 create thread 的東東, 需要再研究.
{{{

Future[] futures = new Future[numThreads];
Operator[] operators = new Operator[numThreads];

ExecutorService es = Executors.newCachedThreadPool();

for (int i = 0; i < numThreads; i++) {
operators[i] = new Operator(subLists[i], mode, flag);
futures[i] = es.submit(operators[i]);
}


}}}

2.
特別的是 Callable 類似 Thread 方式
/**
* Operator is a thread for sequencial job operation.
*
* @author hclee
*/
class Operator implements Callable {
public List call() {
}
}

2010年5月30日 星期日

PHPTutorial

1. PHP tutorila http://www.php.net/manual/en/language.oop5.basic.php

2010年5月29日 星期六

FaceBook

1. 申請帳號: register your Facebook application.

2. 同意後,
應用程式 ID 103871759660058
API 金鑰 1c00525a36d8a201192d447927f6f06c 你公開的 API 金鑰。
秘密 ecbe6ca4855c667ff7ba8de9c460e3e7

3. 下載 facebook api 在 local 端.
取得 [Andy@t-ap188 MY_DIR]$ ls
facebookapi_php5_restlib.php facebook_mobile.php facebook.php 檔案

4, 建立應用程式: 在 local /MY_DIR/
index.php
{{{
// Copyright 2007 Facebook Corp. All Rights Reserved.
//
// Application: Example
// File: 'index.php'
// This is a sample skeleton for your application.
//

require_once 'facebook.php';

$appapikey = '0fb83bc6c1301371176a6bd1a05fbfb8';
$appsecret = 'b620c0cd71b8e1044534b50c90208a97';
$facebook = new Facebook($appapikey, $appsecret);
$user_id = $facebook->require_login();

// Greet the currently logged-in user!
echo "

Hello Hello, !

";

// Print out at most 25 of the logged-in user's friends,
// using the friends.get API method
echo "

Friends:";
$friends = $facebook->api_client->friends_get();
$friends = array_slice($friends, 0, 25);
foreach ($friends as $friend) {
echo "
$friend";
}
echo "

";

?>

}}}

}}}

5. 設定畫布 Canvas
1. 畫布頁面網址
http://apps.facebook.com/andyfacebookexample/
2. Canvas Callback URL -> http://140.109.98.188/MY_DIR/


6. 可以留覽應用程式

Reference:
1. http://developers.facebook.com/docs/guides/canvas/


Note:
1. 重點應該在 friend 應用
2. callback 作什麼呢??

JQuery

1. 在 SL linux 下已建立 http /var/www

2. 可放 jquer program in this
[Andy@t-ap188 html]$ ls alert.html index.html jquery-1.4.2.js

3. vim html.index
{{{






}}}

4. 起動 http: service httpd start

5. SELinux -> Boolean -> HTTPD Service -> Disable SELinux protection for httped dameon

2010年5月27日 星期四

INFORMATION Service

1. 概念:
GLite 中每個 Site 會公開資訊, 使用 BDII 技術, 而一般 User 可以查詢到公開資訊. 其中 GLUE 會是常用的字, 表示 Grid Laboratory for a Uniform Environment (網格實驗室一個統一環境)




2. 指令瞭解:
查詢的指令有兩個: lcg-info 及 lcg-infosites,
lcg-info --list-ce [--bdii bdii] [--vo vo] [--sed] [--debug] [--query query] [--attrs list]





3. lcg-info 範例:
a. 查看可用的屬性
{{{
[ui01] /home/dhc00/PracticeGlite/test100527/2 > lcg-info --list-attrs

Attribute name Glue object class Glue attribute name
1 WorstRespTime GlueCE GlueCEStateWorstResponseTime
2 CEAppDir GlueCE GlueCEInfoApplicationDir
3 TotalCPUs GlueCE GlueCEInfoTotalCPUs
4 MaxRunningJobs GlueCE GlueCEPolicyMaxRunningJobs
5 CE GlueCE GlueCEUniqueID
6 WaitingJobs GlueCE GlueCEStateWaitingJobs
7 MaxCPUTime GlueCE GlueCEPolicyMaxCPUTime
8 LRMSVersion GlueCE GlueCEInfoLRMSVersion
9 MaxTotalJobs GlueCE GlueCEPolicyMaxTotalJobs
10 CEStatus GlueCE GlueCEStateStatus
11 LRMS GlueCE GlueCEInfoLRMSType
12 CEVOs GlueCE GlueCEAccessControlBaseRule
13 AssignedJobSlots GlueCE GlueCEPolicyAssignedJobSlots
14 FreeCPUs GlueCE GlueCEStateFreeCPUs
15 RunningJobs GlueCE GlueCEStateRunningJobs
16 EstRespTime GlueCE GlueCEStateEstimatedResponseTime
17 FreeJobSlots GlueCE GlueCEStateFreeJobSlots
18 Cluster GlueCE GlueCEInfoHostName
19 TotalJobs GlueCE GlueCEStateTotalJobs
20 Priority GlueCE GlueCEPolicyPriority
21 CEDefaultSE GlueCE GlueCEInfoDefaultSE
22 JobManager GlueCE GlueCEInfoJobManager
23 MaxWCTime GlueCE GlueCEPolicyMaxWallClockTime
24 Accesspoint GlueCESEBind GlueCESEBindCEAccesspoint
25 CloseCE GlueCESEBindGroup GlueCESEBindGroupCEUniqueID
26 CloseSE GlueCESEBindGroup GlueCESEBindGroupSEUniqueID
27 Root GlueSA GlueSARoot
28 AvailableSpace GlueSA GlueSAStateAvailableSpace
29 Path GlueSA GlueSAPath
30 SEVOs GlueSA GlueSAAccessControlBaseRule
31 UsedSpace GlueSA GlueSAStateUsedSpace
32 SESite GlueSE GlueForeignKey
33 SEType GlueSE GlueSEType
34 SEArch GlueSE GlueSEArchitecture
35 SEName GlueSE GlueSEName
36 SE GlueSE GlueSEUniqueID
37 SEPort GlueSE GlueSEPort
38 Protocol GlueSEAccessProtocol GlueSEAccessProtocolType
39 ArchType GlueSL GlueSLArchitectureType
40 ServiceID GlueService GlueServiceUniqueID
41 ServiceOwner GlueService GlueServiceOwner
42 ServiceWSDL GlueService GlueServiceWSDL
43 ServiceName GlueService GlueServiceName
44 ServiceVersion GlueService GlueServiceVersion
45 ServiceEndpoint GlueService GlueServiceEndpoint
46 ServiceSite GlueService GlueForeignKey
47 ServiceStatusInfo GlueService GlueServiceStatusInfo
48 ServiceVOs GlueService GlueServiceAccessControlRule
49 ServiceAccesspoint GlueService GlueServiceAccessPointURL
50 ServiceURI GlueService GlueServiceURI
51 ServiceType GlueService GlueServiceType
52 ServiceStatus GlueService GlueServiceStatus
53 SiteSupport GlueSite GlueSiteUserSupportContact
54 SiteName GlueSite GlueSiteName
55 SiteAdmin GlueSite GlueSiteSysAdminContact
56 SiteDesc GlueSite GlueSiteDescription
57 SiteLocation GlueSite GlueSiteLocation
58 SiteSecurity GlueSite GlueSiteSecurityContact
59 SiteInfo GlueSite GlueSiteOtherInfo
60 SiteID GlueSite GlueSiteUniqueID
61 SMPSize GlueSubCluster GlueHostArchitectureSMPSize
62 Processor GlueSubCluster GlueHostProcessorModel
63 PlatformArch GlueSubCluster GlueHostArchitecturePlatformType
64 OSVersion GlueSubCluster GlueHostOperatingSystemVersion
65 VMemory GlueSubCluster GlueHostMainMemoryVirtualSize
66 CFP2000 GlueSubCluster GlueHostBenchmarkSF00
67 TmpDir GlueSubCluster GlueSubClusterTmpDir
68 OSRelease GlueSubCluster GlueHostOperatingSystemRelease
69 ClockSpeed GlueSubCluster GlueHostProcessorClockSpeed
70 LogicalCPU GlueSubCluster GlueSubClusterLogicalCPUs
71 OutboundIP GlueSubCluster GlueHostNetworkAdapterOutboundIP
72 OS GlueSubCluster GlueHostOperatingSystemName
73 Tag GlueSubCluster GlueHostApplicationSoftwareRunTimeEnvironment
74 CINT2000 GlueSubCluster GlueHostBenchmarkSI00
75 WNTmpDir GlueSubCluster GlueSubClusterWNTmpDir
76 CPUVendor GlueSubCluster GlueHostProcessorVendor
77 PhysicalCPU GlueSubCluster GlueSubClusterPhysicalCPUs
78 InboundIP GlueSubCluster GlueHostNetworkAdapterInboundIP
79 Memory GlueSubCluster GlueHostMainMemoryRAMSize
80 VORunningJobs GlueVOView GlueCEStateRunningJobs
81 VOTotalJobs GlueVOView GlueCEStateTotalJobs
82 VOWorstRespTime GlueVOView GlueCEStateWorstResponseTime
83 VOEstRespTime GlueVOView GlueCEStateEstimatedResponseTime
84 VOCEVOs GlueVOView GlueCEAccessControlBaseRule
85 VOFreeJobSlots GlueVOView GlueCEStateFreeJobSlots
86 VOWaitingJobs GlueVOView GlueCEStateWaitingJobs


}}}

注:
1. 第 5 項屬性 CE 為 CE 的可辨識的名稱如
w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia





b. 列出世界上所有的 CE
{{{
lcg-info --list-ce

...
- CE: unipa-ce-01.pa.pi2s2.it:2119/jobmanager-lcglsf-unina_long
- CE: unipa-ce-01.pa.pi2s2.it:2119/jobmanager-lcglsf-unina_short
...
- CE: vega-ce.ct.infn.it:2119/jobmanager-lcgsge-cert
- CE: vega-ce.ct.infn.it:2119/jobmanager-lcgsge-gilda
.....
}}}

b. 列出 Euasia 的 CE
{{{
[ui01] /home/dhc00/PracticeGlite/test100527/2 > lcg-info --list-ce --vo euasia


- CE: ce.haii.or.th:2119/jobmanager-lcgpbs-euasia

- CE: ce.utmgrid.utm.my:2119/jobmanager-lcgpbs-euasia

- CE: ce01.knowledgegrid.net.my:2119/jobmanager-pbs-euasia

- CE: ce1.egee.cesnet.cz:2119/jobmanager-pbs-euasia

- CE: ce2.egee.cesnet.cz:2119/jobmanager-pbs-euasia

- CE: cladonia.geranium.um.edu.my:2119/jobmanager-pbs-euasia

- CE: f-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia

- CE: glite-ce.grid.itb.ac.id:2119/jobmanager-lcgpbs-euasia

- CE: grid012.ct.infn.it:2119/jobmanager-lcglsf-euasia

- CE: haitham.biruni.upm.my:2119/jobmanager-pbs-euasia

- CE: infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-euasia

- CE: infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-short

- CE: lcg00125.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia

- CE: liknayan.pscigrid.gov.ph:2119/jobmanager-lcgpbs-euasia

- CE: lion.lsr.nectec.or.th:2119/jobmanager-lcgpbs-euasia

- CE: quanta.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia

- CE: razi.biruni.upm.my:2119/jobmanager-pbs-euasia

- CE: w-ce01.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia

- CE: w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia

}}}


c. 查出 Euasia CE 上的 RunningJobs 和 FreeCPUs 數目,
{{{
lcg-info --vo euasia --list-ce --attrs 'RunningJobs,FreeCPUs'

- RunningJobs 0
- FreeCPUs 2

- CE: ce.utmgrid.utm.my:2119/jobmanager-lcgpbs-euasia
- RunningJobs 1
- FreeCPUs 7

- CE: ce01.knowledgegrid.net.my:2119/jobmanager-pbs-euasia
- RunningJobs 0
- FreeCPUs 46

- CE: ce1.egee.cesnet.cz:2119/jobmanager-pbs-euasia
- RunningJobs 2
- FreeCPUs 53

- CE: ce2.egee.cesnet.cz:2119/jobmanager-pbs-euasia
- RunningJobs 2
- FreeCPUs 57

- CE: cladonia.geranium.um.edu.my:2119/jobmanager-pbs-euasia
- RunningJobs 0
- FreeCPUs 22

- CE: f-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 558

- CE: glite-ce.grid.itb.ac.id:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 1

- CE: grid012.ct.infn.it:2119/jobmanager-lcglsf-euasia
- RunningJobs 0
- FreeCPUs 0

- CE: haitham.biruni.upm.my:2119/jobmanager-pbs-euasia
- RunningJobs 0
- FreeCPUs 71

- CE: infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-euasia
- RunningJobs 0
- FreeCPUs 20

- CE: infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-short
- RunningJobs 0
- FreeCPUs 20

- CE: lcg00125.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 0

- CE: liknayan.pscigrid.gov.ph:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 48

- CE: lion.lsr.nectec.or.th:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 7

- CE: quanta.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- RunningJobs 8
- FreeCPUs 679

- CE: razi.biruni.upm.my:2119/jobmanager-pbs-euasia
- RunningJobs 9
- FreeCPUs 214

- CE: w-ce01.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 0

- CE: w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- RunningJobs 0
- FreeCPUs 24

}}}

d. 查出 CE 為 w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia 的 OS 為何??

{{{
lcg-info --vo euasia --list-ce --query 'CE= w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia' --attrs 'OS'
- CE: w-ce02.grid.sinica.edu.tw:2119/jobmanager-lcgpbs-euasia
- OS ScientificCERNSLC

}}}


d. 用 lcg-infosites 查 euasia node job 狀況
{{{
[ui01] /home/hkw00/muscle > lcg-infosites --list ce --vo euasia
#CPU Free Total Jobs Running Waiting ComputingElement
----------------------------------------------------------
22 9 0 0 0 infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-short
22 9 0 0 0 infn-ce-01.ct.pi2s2.it:2119/jobmanager-lcglsf-euasia
2 2 3 0 3 glite-ce.grid.itb.ac.id:2119/jobmanager-lcgpbs-euasia
0 0 4 0 4 grid012.ct.infn.it:2119/jobmanager-lcglsf-euasia
48 48 0 0 0 ce01.knowledgegrid.net.my:2119/jobmanager-pbs-euasia
24 11 13 13 0 cladonia.geranium.um.edu.my:2119/jobmanager-pbs-euasia
72 2 632 65 567 haitham.biruni.upm.my:2119/jobmanager-pbs-euasia
48 18 1012 25 987 khaldun.biruni.upm.my:2119/jobmanager-pbs-euasia
224 96 126 124 2 razi.biruni.upm.my:2119/jobmanager-pbs-euasia
48 48 0 0 0 ce.utmgrid.utm.my:2119/jobmanager-lcgpbs-euasia
48 46 12 0 12 liknayan.pscigrid.gov.ph:2119/jobmanager-lcgpbs-euasia
72 8 4 2 2 ce2.egee.cesnet.cz:2119/jobmanager-pbs-euasia
72 8 4 2 2 ce1.egee.cesnet.cz:2119/jobmanager-pbs-euasia
96 0 0 0 444444 w-ce04.grid.sinica.edu.tw:8443/cream-pbs-euasia
1104 688 8 5 3 quanta.grid.sinica.edu.tw:2119/jobmanager-pbs-euasia
2 1 1 0 1 ce.haii.or.th:2119/jobmanager-lcgpbs-euasia
16 16 6 0 6 lion.lsr.nectec.or.th:2119/jobmanager-lcgpbs-euasia

}}}

f. 查 attr
lcg-info --list-attr | grep -i mem
lcg-info --list-ce --vo euasia --attr VMEMORY, MEMORY
lcg-infosites --list ce --vo euasia

Job description language

JDL (Job Description Language )
JDL 描述我們將要執行一個 Job 的開發環境, 包括定義這
1. 工作的輸入, 輸出檔. (Input/OutputSandbox)
2. 工作執行檔名. (Executable)
3. 工作的需要的 CE 屬性

而 JDL 在 UI 上 剖析後, JDL 會送到 WMS 作 ??


Note:
1. attribute = expression;
. 注意分號後不行有空格及 Tab key
2. 註解有 # 和 double slash (//), 和 /* */


指令介紹:
1. 傳送 Job 指令: glite-wms-job-submit -a -o joblist XXX.jdl
2. 觀察 Job 狀態指令: glite-wms-job-status -i joblist
3. 取得 Job 回傳檔案 :glite-wms-job-output -i joblist --dir argument
. 此處 dir 表示會建立一個 argument 資料夾並將 output 放置此處
. Output 只會被取一次, 再取一次顯示 clear
. 執行過程中, 預設的 output 會儲存於 Work node 上


Example:
1. Define a simple job
{{{
Executable = "/bin/hostname";
StdOutput = "std.out";
StdError = "std.err";
}}}

Executable 說明要執行的命令是一個執行檔.
StdOutput 是指定要輸出的檔名.
StdError 是輸出錯誤的檔名.

---------------------------------------------------------------------
2. 加入 InputSandBox 及 OutputSandBox
{{{
Executable = "hostname";
StdOutput = "std.out";
StdError = "std.err";
InputSandbox = {"/bin/hostname"};
OutputSandbox = {"std.out", "std.err"};
}}}

InputSandbox 為要夾帶到 CE 執行的檔案, 包括執行檔, 執行需要的輸入檔.
OutputSandbox 為回傳的檔案, 可以是執行後的結果, 此處包括 std.out, std.err 為 CE 上處理的錯
誤輸出. 注意的是要用字串表示輸出.

------------------------------------------------------------------
3. 傳送一個自己寫的執行 Shell 到 CE 上執行
a. 先作能在本機執行的 shell 為 test.sh , 會印出兩個 Input 檔的內容
假設
bash test.sh fileA fileB
{{{
#!/bin/sh
echo "First file:";
cat $1;
echo "Second file:";
cat $2;
}}}

fileA
{{{
fileA is hi
}}}

fileB
{{{
fileB is hello
}}}

[ui01] /home/dhc00/PracticeGlite/test100527/2 > bash test.sh fileA fileB
First file:
fileA is hi
Second file:
fileB is hello

b. 編寫一個 test.jdl, 其實將本機的 test.sh 和要執行的檔案描述成 JDL 格式
{{{
Executable = "test.sh";
Arguments = "fileA fileB";
StdOutput = "std.out";
StdError = "std.err";
InputSandbox = {"test.sh", "fileA", "fileB"};
OutputSandbox = {"std.out", "std.err"};
}}}

---------------------------------------------------------------------
4. 說明 Job 需要的執行環境說明 Requirements

範例:送一個 Job 到 w-ce04, 使用 requirements 條件敘述

hostnameForRequirement.jdl
{{{
Executable = "hostname";
InputSandbox = {"/bin/hostname"};
StdOutput = "std.out";
StdError = "std.err";
OutputSandbox = {"std.out", "std.err"};

Requirements =
other.GlueCeUniqueID == "w-ce04.grid.sinica.edu.tw:8443/cream-pbs-euasia";

}}}

說明 Requirements:
1. 可以使用且 (&&) 與或 (||) 連結不同條件, 且最後是分號.
2. 每個條件會是 GLUE schme 的一個資訊.
3. 條件的比較子為 >, >=, ==, <, <=
4. 還有兩種比較句為不同字串處理:
I. Member : 找出哪個 CE 有什麼 GLUE 條件
軟體: Member("MPI-CH", other.GlueHostApplicationSotwareRunTimeEnvironment);
II. 使用 Reqular expression
* RegExp(Search pattern, CLUESchme);
* 如: 找出為 cern.ch 的 CE, RegExp("cern.ch", other.GlueCEUniqueID);

2010年5月26日 星期三

Package 討論

///////////////////////////////////
Package: Classpath 是設定你有 jar 會 lib 的地方,
而被包的或要使用物件就要使用 package dir 表示此物件在的路徑, 而這些要放在 dir 中.
所以會有兩個路徑, 一個表示 classpath, 一個表示 Package path


至於要使用的 class 要用 import package + class 名稱, 在編譯及執行時要加入 classpath(cp),
如: 有個 PackageTest.java 會用到 andy.Hello <-- 為 package path, 而 andy.Hello 在 /home/Andy/Desktop/working/JavaAll/JavaPractice/row <-- 為 class path


簡言之: classpath 指向 jar 或 package path 的地方, 而 package path 提供其它程式物件使用.


javac -cp /home/Andy/Desktop/working/JavaAll/JavaPractice/row (classPath) PackageTest.java
java -cp /home/Andy/Desktop/working/JavaAll/JavaPractice/row:./ PackageTest

Note: 此時 PackageTest.java 可放在任何地方使用



/////////////////////////////////////
另一種是用 Jar 檔:
將 package path 裝成 jar 檔, 使用時
java -cp hahaJar.jar haha.in.deep.hole.PitFiend

//////////////////////////////////////
在 Eclipse 要用時
0. 建 lib 目錄
1. include jar file
2. add path
(此時會在此 project 目錄下, 建 .classpath)



////////////////////////////////////////////
Noet: Packecage 太多時, 會有 conflict, 此時也需要移除一些 package, 而其中一例是 tomcat
中有許多 xml-apis.jar xercesImpl.jar xalan.jar, 要留下一組可用的 jar ok



//////////////////////////////////////////////
狀況實戰:
//////////////////////////////////////////////
1. 若你有個 jar 檔是個很有結構的程式, 裡面有 source 和 class, 但你卻想知道某個 class 是否能運作, 你要如何加入你的 java 去 Check 或使用它呢?

2. 同上, 請用將你的 java 加入此 package 為情況要如何作? 如何邊譯? 如何執行?

3. 同上, 若有個 jar 檔, 你想修改某個 java 檔案, 請問你要如何修改? 如何編譯呢?
(注意此時修改的 java 可能還會要更多的 lib, 還要注意設定目前 java 使用的物件路徑)


回答:
1. 此處用 datawarehouse.jar 這個說明, 首先你解 jar 後, 會一個很有結構的目錄, 其路徑大約是 net/asgc/gap/portal/util 這就是 package path, 而我們目標是想使用確定 util 中的VQSClientProperties.java/VQSClientProperties.class 的方法 Signature, 因此我們寫個 FooTest.java 來完成它, 在 FooTest.java 中我們可以不用定義 FooTest.java的Package, 單純的只是像個使用物件
其程式碼如下:
{{{
import java.lang.reflect.Method;
import net.asgc.gap.portal.util.VQSClientProperties;
public class FooTest {
public static void main(String[] args) {
try{
// VQSClientProperties.load(new Properties());
VQSClientProperties t;
System.out.println("GapUserInit: Look Client Property");
for (Method m : VQSClientProperties.class.getMethods() )
System.out.println("VQSClientProperties>>" + m);

}catch(Exception e){
e.printStackTrace();
}
}
}

}}}
此處有幾個重點:
1.要用 net.asgc.gap.portal.util.VQSClientProperties 為 Package 全名

在編譯時用:
javac -classpath /tmp/code/datawarehouse FooTest.java
注意: /tmp/code/datawarehouse 是Class path, 而 net.asgc.gap.portal.util 是 package path, 兩者不相同要會分別.

在執行時:
java -classpath .:/tmp/code/datawarehouse FooTest
顯而易見: 執行表是要連結的 Class.


2. 承上, 只要將 FooTest.java 加入你目前用的 Package, 在編譯與執行時指定 classPath 可以, 過程如下:
{{{
package net.asgc.gap.portal.util;

//import java.util.*;
import java.lang.reflect.Method;
import net.asgc.gap.portal.util.VQSClientProperties;
public class FooTest {
public static void main(String[] args) {
....
}
}

}}}
編譯: 指定 classpath
javac -classpath /tmp/code/datawarehouse FooTest.java

執行: 指定 classpath 並說明你要 run package
java -classpath /tmp/code/datawarehouse net.asgc.gap.portal.util.FooTest


3. 因為一個 java 可能會要使用許多的 lib, 所以此時 classpath 要結何其它的 lib
當成編譯與執行, 一旦少個 object code 都會無法運作. 因此我們會使用 script 去Link所有的路徑, 並作編譯, 甚至要 jar 起來.
I
largeCompiler.sh
{{{
#!/bin/sh
CP=/tmp/code/datawarehouse

for path in $(find /opt/apache-tomcat-5.5.27/webapps/gcp/WEB-INF/lib/ -name *.jar);
do
CP="$CP:$path";
done
javac -classpath $CP GapUserInit.java
}}}
而 /opt/apache-tomcat-5.5.27/webapps/gcp/WEB-INF/lib/ 是我們的函式庫, 雖然不一定都會得到, 但多聯結, 不會有問題.

II. 在 datawarehouse 最上層目錄可把所有內容.
jar cf test.jar -C datawarehouse .

2010年5月25日 星期二

XML Xpath

XPath


book.xml
{{{


Snow Crash
Neal Stephenson
Spectra
0553380958
14.95



Burning Tower
Larry Niven
Jerry Pournelle
Pocket
0743416910
5.99



Zodiac
Neal Stephenson
Spectra
0553573862
7.50





}}}



XPathExample.java
{{{

import java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;

public class XPathExample {

public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException {

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("Flu.xml");

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr
// = xpath.compile("//book[author='Neal Stephenson']/title/text()");
= xpath.compile("//log/attribute::fileName");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
expr
// = xpath.compile("//book[author='Neal Stephenson']/title/text()");
= xpath.compile("//logTree/attribute::fileName");
result = expr.evaluate(doc, XPathConstants.NODESET);
nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
}

}
}}}



///Reference

http://www.w3schools.com/xpath/xpath_axes.asp

2010年5月22日 星期六

Singleton

1. Singleton的英文意義是獨身,也就是只有一個人,應用在物件導向語言上,通常翻譯作單例:單一個實例(Instance)。Singleton模式可以保證一個類別只有一個實例,並提供一個訪問(visit)這個實例的方法。

2. 寫法:
{{{
public class Runtime {
private static Runtime currentRuntime = new Runtime();

public static Runtime getRuntime() {
return currentRuntime;
}

/** Don't let anyone else instantiate this class */
private Runtime() {}

// 以下略
}

}}}


注意:
1. Java使用 靜態工廠 來取得Runtime物件
2. Runtime的建構式被宣告為private,這樣可以阻止其他人使用建構方法來建立實例



Reference: http://caterpillar.onlyfun.net/Gossip/DesignPattern/SingletonPattern.htm

CLASSPATH Discuss

You can use following content to build a java program.

test.sh
{{{
#!/bin/bash

CP=.

for path in $(find gridportal/projects/gcp/lib/** -name *.jar);
do
CP="$CP:$path"
done

CP="$CP:/usr/local/GVSS-1.0.3/opt/gap/lib/cog-1.4/jce-jdk13-131.jar"

#echo $CP

javac -classpath $CP VQSClientTestBean.java
java -classpath $CP VQSClientTestBean

}}}

2010年5月21日 星期五

Anonymous Class

Explain : Anonymous Class 是為一種方便建立繼承的方法, 也可用在介面上, 它會將名稱隱藏起來 形成 class X Y(IS-A class or implements class), 不用寫 X, 只要 Y ok
其型式為:
X = new Y() {
method....
}

Simple code: AnyClassTest.java
{{{
public class AnyClassTest{
public static void main(String[] args){
//Thread t = new Thread(new TestRun());
//t.start();
Thread t = new Thread(new Runnable(){ // implement runnable
public void run(){
System.out.println("haha");
}
});
t.start();
Point p = new Point(){ // extend point
public void sayHa(){
System.out.println("hahahaha");
}
};
p.sayHa();
}
/*
static class TestRun implements Runnable{
public void run(){
System.out.println("haha");
}
}*/

static class Point {
public void sayHa(){
System.out.println("ha");
}
}
}


}}}

Output:
{{{
[Andy@t-ap188 row]$ java AnyClassTest
hahahaha
haha

}}}

Tomcat log

=== Log Discuss ===
* Tomcat 會有兩種 log: log4j, logging.properties(/opt/apache-tomcat-5.5.27/conf), 而若要看 GAP log 其方式之一是將 .level 設定為 ALL
{{{
....
java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatteri
#open the level you will see the all package information
.level = ALL
....
}}}
Reference:
[http://www.laliluna.de/articles/log4j-tutorial.html log4j_tutorial]
[http://blog.xuite.net/chihho32/blog/9121126 log4j_tutorial_2]
[http://tomcat.apache.org/tomcat-5.5-doc/logging.html Tomcat_log_intro]

2010年5月17日 星期一

XMLRPC-Client

/////////////////////////
1. Write the code
/////////////////////////

XMLRPCClient.java
{{{
import org.apache.xmlrpc.client.*;
import java.util.Vector;
import java.net.URL;
public class XMLRPCClient {

public static void main( String args[] ) throws Exception {

XmlRpcClient client = new XmlRpcClient();
XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
conf.setServerURL(new URL("http://localhost:9999/"));
client.setConfig(conf);
Vector params = new Vector();
params.addElement( new Integer(3) );
params.addElement( new Integer(5) );
Object result = client.execute( "userInfo.sayHello", params );

if ( result != null ){
System.out.println( "Successfully pinged guest account." );
Object[] res = (Object[])result;
for(Object r : res)
System.out.println((Integer)r);
}
}
}

}}}


//////////////////////////////////////////////////
2. compile and executable the code
//////////////////////////////////////////////////
[Andy@t-ap188 row]$ javac -classpath ./lib/xmlrpc-server-3.0.jar:./lib/xmlrpc-client-3.0.jar:./lib/xmlrpc-common-3.0.jar:./lib/commons-httpclient-3.0.1.jar:./lib/commons-codec-1.3.jar:./:./lib/commons-logging.jar:./lib/ws-commons-util-1.0.1.jar:./lib/ws-commons-java5-1.0.1.jar XMLRPCClient.java


[Andy@t-ap188 row]$java -classpath ./lib/xmlrpc-server-3.0.jar:./lib/xmlrpc-client-3.0.jar:./lib/xmlrpc-common-3.0.jar:./lib/commons-httpclient-3.0.1.jar:./lib/commons-codec-1.3.jar:./:./lib/commons-logging.jar:./lib/ws-commons-util-1.0.1.jar:./lib/ws-commons-java5-1.0.1.jar XMLRPCClient
23
25



=== Reference ===
http://now9956.pixnet.net/blog/post/24453088

XMLRPC-server

///////////////////////////////////////////////////////////////
0. Include the jar file
///////////////////////////////////////////////////////////////
commons-httpclient-3.0.1.jar
ws-commons-java5-1.0.1.jar
xmlrpc-common-3.0.jar
commons-codec-1.3.jar
commons-logging.jar
ws-commons-util-1.0.1.jar
xmlrpc-server-3.0.jar
commons-collections-3.1.jar
commons-pool-1.2.jar
commons-dbcp-1.2.1.jar
servlet-api.jar
xmlrpc-client-3.0.jar



///////////////////////////////////////////////////////////////
1. write the xmlRPC Server
///////////////////////////////////////////////////////////////

XMLRPCTest.java
{{{
import java.io.IOException;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.WebServer;

public class XMLRPCTest {


static final int port = 9999;

public static void initXMLRpcServer() {
WebServer webServer = new WebServer(port);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
PropertyHandlerMapping phm = new PropertyHandlerMapping();

try{
phm.addHandler("userInfo",HelloHandlerImpl.class);
xmlRpcServer.setHandlerMapping(phm);
XmlRpcServerConfigImpl serverConfig=(XmlRpcServerConfigImpl)xmlRpcServer
.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
System.out.println("Starting the server....");
webServer.start();
}catch(XmlRpcException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException,XmlRpcException{
initXMLRpcServer();
}

}

}}}



////////////////////////////////////////////////////////////////////
2. Write the remote call handle and Compile the HelloHandler
////////////////////////////////////////////////////////////////////
vim HelloHandlerImpl.java
{{{

import java.util.*;

public class HelloHandlerImpl {

public Object[] sayHello(int x,int y){
Object[] sg=new Object[]{20+x,20+y};
return sg;

}

}

}}}




//////////////////////////////////
3. compiler the Server code
//////////////////////////////////
.
javac -classpath ./lib/xmlrpc-server-3.0.jar:./lib/xmlrpc-client-3.0.jar:./lib/xmlrpc-common-3.0.jar:./lib/commons-httpclient-3.0.1.jar:./lib/commons-codec-1.3.jar:./:./lib/commons-logging.jar:./lib/ws-commons-util-1.0.1.jar:./lib/ws-commons-java5-1.0.1.jar XMLRPCTest.java

.
java -classpath ./lib/xmlrpc-server-3.0.jar:./lib/xmlrpc-client-3.0.jar:./lib/xmlrpc-common-3.0.jar:./lib/commons-httpclient-3.0.1.jar:./lib/commons-codec-1.3.jar:./:./lib/commons-logging.jar:./lib/ws-commons-util-1.0.1.jar:./lib/ws-commons-java5-1.0.1.jar XMLRPCTest

2010年5月12日 星期三

LOGGer

請看
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/LoggingLevel.htm

此外我們可以設定 property 改變顯式的 LEVEL.
預設在 /usr/java/jdk1.6.0_20/jre/lib logging.properties

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
另一種方法是讀取給定的 logger , 在目前目錄下有 LoggingTest.java 和 LoggingTest.properties,
我們會用到將 LogManager 去讀取 Configuration file
LoggingTest.java
{{{
import java.util.logging.*;
import java.io.*;

/** Referece the caterpillar */
public class LoggingTest {
private static Logger logger = Logger.getLogger(LoggingTest.class.getName());
private static final String LOG_PROP = "LoggingTest.properties";

public static void main(String[] args) {
try {
InputStream is = new BufferedInputStream(new FileInputStream(LOG_PROP));
LogManager.getLogManager().readConfiguration(is);
is.close();
}
catch (IOException e) {
logger.warning("Read the logger faile");
System.exit(0);
}



logger.severe("嚴重訊息");
logger.warning("警示訊息");
logger.info("一般訊息");
logger.fine("細微的訊息");
logger.finer("更細微的訊息");
logger.finest("最細微的訊息");


}

}

}}}

LoggingTest.properties
{{{
handlers= java.util.logging.ConsoleHandler
.level= ALL
java.util.logging.ConsoleHandler.level = ALL
}}}


參考:
http://eric1300460.pixnet.net/blog/post/27586127
http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/Logger.html
http://java.sun.com/j2se/1.4.2/docs/api/java/util/logging/LogManager.html

2010年5月2日 星期日

Shell Command Read Sample

* If you like to write a shell like command you sholud following two step:
1. Read the System input
2. Parse the command


// System in method
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String line;

while( true ) {
System.out.println(usage);
line = reader.readLine();
String[] token = line.split("\\s"); // token the string


for (int i = 0; i < token.length; i++) { // parse command line
System.out.println(token[i]);
}


} // end while