4 February 2012
ขอขอบคุณ พี่โดม (โดม เจริญยศ), คุณ Donga (ถนอมทรัพย์ นพบูรณ์), คุณ เริงฤทธิ์ (Rerngrit Rakkanittakorn), และคุณ kenggg (ปฏิพัทธ์ สุสำเภา) ที่ได้หย่อนสตางค์สนับสนุนการทำงานซอฟต์แวร์เสรีของผม
แต่ละท่านต่างก็กำลังร่วมเดินในเส้นทางซอฟต์แวร์เสรีและโอเพนซอร์สด้วยกัน ขอให้ประสบความสำเร็จตามที่มุ่งหวังนะครับ
ขอขอบคุณเป็นพิเศษสำหรับพี่โดมที่ได้เชิญชวนใน Facebook ให้ร่วมกัน donate ให้ผมครับ
โดย Thep (noreply@blogger.com) ณ 4 February 2012 05:33 GMT
3 February 2012
๏ มาจะกล่าวบทไป
บั๊กหนึ่งใน ThaiLaTeX เล็กนักหนา
เพียงวูบวับขยับปีกกรีดกรายมา
เกิดลมพาถาโถมโพยมบน ฯ
จากที่ได้เขียนถึง ปัญหาอัญประกาศ ใน ThaiLaTeX ไปเมื่อปลายธันวา นับจากวันนั้นถึงวันนี้ เวลาว่างของผมก็หมดไปกับการแก้ ThaiLaTeX และสิ่งที่เกี่ยวข้อง โดยบั๊กนี้ได้กลายเป็นผีเสื้อกระพือปีกที่ทำให้เกิดผลพวงเป็นพายุใหญ่ได้ทีเดียว
เริ่มจาก:
- พบว่าลำดับ `` และ '' ในเอกสาร ThaiLaTeX ไม่ได้มีการแปลงเป็นอัญประกาศคู่ แต่ยังคงรูปเป็นอัญประกาศเดี่ยวสองตัวเหมือนเดิม ซึ่งพบว่าปัญหาอยู่ที่ฟอนต์
- ระหว่างตรวจสอบปัญหาในกฎ ligkern ของ virtual font ก็พบว่ามีลำดับอื่นที่ยังไม่มีการแปลงเช่นกัน เช่น ?` (¿), !` (¡), \dag (†), \ddag (‡) ฯลฯ ดังที่กล่าวไปแล้วใน blog ก่อน
- ขณะทดสอบผลการแก้กฎ ligkern ก็พบว่า swath ไปแทรกรหัสแบ่งคำตรงกลางระหว่างลำดับ `` กลายเป็น `{\wbr}` ในบางกรณี
- ก่อนจะลงมือแก้ swath ก็ชักทนปวดหัวกับซอร์สที่อ่าน (โคตร) ยากของ swath ไม่ไหว จึงจัดระเบียบซอร์สเสียใหม่ ตั้งแต่ใช้เครื่องมือจัดสไตล์ของซอร์สอัตโนมัติแล้วมาปรับแต่งด้วยมือทีหลัง ปรับเปลี่ยนโครงสร้าง ตัดตัวแปรหรือ member ที่ไม่จำเป็น ซึ่งกลายเป็น commit ชุดใหญ่ คือประมาณ 40 commit ใน 4 วัน ส่งท้ายปีเก่า หลังจากนั้นจึงได้แกะและแก้บั๊กที่ต้องการ และปรับโค้ดต่ออีกนิดหน่อย
- กลับมาที่ ThaiLaTeX เอง เพื่อจะทดสอบฟอนต์ต่าง ๆ จึงมีการปรับเปลี่ยนเอกสารทดสอบ (teststd.tex) ให้รวมลำดับอักษรพิเศษด้วย แต่เพื่อความสะดวกในการปรับแก้ จึงจัดโครงสร้างเอกสารใหม่เสียก่อนโดยใช้แมโคร แล้วจึงแก้เพิ่ม
- กลับมาแก้ฟอนต์ที่เหลือต่อ โดยหลังจากที่ทดสอบกับฟอนต์ Norasi ที่มี glyph ค่อนข้างครบแล้ว ก็จำเป็นต้องไล่เพิ่ม glyph พิเศษทั้งหมดที่ lthenc.def ตัวใหม่รองรับในฟอนต์ที่เหลืออีก 11 family ในชุด tlwg ซึ่ง glyph ที่ขาดก็มากบ้างน้อยบ้างแล้วแต่ฟอนต์
- หลังจากเพิ่ม glyph ที่จำเป็นสำหรับ LaTeX แล้ว ก็จำเป็นต้องเพิ่ม glyph ละตินที่เหลือด้วย มิฉะนั้นการแสดงผลบนเดสก์ท็อปก็จะแหว่งไป ซึ่งปริมาณ glyph ที่เพิ่มนั้นเยอะกว่าชุด LaTeX หลายเท่า
- การเพิ่ม glyph ละติน มีบางฟอนต์ที่ต้องวาดเพิ่มเอง ไม่สามารถหยิบยืมจากฟอนต์อื่นได้ ก็จำเป็นต้องดูขนาดของเส้นจากอักษรอังกฤษที่มี ซึ่งทำให้พบว่ามีบางฟอนต์ที่เส้นอักษรอังกฤษยังไม่สม่ำเสมอ จึงต้องนั่งปรับเส้น glyph อังกฤษเสียก่อน ได้แก่ฟอนต์ Loma ซึ่งมีการหยิบยืมไปใช้ในฟอนต์ Umpush ด้วย การแก้ครั้งนี้จึงทำให้ฟอนต์ทั้งสองได้เส้นที่สม่ำเสมอยิ่งขึ้นด้วย
- ระหว่างทดสอบ พบบั๊กในฟอนต์ Loma และ Umpush เมื่อใช้กับเอกสาร LaTeX คือสระบนและวรรณยุกต์จะเยื้องกัน ทำให้คำว่า "ที่" จะวาดไม้เอกและสระอีไม่ตรงแนวกัน ก็แก้บั๊กนี้ในฟอนต์ทั้งสองด้วย
บั๊กตัวแรกที่พบจึงไม่ใช่แมลงธรรมดา แต่เป็นผีเสื้อกระพือปีกด้วยประการฉะนี้
ยังเหลือฟอนต์ชุด Arundina ต้องทำต่ออีกครับ แล้วค่อยออกทั้งชุดพร้อมกันทีเดียว
โดย Thep (noreply@blogger.com) ณ 3 February 2012 05:08 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
21 January 2012
วันนี้ไปถึง BITEC บางนา แบบไม่ต้องพึ่งแท็กซี่ที่สถานนี้ออนนุชอีกแล้ว เพราะไปถึงสถานีบางนาแล้วเดินลงมาก็แทบเจอเลย. แว๊บแรกผ่าน อ่านเป็น "Del.icio.us" ทีไหนได้กลับมาดูในกล้องตัวเองมันเขียนเป็น "Deli.cio.us".

โดย chatsiri ณ 21 January 2012 18:17 GMT
20 January 2012
ได้ข่าวว่ามีอะไรใหม่ ใน Exteen.com อะไรก็ไม่รู้ ก็เลยมาลองโพสสักหน่อย อิๆ
20 January 2012 04:21 GMT
19 January 2012
Twitter-bootstrap helper tool release By Twitter designed useful when you want to developer twitter web application you can fork from github ( https://github.com/twitter/bootstrap )
โดย udomsakc (noreply@blogger.com) ณ 19 January 2012 13:07 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
6 January 2012

ธนบัตร 5 ปอนด์สเตอร์ลิง ออกโดย Clydesdale Bank ในสกอตแลนด์ ด้านหน้าเป็นรูป อเล็กซานเดอร์ เฟลมมิง ผู้ค้นพบยาปฏิชีวนะ "เพนิซิลลิน"
การจะเลือกบุคคลสักคนหรือสักกลุ่มหนึ่งไปอยู่ในธนบัตร เราคงเดากันได้ไม่ยากว่า คนเหล่านั้นจะต้องมีความสำคัญกับประเทศหรือดินแดนนั้นมากแน่ จึงได้รับเลือกไปอยู่ในสิ่งของที่คนเกือบทุกคนใช้กันอยู่เกือบทุกวัน
สำหรับประเทศที่เคยผ่านการต่อสู้เพื่อให้ได้เอกราชหรือปลดแอกจากระบอบเผด็จการ กลุ่มผู้นำการปฏิวัติก็มักจะถูกเลือกมาอยู่บนธนบัตร ในประเทศที่มีกษัตริย์ รูปกษัตริย์ทั้งในอดีตและปัจจุบันมักจะถูกนำมาใช้ อย่างไรก็ตาม ก็ยังมีหลายประเทศหลายดินแดนที่ไม่ได้เป็นอย่างนั้น เช่น ญี่ปุ่น สเปน (ก่อนจะใช้เงินยูโร) อังกฤษและเวลส์ ไอร์แลนด์เหนือ และสกอตแลนด์ (สองอันหลังนี้ ใช้สกุลปอนด์สเตอร์ลิงทั้งคู่ แต่พิมพ์ธนบัตรเอง แยกต่างหากจาก Bank of England) ที่บุคคลบนธนบัตรเป็นบุคคลอื่น ๆ ด้วย โดยเป็นบุคคลที่เคยทำคุณงามความดีให้กับประเทศหรือเป็นบุคคลที่มีชื่อเสียง เช่น นักปรัชญา กวี นักวิทยาศาสตร์ นักประดิษฐ์
สกุลเงินยูโรน่าจะเป็นสกุลเงินเดียวที่ธนบัตรและเหรียญไม่มีรูปบุคคลเลย ทั้งนี้เป็นความตั้งใจในการออกแบบ ที่จะเลือกสิ่งที่ทุกประเทศในยูโรโซนสามารถเชื่อมโยงตัวเองเข้าไปได้ จึงไปใช้รูปสถาปัตยกรรมแทน โดยสถาปัตยกรรมเหล่านั้นก็ไม่ได้เป็นสิ่งปลูกสร้างที่มีอยู่จริง เพียงแต่วาดขึ้นมาให้มีรูปแบบที่พอจะทำให้นึกถึงสิ่งปลูกสร้างคล้าย ๆ กันในท้องที่ต่าง ๆ ของยุโรป
เมื่อวันสองวันก่อน เพื่อนในเฟซบุ๊กคนหนึ่งลองคิดเล่น ๆ ว่าถ้าเมืองไทยจะลองออกธนบัตร อาจจะเป็นธนบัตรที่ระลึกเนื่องในโอกาสพิเศษ เราจะลองเลือกใครมาอยู่ในธนบัตรได้บ้าง ขอเอามาแปะต่อ :
ชุด “ชาวต่างชาติที่มาร่วมพัฒนาประเทศสยาม” — ชุดนี้อาจจะออกเป็นที่ระลึกในวาระฉลองความสัมพันธ์ของไทยกับประเทศต่าง ๆ
ชุด “หลัก 6 ประการของคณะราษฎร” — ชุดนี้อาจจะออกเป็นที่ระลึกในวาระฉลองรัฐธรรมนูญหรือวันชาติ 24 มิถุนายน หรืออาจจะเป็นในวาระวันเกิดของแต่ละคนก็ได้
ใครสนใจ ลองดูต่อได้ที่วิกิพีเดีย: รายชื่อบุคคลในธนบัตรของประเทศต่าง ๆ
(โพสต์ไปไม่ทันไร มีคนบอกว่า จะเอา “หลินปิง”!!!)


โดย bact ณ 6 January 2012 06:26 GMT
Setup PHP ( 5.3.8 ) + lighttpd on Fedora core 15 with quick and dirty Jobs with user home dir homepage ( mod_userdir )
หลังจากเช้้านี้ มีความจำเป็นต้องทำ report ส่ง แต่ติดปัญหา เนื่องจาก notebook ไม่เร็วพอ และ ขณะเดียวกันก็ติดปัญหา ต้องรัน script PHP เลยต้องย้ายมาเครื่อง desktop ของที่ทำงานแทน ต้องมั่งนั่ง set อีก ครึ่งชั่วโมง
ปัญหาที่เจอก็คือ เรื่องการ run script PHP + lighttpd บน Fedora core 15 พบว่าบน Turorial ทั้งหลายแหล่ ใช้งานไม่ได้ มันก็จริงตามที่คนอื่นบอก Howto ทั้งหลายแหล่ + tutorial มักใช้งานไม่ได้จริง พักหลังๆ มาเจอกับตัว หลายเวบล่ะ ทำเองดีกว่า เข้าเรื่อง
Install basic php5 and lighttpd
Install php-fpm
- enabled lighttpd module
- restart service
- degug log if error
ตอนแรกจะ set เป็น CGI ง่ายๆ เอารัน PHP ก็พอ แต่ปรากฏว่า Fedora Core 15 ไม่มี package CGI มาให้ งานเข้าล่ะ เรื่องยาวแน่มีแต่ FastCGI เอาวะ Fast ก็ Fast
vim /etc/lighttpd/lighttpd.conf or replace with this configuration below var.log_root = "/var/log/lighttpd"
var.server_root = "/var/www"
var.state_dir = "/var/run"
var.home_dir = "/var/lib/lighttpd"
var.conf_dir = "/etc/lighttpd"
var.vhosts_dir = server_root + "/vhosts"
var.cache_dir = "/var/cache/lighttpd"
var.socket_dir = home_dir + "/sockets"
include "modules.conf"
server.port = 80
server.use-ipv6 = "enable"
server.username = "lighttpd"
server.groupname = "lighttpd"
server.document-root = server_root + "/lighttpd"
server.pid-file = state_dir + "/lighttpd.pid"
server.errorlog = log_root + "/error.log"
include "conf.d/access_log.conf"
include "conf.d/debug.conf"
server.event-handler = "linux-sysepoll"
server.network-backend = "linux-sendfile"
server.stat-cache-engine = "simple"
server.max-connections = 1024
index-file.names += (
"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)
url.access-deny = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" , ".rb" , ".py" )
include "conf.d/mime.conf"
include "conf.d/dirlisting.conf"
server.follow-symlink = "enable"
server.upload-dirs = ( "/var/tmp" )
vim /etc/lighttpd/module.conf or replace with this configuration below # ** NOTE ** i'm enabled mod userdir
server.modules = (
"mod_access",
"mod_cgi",
"mod_alias",
"mod_auth",
"mod_evasive",
"mod_redirect",
"mod_rewrite",
"mod_setenv",
"mod_usertrack",
"mod_fastcgi",
)
include "conf.d/status.conf"
include "conf.d/userdir.conf"
include "conf.d/fastcgi.conf"
include "conf.d/cgi.conf"
include "conf.d/debug.conf"
vim /etc/lighttpd/conf.d/fastcgi.conf
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
( "php-tcp" =>
(
"host" => "127.0.0.1",
"port" => 9000,
"check-local" => "disable",
"broken-scriptfilename" => "enable",
)
)
)
**Option if you want to debug lighttpd set /etc/lighttpd/debug.conf
debug.log-request-handling = "enable"
debug.log-request-header = "enable"
debug.log-request-header-on-error = "enable"
debug.log-response-header = "enable"
debug.log-file-not-found = "enable"
debug.log-condition-handling = "enable"
**Option if you want to enable per user homepage set '/etc/lighttpd/conf.d/userdir.conf
server.modules += ( "mod_userdir" )
#userdir.path is your userdir homepage
userdir.path = "project"
- restart service
- **NOTE** for default Fedora if you not set rule for SELinux **disable it before otherwise you will got error and can't running '/etc/selinux/config'
- log file of lighttpd is '/var/log/lighttpd/* '
- log file of php-fpm is ' /var/log/php-fpm/*
- จบข่าว
โดย udomsakc (noreply@blogger.com) ณ 6 January 2012 05:01 GMT
13 December 2011

ถ้าศิลปะคือความงดงาม ถ้าศิลปะคือความซาบซึ้ง นี่ไม่ใช่ศิลปะ
ถ้าศิลปะเปลือยให้เห็นความอัปลักษณ์ นี่(อาจจะ)เป็นศิลปะ
ขอเชิญร่วมงานแสดงศิลปะกลางแจ้ง “แท่งอัปลักษณ์”
เพื่อบอกให้โลกรู้ว่า ที่ใดไม่รัก ที่นั่นติดคุก
เสาร์ 17 ธ.ค. 2554 @ อนุสาวรีย์ประชาธิปไตย
ร่วมสร้างงาน เที่ยงตรง เปิดงาน 5 โมงเย็น


โดย bact ณ 13 December 2011 13:14 GMT
11 December 2011
After installed CUDA Toolkit version 4.0 and Development driver for CUDA. Source code was built from GPU Computing SDK which show error unsupported GCC version 4.6
host_config.h:82:2: error: #error -- unsupported GNU version! gcc 4.6 and up are not supported!
If you install GCC version-4.4, It's can support with toolkit there. You will install package GCC version-4.4 and read here in step 5. CUDA example builds code success when i do soft link to new directory.
โดย chatsiri ณ 11 December 2011 17:35 GMT
21 November 2011
ส่วนตัวใช้ Ubuntu Desktop Login ด้วย root ตลอด เพราะเห็นว่าก็ใช้เครื่องอยู่คนเดียว Desktop ไม่ใช่ Server ก็ไม่น่าจะทำอะไรพลาดด้วย user root แต่เหตุผลที่แท้จริงคือ ขี้เกียจ sudo ต่อมาก็มีโปรแกรมหลายตัวที่บ้าจี้ไม่ยอมให้รันด้วย user root เช่น Chromium Browser และ VLC ก็อยากรันด้วย root น่ะจะทำไม ก็ต้องหาใน Google ครับ ค้นเจอมาหลายวิธี แต่วิธีนี้ "เอาอยู่" ก็เลยบันทึกลิงค์ไว้กันลืม
http://caleudum.com/play-vlc-and-chromium-browser-on-backtrack-5/
โดย sothorn ณ 21 November 2011 01:39 GMT
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
29 October 2011
Thai flood crisis is the worst
Bangkok needs the boats travel
Gov'ment got donated from all people
Tags showed from someone else live in Dubai
Leader does nothing just reads
She can do no sh*t baby
"We will defend capital !" she said
Underestimated nature she knows nothing !
Water now hits all areas
People, get your gears evac !
Cabinet passes casino act this time ?
Now, sin is legal happy ? Thailand !
ผิด grammar / ผิดข้อบังคับโคลงสี่ฯ ก็อย่าว่ากัน .. ผมมันก็แค่ประชาชนโง่ๆ
โดย kitty ณ 29 October 2011 05:28 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
12 May 2010
นั่งอ่านดราม่าที่ กรรมกรไซเบอร์ และ การผลักดันนโยบายตามระบอบประชาธิปไตย โดย mk เจ้าเก่า
- เป็นอะไรที่น่าสนใจ แนะนำให้อ่าน
- ไม่รู้ว่าสองอันนี้มันเกี่ยวกันไหม ถ้าเกี่ยว ไอ้การที่จะแค่แลกเปลี่ยนความคิดเห็นในเรื่องนโยบายสาธารณสุขกัน แล้วถึงขั้นไล่ให้ไปตั้งพรรคการเมือง มันก็คงจะเกินไป แต่นั่นเป็นเรื่องของการถกเถียง สนทนา ก็ว่ากันไป
- แต่ก็มีมุมมองที่น่าพิจารณา ในแง่ของแนวคิดที่ว่าอยากได้อะไรก็ตั้งกลุ่มตั้งพรรคของตัวเองไป lobby เอา
- ซึ่งผมตั้งข้อสังเกตว่า ถึงแม้มันจะมีส่วนจริง แต่ดูเหมือนมันจะเป็นการดูถูกอาชีพนักการเมืองกันไปหน่อยไหม
หรือว่าไม่?
ผมเสนอความเห็นว่า (และผมจะเสนอเฉยๆ จะไม่ไปตั้งพรรคการเมือง)
- ในอุดมคติแล้วนักการเมืองควรจะเป็นอาชีพจริงๆ เป็นอาชีพที่มีเกียรติ และคนที่จะเป็นต้องมีความสามารถในการบริหาร และต้องเสียสละ ไม่ใช่ว่าใครก็เป็นได้ หรือเปล่า
- พรรคการเมืองควรจะมีอุดมการณ์และแนวคิดในการบริหารประเทศ มีมุมมองที่กว้างขวางทั้งในระดับประเทศและระดับโลกนะ
- กล่าวคือ ตัวตั้งต้องเป็นประเทศ ส่วนการจะมีแนวคิดที่ไปทางด้านใดด้านหนึ่ง อันเนื่องมาจากหรือไม่เนื่องมาจากการสนับสนุนโดยกลุ่มย่อย ข้างใดข้างหนึ่ง ก็เป็นไปได้
- แต่เมื่อมีการขัดแย้งกันระหว่างตัวตั้งกับกลุ่มสนับสนุนแล้ว ตัวตั้งคือประเทศจะต้องเป็นหลัก
- ไม่ใช่ว่าตั้งพรรคแค่เพื่อปกป้องผลประโยชน์ของกลุ่มตนเอง, อาชีพอะไรก็ไปเป็นนักการเมืองได้
หรือเป็นเพราะแนวคิดที่ว่าทำอะไรแค่กลุ่มของตนเอง มันคือปัญหาของประเทศเราในปัจจุบัน?
- ผมเคยอ่านหนังสือเขียนโดยนาวิกโยธินอเมริกันที่รอดมาได้จากอัฟกันขณะที่เพื่อนในหมู่ตายเรียบ มีประโยคนึงเขาพูดว่า ในฐานะนาวิกโยธินสหรัฐเขาจะปฏิบัติตามคำสั่งของประธานาธิปดี หรือ Chief of State ของเขา ไม่ว่าคนนั้นจะเป็นใคร มาจากพรรคไหน แม้จะต้องแลกด้วยชีวิตก็ตาม เพราะเขาเชื่อว่าประธานาธิปดีของเขาทำเพื่อประเทศของเขาจริงๆ
- แล้วเราเชื่อโดยบริสุทธิ์ใจกันไหม ว่านายกรัฐมนตรีของประเทศไทยแต่ละท่าน ทั้งปัจจุบัน และที่ผ่านๆ มา ทำเพื่อประเทศของเราจริงๆ ไม่ใช่เพื่อแค่กลุ่มของตน?
โดย Ott (noreply@blogger.com) ณ 12 May 2010 03:03 GMT