The Cloud Camp Week#11 (ฺGitOps)

สัปดาห์งาน Merge โคตร Branch เข้ามา และมีได้ข่าวอีกว่ามีเอา App Ver pre-alpha ไปส่งลูกค้าด้วย ซึ่งมันพอดีกับ Week นี้ ที่เรียนเรื่อง SemVer พอดีแบบนัดกันมาอีก 555 สำหรับหัวข้อที่เรียนใน Week นี้ตามนี้เลยครับ Semantic Versioning (Semver) แนวทางการบอกระดับของการเติบโตของ Software โดยมีรูปแบบ ดังนี้ MAJOR.MINOR.PATCH+LABEL สำหรับใน Blog ผมเรื่อง SemVer จะมีเขียนไว้แล้วในส่วนตอนเตรียมสอบ [AZ-400] Design and implement a dependency management strategy (Implement a versioning strategy) หรือจะไปดูเอกสารของ Semantic Versioning (semver.org) Git Conventional Commits รูปแบบ <type>[optional scope]: <description>[optional body][optional footer(s)] Sample Ref: Conventional CommitsTools: commitlint – Lint commit messages / typicode/husky: Git hooks made easy  woof! (github.com) Git Workflow Workflow = Guideline บอกรูปแบบการทำงาน เพื่อให้การทำงานในทางเดียวกัน และต่อเนื่องได้ – Centralized Workflow ทำงาน Branch เดียว Trunk Base ไม่มีการแตก Branch เพิ่มใช้ร่วมกัน PRO & CON – Feature…

C# Return multiple values from method

C# Logo

ช่วงนี้พยายามจะ Refactor Code เดิมที่ทำขึิน โดยพยายามแตก Code ให้ได้ Method ที่เล็กที่สุด และอยากให้มันทำ Test Coverage ง่ายด้วย ไม่อยากจะเจอภาพแบบนี้อีกแล้ว พอที่นี้พอจะ Extract Method ดันไปเจอว่า Code มันคำนวณ 2 ค่า ใช้เงื่อนไขเดียวกัน ไม่อยากไปแยก 2 Method ตอนนี้มี 2 ทางเลือก ตอนเรียกใช้ก็ประมาณนี้ครับ แล้ว Access แต่ละ Property เรียกใช้ Item1 / Item2 …. ซึ่งมันไม่สื่อเลย แต่ในลองหาข้อมูลใน C# 7 มันเปลี่ยนแล้ว มีตัว named parameters ช่วยให้ใช้งานได้ง่ายมากขึ้นเลย ลองมาปรับ Code กันครับ ตอนเรียกใช้ก็สามารถใช้งานแบบนี้ได้เลย ค่าที่ได้จาก Method sumLeftRightSide จะอยู่ตัวแปร sumAmtRightSide/sumAmtLeftSide เอาไปใช้งานต่อได้เลยครับ ไม่ต้องมาทำเป็น เรียกใช้ Item1 / Item2 …. ซึ่งมันไม่สื่อเลย Reference

The Cloud Camp Week#10 (CI/CD – GitHub Action)

สัปดาห์นี้ Slide Event ของ DevOcean แยกร่างไม่ทัน ตอนแรก Plan จะได้วันเดียว ได้ไป 2 งานซะงั้น Architecture (plan) / Backend (Unplan) และมีเรื่องวุ่นวายในที่ทำงานพอสมควรเลย หัวร้อน และงานเข้า > ง่วงมากกก Application Delivery Source code เป็น intellectual property (ทรัพย์สินทางปัญญา มีมูลค่าทางธุรกิจ) มันสำคัญ เลยมีการ Keep Version เช่น Git ตอนทำงานมีการแยกกิ่ง(Branch) เพื่อความปลอดภัย ฮ่าๆ CI/CD Continuous Deployment – Continuous Integration + Continuous Delivery Note Step Build / Test อาจจะสลับกันได้ แล้วแต่ภาษา ทั้ง CI/CD ต้องเป็น Automate เพื่อให้เกิด Fast Feedback Loop โดยเชื่อมกับตัว Version Control เพื่อให้มี Event มา Trigger CI+CD ทำงาน นอกจากตัวความถูกต้องในตัว CI/CD ยังมีตรวจเรื่องอื่นๆ security + compliance checks โดยในตอนนี้มี Keyword ใหม่ DevSecOps Popular CI/CD: Github Action / Spinnaker (เหมาะกับระบบใหญ่) / GitLab / Jenkins / Jenkins X (For K8S…

สรุป Backend Meetup 2023

งานวันนี้จัดที่ ARIS ครับของกินพร้อม หัวข้อประมาณนี้ครับ Backend Responsibility สำหรับ Session นี้เป็น Session แห่ง Keyword ครับ ว่า Backend มีอะไรที่เกี่ยวข้องบ้าง – GraphQL มาแก้ API เรื่องเดียวกัน แต่มีหลายแบบ web / mobile มี ซ้ำซ้อน graphQL มาให้ Client มาขอ Field ที่ต้องการได้เองเลย- gRPC – lightweight soap contract สรุป อาจจะไม่ต้องมารู้ทั้งหมดก็ได้ – ไม่ได้จำเป็นต้องเลือกใช้ทุกอย่าง ตามบริบทที่เจอ – แล้วตอนลงมือทำ ไม่แตะหมด อาจจะแบ่งตาม Role / Responsibility ในองค์กร สิ่งที่สำคัญ: การเก็บองค์ความรู้ (Business Domain) ที่ตัว Backend ขมวด และจัดไว้ มันที่มูลค่าทางธุรกิจ ซึ่งหลายทีจะประสบปัญหาในการดูแล เพราะ คนออก เป็นต้น Slide: BackEnd Resposibilities เรื่อง log เรื่องเล็กเรื่องไม่ log เรื่องใหญ่ ที่มาของ log: มาจาก ship’s log ที่ใช่่คำนวณความเร็วเรือ/การเส้นทางในการเดินทาง พอนานเข้าเอามาปรับใช้เรื่อง IT โดยตัว log เรื่องง่ายๆ แต่ทำปวดหัว ตอนที่ต้องมาหาสาเหตุ Is Logging a requirement?Ans: ไม่ แต่ต้องมีหลักฐานตอนทำงาน เอาไว้สืบคดี แต่ถ้าเยอะไปก็ไม่ดี Choose the Right Log Level (Ref: What…

สรุป Software Architecture Meetup 2023

จะบอกว่าไปผิดตึกด้วย 55 นึกว่าอยู่ฟอร์จูน เลยมาดูใน Event Pop อีกที เดินมา G Tower หัวข้อประมาณ ดังนี้ Architecture Kata, Learning Software Architecture by doing Pain point Software Architecture KATA – Learn by doing ทำให้ซ้ำๆจดจำ ถ้าฝั่ง Dev Code Kata เช่น โจทย์เดียวกัน แต่ท่าไม่เหมือนกัน มี constraint เช่น ห้ามใช้ if เพื่อฝึกจะได้พร้อมตอนใช้จริง – Architecture Kata Architecture Kata คิดโดย Ted Neward มาฝึก เพื่อมาลองผิด ถูกในการทำ Architecture โดยเป็นการจับกลุ่มเล็ก แบ่งกลุ่มย่อยๆ มาลองออกแบบ โดยมี Benefit Activities Key ไม่มีผิด ถูก เน้น disscussion ได้อิสระ – Architecture Session Preparation Kata Activity Resource: Architectural Katas: Practicing Architecture Saga Pattern 101: Orchestrating Distributed Transactions SAGA pattern สำหรับ distribute Architecture มีหลาย action เกิดขึ้นต่อเนื่องกัน และมีความสัมพันธ์กัน เช่น ซื้อตั๋ว และ จองโรงแรม และ จองเครื่องบิน ถ้าสำเร็จหมด ถือว่าจองทริปสำเร็จ…

บันทึก Migrate .NET Framework > .NET6

Blog นี้เขียนดองมานานมาก ตั้งแต่กลางปีที่แล้ว แล้วค้างไปทำเรื่องอื่นๆ ตอนนี้จะเปิดตัว .NET8 แล้ว ถ้ารออีก อาจจะได้แชร์ปีปลายปีหน้าแทน 555 เลยคิดว่า เขียนให้หมดดีกว่า เดี๋ยวลืม Stage แรก เป็นส่วนของการเริ่มต้นเลย ตอนแรก Code มันจะยุ่งเหยิงนิดนึง แยกให้เป็นส่วนๆ นอกจากจัดกลุ่มตาม DLL ผมเอาตัว Layer Architecture มาช่วยได้ โดยแบ่งหน้าที่ ต้องคุยตามชั้นจากบน ลงล่าง ซึ่งมีรายละเอียดดังนี้ Stage1 แยก Logic ที่มันมั่วๆ มาปน UI Code-Behide / Controller มาแตกเป็น Service / Data Access และ DTO ตอนทำแรกจะเป็น .NET Framework 4.5 กว่าจะทำเสร็จใช้ไปสักพัก ขยับเป็น .NET Framework 4.7.2 แล้ว อีกเรื่องที่ควรทำ เรื่อง Automate Test มีตั้งต้นไปบ้างแล้ว Stage2 ต่อมาได้ข่าวเรื่อง NET Core ที่มัน Run บน Linux ได้ ตอนที่ได้ข่าวว่า Microsoft จะออกตัว NET Core มาสิ่งแรกที่ทำเลย โชคดีที่เลือกแบบ Layer Artitechture ไว้ เลยยกตัว ถ้าสังเกตุจากรูป Stage2 มันมีตัวกล่อง Pipe ขึ้นมา อันนี้จะมาแก้ปัญหาของ VB6 ไม่อยากทำเพิ่มแล้ว พยายามให้ PIPE มาช่วยคุยระหว่าง VB6 – .NET Issue ที่ต้องระวังจาก Stage 1 >…

The Cloud Camp Week#09 (K8S Part4: Resource/HealthCheck/Scale/Scheduler)

สัปดาห์นี้มีเรื่องวุ่นเกี่ยวกับ Wix ToolSet กลับมาที่เรื่อง K8S ของ Week นี้ครับ จะเน้นไปในส่วนของ Power of Pod ต่ออะไรที่ทำกับ Pod ได้ หัวข้อประมาณนี้ครับ สำหรับใครที่เข้ามาจาก Google ลองดู Blog ก่อนหน้าได้ครับ Resource Management ในตัว Pod เราสามารถกำหนดการใช้งาน Resource พวก CPU / Memory / Local Ephemeral / GPU ได้จาก 2 ส่วน ได้แก่ requests / limits การกำหนดข้อมูล requests / limits จะให้ตัว kube-scheduler เอาไปเป็นเงื่อนไขในการเลือก Node ด้วย โดย resource ที่กำหนดได้มีหลายตัว แต่ที่เรียนกันมี CPU / Memory //ตาม SI Model – Sample YAML หลังจากกำหนด requests / limits แล้ว จะเป็นหน้าที่ของตัว kubelet ที่จะติดต่อ Container Runtime เพื่อคุม Resource ตาม requests / limits ที่กำหนดไว้ – Best Practice – เราจะรู้ได้ไงว่าควรตั้ง resources.requests เท่าไหร่ถึงพอ ? อันนี้เขียนเพิ่มจากวันเสาร์ที่ได้ไปทำ Lab นะ Resource: – Resource Management for Pods and…

Ubuntu: Extend your LVM (Disk) space

พอดีว่ากำลังลอง Pull Image มาเล่นอะไรเรื่อยเปท่อยไป แล้วปรากฏว่ามันแจ้ง no disk space หลังจากลองตัวสอบพื้นที่ Disk เต็มจริงๆครับ ถ้าใครอยากรู้ว่า LVM คือ อะไร ผมเขียน Blog ไว้ครับ ^__^ Extend LVM Space

XRLabel ตัดคำไทยผิดเมื่อ Export PDF

ช่วงนี้มีช่วยน้องแก้ไข Report ที่ทำด้วย DevExpress ครับ แล้วที่นี้มันเจอปัญหากับภาษาไทย ในเคสที่ว่าถ้ามีข้อความยาวๆ มันตัดได้ไม่ถูกต้องครับ มันจะแหว่งๆ แทน ตามตัวอย่างด้านล่าง เวลาเจอประโยคยาวๆ ที่ไม่มี Space เว้นวรรค มันจะตัดคำแปลกๆ ถ้าใครที่ทำพวกเอกสารคงหงุดหงิด ใน MS Word มันมี Thai Distributed ทำไมไม่ทำ อะไรประมาณนี้ – Forward Contract คือสัญญาที่ลูกค้าและธนาคารตกลงซื้อเงินตราต่างประเทศสกุลหนึ่ง และขายเงินตราต่างประเทศอีกสกุลหนึ่ง โดยกำหนดจำนวนเงิน สกุลเงิน อัตราแลกเปลี่ยน และวันที่ทำการส่งมอบล่วงหน้าที่แน่นอน ซึ่งอัตราแลกเปลี่ยนล่วงหน้าที่กำหนดนั้น ไม่ใช่อัตราตลาดในอนาคต โดยในวันที่ทำการส่งมอบ อัตราแลกเปลี่ยนล่วงหน้าอาจสูงหรือต่ำกว่าอัตราแลกเปลี่ยนในตลาด ณ วันที่ส่งมอบก็ได้ – ตามระเบียบของ<<ตัวแปร>> ผู้ซื้อหรือผู้ขายเงินตราต่างประเทศล่วงหน้าต้องมีธุรกรรมรองรับการซื้อขาย (Underlying) และแสดงเอกสารต่อหน้าธนาคาร ณ วันที่ทำสัญญา Runtime ที่เกี่ยวข้อง Try & Error ทว่าปัญหานี้ ลูกค้าจะไม่ปิด UAT ครับ เลยต้องมีระดมสมอง มาแก้ไข แล้วที่นี้หลังจากลองแก้ไขปัญหาหลายๆวิธี Final Workaround Solution หลังจากลอง Research พบคำเตือนที่ต้องระวังครับ ดังนั้นการแก้ปัญหาจะเป็น Logic ดังนี้ครับ Reference

The Cloud Camp Week#08 (K8S Part3: Store Data)

สัปดาห์นี้ก็ Store Data ล้วนๆ สำหรับ part ก่อนหน้า Volumes ก่อนที่จะมาเรื่องใหม่ต้องมา Recap ก่อนจาก Part 1 ตัว Pod มันเก็บข้อมูลได้นะ แต่จะอยู่ชั่วคราว (ephemeral) เท่านั้น ดังนั้นเราจะพบ non-trivial problems ของ App ได้ ดังนี้ default pod ไม่ได้แชร์ไฟล์กันระหว่าง container นะ ดังนั้น Volume จะมาช่วยแก้ปัญหาพวกนี้ แต่ควรมาเข้าใจตัว YAML Pattern กันก่อน YAML Pattern Volume Type ที่เด่นๆ ดังนี้ – hostPath แบบนี้จะคล้ายกับตัว docker volume โดย Volume แบบ hostPath จะเอา path ของ node ที่ pod Deploy อยู่มา map กับ pod – emptyDir สร้าง Volume เปล่าๆ ผูกกับ pod (เกิด และตายไปด้วยกัน) ไม่จำเป็นต้องใช้ Path ของ Node แบบ hostPath อาจจะใช้ memory มา config ก็ได้ โดยจะมาแก้ปัญหาการแชร์ Data ระหว่าง Container ภายใน Pod Note: emptyDir จัดการโดย kubelet emptyDir can read and write the…