วันเสาร์ที่ 1 กุมภาพันธ์ พ.ศ. 2557

VP8: Codec ใหม่เอี่ยมอ่องจาก Google

VP8: Codec ใหม่เอี่ยมอ่องจาก Google

หากเจ้าของลิขสิทธิ์รูปแบบวีดีโอ H.264 ทำได้สำเร็จจริงๆ YouTube ของ Google ก็อาจจะไม่ใช่ของฟรีอีกต่อไป เนื่องจากสิ่งที่เขาได้ออกมาเรียกร้องก็คือ ตั้งแต่ปี 2016 เป็นต้นไป ใครก็ตามที่นำวิดีโอ H.264 มาเผยแพร่บนหน้าเว็บไซต์จะต้องจ่ายเงินเป็นค่าลิขสิทธิ์ในการใช้งานวิดิโอรูปแบบ H.264 นี้ด้วย ซึ่งในที่นี้หมายความว่าเว็บไซต์ YouTube ที่มีแต่คลิปวิดีโอรูปแบบ H.264 จะต้องเสียเงินค่าลิขสิทธิ์เป็นจำนวนไม่น้อยเลย

นอกจากเว็บไซต์ Video Portal อย่างเช่น YouTube แล้ว ข้อเรียกร้องนี้ก็ยังมีผลกับโปรแกรมเว็บเบอร์เซอร์บางโปรแกรมด้วย ยกตัวอย่างเช่นในกรณีของโปรแกรม Firefox นั้นจะต้องมีตัวถอดรหัส H.264 ซึ่งจะต้องเสียเงินประมาณ 10 เซ็นต์สำหรับการโหลดแต่ละครั้ง ส่วนไมโครซอฟท์และแอปเปิลนั้นจะต่างออกไป เนื่องจากบริษัททั้งสองนี้ต่างก็มีสิทธิ์บัตรสำหรับ H.264 อยู่ถึง 69 รายการ ดังนั้นจึงสามารถที่ใช้แท็ก ใน HTML5 เล่นวิดีโอบนเว็บโดยตรงได้

ผลจากการเรียกร้องดังกล่าวนี้ทำให้ Google จำเป็นต้องมีมาตรการตอบโต้ โดยได้ทุ่มเงินจำนวนกว่า 100 ล้านเหรียญสหรัฐเข้าซื้อ On2 เมื่อช่วงต้นปีที่ผ่านมา แล้วนำเทคโนโลยีบีบอัดวิดีโอที่มีประสิทธิภาพสูงอย่าง VP8 มาใช้เป็น Open Source ที่ไม่ต้องเสียเงินเพื่อใช้เป็นคู่แข่งกับ H.264 โดยไฟล์วิดีโอ WebM ตามมาตรฐาน Google นอกจากจะมี VP8 เป็น Codec สำหรับภาพวิดีโอแล้วยังใช้ Vorbis ซึ่งเป็นคู่แข่งของ MP3 เป็น Codec สำหรับเสียง โดยในขณะนี้นอกเหนือไปจากโปรแกรม Chrome ของ Google เองแล้ว ไฟล์วิดีโอ WebM นี้ก็ยังได้ถูกนำไปติดตั้งใน Firefox และ Opera แล้วด้วย

อย่างไรก็ตามมาตรการตอบโต้นี้ก็อาจจะทำให้ Google ต้องเสียเงินจำนวนมหาศาลได้เหมือนกัน หากเจ้าของลิขสิทธิ์ H.264 ฟ้องร้องดำเนินคดี เพราะถึงแม้ว่าการพัฒนา VP8 ขึ้นมานั้นจะไม่ได้ใช้เทคโนโลยีในการบีบอัดวีดีโอใดๆ ของ H.264 โดยยอมลดคุณภาพของวีดีโอลง แต่โดยพื้นฐานแล้ว Codec สำหรับวิดีโอสมัยใหม่ทั้งหมดนั้น ก็ล้วนแล้วแต่ใช้เทคนิคที่เป็นแบบเดียวกันทั้งสิ้น

VP8 vs. H.264: ศึกชิงคุณภาพภาพ
เป็นที่รู้กันโดยทั่วไปว่า วิดีโอหนึ่งๆ นั้นจะประกอบไปด้วยภาพจำนวนหลายๆ ภาพประกอบรวมกัน ซึ่งในการที่จะบีบอัดภาพทั้งหมดให้ได้ดีที่สุดนั้น เพียงแค่การบันทึกภาพแต่ละภาพให้อยู่ในรูปแบบ JPEG อย่างเดียวนั้นยังไม่พอ แต่มันจะต้องมีกรรมวิธีและเทคนิคที่ซับซ้อนกว่านั้น เริ่มตั้งแต่การรวมภาพจำนวน 12-15 ภาพเข้าด้วยกันเป็น GOP (Groups of Pictures) ซึ่งในแต่ละ GOP นั้นจะมีแค่ภาพแรกเท่านั้นมีการบันทึกรายละเอียดต่างๆ ไว้เป็นภาพเต็ม (ภาพ I-Frame) โดยตัวเข้ารหัสจะมีการจัดการค่าความสว่างและค่าสีต่างๆ ทั้งหมดให้อยู่ในรูปแบบของ Macro Block ขนาด 16x16 ที่เป็นแบบเดียวกับภาพ JPEG จากนั้นจะแปลงค่าต่างๆ ของภาพเหล่านี้ให้เป็นความถี่ด้วยกระบวนการ DCT (Discrete Cosine Transformation) และตัดทอนค่าที่ไม่จำเป็นออกไปด้วยกรรมวิธีที่เรียกว่า Quantization

สำหรับภาพอื่นๆ ที่เหลือใน GOP นั้นจะแตกต่างไปจากภาพภาพแรกที่เป็นภาพเต็ม โดยมันจะภาพที่มีเฉพาะค่าความสว่างและค่าสีที่แตกต่างไปจากภาพที่อ้างอิงบันทึกอยู่ใน Macro Block เท่านั้น (ภาพ P-Frame) และเนื่องจากในกรณีส่วนใหญ่นั้น ในช่วงเสี้ยววินาทีหนึ่งๆ ซึ่งภาพแทบจะไม่มีการเปลี่ยนแปลงใดๆ เลย ดังนั้นในการตัดทอนค่าด้วยกรรมวิธี Quantization ของมันบางครั้งจึงแทบจะกลายเป็นศูนย์หรือไม่มีค่าใดๆ เหลืออยู่เลย



H.264 ได้มีการนำเทคนิคภาพ B-Frame มาใช้ประกอบเข้ากับภาพส่วนนี้ โดยมันสามารถอ้างอิงภาพในลำดับก่อนหน้าหรือภาพที่ตามมาในภายหลังได้จำนวนมากถึง 16 ภาพ ดังนั้นมันจึงช่วยทำให้ สามารถบีบอัดวิดีโอได้มากกว่าการที่มีเฉพาะภาพ P-Frame ซึ่งอ้างอิงภาพได้เฉพาะภาพก่อนหน้าเพียงแค่ภาพเดียวถึง 20 เปอร์เซ็นต์ แต่เนื่องจากเทคนิคภาพ B-Frame นี้ได้มีการจดลิขสิทธิ์ไว้และขณะนี้ก็ยังอยู่ในช่วงเวลาที่ได้รับการคุ้มครอง ดังนั้น VP8 จึงต้องจำกัดการบีบอัดภาพใน GOP ไว้เฉพาะแค่ภาพ P-Frame เท่านั้น แต่อย่างไรก็ตาม ในมาตรฐานใหม่นี้ก็มีการชดเชยด้วยภาพที่มีชื่อเรียกว่า Alternative Reference Frame ซึ่งมันจะไม่ได้ถูกแสดงขึ้นในระหว่างการเล่น แต่จะทำหน้าที่เป็นส่วนที่บันทึกข้อมูลสำหรับ Macro Block ที่ภาพ P-Frame ทั้งหลายของ GOP อ้างถึง แต่กระนั้นโดยภาพรวมแล้ว เทคนิคดังกล่าวนี้ก็ไม่สามารถทำหน้าที่ทดแทนการใช้ภาพ B-Frame ได้ร้อยเปอร์เซ็นต์อยู่ดี

ในการ Quantization เพื่อตัดทอนค่าที่ไม่จำเป็นนั้นตัวเข้ารหัสจะกำหนดระดับความแรงโดยใช้วิธี Coefficient อย่างเช่นในกรณีของตัวเข้ารหัส H.264 อย่าง x264 นั้นจะใช้ Coefficient เป็นเครื่องมือปรับแต่งความสมบูรณ์ของภาพที่ออกมา โดยจะปรับความแรงของ Macro Block ที่เป็นจุดดึงดูดสายตาให้ต่ำกว่าส่วนที่ไม่มีอะไรเกิดขึ้น ส่วน VP8 นั้นจะไม่สามารถใช้การปรับที่ลักษณะเชิงประยุกต์นี้ได้ เนื่องจากมันยังมีลิขสิทธิ์คุ้มครองอยู่ ดังนั้นในการปรับระดับเหล่านี้จึงจำเป็นต้องใช้การกำหนดค่า Coefficient ให้กับภาพแต่ละภาพตามวิธีการเดิมๆ

ตอนท้ายของกระบวนการการบีบอัด ตัวเข้ารหัส H.264 จะประเมินดูว่ามีส่วนของภาพที่มีความผิดปกติเกิดขึ้นกับภาพซึ่งเป็นผลมาจากการบีบอัดมากเกินไปหรือไม่ ซึ่งถ้ามี มันจะทำการคำนวณค่าสำหรับพื้นที่ส่วนนั้นออกไปใหม่โดยใช้เทคนิค Deblocking Filter นี้ ซึ่งใน H.264 นั้นมันสามารถปรับความแรงของ Deblocking ภายใน Macro Block ได้ ทำให้ไม่ต้องกังวลว่ารายละเอียดในภาพจะหายไป แต่ใน VP8 จะไม่สามารถใช้วิธีการแบบนี้ได้ เนื่องจากมันติดลิขสิทธิ์อยู่เช่นกัน ทำให้ต้องใช้อัตราข้อมูลที่ต่ำกว่า ซึ่งก็ส่งผลให้ความคมชัดของภาพตั้งต้องลดลงไปด้วย

ความเร็วและคุณภาพ: เปรียบเทียบ VP8 กับ Codec อื่น
แม้ลิขสิทธิ์ต่างๆ ของ H.264 จะเป็นอุปสรรคสำคัญที่คอยขัดขวางไม่ให้ VP8 สามารถที่จะแข่งขันกันในทางเทคนิคได้ แต่คุณภาพภาพที่ได้จาก Codec ตัวใหม่ของ Google นี้ก็ไม่ธรรมดาเหมือนกัน เพราะจากการทดสอบบีบอัดวิดีโอ 1080p ให้เป็น 720p ที่มีอัตราข้อมูล 3Mb/s ที่แม้ว่ามันจะไม่สามารถสู้ H.264 ที่เป็น High Profile ได้ แต่หากเป็น Baseline Profile ที่มักจะใช้กับวิดีโอในเว็บไซต์ทั้งหลายแล้ว คุณภาพของมันนั้นเรียกได้ว่า กินกันไม่ลงเหมือนกันและที่สำคัญนั้น มันดูดีกว่า Codec เก่าๆ อย่าง Xvid อย่างเห็นได้ชัดทีเดียว นอกจากนั้นการพัฒนา VP8 ตอนนี้ก็ยังเป็นแค่การเริ่มต้นด้วย ดังนั้นจึงมีความเป็นไปได้สูงที่มันจะมีประสิทธิภาพที่สูงขึ้นกว่านี้และในปัจจุบันนี้ Google ก็ได้เปิดสาขาวิจัยใหม่สำหรับเวอร์ชันต่อไปขึ้นมาแล้วด้วย ทำให้มั่นใจได้ว่า VP8 จะไม่หยุดอยู่เพียงเท่านี้อย่างแน่นอน และก็ไม่แน่ว่ามันอาจจะกลายมาเป็นรูปแบบมาตรฐานสำหรับวิดีโอบนเว็บไซต์ในอนาคตอันใกล้นี้ด้วยซ้ำ


*Peak Signal-to-Noise Ratio         **Structural Similarity

ข้อมูลเพิ่มเติมสำหรับเทคนิคการเข้ารหัสต่างๆ
ตามปกติแล้ว ลิขสิทธิ์เกี่ยวกับกรรมวิธีหรือเทคนิคต่างๆ ในสหรัฐอเมริกานั้น จะมีการคุ้มครองโดยมีระยะเวลาที่ยาวนานถึง 20 ปี และภายในมาตรฐานวิดีโอ H.264 ที่ถูกเผยแพร่ออกสู่สาธารณชนเมื่อปี 2001 ก็มีเทคนิคและกรรมวิธีต่างๆ ที่ได้รับการจดลิขสิทธิ์ไว้อยู่ถึง 1,300 รายการ ดังนั้นขณะนี้ Google จึงไม่สามารถนำเทคนิคใหม่ๆ ที่มีประสิทธิภาพสูงอย่างเช่นภาพ B-Frame มาใช้กับวิดีโอในรูปแบบ VP8 ของตัวเองได้เลย แต่จะใช้ได้เฉพาะเทคนิคเดิมๆ ที่ลิขสิทธิ์ของมันหมดอายุไปแล้วเท่านั้น

วันอังคารที่ 28 มกราคม พ.ศ. 2557

แก้ปัญหาภาษาไทย php กับ MySQL (TIS-620 กับ UTF-8)

1. การใช้ภาษาไทยกับ TIS-620

1.1 กำหนด Header ให้ใช้เป็น tis-620

<meta http-equiv=Content-Type content="text/html; charset=tis-620">

1.2 กำหนดในส่วนของ Connection 

- กรณีที่กำหนด Collation เป็น tis620_thai_ci ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES TIS620");

- กรณีที่กำหนด Collation อื่น ๆ ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET character_set_results=tis620");
mysql_query("SET character_set_client=tis620");
mysql_query("SET character_set_connection=tis620");


2. การใช้ภาษาไทยกับ UTF-8

2.1 กำหนด Header ให้ใช้เป็น utf-8 

<meta http-equiv=Content-Type content="text/html; charset=utf-8">

2.2 กำหนดในส่วนของ Connection

- กรณีที่กำหนด Collation เป็น utf8_unicode_ci ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET NAMES UTF8");

- กรณีที่กำหนด Collation อื่น ๆ ให้ใช้
$objConnect = mysql_connect("localhost","root","root") or die("Error Connect to Database");
$objDB = mysql_select_db("mydatabase");
mysql_query("SET character_set_results=utf8");
mysql_query("SET character_set_client=utf8");
mysql_query("SET character_set_connection=utf8"); 

เชื่อมโยง mysql 3 ตาราง

เชื่อมโยง mysql 3 ตาราง

ก่อนอื่นต้องดูด้วยว่า เราต้องการทำการ JOIN  แบบไหน เพื่อให้ได้ผลลัพธ์ ตามที่ต้องการด้วยน่ะครับ ซึ่ง

ประเภทของการ JOIN ใน SQL Server ประกอบไปด้วย 
INNER JOIN
OUTER JOIN
CROSS JOIN
SELF JOIN

INNER JOIN  
           เป็นการเชื่อมตารางตั้งแต่ 2 ตารางขึ้นไปเข้าด้วยกันโดยอาศัยคอลัมน์ ที่มีความสัมพันธ์กันมาทำการเชื่อมโยงข้อมูลเข้าด้วยกัน การเชื่อมโยงนี้จะมีการตรวจสอบข้อมูลในคอมลัมน์ที่ใช้เป็นเงื่อนไขการเชื่อมโยงของ ตารางทั้ง 2 โดยจะแสดงข้อมูลจากตารางทั้ง 2 เฉพาะที่มีเงื่อนไขของข้อมูลที่ตรงกันเท่านั้น

SELECT kk_customer.coust_no,kk_customer.cust_name,kk_coust.contact_name,kk_coustmer.emp_no,kk_employee.emp_name
FROM kk_coustomer INNER JOIN kk_employee ON
kk_customer.emp_no = kk_employee.emp_no

OUTER JOIN 
       OUTER JOIN เป็นการเชื่อมตารางตั้งแต่ 2 ตารางขึ้นไปเข้าด้วยกัน ผลการเชื่อมจะยึดตามตารางใดตารางหนึ่งที่กำหนด หรือจะเป็นการนำรายการของตารางทั้งหมดมารวมกัน ประกอบไปด้วย
   - LEFT [OUTER] JOIN   เชื่อมข้อมูลโดยยีดตารางด้านซ้ายมือของคำสั่งเป็นหลัก
   - RIGHT [OUTER] JOIN   เชื่อมข้อมูลโดยยึดตารางด้านขวาของคำสั่งเป็นหลัก
   - FULL [OUTER] JOIN      เชื่อมข้อมูลของตารางทางด้านขวาและซ้ายเข้าด้วยกัน
         LEFT   OUTER   JOIN  เป็นการเชื่อมตารางตั้งแต่ 2 ตารางขึ้นไปเข้าด้วยกัน โดยอาศัยคอลัมน์ ที่มีความสัมพันธ์กันมาทำการเชื่อมโยงข้อมูลเข้าด้วยกัน การเชื่อมโยงนี้จะมีการตรวจสอบข้อมูลในคอลัมน์ที่ใช้เป็นเงื่อนไขการเชื่อมโยงของตารางทั้ง 2  โดยจะแสดงแถวข้อมูลจากตารางด้านซ้ายมือของคำสั่ง (ตารางที่ถูกประกาศก่อน) ทั้งหมด  และตารางทางด้านขวามือ  (ตารางที่ถูกประกาศที่หลัง)  จะแสดงเฉพาะแถวที่มีเงื่อนไขของข้อมูลตรงกันกับตารางทางฝั่งขวามือเท่านั้น
SELECT * FROM Table_A LEFT OUTER JOIN Table_B NO Table_A.ColumnA1 = Table_B.ColumnB1

          RIGHT OUTER JOIN  เป็นการเชื่อมตารางตั้งแต่ 2 ตารางขึ้นไปเข้าด้วยกัน โดยอาศัยคอลัมน์ ที่มีความสัมพันธ์กันมาทำการเชื่อมโยงข้อมูลเข้าด้วยกัน การเชื่อมโยงนี้จะมีการตรวจสอบข้อมูลในคอลัมน์ที่ใช้เป็นเงื่อนไขการเชื่อมโยงของตารางทั้ง 2  โดยจะแสดงแถวข้อมูลจากตารางด้านขวามือของคำสั่ง (ตารางที่ถูกประกาศที่หลัง) ทั้งหมด  และตารางทางด้านซ้ายมือ  (ตารางที่ถูกประกาศที่ก่อน)   เฉพาะที่มีเงื่อนไขของข้อมูลตรงกันเท่านั้น
SELECT * FROM Table_A RIGHT OUTER JOIN Table_B NO Table_A.ColumnA1 = Table_B.ColumnB1

           FULL OUTER JOIN   เป็นการเชื่อมตารางตั้งแต่ 2 ตารางขึ้นไปเข้าด้วยกัน โดยนำข้อมูลจากตารางทางด้านซ้ายมือและตารางทางด้านขวามือ ทั้งที่ตรงและไม่ตรงกับเงื่อนไขของการเชื่อมโยงมาแสดง จริงๆ แล้วผลของการ FULL OUTER JOIN ก็คือ ผลของการ LEFT OUTER JOIN และ RIGHT OTER JOIN มารวมกัน

SELECT * FROM Table_A  FULL OUTER JOIN Table_B NO Table_A.ColumnA1 = Table_B.ColumnB1

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

SELECT * FROM Table_A CROSS JOIN Table_B


SELF JOIN
         เป็นการเชื่อมตารางโดยใช้ตารางของตัวเอง เราสามารถใช้รูปแบบการเชื่อมที่กล่าวมา ได้แก่ INNER JOIN และ OUTER JOIN เหล่านี้มาทำการเชื่อมข้อมูลเพื่อให้ได้ผลลัพธ์ตามต้องการ

SELECT E1.emp_no,E1.emp_name,E2.emp_name as under FROM kk_employee E1 LEFT OUTER JOIN kk_employee E2
ON E1.emp_no = E2.manager_no

สำหรับการเชื่อมตาราง 3 ตาราง เราสามารถทำได้ คือ LEFT JOIN

SELECT * FROM status
LEFT JOIN units ON (status.units_id = units.units_id)
LEFT JOIN tools ON (status.tools_id = tools.tools_id)

วันอาทิตย์ที่ 26 มกราคม พ.ศ. 2557

ติดตั้ง dhcpd บน ubuntu

  1. ติดตั้งด้วยคำสั่ง sudo apt-get install dhcp3-server

  2. การตั้งค่าต่างๆ ให้จัดการที่แฟ้ม config file ชื่อ dhcpd.conf อยู่ที่ /etc/dhcp3/dhcpd.conf

    สั่งให้ dhcpd ทำงานด้วยคำสั่ง sudo /etc/init.d/dhcp3-server start

  3. ต้องแก้ไขค่า subnet ให้ถูกต้องดังตัวอย่างคือ

    *** ค่า domain-name-servers ตั้งให้เป็น ip ที่ถูกต้อง
    subnet 10.0.0.0 netmask 255.255.255.0 {
      range 10.0.0.20 10.0.0.50;
      option domain-name-servers a.b.c.d;
    ### เปลี่ยนค่า a.b.c.d เป็นเลข ip ของ DNS server
      option routers 10.0.0.1;
    }

    สั่งให้ dhcpd ทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/dhcp3-server force-reload

  4. การกำหนดให้ dhcpd  ปล่อยเลข ip แบบ dynamic ให้ปรับปรุงแก้ไขแฟ้ม dhcpd.conf เป็นประมาณดังตัวอย่าง
    subnet 10.0.0.0 netmask 255.255.255.0 {
      range 10.0.0.20 10.0.0.50;
    }

  5. การกำหนดให้ dhcpd  ปล่อยเลข ip แบบ fix หมายเลข ip เข้ากับ MAC ของ lan card  ให้ปรับปรุงแก้ไขแฟ้ม dhcpd.conf เป็นประมาณดังตัวอย่าง
    host ip1684-26 {
      hardware ethernet 00:01:03:18:BB:4E;
      fixed-address 192.168.4.26;
     ### อนุญาติให้เฉพาะ lan card ที่ได้ fix หมายเลข ip เข้าใช้งานเท่านั้น 
      deny unknown-clients;
    }

  6. การจัดทำแบบให้บางส่วนต้อง fix และบางส่วนเป็น dynamic  ให้ปรับปรุงแก้ไขแฟ้ม dhcpd.conf เป็นประมาณดังตัวอย่าง
    host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
    host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
    subnet 10.0.0.0 netmask 255.255.255.0 {
       option routers 10.0.0.254;
    # Unknown clients get this pool.
       pool {
         option domain-name-servers bogus.example.com;
         max-lease-time 300;
         range 10.0.0.200 10.0.0.253;
         allow unknown-clients;
       }
    # Known clients get this pool.
       pool {
          option domain-name-servers ns1.example.com,ns2.example.com;
          max-lease-time 28800;
          range 10.0.0.5 10.0.0.199;
          deny unknown-clients;
       }
    }

  7. การสั่งยกเลิกไม่ให้ dhcpd ทำงานอัตโนมัติทุกครั้งที่บูทเครื่อง ใช้คำสั่งว่า sudo update-rc.d -f dhcp3-server remove
    หากต้องการให้ dhcpd กลับมาทำงานอัตโนมัติทุกครั้งที่บูทเครื่อง ใช้คำสั่งว่า sudo update-rc.d  dhcp3-server defaults

  8. ข้อมูลการบริหาร ip เก็บอยู่ที่แฟ้ม /var/lib/dhcp3/dhcpd.leases
    หากต้องการดูข้อมูลการบริหาร ip ผ่านเวบ แนะนำให้ติดตั้งโปรแกรม reportdhcp

ติดตั้ง vsftpd บน ubuntu

  1. ติดตั้งด้วยคำสั่ง sudo apt-get install vsftpd

  2. การให้แฟ้มข้อมูลสามารถเปิดอ่านได้ผู้ใช้แบบสาธารณะชื่อ anonymous
    หากเป็น ubuntu 10.04 เก็บข้อมูลไว้ภายใต้ directory ชื่อ /srv/ftp/pub
    ต้องสร้าง directory เพิ่มด้วยคำสั่ง  sudo mkdir -p /srv/ftp/pub

    หากเป็น ubuntu 8.04 ให้เก็บข้อมูลไว้ภายใต้ directory ชื่อ /var/ftp/pub
    ซึ่งต้องสร้าง directory เพิ่มด้วยคำสั่ง  sudo mkdir -p /var/ftp/pub

  3. การปรับแต่งระบบทำได้โดยการแก้ไขแฟ้ม /etc/vsftpd.conf

    ตั้งเวลาให้แสดงผลเวลาตรงกับของ server
    ด้วยการเพิ่ม/แก้ไขบรรทัดข้อความว่า use_localtime=yes

    หากต้องการให้ใช้งานได้เฉพาะภายใน home ของตนเอง ไม่ต้องการให้ออกไปเพ่นพ่านที่อื่น
    เพิ่ม/แก้ไขบรรทัดข้อความว่า chroot_local_user=YES

    หากต้องการห้าม anonymous เข้ามาใช้บริการ
    เพิ่ม/แก้ไขบรรทัดข้อความว่า anonymous_enable=NO

    หากต้องการให้ user สามารถ upload แฟ้มได้
    เพิ่ม/แก้ไขบรรทัดข้อความว่า local_enable=YES และ write_enable=YES

    ตัวอย่างหากต้องการจำกัดจำนวน client ที่เข้ามาใช้บริการ ftp ไม่ให้เกิน 100 คน
    เพิ่ม/แก้ไขบรรทัดข้อความว่า max_clients=100
    แต่ถ้าต้องการจำกัดจำนวน clinet ต่อ 1 เลข IP ที่เข้ามาใช้บริการ ftp ไม่ให้เกิน 50 คนด้วย
    เพิ่ม/แก้ไขบรรทัดข้อความว่า max_per_ip=50

    แก้ไขเสร็จแล้วสั่ง vsftpd ทำงานใหม่ด้วยคำสั่ง  sudo /etc/init.d/vsftpd restart

  4. เทคนิคในการสร้าง link ให้สามารถเปิดดูได้ทั้ง http และ ftp ตัวอย่างเช่น
    http://ftp.psu.ac.th/pub/temp/ และ ftp://ftp.psu.ac.th/pub/temp/
    สมมติว่า root directcory ของ http อยู่ที่ /var/www
    และ root directcory ของ http อยู่ที่  /srv/ftp/pub
    ให้ใช้คำสั่งว่า sudo ln -s /srv/ftp/pub /var/www
    แล้วทดสอบดูผลงานได้เลย

  5. ตัวอย่างหากต้องการเพิ่ม hard disk ลูกใหม่เข้าไป และต้องการให้ไปเป็นส่วนหนึ่งของพื้นที่ใน /home/ftp/pub
    ให้จัดการติดตั้ง hard disk และ mount ให้เรียบร้อยสามารถใช้งานได้ซะก่อน
    ตัวอย่างของผมคือเพิ่ม hard disk /dev/hdb1 ไปในพื้นที่ /mnt/data
    และต้องการให้ไปโผล่เป็นส่วนหนึ่งของ /home/ftp/pub/newdisk
    ทำคำสั่งขั้นตอนดังนี้คือ
    sudo mkdir  -p  /mnt/data
    sudo mount  /dev/hdb1  /mnt/data
    sudo mkdir  -p  /home/ftp/pub/newdisk
    sudo mount  --bind  /mnt/data  /home/ftp/pub/newdisk
    แค่นี้ก็เสร็จแล้ว ตรวจสอบดูผลงานได้เลย

    ต้องแก้ไขให้ระบบทำงานคำสั่งเหล่านี้โดยอัตโนมัติทุกครั้งที่บูทเครื่อง
    ต้องแก้ไขแฟ้ม /etc/rc.local โดยเพิ่มบรรทัดคำสั่งเหล่านั้นเข้าไปด้วย

ติดตั้ง cacti บน ubuntu

  1. หากยังไม่ติดตั้ง  mysql server ให้ติดตั้งก่อนด้วยคำสั่ง sudo apt-get install mysql-server
    แล้วรีบแก้ไขรหัสผ่านของ root ดังตัวอย่างประมาณคำสั่งว่า mysqladmin -uroot password mysqldroot

  2. ติดตั้งด้วยคำสั่ง sudo apt-get install cacti
    ได้หน้าจอเตือน WARNING: include path for php has changed!  ให้กดแป้น Enter ทำงานต่อได้เลย
    หากได้คำถามว่า Which kind of web server should be used by cacti? ให้เปลี่ยนไปเลือกเป็น Apache2 แล้วกดแป้น Enter
    ได้คำถามว่า Configure database for cacti with dbconfig-common?  ให้ยังคงเลือกเป็น Yes แล้วกดแป้น Enter
    ได้คำถามว่า  Password of your database's administrative user: ให้ใส่รหัสผ่านของ root แล้วกดแป้น Enter
    ได้ คำถามว่า  MySQL application password for cacti: ให้ใส่รหัสผ่านสำหรับ cacti ตามต้องการ ตัวอย่างนี้ใส่เป็น 123456 แล้วกดแป้น Enter
    ได้คำถามว่า  Password confirmation:  ให้ใส่รหัสผ่านสำหรับ cacti อีกครั้ง ตัวอย่างนี้ใส่เป็น 123456 แล้วกดแป้น Enter
    หากได้คำถามว่า Which kind of web server should be used by cacti? ให้เปลี่ยนไปเลือกเป็น Apache2 แล้วกดแป้น Enter
    รอสักครู่ ถึงตอนนี้การติดตั้งบน server เสร็จแล้ว

  3. ให้เข้าไป ติดตั้งผ่านเวบต่อที่ http://localhost/cacti
    ที่หน้าเวบแรก Cacti Installation Guide ให้คลิกปุ่ม Next >>
    ที่หน้าเวบ Please select the type of installation ให้ยังคงเลือกเป็น New Install  แล้วคลิกปุ่ม Next >>
    ที่หน้าเวบ Make sure all of these values are correct before continuing. ให้ตรวจสอบว่า OK:  ทุกช่อง  แล้วคลิกปุ่ม Finish >>
    จะได้หน้าเวบ User Login  ให้ลองใส่ User Name: ว่า admin และ Password: ว่า admin ให้ถูกต้องตามที่ตั้งไว้ แล้วคลิกปุ่ม Login
    จะ ได้หน้าเวบ *** Forced Password Change *** ให้รีบเปลี่ยนรหัสผ่านของ admin เป็นรหัสใหม่ที่ช่อง Password: และ Confirm: แล้วคลิกปุ่ม Save
    ถึงตอนนี้ก็ได้หน้าเวบใช้งานแล้วอยู่ที่  http://localhost/cacti  หลังติดตั้งครั้งแรกต้องรอสัก 10 นาที จึงจะมีกราฟแสดงให้ดู

  4. หากต้องการดูกราฟ ให้เลื่อนเมาส์ไปที่ด้านบนซ้าย แล้วคลิกเลือกแถบ "graphs" จะได้หน้าเวบรูปกราฟแสดงออกมา

  5. การตั้งค่าให้ guest สามารถดูกราฟได้ ให้ทำดังนี้
    ให้เลื่อนเมาส์ไปที่ด้านบนซ้าย แล้วคลิกเลือกแถบ "console"  จะได้หน้าเวบ You are now logged into Cacti....
    ไปด้านซ้ายที่ส่วนของ  "Utilities"  ให้คลิกเลือก "User Management" จะได้หน้าเวบ "Console -> User Management"
    ไปด้านขวาส่วนของ "User Name**"  ให้คลิกเลือก "guest" จะได้หน้าเวบ "Console -> User Management->(Edit)"
    ไปด้านขวาส่วนของ "User Management [edit: guest]" 
    ไปที่ช่อง "Password ..."  ให้ป้อนกำหนดรหัสผ่านสำหรับ guest ในตัวอย่างนี้ใช้คำว่า  anonymous ให้ถูกต้องทั้ง 2 ช่อง
    ไปที่ช่อง "Enabled ..."  ให้คลิกเลือกเปลี่ยนเป็น "Enabled"
    ไปที่ช่อง "Account Options ..."  ให้คลิกเปลี่ยนยกเลิกไม่เลือกหัวข้อ "User Must Change Password at Next Login"
    เสร็จแล้วคลิกปุ่ม "save" ได้เลย  แล้วลอง Logout ออกมา
    ดูผลงานเข้าหน้าเวบด้วยชื่อผู้ใช้ ว่า guest และรหัสผ่านว่า anonymous

  6. หากต้องการลบกราฟ ตัวอย่างเช่นต้องการลบกราฟชื่อว่า "Graph Template: Unix - Logged in Users" ให้ทำดังนี้
    ให้เลื่อนเมาส์ไปที่ด้านบนซ้าย แล้วคลิกเลือกแถบ "console"  จะได้หน้าเวบ You are now logged into Cacti....
    ไปด้านซ้ายที่ส่วนของ  "Management"  ให้คลิกเลือก "Graph Management"  จะได้หน้าเวบ "Console->Graph Management"
    ให้ไปด้านขวาส่วนของ "Grap Title" ที่บรรทัด  "Localhost - Logged in Users"  ให้คลิกเลือกบรรทัดนี้
    แล้วไปด้านขวาล่างสุดช่อง  "Choose an action:" ให้เลือกเปลี่ยนเป็น "Delete"  แล้วคลิกปุ่ม "go"
    ได้หน้าเวบถามยืนยันว่า "Delete"  ให้ยังคงเลือก "Leave the data sources untouched." แล้วคลิกปุ่ม "yes"
    กลับมาได้หน้าเวบ "Graph Management" จะเห็นว่ารายการ ""Localhost - Logged in Users" หายไปแล้ว

  7. หากต้องการติดตั้งกราฟแสดงปริมาณของข้อมูลที่วิ่งผ่าน network eth0 ต้องมีการติดตั้ง snmpd ตามคำแนะนำใน ติดตั้ง snmpd บน ubuntu ก่อน
    ให้เลื่อนเมาส์ไปที่ด้านบนซ้าย แล้วคลิกเลือกแถบ "console"  จะได้หน้าเวบ You are now logged into Cacti....
    ไปด้านซ้ายที่ส่วนของ  "Management"  ให้คลิกเลือก "Devices"  จะได้หน้าเวบ "Console->Devices"
    ให้ ไปด้านขวาส่วนของ "Devices"  ที่บรรทัด  "Localhost" ให้คลิกเลือกบรรทัดนี้แล้วเข้าไปทำงาน  จะได้หน้าเวบ "Console->Devices->(Edit)"
    ให้ไปด้านขวาส่วนของ "SNMP Options"  ที่ช่อง "SNMP Version" ให้เลือกเปลี่ยนเป็น "Version 2"  แล้วคลิกปุ่ม "save" หน้าเวบจะเปลี่ยน
    ให้ เลื่อนไปที่ส่วนของ "Associated Graph Templates"  ไปที่ช่อง "Add Graph Template:" ให้เลือกเปลี่ยนเป็น "SNMP - Generic OID Template" แล้วคลิกปุ่ม "add"
    เลื่อนไปที่ส่วนของ "Associated Data Queries" ไปที่ช่อง "Add Data Query:"  ให้เลือกเปลี่ยนเป็น "SNMP - Interface Statistics"
    ไปที่ช่อง "Re-Index Method:" ให้เลือกเปลี่ยนเป็น "None"  แล้วคลิกปุ่ม "add"   เสร็จแล้วให้คลิกปุ่ม "save"  อีกครั้ง 

    ต่อไปให้ไปด้านซ้ายที่ส่วนของ  "Create" ให้คลิกเลือก "New Graphs"  จะได้หน้าเวบ "Create New Graphs"
    ไปที่ช่อง "Host:" ให้เลือก host ที่ต้องการ ตัวอย่างนี้ยังคงเลือก "Localhost(127.0.0.1)"
    ไปที่ช่อง "Data Query [SNMP - Interface Statistics]"  ให้คลิกเลือก interfaces ที่ต้องการ
    ไปที่ช่อง "Select a graph type:"  ให้คลิกเลือกเปลี่ยนเป็น "In/Out Bits with Total Bandwidth" แล้วคลิกปุ่ม "create"
    ทำแค่นี้ก็จะได้กราฟที่ต้องการแล้ว กลับไปผลงานโดยคลิกเลือกแถบ "graphs" จะได้หน้าเวบรูปกราฟแสดงออกมา

  8. ตัวอย่างการติดตั้งกราฟแสดงหน่วยความจำที่เป็น free memory และ swap usage เดียวโดยใช้ shell script ที่สร้างเองให้ทำดังนี้
    สร้างแฟ้ม script ของตนเองรอไว้ก่อน เช่นแฟ้ม /usr/share/cacti/site/scripts/mymem.sh มีข้อมูลว่า
    #!/bin/bash
    FREE=$(free -k|grep "cache:"|awk '{print $4}')
    SWAP=$(free -k|grep "Swap:"|awk '{print $3}')
    echo "FreeKbytes:${FREE}" "SwapKbytes:${SWAP}"

    ให้เลื่อนเมาส์ไปที่ด้านบนซ้าย แล้วคลิกเลือกแถบ "console"  จะได้หน้าเวบ You are now logged into Cacti....

    เริ่มสร้าง Data Input  Methods ไปด้านซ้ายที่ส่วนของ  "Collection Methods"
    ให้คลิกเลือก "Data Input Methods"  จะได้หน้าเวบ "Console->Data Input Methods"
    ไปด้านขวาส่วนของ "Data Input Methods"  ให้คลิกเลือก "Add"  จะได้หน้าเวบ "Console->Data Input Methods->(Edit)"
    ให้ไปด้านขวาส่วนของ "Data Input Methods(new)"  ที่ช่อง "Name" ใส่ป้อนชื่อตามต้องการตัวอย่างว่า "MY - Get Memory Usage"
    ที่ช่อง "Input Type"  ให้เลือกเปลี่ยนเป็น "Script/Command"
    ที่ ช่อง "Input String" ให้ป้อนชื่อแฟ้ม script ตามต้องการตัวอย่างว่า  sh /usr/share/cacti/site/scripts/mymem.sh แล้วคลิกปุ่ม "create"
    หน้าเวบจะเปลี่ยนไปมีคำว่า Save Successful. ออกมา ให้ไปที่ส่วนของ "Output Fields"  คลิกเลือก "Add"
    จะได้หน้าเวบ  " Console -> Data Input Methods -> (Edit) -> Data Input Fields"
    ไปที่ส่วนของ "Output Fields [edit: ...]" ช่อง "Field [Output]" ให้ป้อนตามต้องการตัวอย่างว่า "FreeKbytes"
    ช่อง "Friendly Name" ให้ป้อนตามต้องการตัวอย่างว่า "Free in Kilobytes"
    ช่อง "Update RRD File" ยังคงคลิกเลือกไว้เหมือนเดิม แล้วคลิกปุ่ม "create"
    ไป ที่ส่วนของ "Output Fields"  อีกครั้งคลิกเลือก "Add"  จะได้หน้าเวบ  " Console -> Data Input Methods -> (Edit) -> Data Input Fields"
    ไปที่ส่วนของ "Output Fields [edit: ...]" ช่อง "Field [Output]" ให้ป้อนตามต้องการตัวอย่างว่า "SwapKbytes"
    ช่อง "Friendly Name" ให้ป้อนตามต้องการตัวอย่างว่า "Swap used in Kilobytes"
    ช่อง "Update RRD File" ยังคงคลิกเลือกไว้เหมือนเดิม แล้วคลิกปุ่ม "create" เสร็จแล้วคลิกปุ่ม "save"

    เริ่ม สร้าง Data Templates ไปด้านซ้ายที่ส่วนของ  "Templates"  ให้คลิกเลือก "Data Templates"  จะได้หน้าเวบ "Templates -> Data Templates"
    ไปที่ส่วนของ "Template Names**"  ไปที่ช่อง "Linux - Memory - Free" ให้คลิกเลือกไว้ก่อน
    แล้วไปที่ด้านล่างสุดช่อง " Choose an action:" ให้เลือกเปลี่ยนเป็น "Duplicate" แล้วคลิกปุ่ม "go"  จะได้หน้าเวบ "Duplicate"
    ที่ช่อง "Title Format:" ให้ป้อนตามต้องการตัวอย่างว่า "MY - Memory - Free" แล้วคลิกปุ่ม "yes" หน้าเวบจะเปลี่ยน
    ไปที่ส่วนของ "Template Names**" อีกครั้ง ไปที่ช่อง "MY - Memory - Free" ให้คลิกเลือกเข้าไปทำงาน
    ไปที่ส่วนของ "Data Source" ที่ช่อง "Name" แก้ไขตามต้องการตัวอย่างว่า "|host_description| - MY - Memory - Free"
    ที่ช่อง "Data Input Method"  ให้เลือกเปลี่ยนเป็น "MY - Get Memory Usage"    แล้วคลิกปุ่ม "save"
    กลับไปที่ส่วนของ "Template Names**" อีกครั้ง ไปที่ช่อง "MY - Memory - Free" ให้คลิกเลือกเข้าไปทำงาน
    ไปที่ส่วนของ "Data Source Item [mem_buffers]"  ที่ช่อง "Internal Data Source Name"  ให้เปลี่ยนเป็นว่า "Free"
    ที่ช่อง "Output Field" ให้เลือกเปลี่ยนเป็น "FreeKbytes - Free in Kilobytes" แล้วคลิกปุ่ม "save"
    กลับไปที่ส่วนของ "Template Names**" อีกครั้ง ไปที่ช่อง "MY - Memory - Free" ให้คลิกเลือกเข้าไปทำงาน
    ไปที่ส่วนของ "Data Source Item [Free]" ให้คลิกปุ่ม "New"  หน้าเวบจะเปลี่ยน
    ไปที่ส่วนของ "Data Source Item [ds]" ที่ช่อง "Internal Data Source Name"  ให้เปลี่ยนเป็นว่า "Swap"
    ที่ช่อง "Output Field" ให้เลือกเปลี่ยนเป็น "SwapKbytes - Swap used in Kilobytes" แล้วคลิกปุ่ม "save"

    เริ่ม สร้าง Graph Templates ไปด้านซ้ายที่ส่วนของ  "Templates"  ให้คลิกเลือก "Graph Templates"  จะได้หน้าเวบ "Console -> Graph Templates"
    ไปที่ส่วนของ "Template Titles**"  ไปที่ช่อง "Linux - Memory Usage" ให้คลิกเลือกไว้
    แล้วไปที่ด้านล่างสุดช่อง " Choose an action:" ให้เลือกเปลี่ยนเป็น "Duplicate" แล้วคลิกปุ่ม "go"  จะได้หน้าเวบ "Duplicate"
    ที่ช่อง "Title Format:" ให้ป้อนตามต้องการตัวอย่างว่า "MY - Memory Usage" แล้วคลิกปุ่ม "yes"
    ไปที่ส่วนของ "Template Titles**"  อีกครั้ง ไปที่ช่อง "MY - Memory Usage" ให้คลิกเลือกเข้าไปทำงาน
    ได้หน้าเวบ "Console -> Graph Templates -> (Edit)"  ไปที่ส่วนของ "Graph Template Items [edit: MY - Memory Usage]"
    ที่ช่อง "Item # 1" ให้คลิกเข้าไปทำงาน ได้หน้าเวบ "Console -> Graph Templates -> (Edit) -> Graph Template Items"
    ที่ช่อง "Data Source [Field Not Templated]" ให้เลือกปลี่ยนเป็น  "MY - Memory - Free -(Free)" แล้วคลิกปุ่ม "save"
    ทำแบบนี้กับ "Item #2", "item #3" และ "item #4"  ด้วย
    กลับไปที่ช่อง "Item # 5" ให้คลิกเข้าไปทำงาน ได้หน้าเวบ "Console -> Graph Templates -> (Edit) -> Graph Template Items"
    ที่ช่อง "Data Source [Field Not Templated]" ให้เลือกปลี่ยนเป็น  "MY - Memory - Free -(Swap)" แล้วคลิกปุ่ม "save"
    ทำแบบนี้กับ "Item #5", "item #6" และ "item #7"  ด้วย
    ที่ช่อง "Item # ." ที่เหลือไม่ใช้งาน ให้คลิกเครื่องหมาย x เพื่อลบทิ้งทั้งหมด
    ไปที่ส่วนของ "<Graph Item Inputs" ที่ช่อง "Free Data Source" และ "Swap Data Source" ให้คลิกเครื่องหมาย x เพื่อลบทิ้ง
    ไปที่ส่วนของ "Graph Template" ที่ช่อง "Title (--title)" ให้เปลี่ยนตามต้องการ ตัวอย่างนี้เป็น "|host_description| - MY Memory Usage"   แล้วคลิกปุ่ม "save"

    เริ่มสร้างกราฟ ไปด้านซ้ายที่ส่วนของ  "Create" ให้คลิกเลือก "New Graphs"  จะได้หน้าเวบ "Create New Graphs"
    ไปที่ช่อง "Host:" ให้เลือก host ที่ต้องการ ตัวอย่างนี้ยังคงเลือก "Localhost(127.0.0.1)"
    ไปที่ช่อง "Graph Types:" ให้คลิกเลือกเปลี่ยนเป็น "Graph Template Based"
    ไปที่ส่วนของ "Graph Template Name" ที่ช่อง "Create:" ให้เลือกเปลี่ยนเป็น "MY - Memory Usage" แล้วคลิกปุ่ม "create"
    ทำแค่นี้ก็จะได้กราฟที่ต้องการแล้ว กลับไปผลงานโดยคลิกเลือกแถบ "graphs" จะได้หน้าเวบรูปกราฟแสดงออกมา

ติดตั้ง bind บน ubuntu


  1. สมมติว่า name server ของ ISP ที่ให้บริการ มีหมายเลข ip คือ 10.0.0.5  และ name server ของเราเป็นเลข 10.0.1.3
    ก่อนติดตั้ง ให้ทดสอบว่า server เครื่องนี้ สามารถท่องอินเทอร์เนตได้อย่างสมบูรณ์
    • ลองใช้ browser ไปที่ www.google.com ว่าใช้งานได้
    • ตรวจสอบดู dns server ที่ตนเองใช้อยู่ในปัจจุบันในแฟ้ม /etc/resolv.conf
      ด้วยคำสั่งว่า  cat /etc/resolv.conf  ได้ข้อความประมาณว่า  nameserver 10.0.0.5
      ตัวอย่างนี้คือระบบเลือกใช้ name server มีหมายเลข ip คือ 10.0.0.5

    • ลองใช้คำสั่งว่า nslookup www.yahoo.com ได้คำตอบประมาณว่า
      Server:         10.0.0.5
      Address:        10.0.0.5#53

      Non-authoritative answer:
      www.yahoo.com   canonical name = www.yahoo.akadns.net.
      Name:   www.yahoo.akadns.net
      Address: 209.191.93.52

  2. ติดตั้งโปรแกรม bind  ด้วยคำสั่ง  sudo apt-get install bind9 bind9-doc bind9-host dnsutils
    สั่งให้ DNS sever ทำงาน ใช้คำสั่ง  sudo /etc/init.d/bind9 start
    ปรับแต่งค่าต่างๆได้ที่แฟ้ม /etc/bind/named.conf.options
    แล้วสั่งให้ DNS server ทำงานใหม่ด้วยคำสั่ง  sudo /etc/init.d/bind9 reload

  3. การทำเป็น name server แบบ forward only
    แก้ไขแฟ้ม /etc/bind/named.conf.options  ให้มีข้อมูลประมาณดังตัวอย่าง

    options {
            directory "/var/cache/bind";
            forward first;
               forwarders {
                    10.0.0.5;
                };
            auth-nxdomain no;
            allow-query { any; };
    };

    แก้ไขเสร็จแล้ว ให้สั่ง reload name server ใหม่  ด้วยคำสั่ง sudo /etc/init.d/bind9 reload

    ทดสอบผลงานด้วยคำสั่ง
    nslookup www.yahoo.com 127.0.0.1
    ได้ผลประมาณว่า
    Server:         127.0.0.1
    Address:        127.0.0.1#53

    Non-authoritative answer:
    www.yahoo.com    canonical name = www.wa1.b.yahoo.com.
    www.wa1.b.yahoo.com    canonical name = www-real.wa1.b.yahoo.com.
    Name:    www-real.wa1.b.yahoo.com
    Address: 209.131.36.158


    ถึงตอนนี้แสดงว่า name server ของเราทำงานเป็นแบบ forward only  ได้แล้ว

  4. หากต้องการทำเป็น caching only ด้วยก็ให้ทำต่อคือ
    แก้ไขแฟ้ม /etc/resolv.conf เพิ่มข้อความว่า
    name server 127.0.0.1 ไว้บนบรรทัดแรกสุด ประมาณว่า

    nameserver 127.0.0.1
    nameserver 10.0.0.5

    หมายความว่า ให้เลือก query จากตนเองก่อน หากไม่พบ ก็ไปต่อที่ 10.0.0.5

    แก้ไขแค่นี้ ก็ใช้ได้แล้ว ไม่ต้องไป reload หรือ restart
    รอสัก 2 นาที แล้วลองทดสอบผลงานด้วยคำสั่ง
    nslookup www.yahoo.com
    ได้ผลประมาณว่า
    Server:         127.0.0.1
    Address:        127.0.0.1#53

    Non-authoritative answer:
    www.yahoo.com    canonical name = www.wa1.b.yahoo.com.
    www.wa1.b.yahoo.com    canonical name = www-real.wa1.b.yahoo.com.
    Name:    www-real.wa1.b.yahoo.com
    Address: 209.131.36.158
    แสดงว่าใช้งานได้แล้ว

  5. หากต้องการทำเป็น name server สำหรับบริการทั่วๆไป
    มีตนเองเป็น primary และมี myisp.domain.com เป็น secondary
    ****  ต้องยกเลิกหรือลบบรรทัดข้อความในแฟ้ม  /etc/bind/named.conf.options  (ถ้ามี)ว่า  forward first;   ทิ้งออกไปด้วย

    แก้ไขที่แฟ้ม /etc/bind/named.conf.local
    **** การใส่ comment ใน zone file ให้ใส่เครื่องหมาย ";" นำหน้า
    ให้มีข้อมูล zone และ reserve zone ที่ต้องการ ดังตัวอย่าง
    zone "mydomain.com" {
       type master;
       allow-query { any; };
       file "/etc/bind/my-domain.zone";
    };
    zone "1.0.10.in-addr.arpa" {
      type master;
      file "/etc/bind/10-0-1.zone";
    };

    ต่อไปให้สร้างแฟ้ม zone ต่างๆ
    แก้ไขแฟ้ม /etc/bind/my-domain.zone  ให้มีข้อมูลประมาณดังตัวอย่าง
    $TTL    3D
    @               IN SOA  localhost.  root.localhost (
                                            200611146       ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum
                    NS   ns
                  
    localhost       A       127.0.0.1
    ns               A       10.0.1.3
    myserver1    A       10.0.1.207
    myserver2    A       10.0.1.208

    ต่อไปให้สร้างแฟ้ม reverse zone
    แก้ไขแฟ้ม /etc/bind/10-0-1.zone  มีข้อมูลประมาณดังตัวอย่าง
    $TTL    3D
    @               IN SOA  localhost.  root.localhost  (
                                            200611142       ; serial (d. adams)
                                            3H              ; refresh
                                            15M             ; retry
                                            1W              ; expiry
                                            1D )            ; minimum
                    NS   ns
                    NS   myisp.domain.com

    205             PTR     myserver1.mydomain.com.
    207             PTR     myserver1.mydomain.com.

    ให้ DNS ทำงานด้วยคำสั่ง sudo /etc/init.d/bind9 restart
    ทดสอบใช้งานได้เลย

  6. ตัวอย่างการทำ name server 2 ตัว ตัวหนึ่งเป็น master  อีกตัวเป็น slave เพื่อสำรองข้อมูล
    สมมติว่าเลข ip ของ master เป็น 10.0.0.5 และ slave เป็น 10.0.0.6

    บน master ทำการติดตั้งทำนองเดียวกับ name server ทั่วไป
    แต่ให้แก้ไขแฟ้ม /etc/bind/named.conf.local เป็นประมาณตามตัวอย่างว่า
    zone "mydomain.com" {
       type master;
       allow-query { any; };
       file "/etc/bind/my-domain.zone";
       allow-transfer { 10.0.0.6; };
    };

    บน slave ทำการติดตั้งทำนองเดียวกับ name server ทั่วไป
    แต่ให้แก้ไขแฟ้ม /etc/bind/named.conf.local เป็นประมาณตามตัวอย่างว่า
    zone "mydomain.com" {
       type slave;
       allow-query { any; };
       file "/var/cache/bind/my-domain.zone";
       allow-transfer { 10.0.0.6; };
    };

    ให้ DNS ทำงานด้วยคำสั่ง sudo /etc/init.d/bind9 reload
    ทดสอบใช้งานได้เลย

ติดตั้ง freeradius บน ubuntu

  1. ติดตั้งด้วยคำสั่ง sudo apt-get install freeradius freeradius-utils freeradius-mysql freeradius-ldap gawk
  2. สั่งให้ทำงานด้วยคำสั่ง sudo /etc/init.d/freeradius start
  3. ทดสอบว่า freeradius ติดตั้งใช้งานได้แล้วด้วยตัวอย่างคำสั่ง

    *** จากตัวอย่างให้แทนข้อความ your_root_password ด้วยรหัสผ่านของ root
    sudo radtest your_name your_password 127.0.0.1 0 testing123
    หากถูกต้องจะได้รับข้อความตอบกลับประมาณว่า
    Sending Access-Request of id 232 to 127.0.0.1 port 1812
        User-Name = "your-name"
        User-Password = "your_password"
        NAS-IP-Address = 255.255.255.255
        NAS-Port = 0
    rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=232, length=20

    ถึงตอนนี้แสดงว่า freeradius ใช้งานได้แล้ว แต่ใช้ได้เพียง localhost คือ 127.0.0.1
  4. หากต้องการอนุญาติให้ radius client เข้ามาใช้ radius server นี้ได้
    ต้องแก้ไขสิทธิ์ที่แฟ้ม /etc/freeradius/clients.conf  ปรับตั้งให้มีค่าดังประมาณตัวอย่างนี้
    client 10.0.1.0/24 {
            secret          = mytestkey
            shortname       = private-network
    }
    ตัวอย่างนี้คือให้ radius client ที่มีหมายเลข ip 10.0.1.x  สามารถเข้ามาใช้ด้วย secret key ว่า mytestkey
    เมื่อแก้ไขเสร็จแล้วให้ reload ใหม่ ด้วยคำสั่ง  sudo /etc/init.d/freeradius force-reload
    ลองทดสอบด้วยคำสั่งตัวอย่าง sudo radtest your_name your_password 10.0.1.1 0 mytestkey
    *** ค่า your_password คือ รหัสผ่านของ your_name และ 10.0.1.1 คือหมายเลข ip ของ radius server
    ได้ผลแสดงข้อความดังตัวอย่าง
    Sending Access-Request of id 246 to 10.0.1.1:1812
            User-Name = "your_name"
            User-Password = "your_password"
            NAS-IP-Address = 255.255.255.255
            NAS-Port = 0
    rad_recv: Access-Accept packet from host 10.0.1.1:1812, id=246, length=20

    ถึงขั้นตอนนี้เป็นอันเปิดบริการระบบ radius server ได้แล้ว
  5. ขั้นตอนการทำงานของ configuration ของ freeradius
    แฟ้ม /etc/freeradius/radiusd.conf  เป็นที่ปรับค่าของระบบต่างๆ

    หากเป็น freeradius 2.x จะมีการแยกแฟ้มย่อยออกไปจาก /etc/freeradius/radiusd.conf
    ไปอยู่ที่ /etc/freeradius/sites-available/default  และ /etc/freeradius/modules
    หากเป็น freeradius 1.x ทุกอย่างจะกระจุกตัวในแฟ้ม /etc/freeradius/radiusd.conf

    เมื่อ radius server ได้รับการติดต่อจากผู้ใช้ radius client
    วิธีการตรวจสอบคุณสมบัติของผู้ใช้อยู่ในส่วนที่ชื่อ authorize {...}
    ภายใน authorize {...} นี้ ประกอบด้วยชื่อ modules ตรวจสอบต่างๆ

    หากคุณสมบัติไม่ตรง ปรกติแล้วระบบก็จะรีบดีดออกมาพร้อมแจ้ง reject
    แต่เราสามารถกำหนดให้ไปตรวจสอบต่อกับ authorize modules
    เรียงลำดับอันถัดๆไปที่เหลืออื่นๆได้อีก

    หากคุณสมบัติผ่าน ก็จะเข้าขั้นตอนตรวจสอบรหัสผ่านของผู้ใช้ว่าถูกต้องหรือไม่
    โดย authorize modules จะเลือก modules ที่ต้องการเอง จากส่วนที่ชื่อ authenticate {...}

    หากรหัสผ่านถูกต้อง ก็จะเข้าสู่ส่วนของ postauth {...}
    เป็นการตรวจสอบทิ้งท้ายก่อนส่งคืนค่ากลับให้แก่ radius client ที่ติดต่อมา

    การบันทึกประวัติใช้งานอยู่ในส่วน accounting {...}

    modules ทุกตัวที่ใช้งาน จะต้องได้รับการประกาศไว้ก่อนแล้ว
    หากเป็น freeradius 2.x จะแยก modules ออกเป็นแฟ้มย่อยๆอยู่ที่ directory ชื่อ /etc/freeradius/modules
    หากเป็น freeradius 1.x จะมี modules อยู่ในแฟ้ม /etc/freeradius/radiusd.conf พื้นที่ส่วนของชื่อ modules {...}
  6. หากต้องการตรวจสอบผู้ใช้กับ mail server ผ่าน imap/pop3 ให้ทำดังนี้

    ตัวอย่างนี้จะตรวจสอบกับ mail server ชื่อ your.mail.server
    ต้องติดตั้ง php และ php-imap ก่อนแล้ว ติดตั้งด้วยคำสั่ง sudo apt-get install php5 php5-imap php5-cli
    แก้ไขแฟ้ม /etc/php5/cli/conf.d/imap.ini ตรวจสอบ/เพิ่มให้มีบรรทัดตัวแปรว่า extension=imap.so

    ต่อไปสร้างแฟ้ม /etc/freeradius/imap.php ให้มีเนื้อหาว่า
    <?php
    error_reporting(0);
    $host = $argv[1];
    $username = $argv[2];
    $password = $argv[3];
    $service = $argv[4];
    $imap_host="{" . $host . $service . "}";
    $mbox = imap_open("$imap_host", "$username", "$password");
    $folders = imap_listmailbox($mbox, "$imap_host", "*");
    if ($folders == false) {
            echo "false";
    } else {
            echo "true";
    }
    imap_close($mbox);
    ?>

    สร้างแฟ้มคำสั่ง shell script ชื่อ  /etc/freeradius/imap-authen.sh มีเนื้อหาว่า
    #!/bin/bash
    #exit 0 = valid ; exit 1 = invalid
    AUTHEN_SHADOW="YES"
    AUTHEN_MAIL="YES"
    AUTHEN_LDAP="NO"
    AUTHEN_PSU_PASSPORT="NO"
    NAME=$(echo ${USER_NAME} | cut -d'"' -f2)
    PASSWORD=$(echo ${USER_PASSWORD} | cut -d'"' -f 2-|sed "s/\"$//")
    KEY="false"
    if [ "${AUTHEN_SHADOW}" = "YES" ] ; then
      KEY=$(/bin/sh /etc/freeradius/check-shadow.sh "${NAME}" "${PASSWORD}")
      if [ "${KEY}" = "true" ] ; then
        exit 0
      fi
    fi
    if [ "${AUTHEN_LDAP}" = "YES" ] ; then
      KEY=$(/bin/sh /etc/freeradius/check-ldap.sh "${NAME}" "${PASSWORD}")
      if [ "${KEY}" = "true" ] ; then
        exit 0
      fi
    fi
    if [ "${AUTHEN_PSU_PASSPORT}" = "YES" ] ; then
      USER=$(echo ${NAME} | cut -d'@' -f1)
      KEY=$(/usr/bin/php /etc/freeradius/soap-authen.php ${USER} ${PASSWORD} $1 $2})
      if [ "${KEY}" = "true" ] ; then
        exit 0
      fi
    fi
    if [ "${AUTHEN_MAIL}" = "YES" ] ; then
      IS_EMAIL=$(echo ${NAME}|grep "@")
      if [ -n "${IS_EMAIL}" ] ; then
        USER=$(echo ${NAME} | cut -d'@' -f1)
        DOMAIN=$(echo ${NAME} | cut -d'@' -f2)
      else
        USER=${NAME}
        DOMAIN="mail.psu.ac.th"
      fi
      case ${DOMAIN} in
      psu.ac.th)
        HOST="mail.psu.ac.th"
        SERVICE=":143/imap/notls" ;;
      pharmacy.psu.ac.th)
        HOST="mail.pharmacy.psu.ac.th"
        SERVICE=":143/imap/notls" ;;
      pn.psu.ac.th)
        HOST="bunga.pn.psu.ac.th"
        SERVICE=":143/imap/notls" ;;
      gmail.com)
        HOST="pop.gmail.com"
        SERVICE=":995/pop3/ssl" ;;
      live.com)
        HOST="pop3.live.com"
        USER=${NAME}
        SERVICE=":995/pop3/ssl" ;;
      *)
        HOST=${DOMAIN}
        SERVICE=":110/pop3/notls" ;;
      esac
      KEY=$(/usr/bin/php /etc/freeradius/imap.php ${HOST} ${USER} ${PASSWORD} ${SERVICE})
      if [ "${KEY}" = "true" ] ; then
        exit 0
      fi
    fi
    exit 1

    สร้างแฟ้มแบบ text ชื่อ /etc/freeradius/myusers มีเนื้อหาว่า
    DEFAULT Auth-Type := Accept
                  Exec-Program-Wait="/bin/sh /etc/freeradius/imap-authen.sh"

    หากเป็น freeradius 2.x ให้แก้ไขแฟ้ม /etc/freeradius/modules/files เติมข้อความต่อท้ายแฟ้มว่า
    files  myimap  {
        usersfile = ${confdir}/myusers
    }
    แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
    ที่ส่วนของ authorize {...} ประมาณบรรทัดที่ 152 ที่บริเวณข้อความขึ้นต้นด้วย authorize {
    ...
    #  Read the 'users' file
         files
    ให้ comment บรรทัด files เพื่อยกเลิกค่านี้  แล้วแทรกเพิ่มบรรทัดข้อความเพิ่ม กลายเป็นว่า
    #    files
    แทรกเพิ่มบรรทัดข้อความว่า myimap ต่อไปอีกบรรทัด กลายเป็นว่า
    #   files
    myimap

    เสร็จแล้วให้สั่งทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
    แค่นี้ก็เสร็จแล้ว ทดสอบผลงานได้เลย
  7. หากต้องการว่าหลังผ่านการตรวจสอบ username/password ถูกต้องแล้ว
    จะทำการบันทึกลงแฟ้ม log file เก็บไว้ที่ /var/log/freeradius/myauthen และยังต้องการตรวจวิธีการพิเศษเฉพาะของตนเองเพิ่มเติมอีก

    ตัวอย่างต้องการไม่อนุญาติให้ผู้ใช้ชื่อ demo และ abc ใช้งาน ให้ทำดังนี้
    สร้างแฟ้มคำสั่ง shell script ชื่อ  /etc/freeradius/my-authen.sh มีเนื้อหาว่า
    #!/bin/bash
    ###exit 0 = valid ; exit1 = invalid
    ALL_PASS="YES"
    CHECK_STAFF="NO"
    CHECK_STUDENT="NO"
    export LANG=en.US
    MYDIR="/var/log/freeradius/myauthen"
    if [ ! -d ${MYDIR} ] ; then
      mkdir -p ${MYDIR}
    fi
    TODAY=$(date "+%Y%m%d")
    MYFILE="${MYDIR}/${TODAY}"
    if [ ! -e ${MYFILE} ] ; then
      touch ${MYFILE}
    fi
    MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
    echo "${MYTIME};${USER_NAME};$2;$1;PASS" >> ${MYFILE}
    MYUSER=$(echo $USER_NAME | cut -d'"' -f2)
    if [ "${ALL_PASS}" = "YES" ] ; then
      exit 0
    fi
    if [ "${CHECK_STAFF}" = "YES" ] ; then
      case "${MYUSER}" in
        demo) exit 1 ;;
        *) exit 0 ;;
      esac
    fi
    if [ "${CHECK_STUDENT}" = "YES" ] ; then
      case "${MYUSER}" in
        demo) exit 1 ;;
        *) exit 0 ;;
      esac
    fi
    exit 1

    หากเป็น freeradius 2.x  ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
    exec my-auth {
            program = "/bin/sh /etc/freeradius/my-authen.sh %l %{Packet-Src-IP-Address}"
            wait = yes
            input_pairs = request
            output_pairs = reply
            packet_type = Access-Accept
    }
    แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
    ที่ส่วนของ post-auth {...} ประมาณบรรทัดที่ 439  ที่บริเวณข้อความขึ้นต้นด้วย post-auth {
    ...
    แทรกเพิ่มบรรทัดข้อความเพิ่ม
    my-auth

    เสร็จแล้วให้สั่งทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
  8. การบันทึกประวัติการใช้งานของ radius โดย defualt จะบันทึกไว้ในพื้นที่  /var/log/freeradius/radacct
    โดยแยกเป็น directory ของแต่ละหมายเลข ip ของ radius client
    แล้วยังแตกย่อยออกเป็นแฟ้มของแต่วันอีก ซึ่งอาจไม่สะดวกต่อการวิเคราะห์ข้อมูล
    เราสามารถเพิ่ม module บันทึกประวัติการใช้งานเพิ่มเติมจากของเดิม ตัวอย่างคือ
    ต้องการบันทึกไว้ใน directory ชื่อ /var/log/freeradius/myaccount
    แล้วเก็บแฟ้มแยกเป็นรายวันในรูปแบบ 20060729 ภายในแฟ้มมีรูปแบบว่า
    20060729:15:54:05;"demo";10.0.0.153;1154163245;"a5f56ebd6ebc1321";Start;
    20060729:15:55:06;"demo";10.0.0.153;1154163306;"a5f56ebd6ebc1321";Stop;61

    ให้ทำดังนี้ สร้างแฟ้มคำสั่ง shell script ชื่อ  /etc/freeradius/log-radius-account.sh มีเนื้อหาว่า
    #!/bin/bash
    export LANG=en.US
    MYDIR="/var/log/freeradius/myaccount"
    if [ ! -d ${MYDIR} ] ; then
      mkdir -p ${MYDIR}
    fi
    TODAY=$(date "+%Y%m%d")
    myfile="${MYDIR}/${TODAY}"
    if [ ! -e ${MYDIR} ] ; then
      touch ${MYDIR}
    fi
    MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
    echo "${MYTIME};${USER_NAME};$2;$1;${ACCT_UNIQUE_SESSION_ID};${ACCT_STATUS_TYPE};${ACCT_SESSION_TIME}" >> ${MYFILE}
    แฟ้ม shell script จบแค่นี้

    หากเป็น freeradius 2.x  ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
    exec my-log-account {
         wait = no
         program = "/bin/sh /etc/freeradius/log-radius-account.sh %l %{Packet-Src-IP-Address} "
    }
    แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
    ที่ส่วนของ accounting  {...}ประมาณบรรทัดที่ 358  ที่บริเวณข้อความ accounting {
    ...
    detail
    ให้แทรกเพิ่มบรรทัดข้อความว่า
    my-log-account

    เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
  9. radius server สามารถส่งค่าบอกเวลาที่ยังคงเหลือให้ใช้งาน
    โดยส่งค่ากลับมาที่ attribute ชื่อ Session-Timeout
    แต่ตัวมันเองคำนวณไม่เป็น ต้องหาวิธีอื่นในการคำนวณเวลา
    แล้วส่งกลับมาให้ radius ส่งคำตอบให้อีกทอดหนึ่ง

    จากตัวอย่างข้อ 8 หากต้องการใส่ค่าเวลาที่เหลือในการใช้งาน
    ตัวอย่างเช่นเหลือ 120 วินาที ให้เพิ่มบรรทัดข้อความว่า
    echo "SESSION-TIMEOUT = \"120\""
    ลงไปก่อนบรรทัดข้อความ  exit 0 ดังตัวอย่าง
    #!/bin/bash
    ###exit 0 = valid ; exit1 = invalid
    MYUSER=$(echo $USER_NAME | cut -d'"' -f2)
    case "${MYUSER}" in
      demo) exit 1 ;;
      abc) exit 1 ;;
      *) echo "SESSION-TIMEOUT = \"120\""
          exit 0 ;;
    esac

    เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
    แค่นี้ก็เสร็จแล้ว PC ที่ติดต่อเข้ามาจะได้รับคำตอบกลับไป
    ระบุว่าเหลือเวลาใช้งานอีกเท่าไร ขึ้นกับตัวเลขทีกำหนดส่งออกมา
    จากตัวอย่างให้แก้ไขตัวเลข 120 เป็นอื่นๆตามต้องการ
  10. การบันทึกประวัติการ authen radius ไว้ในพื้นที่  /var/log/freeradius/myauthen ให้ทำดังนี้
    สร้างแฟ้มคำสั่ง shell script ชื่อ  /etc/freeradius/log-radius-authen.sh มีเนื้อหาว่า
    #!/bin/bash
    export LANG=en.US
    MYDIR="/var/log/freeradius/myauthen"
    if [ ! -d ${MYDIR} ] ; then
      mkdir -p ${MYDIR}
    fi
    TODAY=$(date "+%Y%m%d")
    MYFILE="${MYDIR}/${TODAY}"
    if [ ! -e ${MYFILE} ] ; then
      touch ${MYFILE}
    fi
    MYTIME=$(echo $1|awk '{print strftime("%Y%m%d:%H:%M:%S",$1)}')
    echo "${MYTIME};${USER_NAME};$2;$1;CHECK_IN" >> ${MYFILE}
    แฟ้ม shell script จบแค่นี้

    หากเป็น freeradius 2.x  ให้แก้ไขแฟ้ม /etc/freeradius/modules/exec เติมข้อความต่อท้ายแฟ้มว่า
    exec my-log-authen {
         wait = no
         program = "/bin/sh /etc/freeradius/log-radius-authen.sh %l %{Packet-Src-IP-Address} "
    }
    แล้วแก้ไขแฟ้ม /etc/freeradius/sites-available/default
    ที่ส่วนของ authorize  {...}ประมาณบรรทัดที่ 152  ที่บริเวณข้อความ authorize {
    ...
    #   files
    myimap
    ให้แทรกเพิ่มบรรทัดข้อความ กลายเป็นว่า
    my-log-authen
    #   files
    myimap

    เสร็จแล้วให้สั่งทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/freeradius force-reload
  11. ตัวอย่างคำสั่งการทดสอบด้วยคำสั่ง radclient
    ทดสอบการ authen คำสั่งประมาณว่า
    echo "User-Name=mama,User-Password=123456" | radclient 10.0.1.2 auth mytestkey

    ทดสอบการ accounting ตอนเข้า คำสั่งประมาณว่า
    echo "User-Name=mama,Acct-Status-Type=Start" | radclient 10.0.1.2 acct mytestkey

    ทดสอบการ accounting ตอนออก คำสั่งประมาณว่า
    echo "User-Name=mama,Acct-Status-Type=Stop" | radclient 10.0.1.2 acct mytestkey

ติดตั้ง flash player plugin บน ubuntu


  1. ต้องติดตั้งโปรแกรมบางส่วนก่อนด้วยคำสั่ง  sudo apt-get install libcurl3 libnspr4-dev

  2. สำหรับ ubuntu แบบ 32 bit
    ติดตั้งด้วยคำสั่ง  sudo apt-get install flashplugin-nonfree

    สำหรับ ubuntu แบบ 64 bit
    ให้ดาวน์โหลดแฟ้มจาก http://ftp.psu.ac.th/pub/adobe/flash/flashplayer10_2_p3_64bit_linux_111710.tar.gz มาเก็บไว้
    ด้วยคำสั่ง wget http://ftp.psu.ac.th/pub/adobe/flash/flashplayer10_2_p3_64bit_linux_111710.tar.gz -P /tmp
    แตกแฟ้มพร้อมติดตั้งด้วยคำสั่งประมาณว่า
    sudo tar -zxvf /tmp/flashplayer10_2_p3_64bit_linux_111710.tar.gz -C  /usr/lib/firefox-addons/plugins

  3. แค่นี้ก็เสร็จแล้วให้ปิดโปรแกรม firefox รวมทั้งหน้าต่าง Downloads ของ firefox ทั้งหมดด้วย
    แล้วเปิด firefox ใหม่ ลองดูผลงานได้เลย

การตั้งให้ ubuntu desktop บูทเข้าเป็น text mode

  1. แก้ไขแฟ้ม /etc/default/grub
    ให้ตัวแปรเป็นว่า GRUB_CMDLINE_LINUX_DEFAULT="quiet text"
    แล้วสั่งปรับปรุง grub ด้วยคำสั่ง\
    sudo update-grub 
    เสร็จแล้ว ให้รีบูท server ใหม่ด้วยคำสั่ง
    sudo reboot อีกที
  2. เมื่อบูทจนใช้งานได้แล้วให้ login เข้าไปใช้งาน
    ใช้คำสั่งว่า startx เพื่อเข้าทำงานแบบ graphic

ติดตั้ง phpmyadmin


  1. ก่อนการติดตั้ง phpmyadmin ต้องติดตั้ง mysql-server ก่อน (sudo apt-get install mysql-server)
  2. ติดตั้ง phpmyadmin ด้วยคำสั่ง  sudo apt-get install phpmyadmin
  3. จะมี menu ขึ้นมาให้เลือก apache2 (กด spacebar แล้วกด enter) รอจนเสร็จ
  4. เรียกใช้งาน http://xx.xx.xx.xx/phpmyadmin
  5. เสร็จแล้วครับ

ติดตั้ง mysql บน ubuntu

  1. ติดตั้งด้วยคำสั่ง sudo apt-get install mysql-server

    หากได้หน้าต่าง Configuring mysql-server-5.0  มีข้อความแจ้งให้ใส่รหัสผ่าน
    ในตอนนี้ยังไม่ต้องใส่อะไร ให้เลื่อนไปเลือก <Ok>
    ระบบจะทำการติดตั้งต่อไปจนเสร็จ

  2. สั่งให้ mysql server ทำงานด้วยคำสั่ง  sudo /etc/init.d/mysql restart

  3. เพื่อความปลอดภัยให้รีบแก้ไขรหัสผ่านของ root ของ mysql
    สมมติว่าต้องการให้รหัสของผู้ใช้ root มีรหัสผ่านว่า mysqldroot
    ตัวอย่างนี้ใช้คำสั่งว่า mysqladmin -uroot password mysqldroot

  4. ตัวอย่างคำสั่งในการสร้าง database ชื่อว่า testdatabase คือ
    mysql -uroot -pmysqldroot -e "CREATE DATABASE testdatabase CHARACTER SET 'UTF8';"

  5. ตัวอย่างคำสั่งในการลบ database ที่เคยสร้างไว้ชื่อ testdatabase ทิ้งไปคือ
    mysql -uroot -pmysqldroot -e "DROP DATABASE testdatabase;"

  6. ตัวอย่างกำหนดสิทธิ์การใช้ database ชื่อ testdatabase ให้แก่ user ชื่อ mamamysql โดยมีรหัสผ่านว่า mamapass ใช้คำสั่งคือ
    mysql -uroot -pmysqldroot -e "grant all privileges on testdatabase.* to 'mamamysql'@'localhost' identified by 'mamapass';"

  7. การ reset root password ของ mysql server ทำดังนี้
    ปิดการทำงานของ mysql ด้วยคำสั่ง sudo /etc/init.d/mysql stop
    สั่งให้ mysql ทำงานใหม่ด้วยคำสั่ง sudo mysqld --skip-grant-tables &
    ตั้ง ค่ารหัสผ่านของ root ใหม่ ตัวอย่างนี้ตั้งว่า mysqldroot ให้ใช้คำสั่งว่า mysql -u root mysql -e "UPDATE user SET Password=PASSWORD('mysqldroot') WHERE User='root';"
    แล้วตามด้วยคำสั่ง mysql -u root mysql -e "flush privileges;"
    เสร็จแล้วให้ปิด mysql sever ด้วยคำสั่ง kill -9 $(cat /var/run/mysqld/mysqld.pid)

  8. การถ่ายโอน database ภาษาไทย 8 bit ไปเป็น ภาษาไทย UTF-8 ทำดังนี้
    สมมติว่ามี database ภาษาไทย 8 bit ชื่อว่า my-8bit-database
    ให้ backup database ของเดิมที่เป็นภาษาไทย 8 bit มาเก็บไว้ในแฟ้ม /tmp/mybackup.sql ก่อนด้วยตัวอย่างคำสั่ง
    mysqldump -u root -pmysqldroot --default-character-set=latin1 --skip-set-charset my-8bit-database | sed "s/DEFAULT CHARSET=latin1//" > /tmp/mybackup.sql

    สร้างแฟ้ม database ภาษาไทย UTF-8 ชื่อ my-utf8-database ด้วยตัวอย่างคำสั่ง
    mysql -uroot -pmysqldroot -e "CREATE DATABASE my-utf8-database CHARACTER SET 'UTF8';"

    แล้ว นำข้อมูลที่สำรองใน /tmp/mybackup.sql ไปใส่ restore คืนพร้อม upgrade เป็นภาษาไทย UTF-8 ในแฟ้ม my-utf8-database ด้วยคำสั่งประมาณว่า
    mysql -u root -pmysqldroot --default-character-set=tis620 my-utf8-database < /tmp/mybackup.sql

    ทำแค่นี้ก็จะได้ข้อมูล database ที่เป็นภาษาไทยแบบ UTF-8 ใช้งานแล้ว

  9. หากต้องการเครื่องมือจัดการ mysql แบบ graphic ให้ติดตั้งโปรแกรม  mysql-query-browser
    ด้วยคำสั่ง  sudo apt-get install mysql-query-browser
    เสร็จแล้วเรียกใช้งานด้วยคำสั่ง  mysql-query-browser ได้เลย

  10. หากต้องการใช้เครื่องมือจัดการ mysql แบบ graphic จากภายนอกเครื่อง Server เช่น MySQLYog-Community Edition
    หรือจะติดตั้ง phpmyadmin บน Web Server คนละเครื่องกับ MySQL Server ต้องแก้ไขไฟล์
    /etc/mysql/my.cnf
    แล้ว comment จากบรรทัดที่เขียนว่า
    bind-address = 127.0.0.1
    ให้เป็น
    #bind-address = 127.0.0.1

    แล้ว restart mysql
    sudo /etc/init.d/mysql restart

ติดตั้ง apache บน ubuntu

  1. ติดตั้ง apache ด้วยคำสั่ง sudo apt-get install apache2 apache2-doc
    ทดสอบผลงานไปที่เวบได้เลย
    พื้นที่เก็บข้อมูลเวบนี้อยู่ที่ /var/www

  2. หาก apache เริ่มทำงานแล้วมี error ประมาณว่า
    apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
    ไม่ต้องตกใจ ระบบยังทำงานได้ เพียงแต่มันฟ้องว่าหาชื่อ host ไม่เจอ

    วิธีแก้ไขปัญหานี้ ทำได้โดยการแก้ไขแฟ้ม /etc/hosts
    หากข้อมูลเดิมมีประมาณว่า
    127.0.0.1 localhost
    127.0.1.1 ubuntu
    ให้แก้ไขใหม่เป็นประมาณว่า
    127.0.0.1 localhost.local localhost
    127.0.1.1 ubuntu.local ubuntu
    แล้วลองสั่งให้ apache ทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 restart จะพบว่า error ดังกล่าวหายไป

    หรือ
    แก้ไขแฟ้ม /etc/apache2/httpd.conf ก็ได้
    เมื่อเปิดแฟ้มนี้จะเป็นแฟ้มเปล่าให้เพิ่มข้อความว่า

    ServerName localhost

    สำหรับ Ubuntu 12.10, 13.04 ให้สร้างแฟ้ม /etc/apache2/conf.d/name โดยมีข้อความว่า

    ServerName localhost

    แล้วลองสั่งให้ apache ทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 restart จะพบว่า error ดังกล่าวหายไป

  3. หากต้องการใช้ cgi ให้ทำดังนี้
    sudo apt-get install libapache2-mod-perl2
    sudo a2enmod cgi

    พื้นที่สำหรับเก็บ cgi script อยู่ที่ /usr/lib/cgi-bin
    อย่าลืมตั้งค่าให้แฟ้ม cgi สามารถทำงานแบบ execute ด้วย
    เวลาใช้งานก็เรียกเวบประมาณว่า http://localhost/cgi-bin/yourcgi

  4. หากต้องการเปลี่ยนหรือเพิ่ม port ให้แก้ไขแฟ้ม /etc/apache2/ports.conf เป็นประมาณตัวอย่างว่า
    Listen 80
    Listen 8010

  5. การสร้าง virtual host ให้แก้ไขแฟ้ม /etc/apache2/sites-available/default เป็นประมาณว่า
    <VirtualHost *:80>
    DocumentRoot /var/www/
    ServerName origin.hostname.domain
    </VirtualHost>
    *** ข้างบนนี้ต้องมีเพื่อให้คงชื่อ web host ของเดิมไว้

    <VirtualHost *:80>
    DocumentRoot /var/www/newfile
    ServerName new.name.domain
    </VirtualHost>
    *** เพิ่มชื่อ web host ใหม่เข้าไป

    <VirtualHost *:80>
    ServerName www.mydomain.com
    Redirect / http://new.domain.com/
    </VirtualHost>
    *** ทำการ redirect ต่อไปให้เวบอื่น

    ต้องแก้ไขแฟ้ม /etc/apache2/sites-available/default
    ให้ส่วนของ <Directory /var/www/> บริวเณประมาณบรรทัดที่ 14
    ต้องอนุญาติให้ AllowOverride All ดังตัวอย่าง
    <Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
    </Directory>

    เสร็จแล้วก็สั่ง apache ทำงานใหม่ ด้วยคำสั่ง sudo /etc/init.d/apache2 force-reload

  6. การสร้าง virtual host ที่เป็น https ทำดังนี้
    สั่งเปิด ssl ด้วยคำสั่ง sudo a2enmod ssl
    ดาวน์โหลดแฟ้มจาก ftp://ftp.psu.ac.th/pub/apache/apache2-ssl.tar.gz
    ด้วยคำสั่ง wget ftp://ftp.psu.ac.th/pub/apache/apache2-ssl.tar.gz
    แล้วแตกแฟ้มออกมาด้วยคำสั่ง tar -zxvf apache2-ssl.tar.gz -C /tmp
    คัดลอกแฟ้มไปยังตำแหน่งที่ถูกต้องด้วยคำสั่ง
    sudo mv /tmp/ssleay.cnf /usr/share/apache2
    sudo mv /tmp/apache2-ssl-certificate /usr/sbin
    sudo mkdir -p /etc/apache2/ssl

    สร้าง certification ด้วยคำสั่ง sudo apache2-ssl-certificate
    ระบบจะมีข้อความออกให้โต้ตอบ ก็ให้กดแป้น Enter อย่างเดียวจนเสร็จ

    แก้ไขแฟ้ม /etc/apache2/sites-available/default
    เพิ่มบรรทัดว่า NameVirtualHost *:443 เข้าไป
    ถัดต่อจากบรรทัดเดิมที่ว่า NameVirtualHost *:80
    แล้วสร้างเพิ่ม tag ทำนองเดียวกับ <VirtualHost *:80>
    แต่เปลี่ยนจากเลข 80 เป็นเลข 443 และเพิ่ม SSL ประมาณว่า
    <VirtualHost *:443>
    ......
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.pem
    </VirtualHost>
    เสร็จแล้วก็ให้ restart apache ใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 force-reload

  7. การทำให้ www server ไม่แสดงผลรายการชื่อแฟ้มใน directory
    ให้แก้ไขแฟ้ม /etc/apache2/sites-available/default
    ประมาณบรรที่ 14 ให้ลบคำว่า Indexes ออกจากส่วนของ
    <Directory "/var/www/l">
    ....
    </Directory>
    จากตัวอย่างข้อความเดิมคือ Options Indexes FollowSymLinks
    แก้ไขใหม่เป็น Options FollowSymLinks

    แล้วสั่งให้ apache ทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 force-reload
    /etc/apache2/httpd.conf
  8. หากต้องการบริการจำนวน client มากกว่าเดิม กลายเป็น 500 connection
    ต้องตรวจสอบว่า apache มีการจัดการ process แบบใด ให้ใช้คำสั่ง apache2 -l
    ถ้ามีข้อความคำตอบ prefork.c แสดงว่าจัดการ process แบบ MPM prefork
    ถ้ามีข้อความคำตอบ worker.c แสดงว่าจัดการ process แบบ MPM worker
    ให้แก้ไขที่แฟ้ม /etc/apache2/apache2.conf ที่ประมาณข้อความว่า

    หากเป็นแบบ MPM prefork ให้แก้ไขดังนี้ ที่ประมาณข้อความว่า
    <IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxClients 150
    MaxRequestsPerChild 0
    </IfModule>/etc/apache2/httpd.conf
    ให้แก้ใขค่า MaxClients และเพิ่มค่า ServerLimit เป็น 500 ดังตัวอย่าง
    <IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    ServerLimit 500
    MaxClients 500
    MaxRequestsPerChild 0
    </IfModule>

    หากเป็นแบบ MPM worker ที่ประมาณข้อความว่า
    <IfModule mpm_worker_module>/etc/apache2/httpd.conf
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadLimit 64
    ThreadsPerChild 25
    MaxClients 150
    MaxRequestsPerChild 0
    </IfModule>
    ให้ แก้ใขค่า MaxClients เป็น 500 และเพิ่มค่า ServerLimit เป็น 20
    หมายเหตุ. MaxClients = ServerLimit x ThreadsPerChild ดังตัวอย่าง
    <IfModule mpm_worker_module>
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadLimit 64
    ThreadsPerChild 25
    ServerLimit 20/etc/apache2/httpd.conf
    MaxClients 500
    # MaxClients 150
    MaxRequestsPerChild 0
    </IfModule>

    เสร็จแล้วสั่งให้ระบบทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 force-reload

  9. ตั้งค่าให้เวบแสดงผลภาษาไทยแบบ utf-8 โดยอัตโนมัติ
    ให้แก้ไขแฟ้ม /etc/apache2/conf.d/charset
    ตั้งค่าตัวแปรเป็นว่า AddDefaultCharset UTF-8
    เสร็จแล้วสั่งให้ระบบทำงานใหม่ด้วยคำสั่ง sudo /etc/init.d/apache2 force-reload

มาทำความรู้จักกับ java

 
    ก่อนที่เราจะเขียนโปรแกรมเราจะมาทำความรู้จักกับ java ซักนิดนะครับ java เป็นภาษาถูกพัฒนาโดยบริษัท Sun Microsystems ก่อนที่จะมาเป็นภาษา java นั้นเดิมทีเป็นภาษาที่ชื่อว่า ภาษา Oak ซึ่งทีมงานของบริษัทได้ทำขึ้นมาเพื่อควบคุมอุปกรณ์ไฟฟ้าขนาดเล็กและได้พัฒนา ต่อมาเรื่อยๆ จนเปลี่ยนชื่อมาเป็น java ภาษา java ,มีจุดเด่นอีกอย่างหนึ่ง คือ เราสามารถเขียนโปรแกรมในครั้งเดียวแต่นำไปใช้งานกับคอมพิวเตอร์ได้ทุก platform ทำให้ง่ายต่อการใช้งาน ภาษา java ภาษาหนึ่งที่มีการทำงานในลักษณะของ OOP (Objet-Oriented Programming) หรือ เรียกเป็นภาษาไทยว่า “การเขียนโปรแกรมเชิงวัตถุ” โดยจะเป็นวิธีการพัฒนาการจัดระเบียบการเขียนโปรแกรมอีกรูปแบบหนึ่ง ที่มีองค์ประกอบต่างๆ ให้เป็นวัตถุ (Object) โดยวัตถุก็จะมีวิธีการ (Method) ซึ่ง Object ใดๆ จะดำเนินการได้จะต้องมีสิ่งที่เรียกว่าต้นแบบ (Class) กำหนดเอาไว้ด้วย เอาล่ะครับมีคำศัพท์เข้ามาแล้ว คำศัพท์ 3 คำเหล่านี้เราจะใช้ในโอกาสต่อไปแน่นอนครับเราจะมาทำความรู้จักกับคำศัพท์ 3 คำนี้กันเลยครับ
Object
Opject หรือ วัตถุ หมายถึง สิ่งที่มีตัวตนและนำไปใช้ในการประมวลผลข้อมูล โดยใน Object จะต้องมีข้อมูลที่ใช้ในการอธิบายตนเองและการกระทำต่างๆ (Ation)
ที่ Object สามารถกระทำได้ใน java นั้น Object จะถูกสร้างขึ้นมาเพื่อเลียนแบบการกระทำที่อยู่ใน Class ต้นแบบ
Class
Class หมายถึง ตัวแบบ (Template) ที่นำไปใช้ในการสร้าง Object โดย Class จะประกอบไปด้วยลักษณะเฉพาะของ Data พร้อมทั้งรายละเอียดของ Action และ Method ซึ่งสามารถนำไปใช้งานได้โดยการสร้าง Object ขึ้นมาเพื่อดึงความสามารถที่อยู่ใน Class ไปใช้งาน
Method
Method หมายถึง ระเบียบวิธีในการทำงานของงานใดงานหนึ่ง ซึ่งจะถูกกำหนดไว้ใน Class จะเป็นการกระทำต่างๆ มี่จะให้ Object ดำเนินการ
เอาล่ะครับ สำหรับผู้เริ่มต้นอย่าเพิ่งทำหน้างงนะครับว่าผมกำลังพูดเรื่องอะไรอยู่ ที่ผมกล่าวมาข้างต้นนั้นเป็นสิ่งที่้ท่านจะต้องทำความเข้าใจกับมันให้ได้ เพราะเป็นภาพรวมของการเขียนโปรแกรม java ซึ่งภาษานี้จะมีวิธีการเขียนไม่เหมือนภาษาคอมพิวเตอร์รุ่นเก่าๆ เราต้องมา "คิดใหม่ ทำใหม่" กันครับ (สโลแกนคุ้นๆ) ผมจะยกตัวอย่างที่เห็นได้ชัดในชีวิตประจำวันของเราเพื่ออธิบายคำศัพท์ 3 คำข้างต้นให้เข้าใจมากยิ่งขึ้นนะครับ เอาเป็นว่าถ้าเราจะทอดไข่เจียวซัก 1 ฟอง ทานกับข้าวสวยร้อนๆ เราจะมีวิธีการอย่างไร (หิวเลย)
  1. ตอกไข่ใส่ถ้วย
2. ใส่น้ำปลาเล็กน้อย
3. ตีไข่
4. เปิดเตาแก๊ส
5. ตั้งกระทะ
6. ใส่น้ำมัน
7. ทอดไข่
8. นำใส่จานเสริฟพร้อมข้าวสวยร้อนๆ
8 ขั้นตอนข้างต้นเป็นการกระทำที่เกิดขึ้นในการทอดไข่เจียว ผมจะเรียกการกระทำเหล่านี้ว่า Method สิ่งต่อไปเรามาดูว่าใครเป็นคนกระทำ 8 ขั้นตอนเหล่านี้ ซึ่งก็ คือ ตัวเรานั้นเอง ผมให้ตัวคนทอดเป็น Object และสุดท้ายภาพรวมของการทอดไข่เจียวนั้นผมให้เป็น Class เราจะตั้งชื่อว่า "คลาสการทอดไข่เจียว" ดูแผนภาพต่อไปนี้ครับ  
 
จะเห็นว่าภายใน Class จะมี Method(วิธีการทอดไข่) ต่างๆ อยู่เพื่อเป็นต้นแบบให้กับ Object ซึ่งก็คือ ตัวคุณ โดย Method แต่ละตัวนั้นจะเป็นอิสระต่อกัน คุณลองนึกดูว่าแต่ละคนมีวิธีการทอดไข่ไม่เหมือนกัน ซึ่งจะทำขั้นตอนใดก่อนก็ได้ให้เหมาะสม บางคนอาจจะตีไข่เสร็จแล้วค่อยใส่น้ำปลา บางคนบอกตั้งกระทะก่อนค่อยตีไข่ก็ได้ แต่สุดท้ายก็ได้ผลลัพธ์เดียวกันคือ "ไข่เจียว"
บางคนเริ่มรู้สึกว่าผมมาสอนทำไข่ เจียวเหรอ มันเกี่ยวอะไรกับการเขียนโปรแกรมด้วย ที่ผมยกตัวอย่างไข่เจียวเพื่อให้คุณมองเห็นภาพครับ เพราะการเขียนโปรแกรมแบบ OOP มีข้อดีก็ตรงนี้แหละครับ คุณลองนึกดูว่าถ้าวันนึงมีคนมาบอกคุณว่าเขามีวิธีการทอดไข่เจียวที่เด็ดกว่า อร่อยกว่า แต่เขามีวิธีการทอดคล้ายๆ กับของเรานั่นแหละ เขาสามารถใช้ Class "การทอดไข่เจียว" ของเราไปดัดแปลงได้เลยครับ เขาอาจจะเพิ่ม Method บางส่วนลงไปใหม่ หรือแก้ไขบาง Method นิดหน่อยก็สามารถทำให้ไข่เจียวของเราอร่อยกว่าเดิมได้แล้ว โดยที่เขาไม่ต้องมานั่งไล่วิธีทำใหม่ตั้งแต่ต้น เช่นเดียวกับการเขียนโปรแกรมถ้าเป็นโปรแกรมที่มีขนาดใหญ่แล้วโปรแกรมนี้ถูก เขียนแบบ OOP เรา็สามารถแก้ไขโปรแกรมหรือพัฒนาโปรแกรมในภายหลังต่อได้โดยง่าย เพราะโปรแกรมถูกจัดให้เป็นสัดส่วนไว้แล้ว
ปัจจุบันเราสามารถแบ่งโปรแกรมจาวาออกได้หลายชนิด ได้แก่
1. Java 2 Enterprise Edition (J2EE) ใช้พัฒนาแอพพลิเคชั่นบนเครื่องเซิร์ฟเวอร์
2. Java 2 Standard Edition (J2SE) ใช้พัฒนาแอพพลิเคชั่นบนเครื่อง PC ทั่วไป
3. Java 2 Micro Edition (J2ME) ใช้พัฒนาแอพพลิเคชั่นบนอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก (เช่น โทรศัพท์มือถือ)
แต่ที่นิยมนำมาศึกษาในขั้นต้นก็คือ Java 2 Standard Edition (J2SE) ซึ่งเป็นการนำ Java มาเขียนเป็นโปรแกรมที่สามารถนำมาใช้งานได้อย่างอิสระ (StandAlone Program) เหมือนกับการเขียนโปรแกรมภาษาระดับสูงอื่นๆ เช่น C++ ,Pascal ,Cobol
การแปลโปรแกรมของ Java
ในการโปรแกรมภาษา Java หลังจากที่เราเขียน source code ขึ้นมาแล้วจะทำการรันโปรแกรมเพื่อดูผล Java จะมีวิธีการทำงานดังนี้ 





จากรูปเมื่อเราเขียน code ของโปรแกรมขึ้นมาแล้ว Java จะทำการ compile จาก Source Code นั้นมาเป็น Bytecodes (ไบต์โค้ด) ก่อน และสามรถนำไบต์โค้ดนั้นไปแปลเพื่อใช้งานบนเครื่องคอมพิวเตอร์ที่มีตัวแปลภาษาของ Java เรียกว่า Java Interpreter ก็จะได้ผลของการกระทำที่เราได้เขียนไว้
เอาล่ะครับมาถึงจุดนี้แล้ว คงจะพอมองเห็นภาพรวมของการเขียนโปรแกรมแบบ OOP ออกกันบ้างนะครับ ใครที่ยังงงอยู่ก็ไม่ต้องตกใจครับ ให้ท่านติดตามบทความไปเรื่อยๆ แล้วท่านจะเข้าใจไปเองโดยอัตโนมัติเมื่อไ้ด้ลองลงมือทำดู ในปัจจุบันการเขียนโปรแกรมแบบ OOP ได้มีใช้เกือบทุกภาษาแล้วครับแม้แต่ภาษา C เองก็ยังเปลี่ยนมาให้เขียนแบบ OOP เลยครับ เห็นไหมครับว่าเราต้องเรียนรู้มันอย่างเลี่ยงไม่ได้ซะแล้ว สำหรับบทความบทแรกนี้ก็คงเป็นการพูดคุยทำความรู้จักกับคนเขียนเองและความหมายของการเขียนโปรแกรมแบบ OOP กัน ใครมีข้อสงสัยใดก็โพสทิ้งไว้ที่เวบบอร์ดของเราได้เลยนะครับ ผมจะตามไปตอบให้ หรือถ้าใครมีความคิดเห็น แนะนำหรือติชม ผมก็ยินดีน้อมรับไว้ครับ ถ้าในบทความมีข้อผิดพลาดประการใด ผมก็อภัยไว้ด้วยนะครับ สำหรับบทความแรกคงจบลงเพียงเท่านี้ ติดตามตอนต่อไปได้เลยครับ ...   

ประวัติความเป็นมาของ PHP

PHP เกิดในปี 1994 โดย Rasmus Lerdorf โปรแกรมเมอร์อเมริกันได้คิดค้นสร้างเครื่องมือที่ใช้ในการพัฒนาเว็บส่วนตัวของเขา โดยใช้ข้อดีของภาษา C และ Perl เรียกว่า Personal Home Page และได้สร้างส่วนติดต่อกับฐานข้อมูลที่ชื่อว่า Form Interpreter ( FI ) รวมทั้งสองส่วน เรียกว่า PHP/FI ซึ่งก็เป็นจุดเริ่มต้นของ PHP มีคนที่เข้ามาเยี่ยมชมเว็บไซต์ของเขาแล้วเกิดชอบจึงติดต่อขอเอาโค้ดไปใช้บ้าง และนำไปพัฒนาต่อ ในลักษณะของ Open Source ภายหลังมีความนิยมขึ้นเป็นอย่างมากภายใน 3 ปีมีเว็บไซต์ที่ใช้ PHP/FI ในติดต่อฐานข้อมูลและแสดงผลแบบ ไดนามิกและอื่นๆ มากกว่า 50000 ไซต์
PHP2 (ในตอนนั้นใช้ชื่อว่า PHP/FI) ในช่วงระหว่าง 1995-1997 Rasmus Lerdorf ได้มีผู้ที่มาช่วยพัฒนาอีก 2 คนคือ Zeev Suraski และ Andi Gutmans ชาวอิสราเอล ซึ่งปรับปรุงโค้ดของ Lerdorf ใหม่โดยใช้ C++ ให้ มีความสามารถจัดการเกี่ยวกับแบบฟอร์มข้อมูลที่ถูกสร้างมาจากภาษา HTML และสนับสนุนการติดต่อกับโปรแกรมจัดการฐานข้อมูล mSQL จึงทำให้ PHP เริ่มถูกใช้มากขึ้นอย่างรวดเร็ว และเริ่มมีผู้สนับสนุนการใช้งาน PHP มากขึ้น โดยในปลายปี 1996 PHP ถูกนำไปใช้ประมาณ 15,000 เว็บทั่วโลก และเพิ่มจำนวนขึ้นเรื่อยๆ ต่อมาก็มผู้เข้ามาช่วยพัฒนาอีก 3 คน คือ Stig Bakken รับผิดชอบความสามารถในการติดต่อ Oracle, Shane Caraveo รับผิดชอบดูแล PHP บน Window 9x/NT, และ Jim Winstead รับผิดชอบการตรวจความบกพร่องต่างๆ และได้เปลี่ยนชื่อเป็น Professional Home Page ในเวอร์ชั่นที่ 2
PHP3 ออกมาในช่วงระหว่างเดือน มิุถุนายน 1997 ถึง 1999 ได้ออกสู่สายตาของนักโปรแกรมเมอร์ มีคุณสมบัติเด่นคือสนับสนุนระบบปฏิบัติการทั้ง Window 95/98/ME/NT, Linux และเว็บเซร์ฟเวอร์ อย่าง IIS, PWS, Apache, OmniHTTPd สนับสนุน ระบบฐานข้อมูลได้หลายรูปแบบเช่น SQL Server, MySQL, mSQL, Oracle, Informix, ODBC
PHP4 ตั้งแต่ 1999 - 2007 ซึ่งได้เพิ่ม Functions การทำงานในด้านต่างๆให้มากและง่ายขึ้นโดย บริษัท Zend ซึ่งมี Zeev และ Andi Gutmans ได้ร่วมก่อตั้งขึ้น ( http://www.zend.com ) ในเวอร์ชั่นนี้จะเป็น compile script ซึ่งในเวอร์ชั่นหน้านี้จะเป็น embed script interpreter ในปัจจุบันมีคนได้ใช้ PHP สูงกว่า 5,100,000 ไซต์ แล้วทั่วโลก และ ผู้พัฒนาได้ตั้งชื่่อของ PHP ใหม่ว่า PHP: Hypertext Preprocessor ซึ่งหมายถึงมีประสิทธิภาพระดับโปรเฟสเซอร์สำหรับไฮเปอร์เท็กซ์

PHP5 ตั้งแต่ 2007-ปัจจุบัน มี ได้เพิ่ม Functions การทำงานในด้านต่าง ๆ เช่น

    * Object Oriented Model
    * การกำหนดสโคป public/private/protected
    * Exception handling
    * XML และ Web Service
    * MySQLi และ SQLite
    * Zend Engine 2.0
 รายชื่อของนักพัฒนาภาษา PHP ที่เป็นแก่นสำคัญในปัจจุบันมีดังต่อไปนี้

    * Zeev Suraski, Israel
    * Andi Gutmans, Israel
    * Shane Caraveo, Florida USA
    * Stig Bakken, Norway
    * Andrey Zmievski, Nebraska USA
    * Sascha Schumann, Dortmund, Germany
    * Thies C. Arntzen, Hamburg, Germany
    * Jim Winstead, Los Angeles, USA
    * Rasmus Lerdorf, North Carolina, USA

ที่มา :
1.http://www.showded.com/myprofile/mainblog.php?user=san&jucId=2955&PHPSESSID=un
2.http://www.asiamediasoft.net/content/newboard/History-of-PHP
3.http://www.mindphp.com
4.http://www.zend.com/