Planet TLWG

Subscribe to Planet TLWG feed
Planet TLWG - http://debianclub.org/planet-tlwg
Updated: 1 hour 59 min ago

Udomsak: บันทึกการทำงาน : หาที่เก็บ log ชัวคราว ไว้ debug capistrano deploy

8 February, 2016 - 18:11

บันทึกก่อนเลิกงาน  พอดีใช้ capistrano อยู่ ปัญหาหนึ่งคือ เวลามี error แล้ว ต้องดูจาก log ถ้า operation มีเยอะ จะหาดจาก log ก็ค่อนข้างลำบากต้อง scroll  เลยนั่งแก้ปัญหา ง่ายๆ 10นาที แบบ ไม่มี docker   
Solve
  1. สร้าง log directory แบบชั่วคราว
    cd ~/MyworkEnvironMent/ && mkdir logs && touch logs/deploy.log
  2. ดาวน์โหลด tool สำหรับ tail log จาก papertails จากลิงค์นี้  ( https://github.com/papertrail/remote_syslog2/releases )  แล้วก็ติดตั้ง
    sudo rpm -ivh ~/Downloads/remote_syslog2-0.16-1.x86_64.rpm 
  3. กลับไปที่เวบ Papertails  
    1. กด Link new system จะได้ ค่า port มา และ host ของ papertails เราจะเอามาเป็น end-point ในการ config     
  4. รัน capistrano
    remote_syslog -d logs3.papertrailapp.com -p 102232  logs/deploy.log
      
  5. pipe log ไปเข้าที่ papertails service ( https://papertrailapp.com )
    cap wordpress deploy | tee  logs/deploy.log
  6.  จบ
     






My site Article and Topic

Udomsak: บันทึก ก่อนนอน - distribute php app with phar.

5 February, 2016 - 01:37


ก่อนนอน นอนไม่หลับ เพราะเขียน app ง่ายๆ ผ่านๆ พอดี  เล่าสั้นเท้าความปัญหา  คือ ต้องหา เครื่องมือมา สำหรับ deploy web application ไปยัง เครื่องปลายทาง  ซึ่ง สำหรับกรณีนี้ ดูแล้ว ไม่มีความจำเป็นอันใดในการใช้ Docker  จึงได้ทดลอง framework สำหรับ  deployment ด้วยเวลาอันจำกัด เลยได้ออกมาดังนี้


  • Mina
  • Capistrano 
  • Ansible   
สุดท้าย จึงได้เลือกใช้ Capistrano มาใช้งาน โดยมองข้ามเรื่องความเร็วไป  แต่มองเรื่อง ความยืดหย่น และ ชุมชน สนับสนน ( Community support ) 


ทีนี้พอทำ task ขึ้นมาเสร็จ ลืมบอกไป ต้องเขียนใหม่เกือบหมด เพราะ  Task ที่ share กันมาไม่เข้ากับ flow การทำงานที่มีอยู่  จึงต้องเขียนใหม่  เมื่อเขียนเสร็จแล้ว เพื่อให้ใช้งานได้ สะดวก และ ไม่ต้องเรียนรู้มาก จึงต้องมีการหาวิธีให้ มีการใช้งานง่าย ๆ  โดย ไม่มีการใช้งาน web ui  สุดท้ายจึงต้องทำ script wrapper เอา     
  • Script ต้อง support configuration file 
  • Script ต้อง สามารถ generate Capfile และ Stage ไฟล์ได้  
  • Script ต้อง สามารถ ทำให้ share Task ไฟล์ให้กับ Team ได้  
  • Script ต้อง สามารถ ทำการ config ได้โดยผ่าน wizard setup ( prompt ) 
  • etc.
จากหัวข้อข้างต้นมา เพื่อความเร็ว  ผมจึงเลือกใช้ 
  • bash wrapper ทั้ง core command และ extension สำหรับ git 
จาก bash ก็จะเจอข้อจำกัดเรื่องของ configuration file โดยคุยกันว่า เป็น format yaml ( .yml ) จากข้อจำกัดนี้ 
  • Ruby คือตัวเลือก แต่ติดปัญหาเรื่อง เวลา และ distribute script และ dependencies install 
    • write new class  
    • develop gem file 
    • test and distribute script   
    • time limit. 
    • maintainable
    • etc. 
จากข้อจำกัด ที่เกิิดขึ้น จึง หันกลับไปมอง ตัวเลือก ที่อยูหางแถว  คือ  PHP ก็พอตอบโจทย์ ได้เกือบทุกอย่าง โดยเลือก distribute ออกมาเป็น phar ไฟล์  
PHP phar คือ การ distribute PHP application ในลักษณะของ แพคเกจ อีกทั้ง ยังสามารถ set ให้ phar ไฟล์นั้น execute ได้อีกด้วย  โดยผมใช้ตามนี้
  •  PHP Symfony console component เป็น framework ในการพัฒนา console application.

     http://symfony.com/doc/current/components/console/introduction.html
  •  Build phar file ให้เป็น execute ไฟล์ได้ ผมใช้ Box2 project

     https://github.com/box-project/box2
      
  • แต่ละฟังก์ชั่น การทำงาน จะแยกออกมาเป็น Class ทำให้ code structure ดีขึ้นและแน่นอน maintain ง่ายด้วย  

ร่วมง่วงล่่ะ  ขอนอนก่อน วันหลังมาเขียนต่อใหม่ Symfony 2 PHP Framework 

My site Article and Topic

Thep: Thai Font Metrics

4 February, 2016 - 17:10

ประเด็นเล็ก ๆ ประเด็นหนึ่งที่ถูกอภิปรายกันในหลายโอกาสในหมู่คนทำฟอนต์ไทย หรือกระทั่งในหมู่ผู้ใช้ที่ต้องเตรียมเอกสารให้เข้ากับข้อกำหนด คือเรื่องขนาดของฟอนต์ไทยที่จะเล็กกว่าฟอนต์ตะวันตกที่ point size เดียวกัน เช่น บทความภาษาอังกฤษอาจกำหนดขนาดฟอนต์เป็น 10 หรือ 11 point แต่ถ้าใช้ฟอนต์ไทยขนาดเดียวกันจะเล็กจนอ่านไม่ออก ต้องปรับขนาดเพิ่มเป็น 14 หรือ 16 point ถึงจะเทียบเคียงกันได้ เรื่องนี้คุณเนยสดได้ เขียนอธิบายไว้แล้วเป็นอย่างดี

ฟอนต์จาก TLWG

สำหรับฟอนต์ชุดต่าง ๆ ที่ TLWG ผมได้ปรับขนาดตัวอักษรให้ใหญ่ขึ้น เพื่อให้เข้ากันกับฟอนต์ตะวันตกทั้งหมด ไม่ว่าจะเป็น Fonts-TLWG, Fonts-SIPA-Arundina หรือ ThaiFonts-Siampradesh ทำให้เกิดความไม่เข้ากันกับฟอนต์ไทยอื่น ๆ ที่มีอยู่ในตลาด

สำหรับที่มาที่ไป ผมตัดสินใจใช้ font metrics ที่เข้ากันกับฟอนต์ตะวันตกหลังจากที่ได้พูดคุยกับผู้ใช้และนักพัฒนาใน thread หนึ่งใน gtk-i18n list เมื่อปี 2547 โดยในขณะนั้น ฟอนต์ต่าง ๆ ที่พัฒนา ปรับปรุง และเผยแพร่โดย TLWG ยังใช้ขนาดเหมือนฟอนต์ไทยในตลาด และมีฝรั่งที่พยายามเรียนภาษาไทยบ่นเข้ามาว่าฟอนต์ไทยตัวเล็กมาก อ่านไม่ออก มีฟอนต์ที่ตัวใหญ่กว่านี้แนะนำไหม ผมพยายามอธิบายเหตุผลที่ฟอนต์ไทยต้องตัวเล็ก ว่าเราต้องเผื่อเนื้อที่ให้กับสระบน-ล่างและวรรณยุกต์ ก็ปรากฏว่านักพัฒนา Pango (Owen Taylor) ได้ แนะนำ ว่าสามารถใช้ขนาดตัวอักษรที่เท่ากับฟอนต์ตะวันตกได้ โดยเพียงแต่ขยายระยะระหว่างบรรทัดให้สูงขึ้น และได้รับการ สำทับ จาก Javier Sola นักพัฒนา Khmer OS ว่าฟอนต์ภาษาเขมรก็ใช้วิธีนี้ และได้ผลดี

ในขณะนั้น เรามีฟอนต์ Loma จาก NECTEC ที่เริ่มบุกเบิกทำฟอนต์ UI โดยใช้ metrics ที่สอดคล้องกับฟอนต์ตะวันตกเป็นตัวอย่างอยู่แล้ว หลังจากที่ในวินโดวส์มีฟอนต์ Tahoma ที่ทำงานในลักษณะนี้มาแล้วระยะหนึ่ง เมื่อนำมาประกอบกับข้อมูลที่ได้จากชุมชน GTK+ ดังกล่าว ผมจึงตัดสินใจปรับขนาดฟอนต์ไทยทั้งหมดในแหล่งของ TLWG ตามฟอนต์ตะวันตกตั้งแต่นั้นมา

Font Metrics แบบไทย

ย้อนกลับไปที่ที่มาของ font metrics แบบไทยที่มีการย่อส่วนลงมา เหตุผลเป็นที่เข้าใจได้ไม่ยาก ว่ามาจากการเผื่อเนื้อที่ให้กับสระบน-ล่างและวรรณยุกต์ ทำให้ต้องย่อขนาดของพยัญชนะลง และเพื่อให้เข้ากันกับตัวโรมัน ก็จำเป็นต้องย่อขนาดของตัวโรมันลงตามด้วย ทำให้ตัวโรมันของฟอนต์ไทยมีขนาดเหลือเพียงประมาณ 70% ของฟอนต์ตะวันตกที่มี point size เท่ากัน

เรื่องนี้มีตัวอย่างอย่างละเอียดในหนังสือ แบบตัวพิมพ์ไทย ที่จัดพิมพ์โดยโครงการฟอนต์แห่งชาติของ NECTEC เมื่อ พ.ศ. 2543

ปัญหา

การใช้ font metrics แบบไทยดูจะทำงานได้ดี และเราก็ใช้งานแบบนี้กันมานาน ตั้งแต่ยุค Windows 3.1 ที่ยังใช้รหัส สมอ. และมี Windows Thai Edition ใช้งานกันอยู่ มาจนถึงยุคเปลี่ยนผ่านสู่ I18N และ Unicode ใน Windows 95, Windows XP แล้วเราก็เริ่มเจออะไรทำนองนี้ในเว็บไซต์:

ภาพนี้ผมจำลองขึ้นใหม่ เนื่องจากไม่มีระบบรุ่นเก่าให้จับภาพแล้ว แต่คงจะพอจำความรู้สึกนี้ได้ ที่เวลาอ่านเว็บไซต์ต่าง ๆ แล้ว เจอข้อความที่ภาษาไทยเล็กเท่ามด ภาษาอังกฤษใหญ่เท่าหม้อข้าว เพราะ text rendering engine แบบ multilingual ยุคแรก ๆ พยายามแสดงข้อความโดยแยกฟอนต์ตามภาษาเขียน แต่มันไม่แยกแยะว่าภาษาไทยต้องขยาย หรือภาษาอังกฤษต้องย่อ ส่วนข้อความภาษาเขมรนั้น ผมจำลองใส่เข้าไปด้วยเพื่อเปรียบเทียบให้ดูว่าเขา implement แบบไหน

rendering engine ยุคหลัง ๆ เริ่มฉลาดขึ้น โดยพยายามเลือกฟอนต์ตามภาษาหลักหรือตามโลแคล ถ้าฟอนต์นั้นมีอักษรโรมันให้ก็นำมาใช้เลย ถ้าไม่มีจึงจะไปหาจากฟอนต์อื่น ช่วยบรรเทาปัญหาข้อความผสมภาษาไทย-อังกฤษลงได้

แล้วโลกก็หมุนต่อไป สังคมไทยเริ่มเข้าสู่ยุคที่มีภาษาที่สามที่สี่ เด็ก ๆ เริ่มเรียนภาษาจีน ญี่ปุ่น เกาหลี ฯลฯ กันมากขึ้น ประชาคมเศรษฐกิจอาเซียนเริ่มรวมตัวกัน เริ่มมีข้อความภาษาลาว เขมร พม่า เข้ามามากขึ้น การใช้งานแบบ multilingual เริ่มเข้มข้นขึ้นกว่าแต่ก่อนที่เคยมีแค่ไทย-อังกฤษ

คำถามคือ เราจะจัดการระบบ multilingual นี้อย่างไร? เดิมมีแค่สองภาษา ฟอนต์อังกฤษมันโตเกินไป เราก็เพิ่มอักษรอังกฤษย่อส่วนลงในฟอนต์ไทยเสียก็สิ้นเรื่อง แต่เมื่อมีภาษาจีน ญี่ปุ่น เกาหลี ลาว เขมร พม่า เข้ามาร่วมด้วย เราจะเพิ่มอักษรของภาษาเหล่านั้นลงในฟอนต์ไทยหมดไหม? เอาแค่อักษรจีนอย่างต่ำ 5,000 ตัวก็อ่วมอรไทแล้ว ไหนจะอักษรเขมรที่มีอักษรตัวเชิง ทำให้ต้องเผื่อเนื้อที่บน-ล่างกว้างกว่าอักษรไทยเสียอีก เราจะได้ฟอนต์ตัวเล็กลงไปอีก และถ้าสักวันเราจะเพิ่ม อักษรทิเบต (ไม่แน่นะครับ ก็เราชอบประเทศภูฏานกันมากไม่ใช่หรือ) ที่ซ้อนกันสนุกสนานกว่าอักษรเขมรเสียอีก เราจะยิ่งได้ฟอนต์ที่เล็กกระจิ๋วหลิวเลยทีเดียว

เริ่มเห็นภาพกันไหมครับ ว่าการเผื่อช่องว่างสำหรับการซ้อนอักขระมันไม่ scale ในระบบ multilingual

หรือหากผลักภาระไปให้ rendering engine ที่จะต้องจดจำว่าภาษาแต่ละภาษาต้องย่อ-ขยายด้วยอัตราเท่าไรแล้วปรับขนาดฟอนต์เอา มันก็เป็น workaround ที่ไปเพิ่มความยุ่งยากให้กับการออกแบบฟอนต์คู่สองภาษาอื่น ๆ เช่น การสร้างฟอนต์ที่มีอักษรไทย-ลาว, ไทย-เขมร, ไทย-พม่า, ไทย-ยาวี เพื่อใช้ในบริบทของกลุ่มผู้ใช้ทวิภาษา จะต้องออกแบบฟอนต์ให้อักษรแต่ละภาษามีขนาดไม่เท่ากันในฟอนต์เดียวกัน และถ้าเกิดว่า rendering engine ของแต่ละระบบใช้อัตราย่อ-ขยายของแต่ละภาษาต่างกันอีกล่ะ? คงจะพอจินตนาการถึงความยุ่งยากกันได้ และโชคดีที่ไม่มี rendering engine ไหนคิดทำอะไรทำนองนี้

ถ้าเช่นนั้น แบบไหนล่ะถึงจะ scale?

ทางออก

ระบบที่ดูสมเหตุสมผลกว่าก็คือ ทุกภาษาควรอิงบรรทัดฐานเดียวกัน กล่าวคือ

กำหนดให้ point size คือความสูงของตัวอักษร ไม่ใช่ความสูงของบรรทัด

เมื่อกำหนดอย่างนี้ แล้วไปขยายขนาดตัวอักษรไทยทั้งหมดให้สูงเท่า point size ซึ่งจะทำให้วรรณยุกต์เขยิบขึ้นสูงจนตกขอบด้านบนของ em-box นักพัฒนาฟอนต์ก็อาจเกิดประเด็นคำถามต่อไปนี้:

  • จะกำหนดความสูงของบรรทัดให้สูงกว่า em-box ได้อย่างไร?
  • การที่ glyph ของวรรณยุกต์ตกขอบ em-box ซึ่งเป็น bounding box ออกไป จะไม่ผิดหลักการหรือ?
  • font metrics แบบใหม่ จะขัดกันกับแบบเดิมที่ใช้ในเอกสารต่าง ๆ ไหม?

ก็จะตอบทีละประเด็นนะครับ

การกำหนดความสูงของบรรทัด

โดยปกติที่ผ่านมา ฟอนต์ไทยเคร่งครัดกับเรื่องความสูงของบรรทัดที่จะไม่ให้เกิน em-box ทำให้เราต้องย่อขนาดตัวอักษรทั้งหมดให้เล็กลงเพื่อให้สามารถบรรจุสระบน-ล่างและวรรณยุกต์ลงไปใน em-box ได้

แต่ในการคำนวณระยะระหว่างบรรทัดของโปรแกรมต่าง ๆ ที่ใช้ฟอนต์ TrueType หรือ OpenType จะไม่ได้ใช้ ascender/descender จาก em-box นี้โดยตรง แต่จะใช้ค่า sTypoAscender, sTypoDescender และ sTypoLineGap จาก ตาราง OS/2 & Windows Metrics ในตัวฟอนต์ ซึ่งเราสามารถกำหนดค่า sTypoAscender และ sTypoDescender ให้เลย em-box ออกไปได้ และอาจกำหนดค่า usWinAscent และ usWinDescent ด้วย เพื่อไม่ให้บิตแม็ปของตัวอักษรที่วาดถูกขลิบออก

อย่างไรก็ดี ในทางปฏิบัติแล้ว ค่า usWinAscent และ usWinDescent กลับเป็นค่าที่มีผลต่อการคำนวณระยะระหว่างบรรทัดมากกว่า (app ต่าง ๆ ไม่ได้ทำตาม spec ของไมโครซอฟท์นัก แม้ใน spec ของไมโครซอฟท์จะเขียนไว้ว่า This is strongly discouraged. ก็ตาม

โดยสรุปก็คือ ควรกำหนดค่าทั้ง sTypoAscender, sTypoDescender, usWinAscent, usWinDescent ทั้งหมดไว้ก่อน

หากใช้ Fontforge ก็กำหนดได้ในแท็บ OS/2 Metrics (Element > Font Info > OS/2 > Metrics)

ตำแหน่งของวรรณยุกต์

ในยุคก่อน เรามีการจัดตำแหน่งสระบน-ล่างและวรรณยุกต์เพื่อหลบหางพยัญชนะโดยใช้วิธีสร้าง glyph ชุดพิเศษที่มีการเลื่อนตำแหน่งรอไว้ แล้ว rendering engine จะเลือกใช้ glyph ชุดพิเศษเหล่านั้นตามความเหมาะสม เป็นเทคนิคที่เขาเรียกกันว่า positioning by substitution

glyph ชุดพิเศษต่าง ๆ เหล่านี้ จะเลื่อนระยะไว้เรียบร้อยเพื่อให้นำไปวางซ้อนได้พอดีโดยไม่มีการเลื่อนที่อีก ดังนั้น หากจะใช้เทคนิคนี้กับฟอนต์ที่ขยายขนาดขึ้น glyph ของวรรณยุกต์ที่เลื่อนระยะรอไว้ก็จะต้องตกขอบ em-box อย่างเลี่ยงไม่ได้ (แต่ยังอยู่ภายในความสูงของบรรทัด)

แต่นั่นเป็นข้อจำกัดของระบบเก่าก่อนที่จะมี OpenType

ด้วยเทคโนโลยี OpenType เรามีเครื่องมือจัดตำแหน่งการวางซ้อนอักขระ โดยใช้ข้อมูล GPOS ซึ่งอาศัยการกำหนด anchor สำหรับวาง glyph ซ้อนกันเหมือนการต่อชิ้นส่วนเลโก้ โดย glyph ที่เป็นฐานจะมี base anchor เป็นเหมือนเบ้าเสียบรอไว้ ส่วน glyph ที่จะมาวางซ้อนก็จะมี mark anchor เป็นเหมือนเดือยสำหรับเสียบเข้ากับเบ้า

ในการวาง glyph ที่มาซ้อนนั้น ตำแหน่ง glyph ตัวสวมจะถูกเลื่อนที่ด้วยเวกเตอร์ระหว่าง anchor เสียบกับ anchor เบ้า เพื่อให้ anchor สวมกันได้พอดี ดังนั้น ตำแหน่งเดิมของ glyph จะอยู่ที่ไหนก็ไม่สำคัญ เพราะยังไงก็สามารถคำนวณเวกเตอร์ดังกล่าวได้อยู่แล้ว ทำให้เราสามารถวาง glyph ของวรรณยุกต์ไว้ภายใน em-box ก็ได้ถ้าต้องการ นักพัฒนาฟอนต์ที่เคร่งครัดกับ em-box จึงวางใจได้

สำหรับผู้ที่สนใจ ไมโครซอฟท์มีเอกสารแนะนำ การสร้างฟอนต์ OpenType สำหรับอักษรไทย โดยเฉพาะ

ความเข้ากันได้กับฟอนต์เดิม

ประเด็นนี้ ตอบได้สั้น ๆ ว่า ไม่เข้ากันแน่นอน หากจะเปลี่ยนมาใช้ metrics ใหม่ จะต้องมีการจัดการกับความเปลี่ยนแปลง และคงไม่ใช่เรื่องที่จะทำได้ชั่วข้ามคืน ผมเองก็ไม่เคยคิดว่ามันจะเกิดในอนาคตอันใกล้ จนกระทั่งเริ่มสังเกตเห็นแนวโน้มความเปลี่ยนแปลงบางอย่าง กล่าวคือ

  • ฟอนต์นานาภาษา ที่มีอักษรของภาษาต่าง ๆ ทั่วโลกเริ่มมีมากขึ้น หลังจากเทคโนโลยี multilingual เริ่มอยู่ตัวและใช้กันเป็นปกติ เช่น
    • Freefont จาก GNU Project (มีอักษรไทย)
    • Noto Fonts จาก Google (มีอักษรไทย)
    • DejaVu fork จาก Bitstream Vera (ยังไม่มีอักษรไทย)
    เฉพาะฟอนต์ที่มีอักษรไทย แน่นอนว่าใช้ font metrics ที่ point size = ขนาดตัวอักษร และใช้ GPOS ในการเลื่อนวรรณยุกต์ขึ้นสูงจาก em-box หรือถ้ายังไม่มีอักษรไทย ดูอักษรภาษาอื่น ๆ ที่มีแล้วต่างก็ใช้แนวทางนี้
  • web font ไทย
    • คัดสรร ดีมาก (Cadson Demak) เท่าที่ตรวจสอบเฉพาะ 3 ฟอนต์ใน Google Fonts พบว่าใช้ font metrics ที่ point size = ขนาดตัวอักษร และใช้ GPOS ในการเลื่อนวรรณยุกต์ขึ้นสูงจาก em-box

หากแนวโน้มการสร้างฟอนต์นานาภาษาเพื่อใช้ในระบบต่าง ๆ มีมากขึ้น (ผมยังไม่ได้ตรวจสอบฟอนต์ที่ใช้ในสมาร์ทโฟนต่าง ๆ) และการใช้ฟอนต์ในเว็บไซต์ต่าง ๆ ก็มีมากขึ้น จึงน่าสนใจว่าแนวโน้มเหล่านี้จะมีผลเปลี่ยนแปลงการใช้ฟอนต์ในเดสก์ท็อปปัจจุบันมากน้อยแค่ไหน คงต้องรอดูกันต่อไป โดยเฉพาะบนวินโดวส์ที่มีฟอนต์ Tahoma ให้ใช้กันเป็นตัวอย่างมานานแล้ว

และสุดท้ายก็อยู่ที่ผู้พัฒนาฟอนต์ทั้งหลายนั่นแหละครับ ว่าจะขยับไปสู่แนวทางนี้กันมากน้อยแค่ไหน

Udomsak: บันทึกสั้นๆ - ใช้งาน Docker สำหรับ พัฒนาแอพฯ ยังไง ?

2 February, 2016 - 20:58
บันทึกสั้น
เป็นบันทึกสั้นๆ  ผมเขียนขึ้นระหว่าง รอติดตั้ง ruby rbenv ลงใน docker Ubuntu 14.04 container  เพราะ กำลังจะทดสอบ ว่า rvm ทำให้ระบบ gem รวนหรือเปล่า โดยผมจะย้าย rbenv ไปรันบน Ubuntu แทน เพราะ Debian 8 มีปัญหา compile ไม่ผ่าน

ทีนี้ net ต่างจังหวัด ( จังหวัดลำพูน )  ที่บ้านผมพอที่จะติดตั้งได้ก็ความเร็ว 1MB  เลยลง ruby นานหน่อย  เลยมาเขียนเอาไว้ สั้นๆ

ข้อสังเกตุ 
  • ผมตั้งให้  user id ( UID ) ในเครื่องของผม และ ใน docker ให้ตรงกัน 
  • หลักคิด ก็คือ mount directory ที่มีอยู่จริงในเครื่องผม เข้าไปใน container โดยตรงเลย
  • เครื่องผมไม่ได้ set user ให้ run docker ได้โดยตรง ( เหตุผลขี้เกียจ ) 
  • การตั้ง user id ให้ตรงกัน ที่ทำแบบนี้ เพราะ เวลา access container แล้วมีการแก้ไขไฟล์  ไฟล์จะเป็น สิทธิของ root ทำให้ git commit ไม่ได้  ( .git  folder access denied ).  


กดคลิ๊กเพื่อดูภาพใหญ่ ถ้ายังใหญ่ไม่พอ.  :D




My site Article and Topic

Thep: Thanks

2 February, 2016 - 16:29

ขอขอบคุณย้อนหลัง สำหรับผู้สนับสนุนงานพัฒนาซอฟต์แวร์เสรีของผมในช่วงตุลาคม 2558 ถึงมกราคม 2559 ที่ผ่านมาครับ คือ:

  • เดือนตุลาคม 2558
    • อ.พฤษภ์ บุญมา
    • ผู้ไม่ประสงค์จะออกนาม
    • คุณธนาธิป ศรีวิรุฬห์ชัย
    • ผู้ไม่แสดงตน 1 ท่าน
  • เดือนพฤศจิกายน 2558
  • เดือนธันวาคม 2558
  • เดือนมกราคม 2559
    • อ.พฤษภ์ บุญมา
    • คุณธนาธิป ศรีวิรุฬห์ชัย
    • คุณ RERNG-RIT
    • ผู้ไม่ประสงค์จะออกนาม

ขอให้ทุกท่านเจริญด้วยอายุ วรรณะ สุขะ พละ การงานเจริญก้าวหน้า คิดหวังสิ่งใดก็ขอให้สมดังปรารถนาครับ

สี่เดือนผ่านไป งานที่ได้ทำไปในช่วงนี้ก็คือ:

  • ทำ libthai ให้ thread-safe พร้อมทั้ง optimize libthai อีกนิดหน่อย ได้เป็น libthai 0.1.23 ตามด้วยการแก้บั๊กใน libthai 0.1.24
  • เตรียม libthai udeb เพื่อใช้ใน debian-installer
  • พัฒนา Fonts-TLWG ให้รองรับการเขียนภาษามลายูปาตานี และออกรุ่น Fonts-TLWG 0.6.2
  • เตรียมแพกเกจ OTF และ WOFF สำหรับ Fonts-TLWG บน Debian
  • งานแปล: Xfce, GNOME, Debian Installer ตามปกติ
  • ปรับแก้ Debian package ของ libdatrie และ libthai โดยประเด็นหลักคือ:
    • แก้ให้ libdatrie-doc และ libthai-doc ใช้ไฟล์ jquery.js ของระบบ (จากแพกเกจ libjs-jquery) แทนฉบับที่ doxygen embed ให้ ช่วยประหยัดเนื้อที่ได้ถึง 146 KB และการใช้สคริปต์ร่วมกันยังช่วยให้สามารถปรับรุ่นทั้งระบบได้สะดวก
    • เขียน debian/rules ใหม่ จากการเรียก dh_* ตรง ๆ มาเป็นการใช้ dh ซึ่งทำให้กฎกระชับลงอย่างมาก และยังได้แพกเกจ -dbgsym สำหรับการดีบั๊กโดยอัตโนมัติอีกด้วย
    • แก้ปัญหา FTBFS ด้วย GCC 6 ที่เกิดจาก libthai (หลังจากย้ายมา GCC 5 ใน Jessie ครั้งหนึ่งแล้ว Debian Stretch กำลังจะใช้ GCC 6 เป็นรุ่น default)

ช่วงเทอมที่ผ่านมา (ส.ค. - ธ.ค. 2558) ผมรับงานสอน เป็นอาจารย์พิเศษที่มหาวิทยาลัยแห่งหนึ่ง ต้องบริหารเวลาอย่างหนัก ทั้งกิจกรรมของครอบครัวเล็ก ครอบครัวใหญ่ ทั้งงานสอนที่ต้องเตรียมสอน ออกข้อสอบ วัดผล แล้วก็สลับมาทำงานซอฟต์แวร์เสรีไปด้วย ทำให้หายไปจาก social network พักใหญ่ บางช่วงไม่ได้เข้าไปเช็กอะไรเลยเกือบทั้งอาทิตย์ บางช่วงได้แต่เช็กอะไรในช่วงสั้น ๆ ไม่สามารถโต้ตอบได้ ตอนนี้ก็พยายามกลับมาทำงานต่อ กลับมาคุยกับชาวบ้านได้มากขึ้น (นิดหน่อย) ล่ะครับ ^_^'

Udomsak: บันทึกวันหยด - ลงเวลาบันทึกการทำงาน

30 January, 2016 - 13:31
วันนี้กลับมาจากเชียงใหม่ เพื่อ จะเข้าบ้านที่ลำพูน แวะ ที่ร้านกาแฟ  ดีๆ  อยู่ริมถนน ซุปเปอร์ไฮเวย์  เชียงใหม่  -  ลำพูน  ชื่อร้าน 'Be Beyond Cafe'   นั่ง Charge battery  เลยต่อ Internet นั่ง ค้นข้อมูลหน่อย

อยากจะได้เครื่องมือ ที่ใช้สำหรับลงเวลาบันทึก การทำงาน แบบง่ายๆ  ไม่ต้องคอย กรอกหรือ นั่งนึกถึงเวลา หรือ นั่งคำณวณเวลาใน spread sheet  ให้มันบันทึกเวลาเองได้ไหม โดยไม่ต้องทำอะไรให้ยุ่งยาก  ไปเจอมาตัวหนึ่งชื่อ  Wekatime ก็ถือว่าโอเค

  • Wakatime ลงเวลาให้เอง  
  • Wakatime จะรันเวลาต่อไปเรื่อยๆ  ถ้าไม่ปิด editor ทำให้ต้องบังคับ ปิด Editor หรือ IDE ที่เราทำงานอยู่  ทำให้เราได้โอกาสได้พักจริงๆ  และ ไม่ลืม save ( เพราะเวลาปิด อะไรที่ไม่ได้ save ก็จะ popup เตือนขึ้นมา )) 
  • Wakatime  สามารถ integrate เข้ากับ git repository ได้หลาย vendor ไม่ว่าจะเป็น Github, Bitbucket   
  • Wakatime นอกจากลงเวลาแล้ว ทำให้เราเห็นว่า ส่วนงานที่เราทำงานอยู่ ส่วนไหน ใช้เวลาไปเท่าไหร่ .  
ผมเองใช้ Atom กับ Bracket  +  Docker และ Vim  ในการทำงาน  อาจจะสลับระหว่าง Atom กับ Bracket บ้างแต่หลักๆ จะอยู่ที่ Atom มากกว่า



Wakatime 


ติดตั้ง Wakatime ใน Atom editor  โดยให้ทำการ sign-up แล้วทำตามหน้านี้  https://wakatime.com/help/plugins/atom     สำหรับในการติดตั้ง plugin โดยเอา API-key  มาใส่ใน Wakatime settings. 
เมื่อทำการติดตั้งแล้ว  ให้
  1. restart Atom Editor
  2. Add new folder project  ถ้าไม่ Add new folder project แต่อาศัยเปิดจาก project เดิม Wakatime จะไม่ทำการบันทึกให้   
  3. ทดสอบ แก้ไข code  และ ทำการ commit  ผลลัพธ์จะแสดงให้เห็น บน Dashboard ตามแบบรูปที่ แสดงด้านล่างนี้. 











My site Article and Topic

Udomsak: บันทึกวันหยุด - เปลี่ยน Storage backend ของ Docker บน Fedora core 22

23 January, 2016 - 23:24
วันหยุด อยากจะหยุด จริงๆ  ไม่อยากแตะคอมพิวเตอร์ เพื่อทำงานด้านเทคนิคเลย แต่เอาเถอะไม่งันวันจันทร์ต้องมานั่ง  เคลียร์อีก กว่าจะเสร็จคงกินเวลาเป็นชั่วโมง งานการไม่ต้องทำกันพอดี

ปัญหาเดิมที่เจออยู่เป็นประจำ คือ "Docker ทำให้ Hard-disk เต็ม "  ลืมบอกไปผมใช้ Linux Fedora core 22  ( คิดว่าหลายคนที่ใช้  RedHat base ) น่าจะเจอเหมือนกัน ?









สาเหตุหลักก็คือ  Default Storage back-End ของ Docker บน Fedora Linux core 22 ที่ผมใช้อยู่คือ  "Device mapper"  ซึ่งทุกๆ ครั้งที่มีการ สร้าง Image docker  ตัว Device-mapper มันจะ reserve space เอาไว้ และ แม้จะทำการลบ image ที่ไม่ได้ใช้ ทิ้งไป ปรากฏว่า  Device-mapper ไม่ยอมคืนพื้นที่ให้ แต่อย่างใด  



ทางแก้ทางเดียว คือ ต้อง ลบ  /var/lib/docker  แล้ว สั่ง  service docker restart  เพื่อ init directory ใหม่ มันดูประหลาดๆ และ  ที่สำคัญงานที่ทำๆ เอาไว้ใน image ก็ต้องหายไปด้วย   ( กรณีไม่มี backup )  

ก่อนจะมีการ ลบทิ้ง ปกติตอน ว่างงานอย่ ก็มักจะลบทิ้งได้เลยแต่   ณ วันนี้แล้ว มี ENV ที่ set เอาไว้ใน Docker Container บนเครื่องก็ไม่อยากลบเท่าไหร่เพราะต้อง มา Backup อีก  เลยต้องมีการ ฺBackup กันบ้าง 
ออปชั่นสำหรับ Docker  ที่ใช้ในการ Backup คือ  
  • docker save 
  • docker export 
ถามว่าต่าง กันยังไง นั่งหาเอกสาร มาอธิบายให้เข้าใจ ได้ง่ายๆ คือ อันนี้  http://tuhrig.de/difference-between-save-and-export-in-docker/  ( ผมเข้าใจว่าอันนี้ เข้าใจได้ง่ายสุดล่ะนะ )  แต่หลักๆ ก็จำไว้แบบนี้
  • สำหรับ container ที่ run อยู่ใช้  export  
    • = docker image ( original ) + ( diff )   
  • สำหรับ container ที่ไม่ได้ run อยู่ใช้ save   
    • = docker image ( original ) 
  • กรณี  ที่มีการใช้งาน docker image มีการ tag เอาไว้ เยอะๆ  docker save จะมี การเก็บ เอา history tag ไปด้วย  ซึ่งจะทำให้ rollback ได้  

ทำการลบ ทิ้งทั้ง Folder docker 

จากนั้นก็ทำตามนี้  เกือบลืม 
  1. เปิดไฟล์  /etc/sysconfig/docker  แก้ไขในส่วนของ     OPTIONS='--selinux-enabled'    ไปเป็น  OPTIONS='--selinux-enabled=false'   เพื่อปิดการทำงานของ SE-Linux 
  2. เปิดไฟล์   /etc/sysconfig/docker-storage   แก้ไข โดยเพิ่ม option   

DOCKER_STORAGE_OPTIONS= -s overlay
     
จากนั้น สั่ง  restart docker service
sudo service docker restart 

ทำเสร็จแล้ว จะได้ผลออกมาดังนี้ 


จบ
แหล่งอ้างอิง:  https://www.projectatomic.io/blog/2015/06/notes-on-fedora-centos-and-docker-storage-drivers/
My site Article and Topic

Neutron: RahuNAS Dual-Stack Authen planning

17 January, 2016 - 11:19

https://tools.ietf.org/html/rfc6939

DHCPv6 ใช้ข้อมูลอื่น แทน Link-Layer Address ที่ DHCPv4 ใช้ ทำให้ข้อมูล link-layer address จะไม่มีส่งมาใน unicast request (DHCP relay)

จึงมีการเสนอ RFC6939 เพื่อให้ edge-switch หรือ switch ที่เชื่อมต่อกับ client ใน link layer เดียวกัน ในเวลาที่ทำ DHCP relay ให้แปะ Client Link-Layer Address Option มาด้วย

เหตุผลที่ต้องการ Client Link-Layer Address ก็เนื่องมาจาก กรณีที่เราให้บริการ Dual-Stack (IPv4 + IPv6) ข้อมูลที่จะบ่งบอกว่า client มาจาก device เดียวกัน ที่ระบบมองเห็น ก็คือ link-layer address

ดังนั้น ถ้ามีข้อมูล link-layer address ก็พอจะมีทางทำให้ Captive Portal Authentication ให้ทำ single login เช่น login ผ่าน IPv4 แล้ว ก็ไม่ต้องทำผ่าน IPv6 อีก และกลับกันก็ด้วย

อย่างไรก็ตาม RFC6939 ยังมีข้อจำกัดว่า อุปกรณ์ Switch/Router ต้องรองรับ เท่าที่ไล่หาข้อมูล พบว่า Cisco Switch/Router หลายรุ่นรองรับแล้ว ^_^

เรื่องนี้ยังต้องทดสอบใน LAB เพื่อวางแผนในการพัฒนา RahuNAS รุ่นหน้า ซึ่งวางโครงสร้างให้รองรับทั้ง IPv4 และ IPv6 ไปบ้างแล้ว

Udomsak: บันทึกการทำงานหน่อยๆ ตอนที่ 1.1

14 January, 2016 - 11:01
วันนี้กลับมานั่งไล่ดูอีกที เรื่อง Queues System พร้อมกับปัญหาที่เจอ ตอนนี้พอสรุปได้คร่าวๆ ดังนี้
Software ที่เร็ว  
  • Beanstalkd   ตัวนี้ support PHP, Ruby, Python community ดีพอควร เอกสารพอมีมากอยู่ การติดตั้ง ง่าย อยุ่ Option ไม่มีอะไรมาก  ติดตั้งแล้วทำงานได้เลย 
Software ที่ support periodic task ( งานที่เหมือน cron job ).
  • Beanstalkd  ไม่ support 
  • Sidekiq ( http://www.sidekiq.org )  support  ส่วน Client Lib ที่ support  PHP, Python, Ruby และ อื่นๆ
  • Celery ( http://www.celeryproject.org ) support ส่วน client lib ที่ support PHP, Python, Ruby และ อื่นๆ 
  • Rundeck ( http:/www.rundeck.org ) support ส่วน Client lib  ยังไม่ได้ตรวจสอบ แต่ จริงๆ งานสามารถทำผ่าน REST API ได้   

Software ที่มี console เป็น web-ui  
  • มีหมด 
ตอนนี้เดี๋ยวจะทำการ ทดสอบ การใช้งานกับ Sidekiq และ Celery project ในแง่ของการใช้งาน และ PHP lib client. เดี๋ยวค่อยว่ากันต่อ

สำหรับคนที่อยากทดสอบ rundeck ผมทำ docker image เก็บไว้ที่ docker.io  เวลาใช้ก็


docker run -itd  -p 4440:4440 -p 4443:4443  udomsak/rundeck  /etc/init.d/rundeckd start  หลังจากนั้นก็เปิด browser http://localhost:4440
 
username: admin
password: admin


  1. สร้าง Project ก่อน
    1. เนื่องจากเป็นการทดสอบ และ ไม่ได้มีการสั่งให้ job ไป execute node อื่นๆ ( scaling ) ให้เลือกเป็น strub 
  2. สร้าง Job ใน project นั้น
  3. ลองสั่ง Job ดู 
Rundeck กิน ทรัพยากรพอควร ( RAM 1GB )  
เอกสารเพิ่มเติม My site Article and Topic

Udomsak: บันทึกการทำงาน หน่อยๆ

14 January, 2016 - 01:49
หลังจากว่างงานมา พักใหญ่ๆ ได้รับโอกาสจาก บริษัททำเว็บแห่งนึง ที่จังหวัดเชียงใหม่ ให้มาทดลอง ทำงาน เป็นแบบ freelance  ขอบคุณมากครับ

เอาล่ะเข้าเรื่อง  ตอนนี้ผมกำลังจะเริ่มทำโปรเจ็กต์นึง ที่ ทำงานลักษณะเป็น Job schedule โดยให้มีหน้าที ในการตรวจสอบ asset ที่มีอยู่  สิ่งนึงที่ตามมา แบ่งปัญหาออกตามนี้ ( มือใหม่นะครับ )


  • ปัญหาเรื่อง Latency และ Delay
  • ปัญหาเรื่อง REST API  
  • ปัญหาเรื่องของการ execute  Job task พร้อมๆ กัน 
  • ปัญหาเรื่องของการเก็บข้อมูล จาก output
  • ปัญหาเรื่องการ scale 
  • ปัญหาเรื่อง workload ที่ตัว server
ในความคิดของผมจะทำอย่างไรดี  เพราะมากกว่า 2 ใน 3 ข้อ ส่งผลต่อข้อสุดท้ายหมด ( เรื่อง performance ) เลย ซึ่งแทนที่จะให้ task งานทั้งหมด ทำงานที่ Server หลักทั้งหมด ผมจะกระจาย การทำงาน งาน ต่างๆ ออกไป ให้โหนดอื่นๆ ทำงานแทน เพื่อหลีกเลี่ยงปัญหานี้  และ

  • ระบบทำงานตามเวลา ( Job schedule ) มันต้องสามารถ control แบบ REST API ได้  ผมไม่ใช้ cron. 
  • ระบบมีการจัดเก็บ output ที่ทำงาน มา ของแต่ละ task  ที่เกิดขึ้น เพื่อไว้ทำรายงาน ( report ). 
  • กรณีมีปัญหากับระบบ queue  ผมต้องการที่จะรู้ว่า มี task ไหนค้าง หรือ ประมวลผลนานหรือไม่  พูด ง่ายๆ คือ มี web-ui หรือ console ให้เข้าถึง และ ต้องการ monitor จำนวน work load ที่เกิดขึ้นด้วย 
  • ระบบ front-end จะพัฒนาขึ้นด้วย PHP และ Zend Framework.
  • ระบบไม่ใหญ่จนเกินไป ทำงานบน resource ที่ไม่มากได้ 
  • ระบบต้อง scale work load ( job task ที่ผมสั่งให้ server มันทำงาน )   


ทีนี้มาดูกัน ว่า ซอฟต์แวร์ที่่ผ่านเข้ามา  ที่เข้าตาอยู่บ้าง มีอะไรกัน

  • rundeck  <- คลิ๊กได้  
  • beanstalkd <- คลิ๊กได้
  • celeryd  <- คลิ๊กได้
  • sidekiq <- คลิ๊กได้
  • chronos   <- คลิ๊กได้ 



วันนี้เอาแค่นี้ก่อน วันนี้นอนดึกเพราะดูบอล ไทย-ซาอุ ผลเสมอกันไป 1-1  ขอบคุณ ทุกคนครับ ที่เล่นอย่างเต็มที่.  ( 13 มกราคม 2556 )   
My site Article and Topic

Thep: Fonts-TLWG OTF and WOFF in Debian

13 January, 2016 - 15:29

ดังที่ได้กล่าวไว้ในท้าย blog ที่แล้ว ว่าผมได้ตัดสินใจที่จะผลักดันการใช้ฟอนต์รูปแบบอื่นนอกจาก TTF ใน Debian ซึ่งล่าสุดก็ได้เตรียมแพกเกจรุ่น 1:0.6.2-2 และได้ ผ่าน NEW queue เข้าสู่ sid แล้ว เมื่อคืนนี้ ก็ขอบันทึกแนวคิดเบื้องหลังไว้สักหน่อย

โครงการ Fonts-TLWG ได้รวบรวมฟอนต์ต่าง ๆ ที่เจ้าของอนุญาตให้เผยแพร่แบบโอเพนซอร์สได้ เพื่อนำมาพัฒนาต่อให้เข้ากับความต้องการและเทคโนโลยีใหม่ ๆ โดยต้นฉบับก็มักจะมาในรูป TrueType (TTF) ซึ่งใช้เส้นโค้ง quadratic Bézier แต่เมื่อ import เข้าสู่โครงการจะถูกแปลงเป็น cubic Bézier ทั้งหมด ด้วยเหตุผลคือ:

  • การใช้งานกับ LaTeX ซึ่งเน้นการรองรับ e-TeX และ pdfTeX engine นั้น การใช้ฟอนต์ Postscript (ซึ่งใช้เส้นโค้ง cubic Bézier) จะจัดการได้ง่ายกว่า
  • เส้นโค้ง cubic Bézier สามารถปรับแก้ไขได้ง่ายกว่า quadratic Bézier (เคยอธิบายไว้ใน blog เก่า)

การใช้ cubic Bézier ทำให้เราสามารถปรับแต่งฟอนต์ได้เต็มที่ โดยที่ยังสามารถ generate ฟอนต์เป็น TrueType ได้เหมือนเดิม โดยใช้สคริปต์แปลงโค้ง cubic เป็น quadratic พร้อมกับ apply auto instruction ด้วย ซึ่งวิธีนี้ก็มีข้อดีข้อเสียเมื่อเทียบกับการทำงานกับ TrueType โดยตรง คือ

ข้อดี:

  • โค้ง cubic ปรับแก้ได้สะดวกกว่ามาก
  • generate ฟอนต์ได้ทั้งฟอร์แมตที่ใช้ cubic และ quadratic Bézier โดยไม่เกิดจุดต่อโค้งส่วนเกินที่เกินความจำเป็น อันจะทำให้ข้อมูลฟอนต์มีขนาดใหญ่ขึ้น (โดยปกติ โค้ง quadratic จะต้องใช้จุดควบคุมมากกว่าโค้ง cubic ในการแทนเส้นโค้งเดียวกัน และเมื่อแปลงโค้ง quadratic เป็น cubic ก็จะเกิดจุดต่อโค้งระหว่างกลางเพิ่มขึ้นอีก ทำให้ข้อมูลของโค้ง cubic เกิดการขยายตัวเกินความจำเป็นถึง 2 ชั้น ในขณะที่การใช้โค้ง cubic เป็นต้นทาง จะได้ข้อมูลของโค้ง cubic ขนาดเล็ก และจะเกิดการขยายตัวของข้อมูลเพียงชั้นเดียวขณะแปลงเป็น quadratic)
  • ทำ hinting ได้ง่าย เนื่องจากฟอนต์ Postscript อาศัย global hint ควบคุมเส้นอักษรเป็นหลัก (ดู blog เก่า เกี่ยวกับ blue zones และ stem hints) ในขณะที่ TrueType ใช้ instruction ควบคุมจุดต่าง ๆ ซึ่งแทบจะไม่ต่างอะไรกับภาษาแอสเซมบลี

ข้อเสีย:

  • การแปลงโค้ง cubic เป็น quadratic จะต้องเกิดการ interpolate จุดเพิ่มเติม เนื่องจากโค้ง quadratic มีความสามารถในการบรรยายโค้งต่ำกว่า ต้องใช้จุดมากกว่า ในขณะที่การแปลงจาก quadratic เป็น cubic จะได้จุดแบบแม่นตรง (ไม่ใช่ interpolate) และเนื่องจากการ interpolate เป็นไปแบบอัตโนมัติ จึงไม่อาจควบคุมจำนวนจุดที่ interpolate ได้เต็มที่นัก
  • คุณภาพของ TrueType instruction ที่สร้างแบบอัตโนมัติอาจไม่สูงนักเมื่อเทียบกับการเขียน instruction ด้วยมือ

เมื่อเทียบข้อดี-ข้อเสียแล้ว ผมยังคงเลือกเอาโค้งแบบ cubic แม้ข้อเสียจะเกิดกับฟอนต์ TrueType ที่มีผู้ใช้มากที่สุด เพราะข้อเสียต่าง ๆ ถือว่ายอมรับได้ ความคลาดเคลื่อนจากการ interpolate ขณะแปลงเส้นโค้งไม่ได้มีนัยสำคัญอะไร ส่วนเรื่องคุณภาพของ TrueType instruction นั้น เราก็ทำอะไรไม่ได้มาก เนื่องจากเป็นเรื่องที่ถ้าจะทำจริงจะต้องอาศัยแรงงานมหาศาล โดยที่ไม่ได้ช่วยเพิ่มคุณภาพให้กับฟอนต์ที่ใช้ cubic Bézier แต่อย่างใด (ในขณะที่การปรับแต่ง hint ของ Postscript สามารถช่วยเพิ่มคุณภาพของ TrueType instruction ที่สร้างแบบอัตโนมัติได้บ้าง)

กล่าวโดยสรุป โค้ง cubic Bézier คือโค้งที่เป็น native ที่ใช้ในการพัฒนา ถ้าสามารถใช้โค้งนี้ได้โดยตรงก็ย่อมควบคุมอะไรต่าง ๆ ได้ดีกว่า อย่างน้อยก็ในทางทฤษฎี

ที่ผ่านมา การใช้งานฟอนต์ที่ดูจะเหมาะสมในทางปฏิบัติก็คือ

  • เดสก์ท็อป ใช้ TrueType (quadratic Bézier)
  • LaTeX ใช้ Type 1 (cubic Bézier)

ที่ผมยังไม่กล้าผลักดันการใช้ฟอนต์ที่ใช้โค้ง cubic บนเดสก์ท็อปในช่วงที่ผ่านมา ก็เนื่องจากรูปแบบการ hint ของ Postscript นั้น อิงอาศัยความฉลาดของ rasterizer ในการใช้ hint ในฟอนต์มาปรับเส้นโค้งต่าง ๆ (ไม่เหมือนกับ TrueType instruction ที่มีคำสั่งครบสำหรับ rasterizer ไม่ว่าใช้ rasterizer ตัวไหนก็ได้คุณภาพใกล้เคียงกัน) ซึ่งในช่วงแรกนั้น Postscript rasterizer ที่มากับ FreeType วาดตัวอักษรได้ดีเฉพาะบางขนาดเท่านั้น แต่พอใช้กับขนาดอื่น เส้นนอนจะเริ่มหนาและเบลอ (เสียดายที่ไม่ได้จับภาพไว้เป็นเรื่องเป็นราว) จนเมื่อ Adobe contribute CFF rasterizer ให้กับ FreeType คุณภาพที่ได้ก็ดีขึ้นอย่างเห็นได้ชัด ซึ่งเริ่มเปิดใช้จริงใน FreeType 2.5.0.1

ในรอบ Debian Jessie นั้น ผมถึงกับเปลี่ยนฟอร์แมตฟอนต์จาก TTF เป็น OTF ในรุ่น 1:0.6.0-2 ซึ่งทำให้ได้ฟอนต์ที่กินเนื้อที่น้อยลงแทบจะครึ่งต่อครึ่งโดยที่คุณภาพก็ไม่ได้ด้อยกว่า TTF เลย แต่ก็ต้องชะงักเมื่อเจอ Debian #730742 ที่มีผู้ร้องเรียนว่า rasterizer ตัวใหม่ทำให้ฟอนต์ Cantarell ไม่สวย ทำให้ผู้ดูแลแพกเกจ FreeType ของ Debian ต้อง disable CFF rasterizer ของ Adobe แล้วกลับไปใช้ rasterizer ตัวเก่า ผมจึงต้องถอยกลับมาใช้ TTF ในรุ่น 1:0.6.1-2

จนกระทั่งเข้าสู่รอบพัฒนา Stretch ฟอนต์ Cantarell ได้รับการแก้ปัญหาแล้ว จึงได้มีผู้ร้องขอเปิดใช้ CFF rasterizer ของ Adobe อีกครั้ง (Debian #795653) และมีผลตั้งแต่รุ่น 2.6-1 หลังจากรอดูอยู่พักหนึ่งจนแน่ใจว่าเขาไม่ disable กลับอีก ผมจึงตั้งใจไว้ว่าจะเริ่มผลักดันฟอนต์ OTF อีกครั้ง แต่ครั้งนี้ตัดสินใจเลือกการเปลี่ยนแปลงที่ใหญ่กว่านั้น ด้วยการ build ทั้ง TTF และ OTF ให้ผู้ใช้เลือกติดตั้งตามชอบ โดยมีโครงสร้างดังนี้:

  • fonts-thai-tlwg (metapackage)
    • fonts-tlwg-kinnari (dependency package + fontconfig stuffs)
      • fonts-tlwg-kinnari-ttf (TTF files), OR
      • fonts-tlwg-kinnari-otf (OTF files)
    • fonts-tlwg-garuda (dependency package + fontconfig stuffs)
      • fonts-tlwg-garuda-ttf (TTF files), OR
      • fonts-tlwg-garuda-otf (OTF files)
    • ...
  • fonts-thai-tlwg-ttf (metapackage สำหรับติดตั้ง fonts-tlwg-*-ttf ทั้งหมด)
  • fonts-thai-tlwg-otf (metapackage สำหรับติดตั้ง fonts-tlwg-*-otf ทั้งหมด)

คราวนี้ถ้าจะ disable rasterizer ของ Adobe อีก ผู้ใช้ก็สามารถเปลี่ยนกลับไปใช้ TTF ได้ทันที โหะ ๆ

พร้อมกันนี้ ก็ได้เพิ่มแพกเกจ fonts-thai-tlwg-web สำหรับติดตั้ง web font ในรูปแบบ WOFF สำหรับเซิร์ฟเวอร์ที่ต้องการใช้ web font ในเว็บไซต์ต่าง ๆ ด้วย

หากคุณใช้ Debian Sid ก็ติดตั้งได้เลยตั้งแต่วันนี้ หากคุณใช้ Debian testing ก็รออีกสักพัก

bact: ติดตั้ง HTTPS พร้อมใบรับรองฟรี บน Dreamhost ด้วย Let’s Encrypt

6 January, 2016 - 18:49

Let’s Encrypt เป็นบริการออกใบรับรองการเข้ารหัสเว็บ ที่ให้บริการฟรี ที่ผ่านบริการนี้ต้องเสียเงิน ประมาณ 500 บาทไปจนถึงเกินหมื่นก็มี ซึ่งในทางเทคนิคแล้ว ใบรับรองพวกนี้เหมือนกันหมดไม่ว่าจะฟรีหรือจ่ายเท่าไรก็ตาม

Let’s Encrypt ให้บริการฟรีได้ ส่วนหนึ่งเพราะมันทำให้กระบวนการต่างๆ ทำได้ด้วยตัวเองได้โดยผู้ใช้ (มีสคริปต์มาให้รันเองได้ และในอนาคตจะเป็นระบบอัตโนมัติมากขึ้น) ค่าใช้จ่ายก็เลยถูกลง และอีกส่วนหนึ่งเพราะมีองค์กรหลายแห่งสนับสนุนเงินทุน รวมๆ คือคนเหล่านี้อยากเห็นอินเทอร์เน็ตที่มันปลอดภัยขึ้น (ซึ่งพอคนมั่นใจกับการใช้งานอินเทอร์เน็ตมากขึ้น เดี๋ยวธุรกิจอะไรอื่นๆ ที่ทำตังค์ได้ มันจะตามมาเอง)

อย่างไรก็ตาม ณ ตอนนี้ สคริปต์ของ Let’s Encrypt นี่มันจะใช้บนเครื่องที่เรามี permission เข้าถึง root ของเซิร์ฟเวอร์ได้เท่านั้น คนใช้ shared host นี่หมดสิทธิ์

แต่ช้าก่อน — ถ้าใครใช้ Dreamhost หรือเว็บโฮสต์ที่อนุญาตให้เราติดตั้งใบรับรองได้เองทางหน้าเว็บ ก็ไม่ต้องเสียใจ มีวิธีอยู่ คือเรารันสคริปต์นั่นในเครื่องโน๊ตบุ๊กหรือเดสก์ท็อปของเราเองก่อน (บน Linux หรือ OS X) แล้วจากนั้นก็ค่อยเอาไฟล์ต่างๆ ไปใส่ไว้ใน Dreamhost อีกที ผ่านคอนโทรลพาเนลบนหน้าเว็บปกติ

ขั้นตอนวิธีทำเอามาจาก Using Let’s Encrypt With Dreamhost โดย jmhobbs

  1. เริ่มจากไปบอก Dreamhost ก่อนว่าให้เพิ่ม secure hosting ไปที่ชื่อโดเมนของเรา
    ล็อกอินเข้า Dreamhost panel ที่ด้านซ้ายเลือก “Domains” –> “Secure Hosting” –> “Add Secure Hosting”
    ตรงนี้เราก็เลือกชื่อโดเมนที่เราต้องการให้มีการเข้ารหัส

    จบขั้นนี้ปุ๊บ สิ่งที่เราได้ก็คือ ชื่อโดเมนที่เราเลือก จะมีการเข้ารหัสด้วย HTTPS แล้ว แต่ใบรับรองที่ใช้จะเป็น self-signed (เซ็นรับรองด้วยตัวเราเอง) ซึ่งเวลาใครมาเข้าเว็บไซต์เรา เบราว์เซอร์มันก็จะเตือนว่า ไม่น่าเชื่อถือนะ สิ่งที่เราจะทำต่อไปก็คือ ไปขอใบรับรอง ที่ Let’s Encrypt (บุคคลที่สาม) เป็นคนเซ็นให้เรา เพื่อให้เบราว์เซอร์มันพอใจ
  2. ก่อนจะใช้ Let’s Encrypt ก็ต้องติดตั้งมันลงเครื่องโน๊ตบุ๊กหรือเดสก์ท็อปของเรา
    โดยไปดึงสคริปต์มาด้วย git (ถ้ายังไม่มี ก็ติดตั้ง git ก่อน)

    git clone https://github.com/letsencrypt/letsencrypt
  3. จากนั้นก็ ขอใบรับรอง ด้วยสคริปต์ของ Let’s Encrypt
    cd letsencrypt
    ./letsencrypt-auto certonly --manual --debug

    คำอธิบายอ็อปชัน

    • certonly ระบุเพื่อบอกว่า ให้สร้างใบรับรอง แต่ไม่ต้องติดตั้ง (เดี๋ยวเราติดตั้งเอง – ผ่านคอนโทรลพาเนลของ Dreamhost)
    • –manual บอกว่า เราจะทำ domain validation ยืนยันว่าเรามีสิทธิ์ในชื่อโดเมนนั้นเอง (ผ่านการเอาข้อความอันนึงไปวางไว้ที่เซิร์ฟเวอร์นั้น)
    • –debug ใส่อ็อปชันนี่ ถ้ารันบน OS X, ถ้าใช้ Linux ก็ไม่ต้องใส่

    ตรงนี้สคริปต์อาจจะติดตั้งโปรแกรมที่จำเป็นลงในเครื่อง เช่น libxml2, python2.7 (ถ้าบน OS X ก็ผ่าน homebrew) ก็ดูๆ ครับ ว่ามันสำเร็จไหม ถ้าไม่มีปัญหาอะไร สคริปต์ก็จะพาเราไปสู่ขั้นที่ 4

  4. สคริปต์จะถาม อีเมลของเรา (ใช้กรณีกู้กุญแจที่หาย)

    และ ชื่อโดเมนที่เราต้องการใบรับรอง
    ตรงขั้นนี้มันจะเตือนเราว่าทางระบบจะทำการบันทึก ที่อยู่ไอพี (IP address) ที่เราใช้เพื่อขอใบรับรองนะ เราโอเคไหมที่จะให้คนอื่นรู้ที่อยู่ไอพีที่เรากำลังใช้อยู่ขณะนี้ (ของเครื่องที่เรากำลังใช้อยู่ ไม่ใช่เว็บเซิร์ฟเวอร์) ถ้าเราโอเค ก็ตอบตกลงไป
  5. ถึงตรงนี้มันจะให้เรายืนยันว่า เรามีสิทธิ์ในชื่อโดเมนที่เราขอไปจริงๆ ด้วยการให้เราสร้างไฟล์ที่มีชื่อตามที่มันกำหนดในไดเรกทอรีที่กำหนด (ตรงสีเขียว) โดยในไฟล์นั้นต้องมีข้อความที่กำหนดด้วย (สีแดง) — อย่าเพิ่งกด ENTER จนกว่าเราจะสร้างไฟล์ที่ว่าเสร็จ
    วิธีสร้างก็ตามนี้ คือ (ในอีกหน้าจอนึง-ล็อกอินเข้าไปที่เซิร์ฟเวอร์ ไม่ได้ทำที่เครื่องเราเองนะ) เข้าไปที่ไดเรกทอรีของเว็บไซต์เราก่อน (อันนี้เป็นการแบ่งไดเรกทอรีในแบบของ Dreamhost ใครใช้โฮสต์อื่นก็ปรับไปนะครับ) จากนั้นก็สร้างไดเรกทอรีที่กำหนด แล้วก็สร้างไฟล์และเอาข้อความที่มันบอกไปใส่ เพื่อบอกว่า นี่ไง เราสร้างได้ เรามีสิทธิ์จริงๆ นะ

    cd [domain]
    mkdir -p .well-known/acme-challenge/
    echo -n "[RedContent]" > .well-known/acme-challenge/[GreenFilename]

    พอจัดการเรื่องที่เซิร์ฟเวอร์เสร็จ ก็กลับมาที่หน้าจอที่เครื่องเรา แล้วกด ENTER ได้เลย

    ถ้าระบบมันเจอไฟล์ที่เราสร้างไว้อย่างถูกต้องที่เซิร์ฟเวอร์ ระบบมันจะสร้างใบรับรองให้เรา เก็บไว้ที่ /etc/letsencrypt/live/[domain]
    ข้างในไดเรกทอรีดังกล่าวจะมีไฟล์อยู่ 4 ไฟล์: cert.pem, chain.pem, fullchain.pem, privkey.pem ซึ่งเราจะเอาไปใช้ในขั้นต่อไป
    **ไฟล์เหล่านี้อย่าให้คนอื่นรู้** ไม่งั้นเขาจะปลอมตัวเป็นเว็บไซต์ของเราได้

  6. ถึงตรงนี้เราจะเริ่มก๊อปปี้ใบรับรองต่างๆ ไปใส่ในคอนโทรลพาเนลของ Dreamhost
    เริ่มด้วยการคลิก Edit ที่ท้ายชื่อโดเมน ในหน้า “Secure Hosting”
    จะเจอหน้า “Certificate Settings”
    ให้เราเลือก “Manual configuration”
    มันจะขึ้นช่องให้เราใส่ใบรับรองต่างๆ อยู่ 4 ช่อง
    4 ช่องนี้ ให้ใส่ดังนี้

    • Certificate Signing Request: ลบทิ้งให้ว่าง
    • Certificate: เอาข้อความในไฟล์ cert.pem มาใส่
    • Private Key: แปลง privkey.pem เป็นฟอร์แมต RSA ด้วย openssl แล้วนำข้อความมาใส่
    • Intermediate Certificate: เอาข้อความในไฟล์ chain.pem มาใส่

    วิธีดูข้อความในไฟล์

    sudo less /etc/letsencrypt/live/[domain]/cert.pem

    วิธีแปลง privkey.pem เป็นฟอร์แมต RSA แล้วเอาไปเก็บไว้ที่ privkey.key (จากนั้นก็เอาข้อความใน privkey.key ไปใช้)

    sudo openssl rsa -in /etc/letsencrypt/live/bact.cc/privkey.pem -out privkey.key

    ใส่ครบทุกช่องแล้ว ก็คลิก “Save changes now”

  7. เท่านี้ก็น่าจะเสร็จแล้ว อาจจะรอสักไม่เกิน 15 นาที เพื่อให้ระบบมันรีเฟรช

ส่วนใครใจไม่ร้อน รอได้ ก็รออีกหน่อย ทาง Dreamhost ประกาศแล้วว่า จะหาทางให้สามารถใช้ Let’s Encrypt บน Dreamhost ได้แบบง่ายๆ แค่คลิกๆ ก็เสร็จ

Thep: Fonts-TLWG 0.6.2

1 January, 2016 - 16:25

Fonts-TLWG 0.6.2 ได้ออกไปแล้ว หลังจากใช้เวลาพัฒนาจากรุ่น 0.6.1 อยู่เกือบปีครึ่ง ความเปลี่ยนแปลงหลัก ๆ ของรุ่นนี้คือการรองรับการเขียนภาษามลายูปาตานีด้วยอักษรไทยในฟอนต์ต่าง ๆ แต่ก็มีรายการอื่น ๆ อีกพอประมาณ

สรุปการเปลี่ยนแปลงในรุ่นนี้คือ

  • เพิ่ม Preferred Family/Subfamily (Name ID 16, 17) ในทุกฟอนต์ เพื่อให้ Windows สามารถรองรับ style ได้มากกว่า 4 style ซึ่งจำเป็นสำหรับฟอนต์ Kinnari และ Norasi ซึ่งมีทั้ง Oblique และ Italic และฟอนต์ Umpush ที่มี Light เพิ่มเติมด้วย (ตามคำแนะนำของคุณ Martin Hosken) นอกจากนี้ บางโปรแกรมบนลินุกซ์อย่าง GNOME Software ยังใช้ข้อมูลนี้ในการจัดกลุ่มแพกเกจฟอนต์ให้เป็นกลุ่มเดียวกันด้วย (ตาม รายงานของคุณ Richard Hughes สำหรับฟอนต์ Arundina)
  • กำหนด weight ของฟอนต์น้ำหนักปกติเป็น Regular จากเดิมที่เป็น Regular บ้าง Medium บ้าง Book บ้าง เพื่อให้เป็นไปตามข้อกำหนดของ Name ID 2 เหมือนกันทั้งหมด
  • validate ทุกฟอนต์ พร้อมแก้ปัญหาที่ตรวจพบ ตัวอย่างของปัญหาที่พบก็เช่น จุดต่อโค้งมีความชันเกือบอยู่ในแนวดิ่งหรือราบแต่ไม่ดิ่งหรือราบพอดี (ก็แก้ให้ดิ่งหรือราบพอดี), จุดมีพิกัดไม่เป็นจำนวนเต็ม (ก็ปัดเศษให้เป็นจำนวนเต็ม), Blue zone แคบหรือกว้างเกินไป ฯลฯ
  • เซ็ต OS/2 Version เป็น 4 ทุกฟอนต์ เดิมนั้นกำหนดเป็นค่า Auto ซึ่ง Fontforge จะให้ค่าเป็น Version 1 ตาราง OS/2 & Windows Metrics เป็นตาราง metrics ของฟอนต์ TrueType ซึ่งไมโครซอฟท์ได้พัฒนาเพิ่มจาก spec ของ Apple เพื่อใช้กับ OS/2 และ Windows (อ่านรายละเอียดเพิ่มเติม) ซึ่งมีการปรับปรุงมาเรื่อย ๆ โดยรุ่นล่าสุดคือ version 5 แต่รุ่นที่ Fontforge รองรับสูงสุดคือ version 4 จึงกำหนดเลขรุ่นเพื่อให้ฟอนต์มีข้อมูลตาม spec รุ่นใหม่ ๆ ตามคำแนะนำของคุณ Martin Hosken
  • รองรับการเขียนภาษามลายูปาตานีด้วยอักษรไทย ดังที่เคย บันทึกรายละเอียดไว้ ซึ่งงานส่วนนี้ถือว่ากินเวลาพัฒนานานที่สุด
  • รองรับการสร้าง web font แบบ WOFF ใน configure script เพิ่มเติมจาก Type 1, TTF, OTF
  • เพิ่มบริการ on-line web font เพื่อให้เว็บต่าง ๆ สามารถใช้ฟอนต์ชุด TLWG ในเว็บของตนเองได้ โดยได้เตรียม CSS stylesheet ไว้ ดังรายละเอียดในหน้า TLWG Web Fonts

เนื่องจากรุ่นนี้ไม่ได้มีความเปลี่ยนแปลงในส่วนของ LaTeX มากนัก จึงไม่อัปเดตรุ่นใน CTAN

รุ่นนี้ผมตัดสินใจเริ่มผลักดันการใช้ฟอนต์รูปแบบต่าง ๆ จึงได้เตรียม generated fonts ในรูป OTF และ WOFF เพิ่มเติมจากแบบ TTF ที่เคยทำตามปกติ และมีแผนที่จะเพิ่มรูปแบบ OTF (หรืออาจจะ WOFF ด้วย) ใน Debian ให้ผู้ใช้ได้เลือกใช้ด้วยเร็ว ๆ นี้ หลังจากที่ libfreetype6 ใน Debian ได้ enable CFF rasterizer ของ Adobe ใน FreeType อีกครั้งใน Stretch มาระยะหนึ่งแล้ว (Debian #795653) ซึ่งทำให้คุณภาพการ render ฟอนต์ OTF ดีขึ้นมาก (rasterizer ตัวนี้ควรจะได้ใช้กันตั้งแต่รุ่น Jessie แต่เพราะผู้ใช้บางส่วนไม่ชอบ จึงถูก disable ไป [Debian #730742] จนกระทั่งเริ่มรอบพัฒนา Stretch จึง enable ใหม่อีกครั้ง)

Kitt: IBM AMM USB keyboard issue

8 December, 2015 - 14:05
Many admin faced an issue when using a USB keyboard on IBM Advanced Management Module (AMM) with Linux. It seems that some Linux distros do not recognize USB device on IBM AMM and then power off the USB port, disconnect a device plugged in. The solution is quite straightforward: always supply the power to the … Continue reading IBM AMM USB keyboard issue →

LookHin: การติดตั้ง Let’s Encrypt Free HTTPS บน Debian

5 December, 2015 - 00:27

ปกติแล้วถ้าเราจะทำให้เว็บของเราเข้าผ่าน HTTPS ได้เนีย เราก็ต้องเสียเงินซื้อ Certificate ซึ่งก็มีราคาตั้งแต่หลักพันถึงหลักหมื่น แต่เท่าที่ผมลองมาก็มีของ http://rapidssl.com/ ที่ราคาถูกหน่อยประมาณ 500 กว่าบาทต่อปี แต่ถ้าไม่อยากจ่ายเงินเลยตอนนี้ก็มี Let’s Encrypt https://letsencrypt.org/ ที่มาช่วยเราประหยัดค่าใช้จ่ายตรงนี้ได้ ซึ่งก็มีวิธีติดตั้งง่ายมากๆ ง่ายกว่าแบบเสียเงินซะอีก แต่ว่า certificate ที่ได้มาจะมีอายุแค่ 90 วัน พอหมดอายุแล้วเราก็ต้องกลับไปต่อใหม่ ซึ่งผมก็คิดว่าไม่น่าใช่ปัญหา ลองติดตั้งกันเลยดีกว่า ใช้แค่ 3 ขั้นตอนก็เสร็จ เริ่มเลย..

ขั้นแรกทำการติดตั้ง Git ซะก่อน

1
# apt-get install git

ทำการ clone letsencrypt จาก github

1
# git clone https://github.com/letsencrypt/letsencrypt

สั่งรัน ./letsencrypt-auto เพื่อสร้างคีย์

1
2
# cd letsencrypt
# ./letsencrypt-auto

หลังจากสั่ง ./letsencrypt-auto ระบบจะแสดงหน้าจอขึ้นมาให้เราเลือกเว็บที่ต้องการจะทำเป็น HTTPS (ตรงนี้สำคัญ แนะนำให้เลือกทำทีละเว็บนะครับ ผมลองเลือกที่ละหลายเว็บพร้อมกันแล้วระบบมันสร้างคีย์ขึ้นมาให้ตัวเดียวแล้วใช้ด้วยกัน แต่ถ้าเราสร้างคนละทีมันจะแยกคีย์ให้)

เลือก Easy แล้วก็กด OK ข้ามไปครับ

เสร็จเรียบร้อย ดีใจด้วยคุณได้เว็บที่มี https นำหน้าแล้ว แต่ว่า certificate ที่ได้มาจะมีอายุ 90 วัน พอครบแล้วเราต้องมาขอใหม่นะครับ ซึ่งก็ไม่น่าใช่ปัญหา

ทดสอบเปิดเว็บขึ้นมาดูหน่อยว่าขึ้นสีเขียวไหม ถ้าไม่ได้ก็ตัวใครตัวมันครับ ฝันดี…

Kitt: F5 อ่อนว่ะ

30 November, 2015 - 17:13
ไปร่วมงานสัมมนา “F5 อ่อนว่ะ” ได้ข้อสรุปอย่างหนึ่งที่พี่โดมอาจจะไม่ได้พูดถึง แต่ผมคิดว่าเป็น success factor ของ large scale web นอกเหนือไปจาก design pattern ที่พี่โดมพูดไว้ในงานไปแล้ว นั่นคือ “ทีม” พี่โดมมีทีมที่ทำงานด้วยกันตั้งแต่ออกแบบ วาง infra ยัน software dev นอกจากจะเป็นทีมที่เทคนิคแข็งแกร่ง ประสบการณ์สูงแล้ว ยังเชื่อมต่อพูดคุย product เป็นเนื้อเดียวตั้งแต่ต้นจนจบ อย่างที่ ดีน กับ ไมเคิล พูดในงาน DevOps Meetup #1 ไว้ว่า DevOps ไม่ใช่ job position ที่ไว้ประสาน / เป็นกันชนระหว่างฝั่ง developers กับฝั่ง IT operations DevOps มันคือ “mindsets ในการสลาย developer silo กับ IT … Continue reading F5 อ่อนว่ะ →

LookHin: การติดตั้ง Cacti monitoring tool บน Debian 8

15 November, 2015 - 10:38

ก่อนหน้านี้เวลาจะดู Network Traffic หรือ stats ต่างๆ ของระบบผมก็ใช้แต่ MRTG เป็นหลัก ใช้มาหลายปีไม่เคยลองใช้ตัวอื่นดูเลย เห็นใครๆ ก็ว่าเจ้า Cacti นี้มันเจ๋งก็อยากลองบ้าง ส่วนตัวเป็นคนขี้ลืมมาก เวลาทำอะไรเสร็จก็ต้องเขียนไว้หน่อยเผื่อต้องทำอีกวันหลังจะได้ไม่ต้องหาอีก ในการติดตั้ง Cacti เราต้องมี Apache และ MySQL ซึ่งหากยังไม่ได้ทำการติดตั้งให้ทำการติดตั้งตามบทความก่อนหน้านี้ก่อนนะครับ https://www.unzeen.com/article/3208/ ถ้ามี Apache กับ MySQL พร้อมแล้วก็เริ่มการติดตั้ง Cacti network monitoring กันเลยครับ

ทำการติดตั้ง RRDTool และ SNMPT (Simple Network Management Protocol)

1
2
# apt-get update
# apt-get install rrdtool snmp snmpd

แก้ไขคอนฟิกของ snmpd โดยให้เอา # หน้าบรรทัด rocommunity public localhost ออก

1
# nano /etc/snmp/snmpd.conf

จากนั้นสั่ง restart snmpd

1
# service snmpd restart

ต่อไปทำการติดตั้ง Cacti

1
# apt-get install cacti cacti-spine

กด OK

เลือก web server ในทีนี้ของเราคือ Apache

กด OK

กด Yes

ทำการใส่ password root ของ MySQL เพราะว่าระบบติดตั้งต้องการสิทธิของ root เพื่อสร้าง user ของ cacti อีกทีหนึ่ง

ใส่ password สำหรับ user cacti ของ MySQL (จะใส่หรือไม่ใส่ก็ได้ ถ้าไม่ใส่ระบบจะสุ่มขึ้นมาให้เอง)

ยืนยัน password อีกรอบ

เมื่อทำการติดตั้งเรียบร้อย ให้เริ่มทำการคอนฟิกโดยเข้าไปที่ url http://xxx.xxx.xxx.xxx/cacti

กด Next เพื่อเข้าขั้นตอนต่อไป

เลือก New Install แล้วคลิก Next

กด Finish

จากนั้นระบบจะแสดงหน้าให้ Login โดยให้เราใส่ User: admin และ Password: admin หลังจาก login เข้าไปแล้วระบบจะบังคับให้เปลี่ยน password ใหม่

เมื่อเข้ามาแล้วเราจะได้หน้าจอดังรูป ซึ่งเราต้องเข้าไปเลือกรูปแบบของกราฟที่ต้องการแสดงดังขั้นตอนถัดไป

ทีนี้ถ้าเราคลิกเข้าไปที่เมนู Graphs จะเห็นว่ามีข้อมูลบางส่วนของระบบถูกแสดงขึ้นมาแล้ว แต่ยังไม่มีข้อมูลของ Network Traffic (ในตัวอย่างให้คลิกที่เมนู Graphs และไปเลือกที่ Preview View ทางขวามือบน เพื่อให้แสดงเป็นกราฟเล็กๆ ถ้าต้องการดูรายละเอียดให้คลิกที่กราฟแต่ละรูปนะครับ)

ต่อไปทำการคอนฟิกให้แสดง Network Traffic โดยคลิกที่เมนู Console -> Devices และคลิกที่ Localhost

ในส่วนของ SNMP Version ให้เลือกเป็น Version 2 และกดปุ่ม Save ซึ่งอยู่ล่างสุด

ในหน้าจอเดียวกันในส่วนของ Associated Data Queries ให้เพิ่ม SNMP – Get Mounted Partitions และ SNMP – Interface Statistics โดยเราสามารถเลือกข้อมูลอื่นๆ ที่สนใจเพิ่มเข้าไปได้ อันนี้ลองดูเองนะครับว่ามีข้อมูลอะไรอีกบ้าง เมื่อเลือกได้แล้วให้กด Save

จากนั้นให้เลือนขึ้นไปด้านบนแล้วคลิก Create Graphs for this Host

หน้าถัดมาจะเป็นหน้าให้เลือกข้อมูลที่ต้องการแสดง ให้เราติ๊กที่ช่อง eth0 (และเลือก Select a graph type ให้เลือก In/Out Bits (64-bit Counters)) ส่วนของ Get Mounted Partitions ให้ติ๊กเลือก Partition ที่ต้องการแสดง เมื่อเลือกเสร็จแล้วกด Create

หลังจากนั้นรอสักครู่ แล้วคลิกกลับไปที่เมนู Graphs เราจะได้กราฟที่เราเลือกไว้ถูกนำขึ้นมาแสดงแล้ว

Kitt: Sort file alphabetically in Samba

12 November, 2015 - 11:32
It looks like samba sending a list of file names in random order. Of course, you could make it sort alphabetically and make your life easier. For Debian/Ubuntu # apt-get install samba-vfs-modules then edit /etc/samba/smb.conf [global] vfs objects = dirsort Restart your samba, and tada !

Udomsak: Basic security and hardening your linux ( Thai lang. )

8 November, 2015 - 05:22
เกริ่นก่อนนะครับ หลายคน อาจจะสงสัย ผม Post title blog เป็น ภาษาอังกฤษทำไม อยากจะทำให้ blog ตัวเองติด range search ดีๆ หรือเปล่า  เปล่าครับ เนื่องจากผม custom css ตัวเนื้อหาของ blog ผม ให้ไปใช้ font ภาษาไทยให้อ่าน ภาษาไทยได้ สบายตา หน่อย ( สำหรับผม ) แต่ ไม่ได้ ทำการเปลี่ยนค่าสำหรับ title post เลยทำให้เวลาผม เขียน blog post เป็นภาษาไทย มันจะขึ้นเป็น decoding UTF8 กลายเป็นอ่านไม่รู้เรื่องแทน. เลยขอเขียนเป็น ภาษาอังกฤษแทนแล้วกัน ขี้เกียจเปลี่ยนด้วย


ก่อนนอนคืนนี้ ( เริ่ม เขียนเมื่อคืนวันที่ 7 พฤศจิกายน 2558 ) หลังจากที่เห็น post ใน facebook group สำหรับข้อกังวลเกี่ยวกับ malware ในระบบปฏิบัติการ Linux  จากการที่ Malware จะทำการเข้ารหัสไฟล์ ( Crypt ) ไฟล์ของ web application ทำให้ไม่สามารถใช้งานได้ แล้วทำการเรียกค่าไถ่







ปัญหาฝั่ง web application
ปัญหามีสองส่วน สำหรับ ฝั่ง web appliction.

  • จะป้องไม่ให้เขา upload ไฟล์ แล้ว execute ไฟล์นั้นได้ยังไง
  • ถ้าเขา upload script หรือ binary ไฟล์สำหรับ เจาะระบบ ได้แล้ว execute ได้แล้ว จะป้องกันยังไงไม่ให้เขาได้สิทธิ root 
 ถ้าเราใช้  MAC ( Apparmor, SELinux ) เข้ามาช่วยคอนโทรล การป้องกันการเขียนไฟล์ และ execute ไฟล์ได้  เช่น


  • โฟลเดอร์ /var/www/application1 เก็บ Web application เอาไว้ อนุญาติให้  อ่านได้อย่างได้ ห้ามมีการเขียน  ซึ่งเราสามารถแยกได้ว่า User ที่ใช้ run กับ User ที่ใช้ Upload เราก็กำหนดเอาเลยตามความเหมาะสม 
  • โฟลเดอร์  /var/www/application1/temp สำหรับเก็บไฟล์ชั่วคราว สำหรับ web app upload ไฟล์ อนุญาติให้ เขียนได้ แต่ห้าม Execute เป็นต้น.  
ฝั่ง Host System Admin  
ควรมีหรือกำหนด policy การเข้าถึงและการ execute application ให้ดี  ไม่วาจะเป็น SSH ใข้การ access เป็นแบบ Publickey authen , Keberos , Two-factor authentication ,  Policy การรัน application , การติดตั้ง software ตรวจจับผู้บุกรุกเป็นต้น



การป้องกันอื่นๆ 
  • เขียน Software ให้ดี  ตอบเหมือนกำปั้นทุบดิน แต่ เป็นหลักพื้นฐานจริงๆ ถ้าเขียนไม่ดี ระบบก็เกิดช่องโหว่ทำให้มีปัญหาภายหลังตามมาได้  
  • ปฏิบัติตาม Security best practice  
  • ดูแลเรื่อง patch security ซอฟต์แวร์ให้ดี
  • พยายามให้ user รันด้วยสิทธิที่น้อยที่สุด  เช่นไม่รัน  http web server ด้วย user root ( ซึ่ง application ใน docker ส่วนใหญ่ System Admin หรือ programmer รันด้วย root เป็นค่าปกติ  ) 
  • ปฏิบัติตาม Check-list และ ข้อปฏิบัติทางด้านความปลอดภัย อย่างเข้มงวด ซึ่งสามารถดาวน์โหลดได้จากที่นี่  Security-Checklist ( ภาษาอังกฤษ )  
    • Hardening ระบบของตัวเอง ให้ดี
      • ตรวจสอบสิทธิ การใช้งาน ของ process หรือ User ที่รัน service นั้นๆ  
      • ใช้ Mandatory Access Control ( MAC ) มาช่วยในการจัดการ 
        • Apparmor ( Ubuntu )
        • SELiux ( Fedora, CentOS, RedHat, Ubuntu ) 
    • หากมีนโยบายทางด้านความปลอดภัย ต้องปฏิบัติอย่างเคร่งครัด ส่วนใหญ่ Security flaw หรือ ช่องโหว่ ต่างๆ มักเกิดจาก คนในเอง ที่ Bypass นโยบาย ( Policy ) ที่ตัวเองเขียนขึ้นมา เพราะคิดว่าไม่เป็นไร  นำให้เกิดปัญหาตามมาอย่างคาดไม่ถึง  จงจำไว้อย่างนึงว่า  "ความปลอดภัยสวนทางกับความง่ายในการใช้งานเสมอ" 
    • นโยบายทางด้านความปลอดภัย หรือ มาตรฐานใดๆ ก็ตาม เราไม่จำเป็นที่ต้องได้รับ Certificate แต่เราสามารถนำมาประยุกต์ใช้งาน เพื่อให้เกิดความปลอดภัยขององค์กรเราได้ มาตรฐานเหล่านี้สามารถนำมาประยกต์ได้ ได้แก่  ITIL, ISO27001 เป็นต้น 
ทีนี้มาพูดถึงองค์ประกอบ อื่นๆ  ที่เกี่ยวข้อง กัน
Access Controlระบบ Access Control ของ Linux เพื่อให้มองในภาพรวม จะแบ่งออกเป็น  ( บางคนอาจจะมองว่าไม่จำเป็นที่ต้องรู้  แต่ผมว่า จำเป็นนะครับ เพราะ จะได้คุย หรือ เข้าใจในหัวข้อที่เกี่ยวข้อง ( domain ) ได้ง่าย

  • Posix Access control ( file system ). 
    • พวก chown , chmod  ( name, group , อื่นๆ )  
  • Roles Base Access Control ( RBAC ). 
    • คือ การกำหนดสิทธิ การเข้าถึง หรือ การกระทำการใดๆ กับ ระบบ โดยอ้างอิงจากหน้าที่ได้ถูกำหนดขึ้น ( role )  เช่น User web ทำหน้าที่ upload file ไม่สามารถทำการ kill process Web, access ได้เฉพาะ Folder /var/www  ได้เป็นต้น 
    • ซอฟต์แวร์ที่ทำหน้าที่นี้ได้ คือ grsecurity, SELinux  ( SELinux support RBAC กับ MAC ). 
  • Mandatory Access Control  ( MAC ).
    • วิธีจะเป็นการ กำหนดวิธีการ ที่จะเข้าถึงระบบ พวกไฟล์ต่างๆ เช่น สั่งให้รันไฟล์ ( execute ), ลบ, เข้าถึง โฟลเดอร์ต่างๆ ได้ไหม โดยวิธีการพวกนี้ผู้ดูแลระบบจะเป็นผู้กำหนดวิธีการต่างๆ เหล่านี้ขึ้นมาเอง User ไม่สามารถเปลี่ยนแปลงได้. 
    • ซอฟต์แวร์ที่ใช้วิธีการนี้
      • SELinux  จะมาเป็น default ของ Fedora, CentOS, RedHat Linux  Ubuntu ก็มีแต่เป็น package แยกต่างหาก
      • Apparmor จะมาเป็น default ของ Ubuntu เลย 
ตามหลักแล้วจะมีแยกย่อย ลงไปอีกแต่ผมขอเขียน คร่าวๆ เอาตามนี้จะได้ไม่ งง มาก 
Buffer Overflow ปัญหาที่เกิดขึ้นก็คือ Web Application ที่เขียนไม่ดีพอ หรือ มีช่องโหว่เกิดขึ้นมา ( โชคชั้นแรก web ถูก Deface )  แล้ว ดันพลาดขนาดหนัก สามารถได้สิทธิของ root shell มา ( อันนี้ก็เจ็บหนักเลย )
 วิธีที่ใช้ก็มีทั้ง Buffer overflow,  Stack Overflow ซึ่งวิธีที่ได้มาก็มีทั้ง shell-code, script หรือ binary ที่เขียนมาเฉพาะ โดยจะทำการ run จากสิทธิของ user ที่ process Web Server รันอยู่ เช่น user www-data  หรือ httpd เป็นต้น
มันจะเกิดขึ้นได้ง่ายไหม สำหรับ Buffer overflow, Stack Overflow, Heap Overflow, Integer Overflow.
ระบบปฏิบัติการ รุ่นใหม่ๆ หลังๆ มา มีการป้องกันมาให้พอสมควร สำหรับ Ubuntu เข้าไปดูได้ที่ Ubuntu Security page <--  คลิ๊ก Link นี้  จะเห็นว่า Kernel จะมีการ patch มาให้ เว้นซะแต่ว่า ดันทะลึ่งไปคอมไฟล์ Kernel เอง แล้วไม่ได้มีการตระหนักในเรื่องนี้  อาจจะเกิดข้อผิดพลาดได้  
Option การปรับแต่งสำหรับ  Ubuntu แต่ละรุ่นก็ดูไปตามเอกสาร ที่เกี่ยวข้องเกี่ยวกับ เรื่องนั้นๆ 
สำหรับ RedHat จะมีส่วนที่ใช้ป้องกันการเข้าถึง Kernel memory เรียกว่า Exec Shield  สำหรับป้องกันพวก Stack overflow, Integer overflow, Heap Overflow  สำหรับพวก CentOS, RedHat ดูเรื่องนี้เพิ่มเติมได้ จาก Link นี้ -->  Link

ทั้งนี้ไม่ได้หมายความว่า ระบบปฏิบัติการรุุ่นใหม่ๆ  จะไม่มีปัญหานี้เกิดขึ้น แต่เราต้องปรับแต่งระบบอย่างเหมาะสม  เพื่อลดปัจจัยความเสี่ยงลงให้มากที่สุด    ( Attack factor )
Autdit ระบบยังไง 
สำหรับคำถามว่าเราจะตรวจสอบระบบของเรายังไง มีวิธีไหนบ้าง ผมพอจะเขียนข้อมูลสำหรับ tool ที่ใช้ออกมาได้ตามนี้  ซึ่งก็อาจจะมี software ที่ผมไม่รู้จักอีก แต่เบื้องต้นแค่นี้ก่อน
  • CIS-CAT benchmark ตัวนี้เป็น commercial แต่เอามาใช้ได้ 30วัน ( trial )
  • OpenSCAP  <-- คลิิ๊ก เป็นซอฟต์แวร์ Opensource
  • lynis <-- คลิ๊ก  เป็นซอฟต์แวร์ฟรี 
สำหรับ Ubuntu 14.04  หรือ รุ่นใหม่ๆ มาการปรับแต่งเพิ่มเติม ใน option ของ kernel หรือ capability ( CAP ) ให้อ่านเอกสารเพิ่มเติม สำหรับ Ubuntu รุ่น นั้นๆ เพิ่มเติม  
รูปนี้แสดง ผลลัพธ์ของการ run  lynis 



จะ monitor เวลามีคนโจมตี หรือ ระบบถูกเจาะยังไง Solution ที่ใช้สำหรับ monitor เหตุการณ์บุกรุก ระบบของเรา หรือ Host Base Intrusion Detection System ( HIDS ) มีทั้ง Software ที่เป็น Opensource และ Commercial  ให้ลอง search แล้วทดลองใช้ ดูว่า แต่ละตัว เหมาะสมกับระบบเราขนาดไหน ยังไงบ้างถ้าไม่ขี้เกียจ ผมจะเขียน review อีกที 
Host Intrusion Detection System
  • OSSEC  <-- คลิ๊ก เป็น Opensource ระบบค่อนข้างจะใหญ่พอควร 
  • Samhian <-- คลิ๊ก เป็น Opensource 
  • tiger <-- คลิ๊ก Opensource  security audit 


ข้อสังเกตุ
สำหรับการปรับแต่ง Mandatory Access Control ( MAC )  ค่อนข้างจะยุ่งยากและใช้เวลาหน่อย เนื่องจาก ถ้าเป็นการ custom ให้เข้ากับ application ที่เราติดตั้งลงไปในระบบนั้น จำเป็นต้องมีการทดสอบ ว่าไม่มีปัญหา เช่น ไม่ block การทำงานของ Software เราจากนั้น จึงค่อย deploy บน production ต่อไป 






My site Article and Topic

Udomsak: Install Arduino IDE On Fedora core22 with ESP8266 board. ( Thai lang.)

5 November, 2015 - 00:28
เนื้อหาอาจมีการปรับปรุง :)

หลังจากสามเดือนก่อน  ผมได้ขอยืม Hardware จากเชียงใหม่เมคเกอร์คลับ ( Chaingmai Maker Club).  แต่เนื่องจากติดงาน  ติดทำโน่นทำนี่  หางานใหม่ทำ ( ตกงาน ) เลยทำให้ลืมไปเลยว่า ยืม Hardware มาซึ่งก็ต้องขอโทษน้องๆ ด้วย ที่ได้รับปากเอาไว้  รวมถึง ขอบคุณ พี่จิมมี่  ที่ได้บรรยายให้ฟัง วันนั้น

สาเหตุในการสนใจศึกษาเรื่อง IoT นั้น ( ESP8266 ) เนื่องจากผมกับเพื่อนมีแนวความคิดว่า  บ้านนอกของเรา ควรจะที่นำเอาเทคโนโลยีมาประยุกต์ใช้งานทำให้ งานเกษตรมีความก้าวหน้ามากขึ้นโดยอาศัย ข้อมูลจากพวกเซนเซอร์ต่างๆ อาทิ ความซื้น, อุณหภูมิ , ปริมาณน้ำฝนเป็นต้น  ในเบื้องต้นข้อมูลจะมี ประมาณนี้ เพื่อจะทำแผนที่ทรัพยากรทางการเกษตร เพื่อนำมาวิเคราะห์และวางแผน บริหารจัดการภายหลังในกลุ่มหมู่บ้านได้  
แนวความคิดนี้จะนำไปสู่ระบบ Smart Farm  ( ระบบอัตโนมัติต่างๆ )  ซึ่งจะมีประโยชน์ต่อการปลูกพืช โดยทั่วไป ลดการใช้ทรัพยากร  ( ระบบจ่ายน้ำอัตโนมัติ โดยวัดจากความซื้น ) เป็นต้น, การปลุกพืช Hydroponic เป็นต้น

จากแนวความคิดมาถึงการติดตั้ง 
สำหรับวิธีการติดตั้งนี้เป็นการติดตั้ง ArduinoIDE บน Fedora Linux Core22 ซึ่งผมใช้อยู อนึ่งวิธีการติดตั้ง ที่แสดงจะเป็นพวก Window และ Mac OSX มากกว่า. 

การติดตั้ง
แบบใช้ Package ที่มากับระบบปฏิบัติการ บน Fedora Core 22  package ที่มากับระบบปฏิบัติการ จะเป็นเวอร์ชั่น 1.0.6 ซึ่ง ณ วันที่เขียนนี้จะเป็นเวอร์ชั่น 1.6.6 


วิธีการติดตั้ง ใช้คำสั่ง 
udomsak#     sudo dnf install -y  arduino 
เวลาเรียกใช้ก็พิมพ์เรียก arduino ออกมาได้เลย ตามภาพ 


พอเปิดจะมีหน้าตาออกมาประมาณนี้ 



ทำการเชื่อมต่อบอร์ด เข้ากับ  FTDI ที่จะทำหน้าที่เชื่อมต่อ ESP8266 ต่อเข้ากับ พอร์ท USB ของเครื่องคอมพิวเตอร์  โดยให้หันหน้า board ส่วนที่มีแผงวงจร หันเข้าด้านใน ตามรูป



ต่อเชื่อมสาย  USB จากเครื่องคอมพิวเตอร์ของเรา เข้าไปยัง port mini usb ที่ฝั่ง FTDI  บอร์ด 




เมื่อเชื่อมต่อแล้ว สังเกตุถ้าไม่มีปัญหาเราจะเห็นไฟสีเขียว ติดอยุ่ ( เชื่อมต่อแล้ว ) แต่  Arduino IDE ยังมองไม่เห็น บอร์ดนะครับ เราต้องมาทำการปรับ  Board rate  ให้เหมาะสม ก่อน  
ก่อนอื่นทำการตรวจสอบ พอร์ท USB ทำงานได้ตามปกติไหม ? 




เรียกเอา Serial monitor ขึ้นมา 

คลิ๊กเข้าไปตามเมนู จะได้ หน้าต่าง Serial monitor ออกมา จากนัั้นให้ทำการปรับ board rate ( ล่างขวา ของหน้าต่างนี้ ) ให้ปรับไปที่  115200 



หลังจากทำการปรับ Board rate  แล้วกดให้ switch สีดำที่บอร์ด ESP8266  ( ตามรูป ) 



สังเกตุที่ Serial console monitor จะปรากฏอักขระ ขยะโผล่ขึึ้นมาแสดงว่า การสื่อสารระหว่าง โปรแกรม และ บอร์ดทำได้ล่ะ 


จบขั้นตอนสำหรับการติดตั้งเบื้องต้น  ยังขาดอีกขั้นตอนคือการ โหลด board ESP8266 ให้โปรแกรมรู้จัก 


My site Article and Topic

Pages

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้