Quantcast
Channel: cc :: somkiat
Viewing all 2000 articles
Browse latest View live

สิ่งที่มักเจอบ่อย ๆ ใน CI/CD

$
0
0

หนึ่งในสิ่งที่น่าสนใจมาก ๆ สำหรับ CI/CD (Continuous Integration and Delivery/Deployment)
คือเรื่องคุณภาพ และ ความเร็ว ที่เป็นหัวใจสำคัญของแนวคิดและแนวปฏิบัตินี้เลย
เป็นสิ่งที่ผิดปกติอย่างมาก (หรือเป็นเรื่องปกติไปแล้วนะ ?)

ปัญหาแปลก ๆ ที่มักเจอใน CI/CD คือ

  • ขาดการมีส่วนร่วมของทีมที่เกี่ยวข้องในการออกแบบ pipeline หรือ process
  • มีทีมมาออกแบบ pipeline หรือ process การทำงานให้เลย
  • ไม่สนใจว่า process เหล่านั้นจะเหมาะสมกับงานหรือไม่ แต่ต้องทำตาม standard process นี้เสมอ
  • การทำงานมักเริ่มที่ tool มาต่อที่ process และสั่งให้คนทำตามที่กำหนดหรือสร้างไว้ แบบนี้จะ improve ได้หรือไม่
  • คนทำงานให้ feedback ว่า process เหล่านี้ไม่ดีแล้ว แต่คนดูแลก็ไม่ได้สนใจอะไร ให้กลับไปที่คำว่า stadard process !!
  • ระบบสามารถทำการ run และ deploy ได้เร็วและบ่อย แต่คุณภาพแย่ เพราะว่า ไม่มีกระบวนการทดสอบ หรือ การทดสอบใด ๆ ยกเว้นแต่ manual test หลังจาก deploy
  • CI/CD process ไม่ stable เพราะว่า run ผ่านบ้าง ไม่ผ่านบ้าง บางครั้งช้า ๆ อีก
  • มีชุดการทดสอบ แต่ไม่สามารถทดสอบ หรือ run ซ้ำ ๆ ได้ เพราะว่า ขาดการวางแผนเรื่อง initial data และ initial dependency ต่าง ๆ
  • ขาดการทำ functional test ที่ดี และ non-functional test ที่ทำบ่อย ๆ
  • ชอบเจอ bug เยอะ ๆ ตอน deploy production มากกว่าก่อนการ deploy
  • งานหลาย ๆ อย่างสามารถนำมา run ได้ตั้งแต่เครื่องของนักพัฒนา เช่น Lint, static code analysis และ self-test เป็นต้น ไม่ต้องไปรอ run นาน ๆ หรอกนะ

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


.NET 8 :: Native AOT ใช้ได้ใน ASP.NET Core แล้ว

$
0
0

.NET 8 rc 2 ที่ถูกปล่อยออกมานั้น ได้ปรับปรุงเรื่อง performance ให้ดีขึ้นอย่างมาก
โดยความสามารถที่น่าสนใจคือ Native AOT
ซึ่งตอนนี้สนับสนุน project แบบ ASP.NET Core แล้ว
รวมทั้งสนับสนุน library ต่าง ๆ เพิ่มอีกด้วย
ดังนั้นมาลองใช้งานกันดู

ทำการสร้าง project

[gist id="3dc645ca63b62ceaab30e28333f48722" file="1.txt"]

ต่อมาทำการเปิดใช้งาน Native AOT

รวมทั้งลดการใช้งาน memory และขนาดของ app ดังนี้

[gist id="3dc645ca63b62ceaab30e28333f48722" file="api.csproj"]

ทำการ build Native AOT และ start server

พบว่าขนาดของ app จะอยู่ที่ 15 MB

[gist id="3dc645ca63b62ceaab30e28333f48722" file="Program.cs"]

ทำการ build และ start server

[gist id="3dc645ca63b62ceaab30e28333f48722" file="2.txt"]

และทำการ load test เบา ๆ นิดหน่อย ใช้ได้เลย

[gist id="3dc645ca63b62ceaab30e28333f48722" file="3.txt"]

ลอง Download มาลองใช้งานเล่น ๆ กันดูครับ

สวัสดี OpenTofu

$
0
0

จากการที่ Terraform ทำการเปลี่ยน license มาเป็น Business Source License (BSL) นั้น
ก็เกิดการพูดคุยทั้งเห็นด้วยและไม่เห็นด้วย
หนึ่งในแนวทางหนึ่งของ community
คือการ fork ในวันที่ 25 สิงหาคมมาในชื่อใหม่คือ OpenTofu

โดยมีบริษัทมากกว่า 100 แห่ง กับอีกมากกว่า 10 project ที่เข้าร่วม
ตอนนี้ใน GitHub มีจำนวน star เกิน 14,000 ไปแล้ว
และอยู่ใน Linux foundation

เป้าหมายหลัก ๆ ของ OpenTofu ประกอบไปด้วย

  • เป็น open source ที่แท้จริง
  • Community-driven ทั้งการแก้ไข bug และ เพิ่ม feature ต่าง ๆ
  • เป็นมิตรต่อคนใช้งาน
  • Backward compatibility

สามารถอ่าน Manifesto เพิ่มได้

ว่าแล้วมาลองใช้งานกันดู Install OpenTofu

สวัสดี Node.js 21

$
0
0

Node.js 21 นั้นถูกปล่อยออกมาแทน version 20 แล้ว (current version)
โดยใน version นี้จะมี feature ใหม่มาให้ทดลองใช้งาน
ส่วนถ้าจะ deploy บน production ยังแนะนำให้ใช้ version 20
มาดูความสามารถต่าง ๆ ใน version 21 กัน

  • ใช้งาน V8 JavaScript engine 11.8
  • Fetch/WebStream
  • Build-in WebSocket client
  • ทำการ update testing library ซึ่งสนับสนุน globs expression เพื่อกำหนด pattern ของ test case ที่จะทดสอบ เช่น node --test */.test.js
  • ใช้งาน experiment feature ด้วย option --experimental-default-type

Download มาลองใช้งานกันดู

[code] $node -v v21.0.0 [/code]

ใช้งาน Java Record กันได้แล้ว

$
0
0

หลังจากที่แบ่งปันความรู้เกี่ยวกับการพัฒนาระบบงาน
ด้วยภาษา Java และ Spring Boot
Spring Boot 3 นั้น ต้องใช้งาน Java 17 ขึ้นไป
แต่ยังพบว่า ยังคงใช้งาน library ชื่อ Lombok
เลยทำการแนะนำความสามารถของ Java ชื่อว่า Record
ซึ่งมีมาตั้งแต่ Java 14 แล้ว
ดังนั้นจึงสรุปความสามารถของ Java Record ไว้นิดหน่อย

ทั้ง Java Record และ Lombok นั้น มีเป้าหมายเพื่อ

  • ลด code ซ้ำ ๆ เช่น getter/setter, constructor, toString, equals และ hashcode เป็นต้น
  • ใน Lombok มี builder pattern สำหรับการสร้าง instance ของ class ให้อีกด้วย

มาดูกันว่า Java Record เป็นอย่างไร และใช้งานกันอย่างไร

  • มี keyword ใหม่ ชื่อว่า record
  • สร้างมาสำหรับ data class หรือ data model นั่นเอง
  • เป็น immutable object นั่นคือ สร้างแล้วไม่สามารถแก้ไขได้ ซึ่งเป็น final นั่นเอง
  • ทำให้ไม่ต้องมาจัดการ synchronize กันนะ
  • ทุก ๆ field/property จะเป็น final
  • จะมี gettter method ให้กับทุก ๆ field/property
  • ไม่สามารถสืบทอดได้ (inhertitance)
  • มี public constructor ให้
  • และสิ่งที่จำเป็น เหมือน ๆ กับ Lombok แต่ไม่ต้องใส้ annotation แปลก ๆ อีกต่อไป

ตัวอย่าง code ของ Record

[gist id="3796ce3779a53dd045bbc70ea19e0f8e" file="Person.java"]

เรียกใช้งาน Record

[gist id="3796ce3779a53dd045bbc70ea19e0f8e" file="DemoRecord.java"]

มาลองใช้งานกันดูครับ
ขอให้สนุกกับการ coding

Robot Framework :: SeleniumLibrary 6.1.3 แก้ไขการ ใช้งาน remote url แล้ว

$
0
0

ใน SeleniumLibrary 6.1.2 นั้น ถ้าใครใช้งาน Open Browser และกำหนดค่า remote_url
หรือใช้งานผ่าน Selenium Grid
จะพบปัญหา เมื่อไม่ใส่ options ต่าง ๆ เข้าไป
ทำให้ไม่สามารถส่ง request ไปยัง remote_url ได้

ดังนั้นจากปัญหานี้ทางทีมพัฒนา SeleniumLibrary จึงปล่อย version 6.1.3 ออกมา
ยังไม่ได้เป็น release จริงนะครับ เป็น pre-release เท่านั้น
ดังนั้น สามารถทำการติดตั้งและ update ได้ดังนี้

[code] $pip install --pre --upgrade robotframework-seleniumlibrary หรือ $pip install robotframework-seleniumlibrary==6.1.3 [/code]

ช่วงหลัง ๆ เจอ bug กันเยอะน่าดู

Docker Compose Watch ตัวเต็ม ๆ ออกมาแล้ว

$
0
0

เพิ่งเห็นว่าตั้งแต่ต้นเดือนตุลาคม Docker Compose Watch นั้น ปล่อยตัวเต็มมาแล้ว
หลังจากที่เป็น experiment feature มาให้ลองใช้งาน
เป้าหมายเพื่อช่วยให้นักพัฒนามี productivity มากยิ่งขึ้น
สนใจในการพัฒนาและ coding เป็นหลัก
ไม่ต้องมาสนใจในการสร้าง image และ container ใหม่ทุกครั้งที่เปลี่ยนแปลง
ดังนั้น Docker compose watch จะคอยตรวจสอบให้ว่าเกิดการเปลี่ยนแปลงหรือไม่
ถ้าเกิดการเปลี่ยนแปลง จะทำการ reload หรือที่รู้จักกันคือ Hot reload
โดยไม่กระทบต่อ state ปัจจุบันนั่นเอง

ใช้งานผ่าน command ดังนี้

[code] $docker compose watch [/code]

รวมทั้งมีชุดคำสั่งต่าง ๆ ออกมาเพิ่มเติมเช่น

  • docker image push --all-tags
  • docker system df -v
  • docker init สำหรับ ASP.NET

Reference Websites

มาลองใช้งาน Oracle Java Platform ใน VS Code

$
0
0

ทาง Oracle ได้สร้าง extension สำหรับการพัฒนาระบบด้วยภาษา Java ใน VS Code ออกมาให้ใช้งาน
โดยก่อนหน้านี้ Java developer จะใช้งาน extension เหล่านี้
ซึ่งมีจำนวนการติดตั้งมากกว่า 20 ล้าน

หรือใช้งานผ่าน IDE เช่น IntelliJ IDEA, Eclipse IDE และ Netbeans เป็นต้น

ด้วยการใช้งานที่มาก นั่นคือความนิมยมสูง
จึงได้ออก extension ใน VS Code มา
ซึ่งพัฒนาต่อยอดมาจาก Netbeans project แต่ปรับให้มีขนาดเล็กลง
เพื่อให้เป็น Java Language Server ที่ใช้งานใน VS Code ตาม Language Server Protocol (LSP) ได้ดี
พัฒนาด้วย OpenJDK

ความสามารถของ extension ใน version ที่ 1 นี้ประกอบไปด้วย

  • การสร้าง project สามารถเลือกได้ทั้ง Apache Maven แลพ Gradle
  • Auto-completion
  • Syntax highlight
  • Jump to definition
  • Refactoring บางอย่าง
  • JavaDoc
  • Debugging
  • สนับสนุน Unit test ด้วย JUnit

ปัญหาในการใช้งานที่น่าจะเจอกันคือ การ setting JAVA_HOME หรือ JDK

เป็นปัญหา classic ที่เจอประจำ
ดังนั้นถ้าง่ายที่สุด ให้ทำการกำหนด environment ของเครื่องก่อนคือ JAVA_HOME หรือ JDK_HOME
เพื่อให้ชี้ไปยัง directory ที่ติดตั้ง JAVA หรือ JDK (Java Development Kit) นั่นเอง

หรือไม่เช่นนั้น ก็ให้กำหนดค่าใน VS Code ไปเลย
โดยไปที่ View | Command Palette | Preferences:Open User Settings (JSON)
จากนั้นก็ใส่ค่าเข้าไปในไฟล์ คือ jdk.jdkhome หรือ java.home

ลองใช้งานกัน และ contribute ได้ที่ GitHub

Reference Websites


ตอบคำถามเรื่อง การทดสอบ Mobile app กับระบบ network

$
0
0

คำถามที่ได้รับมาคือ
ในการพัฒนาและทดสอบ mobile app นั้น
จำเป็นจะต้องทำการจัดการข้อมูลผ่านระบบ network (HTTP protocol)
ทั้งการอ่านและเขียนข้อมูล

รวมทั้งการจำลองสถานการณ์ต่าง ๆ ของ network เช่น

  • network ที่ช้า
  • กำหนดเรื่องของความเร็วได้เช่น 2G, 3G, 4G และ 5G เป็นต้น
  • กำหนดผลการทำงานได้เลย ทั้ง success และ fail

สามารถทำอย่างไรได้บ้าง ?

คำตอบและคำแนะนำเป็นดังนี้

  • สำหรับ Android จะกำหนดใน Emulator ได้เลย เข้าไปในส่วนของ seetins มีให้ครบ
  • ส่วน iOS นั้นใน xCode จะมี Network Link Conditioner ให้สำหรับ Simulator
  • ใช้งานพวก Mock/Fake server แทน แบบ external server เช่น mbtest, wiremock, mockserver, smocker และ stubby เป็นต้น
  • ใช้งาน software แบบ middleman ระดับ network แทนเช่น Charles หรือ ProxyMan เป็นต้น
  • ใช้งาน library/dependency ของภาษานั้น ๆ ไปเลย เช่น Android ก็มีพวก WebMockServer, Flaker เป็นต้น ส่วนใน iOS ก็มี MockWebServer และ Shock เป็นต้น
  • หรือจะเขียน test double เองทั้ง stub/spy/mock เองก็ได้ แต่โครงสร้างของ code ใน project ต้อง testable มากหน่อย

Reference Websites

ทำความรู้จักกับ Kamal หรือ MRSK ของ 37Signals

$
0
0

สำหรับสาย tech น่าจะเคยได้ยินข่าวที่ทาง 37Signals
หรือบริษัทที่สร้าง Basecamp และ HEY นั้น
ได้ทำการย้ายระบบงานจาก Cloud กลับมายัง On-premise
ซึ่งช่วยลดค่าใช้จ่ายลงมาอย่างมาก

ปล. ไม่ใช่บอกว่าระบบที่ใช้งาน Cloud จะไม่ดี
เพราะว่าในการเริ่มต้นนั้นจะสะดวกสบายมากขึ้น
สามารถลดการดูแลรักษา hardware รวมถึงการ scale ด้วย
แต่เมื่อถึงจุดหนึ่งก็ต้องมีการปรับเปลี่ยนเป็นธรรมดา

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

ในการย้ายครั้งนี้ ได้สร้างเรื่องมือที่ชื่อว่า Kamal หรือ MRSK มาใช้งาน

เป็นเครื่องมือสำหรับการ deploy ระบบงาน
ในรูปแบบของ container นั่นเอง
มีเครื่องมือที่ใช้ดังนี้

  • Docker
  • Traefix ทำตัวเป็น reverse proxy และ load balance รวมทั้งช่วยในการ rollout อีกด้วย

แสดงโครงสร้างดังรูป

ในการ deploy นั้นจะมีขั้นตอนดังนี้

  • ทำการสร้าง docker image ปกติ จากนั้นทำการ push ไปยัง Docker container registry
  • ทีม deploy ทำการ ssh เข้าไปยัง server ที่จะ deploy
  • ทำการ deploy ผ่าน kamal command line
  • เครื่อง server อย่างต่ำมี 2 เครื่อง คือ Application และ Database (stateless และ stateful)
  • โดยมา Traefik มาคั่นอยู่หน้า application เพื่อ route traffic จาก user เข้ามานั่นเอง ถ้าต้องการ scale ก็สามารถนำ load balance มาไว้ข้างหน้าอีกที ซึ่ง Kamal ไม่สนับสนุน ต้องทำเอง

แสดงดังรูป

ลืมบอกไปว่า Kamal พัฒนาด้วย Ruby นะครับ ดังนั้นการติดตั้งจะผ่าน gem นั่นเอง
หรือทำการ alias ผ่าน docker ได้เลย
ดูได้จาก installation document

ในการ deploy ก็ทำการสร้างไฟล์ config ในรูปแบบของ YAML ดังนี้

  • สนับสนุนไฟล์ .env
  • สนับสนุน environment variable ของ OS
  • กำหนด role ของ server ได้ ว่าจะเป็น web หรือ job schedule หรือจะใช้งาน Traefik หรือไม่
  • สามารถ custom script ต่าง ๆ ผ่าน Hooks ที่เตรียมไว้ให้ได้ ว่าแต่ละจุดต้องการให้ทำอะไรเพิ่มเติม
[gist id="f3e6f740b6513d7bd0a1b349c0c735c4" file="1.yml"]

จากแนวทางนี้ทาง Kamal จะเรียกว่า
การ deploy จาก bare metal มายัง Cloud VMs นั่นเอง
ช่วยทำให้เกิดมาตรฐานของการพัฒนา และ deploy ระบบงาน
เป็นกรอบการทำงานหนึ่งที่น่าสนใจ
ที่ถูกสร้างขึ้นมาตามความต้องการของ 37Signal นั่นเอง
แต่ก็เป็นแนวทางหนึ่ง ที่เราสามารถนำมาต่อยอดได้เช่นกัน

ทั้งเรื่องของ Zero-downtime deployment
ทั้งเรื่องของ Rolling restart
ทั้งเรื่องของ Service management
โดยใช้ผ่าน Docker ทั้งหมด

ลองศึกษาและใช้งานกันดูครับ

Reference Websites

สวัสดี Playwright 1.39 !!

$
0
0

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

เรื่องแรกที่ชอบคือ Box test step หรือ boxing ใน test.step

จะช่วยในการแจ้ง error ใน test report
เพราะว่าปกติเมื่อมีขั้นตอนไหนใน code มีปัญหา หรือ failure ขึ้นมา
จะแจ้งในบรรทัดนั้น ๆ
ทำให้ดูได้ยากว่า มีปัญหาตรง step ไหน (ถ้าเราใช้งาน test.step)
ดังนั้นถ้าต้องการให้แจ้งใน report เลยว่า failure ตรง test.step ไหน
ก็สามารถเพิ่ม config ว่า boxing: true ได้เลย

[gist id="6e610ff26af6c82afa66ca690d31c68a" file="1.ts"]

เรื่องที่สอง สามารถทำการ custom matcher ได้เลย ทำให้สะดวกมากยิ่งขึ้น

[gist id="6e610ff26af6c82afa66ca690d31c68a" file="2.ts"]

เรื่องที่สาม ใครมี fixture หรือ data test เยอะ ๆ สามารถ merge กัน เพื่อมาใช้งานได้

ตัว matcher หรือ expect ก็ merge ได้เช่นเดียวกัน

[gist id="6e610ff26af6c82afa66ca690d31c68a" file="3.ts"]

Tips เพิ่มเติม

แนะนำให้ใช้การ trace แทน video หรือ screenshot
โดยใน project ให้ทำการ config ค่า trace: 'on-first-retry' ไปเลย
ซึ่งเป็นค่าเริ่มต้นจากการสร้าง project ใหม่นั่นเอง
ส่วน video และ screenshot ก็ปิดไปเลย
ซึ่งทำให้ performance ของการ test ดีกว่าเดิมมาก
และใช้งานได้ทั้งใน local และ CI ได้เลย

ส่วนใน VSCode อาจจะเจอ error ในไฟล์ config ต่าง ๆ
ดังนั้นก็แก้ง่าย ๆ ด้วยการติดตั้ง type ของ node ไปใน test ดังนี้

[code]$npm i --save-dev @types/node[/code]

อีกอย่าง function type() ใน object ต่าง ๆ deprecated แล้วนะตั้งแต่ version 1.38
page.type()frame.type()locator.type() and elementHandle.type()
โดยไปใช้ fill() แทนนะ
และไม่ download browser ให้ใหม่แบบอัตโนมัติแล้ว สำหรับ version เก่า
ต้องทำการ download เอง ด้วยคำสั่ง $npx playwright install

Reference Websites


ตอบคำถามการนำ Redis มาใช้งาน

$
0
0

จากการแบ่งปันเรื่อง NoSQL ซึ่งทำการแนะนำ key-value database ไป
นั่นก็คือ Redis นั่นเอง และก็มีคำถามเกี่ยวกับ use case
สำหรับการนำ Redis มาใช้งาน ว่ามีอะไรบ้าง
จึงทำการสรุปคำตอบแบบคร่าว ๆ ไว้นิดหน่อยดังนี้

ถ้า use case ทั่วไปประกอบไปด้วย

  • caching data เพื่อลดการเข้าถึง database หลัก
  • การเก็บข้อมูลที่มีอายุ (expired time) เช่น session และ token ต่าง ๆ

แต่ถ้าลงไปดูถึง Data structure ที่ Redis มีนั้น

ก็สามารถแบ่งแยก use case ลงไปได้อีกดังนี้

  • String => caching data, counter ต่าง ๆ พวก global id, rate limit และ distributed locking
  • List => สำหรับจัดการข้อมูล list ที่ซ้ำ ซึ่งเก็บ list ของข้อมูล รวมทั้งนำมาใช้งาน queue ได้ เช่น lpush และ rpop เป็นต้น (FIFO) หรือไปใช้ pup/sub แทนได้
  • Set => สำหรับข้อมูล list ที่ไม่ซ้ำ ดังนั้นเอามาใช้งานเรื่องการ intersect และ union ข้อมูลได้เลย
  • SortedSet => คือ set ที่เรียงลพดับให้แล้ว ทำให้ไม่ต้องมาเรียงลำดับเองตอนใช้งาน นำมาใช้ในระบบ ranking ได้แบบง่าย ๆ เช่นพวก leader board หรือ stat/report ต่าง ๆ
  • Geolocation => เก็บและค้นหาข้อมูล location ได้อีกด้วย
  • Stream => สำหรับจัดการงาน stream data ได้เช่น log หรือ time series data ได้เลย หรือ Big data ก็ทำได้ เช่น Hyperloglog, t-digest และ Top-k เป็นต้น
  • ล่าสุดสนับสนุน Vector อีกด้วย

แต่สิ่งที่ต้องเข้าใจคือ Redis ทำงานบน memory เป็นหลัก
แต่ก็มีการ snapshot ลง file system ด้วย อยู่ที่การ config
ดังนั้นข้อมูลอาจจะสูญหายได้ถ้าระบบมีปัญหา
จึงอาจจะต้องดูว่า จะวาง architecture ของ Redis เพิ่มเติมอย่างไร
เช่น master-slave, sentinal และ cluster เป็นต้น

น่าสนใจดีกับ Domain Message Flow Modelling

$
0
0

ไปเจอ Domain Message Flow Diagram มาน่าสนใจดี
เป็น diagram สำหรับการออกแบบ flow ของ message
ที่ใช้ติดต่อสื่อสาร หรือ แลกเปลี่ยนระหว่าง actor, boundary context หรือ service/system ก็ว่าไป
เพื่อช่วยให้ทีมที่เกี่ยวข้องเข้าใจได้ง่ายยิ่งขึ้น
เป็นอีกรูปแบบหนึ่งของการพูดคุยบนภาษาเดียวกัน

โดยใน diagram ตัวนี้ จะมีสัญลักษณ์ต่าง ๆ ดังนี้

  • Actor
  • Boundary context
  • System
  • Command
  • Event
  • Query
  • Message format ของแต่ละส่วนทั้ง Command, Event และ Query

จาก diagram ตัวนี้ทำให้เราเห็น flow ของระบบงาน
แบบ end-to-end process กันเลย
รวมทั้งรูปแบบของข้อมูล หรือ message ที่ส่งกันอีกด้วย
ลองนำไปประยุกต์ใช้งานกันดูครับ
คิดว่าน่าจะมีประโยชน์พอสมควร

การทดสอบ Flutter app

$
0
0

จากการแบ่งปันเรื่อง การทดสอบ Mobile app ด้วย Appium นั้น
ซึ่งก็มี Flutter app ที่มีปัญหาเยอะพอควร
ซึ่งอธิบายไว้ใน blog บันทึกการแบ่งปันเรื่อง Mobile testing ด้วย Appium
แต่ก็มีคำถามว่า
ถ้าจะให้ทดสอบง่าย ๆ ขึ้นหน่อยทำอย่างไรได้บ้าง
จึงตอบไปดังนี้

คำตอบสั้น ๆ คือ ไม่ทดสอบแบบนี้ไง
เพราะว่าการใช้ Applium + Flutter driver เป็นการทดสอบแบบ external testing
หรือจะเรียกว่า black box หรือ gray box ก็ว่ากันไป
ซึ่งกว่าจะทดสอบได้นั้น ก็มีขั้นตอนที่เยอะ และ ซับซ้อน
แต่ก็มีข้อดีของมัน นั่นคือ เหมือนหรือคล้ายการใช้งานของผู้ใช้งานจริง ๆ นั่นเอง

แต่ถ้าจะให้ดี น่าจะเพิ่มการทดสอบเหล่านี้เข้าไป
ซึ่งใน Flutter ก็อธิบายไว้คือ Testing Flutter App
โดยมีการทดสอบ 3 แบบคือ

  • Unit test
  • Widget test
  • Integration test

ทั้ง 3 แบบนั้น ต้องเขียน code ด้วยภาษา dart + flutter นั่นเอง
ซึ่งผมมองว่าเป็น internal testing หรือ white box ก็แล้วกัน
อาจจะไม่ค่อยสร้างความมั่นใจสักเท่าใด ในมุมมองของผู้ใช้งาน
แต่ผมว่าในมุมมองของนักพัฒนามันสำคัญมาก ๆ
เพื่อช่วยทำให้เรามั่นใจว่า App ที่เราสร้าง หรือ feature ที่เพิ่มเข้ามานั้น
ในแต่ละ feature ยังคงทำงานได้ตามที่เราคาดหวังไว้เสมอ
ก็ที่จะทำการ build app ต่อไปอีกที

โดยตัวที่ผมมักให้แต่ละคนเริ่มเขียนมากที่สุดคือ Widget test

เพื่อช่วยให้เข้าใจการออกแบบ และ ทำงานของแต่ละ Widget
ก่อนที่จะนำหลาย ๆ Widget มาประกอบ และ ทำงานร่วมกัน
ดังนั้น ตั้งแต่การสร้าง เมื่อเกิด event/action ใด ๆ กับ Widget
เราสามารถทดสอบได้หมดผ่าน WidgetTester

ส่วนพวก Dependency ต่าง ๆ ก็สามารถใช้งาน Mock library ได้
เช่น Mockito เป็นต้น
อาจจะวุ่นวายหน่อยในช่วงแรก
แต่จะทำให้เราเข้าใจการทำงานของ Widget
รวมทั้งสามารถกำหนดขอบเขตการทำงานของกลุ่ม Widget ที่เราต้องการอีกด้วย
ไม่ใช่เขียน หรือ สร้างไปเรื่อย ๆ แล้วหวังว่าจะทำงานได้ตามที่เราต้องการ

เมื่อ Widget test ผ่านแล้ว ก็มาถึงการทดสอบแบบ Integration test

เป็นการทดสอบแบบผ่าน device หรือ emulator/simulator เลย
เป็นการทดสอบในภาพรวมการทำงานของ App กันเลย
ดังนั้นจึงน่าจะทำให้เชื่อมั่นขึ้นมาอีก
แต่แน่นอนว่า ก็จะช้าลงไปอีก จึงต้องทำความเข้าใจว่า เราจะทดสอบ flow อะไรบ้าง

เน้นย้ำว่า ทั้ง 3 แบบการทดสอบนั้น จำเป็นต้องเขียน code

ดังนั้นจำเป็นต้องฝึก skill การ coding ด้วยภาษา dart และ flutter กันด้วย
อย่างไปกลัวว่าต้องเขียน code เพราะว่ายังไงก็หนีไม่พ้น
ส่วนคนที่เขียน code ก็มาเพิ่ม skill การทดสอบกันด้วย
น่าจะช่วยให้เราป้องกันไม่ให้เกิด bug หรือ ข้อผิดพลาดได้อย่างรวดเร็ว
แต่ถ้าเกิดข้อผิดพลาดแล้ว เราจะไม่ผิดซ้ำที่เดิมอีกต่อไป

Go :: Gorilla Mux กลับมาแล้ว

$
0
0

นักพัฒนาระบบด้วยภาษา Go น่าจะเคยใช้งาน package gorilla/mux
สำหรับการพัฒนา web application
รวมทั้งการจัดการ session, handlers และ websocket
เป็น project ที่หาคนดูแลใหม่มาตั้งแต่ปี 2020
จนเมื่อเดือนกรกฎาคมที่ผ่านมาได้คนดูแลใหม่

และตอนนี้ได้ปล่อย version 1.81 ออกมา

Reference Websites

The Gorilla is back


มาดูการเปลี่ยนแปลงใน Robot Framework 7.0 alpha 1

$
0
0

ทีมพัฒนา Robot Framework เพิ่งปล่อย version 7.0 alpha 1 ออกมาให้ทดลองใช้
โดยมีทั้งความสามารถใหม่ ๆ และ สิ่งที่ deplicated
ประกอบไปด้วยดังนี้

เริ่มจากความสามารถใหม่ ๆ และการปรับปรุง

  • ใช้ Python 3.8 ขึ้นไป
  • เปลี่ยนแปลงไฟล์ output.xml ซึ่งใช้กับ version 6 ไม่ได้ หลัก ๆ เปลี่ยนเรื่องของ format timestamp นั่นเอง
  • เพิ่มการประกาศตัวแปรใน test case หรือ keyword ได้ โดยสร้างได้แบบ local variable และ global variable นั่นคือกำหนด scope ได้ ดังตัวอย่าง
[gist id="cc5eb2c813ebed6064d551df6551eb52" file="1.robot"]

ในการสร้าง keyword ด้วยภาษา python จะสนับสนุนรูปแบบของ argument แบบปกติ และ embedded ได้

[gist id="cc5eb2c813ebed6064d551df6551eb52" file="2.txt"]

สิ่งที่ deprecated และจะแจ้ง warning

  • ถ้าใช้งาน Test Case และ Setting จะแจ้ง deprecated message ขึ้นมา
  • [Return] ใน keyword ให้เปลี่ยนไปใช้งาน RETURN แทน

ลอง update มาทดลองเล่นกันดู

[code] $pip install robotframework==7.0a1 [/code]


การใช้งาน Docker compose watch สำหรับ Vite

$
0
0

คำถามจากการแบ่งปันเรื่องการพัฒนาระบบงานด้วย Docker
หนึ่งในคำถามที่น่าสนใจจาก Frontenf developer คือ
ในการพัฒนาระบบด้วย Vite + ReactJS นั้น
จะทำให้ dev พัฒนาได้สะดวกอย่างไร
ยิ่งเรื่องของ Hot Reload ก็อยากให้ใช้ได้ด้วย
ดังนั้นจึงมีคำแนะนำดังนี้

ก่อนอื่นต้องเข้าใจก่อนว่า project ที่สร้างด้วย Vite นั้นจะ run ได้แค่ local

แสดงในการ run ดังนี้

[gist id="51055a0fbcf301be69f4d89d1a353402" file="1.txt"]

ดังนั้นต้อง expose ออกมาก่อนด้วยการเพิ่ม option --host ใน package.json ดังนี้

[gist id="51055a0fbcf301be69f4d89d1a353402" file="package.json"]

ผลการทำงานเป็นดังนี้

[gist id="51055a0fbcf301be69f4d89d1a353402" file="2.txt"]

จากนั้นทำการสร้างไฟล์ Dockerfile สำหรับการ build image แบบง่าย ๆ ดังนี้

[gist id="51055a0fbcf301be69f4d89d1a353402" file="Dockerfile"]

สำหรับ Docker compose watch ก็ให้สร้างไฟล์ docker-compose.yml ดังนี้

ซึ่งทำหน้าที่เหมือนกับ Hot reload นั่นเอง

[gist id="51055a0fbcf301be69f4d89d1a353402" file="docker-compose.yml"]

คำอธิบาย

  • ทำการ run ด้วยคำสั่ง docker compose watch
  • ให้ทำการ watch ไฟล์ใน directory ./ ของเครื่อง host โดยที่ sync กับ directory /app ใน container
  • ไม่สนใจ ditectory node_modules/
  • ให้ทำการ rebuild image ใหม่ และสร้าง container ใหม่ เมื่อไฟล์ package.json มีการเปลี่ยนแปลง

เพียงเท่านี้ก็ใช้งานได้แล้ว
ซึ่งใช้งานเฉพาะ development mode เท่านั้นะครับ

สวัสดี .NET Aspire

$
0
0

ทาง .NET 8 เพิ่งปล่อยตัวเต็มออกมาให้ใช้งาน
โดยมี project หนึ่งที่น่าสนใจออกมาเช่นกันคือ .NET Aspire
เป้าหมายเพื่อเพิ่ม productivity ในการสร้าง Cloud Native Application
โดยใน project ที่สร้างขึ้นมานั้น จะมี technology ละ library ที่จำเป็น เช่น

  • Healcheck
  • YARP
  • HTTP client factory
  • gRPC
  • Observability เช่น Log aggregation เป็น structured log ด้วย, Application Metric และ Distributed tracing ด้วย OpenTelemetry
  • Resilience pattern เช่น Circuit breaker เป็นต้น
  • Container
  • Support Native AOT
  • Service Discovery

มาลองใช้งานแบบง่าย ๆ กัน

เริ่มต้นด้วยการติดตั้ง .NET 8 ก่อน

จากนั้นก็ตั้งตั้ง .NET Aspire workload ดังนี้

[gist id="544cb3d5b4e0bc598473bf43640c4ea3" file="1.txt"]

ต่อมาทำการสร้าง project ด้วย aspire-starter เล่น

และทำการ run ตัว App Host project ดังนี้

[gist id="544cb3d5b4e0bc598473bf43640c4ea3" file="2.txt"]

เข้า web browser เปิด url นี้ http://localhost:15078
ซึ่งเป็น dashboard สำหรับ project
มี feature เพียบให้ใช้งานทันที เช่น

  • Logging
  • Tracing
  • Metric

แสดงดังรูป

เป็น list ของ project ว่ามีอะไรบ้าง ซึ่งจาก starter จะมี
api และ web project มาให้

ไปดู tracing กันนิดหน่อย

เท่าที่ดูก็ดูง่ายดีนะ ครบตามที่ application ควรจะต้องมีด้วย
ไว้ลองเล่นเพิ่มเติมกันนะครับ

Reference Websites

ว่าด้วยเรื่องของ EventCatalog

$
0
0

ในโลกของ Event-Driven Architecture นั้นมักจะมีการออกแบบ event ต่าง ๆ
สำหรับติดต่อสื่อสารระหว่างส่วนการทำงาน
แต่สิ่งหนึ่งที่มักจะขาดหายไปคือ เอกสารของแต่ละ event ว่ามีรายละเอียดอย่างไร
แต่ละ event ข้าม service หรือ domain อะไรบ้าง
ดังนั้นถ้ามีเครื่องมือมาช่วยจัดการน่าจะดีขึ้น
หนึ่งในเครื่องมือที่น่าสนใจคือ EventCatalog

ดังนั้นลองมาทำความรู้จักกับ EventCatalog กันหน่อย

มาดูความสามารถหลัก ๆ ของ EventCatalog

  • การเขียนอธิบายรายละเอียดของ Event ในรูปแบบของไฟล์ Markdown
  • สามารถค้นหา และ แสดงผลแบบสวย ๆ ของ Event และ Service ต่าง ๆ ได้ง่าย
  • สนับสนุน Event Schema และ versioning

ตัวอย่างการเขียนเอกสาร Event ด้วย Markdown format

[gist id="f3ce0c6742d7032796af8f3005975fdd" file="1.txt"]

โดยในแต่ละ event ประกอบไปด้วย

  • ชื่อ และ รายละเอียด
  • comsumer และ producer
  • owner

ส่วน Service/Domain ก็เขียนอธิบายได้ด้วย Markdown format เช่นกัน

[gist id="f3ce0c6742d7032796af8f3005975fdd" file="2.txt"]

สามารถทำการจัดเก็บ แสดงผล และ ค้นหาได้ดังรูป

ในแต่ละ service จะแสดงผลดังนี้

แสดงรายละเอียด ความสัมพันธ์กับ event
รวมทั้งสามารถ integrate เข้ากับ OpenAPI ได้ด้วย

และยังดู Visualize ในภาพใหญ่ได้อีกด้วย

มาใช้งานผ่านการติดตั้งดังนี้

[code] $npx @eventcatalog/create-eventcatalog@latest my-catalog [/code]

ลองใช้งานกันดูครับ

Postman :: ถ้าต้องการ skip request ทำอย่างไร ?

$
0
0

มีคำถามที่น่าสนใจ สำหรับการทดสอบแบบ workflow ใน Postman
รวมทั้งการสร้าง flow แบบมีเงื่อนไข
เช่น ถ้าเป็น case A ให้ทำงานตาม request นี้ แต่ถ้าไม่ก็ข้ามไปทำ request ต่อไป
จะต้องทำอย่างไรดีใน Postman

คำตอบที่มีคือ

  • ถ้าให้ดีก็อย่าไปทำ
  • ถ้าอยากทำ สามารถทำได้ใน Pre-request scripts นั่นเองในแต่ละ request

โดยที่ Script ที่อยู่ใน Pre-request นั้น
จะทำการก่อนที่จะ run request
ซึ่งเราสามารถไปเรียกใช้งาน หรือ call ไปยัง API ต่าง ๆ ได้
หรือเรียก request อื่น ๆ ได้
รวมทั้งยังสามารถ skip request หรือไม่ run request นี้ได้อีกด้วย
ด้วยการเขียนดังนี้

[code] pm.execution.skipRequest() [/code]

แสดงดังตัวอย่าง

เพียงเท่านี้ก็จัดการ flow ได้แบบง่าย ๆ แล้ว

Reference Websites

Viewing all 2000 articles
Browse latest View live