วันพฤหัสบดีที่ 20 ธันวาคม พ.ศ. 2550

Basic Config Log4J without properties File

การ Config แบบที่ไม่ใช้ properties File เราจะใช้ Class Properties ในการ Set แทนนน่ะครับ โดยเราจะ Config เหมือน Properties File เลยครับ คือ ถ้าอยู่ทางขวาของ "=" จะเป็น Key ส่วนทางซ้ายเป็น Value ครับ ข้างล่างเป็นตัวอย่างประมาณนี้น่ะครับ

Example
Properties properties = new Properties();
properties.put("log4j.logger.test","DEBUG,test");
properties.put("log4j.appender.test","org.apache.log4j.DailyRollingFileAppender");
properties.put("log4j.appender.test.DatePattern","'.'yyyy_MM_dd");
properties.put("log4j.appender.test.File","C:/TEMP/a.log");
properties.put("log4j.appender.test.layout","org.apache.log4j.PatternLayout");
properties.put("log4j.appender.test.layout.ConversionPattern","[Test] [%d{dd/MM/yyyy HH:mm:ss,SSS}] (%c:%L) - %5p - %m%n");
PropertyConfigurator.configure(properties);

วันพุธที่ 19 ธันวาคม พ.ศ. 2550

ปัญหาที่พบบ่อยสำหรับนักพัฒนา Java Web Application ในประเทศไทยครับ ที่ควรแก้ไข

อันนี้เป็นปัญหาที่ผมเจอกับเพื่อนร่วมงานด้วยกันที่ ควรจะแก้ไขครับ ถ้าคุณทำงานมาเป็นปีแล้วไม่ได้ใช้ หรือว่าไม่ได้ทำก็ควรจะทำนะครับ

Q : ยังมีการใช้ System.out.println อยู่
A : สำหรับเด็กจบใหม่ผมไม่คิดอะไรหรอกครับที่เขาจะใช้เพราะยังไม่รู้ ตอนผมจบใหม่ผมก็เป็น ตอนหลังถึงมาเรียนรู้ว่าไม่ควรจะใช้ System.out.println แล้ว ควรจะใช้ Log4J (พื้นฐานการ Config อ่านได้ที่นี่ครับ) มาใช้ ซึ่งจริงๆ แล้วที่เราใช้ Log4J ก็เพราะว่าเราสามารถที่จะควบคุมพวก ข้อมูลที่ต้องการโชว์ได้ ว่าอยู่ระดับใด(info, debug, warn, fatal) สามารถแยกเกบเป็นไฟลล์ต่างๆ ได้ง่าย ถ้าเราใช้ System.out.println มันจะไม่ได้น่ะครับ (ที่จริงมันก็พอได้โดยเอา Log4J ไปคุมอีกทีแต่ก็ไม่ควรครับ) แล้วก็วิธีใช้ง่ายๆ ก็อย่าไปแยก Log เป็น Class Utitility เลยครับ ควรคุมง่าย แต่ดูยากไม่รู้ว่าอยู่บรรทัดไหน Class ไหนที่ทำงานอยู่ ให้ทำแบบนี้
private Logger log = Logger.getLogger(xxxx.class);
ไว้ที่ Class ที่เราทำงานเลยครับ แล้วก็ใช้ log.xxx(""); เอาจะดีกว่า

Q : ใช้ Google ไม่เป็น
A : ผมคิดว่าแบบนี้ไม่น่าจะมีแล้วนะครับ คือจะหาอะไรก็พิมพ์คำนั้นลงไปเลย (ถ้าไม่รู้ภาษาอังกฤษ ก็พิมพ์ไทยลงไปเลยครับ ผมคิดว่าปัญหาบางอย่างอาจจะหาภาษาไทยได้เลย แต่ถ้าไทยอาจจะต้องพิมพ์เป็นคำๆ แล้วเว้นวรรค ถึงจะหาเจอ) แล้วก็เพิ่มพวกภาษาที่เราใช้ไปด้วยก็จะแคบเข้า เช่น ถ้าเราเขียน Java ตอนจะต้นอะไรก็ติดคำว่า Java ลงไปด้วยก็น่าจะหาเจอนะครับ หรืออย่างถ้าเราใช้ Tomcat Server เราก็พ่วงคำนี้ลงไปด้วย ถ้ามีปัญหาบน Server น่ะครับ น่าจะช่วยให้หาเจอได้ง่ายขึ้นมาก หรือ ถ้าเราอยากรู้ว่า มันคืออะไรก็พิมพ์เลยครับ เช่น JMS คือ แบบนี้ก็หาเจอความหมายที่เป็นภาษาไทยเลยง่ายในการอ่านด้วย

Q : อ่าน Log (SystemOut.log) ไม่เป็น
A : วิธีการอ่านแบบนี้ เราจะต้องมีวิธีการเขียน Log ที่โชว์ให้ดีๆ ด้วยครับ คือพยายาม Log ว่าเราเข้า Class ไหน, Method ไหน ตลอด ค่าไหนเราแค่เช็คของเรา ก็ใช้ Log.debug เอา แล้วให้โชว์ออกมา (ถ้าใช้ Log4J จะช่วยได้เยอะ เพราะเราจะรู้ว่าตอนนี้ทำอยู่บรรทัดไหน Class ไหน, Method ไหน เลยน่ะครับ ขึ้นอยู่กับ Config ของ Log4J) และอีกอย่างพวก Exception น่ะครับ ก็หัดใช้ e.printStackTrace() ไว้ด้วยตอน ดัก try, catch น่ะครับ จะได้รู้ว่าบรรทัดไหน วิธีการไล่พวกนี้ก็ไม่ยากแค่ดูว่า Exception ที่อยู่ใน Package ของเราอยู่ตรงไหนแล้วก็ไปไล่โค้ดไปเรื่อยๆ ก็จะเจอที่ผิดของเราเองน่ะครับ

Q : ไม่ยอมเช็ค Null ไว้
A : อันนี้ผมก็เป็นบ่อยชอบลืม เช็ค Null ทุกครั้ง ที่จะใช้ตัวแปรนั้นน่ะครับ เดี๋ยวจะเกิดปัญหา NullPointerException น่ะครับ พยายามตรวจดูว่าจะ ตัวแปรตัวไหนให้เช็คก่อนที่จะใช้งานตัวแปรตัวนั้น

Q : ไม่รู้จะเขียน Log ให้แสดงตรงไหนบ้าง
A : วิธีการเขียนง่ายๆ นะครับ ก็เข้า Method ไหน Log แสดงว่าเข้า Method นั้น แลวก็แสดงค่าทุกค่าที่ใช้ใน Method นั้น อันนี้แบบง่ายๆ (พวกแสดงค่าต่างๆ ก็ืำเป็น log.debug เอาแล้ว ครอบด้วย if log.isdebugEnable() ไว้ พอเวลาไม่ต้องการให้แสดงก็ไป Config ไว้ที่ Log4J) สำหรับที่สำคัญๆ ที่ควรมีถ้าขี้เกียจ ก็ Log บอกว่าเข้า Method ไหน แล้วก็ค่าที่ลง Database ว่าลงเป็นอะไร แล้วก็ใช้ SQL อะไรครับ จะได้รู้ว่าผิดที่ Database หรือว่าโปรแกรมที่เราเขียน

Q : เขียน Program พวกค่าต่างๆ ไว้ใน Code เลย
A : พวกค่าต่างที่คิดว่าเป็นค่าที่เราต้อง Config ไว้ ควรเอาไปเก็บไว้ใน General Parameter สักที่นึงที่สามารถแก้ไขได้โดยเราไม่ต้องมานั่ง Deploy Application ใหม่ เช่น ใน Database หรือ Properties Files ตัวอย่างค่าที่เราควรไว้ข้างนอก เช่น URL ที่เราต้องติดต่อกับ External System อื่นๆ, ค่าำคงที่ที่เราต้องส่งไปให้กับ External System เป็นต้น

วันศุกร์ที่ 9 พฤศจิกายน พ.ศ. 2550

การเรียก Datasource ของ Websphere จาก Java Application

วิธีการเรียกที่ผมเห็นทำได้ 2 แบบน่ะครับ แต่มีแบบนึงไม่แน่ใจว่าเป็นปัญหาของ Websphere หรือเปล่า
ที่ผมลองลองกับ Websphere 6.0, Websphere 6.1 ครับ ควรจะทำบน RAD นะครับ ถึงจะรันได้
1. เรียกโดยใช้ Library ของ Websphere เลยซึ่งวิธีนี้จะอ้าง JNDI Name ได้ตรงๆ เลยครับ

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere .naming.WsnInitialContextFactory"); // เป็นตัวที่เราใช้ในการเรียก Context ซึ่ง Library จะอยู่ที่ lib ใน RAD น่ะครับ
env.put(Context.PROVIDER_URL, "iiop://localhost:2809/");// IP Address ของ JNDI Name ตัวที่เราเรียก ซึ่งเราสามารถดู Port ได้ที่ Servers --> Application Server แล้วเลือก Server ที่เรามี JDBC อยู่ เสร็จแล้วดู Port (Communications) ว่า BOOTSTRAP_ADDRESS เป็นอันไหนก็ใช้อันนั้นครับ
InitialContext ctx = new InitialContext(env);
DataSource ds = (DataSource) ctx.lookup("jdbc/test");//ชื่อ JNDI Name ที่เราใช้เรียกครับ


2. จะคล้ายวิธีแรกแต่เราใช้ Context มาตรฐานของ Sun เลย (วิธีนี้ผมลองเรียกแล้วมันได้ค่าเป็น NULL น่ะครับ ม่รู้เพราะอะไรเหมือนกัน)

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi .cosnaming.CNCtxFactory"); // เป็นตัวที่เราใช้ในการเรียก Context ซึ่งจะเป็นของ Sun เลย
env.put(Context.PROVIDER_URL, "iiop://localhost:2809/");// IP Address ของ JNDI Name ตัวที่เราเรียก ซึ่งเราสามารถดู Port ได้ที่ Servers --> Application Server แล้วเลือก Server ที่เรามี JDBC อยู่ เสร็จแล้วดู Port (Communications) ว่า BOOTSTRAP_ADDRESS เป็นอันไหนก็ใช้อันนั้นครับ
InitialContext ctx = new InitialContext(env);
DataSource ds = (DataSource) ctx.lookup("cell/nodes/Node01/servers/server1/jdbc/test"); //ชื่อที่ใช้เรียกจะต่างกับเรียกโดยใช้ของ Websphere โดยเราจะต้องทำการใส่ cell/nodes/<ชื่อ Node>/servers/<ชื่อ Server>/

ปล.
1. ต้องใช้ JRE On Websphere กับ Websphere Runtime ด้วยน่ะครับ
2. ถ้าไปเรียกที่ Server อาจจะต้องดูว่า Server เปิดให้เรียกใช้หรือเปล่าน่ะครับ แต่ถ้าเทสเครื่องตัวเองคืดว่าไม่น่าจะมีปัญหาอะไรครับ

Reference
http://www.webservertalk.com/archive80-2006-4-1481822.html

วิธีการดึงข้อมูลจาก XML อย่างง่ายโดยใช้ Dom4J

เวบของ DOM4J (Entry วิธีการสร้าง XML อย่างง่ายโดยใช้ Dom4J)
จากข้อมูลข้างล่าง เราจะมาแกะ ข้อมูลออกกันว่าจะแกะด้อย่างไรบ้างนะครับ
<?xml version="1.0" encoding="UTF-8">
<Header>
<Parameter1></Parameter1>
<Parameter2>123456</Parameter2>
<Parameter3 total="3"/>
<Parameter4>
<SubParameter>Sub</SubParameter>
</Parameter4>
</Header>

ซึ่งในที่นี้จะสอนวิธีแกะออกมาโดยใช้ DOM4J นะครับ
Document document = DocumentHelper.parseText(xmlResult);//Parser String ที่เป็น XML ให้เป็น Document เพื่อที่เราจะได้ดึงข้อมูลได้
Element rootElement = document.getRootElement();// get Element ออกมาเพื่อจะดึงค่าข้างในมันออกมา
System.out.println("Parameter2 : " + rootElement.elementText("Parameter2")); //เป็นการดึงค่าที่อยู่ใน Parameter2 ออกมาแสดง (ดึงได้เฉพาะ String ถ้าข้างในเป็น Element จะดึงออกมาไม่ได้)
System.out.println("Parameter3 : " + rootElement.element("Parameter3").attributeValue("total")); //ดึงค่าของ total ที่อยู่ใน Parameter3
Element elementParameter4 = rootElement.element("Parameter4"); //ดึง Element ที่อยู่ใน Parameter4
System.out.println("Parameter4 : " + elementParameter4.elementText("SubParameter")); //ดึงค่าเหมือนก่อนหน้านี้ทุกประการ

วันพฤหัสบดีที่ 25 ตุลาคม พ.ศ. 2550

วิธีแก้ปัญหาเวลา Deploy EJB ไม่ได้ใน RAD 6.0

โดยปกติเราจะคลิกขวาแล้ว Deploy EJB เพื่อจะให้มัน Generate Stub เพื่อใช้ในการเรียก EJB นั้นๆ ในบางทีกรณีที่ทำหลายคนแล้ว Sync มาเราจะไม่สามารถ Deploy EJB ได้ครับ เลยต้องใช้วิธีทำจาก Command Prompt แทนโดย ไปที Directory ที่เรา install RAD 6.0 ไว้ แล้วจะอยู่ที่ IBM\Rational\SDP\6.0\runtimes\base_v6\bin\ แล้ว File ชื่อ ejbDeploy.bat

โดยใช้คำสั่งดังนี้
ejbdeploy inputEarFile Directory OutEar
Example
ejbDeploy test.ear c:\Temp testTemp.ear
พอทำเสร็จมันก็จะ Generate Folder Workspace ไว้ให้แล้วเราก็ Copy File ใน EJB Project มาทับของเดิมที่มีอยู่แล้ว Generate ใหม่ก็จะทำงานได้แล้วครับ

วันพุธที่ 17 ตุลาคม พ.ศ. 2550

วิธีการสร้าง XML อย่างง่ายโดยใช้ Dom4J

เวบของ DOM4J


Document vDocument = DocumentHelper.createDocument(); //ไว้สำหรับสร้าง Document XML
Element rootElement = vDocument.addElement("Header"); // สร้างส่วนหัวของ XML
rootElement.addElement("Parameter1"); // สร้าง Element ข้างในแบบไม่มีค่าใน Element
rootElement.addElement("Parameter2").addText("123456"); //สร้าง Element ข้างในแบบมีค่าใน Elementซึ่งค่าห้ามเป็น NULL
rootElement.addElement("Parameter3").addAttribute("total","3"); // สร้าง Element แบบมี Attribute
Element subElement = rootElement.addElement("Parameter4");
//สร้าง Sub Element ข้างใน
subElement.addElement("SubParameter").addText("Sub");

จะได้ข้อมูล ตามข้างล่าง

<?xml version="1.0" encoding="UTF-8">
<Header>
<Parameter1></Parameter1>
<Parameter2>123456</Parameter2>
<Parameter3 total="3"/>
<Parameter4>
<SubParameter>Sub</SubParameter>
</Parameter4>
</Header>

วันอังคารที่ 16 ตุลาคม พ.ศ. 2550

การ Set Connection Timeout ใน Web Service

การ Set Timeout เราสามารถที่จะ Config ไดสองที่ใน Axis คือ
org.apache.axis.client.Stub กับ org.apache.axis.client.Call เป็น SetTimeout
ถ้าเราไปใช้ Call RPC ตรงๆ จะไม่มี Config นะครับ ต้องทำแบบนี้แทน ถึงจะได้น่ะครับ

org.apache.axis.client.Call call = new org.apache.axis.client.Call(service);
call.setTimeout(timeOutWS);//Time Out Web Service เวลาเป็น หน่วย ms ครับ


สำหรับการ Set TimeOut ใน Websphere 6.xxx นั้น เราจะทำที่ Class ที่ลงท้ายด้วย stub แล้วไป Config ที่ Method Invoke (Class com.ibm.ws.webservices.engine.MessageContext) ครับ มันจะมี .setTimeOut (บน Rad 6.0 มันเป็นการ Set Read TimeOut น่ะครับ ต้องไปให้ Eclipse Generate แทน แล้วไป Config ที่ call แทนครับ ตามข้างบน)ได้เลยครับ ซึง Set เป็น ms ครับ แต่ให้จำไว้ว่า ถ้าเราทำการ Rebuild ใหม่ ข้อมูลพวกนี้จะหายเราต้องกลัมา Config ใหม่

วันพฤหัสบดีที่ 4 ตุลาคม พ.ศ. 2550

การ Set Connection Timeout ใน Socket

มันจะมีสองตัวให้ Config น่ะครับ เป็น soTimeout ของ Socket อันนี้คือระยะเวลา Ideal ของ Socket ถ้าเกินก็จะ Timeout ออกไปต้อง Connect ใหม่ กับ ตอน socket.connect (InetSocketAddress, Timeout) อันนี้จะเป็น Timeout ของการรอตอบกลับค่าจาก External System ที่เราไปเรียก ซึ่ง ตามตัวอย่างข้างล่าง

Example
InetSocketAddress socketAddr = new InetSocketAddress(url,port);
Socket socket = new Socket();
socket.connect(socketAddr,readTimeout);
socket.setSoTimeout(idealTimeout);

วันอังคารที่ 2 ตุลาคม พ.ศ. 2550

ปัญหา ORA-12705 บน Websphere

ปัญหาของการ Config Datasource แล้วไม่สามารถ Test Connection ได้ แล้วเกิด Error ORA-12705 ขึ้นน่ะครับ เกิดจากเรา Config Language ของเครื่องไม่ตรงกับ NLS_LANG ของ Oracle Client ของเครื่องเราเอง พอ Config เสร็จก็ Test Connection ใหม่ก็จะใช้งานได้แล้วครับ

วิธี Config Language ของเครื่อง
1. ไปที่ Control Panel --> Regional and Language Options
2. ที่ Tab Regional Options แล้วเลือกทั้งสองอันเป็นภาษาของเราเอง (Thai หรือ English ก็ได้) บางทีมันเป็นภาษา เช่น tar เป็นต้น Oracle ไม่รู้จักเลย Connect ไม่ได้


Reference
http://www.dba-oracle.com/t_ora_12705_resolution.htm

วันพุธที่ 26 กันยายน พ.ศ. 2550

วิธีเรียก Store Procedure จาก Java

วิธีการเรียกเราจะใช้ CallableStatement จากการเรียก Connection.prepareCall(คำสั่ง Store Procedure)
ซึ่งคำสั่งที่ใช้เรียกเป็นตามนี้ครับ
1. ถ้าไม่มี Return ค่า { call PackageName.FunctionName(?,?,?) }
2. ถ้ามี Return ค่า ใช้ {? = call PackageName.FunctionName(?) }

แล้ว Set ค่า Parameter ตามปกติได้เลยครับ
ถ้ามีการ Return เช่น cursor ให้ Set ค่าตัวแรกเป็น
stmt.registerOutParameter(1, OracleTypes.CURSOR);
ครับ ถ้าเป็นตัวเลขอไรก็ลองเซ็ตดูได้เป็นตัว 1,2,3 อ่ะครับ

วันพฤหัสบดีที่ 13 กันยายน พ.ศ. 2550

วิธีการเขียนข้อมูลเรียก LDAP

สำหรับคนที่ไม่รู้ว่า LDAP คืออะไร สามารถอ่านได้ที่นี่
1. ให้ใช้วิธีเรียกจากบน UNIX ด้วยคำสั่ง

ldapsearch -D cn=[username]
-w [password] -h [ip address] -p [port] -s sub -b [service],o=[organization],c=[country]
'objectClass=*'

Username = ชื่อสำหรับทำการเข้า LDAP
Password = Password สำหรับเข้า LDAP
IP Address = IP สำหรับเข้า LDAP
Port = Port ของ LDAP
Service = ที่เราจะเข้าไปดูซึ่งวิธีเข้าไปดูนั้นจะเรียงจากชั้นในสุดไปถึงชั้นนอกสุด
Organization = Config LDAP
Country = Config LDAP

Example
ldapsearch -D cn=sample -w sample1 -h xxx.xxx.xxx.xxx -p xxx -s sub -b taoService=prepaid,serviceName=subProfile,msisdn=xxxxxxxxx, domainName=msisdn, o=xxx,c=TH 'objectClass=*'

ภาพโครงสร้างคร่าวๆ ของ LDAP

2. ถ้าเรียกแล้วข้อมูลขึ้นดังตัวอย่าง โดยที่ไม่มี Error ใดๆ ถือว่าเราสามารถที่จะเรียกได้

dn: msisdn=66xxxxxxxxx,domainName=msisdn,O=xxx,C=TH
msisdn: 66xxxxxxxxx
objectClass: subscriber
dn: serviceName=subProfile,msisdn=66xxxxxxxxx, domainName=msisdn, O=xxx ,C=TH
serviceName: subProfile
objectClass: subProfile
spImsi: 6223904495254321
spIccid: 00000000000000000000
spPricePlan:
spProvDate: 04012002
spAccountType: POS
spSubType:
spAccountCateg:
spSubStatus: A
spLanguage: english
spSKSegment:
spSKMobileType:
spRBTService: FALSE
spSupService: 000000000000000000000000

3. วิธีการเรียกด้วยจาวา จะทำดังนี้


Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://IP:PORT/o=organization,c=country");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=username,o=organization,c=country");
env.put(Context.SECURITY_CREDENTIALS, password);
InitialDirContext initNamingContext = new InitialDirContext(env);
Attributes attrs = initNamingContext.getAttributes(service);
attrs.get(ชื่อที่ต้องการจะดึงขึ้นมา).get());
ชื่อที่ต้องการจะดึงขึ้นมานั้นจะเป็นคล้ายๆ แบบที่ 2 เช่น spSubType เป็นต้น


ใช้สำหรับ Config Timeout ให้กับ LDAP โดย put com.sun.jndi.ldap.connect.timeout ลงไปด้วย
เช่น env.put("com.sun.jndi.ldap.connect.timeout", "1000");
และสำหรับ Config Read Timeout โอยเพิ่ม put com.sun.jndi.ldap.read.timeout

การ ฺBasic Config Object Pool Manager สำหรับ Websphere 6.0x

เป็นการ Config ให้เราใช้ Object Pool โดยใช้ความสามารถของ Websphere ในการจัดการ Pool ซึ่งถ้าเราไม่ใช้ของ Websphere สามารถที่จะใช้ Common Pool ได้ มีวิธีใช้ดังนี้ครับ
1. เราจะต้องไป Config Object Pool ใน Admin Console ก่อนโดยจะอยู่ที่ Resources --> Object pool managers
2. New จะขึ้นดีงรูป

Name ตั้งชื่อ Object Pool ของเรา
JNDI Name ตั้งชื่อ JNDI ไว้สำหรับเราเรียกใช้งาน
3. หลังจากเสร็จแล้ว Save ข้อมูล
4. เปิดการใช้งานโดยไป Enable ที่ Application Server โดยจะอยู่ที่
4.1 Servers --> Application Servers --> แล้วก็เลือก Server ของเรา
4.2 ไปดูที่ Container Services (อยู่ตรงส่วน Container Settings) --> Object pool service
4.3 แล้ว ติ็กเลือก Enable service at server startup
4.4 หลังจา้กนั้นกด apply แล้วก็ restart server เป็นอันใช้งานได้
5. วิธีเรียกใช้งาน (ก่อนจะเรียกใช้งานทั้งจาก Web หรือ EJB จะต้องเพิ่ม Reference Resource ก่อนไม่อย่างนั้นจะไม่สามารถเรียกใช้งานได้)

InitialContext ic = new InitialContext();
ObjectPoolManager opm = (ObjectPoolManager)ic.lookup("java:comp/env/pool/test");
arrayListPool = opm.getPool(ArrayList.class); //โยน Object ที่เราต้องการลงไป

arrayListPool.returnObject(obj); // หลังจากใช้เสร็จต้อง Return เสมอไม่งั้นมันจะค้างเป็น Garbage ในระบบ

*ควรจะ Config 1 Pool/1 Object จะได้ไม่มีปัญหา

ปัญหาที่พบบ่อยบน Rad 6.0

อันนี้ผมรวบรวมปัญหาที่ผมพบบ่อยพร้อมวิธีแก้นะครับ (หลังจาก Update Patch หมดแล้ว)

Q : พอสั่ง Run server แล้วดันกลายเป็นสั่งให้ Publish แล้วทำให้ Start Server ไม่ได้
A : ให้ทำการปิดเปิด Rad 6.0 ใหม่ ถ้ายังไม่หายอีกให้ Restart เครื่องซึ่งน่าจะหายหมด

Q : อยู่ดีๆ Config ของ Workspace หายไป เช่น Classpath ของ Ear เรา หรือว่าอยู่ดีๆ Application เราก็ Error ทั้งๆ ทีไม่ได้ทำอะไร
A : ให้ Config ใหม่ครับ ก็จะทำงานได้ หรือ Restart อีกครั้งนึงหลังจากปิดไปแล้ว

Q : ปัญหา Generate Webservice ไม่ได้
A : บางทีเราอาจจะ Generate บ่อยเลยไม่สามารถ Generate ได้ให้ไปสร้าง Project ใหม่พื่อ Generate จะสามารถ Generate ได้ครับ (ถ้าจะให้ดีสร้าง Workspace ใหม่เลย)

Q : ทำไมบางทีเรา Restart Server แล้วมันค้างที่ Starting ตลอดเลย
A : แก้โดยให้ Stop Server แล้วเอา Application ที่อยู่ใน Server ออกให้หมดแล้ว Start อีกทีก็น่าจะได้ แล้วส่ง Publish ก่อนแล้วค่อยเอา Application ไปลงที่ Server อีกทีก็จะใช้งานได้

Q : ทำไม Generate Web Service Client แล้วไปเรียกคนอื่นไม่ได้
A : Rad 6.0 มันใช้ Mechanism ในการไปเรียกเป็นของ IBM เองซึ่งมันเก่าอ่ะ ทำให้ไปเรียกไม่ได้ แล้วต้องเรียกผ่าน Server ด้วยเรียกผ่าน Application ไม่ได้ แล้วถ้าให้มันเป็น Axis มันก็เก่าไป เรียกคนอื่นไม่ได้ (Rad 7.0 ก็เป็นครับ) สามารถดูได้ที่ Entry นี้

Q : Config SSL แล้วไม่สามารถที่จะ Start Server ได้
A : ให้ Config เครื่องเป้นปี ค.ศ. ก็จะหายครับ (เกิดจาก Certification หมดอายุนั่นเอง มันมอง พ.ศ. เป็น ค.ศ.)

Q : ปัญหาไม่สามารถเปิด File JSP ได้
A : ปิด RAD 6.0 แล้วเปิดใหม่ก็จะหาย

Q : อยู่ดี ๆ RAD 6.0 ก็ปิดตัวเอง
A : แสดงว่า Ram ของเครื่องน้อยเกินไปให้เพิ่ม ปัญหานี้ก็จะหายครับ

Q : พอ Start Server แล้วมองไม่เห็น Class ใน Java Application
A : ให้ทำการ Set Java Dependencies ที่ Properties ของ Project นั้นๆ (จำเป็นจะต้อง Add ลงใน application.xml ใน Ear Project ก่อนด้วย)

Q : เวลาสร้าง Server ใหม่แล้วเรียก Datasource จะมองไม่เห็น Table
A : ปัญหานี้เกิดจากว่าเราสร้าง Server ใหม่แล้ว ตัวที่เรา Config (รวมทั้ง Datasource) ยังจำที่เรา Config ไว้ที่ Server เก่าอยู่ให้ลบทิ้งแล้ว Config ใหม่ก็จะหายครับ

Q : ทำไมเวลเราเรียก Application แล้วมองไม่เห็น Class จากทางฝั่ง Web (เรียกจาก EJB)
A : ปัญหาเกิดจากเอาไม่ได้กำหนดที่ Deployment Description บน Ear Project ให้เป็น Application น่ะครับ โดยทำตามนี้
  1. ไปที่ Tab Deployment (application.xml ใน Ear Project)
  2. แล้วดูที่ Application (อยู่ล่างสุด) ให้ดูที่ WAR classloader policy ว่าเป็น APPLICATION หรือยัง ถ้ายังทำให้เป็นแล้ว Restart Application ใหม่ก็จะเห็นครับ
Q : ทำไมตอนแรกเรียก EJB ได้ แล้วพอแก้ไขอะไรใหม่ กลับเรียกไม่ได้
A : วิธีแก้มีดังนี้ครับ
  1. ดู Error Log ก่อนว่ามันขึ้นมาเป็น JNDI Name Not Found หรือเปล่า ถ้าใช่แก้โดยได้ตรวจสอบ Reference ใน Web.xml ว่าไปเรียก EJB ถูกอันหรือเปล่า (ตรวจสอบทั้ง Web.xml และ ejb-jar.xml ว่าไปถูกตัวกันจริงหรือเปล่า) อ่านเพิ่มเติม ลิงค์นี้
  2. ถ้าไม่ได้ขึ้นแบบข้างบนให้แก้โดย Deploy EJB ใหม่โดยการคลิกขวาที่ EJB Project แล้วเลือก Deploy ครับ มันจะ Generate ตัว Stub ใหม่ แล้วจะใช้งานได้ กรณี่ที่ Deploy EJB ไม่ได้ให้ทำตาม ลิงค์นี้ ครับ
  3. ถ้ายังไม่ได้อีกลอง Clean Project ทั้งหมดที่ใช้แล้ว Build ใหม่ดูน่าจะหายครับ
Q : File Config (.xml เช่น web.xml) พอแก้ไขแล้วทำไมยังเป็น Config แบบเดิมอยู่
A : พวก File เหล่านี้ ถ้าเราแก้ไขแล้ว เราจะต้องทำการ Restart Application เสมอ เพราะ Rad 6.0 จะไม่ Restart ให้ครับ ต้องมา Restart เอง (ในบางครั้ง อาจจะต้องสั่ง Publish Server ใหม่ด้วยถึงจะเป็น Config แบบใหม่)

วันอังคารที่ 11 กันยายน พ.ศ. 2550

ปัญหาการรับค่าจาก HttpURLConnection

การรับค่าจาก HttpURLConnection โดยปกติผมจะใช้วิธีดูจาก .available

ตัวอย่างที่ผมเขียนเรียกปกติ

String vXMLStr = request.getParameter("data");
OutputStream vOs = null;
OutputStreamWriter vOsw = null;
URL vUrl = new URL(request.getParameter("url"));
HttpURLConnection vHttpConn = (HttpURLConnection) vUrl.openConnection();

vHttpConn.setUseCaches(false);
vHttpConn.setRequestMethod("POST");
vHttpConn.setRequestProperty("Content-Type", "application/x-www-urlencoded");
vHttpConn.setRequestProperty("Content-Length", Integer.toString(vXMLStr.length()));
vHttpConn.setDoInput(true);
vHttpConn.setDoOutput(true);
vHttpConn.connect();

vOs = vHttpConn.getOutputStream();
vOsw = new OutputStreamWriter(vOs);
vOsw.write(vXMLStr);
vOsw.flush();
vOsw.close();
vOsw = null;
vOs = null;

// get response
InputStream vIs = null;
vIs = vHttpConn.getInputStream();
DataInputStream din = new DataInputStream(vIs);
StringBuffer buffer = new StringBuffer();
String b = "";
while(din.available() > 0) {
buffer.append(b);
}
vIs.close();

System.out.println("Result : " + buffer.toString());

ซึ่งดูจากตัวอย่างจะเห็นว่าผมใช้ din.available() > 0 ซึ่งบางทีไปเรียกแล้วจะรับค่าไม่ได้ จำเป็นต้องเปลี่ยนเป็นวิธีอื่น เช่น ที่ผมรับไม่ได้ผมแก้เป็น (b = din.readLine()) != null ตัวนี้แทนก็จะทำงานได้ครับ สามารถรับค่าได้ครับ

วันพุธที่ 5 กันยายน พ.ศ. 2550

Config Rad6.0 ให้สามารใช้ JDK มากกว่า 1.5 ได้

คำเตือน
1. เมื่อทำแล้วอาจจะทำให้ Java บางไฟลล์ ต้องทำการแก้ไข หรืออาจจะทำให้เรา Generate EJB ไม่ได้ (อันนี้ผมเป็นเลยไม่แน่ใจว่าเครื่องอื่นเป็นหรือเปล่าน่ะครับ)
2. เราไม่สามารถที่จะเปลี่ยนที่ Preference --> Java --> Compiler ในส่วนของ Compliance and Classfiles ให้เป็น Java เวอร์ชันมากกว่า 1.4 ได้ครับ อาจจะทำให้มีปัญหาอย่างอื่นตามมาแนะนำให้ไปใช้ Rad7.0 เลยครับ

วิธีทำดังนี้
1. ให้ทำการเลือก Window --> Preference
2. ไปที่ Java แล้วคลิกที่ Installed JRE
3. ทำการ Add JRE เวอร์ชันที่เราต้องการลงไป เช่น C:\Program Files\Java\jre1.5.0_06 เป็นต้น
4. แล้วเราก็ทำการแก้ทีละ Project ให้ใช้ JRE ตัวที่เราตั้งใหม่นี้
5. โดยการคลิกขวาที่ Project แล้วเลือก Properties ที่ Java Build Path
ุ6. เลือกที่ Tab Libraries
7. เลือก JRE System Library แล้วคลิด Edit
8. ให้เลือก Alternate JRE แล้วก็เลือก JRE ที่เราทำการ Add ไปใหม่ ก็จะใช้งานได้แล้วครับ

Set Connection Timeout ใน HTTPURLConnection

สำหรับ JDK เวอร์ชั่นต่ำกว่า 1.4 จะไม่ให้ Config ค่านี้ครับ เราจำเป็นจะต้องไปใช้อย่างอื่นแทน เช่น HTTPClient
แต่สำหรับ เวอร์ชั่น 1.5 ขึ้นไปจะมีให้ใช้แล้วครับ เป็น .setConnecionTimeOut น่ะครับ

วันอังคารที่ 21 สิงหาคม พ.ศ. 2550

Basic Config For JMeter

มาอธิบายกันก่อนครับ JMeter คืออะไร
- JMeter คือ Java Application ที่ไว้สำหรับ Load Test Application ของเรา (ทำได้หลายอย่างไม่ว่าจะเ็ป็น JDBC, Web หรือ Web Service เป็นต้น)

วิธีการใช้งาน (แบบ GUI)
1. ก็ Run JMeter ขึ้นมา โดยการไปที่คลาย Zip JMeter แล้วไปที่ bin แล้วสั่งรัน jmeter ก็จะใช้งานได้ครับ จะขึ้นมาดังภาพ (จะมี Parameter เพิ่มเติม เช่น ถ้าผ่าน Proxy ก็ต้องมี -H สำหรับ Proxy Host Name และ -P สำหรับ Proxy Port)

2. ขั้นแรก Add Thread Group ก่อน โดย คลิกขวาที่ Test Plan ส่วนนี้จะมีการกำหนดว่าจะมีจำนวน Request เท่าไร ทำกี่ครั้ง ประมาณนี้ครับ
3. แล้วก็คลิกขวาที่ Thread Group เพื่อทำการ Add ที่เราต้องการ Load Test โดยจะอยู่ที่ Sampler
4. ในที่นี้จะ Add HTTP Request พอทำการ Add เสร็จเราก็จะมา Config ว่าไปที่ Server อะไร Port อะไร ใช้ Method (POST/GET) อะไร Path อะไร มี Request อะไรบ้าง
5. แค่นี้เราก็สามารถ Load Test ใช้งานได้ครับ
ุุ6. ถ้าเราต้องการดู Summary ว่าที่ส่งไปเป็นไงบ้าง เราจะต้องทำการ Add Listener เพื่อจะดูได้ว่า Request ที่เข้าไปเป็นไงบ้าง ใช้เวลาเท่าไรบ้าง

ปล. อันนี้แบบง่ายๆ ให้ใช้งานได้นะครับ ยังไงถ้าต้องการข้อมูลเพิ่มเติมสามารถไปหาอ่านได้ที่ Web ครับ ทำอะไรได้เยอะพอสมควร



Reference
http://jakarta.apache.org/jmeter/usermanual/index.html

วันพฤหัสบดีที่ 16 สิงหาคม พ.ศ. 2550

วิธีแก้ Broken Pipe บน Websphere Server 6.1

วิธีแก้เราจะต้องเพิ่มให้มัน Test Connection บ่อยๆ เพื่อ Connection จะได้ใช้งานได้ตลอดน่ะครับ (สำหรับ Oracle นะครับ)

วิธีทำ ทำดังนี้
1. ไปที่ Resource --> Datasource --> Name Of Datasource
2. คลิกที่ WebSphere Application Server data source properties
3. ติกเลือก ให้มี Pretest connection properties แล้วเราก็คอนฟิกว่าจะให้เทสบ่อยแค่ไหน ยิ่งบ่อย Performance ยิงจะ Drop ลงนะครับ

หมายเหตุ
1. ปัญหาที่เกิดขึ้นอาจจะเกิดจาก Firewall มีการตัด Connection ที่เปิดค้างไว้นาน
2. อาจจะเกิดจาก Router ทำการ Disconnect เวลา Connection ไม่ได้ทำงาน

การ Config Share Library บน Websphere 6.1

Share Library มีไว้เพื่อเราจะได้ไม่ต้องเอา Library ไปไว้ใน .ear file จะทำให้ ear file มีขนาดเล็กลง ซึ่งวิธีการ Config นั้น ต้องทำสองที่คือที่ Application กับ ที่ Server ให้เป็นชื่อ Share Library เดียวกัน(ในบางกรณี ถ้าใช้ชื่อเดียวกันแล้วมันจะมีปัญหาก็ให้ Config กันคนละชื่อแต่เวลา Deploy ให้อ้างถึงตัวที่อยู่บน Server)

การ Config Share Library บน Rad
1. ให้เปิด application.xml ที่ ear project
2. ให้ไปที่ tab Deployment
3. จะอยู่ในส่วนของ Shared Library ดังรูป



4. แล้วทำการ Add โดยกดที่ปุ่ม Add แล้วก็ตั้งชื่อ Share Library, Description, Class Path (เป็น Directory ที่เรามี Jar File )
5. Save File แล้วทำการ Restart Server ในเครื่องของเราจะทำให้ Application ของเราใช้งานได้โดยมี Share Library


การ Config Share Library บน Websphere Server 6.1 (บน Websphere 6.0x จะทำเหมือนกันแต่ Config จะอยู่ต่างที่กันนิดหน่อย)
1. ให้ไปที่ Environment --> Shared Libraries
2. คลิก New(ต้องเลือก Scope ของ Shre Library ว่าจะไว้ที่ไหน) แล้วก็ทำการกำหนด Name, Description, Classpath (สามารถกำหนดเป็น Directory หรือ ชื่อ Jar File ได้เหมือนกัน) ดังรูป


5. ทำการ Save เป็นอันเสร็จ

วันพุธที่ 8 สิงหาคม พ.ศ. 2550

ดู Process การทำงานของ Websphere 6.1

เมนูจะอยู่ที่ Moniroting and Tuning --> Performance Viewer แล้วก็เลือก Current Activity จากนั้นเลือก Server ที่จะดู ก็สามารถจะดูได้แล้วครับ
ซึงจากรูปจะมีดังนี้
Name คือ ชื่อ ไฟล์ ที่มีการเรียก
Application คือ Application ที่เรา Deploy ไว้ (.war)
Total Request คือ จำนวนที่เรา Request เข้ามาว่ามีเท่าไร

แล้วยังมีส่วนอื่นเป็นส่วนที่สรุปไว้ คือ
- Advisor เป็นส่วนแนะนำว่ามีส่วนไหน ควรจะต้องการแก้ไขบ้างใน Application
- Setting ส่วนของการ Setting ต่างๆ
- Summary Reports สรุป ส่วนต่างๆ ที่มีการใช้งานมีดังนี้ Servlets, EJBs, EJB Method, Connection Pool, Thread Pool ซึ่งมีข้อมูลบอก Name, Application, Total Requests, Avg Resp Time, Total Time

ภาพของ Tivoli Viewer

แนะนำเวบสำหรับคนจะไปสมัครงานทางด้าน Computer ครับ

เวบนี้เลย http://www.employmentlead.com/ จะแนะนำพวกคำถามที่ถามกัน แล้วก็ถ้าเป็นเฉพาะทางอย่างจาวา จะมีอธิบายคำตอบไว้ด้วยว่าเป็นอะไรครับ ที่เห็นตอนนี้มี
- C/C++ Interview
- Oracle Interview
- Networks Interviews
- Java Interviews
- SQA Interviews

เป็นคำถามที่ผมเคยโดนถามน่ะครับ
1. String กับ StringBuffer ต่างกันอย่างไร
2. java.util.Date กับ java.sql.Dateต่างกันอย่างไร
3. JSP กับ Servlet ต่างกันอย่างไร
4. Life Cycle ของ Servlet
5. Life Cycle ของ EJB
6. รู้จัก Framework ดังต่อไปนี้ Strut, Spring, Hibernate ว่ามันไว้ทำอะไร
7. HashMap คืออะไร
8. Config web.xml ได้
9. Web Service คืออะไร
10. SOAP คืออะไร
11. เขียน Web อย่างงายๆ ได้โดยที่มีการใช้ Session

วิธีการ Config ให้ Download ด้วยชื่อที่เราตั้งไว้

อันนี้จะ Config ไว้ใน Servlet พอเรา กดไปจะทำการ Download File ได้ชื่อที่เราตั้งไว้

โดยเพิ่ม ส่วนนี้เข้าไป
response.setHeader( "Content-disposition", "attachment; filename=\"" + ชื่อ File + "\"");

ส่วน web.xml ให้เพิ่ม

<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>

เพื่อบอกว่าเป็น File ชนิดไหน

วันจันทร์ที่ 23 กรกฎาคม พ.ศ. 2550

วิธีแก้ Too many parameters exceeding the limit of 255 words เวลา Generate WSDL

วิธีแก้จริงๆ นั้นไม่มีเพราะเป็น Limit ของ JDK 1.4.x อยู่แล้วครับ เราสามารถแก้โดยเลี่ยง ที่ผมรู้ก็มี 2 วิธี
1. ให้ดูที่ File WSDL แล้วลบ Parameter ที่เราไม่ใช่ทิ้งไป แล้ว Generate Stub ใหม่ครับ ซึ่งจะได้เฉพาะ ฟิลด์ที่เราต้องการ อย่างเดียว (ถ้ามีที่ต้องการเอาไม่เกิน 255 ตัวแปรน่ะครับ)โดยไปลบที่ชื่อประมาณ tag <element type="xxx" name="xxx">(ซึ่งวิธีนีจะแก้กลับ Websphere 6.x ไม่ได้เพราะว่า Websphere จะมองว่า attribute มีค่า จะต้องดึงออกมาให้หมด แต่ถ้าเขาไม่ return มาให้จะทำงานได้ครับ)
2. ใช้วิธีเรียกผ่าน RPC เลย ซึ่งค่าที่ Return มานั้นจะเป็น SOAPElement (แต่จะเป็นของ Package ขึ้นอยู่กับตัว Server ที่เราทำ เช่นของ IBM จะเป็น com.ibm.ws.webservices.engine.xmlsoap.SOAPElement) แล้วเราค่อยดึงค่าอกมาคล้ายๆ กับ DOM4J หรือ JDOM

Example

//Init Service
String wsdlURL = <wsdl>;
String namespace = <namespace>;
String serviceName = <servicename>;
javax.xml.namespace.QName serviceQN = new javax.xml.namespace.QName(namespace, serviceName);
javax.xml.rpc.ServiceFactory serviceFactory = org.apache.axis.client.ServiceFactory.newInstance(); //เป็นส่วนที่ดึงค่าว่าจะใช้วิธีไหนในการ Call Web Service ซึ่งจะตามระบบที่เราเขียน และถ้าต้องการใช้เฉพาะเจาะจงไปเลยอย่าง Axis ให้อ้าง Service ที่อยู่ใน Axis ไปเลย
javax.xml.rpc.Service service = serviceFactory.createService(new java.net.URL(wsdlURL), serviceQN);

//Create Call
javax.xml.rpc.Call call = service.createCall();
call.setPortTypeName(serviceQN);
call.setOperationName(new javax.xml.namespace.QName(namespace, <operation>));
call.setPortTypeName(new javax.xml.namespace.QName(namespace , <port>));
call.setProperty(javax.xml.rpc.Call.ENCODINGSTYLE_URI_PROPERTY, "");
call.setProperty(javax.xml.rpc.Call.OPERATION_STYLE_PROPERTY, "wrapped");
Object[] reqObj = new java.lang.Object[] {<request>};
java.lang.Object _resp = call.invoke(reqObj);

คำอธิบายแต่ละตัว
1. <wsdl>คือ URL ของ WSDL ที่เราสามารถดึงออกมาได้
2. <namespace>คือ Name Space ของ WSDL นี้ โดยให้ดูที่ WSDL ที่ชื่อ targetNamespace
3. <servicename>คือ Service Name ของ WSDL นี้ โดยดูจาก wsdl:service ว่ามีชื่ออะไร
4. <operation>คือ Operation Name ของ WSDL นี้ โดยดูจาก wsdl:operation ว่ามีชื่อว่าอะไร
5. <port>คือ Port Type Name ของ WSDL นี้ โดยดูจาก wsdl:portType

วันอังคารที่ 10 กรกฎาคม พ.ศ. 2550

Java Config Proxy

สำหรับ IBM
สามารถ Config ได้สองแบบ
1. โดยใช้ System.setProperty(Class Path,ค่า) ซึ่งค่าที่ Set ไปจะใช้

สำหรับ HTTP
com.ibm.wsspi.webservices.HTTP_PROXYHOST_PROPERTY
com.ibm.wsspi.webservices.HTTP_PROXYPORT_PROPERTY
com.ibm.wsspi.webservices.HTTP_PROXYUSER_PROPERTY
com.ibm.wsspi.webservices.HTTP_PROXYPASSWORD_PROPERTY
สำหรับ HTTPS
com.ibm.wsspi.webservices.HTTPS_PROXYHOST_PROPERTY
com.ibm.wsspi.webservices.HTTPS_PROXYPORT_PROPERTY
com.ibm.wsspi.webservices.HTTPS_PROXYUSER_PROPERTY
com.ibm.wsspi.webservices.HTTPS_PROXYPASSWORD_PROPERTY

2. ไปที่หน้า Admin Console แล้วเลือกที่ Global security > Custom properties จากนั้นก็ Add ลงไปเหมือน System.setProperty




สำหรับทั่วไปจะเป็นดังนี้
1. จะใช้ System.setProperty เหมือนกัน แต่จะใช้

http.proxySet สำหรับว่าจะให้มีการใช้ค่า Proxy หรือเปล่า
http.proxyHost
http.proxyPort



Reference
IBM Config Proxy
Configure HTTP basic authentication for Web services
Narisa Socket Programming

วันพุธที่ 4 กรกฎาคม พ.ศ. 2550

การ Config Clob Type บน Hibernate

การ Config นั้น บน XML เราจะไม่ต้องไปทำอะไรเลย แต่จะไปทำที่ Java File ให้เป็น Type --> java.sql.Clob ก็จะสามารถใช้งานได้ครับ

วิธีการ Convert java.sql.Clob to String ก็ทำดังนี้

param_value.getSubString(1, (int)param_value.length());

โดย param_value จะเป็น java.sql.Clob

วันศุกร์ที่ 22 มิถุนายน พ.ศ. 2550

การตรวจสอบว่า Web ที่เราติดต่อด้วยยังมีอยู่หรือเปล่า

การตรวจสอบนั้น ผมจะใช้วิธีเปิด Connection ไปแล้วตรวจสอบ Response Header ว่าเป็น 200 หรือเปล่า ถ้าเป็นแสดงว่ายังมีอยู่ ครับ (ควรที่จะเป็นหน้าเพจเช่น .html ในการตรวจสอบ เพราะอย่าง WebService จะไม่ส่งค่ามาให้เป็น 200 นะครับ) ดังตัวอย่างข้างล่าง

URL httpurl = new URL("http://10.4.130.64:9060/ibm/console/login.do");
HttpURLConnection httpcon = (HttpURLConnection) httpurl.openConnection();
httpcon.setRequestMethod("GET");
httpcon.setDoInput(true);
httpcon.setDoOutput(true);
OutputStream out = httpcon.getOutputStream();
out.write(10);
out.flush();
httpcon.connect();
int statusCode = httpcon.getResponseCode();
if (statusCode != 200 ){
//Do Somthing
}


เวบที่น่าสนใจ http://web-sniffer.net/

วันศุกร์ที่ 15 มิถุนายน พ.ศ. 2550

Basic Config Log4J

จะสอนวิธีใช้งานแบบง่ายๆ ของ Log4J นะครับ ว่าจะ Config ยังไงดี ซึ่งเราจะ Config ใน log4j.properties นะครับ Parameter ที่น่าจะรู้

log4j.rootCategory เป็นการกำหนด Log ทั้งหมดของเราว่าจะให้มีระดับเท่าไร ซึ่งใน Log4J จะมีระดับดังนี้ info, warn, debug and fatal
log4j.logger.package เป็นการกำหนดว่าจะให้ที่อยู่ในชื่นี้ทั้งหมดอยู่ในระดบไหน [ตรง Package ให้กำหนดเป็นชื่อหรือ Package ของ Class เราก็ได้ว่าจะให้มันอยู่ในระดับใดของ Log4J]
log4j.appender.package กำหนดว่าจะให้ Log ออกแบบไหน เช่นลงไฟลล์หรือเปล่า
log4j.appender.package.DatePattern เป็นรูปแบบของไฟลล์ว่าพอหมดวันแล้วจะเก็บรูปแบบไหน
log4j.appender.package.File กำหนัดว่าไฟลล์จะชื่ออะไร วางไว้ที่ไหน
log4j.appender.package.MaxFileSize ความจุมากสุดของในแต่ละไฟลล์ ถ้าในวันนึงเกินจะหั่นไฟลล์ออกมา
log4j.appender.package.layout จะให้ Pattern เป็นแบบไหน
log4j.appender.package.layout.ConversionPattern กำหนดรูปแบบว่าจะให้โชว์อะไรบ้าง


ข้างล่างเป็นตัวอย่าง อย่างง่ายๆ ครับ

log4j.rootCategory = Info, stdout //บอกว่าให้ Log ทั้งหมดที่ระดับต่ำกว่า Info ไม่ต้องเอามาแสดง ส่วน stdout คือ System.out
log4j.appender.stdout = org.apache.log4j.ConsoleAppender //เป็นการบอกว่าออกที่ Console
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout //Pattern
log4j.appender.stdout.layout.ConversionPattern = ...[ABC Project]... [%d{dd/MM/yyyy HH:mm:ss,SSS}] (%c:%L) - %5p - %m%n//รูปแบบของการออกโดย จะเป็นดังนี้ ... [ABC Project]... [รูปแบบของวันที่จะเป็น วัน/เดือน/ปี ชั่วโมง:นาที:วินาที,ไมโครวินาที] (ชื่อเต็มเช่น ชื่อ Class รวมกับ Package ทั้งหมด:บรรทัดที่รัน) - Level ของ Log

log4j.logger.com.true_corp.connector = DEBUG,connectorlog //เป็นการบอกว่า Log ที่อยู่ใน Package com.true_corp.connector ทั้งหมดจะมีระดับ Log ที่ Debug แล้วตัวข้างหลังบอกว่าใช้เป็นตัวแปรชื่อนี้
log4j.appender.connectorlog = org.apache.log4j.DailyRollingFileAppender //กำหนดให้ connectorlog เก็บลงไฟลล์
log4j.appender.connectorlog.DatePattern = '.'yyyy_MM_dd //มีรูปแบบของวันเป็น ปี_เดือน_วัน
log4j.appender.connectorlog.File = C:/Connector.log //ลงไฟลล์ชื่อ Connector.log
log4j.appender.connectorlog.MaxFileSize = 10000KB //ขนาดไฟลล์สูงสุดคือ 10 Mb ถ้าเกินจะขึ้นไฟลล์ใหม่
log4j.appender.connectorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.connectorlog.layout.ConversionPattern = ...[Temp Log]... [%d{dd/MM/yyyy HH:mm:ss,SSS}] (%c:%L) - %5p - %m%n

วันอังคารที่ 12 มิถุนายน พ.ศ. 2550

มาใช้ Google Notebook กันเถอะ

ไม่ใช่ เครื่อง Notebook ^_^ นะครับ มันคือกระดาษจด Online ของ Google เหมือนพวก Post-It น่ะครับ แต่อันนี้จะออนไลน์ สามารถ Export ไปเป็น Google Doc ได้ด้วย แล้วก็มี Plugin สำหรับ Firefox ให้ใช้ด้วยครับ แต่บน IE ผมไม่แน่ใจว่ามีหรือเปล่านะครับ ส่วนการสมัครก็ยังเหมือนเดิมแค่มี Account E-Mail ของ Google ก็สมัครได้แล้ว เรามาดูภาพหน้าจอคร่าวๆ กันดีกว่า


อันนี้เป็นหน้าแรกที่เราเข้ามาครับ ของผมจะมีข้อมูลอยู่ก่อนแล้ว

สำหรับหน้าแรกทางซ้ายจะเป็นหัวเรื่องที่เราแยกไว้ เหมือนเป็นสมุดเล่มนึงก็ได้ แล้วด้านขวาจะเป็นข้อมูลในสมุดนั้นมีอะไรบ้างครับ สามารุแยกเป็นแผ่นๆ ได้ว่าจะแยกอะไรบ้าง จะเห็นว่าจะสามารถทำตัวหน้า ตัวสีอะไรได้ ที่จริงผมอยากให้มันแอดรูปได้จะดีมากๆ เลย



หน้าจอ ของการ Share Notebook ของเราครับ (Sharing options)

ซึ่งหน้านี้เราสามารถเลือกได้ว่าจะ Share กับใครบ้าง Invite ใครมา Edit ได้บ้าง ทางขวาจะเห็นลิงค์ สำหรับให้คนข้างนอกเข้ามาดูได้ครับ ลองดูที่นี่



ภาพที่เราลง Plugin สำหรับ Firefox มาแล้วครับ จะอยู่มุมขวาล่าง

จบแล้วครับ วันหลังจะเอาตัวที่น่าสนใจมารีวิวให้ดูกันอีกครับ

วันพุธที่ 6 มิถุนายน พ.ศ. 2550

Config Trust Certification บน Websphere 6.1

สามารถที่จะทำได้สองวิธีคือ ไปอ่านข้อมูลจาก IP และ Port เลย หรือว่าให้เอาไฟลล์ไปวางไว้ที่ Server แล้วอ่านไฟล์ .cer นั้นน่ะครับ

วิธีการทำดังนี้
1. ไปที่เมนู Security --> SSL certificate and key management
2. คลิกที่ Key stores and certificates
3. แล้วเลือก NodeDefaultTrustStore
4. คลิกไปต่อที่ Signer certificates
5. ซึ่งตรงนี้จะมีให้เลือกว่าจะ
5.1 Retrieve from port คือให้ Websphere ไปดึงค่า Certification มาให้เลย
5.2 Config Port คือ ให้กรอกที่อยู่ของ ไฟล์ .cer ที่อยู่ที่เครื่องมาลง
6. แล้วก็ Restart WebServer ก็จะทำงานได้ครับ

หมายเหตุ อย่า Config บน Application ให้ Config บน Server เท่านั้น

วันอังคารที่ 5 มิถุนายน พ.ศ. 2550

Config Log4j บน Websphere 6.x

โดยปกติ ถ้าใช้บน Tomcat เราไม่ต้อง Config แค่เอาไปวางไว้ใน WEB-INF มันก็จะวิ่งไปอ่าน log4j ให้แต่บน Websphere 6.x มันจะม่อ่านเราเลยต้องใช้วิธีบอกตำแหน่งให้มันอ่านเลย ซึ่งทำดังนี้


//ไว้บอกตำแหน่งของ file log4j.properies
String log4j = getServletContext().getRealPath("/WEB-INF/log4j.properties");

//Config Properties File ว่าอ่านที่ตรงนี้
PropertyConfigurator.configure(log4j);


หมายเหตุ ถ้าใช้วิธีนี้จะทำให้ทั้ง Server ใช้ Config นี้ทั้งหมดเพราะฉะนั้นจะต้องเอา Config ของทุก Application มาไว้ใน lo4j.properties ที่เดียวกัน

วิธี Config Timeout สำหรับ Connection

สำหรับคนที่ใช้ JDK 1.5 ขึ้นไปสามารถที่จะ Config Timeout ได้เลยครับ เพราะจะมีให้ Config อยู่แล้ว แต่สำหรับ เวอร์ชั่นต่ำกว่านั้น จะไม่มีให้ Config จะต้องไปใช้ Library ตัวอื่นในการส่งแทนครับ เช่น httpclient

วันอังคารที่ 29 พฤษภาคม พ.ศ. 2550

มาใช้ Google Reader กันเถอะ

     คราวนี้มาแนะนำ Product Google กันอีกตัวครับ Google Reader (แนะนำว่าต้องเข้าด้วย https ครับ ถ้าไม่เข้าแบบนี้น่ามันจะ Error ครับ) เป็น Rss Feed สำหรับไว้อ่านข่าวสารเวบที่เปิด rss ไว้ได้ เช่น exteen.com, blogspot.com เป็นต้นครับ ข้อสำคัญสำหรับเวบบางอันที่โดน บล็อกไป ถ้ามี Rss Feed เราก็สามารถอ่านข้อมูลได้ครับ อย่าง Blogspot สำหรับ Net TOT ก็ทำให้เข้าไปอ่านข้อมูลได้ครับ สะดวกดีเหมือนกัน แล้วก็สามารถเอา File OPML มาอัพโหลดลงไปเพื่อเราสามารถจะดูที่เราเก็บไว้ใน Favorite อย่าง Exteen.com (จะมีอยู๋ข้างล่างอ่ะครับ ให้ Save File ออกมาเป็น OPML เลย แล้วมาอัพโหลดที่ Google Reader ได้เลยครับ ก็จะมีข้อมูลทั้งหมดของเราที่ทำ Favorite ไว้มาอยู่ที่นี่ทั้งหมด)
     ขั้นตอนการสมัครก็แสนง่ายมีเพียง E-Mail ของ GMail เท่านั้นก็สามารถสมัครได้แล้วครับ

มาดูหน้าตากันดีหว่า
     1. จากภาพข้อมูลจะถูกแบ่งเป็นส่วนโดยด้านซ้ายจะเป็นที่เราไว้จัดการข้อมูลต่าง ส่วนด้านขวาเป็นข้อมูลของ Rss Feed

ข้อมูลด้านซ้ายทีน่าจะรู้มีดังนี้
          - Home จะเป็นหน้าแรกของ Reader โดยด้านซ้ายจะเป็น Preview ให้ดูเป็นหัวข้อ กับ Blog สักสองสามอัน จะมี trends ด้วย คือดูว่าเราเข้าไปดูเวบไหนมาหรือว่ามีการดูลักษณะ เป็นอย่างไร
          - All Items จะดูข้มูลทั้งหมดที่มีการ Feed อยู่ (มี Expand View คือจะดูรายละเอียดทั้งหมด กับ List View จะดูข้อมูลเป็นหัวข้อไปแล้วค่อยคลิกเข้าไปดูที่หลังอีกที)

     2. หน้า Management Subscriptions ซึ่งที่คลิกจะอยู่ข้างล่างทางขวามือครับ ไว้สำหรับจะดูการอะไรต่างของเรา หน้าต่างดังข้างล่าง


          - Subscriptions ไว้จัดการ Feed เราต่างๆ ว่าจะให้อยู่ในหมวดหมู่ไหน จะลบทิ้งหรือเปลี่ยนชือแล้วแต่
          - Tags ไว้จัดการหมวดหมูขางเราที่สร้างขึ้นว่าจะให้เป็น Public หรือเปล่า คือให้คนอื่นสามารถเข้ามาได้หรือเปล่า หรือว่า Private สำหรับให้เราดูได้คนเดียวครับ
          - Goodies น่าจะเป็ฯช่วยเหลืออะไรๆ ง่ายขึ้นอ่ะครับ ซึ่งที่เห็นๆ มีอยู่ อันแรกก็เป็น gadget สำหรับ IGoogle (ถ้ามีเวลาจะอธิบายไว้ใน Entry ต่อๆ ไปครับ ว่ามันคืออะไร) , Add Bookmark สำหรับ Tag เราแล้วเข้ามาดูที่เดียวได้เลยว่ามีอะไรอัพเดทบ้าง, ดูบนมือถือได้
          - Import/Export ไว้สำหรับImport/Export File OPML สำหรับ Rss Feed ที่เรามีจากที่อื่น หรือเอาจากที่นี่ออกไปข้างนอกน่ะครับ อย่าง Exteen.com ก็จะมี File OPML เหมือนกัน ก็เอาจากอันนั้นมา Add ใส่ที่นี่ไว้ได้ทำให้เราได้ข้อมูล Favorite มาใช้ดูบนนี้ได้ครับฃ
          - Preferences Config สำหรับ Google Reader ครับ


มาใช้ Google Analytics กันเถอะ ตอนที่ 2 มีอะไรบ้างให้ใช้บ้าง

มาดูกันว่ามีอะไรบ้างครับ มันมีเยอะมากๆ ผมเลยอธิบายคร่าวๆ แล้วรูปบ้างส่วนนะครับ ที่จริงผมก็ยังใช้ไม่หมดของมันเลยอ่ะ บางอันก็ยังไม่รู้ ใครรู้ช่วยบอกด้วยครับ

Dashboard จะเป็นภาพรวมทั้งหมดซึ่งเราสามารถที่จะเอาส่วนอื่นๆ มาไว้ที่นี่ได้ครับ จะมีปุ่มให้ add ลงมาที่ Dashboard ตอนสุดท้ายแล้วครับ
- Save Reports
- Visitors Overview
- Traffics Sources Overview
- Map Overlay
- Content Overview



ภาพของ Dashboard

Visitors
- Overview
- Map Overlay จะบอกเราได้ว่ามีใครเข้าเวบเราจากที่ไหนบ้างเป็นแผนที่ให้คลิกเข้าไปดู
- New VS. Returning เปรียบเทียบข้อมูลระหว่างคนที่มาเข้ามาชมคนเก่า หรือคนใหม่
- Languages ภาษาของเครื่องคนที่เข้ามาใช้ภาษาอะไร
- Visit Trending
- Visits สถิติผู้เข้ามาเยี่ยมชมทั้งหมด
- Absolute Unique Visitors สถิติผู้เข้าเยี่ยมชมครั้งแรก
- Pageviews มีคนดูหน้าเพจไปกี่ครั้ง
- Average Pageviews ค่าเฉลี่ยคนเยี่ยม หน้าเพจ/คนเยี่ยมชม
- Time On Site เวลาเฉลี่ยในการเยี่ยมชมเวบไซต์เรา
- Bounce Rate คืออะไรหว่า อันนี้ไม่รู้อ่ะครับ
- Visitor Loyalty
- Loyalty สถิคิคนมาเยี่ยมเวบเราซ้ำกี่ครั้ง
- Recency สถิติคนมาเยี่ยมชมเวบเราครั้งสุดท้ายเมื่อไร
- Length of Visit เข้ามาเวบเราแล้วอยู่นานเท่าไร
- Depth of Visit เข้ามาเวบเราแล้วเข้าไปกี่เพจ
- Browser Capabilities
- Browsers ใช้ Browser อะไรในการเข้า
- Operating Systems ใช้ OS อะไรในการเข้า
- Browsers and OS ใช้ Browser อะไรกับ OS ตัวไหน
- Screen Colors สี่ที่ใช้ที่เครื่องเป็นกี่บิต
- Screen Resolutions ควมละเอียดของหน้าจอ
- Flash Versions ใช้ Flash Version อะไร
- Java Support สถิติคนที่เข้าเวบเราแล้ว Support Java หรือ ไม่ Support Java
- Network Properties
- Network Location ใช้ Internet ของอะไรในการเข้า
- Hostnames ที่เข้ามา อันนี้งง
- Connection Speeds ความเร็วของ Internet ที่ใช้
- User Defined ไม่รู้อ่ะครับ อันนี้


ภาพของ Overview Visitors

Traffic Source
- Overview
- Direct Traffic คนที่เข้ามาเยี่ยมชมเวบโดยเข้ามาตรงๆ เลย (พิพม์ URL เข้ามาเลย) อันนี้ผมไม่แน่ใจว่ารวมพวกที่เข้ามาจากพวก Rss Reader หรือเปล่าน่ะครับ
- Referring Sites เข้าจากเวบไหนถึงเข้ามาที่เวบเราได้ จะไม่รวมพวก Search Engine
- Search Engines ที่ใช้เข้ามาหาเวบเรา
- All Traffic Sources รวมทั้งหมดว่าเข้ามาเวบเราด้วยอะไร
- Keywords คำที่ใช้ในการคนหาแล้วมาถึงเวบเรา
อันนี้ผมไม่พูดถึงนะครับ เพราะ รู้สึกมันจะไปผูกกับ Google adwords อ่ะ ผมไม่เคยใช้เหมือนกัน
- Campaigns ไม่รู้อ่ะครับ
- Ad Versions ไม่รู้อีกล่ะ


ภาพของ Overview Visitors

Content
- Overview
- Top Content สถิติคนเข้ามาเยี่ยมเวบเราที่ Page ไหนบ้าง
- Content by Title เหมือน Top Content แต่อันนี้ดูตาม Title ของเวบเรา
- Content Drilldown เหมือนจะดูตามลิงค์เข้าไปอีกขั้นนึงอ่ะครับ ถ้าอย่าง exteen ก็จะเป็นวันอ่ะครับ
- Top Landing Pages เป็น Page ที่ผู้เยี่ยมชมเข้ามาเลยอ่ะครับ งงเหมือนกัน น่าจะเป็นหน้าแรกที่เข้ามา
- Top Exit Pages เป็น Page หน้าสุดท้ายที่เขามาก่อนเขาจากไป
- Site Overlay ไม่แน่ใจว่าบอกเราว่า คนที่มาเยี่ยมเวลาเราไปคลิกตรงไหนบ้าง หรือเปล่าอ่ะครับ


ภาพของ Overview Visitors

Goals ผมไม่ได้ใช้อันนี้เลยอ่ะ น่าจะเป็นการตั้งเปาหมายของเวบเราว่าจะได้อะไรเมื่อไร ได้ถึงเป้าหมาหรือเปล่า
- Overiew
- Total Conversions
- Conversion Rate
- Abandoned Funnels
- Goal Value
- Funnel Visualization

หมายเหตุ
1. ค่าของสถิติเราสามารถดูได้หลายแบบ เช่น กราฟวงกลม กราฟแท่ง เป็นต้น มีตามดังรูป

2. สามารถเลือว่าจะวิว Page เป็นของอะไร ดังรูป

3. สามารถ Export ข้อมูลเก็บไว้ได้หลายหลายรูปแบบ ดังรูป

4. สามารถ Compare Date ได้ว่าจะเอาตั้งแต่วันไหนถึงวันไหน

5. ข้อมูลสามารถเข้าไปดูรายละเอียดปลีกย่อยแต่ละอันได้เลยว่ามีคนเข้าเท่าไร คนใหม่เท่าไรครับ เช่น Referal จะดูได้เลยเป็นอันๆ เลย
6. ข้อมูลรู้สึกว่าจะช้าไป 1 วันนะครับ
7. ดูตอนที่ 1 ได้ ที่นี่ ครับ
8. อาจจะมีบั๊กอยู่บ้างอ่ะครับในกรณีที่มีหลาย Account บางทีเข้า Account นี้อยู่แต่พอคลิกเลือกดันไปเข้าอีก Account นึงให้

มาใช้ Google Analytics กันเถอะ ตอนที่ 1 ขั้นตอนการสมัครสมาชิก

Google Analytics คือ เวบที่เห็บสถิติ เพื่อเราสามารถนำค่าที่้่เก็บไปวิเคราะห์ได้ว่า เราควรจะทำเวบไปในทางใดครับ ซึ่งมีข้อมูลมากมาย เช่น ข้อมูลว่าส่วนใหญ่เข้าเวบเราจากทางไหน ใช้ความละเอียดหน้าจอขนาดไหน ใช้ Browser อะไรบ้าง เป็นต้น และสามารถ Export ข้อมูลออกมาได้เป็น PDF, XML,CSV,TSV ครับ ที่สำคัญฟรีครับ (รู้สึกคุณภู่เคยแนะนำแล้วตั้งแต่มันยังเป็น Beta น่ะครับ แต่ตอนนีเปิดให้ใช้ได้หมดแล้ว)

1. เราต้องมี E-Mail ของ GMail ซะก่อนถึงจะใช้งานได้นะครับ
2. เราก็ทำการ Sign-Up ที่นี่


ให้กรอกข้อมูล Website ของเรา


กรอกข้อมูลของตัวเราครับ


เป็น Agreement


ต่อไปเราจะได้ Code ที่เราต้องเอาไปใส่ที่เวบของเราครับ

3. สำหรับ Exteen.com จะเอา Script ไปใส่ไว้ในข่องของ Link ได้เลยครับ เป็นอันใช้ได้ (แต่ต้องเอาข้อมูลทั้งหมดมาต่อเป็บรรทัดเดียวนะครับ ถึงจะใช้ได้)

จบแล้วครับ ตอนต่อไปมาดูกันว่า Google Analytics มีอะไรให้ใช้บ้าง



วันพฤหัสบดีที่ 24 พฤษภาคม พ.ศ. 2550

วิธีแก้ปัญหา Cache บน AJAX

ปัญหาของ AJAX อย่างนึงคือมันมีการเก็บ Cache เลยทำให้เวลาเราไปเรียก AJAX แล้วบางทีจะไม่ได้ข้อมูลที่ Refresh ใหม่เสมอ มีวิธีแก้ไขดังนี้
1. ลอง Config Meta บน html file ให้ไม่มีการเก็บ Cache โดยเพิ่มข้อมูลดังนี้

<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">

2. ใช้วิธี Generate DateTime ต่อท้าย Link ที่ไปเรียกทำให้คิดว่าเป็นคนละ URL กัน ก็จะแก้ไขได้ เช่นเพิ่ม new Date(); ลงไป ต่อข้างหลัง

ข้อมูลเพิ่มเติมครับ
http://radio.javaranch.com/pascarello/2005/10/21/1129908221072.html มาจาก Mail ที่บริษัทครับ
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
http://www.i18nguy.com/markup/metatags.html
http://www.webperformance.org/caching/

ปัญหาการ Config web.xml ใน RAD 6.0

1. ปัญหา Servlet ไม่ยอม Load On Start up --> แก้ได้โดย เปลี่ยน Load On Start up = 0 แทน เพราะเวลาเราสร้าง Default ของ RAD 6.0 จะเป็น -1 ซึ่งบาทีมันจะไม่ start up ให้เลยต้องเปลี่ยนเป็น 0 แทนถึงจะทำการ start up ได้
2. ปัญหาเราเขียน Config เพิ่มใน web.xml แล้วทำไม มันไม่รัน --> แก้โดยเราต้อง Config ผ่านหน้าจอของมันเอง อย่า Config ผ่าน Editor เพราะว่าบางทีแค่เว้นวรรค RAD 6.0 ก็อ่านไม่ได้แล้ว ล้วบางอย่างจะ Config ไม่เหมือนปกติทัวไปด้วยครับ

วันพุธที่ 23 พฤษภาคม พ.ศ. 2550

Eclipse Plugin -Resourcebundle Editor

เป็น Plugin สำหรับ Eclipse ทำให้เขียนข้อมูลที่เป็น Unicode หรือ อ่านได้โดยไม่ต้องใช้ตัวแปลงอ่ะครับ อ่านจาก Eclipse ได้เลย โหลดได้ ที่นี่ ครับ
หลังจากโหลดเสร็จแล้วก็คลาย File Zip แล้วนำไปวางที่ Folder plugin ก็จะสามารถใช้งานได้


จะเห็นว่าอ่านภาษาไทยได้


แล้วถ้าดูแบบ editor ปกติก็จะเห็ฯว่ามัน Convert เป็น Unicode ให้เรียบร้อยแล้ว

วันพุธที่ 16 พฤษภาคม พ.ศ. 2550

วิธีการเอา .cer จาก Website โดยใช้ IE

1. ให้เข้าเวบที่ต้องการจะเอา
2. เลือก File แล้วไปที่ Properties
3. คลิกที่ Certificates
4. เลือกที่ Tab Detail แล้วคลิกที่ Copy To File
5. ให้เลือกเป็น Base-64 encoded X.509 แล้วเซฟออกมาใช้งานได้เลยครับ

วันอังคารที่ 8 พฤษภาคม พ.ศ. 2550

การเขียน SNMP Trap โดยใช้ Java

โดยจะใช้ Library จาก ที่นี่
ซึ่งบางทีเวลาเราเขียน Web Application ระบบเราจะต้องส่ง SNMP Trap เพื่อไปบอก System นึงว่ามี error ในระบบเรา ซึ่ง System นั้น จะเป็น Network Monitoring เพื่อดูทั้งหมด
SNMP(Simple Network Management Protocol) เป็น protocol ที่ช่วยในการจัดการด้านเครื่อข่าย และรวบรวมข้อมูลต่างๆ จากเครืองอื่นภายในเครื่อข่าย ซึ่งโดยปกติแล้ว อุปกรณ์ในเครือข่ายจะมีการส่ง SNMP Broadcast ออกมาอยู่แล้ว

วิธีการเขียนจะอยู่ตามใน Document อยู่แล้วครับ
ลองดู ที่นี่

วันพุธที่ 2 พฤษภาคม พ.ศ. 2550

Config Certification On Application

วิธีการ Config SSL บน Application ของเราเอง ซึ่งไมควรจะทำนอกจากจะเทสที่เครื่องของตัวเอง แต่พอขึ้น Production หรือ Develop Server นั้นให้ปิดแล้ว Config ที่ Server เอาเท่านั้น


System.setProperty("javax.net.ssl.trustStore", trustStoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePwd);
System.setProperty("javax.net.ssl.keyStore", keyStoreFile);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePwd);


สำหรับ Config บน Websphere 6.1 ทำตามนี้ Config Trust Certification บน Websphere 6.1
ปล. สำหรับ Websphere จะใช้ Password : WebAS และ Path จะอยู่ที่ xxx/etc (ไฟลล์จะชื่อ DummyServerTrustFile.jks และ DummyServerKeyFile.jks)

วิธีแก้ปัญหาการไม่อ่าน Library ของ WID 6.0

แก้ปัญหาการไม่อ่าน Library ให้เอาไฟลล์ Jar ไปวางไว้ที่ Path ของ Server เลย ซึ่งจะเป็นประมาณ xxx\60x\runtimes\bi_v6\lib แล้วทำการ Restart Server Library ตัวนั้นก็จะถูกอ่านขึ้นมาได้
ปล. อาจจะมีวิธีทำวิธีอื่นที่ดีกว่านี้ก็ได้นะครับ เพราะผมเอไฟลล์ Jar ไปวางไว้ใน Project ก็ยังไม่ได้น่ะครับ

วันจันทร์ที่ 30 เมษายน พ.ศ. 2550

Add Certification บน Websphere 6.0x (Windows)

บน Websphere 6.0x นั้นจะไม่มีเมนู Add บน Websphere Admin Console แต่เราจะต้อง Add บน ikeyman โดยมีขั้นตอนดังนี้
1. หาไฟลล์ ikeyman.bat แล้วทำการรัน ขึ้นมาโดยไฟลล์จะอยู่ที่ directory bin
2. หลังจากรันขึ้นมาแล้ว ให้ เปิดไฟลล์ ที่ชื่อ DummyServerTrustFile.jks และ DummyServerKeyFile.jks โดยขั้นตอนการ add จะเหมือนกันทั้งสองไฟลล์ (จะอยู่ใน Folder xxx/etc)
3. Password : WebAS ซึ่งเป็น default
4. ตรง Key database content ให้เลือกเป็น Signer Cerfiticates
5. แล้วทำการ Add ไฟลล์ cer เข้าไป
6. ให้ทำทั้งสองไฟลล์หลังจากทำเสร็จให้ Restart Server ก็จะใช้งานได้
7. ในกรณีที่ Add แล้วมันยังไม่ได้ให้ใช้วิธีเซ็ตค่าลงบน Application เลย ตามนี้

ปัญหา SSL เวลา Cert หมดอายุ

อาการที่เป็นแบบนี้เพราะว่าเซ็ต Locale เป็น Thai ให้เปลี่ยน Locale ของเครื่องเป็น English แล้วจะหาย (ในกรณีที่ Start Server ไม่ขึ้นด้วยเหมือนกัน)

วันศุกร์ที่ 27 เมษายน พ.ศ. 2550

ปัญหา Scheduler บน Websphere 6.1 ในกรณีที่มีหลาย Server

เป็นปัญหาที่พบเวลาเรา Deploy Application แล้วทำ Scheduler น่ะครับ โดยไปดูได้ที่ Table xxx__SCHED_LMGR
Column LEASEOWNER ให้เป็น Server ที่ถูกต้องถ้าผิดให้ลบแล้ว Commit แล้ว Refresh ดูจนกว่าจะถูก Server ถ้ายังไม่ถูกก็ลบไปเรื่อยๆ

เิ่พิ่มเติม สามารถแก้ได้โดยให้ Scope ของ Sheduler อยู่บน Application Server เลยครับ ก็จะหาย (ได้จากคนอื่นเทสให้ครับ)

วันพฤหัสบดีที่ 19 เมษายน พ.ศ. 2550

วิธีแก้ปัญหาพื้นฐานเวลาทำไมหน้า Web ถึงไม่ขึ้น

1. ตรวจสอบก่อนว่า Application ทำงานหรือยัง

2. ตรวจสอบโดยวิ่งเข้าหน้าเวบผ่านทาง Application Server (ถ้า Default Port จะเป็น 9080) ถ้ายังไม่ได้แสดงว่า Application ยังมีปัญหาในการ Deploy อยู่ (ในบางกรณีเวลา Deploy เสร็จแล้วอาจจะต้องรอข้อมูลให้ Sync กันระหว่าง Application Server หลายตัว เราจะต้องทำการเทสทุกเครื่องที่มีในระบบ เพราะอาจจะเกิดกรณีที่ว่า ข้อมูลของ Application Server ไม่ Sync ขึ้นได้แค่บางเครื่อง

3. ถ้าทำในข้อ 2 สำเร็จแล้วให้ตรวจสอบในส่วนของ Web Server ว่ารันขึ้นหรือยัง ถ้ายังให้ทำการ Start Web Server ซึ่งสามารถทำผ่านหน้า Admin Console ได้เลย

4. หลังจากทำผ่านข้อ 2 แล้วในกรณีที่เป็น Application ใหม่ พึ่ง Install ลง Server ครั้งแรก ให้ทำการ Propogate,Generate Plugin ที่ตรง Web Server ซึ่งพอเสร็จแล้วต้อง Success ทั้งสองอย่าง (คือการทำให้ Web Server กับ Application Server Sync ข้อมูลกัน)

5. ในกรณีที่ไม่ Success อาจจะเกิดจากกรณีที่ระบบเขายังไม่ได้ Grant สิทธิ์ของ Web Sphere Admin ในการเข้าไปเปลี่ยนข้อมูลใน Folder ที่ Config ให้ไปเพิ่มสิทธิ์ในการเข้าถึงบน Unix ก็จะทำงานได้

6. ให้ไปตรวจสอบข้อมูลที่ไฟลล์ plugin-cfg.xml ว่ามีการ Map Context Root ลงไปหรือเปล่า โดยจะมีข้อมูลคล้ายตัวอย่างข้างล่างนี้

Example
<Uri AffinityCookie="JSESSIONID"AffinityURLIdentifier="jsessionid" Name="/mer/MGWWebService/*" />


7. ในกรณีที่ไม่มีข้อมูลนั้น (น่าจะเป็นจากการที่ว่าเรามี Application Server, Web Server แยกกันคนละเครื่อง แล้วมีมากกว่า 1 เครื่อง) ให้ทำดังนี้
1. ให้ไปที่เมนู Environment --> Update global Web server plug-in configuration แล้วทำการกดปุ่ม OK ซึ่งจะทำการ Update Config Context Root ทั้งหมด ถ้าไม่แน่ใจ ลองกด View or download the current Web server plug-in configuration file เพื่อดูว่ามีจริงหรือไม่ แต่โดยปกติมันต้องมีข้อมูลอยู่
2. เมื่อทำเสร็จแล้วให้ไปทำการ Generate Plugin กับ Propagate Plugin อีกทีนึง แล้วทำการตรวจสอบดูว่ามีแล้วหรือไม่ตามข้อ 6
3. ถ้ายังไม่มีให้ใช้วิธีการ Copy ข้อมูลไปเพิ่มในไฟลล์ plugin-cfg.xml (โดยดู Path ว่าอยู่ที่ไหนได้จากตอน propagate Plugin บอกประมาณว่า จาก ที่ไหนไปไหนให้ Copy ไปทับตรงจาก Example Path --> /data/IBM/WebSphere/AppServer/profiles/Dmgr01/config/cells/ PBITAPPDEV01Cell01/nodes/ihsnode03/servers/webserver1/plugin-cfg.xml)
หมายเหตุ วิธีการเพิ่มข้อมูลเองไม่ควรจะทำเพราะว่า ถ้าเรา Generate Plugin ใหม่ข้อมูลที่เพิ่มจะหายไป ต้องการวิธีแก้ที่ Websphere

8. ตรวจสอบอีกทีว่าหน้าเวบขึ้นได้หรือไม่ (เช็คที่วงแลนเดียวกัน)

9. ในกรณีที่วิ่งจาก Internet หรือ Intranet แล้วยังไม่ได้จากข้อ 6 ต้องตรวจสอบตัว Reverse Proxy, Load Balance, …. ดูว่าได้มีการ Config ผิดหรือไม่ถึงยังไม่สามารถจะไปที่หน้าเวบนั้นได้

วันอังคารที่ 17 เมษายน พ.ศ. 2550

Example Config Network (For Web Server and Application Server)



จากรูปจะดูแยกเป็นสองส่วนคือ Web Zone จะเป็นส่วนที่รับ Request เข้ามาจะมี Web Server และส่วนของ Application Zone เป็นส่วนที่มี Application Server อยู่
1. จากรูป Web Server จะเห็นได้ว่ามี IP ในแลนนั้นจะเป็น 10.221.7.120 แต่ถ้า Web Server จะวิ่งออกไปข้างนอกนั้น ก็จะเป็นอีก IP นึง ซึ่งจากรูป IP 172.20.3.1 จะเป็น IP จาก Internet วิ่งเข้ามา (ซึ่งบางทีจะมีอุปกรณ์บางอย่างกั้นก่อนเข้ามาเช่น Reverse Proxy, Load Balance) ส่วนอีกด้านนึงจะเห็นว่า Web Server จะวิ่งไปติดต่อกับ Application Server นั้นได้จะต้องวิ่งไปด้วย IP 192.168.0.50(IP Intranet) ซึ่งทางฝั่งของ Application Zone นั้นมี Load Balance สามารถวิ่งที่ IP 192.168.0.20(IP Intranet) ได้เลย แล้วตัว Load Balance จะจัดการเองว่าให้วิ่งไปที่เครื่องไหน
2. ถ้าในกรณีของ Websphere นั้นเราจะให้ตัว Websphere จัดการเอง เราเลยไม่สามารถที่จะให้มันวิ่งผ่าน Load Balance ได้ เลยจำเป็นต้องทำ Forwarding จากเครื่อง Aplication Server ออกมาข้างนอก โดยจะเป็น IP 192.168.0.1 กับ IP 192.168.0.2 แทน
Posted by Picasa

วันพฤหัสบดีที่ 12 เมษายน พ.ศ. 2550

วิธีการดูว่าจะขอเปิด Firewall จากฝั่ง Application Server หรือ Web Server

1. ต้องตรวจสอบ IP ของเราก่อนว่าจะวิ่งจากไหนไปไหน โดยเราจะต้องแบ่งประเภทของ IP ที่มีอยู่ที่เครื่องก่อน
· IP ในวงแลนเดียวซึ่งจะสามารถวิ่งอยู่แค่ในส่วนวงแลนเดียวกันเท่านั้น ไม่สามารถที่จะใช้อ้างอิงจากข้างนอก เข้ามาข้างในได้ และจากข้างในไปข้างนอกได้ (ex. 10.221.8.21)
· IP Intranet เป็น IP ที่ใช้สำหรับในองค์กร ซึ่งจะเป็น IP ที่คนที่อยู่ในองค์กรเดียวกันจะวิ่งหากันด้วย IP ตอนจะขอเปิด Firewall จะต้องดูที่ IP นี้เป็นหลัก (ex. 192.20.3.1)
· IP Internet เป็น IP ที่ให้คนทั่วไปจากข้างนอกเข้ามาใช้งานได้

2. ในกรณีที่มี Web Server และ Application Server ให้เช็คว่า ถ้าวิ่งออกจากเราไปหาคนอื่นให้วิ่งจาก Application Server ไปยัง Web Server ของคนอื่น แต่ถ้าคนอื่นวิ่งมาให้เปิดจากฝั่ง Web Server

3. ถ้ามีเป็น Cluster นั้นให้เปิด Firewall ทั้งสองเครื่องที่วิ่งไปเพราะเราจะไม่รู้ว่าวิ่งจากเครื่อง Application Server ไหนกรณีที่มี Load Balance นั้นให้ขอเปิดในส่วนที่วิ่งเข้ามาที่ Load Balance แล้วขอจาก Load Balance มา Web Server ไม่ต้องขอจาก Web Server

วันจันทร์ที่ 9 เมษายน พ.ศ. 2550

วิธีตรวจสอบ Connection WSDL

วิธีตรวจสอบ Connection WSDL
1. ให้เช็คก่อนว่า Firewall เปิดหรือยัง สามารถติดต่อไปถึงเครื่อง Server ได้หรือเปล่า โดย


#telnet [IP Address] [Port]

ถ้าไม่มีการ Time Out ก็แสดงว่าสามารถ ติดต่อถึงเครื่อง Server นั้นได้แล้ว
ถ้า Time Out ให้ขอเปิด Firewall จากเครื่องที่เราเทส ไปยังเครื่อง Server

2. ตรวจสอบว่าต้องวิ่งผ่าน https หรือเปล่า ถ้าวิ่งผ่านให้ทำการ Trust Certificate ซะก่อนโดย ทำที่ Server (ไม่ใช่ที่ Application หรือ ear file เด็ดขาด)


Example Config SSL บน Aplication ซึ่งไม่ควรใช้
System.setProperty("javax.net.ssl.trustStore", trustStoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePwd);
System.setProperty("javax.net.ssl.keyStore", keyStoreFile);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePwd);


3. Test WSDL โดย Test จาก คลิกขวาจากไฟลล์ WSDL แล้วเลือก Web Services à Test with Web Services Explorer


4. หลังจาก Test ผ่านข้อ 3 แล้วให้ทำการ Test โดยการ Generate Stub Call ไปเรียก Web Services (เขียนเรียกจาก jsp) โดยเลือก WSDL ไฟลล์ แล้วคลิกขวาเลือก Web Services à Generate Java bean skeleton แล้วก็ Next จนจบ


Example วิธีการเรียกจากการ Generation เอง (เรียกผ่าน Proxy File)
UMarket_PortType service = new UMarket_PortTypeProxy();
StandardBizRequest request = new StandardBizRequest();
StandardBizResponse response = service.activate(request);


5. ถ้าไม่สามารถเรียก ข้อ 4 ได้ (Exception จะประมาณว่า Exception BeanDeSerializable) อาจจะเป็นเพราะเราไปเรียก Web Service กันคนละ Server ให้ทำการขอทางด้านที่ให้ Web Services มา Generate Sub Call มาเป็น Jar File ให้ แล้วลองเรียก ผ่านอีกทีนึง (อาจจะต้องใช้ axis.jar จากทางนั้นด้วยเพราะบางทีใน Websphere จะเป็น version เก่า)


Example ในการเรียก
PctVoiceFaxServiceSoapBindingStub stub = null;
VoiceFaxServiceServiceLocator locator = new VoiceFaxServiceServiceLocator();
VoiceFaxService faxservice = locator.getPctVoiceFaxService(new java.net.URL(faxURL));
stub =(PctVoiceFaxServiceSoapBindingStub)faxservice;


หมายเหตูในกรณีที่หาเมนูไม่เจอให้เพิ่มเมนูได้ที่
1. Window --> Preferences
2. ไปที Workbence --> Capabilities
3. ให้ไปติ๊กทั้งหมดใน Web Service Developer
4. หลังจากนั้นคลิกขวาแล้วจะมีขึ้นมา

วันพฤหัสบดีที่ 15 มีนาคม พ.ศ. 2550

Portlet คือ

เอามาจาก Narisa ครับ

http://www.narisa.com/forums/lofiversion/index.php?t4749.html

Portal หรือบางคนเรียกว่า Dashboard เป็น front end ให้ผู้ใช้สามารถดู/วิเคราะห์/ใช้ข้อมูลจากองค์กรตามลักษณะงานของผู้ใช้ เช่น Portal ของฝ่ายขายจะมีข้อมูลผลิตภัณฑ์จากฝ่ายผลิต ข้อมูลสินค้าคงคลังจากฝ่าย inventory ข้อมูลยอดขายของตน และอื่นๆ ในขณะที่ Portal ฝ่ายลูกค้าสัมพันธ์จะแสดงข้อมูลของบริษัทในรูปแบบอื่น ประเด็นสำคัญคือการใช้ single sign-on ล๊อกอินครั้งเดียว แล้วสามารถดึงข้อมูลจากหลายๆระบบในองค์กรได้ครับ

จากคุณ นายข้าวโพดหวาน

วันจันทร์ที่ 12 มีนาคม พ.ศ. 2550

IOC คืออะไร

ก๊อบมาจาก http://cp27.linux.eng.chula.ac.th/index.php?act=Print&client=printer&amp;amp;amp;f=13&t=1031 มันต้องล็อกอินอ่ะ

วันนี้ว่างครับ เรามาเริ่มที่ IoC กันก่อนดีกว่า 1. Introduction to Spring Frameworkบอกไว้ก่อนว่า code ทั้งหมดเป็น C#1.1 IoCก่อนจะไปดู Spring เรามาทำความเข้าใจกับ IoC ก่อน1.1.1 IoC ย่อมาจากอะไรInversion of Control1.1.2 ความหมายของ IoCความหมายตรงตัว แต่การแปลตรงตัวอาจจะยังไม่ชัดเจนเท่าที่ควร การอธิบายด้วย code ดีที่สุดครับ
CODE
public interface IA { int I { get; } IB B { get; }}public class A : IA { private int i; private IB b; public int I { get { return i; } } public IB B { get { return b; } } public A() { i = 100; b = new B1(); }}public interface IB {}public class B1 : IB {}public class B2 : IB {}
จากไอ้ code เวรข้างบน ดูเผินๆ มันก็ไม่มีอะไรที่ไม่ดี แต่ข้อจำกัดของมันคือ ไอ้ Properties ทั้งสองตัว ของ A มันถูก Hardcoded ไว้แล้ว ถ้าอยากเปลี่ยน ต้องมาแก้โค้ด ของ A อย่างเดียวเท่านั้นต่อมาเรามาดูไอ้สิ่งที่เรียกว่า IoC กัน
CODE
public class AWithIoCByConstructor : IA { private int i; private IB b; public int I { get { return i; } } public IB B { get { return b; } } public AWithIoCByConstructor() : this(100, null) { } public AWithIoCByConstructor(int i, IB b) { this.i = i; this.b = b; }}public class AWithIoCBySetter : IA { private int i; private IB b; public int I { get { return i; } internal set { i = value;} } public IB B { get { return b; } internal set { b = value;} }}public class AFactory { public IA CreateAWithIoCByConstructor() { return new AWithIoCByConstructor(100, new B1()); } public IA CreateAWithIoCBySetter() { a = new AWithIoCBySetter(); a.I = 100; a.B = new B1(); return a; }}
อย่างที่เห็นครับ ไอ้ข้างบนนี้เรียกว่า IoC คือ จะมีเมทอดอื่นมาใส่ค่าที่ต้องการให้กับตัว instance ของเรา ตัวอย่างข้างบน ใช้ FactoryMethod Pattern ไอ้ IoC (ที่กูคิดออก) มีอยู่สองแบบ คือ ใส่ค่าผ่าน Constructor กับ ผ่าน Setter ซึ่งเลือกใช้ตามความชอบจะเห็นว่า ถ้าเราอยากได้ B2 แทน B1 ก็ไม่จำเป็นต้องแก้ AWithIoC* เลย แก้ตัวFactoryแทน ภาระที่เพิ่มขึ้นก็คือต้องมาเขียน ไอ้การใส่ค่าเองแต่!!! สุดท้าย ก็ต้องมีการ แก้ code อยู่ดี กูมีทางออกง่ายๆครับ ใช้ property file เอาก็ได้ว่า เราจะใส่ค่าอะไรบ้าง วิธีนี้ทำให้ไม่ต้องแก้ code เลยครับ ส่วนนี้เป็นเรื่องของ IoC ครับ จะยังไม่พูดถึง Spring แต่จะบอกไว้ก่อนว่า Spring ก็มีวิธีคล้ายๆกันนี้ ทำให้ไม่ต้องแก้ code เลยคิดว่าตอนนี้คงเข้าใจ IoC แล้ว (และ คงเข้าใจแล้วว่า Spring ไว้ทำอะไร) ต่อไป จะพูดถึง DI1.2 DI1.2.1 DI ย่อมาจากอะไรDependency Injection1.2.2 ความหมายของ DIไอ้ DI จริงๆแล้วมันก็คือส่วนที่น่าสนใจของ IoC เนี่ยแหล่ะครับ แต่เป็นชื่อที่นิยมใช้กันมากกว่า เพราะว่า มันเห็นภาพมากกว่าไอ้ IoC ถ้าดูจากไอ้ interface IA กับ IB ใน code ของ IoC ข้างบน IB เรียกว่าเป็น Dependency ของ IA คำว่า Dependency Injection คือไอ้การ ใส่ค่าจาก เมทอด ข้างนอก นั่นเอง (โดยส่วนตัวแล้ว คำว่า DI มันเห็นภาพชัดกว่า ไอ้คำว่า IoC)จริงๆแล้วมันจะมีอีกคำ คือ Dependency Lookup (J2EE สุดสมันใช้วิธีนี้ด้วย JNDI) ซึ่งมันไม่ค่อยช่วยอะไรมาก จะไม่ขอพูดถึง1.3 Java Beanเนื่องจาก Spring Framework เริ่มต้นที่จาวา งั้นเรามารู้จักจาวาบีนเวรก่อนเนื่องจากความกระแดะของใครสักคน มันเสร่อ ตั้งชื่อไอ้คอมโพเนนท์ที่เขียนด้วยจาวาเพื่อต่อกันได้ด้วยการลากแปะ ว่า จาวาบีน แปลตรงตัวว่า เมล็ดกาแฟ ต่อจากนี้ขอเรียกว่า นัดถั่วเหตุเกิดจากการทำ dynamic binding ของ Java (ซึ่งเสร่อมาก) ทำให้ถ้าคนไม่รู้พื้นฐานอาจจะงงได้ ถ้าคนเขียน C++ มาจะรู้ว่า ตัวคนเขียนจะต้องระบุด้วยว่าจะทำ dynamic binding ของ method ไหนบ้าง ด้วยการใช้ keyword virtual ไว้เวรจาวามันเสร่อทำให้ทุก method เรยครับ (อันนี้ไม่ว่ากัน) แต่ instance varaible จะไม่มีการใส่ virtual เข้าไปให้ (คิดว่า C++ ก็ไม่สามารถใส่ virtual เข้าไปได้นะ) ทำให้ไม่สามารถทำ dynamic binding ได้ ผลก็คือ ทำ polymorhpsm ของ instance variable ไม่ได้นั่นเองไอ้ผลข้างบน ทำให้ต้องเขียน method มาใช้ในการ อ่านค่า หรือ ตั้งค่า ของ instance variable นั่นเองแต่ถ้าเขียนมั่วๆแม่งก็จะทำให้การใช้คอมโพเนนจาวาด้วยการลากแปะมันไม่เวิร์คเพราะว่า refection ไม่สามารถแยกแยะได้ว่าอันไหนเป็นเมทอดในการอ่านค่า ตั้งค่า หรือ อื่นๆ มันก็เลยตั้งคอนเวนชั่นขึ้นมา ซึ่งหลักๆก็คือ ไอ้ setter getter นั่นเองสรุปแบบง่ายๆได้ว่า นัดถั่วคือ จาวาคอมโพเนนที่สามารถทำการลากแปะในโปรแกรมที่สร้างขึ้นมาได้ (ให้คิดถึง การเขียนวินโดว์วีบีก็ได้ นะ) ซึ่งไอ้คลาสเวนจะมี ชื่อ เมทอดที่เป้น setter ว่า set แล้วตามด้วย ชื่อ instance variable มี argument เดียว กับ getter ซึ่งขึ้นต้นด้วย get แล้วตามด้วย ชื่อ instance variable ไม่มี argumentตย.public int getCount() { return count; }public void setCount(int count) { this.count = count; }1.4 Spring Frameworkหลักๆแล้วไอ้ เวร Spring Framework คือ IoC แต่มันจะมีส่วนที่เพิ่มมาด้วยคือ AOP ซึ่งน่าสนใจนิดหน่อย เมื่อเทียบกับ IoCรู้สึกว่าไอ้การพิม Spring Framework มันยาวไปหน่อย ต่อจากนี้ขอเรียกว่า ไอ้ปิง1.4.1 Spring Framework's IoCไอ้ปิงมันมี คลาสชื่อ BeanFactory มาให้ ซึ่งไอ้คลาสนี้ มันจะไปอ่านคอนฟิกไฟล์ที่เราใส่ให้มัน แล้วทำการ สร้าง factory ให้ ข้อดีที่เห็นแวบแรกคือ เราไม่ต้องเขียน FactoryMethod เองเรยดูตัวอย่างกันก่อน
CODE
XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("a.xml"));IA a = (IA)factory.getBean("MyA");
ส่วน a.xml หน้าตาแบบนี้
CODE

ไอ้ตัวอย่างข้างบนนี้เอาไปใช้จริงไม่ได้ เพราะจริงๆแล้วไอ้ attribute class ต้องเป็น FullClassNameอธิบายวิธีใช้กันหน่อย XmlBeanFactory() เป็นคลาสที่อ่าน configure ที่เป็น xml มันจะมี Factory อื่นๆด้วย ซึ่งเลือกใช้กันเอาเอง แต่ที่สำคัญคือ getBean() ครับ สิ่งที่ใส่เข้าไปคือ alias ของ คลาสที่เราต้องการ ในที่นี้ MyA คือ AWithoutIoC ถ้าเกิดเราต้องการเปลี่ยน คลาสก็แค่มาแก้ a.xml ก็จบ ไม่ต้องแก้ code เลยตัวอย่างข้างบนนี้มันยังไม่ได้แสดงความเจ๋งของ DI นะ เป็นแค่ DL เท่านั้นอีกอย่าง ไอ้ปิงจะคิดเอาเองว่าทุก instance ของคลาสที่เราใส่ alias ให้มัน เป็น singleton ระดับ factory แปลเป็นภาษามนุษย์ว่า ในหนึ่ง BeanFactory จะมี instance ของ MyA แค่อันเดียวเท่านั้น จะ getBean() กี่รอบก็ได้ตัวเดิม ถ้าเราอยากได้แบบไม่ singleton ก็จะมี attribute ให้ใส่เพิ่มใน คราวนี้เรามาดูความเท่ของ ไอ้ปิง กับ DI ดีกว่า กูจะเปลี่ยนแค่ a.xml นะ (ขี้เกียจเขียน เพิ่ม)
CODE

จากโค้ดด้านบน เห็นชัดๆเรยว่า ถ้าอยากได้ instance ของ class A ก็แค่ขอจาก method getBean("MyA") ของ ไอ้ปิง ส่วนค่าต่างๆ ไอ้ปิงทำให้ โดยที่ไม่มีการ hardcoding เรย ถ้าเราอยากเปลี่ยนก็เปลี่ยน ค่าใน a.xml เอา (จริงๆแล้วไอ้ปิงสามารถทำ DI แบบ ผ่าน constrcutor ได้ด้วยแต่ไอ้ตัวอย่างข้างบนเป็นแบบผ่าน setter)ประโยชน์ของ DI ที่ไอ้ปิง มีให้ สามารถนำไปใช้ต่อได้กับ lib อื่นๆ เช่น J2EE Hibernate AXIS2 AspectJ และอื่นๆ(คิดไม่ออก) โดยที่ไม่จำเป็นต้องมีการเขียน code ของ ไอ้สิ่งที่นำมาใช้เรยด้วยซ้ำ นี่แหล่ะความเท่ของมัน

AOP คืออะไร

ผมก๊อบข้อมูลมาให้ลองอ่านกันดูครับ จะเก็บไว้อ่านเองด้วยนั่นล่ะ ง่ายต่อการค้น อิอิ

AOP เอาไว้แก้ปัญหาเรื่อง Cross cutting concern นะ
แปลเป็นไทย cross cutting concern ก็คือ สิ่งที่เราต้องสนใจที่ตัดผ่านสิ่งที่เราสนใจ

ยกตัวอย่างละกัน เราจะทำระบบอะไรสักอย่าง เช่น โอนเงินระหว่างบัญชี จากธนาคารละกันนะ
ในส่วนนี้ concern หลักของ bussiness ก็แค่ ลดเงินของ บัญชีนึง แ้้ล้วไปเพิ่มใส่อีกบัญชีนึง

แต่จากระบบนี้ เราจะมี cross cutting concern ที่ตัดผ่านงานเราเยอะแยะเลย เช่น การใส่ใจเรื่อง security authentication, transection management, logging message, presistance, availability ต่างๆ

พวกนี้อาจจะเป็นทั้ง functional หรือ non-function requirement ของระบบก็ได้ค่ะ

จะเห็นว่าในระบบเรานี้ นอกจากส่วน โอนเงิน cross cutting concern เหล่านี้มันลากตัดผ่าน ระบบอื่นๆ อีกเพียบเลย

บางระบบ อาจจะมี แค่ logging แต่ไม่มี security authen
บางระบบ ก็ใช้ concern ต่างๆ พวกนี้ไม่เท่ากัน

เวลา implement ด้วยแนวทาง OOP จึงทำให้เกิดปัญหาต่างๆ คือ
- concern เหล่านี้ลากตัดผ่านกระจัดกระจาย ทั่วไปในงานเรา (scattering) บางงานใช้บ้าง ไม่ใช้บ้าง
- โค๊ดของงานเราในแต่ละ modular ยุ่งเหยิง (tangling) เพราะมัวแต่ไปจัดการเรื่อง cross cutting เหล่านี้ ทั้งที่จริงๆ แล้ว bussiness ของงานมันแค่นิดเดียวเอง

เมื่อเป็นเช่นนี้แ้ล้วก็ระบบก็จะมี low cohesive เกิด high couple ไ่ล่ code ก็ยาก แ้ล้วก็ reuse ได้ยากอีกเช่นกันนะ

แนวทางใหม่ที่นำเสนอขึ้นนั่นคือ AOP (aspect oreinted programming)ค่ะ
aop สามารถนำมาประยุกต์ให้เข้ากับ OOP ได้อย่างดี ช่วยแก้ปัญหาที่พบได้เร็วขึ้น
concern แยกออกจากกันอย่างชัดเจน สามารถ trace concern เหล่านี้ได้มากกว่าค่ะ

ลองหาเอกสาร AOP เพิ่มเติมดูละกันนะคะ
สำหรับ JAVA ถ้าอยากเขียนงานให้สามารถทำ AOP ได้ลองศึกษา AspectJ ดูละกันค่ะ

จากที่รักบอกมา เจ้าค่ะ

หนูเป็นเด็กอยากรู้อยากเห็น เจ้าค่ะ


จากคุณ deans4j แห่ง Blognone.com http://www.blognone.com/node/1426





Review
AOP หรือ aspect-oriented programming (ใน thesis ป. โท ผมเมื่อ 3-4 ปีก่อน ใช้คำว่า
"การโปรแกรมเชิงลักษณะ" ครับ) เป็น paradigm สำหรับแก้ปัญหาความซ้ำซ้อนของ code แนวขวาง
(crosscutting concern) AOP พิจารณาจุดใน program flow เช่น constructor, method
และอื่น ๆ เป็น joinpoint abstraction และยอมให้จับกลุ่มจุดเหล่านั้นด้วยคำอธิบาย
เรียกว่า pointcut สำหรับ code ที่จะให้ทำงานที่ pointcut จะเรียกว่า advise code
ซึ่งจะสามารถระบุได้ว่าจะให้ทำงานในตำแหน่งอ้างอิงใดกับจุดที่รวบไว้โดย pointcut นั้นๆ เช่น before, after,
และ around ครับ นอกจากนี้ AOP ยอมให้ประกาศ field, method และอื่น ๆ เพิ่มเข้าไปใน code เดิม
ซึ่งเรียกว่า introduction หรือ inter-type declaration และทั้งหมด
ก็รวบอยู่ในหน่วย ๆ เดียวเรียกว่า aspect

Proxy-based AOP
Spring framework ดังสุดในกลุ่มนี้ (อย่างน้อยก็จากมุมมองของผม) สำหรับ aspect ที่ spring เน้น
ก็คือ Transactional และอื่น ๆ เมื่อมองจาก AOP การจัดการ transaction ก็เป็นเพียง aspect เดียวเท่านั้นครับ
ซึ่งจริงๆ เราสามารถสร้างและใช้ aop ได้ในหลายแนวทาง การติดอยู่กับ aspect ที่มีมากับ framework หนึ่ง ๆ
จะทำให้ code บางส่วนซ้ำซ้อนในที่สุด

ผมจึงคิดว่าจุดที่ต้องส่งเสริมกันคือความเข้าใจพื้นฐานในการแยก aspect ออกจาก object-orieted code
และที่อยากให้หลายท่านลองกันก็คือ aspectj ครับ

Aspect-Oriented System
AspectJ เป็นภาษาและระบบ aspect สำหรับ Java ที่พูดได้ว่า powerful ที่สุด ใน AspectJ 1.5 ที่เพิ่ง released
เมื่อต้นปีได้สนับสนุน Java 5 อย่างเต็มตัวทั้งในเทอมของภาษาและสถาปัตยกรรม
AspectJ 1.5 สนับสนุนการประกาศ pointcut สำหรับ annotation และทำงานร่วมกับ generic ได้
Java 5 อนุญาตให้ระบุ agent สำหรับเปลี่ยนแปลง bytecode ขณะ load class ขึ้นไปประมวลผล
และ AspectJ 1.5 ก็ใช้ความสามารถนี้ได้อย่างดี

Aspect Refactoring
แนวคิดในการสร้างและใช้ aop อยู่ที่พื้นฐานความเข้าใจในการแยก aspect ออกมาจาก object-oriented code ครับ
เราจะเห็นประโยชน์ของ aop ชัดขึ้นไปอีกระดับนึงตามตัวอย่างนี้ครับ
เมื่อ code ชุดนึง maintain ด้วยทีม A และเป็น production แล้ว
ทีม B ถูก set ขึ้นเพื่อแก้ปัญหาบางอย่างที่ต้องเพิ่มความสามารถให้ code หลัก
ทีม B เข้าถึง source code ได้แต่การ patch code ที่มีการกระจายตัวสูงทำให้ต้องแก้ไข code แทบทุกไฟล์ใน project
วิธีการที่ ทีม B สามารถทำได้ด้วย AOP ก็คือ เลือก code มาบางส่วน และเริ่มต้นพัฒนาด้วย OOP ก่อน เมื่อเห็นว่า code ทำงานได้แล้ว
ก็พิจารณาจุดตัด (joinpoint) และดึง code ส่วนที่เพิ่มเข้าไปใหม่เหล่านั้นออกมาเป็น aspect
จากนั้นก็ทดสอบสร้าง pointcut เพื่อให้ aspect ที่สร้างขึ้นสามารถสาน (weave) เข้าไปใน code ทั้งหมดได้
โดยการ test ควรทำด้วย static weaving (การสาน code ที่เปลี่ยนแปลง .class ตั้งแต่เวลา compile โปรแกรม)
เมื่อ test ระบบเรียบร้อยแล้ว และคาดหวังว่าระบบจะทำได้โดยไม่มีข้อผิดพลาดแล้ว ก็ให้แยก aspect ออกมาเป็น .jar ต่างหาก
และใช้ javaagent เป็นตัวทำ load-time weaving ขณะ runtime และ deploy ลง container
ด้วยแนวคิดจากตัวอย่างที่ผมยกขึ้นมาจะเห็นได้ชัดว่ามีการแบ่งความรับผิดชอบชัดเจนมาก
ขึ้นใน team นั่นคือ
ทีม A สามารถ maintain code หลักต่อไปได้ และ ทีม B เพิ่มความสามารถให้ระบบได้โดยที่ไม่ต้องไปทะเลาะกับทีม A
เช่นเมื่อระบบรวน ทีม B ก็สามารถยกเลิก aspect ได้โดยปิด javaagent และแยกได้ชัดเจนว่า bug ที่เกิดขึ้นเนื่องจากระบบเดิมหรือตัว aspect ใหม่

คิดว่าแนวทางที่ผมเขียนมานี้คงทำให้หลาย ๆ ท่านได้ idea ในการสร้าง aspect เองเพื่อใช้ในองค์กรนะครับ

จากคุณ cblue แห่ง narisa.com http://www.narisa.com/forums/index.php?showtopic=11868

วันศุกร์ที่ 9 กุมภาพันธ์ พ.ศ. 2550

การส่ง SMS ภาษาไทยผ่าน SMPP Protocol

SMPP Protocol คือ อะไร สามารถอ่านได้ที่ narisa , wikipedia

สามารถที่จะโหลด Library Java ได้ที่นี่

วิธีการให้ส่งภาษาไทยได้นั้น ต้องดูใน Spec ของระบบที่จะรับว่ารองรับหรือเปล่า และต้องใช้ Encode ชนิดไหนน่ะครับ แต่ก็ใช้ส่งเป็น UTF-8 แต่บอกตัว Library ให้ส่งเป็น UCS2

ดังตัวอย่างครับ


AlphabetEncoding msgEncoding = new UCS2Encoding();
SubmitSM sm = (SubmitSM) myConnection.newInstance(SMPPPacket.SUBMIT_SM);
sm.setDestination(new Address(0, 0, mobile)); <-- Set Destination Mobile
sm.setSource(new Address(0,5,sourceMobile)); <-- set Sendername (อันนี้แบบเป็น Text File แต่ตอบกลับไม่ได้ครับ)
sm.setMessageText(message, msgEncoding);
sm.setMessageEncoding(msgEncoding);
sm.setRegistered(1);
sm.setReplaceIfPresent(1);