Hike News
Hike News

Docker Part 4 - Inside Docker

ลองเข้าไปใน Container

จากตอนก่อนๆเราสร้างตัว Container ขึ้นมามากมายหลายตัว คราวนี้หลายคนคงเกิดข้อสงสัยขึ้นมาว่า เฮ้ยจะเข้าไปดูในเครื่อง Container ยังไง เป็นไปได้ไหม ซึ่งคำตอบก็คือได้ เรามาลองกันเลยครับ

EXEC เข้าเครื่องกัน

1
2
3
4
5
6
7
8
9
10
11
# สร้างเครื่อง docker
docker run -d --name my-httpd -p 80:80 httpd

# ลองเข้าเครื่อง container ด้วยคำสั่งนี้

docker exec -ti my-httpd bash

# exec เป็นคำสั่งที่สั่งให้ run คำสั่งที่อยู่ใน container จากตัวอย่างคือสั่งใช้งานคำสั่ง bash
# -t อันนี้เป็น options ที่ทำการสร้าง tty มองว่าทำให้เราสามารถพิมพ์และแสดงผลแบบ shell ได้
# -i อันนี้เป็น options ให้ทำให้เราเปิด std in ค้างไว้รอ แม้จะไม่ส่งอะไรเข้าไปก็ตาม

ซึ่งพอ run คำสั่งด้านบนแล้วเราจะเข้าใน container นั้นแล้วดังภาพ

คราวนี้ลองกดคำสั่งต่างๆใน container ได้เลยครับ เช่น ls , clear และอื่นๆ จะเห็นว่าคำสั่งพื้นฐานของ Linux ได้ คราวนี้ลองคำสั่งพวก vi ดูครับ ซึ่งพอลองแล้วจะเห็นว่าใช้งานไม่ได้ครับ หรือลองพิมพ์คำสั่ง java ดูก็จะพบว่าใช้งานไม่ได้

สร้าง container ขึ้นมาอีกตัว

1
2
3
4
5
6
7
8
9
10
11
12

docker run -ti --name maven maven bash

# bash ตัวท้ายสุดในคำสั่ง docker run มีควาหมมายว่า เราจะ run คำสั่งอะไรใน container นี้ โดยจากตัวอย่างเราสั่งใช้งานคำสั่ง bash
# จริงๆตรงนี้ไม่ได้หมายความว่าส่งคำสั่งเข้าไปอย่างเดียวนะครับ มันมีเงื่อนไขของมันเดี่ยวอธิบายในบทที่เราสร้าง image กัน

docker exec -ti maven bash

# ลองพิพม์

java

จากการทดลองด้านบนเราจะเห็นว่ากับ container นี้เราสามารถใช้คำสั่ง java ได้ จากการทดลองนี้ทำให้เราทราบแล้วว่า container แต่ละตัวนั้นมีคำสั่งไม่เท่ากัน อันนี้เป็นผลมาจากเขาสร้าง image เพื่อใช้ในงานต่างกัน เช่น image httpd นั้นเป็น apache ก็ไม่จำเป็นต้องลง java เช่นกัน maven มีไว้ compile java ก็ไม่จำเป็นต้องมี httpd คำสั่งอย่างพวก vi ก็เช่นกันว่าไม่ต้องมีเพราะ container มีไว้ application ไม่มีใครเข้าไปใช้งาน vi อยู่แล้ว

ทำไมต้องลองเข้าไปใน container

จริงๆเราไม่ต้องเข้าไปใน container เลยก็ได้ครับ แต่เพื่อความเข้าใจ Image ที่เขาแจกว่าข้างในมีอะไรบ้าง หรืออยากไปดู config ของเครื่อง หรือตรวจสอบ image ของเราว่าสร้างได้ผลลัพธ์อย่างที่เราต้องการ แต่ที่ใช้งานบ่อยจริงๆคือเข้าไปดู config เช่น เข้าไปดู config ของ httpd ว่าเขาวางไว้ตรงไหน ตั้งค่าไว้ยังไงเป็นต้น เพราะเวลาเราต้องการเอา image ของเขาไป customize ต่อจะได้รู้ว่าต้อง customize ตรงไหน

แก้ไขไฟล์ใน container ไม่ได้ทำยังไง

ลงคำสั่งใน Container สิครับ

ก็อย่างที่บอกไปครับว่า container มันก็คือเครื่องจำลองนั่นแหละครับ ถ้าอยากมี vi ก็ install vi มันเลยสิ แต่การลงก็อาจจะยากหน่อยนะครับ เพราะเราต้องทราบด้วยว่า container ทีเราใช้อยู่เนี่ยเป็น distro ไหนของ linux เพราะแต่ละ distro นั้นลงไม่เหมือนกัน ถ้าเป็น ubuntu ก็ใช้ apt-get install vi แต่ถ้าเป็น CentOS จะต้องใช้ yum install เป็นต้น

1
2
3
4
5
6
7
8
9
10
11
12
13
# ลง vim บน httpd
# ขอ ลง vim แทนละกัน ลง vi ไม่ได้

docker exec -ti my-httpd bash
apt-get update
apt-get install vim

vim /usr/local/apache2/htdocs/index.html

# path : /usr/local/apache2/htdocs/ เป็น path ที่ image httpd นี้ใช้เป็นที่เก็บไฟล์ที่จะให้บริการกับ client
# เวลาเรียกใช้งาน httpd โดยเราจะแก้ไฟล์ index.html ให้เป็นอย่างอื่น เพื่อตรวจสอบดูว่าเวลาแก้ไขไฟล์นี้แล้ว
# เวลาเรียกใช้งานมันจะเปลี่ยนไหม

เปิดมาได้หน้าตาแบบนี้

ทำการแก้เป็นแบบนี้

ลองเข้าผ่าน web browser ดู (ตอนผมสั่ง สร้าง docker ตัวนี้ผม bind port 80 ไว้กับเครื่องที่ลง docker เครื่องที่ผมลง docker อยู่ที่ 192.168.56.101)

เอาไฟล์จาก container ออกมาแก้ไข แล้วค่อยส่งกลับเข้าไป

จากวิธีการ Install คำสั่งในเครื่อง container ดูยุ่งยากพอสมควร docker เลยมีช่องทางให้เราสามารถเอาไฟล์จาก container ออกมาได้ และ ทำให้สามารถส่งกลับไปได้ด้วย ซึ่งใช้คำสั่ง

1
2
3
4
5
6
7
8
# เอาไฟล์ index.html ออกมาจาก container
docker cp my-httpd:/usr/local/apache2/htdocs/index.html .

# docker cp เป็นคำสั่ง copy file จาก source ไปหา destiantion ว่าง่ายๆ เหมือน cp เลยแหละ โดยจะเอาเข้าหรือเอาออกจาก
# container ให้ดูที่ : อยู่กับตัวไหนตัวนั้นหมายถึง container โดยจากตัวอย่างข้างบนหมายถึง
# เอาไฟล์ที่ path : /usr/local/apache2/htdocs/index.html
# บน container my-httpd ออกมาไว้ที่ current directory ของเครื่องที่ลง Docker

จากนั้นลองเอาไฟล์ออกมาแก้ไขไฟล์ แล้วใส่กลับเข้าไปด้วยคำสั่ง

1
2
3
4
docker cp /your/file/path/index.html  my-httpd:/usr/local/apache2/htdocs/index.html 

# คำสั่งนี้เป็นการ copy file จากเครื่องที่ลง docker ไปวางที่ /usr/local/apache2/htdocs/index.html ของ container my-httpd

จากนั้นลอง Test กับ Browser

Mount ไม่ได้เหรอ

จริงๆมีอีกวิธีที่ทำได้นะครับคือการใช้ Mount volume ( -v ตอนสั่ง docker run) แต่วิธีนี้จะใช้ไม่ได้เมื่อเรา mount volume เข้าไปใน path ที่มี file อยู่แล้วของ container ซึ่งเมื่อทำแบบนั้นข้อมูลใน path นั้นจะหายไป ตัวอย่างเช่น

1
docker run --name no_mount_httpd -p 80:80 httpd

จากนั้นลองเข้าดูผ่าน Browser จะได้แบบนี้

จากนั้นทำการ stop no_mount_httpd จากนั้นสั่งคำสั่งต่อไปนี้

1
2
3
4
mkdir -p /root/share_docker/test_mount_httpd
docker run --name mount_httpd -p 80:80 -v /root/share_docker/test_mount_httpd:/usr/local/apache2/htdocs/ httpd

# Mount ไปที่ /usr/local/apache2/htdocs/ เพราะ image httpd เขากำหนดให้ path นี้เป็น path จะไว้เก็บไฟล์ไว้ให้ Httpd serve ไฟล์ให้ client ใช้งาน

จากน้ันทำการเปิด Browser

จะเห็นว่ามีความเปลี่ยนแปลงซึ่งเมื่อเราลอง exec เข้าไปในเครื่องจะเห็นว่าไฟล์ index.html หายเพราะว่าเราทำการ mount /root/share_docker/test_mount_httpd ซึ่งเป็น Directory เปล่าๆเข้าไป map กับ path /usr/local/apache2/htdocs/ จึงทำให้ไฟล์ index.html หายไป จากการทดลองนี้ทำให้เราทราบว่า “เมื่อเรา mount volume อะไรเข้าไปใน container ตอนสั่ง docker run มันจะยึดข้อมูลที่อยู่บนเครื่องที่ลง Docker เป็นหลัก” อย่างในตัวอย่างมันจะยึดข้อมูลที่อยู่ใน /root/share_docker/test_mount_httpd ซึ่งไม่มีข้อมูลอะไรเลยเป็นหลัก

Container ถ้าลบแล้วก็หายไปเลย

ขอให้พึงระลึกไว้เสมอว่า Container ก็เหมือนเครื่องจำลองขึ้นมา เมื่อใดก็ตามที่เราสั่ง docker rm สั่งลบ Container นั้นไป ข้อมูลทั้งหมดที่อยู่ใน Container นั้นจะหายไป (ยกเว้นส่วนที่เราทำการ Mount volume ไว้) ดังนั้นเมื่อคุณแก้อะไรใน Container หรือเพิ่มอะไรเข้าไปใน Container เมื่อคุณลบมันแล้วสร้างมาใหม่ Container ที่สร้างมาใหม่จะไม่มีอะไรที่คุณแก้ไขไว้ใน Container เดิมนะครับ

สรุป

ในตอนนี้เรามาเริ่มเข้าไปใน Container เพื่อดูว่าในเครื่อง container นั้นมีอะไรอยู่บ้าง แล้วเราสามารถแก้ไขอะไรใน Container ได้บ้าง แก้ไขได้ด้วยวิธีใดบ้าง ข้อจำกัดบางประการของการแก้ไข ส่วนตอนต่อไปขอคิดก่อนละกันว่าจะทำ Docker Image หรือลองใช้ Docker compose ดี

โปรโมท Page

ผมทำ Page บน Facebook แล้วนะครับ ใครสนใจรับการแจ้งเตือนเวลาผมอัพเดท Blog ก็ไปกดติดตามกันได้ครับ กดตามลิ้งไปได้เลย Facebook page

ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล

เช่นเดียวกับตอนที่แล้วอาจจะมีคนสงสัยว่า PIN กับ MARY คือใคร กดตามลิ้งค์ไปได้เลย น้องน่ารักมากๆครับ

Pin

Pin

Mary

Mary

Docker Part 3 - Use Docker

ใช้งาน Docker กับการพัฒนา Application

จากตอนที่แล้วได้ทดลองใช้ Docker เบื้องต้นไม่ว่าจะเป็นการสร้าง การเปิด Bind port ตอนนี้เราจะมาใช้ Docker กับการพัฒนา Application ให้มากขึ้นเพื่อให้เห็นภาพว่า Docker มีประโยชน์อะไรในการพัฒนา ซึ่งหลายๆคนตอนแรกที่อ่านเรื่อง Docker แล้วมีการบรรยายสรรพคุณต่างๆนาๆก็จะไม่ค่อยเห็นภาพ ตอนนี้เราจะค่อยๆเห็นภาพนั้นกันครับ

ใช้ Docker สร้าง Database กัน

1
2
3
4
docker run --name my_db -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306  mysql:5.7

# -e คือการตั้งค่า ENVIRONMENT ให้กับ Docker ตัวนั้น โดยในตัวอย่างเป็นการตั้งค่า ENVIRONMENT ชื่อ MYSQL_ROOT_PASSWORD ให้มีค่าเท่ากับ root ในส่วนนี้จะอธิบายต่อในภายหลัง

เมื่อ Run คำสั่งลองใช้ Tools ที่ใช้ในการเข้าใช้งาน Database เข้าไปใช้งานตัว Database กัน โดยของผมจะใช้เป็นตัว mysql query browser โดย user pass ของ docker ตัวนี้คือ

1
2
username : root
password : root

ส่วน Host ก็ตามเครื่องที่ท่านลง Docker ไว้เลยครับ โดยของผมจะเป็น 192.168.56.101 หลัง Login เข้าไปใช้งานแล้วจะได้ดังภาพ

จะเห็นว่าเราสามารถสร้าง Database server มาใช้งานง่ายเพียงแค่ 1 คำสั่งของ Docker ซึ่งง่ายกว่าที่เราต้อง Download ตัว Database server มาลงที่เครื่องเอง ซึ่งบางทีเราพัฒนาหลาย Application แต่ละตัวใช้ database version ไม่เหมือนกันเช่น บาง App ใช้ Database : MYSQL5.7 บางตัวใช้ version 8 ซึ่งเป็นการยากมากที่เราจะลง Database server หลายๆ version ในเครื่องเดียว

Environment

ในส่วนตอนสร้าง container mysql นั้นจะมีการใส่ Parameter -e ที่ผมบอกว่าคือ Environment ไอตัว Environment มันคือค่าที่ถูก Set ให้กับตัว OS ครับ ซึ่งพอเรา Set แล้วตัว Environment ไปแล้ว ตัว Application สามารถดึงค่า Environment มาใช้งานได้ครับ

เราพักเรื่อง Environment แล้วมาดูที่ Image กัน จะเห็นว่าตัวเราสามารถเอาตัว Image mysql มาสร้างเป็น Container ใช่ไหมครับ ตอนแรกมันก็ไม่ค่อยมีอะไร ต่อมาก็เริ่มมีคำถามขึ้นมาว่า อยากได้ password ของ mysql ที่ไม่ใช่ default อะ อยากตั้งเป็น password อื่น จะทำยังไง

ถ้าเรามองว่า Image คือ Function ที่เอาไว้สร้างเครื่องตามที่เรากำหนดไว้ ถ้าเราอยากให้สร้างเครื่องที่ลง Mysql ที่มี password ไม่เหมือนกัน เราก็แค่สร้าง function parameter ขึ้นมาเพื่อส่ง password ทีแตกต่างเข้าไป ดังนั้น function parameter ที่เราจะ set ให้เครื่องก็คือ Environment นั่นเอง ตัวอย่าง mysql มี Environment ชื่อ MYSQL_ROOT_PASSWORD เพื่อกำหนด password ให้ user root ดังนั้นถ้าอยาก Customize อะไรบางอย่างของ Image ลองดูที่ Page ของคนที่ทำ Image นะครับว่าเขามี ENVIRONMENT อะไรให้เรา Customize ได้บ้าง อย่างเช่น Mysql และเช่นกัน เมื่อคุณทำการสร้าง Image ก็ควรทำให้มันสามารถ Customize ได้ เช่น Endpoint ของ service ที่จะติดต่อ Endpoint ของ Database เป็นต้น

Dev บน Docker กัน

ปัญหาที่เรามักเจอกันบ่อยๆเวลา Dev คือ เราไม่ได้ Dev บนเครื่องจริงครับ ตัวอย่างเช่น เรา Dev บน PHP Version 5.3 แต่ PROD เป็น Version 5.7 หรือ Enable module ต่างๆไม่เท่ากันก็มักจะเกิดเหตุการณ์เช่น Run บน Dev ได้ แต่ Run บน PROD ไม่ได้ เนื่องจากปัญหาเหล่านี้เลยมีคนคิดวิธีแก้ปัญหามาหลายอย่าง Docker ก็เป็นหนึ่งในนั้นคือ ทำการสร้าง Image แล้วก็ นำ Image นั้นไป Deploy เป็น Container แล้ว Run ที่ไหนก็ได้ที่ลง Docker ดังนั้นมันก็เป็นการการันตีว่า Application ของเรา Run ได้แน่นอน เพราะเรา Dev ด้วยเครื่องจำลองที่เรากำหนด ดังนั้น Dev กับ Prod ย่อมเหมือนกัน

สร้าง Directory ขึ้นมาสักที่นึงในเครื่องที่ลง Docker ของคุณครับ ของผมสร้างที่ /root/share_docker/dev_docker

1
2
3
4
5
6
7
8
9
10
docker run --name dev_docker -d -p 80:80  -v /path/to/directory:/var/www/html/ php:5.6-apache

# ของผมจะเป็น

docker run --name dev_docker -d -p 80:80 -v /root/share_docker/dev_docker:/var/www/html/ php:5.6-apache

# -v คือการ Mount volume ของเครื่องที่ลง docker ให้ไปโผล่บนเครื่องจำลองที่เราสร้างขึ้นมา คล้ายๆทำ share drive กันครับ โดย
# หน้า : คือ Path ในเครื่องที่ลง Docker ที่เราอยากจะให้ไปโผล่ใน Container ของผมคือ /root/share_docker/dev_docker
# หลัง : คือ Path ของเครื่องจำลอง ( container ) ที่เราจะ map เข้ากับ path ที่อยู่หน้า :

จากนั้นลองสร้างไฟล์ index.php ใน directory ที่เรา map เข้ากับ container ครับ จากนั้นในไฟล์เขียน code ประมาณนี้ลงไป

1
2
3
<?php 
echo "HELLO WORLD NICO";
?>

จากนั้นเข้า Browser ใส่ IP เครื่องที่ลง Docker ครับ (ของผมคือ 192.168.56.101) จะได้ดังภาพครับ

จากนั้นลองแก้ไขไฟล์ตัว Index.php เป็นอย่างอื่นตามใจครับ โดยของผมจะแก้เป็น

1
2
3
<?php 
echo "HELLO WORLD Kawjao MeltMallow";
?>

เมื่อเปิดบน Browser ใหม่ก็จะเห็นว่าข้อความเปลี่ยนไปดังภาพ

ด้วยวิธีการนี้เราสามารถพัฒนา Application ด้วยภาษา PHP โดยไม่ต้องลง PHP ที่เครื่องเลย อยากเขียน code อะไรก็แก้ใน Directory ที่เรา Mount volume เข้าไปใน Container

สรุป

ในตอนนี้เราได้เห็นวิธีการเอา Docker มาทำเป็น Database server เอา Docker มาใช้ในการพัฒนา PHP โดยที่เราไม่ต้องลง PHP ที่เครื่องเลย ซึ่งน่าจะเห็นภาพการเอา Docker มาใช้งานกับการ Develop Appllication และในตอนนี้ได้สอนการใช้งาน Environment และการ Mount volume ซึ่งต่อจากนี้เราจะเริ่มใช้ทั้งสองอย่างนี้บ่อยขึ้น ดังนั้นไปลองใช้งานให้คล่องนะครับ เช่น environment ของ mysql ก็ลองเปลี่ยน MYSQL_ROOT_PASSWORD เป็นค่าอื่นดู แล้วลอง Login เข้า mysql ดูว่ามันใช้ password ตามที่เราตั้งไหม หรือ Mount volume ก็ลองเปลียนตำแหน่ง Mount ดูว่าถ้าเปลี่ยนแล้วมันไปโผล่ใน Docker ไหม

โปรโมท Page

ผมทำ Page บน Facebook แล้วนะครับ ใครสนใจรับการแจ้งเตือนเวลาผมอัพเดท Blog ก็ไปกดติดตามกันได้ครับ กดตามลิ้งไปได้เลย Facebook page

ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล

สำหรับใครที่สงสัยว่า Nico กับ Kawjao MeltMallow คือใคร กดตามลิ้งรูปด้านล่างได้เลย

Nico

Nico

Kawjao

Kawjao

Docker Part 2 - Basic Docker

Docker ขั้นพื้นฐาน

หลังจากตอนที่แล้วสอนการลง Docker ไปแล้ว ตอนนี้มาเริ่มใช้งานกันดีกว่า ส่วนใครอยากทราบว่า Docker คืออะไร อันนี้สามารถตามอ่านได้จาก Net ทั่วไป เช่น ของคุณ Rachata Tongpagdee จริงๆเขาสอน Basic ทั้งหมดในนั้นแล้วด้วย ฮ๋าๆๆๆๆ สำหรับผมถ้าพูดง่ายๆมันคือการจำลองเครื่อง server ขึ้นมาให้เราใช้งาน โดยเครื่อง server นั้นเราสามารถกำหนด spec ให้มันได้ว่ามี program อะไร run อยู่ ทำงานอะไรได้บ้าง จริงๆมันก็คล้ายๆ VM นะ แต่อันนี้เบากว่าและเหมือนจะใช้งานง่ายกว่าด้วย

เริ่มใช้งานเบื้องต้น

docker ps

docker ps : เป็นคำสั่งแสดง Container (มองว่าเป็นเครื่องจำลองก็ได้ครับ) ที่เรา Run ไว้ในขณะนี้

1
docker ps 

ลองพิมพ์คำสั่งที่ command line, shell, terminal หรืออะไรที่ท่านอยากเรียก ซึ่งเมื่อ Run เสร็จจะได้ผลลัพธ์ดังภาพ หรืออาจไม่เหมือนถ้าท่าน Run docker container ไว้แล้ว หรือ ท่านไม่ได้ Start service docker (ลองสั่ง service docker start) อันนี้อยากให้ลองกดดูก่อนเพื่อจะได้รู้ว่า docker service มัน run อยู่รึเปล่า

docker run

docker run : เป็นคำสั่งสร้าง Container (มองว่าเป็นเครื่องจำลอง) ขึ้นมา

ลองใช้คำสั่งด้านล่างแล้วจากนั้นลองใช้คำสั่ง docker ps เพื่อดูว่ามี Container run ขึ้นมาอีก

1
2
3
4
5
6
7
8
docker run -d --name server_1 httpd

# -d คือ Option ของ docker run เพื่อให้คำสั่ง docker run มันคืน shell เพื่อให้เราสามารถทำอย่างอื่นได้ ถ้าใครสงสัยลองเอา -d ออกครับ มันจะกิน shell ของคุณ คุณจะทำอย่างอื่นไม่ได้ จนกว่าจะกด Ctrl + C ถึงจะออกมาได้ (กิน shell ศัพท์อย่างบ้านนอก)

# --name คือ คือ option ของ docker run เพื่อตั้งชื่อให้กับ Container โดยตัวอย่างจะตั้งชื่อให้ว่า server_1 โดยหากเราไม่กำหนดชื่อให้มัน มันจะสุ่มตั้งชื่อให้ โดยชื่อตรงนี้ห้ามซ้ำ ถ้าซ้ำมันจะ Error ขึ้นมา

# httpd อันนี้เป็นชื่อ Image (ตัวต้นแบบที่เราจะเอามาสร้างเป็น Container)

จากการ Run docker ps เราจะเห็นข้อมูลที่เพิ่มขึ้นมาครับ โดยแต่ละ Column จะอธิบายเกี่ยวกับ Container ที่ Run อยู่ดังต่อไปนี้

  • CONTAINER ID

มันคือเลขที่ใช้อ้างอิงถึง Container ตัวนี้ เลขนี้มันจะ gen มาให้ ซึ่งการันตีว่าไม่ซ้ำ

  • IMAGE

เป็นตัวบอกว่า Container นี้สร้างมาจากต้นแบบอะไร จากตัวอย่างคือสร้างจากต้นแบบที่ชื่อ httpd (apache นั่นเอง)

  • COMMAND

บอกว่าตัว Container นี้ Run อยู่ด้วยคำสั่งอะไร

  • CREATED

บอกว่าตัว Container นี้ถูกสร้างมาแล้วนานเท่าไหร่

  • STATUS

บอกว่าตัว Container นั้นมีสถานะอะไรอยู่ในปัจจุบัน

  • PORTS

บอกว่าตัว Container มี Port อะไรให้เราสามารถเข้าไปใช้งานได้บ้าง

  • NAMES

บอกว่าตัว Container นี้มีชื่อว่าอะไร ใช้ไว้อ้างอิงแบบเดียวกันกับ Container ID แต่อันนี้ใช้อ้างอิงง่ายกว่า เพราะมันอ่านออก

สร้างมันขึ้นมาอีก

จากนั้นลองสร้าง container ขึ้นมาอีกตามคำสั่งต่อไปนี้

  • docker run -d –name server_1 httpd

คำสั่งนี้จะ Error ครับ พร้อมบอกว่าชื่อ server_1 มีคนใช้ไปแล้ว

  • docker run -d –name server_2 httpd

อันนี้สร้างขึ้นมาได้

ลองใช้ docker ps ดูอีกรอบคราวนี้จะเห็น container สร้างขึ้นมาสองตัวแล้ว

Stop , Start, Remove

เมื่อสร้าง Container มันคล้ายๆเครื่องจำลองดังนั้นมันก็ต้อง ปิด เปิด หรือ ทำลายได้เช่นกัน โดยคำสั่งจะมีประมาณนี้

  • docker stop : เป็นคำสั่งในการหยุดทำงาน Container แค่หยุดนะครับไม่ใช่ทำลาย โดยลองสั่งคำสั่งต่อไปนี้
1
2
3
4
docker stop server_1

# server_1 คือตัวอ้างอิงไปหา Container ตัวนั้น โดยมันอ้างอิงได้จาก ชื่อ หรือ Container ID ดูได้จาก

มันทำการสั่งเสร็จเราใช้ docker ps อีกครั้งจะเห็นว่า container 1 เราหายไป แต่ไม่ต้องตกใจมันหายไปเพราะ docker ps จะแสดงเฉพาะ Container ที่ทำงานอยู่ ถ้าอยากเห็นหมดต้องสั่ง

1
2
3
4
docker ps -a

# -a เป็น Parameter ในการ Show Container ทั้งหมด ไม่ว่าจะ Start อยู่หรือ Stop อยู่

  • docker start : เป็นคำสั่งที่สั่งให้ Container เริ่มทำงาน คำสั่งจะคล้ายๆกับ docker stop
1
docker start server_1

พอสั่งแล้วกด docker ps -a ดูอีกรอบจะเห็นว่า Container : server_1 เริ่มทำงานแล้ว

  • docker rm : เป็นคำสั่งทำลาย Container
1
docker rm server_1

พอสั่งแล้วมันจะ Error ครับ เพราะ Container : server_1 มันยัง Run อยู่ครับ ให้ลองสั่ง

1
2
3
4
5
6
7
8
9
docker stop server_1
docker rm server_1

# หรือลองสั่ง

docker rm -f server_1

# -f คือ parameter เพื่อสั่งให้ลบ container โดยไม่สนว่ามันจะ start อยู่หรือไม่

อ่านมาตั้งนานไม่เห็นได้ลองใช้งานเลย สร้างขึ้นมาทำไม

จริงๆตอนเราสร้าง Container ขึ้นมาคือมันใช้งานได้แล้วล่ะครับ สภาพมันจะเป็นตามภาพ

แต่ที่เราใช้ไม่ได้เพราะเราไม่รู้ว่าเครื่องมันอยู่ตรงไหนครับ (IP Adress) คือเรารู้ที่อยู่เครื่อง Machine ที่เราลงอยู่ครับแต่เราไม่รู้ว่า Container อยู่ตรงไหน ซึ่งจริงๆเรารู้ครับแต่จากการที่เราอยู่นอกวงที่ติดต่อได้ อยู่ Net คนละวง ด้วยความยุ่งยากประมาณนี้ Docker เลยช่วยเราโดยการใช้วิธี Bind port ให้ครับ

มายกตัวอย่างกันตอนนี้ผมสร้าง Container ขึ้นมาตัวนึงชื่อ my_http_server โดยใช้คำสั่ง

1
docker run -d --name my_server httpd

จากการ Run เราจะได้สถานการณ์ประมาณนี้

หลายคนคงบอกว่าเฮ้ยรู้ได้ไงว่า Container เปิด Port 80 สามารถดูได้หลายที่ครับ ที่แรกคือ สั่ง docker ps ครับ หรือเปิด Manual ของ Image ที่เราเอามาใช้ครับ เช่นของผมจะไปอ่านว่าเขาเปิด Port ไหนที่ Link นี้ หรือ มันเป็นเรื่องที่โดยทั่วไปในวงการเช่น httpd เขาก็เปิด 80 อยู่แล้ว อันนี้อาจโหดร้ายกับน้องใหม่ แต่เขาคิดว่ามันธรรมดามากๆจนไม่เขียน แต่ทุกวงการมีเรื่องอย่างนี้หมดครับ อย่าไปใส่ใจมันมาก พออยู่ในวงการไปสักพักจะค่อยๆรู้เอง อย่างวงการไอดอลเขามีขาย “เซกิ” ฟังครั้งแรกนี่งงเลยดิ ฮ่าๆๆๆ

คราวนี้จากภาพเราจะเห็นว่าเรารู้แต่ IP เครื่องที่ลง Docker แต่เราอยากติดต่อเครื่อง Container ที่อยู่ภายในเครื่องนั้นตัว Docker ก็แบบให้เราสามารถทำได้ง่ายๆโดยใช้วิธี Bind port โดยใช้คำสั่ง

1
2
3
4
5
6
7
8
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 80:80 httpd

# -p คือ parameter ในการ Bind port โดยในตัวอย่างคือ -p 80:80
# โดย 80 หน้า : หมายถึง port 80 ของเครื่องหลัก
# โดย 80 หลัง : หมายถึง port 80 ของเครื่อง Container

โดยสถานการณ์จากการ run คำสั่งด้านบนจะเป็นดังภาพ คือเครื่อง Machine ทำการ ผูก Port 80 เข้าหากัน

เมื่อเรา Run แล้วลองเข้า Browser แล้วใส่ ip ของเครื่องหลักครับ (กรณีของผมเครื่องหลักอยู่ที่ 192.168.56.101) เราจะได้ผลลัพธ์ดังภาพ

เพื่อความเข้าใจที่มากขึ้นลองทำการ Bind port เครื่องหลักที่ไม่ใช่ 80 ดูกัน

1
2
3
4
# กรุณาลบ Container my_server ทิ้งก่อนแล้วค่อยสั่ง

docker run -d --name my_server -p 8080:80 httpd

แล้วลองเข้า Browswer แล้วกรอก ip ตามด้วย : port จากตัวอย่างของผมจะเป็น 192.168.56.101:8080

สรุป

ในตอนนี้ผมได้แนะนำวิธีการใช้ docker แบบเบื้องต้นมากๆ ตั้งแต่ Create , Start , Stop, Remove แล้วก็ Bind port ให้สามารถใช้งาน container ผ่านทางเครื่องหลักได้ ในตอนต่อๆไปจะค่อยๆสอนใช้ Docker ไปเรื่อยๆ โดยแนะนำตามที่ผมค่อยๆเรียนรู้และนำไปใช้งานกับงาน สำหรับคนผ่านมาอ่านตอนนี้ผมเปิด Page Facebook แล้วนะครับ ใครเล่น Facebook แล้วอยากได้แจ้งเตือนตอน Update blog ไปกดติดตามกันได้ครับ

เพลงประกอบการเขียน Blog

เพลงเพราะๆของพี่แอน ธิติมา คือฟังเพลงพี่เขามาตั้งแต่เด็กๆ เสียงพี่เขานี่ดึงอารมณ์เพลงได้สุดยอดมากจริงๆ เพลงใสๆหวานๆนี่จะฟินโคตรๆ แต่เพลงเศร้านี่ฟังแล้วดำดิ่งกันสุดๆ

Docker Part 1 - เริ่มใช้งาน Docker โดยใช้ VM

เริ่มใช้ Docker บน VM กัน

ตอนแรกว่าจะไม่เขียนเรื่องนี้เพราะมี Tools มากมายไม่ว่าจะเป็น Docker for windows อันนี้ Window ต้องเป็น Lincense Pro หรือ Enterprise ถึงจะใช้ได้ หรือ Docker tools boxs ก็ดีสร้าง vm ขึ้นมาหลายตัวได้ ทำ cluster ก็ได้ ว่าง่ายๆมันคือ docker machine นั่นแหละ ซึ่งเป็น 2 ทางเลือกที่โอเคเลย

แต่จากการลองทำงานที่ทำงานหลายคนลง Docker for windows ไม่ได้เพราะไม่มี License Pro หรือ Enterprise ส่วน Docker toolsbox ก็มีปัญหาเรื่อง Binding volume ซึ่งมันมีวิธีการ Binding volume ตาม Link นี้ ซึ่งทำไปทำมามันดูวุ่นๆเลยเอาวะ ลงแบบโบราณไปเลยดีกว่า ลง VM แล้วใช้งานมันบน VM นั่นแหละ ให้ Docker มันอยู่ใน VM เวลาใช้ Command อะไรก็เหมือน Linux ไปเลย (command ในที่นี้หมายถึง command เวลาใช้งานเครื่อง Server)

Install Program กัน

Install VirtualBox

Download program virtual box เลือกตัว Platform แล้วกด Download ลงมาเลย

สร้างเครื่อง Guest

คือ Virtualbox มันเป็น Program ให้เราสร้าง Virtaul machine ขึ้นมาเป็นเครื่อง Guest (เครื่องที่สร้างเป็น VM จะเรียว่าว่า Guest ) ส่วนเครื่องที่เราใช้งานอยู่ในปัจจุบัน (ตอนนี้คือ Windows ) จะเรียกว่าเครื่อง Host ว่าง่ายๆ เครื่องจริงเป็น Host เครื่องปลอมเป็น Guest ส่วนวิธีสร้างเครื่อง Guest สามารถหาดูได้ตาม Youtube หรือ Blog ทั่วไปได้เลย

อันนี้สอนลงง่ายๆ กดตามไปเลย

ส่วนใครขี้เกียจลงเอง ผมมีสร้างตัว VM แบบพร้อมใช้งานแล้ว คุณสามารถโหลดได้ที่ Link นี้ แล้วแตก zip แล้วกด Double click เข้าใช้งานตัว VM ได้เลย

โดยเครื่อง Guest ที่ผมลงจะเป็น CentOS7 (ตอนนี้มี 8 แล้วนะแต่ลงไม่เป็น ฮ่าๆๆๆๆ)

พอลงเสร็จแล้วให้ลองใช้ตัว Interface ของ VM (ตัวนี้เปรียบเสมือนกับเครื่อง Guest นั้นจริงๆที่ต่อ Keyboard กับ จอให้เราใช้งาน เราสามารถ Login เข้าใช้งานเครื่องนี้ได้โดยเครื่องนี้ไม่ได้ต่อกับ Net วงไหน ) ทำการ Login เข้าไปใช้งานเครื่องดูครับ โดย username password ตามที่คุณตั้งกันเลย ถ้าของผมจะเป็น

  • user: root
  • pass : root

ทำการ Setting Network

คือเครื่อง Guest ก็เหมือนเครื่องจริงๆเครื่องนึงดังนั้นมันสามารถต่อเข้า Network ได้ โดยอันนี้เราจะสร้างให้เครื่องนี้มี 2 Interface ครับ สำหรับคนที่ใช้เครื่องของผมอันนี้ผม Set ให้หมดแล้วครับ แต่ดูวิธี set ไว้ก็ดีครับ เพราะยังไงในอนาคตถ้าต้องการปรับแต่งอย่างอื่นเพิ่มเติมก็สามารถทำได้เอง

  • NAT อันนี้ไว้ต่อ Internet จริงๆ

  • Host Only อันนี้มีไว้ต่อกับเครื่องจริงของเรา มีไว้คุยกันภายใน

โดยมีวิธี Setting คือ คลิกขวาที่ตัวเครื่องแล้วเลือก Setting ตามภาพ

จากภาพเรา Set Host only ไว้ที่ interface หนึ่ง

และ interface 2 เรา set ให้เป็น NAT

Putty เข้าใช้งานเครื่อง Guest

ปกติเครื่อง Server ส่วนใหญ่เขาจะเปิดให้เรา Remote เข้าไปใช้งานโดยโหมดที่เขาให้เราเข้าไปใช้งานส่วนใหญ่จะเป็น Command line บางคนเวลา Remote เข้าไปใช้งานก็จะเรียก shell เข้าไป บางคนอยู่หน้า Command line บางคนเรียก shell บางคนเรียก cmd บางคนเรียก Terminal ซึ่งหลากหลายมาก แต่ผมเรียกปนๆไปนะ ช่างมันเถอะ ฮ่าๆๆๆๆ

ถึงตาพระเอกของ ### นี้ (มุกการจัด Header ในไฟล์ MD ) คือ Putty โดย Download ตัวใช้งานที่เป็น Client

ก็สำหรับใครที่ใช้ VM ของผมนะครับ IP Address ถ้าลงใหม่ๆเลยจะเป็น

  • ip : 192.168.56.101
  • user : root
  • pass : root

ส่วนคนอื่นที่ลงเองหรือก็ต้องไปดูที่ IP ครับ โดยมีวิธีดูโดย Login เข้าไปในเครื่อง (โดยใช้ interface ของ Virtual box ) แล้วใช้คำสั่ง

  • ip addr : จะเห็น IP ของเครื่อง ตามภาพ

จากภาพจะเห็นว่า ip ของเครื่องคือ 192.168.56.101 ครับ โดยตรงนี้หลายคนอาจสงสัยว่ารู้ได้ไงว่าใช้ net วงนี้วะ จริงเราสามารถดูได้ว่าเราจะใช้วงไหนโดยการดูที่

จะเห็นว่า HostOnly Adapter ที่ผม Set ไว้มันมีวงเป็น 192.168.56.x/24 เพราะอย่างนี้ผมเลยรู้ว่าเครื่อง VM เครื่องนี้มี ip เป็น 192.168.56.101 ส่วนของใครมี ip เป็นอะไรก็ไปดูได้ตามที่บอกครับ

โดยถ้า Putty เข้าเครื่องสำเร็จเราจะสามารถใช้งาน command line ผ่านตัว putty ได้เลย โดยถ้าใครถามว่าทำไมใช้ putty ไม่ใช้ interface ของ Virtual box ล่ะ คำตอบคือ putty มัน copy / parse ได้เลยโดยลากแล้วคลิกขวาวางได้เลย ในส่วนของ vm interface มันใช้ยากกว่า ผมเลยแนะนำให้ใช้ putty ครับ

ทำการเชื่อม Volume ระหว่างเครื่อง Host กับ Guest

ปัญหาหนึ่งในการใช้ VM (สำหรับ Developer) คือ เวลาเราแก้ Code อะไรในเครื่องจริง เราอยากให้มันถูกแก้บนเครื่อง VM ด้วย โดยวิธีแก้คือแก้บนเครื่องจริง แล้วใช้ FileZilla ไปวางทับอีกที ซึ่งวุ่นวาย ตัว VirtualBox เขาเลยทำวิธีการ ShareFolder ครับ โดยมีวิธีการทำดังนี้

Install addtion guest

สำหรับคนลงเองต้องลงส่วนเสริมเกี่ยวกับการ Share folder ก่อน สำหรับคนที่ใช้ VM ผมไม่ต้องทำ step install adition guest นี้ครับ โดยสามารถทำตาม Link นี้

ทำการ Set ShareFolder

เมื่อทำการลงเสร็จให้ปิดเครื่อง Guest แล้วมา Setting การ Share folder ระหว่างเครื่อง Guest กับ Host ดังภาพ

โดยในส่วน Folder path : เราเลือกเอาเลยครับว่าจะgเอา Folder ไหนที่เราอยากจะให้เห็นทั้งเครื่อง Host และ เครื่อง Guest ส่วน Folder name และ Mount point ตั้งชื่อตามสะดวกครับ ของผมตั้งไว้ชื่อ share_docker และเลือก option ตามภาพ กด Accept

จากนั้นเปิดเครื่อง Guest แล้วเข้าไปสร้าง Folder ในเครื่อง Guest ใน Path ที่อยาก share ของผมอยาก share ที่ Path : /root/share_docker

1
2
mkdir /root/share_docker
chmod -R 0777 /root/share_docker

จากนั้นใช้คำสั่ง cat /etc/passwd เข้าไปจดเลขตามที่วงแดงไว้ โดยจากภาพเลขที่ต้องจดคือ 997

จากนั้นใช้คำสั่ง cat /etc/group เข้าไปจดเลขตามที่วงแดงไว้ โดยจากภาพเลขที่ต้องจดคือ 995

จากนั้นใช้คำสั่ง

1
mount -t vboxsf share_folder_name -o rw,dmode=777,gid=xxx,uid=xxx /guest/path/to/share

โดยตรงตัวแปร

  • share_folder_name คือชื่อ share_folder ที่เราตั้งที่ VirtualBox
  • gid ให้เอาค่าที่จดจากการอ่านไฟล์ /etc/group มาใส่
  • uid ให้เอาค่าที่จดจากการอ่านไฟล์ /etc/passwd มาใส่
  • /guest/path/to/share คือ path ที่จะ share ในเครื่อง guest

โดยจากตัวอย่างจะได้เป็น

1
mount -t vboxsf share_docker -o rw,dmode=777,gid=995,uid=997 /root/share_docker

จากนั้นทำการลองสร้างไฟล์ใน folder ที่เราทำการ mount ครับ โดยจะเห็นไฟล์ในเครื่องจริงกับ VM นั้นเหมือนกันเลย

สั่งให้ทำการ Mount ทุกครั้งที่ Login เข้าใช้งานเครื่อง

จากขั้นตอนที่แล้วเราสั่งให้ทำการ share folder (mount) ระหว่างเครื่อง host และเครื่อง guest แล้ว แต่ทุกครั้งที่ปิดเครื่อง เวลาเรา Login เข้ามาใหม่ เราต้องทำการสั่งคำสั่งนี้ทุกครั้ง ดังนั้นเพื่อให้สะดวกเราจะฝัง script นี้ให้ทำงานทุกครั้งที่เรา login โดยทำได้โดยใช้เข้าไปแก้ไขไฟล์ ~/.bashrc โดยใช้คำสั่ง

1
echo "mount -t vboxsf share_docker -o rw,dmode=777,gid=995,uid=997 /root/share_docker" >> ~/.bashrc

อย่าลืมเปลี่ยนพวกตัวแปรให้ตรงกับสิ่งที่คุณต้องการ จากนั้น restart เครื่องแล้วลองเช็คดูครับว่าสามารถทำงานได้ไหม

ทำการ Install docker

วิธีการ Install docker นั้นมี manual อยู่ที่ เว็บหลัก ของ docker แล้ว แต่มีอีกวิธีนึงที่ง่ายมากสามารถทำตามโดย copy วางแล้วไม่ค่อยมีปัญหาคือใช้วิธีตาม เว็บนี้

ซึ่งพอทำตามเสร็จให้สั่ง Restart เครื่อง Guest จากนั้นเข้าเครื่อง guest login เข้าไป จากนั้นสั่ง

1
systemctl enable docker

จากนั้นสั่ง restart อีกครั้ง

ทดสอบการใช้งาน Docker

ทดลองใช้คำสั่ง

1
docker run --rm  -p 80:80 nginx

จากนั้นเปิด Browser ที่เครื่อง Host พิมพ์ Ip ของเครื่อง Guest โดยของผมจะเป็น 192.168.56.101 ซึ่งถ้าเปิดได้ดังภาพแสดงว่าคุณลง docker สำเร็จแล้วครับ

สรุป

สำหรับตอนนี้เป็นตอนที่สอน Install ใช้งาน docker กับ Virtualbox ซึ่งเหมาะกับใครที่ชอบเล่นท่ายาก หรืออยาก customize อะไรเอง ก็คงจะได้สมใจกันครับ ในตอนต่อๆไปผมจะคงจะมาสอนใช้ command ของ docker คร่าวๆแล้วก็การประยุกต์นำไปใช้งานครับ สำหรับตอนนี้ขอจบเท่านี้ครับ

เพลงประกอบการเขียน Blog

เพลง Cover ของน้อง Nico ฟังแล้วทำนองกับเสียงร้องของน้องเข้ากันได้ดี ไม่เคยฟังต้นฉบับเลย ฮ่าๆๆๆๆ

ความทรงจำปี 2019

ปี 2019 ที่ผ่านมา

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

ตามไอดอล

ไม่น่าเชื่อว่าคนที่ชอบบอกคนอื่นเสมอว่า “เฮ้ย เอาเงินไปเสียเงินกับไอดอลคิดดีแล้วเหรอวะ” ไม่คิดว่าการไปดูไอดอลกับเพื่อนครั้งนั้นทำให้ตามไอดอลกับเขาด้วย การตามไอดอลนี่ทำให้ได้ไปทำอะไรหลายๆอย่างนะ ไม่ว่าจะไปเซกิ ไป Fan meeting ไปดูคอนเสิร์ตวงไอดอล ไปกินข้าวปั้นฝีมือไอดอล แต่ถ้าถามว่าไปสุดไหมจริงๆก็ไม่สุดนะคือไม่ได้เชียร์ ยิงอะไรสักอย่างอย่างที่เขาทำกัน คือจะทำแล้วมันก็เขินอะนะ จริงๆก็กะตามน้องคนที่ชอบไปเรื่อยๆนะ งานไหนมีเวลาว่าง เงินพอมีก็จะไป แต่ตามได้แค่ครึ่งปีน้องป่วยจนเป็นไอดอลต่อไม่ได้ซึ่งทำให้ต้องกลับญี่ปุ่นก็เลยทำให้ไม่ได้ตามต่อ (จริงๆก็ตามต่อใน Facebook youtube แล้วตลกมากๆตรงเข้าไป comment น้องเขาคนเดียวใน Youtube บรรยากาศนี่อย่างเหงาเลย) ตอนนี้ก็ห่างหายไปละ มีไปตามวงที่ชอบที่เหลืออยู่บ้างแต่ไม่ได้เท่าตอนตามใหม่ๆละ

ไปสิงคโปร์

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

ไปโตเกียว

ไปดูภูเขาไฟฟูจิ

เป็นการไปญี่ปุ่นครั้งที่สองในชีวิตซึ่งครั้งนี้ไปเที่ยวที่โตเกียว โดยบรรยากาศเป็นเมืองไม่เหมือนรอบที่แล้วที่เป็นธรรมชาติ ถือว่าเป็นความประทับใจที่ได้ไปเห็นเมืองของประเทศที่หลายคนบอกว่าเป็นประเทศที่เจริญแล้ว สิ่งที่ทึ่งมากๆคือระบบรถไฟใต้ดินของเขาที่ตรงเวลาโคตรๆ คือบอกเลยว่าใช้ Google map แล้วเลือกว่าจะเดินทางไปไหนโดยใช้รถไฟใต้ดินนี่ไม่มีหลง คือแม่งเป๊ะมาก อีกเรื่องที่อยู่ในความทรงจำคงเป็นภูเขาไฟฟูจิ คือเราเห็นภูเขานี้ผ่านเกมส์ ผ่านการ์ตูน หนัง แต่เราไม่เคยเห็นของครั้งนี้พอได้มาเห็นของจริงก็ “อือ เหมือนในหนังเลยว่ะ” ก็ตลกดีที่เราไม่ว้าวแต่ก็ถ่ายรูปเก็บมาเยอะเหมือนกันเพราะคิดว่าคงไม่มีโอกาสได้ไปอีกแล้ว

หอคอยโตเกียว

อันนี้คล้ายๆภูเขาไฟฟูจิ เห็นตั้งแต่เด็ก พอมาเจอของจริงก็ “เหมือนในการ์ตูนเลยว่ะ”

งานแต่ง

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

กินข้าวที่ลานจอดรถ

อันนี้คืออีกหนึ่งความทรงจำคือไปซื้อของที่ร้านในวัดโคมแดงมากินแต่ไม่มีที่นั่งเว้ย คือแม่งไม่มีที่นั่งเลย จะยืนกินก็ยืนไม่ได้เพราะอาหารที่ซื้อมาหนักมากยืนกินมือเดียวไม่ได้ ก็เลยเดินหาที่นั่งจนมาเจอลานจอดรถเราก็เลย “กินแม่งตรงเนี้ยแหละ” ก็เลยนั่งกินอาหารที่ลานจอดรถ ที่พีคกว่านั่งกินที่ลานจอดรถคืออาหารแม่งเลี่ยนมาก เลี่ยนเหี้ยๆ เลี่ยนแบบ ไอสัดกินไปได้ยังไง กินไป 75% ก็ไม่ไหวละ ถ้ากินอีกอ้วกแน่นอนก็เลยทิ้งไป

บริษัทเริ่มเปลี่ยน

หลังจากเป็น Developer ปากหมามาได้นานพอสมควร ผ่านเรื่องน่าเบื่อหน่ายมามาก จนผู้ใหญ่มองว่าถ้าให้ทำตรงนี้ต่อน่าจะเละเป็นแน่แท้ (ฮ่าๆๆๆ) ทางผู้ใหญ่เลยให้ลองเปลี่ยนไปทำอย่างอื่นดู ประจวบเหมาะกับพี่ที่มีความรู้เกี่ยวกับระบบงานพวก CI และ GCP เข้ามาในบริษัท ก็เลยโดนมอบหมายให้ศึกษาและทำให้บริษัทเริ่มไปใช้เทคโนโลยีที่คนปัจจุบันกำลังใช้กัน คือพูดอย่างงี้หลายคนคงบอกว่าเชยจัง เขาใช้มากันจะ 4 -5 ปีแล้วซึ่งสมัยก่อนผมก็คิดอย่างงั้นแหละครับ แต่ถ้าคุณมาเจองานจริง มันมีข้อจำกัดหลายๆอย่างที่คนที่เขาดูแลระบบมาก่อนเขาเคยเจอ แล้วถ้าคุณจะใช้วิธีใหม่คุณก็ต้องหาวิธีแก้ปัญหาเก่าด้วยวิธีใหม่ของคุณให้ได้ก่อน ผมเห็นด้วยกับสิ่งที่หัวหน้าผมพูดว่า “ถ้าคุณไม่เข้าใจว่าปัญหาคืออะไรแล้วจะเครื่องมือใหม่หรือวิธีการใหม่ที่เข้ามามันช่วยแก้ปัญหานี้ยังไง การเปลี่ยนเครื่องมือหรือวิธีการก็ไม่ได้ช่วยอะไร” ก็ถือเป็นการทำงานที่หัวหมุนน่าดู ต้องหาในสิ่งที่ไม่รู้ ไม่รู้แบบเคว้งเลย ติดก็ต้อง Search หาเอาใน Google เจอแล้วก็ต้องเข้าใจว่ามันทำงานยังไง ไม่ใช่ Copy วาง จบปีอะไรก็ดูเป็นรูปเป็นร่างมากขึ้น อะไรที่เคยหวังจะเห็นตอนมาทำงานใหม่ๆก็ได้เห็น ปีหน้าคงมีอะไรที่ต้องศึกษาเพิ่มเติมอีกเยอะไม่ว่า Cloud platform ต่างๆ Framework ใหม่ๆ วิธีการ Design Application ในโลกจริง

ดูละครเวที + ดูละครเวที

จากปีที่แล้วที่เฮิร์ตแล้วไม่รู้จะทำอะไรเลยไปดูละครเวที พอมาปีนี้เลยกลายเป็นเห็นประกาศแสดงอะไรก็ไปดูทุกที (แต่ต้องเป็นแบบไม่เสียเงินนะถึงจะไป) ซึ่งการดูละครเวทีนี่ก็ทำให้เราเห็นว่านักแสดงมีผลกับละครหรือหนังยังไงนะ คือไปดูมาเรื่องนึง บทแม่งเหี้ยมากดูไปไม่รู้เรื่องเลยว่าจะสืออะไร แต่ตัวละครเล่นได้สมบทบามมากจนเราสนใจตัวละครมากกว่าเนื้อเรื่องเสียอีก หรือบางเรื่องนักแสดงแค่สองคนแต่ดูแล้วรู้สึกคุ้มกว่าหนังที่เสียเงินไปดู 100 - 200 อีก สำหรับใครที่อยู่แถวกรุงเทพแล้วอยากดูละครเวทีดีๆที่ไม่เสียเงิน (บางเรื่องอาจเสียบ้าง แต่เสียแล้วอลังการ) ก็แนะนำที่ https://www.dramaartschula.com/

อ่านหนังสือปรัชญา

ปีนี้ถือเป็นปีแห่งการอ่านหนังสือปรัชญาคือซื้อหนังสือพวกปรัชญามาอ่านเยอะมากโดยส่วนใหญ่เป็นหนังสือปรัชญากบฏหรือพวกแนวทางที่ไม่ใช่กระแสหลัก ซึ่งอ่านแล้วทำให้เห็นมุมมองใหม่ แล้วก็เอามาใช้ในชีวิตประจำวันหลายเรื่อง ไม่ว่าจะเรื่องการแบ่งแยกธุระ เช่น ธุระของเราคือการทำงาน ส่วนว่าเขาจะถูกใจกับงานที่เราทำหรือการตอบสนองของเขาใหม่เป็นธุระของเขา ถ้าไม่ดีธุระของเขาคือการแจ้งให้เราทราบ ส่วนธุระของเราคือนำมาตรวจสอบและดูว่ามันควรเปลี่ยนหรือไม่ ถ้าเราแยกธุระเป็นเราก็ไม่ต้องสนใจธุระที่ไม่ใช่ของตัวเองชีวิตก็ลดเรื่องกังวลใจไปได้เยอะ หรือแนวคิดของแอดเลอร์เรื่องอดีตไม่ได้เป็นตัวตัดสินพฤติกรรมหรือการกระจำปัจจุบัน ตัวเราต่างหากที่ตัดสินใจว่าจะมีพฤติกรรมแบบไหน อันนี้ถือเป็นแนวคิดที่ช่วยในการใช้ชชีวิตได้ดี แต่ก็ยังเอามาใช้ไม่หมด แต่ก็จะพยายามเอามาใช้ให้ได้มากขึ้น

ปีแห่งความล้มเหลว

ปีนี้ตั้งเป้าหมายไว้หลายอย่างแต่ล้มเหลวเกือบทุกเรื่องไม่ว่าจะเป็น

  • ทำ Blog ความรู้เรื่องการเขียนโปรแกรม (ที่อัพเดททุกสัปดาห์)
  • วิ่งออกกำลังกายทุกสัปดาห์
  • อ่านหนังสือสัปดาห์ละเล่ม
  • เขียน Tools ช่วยในการทำงาน
  • ฝึกเล่นกีต้าร์
  • ฝึกใช้งาน GCP แบบที่เอาไปทำงานได้
  • ฝึก Tradeoff ในการเลือกใช้เทคโนโลยีว่าควรจะใช้ตัวไหน
  • และอีกมากมาย

อีกมากมายคือมากมายจริงๆ เยอะแบบมาคิดดูแล้วแย่มาก คือถ้าคิดว่ามีชีวิตเหลืออีก 10 ปี (เคยคิดว่าอายุไม่น่าเกิน 40 เพราะน่าจะตายด้วยโรค) แล้วเรื่องอยากทำยังเหลือเยอะเป็นภูเขาเลย

สรุป

สำหรับปีนี้ก็คงเหมือนเดิมที่ไม่ได้สรุปว่ามันเป็นปีที่ดีหรือปีที่ไม่ดีเพราะอดีตผ่านไปแล้ว มันจบไปแล้ว เหลือไว้ให้คิดถึงและเป็นบทเรียน ที่สำคัญสุดคือตอนนี้เวลานี้ว่าเราจะทำอะไร

หลายๆเพลงที่ฟังในปีนี้

ฮาวทูทิ้ง = How to ting

ฮาวทูทิ้ง

ฮาวทูทิ้ง ครั้งแรกที่ได้ยินนึกว่าชื่อหนังสือที่สอนให้คนทิ้งของ (บริจาคของ) ออกจากบ้าน แต่พอฟังไปฟังมาอ้าวนี่มันโฆษณาหนังนี่หว่า ซึ่งตัวอย่างมีเนื้อเรื่องถึงนางเอกที่พยายามจะจัดบ้านหรือทำบ้านไรสักอย่างแล้วต้องทิ้งของแล้ว แต่พอเจอของที่ต้องทิ้งแล้วทำให้นึกถึงเรื่องเก่าซึ่งทำให้เราสงสัยว่าตกลงนางเอกจะทิ้งหรือไม่ทิ้ง แล้วก็มีการแชร์ใน Facebook เรื่องการ Move on และก็เป็นกระแสกัน

คะแนนรีวิวอย่างสูง

พอหนังเข้าโรงก็มีคนมาให้คะแนนรีวิวอย่างสูงเลยครับ บาง Page นี่ 8.5 - 10 (ไอ 10 นี่น่าจะ Page อวย ซึ่งแม่งให้ 10 ทุกเรื่องเลยมั้ง) เพื่อนที่ไปดูมาก็บอกว่าเฮ้ยแม่งโคตรสุดว่ะ ต้องไปดู ตัวผมเองก็เก็บความสงสัยว่ามันจะขนาดไหนวะ สักพักก็มีเพื่อนบอกว่า หนังของผู้กำกับคนนี้เลยนะเว้ย ซึ่งผมก็พอรู้จักชื่อแล้วก็เห็นเพื่อนแชร์ใน Facebook เยอะอยู่เหมือนกัน ซึ่งหนังหลายเรื่องของเขาก็ดังจริง

เขาว่าดีงั้นก็ดูแม่งเลยละกัน

ไม่นานรุ่นน้องผมก็ชวนผมมาว่า “พี่ดูฮาวทูทิ้งไหมพี่” พอมันชวนมาก็เลย เออไปดูแม่งเลยละกันเขาบอกว่าดีอย่างงั้นอย่างงี้ มันจะเป็นไงวะ ก็เลยตกลงกับน้องว่าจะไปดู (ต้องขอบคุณมันด้วยที่ทำให้สามารถซื้อตั๋วได้ในราคาถูก) ก่อนดูก็ไปอ่านดูว่าเนื้อเรื่องน่าจะเกี่ยวกับอะไร อ่านไปอ่านมาเห็นมีแต่คนพูดเรื่อง Move on อะไรสักอย่าง สักพักพูด Move on เป็นวงกลม อะไรก็ไม่รู้ก็เลย เออช่างแม่งไปดูในโรง ไม่ต้องปูพื้นห่าไรก่อนไปดู เอาแบบนั่งรอดู Big cinema ช่อง 7 สมัยเด็กๆเลย เปิดเจอปุ๊ปนั่งดูยาวๆ

ดูแล้วเป็นไงบ้าง แบบไม่สปอย (วิจารณาญาณส่วนบุคคล)

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

ดูแล้วเป็นไงบ้าง แบบสปอย (วิจารณาญาณส่วนบุคคล)

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

ดูได้เรื่อยๆ จุกได้เรื่อยๆ ถ้าคุณไม่เคยยอมรับ

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

ทุกคนทำเพื่อตัวเองทั้งนั้น

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

ถ้าคุณไม่สนใจ ไม่นึกถึง คุณก็ไม่รู้สึก

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

เราเลือกสิ่งที่อยากเห็น เราตีค่าทุกอย่างตามความต้องการล้วนๆ

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

ความรู้สึกส่วนตัว

สำหรับผมการดูหนังเรื่องนี้เหมือนได้อ่านหนังสือปรัชญาเล่มนึง ใช่ครับ มันเหมือนอ่านหนังสือปรัชญาที่สอนในแนวทางที่คนไม่ค่อยชอบฟัง หรืออ่านพระธรรมของพระพุทธเจ้าจริงๆไม่ได้อ่านเรื่องปาฏิหารย์ต่างเรื่องเกิดมาเดิน 7 ก้าว มีพลังปาฏิหารย์หยุดช้าง เหาะเหินเดินอากาศ หนังสือพวกนี้จะบอกสิ่งที่คุณรู้อยู่แล้วแต่คุณไม่อยากยอมรับ เช่น กล้าที่จะถูกเกลียด พูดว่า “คนเราไม่เปลี่ยนแปลงตัวเองเพราะตัวเองเลือกที่จะเป็นแบบนั้น” นิชเช่พูดถึงเรื่อง “การดูแคลนกาย” “พระเจ้าตายไปแล้ว” พระพุทธเจ้าพูดเรื่อง “ขันธ์ 5” ซึ่งพออ่านแล้วมันจุกมันเหมือนถูกไม้ฟาดหน้า คุณจะประทับใจกับการอ่านมันเพราะมันกล้าที่จะบอกคุณตรงๆในเรื่องที่คุณไม่อยากยอมรับ แต่เพราะผมอ่านหนังสือพวกนี้มาหลายเล่ม พอมาเจอหนังเรื่องนี้มันเหมือนเรารู้อยู่แล้วมันเลยไม่ประทับใจ ไม่จุกเท่าที่ควร แล้วพอดูแล้วจังหวะการเล่าเรื่องและตอนจบมันคล้ายกับเรื่อง Up in the air ที่ตอนจบเขาทิ้งเราไว้กับพระเอกที่เสียจุดยืนในการใช้ชีวิตของตัวเองไปแล้ว มันเลยเหมือนเคยดูมาแล้วอีก (เคยมีคนบอกว่ายิ่งดูหนังมากเท่าไหร่ ยิ่งสนุกน้อยลงท่าทางจะจริง)

สรุป

สำหรับผมเรื่องนี้เป็นหนังดีนะให้ความรู้เหมือนอ่านหนังสือปรัชญาตามที่ผมบอก แต่ถ้าคาดหวัง เนื้อเรื่อง ลุ้น ตื่นตา หักมุม ไม่มีครับเรื่องนี้ไม่มีเลย แต่ถ้าชอบดำดิ่งไปกับอารมณ์ความรู้สึก อยากลองยอมรับสิ่งที่รู้มานานแต่ไม่กล้ายอมรับแล้วก็ลองไปดูครับ แต่ถ้าอ่านมาถึงตรงนี้แล้วผมว่าคุณคงไม่อินกับมันแล้วแหละด้วยเหตุผลเดียวกับที่ผมไม่อิน

หนังสือปรัชญาที่เล่าให้ฟัง

กล้าที่จะถูกเกลียด 1
กล้าที่จะถูกเกลียด 2
ซาราธุสตราตรัสไว้ดังนี้

Scale cube

Scale cube

หลังจากไม่ได้เขียน Blog ไปนานเพราะขี้เกียจกับอยากนอนอืดเสาร์อาทิตย์ พอมาถึงจุดที่เละเทะเกินเยียวยาเลยต้องหาอะไรทำแล้วไม่งั้นจะกู่ไม่กลับ เลยคิดว่ากลับมาเขียน Blog ดีกว่า เพราะยิ่งเขียนยิ่งต้องหาอะไรมาเขียนต่ออีกเรื่อยๆ จะได้อ่านหนังสือ ประจวบเหมาะกับบริษัทอยากจะโล๊ะ Project เก่าแล้วทำเป็น Micro service ซึ่งตอนนี้เราก็ยังไม่รู้ว่าควรจะทำดีไหม แต่เห็นแล้วมันน่าจับแยกมากเพราะมันเริ่ม complex มาก บ่นมากแล้วมาพูดถึงเนื้อหาตอนนี้กันดีกว่า วันนี้จะมีพูดเรื่อง Scale cube กันดีกว่า

scale cube ก็คือรูปที่เห็นด้านบนนั่นแหละครับ รูปนี้มาจากหนังสือ The Art of Scalability ซึ่งในรูปคือวิธีในการ scale ตัว Application ไปในทิศทางใด โดยเขาแบ่งออกเป็น 3 (ก็มันเป็นลูกบาศก์มันก็ต้อง 3 แกนอยู่ละ) ทิศทางคือ คือ x, y, z (Dragon Cannon)

แกน X

Scale โดยการ Duplicate ตัว Application แล้วให้ตัว Load balance กระจายงานเข้าไปให้แต่ละ Node

แกน Z

Scale โดยการ Duplicate ตัว Application เหมือนกับแกน X แต่ก่อนจะกระจายงานจะมีตัวตัดสินใจโดยตัดสินใจโดยใช้เงื่อนไขเกี่ยวกับ Data เช่น แบ่งตาม user ที่ส่ง Request เข้ามา เช่น a - h เข้าเครื่องที่ 1 ดังภาพตามหนังสือ ซึ่งแกน X กับ แกน Z ต่างกันคือ แกน Z สนใจเงื่อนไขเกี่ยวกับ Data เป็นเงื่อนไขในการกระจายงาน ต่างจากแกน X จะ กระจายตามแบบเท่าเทียม หรือ เช็คว่าตัวไหนมีชีวิตอยู่บ้าง

แกน Y

Scale โดยการแตก Application ของเราให้เป็นส่วนย่อยๆ โดยอาจจะแบ่ง Application เป็นหลายๆ Application ความรับผิดชอบ ดูได้จากภาพตัวอย่าง ที่ทำการแยก Application จากเดิมภาพที่ แกน X , แกน Z จะเป็น Application ใหญ่ๆ Application เดียว แต่อันนี้เราจะแยก Application ของเราเป็น Application ย่อยๆ 3 Service ดังภาพ คือ Order service, Customer service, Review service

ฉันยังคงสงสัย (รู้สึกอยู่ไม่หาย ก็คิดว่าเธอคงรักกัน)

จากการอ่านและคิดตามก็เห็นภาพตามคร่าวๆว่าการ scale แต่ละแกนมัน scale ยังไง ในตอนที่ทำงานวิธี scale ที่ง่ายที่สุดคือแกน X ครับ คือแค่ clone เครื่อง วางหลัง load balance ก็ใช้งานได้เลย ในส่วนของแกน Z นั้นแทบจะเหมือนแกน X เลย แต่ต่างกันตรงที่มีตั้งเงื่อนไขว่าจะ routing request ตามอะไร ซึ่ง อันนี้ผมยังไม่เคยได้ทำในงานจริงที่เคยลอง เพราะต้องมาเขียนตัวจัดการ Route ของ data ซึ่งเพิ่มงาน ส่วนแกนสุดท้ายคือแกน Y อันนี้คือแบบใหม่ที่เคยได้ยินเลยคือการแยก Application ออกเป็น Application ย่อยๆไปเลยซึ่งมันคือการจะทำ Microservice เนี่ยแหละ

ซึ่งเมื่ออ่านแล้วเราก็เข้าใจว่าการ scale เนี่ยมันไม่ต้องทำไปในทางใดทางหนึ่ง เราสามารถทำผสมกันได้ในทุกแกนเลยทำให้เขายกตัวอย่างเป็น cube เพราะเวลาเราบอกพิกัดใน cube นั้นเราต้องบอกพิกัด 3 แกน เช่นกัน application ของเราก็สามารถ scale ได้หลายทางเช่น แบ่งเป็น 3 service คือ scale ไปในแกน Y แล้ว service ที่ 1 Duplicate เป็น 3 ตัว แบบเท่ากันโดยไม่สนใจ data อันนี้คือ scale ไปในแกน X ส่วน service ที่ 2 scale เป็น 3 เครื่อง แล้ว routing ด้วย id ของข้อมูลโดยใช้การ mod ด้วย 3

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

ref :
https://microservices.io/articles/scalecube.html
https://manning-content.s3.amazonaws.com/download/2/031dbdc-2223-4304-bad9-bb2a83d88899/sample_ch01_Richardson_Microservices-Patterns_October10.pdf

แล้วเจอกันใหม่นะ

เบลๆ

เป็น Message ใน Facebook ที่เพื่อนในกลุ่มส่งมาให้ระหว่างที่นั่งฟังเรื่อง Consumer-Driven Contracts อยู่ พร้อมกับลิ้งค์เขียนเกี่ยวกับนิโกะ ตอนแรกก็นึกว่าเพื่อนส่งเกี่ยวกับเรื่องนิโกะว่าจะแสดงที่ไหนมา เพราะปกติเพื่อนผมคนนี้เป็นคนในวงการที่คอยบอกว่ามีงานอะไร หรืองานไหนที่น่าสนใจแล้วมีนิโกะไปบ้าง แต่พออ่านดีๆมันเป็น นิโกะประกาศจบการศึกษาจากวงเนื่องจากปัญหาด้านสุขภาพ ก็….. ในตอนนั้นเรื่อง Consumer-Driven Contracts ก็หายไปจากหัว

พองานจบก็รีบหยิบมือถือมาอ่านแบบจริงจังก็พบว่าน้องมีปัญหาเรื่องกระดูกสันหลังถ้ายังทำกิจกรรมเกี่ยวกับพวกเต้นอยู่จะเป็นอันตรายต่อสุขภาพได้เลยต้องประกาศจบการศึกษา (ศัพท์แบบคนนอกวงการอย่างผมเข้าใจคือ “ออกจากวง”) ถึงตอนนั้นก็รู้สึกเศร้านะแบบ ตอนเดือนตุลายังวางแผนไว้อยู่เลยว่าจะเคลียงานไปดูการแสดงน้อง มาตอนนี้กลายเป็นว่าจะไม่ได้เจอน้องแล้ว

มันเหมือนคนจะไม่ได้เจอกันอีก

อันนี้พูดตามตรงเลยว่ามันเเป็นความรู้สึกเศร้าแบบใหม่ที่พึ่งเคยพบเจอ เศร้าแบบเราจะไม่ได้เจอกันแล้วนะ ถ้าเป็นตอนเด็กที่จากกันกับเพื่อนสมัยประถมอย่างน้อยเรายังมีสมุดโทรศัพท์ไว้ให้โทรไปหา ไปคุย แต่กับน้องนี่คือคงแทบจะไม่มีโอกาสได้เจออีกแล้ว เพราะตามที่คิดได้คือน้องคงกลับญี่ปุ่นเพื่อไปทำตามความฝันเรื่องการเป็นนักพากย์และศิลปินเดี่ยว

เซกิ

งานสุดท้ายที่น้องจะแสดงในฐานะวงไอดอล Siam dream คืองาน Maruya เมื่อวันที่ 8 กันยา ที่ผ่านมา ซึ่งมันไม่ได้อยู่ในปฏิทินที่จัดไว้ เลยต้องหาวิธีทำยังไงก็ได้ให้ไปงานนี้ได้ ซึ่งก็โชคดีที่เคลียธุระต่างๆได้พอดีเลยได้มีโอกาสไปเซกิกับน้อง ก่อนได้เซกิกับน้องก็นึกถึงครั้งแรกที่ได้เซกิกับน้อง วันนั้นยังถามน้องอยู่เลยว่า พูดภาษาไทยได้ไหม น้องก็พยายามคุยด้วย แม้เราจะคุยกันไม่ค่อยรู้เรื่องก็ตามแต่ตอนนั้นรู้สึกดีมากๆ และทุกครั้งที่คุยกับน้องก็รู้สึกดีแบบนั้นทุกครั้ง พอมาคิดว่านี่อาจจะเป็นเซกิครั้งสุดท้ายก็เศร้าแปลกๆเหมือนกัน

นิโกะ : สวัสดีค่ะ

โปรแกรมเมอร์ : สวัสดี

นิโกะ : วันนี้ Last stage แล้วนะ

โปรแกรมเมอร์ : อื้อแล้วนิโกะจะกลับมาไทยอีกไหม

นิโกะ : นิโกะฟังภาษาไทยไม่ค่อยเข้าใจค่ะ ขอโทษด้วยนะคะ

โปรแกรมเมอร์ : ไม่เป็นไร ไม่เป็นไร

นิโกะ : ชื่ออะไรนะคะ

โปรแกรมเมอร์ : อ้อ พี่ชื่อเบล

นิโกะ : ขอโทษนะคะ นิโกะจำชื่อไม่ได้ แต่นิโกะจำหน้าได้นะ

โปรแกรมเมอร์ : ไม่เป็นไร ไว้พี่จะตามดูนิโกะผ่าน Youtube NicoNicoChannel นะ

นิโกะยิ้มพร้อมบอกประมาณว่าจะลงเพลงอะไรสักอย่างให้ฟัง

นิโกะ : แล้วเจอกันใหม่นะคะ

โปรแกรมเมอร์ : อื้อ แล้วเจอกันอีกนะ

บนเวที

หลังจากเซกิเสร็จก็ไปยืนรอดูการแสดง Last stage ของนิโกะในนามของ Siam Dream ซึ่งก็สนุกดี แถมได้ฟังนิโกะร้องเพลงเดี่ยวด้วย (จริงๆเคยฟังผ่าน Youtube แล้ว) ช่วงสุดท้ายมีการกล่าวอำลา ซึ่งนิโกะพูดประมาณว่า (ฟังจากแมรี่ที่แปลให้ฟัง) นิโกะเสียใจที่ต้องจบการศึกษา นิโกะไม่เคยเจอที่ของตัวเองเลย จนได้มาอยู่วง Siam dream นิโกะได้เจอที่ของตัวเอง แต่สุดท้ายก็ต้องมาจากไปแบบนี้ แต่นิโกะก็ดีใจที่ได้มาจบการเป็นไอดอลของตัวเองที่วง Siam dream ฟังมาถึงตรงนี้ก็รู้สึกเศร้าเลยนะเพราะเราเห็นว่าน้องพยายามมากจริงๆ สุดท้ายน้องก็ลงจากเวทีจบ State สุดท้ายของน้องอย่างสวยงาม

วันนี้นิโกะจะกลับญี่ปุ่นแล้วนะคะ

เป็นข้อความที่นิโกะโพสต์ใน Facebook แล้วก็เห็นว่าแฟนคลับจะไปส่งนิโกะที่สนามบินด้วยเราก็เลยติดสินใจไปส่งนิโกะด้วยซะเลย ตอนนั้นก็ตลกตัวเองเหมือนกันนะว่าเฮ้ย เรามาถึงจุดนี้เลยเหรอวะ จุดที่ไปส่งไอดอลที่สนามบิน แต่ถ้าความคิดตอนนั้นมันบอกว่าอยากไปแล้วเราจะปฏิเสธความคิดของตัวเองทำไม จะได้ไม่ต้องมานั่งเสียใจกับสิ่งที่อยากทำแต่ไม่ได้ทำทำไมก็เลยตัดสินใจไปส่งน้องที่สนามบิน

โปรแกรมเมอร์ : แล้วเจอกันนะ

นิโกะ : แล้วเจอกันนะ เจอกัน

จากนั้นน้องก็ค่อยๆเดินไกลออกไปไกลออกไปจนภาพสุดท้ายที่เห็นคือน้องที่เราชอบโบกมืออำลาเราอยู่ไกลๆ

ความทรงจำ

ช่วงระยะเวลา 8 - 9 เดือนที่ผ่านตั้งแต่ได้รู้จักน้อง ชีวิตได้พบเจออะไรใหม่ๆ สถานการณ์ใหม่ๆที่ไม่เคยคิดว่าจะได้เจอ ไม่ว่าจะไปดูงานคอนเสิร์ต เซกิ ได้สัมผัสความรู้สึกใหม่ที่ไม่ใช่ความรู้สึกของการจีบสาว แต่เป็นความรู้สึกทีไ่ด้เห็นสิ่งสวยงาม สดใส เปล่งประกาย จากผู้หญิงคนหนึ่ง หลังจากนี้ก็ไม่รู้ว่าจะได้เจอน้องอีกไหม แต่ความทรงจำดีๆที่ได้จากน้องจะยังอยู่ในความทรงจำมีสีของโปรแกรมเมอร์แน่นอน

เพลงประกอบการเขียน Blog

เพลงที่นิโกะพูดถึงตอนเซกิคือเพลงที่น้อง cover แล้วเอามาลง Youtube เนื้อเพลงน่าจะเกี่ยวกับไอดอล ตอนสุดท้ายน้องมีพูดอะไรสักอย่างแต่ฟังไม่ออก แต่คงจะบอกว่าขอบคุณมากๆที่ติดตามกันมา

SonarQube Part 3

Connect CI กับ Sonarqube ด้วย WEB API

ผมเขียนเกี่ยวกับ Sonarqube ไว้หลายตอน คุณสามารถกด Link ด้านล่างเพื่ออ่านที่เกี่ยวกับ Sonarqube ตอนต่างๆได้เลย

หลังจากหายไปนานกับ Sonarqube (หายไปปีกว่า) และการเขียน Blog (หายไปเป็นเดือน) รอบนี้เลยกลับมาอัพเดท Blog กันหน่อย เลยหยิบเอาเรื่อง Sonarqube ที่พึ่งทำไปได้หยกๆมาเขียนเลยละกัน คือเรื่องมันเริ่มที่บริษัทเริ่มจะมาทำ CI กันแบบจริงจัง ผมเลยได้มีโอกาสทำการ Set up ส่วนที่เป็น CI ขึ้นมา หลายคนอาจงงว่า Set up ทำไม เขามีบริการอยู่มากมายอยู่แล้ว อันนี้มันเป็นเรื่องของ Policy ล้วนๆเลยครับ การตอบคำถามหน่วยงาน Audit(ซึ่งมันรู้จริงรึเปล่าผมก็ไม่รู้ จะเอามาตรฐานความปลอดภัยของ Service ที่ทำ CI / CD แบบออนไลน์มาเปิดให้ดูม ันจะอ่านแล้วทำความเข้าใจไหม อันนี้ผมก็ไม่รู้ ไปๆมาๆไม่ให้ผ่านที่ทำมาชิบหายหมดอีก) วิธีง่ายๆที่สุดที่จะตอบแม่งคือ ทำเอง On premise นี่แหละ จะเห็นก็เห็นจากคนในด้วยกันเองเนี่ยแหละ ไม่ต้องกลัวคนนอกจะเปิด Backdoor เข้าไปเอา Source code ซึ่งจากการ Install เองหลายๆเรื่องอาจจะเอาเรื่องนั้น เรื่องโน้น เรื่องนี้มาเขียนต่อให้ฟัง

ตามหาวิธีเชื่อมต่อกับ Sonarqube

หลังจากตอนก่อนๆสอนการ Install sonarqube และ สอนการ Scancode ไปแล้ว ซึ่งผมคิดว่ามันน่าจะจบเรื่อง sonarqube ไปละ เพราะเห็นคุณภาพ Code ของตัวเองละ เจออะไรก็เข้าไปแก้ตามที่ Sonarqube บอก แต่พอมาทำ CI ซึ่งทุกอย่างต้องเป็น Auto หมด ตั้งแต่ build, test, add to artifact ซึ่งส่วนหนึ่งที่ทางทีมอยากให้มีคือการตรวจสอบคุณภาพของ Code ว่าผ่านข้อตกลงไหม ถ้าผ่านถึงจะให้ไปสู่กระบวนการต่อไป คราวนี้ก็งานเข้าเลยสิ สมัยก่อนสั่งแต่ Manual อันนี้จะให้เอาเข้า Pipe line แล้วเป็น Auto ด้วย ไอตอน scan อะรู้ว่าทำไง แต่เอาผลกลับมาเนี่ยสิ แต่โชคดีที่ Sonarqube เขาเล็งเห็นจุดนี้ไว้แล้วเลยสร้างตัว Web API ให้เราเข้าไปใช้งาน โดยรายละเอียด API สามารถดูได้ที่

https://codeen-app.euclid-ec.org/sonar/web_api/api/authentication

โดย API ที่ผมใช้คือ

1
api/qualitygates/project_status

โดยเราสามารถยิงไปเอาว่า Project ของเรานั้นผ่าน QualityGate(คือคุณภาพของ Code ที่เรากำหนดกันว่าเท่าไหร่ถึงจะผ่าน) โดยจะตอบกลับมาเป็น Json ประมาณนี้

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"projectStatus": {
"status": "ERROR",
"conditions": [
{
"status": "ERROR",
"metricKey": "new_coverage",
"comparator": "LT",
"periodIndex": 1,
"errorThreshold": "85",
"actualValue": "82.50562381034781"
}
]
}
}

ส่วนการ Authentication เข้าใช้งาน sonarqube นั้นเขาออกแบบให้ใช้ Token หรือไม่ก็สามารถใช้ Username , password ได้เลยตามแต่จะถูกใจ โดยวิธีการใช้งานดูได้ตามลิ้งค์ด้านล่างเลย

https://docs.sonarqube.org/latest/extend/web-api/

ประกอบร่าง

เมื่อชิ้นส่วนทั้งหมดครบเราก็สามารถทำการเชื่อมกับ Sonarqube เพื่อทำการ Scan code และเอาผลลัพธ์การ Scan จาก Sonarqube server ว่าประมวลผลต่อว่าจะให้ pipe line ของเราทำงานต่อหรือไม่ โดย Code นั้นสั้นๆง่ายๆเพียงเท่านี้

  • mvn sonar:sonar -Dsonar.projectKey=$PROJECT_KEY -Dsonar.host.url=https://your_sonarqube_endpoint.com -Dsonar.login=$TOKEN -Dsonar.sourceEncoding=UTF-8 -Dsonar.java.binaries=.

บรรทัดนี้เป็นการทำการสั่งให้ scan code และส่งผลลัพธ์ไป sonar server โดยใช้ MAVEN plugin โดย $PROJECT_KEY และ $TOKEN อันนี้เป็นค่าที่เราได้ตอนสร้าง Project โดยสามารถกลับไปอ่านตอนที่ 2 หรือลองสร้าง Project ใน Sonarqube server ดูก็ได้ครับ

  • sleep 10s

อันนี้ไม่มีอะไรมากครับ แค่ทำการรอเป็นเวลา 10 วินาที ซึ่งผมทำ Delay ไว้ให้ Sonarqube ได้รับข้อมูลแล้วเอาไป Check กับ QualityGate ที่ตั้งไว้แล้วสรุปว่า ผ่านหรือไม่ผ่าน ใครจะลดหรือเพิ่มเวลาก็ได้นะครับ อันนี้แล้วแต่เลย

ส่วนนี้คือการใช้คำสั่ง curl (บางคนเรียก เคิล บางคนเรียก ซี-ยู-อา-แอล) ยิงไปดึงข้อมูลจาก Web ที่ต้องการ โดยในที่นี้ผมยิงไปเอาที่ไปที่ api/qualitygates ของ sonarqube เพื่อเอาผลลัพธ์กลับมา โดยเมื่อได้ผลลัพธ์ผมจะเขียนลงไฟล์ชื่อ sonarqube_result.txt

  • grep “{"projectStatus":{"status":"OK"“ sonarqube_result.txt

ส่วนอันนี้เป็นวิธี Hack กระโหลกๆที่ผมคิดได้คือใช้ grep ทำการ grep หาคำว่า {“projectStatus”:{“status”:”OK” ในไฟล์ sonarqube_result.txt โดยกรณีที่ Sonarqube ตรวจสอบว่า Project นี้ผ่าน QualityGate จะ Return เป็นคำที่ผม grep มาเสมอ และด้วยการที่ grep นั้นถ้า grep แล้วเจอคำจะ return exit code เป็น 0 ถ้าหาไม่เจอจะ return exit code เป็นอย่างอะไรที่ไม่ใช่ 0 เนื่องด้วยความสามารถนี้ทำให้ เมื่อเอา code ชุดนี้ไปใส่ใน pipe line ของพวก CI Tool ถ้า quality ของ code ผ่าน quality gate ของ sonarqube มันจะทำงานในส่วนของคำสั่งถัดไป แต่ถ้าไม่ผ่านตรง grep มันจะ return exit code ที่ไม่ใช่ 0 ออกมาซึ่งตัว CI Tool จะมองว่ามันทำไม่สำเร็จจะทำการหยุด pipe line

จบแล้ว

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

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

Video ประกอบการเขียน Blog

โอเฟ่น จอมดาบเวทย์มนต์ การ์ตูนอีกหนึ่งเรื่องในดวงใจของผม เป็นการ์ตูนที่สร้างภาพจำเกี่ยวกับจอมเวทย์ของผมให้แตกต่างจากพ่อมดแม่มดคนอื่นๆ ในขณะที่คนอื่นพูดถึงพ่อมดแม่มดจะนึกถึงพวกแฮรี่พอร์ตเตอร์ใช้คฑาร่ายเวทย์มนต์ แต่ของผมนึกถึงโอเฟ่นวิ่งหาศัตรูพร้อมร่ายเวทย์อัดกันแบบประจันหน้า

ล่าสุด Orphen ประกาศครบรอบ 25 ปี ไม่รู้ว่าเขาทำ Remake หรือภาคต่อรึเปล่าซึ่งถ้าทำก็ขอให้ได้อารมณ์แบบการ์ตูนยุคนั้นนะ

ประสบการณ์ตอนทำงาน ตอน การให้และขอ Requirement Path 2

ความคาดหวัง

อีกหนึ่งเรื่องที่ Dev อยากให้คนที่รับ Requirement หรือคนที่จะให้ Requirement คุยกันก่อนคือเรื่องความคาดหวัง ความคาดหวังมันคืออะไรผมก็ให้นิยามมันแบบตรงๆไม่ได้แต่พออธิบายเป็นภาษาบ้านๆได้ก็คือ ตกลงกันว่ามันจะทำงานได้ในระดับไหน ดีแค่ไหน ตัวอย่างความคาดหวังง่ายๆที่เห็นบ่อยๆคือ ถ้าคุณซื้อของแพงกว่าราคาตลาดทั่วไป เช่น ซื้อ IPhone คุณก็จะเริ่มมีความคาดหวังว่ามันจะต้องดีกว่าของที่ราคาตลาดอย่าง SAMSUNG, Nokia , อาม่า อันนี้ไม่ได้บอกของใครดีกว่าใครแต่มันเป็นค่านิยมที่ถูกตลาดปลูกฝังว่ายี่ห้อนี้ดีกว่าอีกยี่ห้อนึงซึ่งในความเป็นจริงอาจไม่ใช่เลย (ลองหาอ่านเรื่องการเปรียบเทียบถ่านไฟฉาย ไปๆมาๆไฟฉายยี่ห้อที่เราคิดว่ากากกลับมีประสิทธิภาพดีกว่าถ่านไฟฉายมียี่ห้อ https://pantip.com/topic/31504294 )

เมื่อคุณมีความคาดหวังที่สูงเมื่อทำไม่ได้ตามที่หวังมันก็จะยิ่งโดนด่าแรงตาม ก็ซื้อของแพงแต่มันห่วยใครจะไม่โกรธ แต่ถ้าลองเปลี่ยนสถานการณ์เป็น IPhone มาคุยกับคุณว่าคุณภาพประมาณนี้นะ อาจจะมีปัญหาแบบนี้นะ ถ้ามีปัญหาติดต่อทางนี้นะ จะรับประกันภายในเท่านี้นะ ถ้าเขาให้ค่าความหวังกับคุณแบบนี้คุณก็จะคาดหวังอีกแบบ คุณจะไม่คิดว่ามัน Perfect คุณจะคิดว่าโอเคมันอาจมีปัญหา ถ้ามีเราติดต่อกับเขาได้ทางช่องทางนี้

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

หรืออีกเคสสำหรับใครดู EndGame แล้วคาดหวังกับ Captain Marvel ผมบอกเลยว่าเฮ้อออออ จริงๆมันเกิดจากที่เราคาดหวังมันมากไปว่าจะต้องแบบนั้นแบบนี้พอออกมาน้อยกว่าคาดก็จะอารมณ์นี้

สำหรับเรื่องการพัฒนาโปรแกรมก็เช่นกัน คุณต้องตั้งค่าความคาดหวังกันก่อน ระบบนี้จะ Realtime แค่ไหน ถ้าทำไม่ได้มีช่องทางอื่นเสนอให้เป็นแบบนี้ มันอาจเกิดปัญหานะแต่ทางเราจะรีบแก้ให้ คุณต้องค่าความคาดหวังกับลูกค้าหรือถ้าคุณเป็นคนจ้างคุณก็ต้องบอกค่าความหวังของคุณกับคนที่คุณจ้าง เพราะเขาจะได้บอกว่า “ได้หรือไม่ได้” ถ้าไม่ได้เขามีข้อเสนอหรือวิธีอื่นแล้วตกลงความคาดหวังกันว่าจะเป็นประมาณนี้ เมื่อความคาดหวังเราตรงกันก็มีโอกาสน้อยที่มันจะมาแบบ “ไอ้หน้าหมาทำไมไม่เป็นอย่างที่ตกลงวะ”

ส่วนสิ่งที่ทีม Dev คาดหวังเวลาคนไปรับ Requirment ไปคุยกับลูกค้า ทาง Dev ก็อยากจะให้คุณตั้งค่าความคาดหวังกับลูกค้าประมาณว่า

  • อาจจะได้ภายในวันนี้นะครับแต่อาจจะมีปรับเปลี่ยนนบางเรื่องที่ทางเราเห็นว่าอาจจะกระทบต่อระบบ ซึ่งถ้ามีอาจจะเลื่อนนะครับ
  • ถ้าจะเอาให้ทันภายในวันนั้น อาจจะต้องลด Scope เหลือเท่านี้
  • ถ้าเอาแบบนี้ไม่น่าจะได้ครับ แต่ถ้าเป็นแบบนี้ได้ไหมครับ ให้ผลลัพธ์เหมือนกัน

Requirment ของ Report

สำหรับงานที่ผมเจอบ่อยๆและหงุดหงิดบ่อยๆคือ Report คือ Requirment ที่เคยได้มาคือ ทำ Report นี้ให้ที คำถามของทาง Dev ก็คือ Report เ-ี้ย อะไร บอกให้ทำแต่ไม่รู้ว่า Report ที่ออกมาหน้าตาเป็นยังไง Format ที่ออกเป็นแบบไหน แล้วจะออกด้วยเงื่อนไขอะไร โอเคเราจะมาลองสรุปคร่าวๆว่า Dev อยากได้อะไรเวลาจะทำ Report จริงๆผมอยากจะบอกว่าพวกเราทีม Dev ควรจะพึงระลึกเสมอว่าเมื่อโดนสั่งทำ Report ควรถามห่าอะไรพวกนี้เสมอ

หน้าตา

หน้าตาของ Report ที่อยากให้ออกมาเป็นแบบไหน Excel , csv , PDF แล้วจะดีหน่อยคือไปเอาตัวอย่างที่เขาเคยมีในระบบเก่าหรือมีอยู่แล้วมาเป็นตัวอย่างประกอบด้วย ทางทีม Dev ดูแล้วจะได้รู้ว่ามันทำได้ ทำไม่ได้ คุ้มค่าไหมที่จะทำ

Field

Field ที่จะเอาไปใส่ใน Report คืออะไร ไปเอามาจากไหน ถ้าคนที่ทำงานเป็นหรือทำงานมานานก็จะ capture ว่าเอามาจากฟิลล์นี้ในหน้าจอ หรือระบุรายละเอียดต่างๆนาๆให้

ชื่อไฟล์

อันนี้ก็เป็นประเด็นเหมือนกัน คือตอนมาสั่งบอกเอาแต่ Report แต่ไม่บอกว่าออกมาจะมีชื่อไฟล์อะไร อันนี้ก็เป็นปัญหาเหมือนกัน เคยมีงานนึงผมให้ออกเป็น Format : ReportName_20191231_110231.xlsx แต่พอขึ้น PROD ไปแล้วกลับไม่พอใจ อ้าวไอสาดไม่บอกมานี่

เงื่อนไขการออก Report

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

Report มันต้อง Realtime แค่ไหน

นี่เป็นอีกคำถาม Classic เกี่ยวกับ Report ที่คนที่ไปคุยกับลูกค้า หรือ ลูกค้าที่ให้ความต้องการรู้ คือ Report ของคุณอะ Realtime แค่ไหน Realtime คือกดตอนนี้ต้องได้ตอนนี้เลย ข้อมูลต้องเป็น ณ ป้จจุบัน หรือจริงๆคุณอยากได้ Report สรุปผลรายเดือน ทั้ง 2 อย่างต่างกันมากเลยนะ ถ้าคุณอยากได้ Realtime มันต้องใช้เทคนิคและทรัพยากรมหาศาลในการทำ (ซึ่งยากมากแต่คนไปรับบอกสบายมาก แล้วไปตั้งค่าความคาดหวังกับลูกค้าไปแล้ว) แต่ถ้าเป็น Report สรุปรายเดือนมันจะเป็นคนละแบบ ระบบสามารถค่อยๆทำผลสรุปเรื่อยๆรายวันแล้วมารวมเป็น Report ตอนปลายเดือน ข้อมูลที่ได้จะเป็นแบบ T + 1, T +2 คือถ้าจะเอาข้อมูลวันนี้มันจะได้วันพรุ่งนี้ หรือ มะรินนี้ อันนี้สามารถทำได้โดยไม่ต้องมีเทคนิคอะไรมาก ไม่ต้องใช้ทรัพยากรเยอะเท่าแบบ Realtime แบบแรก

กดแล้วได้เลย หรือ กดแล้วค่อยมาดูทีหลังได้

อันนี้เป็นอีก Requirement และความคาดหวังที่ควรตกลงให้ กดแล้วได้เลยคือ กดแล้วลูกค้าต้องนั่งแช่รอสัก x วินาทีแล้วได้ Report กลับมา การทำแบบนี้บอกเลยว่ากินทรัพยากรมาก เพราะคุณต้องทำการสร้าง Report ให้ทัน x วินาทีที่กำหนด ส่วน กดแล้วค่อยมาเอาจะประมาณว่า กดสั่งสร้างแล้วระบบรู้ว่าอยากให้สร้าง Report เดี๋ยวระบบเอาไปทำให้นะ รอไปเดี๋ยวได้ Report แน่ แบบนี้จะดีกว่าแบบแรกเพราะคุณสามารถเอางานไปรอไว้ก่อนรอ Server ทำงานไม่หนัก หรือ ช่วงเวลาที่มีไว้สำหรับการออก Report หรือ ส่งไปให้ระบบทีทำการออก Report โดยเฉพาะ ทำการออก Report ซึ่งอาจจะนานกว่าเวลาที่ผู้ใช้มากดแล้วต้องนั่งรอ ลองคิดว่านั่งรอ 5 นาทีกว่า Report จะออกมา กับ การตั้งค่าความคาดหวังว่า ระบบรับเรื่องการออก Report แล้วกำลังนำไปออก Report คุณว่ามันดีกว่าการที่เขามานั่งรอหน้าจอทำงานอื่นไม่ได้ 20 นาทีไหม

ข้อพึงระวังกับ Report

พวกนี้เป็นเรื่องที่พึงระวังกับ Report เป็นเรื่องที่คนสั่งคนทำหรือทุกคนที่เกี่ยวข้องควรจะทราบเกี่ยวกับ Report

Report ที่กดข้อมูลอาจไม่เท่ากันถ้ากดคนละเวลา

อันนี้เป็นอีกเรื่องที่ชอบมาโวยวายกันคือกด Report ตอนนี้ได้ผลแบบนึง กด Report อีกเวลาได้ผลอีกแบบ คุณควรเข้าใจนิดนึงว่าข้อมูลที่เอามาจาก Database ถ้าคุณอยากได้ Realtime แล้วมันมีการเปลี่ยนสถานะของข้อมูลจาก A ไป B ซึ่งถ้าเงื่อนไขในการออก Repot มันมีสถานะพวกนี้อยู่ในเงื่อนไข ผลลัพธ์ที่ออกมาก็ย่อมเปลี่ยน

ระบบมันไม่ได้มีไว้ออก Report

ระบบ Application ส่วนใหญ่เขาออกแบบมาเพื่อรับงานที่เป็นงานหลักของ Application เช่น เว็บนำเข้าส่งออกเขาก็มีระบบไว้รองรับการแจ้งนำเข้าส่งออก หรือ Shopee เขาก็ออกแบบระบบมารองรับการสั่งซื้อสินค้า หรือ Agoda เขาก็ออกแบบระบบมาให้คนจองโรงแรม เปรียบเทียบราคาโรงแรม เขาไม่ได้ทำระบบมาเพื่อออก Report ดังนั้นบริษัทใหญ่ๆพวกนี้เขาก็จะมีกระบวนการนำข้อมูลไปออก Report ที่ระบบอื่น หรือถ้าอินเทรนหน่อยเขาจะเอาข้อมูลไปเทรน AI แต่คงไม่มีระบบไหนเขาเทรน AI บนระบบหลักครับ ดังนั้นพึงระลึกเสมอว่าระบบมันไม่ได้มีไว้ออก Report ถ้าเป็นระบบเล็กๆ Report กระจอกงอกง่อยนิดๆหน่อยๆมันออกได้ครับ แต่ถ้ามันเริ่มเป็น Report ที่ complex มากๆแบบ ผลรวมของสาขานี้นั่นโน่นนี่รายเดือนรายปี หรือ สรุปการทำงานของแต่ละคนในช่วงเวลาต่างๆโดยเงื่อนไขหลากหลาย หรือ เมื่อใดที่ Dev บอกว่าเห้ยมันเกินระบบรับไหว ก็พึงระลึกเถอะครับว่าเขาพูดจริง คือเวลามีปัญหาใครจะเป็นคนปวดหัวมากกว่ากันระหว่างคนที่ไปบอกลูกค้าว่าระบบมีปัญหา กับคนที่ต้องมาแก้ปัญหาหน้างานโดยมีเวลาจำกัด แบกรับความเครียด และงานต้องออกมาถูกต้อง ไม่มีใครอยากอยู่ในสถานะนั้นดังนั้นเมื่อเขาพูดแปลว่ามันจะเกิดปัญหาแล้ว

เพลงประกอบการเขียน Blog

จงให้ความสำคัญกับทุกการพบเจอเพราะมันอาจเป็นครั้งสุดท้ายแล้วที่เราจะได้พบกัน

© 2024 Normal Programmer Blog All Rights Reserved.
Theme by hipaper