9 February 2016

Udomsak

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



บันทึกก่อนเลิกงาน  พอดีใช้ 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 logs5.papertrailapp.com -p 102232  logs/deploy.log
      
  5. pipe log ไปเข้าที่ papertails service ( https://papertrailapp.com )
    cap wordpress deploy | tee  logs/deploy.log
  6.  จบ
     






โดย udomsakc (noreply@blogger.com) ณ 9 February 2016 17:01 GMT

4 February 2016

Udomsak

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



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


สุดท้าย จึงได้เลือกใช้ 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
 

โดย udomsakc (noreply@blogger.com) ณ 4 February 2016 18:37 GMT

Thep

Thai Font Metrics

ประเด็นเล็ก ๆ ประเด็นหนึ่งที่ถูกอภิปรายกันในหลายโอกาสในหมู่คนทำฟอนต์ไทย หรือกระทั่งในหมู่ผู้ใช้ที่ต้องเตรียมเอกสารให้เข้ากับข้อกำหนด คือเรื่องขนาดของฟอนต์ไทยที่จะเล็กกว่าฟอนต์ตะวันตกที่ 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

Thai font metrics recommendation

ปัญหา

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

Mixed Thai/English text

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

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

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

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

Tibetan sample text

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

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

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

ทางออก

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

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

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

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

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

โดยปกติที่ผ่านมา ฟอนต์ไทยเคร่งครัดกับเรื่องความสูงของบรรทัดที่จะไม่ให้เกิน 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)

Fontforge OS/2 Metrics dialog

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

ในยุคก่อน เรามีการจัดตำแหน่งสระบน-ล่างและวรรณยุกต์เพื่อหลบหางพยัญชนะโดยใช้วิธีสร้าง 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 จึงวางใจได้

Thai composition example

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

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

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

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

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

โดย Thep (noreply@blogger.com) ณ 4 February 2016 10:10 GMT

2 February 2016

Udomsak

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

บันทึกสั้น


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

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

ข้อสังเกตุ 




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




โดย udomsakc (noreply@blogger.com) ณ 2 February 2016 13:58 GMT

Thep

Thanks

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

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

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

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

โดย Thep (noreply@blogger.com) ณ 2 February 2016 09:29 GMT

30 January 2016

Udomsak

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

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

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


ในความคิดของผมจะทำอย่างไรดี  เพราะมากกว่า 2 ใน 3 ข้อ ส่งผลต่อข้อสุดท้ายหมด ( เรื่อง performance ) เลย ซึ่งแทนที่จะให้ task งานทั้งหมด ทำงานที่ Server หลักทั้งหมด ผมจะกระจาย การทำงาน งาน ต่างๆ ออกไป ให้โหนดอื่นๆ ทำงานแทน เพื่อหลีกเลี่ยงปัญหานี้  และ



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




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

โดย udomsakc (noreply@blogger.com) ณ 30 January 2016 06:32 GMT

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

วันนี้กลับมานั่งไล่ดูอีกที เรื่อง Queues System พร้อมกับปัญหาที่เจอ ตอนนี้พอสรุปได้คร่าวๆ ดังนี้

Software ที่เร็ว  


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 )  

เอกสารเพิ่มเติม 

โดย udomsakc (noreply@blogger.com) ณ 30 January 2016 06:32 GMT

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

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

** ข้อควรระวัง ** Overlay FS มีปัญหากับ file socket: ดู issue ด้านล่าง

https://github.com/docker/docker/issues/12080

ปัญหาเดิมที่เจออยู่เป็นประจำ คือ "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 คือ  
ถามว่าต่าง กันยังไง นั่งหาเอกสาร มาอธิบายให้เข้าใจ ได้ง่ายๆ คือ อันนี้  http://tuhrig.de/difference-between-save-and-export-in-docker/  ( ผมเข้าใจว่าอันนี้ เข้าใจได้ง่ายสุดล่ะนะ )  แต่หลักๆ ก็จำไว้แบบนี้

ทำการลบ ทิ้งทั้ง 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 

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



จบ


โดย udomsakc (noreply@blogger.com) ณ 30 January 2016 06:31 GMT

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

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

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

ผมเองใช้ 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 ตามแบบรูปที่ แสดงด้านล่างนี้. 











โดย udomsakc (noreply@blogger.com) ณ 30 January 2016 06:31 GMT

17 January 2016

Neutron

RahuNAS Dual-Stack Authen planning

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 ไปบ้างแล้ว

โดย neutron ณ 17 January 2016 04:19 GMT

13 January 2016

Thep

Fonts-TLWG OTF and WOFF in Debian

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

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

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

ข้อดี:

ข้อเสีย:

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

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

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

ที่ผมยังไม่กล้าผลักดันการใช้ฟอนต์ที่ใช้โค้ง 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 ให้ผู้ใช้เลือกติดตั้งตามชอบ โดยมีโครงสร้างดังนี้:

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

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

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

โดย Thep (noreply@blogger.com) ณ 13 January 2016 08:29 GMT

6 January 2016

bact

ติดตั้ง HTTPS พร้อมใบรับรองฟรีจาก Let’s Encrypt บน shared host​ (DreamHost)

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” (ใครใช้ shared host ยี่ห้ออื่น ลองหาทางดูครับ อาจจะมีคล้ายๆ กัน)
    Add secure hosting in Dreamhostตรงนี้เราก็เลือกชื่อโดเมนที่เราต้องการให้มีการเข้ารหัส
    Choose domain name to 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. สคริปต์จะถาม อีเมลของเรา (ใช้กรณีกู้กุญแจที่หาย)
    Let's Encrypt asking for e-mail
    และ ชื่อโดเมนที่เราต้องการใบรับรองLet's Encrypt asking for domain name
    ตรงขั้นนี้มันจะเตือนเราว่าทางระบบจะทำการบันทึก ที่อยู่ไอพี (IP address) ที่เราใช้เพื่อขอใบรับรองนะ เราโอเคไหมที่จะให้คนอื่นรู้ที่อยู่ไอพีที่เรากำลังใช้อยู่ขณะนี้ (ของเครื่องที่เรากำลังใช้อยู่ ไม่ใช่เว็บเซิร์ฟเวอร์) ถ้าเราโอเค ก็ตอบตกลงไป
    Let's Encrypt warns about IP logging
  5. ถึงตรงนี้มันจะให้เรายืนยันว่า เรามีสิทธิ์ในชื่อโดเมนที่เราขอไปจริงๆ ด้วยการให้เราสร้างไฟล์ที่มีชื่อตามที่มันกำหนดในไดเรกทอรีที่กำหนด (ตรงสีเขียว) โดยในไฟล์นั้นต้องมีข้อความที่กำหนดด้วย (สีแดง) — อย่าเพิ่งกด ENTER จนกว่าเราจะสร้างไฟล์ที่ว่าเสร็จ
    Let's Encrypt asking for domain validationวิธีสร้างก็ตามนี้ คือ (ในอีกหน้าจอนึง-ล็อกอินเข้าไปที่เซิร์ฟเวอร์ ไม่ได้ทำที่เครื่องเราเองนะ) เข้าไปที่ไดเรกทอรีของเว็บไซต์เราก่อน (อันนี้เป็นการแบ่งไดเรกทอรีในแบบของ 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”
    Add certificate in Dreamhostจะเจอหน้า “Certificate Settings”
    ให้เราเลือก “Manual configuration”
    มันจะขึ้นช่องให้เราใส่ใบรับรองต่างๆ อยู่ 4 ช่อง
    Add certificate in Dreamhost4 ช่องนี้ ให้ใส่ดังนี้

    • 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. เท่านี้ก็น่าจะเสร็จแล้ว — แต่ถ้าอยากให้ทุกครั้งที่เรียก http://abc.xyz แล้วให้มัน redirect ไปที่ https:///abc.xyz อัตโนมัติ ก็ทำขั้นนี้เพิ่มหน่อย — ใส่โค้ดนี้ลงในไฟล์ .htaccess
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  8. ลองเข้าเว็บไซต์ของเราดู ว่าเข้ารหัสและมีใบรับรองสวยงามอย่างที่หวังไหม หลังการแก้ไขต่างๆ อาจจะต้องรอสักพัก ไม่น่าจะเกิน 15 นาที เพื่อให้ระบบมันรีเฟรช
  9. ทดสอบความเรียบร้อยอีกที ด้วย การทดสอบจาก SSL Labs เพื่อดูว่าเรายังขาดตกตรงไหนอีก
  10. อย่าลืมว่า ใบรับรองของ Let’s Encrypt จะหมดอายุทุกๆ 3 เดือน ดังนั้นพอใกล้ๆ 3 เดือนก็อย่าลืมทำซ้ำตั้งแต่ขั้นที่ 3 ใหม่นะครับ

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

โดย bact ณ 6 January 2016 11:49 GMT

1 January 2016

Thep

Fonts-TLWG 0.6.2

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

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

เนื่องจากรุ่นนี้ไม่ได้มีความเปลี่ยนแปลงในส่วนของ 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 ใหม่อีกครั้ง)

โดย Thep (noreply@blogger.com) ณ 1 January 2016 09:25 GMT

9 December 2015

Udomsak

Basic security and hardening your linux ( Thai lang. )

เกริ่นก่อนนะครับ หลายคน อาจจะสงสัย ผม 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 ตรวจจับผู้บุกรุกเป็นต้น




การป้องกันอื่นๆ 

ทีนี้มาพูดถึงองค์ประกอบ อื่นๆ  ที่เกี่ยวข้อง กัน

Access Control

ระบบ Access Control ของ Linux เพื่อให้มองในภาพรวม จะแบ่งออกเป็น  ( บางคนอาจจะมองว่าไม่จำเป็นที่ต้องรู้  แต่ผมว่า จำเป็นนะครับ เพราะ จะได้คุย หรือ เข้าใจในหัวข้อที่เกี่ยวข้อง ( domain ) ได้ง่าย

ตามหลักแล้วจะมีแยกย่อย ลงไปอีกแต่ผมขอเขียน คร่าวๆ เอาตามนี้จะได้ไม่ งง มาก 

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 )

Audit ระบบยังไง 


สำหรับคำถามว่าเราจะตรวจสอบระบบของเรายังไง มีวิธีไหนบ้าง ผมพอจะเขียนข้อมูลสำหรับ 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 ต่อไป 







โดย udomsakc (noreply@blogger.com) ณ 9 December 2015 20:16 GMT

8 December 2015

Kitt

IBM AMM USB keyboard issue

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

โดย kitty ณ 8 December 2015 07:05 GMT

4 December 2015

LookHin

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

ปกติแล้วถ้าเราจะทำให้เว็บของเราเข้าผ่าน 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 (ตรงนี้สำคัญ แนะนำให้เลือกทำทีละเว็บนะครับ ผมลองเลือกที่ละหลายเว็บพร้อมกันแล้วระบบมันสร้างคีย์ขึ้นมาให้ตัวเดียวแล้วใช้ด้วยกัน แต่ถ้าเราสร้างคนละทีมันจะแยกคีย์ให้)
ssl-letsencrypt

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

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

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

# เพิ่มเติมให้อีกหน่อย หากต้องการสร้าง Certificate Key แค่อย่างเดียวก็ให้ใช้คำสั่งต่อไปนี้ แต่ก่อนสั่งต้อง stop apache ก่อนนะครับ และเมื่อสร้างเสร็จแล้ว เราต้องเป็นคนแก้ config ของ apache ให้ใช้ Certificate ตัวใหม่นี้เองด้วย โดย certificate ที่ได้จะถูกเก็บไว้ที่ /etc/letsencrypt/live/

1
# ./letsencrypt-auto certonly --standalone -d www.lookhin.com -d lookhin.com

เมื่อได้ Certificate มาแล้วเราต้องเข้าไปแก้ไขคอนฟิกไฟล์ของ apache ในส่วนของ VirtualHost ให้เรียกใช้ Certificate Key ตัวใหม่เหมือนในตัวอย่างนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin khwanchai@gmail.com
    ServerName lookhin.com
    ServerAlias www.lookhin.com
    DocumentRoot /var/www/lookhin.com
 
    CustomLog ${APACHE_LOG_DIR}/lookhin.com.access.log combined
    ErrorLog ${APACHE_LOG_DIR}/lookhin.com.error.log
 
    SSLCertificateFile /etc/letsencrypt/live/www.lookhin.com-0001/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.lookhin.com-0001/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
 
</VirtualHost>
</IfModule>

# เราจะเห็นว่าทุกครั้งที่เราสั่งสร้าง certificate มันจะมี dialog box ขึ้นมาถามตลอดว่าทำนู้นไหมนี้ไหม ซึ่งถ้าเราไม่อยากให้มันถามอะไร เราก็ใส่คำสั่งไปทีเดียวได้ว่าจะให้มันทำอะไรบ้าง (และเดียวเราจะเอาคำสั่งตรงนี้หละไปใส่ใน crontab เพื่อให้มันต่ออายุอัตโนมัติ)

1
# ./letsencrypt-auto --webroot -w /var/www/lookhin.com --email khwanchai@gmail.com --text --no-redirect --renew-by-default --agree-tos -d www.lookhin.com -d lookhin.com

# การต่ออายุ certificate อัตโนมัติ ในคู่มือของทาง letsencrypt เองก็บอกว่าเราสามารถทำได้โดยตั้งเวลาต่ออายุใหม่ไว้ใน crontab เลยก็ได้ โดยให้ต่ออายุใหม่ก่อนที่มันจะครบ 90 วัน แต่ว่า crontab มันเลือกไม่ได้นี้ว่าให้นับ 90 วันแล้วทำงาน มันเลือกได้แค่วันเวลา งั้นวิธีที่ง่ายที่สุดผมจะสั่งมันต่ออายุ certificate ใหม่ทุกๆ วันที่ 1 ของเดือน 2, 4, 6, 8, 10, 12 ซึ่งแต่ละรอบก็ประมาณ 60 วัน หรือหากกว่าใครมีวิธีดีกว่านี้แนะนำผมได้นะ ตอนนี้คิดออกเท่านี้

1
* * 1 2,4,6,8,10,12 * /root/letsencrypt/letsencrypt-auto --webroot -w /var/www/lookhin.com --email khwanchai@gmail.com --text --no-redirect --renew-by-default --agree-tos -d www.lookhin.com -d lookhin.com

# หรือถ้าหากว่าเราใช้โฮสที่เป็น share host ที่เขามี control panel ให้สามารถใส่ ssl certificate เองได้ แต่ไม่สามารถ shell เข้าใช้งานได้ เราสามารถที่จะใช้เครื่องอื่นที่สามารถใช้ letsencrypt ในการสร้าง certificate ขึ้นมาแล้วเอา certificate ที่ได้มาใช้กับโฮสนั้นก็ได้ โดยให้เราสั่งรัน ./letsencrypt-auto certonly –manual ซึ่งระบบจะให้เราไปสร้าง text file อันหนึ่งไว้ในเว็บของเราเพื่อเป็นการยืนยันว่าเราเป็นเจ้าของจริงๆ เช่น http://www.lookhin.com/.well-known/acme-challenge/..d_Sd6yI………vNCi3-uEb…Y เมื่อสร้างเสร็จแล้วเราจะได้ไฟล์ certificate และ key อยู่ในโฟสเดอร์ /etc/letsencrypt/archive/www.lookhin.com/ ให้ใช้ไฟล์ทั้งหมดในนี้ไปใช้งาน

1
# ./letsencrypt-auto certonly --manual

โดย LookHin ณ 4 December 2015 17:27 GMT

30 November 2015

Kitt

F5 อ่อนว่ะ

ไปร่วมงานสัมมนา “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 อ่อนว่ะ

โดย kitty ณ 30 November 2015 10:13 GMT

15 November 2015

LookHin

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

ก่อนหน้านี้เวลาจะดู 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

cacti-network-monitoring

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

1
# nano /etc/snmp/snmpd.conf

cacti-network-monitoring

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

1
# service snmpd restart

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

1
# apt-get install cacti cacti-spine

cacti-network-monitoring

กด OK

cacti-network-monitoring

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

cacti-network-monitoring

กด OK

cacti-network-monitoring

กด Yes

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

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

cacti-network-monitoring

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

cacti-network-monitoring

กด Finish
cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

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

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

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

cacti-network-monitoring

โดย LookHin ณ 15 November 2015 03:38 GMT

12 November 2015

Kitt

Sort file alphabetically in Samba

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 !

โดย kitty ณ 12 November 2015 04:32 GMT

4 November 2015

Udomsak

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

เนื้อหาอาจมีการปรับปรุง :)

หลังจากสามเดือนก่อน  ผมได้ขอยืม 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 ให้โปรแกรมรู้จัก 



โดย udomsakc (noreply@blogger.com) ณ 4 November 2015 17:28 GMT

29 October 2015

Udomsak

My Devops setting ( Thai lang. tutorial ). Section - 1

ตกงานว่าง เลยเขียน blog นี้ขึ้นมา หลังจากไปร่วมงาน Devops Thailand และ ได้พูดเรื่อง Helios กับ งาน deploy ( CD ) ไป  วันนี้เลยมานั่งเขียน blog ขึ้นมาอีกรอบนึง  


ครั้งนี้ ขอยกเอาตัวอย่าง flow จาก  Docker Thailand  มานั่งคุยกัน ว่าจะทำยังไงกับความต้องการเหล่านี้ดี  

แบบแผนที่ 1 ( Case scenario 1 ).  ขอยืมรูปมาจาก Docker In Thai group  นะครับ 




แบบแผนที่  2 ( Case scenario 2 ) ( ขอยืมรูปภาพมาจาก Docker In Thai  group นะครับ )  





เอาล่ะภาพในหัว  ตอนนี้ไล่เรียง ออกมาเป็นสองส่วน คือ 

  • Docker stack application layout. 
    • Docker Base 
    • Docker Application
  • Continuous Integration และ Continuous Delivery CI/CD flow ( tool ).
    • Internal service
      • Gitlab ( source control version ). 
      • Jenkins 
      • Hudson
      • Drone.io 
      • BuildBot 
      • etc.
    • External service
      • CircleCI 
      • etc.
  • Infrastructure layer.  เป้าหมายคือทำการติดตั้ง Docker ภายในอีกทีนึง
    • Internal Service. 
      • VMware.  
      • KVM. 
      • Xen.  
      • etc.
    • External Service.
      • Amazon EC2.
      • Amazon ECS ( Elastic Container ).
      • Digital Ocean.
      • Amazon Beanstalks. 
      • Amazon EC2 with CoreOS. 
ทีนี้ผมแยกเรื่อง Base infrastructure ผมแยกออกเป็นสองอย่าง คือ Internal กับ External service ซ่งใน blog นี้ผมจะเขียนเกี่ยวกับ การ setup Internal service infrastructure สำหรับงานนี้ 

ส่วนของ External service จะว่ากันถัดไป  และ สำหรับ Startup ผมว่าเหมาะมากที่จะใช้ external service  และ บริการของ Amazon มีให้คุณเกือบหมดทุกอย่างแล้ว  ขึ้นอยู่กับว่าจะเลือกใช้  ระบบอะไร และ จะปรับแต่งยังไง 


Internal Service infrastructure.   


Virtual Machine ผมเลือกใช้ KVM  ซึ่งเป็นแบบ Virtualization แบบ Para-virtualization มี speed ความเร็วการทำงาน ที่ดีมาก เมื่อเทียบกันกับ  Full VM อย่าง Virtual Box  ส่วนวิธีในการ deploy นั้น เนื่องจากทำเพื่อการทดลอง ผมใช้แค่
  • libvirt
  • KVM
  • Virt-manager 

และ การ deploy ( ติดตั้ง ) ผมทำแบบ manual นะครับ 

ส่วนท่านอื่น  อาจจะใช้ VMware หรือ ระบบอื่นๆ  ขึ้นอยู่กับท่านเอง.  
  

Docker Stack internal. 


แบ่งเป็นสองส่วนคือ 
  • Base image
    • base image คือ image พื้นฐาน สำหรับ Application ใน image นี้จะมีการติดตั้ง ระบบปฏิบัติการ  และ package หรือ utility ที่ ทุกๆ image จะมีเหมือนกันหมด เช่น  utility สำหรับทำการ monitoring หรือ control service สำหรับ docker เช่น supervisord  หรือ อื่นๆ  แล้วแต่เรา ออกแบบ  point หลักก็คือ  เวลา build image ขึ้นมา จะใช้เวลาไม่มากนั่นเอง

  • Application image.
    • application image  คือ image สำหรับ ทำการติดตั้ง Application เข้าไปจาก base image ของเราเช่น PHP, Ruby On Rail, Java application. เป็นต้น 

ภาพรวมของ Docker application Stack จะออกมาประมาณนี้ นะครับ ( คลิ๊ก เพือดูภาพขนาดใหญ่ ).







ทีนี้มาส่วนที่สอง  Flow การทำงานของ Dev ควรจะออกมาเป็นยังไงดี  แต่ก่อนอื่นผมแบ่งออกมาเป็นส่วนย่อย สำหรับ Developer นะครับ  คือ 

  • Local development หรือ เครื่องของ Developer เอง
  • Staging development หรือ หลังจากที่ทำการ dev แล้วทำการ Test/Build แล้ว เราจะ deployment ไปที่เครื่องนี้
    • เพื่อทำ Load Test
    • เพื่อทำ Automate UI test /  เพื่อทำ Manual Test  
  • Production host 
    • Run production 
    • Upgrade 
    • Bug fix
    • etc. 
ทีนี้เรามาวาง โครงสร้างของ ของ Development ต่อกันอีกหน่อย จากหัวข้อข้างบนถ้าวาด ออกมาเป็น Diagram ก็จะได้ตามนี้





เอาล่ะทีนี้ โครงสร้างพื้นฐานของระบบ เราก็ได้ออกมาแล้ว อันดับถัดไป ขั้นตอนการทำงานพื้นฐานของ การพัฒนา มีอะไรบ้าง  ( ปล. ผมไม่อ้างอิงตามมาตรฐานอะไรนะครับ เช่น Water flow etc. ) เอาตามความเข้าใจของผมเอง ก็จะได้ออกมาเป็นประมาณนี้

  1. Developer พัฒนาเสร็จ  
    1. Test local. 
    2. Push ไป Source version control management ( git, Sub-version, etc).
  2. ระบบทำการ  Test 
  3. ถ้าผ่านให้ทำการ Build  
  4. ทำการ deploy ไปยัง Staging Environment เพื่อทำการ test ต่อไป       
ดังนั้นจาก Scenario 1. ผมก็ทำออกมาเป็นตามนี้ 
  • Git Repository สำหรับ Base image. 
  • Git Repository สำหรับ Application deploy.  ( อาศัย Base image เป็นพื้นฐาน ).
ส่วนใหญ่ สำหรับคนที่ใช้ Mac/OSx จะทำงานบน  Virtualbox หรือ Tool ใหม่ที่ชื่อว่า  Kinetic แต่เนื่องจากผมไม่มีเครื่อง Mac/OSx ในมือ ผมเลยไม่สามารถทำ ทุกระบบให้ดูได้ เลยทำแค่พอให้เข้าใจ concept เท่านั้น

สรุปสำหรับตอนนี้ 


นำเสอนแนวคิดว่าจะทำกับระบบยังไงดี  และ การวาง diagram พื้นฐานสำหรับการทำงาน
  • เครื่องมือที่ใช้ 
    • packer สำหรับ build VM สำหรับ host Docker เนื่องจาก packer support libvirt 
      • ผม control KVM ผ่าน libvirt 
    • vagrant เป็นออปชั่น  
    • docker 
    • git  
    • Ansible สำหรับทำการ Setup VM Stack  ผมเองได้ทำเก็บเอาไว้ที่  link นี้  ** https://github.com/udomsak/ansible-fedora-virt  
ปล. ** Link Ansible ยังทำไม่สมบูรณ์ดี  เหลือ Ubuntu กับ Check version ของ Host เพื่อจะได้ติดตั้ง package ได้ถูกต้อง.  การใช้งาน ก็ติดตั้ง role นี้ลงไป วิธีการ run ดูได้จาก README.md เลย 

ansible-fedora-libvirt จะทำการติดตั้ง 
  • libvirt
  • KVM
  • tool สำหรับ บริหารจัดการ VM
  • docker 


ตอนนี้เขียนแค่นี้ก่อน  เดี๋ยวจะยาวเกินไป ติดตามตอนต่อไป. เรื่องการใช้ docker compose ในการบริหารจัดการกับ docker images และ การติดตั้ง docker registry



โดย udomsakc (noreply@blogger.com) ณ 29 October 2015 13:26 GMT

28 October 2015

Kitt

งานหนังสือระดับชาติครั้งที่ 20

ในงานหนังสือระดับชาติครั้งที่ 20 / Book Expo Thailand 2015 ณ บูธ Talent 1 แมวสามสียอดนักสืบ เล่ม 23 ฆ่าตัวตายที่ชายหาด แมวสามสียอดนักสืบ เล่ม 24 เหตุเกิดจากรับปริญญา คินดะอิจิยอดนักสืบ ตอนที่ 32/1 กระดิ่งลมหัวคน (ปฐมบท) คินดะอิจิยอดนักสืบ ตอนที่ 32/2 กระดิ่งลมหัวคน (ปัจฉิมบท) รวม 1140 ลด 30% เหลือ 798 บาท ณ บูธ Online Station เจอ The Moment It Clicks  ปก 395 ลดเหลือ 50 บาท ณ บูธ อมรินทร์ เฉียด (Seconds Away) … Continue reading งานหนังสือระดับชาติครั้งที่ 20

โดย kitty ณ 28 October 2015 16:40 GMT

24 October 2015

Udomsak

Default password cloud image qcow2

Set default password qcow2  image.

Fedora :  sudo dnf install libguestfs-tools-c

download Fedora Cloud image. ( 218MB ).  // สมมุติว่าดาวน์โหลดไปเก็บที่  $HOME/Downloads ตัวเต็ม ขนาดเป็น GB. ใช้เวลานาน ผมต้องการ แค่รัน Software ไม่ต้องอะไรมาก  ดาวน์โหลด มาเลย จากนั้นใช้คำสั่ง virt-sysprep ทำการเปลี่ยน password

virt-sysprep -a ~/Downloads/Fedora-Cloud-Base-22-20150521.x86_64.qcow2 --root-password password:adminadmin

Set SSH Public key  


ปกติ Cloud image จะ disable password ด้วยเหตุผลด้านความปลอดภัย นั่นหมายความว่าเราไม่สามารถ SSH ได้ด้วย password authentication  ผมเลยเพิ่ม SSH Public-key ไปใน Image เลยจะได้ไม่ต้องเสียเวลาในการ setup password authentication ทีหลัง

ตัวอย่าง

sudo  virt-sysprep -a ~/Downloads/Fedora-Cloud-Base-22-20150521.x86_64.qcow2 --ssh-inject root:file:/home/udomsak/.ssh/id_node2.pub  --root-password password:adminadmin


Virt-manager

Import image ไปใช้งานได้เลย 







โดย udomsakc (noreply@blogger.com) ณ 24 October 2015 18:31 GMT

22 October 2015

Udomsak

ปรับ Atom editor ให้ support ภาษาไทย ( Thai lang tutorial )

เนื่องจาก ตกงาน หลังจากแทบไม่ได้แตะ Technical เลย วันนี้หลังจาก สัมภาษณ์งานเสร็จ จาก บริษัททาง Singapore ( ซึงผมคาดว่าคง "ตก" ) กลับมาเลยมานั่ง ทำงานเก่าต่อ ที่เกี่ยวกับ Mobile application.

ทีนี้เนื่องจากผมใช้ Atom ในการทำงานกับ Mobile application ( Cordova base ) และ ต้องทำงานกับ ภาษาไทย บน  Fedora Linux version 22  แต่ปรากฏว่า  มันมองไม่เห็น font ภาษาไทยที่ผมติดตั้งลงไป ( จนปัญญา )  เลยมองหา Extension ที่เกี่ยวกับ font และ ก็เจอตัวนี้  fonts

สำหรับปัญหาเรื่อง Font  ภาษาไทย อื่นๆ มี issue เป็น กรณีนี้ 

หลังจากได้มาแล้วก็มาทำการปรับแต่ง  แก้ไขเล็กน้อยโดยอาศัย fonts ของ SIPA  อ้างอิงจาก เวบนี้



หน้าตาก่อนทำการเพิ่ม font 



font ที่ผมทำการเพิ่มเข้าไป ใช้ TH Baijam ( ถ้าไม่ขี้เกียจจะเพิ่มให้ครบทั้ง 13ตัว ).   ได้ผลออกมาประมาณนี้




ถ้าทำทุกอย่างเสร็จเรียบร้อยแล้ว เหลือ เพิ่ม font license เข้าไปจากนั้น ค่อยส่งคำร้องขอเพิ่ม font thai เข้าไป ที่ main repo น่าจะเรียบร้อย เวลาติดตั้งจะได้ ไม่ต้อง คอย clone จาก repository ของผม

วิธีการติดตัั้ง

1. cd ~/.atom/packages
2. git clone https://github.com/udomsak/fonts.git
3. restart atom editor ( กรณี เปิด Atom editor ไว้ก่อน ).

จบ.

โดย udomsakc (noreply@blogger.com) ณ 22 October 2015 12:04 GMT

16 October 2015

Thep

LibThai Thread-safety

อันเนื่องมาจากการที่ Pango 1.38.0 ที่ออกมาพร้อมกับ GNOME 3.18 ได้ตัดระบบ dynamic module ทิ้ง แล้วใช้วิธีรวมเข้าในซอร์สโค้ดเลย (GNOME #733882) ทำให้ผู้ดูแลหลัก คือ Behdad Esfahbod ได้มีโอกาสรื้อมอดูลภาษาต่าง ๆ รวมถึงภาษาไทย และพบประเด็นของ libthai ที่รองรับการตัดคำของมอดูลภาษาไทยอยู่ จึงได้ติดต่อมาที่ผมเพื่อให้แก้ไข โดยประเด็นสำคัญคือเรื่อง thread-safety

โค้ดใน libthai มีส่วนหนึ่งที่ทำให้ไม่ปลอดภัยเมื่อเรียกใช้ผ่าน thread หลาย thread พร้อมกัน ซึ่งเป็นส่วนที่ผมใช้ลดปริมาณการเรียก malloc() โดยยังไม่ free() โหนดทางเลือกต่าง ๆ ของการตัดคำที่เลิกใช้แล้วในทันที แต่เอาไปฝากไว้ใน free list เพื่อนำกลับมาใช้ใหม่ และไอ้เจ้า free list ที่เป็นเสมือนโกดังเก็บของเก่ารอ reuse นี่แหละ ที่ implement แบบ static โดยไม่มีการจองก่อนเข้าใช้ ทำให้เมื่อมีหลาย thread เข้าใช้พร้อมกันจะเกิด race condition ขึ้นได้

ประเด็นนี้ pango รุ่นนี้แก้ปัญหาเฉพาะหน้าด้วยการ ล็อคก่อนเรียก th_brk() เพื่อให้ thread ต่าง ๆ เข้าใช้ฟังก์ชันนี้ทีละ thread ซึ่งอาจกลายเป็นคอขวดของระบบหลาย thread ได้ ทางที่ดีคือทำให้ libthai threadsafe เสีย

ทางเลือกที่เป็นไปได้จึงมี 3 ทาง

  1. ยกเลิก free list ไปเสีย (ซึ่ง Behdad สนับสนุน โดยให้เหตุผลว่า malloc() ใน libc รุ่นหลัง ๆ ทำงานเร็วขึ้นมากแล้ว และ CPU สมัยใหม่ก็ทำงานเร็วขึ้นมากแล้วด้วย จะไปนั่งออปติไมซ์ทำไมให้เมื่อยตุ้ม)
  2. ใช้ free list 1 ชุดต่อ 1 thread แทนที่จะใช้ร่วมกันหมด (แต่ละ thread เก็บโหนดที่เลิกใช้ไว้ในกระเป๋า recycle ของใครของมัน ไม่ต้องใช้ร่วมกัน)
  3. ใช้ free list กลางเหมือนเดิม แต่ให้มีระบบ lock (แต่ละ thread ต้องล็อคโกดังขณะเข้าใช้ thread อื่นต้องรอให้ thread ที่ใช้งานอยู่ใช้ให้เสร็จเสียก่อนจึงจะเข้าใช้ได้)

วิธียกเลิก free list อาจจะง่าย แต่ก่อนจะเชื่อก็ต้องวัดดูก่อน ซึ่งจากการทดลองของผมก็พบว่า th_brk() จะทำงานนานขึ้นถึง 18% ถ้าใช้ malloc() ตรง ๆ ทุกครั้ง หรือถ้าเทียบกลับ การใช้ free list สามารถประหยัดเวลาจากการใช้ malloc() ได้ถึง 15% ซึ่งผมถือว่ามีนัยสำคัญ ฉะนั้นจึงไม่เลือกวิธีนี้

จากนั้นจึงมาทดลองวิธีใช้ free list 1 ชุดต่อ 1 thread ซึ่งวิธีการก็ไม่ได้มีอะไรมาก เพียงแค่เปลี่ยนจากการใช้ตัวแปร static มาเป็นการสร้าง free list ใหม่ในการเรียก th_brk() แต่ละครั้งเท่านั้นเอง เนื่องจากตัว libthai เองไม่ได้สร้าง thread ใหม่อยู่แล้ว การสร้าง thread เกิดจากโค้ดผู้เรียกอย่าง pango หรือผู้ที่เรียก pango อีกทีทั้งสิ้น การสร้าง free list ต่อ 1 call ก็เท่ากับการสร้างต่อ 1 thread นั่นเอง

ผลการทดลองคือ free list แบบต่อ thread ก็ยังสามารถประหยัดเวลาได้ถึง 13% (2% ที่หายไปพบภายหลังว่าเกิดจากการสร้าง free list ผิดจากจุดเดิมในโค้ด ทำให้เกิดการสร้างและทำลาย free list เพิ่มขึ้น เมื่อแก้ให้ตรงกับจุดเดิมก็ปรากฏว่าประหยัดเวลาได้เท่าๆ ของเดิม) ซึ่งถือว่าน่าพอใจ

วิธีสุดท้ายที่ใช้ระบบล็อคนั้น จะทำให้ libthai ต้องมีการแทรกโค้ดการเรียก pthread เข้ามา ซึ่งทำให้โค้ดส่วนนี้ดูแปลกแยกไม่สวยงาม และในเมื่อวิธีที่ใช้ free list ต่อ thread ได้ผลเป็นที่น่าพอใจอยู่แล้ว ผมจึงไม่พิจารณาวิธีนี้อีก

จึงได้เป็น rev 577 (และแก้ไขเพิ่มเติมใน rev 583 หลังจากพบสาเหตุที่ทำให้การประหยัดเวลาลดลง 2%)

นอกจากนั้น ก็เป็นความพยายาม optimize การตัดคำของ libthai ต่อ ดังรายการต่อไปนี้:

สรุปแล้ว การตัดตำของ libthai โดยรวมใช้เวลาลดลงประมาณ 0.28% (รวมเวลาโหลดพจนานุกรม) พร้อมกับปลอดภัยสำหรับการทำงานหลาย thread โดยไม่ต้องล็อคด้วย

ถ้าไม่มีไอเดียใหม่อีก ก็คงจะออกรุ่นใหม่เร็ว ๆ นี้ครับ

ในอีกด้านหนึ่ง ทีม debian-cd ได้กระทุ้งมาอีกครั้งว่าช่วยทำ udeb ของ libthai ให้หน่อย จะได้ใช้ในโปรแกรมติดตั้งของเดเบียน (Debian #800369) ก็ทยอยทำตั้งแต่ libdatrie1-udeb (0.2.9-3) รอจนผ่าน NEW queue แล้วก็ทำ libthai-data-udeb และ libthai0-udeb ต่อ (ขณะที่เขียน blog ยังรออยู่ใน NEW)

โดย Thep (noreply@blogger.com) ณ 16 October 2015 08:55 GMT

24 September 2015

Udomsak

ปรับแต่ง Openstack บน Docker

แม้อาจไม่ใช่ priority หลัก ยังคงคั่งค้างกับการหา Panel สำหรับบริหารจัดการกับ Amazon web-service. จากปัญหาทีเกิดขึ้นกับ Blog ก่อนหน้า.

หลังจากดูหนังเสร็จ ก็เลยมานั่งทำ Openstack ติดตั้งเฉพาะส่วนที่จะใช้งาน  บน Docker เผื่อได้ใช้งานวันหลัง ได้ผลออกมาตามนี้  จริงๆ Amazon เองก็มี เครื่องมือชื่อว่า Amazon cloud formation แต่ที่ทดลองทำดู เผื่อเห็น feature อะไรเพิ่มเติม จะนำมาใช้ในงานได้

ผมติดตั้งแค่

ทั้งหมดยัดใส่ใน docker วันหลังค่อยทำต่อ :)






Configuration ผมข้ามไปในส่วนของ EC2 configuration. 




โดย Udomsak (noreply@blogger.com) ณ 24 September 2015 11:30 GMT

Notework - docker

docker-compose on Fedora 22 error - ImportError: No module named urllib.parse

issue: https://github.com/docker/compose/issues/1288  #close





โดย Udomsak (noreply@blogger.com) ณ 24 September 2015 11:30 GMT

22 September 2015

Kitt

Make a bootable USB for Ubuntu Server Installation

Well, there are basically 3 tools. start-up disk creator unetbootin dd For most of the cases, the first one would work well – boot from USB drive, then you have a go. For some other cases, unetbootin could do the job. And in some rare cases, like mine – yesterday – with Ubuntu Server 14.04.3 … Continue reading Make a bootable USB for Ubuntu Server Installation

โดย kitty ณ 22 September 2015 21:00 GMT

13 September 2015

Kitt

DebConf15 – Day 6-7

The conference dinner was in day 6. The last day I attended DebConf. The dinner was in a beer garden / restaurant called Waldschenke Heidelberg on top of the mountain near Heiligenberganlage.  The restaurant was exclusively reserved for DebConf15. The weather was cold, but atmosphere was certainly warm with friends, and unlimited beer. It was really great. … Continue reading DebConf15 – Day 6-7

โดย kitty ณ 13 September 2015 13:25 GMT

DebConf15 – Day 4-5

Day 4 was hack time – hacklab all day. ^^ Day 5 was the conference day trip. There were 4 choices to pick. I chose, of course, a beer brewery – Brauerei zum Klosterhof.  It was entertaining to learn about brewing beer, also tasted 3 kinds of them – halle, weisse, and dunkel. We had a … Continue reading DebConf15 – Day 4-5

โดย kitty ณ 13 September 2015 12:02 GMT