วันศุกร์, ตุลาคม 31, 2551

BAD Application Design ตอน 1

ลองเขียน column แบบเป็น series ดูบ้าง เลียนแบบ "นั่งเทียน ของ punneng" สำหรับตอนแรกขอเริ่มจาก โปรแกรม "FileZilla" ก่อน เจ้าโปรแกรมนี้เอาไว้ช่วยในการย้ายไฟล์ระหว่างเครื่องผ่าน protocal FTP, SFTP, FTPS จะเรียกว่า "โปรแกรม FTP" ก็ได้ หน้าตาของโปรแกรมเป็นประมาณนี้ โปรแกรมนี้ออกแบบได้ดีในเรื่องของ Flow การทำงาน ผู้ใช้จะเริ่มจากบนสุดลงไปล่างสุด ไม่สับสนขึ้นๆ ลงๆ แบบหลายๆ โปรแกรม ไว้จะยกตัวอย่างในตอนถัดไป แต่สำหรับ FileZilla ต้องชมว่าทำได้ดี โปรแกรม เริ่มจาก (1) ผู้ใช้เลือก Server ที่ต้องการจะ upload หรือ download ไฟล์ ผลการเชื่อมต่อ จะอยู่ถัดลงมาให้เห็นทันที (2) หลังจากเชื่อมต่อได้ (3) โปรแกรมจะให้ผู้ใช้เลือก Folder ที่ต้องการ (4) โปรแกรมแสดง File และ Folder ที่อยู่ใน Folder ที่ผู้ใช้กำลังเลือกอยู่ เมื่อสั่ง copy ไฟล์เรียบร้อยแล้วถัดลงมา (5) โปรแกรมจะแสดงสถานะการโอนไฟล์ทันที ปัญหาของการออกแบบโปรแกรมนี้มีสองจุดใหญ่ๆ คือในขณะที่เรากำลังสนใจขั้นตอนที่ (1),(2) เนื้อที่ส่วน (3),(4),(5) จะกินหน้าจอของไปกว่าครึ่งให้เราเหลือที่ดู log ไฟล์ แค่นิดเดียว นอกจากนั้นยังทำให้ส่วนที่ (1) ต้องถูกบีบให้เหลือแค่บรรทัดเดียว ในทางกลับกันเมื่อเราสนใจส่วนที่ (3) ส่วนที่ (1) และ (2) จะสิ้นเปลืองหน้าจอไปครึ่งหน้าทำให้เรามีเนื้อที่ในการดูไฟล์น้อยลง ส่วนที่ (5) ก็เช่นเดียวกันเมื่อเราเสร็จสิ้นกระบวนการเลือกไฟล์ ส่วนที่ (1..4) จะอยู่หลอกหลอนเราไปเรื่อยๆ ถ้านั่งสังเกตุคนใช้โปรแกรมนี้ จะเห็นผู้ใช้คอยขยับส่วน (1..4) ขึ้นๆ ลงๆ อยู่ตลอด ปัญหาใหญ่อันที่สองคือช่องเลือก Folder ส่วนที่ (3) การแสดง Folder แบบต้นไม้แนวตั้ง ก็เหมาะกับแนวตั้งครับ หาเอามาแสดงในช่องแนวนอน จะเกิดเนื้อที่ ที่นาน......นาน จะใช้ซักที ยิ่งสำหรับคนที่ชอบเปิดหลายโปรแกรมพร้อมๆ กัน หากมีโปรแกรมอะไรกินหน้าจอมาก จะรู้สึกขัดขวางการทำงานทันที และยิ่งโปรแกรมมาใช้พื้นที่โดยไม่เกิดประโยชน์นี่... จะเกิดอาการอึดอัดทันที ปัญหาใหญ่ๆ คงเป็นสองตัวนี้ หลังจากคิดอยู่พักนึง กอปรกับการดูโปรแกรม ftp อื่นๆ ผมเสนอทางแก้แบบนี้ครับ 1. ปิดหน้าจอที่ไม่ได้ใช้ตอนที่ไม่ได้ใช้ หน้าแรกที่เลือก Favorite แทนที่จะบีบให้เหลือบรรทัดเดียวก็เปิดให้เลือกกันชัดๆเลย 2. กด new server มีเนื้อที่ให้ใส่รายละเอียดอื่นๆ แบบเหลือเฟือ เช่น proxy etc.. 3. ตอนที่ copy file ก็ไม่ต้องแสดงส่วน connect จะได้ไม่เปลืองหน้าจอ, ถ้ากด disconnect ก็กลับไปหน้าแรก 4. พอเลือกเสร็จก็แสดง status ด้านล่าง แค่บอกว่าจะเสร็จเมื่อไหรก็พอ ถ้ามีปัญหาค่อยบอก ถ้าอยากรู้รายละเอียดจริงๆ ก็ click บน status bar โปรแกรมค่อย popup รายละเอียดออกมา แก้ปัญหาประมาณนี้ แต่ถ้าผมจะใช้โปรแกรมนี้คงปิดหน้าจอด้านซ้ายไปเลย แล้วใช้โปรแกรมนี้ร่วมกับ Finder, nautilus หรือ windows explorer แทน เรื่อง usablility เนี่ยยิ่งเขียนยิ่งมัน ตอนแรกจะเขียนนิดเดียว กลายเป็นคิดต่อซะยาวเลย :p ที่เหลือเอาไว้เขียนต่อตอนหน้าละกันครับ ;) ใครมีโปรแกรมที่ใช้แล้วอึดอัด หรือใช้แล้วโคตรชอบ บอกกันได้นะครับ

วันอังคาร, ตุลาคม 28, 2551

ความสวยงาม ที่ Linux ไม่ให้ความสำคัญ

ผมยอมรับว่าการเก็บรายละเอียดเล็กๆ น้อยๆ เป็นเรื่องยากมากเมื่อไม่มีคนบังคับให้ทำ การทำด้วยใจก็มีขีดจำกัดในระดับหนึ่ง ยิ่งการรักษาให้ดีสม่ำเสมอยิ่งยากขึ้นไปอีก ดูอย่าง short cut bar ของ linux เป็นต้น ubuntu 7.04 ubuntu 8.04 ubuntu 8.10 ปัญหาที่เกิดขื้นคือการวาง icon บน bar มันแย่ลงเรื่อยๆ จากเดิมบน 7.04 icon ลอยอยู่ตรงกลางใน task bar แม้ว่าจะเยื้องขึ้นข้างบน แต่ก็ถือว่าอยู่ตรงกลาง แต่พอมาถึง 8.04 แทนที่จะจัดให้อยู่ตรงกลาง กลายเป็น icon ติดขอบข้างบน และเลวร้ายลงกว่าเดิมใน 8.10 icon อยู่ชิดกับขอบทั้งบนและล่าง ทำให้รู้สึกอึดอัดแทน icon firefox เป็นยิ่งนัก ผมคิดว่าปัญหาไม่ได้เป็นเรื่องทางเทคนิค หรือเรื่องการออกแบบ แต่เป็นเพราะไม่ได้มีการกำหนดเอาไว้ก่อน ทำให้การเก็บรายละเอียดทำได้ยากขึ้นคนที่ออกแบบมันต้องมีหลุดบ้างอยู่แล้ว ถ้าเราวางกรอบไว้แต่แรก ทุกคนจะสามารถช่วยกันตรวจสอบแก้ไขได้ ทำให้ทุกงานออกแบบไปในแนวเดียวกัน ผมลองเขียนดูว่า ถ้าเราต้องการกำหนด interface guide line ตรงส่วนนี้จะต้องกำหนดช่องไฟตรงไหนบ้าง A คือช่องไฟระหว่างชุดของ component เช่นระยะระหว่าง icon ubuntu กับขอบซ้าย หรือระยะระหว่าง menu กับ short cut icon ฺB คือช่องไฟระหว่าตัวอักษร หากมีตัวอักษรสองชุดมาต่อกันจะให้ระยะห่างเท่ากับ B C คือระยะห่างระหว่าง icon D คือระยะห่างจากขอบด้านบน และด้านล่าง ถึงแม้จะไม่สามารถกำหนดเป็น pixel ได้ เพราะมันเป็น vector หรือเพราะมันสามารถยืดขยายได้ ก็ควรกำหนดในหน่วยอื่นขึ้นมา เช่นเป็น % ตามขนาดของ bar เป็นต้น (อาจจะง่ายกว่ากำหนดเป็น pixel ซะอีก) บน gnome ตอนนี้ icon ต่างๆ ลากวางได้อย่างอิสระ เป็นการเปิดโอกาสให้ผู้ใช้ทำลายความสวยงามของหน้าจอของตัวเอง แม้ผมยอมรับในความแตกต่างของแต่ละบุคคล แต่ผมคิดว่านักออกแบบที่ดี ควรออกแบบให้ "การทำให้สวยควรจะทำง่ายที่สุด ถ้าอยากได้แบบแปลกๆ ก็อาจจะยากขึ้นตามลำดับ" อย่ายอมให้ความ flexible มาทำให้ความสวยงามลดลง หรือทำให้มันใช้งานยากขึ้น

วันพฤหัสบดี, ตุลาคม 23, 2551

พัฒนา Cocoa Application ด้วย MacRuby

ทุกวันนี้เราใช้ภาษา Ruby สร้าง Mac Application ผ่าน "RubyCocoa" ได้อยู่แล้ว แต่วันนี้มีดีกว่า
ถ้าย้อนไปที่ "RubyCocoa" หรือย้อนไปสมัย "JavaCocoa" การเชื่อมต่อภาษาทั้งสองเข้ากับ Objective-C (ภาษาหลักบน OS X) เป็นวิธีเดียวที่จะทำให้ภาษาอื่นๆ สามารถควบคุม Object ต่างๆ ที่สร้างขึ้นด้วยภาษา Objective-C ทุกครั้งที่มีการเรียก object ข้ามภาษา ทุก object จะถูกแปลงจากระบบหนึ่งไปอีกระบบเสมอ และเป็นเหตุให้โปรแกรมทำงานช้าถ้าต้องเชื่อมกันบ่อยๆ "MacRuby" เข้ามาแก้ปัญหาของ "RubyCocoa" โดย Apple พัฒนา Ruby ขึ้นมาใหม่บน CoreFoundation ของเทคโนโลยี Mac OS X เช่น Objective-C runtime และระบบ Gabage Collector ดังนั้น ทุก Class ทุก method และ ทุก object จะเป็น Objective-C ทั้งหมด ทำให้ปัญหาเรื่องการเชื่อมต่อหมดไป MacRuby ก็เข้าทางเดียวกับ jruby พวก data type ต่างๆ อย่าง String, Array หรือ Hash จะถูกทำใหม่อยู่บน CoreFoundation อย่าง CFString, CFArray และ CFDictionary ดังนั้นพฤติกรรมของ string จึงเป็นแบบ C หรือ Objective-C แทน หวังว่าจะไม่มีปัญหาการต่อกับ C แบบ jRuby นะ สนใจรายละเอียดเพิ่มเติม ลองอ่าน tutorial ที่ developer.apple.com

การให้ความสำคัญต่อพื้นที่ใช้งานของ Win, Mac, Linux

ไหนๆ จะเป็นกระทู้เปิดตัว usability66 ขอเริ่มต้นด้วยการวิเคราะห์ เรื่อง "พื้นที่ ที่เหลือให้ใช้" แม้ว่าเราจะชอบให้พื้นที่ทำงานของเราใหญ่ที่สุด แต่เราก็ต้องการให้สิ่งที่ใช้บ่อยๆ อยู่ใกล้มือเสมอ เช่น menu, short cut, status, calendar, recycle bin, battery life เราต้องการให้สิ่งเหล่านี้ปรากฏอยู่เสมอบนจอภาพ เพียงแค่ชำเรื่องตาไปดูก็มองเห็นได้ทันที หรือสามารถเรียกใช้ได้ตลอดโดยการ click เพียงครั้งเดียว ปัญหาอยู่ที่ความสมดุลย์ระหว่าง "พื้นที่วางของใช้บ่อย" กับ "พื้นที่ที่เหลือให้ใช้งาน" สองอย่างนี้ในแต่ละ platform จะให้ความสำคัญไม่เหมือนกัน ขึ้นอยู่กับกลุ่มเป้าหมาย และความฉลาดในการออกแบบของ platform นั้นๆ เริ่มจาก windows ก่อน พื้นที่ ที่เหลือให้ใช้งานคิดตามแนวตั้งแบบง่ายได้ 7 ส่วนจาก 10 ส่วน หากคิดว่าหน้าจอเดียวนี้เป็นแนวกว้างซะส่วนใหญ่ พื้นที่ที่เสียไปในแนวตั้งจะมีผลอย่างมากทีเดียว
ในรูปพื้นที่สีขาวคือ menu ส่วนสีฟ้าคือ title bar แม้ว่า windows vista จะพยายามกำจัด menu ทิ้งแต่ application ส่วนใหญ่ก็ยังใช้ menu อยู่ดี ปัญหาที่เกิดขึ้นคือ task bar ด้านล่างต้องรับภาระหนัก ตั้งแต่ start menu + Quick link + Status + clock ทำให้ส่วนที่แสดง task ตามชื่อ task bar มีขนาดเล็กลงมาก ยิ่งถ้าเปิด application มากกว่า 10 อัน เราแทบจะเห็นแต่ icon เลยทีเดียว ต่างจากของ gnome linux ที่ให้ความสำคัญกับ task bar มากกว่าคนอื่น ถึงกับยอมสร้างแถบสำหรับ short cut และ status ไว้ด้านบนอีกหนึ่งแถบ เพื่อให้มีพื้นที่เพิ่มขึ้นสำหรับ taskbar
เมื่อเอาพื้นที่ไปคูณกับแนวกว้างจะทำให้พื้นที่น้อยกว่า platform อื่นๆมากทีเดียว นี่แสดงให้เห็นว่าชาว Gnome ให้ความสำคัญกับ Shortcut, Status และ task bar ที่พยายามจะไม่ย่อ ไม่ซ่อนเอาไว้ อาจจะเน้นกลุ่ม admin ที่ให้ความสำคัญกับสถานนะของเครื่องมากกว่าคนอื่น หรือมีงานเปิดพร้อมกันมากๆ แต่ไม่มากที่สุดเพราะถ้ามากที่สุดมันจะอัดรวมกันจนเห็นแต่ icon เช่นเปิด terminal มา 20 หน้าต่างก็จะเห็นแต่ icon ของ terminal เต็ม task bar ต้องไล่กดทีละอันอยู่ดี ในกรณีของ Mac จะคิดต่างจากเพื่อนทั้งสอง โดยรวบเอา menu ไปไว้ด้านบน คงเกิดจากความคิดว่าน้อยครั้ง หรือแทบไม่เคยที่เราอย่างจะเปิด menu พร้อมกันสอง application จึงรวบไปไว้ด้านบนทีเดียว ซึ่งทำเป็นที่อยู่ของ status ต่างๆ ไปในตัว ** กรณีนี้เป็นไปได้ยากบน linux เพราะบน linux จะมีระบบใน application active เมื่อ mouse over เมื่อเราต้องการกด menu เราต้องระวังไม่ให้ mouse ไปผ่านหน้าต่างอื่นๆ ไม่งั้น menu จะเปลี่ยนไปทันที
ในส่วนของ status ที่รวบ short cut และ status มาไว้เป็น icon เดียวกัน ในแง่หนึ่งก็เป็นข้อดีเพราะทำให้เราเปิด application ซ้ำซ้อนน้อยลง แต่ก็เป็นข้อเสียเล็กน้อยว่าจะเปิดหน้าต่างไหม่ใน click เดียวไม่ได้ อีกปัญหาหนึ่งคือไม่ว่าเราจะเปิดโปรแกรมนั้นกี่หน้าต่าง มันจะแสดงแค่ icon เดียว เมื่อกดบน icon นั้นทุกหน้าต่างจะขึ้นมาด้านบนทั้งหมด ในแง่หนึ่งก็ดีว่าขึ้นมาให้เลือก แต่ในหลายครั้งมันก็ทับกันอยู่ดี นี่แสดงว่ากลุ่มผู้ใช้ mac ไม่นิยมเปิดหน้าต่างแบบ full screen นิยมเปิดเป็นจอเล็กๆ สังเกตุจาก photoshop บน mac และ windows ทุกวันนี้นอกจาก netbean ก็ไม่มี application ไหนที่ผมเปิดเต็มจอเลย สุดท้ายทั้งสาม platform ก็อนุญาติให้ผู้ใช้จัดหน้าจอกันเอง เราก็ดูพฤติกรรมการใช้งานของเราแล้วลองจัดสรรค์ทรัพยากรหน้าจอของเราดู อย่าพึ่งคิดว่า default มันดีอยู่แล้วตามกฏ 80:20 ถ้าเราไม่ใช่กลุ่มเป้าหมาย หรือเราต้องการมากกว่า 80 ก็ต้องดิ้นรนกันต่อไป ส่วนตัวผมอยากให้ทุก platform ย้าย task bar ไปไว้ด้านข้างแล้วให้เหลือแต่ icon ครับ ผมเน้นพื้นที่ทำงานมากกว่า ส่วน menu บน windows กับ mac ผมไม่ค่อยได้ใช้ ดังนั้นย้ายไปรวมกันด้านบนก็ดี แต่บน linux ผมใช้ menu บ่อยมากเพราะใน application หาอะไรไม่ค่อยเจอ เอา menu ไว้ที่เดิมดีแล้วล่ะครับ

วันจันทร์, ตุลาคม 20, 2551

I love this wide

search หา m4p ของ keynote ตัวล่าสุด ดันไปเจอรูปนี้เข้า โดนใจมากๆ

ที่มา

จริงๆ แล้วจอยิ่งยาวก็ทำอะไรได้มากขึ้น usability ก็ปรับได้อีกหลายแบบ ทำให้มองเห็นอนาคตของ Android ไปไกลน่าดู (ความหลากหลายก็เป็นพลัง อย่างหนึ่ง)

ปล. ตอนนี้เจอ m4p แล้วครับ download ได้ที่ movie.apple.com

วันพฤหัสบดี, ตุลาคม 16, 2551

count down xubuntu

ร่วม countdown ไปกับเค้าด้วย Countdown to Xubuntu (xubuntu.org) 8.10, by Pasi Lallinaho

วันอังคาร, ตุลาคม 14, 2551

ติดตั้ง Rails Mongrel Cluster บน Ubuntu Hardy (8.04)

ทดลองมาหลาย solution สุดท้ายมาได้เป็น solution ง่ายๆ แบบนี้ครับ ![web_solution](/downloads/web_solution.png) การ Deploy เราค่อยๆ ทำตามลำดับดังนี้ 1. ติดตั้ง Application ของเราบน mongrel ให้ขึ้นได้ก่อน ============================ **Adduser** สร้าง user สำหรับ run mongrel เวลากำหนดสิทธิ์จะได้ง่ายหน่อย สำหรับ Ubuntu sudo /usr/sbin/adduser mongrel สำหรับ Redhat, "-r" คือไม่ต้องสร้าง home ไม่ต้องมี attribute มากมายให้ user sudo /usr/sbin/adduser -r mongrel **Deploy application** ติดตั้ง application ของเราไว้ที่ /var/www/ sudo mkdir /var/www sudo mkdir /var/www/application_name sudo chown -R mongrel:mongrel /var/www/application_name เอา application ของเรามาใส่ไว้ในที่ๆ เตรียมไว้ จะเอาออกมาจาก svn หรือ copy มาใส่ก็ได้ ไว้ตอนต่อไปเราค่อยมา set capistano กัน svn export svn://svn_server.com/application_name/trunk/ --username name --password pass . rake db:create:all rake db:migrate RAILS_ENV="production" ทดลอง run ดูก่อนว่าทำงานได้หรือเปล่า ./script/server -e production **Setup Mongrel Cluster** เมื่อหนึ่งตัวทำงานได้ ต่อไปก็ทำให้เป็น cluster ให้ cd เข้าไปที่ /var/www/application_name แล้วสั่งสร้าง configuration file ของ mongrel_cluster mongrel_rails cluster::configure -e production -p 8000 -N 3 -c /var/www/application_name -a 127.0.0.1 --user mongrel --group mongrel สร้างแล้วทดลอง start stop ดู sudo mongrel_rails cluster::start sudo mongrel_rails cluster::stop ให้ลองเปิด browser แล้วเรียก localhost:8000, localhost:8001, localhost:8002 ว่าได้ครบหรือเปล่า ในตอนนี้เราไม่สามารถเรียก web โดยตรงจาก IP เพราะต้องการเปิดแค่ localhost เท่านั้น กันคนอื่นเข้ามาเรียกตรงๆ **Start mongrel when reboot** ตั้ง config ให้ mongrel cluster ของเราถูกเรียกขึ้นมาใหม่ทุกครั้งที่เปิดเครื่องใหม่ sudo mkdir /etc/mongrel_cluster sudo ln -s /var/www/application_name/config/mongrel_cluster.yml /etc/mongrel_cluster/application_name.yml sudo cp /usr/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d/ sudo chmod +x /etc/init.d/mongrel_cluster ทดลองเรียก start stop จาก init.d ดูครับ sudo /etc/init.d/mongrel_cluster start < Test sudo /etc/init.d/mongrel_cluster stop < Test จากนั้นสั่ง update rc.d เพื่อให้เรียก mongrel cluster ทุกครั้ง sudo /usr/sbin/update-rc.d -f mongrel_cluster defaults สำหรับ Ubuntu sudo /sbin/chkconfig --level 345 mongrel_cluster on <- redhat สำหรับ Linux 2. ติดตั้ง Watch dog เป็น ยามเฝ้า server ===================== ติดตั้งโปรแกรม monit ก่อน sudo apt-get install monit **config monit** สร้างไฟล์ monitrc ขึ้นมา sudo mkdir /etc/monit.d sudo vi /etc/monit.d/mongrel.monitrc ใส่ config นี้ลงไป check process mongrel_deployit_8000 with pidfile /var/www/application_name/tmp/pids/mongrel.8000.pid start program = "/usr/bin/mongrel_rails cluster::start -C /etc/mongrel_cluster/application_name.yml --clean --only 8000" stop program = "/usr/bin/mongrel_rails cluster::stop -C /etc/mongrel_cluster/application_name.yml --only 8000" if totalmem is greater than 110.0 MB for 4 cycles then restart if cpu is greater than 80% for 4 cycles then restart if 20 restarts within 20 cycles then timeout group deployit check process mongrel_deployit_8001 with pidfile /var/www/application_name/tmp/pids/mongrel.8001.pid start program = "/usr/bin/mongrel_rails cluster::start -C /etc/mongrel_cluster/application_name.yml --clean --only 8001" stop program = "/usr/bin/mongrel_rails cluster::stop -C /etc/mongrel_cluster/application_name.yml --only 8001" if totalmem is greater than 110.0 MB for 4 cycles then restart if cpu is greater than 80% for 4 cycles then restart if 20 restarts within 20 cycles then timeout group deployit check process mongrel_deployit_8002 with pidfile /var/www/application_name/tmp/pids/mongrel.8002.pid start program = "/usr/bin/mongrel_rails cluster::start -C /etc/mongrel_cluster/application_name.yml --clean --only 8002" stop program = "/usr/bin/mongrel_rails cluster::stop -C /etc/mongrel_cluster/application_name.yml --only 8002" if totalmem is greater than 110.0 MB for 4 cycles then restart if cpu is greater than 80% for 4 cycles then restart if 20 restarts within 20 cycles then timeout group deployit จากนั้นแก้ config อีกสองไฟล์ sudo vi /etc/default/monit แก้ startup = 1 sudo vi /etc/monit/monitrc ให้ enable บรรทัดต่อไปนี้ set daemon 120 set logfile syslog facility log_daemon set httpd port 2812 and allow localhost # allow localhost to connect to the server and include /etc/monit.d/* จากนั้นทดลองสั่ง sudo /etc/init.d/monit restart sudo monit restart all -g deployit sudo monit stop mongrel_deployit_8000 sudo monit start mongrel_deployit_8000 sudo monit status ลองปิดๆ เปิดๆ ควบคู่ไปกับการดู status เพื่อให้แน่ใจว่ามันปิด มันเปิดได้จริงๆ ใครจะทดลองยิง mongrel ให้ล่ม หรือลอง kill mongrel process ดูก็ได้ครับ จะได้แน่ใจว่ามันล่ม แล้วเปิดขึ้นได้จริงๆ 3. ติดตั้ง NGINX ======= sudo apt-get install nginx จากนั้นแก้ไฟล์ /etc/nginx/nginx.conf sudo vi /etc/nginx/nginx.conf ใส่ข้อมูลตามนี้ #user deploy; worker_processes 1; error_log /var/log/nginx/error.log; #error_log logs/error.log debug; #pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; #tac_nonpush on; tcp_nodelay on; #access_log /var/log/nginx/access.log; sendfile on; #tcp_nopush on; #keepalive_timeout 0; #keepalive_timeout 65; gzip on; gzip_min_length 1100; gzip_buffers 4 8k; gzip_types text/plain; #include /etc/nginx/sites-enabled/*; upstream mongrel { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; } server { listen 80; server_name example.com; root /var/www/application_name/public; index index.html index.htm; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect false; if (-f $request_filename/index.html) { rewrite (.*) $1/index.html break; } if (-f $request_filename.html) { rewrite (.*) $1.html break; } if (!-f $request_filename) { proxy_pass http://mongrel; break; } } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } เราให้ nginx จัดการ static ไฟล์แทน mongrel แต่ถ้าใครต้องการให้ mongrel เป็นคนจัดการสามารถเอา if ต่างๆ ออกได้ตามสะดวก 4. เพื่อให้สมบูรณ์มากขึ้นเราติดตั้งโปรแกรมเอาไว้ monitor การทำงานของ nginx ไว้ด้วยเลย ============================================== sudo apt-get install rrdtool -y sudo apt-get install librrds-perl -y แก้ไฟล์ /etc/nginx/nginx.conf โดยเพิ่ม location /nginx_status ลงไป http { ... server { listen SOME.IP.ADD.RESS; ... location /nginx_status { stub_status on; access_log off; allow SOME.IP.ADD.RESS; deny all; } ... } ... } ใครอยากจะเพิ่มความปลอดภัยก็ให้ใส่บรรทัด allow และ deny ลงไปด้วย ถ้าไม่คิดจะปิดกั้นก็ลบไปก็ได้ครับ ทดลองดูก่อนว่า nginx ทำงานเป็นปกติหรือเปล่าหลังจากแก้ config มันแล้ว # sudo /usr/sbin/nginx -t 2006/04/29 04:24:36 [info] 31676#0: the configuration file /opt/nginx/conf/nginx.conf syntax is ok 2006/04/29 04:24:36 [info] 31676#0: the configuration file /opt/nginx/conf/nginx.conf was tested successfully # ถ้าปกติจะขึ้นประมาณนี้ เขียนโปรแกรมง่ายๆ เอาไว้สร้าง graph sudo mkdir /opt/rrd sudo mkdir /opt/rrd/html sudo vi /etc/nginx/rrd_nginx.pl ตัวโปรแกรมเป็นแบบนี้ ผมก็ลอกมาอีกที จริงๆ เขียน perl ไม่เป็น #!/usr/bin/perl use RRDs; use LWP::UserAgent; # define location of rrdtool databases my $rrd = '/opt/rrd'; # define location of images my $img = '/opt/rrd/html'; # define your nginx stats URL my $URL = "http://localhost/nginx_status"; my $ua = LWP::UserAgent->new(timeout => 30); my $response = $ua->request(HTTP::Request->new('GET', $URL)); my $requests = 0; my $total = 0; my $reading = 0; my $writing = 0; my $waiting = 0; foreach (split(/\n/, $response->content)) { $total = $1 if (/^Active connections:\s+(\d+)/); if (/^Reading:\s+(\d+).*Writing:\s+(\d+).*Waiting:\s+(\d+)/) { $reading = $1; $writing = $2; $waiting = $3; } $requests = $3 if (/^\s+(\d+)\s+(\d+)\s+(\d+)/); } #print "RQ:$requests; TT:$total; RD:$reading; WR:$writing; WA:$waiting\n"; # if rrdtool database doesn't exist, create it if (! -e "$rrd/nginx.rrd") { RRDs::create "$rrd/nginx.rrd", "-s 60", "DS:requests:COUNTER:120:0:100000000", "DS:total:ABSOLUTE:120:0:60000", "DS:reading:ABSOLUTE:120:0:60000", "DS:writing:ABSOLUTE:120:0:60000", "DS:waiting:ABSOLUTE:120:0:60000", "RRA:AVERAGE:0.5:1:2880", "RRA:AVERAGE:0.5:30:672", "RRA:AVERAGE:0.5:120:732", "RRA:AVERAGE:0.5:720:1460"; } # insert values into rrd database RRDs::update "$rrd/nginx.rrd", "-t", "requests:total:reading:writing:waiting", "N:$requests:$total:$reading:$writing:$waiting"; # Generate graphs CreateGraphs("day"); CreateGraphs("week"); CreateGraphs("month"); CreateGraphs("year"); #------------------------------------------------------------------------------ sub CreateGraphs($){ my $period = shift; RRDs::graph "$img/requests-$period.png", "-s -1$period", "-t Requests on nginx", "--lazy", "-h", "150", "-w", "700", "-l 0", "-a", "PNG", "-v requests/sec", "DEF:requests=$rrd/nginx.rrd:requests:AVERAGE", "LINE2:requests#336600:Requests", "GPRINT:requests:MAX: Max\\: %5.1lf %S", "GPRINT:requests:AVERAGE: Avg\\: %5.1lf %S", "GPRINT:requests:LAST: Current\\: %5.1lf %Sreq/sec", "HRULE:0#000000"; if ($ERROR = RRDs::error) { print "$0: unable to generate $period graph: $ERROR\n"; } RRDs::graph "$img/connections-$period.png", "-s -1$period", "-t Requests on nginx", "--lazy", "-h", "150", "-w", "700", "-l 0", "-a", "PNG", "-v requests/sec", "DEF:total=$rrd/nginx.rrd:total:AVERAGE", "DEF:reading=$rrd/nginx.rrd:reading:AVERAGE", "DEF:writing=$rrd/nginx.rrd:writing:AVERAGE", "DEF:waiting=$rrd/nginx.rrd:waiting:AVERAGE", "LINE2:total#22FF22:Total", "GPRINT:total:LAST: Current\\: %5.1lf %S", "GPRINT:total:MIN: Min\\: %5.1lf %S", "GPRINT:total:AVERAGE: Avg\\: %5.1lf %S", "GPRINT:total:MAX: Max\\: %5.1lf %S\\n", "LINE2:reading#0022FF:Reading", "GPRINT:reading:LAST: Current\\: %5.1lf %S", "GPRINT:reading:MIN: Min\\: %5.1lf %S", "GPRINT:reading:AVERAGE: Avg\\: %5.1lf %S", "GPRINT:reading:MAX: Max\\: %5.1lf %S\\n", "LINE2:writing#FF0000:Writing", "GPRINT:writing:LAST: Current\\: %5.1lf %S", "GPRINT:writing:MIN: Min\\: %5.1lf %S", "GPRINT:writing:AVERAGE: Avg\\: %5.1lf %S", "GPRINT:writing:MAX: Max\\: %5.1lf %S\\n", "LINE2:waiting#00AAAA:Waiting", "GPRINT:waiting:LAST: Current\\: %5.1lf %S", "GPRINT:waiting:MIN: Min\\: %5.1lf %S", "GPRINT:waiting:AVERAGE: Avg\\: %5.1lf %S", "GPRINT:waiting:MAX: Max\\: %5.1lf %S\\n", "HRULE:0#000000"; if ($ERROR = RRDs::error) { print "$0: unable to generate $period graph: $ERROR\n"; } } **edit cron** บอก cron ให้สั่ง run script ของเราทุกๆ นาที $sudo chmod +x /etc/nginx/rrd_nginx.pl $sudo crontab -e # m h dom mon dow command * * * * * /etc/nginx/rrd_nginx.pl ทดสอบเรียก sudo /etc/nginx/rrd_nginx.pl โปรแกรมจะสร้างรูปขึ้นมาที่ /opt/rrd/html ผมใช้โปรแกรม feh เอาไว้ดูรูป ใครจะเขียน HTML ขึนมาดูรูปก็ได้ครับ sudo apt-get install feh -y feh /opt/rrd/html/*.png เป็นอันเสร็จพิธี ขั้นตอนอาจจะดูยาวครับ แต่ทำจริงๆ แป๊บเดียว ต้องขอบคุณ apt-get มากๆ ช่วยให้งานเร็วขึ้นเยอะทีเดียว reference: http://wiki.codemongers.com/NginxInstall reference: http://www.circlingminds.com/advanced-rails/using-nginx-mongrel-rails-on-ubuntu/

วันอังคาร, ตุลาคม 07, 2551

มองวิกฤตการณ์เมืองให้เป็นโอกาส

มองอีกมุมหนึ่งการเมืองตอนนี้ไม่ใช่การถอยหลัง แต่เป็นทางบังคับที่ต้องผ่านไปให้ได้ ผมมองเห็นความเปลี่ยนแปลงของทางบ้าน ที่เกิดขึ้นจากการกระตุ้นของกระแสการเมืองที่รุนแรง การกระตุ้นที่บอกว่า "ประชาชนเป็นเจ้าของประเทศ" ไม่ใช่รอให้ใครข้างบนมาสั่ง หรือปล่อยไปมันก็ดีเอง ตอนนี้ที่บ้านต่างจังหวัดเริ่มมีการเปลียนแปลงในหน่วยย่อยของสังคม * อาจารย์ของราชภัฏเริ่มรู้สึกว่าหน่วยงานเป็นของเรา ไม่ต้องรอให้ผู้บริหารมาสั่ง * ครูเริ่มมีส่วนกำหนดความเป็นไปของโรงเรียน ไม่ใช่รอแต่ครู่ใหญ่ * นักเรียนเริ่มกำหนดสิ่งที่ตัวเองอยากเรียน ไม่ใช่รอคำสั่งครู * เด็กมีความรับผิดชอบในบ้านมากขึ้น ไม่ปล่อยให้เป็นความรับผิดชอบของพ่อแม่อย่างเดียว ความเปลี่ยนแปลงเกิดขึ้นในหน่วยที่เล็กที่สุดของสังคมทีเดียว ซึ่งเป็นเรื่องที่ดีมากๆ ทำให้เกิดความสามัคคีและช่วยกันสร้างสรรค์บ้านเมือง * อาจารย์คิดเองเป็นทำงานแบบ parallel เพราะอาจารย์ใกล้ชิดนักศึกษา และสังคมจึงรู้ว่าควรสอนอะไร * ครูสามารถปรับปรุงการสอนไปตามความนักเรียน * นักเรียนมีส่วนในกิจกรรมของโรงเรียน เพราะรู้สึกเป็นเจ้าของโรงเรียน * เด็กเก็บขยะในบ้าน เพราะบ้านเป็นของตนเอง แน่นอนว่ามันกระทบความเชื่อแบบเดิมๆ และจะมีความสงสัยในใจขึ้นมา * ผู้บริหารสั่งการอาจารย์ไม่ได้ แล้วอะไรจะเกิดขึ้น * ครูใหญ่สั่งแล้ว ครูไม่ยอมทำหรือ * นักเรียนไม่เชื่อฟังคำสั่งสอนของคุณครู * เด็กถือดี หนีออกจากบ้าน ด่าว่าพ่อแม่ ผมคิดว่ามันต้องเกิดขึ้นอยู่แล้วครับไม่ต้องตั้งคำถามเลย คนพอมีความรู้สึกเป็นเจ้าของก็จะเริ่มมีเสียง เริ่มดื้อ เริ่มหัวเข็ง เมื่อประชาชนของหน่วยย่อยเริ่มเปลี่ยนแปลง ผู้บริหารของหน่วยย่อยก็ต้องปรับตัวด้วย ไม่ใช่ยังบริหารแบบ "เจ้าขุนมูลนาย" เหมือนเดิม * ผู้บริหารรู้ว่าตัวเองไม่ใช่เจ้าของอำนาจ ต้องฟังเสียงของอาจารย์ หากตนเองมีเหตุผลต้องอธิบายให้คนใต้บังคับบัญชาเข้าใจก่อน ถ้าอธิบายไม่ใด้ (เล่นการเมืองไม่เป็น) ก็มาเป็นผู้บริหารไม่ได้ * ครู่ใหญ่ต้องแถลงนโยบายให้ครูเข้าใจ ไม่ใช่การสั่งงาน * ครูต้องรู้จักชักจูงนักเรียนไม่ใช่สั่ง * พ่อแม่ต้องเลี้ยงลูกให้เป็นคนดีจากข้างใน ไม่ใช่ดีเพราะทำตามคำสั่ง หรือดีเพราะความกลัว การคัดผู้บริหารก็จะเปลี่ยนไป การเลือกคู่ของผู้หญิงจะเปลี่ยนไป การเป็นหัวหน้าครอบครัวที่ดีในละครทีวีจะเปลี่ยนไป การเปลี่ยนแปลงจากหน่วยย่อยจะเป็นทางออกของประชาธิปไตยอย่างแท้จริง ในยุคหน้าการเปลี่ยนแปลงทางการเมืองของหน่วยใหญ่ มีผลสู้การเปลียนแปลงหน่วยย่อยไม่ได้ สิ่งที่อยากเห็นจากวิกฤต์การณ์เมืองครั้งนี้คือให้ประชาชนเห็นว่า ลูกดื้อแพ่งไม่เคารพพ่อแม่ไม่เคารพกติกา จะเป็นแบบการเมืองตอนนี้ ถ้าพ่อแม่ไม่ชี้แจงให้ลูกฟังเอาแต่สั่งงาน ก็จะเป็นแบบการเมืองตอนนี้ และถ้าทุกคนเรียนรู้ประชาธิปไตยก็จะเบ่งบาน

วันพุธ, ตุลาคม 01, 2551

ปรับ font ภาษาไทยบน gnome

ทนใช้ตัวอักษรภาษาไทยแบบไม่สวยมานาน วันนี้มาใช้ linux thai เพราะเริ่มแปล ubuntu เลยทนไม่ไหวกับตัวอักษรไม่สวยมากมายบนหน้าจอ ทำให้ต้องพยายามตั้งค่าตัวอักษรกันหน่อย สุดท้ายวิธีการเป็นดังรูปครับ เลือก main menu -> ระบบ -> ปรับแต่งพื้นโต๊ะ -> รูปโฉม

From software

ในรูปจะเห็นว่า "การวาด" ถูกเลือกทุกอันเลย ซึ่งมันทำไม่ได้ ให้เรากด "รายละเอียด" แล้วตั้งค่าตามรูปที่หน้าแรกจะกลายเป็นเลือกทุกช่องไปเอง

From software

เสร็จแล้วกดปิดให้หมด เป็นอันเสร็จสินครับ