Uncategorized

รำวง Docker

เมื่อวันเสาร์ได้มีโอกาสมาเรียนรู้เรื่อง Docker ที่จัดแบบเหมารอบรำวงโดย Jirayut Nimsaeng

งานนี้เรียกว่าครบเครื่องทั้งบู๊ทั้งบุ๋น เดียร์ ออกแบบ Course นี้ได้ดีมากเรียกได้ว่ากลมกล่อม หอมชวนชิมเลยหล่ะ ทำให้การสอนดูค่อนข้างไหลลื่นและทำให้คนเรียนเห็นภาพได้ง่ายมาก แถมยังใส่เรื่อง Best Practice ต่างๆ และประสบการณ์ตรงในการใช้ลงมาด้วย … แจ่มจริงครับ

ขณะที่ผมพิมพ์นี้ผมรู้สึกได้ว่า Docker มันง่ายมากๆ แต่ตอนก่อนหน้านี้ไม่ได้รู้สึกอย่างนั้น เพราะไม่ค่อยได้มีเวลาไปจับมันอย่างจริงจัง รวมถึงไม่ค่อยได้อ่านอ่านหนังสือเกี่ยวกับมันเท่าไหร่ พอเดียร์อธิบายให้เห็นภาพรวมถึงพาทำไปด้วยกัน…. ง่ายขึ้นมาทันทีเลย 555

Docker เป็น VM ที่เปรียบตัวเองเหมือน Container เราอยากจะได้ Process อะไรก็เอามันมาเรียงร้อยต่อกันเป็นสิ่งที่เราต้องการ เช่น เราต้องการทำ infrastructure ของ web app สักตัว เราก็ต้องมี VM ที่มี ubuntu + nginx + webapp + postgresql อะไรจำพวกนี้ ซึ่งบางทีเราก็อยากจะทดสอบกับ postgresql version 8 และ postgresql version 9 รวมถึง webapp 4.3 กับ webapp 5.5 เราก็ต้องใช้ VM ถึง 4 ตัว

VM1 : ubuntu 14.04 + nginx 1.6 + postgresql 8.4 + webapp 4.3
VM2 : ubuntu 14.04 + nginx 1.6 + postgresql 8.4 + webapp 5.5
VM3 : ubuntu 14.04 + nginx 1.6 + postgresql 9.3 + webapp 4.3
VM4 : ubuntu 14.04 + nginx 1.6 + postgresql 9.3 + webapp 5.5

ซึ่งนั่นหมายความว่า เราต้องเสียทรัพยากรณ์ของเครื่องไปกับ ubuntu 14.04 กับ nginx 1.6 ไปเยอะ (ตั้ง 4 ชุด ทั้งๆ ที่ VM ทุกตัวใช้ไอ้เจ้านี้เหมือนๆ กัน)

Docker จัดการปัญหานี้ได้ดี โดยที่มันจะแยก image ของ process เหล่านี้ออกมา เป็น ชุด โดยกรณีอย่างข้างบนนั้น เราก็ใช้ ubuntu 14.04 กับ nginx 1.6 แค่ container เดียวเท่านั้น ส่วน postgresql ก็ใช้ 2 container และ webapp 2 container

ประสิทธิภาพของมันก็เรียกว่าแทบจะเทียบเท่า native

 

Docker support app บน Linux ส่วนชาว Mac และ Windows ก็อดไป แต่ถ้าอยากจะเล่น Docker ก็ใช้ผ่าน virtualbox ได้ง่ายๆ โดยมี Boot2Docker เป็นตัวช่วย

boot2docker  init
boot2docker  up
boot2docker  ssh

คือคำสั่งง่ายๆ …​ แค่นี้เราก็ใช้ docker ได้แล้ว จริงๆ นะ

แล้วเราก็สามารถ pull image ที่เราต้องการได้จาก dockerhub ด้วยคำสั่ง

docker pull ubuntu:14.04

แค่นี้เราก็มี ubuntu image version 14.04 มาใช้แล้ว ถ้าอยากได้  version อื่นๆ และ version ล่าสุดก็สั่งแค่

docker pull ubuntu

เท่านี้ก็ได้

การที่เราไม่ได้ระบุ TAG ( ไอ้ :14.04 นั่นแหล่ะ ) มันก็จะหมายถึง tag latest  ลองสั่ง

docker images

ดูได้

ถ้าเราอยาก ลองใช้ ก็ลองเอา image มา run เป็น container โดยใช้คำสั่ง

docker  run  ubuntu  echo “hello world”

มันก็จะเอา image ubuntu:latest มาสร้าง container แล้วก็ run process  echo “hello world” เราก็จะได้ผลลัพธ์ ออกมาดังนี้

hello world

เราสามารถดูสถานะของ containers ที่เราได้สั่งมันทำงานไปแล้วได้ด้วยคำสั่ง

docker ps -a

เราสามารถสร้าง image ของเราเองจาก container 

docker commit [cid]  ubuntu-ssh

เราก็จะได้ image ชื่อ ubuntu-ssh จาก container ที่มี container id ตามที่ระบุ

อ้อ อยากจะลองไปพิมพ์ bash command เล่นๆ เพื่อทำ trouble shooting ก็สามารถใช้

docker  run -i -t  ubuntu:14.04  /bin/bash

 

 

อันนี้เป็นเบื้องต้นมากๆ เดี๋ยวมีเวลาจะมาเหลาต่อละเอียดๆ 🙂

 

 

 

 

Uncategorized

ตัวแปรชนิด Single ลบกันแล้วค่ามันผิด

สัปดาห์ที่แล้วผมหงุดหงิดกับ ERP ตัวเดิมที่สร้างประเด็นปัญหาอย่างไม่หยุดหย่อน ซึ่งปัญหามันมีอยู่ว่า ทางฝ่ายจัดซื้อผมเคยเปิด P/O รายการนึงจำนวน 1 หน่วย และก่อนหน้านี้ มี invoice เรียกเก็บเงินไปแล้ว 90% (0.9 หน่วย) ก็ยังเหลืออีก 10% ที่ supplier มาขอเรียกเก็บในเดือนนี้

เมื่อตอนที่ทางเรา Key P/O ในส่วนที่เหลือจำนวน 0.1 หน่วยเข้าไป โปรแกรมมันดันฟ้องว่า “บันทึกจำนวนเกินกว่าที่ระบุไว้ใน P/O” ผมก็เห้ย มันจะเกินไปได้ยังไงวะ คราวที่แล้วรับเข้าไป 0.9 คราวนี้อีก 0.1 มันก็น่าจะพอดี 1 หน่วยสิ

วิเคราะห์อยู่หลายวันว่าข้อมูลมันผิดปกติตรงไหน ทดลองบันทึกจำนวนที่น้อยกว่า 1 ลงไปเช่น 0.0999 ปรากฎว่าผ่านได้เฉยเลย ก็เลยนึกถึงกระทู้ที่ตัวเองเขียนอธิบายไว้เมื่อ 6 ปีก่อนที่เว็บ thaiadmin.orgได้ 

http://www.thaiadmin.org/board/index.php?topic=78605.0

กรณีนี้ฐานข้อมูลมันเก็บ QTY ไว้เป็นชนิด NUMERIC(14,6) ซึ่งถ้าโปรแกรมเมอร์ไม่ระวัง เอา Single หรือ Double ไปเก็บข้อมูลนั้น ตัวเลขมันก็จะถูแปลงให้อยู่ในจำนวนที่มันจัดเก็บได้ แล้วมันก็จะมี error อยู่นิดหน่อย เพราะบางทีมันไม่สามารถจัดเก็บจำนวนที่ถูกต้องได้ (รายละเอียดลองอ่านในกระทู้ของ Thai Admin ข้างบนที่ทำ link เอาไว้ให้นะครับ)

เมื่อพอจะเดาได้ว่าน่าจะเป็นเพราะอะไรผมก็ report BUG ไปให้บริษัทเจ้าของ ERP ตัวนั้น

ดูเหมือนไม่มีอะไรที่น่าจะโมโหใช่ไหมครับ 

ก็จะไม่ให้ผมหงุดหงิดได้ไงหล่ะ หลังจากแก้ bug นี้แล้ว ผมก็ลอง add new item ด้วยจำนวน 0.1 มันเข้าไปได้แล้ว ไม่มีปัญหาแต่อย่างใด แต่พอผมลองลบแล้ว add new item ด้วยจำนวน 0.07 แล้วกลับมาแก้เป็น 0.10 ปรากฎว่า Error เหมือนเดิมเป๊ะ

ผมไม่เข้าใจเหมือนกันว่าบริษัท ERP เจ้านี้เขาทดสอบ software ตัวเองก่อนส่งมาให้ลูกค้าหรือเปล่า ..​. ไม่เข้าใจจริงๆ

Programing

AngularJS Day #1 — TypeError: Object function createServer()

ห่างหายจากการพํฒนา web application ไปนานเลย (จริงๆ แล้วห่างหายจากการเขียนโปรแกรมไปนานโขเลยหล่ะ) ก็เลยหยิบ Angular JS มาเคาะสนิมสักหน่อยตามหนังสือ Pro AngularJS ของ Adam Freeman

ปัญหาอย่างนึงเวลาทำเรานั่งเรียนอะไรอยู่คนเดียวก็คือดูมันจะติดๆ ขัดๆ อะไรหลายๆ อย่าง เพราะนอกจากต้อง coding แล้วก็ต้องทำความเข้าใจเนื้อหาเหล่านั้นไปด้วย ปวดหัวก็ตอนที่ผลลัพธ์มันไม่เป็นไปตามที่ต้องการแล้วเราไม่รู้ว่ามันผิดตรงจุดไหน

อย่างตอนเริ่มต้น ในหนังสือเราจะใช้ node.js module ที่ชื่อ Connect เพื่อสร้าง web server ง่ายๆ เพื่อรับ http request ที่ port 5000 และตอบกลับไป โดยเขียน code ง่ายๆ แบบนี้

var connect = require('connect');

connect.createServer(
    connect.static("../angularjs")
).listen(5000);

แต่แล้วพอ run มันก็จะ error ประมาณนี้

TypeError: Object function createServer()
...
...
...
has no method 'static'

ซึ่งนั่นก็เป็นเพราะว่า ผู้เขียนใช้ module connect version 2.x แต่ในปัจจุบันเป็น 3.x แล้ว ตามรายละเอียดในนี้ https://github.com/senchalabs/connect/blob/master/History.md

ซึ่งเราก็แก้ปัญหาง่ายๆ ได้ด้วยการ install version 2.xx ซะ ด้วย

npm install connect@2.25.0

 

หรือไม่ก็เขียนไฟล์ server.js ขึ้นมาใหม่โดยเรียนใช้ module  serve-static ด้วย ดังนี้

var connect = require('connect');
var serveStatic = require('serve-static');

var app = connect();

app.use(serveStatic('../angularjs'));
app.listen(5000);