go to http://oracle.in.th

Tuesday, January 12, 2010

ขั้นตอนการ Install Oracle Enterprise Linux 5 (OEL5) และการทำ Pre-Installation Oracle 11g

ขั้นตอนการ Install Oracle Enterprise Linux 5 (OEL5) และการทำ Pre-Installation Oracle 11g

ขั้นตอนการ Install Oracle Enterprise Linux 5 (OEL5) ทำดังนี้
1. เปิดเครื่องโดยใส่แผ่น DVD หรือ CD ที่มี OEL5


2. ที่หน้าจอนี้ให้กด Enter เพื่อทำการ Boot
หมายเหตุ ถ้าไม่กด Enter ภายใน 60 วินาที ระบบจะทำการ Boot ให้เองโดยอัตโนมัติ



3. ที่หน้าจอ "Welcome to Enterprise Linux" ให้กดปุ่ม Tab เพื่อเลื่อนไปยัง Skip จากนั้นกด Enter



4. ที่หน้าจอ “Enterprise Linux” ให้กด Next



5. ที่หน้าจอ "Language Selection" ให้เลือกภาษาที่เหมาะสมจากนั้นกด Next



6. ที่หน้าจอ “Keyboard Configuration” ให้เลือกรูปแบบที่เหมาะสม จากนั้นกด Next
จะพบกล่องข้อความเตือน กด Yes

















หมายเหตุ ถ้าเครื่องที่ทำการ Install มี Linux อยู่แล้วจะมีตัวเลือกระหว่าง "Install Enterprise Linux" หรือ"Upgrade an existing Installation"


7. ที่หน้าจอ “Disk Partitioning”ให้ Check เครื่องหมายถูกหน้า Review and Modify partitioning
layout จากนั้นกด Next แล้วจะพบกล่องข้อความเตือน กด Yes




8. ที่หน้าจอ “Disk Partitioning” ให้ทำการตรวจทาน Disk Configuration

















9. ที่หน้าจอ “Boot Loader Configuration” ให้กด Next

















10. ที่หน้าจอ “Network Configuration” ให้ Check เครื่องหมายถูกที่ Active on Boot หน้า eth0 จากนั้นกด Edit

















11. ที่หน้าจอ “Edit Interface eth0” ให้กำหนดค่าต่างๆดังนี้
- Uncheck เครื่องหมายถูกหน้า Use dynamic IP configuration (DHCP) หรือกรณีที่มีให้เลือกระหว่าง DHCP กับ Manual Configuration ให้เลือก Manual Configuration
- Uncheck เครื่องหมายถูกหน้า Enable IPv6 support
IP Address และ Prefix (NetMask) ให้ใส่ตามความเป็นจริง ในที่นี้จะกำหนดดังนี้
- IP Address : 192.168.1.120
- Prefix (Netmask) : 255.255.255.0
จากนั้นกด OK

















12. กลับมาที่หน้าจอ “Network Configuration”
ด้านล่างของ Set the hostname เลือก Manually และกำหนด hostname ตามต้องการ ในที่นี้กำหนดดังนี้
- Hostname : middleware01.co.th
ด้านล่างของ Miscellaneous Settings ให้กำหนดค่าต่างๆตามความเป็นจริง ในที่นี้กำหนดค่าต่างๆดังนี้
- Gateway : 192.168.1.1
- Primary DNS : 203.144.207.49
- Secondary DNS : 203.144.207.29
จากนั้นกด Next

















13. ที่หน้าจอ “Time Zone Selection” เลือก Time Zone ที่เหมาะสม จากนั้นกด Next


















14. ที่หน้าจอ “Set Root Password” ให้กำหนด Password จากนั้นกด Next

















15. Check เครื่องหมายถูกหน้า Software Development และด้านล่างเลือก Customize Now

















16. เลือก Development และ Check เครื่องหมายถูกหน้า Legacy Software Development

















17. เลือก Base System และ Check เครื่องหมายถูกหน้า Legacy Software Development จากนั้นกด Optional Packages

















18. Check เครื่องหมายถูกหน้า compat-db จากนั้นกด Close

















19. เลือก Base System และ Check เครื่องหมายถูกหน้า System Tools จากนั้นกด Optional Packages

















20. Check เครื่องหมายถูกหน้า sysstat จากนั้นกด Close

















21. กด Next

















22. กด Next




23. รอให้ระบบทำการ Install Package

















24. กด Reboot

















25. กด Forward

















26. อ่าน License Agreement และเลือก Yes, I agress to the License Agreement จากนั้นกด Forward
















27. ที่เมนู drop down ของ Firewall ให้เลือก Disable จากนั้นกด Forward
















28. จะมีกล่องข้อความเตือน ให้กด Yes
















29. ที่เมนู drop down ของ SELinux Setting ให้เลือก Disable จากนั้นกด Forward

















30. จะมีกล่องข้อความเตือน ให้กด Yes

















31. กด Forward

















32. ตั้งค่าวันที่และเวลาให้ถูกต้อง จากนั้นกด Forward
















33. กด Forward

















34. จะมีกล่องข้อความเตือน กด Continue
















35. กด Forward
















36. กด Finish และ กด OK
















37. เมื่อทำการ Install OS เสร็จแล้ว ให้ทำการ Login ด้วย User : root และรหัสที่ได้ตั้งไว้
















38. ทำการ Install RPM ที่จำเป็นต่อการ Install Oracle เพิ่ม โดยทำการ Mount แผ่น OS ที่ทำการ Install จากนั้นดับเบิลคลิกที่แผ่นที่ Mount และเข้าโฟลเดอร์ Server




39. ดับเบิลคลิกที่ libaio-devel (ในตัวอย่างนี้เป็น OS 64-bit ถ้าเป็น OS 32-bit ให้เลือกตัว libaio-devel…i386.rpm)














40. กด Apply จากนั้น Package จะถูกทำการ Install














41. ทำการ Install อีก 2 Package คือ unixODBC และ unixODBC-devel โดยการดับเบิลคลิกเช่นเดิม (ถ้าเป็น OS 32-bit ให้เปลี่ยนไปเลือก Package ที่ลงท้ายด้วย i386.rpm)














เป็นอันเสร็จสิ้นการ Install Oracle Enterprise Linux 5 เพื่อใช้สำหรับการ Install Oracle 11g

การทำ Pre-Installation Oracle 11g บน Linux
เปิด Terminal และใช้ User : Root ในการทำขั้นตอนต่อไปนี้ทั้งหมด
1. แก้ไขไฟล์ /etc/hosts ให้มีรูปแบบดังนี้ (ปรับเปลี่ยน IP Address ให้ตรงกับที่กำหนดไว้)

127.0.0.1 localhost.localdomain localhost
192.168.1.120 middleware01.co.th middleware01















2. ตรวจสอบว่าไฟล์ /etc/hosts ถูกแก้ไขถูกต้องหรือไม่ โดยใช้คำสั่งดังนี้

hostname
cat /etc/hosts | grep `eval hostname`

หมายเหตุ เครื่องหมายที่อยู่หน้า eval และหลัง hostname คือเครื่องหมาย Grave accent (เครื่องหมายเปลี่ยนภาษาของ Keyboard ที่อยู่ด้านซ้ายบนของ Keyboard)
ผลลัพธ์ที่ได้ควรจะเป็นตามที่ได้กำหนดไว้ดังนี้

middleware01.co.th
192.168.1.120 middleware01.co.th middleware01















3. แก้ไขไฟล์ /etc/sysctl.conf โดยเพิ่มข้อความดังต่อไปนี้
# Kernel paramaters required by Oracle 11gR1
fs.file-max = 6553600
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
















4. ตรวจสอบว่าไฟล์ /etc/sysctl.conf ถูกแก้ไขถูกต้องหรือไม่ โดยใช้คำสั่งดังนี้
sysctl –p
จะแสดงค่าออกมาให้ดูดังภาพ
















5. แก้ไขไฟล์ /etc/security/limits.conf โดยเพิ่มข้อความดังต่อไปนี้
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
















6. แก้ไขไฟล์ /etc/pam.d/login โดยเพิ่มข้อความดังต่อไปนี้
session required /lib/security/pam_limits.so
session required pam_limits.so















7. แก้ไขไฟล์ /etc/profile โดยเพิ่มข้อความดังต่อไปนี้
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
















8. สร้าง User และ Group ที่จะทำการรองรับการ Install Software โดยใช้คำสั่งใน Terminal ดังต่อไปนี้
groupadd oinstall
groupadd dba
groupadd oper
useradd oracle
usermod -g oinstall -G dba,oper,oracle oracle
passwd oracle














9. แก้ไขไฟล์ /home/oracle/.bash_profile โดยเพิ่มข้อความดังต่อไปนี้
umask 022

ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH

export PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID
















10. สร้าง Directory สำหรับการ Install Software โดยใช้คำสั่งดังต่อไปนี้
mkdir -p /u01/app
chown root:oinstall /u01/app















เป็นอันเสร็จสิ้นการทำ Pre-Installation Oracle 11g บน Linux
ข้อเขียนนี้ช่วยฉัน:  

Friday, January 8, 2010

6 วิธีง่าย ๆ ที่ทำให้ Java EE เร็วขึ้น

Java
วันก่อนเขียนเรื่องการ Tuning Javascript มีคนมาถามผมว่าเราจะมีการเพิ่ม performance ให้กับ JSP อย่างไร ผมจึงนำ trick เหล่านี้มาฝากครับ
  1. ใช้ HttpSession.invalidate() เพื่อที่จะใช้ clean session เนื่องจากว่าบางครั้ง session ที่เราจองไว้นั้นถ้าหากไม่มีการใช้นานๆ ก็จะเปลืองหน่วยความจำ ดังนั้นเราจึงควรที่จะ clean session ที่ไม่ได้ใช้คืนหน่วยความจำ
  2. ในหน้าของ JSP ใดที่ไม่มีการใช้ session เพื่อเป็นการประหยัดทรัพยากรของเครื่อง Application Server เราจึงควรที่จะบอกมันไว้ว่า เราไม่มีการใช้ session ในหน้า page นี้
  3. ให้เรา Implement HttpSessionBindingListener สำหรับ bean ทุกตัวที่มี scope อยู่ใน session เพื่อที่จะให้ bean นั้น สามารถคืนทรัพยากรให้กับระบบได้โดยการใช้ method valueUnbound() เมื่อไม่มีการใช้ bean นั้นแล้ว
  4. เราควรที่จะตั้งค่า session timeout ให้เร็วขึ้น เพื่อที่จะได้คืนทรัพยากรให้กับระบบได้เร็วขึ้น เราจะตั้งค่านี้ผ่าน method session.setMaxInactiveInterval() ส่วนค่าที่เหมาะสมควรเป็นเท่าใด นักพัฒนาที่คลุกคลีกับระบบนั้น ๆ น่าจะเป็นคนที่รู้ดีที่สุด
  5. ให้พยายามใช้ที่จะใช้ include directive เช่น ในทุกที่ที่เป็นไปได้ เพราะมันจะทำงานตอน compile time แต่ถ้าใช้ jsp:include จะทำงานตอน run time ครับ
  6. พยายามใช้ cache tagging ในทุกที่ที่เป็นไปได้ครับ cache tagging จะทำหน้าที่เก็บ tag ที่ compile จาก JSP file เสร็จแล้ว เมื่อมีการเรียกใช้ในส่วนนั้นก็ไม่ต้อง compile ใหม่ สามารถดึงมาจาก cache นำไปใช้งานได้เลย รายละเอียดการทำ cache จะนำมาต่อตอนหน้าครับ

ที่มา : J2EE Performance Tuning Tips, James McGovern, Java Developers Journal

Credited by Prahs
ข้อเขียนนี้ช่วยฉัน:  

Thursday, January 7, 2010

วิธีการเก็บ Object ลง File แบบง่ายๆ (J2SE)

j2se
หลังจากหายหน้าหายตาไปหลายวัน จากที่ไปสอบมาผมก็ได้มีโอกาสมา อัพ Blog แห่งนี้ีอีกทีแล้วครับ ด้วยความที่ผมเป็นมือใหม่มากๆกับ Java และ Oracle บางทีผมหาเนื้อหามาก็อ่านแล้วไม่เข้าใจ เลยไม่อยากนำมาลงแบบผิดๆ โดยผมจะมุ่งเน้นไปที่ J2SE นะครับเพราะอย่างน้อยผมก็พอมีความรู้อยู่บ้างในเรื่องนี้

โดยผมจะอธิบายจาก SourceCode นะครับ
import java.io.*; // เป็นการนำ package java.io มาใช้ซึ่งมีตัวเก็บ object ลง file
public class WriteObject {
public static void main(String args[]){
try{File outFile = new File("employee.dat");
FileOutputStream outFileStream = new FileOutputStream(outFile);
ObjectOutputStream outObjectStream = new ObjectOutputStream(outFileStream);// 3 บรรทัดบนนี้ทำให้ทำการ write object ลง file ได้
outObjectStream.writeObject("String is an object");// บรรทัดบนเป็นการ write object ลง fileoutObjectStream.close();
File inFile = new File("employee.dat");
FileInputStream inFileStream = new FileInputStream(inFile);
ObjectInputStream inObjectStream = new ObjectInputStream(inFileStream);// 3 บรรทัดบนเป็นการเปิด file เพื่อเอามาอ่านสังเกตุว่าเปลี่ยนจาก output เป็น input
String word = (String) inObjectStream.readObject(); // ต้อง casting ด้วยทุกครั้งinObjectStream.close();
System.out.println(word);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}

ผมใช้ String มาประกอบคำอธิบายเพราะง่ายแกความเข้าใจโดยถามว่าทำไมถึง write String ลงได้ในภาษา Java String เป็น Object ชนิดหนึ่งดังนั้นก็เลย write ลงได้เลย เสร็จแล้วที่ยุ่งเกี่ยวกับ io ในภาษา java จะต้องมีการ try กับ catch ทุกครั้งที่เปิดหรือปิดไฟล์ โดยผมใช้ catch แบบง่ายๆคือ exception (ใหญ่สุด) ลองนำไป implement ดูนะครับ object ไหนที่เราจะนำมา write ลง file จะต้องทำการ implements Serializable ดังตัวอย่างต่อไปนี้
class Employee implements Serializable {}
แบบนี้เราก็ทำการ write object employee ลงไปใน file ได้แล้ว มีคำถามสงสัยเขียน comment ถามได้เลยครับผมจะรีบตอบให้เร็วที่สุด

Credited by DominixZ
ข้อเขียนนี้ช่วยฉัน:  

Tuesday, January 5, 2010

ประโยชน์ของ Web Cache ที่คุณยังไม่เคยรู้มาก่อน

เวลาผมไป implement Oracle Application Server ให้ลูกค้า ผมมักจะเจอคำถามบ่อย ๆ นะครับว่า Oracle Web Cache ไว้ทำอะไร ? ทำไมต้องมีด้วย ? จำเป็นหรือไม่ ?



นอกจากความสามารถทางด้านการ cache data
ทำให้ response time สูงขึ้นตามที่ Oracle มักจะกล่าว

ส่วนตัวผมเอง จะได้รับประโยชน์มากที่สุดจาก Web Cache
ก็คือการเปลี่ยน port และเปลี่ยน hostname ครับ

สถานการณ์ที่เจอก็คือ
บางครั้งคนที่ติดตั้ง Oracle Application Server
ไม่ได้คิดเผื่อในกรณีที่จะใช้ออก internet จริง
ก็มักจะใช้ชื่อเครื่อง hostname เป็น default ผลลัพท์ที่ได้ ก็จะเป็น

http://intraorcl01:7777

เป็นต้น

แต่ปรากฎว่าเมื่อ implement งานจริง
พบว่ามีความจำเป็นต้องเปลี่ยนชื่อและ port ให้เป็น

http://www.sample.co.th

สรุปก็คือเปลี่ยนจาก
host: intraorcl01 เป็น www.sample.co.th
port: 7777 เป็น 80

ตัวอย่างนี้ล่ะครับ Web Cache ช่วยได้,
ส่วนวิธีการทำ ผมขอยังไม่กล่าว ณ. ตอนนี้

ประโยชน์อีกหนึ่งอย่างที่ Web Cache ทำได้ และคนส่วนมากไม่ค่อยรู้ก็คือ
มันสามารถทำตัวเป็น Software Load Balancer ได้ครับ
สถานการณ์ก็คือ
สมมุติว่าคุณมี server 2 เครื่อง และต้องการให้ 2 เครื่องนี้ช่วยกันทำงาน
โดนแบ่งกันรับ Load เครื่องละ 50:50
โดยปกติ solution ก็คือคุณจะต้องซื้อ Load Balancer มาทำในส่วนนี้
แต่จริง ๆ แล้ว Web Cache ก็ทำได้เช่นกัน
โดนให้คุณสละเครื่อง PC เก่า ๆ ก็ได้นะครับ Spec ไม่จำเป็นต้องแรงมากเท่าไหร่
ติดตั้ง Web Cache นี้ลงไป มันสามารถ config
ให้ทำงานได้เสมือนเป็น Hardware Load Balancer เลยทีเดียว

ที่สำคัญ คุณยังสามารถทำ Web Cache Cluster ได้อีกด้วย ในกรณีที่คุณมี
เครื่องที่สามารถทำ Web Cache เพิ่มได้อีก 1 เครื่อง รวมเป็น 2 เครื่อง
สำหรับในกรณีที่คุณต้องการทำ High Availability ให้กับ Web Cache
ในกรณีที่เครื่องใดเครื่อง 1 พังโดยมิได้คาดหมายครับ

หมายเหตุ: ถ้าคุณลงมือจะทำจริง อย่าลืมคิดเรื่อง license ของ Oracle ด้วยนะครับ!

Credited by
Kim
ข้อเขียนนี้ช่วยฉัน:  

Monday, January 4, 2010

ทำไมเว็บไซต์ใหญ่ ๆ หลายแห่ง ถึงไม่เขียนด้วยภาษา java


ผมอ่านมาจาก Nati Shalom's Blog จึงเห็นว่าน่าสนใจดีเลยจะนำมาเล่าให้ฟังกัน

นี้เป็นข้อมูลคร่าวๆว่า เว็บไซต์ดังๆหลายแห่งเช่น Firckr, YouTube, MySpace ... เค้าออกแบบระบบกันอย่างไรใช้ Technology อะไรกันบ้าง ซึ่งสรุปได้คร่าวๆดังนี้

OS: Linux 7 - Windows 2
Web server: Apache 7 - IIS 2 - Lighttpd 2
Scripting: PHP 4 - Perl 4 - ASP.NET 2 - Python 1 - Java 1
Database: MySQL 7 - SQL Server 1 (possibly 2)

ตัวเลขข้างหลังหมายถึงจำนวนที่ web ในตารางใช้

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

ส่วนใหญ่ใช้ LAMP (Linux, Apache, MySQL, PHP) กันเยอะ แต่ก็จะมีบ้างที่พัฒนา file system ขึ้นมาเองเช่น GFS ของ Google

บางที่ใช้ cache เพื่อช่วยแก้ปัญหาคอขวดของ database
และบางที่ก็แก้ปัญหาด้วยวิธีที่พัฒนาขึ้นมาเอง แต่ละแห่งก็ใช้วิธีที่ต่างกัน

แต่ที่สงสัยคือทั้งที่ Architecture J2EE ถูกออกแบบมาเพื่อระบบขนาดใหญ่ แต่ทำไมไม่มีใครนำไปใช้??

เท่าทีอ่านดู Nati Shalom สรุปใจความได้ว่า ถ้าใช้ LAMP ในการพัฒนาระบบ ไม่ต้องกังวลเรื่องของค่าใช้จ่ายเกี่ยวกับ software

และ LAMP เสถียรพอสมควรเลยทีเดียว แต่นี้เป็นเพียงความเห็นส่วนตัวของ Nati Shalom แล้วผู้อ่านคิดว่ายังไงกันบ้างครับ

Reference
Credited by tofu
ข้อเขียนนี้ช่วยฉัน:  

Sunday, January 3, 2010

JSF คืออะไร? ทำไมต้อง JSF

ถ้าคุณจำเป็นต้องตัดสินใจเลือกว่าจะใช้กรรมวิธีใดในการพัฒนา Web Base Application ขึ้นมาในปัจจุบัน...
คุณจะเลือกอะไรดี ระหว่าง 2 กรรมวิธี ที่กำลังเป็นที่นิยมอยู่ คือ

1. พัฒนาแบบเร่งด่วน (Rapid development)

เป็นการใช้เครื่องมือในการพัฒนาที่เห็นภาพ (Visual Development) มาใช้ในการสร้างระบบ ตัวอย่างของกรรมวิธีแบบนี้ ที่นิยมก็คือการพัฒนาของค่าย Microsoft เช่น ASP.NET เป็นต้น

2. เน้นเขียนโค้ดเองเป็นหลัก (Hard core coding)
คือการที่เราเป็นคนเขียนโค้ดเองซะเป็นส่วนใหญ่ เพื่อที่จะได้สามารถควบคุมและจัดการ environment เกือบทั้งหมด สิ่งที่จะได้มาก็คือประสิทธิภาพที่ดียิ่งขึ้นของระบบนั้น ๆ เช่น การเชื่อมต่อกับฐานข้อมูล, การทำ Connection Pool เป็นต้น ลักษณะของกรรมวิธีแบบนี้ที่เราคุ้นเคย ก็คือ Java EE (Java Enterprise Edition) นั่นเอง

ทั้งสองอย่างที่กล่าวมาต่างก็มีข้อดี ข้อเสียอยู่ในตัว
ถ้าเราเลือก Java EE, นักพัฒนาก็จะต้องคอยควบคุมทุก ๆ อย่างเอง
และบางครั้งก็เป็นเรื่องหน้าเบื่อ ที่ต้องมาเขียนโค้ดขึ้นกับมือเองทั้งหมด

แต่ถ้าเราเลือกที่จะใช้ ASP.Net ล่ะ?
ข้อดีที่จะได้ก็คือ เราจะสามารถออกแบบและพัฒนาระบบได้ง่ายขึ้นมาก
แต่ข้อเสียก็คือ เราจะควบคุม Environment ต่าง ๆ ได้ยากขึ้น
เพราะเครื่องมือนั้น ๆ ไม่ได้เปิดช่องทางเอาไว้ให้เรามากพอ

จากที่ได้กล่าวมา, Sun Microsystem จึงได้ออก Framework ที่ชื่อ JSF, Java ServerFace ขึ้นมา
เพื่อที่จะประสานข้อดีของรูปแบบการพัฒนา Web Application ทั้งสองอย่างเข้ามาไว้ด้วยกัน

โดยนักพัฒนาที่คุ้นเคยกับการเขียนโปรแกรมฝั่ง Client, เช่น Swing, AWT, หรือ SWT ของ IBM
ก็จะมองว่าการพัฒนาด้วย JSF นั้น ก็มีรูปแบบที่คล้างคลึงกัน

แต่ถ้าหากนักพัฒนามีความชำนาญ JSF มากขึ้น
ก็จะพบว่า JSF นั้นยืดหยุ่นกว่าที่คิด เพราะว่า JSF ได้เปิดช่องให้เราสามารถเข้าไปออกแบบ JSF Tag ขึ้นมาใช้งานเองได้อีกด้วย จะทำให้เราสามารถประยุกต์มาใช้งานได้มีประสิทธิภาพยิ่ง ๆ ขึ้น

และยิ่งไปกว่านั้นคนที่คุ้นเคยกับ Servlet กับ JSP มาก่อน
ก็สามารถมองได้ว่า Servlet กับ JSP เปรียบเสมือนเป็น Assembly Language
ที่อยู่เบื้องหลังของ Framework JSF นั่นเอง

Reference : Prentice Hall Core JavaServer Faces 2nd

บทความที่เกี่ยวข้อง

Credited by Prahs
ข้อเขียนนี้ช่วยฉัน: