Private Cloud with Juju and LXD Workshop

::Juju:: Juju #01 เริ่มต้นใช้งาน Juju Juju #02 วิธีติดตั้ง WordPress Juju #03 วิธีสร้าง Load Balance MySQL Juju #04 วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB Juju #05 วิธีกระจายงานไปยัง MySQL แบบ Master-Master Juju #06 เชื่อม MySQL Master-Master เข้ากับ HAProxy Juju #07 กระจายโหลดข้ามเครื่อง  

Read More »

Juju #07 – กระจายโหลดข้ามเครื่อง

ที่ผ่านมา เป็นการติดตั้ง Juju ซึ่งเบื้องหลังคือ LXD Container แต่ทั้งหมดยังอยู่บนเครื่องเดียวกัน ภาพต่อไปนี้ เป็นการทดสอบความเร็วในการตอบสนองของ WordPress ซึ่งเป็น Post ที่มีภาพจำนวนมาก และมีขนาดในการ Download ทั้งหมด 5 MB ใช้เวลาประมาณ 1.24 วินาที เมื่อใช้ jMeter ระดมยิงด้วยความเร็ว 100 Connections ต่อ 1 วินาที ต่อเนื่อง 10 วินาที ได้ผลว่า เวลาเฉลี่ยคือ 2.478 วินาที ต่อมาลองเพิ่มจำนวน Container จาก 1 เครื่องไปเป็น 3 เครื่อง แต่ทำงานอยู่บน Physical Server เดียวกัน แล้วทดลองยิงแบบเดิม ได้ผลออกมาคือ ใช้เวลาเฉลี่ย 1.663 วินาที จากนั้น ทดสอบแยก Container ออกไป เป็น 3 Physical Servers ได้ผลออกมาว่า ใช้เวลาลดลงเหลือเพียง 1.056 วินาทีเท่านั้น สรุป การกระจายโหลดออกไปยังหลายๆ Physical Servers ทำให้สามารถรับโหลดจำนวนมากได้ ในบทความต่อไปจะมาลงรายละเอียดในการ Setup กัน   Reference: – https://www.digitalocean.com/company/blog/horizontally-scaling-php-applications/ – https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04 – http://php.net/manual/de/mysqlnd-ms.loadbalancing.php – https://serversforhackers.com/video/php-fpm-configuration-the-listen-directive – http://nginx.org/en/docs/http/request_processing.html – http://stackoverflow.com/questions/5328844/nginx-load-balance-with-dedicated-php-fpm-server – https://code.google.com/archive/p/sna/wikis/NginxWithPHPFPM.wiki – http://nginx.org/en/docs/http/load_balancing.html – http://opensource.cc.psu.ac.th/KM-container

Read More »

การตั้งค่า Font เริ่มต้นใน Word ไม่ต้องคอยเปลี่ยนทุกครั้ง

สำหรับท่านที่อาจจะต้องพิมพ์เอกสารราชการบ่อยๆ ซึ่งต้องใช้ TH Sarabun นั้น คงเป็นเรื่องน่าเบื่อที่จะต้องมาคอยเปลี่ยน Font ทุกครั้ง   อันที่จริงแล้ว ใน Microsoft Word 2016 (ล่าสุด ณ ตอนเขียนบทความนี้) ท่านสามามารถบันทึกรูปแบบเริ่มต้นทั้งฟอนต์, ขนาดฟอนต์ รวมทั้งรูปแบบตัวอักษรไว้เป็นค่าเริ่มต้นได้เลย (Overwrite the Normal.dotm template) ด้วยวิธีการต่อไปนี้ครัช   1. เลือก Font ที่จะเป็น Font เริ่มต้น ในตัวอย่างเลือกเป็น TH SarabunPSK ขนาด 16 แล้วก็คลิกตามลูกศรชี้ 2. กดที่ Set As Default ตามลูกศรอีกเช่นเคย 3.เลือก All document based on the Normal.dotm template แล้วกด OK เพียงเท่านี้ ค่าที่ตั้งไว้ก็จะเป็นค่าเริ่มต้นทุกครั้งที่เปิด Microsoft Word 2016 (เนื่องจากผมใช้ UI เป็นภาษาอังกฤษ สำหรับภาษาไทยนั้น ลองเทียบตำแหน่งปุ่มดูนะครับ)   หากมีข้อผิดพลาด ขออภัยไว้ ณ โอกาสนี้ครัช

Read More »

การสร้างเอกสารด้วย Sphinx

sphinx คือเครื่องมือที่ช่วยในการสร้างเอกสารที่พัฒนาโดย Georg Brandl เดิมที sphinx ได้รับการพัฒนาเพื่อใช้สร้างเอกสารสำหรับ Python แต่สามารถใช้งานกับภาษาอื่นๆได้เช่นกัน sphinx ใช้ reStructuredText (ดูข้อมูลเพิ่มเติมเกี่ยวกับ reStructuredText ได้ที่ บทความ ก่อนหน้า) ในการกำหนดรูปแบบของเอกสาร และชุดเครื่องมือในการ parsing และ translating เอกสารในรูปแบบ  reStructuredText ไปเป็นรูปแบบที่ต้องการเช่น html หรือ pdf เป็นต้น ในการติดตั้งใช้งาน sphinx นั้นจำเป็นต้องต้องติดตั้ง Python เนื่องจาก sphinx ได้รับการพัฒนาโดยใช้ Python language ทำให้การใช้งาน sphinx ต้องติดตั้ง Python ด้วย โดย Python ที่ใช้ต้องเป็น Python version 2.7 เป็นอย่างน้อย การติดตั้ง Python บน windows  ทำได้โดยเข้าไป download “Python windows installer” ที่ https://www.python.org/ และทำการติดตั้ง หลังจากติดตั้งเรียบร้อย จะต้องทำการกำหนดค่า Python executable directory ใน PATH environment variable เพื่อที่จะสามารถ run Python และ package command เช่น sphinx-build ได้จาก command prompt Installing Sphinx with pip การติดตั้ง Sphinx ทำได้โดยการใช้ “pip”  ซึ่ง pip เป็นเครื่องมือที่ใช้ในการ download และติดตั้ง 3rd-party libraries สำหรับ Python ซึ่งจะถูกรวมอยู่ใน Python official installation ตั้งแต่ version Python-3.4.0 การติดตั้ง sphinx โดยใช้คำสั่งดังนี้บน command prompt C:\> pip install sphinx หลังจากติดตั้งเรียบร้อย ให้พิมพ์คำสั่ง sphinx-build -h บน command prompt ถ้าทุกอย่างถูกต้อง จะแสดงข้อมูล Sphinx version number และ list ของ option ต่างๆสำหรับคำสั่งนี้ Setting up the documentation sources การพัฒนาเอกสารด้วย sphinx นั้น เริ่มแรกเราจะต้องกำหนดพื้นที่สำหรับพัฒนาเอกสารและจัดเก็บ config ที่ใช้สำหรับ sphinx ซึ่ง sphinx มีคำสั่ง sphinx-quickstart ซึ่งทำหน้าที่กำหนด source directory และสร้าง default config file “conf.py” ที่จำเป็นให้ โดยใช้คำสั่งดังนี้ C:\> sphinx-quickstart sphinx-quickstart script สร้างโครงสร้าง folder พร้อมทั้ง file เริ่มต้นรวมทั้ง Makefile และ make.bat ซึ่งจะใช้ในการ build (parsing และ translating โดยที่ถ้าพบส่วนที่ไม่ตรงตามข้อกำหนด syntax จะแสดง warning หรือ error พร้อมทั้งรายละเอียดของ line เช่นเดียวกับการ build “code program”) หลังได้โครงสร้าง folder สำหรับพัฒนาเอกสารเรียบร้อย ก็สามารถเริ่มต้นเขียนเอกสารโดยใช้ reStructuredText ในการกำหนดรูปแบบการแสดงผลของ text จากนั้นเมื่อต้องการสร้างเอกสารในรูปแบบที่ต้องการเช่น html document ก็จะต้องทำการ build โดยใช้คำสั่ง C:\> make html ผลลัพธ์ที่ได้จากการใช้คำสั่งนี้คือ HTML

Read More »

คู่มือเทคนิคการใช้งาน Function พื้นฐานใน Itextsharp สำหรับมือใหม่ ตอนที่ 2

บทความนี้ผู้เขียนจะพูดถึงส่วนที่มีการทำงานในลักษณะคล้ายกับ Containner แต่ก่อนจะเริ่มเนื้อหาในส่วนนี้ สำหรับผู้ที่เริ่มต้นใหม่สามารถอ่านบทความ ตอนที่ 1 เพื่อความเข้าใจต่อเนื่องกันนะครับ ส่วนผู้ที่อ่านบทความก่อนหน้านี้ เรามาเริ่มกันเลยดีกว่าครับ ก่อนที่ผู้เขียนจะไปพูดถึงส่วนของการเขียนโปรแกรมนั้น ผู้เขียนอยากอธิบายเพื่อทำความเข้าใจให้กับผู้อ่านได้เห็นภาพได้ชัดเจนเกี่ยวลักษณะการทำงานของ Containner แบบต่างๆให้ได้ทราบกัน โดยการทำงานของ Itextsharp นั้น เมื่อเราทำการสร้างเอกสารแล้ว เราไม่สามารถเขียนข้อความหรือใส่ข้อมูลต่างๆลงไปได้ในเอกสารโดยตรง แต่เราจะทำผ่านตัว Containner ครับ โดยตัว Containner ที่ Itextsharp ให้มาก็มีหลายรูปแบบให้เลือกใช้งานกัน วันนี้เราจะมาทราบกันว่ามีรูปแบบอะไรบ้างที่ช่วยให้เราทำงานได้ดีขึ้นครับ รูปตัวอย่างแสดงการทำงานของ Containner จากรูปตัวอย่างที่ผู้เขียนได้วาดไว้นั้น ผู้เขียนขออธิบายกรอบทั้งด้านซ้ายก่อนนะครับ โดยกรอบแต่ละสี จะเป็น Containner แต่ละที่ Itextsharp มีมาให้เราใช้งาน โดยกรอบสีดำนอกสุดนั้น ก็คือ Document หรือตัวเอกสารที่ได้กล่าวถึงในบทความก่อนหน้านี้ ซึ่งเป็น Containner ใหญ่สุดและเป็นตัวหลัก ใช้สำหรับบรรจุ Containner ตัวอื่นๆลงไปในเอกสาร ต่อมากรอบสีน้ำเงิน ก็คือ Paragraph เรียกง่ายๆว่าย่อหน้า ใน 1 Document นั้นเราสามารถบรรจุ Paragraph กี่อันก็ได้ตามที่ผู้ใช้ต้องการ โดยแต่ละ Paragraph จะเรียงต่อกันลงมาเป็นแนวตั้ง โดย Paragraph ล่าสุดจะอยู่ล่าสุดของเอกสารเสมอ ต่อกันด้วยกรอบสีแดง ก็คือ Phrase เรียกง่ายๆว่า รูปประโยค ใน 1 Paragraph สามารถมี Phrase ได้หลายอัน โดยต่อเรียงจากซ้ายไปขวา เราสามารถเขียนข้อมูลลงใน Phraph ได้ หรือเราใช้เป็น Containner สำหรับบรรจุ Chunk อีกชั้นได้ด้วย แต่ Phraph เหมาะสำหรับใช้เป็น containner มากกว่าใช้ใสข้อมูลโดยตรง เนื่องจากมีเงื่อนไขในการใส่ที่จำกัด และสุดท้ายของกรอบด้านซ้ายและเป็นตัวหลักในการเขียนข้อมูลคือ Chunk นั้นเอง Chunk เป็น Containner ที่มีหน้าที่ในการเก็บข้อมูลที่เราจะใส่ลงไปในเอกสารโดยเฉพาะ โดย Chunk จะต่อเรียงกันไปเลยๆจากซ้ายไปขวาเหมือน Phrase และไม่สามารถบรรจุ Containner อื่นลงไปได้อีก พออ่านมาถึงตรงนี้หลายท่านสงสัยว่า เรามาถึง Containner ตัวเล็กสุดแล้ว แล้วอีก 2 ตัวที่เหลือละ จริงๆผู้เขียนไม่ได้ลืมนะครับ แต่ผู้เขียนพยายามแยกการทำงานของ Containner เป็นชุดๆให้ผู้อ่านได้เข้าใจง่ายๆ เมื่อจบการอธิบายในกรอบด้านซ้ายของรูปตัวอย่างแล้ว เรามาเริ่ม กรอบทางด้านขวากันเลยดีกว่า เมื่อเราดูรูปกรอบด้านขวาจะพบว่ามี Containner บ้างตัวหายไป ทั้งที่มีการใช้งานทางด้านซ้าย ก็คือเจ้า Paragraph นั้นเอง เพราะผู้เขียนคิดว่าการทำงานของ Paragraph นั้นจะซ้ำซ้อนกับ PdfPCell นั้นเอง แต่ก่อนจะพูดถึง PdfPCell สิ่งที่ลืมไปไม่ได้เลยคือ PdfPtable นั้นเอง สำหรับผู้พัฒนาโปรแกรม คงเข้าใจได้ง่ายๆว่า ถ้าเราจะสร้างCell เราจะขาด Table ไปไม่ได้ เพราะ Cell เป็นส่วนนึงของ Tableนั้นเอง โดย PdfpTable จะทำหน้าที่ในการบรรจุ Containner PdfPCell ไว้นั้นเอง เมื่อเราทำการใส่ PdfPCell ลงใน PdfPTable แล้ว PdfPCell จะเรียงต่อกันจากซ้ายไปขวา เรื่อยๆ แล้วหลายคนสงสัย แล้วไม่มี PdfPRow ให้ใช้งานหรอ มีครับแต่ไม่ค่อยได้รับความนิยมในการใช้งานมากนัก เพราะตัว PdfPTable นั้นสามารถเพิ่ม PdfPCell ได้โดยตรงไม่ต้องเพิ่ม PdfPRow แต่อย่างใด ผู้เขียนจึงขอตัดออกไปก่อน แต่จะมีตัวอย่างการใช้งานให้ดูตอนท้ายครับ แล้วถามว่าเราสามารถเอา PdfPTable ไปใส่ใน Paragraph ได้ไหม ได้ครับ เราสามารถเอา PdfPTable ใน Paragraph และเช่นเดียวกันเราสามารถเอา Paragraph ใส่ใน PdfPTable รู้สึกผู้เขียนจะร่ายยาวไปแล้ว คนอ่านคงเบื่อ เรามาเข้าสู่ช่วงของการเขียนโปรแกรมกันเลยดีกว่า โดยเริ่มจากตัว Containner ตัวเล็กสุดคือ Chunk Chunk chk1 = new Chunk(“Howdy”,fnt);//1 Chunk chk2

Read More »