15 May 2012
ทำ mail Server แล้ว gmail hotmail ไม่รับ mail ดัง รายละเอียด
'The IP you're using to send email is not authorized...'
In order to prevent spam, Gmail refuses mail when the sending IP address does not match the sending domain. To send mail from your server to Gmail, we suggest using the SMTP relay provided by your ISP. Please note that we are unable to whitelist IP addresses or otherwise make exceptions at this time.
เลยต้องฝากส่งด้วย Server ของ ISP โดยอ่านวิธีการจาก howtoforge
แก้ไฟล์ /ect/postfix/main.cf เพิ่มบรรทัด
relayhost = relay.cat.net.th
เท่านี้ gmail hotmail ก็ไม่รังเกียจ mail ของเราแล้ว
โดย sothorn ณ 15 May 2012 02:52 GMT
10 May 2012

บทความ Rites of Protest: Populist Funerals in Imperial St. Petersburg, 1876-1878 ของ Tom Trice ตีพิมพ์ใน Slavic Review Vol. 60, No. 1, Spring, 2001 พูดถึงแง่มุมด้านสัญลักษณ์ที่เกิดขึ้นในการเดินขบวนที่นำโดยนักศึกษา ในช่วงการเคลื่อนไหวสังคมนิยมในรัสเซียสมัยซาร์.
บนถนนมีขบวนของนักศึกษาและชาวเซนต์ปีเตอร์สเบิร์ก พวกเขาโห่ร้อง ตะโกนคำปฏิวัติ และแบกโลงศพของชายหนุ่ม ที่พวกเขาก็ไม่รู้จัก หรือคนที่คิดว่ารู้จักก็อาจเข้าใจผิด-จำเขาสลับกับชายอีกคนที่ตายไปก่อนหน้านี้นานแล้ว. แต่ใครจะอยู่ในโลงก็ไม่สำคัญ ที่สำคัญคือ ขบวนนั้นใหญ่เสียจนทุกคนในเมืองหลวงของรัสเซียต้องสนใจ แม้แต่ซาร์อเล็กซานเดอร์ที่สองเองด้วย.
แน่นอนว่าการเดินขบวนโดยปกตินั้น จะถูกควบคุมโดยเจ้าหน้าที่ของรัฐ แต่ชายหนุ่มหญิงสาวบนท้องถนนกำลังฉวยเอาการแห่ศพ มาหลบเลี่ยงการปราบปรามและเซ็นเซอร์โดยรัฐ. แม้ในนั้นยุคระบอบซาร์จะทรงอำนาจ แต่พลังของศาสนาก็ยังคงเข้มแข็งอยู่ ผู้ไม่พอใจกับระบบซาร์ จึงใช้ศาสนาเป็นเครื่องมือท้าทายรัฐ และพิธีศพในที่สาธารณะเช่นนี้ เป็นช่องทางในการรวมตัวและประท้วง-พร้อมกับเจือความคิดทางโลก/ทางการเมืองเข้าไปด้วย. การแสดงบนท้องถนนในระหว่างพิธีกรรม นำเอาศพของเพื่อนที่ตายเพราะระบอบซาร์มาโชว์ เรียกความเห็นใจจากชาวเมือง และขยายปริมณฑสาธารณะของรัสเซียออกไป.
คนที่ตายคือนักโทษการเมืองชื่อ Pavel Feoktistovich Chernyshev. เขาเคยเรียนแพทย์ที่ St. Peterburg’s Military Medicinal Academy ซึ่งหนึ่งในคนรุ่นนั้นบอกว่าเป็น “สวรรค์ของนักกิจกรรมประชานิยม.” ชีวิตและกิจกรรมของ Chernyshev นั้นไม่ได้มีอะไรหวือหวาสำคัญ แต่นักศึกษาก็สามารถนำเอาชีวิตของเขามาเฉลิมฉลอง เพื่อที่จะวิพากษ์ระบบเผด็จการ.
Chernyshev ถูกตำรวจจับเนื่องจากเข้าใจผิดว่าคือผู้ลี้ภัยชื่อ Ivan Chernyshev แต่ภายหลังที่ตำรวจพบว่าได้ทำผิดพลาด พวกเขาก็ไม่ได้ปล่อย Chernyshev. กรณีของ Chernyshev เป็นอีกตัวอย่างที่แสดงถึงความไม่ใส่ใจและละเลยหลักการกฎหมายของรัฐบาลเผด็จการ. เช่นเดียวกับเพื่อนร่วมชาติจำนวนมากของเขา ความตายของ Chernyshev นั้นมาจากโรคที่มักพบพร้อมกับความยากจนและการถูกกักขัง.
ในตอนแรกพิธีศพเป็นที่รู้กันไม่กี่ร้อยคน เฉพาะในวงญาติและผู้จัดงาน. ต่อมาชายไม่ทราบชื่อคนหนึ่งได้ติดต่อ และโน้มน้าวญาติ ๆ ของ Chernyshev ให้ “สหาย” ต่าง ๆ ของเขาเป็นผู้จัดงานให้.
แม้รูปแบบของขบวนแห่จะมีลักษณะตามธรรมเนียมทั่วไป แต่การปฏิบัติต่าง ๆ ในขบวนแห่ศพของ Chernyshev นั้นไม่ธรรมดา. คนในขบวนร้องเพลง Orthodox เสียงดัง เพื่อเรียกความสนใจ เมื่อมีคนถามว่าใครตาย พวกเขาก็จะตอบว่า “เหยื่อของความอยุติธรรมและสหายที่แสนดี.” เมื่อเดินผ่านสถานกักกัน พวกเขายกโลงขึ้นลงไปในอากาศสามครั้ง ราวกับจะโชว์ให้ทุกคนเห็นศพ. เมื่อถึงตอนนี้ พระที่ร่วมขบวนมาด้วย ก็กลัวและออกไปจากขบวน.
ขบวนการสังคมนิยม ประสบความสำเร็จในการรวมเอาภาพคริสเตียนของการตัดสิน ผู้ยอมพลีชีพเพื่อศาสนา (martyr) และดินแดนพันธะสัญญา มาเป็นกรอบให้ประชาชนมองการปฏิวัติ – ถึงระบอบเผด็จการจะยังมีอำนาจมากมาย แต่สักวันนึงสวรรค์ของสังคมนิยมจะต้องมาถึง. สิ่งที่ขบวนแห่ทำ คือการหยิบเอาพิธีศักดิ์สิทธิ์ซึ่งมีพลังในสังคมขณะนั้น มาใส่ความหมายทางโลกซึ่งก็คือสังคมนิยมเข้าไป เพื่อใช้รังสีบารมีของสิ่งศักดิ์สิทธิ์เสริมพลังให้กับอุดมการณ์สังคมนิยม.
“His faith is socialism, the people is god.”
ขบวนแห่ให้ประสบการณ์ของพวกเขาเกี่ยวกับศาสนาและการปฏิวัติที่ผ่านมาในรัสเซีย ฉวยเอาโอกาสในช่วงเวลาและพื้นที่ “ศักดิ์สิทธิ์” ซึ่งถูกสร้างโดยการแสดงของพิธีกรรมงานศพตามประเพณี เพื่อเสนอพลเมืองร่วมชาติของเขา ถึงทางเลือกที่นอกเหนือไปจากระบอบในขณะนั้น. ด้วยรูปแบบที่ไม่ได้มีลักษณะทางการเมืองในแบบเดิม ๆ พิธีกรรมทางศาสนา โดยเฉพาะพิธีเปลี่ยนผ่าน (rites of passage) เช่น พิธีศพซึ่งเกี่ยวกับความตาย นั้นมักดึงดูดผู้ต่อต้านระบอบ ผู้ซึ่งหวังให้พลังของพิธีกรรมช่วยให้กลุ่มเป็นน้ำหนึ่งใจเดียวกันและปรับความสัมพันธ์เชิงอำนาจเสียใหม่.
ด้วยการใช้ถนนสายหลักในเมืองหลวงเป็นเวทีแสดงของพวกเขา คนหนุ่มสาวในเซนต์ปีเตอร์สเบิร์กได้ใช้ท่าทางของพิธีกรรมและท่วงทำนองของศาสนาที่ผู้คนคุ้นเคย แสดงออกมาอย่างเด่นชัดถึงการอยู่ขั้วตรงข้ามของพวกเขาต่อระบอบเดิม ที่ผูกขาดอำนาจทางการเมือง ทั้งยังปฏิเสธหลักการกฎหมายสมัยใหม่ซึ่งเริ่มแพร่หลายในช่วงก่อนการปฏิรูปครั้งใหญ่. การแสดงศพเหยื่อของระบอบต่อสาธารณะ แม้เป็นเวลาสั้น ๆ แต่นั่นก็สะท้อนถึงอุดมคติทางการเมืองและทางสังคมของพวกเขา ที่พวกเขาได้ยอมสละชีวิต. ในกระบวนการนี้ พวกเขาได้แปลงเอานักโทษที่น้อยคนจะรู้จัก ให้กลายเป็นแกนสำคัญของการประท้วง.
แทบจะทันทีหลังจากการเดินขบวนแห่ศพของ Chernyshev หนังสือพิมพ์ Vpered! ก็ใส่ชื่อของ Chernyshev ไว้ใน “Martyology of the New Era”, หนังสือพิมพ์ดังกล่าวมอบพื้นที่ให้กับบทความสองสามชิ้นเกี่ยวกับการเดินขบวน. ในเวลาต่อมา Vpered! ก็ได้อ้างว่า การเดินขบวนดังกล่าวได้กลายเป็นตำนานไปแล้ว ในฐานะที่มันเป็นการเดินขบวนอุดมการณ์สังคมนิยมครั้งแรกในนประวัติศาสตร์เซนต์ปีเตอร์สเบิร์ก.
ตัวชี้วัดที่ดีที่สุดในมุมมองของผู้เขียน ถึงอิทธิพลของพิธีศพของ Chernyshev ก็คือเมื่อเวลาหนึ่งปีครึ่งถัดมา ที่หนุ่มสาวในเซนต์ปีเตอร์สเบิร์กได้ใช้พิธีศพสาธารณะของนักโทษการเมือง Anton Padlewski เพื่อประกาศความไม่พอใจของพวกเขาต่อระบอบซาร์.
สิ่งที่ผู้คนที่เดินไปสู่สุสานกับ Chernyshev และ Padlewski ได้ทำ ได้สร้างแรงบันดาลใจให้กับหนุ่มสาวในขบวนปฏิวัติให้ทำสิ่งดังกล่าวต่อไปอีก. เหมือน ๆ กับที่เพื่อน ๆ ของเขาในยุโรปตะวันตกทำ เหล่าผู้วิพากษ์วิจารณ์ระบอบซาร์หนุ่มสาวเหล่านี้ ได้ปรับเอาพิธีศักดิ์สิทธิ์ของศาสนา ผสมความหมายทางโลกเข้าไปในองค์ประกอบการปฏิบัติต่าง ๆ ของพิธี เพื่อถ่ายโอนเอาความศักดิ์สิทธิ์และประวัติศาสตร์ที่เดิมถูกใช้แต่เฉพาะกับความเชื่อของทางการ ให้มาเสริมความเชื่อของพวกเขา. พวกเขาได้ใช้ประโยชน์จากการให้เกียรติยกย่องและให้ความเคารพต่อพิธีศพเพื่อที่จะแสดงความเคารพต่อศพ ในการแสดงให้สาธารณะเห็นถึงอาชญากรรมที่เกิดขึ้น และได้ทำให้ผู้ที่ต้องการจะโต้เถียงนั้น ไม่สามารถที่จะโต้ได้ เนื่องจากจะเป็นการไม่ให้เกียรติกับผู้ตาย. พร้อม ๆ กับโฆษกของหนังสือพิมพ์ใต้ดินและของตำรวจ หนุ่มสาวเหล่านี้ได้ใช้ศิลปะโน้มน้าวให้ผู้คนที่ยังมีชีวิตอยู่และที่ตายไปแล้ว ได้มีคุณสมบัติของการโค่นล้มระบอบและการเป็นผู้ยอมสละชีพ และได้แปลงพวกเขาให้กลายเป็นสัญลักษณ์ของคนที่ต้องการจะโค่นล้มระบอบและผู้คนที่ต้องการจะหยุดมัน.
สิ่งที่สำคัญที่สุดก็คือ ผู้คนที่ได้ทำให้นักโทษการเมืองที่น้อยคนจะรู้จักสองคนให้กลายเป็นผู้ยอมสละชีพนั้น ได้ใช้ทักษะเป็นอย่างดีในการต่อรองกับขีดจำกัดที่ระบอบซาร์ได้เซ็นเซอร์และจำกัดการสนทนาสาธารณะด้วยตำรวจการเมือง, สิ่งนี้แสดงให้เห็นว่า ด้วยจินตนาการและการกล้าตัดสินใจ แม้แต่พิธีศาสนาที่ศักดิ์สิทธิ์ที่สุด ที่ดูเหมือนจะไม่มีช่องให้ปรับเปลี่ยนแก้ไขอะไรได้อีก ก็ยังสามารถถูกใช้เพื่อเปิดพื้นทั้งทางกายภาพและทางสัญลักษณ์ ในการอ้างและปกป้องสิทธิได้.
—-
ภาพประกอบดัดแปลงจากรูปถ่าย Church on Spilled Blood โดย On The Go Tours (ซึ่งสร้างหลังอเล็กซานเดอร์ที่สองตายนะ)


โดย bact ณ 10 May 2012 07:06 GMT
7 May 2012
ชีวิตผกผันเป็นเรื่องเกิดขึ้นจริงๆ เหมือนหลายๆคนที่รู้จักก็เคยเกิดเรื่องของชีวิตที่ผักผัน มันเปลี่ยนหน้าตาตัวเองหรือแนวคิดตัวเองจากหน้ามือเป็นหลังมือ การย้ำเตือนตัวเองว่าสักวันหนึ่งมันจะเกิดขึ้นกับตัวเองให้ตัวเองพึ่งระวังเอาไว้กับสิ่งที่จะเกิดขึ้นไม่ช้าก็เร็ว. เมื่อถึงจุดหนึ่งของชีวิตที่หลายอย่างไม่เป็นอย่างที่คาดหวัง มันก็เหมือนความรู้สึกและเหตุผลที่อยากให้มันเกิดขึ้น จมหายไปต่อหน้าต่อตา แม้จะเก็บความรู้สึกไว้มากสักเท่าไร สายธารของคาดหวังที่มันพังไปต่อหน้า ก็กระดังเข้ามา ความเจ็บปวดที่กัดกร่อนทำหน้าที่ของมันตามความคาดหวังอย่างที่เคยคิด และอยากจะให้เป็น การมองโลกในแง่ดีเพื่อให้ตัวเองออกจากสิ่งที่จมนั้นเหมือนกับการกล่อมตัวเองให้รอดพ้นจากแรงสายธารของความคาดหวัง มันเป็นอย่างนี้ซ้ำแล้วซ้ำอีก การมองโลกในแง่ดีแล้วไม่เป็นอย่างที่คาดหวังเราจะเจ็บปวด มันก็ไม่ได้เลวร้ายไปเสียทีเดียว มองโลกในแง่ร้ายก็ไม่ช่วยอะไรให้ดีขึ้นมาเมื่ออดีตมันผ่านพ้นไปแล้ว
เมื่อไรก็ตามที่ความคาดหวังพังลงนั้นเกิดขึ้นอีก ผมก็กลับมามองตัวเองถึงสิ่งที่ทำผิดพลาดไปแล้วขอร้องให้สิ่งเหล่านั้นไหลย้อนกลับมา ทั้งที่ความจริงแล้วมีโอกาสเพียงครั้งเดียว.
อะไรหลายอย่างไม่ได้เป็นอย่างที่คาดหวังมันจะพังไปตรงหน้า เราจะมองโลกด้านเดียว มันเป็นไปไม่ได้ หากหันหน้าคุยกันแล้วเส้นทางที่ตกลงกันนั้นทำให้อีกฝ่ายต้องเสียใจ มันก็เจ็บใจด้วยกันทั้งนั้น. คนเรามีทางต้องเดินต่อไปข้างหน้า ความทรงจำที่โกธรแค้นไม่ได้ช่วยให้เราก้าวไปได้อย่างมีความสุข เพราะความเจ็บปวดมันเกิดขึ้นทุกครั้งที่โกธรแค้น อย่าให้ชีวิตเราต้องติดกับสิ่งนี้ แม้จะต้องเดินไปข้างหน้า แต่อย่าลืมเงาแห่งอดีต มันต้องเข้าใจวา่อะไรเกิดขึ้น สิ่งที่เกิดขึ้นคืออะไร การอยู่อย่างเข้าใจทำให้มองเห็นอะไรในอีกมุมมองหนึ่ง ถึงมันจะแย่ แต่อย่างน้อยเราก็เข้าใจเพียงแต่มันแก้ไขไม่ได้ เพราะตัวแปรเหล่านั้นไม่ใชตัวแปรที่เราควบคุมได้ หากเป็นอนาคตที่คาดหวังมันก็เป็นตัวแปรที่ยากจะควบคุม.
ถ้าวันไหนที่หัวใจตัวเองล้มเหลวลงไป ก็กล่อมใจตัวเองว่าอดีตคือสิ่งที่สอน การก้าวต่อไปคือสิ่งที่ขอให้เกิดขึ้น
หากถามว่าอะไรคือสิ่งสุดท้ายที่จะขอให้เหลืออยู่ แม้จะมีตำหนิในสิ่งนั้น ก็ขอให้ก้าวต่อไป.
โดย chatsiri ณ 7 May 2012 16:45 GMT
29 April 2012
27 April 2012
19 April 2012
php-fpm error yii framework date_timezone_function
Problem
i use lighttpd with php-fpm ( FastCGI Process Manager ) ( php-fpm ) and install yii framework.
Chive is mysql management web-ui tool after install it's error with ..
"
Internal Server Error
strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function... "
Solve.#edit /etc/php.ini
edit date.timezone = 'Asia/Bangkok' ; this my case
restart php-fpm
fixed. :)
โดย udomsakc (noreply@blogger.com) ณ 19 April 2012 03:44 GMT
15 April 2012
- ยังไม่ถึงกับประกาศเป็นทางการนักในการเลิกบุหรี่ จากที่ซื้อเกือบทุกวัน ซองละ 140 รวมค่ารถถ่อไปซื้อ คงลด ละ เลิก ตาม step ไป บุหร่ที่สูบคือ Marlboro CRIP MINT ( ซองสีเงิน ) เพราะกลิ่นมันเบา สลายตัวง่าย ถ้าดูด มากๆ คนอยู่ใกล้ จะไม่เหมนเขียว หรือ ได้กลิ่นมากนัก
- ว่าจะ up & setup Zimbra server version 7 ยังไม่ได้ทำ คงนั่งทำคืนนี้แหละ ( อากาศมันร้อน คือ ข้ออ้าง )
- อะไร หลายๆ อย่าง ที่ได้ข้อคิด จาการนั่งอาน blog ชาวบ้าน
- คงต้องปรับ mode การ focus กับ เรื่องบางเรื่อง หรือ หลาย เรื่องๆ เพื่อให้ความต่อเนื่องมันเกิด หรือ แจ้งเตือนสำหรับบางเรื่อง เพื่อจะได้มี สมาธิในการทำงาน
- ที่ไม่ post ใน facebook เพราะแม่ตามอ่าน งานจะเข้าได้
- โต๊ะทำงาน ต้อง cleaning มันซะที เพราะรู้ว่าัมันรก จนหาที่ติไม่ได้
- เรื่อง task เวลาต้องทำให้มันดีกว่านี้ จริงที่บางคนบอกว่า การแบ่งเวลาถือเป็นความอัจฉริยะภาพอย่างนึ และ เราขาดไป
- ไม่อยากจะทะเลาะกับคนที่เรารัก
และ ไม่ถึงกับยอมทุกอย่างไป แต่ตั้งใจเอาไว้ ไม่อยากทะเลาะกันเลย ไม่ว่าจะเรื่องอะไร อันนี้สำคัญ เพราะมันฉุดกำลังด้าน อื่นๆ หมด ไ่ม่ได้โทษคนอื่นนะ แต่ โทษตัวเราเองนี่แหละ
- ซือ้หนังสือ พี่ตน มาอ่าน 1 เล่ม ( คุณตันมาอ่าน เมื่อวาน เพื่อรอดูหนัง Battle ship คนเดียวอีกตามเคย )
- จะ่อ่าน blog นี้ได้ คงต้อง google อย่างเดียว
- กาแฟสด ว่าจะเลิกกิน หันมาบริหาร การพักผ่อนของร่างกาย แทน ว่าจะมีทางไหนชดเชยได้บ้าง กาแฟกระป๋อง ที่บอกว่า เอาอยู่ กัน สำหรับผมปริมาณมันไม่พอ สำหรับต้านการนอนหลับได้ คงต้องฝึกวิธีที่เขาใช้กันมากว่า หลายพันปีแล้ว ดูขลัง แต่ทำยากนะ ปกติผมกินกาแฟ สด 2 - 5 shot ต่อวัน
- พบว่า การกินแป้ง หรือ น้ำตาลมากเกินไปทำให้ง่วงนอนได้ ฉะนั้นการกินกาแฟกระป๋องที่ผสมน้ำตาลมาก และ คาเฟอีนต่ำ ทำให้ง่วงนอนได้อีกเหมือนกัน
- ผมนอนดึกเป็นประจำไม่งานคอมฯ ก็เรื่องอ่าน feed ขาว สังเกตุได้ว่า พออยู่กับงานมากเกินไป สมองมักคิดไม่ออก ต้องหาอะไรที่มันไร้สาระบ้าง มันจะอ่านหรือจำได้ดีกว่า
- อันนี้สำคัญไม่เคยโทษใครเป็นต้นเหตุให้นอนดึก หรือ เสียสุขภาพ หรือ อะไรต่างๆ นาๆ
- วันที่ 17 เมษายน 2555 ประชุมกันอีกรอบ หลายฝ่ายอยากได้ตัว demo ทดลองใช้ของ Zimbra ในสภาพใกล้เคียงกับของจริง
- คอมฯ เพื่อชุมชน อยากจะทำหัลังจากขายฝันมานานล่ะ Software Service for Disaster อยากลงมือนั่งทำจริงๆ เสียที
- Alfresco คงเป็นโปรเจ็กต์งาน ขนานกันไป เพื่อให้ทัน ในเดือน กันยายายนนี้ ดันเขียนใส่ IADP อีก ทั้งๆ ที่ resouce project ไม่พอ ผลคือ ก็ต้องอยู่ ดึกนอนดึก สมองเครียด อีกตามเคย
โดย udomsakc (noreply@blogger.com) ณ 15 April 2012 09:20 GMT
10 April 2012
28 March 2012
ที่ผมเล่าใน blog ที่แล้ว ถึงการทำ hyphenation pattern สำหรับ TeX โดยใช้ patgen และใช้ค่าพารามิเตอร์จาก วิทยานิพนธ์ของ David Antoš นั้น เป็นการทดลองแบบ black box โดยที่ยังไม่เข้าใจโครงสร้างภายในของ patgen แต่เป็น proof-of-concept อีกขั้นหนึ่งเท่านั้น
หลังจากนั้น ผมก็ได้ศึกษาหลักการของ patgen โดยอ่าน วิทยานิพนธ์ของ Franklin Mark Liang จนพอเข้าใจหลักการ จึงสามารถนำมาปรับวิธีสร้าง pattern ของเราได้
Liang ได้เล่าถึงอัลกอริทึมต่าง ๆ สำหรับทำ hyphenation ที่มีอยู่ ซึ่งส่วนใหญ่จะเป็นการใช้กฎของภาษาอังกฤษ แต่งานของเขามุ่งจะสร้าง matching pattern โดยอัตโนมัติจากตัวอย่างข้อมูลที่มีอยู่ ซึ่งจะเป็นวิธีที่ไม่ขึ้นกับภาษา สามารถนำไปใช้กับภาษาใด ๆ ก็ได้
pattern ที่สร้างจะอยู่ในรูป n-gram ของอักขระ พร้อมระบุจุดที่สามารถแทรกยัติภังค์ได้ โดย n-gram ที่ว่านี้จะมีความยาวเท่าไรก็ได้ ขึ้นอยู่กับความเฉพาะเจาะจงของตัว pattern
ตัว pattern จะนำไปสร้างเป็น trie ทำให้ match กับข้อความได้อย่างรวดเร็ว และได้จุดที่สามารถแทรก hyphen ได้ออกมา
Liang พยายามจะให้ pattern ที่ได้สามารถรับประกันได้ว่าจะแทรกยัติภังค์ได้ถูกต้องทั้งหมดสำหรับคำที่อยู่ในพจนานุกรม (ยกเว้นกรณีกำกวมอย่าง re-cord กับ rec-ord ซึ่งภาษาไทยน่าจะไม่มี) ส่วนคำที่ไม่อยู่ในพจนานุกรมก็ปล่อยให้เป็นเรื่องของการอนุมานเอาจากกฎ
วิธีหนึ่งที่เป็นไปได้คือเก็บทุกคำในพจนานุกรมลงใน trie เลย แต่นั่นจะทำให้ฐานข้อมูลใหญ่โดยใช่เหตุ แต่วิธีที่ Liang เสนอคือ ให้แยกกฎเป็นสองกลุ่ม คือกฎสำหรับระบุจุดแทรก กับกฎที่เป็นข้อยกเว้นซึ่งห้ามแทรก ด้วยวิธีนี้ทำให้กฎชุดแรกสามารถอยู่ในรูปอย่างง่ายโดยไม่จำเป็นต้องถูกต้องสมบูรณ์ก็ได้ แล้วกฎชุดถัดมาจะตัดส่วนที่ผิดพลาดออกไป
ทีนี้ ก็สามารถมองต่อไปได้อีก ว่ากฎชุดที่สองนี้ ก็สามารถแบ่งเป็นกฎที่ห้ามแทรก กับกฎที่เป็นข้อยกเว้นให้แทรกได้ ทำให้กฎชุดที่สองสามารถอยู่ในรูปอย่างง่ายได้อีกเช่นกัน โดยข้อยกเว้นจะช่วยเพิ่มความถูกต้องให้อีกที
แล้วก็มองอย่างนี้สลับกันไปเรื่อย ๆ ก็จะได้ว่า กฎชุดที่ 1 แทรกยัติภังค์ก่อน, กฎชุดที่ 2 ลบยัติภังค์ออกจากชุดที่ 1, กฎชุดที่ 3 แทรกยัติภังค์เพิ่มจากชุดที่ 2, กฎชุดที่ 4 ลบยัติภังค์ออกจากชุดที่ 3 ฯลฯ กล่าวคือ กฎในลำดับขั้นคี่จะเป็นกฎแทรกยัติภังค์ กฎลำดับขั้นคู่จะเป็นกฎห้ามแทรกยัติภังค์ โดยกฎจะเพิ่มความละเอียดขึ้นเรื่อย ๆ จนถึงขั้นสุดท้ายที่จะได้ผลลัพธ์ที่ถูกต้อง 100% สำหรับคำที่อยู่ในพจนานุกรม ซึ่งปรากฏว่าการจัดชุดกฎแบบนี้ช่วยลดจำนวน pattern ที่ต้องใช้ลงได้มาก โดยยังคงความถูกต้องสมบูรณ์อยู่เหมือนเดิม
ในการสร้างกฎแต่ละขั้น patgen จะสแกนพจนานุกรมที่เป็นตัวอย่างการแทรกยัติภังค์ เก็บ pattern ที่มีความยาวในช่วงที่กำหนด แล้วประเมิน pattern ว่าสามารถทำได้ถูกต้องกี่กรณี (คือค่า good) ผิดกี่กรณี (คือค่า bad) แล้วเอามาคูณกับ weight ที่กำหนดให้ (คือ good_weight และ bad_weight) หักลบส่วนที่ถูกด้วยส่วนที่ผิดแล้วเลือกเอาเฉพาะ pattern ที่เกิน threshold ที่กำหนด
กล่าวคือในการสร้าง pattern แต่ละขั้น patgen จะถามค่าต่อไปนี้:
- pat_start, pat_finish คือช่วงความยาว pattern ที่จะสร้าง
- good weight, bad weight, threshold คือน้ำหนักของความถูกต้องของกฎที่จะกรองมาใช้ good weight คือน้ำหนักด้านการพบจุดแทรกที่ถูกต้อง (ถ้ามาก คือต้องการให้ครอบคลุมจุดที่แทรกได้ให้มากที่สุดไว้ก่อน ผิดไม่เป็นไร), bad weight คือน้ำหนักด้านการพบจุดแทรกที่ไม่ใช่ (ถ้ามาก คือต้องการเฉพาะกฎที่ถูกต้องไว้ก่อน ไม่เน้นการครอบคลุมจุดที่แทรกได้), threshold คือขีดต่ำสุดของคะแนนประเมินที่จะเลือกเอา pattern ไว้
เพื่อช่วยในการออกแบบ pattern ชั้นต่าง ๆ patgen ก็จะประเมินในขั้นสุดท้ายให้ด้วย ว่ากฎเท่าที่สร้างมา เมื่อนำกลับไปใช้กับพจนานุกรม สามารถครอบคลุมจุดแทรก (good) ไปแล้วกี่เปอร์เซนต์, มีจุดแทรกผิด (Liang เรียกว่า bad แต่เพื่อไม่ให้สับสนกับ bad weight ในที่นี้ขอเรียกว่า error) กี่เปอร์เซ็นต์ และยังมีจุดแทรกที่ยังไม่ได้แทรก (missed) กี่เปอร์เซ็นต์ (missed = 100% - good)
จากการทดลองหลาย ๆ แบบ Liang เสนอว่าควรแบ่งกฎเป็น 5 ชั้น โดยมีหลักการดังนี้:
- ชั้นสุดท้าย ให้เป็นชั้นแทรก (เลขคี่) เก็บรายละเอียดที่เหลือทั้งหมด โดยก่อนมาถึงขั้นนี้ error ควรจะเหลือศูนย์ มีแต่จะเน้นแทรกจุดที่ยังไม่ครอบคลุมเท่านั้น กฎในขั้นนี้ควรมี bad weight เป็นอนันต์ (ในทางปฏิบัติคือให้เป็นค่าสูงมาก ๆ) เพื่อให้แทรกเฉพาะจุดที่ถูกต้องโดยไม่เกิด error อีก
- ชั้นรองสุดท้าย ให้เป็นชั้นกำจัดจุดแทรกผิด (เลขคู่) โดยเน้นกำจัดแหลก เพื่อให้ error เหลือศูนย์ตามที่ว่าไป ดังนั้นในขั้นนี้ควรมี threshold เป็น 1 (คือเป็นค่าน้อยที่สุด) เพื่อให้ทุกกฎได้ทำงาน และตัวกฎไม่จำเป็นต้องเน้นความถูกต้องมากนัก กล่าวคือ สามารถยอมให้กำจัดจุดที่ถูกอยู่แล้วได้ เพราะถึงอย่างไรชั้นสุดท้ายก็จะครอบคลุมที่เหลือให้ทั้งหมดอยู่แล้ว
- ชั้นก่อนสองชั้นนี้ หากมีแค่ชั้นเดียวก็จะเป็นการกดดันมากเกินไป จะกลายเป็นว่าต้องการกฎละเอียดจำนวนมาก แต่ถ้าแบ่งเป็น 3 ชั้น ค่อย ๆ เพิ่มความละเอียดมากขึ้น ก็จะทำให้ได้จำนวนกฎน้อยลง
ด้วยโครงร่างแบบนี้ จึงออกแบบกฎเป็นชั้น ๆ ดังนี้:
- ชั้นที่ 1 กฎสั้น, เน้น bad weight เล็กน้อย, threshold สูง เพื่อคุมจำนวนกฎ
- ชั้นที่ 2 กฎยาวขึ้น, เน้น good weight เล็กน้อย เพื่อเน้นลดจำนวน error ถึงแม้จะมีการกำจัด hyphen ที่ถูกออกบ้างก็ไม่เป็นไร ยังมีชั้นที่ 3 ช่วยเติมให้, threshold ลดหลั่นลงจากชั้นที่ 1 เพราะกรณีเหลือน้อยลง สามารถปล่อยกฎผ่านได้มากขึ้น
- ชั้นที่ 3 กฎยาวขึ้นอีก, เน้น bad weight กว่าชั้นที่ 1 ตามระดับความละเอียดของเนื้องาน, threshold ลดหลั่นลงจากชั้นที่ 2
- ชั้นที่ 4 (รองสุดท้าย) กฎยาวขึ้นอีก, good/bad weight สูสีกัน (แต่ good weight ควรมากกว่า bad weight คล้ายชั้นที่ 2), threshold ควรเป็น 1 (ค่าที่น้อยที่สุด) ตามที่อธิบายไปข้างต้น
- ชั้นที่ 5 (ชั้นสุดท้าย) กฎยาวขึ้นอีก, bad weight เป็นอนันต์ (ค่าสูง ๆ), threshold เป็น 1 เพื่อให้ทุกกฎทำงาน
Liang บอกว่าไม่มีทฤษฎีอะไรมากกว่านี้อีกแล้ว ที่เหลือต้องทดลอง ทดลอง และทดลอง เพื่อหาพารามิเตอร์ที่ดีที่สุดของข้อมูล ซึ่งผมก็ต้องทดลองปรับค่าต่าง ๆ ทีละนิด หนักเอาการอยู่ จนกระทั่งได้ค่าที่คิดว่าเหมาะที่สุดเท่าที่เจอมาสำหรับข้อมูลพจนานุกรม libthai ที่ใช้แล้ว คือ:
| level |
good wt. |
bad wt. |
thres. |
pats added |
% good |
% errors |
| 1 | 1 | 2 | 6 | 375 | 90.30 | 10.61 |
| 2 | 2 | 1 | 4 | 250 | 88.88 | 1.61 |
| 3 | 1 | 3 | 2 | 524 | 96.21 | 1.66 |
| 4 | 3 | 2 | 1 | 295 | 95.98 | 0.00 |
| 5 | 1 | 5 | 1 | 726 | 100.00 | 0.00 |
| Total patterns | 2170 | |
เทียบกับพารามิเตอร์เดิมที่ใช้ ได้จำนวน pattern ทั้งหมด 3029 ก็ลดจำนวน pattern ลงมาได้ราว 28%
commit เข้า SVN ไปแล้วครับ คิดว่าอีกไม่นานคง release มาให้ทดลองใช้กัน
โดย Thep (noreply@blogger.com) ณ 28 March 2012 11:00 GMT
8 March 2012
จากที่ได้ blog ครั้งล่าสุด เกี่ยวกับ ThaiLaTeX ผมก็ได้ออกรุ่นซอฟต์แวร์ทั้งหมดที่เกี่ยวข้องไปแล้วตั้งแต่กลางเดือนกุมภา คือ Fonts-TLWG 0.5.0 และ Fonts-SIPA-Arundina 0.2.0 ซึ่งได้เปลี่ยนชื่อโครงการด้วย แล้วก็ตามด้วย ThaiLaTeX 0.4.7 ในคราวเดียวกัน เผอิญว่าติดธุระส่วนตัวมากจนไม่สามารถหาเวลานั่งเขียน blog ได้
เกี่ยวกับการเปลี่ยนชื่อโครงการฟอนต์ทั้งสองนี้ ก็ด้วยเหตุว่ามีการเปลี่ยนชื่อที่ปลายน้ำหลายจุดไปในทางเดียวกัน ไม่ว่าจะเป็นที่ Debian หรือ CTAN โดยสำหรับ Debian นั้น กลุ่มผู้ดูแลแพกเกจฟอนต์ของ Debian ได้กำหนดวิธีการตั้งชื่อแพกเกจฟอนต์ใหม่ ซึ่งก็ได้รับแรงบันดาลใจมาจาก Fedora อีกต่อหนึ่ง ส่วนที่ CTAN นั้น เขาต้องการชื่อแพกเกจที่สอดคล้องกันกับชื่อ style file ที่ติดตั้ง และไดเรกทอรีที่ติดตั้ง ควรมีเอกภาพเป็นชื่อเดียว ซึ่งก็ได้เลือกชื่อ fonts-tlwg
สำหรับโครงการ ThaiFonts-Scalable อีกอย่าง ตอนนี้ linux.thai.net ก็ได้โฮสต์โครงการฟอนต์หลายโครงการ การตั้งชื่อที่กว้างเกินไปอย่าง ThaiFonts-Scalable
ย่อมไม่เหมาะสมอีกต่อไป จึงได้เปลี่ยนชื่อเป็น Fonts-TLWG
และฟอนต์ชุด Arundina ก็เปลี่ยนเป็น Fonts-SIPA-Arundina
ในทำนองเดียวกัน
หลังจากที่เสร็จงานชุดนั้นไป ผมก็ได้นำประเด็นเรื่อง hyphenation ที่ได้ คิดไว้ ขึ้นมาพิจารณา โดยหารือร่วมกับนักพัฒนาในการประชุมระดมสมองโอเพนซอร์สภาษาไทยที่พัทยา เมื่อกลับมาแล้วก็ตกลงใจว่าจะเริ่มเดินหน้าต่อเลย
แนวทางที่คุยกันไว้นั้น เป็นไปได้หลายวิธี:
- ทำ hyphenation pattern สำหรับ TeX โดยใช้ patgen
- ปรับ swath ให้แทรก soft hyphen (
\-
สำหรับ TeX) ด้วย
สำหรับทางเลือกแรกที่ทำ pattern สำหรับ TeX นั้น หากทำสำเร็จจะสามารถใช้กับโครงการอื่น เช่น FOP ของ Apache รวมถึง LibreOffice ด้วย
ผมเริ่มจากทางแรกก่อน โดยอาศัย word list ของ libthai มาแทรกยัติภังค์ที่จุดที่เป็นไปได้ แล้วป้อนเข้า patgen สร้างเป็น hyphenation pattern ออกมา แล้วติดตั้งลงใน TeX ปรากฏว่าผลที่ได้เป็นที่น่าพอใจพอสมควร ดังตัวอย่างเปรียบเทียบการจัดย่อหน้าโดยใช้และไม่ใช้ยัติภังค์:

จะเห็นว่าช่องไฟที่โบ๋ ๆ ลดน้อยลง และทำให้ย่อหน้ากระชับเข้ามาอีก เมื่อสังเกตจุดตัดบรรทัดก็จะพบว่า TeX คำนวณจุดแบ่งบรรทัดโดยมองภาพรวมทั้งย่อหน้า ไม่ใช่คำนวณทีละบรรทัด
นี่เป็นผลในขั้นแรก ซึ่งได้ commit เข้าใน trunk ของ SVN ของ thailatex แล้ว โดยที่ผมยืมค่าพารามิเตอร์สำหรับ patgen มาจาก วิทยานิพนธ์ชิ้นหนึ่ง โดยยังไม่ได้ปรับละเอียดเองตามข้อมูลที่มี ซึ่งตรงนี้คงหาเวลาทำในโอกาสต่อไป
โดย Thep (noreply@blogger.com) ณ 8 March 2012 13:11 GMT
27 February 2012
26 February 2012
จริงๆ แล้วไม่ได้ไป แต่สั่งออนไลน์ของ บลิสพับฯ เอา ได้ราคาเดียวกันกับในงาน

- คินดะอิจิยอดนักสืบ ตอนที่ 24 ขาวกับดำ – ปก 260 สมาชิก 196
- คินดะอิจิยอดนักสืบ ตอนที่ 25 คริสต์มาสซาตาน – ปก 185 สมาชิก 130
- UNFAIR ฆาตกรรม (ไม่)อำพราง 2 – ปก 175 สมาชิก 123
- UNFAIR ฆาตกรรม (ไม่)อำพราง 3 – ปก 180 สมาชิก 126
- มิเกะเนะโกะ โฮล์มส์ แมวสามสียอดนักสืบ ตอนที่ 19 โรงแรมสนธยา – 175 สมาชิก 123
- ซายากะ สาวน้อยนักสืบ 14 ตอน เพลงกล่องสีเทาเหลือบเขียว – 175 สมาชิก 123
- ยาคุโมะ นักสืบวิญญาณ ตอนที่ 5 สายใยแห่งโชคชะตา – 225 สมาชิก 158
ช่วงน้ำท่วมไปรษณีย์ก็ยังส่งของได้ตามปกติไม่มีล่าช้า :D
วันนี้ – 4 พ.ย. มีงานหนังสือ KKU Book Fair ที่ Complex มข. นะครับ :)
โดย kitty ณ 26 February 2012 14:31 GMT
1 February 2012
For a few years that I have involved in Debian as a new maintainer. I have maintained some packages, "xiterm+thai", "flvmeta" and also the new ITP "ipset", which I have learned to package as well.
Many comments from several Debian Developers, especially Theppitak Karoonboonyanan and also Paul Wise, which I must say that both are the great teachers. They have pointed me to many good resouces for startup and also adviced me every mistakes I have made. They have shown that the "Debian Developers" is a kind of expertise and It's not easy if you do not try harder.
I know Theppitak as he is my idol and he who is the Debian guy that has introduced me to Debian as well. The first Debian distribution that I installed on the first my Debian computer (it's not my property, it's the company property that I worked with at that time) was "sid" aka. "unstable" and It's the main distribution that I always use for my main working laptop. IMHO, I never get back to any Linux distributions since I have found Debian.
I know Paul as he is a first Debian Developer I have met (at that time Theppitak was being in the NM process).
He is a cool guy. He also the first Debian Developer that signed my GPG key. He many times sponsored my packages and everytime for good practices.
However, the efforts you have get from the process are much more than you think as you could evaluate your self which you have more skills to handle with many problems than ever, you could package in the correct direction with a good quality. Obviously, you have learned to communicate with the communities which is the main reason that could bring you to be a good developer in the future.
Therefore, I have read the Debian Maintainer wiki page and applied the DM application (http://lists.debian.org/debian-newmaint/2012/01/msg00092.html) and thanks to both DDs that I mention above for their advocations.
Last, I have finished the last step 4 for account creation and my GPG key has been accepted to the active Debian Maintainer keyring (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=657331).
Finally, I'm now a Debian Maintainer.
โดย neutron ณ 1 February 2012 07:51 GMT
31 January 2012
โดยปกติแล้ว Web Server เครื่องๆ หนึ่งจะใช้สำหรับเว็บไซต์หลายเว็บ ซึ่งสามารถทำได้โดยการทำ Virtual Host โดยบน Apache สามารถทำได้ 2 แบบ คือ
1. IP Based Virtual Host คือการทำ Virtual Host โดยใช้ IP Address เป็นตัวแบ่ง ซึ่งวิธีนี้เราจะต้องมี IP สำหรับทุกๆ เว็บไซต์ที่จะทำ
2. Name Based Virtual Host วิธีนี้จะใช้ชื่อ domain name เป็นตัวแบ่ง โดยทุกๆ เว็บไซต์จะใช้ IP เดียวกันหมด ซึ่ง Hosting ส่วนใหญ่นิยมใช้แบบนี้ และวันนี้เราก็จะมาลองทำแบบนี้กัน ^^
ตัวอย่างที่เราจะทดสอบกันต่อไปนี้ Client เราจะใช้ Windows ส่วน Apache Web Server เราจะใช้ Linux CentOS ที่เราได้ทำการติดตั้งกันไปแล้วจากบทความก่อนๆ ส่วน DNS Server เราจะพูดถึงอีกทีในบทความต่อๆ ไป
เข้าเรื่องกันเลย อย่างแรกที่เราต้องทำก่อนก็คือกำหนดให้ domain name ของเรา point ไปยัง IP ของ Web Server ซึ่งในทีนี้ก็คือ 192.168.10.10 และเนื่องจากว่าเราเองยังไม่มี DNS Server ฉะนั้นในการทดสอบ ให้เราเข้าไปแก้ไข /etc/hosts ของเครื่องไคลเอนต์กันก่อน เพื่อกำหนดค่า ip ให้กับ domain แบบตรงๆ กันก่อน โดยถ้าใช้ windows ให้เข้าไปแก้ไขที่ไฟล์ c:\Windows\System32\drivers\etc\hosts และสำหรับ Linux ให้แก้ไขที่ไฟล์ /etc/hosts โดยให้เพิ่มบรรทัดต่อไปนี้
1
2
| 192.168.10.10 vhost1.unzeen.com
192.168.10.10 vhost2.unzeen.com |
เมื่อเพิ่มข้อมูลลงไปแล้ว ให้ทดสอบทำการ ping vhost1.unzeen.com ว่าได้ IP กลับมาถูกต้องหรือไม่ ถ้าได้แล้วก็ไปขั้นตอนถัดไปได้เลย

ขั้นตอนถัดไปให้เข้าไปที่ Linux Server และทำการสร้างโฟลเดอร์ /var/www/vhost1/ และ /var/www/vhost2/ เพื่อเอาไว้เก็บไฟล์ของเว็บไซต์
1
2
| # mkdir /var/www/vhost1/
# mkdir /var/www/vhost2/ |

จากนั้นทำการสร้างไฟล์ index.html ไว้ที่ /var/www/vhost1/ และ /var/www/vhost2/
# index.html ใน vhost1
1
2
3
4
5
6
7
8
| <HTML>
<HEAD>
<TITLE>VHOST1</TITLE>
</HEAD>
<BODY>
VHOST1
</BODY>
</HTML> |
# index.html ใน vhost2
1
2
3
4
5
6
7
8
| <HTML>
<HEAD>
<TITLE>VHOST2</TITLE>
</HEAD>
<BODY>
VHOST2
</BODY>
</HTML> |
เนื่องจากเราทำการล๊อกอินเข้าระบบด้วย root ฉะนั้นเพื่อความแน่ใจทำการเปลียน Permission ของ vhost1 และ vhost2 เล็กน้อย
1
2
| # chmod -R 755 /var/www/vhost1/
# chmod -R 755 /var/www/vhost2/ |

ต่อไปทำการแก้ไขไฟล์ /etc/httpd/conf/httpd.conf โดยให้เอา # หน้า NameVirtualHost ออก และเพิ่มบรรทัดในส่วนของ VirtualHost ลงไปตามตัวอย่าง
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin webmaster@unzeen.com
DocumentRoot /var/www/vhost1
ServerName vhost1.unzeen.com
ErrorLog logs/vhost1.unzeen.com-error_log
CustomLog logs/vhost1.unzeen.com-access_log common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@unzeen.com
DocumentRoot /var/www/vhost2
ServerName vhost2.unzeen.com
ErrorLog logs/vhost2.unzeen.com-error_log
CustomLog logs/vhost2.unzeen.com-access_log common
</VirtualHost> |

จากนั้นสั่ง restart service ของ apache ด้วยคำสั่ง
1
| # service httpd restart |

เท่านี้ก็เป็นอันว่าเราทำการสร้าง VirtualHost เป็นที่เรียบร้อย ทดสอบเปิดจาก Web Browser ดูได้

วันนี้เท่านี้ก่อน รอบหน้าเราจะมาต่อกันที่เรื่อง SSL กันจริงๆ หละ
โดย LookHin ณ 31 January 2012 18:48 GMT
22 January 2012
หลังจากได้เรียนรู้วิธีการติดตั้งโปรแกรมในแบบต่างๆ ไปแล้ว วันนี้เรามาต่อกันที่การติดตั้ง Web Server โดยเราจะทำการติดตั้ง apache ให้ทำหน้าที่เป็น Web Server (http) และติดตั้ง mod_ssl เพื่อเอาไว้ใช้ทำ Secure Web Server (https) จากนั้นจะทำการติดตั้ง php และ php extension ต่างๆ เพื่อเอาไว้ใช้กับโปรแกรมที่เขียนด้วย php ซึ่งในบทความนี้ จะไม่ได้พูดถึงการใช้งานภาษา Perl, Python หรือโปรแกรมภาษาอื่นๆ หากผู้อ่านสนใจ ก็ตามไปศึกษาจากแหล่งข้อมูลอื่นๆ กันตามสะดวก และถ้าหากมีโอกาสในคราวหน้าก็อยากจะลองใช้ nginx ซึ่งเป็น Web Server ที่กำลังมาแรงตัวหนึ่งเหมือนกัน ^^
เริ่มจากติดตั้ง httpd และ mod_ssl โดยใช้คำสั่ง
1
| # yum install httpd mod_ssl |

ระบบจะแสดงข้อมูลและแพกเก็จต่างๆที่ต้องติดตั้ง ให้กด y เพื่อทำการติดตั้งต่อไป

เปิดไฟล์ /etc/httpd/conf/httpd.conf และเพิ่มหรือแก้ไขบรรทัด ServerName ลงไป โดยให้ใส่เป็นชื่อของเซอเวอร์ของเราลงไป
1
| # nano /etc/httpd/conf/httpd.conf |

จากนั้นทำการ start service httpd ด้วยคำสั่ง

ทดสอบเปิดเว็บไซต์ดูได้เลย

เมื่อติดตั้ง apache เรียบร้อยแล้วเราก็มาติดตั้ง php และ php extension ต่างๆกันต่อ อย่างแรกใช้คำสั่ง yum list php* เพื่อดูว่ามี php extension อะไรบ้างที่น่าสนใจ ให้จดหรือจำชื่อของ extension ต่างๆที่ต้องการเอาไว้

ทำการติดตั้ง php และ php extension ต่างๆ ที่ต้องการ
1
| # yum install php-common php-cli php-devel php-mysql php-gd php-imap php-mbstring php-mhash php-pear php-xml php-xmlrpc |

ต่อไปทำการสร้างไฟล์ info.php ในโพลเดอร์ /var/www/html/ ด้วยคำสั่ง
1
| # nano /var/www/html/info.php |
และพิมพ์ Source Code ของ PHP ลงไปดังนี้
1
2
3
4
5
| <?php
phpinfo();
?> |

สั่ง restart service httpd สักหนึ่งรอบ ด้วยคำสั่ง
1
| # service httpd restart |

เมื่อทุกอย่างเรียบร้อย ให้ทดสอบเปิด info.php ผ่าน web browser ดูนะครับ ^^
1
| http://192.168.10.10/info.php |

ก่อนจบเราต้องเพิ่มให้ service httpd ทำงานทุกครั้งที่เปิดเครื่องด้วยคำสั่ง

รอบหน้าเราจะต่อกันด้วยการทำ https ให้กับ web server ของเรากันต่อ
โดย LookHin ณ 22 January 2012 10:58 GMT
20 January 2012
ได้ข่าวว่ามีอะไรใหม่ ใน Exteen.com อะไรก็ไม่รู้ ก็เลยมาลองโพสสักหน่อย อิๆ
20 January 2012 04:21 GMT
15 January 2012
I have setup some Squid 3.2 proxy servers which deployed in the TPROXY (fully transparent proxy, aka IP spoofing) mode. For the normal deployment could be found here (http://www.balabit.com/downloads/files/tproxy/README.txt).
But I have some special services running inside the box whose intercepting some of clients connections from Squid (via ICAP) and done the request modification before sending it to the origin server and acts as a man-in-the-middle. In this case, my requirement is to also spoofing the outgoing source address of my special services connections. Thus, I have decided to send the requests back to Squid to done the spoofing as well.
I was searching the Internet for the solution. In the first place, I tried to setup the TPROXY destination in the "PREROUTING" chain of "mangle" table but not success as the local generated packets didn't pass this chain.
I found this page (http://www.squid-cache.org/Doc/config/tproxy_uses_indirect_client) and it's lucky that this configuration directive only available in Squid 3.2+.
Therefore, I just setup my special services to make the outgoing connections with "X-Forwarded-For" http header included through the Squid that acts as a proxy on another port, eg. 3129.
For the Squid configuration, I just add
...
http_port 3129 tproxy
...
...
follow_x_forwarded_for allow localhost
...
tproxy_uses_indirect_client on
...
...
Finally, I could done the setup for IP spoofing for all of the connections and the boxes are now truely transparent as it should be.
Note: As the "3129" listening port should not be exposed to the outside of the box, therefore, it should not be allowed to accept the connections from outside. A simple iptables rules is
# iptables -A INPUT -p tcp --dport 3129 ! -s 127.0.0.1 -j DROP
โดย neutron ณ 15 January 2012 16:59 GMT
13 January 2012
31 October 2011
ไม่ได้เช็คเสียนาน วันนี้เข้าไปดู ข้อมูลล่าสุด ที่ International Earth Rotation and Reference System Service สรุปว่า
NO positive leap second will be introduced at the end of December 2011.
สรุปปลายปีนี้ Time Server ก็ไม่ต้องทดวินาที
.. ครั้งสุดท้ายที่มีการทดวินาที คือ 31 ธ.ค. 2008
Leap Second (อธิกวินาที) มันคืออะไร ? ทำไมต้องทด อ่านที่ http://en.wikipedia.org/wiki/Leap_second
โดย kitty ณ 31 October 2011 11:19 GMT
25 October 2011
สิ่งหนึ่งที่เป็นเรื่องน่ารำคาญสำหรับผมคือ Overlay Scrollbars ใน ubuntu โอเค ถ้าในหน้าจอเล็กๆ อย่าง netbook ก็ว่าไปอย่างแต่ใน notebook แล้วมันทำให้การทำงานยากขึ้น ซะอย่างนั้นแล้วเอา Feature นี้ออกดีกว่าโดยการคำสั่งนี้ใน Terminal
sudo su
echo "export LIBOVERLAY_SCROLLBAR=0" > /etc/X11/Xsession.d/80overlayscrollbars
แล้วทำการ Reboot หนึ่งครั้ง
ถ้าไม่ได้ผลให้ทำการ remove ออกดังนี้
sudo apt-get remove overlay-scrollbar liboverlay-scrollbar-0.1-0
แล้ว Reboot อีกที
และแล้ว Scrollbar อันเก่าที่เราคุ้นเคยก็กลับ อิอิ
ที่มา... http://www.webupd8.org/2011/04/how-to-disable-overlay-scrollbars-in.html
โดย q0022 (noreply@blogger.com) ณ 25 October 2011 09:59 GMT
2 October 2011
Quite a belated English blog (after the Thai version), due to busy personal life lately.
I had visited Yangon during 4-11 Sep. to give some talks and tutorials on Debian packaging and mirroring. And I've shared some information with community.
The visit was initiated by Ngwe Tun and the Myanmar L10N team. I found later that a Facebook event had been created for this.
Localization
The first day was a comparison between Myanmar and Thai supports in GNU/Linux, in which I briefed the status on Thai side, and Thura Hlaing on Myanmar side. It was nice that we had the Myanmar Computer Federation (MCF) director presiding the meeting til the end. That means GNU/Linux support has been awared at executive level.
According to Thura, Burmese has gained support in GNU/Linux quite well. On the rendering side, all the reordering for the logical order is normally done with pure GSUB in the fonts, without special processing on the rendering engine. This is suboptimal in principle, but it's the most effective way, as Windows redering engine itself does not yet support Myanmar, either.
For input method, Myanmar XKB map has been available in xkb-data for a long time, but to serve users' familarity with visual order typing, some reordering input methods have been developed, based on keymagic and ibus. But all are not context-sensitive like what's done for Thai in other frameworks. Fortunately, with the surrounding text API recently added to ibus, this has become possible.
One unusual requirement for Myanmar script editing is the caret movements. It needs to move syllable-wise, not character-wise nor cluster-wise. So, I suggested them to have a look on UAX #29 to see how it should be amended.
Myanmar locales are already done, both for GNU C library and CLDR. And even a GNOME applet for Myanmar lunar calendar is also available. This latter thing is what Thai can learn from.
Burmese word segmentation is not supported in general. But R&D works have been done for this in its NLP lab.
A serious issue left to solve is the existing abuses of Unicode. In Myanmar, there exist at least 14 variations of font hacks, abusing some free slots in Unicode charts as pre-composed clusters for information interchange (not for font internals), making plain text interchange impossible without the proper font for rendering.
For program translation, the new Myanmar L10N team is trying to request for a mass submission to the current GNOME team. And for Debian, Thura Hlaing and Ngwe Tun has already started the translation process with Christian's help.
Along my stay, I could see the team actively discussing on the IT glossary, trying to settle down the translated terms. This looked very fun.
Debian
Then, the next three days were a workshop on Debian packaging, where I have presented the basics of Debian package building, uploading, quality-controlling, modifying, creating and delivering. This aimed toward the development of a local distribution based on Debian.
Each day in the afternoon was the time for setting up a Debian mirror, not only for convenient local distro developement, but also for general users. This is important because internet penetration is still low in Myanmar. The main media for software distribution is CD/DVD, which means only stable version of Debian can be spread, which is not good for desktop users. Having a mirror should improve the situation somehow. It should make dist-upgrading to testing/unstable easier. And it should make CD snapshotting using local distributions easier, too.
For this, I also presented another quick slide on Debian mirroring & caching.
In the last day, I was introduced to the staffs of Myanmar NLP Lab and their projects, which include Myanmar OCR (based on tesseract), information retrieval, machine translation, and other lingustic resources like dictionary, lexicon and text corpus.
Furthermore, I was also offerred technical helps on developing a Lao/Esaan Tham font for a Lao and North Eastern Thailand variation of Tham script, which is Mon-based and is closely related to Myanmar script. (See some sample transliterations if you are curious how it looks like. It was part of my hacking during DebConf11 travelling.) Currently, its OpenType support is quite sufficient, but it still renders poorly on Mac OSX. To cope with this, I was given a Mac Mini as a present from Myanmar for its development, as well as some explanations on AAT features from a Myanmar font developer. And I am very grateful for that.
2 October 2011 08:31 GMT
22 September 2011
ออกมาตราการบริหารงานโค็ดใหม่ โดยตั้งเป็น dev server กับ production server เพราะโปรแกรมเมอร์เริ่มเยอะ แต่มันเหนื่อยเหมือนกันแฮะกับการมาไล่ดูว่าจะอะไรจะ up หรือไม่ up เข้า production server แต่ก็คุม bug ไปได้ส่วนหนึ่ง แต่ต้องใช้เวลากับแรงเยอะเหมือนกันนะ
โดย q0022 (noreply@blogger.com) ณ 22 September 2011 06:47 GMT
13 September 2011
เป็นแบบนี้ไหมครับ รู้ว่าปัญหาอยู่ที่ MySQL นี่แหละ แต่เป็นตรงไหนล่ะ เรามาดูเครื่องมือช่วยกันดีกว่า
mysqltuner
ตัวนี้สำหรับ admin โดยมันจะวิเคราะห์ข้อมูลต่างๆ ของ MySQL server ในขณะนั้นแล้วแนะนำว่าควรปรับค่าอะไร อย่างไร อันเนื่องมาจากว่าไม่มีสูตรตายตัวว่าควรปรับแต่งอย่างไร ซึ่งขึ้นอยู่กับข้อมูล และการใช้งานจริงด้วย
การติดตั้ง
# wget mysqltuner.pl -O mysqltuner.pl
เป็นการติดตั้งที่เท่มาก คือตัวนี้เป็น perl script ซึ่งปกติมันจะใช้ extension เป็น .pl เค้าเลยไปจดชื่อ domain เป็น mysqltuner.pl ไว้ คำสั่งนี้จึงหมายถึง ดาวน์โหลดหน้าเว็บหลักของ http://mysqltuner.pl/ ซึ่งมันจะให้ข้อมูลเป็น script รุ่นล่าสุดเสมอ เอามาบันทึกไว้ในชื่อ mysqltuner.pl
จากนั้นกำหนดให้ execute ได้
# chmod +x mysqltuner.pl
การใช้ สั่ง ./mysqltuner.pl แล้วใส่ชื่อแอดมินของ MySQL ปกติคือ root และรหัสผ่าน ก็จะได้ผลลัพธ์คล้ายๆ แบบนี้
# ./mysqltuner.pl
>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password:
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.1.58-1~dotdeb.1-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated -InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 30G (Tables: 670)
[--] Data in MEMORY tables: 45M (Tables: 8)
[!!] Total fragmented tables: 130
-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 3d 7h 10m 37s (43M q [153.856 qps], 1M conn, TX: 20B, RX: 8B)
[--] Reads / Writes: 49% / 51%
[--] Total buffers: 1.6G global + 8.4M per thread (500 max threads)
[OK] Maximum possible memory usage: 5.7G (73% of installed RAM)
[OK] Slow queries: 3% (1M/43M)
[OK] Highest usage of available connections: 36% (180/500)
[OK] Key buffer size / total MyISAM indexes: 1000.0M/19.4G
[OK] Key buffer hit rate: 99.9% (2B cached / 4M reads)
[!!] Query cache efficiency: 19.2% (3M cached / 17M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (162 temp sorts / 1M sorts)
[OK] Temporary tables created on disk: 0% (52 on disk / 734K total)
[OK] Thread cache hit rate: 64% (686K created / 1M connections)
[!!] Table cache hit rate: 19% (1K open / 9K opened)
[OK] Open file limit used: 55% (16K/30K)
[OK] Table locks acquired immediately: 97% (224M immediate / 231M locks)
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
query_cache_limit (> 16M, or use smaller result sets)
table_cache (> 1800)
ผลลัพธ์ก็อธิบายในตัวเองค่อนข้างชัดเจน บรรทัดที่นำหน้าด้วย [OK] ก็คือดีแล้ว ไม่มีปัญหาอะไร นำหน้าด้วย [--] คือเป็นข้อมูลแจ้งให้ทราบ ส่วน [!!] อันนี้ไม่ดีละ มีบางอย่างควรต้องพิจารณา ซึ่งจะมีสรุปด้านล่างว่าควรทำอะไร หรือปรับค่าตัวแปรอะไร เพื่อให้ประสิทธิภาพดีขึ้น แต่ไม่ต้องเชื่อมันทุกอย่างก็ได้ ฟังไว้เป็นข้อมูลประกอบก็พอ
ดูเพิ่มเติม http://mysqltuner.com/
mysql_slow_log_parser
ตัวนี้เหมาะสำหรับ developer ไว้วิเคราะห์ว่า query ใดเป็นตัวปัญหา โดยปกติเราสามารถกำหนดให้ MySQL บันทึก log ของ slow query ที่เกิดขึ้น แต่ปัญหาคือมันเยอะมากจนไม่รู้จะเริ่มดูตรงไหนก่อน ตัวนี้จะช่วยเอา slow log ทั้งหมดมารวบรวม จัดหมวดหมู่คำสั่งที่คล้ายกัน นำจำนวน รวมเวลาที่ใช้ทั้งหมด เวลาน้อยสุด เวลามากสุด เวลาเฉลี่ย แล้วเรียงลำดับตามเวลา query ทั้งหมดที่ใช้ไปจากมากไปน้อย
การติดตั้ง
ก่อนอื่นให้ตั้งค่าของ MySQL server ให้เก็บ slow log query ก่อน โดยแก้ไฟล์ /etc/mysql/my.cnf แล้ว uncomment และแก้บรรทัด 2 บรรทัดนี้
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 0
สังเกตว่าเราจะกำหนด long_query_time เป็น 0 นั่นคือให้เก็บ log ทุก query ไว้หมด เพื่อนำมาวิเคราะห์ จากนั้น restart mysql ด้วยคำสั่ง
# /etc/init.d/mysql restart
ดาวน์โหลด script mysql_slow_log_parser
# chmod +x mysql_slow_log_parser
การใช้งาน
ถ้าเป็นล็อกที่เกิดในวันนี้ คือหลังจากที่ logrotate ทำงาน ให้สั่ง
# ./mysql_slow_log_parser /var/log/mysql/mysql-slow.log > mysql-slow-info.txt
ดูผลที่เก็บในไฟล์
# less mysql-slow-info.txt
ถ้าเป็นล็อกที่เกิดขึ้นในวันก่อนๆ ซึ่งถูก rotate และ compress ไปแล้ว
# zcat /var/log/mysql/mysql-slow.log.1.gz | ./mysql_slow_log_parser > mysql-slow-info.1.txt
ดูผลที่เก็บในไฟล์
# less mysql-slow-info.1.txt
ตัวอย่างไฟล์ mysql-slow.log
# User@Host: xxx[xxx] @ localhost [127.0.0.1]
# Query_time: 0.004879 Lock_time: 0.000031 Rows_sent: 1 Rows_examined: 2313
SET timestamp=1315178855;
SELECT COUNT(*) AS numRows FROM group_topics WHERE group_id=167 AND status='NORMAL';
# Time: 110905 6:27:37
# User@Host: xxx[xxx] @ localhost [127.0.0.1]
# Query_time: 0.182972 Lock_time: 0.000036 Rows_sent: 1 Rows_examined: 104030
SET timestamp=1315178857;
SELECT member_id FROM member WHERE LOWER(user_id)='xxxxx' AND is_active='1' LIMIT 1;
ตัวอย่างผลลัพธ์ หลังจากผ่าน parser
Starting...
### 53018 Queries
### Total time: 204742.585691, Average time: 3.86175611473462
### Taking 0.000740 to 81.100860 seconds to complete
### Rows analyzed 100 - 1467
SET timestamp=XXX;
SELECT COUNT(*) AS total FROM chat_msgs WHERE owner_id=XXX AND is_unread='XXX';
SET timestamp=1315178847;
SELECT COUNT(*) AS total FROM chat_msgs WHERE owner_id=104170 AND is_unread='1';
### 29081 Queries
### Total time: 90838.2220840001, Average time: 3.12362786988068
### Taking 0.000353 to 82.103217 seconds to complete
### Rows analyzed 100 - 4387
SET timestamp=XXX;
SELECT friend_id FROM relation WHERE member_id=XXX AND status='XXX';
SET timestamp=1315178835;
SELECT friend_id FROM relation WHERE member_id=235929 AND status='ACCEPT';
สังเกตว่ามันจะแปลงส่วน value ทั้ง string และตัวเลข ให้เป็น XXX ก่อน แล้วนำมาแยกนับ วิเคราะห์คำสั่งที่เหมือนกัน ก็จะทำให้ทราบว่าคำสั่งใดถูกใช้บ่อยแค่ไหน (กี่ query) ใช้เวลารวมทั้งหมดเท่าไหร่ (Total time:) ใช้เวลาเฉลี่ยต่อ query เท่าไหร่ (Average time:) ใช้เวลาน้อยสุดถึงมากสุดเท่าไหร่ (Taking ... to ... seconds to complete) จำนวน rows ของผลลัพธ์ โดยมันจะแสดง query ที่ใช้เวลารวมมากที่สุดก่อน ซึ่งถ้า optimize ได้ก็จะมีผลมากที่สุด
อ่อ ที่เห็นผลลัพธ์อันนี้ดูแย่ๆ คือ average สูง และช่วงเวลาที่ใช้ต่ำสุด - สูงสุดกว้างขนาดนี้ เพราะมีปัญหาเรื่อง capacity ของเครื่องไม่พอน่ะครับ จึงเร็วบ้าง ช้าบ้าง ไม่แน่ไม่นอน
โดย Kamthorn Krairaksa (noreply@blogger.com) ณ 13 September 2011 05:18 GMT
4 September 2011
มีเหตุให้ต้องได้ช่วยฝ่ายอื่นแก้ปัญหาเรื่องประสิทธิภาพของเซิร์ฟเวอร์ลินุกซ์เลยขอบันทึกไว้หน่อยว่าเจออะไรบ้าง
เซิร์ฟเวอร์ให้บริการเว็บ ใช้ apache + php5 + mysql ตามปกติ อาการแรกที่เห็นคือเซิร์ฟเวอร์ไม่ตอบสนอง ถึงขนาด ssh เข้าไปยังต้องรอนานมาก และ timeout ไปหลายรอบกว่าจะเข้าได้ อาการนี้มักเกิดจากหน่วยความจำเต็ม จนต้อง swap หน่วยความจำบางส่วนลงดิสก์ ซึ่งบังเอิญหน่วยความจำที่มัน active อยู่ มันเกินหน่วยความจำจริง เลยเกิดการ swap ตลอดเวลา จน process ต่างๆ แทบจะทำงานอะไรไม่ได้ เพราะต้องรอหน่วยความจำจากดิสก์ก่อน
ทำไมหน่วยความจำจึงไม่พอ
เซิร์ฟเวอร์ตัวนี้ มีหน่วยความจำ 3GB ไม่ได้มากนัก แต่ก็ไม่น้อยเกินไป สาเหตุที่หน่วยความจำเต็มเกิดจาก apache httpd เกิดการแบ่งตัวเพื่อรับภาระงานจนเกินขนาดของหน่วยความจำ ซึ่งปกติเวลามี connection เข้ามา 1 อัน ต้องใช้ httpd 1 process ในการรับงาน แต่ละ process มีขนาดประมาณ 9-12MB กำหนดไว้สูงสุด 250 client ซึ่งเช็คแล้วพบว่าเต็ม 250 เลย จับคูณกันแล้วก็ราวๆ 3GB พอดี ยังไม่รวม mysql และอื่นๆ
การเพิ่มหน่วยความจำไม่ใช่ทางออกที่ถูกต้อง จริงๆ หน่วยความจำเยอะๆ ดี แต่มันจะไม่ช่วยในกรณีนี้ เพราะเทียบได้กับการให้บริการอะไรสักอย่างของหน่วยงานหนึ่ง แล้วพบว่าที่นั่งรอไม่พอ เลยขยายห้องรอเป็นสองเท่า เพื่อให้คนเข้ามารอได้เป็นสองเท่า จริงๆ ต้องไปแก้ที่ต้นเหตุคือทำไมการให้บริการของหน่วยงานนั้นๆ ถึงได้ช้า
ทำไม apache httpd ถึงช้าจนเกิด connection ค้างมากถึง 250 อัน
ส่วนใหญ่ (รวมทั้งกรณีนี้ด้วย) คือเกิดสภาวะรอ mysql ตอบ query ที่เรียกไป
แล้วทำไม mysql มันช้านัก
ในหลายกรณี (รวมทั้งกรณีนี้ด้วย) คือการเรียกใช้ query ไม่ได้ถูก optimize ให้ทำงานได้ดีที่สุด
การตรวจสอบว่า query ใดทำให้ mysql ช้า
ให้เปิดใช้ฟีเจอร์เก็บล็อกของ query ที่ช้าโดยเพิ่ม
log_slow_queries = /var/log/mysql-slow.log
long_query_time = 5
เข้าไปใน section [mysqld] ในไฟล์ my.cnf ซึ่งน่าจะอยู่ใน /etc/mysql หรือ /etc
แล้ว restart mysql แล้วตามเฝ้าดูในไฟล์ /var/log/mysql-slow.log
หลักการ optimize query
อันแรกสุดคือลดการเกิด full table scan ให้มากที่สุด full table scan คือการที่จะหาคำตอบของ query จำเป็นต้อง scan อ่านทั้งตาราง ซึ่งจะช้ามาก และช้าขึ้นเรื่อยๆ เมื่อตารางใหญ่ขึ้น การลดอาการนี้อันแรกคือ ให้ทำ index ที่จำเป็นต้องใช้บ่อยๆ เสมอ โดยให้ดูที่ ORDER BY กับ WHERE ว่ามีการอ้างถึง column ใดบ้าง อีกอันที่เจอคือบางคนใช้ WHERE sss LIKE '%xxxx%' ในการเปรียบเทียบ string ทั้งๆ ที่ xxxx นั่นคือทั้งหมดที่อยู่ใน column นั้นๆ อยู่แล้ว การใช้ %xxxx% ทำให้เกิดการค้นหาตลอดตารางเพื่อหาทุกแถวที่เป็นไปได้ ที่จริงแล้วในกรณีนี้ใช้แค่ WHERE sss = 'xxxx' ก็ได้
อีกอันคือให้หลีกเลี่ยงการ JOIN ให้มากที่สุด อาจจะลองเลี่ยงไปใช้ sub query ก็ช่วยได้พอสมควร
ตัวอย่างการ optimize query
ของเดิม
SELECT topic.ID, topic.Title, topic.Description, topic.Publisher_Name, topic.Upload_Date
FROM topic
LEFT JOIN topic_category ON ( topic.ID = topic_category.Topic_ID)
LEFT JOIN topic_media ON (topic.ID = topic_media.Topic_ID)
WHERE
topic.Status = 1
AND topic_media.Status = 1
AND topic.Approve_State = 1
AND topic_media.Type like '%image%'
GROUP BY
topic.ID
ORDER BY
topic.ID DESC
LIMIT 65625, 25;
ใช้เวลา 13.20 วินาที
เปลี่ยน like '%...%' เป็น = '...'
SELECT topic.ID, topic.Title, topic.Description, topic.Publisher_Name, topic.Upload_Date
FROM topic
LEFT JOIN topic_category ON ( topic.ID = topic_category.Topic_ID)
LEFT JOIN topic_media ON (topic.ID = topic_media.Topic_ID)
WHERE
topic.Status = 1
AND topic_media.Status = 1
AND topic.Approve_State = 1
AND topic_media.Type = 'image'
GROUP BY
topic.ID
ORDER BY
topic.ID DESC
LIMIT
65625, 25;
ใช้เวลา 12.79 วินาที
สังเกตว่าใช้ GROUP BY แต่ไม่มีการใช้ aggregate function เช่น sum() หรือ count() แสดงว่าแค่ตั้งใจให้แสดงแถวแบบไม่ซ้ำ ลองเปลี่ยนเป็น DISTINCT
SELECT DISTINCT topic.ID, topic.Title, topic.Description, topic.Publisher_Name, topic.Upload_Date
FROM topic
LEFT JOIN topic_category ON ( topic.ID = topic_category.Topic_ID)
LEFT JOIN topic_media ON (topic.ID = topic_media.Topic_ID)
WHERE
topic.Status = 1
AND topic_media.Status = 1
AND topic.Approve_State = 1
AND topic_media.Type = 'image'
ORDER BY
topic.ID DESC
LIMIT
65625, 25 ;
ใช้เวลา 10.65 วินาที
สังเกตพบว่ามีการ LEFT JOIN ตาราง topic_category แต่ไม่ได้เอามาใช้ทำอะไร งั้นตัดทิ้งไป
SELECT DISTINCT topic.ID, topic.Title, topic.Description, topic.Publisher_Name, topic.Upload_Date
FROM topic LEFT JOIN topic_media ON (topic.ID = topic_media.Topic_ID)
WHERE
topic.Status = 1
AND topic_media.Status = 1
AND topic.Approve_State = 1
AND topic_media.Type = 'image'
ORDER BY
topic.ID DESC
LIMIT
65625, 25 ;
ใช้เวลา 8.98 วินาที
เปลี่ยนจากการทำ LEFT JOIN เป็น sub query select
SELECT DISTINCT ID, Title, Description, Publisher_Name, Upload_Date
FROM topic
WHERE
ID IN (SELECT Topic_ID FROM topic_media WHERE Status = 1 AND Type = 'image')
AND Status = 1
AND Approve_State = 1
ORDER BY
ID DESC
LIMIT
65625, 25 ;
เหลือ 3.43 วินาที
ลองใช้ EXPLAIN SELECT เพื่อวิเคราะห์ว่ามีอะไรไม่เป็นไปตามที่ต้องการหรือไม่
EXPLAIN SELECT sql_no_cache DISTINCT ID, Title, Description, Publisher_Name, Upload_Date FROM topic WHERE ID IN (SELECT Topic_ID FROM topic_media WHERE Status = 1 AND Type = 'image') AND Status = 1 AND Approve_State = 1 ORDER BY ID DESC LIMIT 65625, 25 ;
+----+--------------------+-------------+----------------+----------------------+---------------+---------+-------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------+----------------+----------------------+---------------+---------+-------+-------+-----------------------------+
| 1 | PRIMARY | topic | ref | Approve_State,Status | Approve_State | 1 | const | 75581 | Using where; Using filesort |
| 2 | DEPENDENT SUBQUERY | topic_media | index_subquery | Topic_ID,Type,Status | Topic_ID | 8 | func | 2 | Using where |
+----+--------------------+-------------+----------------+----------------------+---------------+---------+-------+-------+-----------------------------+
พบว่า มี Using filesort เพราะตอน query นั้น mysql ให้ความสำคัญกับการ look up (WHERE) ก่อน จึงใช้ index Approve_State หรือ Status ส่วน PRIMARY ที่จำเป็นต้องใช้ตอนเรียงลำดับ (ORDER BY) ไม่ได้ใช้ (ขณะ query สามารถเลือก index ได้อันเดียว) ทำให้ต้องเสียเวลาไปเรียงข้อมูลใหม่ก่อน ในกรณีนี้อาจจะลองบังคับให้ใช้ index ที่ต้องการ โดยเพิ่ม FORCE INDEX (keyname) หลังชื่อตาราง เช่น
EXPLAIN SELECT sql_no_cache DISTINCT ID, Title, Description, Publisher_Name, Upload_Date FROM topic FORCE INDEX (PRIMARY) WHERE ID IN (SELECT Topic_ID FROM topic_media WHERE Status = 1 AND Type = 'image') AND Status = 1 AND Approve_State = 1 ORDER BY ID DESC LIMIT 65625, 25 ;
+----+--------------------+-------------+----------------+----------------------+----------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------+----------------+----------------------+----------+---------+------+-------+-------------+
| 1 | PRIMARY | topic | index | NULL | PRIMARY | 8 | NULL | 65650 | Using where |
| 2 | DEPENDENT SUBQUERY | topic_media | index_subquery | Topic_ID,Type,Status | Topic_ID | 8 | func | 2 | Using where |
+----+--------------------+-------------+----------------+----------------------+----------+---------+------+-------+-------------+
เมื่อเอา EXPLAIN ออก รันด้วยคำสั่งจริง
SELECT sql_no_cache DISTINCT ID, Title, Description, Publisher_Name, Upload_Date
FROM topic FORCE INDEX (PRIMARY)
WHERE
ID IN (SELECT Topic_ID FROM topic_media WHERE Status = 1 AND Type = 'image')
AND Status = 1
AND Approve_State = 1
ORDER BY
ID DESC
LIMIT
65625, 25 ;
ใช้เวลา 2.22 วินาที
ทั้งหมดนี้คือได้ผลลัพธ์เหมือนเดิมเป๊ะ
โดย Kamthorn Krairaksa (noreply@blogger.com) ณ 4 September 2011 11:59 GMT
31 July 2011
Flash Rom เจ้า Android คู่ใจทั้งสองเครื่องทุกครั้งก็ต้องมานั่งนึก เลยเขียนเก็บไว้ดีกว่า
โดย Zena (noreply@blogger.com) ณ 31 July 2011 21:49 GMT
19 July 2011
| |
AS Red |
AS Blue |
| นักร้องนำ: |
จองอา |
เรนะ |
| เน้นหน้าตา: |
ยูอี+นานา |
จูยอน |
| ตลก: |
|
ลิชี่ |
| เต้น/rap/ร้องก็ดีแต่ไม่ค่อยเด่น: |
กาฮี |
|
| เล่นเครื่องดนตรีได้หลายอย่าง แต่ไม่ได้เล่นหรือเปล่า?: |
|
อียอง |
19 July 2011 07:07 GMT
17 July 2011
วันนี้มีโอกาศไปดู Transformers: Dark of the Moon มาครับ
หาโอกาสไปดูมานานละกว่าจะมีเวลาว่างก้ต้องรอหยุดยาวอย่างช่วงนี้แหละ
ก่อนเข้าโรงผมก็เหมือนหลายๆ คนแหละที่สงสัยว่าถ้าไม่มี Megan Fox หนังเรื่องนี้จะเป็นยังไง
พบว่าหนังเปิดตัวนางเอกใหม่เร็วมาก และแม้จะไม่ถึงกับทำให้ลืม Megan Fox ได้
แต่ก็ทำให้ผมหลงได้เหมือนกัน (ยังแอบคิดถึง Fox อยู่ผมว่าเธอมีสเน่ห์เฉพาะตัวนะ)
พี่เบย์ไม่ทำให้ผิดหวังเหมือนเดิม ระเบิดภูเขา เผากระท่อม ตามสไตล์เค้าละ
และหุ่นก็ดึงความสนใจทุกอย่างของผมไปจนหมดสิ้น
CG โคตรจะอลังการงานสร้าง จัดหนัก จัดเต็มกันไปไม่เสียชื่อพี่เบย์เค้า
ภาคนี้ก็มีซีนเท่ๆ ของทางผู้พันเช่นเดิม จังหวะลุยเข้าไปทางอากาศเท่มาก
ไอเดียโคตรเจ๋ง เอามาเป็นยุทธวิธีการรบจริงในเมืองได้เลย
หนังเรื่องนี้ผมหวังมาดูสามอย่าง
1. หุ่น แน่นอนอยู่แล้วภาคนี้จัดเต็มคุ้มตั้งแต่ผ่านมาครึ่งเรื่องแล้วครับ
2. ไอเดียของบทเท่ผู้พัน ภาคแรกเท่มาก แว้นมอเตอร์ไซค์ แล้วสไลด์ไปกับพื้น เก็บ Decepticon โคตรเท่ ภาคนี้ก็ไม่แพ้กันแถมให้มาอีกหลายซีนสมใจกันเลยทีเดียว
3. Megan Fox สิครัฟ >.< แต่เดี๋ยวก่อน ภาคนี้เปลี่ยนนางเอกนี่นา แล้วก็ทดแทนกันได้ในระดับสูสีทีเดียว เพียงแต่หนังยิ่งเดินไปคุณเธอยิ่งมิดชิดขึ้น ไม่เป็นไรให้อภัยได้ เพราะความ Sexy ของคุณเธอไม่ธรรมดาทีเดียว
ส่วนเรื่องบทนะเหรอครับ ผมรับได้นะ ไม่ได้อ่อนอะไรขนาดนั้น ลองเคยดู The Expandables ก่อนเหอะแล้วเรื่องนี้แทบจะบทเทพขึ้นมาเลยล่ะ ลายละเอียดเล็กน้อยของแต่ล่ะฉากก็เก็บงานเจ๋งดีฮะ
ที่สำคัญถ้าไม่ได้ดู Autobot แปลงร่างบนจอใหญ่ๆ บิ๊กบึ้มมันจะได้อารมณ์ตรงไหนกัน
โดย Zena (noreply@blogger.com) ณ 17 July 2011 20:36 GMT
13 July 2011
"คืนคอนเอนกายซึมซับไอดิน คืนถิ่นถวิลหาอาทร
คืนบ้านที่เสมอสมรสบ่รอน คืนคอนเถิดหนาบินหลาดง"
14/07/54 02:00
"ณ ที่นี่แดนนี้บ่มีฉัน ตลกครันฉันฝืนยืนเฝ้าหา
ปรุงแต่งแข่งขันนั้นมายา อนิจจาฉันตื่นยืนเดียวดาย..."
14/07/54 02:15
โดย MrChoke ณ 13 July 2011 19:20 GMT
24 March 2011
ก่อน
อื่นก็ต้องขอออกตัวตามธรรมเนียมก่อนว่า ผมไม่ได้มีอคติกับ Google
แต่อย่างใด ในทางกลับกันผมยังเป็น Fan Google คนหนึ่ง เพราะหลายๆ
อย่างผมยังคงได้รับประโยชน์จากบริการของ Google อยู่ แต่เพราะความเป็น Fan
นี่แหละผมอยากเห็น Google เดินบนเส้นทางที่ดีกว่าบริษัทอื่นๆ
ที่เมื่อโตขึ้นแล้วชอบทำตัวไม่ดี อย่างที่เราเห็นๆ กัน เรื่องมันมีอยู่ว่า
ช่วงก่อนที่ Firefox จะปล่อย Firefox 4 ออกมานั้นผมลองค้นหาพวกนี้ดู
ก็มีอะไรผิดสังเกตุเกิดขึ้นกับ Google Search นั้นคือ Google Ads
ตอนแรกเลยที่ผมเจอคือผมพิมพ์คำว่า getfirefox ลงไป ก็มี Google Ads
ขึ้นมาโดยมี Title ว่า Download Mozilla ถ้าดูเผินๆ ก็ไม่มีอะไรผิดปกตินะ
แต่ที่สะดุดตาและทำให้ผมแทบไม่เชื่อสายตาตัวเองนั้นคือ link ของ Ad
ตัวนี้มัน link ไปที่ www.google.co.th/Chrome เฮ้ย..... เกิดอะไรขึ้น
เกิดอะไรขึ้น คำถามในใจผม สงสัยจะมีข้อผิดพลาดนะ ด้วยความอยากรู้อยากเห็น
ผมก็ลองใช้ keywords ต่างๆ ทดสอบ พบว่า Google Ads ของ Chrome นั้นขึ้นแบบ
Random และที่สำคัญคือ จะขึ้นกับ Keywords ที่เกี่ยวข้องกับ Web Browser
เช่น มีคำว่า Download นำหน้า แล้วตามด้วย Firefox , Internet Explorer และ
Opera นอกจากนี้ยังมี Keywords ที่น่าเกลียดสุดๆ อย่าง Free music Google
Ads ก็ขึ้นมาด้วย ไอ้ตัวหลังนี้เจอโดยบังเอิญตอนที่ผมกำลังพิมพ์ Firefox
โดยเริ่มพิมพ์ตัว F มันก็ขึ้นมาอันแรกเลย Free Music
ไม่รู้จะเป็นเรื่องน่าขำหรือเป็นเรื่องเศร้าดี ยักษ์ใหญ่อย่าง Google
มีปัญญาขาย Google Chrom ด้วยการยัดเยียด แบบแหกตาชาวบ้านแบบนี้ เศร้าจริงๆ
ครับ
<object class="video-filter video-youtube vf-kduwvwsoifk" data="http://www.youtube.com/v/kDuwvWsOifk&fs=1" height="225" type="application/x-shockwave-flash" width="400">
<param name="movie" value="http://www.youtube.com/v/kDuwvWsOifk&fs=1"/>
<param name="wmode" value="transparent"/>
<param name="allowFullScreen" value="true"/>
</object>
ภาพเคลื่อนไหวที่จับไว้ได้
แต่
ที่น่าแปลกอีกเรื่องคือเรื่องนี้พวกบรรดา Geek
เมืองไทยไม่ค่อยให้ความสนใจเท่าไหร่ แต่กลับไปสนใจเรื่อง iPhone
ถ่ายภาพแล้วติดเหลืองอะไรพวกนั้น ฮ่าๆ ก็ไม่รู้นะผมยากให้ Google ทำตัวดีๆ
อย่าเหมือนเจ้าอื่นเลย......
ด้านล่างเป็นภาพตัวอย่างที่จับไว้




ข้อมูลเพิ่มเติมจากพี่สัมพันธ์ แห่ง OSDEV ผู้ที่ค้นพบปัญหานี้ก่อนผม พอดีผมก็เพิ่งทราบว่าพี่แกเจอมาก่อน พี่สัมพันธ์ทดสอบแล้วพบว่าปัญหานี้เกิดขึ้นเฉพาะ ip ที่อยู่ในประเทศไทยเท่านั้น ภาพด้านล่างคือภาพที่ใช้ผ่าน proxy พบว่า ads ถูกต้องไม่มีการหลอกกันครับ
read more
โดย MrChoke ณ 24 March 2011 07:02 GMT
19 June 2010