12.25.09
Log4J DailyFileAppender
วันนี้ว่างโคตรๆ ไม่มีไรทำ จิตใจไม่ค่อยอยากจะทำงานแระ อยากหยุดอย่างเดียว 555+ จริงๆเย็นนี้จะไปดู avata 3d แหละรอมาสัปดานึงแระให้คนซาๆก่อน ระหว่างนี้หาไรทำดีกว่า จริงๆว่าจะเล่านานแล้วแต่ไม่ว่างซะที วันนี้โอกาสดีเลยจัดไป
04.21.09
EHCACHE
หลังจากไม่ใด้เขียนอะไรซะนาน นึกขึ้นได้มาแวะ blog เรามั่งดีกว่า
ว่าแต่จะเขียนเรื่องอะไรดีละ….
นึกออกแล้วเอา EHCACHE นี่แหละล่าสุดที่อ่านมา
เนื่องจากว่าต้องสร้าง framework ใหม่ให้ office แล้วเขาเปลี่ยน weblogic8.1 เป็น weblogic 10 แล้วไงละ?
lib weblogic portal (weblogic8) มันก็ใช้ไม่ใด้อะจิ!!! อ้าวซวยแล้ว #%$%^$$^
งั้นเปลี่ยนใหม่ก้ได้ ก็เลยมาตามหาๆๆๆๆๆ และแล้วบุพเพสันนิวาสก็พาเรามาเจอกับ EHCACHE แล่วมัน work ป่าว?
ก่อนอื่นมาดูเรื่อง performance ซะก่อนเพราะถ้ารับ load ประมาณ 200000 tx/hr. ไม่ใหวมันก็ตายยย และแล้วก็ไปเจอ ehcache performance อ่านดูแล้วมันก็น่าจะไหวนะ
จากนั้นก็มาดู architecture มันก่อน เอาคร่าวๆพอ อย่างน้อยๆให้รูแภาพรวม ว่าเราอยู่ตรงใหนของโลก 
จากนั้นมาลอง implement กันว่ายากป่าว เพราะถ้ายากก้ไม่เอา (simple is the best)
ดูๆแล้วไม่ยากแฮะ น่าจะหมูในอวย มาดูตัวอย่าง code กัน ง่ายสุดๆ ถ้าสงสัยอะไรก้ไปที่ official site
CacheManager cacheMgr = new CacheManager();
Cache memoryOnlyCache = new Cache(cacheName, 100000, false, false, 5000, 1000);
cacheMgr.addCache(memoryOnlyCache);
Element usrChk = new Element(“key”, “value”);
memoryOnlyCache.put(usrChk);
usrChk = memoryOnlyCache.get(“key”);
cacheMgr.shutdown();
จบแล้วครับ สงสัยอะไรหลังไมค์ได้คับ
05.01.08
JOSSO
วันนี้ว่างๆระหว่างรอเพื่อนโทรมาชวนไปดูหนังเลยหาไรทำซะหน่อย ไม่รู้จะทำไรดี นี่เลยละกัน JOSSO บุ๊กมาร์คไว้นานแล้วไม่มีโอกาสได้เข้ามาอ่านซะที
จริงๆแล้วผมสนใจเรื่องนี้มานานแล้วครับแต่ไม่ค่อยได้มีเวลามาจับซะทีมัวแต่ทำอย่างอื่นอยู่ ทีแรกบ้าพลังจะพยายาม implement เอง แต่เลิกแล้วใช้ของฝรั่งดีกว่า ดีกว่าเยอะ(คิดว่านะ) ก็เลยมาตกลงปลงใจกับอันนี้นี่แหละ JOSSO (http://www.josso.org/)
หลังจากนั่งอ่านไปซักพัก เอ… เหมือนจะดีเลยแฮะ น่าสนใจสุดๆ tomcat/weblogic/jboss/etc. มัน deploy ได้หมดเลยอะแจ๋วจริงๆ เอาละมาเริ่ม workshop กันซะที

จากรูปนะครับเอาเป็นว่าผมไม่เข้าวิชาการมากละกันเอาง่ายๆ กันเลย ตัว SSO นี่แบ่งออกเป็น 2 ส่วนหลักๆก็คือ
1. Gateway คือ ตัวที่ทำหน้าที่ user authentication ที่จะเข้ามา พูดง่ายๆก็คือหน้า login นั่นแหละ
2. Agent คือ web ทีจะเข้ามาใช้งานระบบ user authentication ร่วมกับ web อื่นๆ ใน gateway ตามข้อ 1
เห็นมะมีแค่ 2 ส่วนเองง่ายโคตรๆ จริงๆแล้ว installation manual ใน web (http://www.josso.org/confluence/display/JOSSO1/Tomcat+6.0) ก้มีพอสมควรแต่ต้องอ่านหน่อย สำหรับท่านที่จะอ่านข้ามๆมั่วๆไป มีโอกาสไม่ success นะครับ เอาละ setup ตามผมเลยก้ได้ step by step ลืมบอกไปผมใช้ Tomcat6.0 นะครับ jdk6 ผมสมุติว่าท่านทำ jsp/setup tomcat เป็นแล้วนะครับ
Setup Gateway
1. ที่ %CATALINA_HOME%/bin สร้าง file ดังต่อไปนี้
file:setenv.bat
set CATALINA_HOME=C:/apache-tomcat-6.0.16
set JAVA_OPTS=-Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.conf
file:jsso-config.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?><configuration><hierarchicalXml fileName=”josso-gateway-config.xml”/></configuration>
2. Copy file josso-gateway-config.xml จาก josso\core\src\resources ที่ unzip ออกมา เอามาวางไว้ที่ %CATALINA_HOME%/bin


3. ที่ %CATALINA_HOME%/conf/ สร้าง file jaas.conf โดยมี file content ดังนี้
josso {
org.josso.tc60.agent.jaas.SSOGatewayLoginModule required debug=true;
};
4. แก้ไข file server.xml ของ tomcat โดยให้เพิ่ม
<Realm className=”org.josso.tc60.agent.jaas.CatalinaJAASRealm”
appName=”josso”
userClassNames=”org.josso.gateway.identity.service.BaseUserImpl”
roleClassNames=”org.josso.gateway.identity.service.BaseRoleImpl”
debug=”1″ />
<Valve className=”org.josso.tc60.agent.SSOAgentValve” debug=”1″/>
ไว้ที่ด้านล่างของ
<!–Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/–>
5. จากนั้น copy file josso-credentials.xml, josso-users.xml จาก josso\core\src\resources มาไว้ที่ %CATALINA_HOME%/lib
6. จากนั้นเข้าไป folder ที่ unzip josso ออกมาแล้วพิมพ์คำสั่งต่อไปนี้ตามลำดับ
set JAVA_HOME=c:\jdk1.6.0
set CATALINA_HOME=c:\apache-tomcat-6.0.14
build.bat war
build.bat install-tomcat60
build.bat deploy-tomcat60
7. จากนั้นให้ลอง start tomcat จะสังเกตว่าไม่มี error print out ออกมาที่ console
Setup Agent อันนี้ผมแนะนำให้ setup tomcat อีกตัวขึ้นมาใหม่เลยนะครับ อย่างเช่นเครื่องผมมี tomcat6.0 อีกตัวนึง run ที่ 9090
1. Copy file josso-agent-config.xml จาก josso\core\src\resources ที่ unzip ออกมา เอามาวางไว้ที่ %CATALINA_HOME%/bin
2. ที่ %CATALINA_HOME%/bin สร้าง file ดังต่อไปนี้
file:jsso-config.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?><configuration><hierarchicalXml fileName=”josso-agent-config.xml”/></configuration>
3. จากนั้นสร้าง web module ขึ้นมาแล้วมี structure ดังต่อไปนี้
SimpleSSO
-index.jsp
-login-redirect.jsp
+protected
-target.html
+WEB-INF
-web.xml
โดย detail แต่ละ file เป็นดังนี้
//index.jsp
<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″
pageEncoding=”ISO-8859-1″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-1″>
<title>Simple SSO</title>
</head>
<body>
This is a public resource.<br/>
<a href=”protected/target.html”>Protect Resource</a>
</body>
</html>
//login-redirect.jsp
<%@page contentType=”text/html; charset=iso-8859-1″ language=”java” session=”true” %>
<%
response.sendRedirect(request.getContextPath() + “/josso_login/”);
%>
//target.html
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
<title>Insert title here</title>
</head>
<body>
Hello world SSO!!!
</body>
</html>
//web.xml
<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns=”http://java.sun.com/xml/ns/javaee”
xmlns:web=”http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
id=”WebApp_ID” version=”2.5″>
<display-name>SimpleSSO</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<web-resource-collection>
<!– We’re going to protect this resource and make it available only to users in “role1″. –>
<web-resource-name>public-resources</web-resource-name>
<url-pattern>/protected/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login-redirect.jsp</form-login-page>
<form-error-page>/login-redirect.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role >
<description>Role 1</description>
<role-name>role1</role-name>
</security-role>
</web-app>
4. จากนั้น pack & deploy เลยครับ แล้วลองเข้าไปที่ http://localhost:9090/SimpleSSO/protected/target.html จะเป็นว่าระบบจะ redirect ไปที่หน้า SingOn จากนั้นให้เราไส่ user1/user1pwd แล้วระบบจะ login แล้วทำการ redirect กลับมาที่หน้า target.html
เสร็จแล้วครับ เห็นมะง่ายนิดเดียว ลองดูนะครับผมว่าน่าจะเป็นประโยชน์ต่อหลายๆคน เง้อหิวข้าวแล้วเพื่อยังไม่โทรมาอีก อะไรกันเนี่ยยยยยยยยยยยยยยยยยยยยยยย
05.17.07
Grails
Grails(http://grails.codehaus.org)
มาแว้ววววววว ในที่สุดก็ว่างได้มาเล่าซะที เนื่องจากพักนี้ฝนตกบ่อยๆ ไอ้ตกบ่อยมันก็ดีอยู่หรอกนะแต่ห้องผมน้ำมันรั่วนี้จินอนๆอยู่เซ็งเลย
เอาละเข้าเรื่องกันซะที พอดีว่าได้มีโอกาสลอง Grails ดูอะคับเลยอยากจะเอามาเล่าสู่กันฟังเผื่อจะมีคนนำไปใช้งานจริง(ก่อนผม) อิอิเริ่มเลยละกันนะ
Grails คือ ?
ผมมองว่า Grails คือ Tools ที่ช่วยในการ Generate Java Web Application โดย Web Application ที่ Generate มานี้จะครอบคลุม Function CRUD (Create,
Read, Update, Delete) น่าสนใจไช่มั้ยละอย่างน้อยก็นำมาทำส่วน admin ได้แหละ
ได้แค่ CRUD เหรอ?
ป่าวคับนั่นเป็นแค่ default การ Generate ถ้าต้องการ Function อย่างอื่นนอกเหนือจากนี้ก็สามารถเขียนเองเพิ่มเติมได้ตามใจชอบเลย
แล้วเขียนไงอะ?
ฮ่าๆๆๆ อย่าพึ่งคึกเนื่องจาก Grails นี้ใช้ภาษา Groovy ในการพัฒนา developer จึงจำเป็นต้องมีความรู้ใน Groovy พอสมควร แรกๆผมคิดจะดำน้ำไป แต่ดำๆไปซักพัก $%#@!#*?$ นี่มันเขียนบ้าไรวะ ก็เลยต้องกลับไปอ่าน Groovy มาก่อน(อิอิ) อย่างน้อยก็ต้องรู้ Syntax มันแหละ (promotion พิเศษสำหรับคอ java ไปที่นี่เลย http://groovy.codehaus.org/Differences+from+Java)
แล้ว Web Application ที่ Generate ได้มัน deploy ได้ทุก server ป่าว?
อันนี้ไม่ confirm น้าาาา แต่จะบอกว่าตัว Framework ที่ Grails มัน Generate มันจะเป็น Spring + Hibernate3 แหละอิอิ โดยส่วนตัวผมชอบคู่หูคู่ฮานี้อยู่แล้วเลยยิ่งช๊อบบบ ชอบ สำหรับบางคนอาจจะมองว่านี่เป็นข้อจำกัดก็ได้นะคับ เพราะถ้าองค์กรหรือ project ที่กำลังพัฒนาไม่ไช่ Spring + Hibernate ถ้าจะเอาตัวนี้ไป Merge ก็ต้องทำใจ
งั้น Project ผมไม่ใช้ Spring + Hibernate ก็หมดสิทธจิ?
ก็ไม่ซะทีเดียวหรอกคับ เนื่องจาก Framework ที่ Grails มัน Generate มันมี SiteMesh ด้วยนะ หวังว่าคงเอาไปช่วยไรใด้บ้าง(อิอิ)
แล้ว Tutorial เยอะมั้ย
มีข่าวดีกับข่าวร้ายเอาไรก่อน เอาข่าวดีก่อนละกันนะ Tutorial มีเยอะแยะเลยส่วนมาก Step-By-Step ด้วยนะเยี่ยมมั้ย ส่วนข่าวร้าย Tutorial ส่วนมากไม่สามารถ run ได้กับ
version 0.5.5 (lastest version) อิอิต้อง modify นิดๆหน่อยๆ(อิอิ สู้เข้านะคับ)
ขอดูตัวอย่างหน่อยจิ
ทีแรกผมว่าจะ demo ให้ดูแต่ผมว่านี่ http://grails.org/Quick+Start ก็ง่ายแล้วแหละ
โชคดีนะคับ อิอิ
05.01.07
Spring Web Flow
Spring Web Flow (http://www.springframework.org/webflow)
หลังจากที่สงสัยมานานว่า Spring MVC กับ Spring Web Flow มันต่างกันไง ก็เลยลองมาแกะๆดูซะหน่อยว่า Spring Web Flow มันเป็นไง หลังจากที่มาแงะๆดู ก็พอจะรู้คร่าวๆว่าไอ้ Spring Web Flow นี่มันก็ใช้ Spring MVC นั่นแหละทั้ง View Technology, Bean Component(loC) ต่างๆ แต่ว่าไอ้เจ้า Spring Web Flow นี่มันจะมี Flow Loader เข้ามาช่วย(หนึ่งใน bean ที่จำเป็นต้อง load ของ Spring Container) ซึ่งตัว Flow Loader นี่เองจะเป็นตัว ควบคุมแล้วจัดการ Flow ทั้งหมดในระบบ(สามารถมีได้มากกว่า 1 Flow ในระบบ) ซึ่งตัว Flow Loader นี่จะไป load flow descriptor (xml file) ซึ่ง Flow แต่ละ flow ก็จะมี id เป้นตัวระบุว่า flow นี้ชื่อไร
จากที่ผมลองๆ(ทั้งทำตามและนั่งดูเฉยๆ อิอิ) ไม่ค่อยประทับไจเท่าไหร่ ผมว่ามันคล้ายกับ JSF มากๆ บางคนอาจจะแย้งผมว่าคล้ายได้ไงวะ JSF มันเป็นเรื่องของ Component Model นี่หว่า แต่ Spring Web Flow มันเป้นเรื่องของการทำ web ซึ่งกว้างกว่า web component อีก หุหุ จริงๆแล้วเวลาเราทำ web ผมมองว่ามันก็คือการจัดการ กับ event กับ behavior ของ UI Component นั่นแหละ (งานส่วนใหญ่มีแค่นั้น)
กลับมาเข้าที่ Spring Web Flow กันต่อ(นอกเรื่องไปนานแล้ว อิอิ) เอาง่ายๆตัวที่จะต้องสนใจมี 3 ตัวหลักๆนั่นก้คือ
bean = ก็ bean ต่างๆนั่นแหละอยาก load อะไรก็ load แต่เค้าทำมาเพื่อ load พวก Web Action & Form Validator แต่จะเอาไป load พวก Transaction Control, DAO, …. ก็ตามสดวกคับ
view-state = ส่วนนี้เอาไว้แสดงผลนะ โดยจะ map กับ view ต่างๆ ขึ้นอยู่กับ View Thechnology ที่ไช้ จะใช้ JSF หรือ Struts Tiles ก็ยังไหว อิอิ แต่จะไช้ Plain JSP ก็ได้ โดยเจ้า view-state นี่แหละที่จะมี transition เป็นตัวบอกว่าเกิดไรให้ทำไร (คุ้นๆมะคล้ายกับ navigation-case ของ JSF ป่าวอิอิ) อันนี้แหละต่างจาก Spring MVC ซัดๆ(เฮ้ยเผลอหลุดภาษาบ้านเกิดแล้วตู) ซึ่งเจ้าตัว Spring MVC จะไม่มีตัว view navigation control (ซึ่งก็คือ forward ใน struts, navigation-case ของ jsf และ transition ของ spring web flow) แต่ถ้าเราจะมองว่า Spring MVC มีเฉพาะ global view navigation control ก็ไม่ผิดนะเพราะมันมีแค่ global จริงๆ
action-state = ไม่ต้องบอกก็รู้เนอะ เอาไว้ทำงานต่างๆตาม business process แล้วมันก็มี transition เป็นตัวบอกเหมือนกันกับ view-state นั่นแหละ
*เกือบลืมเจ้านี่มี conversation scope ด้วยนะ ว้าวไม่รู้ใครเลียนแบบใคร (Seam VS Spring Web Flow) แต่ชั่งเถอะจำข้อดีเขามาไช้ก็เยี่ยมแล้ว
บทความนี่ผมเขียนขึ้นจากความเข้าใจผมนะคับ อาจจะมีความคิดเห็นแทรกไปบ้างก็ขออภัยนะคับ มีไรก็ comment ได้นะคับ ให้กำลังใจก็ได้