My Experiment: Kubernetes from scratch

Hello everyone, today I’d like to share my experiment with containerd and try to start them from scratch, so I don’t need to install this package from other package manager in linux system.

Why containerd?

Containerd is lightweight of containerized engine. Mostly container tool like Docker use it (also Kubernetes in the future).

Download containerd

Install containerd follow up guideline, or download container.d binary, and then copy binary files into /usr/local/bin/


Why we should use Go2?

Go will release to support Generic Type. In my opinion, it’s big changed and impact to all Go Developer. It may make our life easily to develop function and method without code duplication. Basically we do that. For now they don’t release yet, so we must learn it and prepare yourself. I think many project will migrate to this one, so you’d like to read other project you must know about it.

Guide from Go2Go Readme


For today I review about fundamental of Git again because I forgot some content like Merge vs Rebase, Git workflow, Worktree, etc. Suddenly I found keyword Git for Data, so I’d know what is difference with Git, so I learn and write in this blog.

What is Dolt?

Dolt is opensource SQL database. You can run base command like Git for manage your data, create new branch, checkout to it, insert new data, commit them, get log information, and diff changed data. They have private and public repository on Dolthub.

In my opinion, it’s so familiar with Git, but doesn’t exactly the same…


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

มาเริ่มกันเลย…

เล่าปัญหาและความจำเป็น

ต้องบอกก่อนว่าโจทย์แก้ปัญหาที่ผมทำส่วนใหญ่จะให้เรารับค่ามา แล้วเอาค่าไปประมวลผลบางอย่างให้ได้ผลลัพธ์ตามที่โจทย์ต้องการ แล้วแสดงผลออกทางหน้าจอ ซึ่งวิธีการเดิมที่ผมใช้อยู่ก่อน คือ สั่ง compile กับ run แล้วก็นั่งพิมพ์ input เข้าไปทีละตัว หรือบางครั้งจะใช้วิธีเอา input ใส่ลงไฟล์ แล้วส่ง input เข้าไปในโปรแกรมโดยใช้พวก I/O Operator แทน แล้วเปลี่ยนให้เขียน output ลงไฟล์ด้วย จากนั้นค่อยเอาไฟล์ output ที่คาดหวังกับ output ที่ได้จากโปรแกรมที่เขียนมาเทียบกันโดยใช้โปรแกรมพวก diff จากที่เห็นยุ่งยากน่าดูเลย เพราะต้องสั่งรันแบบนี้ตลอดที่รันโปรแกรม ผมเลยมองหาวิธีอื่นๆ ที่มาช่วยให้ผมไม่ต้องทำแบบนี้ซ้ำๆ ครับ

จนมาเจอว่าเจ้า Golang เองก็มี Pipe ให้ใช้นะ แล้วพวก Package Fmt กับ Log ใน Golang เนี่ย ส่วนใหญ่เขียนลง Standard Output ทั้งนั้นเลย ผมเลยคิดว่า ถ้าผมสามารถดักเจ้า Standard Output ได้ ผมจะสามารถเอา Output ที่ได้จากโปรแกรมมาเทียบกับ Output ที่ผมเตรียมไว้ได้ โดยจะเขียนทั้งหมดให้อยู่ในไฟล์ Test ไปเลย ส่วนเรื่อง Input ก็แค่เปิดอ่านจากไฟล์ แล้วส่งเข้าไปใน Standard Input เลย ประมาณนี้ครับ…


สวัสดีครับ วันนี้ผมก็อยากมาแชร์สิ่งที่ได้รับในวันนี้ ให้อ่านกันครับ

วันนี้ก็ได้มีโอกาสเข้าไป Co-training มาครับ ซึ่งวันนี้ช่วงเช้าก็ได้พี่ ๆ พาทำเรื่องของ A-DAPT Blueprint โจทย์เป็นโจทย์การโอนเงินกับโจทย์ตัด Point ครับ โดยพี่ ๆ ก็พาไล่จนถึงการแตก Task งานเลย จากนั้นก็ให้ทีมที่เป็น Developer (Dev) ไปรวมกับทีมที่เป็น Business Analyst (BA) เพื่อทำเรื่องของ Refinement ด้วยครับ

ได้รู้จักจริง ๆ ว่าการทำ Refinement กับออกแบบ A-DAPT Blueprint แบบหลาย Scenario การทำแยก Customer Visible โดยส่วนนี้จะเป็นการพูดคุยเรื่องของ Business ซะมากกว่า แล้วก็ให้ทีม Dev นำไปออกแบบพวก Logic Function การทำงานอีกทีนึง

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

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

วันนี้ก็ได้พี่ ๆ มาช่วยตอบบางส่วนแล้วว่า จริง ๆ แล้ว ส่วนต่าง ๆ ที่มีใน A-DAPT Blueprint เนี่ย มันขาดกันไม่ได้เลย เนื่องจากถ้าเรามีแค่ UI เราก็รู้นะว่าเราจะต้องมีการทำงานที่ผู้ใช้เห็นยังไง แต่ถ้าเราไม่มี Acceptance Test ด้วย ก็ทำให้เราไม่เห็นอยู่ดีว่าสิ่งที่เราทำนั้นมันถูกต้องหรือเปล่า อะไรแบบนี้

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

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

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

ขอบคุณครับ :D


สวัสดีครับ วันนี้ผมก็อยากมาเล่าให้ฟังครับ ว่าวันนี้ผมได้รับอะไรมาบ้างครับ

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

สุดท้ายก็ไม่เสร็จ แต่ที่ได้เพิ่มขึ้นก็แค่เรื่องของการแยก Package ที่ใช้ Test ออกจาก Package ของ Production Code

ก็ได้พยายามปรับ Coding Standard ของตัวเองด้วย เพราะมีที่ได้รับมาจากพี่ปุ๋ยบ้าง ส่วนตัวในภาษา Go ก็ถือว่าเป็นเด็กใหม่มาก ๆ ครับ เรื่องเครื่องมือ เรื่อง Syntax ภาษาก็ยังไม่แม่นดี แถม Go Tour ก็ยังเล่นไม่จบเลย

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

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

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

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

ดังนั้น ช่วงนี้จะต้องฝึกเพิ่มขึ้นอีกเยอะเลยครับ

ขอบคุณครับ :D


สวัสดีครับ สำหรับวันนี้ผมก็อยากมา Reflect สิ่งที่ได้ในวันนี้ให้อ่านกันครับ

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

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

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

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

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

สำหรับตัวผมตอนนี้ก็นับว่าโชคดีมาก ๆ ที่ได้รับรู้ว่าตัวเองต้องปรับปรุงอะไร ก่อนที่จะสายไปกว่านี้ครับ

ขอบคุณครับ :D


สวัสดีครับ วันนี้ก็ขอสั้น ๆ สำหรับการ Reflect ตัวเองครับ

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

ยังต้องปรับเรื่องของ Syntax Go ด้วย เพราะบางอย่างที่เอามาใช้ยังเข้าใจมันยังไม่ดีพอ ก็เอามาใช้แล้ว พอเกิดปัญหาก็เลยติดยาว ๆ เป็นต้น

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

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

ตลอดช่วงเวลาที่ต้องทำงานครับ

ขอบคุณครับ :D


สวัสดีครับ วันนี้ผมอยากแชร์เรื่องของการเปลี่ยนจาก Manual Test ไปเป็น Automation Test แค่ในมุมมองของผมเองนะครับ

ว่าด้วยเรื่องของการทำ Manual Test

โดยปกติ ถ้าพี่ต้องการทดสอบหน้าเว็บ พี่ต้องทำยังไงกันบ้างครับ

ต้องรอให้โค้ดเขียนเสร็จ แล้วค่อยทดสอบ ถูกไหมครับ

หลังจากนั้นเราก็ค่อยเอาเคสที่ต้องทดสอบ ขั้นตอนการทดสอบ มาทดสอบตามขั้นตอนที่พี่ออกแบบรอเอาไว้ (เช่น Excel เป็นต้น)

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

อีกอย่างนึงคือขั้นตอนแต่ละอย่างมันก็ดูซ้ำ ๆ เนอะ

เคสเดิม อินพุตเดิม ค่าที่อยากได้ก็แบบเดิมเป๊ะ

แถมใช้เวลาเยอะด้วยนะ ในการทดสอบแต่ละรอบ

แล้วการที่พี่ต้องมานั่งทดสอบอยู่แบบนี้ ไม่เหนื่อยบ้างเหรอครับ?

ถ้ารู้สึกเหนื่อย โลกนี้ก็มีตัวช่วยครับ แต่ก่อนจะหาตัวช่วย พี่ต้องช่วยตัวเองก่อนนะ ซึ่งพี่ ๆ ที่ทำหน้าที่นี้ส่วนใหญ่ ก็คงคล่อง Manual Test กันอยู่แล้วแหละ

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

อ้าวน้อง แบบนี้พี่ก็ตกงานหนะสิ?

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

Automation

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

ถ้าเทียบให้เห็นภาพชัดขึ้น

  • Input คือ สิ่งที่พี่ต้องป้อนเข้าไป (Input)
  • Output คือ สิ่งที่พี่อยากได้ถ้าใส่ อินพุตเข้าไปแล้ว (Expected Result)
  • CPU คือ การทำงานของโปรแกรมที่พี่โปรแกรมเมอร์ต้องไปทำมาให้ได้ (Action)
  • Memory คือ ตอนที่พี่ทดสอบเนี่ย พี่ก็ต้องจำใช่ไหมครับ ว่าทำขั้นตอนไหนไปบ้างแล้ว

แล้วทำไมตอนทดสอบยังต้องใช้คนมาทดสอบกัน ทำไมไม่ใช่คอมพิวเตอร์ละ?

ซึ่งทั้งหมดทั้งมวลที่ผมไล่มาให้พี่ ๆ อ่านทั้งหมด ก็อยากจะบอกว่า

จริง ๆ แล้ว Automation Test ไม่ได้เปลี่ยนวิธีคิดของพี่มากนัก แค่เปลี่ยนวิธีการทำงานแค่นั้นเองครับ

ขอบคุณครับ :D

ปล. เดี๋ยว Blog หน้า มาต่อเรื่องของ Automation Test อีกนะครับ


สวัสดีครับ วันนี้ผมอยากมาแชร์ให้ฟังเกี่ยวกับเรื่องของ Database ที่ได้เรียนรู้มาครับ

เล่าเรื่องวันนี้

Database คือ ที่เก็บข้อมูลประเภทหนึ่ง มี 2 ประเภทคือ แบบมีโครงสร้าง กับแบบไม่มีโครงสร้างครับ

  • แบบมีโครงสร้าง ก็พวก MySQL MongoDB
  • แบบไม่มีโครงสร้าง ก็พวก LevelDB

แล้วมันต่างกันยังไงละ

แบบไม่มีโครงสร้าง คือ ไม่ได้สนใจว่าข้อมูลจะเก็บยังไง ก็แค่ให้เก็บลงไปได้

แต่ถ้าเป็นแบบมีโครงสร้างก็จะเน้นไปที่รูปแบบของการเก็บข้อมูลด้วยครับ เช่น MongoDB ก็จะเก็บเป็นแบบ JSON ประมาณนี้ครับ

และแบบมีโครงสร้างก็ยังมีได้อีก 2 ประเภท คือ SQL (Structured Query Language) และ NoSQL ครับ โดยจะแบ่งจากวิธีการจัดการกับข้อมูลข้างใน Database ครับ

รู้จักกับ CAP Theorem

เป็นทฤษฏีนึงที่ช่วยในการเลือก Database ที่ต้องใช้ให้เหมาะสมกับงานครับ โดยงานในที่นี้จะเน้นไปในเรื่องของการ Scale และการให้บริการครับ

Consistency — ข้อมูลจะต้องอัพเดตอยู่เสมอ

Availability — ข้อมูลจะต้องพร้อมใช้งานอยู่ตลอดเวลา

Partition Tolerance — ทำงานต่อได้ แม้จะมีโหนดใดโหนดนึงเสียไป

จากสามเหลี่ยมด้านบน เราไม่สามารถเลือกได้ทั้งสามอย่างนะ เลือกได้แค่สองอย่างเท่านั้น ถ้าเราเลือก Consistency กับ Availability จะทำให้เราเสียเรื่องของ Partition Tolerance ไปครับ

สรุป

วันนี้ผมก็ได้รู้จักเรื่องของ Database มากขึ้น จากที่ไม่รู้จักเจ้า CAP Theorem เลยพอได้ยินคำนี้ก็ลองมาหาอ่านเพิ่มอีก ก็ลองเขียนในมุมที่ตัวเองเข้าใจนะครับ เพราะปกติรู้จักแต่ MySQL

ก็ได้รู้เพิ่มขึ้นอีกว่า

โลกนี้ไม่ได้มีแค่ MySQL นะครับ

ขอบคุณครับ :D

Nattakit Boonyang

Fail Fast, Succeed Faster 🚀

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store