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

สวัสดี Spring AI

$
0
0

เห็นว่าทาง Spring framework นั้นได้ปล่อย Spring AI 0.8.0 ออกมา
ช่วยให้นักพัฒนาสามารถ integrate หรือ พัฒนาระบบงาน
ทำงานร่วมกับ Generative AI ได้ง่าย
เป็นแนวคิดเดียวกับ LangChain และ LlamaIndex ในภาษา Python นั่นเอง

ตามแนวทางของ Spring นั้น ก้ได้เตรียม interface สำหรับการพัฒนาแบบง่าย ๆ ขึ้นมา
ซึ่งมี component ต่าง ๆ ดังนี้

  • AiClient จะสนับสนุนการเชื่อมต่อไปยัง OpenAI และ Azure OpenAI ซึ่งเลือกและใส่ API Key ตามปกติ
  • Prompt สำหรับรูปแบบของ message ที่ส่งไป โดยสามารถทำการ custom หรือ กำหนด format ตามที่ต้องการได้ผ่าน Prompt template เช่น As a {role}, {message} todo !! เป็นต้น
  • AiResponse สำหรับคำตอบหรือผลลัพธ์ที่ได้รับกลับมา

การใช้งานพื้นฐาน

ทำการสร้าง project และ import library มาใช้งาน
ยกตัวอย่างใช้งานผ่าน Apache Maven

[gist id="94656ea4d45951c9008788cb2445c8d9" file="pom.xml"]

จากนั้นกำหนด API Key ในไฟล์ application.yml ดังนี้

[gist id="94656ea4d45951c9008788cb2445c8d9" file="application.yml"]

สุดท้ายก็เขียน code เพื่อสร้าง prompt และ ส่งไปยัง Open AI

[gist id="94656ea4d45951c9008788cb2445c8d9" file="Demo.java"]

เป็นสิ่งง่าย ๆ ที่ทาง Spring framework เตรียมไว้ให้
ตามจริงเขียนเองก็ได้นะ !!


สวัสดี Signal Inputs ใน Angular 17.1.0

$
0
0

หลังจากที่ Angular 17.1.0 ตัวเต็มถูกปล่อยออกมา
หนึ่งในความสามารถที่น่าสนใจคือ Signal Inputs
ซึ่งก่อนนี้จะมีเรื่อง Signal ที่จะจัดการ state และการ render มาก่อนแล้ว
ดังนั้นเรามาดูกันว่า Signal Inputs มันเป็นอย่างไร และ ใช้งานอย่างไร

เริ่มด้วยด้วยการติดตั้ง หรือ upgrade Angular 17.1.0 ก่อน

[gist id="9d7346b964fb84201d4887b525d57f85" file="1.txt"]

ปกตินั้นในการส่งข้อมูลมายัง component จะใช้งานผ่าย Decorator Input
ตัวอย่าง code เป็นดังนี้

[gist id="9d7346b964fb84201d4887b525d57f85" file="demo01.ts"]

มาดู Signal Inputs กัน ว่าเป็นอย่างไร ?

[gist id="9d7346b964fb84201d4887b525d57f85" file="demo02.ts"]

ดูง่ายขึ้นไหม ?
จากนั้นถ้า Signal Input มีการเปลี่ยนแปลง
สามารถดักจับด้วยการใช้งาน function effect() ที่มีมาตั้งแต่ Angular 17 ได้เลย
และทำการ sub/unsub พวก service ต่าง ๆ ได้แบบง่าย ๆ

[gist id="9d7346b964fb84201d4887b525d57f85" file="demo03.ts"]

เริ่มเขียน code แบบอ่านง่าย ๆ เข้าใจง่าย ๆ ขึ้นมาอีก
ขอให้สนุกกับการ coding

Reference Websites

หนังสือ Learning Go 2nd edition ออกมาแล้ว

$
0
0

เพิ่งเห็นว่าหนังสือ Learning Go 2nd edition ปล่อยออกมาแล้ว
โดยจะมีทั้งหมด 16 บท มีการเปลี่ยนแปลงจาก first edition พอสมควร
เรื่องจาก ecosystem ของ Go ก็เปลี่ยนไปเยอะพอสมควร
ทั้งเรื่องของ version
ทั้งเรื่องจากการสร้าง project ที่มาเป็น Go module แล้ว
ทั้งเรื่องของ Go tool ที่เพิ่มและลบออกไป
ทั้งเรื่องของ feature ใหม่ ๆ ที่เพิ่มเข้ามา เช่น generic, loop var, fuzzing และ structured log เป็นต้น
และได้เพิ่มแบบทดสอบในทุก ๆ บทให้อีกด้วย

ในหนังสือเล่มนี้ จะเริ่มจากการสร้าง project
ที่เปลี่ยนมาใช้ Go module แล้ว
รวมทั้ง Go tools ที่ควรต้องรู้และใช้งาน เช่น

  • go build
  • go run
  • go fmt
  • go vet
  • go mod
  • go work
  • go list
  • go get
  • go test
  • staticcheck

รวมทั้งการใช้งาน Makefile และผมขอเพิ่ม Taskfile เข้ามาด้วยจะแจ่มมาก ๆ
อีกเรื่องที่เน้นมาก ๆ คือ stay-up-to-date ด้วยนะ

ส่วนเรื่องของ Generic เพิ่มเข้ามา 1 บทเลย ซึ่งอยู่ในบทที่ 8

การจัดการ error ก็มี multiple error เข้ามาให้แล้ว errors.Join(errs…)

การใช้งาน embed ที่น่าสนใจ

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

ทำการอธิบาย standard library ต่าง ๆ ที่น่าสนใจ เช่น

  • io
  • time
  • encoding/json
  • errors
  • sync
  • context
  • testing
  • reflect
  • unsafe
  • net/http
  • log/slog

Code ตัวอย่างของหนังสืออยู่ที่ GitHub

ใครสนใจในการพัฒนาภาษา Go
เป็นหนังสืออีกเล่มที่แนะนำให้อ่านครับ

สวัสดี AHA Stack

$
0
0

มาดู technology stack ใหม่ที่น่าสนใจ
สำหรับการพัฒนาระบบ web application ชื่อว่า AHA
โดยประกอบไปด้วย

เป็นแนวคิด back to basic คือ HTML over the wire
ลดขนาดของ JavaScript ที่ run บน web browser ลงไป
ด้วยการส่ง HTML กลับมาจาก server เลย ( partial HTML หรือส่งมาเท่าที่เปลี่ยน)
ไม่ใช่ส่ง JSON กลับมา แล้วเขียน JavaScript มา parser อีก
นั่นคือการใช้งาน HTMX กับ Alpine.js นั่นเอง
โดยในส่วนของ backend พัฒนาด้วย Astro

แนวคิดที่สำคัญคือ มี dependency ให้น้อย หรือ เท่าที่จำเป็นเท่านั้น

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


ไว้ลองเขียนระบบงานด้วย AHA Stack เล่นดู
น่าสนุกมาก ๆ

ลองเล่นกับ Bun Shell

$
0
0

เห็นใน feed พบว่ามีการพูดถึง Bun Shell เยอะเลย
ก็เลยลองเล่นนิดหน่อย
ซึ่งเป็นความสามารถใหม่ ที่ทำให้เรา
เขียน javascript ทำงานกับ shell หรือ คำสั่งต่าง ๆ ใน command line ได้ง่าย ๆ
โดยเขียนในไฟล์เดียวกัน และ ภาษาเดียวกันไปเลย

ดังนั้นจึงมาลองเขียน code เล่นกันหน่อย

ก่อนอื่นทำการ update Bun
ตอนนี้ผมใช้งาน Bun 1.0.25 ดังนี้

[gist id="775246978c1394d7faf9442e0fc4b689" file="1.txt"]

จากนั้นลองมาเขียน code เพื่อทำงานกับ Bun Shell เล่นหน่อย

สิ่งที่ต้องการเป็นดังนี้

  • ให้ทำการแสดงขั้นตอนการทำงานของ program ออกมาที่ console ให้ sleep 1 วินาที
  • ทำการดึงข้อมูลจาก REST API ด้วย fetch
  • ทำการบันทึกข้อมูลที่ได้มาลงไฟล์ ซึ่งใช้การ reditect output ลงไฟล์
  • ทำการอ่านข้อมูลในไฟล์ด้วยคำสั่ง cat
  • ทำการเปลี่ยนแปลงค่าของ envirinment variable และดึงด้วย javascript

โดยที่ code เป็นดังนี้ ดูมั่ว ๆ กันดี
จะดูแปลก ๆ หน่อย แต่ก็ทำได้นะครับ

[gist id="775246978c1394d7faf9442e0fc4b689" file="demo.js"]

ทำการ run ดูหน่อย

[gist id="775246978c1394d7faf9442e0fc4b689" file="2.txt"]

สามารถดู code เพิ่มเติมได้ที่ Bun Doc :: Shell
Project ที่คล้าย ๆ กัน เช่น

มาลองใช้งาน Docker Build Cloud กัน

$
0
0

ทาง Docker เพิ่งปล่อย Docker Build Cloud ออกมา
สำหรับการช่วย build docker image ให้ง่ายและรวดเร็วขึ้น
เนื่องจากข้อมูลของทาง docker พบว่า
ทีมพัฒนาต้องเสียเวลาในการ build อย่างต่ำวันละ 1 ชั่วโมง
จากคำสั่ง docker image build หรือ หรือ buildx สำหรับ multi-platform

โดยเป็นระบบทำงานบน cloud ซึ่งจะจัดการเรื่องต่าง ๆ เหล่านี้

  • Cache จากการ build ให้ รวมทั้งการ share cache ในทีมเดียวกันได้อีกด้วย
  • มี resource ที่เยอะ สามารถ scale ได้
  • สนับสนุน multi-platform

จากเอกสารบอกว่า build ได้เร็วกว่าปกติ 39 เท่า !!
ลองไปดู pricing กันได้

มาลองใช้งานกัน

ปล. ผมเลือกใช้งานแบบ free !!

เริ่มจากการลงทะเบียน และ เลือก price plan ก่อน

จากนั้นก็สามารถใช้งานผ่าน docker cli ได้เลยดังนี้

  • ทำการ login
  • ทำการสร้าง builder สำหรับใช้งาน remote builder
  • ทำการ build image ซึ่งต้องสร้าง Dockerfile เช่นเดิม เพิ่มเติมคือไป run ที่ Docker Build Cloud แทน
[gist id="e85e2a6ccca99d9af0dbf9a950ccf1b9" file="1.txt"]

มีการแสดงการ build ที่ Dashboard ใน Docker Desktop ด้วยนะ

ลองใช้งานกันดูครับ เป็น Early Access Program

สรุปการแบ่งปันเรื่อง JavaScript Testing (every day) จากงาน BKK.JS #19: Into the New Year

$
0
0

มีโอกาสมา sharing เรื่อง JavaScript Testing 0-7 (every day) ในงาน BKK.JS #19
โดยการแบ่งปันครั้งนี้ใช้เวลา 30 นาที
มีเนื้อหาคร่าว ๆ ดังนี้

  • คำถามหลักคือ เราทดสอบไปทำไม ? เพื่อให้เข้าใจเกี่ยวกับความต้องการทั้งเชิง business และ technical
  • ปัญหาของการส่งมอบ software ทั้งเรื่องคุณภาพ และ ปริมาณที่ส่งมอบ เราสนใจอะไรบ้าง
  • รูปแบบของการทดสอบระบบงาน เช่น ice-cream cone, pyramid testing, cupcake testing และ trophy testing เป็นต้น เพื่อให้เห็นแนวคิดและรูปแบบต่าง ๆ ที่น่าสนใจ
  • การพัฒนาและส่งมอบแบบ incremental นั่นคือส่งแบบ feature-by-feature จากนั้นคำว่า เสร็จ คือ ต้อง coding เสร็จ และ ทดสอบเรียบร้อย
  • แนวทางการทดสอบทั้งแบบ manual และ automation ว่ามีที่มาที่ไป และ trade-off อย่างไรบ้าง

จากนั้นเข้าสู่การทดสอบระบบงานด้วย JavaScript

โดยที่ JavaScript นั้นจะมีใช้งานทั้งฝั่ง frontend และ backend
ดังนั้นจะมี library ที่อาจจะเหมือน หรือ ต่างกันได้
ยกตัวอย่างเช่น

  • Web browser testing ใช้งาน Playwright, Cypress และ Selenium เป็นต้น
  • API testing หรือ Backend testing เช่น Playwright, Cypress, Postman และ SuperTest เป็นต้น
  • ฝั่งของ frontend ทำการ mock api server หรือ backend ได้เลย เช่น Cypress, Playwright, Mock Service Worker และ Axios mock adapter เป็นต้น
  • ฝั่งของ backend ทำการ mock api server และ database ได้เลย เช่น Docker, Nock และ Mock Service Worker เป็นต้น

จากนั้นแนะนำการทดสอบ 3 แบบ คือ

  • End-to-End testing
  • Isolated testing
  • Contract testing ด้วย PACT

สุดท้ายแนะนำให้เรียนรู้จากความผิดพลาด
และเรียนรู็การสร้าง test case จาก Bug (Bug-Driven Development)

Slide อยู่ที่ JavaScript Testing Every Day

Web Test Runner ใน Angular 17.1

$
0
0

ใน Angular 17.1 นั้น ได้ทำการเพิ่ม Web Test Runner เข้ามาแทน Karma ในอนาคต
ซึ่งใช้สำหรับการ run test ผ่าน web browser นั่นเอง
โดยที่สนับสนุนทั้ง

  • Puppeteer, Playwright, Selenium หรือ WebdriverIO
  • Parallel run
  • สนับสนุน interactive mode
  • Run test case ที่เปลี่ยนแปลงเท่านั้น

ถ้าต้องการใช้งาน ต้องทำการติดตั้งเพิ่มเติม
เนื่องจากไม่ใช่ตัว default นะ
ติดตั้งดังนี้

[gist id="09885a97255aa0948bb106629c42e36e" file="1.txt"]

เพียงเท่านี้ ก็สามารถใช้งาน Web Test Runner ได้แล้ว

Reference Websites


สรุป library ที่แนะนำไปในเรื่อง Flutter 101

$
0
0

มีโอกาสไปแนะนำเรื่องของการพัฒนาระบบงานด้วย Flutter
ที่มหาวิทยาลัยราชภัฏพิบูลสงคราม จำนวน 3 วัน
เป็นการปูพื้นฐานสำหรับการพัฒนาระบบด้วย Flutter
ซึ่งเน้นไปที่ Mobile app
โดยมีเนื้อหาดังนี้

  • Architecture ของ Flutter ว่าเป็นอย่างไร คืออะไรบ้าง
  • ภาษาโปรแกรมที่ต้องศึกษาให้ดีคือ Dart
  • การติดตั้งและเครื่องมือต่าง ๆ ที่จำเป็นต่อการพัฒนา ทั้ง editor, device เป็นต้น
  • CLI tool ต่าง ๆ ที่ flutter และ dart เตรียมไว้ให้เช่น fomat code, lint, analyze code, test, run, spect ui เป็นต้น
  • การลงมือสร้าง app เพื่อทำงานเรียนรู้ภาษาโปรแกรมและเครื่องมือ
  • โครงสร้างของระบบที่ดี เช่น MVC, MVP, MVVM และ clean architecture ซึ่งแบ่งเป็นสองกลุ่มคือ layer based และ feature/domain based

และอีกอย่างที่เยอะหน่อยคือ library ที่ใช้งาน
มีทั้ง standard และ 3-party
โดยจะสรุป library ที่เป็น 3-party ไว้นิดหน่อยดังนี้

  • Router ใช้งาน go_router
  • State management ใช้งาน GetX ซึ่งก็มี router ให้ด้วย ก็ใช้แทน go_router ไปเลย รวมทั้งยังไม่เรื่องของ dependency management ให้ด้วย ใช้ง่าย ๆ สบาย ๆ
  • สำหรับ State management ยังมีตัวอื่น ๆ ที่ใช้งานกัน เช่น riverpod, BLoC
  • การจัดการข้อมูลเช่น shared_preference และ secure storage
  • การจัดการข้อมูลงลง database นั้นแนะนำ 3 ตัวคือ sqflite, hive, supabase และ firebase realtime database ซึ่งใช้ง่ายดี
  • อย่าลืมติดตั้งพวก firebase crashlytic และ analytic ด้วย ขาดไม่ได้เลย
  • การเชื่อมต่อข้อมูลผ่าน HTTPs เช่นเรียกใช้งาน REST APIs แนะนำให้ใช้ dio หรือ retrofit หรือ chopper ส่วนในการทดสอบใช้งาน http_mock_adapter ไปก็สะดวกดี
  • พวก form ต่าง ๆ ลองใช้งาน flutter_form_builder
  • ถ้าต้องการ capture รูปของแต่ละ widget ไว้ดู ใช้งาน screenshot ได้
  • เรื่องของ adaptive และ responsive นั้น ชอบใช้งาน flutter_screenutil, responsive_framework และ responsive_builder เป็นต้น
  • ส่วน UI/widget ต่าง ๆ ลองดูแรงบันดาลใจจาก awesome flutter ได้
  • พวก animation ต่าง เช่น Lottie for Flutter และ Rive เป็นต้น

Reference Websites

ลองศึกษา HTMX กับ Go เล่น ๆ นิดหน่อย

$
0
0

ช่วงหลัง ๆ มีการพูดถึง HTMX เยอะพอสมควร
ก็เลยลองมาศึกษานิดหน่อย แต่พอไปอ่านเอกสารแล้วเยอะน่าดู
เลยลองเขียน program เล่น ๆ เพื่อศึกษาไปดีกว่า
โดยเลือกใช้งาน HTMX กับ Go มาพัฒนา server-side กัน
มาดูว่าทำอย่างไรบ้าง ?

จากที่อ่านเอกสารของ HTMX นั้น
บอกว่าจะทำการส่ง request ไปยัง server-side ให้เลย (AJAX หรือ XHR)
แล้วนำ response มาทำการ render ให้เลย

ดังนั้นก็เลยตั้งโจทย์แรกว่า

ให้ทำการดึงข้อมูลจาก server-side ทุก ๆ 5 วินาทีไปเลย
สามารถเขียนได้ดังนี้

ฝั่ง Frontend ด้วย HTMX

โดยทำการดังข้อมูลผ่าน GET /data
กำหนด interval ใน attribute ชื่อว่า hx-trigger ทำงานแบบ polling

[gist id="952874b663a5f7a9298dd92820071aad" file="1.htmx"]

ฝั่ง Backend ด้วยภาษา Go

[gist id="952874b663a5f7a9298dd92820071aad" file="1.go"]

จากดึงข้อมูลก็ลองทำการ submit form ง่าย ๆ กันหน่อย

มาลองทำการ login ซึ่งฝั่ง backend จะทำการรับ request ผ่าน POST /login
และทำการส่งผลกลับมาคือ

  • 200 = Success
  • 401 = Unauthorized

สามารถเขียนด้วย HTMX กับ extension response-targets
เพื่อให้ง่ายต่อการแสดงผลการทำงานในแต่ละกรณี

[gist id="952874b663a5f7a9298dd92820071aad" file="2.htmx"]

ส่วน code ฝั่ง backend เป็นดังนี้

[gist id="952874b663a5f7a9298dd92820071aad" file="2.go"]

ผลการทำงาน

ส่วนการจัดเก็บข้อมูลการ login ก็สามารถเขียนได้เลยในฝั่ง backend
ทั้ง cookie หรือ session ไปได้เลย

[gist id="952874b663a5f7a9298dd92820071aad" file="3.go"]

จากนั้นการตรวจสอบเครื่อง authorize ก็นำไปไว้ที่ middleware ต่อไป

[gist id="952874b663a5f7a9298dd92820071aad" file="4.go"]

มีตัวอย่างให้ลองศึกษาเพิ่มเติมได้ที่ HTMX Example

ไว้ลองเล่นเพิ่มเติม แล้วจะนำมาเล่าต่อไปครับ
ขอให้สนุกกับการเขียน code

LGTM stack จาก Grafana คืออะไร ?

$
0
0

อ่านเจอใน feed แล้วงง ๆ ว่า LGTM มันคืออะไร​ ?
LGTM = looks good to me ?
เลยลองไปค้นหาดูนิดหน่อย ได้ข้อมูลดังนี้
มันคือ technology stack ของ Grafana ประกอบไปด้วย

  • Logs with Loki สำหรับ log aggregation
  • Grafana dashboard สำหรับแสดงข้อมูล
  • Tracing with Tempo สำหรับ tracing aggregation
  • Metrics with Mimir สำหรับการจัดเก็บข้อมูลใน prometheus

มีใครใช้ stack นี้ครบบ้าง ?

น่าสนใจดีกับ Rye :: Python package manager

$
0
0

เห็นใน feed ของ reddit มีการแนะนำ Rye
ซึ่งเป็น python package manager ที่เขียนด้วยภาษา Rust
โดยมีแรงบันดาลใจจาก Cargo นั่นเอง
เป้าหมายของ Rye คือ

  • Speed
  • Security
  • Simplicity

เมื่อไปอ่านหัวข้อ Philosophy and Vision พบว่าน่าสนใจดังนี้

ทำการสร้างมาเพื่อแก้ไขปัญหาที่พบเจอ เช่น

  • ปัญหาจากการใช้งาน virtualenvs ไม่มีทั้ง dependency ต่าง ๆ ที่ต้องใช้งาน
  • ไม่มีตัวจัดการ version ของ python ยิ่งต่าง OS ยิ่งลำบาก
  • ไม่มีการจัดการ local dependency ให้
  • ไม่มี workspace ให้ใช้
  • ไม่มี basic script section สำหรับการ run คำสั่งต่าง ๆ ของ project

ดังนั้นจึงสร้าง Rye ขึ้นมา เพื่อแก้ไขัญหาเหล่านี้

ก่อนใช้งานนั้นใน Python มีเครื่องมือในการจัดการ dependency ต่าง ๆ ดังนี้

  • pip
  • poetry
  • condo
  • venv
  • virtualenv

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

เริ่มที่ติดตั้งก่อน ใช้งานบน MacOS

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

ตรวจสอบการติดตั้ง ซึ่งมีการ download Python มาให้เลย

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

ทำการสร้าง project ด้วย Rye

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

จะมีไฟล์ pyproject.toml สำหรับอธิบาย project ว่ามีชื่ออะไร
ใช้ dependency อะไรบ้าง
ใช้ toolchain อะไร
มี script อะไรบ้าง เป็นต้น

จากนั้นทำการ sync project นั่นคือ
ให้ Rye ทำการ initial project ขึ้นมา ทำงานดังนี้

  • สร้าง virtualenv ให้
  • ทำการ download dependency ให้
[gist id="a89f8f1035bd7ae08ab25d9abfce746f" file="4.txt"]

ทำการเพิ่ม dependency และเขียน code กันเลย

ลองใช้งาน Flask นิดหน่อย

[gist id="a89f8f1035bd7ae08ab25d9abfce746f" file="5.txt"]

Code ไฟล์ app.py สำหรับสร้าง web server

[gist id="a89f8f1035bd7ae08ab25d9abfce746f" file="app.py"]

จากนั้นก็ run แบบง่าย ๆ ด้วย Rye

[gist id="a89f8f1035bd7ae08ab25d9abfce746f" file="6.txt"]

ยังไม่พอ ยังมี tool chain อื่น ๆ ให้ใช้งาน

  • rye lint
  • rye format
  • rype build

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

Reference Websites

สรุปจากบทความเรื่อง How Big Tech does Quality Assurance (QA)

$
0
0

อ่านบทความเรื่อง How Big Tech does Quality Assurance (QA)
มีเรื่องที่น่าสนใจ สำหรับการไม่ได้แยก Tester/QA ออกจากทีมพัฒนา
คำถามตัวโต ๆ คือ แล้วจะส่งมอบ software ที่มีคุณภาพกันอย่างไร ?
รวมทั้งขนาดและรูปแบบของบริษัท หรือ product
ก็มีผลต่อ role Tester/QA เช่นเดียวกัน

ยกตัวอย่างเช่น

  • บริษัทขนาดเล็ก คนไม่เกิน 50 คน มักจะไม่มี Tester/QA role หรือถ้ามีก็มักจะจ้างแบบ contract ไป
  • แต่เมื่อบริษัทใหญ่ขึ้น ก็มักจะแยก Tester/QA role ออกมาจากทีมพัฒนา เพื่อแยกการทำงานอย่างชัดเจน
  • แต่บางที่ก็ไม่มี แต่มี Test engineer มาแทน ซึ่งเน้นไปที่การเขียน test automation ไปเลย
  • หรือบางที่ก็ไม่มีเลย ให้ทีมพัฒนาสร้างระบบและเขียน test automation ไปด้วย จากนั้นก็ให้คนฝั่ง product/business มาทำการทดสอบ UAT ก่อนขึ้น production ต่อไป

คำถามตามมา แล้วคุณภาพจะลดลงไปไหม ?
คำตอบคือ ถ้าทำเหมือนเดิมคือ รอทดสอบ ก็ได้ผลเหมือนเดิม แย่เช่นเดิม

ดังนั้นรูปแบบการทำงานจึงเปลี่ยนไปคือ

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

จากนั้นจะพบว่า รูปแบบและจำนวนการทดสอบ จะเปลี่ยนไปดังรูป

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

Reference Websites

ว่าด้วยเรื่องของ Cell-Based Architecture มันเป็นอย่างไร ?

$
0
0

อ่านบทความเรื่องของ Slack’s Migration to a Cellular Architecture
ซึ่งทางระบบของ Slack ทำการ migrate architecture ของระบบ
มาใช้ cell-based architecture เป็นอีกหนึ่ง architecture pattern
โดยอธิบายรายละเอียดจาก AWS นั่นเอง
มีเป้าหมายเพื่อ

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

เป้าหมายหลัก ๆ ของ Slack นั้น ทำการ migrate เฉพาะ service ที่สำคัญ ๆ เท่านั้น

ทำการย้ายจาก monolith มายัง cell-based architecture
แน่นอนว่า แนวคิดนี้มีทั้งข้อดีและข้อเสียที่ต้องทำความเข้าใจ

มาทำความรู้จักกับ component ต่าง ๆ ของ cell-based architecture

  • Cell คือส่วนการทำงานหลัก โดยในแต่ละ cell จะทำงานจบในตัวเอง เป็นอิสระ ทั้งข้อมูล การพัฒนา การ deploy การ monitor/observe รวมทั้ง resource ต่าง ๆ ที่ใช้งาน ใน cell จะมี service ที่จำเป็นต่อการใช้งานใน cell ไปเลย
  • Interface คือ ช่องทางการติดต่อของแต่ละ cell ทั้งขาเข้าและออก
  • Inter-cell component สำหรับการติดต่อสื่อสารกับ cell จำนวนมาก เช่น Router, Load balance และ Messaging เป็นต้น

เมื่อทำตามนี้แล้วจะได้ระบบตามที่ต้องการข้างต้น
ทั้ง scalability, performance และ resilience
รวมทั้งขอบเขตของปัญหาและการทดสอบก็เล็กลง

แต่ก่อให้เกิดปัญหาตามมาเช่นกัน

  • ความซับซ้อนในการสร้างและจัดการ อย่าลืมว่า แต่ละ cell ต้องมี redundant ด้วยนะ (ทั้งใน zone และต่าง zone)
  • เพิ่ม overhead ของระบบงาน รวมทั้งค่าใช้จ่ายของ resource ที่ใช้งาน เพราะว่าต้องแยกเป็นอิสระต่อกัน

อีกทั้งเรื่องของการ Isolate หรือแยกกันนั้น
ต้องดูให้ครบทุกมุมมองว่าจะ Isolate แบบไหนบ้าง เช่น

  • Physical
  • Virtual
  • Process
  • Network

จะเห็นได้ว่าทุก ๆ pattern นั้นล้วนมีข้อดีและข้อเสีย

เลือกใช้ให้เหมาะกับงาน หรือ requirement ด้วยเสมอ
อย่าลืมว่า เรานำมาใช้งานเพื่อแก้ไขปัญหา หรือ ต้องมีประโยชน์นะครับ !!!

ระวังปัญหาที่อาจจะเกิดขึ้นจาก gap ระหว่าง business, architecture, development และ deployment
อย่าให้เป็นดังรูป

Reference Websites

OpenRewrite :: สำหรับการ migrate ไปยัง Spring Boot 3.2

$
0
0

OpenRewrite เป็นอีกหนึ่งแนวทางในการ migrate project หลัก ๆ คือ JVM language
รวมทั้ง framework ต่าง ๆ และ build tool พวก Apache maven และ Gradle
โดยหนึ่งใน framework ที่สนับสนุนคือ Spring framework และ Spring Boot
สามารถนำมาใช้สำหรับการ migrate มายัง Spring Boot 3.2 ได้
ที่มีความสามารถดังนี้

  • เปิดใช้งาน Virtual thread ให้
  • สนับสนุน RestClient และ JdbcClient
  • Update security patch
  • ปรับปรุงความสามารถ observability
  • สนับสนุน Coordinated Restore at Checkpoint (CRaC)

การใช้งานสำหรับ Apache Maven project เป็นดังนี้

[gist id="3a3f8ed8362ff2edfc548aa71dc43925" file="pom.xml"]

ทำการ run

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

ลองใช้งานกันดูครับ
เป็นอีกแนวทางในการ migrate

Reference Websites


สิ่งที่น่าสนใจใน Go 1.22.0

$
0
0

มาดูความสามารถที่น่าสนใจใน Go 1.22 กัน ว่ามีอะไรบ้าง

  • For loop
  • math/rand/v2 package ใหม่ สำหรับการ random
  • go/version package ใหม่ สำหรับการตรวจสอบ version
  • การเปลี่ยนแปลงของ net/http package

มาดูกันเลย

เรื่องที่ 1 การเปลี่ยนแปลงของ For loop

เปลี่ยนเรื่องเดียวของ Go 1.22 กระทบต่อโครงสร้างของภาษา
เพิ่ม range-over-function iterators เข้ามา
ทำให้วน loop ผ่าน range เหมือนภาษา Python ได้
ตัวอย่าง code

[gist id="f754177e0687eb79e56a4c7fca9e1087" file="demo.go"]

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

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

ต่อมาคือ loop variable ใน Go 1.22
จากเดิมเป็น preview feature ใน Go 1.21
จะทำการสร้าง variable ขึ้นมาใหม่ ในแต่ละรอบของ loop
ที่ทำงานกับ go routine
เพื่อแก้ไขปัญหาการทำงานแบบ concurrent และ การ share ข้อมูลกันนั่นเอง
ตัวอย่าง code

[gist id="f754177e0687eb79e56a4c7fca9e1087" file="demo2.go"]

มาดูผลการทำงาน
จะพบว่าค่าของตัวแปร i นั้น จะเป็นคนละตัวกัน ไม่ได้ใช้งานร่วมกัน
และใน go vet ก็สนับสนุน loop variable ด้วยเช่นกัน

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

เรื่องที่ 2 คือ math/rand/v2 package ทำการเพิ่ม global function N() เข้ามา

[gist id="f754177e0687eb79e56a4c7fca9e1087" file="ramdom.go"]

เรื่องที่ 3 การเปลี่ยนแปลงของ net/http package

สามารถทำการใส่ HTTP methods เข้าในไปการกำหนด router ได้เลย
ไม่ต้องมาเขียน if กันอีกแล้ว
ยกตัวอย่างการเขียนแบบเดิม

[gist id="f754177e0687eb79e56a4c7fca9e1087" file="server1.go"]

มาดู code ในGo 1.22 ที่เปลี่ยนแปลงกัน

[gist id="f754177e0687eb79e56a4c7fca9e1087" file="server2.go"]

ทำการ upgrade และใช้งานกันดูครับ
ขอให้สนุกกับการ coding

Reference Websites

.NET 9 preview 1 มาแล้ว ลองเล่นกัน

$
0
0

เพิ่งเห็นว่าทาง Microsoft ปล่อย .NET 9 preview 1 ออกมาให้ลองเล่นกันแล้ว
โดยเน้นที่ cloud native และ intelligence application development
ให้ระบบงานมี performance ที่ดี security ที่สูง
ช่วยเพิ่ม productivity ให้กับทีมพัฒนา
และทำงานร่วมกับ Cloud ได้ง่ายยิ่งขึ้น

สิ่งที่น่าสนใจคือ

  • การสร้างตามแนวคิดของ Cloud native app เช่น runtime performance และ application monitoring
  • ลดขนาดของ binary จาก Native AOT ช่วยให้ง่ายต่อการ scaling ระบบงานผ่าน container management

โดยที่ขนาดของ binary จะลดลงไปอีกจาก .NET 8
จาก 8 MB ลงลงมาเหลือ 2 MB
สำหรับ console app !!

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

สามารถดู project roadmap ของ .NET 9 เพิ่มเติมได้

ลอง Download และใช้งานกันเลยครับ
ขอให้สนุกกับการ coding

ตอบคำถาม แนวทางในการทดสอบ API ที่พัฒนาด้วย NodeJS

$
0
0

จากการแบ่งปันความรู้เรื่องการพัฒนาระบบ API ด้วย NodeJS นั้น
มีคำถามเกี่ยวกับแนวทางในการทดสอบว่า

  • มีแบบไหนบ้าง
  • ทำอย่างไรบ้าง

จึงทำการสรุปในแบบที่เคยทำไว้บ้าง ดังนี้

โดยปกติชอบแบ่งการทดสอบเป็น 2 แบบ คือ

  • ทดสอบมุมมองของผู้ใช้งาน หรือ ภายนอก (External test) มักจะใช้เครื่องมือ หรือ ภาษาโปรแกรมต่างจากการพัฒนา
  • ทดสอบในมุมมองนักพัฒนา หรือ ภายใน (Internal test) มักจะใช้เครื่องมือ หรือ ภาษาโปรแกรมเดียวกับการพัฒนา

แบบที่ 1 External test

จะใช้งาน Postman + newman สำหรับการทดสอบ API แบบง่าย ๆ

แบบที่ 2 Internal test

สำหรับ API test นั้นสามารถแบ่งได้หลาย level ดังนี้

  • Unit test
  • Component test
  • Contract test
  • Integration test
  • End-to-End test

ขึ้นอยู่กับความเชื่อมั่น หรือ ความต้องการของระบบงาน และ การทดสอบ
แน่นอนว่ามีทั้งข้อดีและข้อเสีย
ยิ่งเป็นพวก integration และ end-to-end test ก็จะยิ่งเพิ่มความเชื่อมั่นสูงสุด
แต่ต้องระวังในเรื่องของความเร็วในการทดสอบว่า ช้า หรือ เร็ว
รวมทั้งเรื่องของการจัดการ environment/dependency
เพื่อไม่ให้การทดสอบไม่เสถียร

ส่วน unit, component และ contract นั้น
จะทดสอบได้เร็วมาก ๆ แต่ความเชื่อมันของระบบโดยรวมอาจจะน้อย

ตัวอย่างและวิธีการทดสอบเป็นดังนี้

Production code เป็นการดึงข้อมูล user ด้วย id

[gist id="4e153460662727cf5961935620549fd1" file="user.js"]

Unit test ด้วย Jest

สามารถทำการ mock ตัว axios ได้เลย
จากนั้นก็สามารถจำลอง response ได้เลย

[gist id="4e153460662727cf5961935620549fd1" file="test-01.js"]

Component test ด้วย SuperTest และ Nock

ทำการทดสอบ API ด้วยการ start server และ ยิง request ด้วย SuperTest
และทำการจำลองการยิง request ไปยัง external API ด้วย Nock
ซึ่งกำหนดพฤติกรรมการทำงานให้เหมือนจริงได้ ในกรณีต่าง ๆ

ตัวอย่างการใช้งาน

[gist id="4e153460662727cf5961935620549fd1" file="test-02.js"]

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

น่าสนใจกับ Safetest : Next Generation UI Testing Library

$
0
0

วันนี้เห็น library ชื่อว่า Safetest
เป็น UI testing library ใหม่ที่นำเอาเครื่องมือหลาย ๆ ตัวมารวมกัน
ซึ่งประกอบไปด้วย

  • Playwright
  • Jest/Vitest

เป็นวิวัฒนาการของการทดสอบ UI ของ web application ผ่าน web browser
เพื่อช่วยให้การทดสอบง่ายขึ้นทั้งแบบ end-to-end และ component testing

ปล. ยังเป็น experiment library เท่านั้น !!

ความสามารถพื้นฐานของ Safetest มีดังนี้

  • มีความสามารถของ Playwright เต็มที่ เช่น snapshot test, vdo recording, trace viewer, จำลองระบบ network ได้
  • ใช้ Jest test runner ดังนั้นเขียนในรูปแบบของ jest ได้เลย และความสามารถอื่น ๆ เช่น mock ได้ทั้งหมด
  • ใช้งาน Vitest ได้เช่นกัน เลือกได้เลย
  • สนับสนุน React โดย default ดังนั้นสามารถทำ component testing ได้ง่าย
  • ทำงานร่วมกัย framework อื่น ๆ ได้ เช่น Vue, Svelte และ Angular รวมไปถึงพวก NextJS และ Gatsby
  • มี AuthHook ให้ใช้งาน สำหรับจัดการเรื่อง authentication ของ application ในระหว่างการทดสอบ

น่าสนใจดี ไว้เดี๋ยวต้องลองใช้งานเล่น ๆ หน่อยแล้ว

[code] $npm install --save-dev safetest [/code]

Reference Websites

Tip :: ใช้งาน Asynchronous logging ใน Java

$
0
0

หนึ่งในปัญหาต่อเรื่อง performance ของระบบงาน
คือการเขียน log ของระบบงานลง file system !!
ซึ่งพบว่า ถ้าเปลี่ยนมาใช้การเขียน log แบบ Asynchronous จะดีกว่า Synchronous
เป็นเรื่องเล็ก ๆ ที่อาจจะส่งผลเยอะเช่นกัน
ดังนั้นลองมาปรับเปลี่ยนกันดู

โดยตัวอย่างเป็นการ config ใน Log4j นั่นเอง

[gist id="3a5919006d87c78453e6f0fb78045365" file="1.xml"]

จากการทดสอบนั้น performance ดีขึ้น 50% กันเลย
รวมทั้งลดการใช้งาน memory ลงไป
ที่สำคัญไม่ไป block การทำงานบน main thread อีกด้วย

โดยใน Log4j นั้นจะใช้งาน Disruptor สำหรับ Asynchronous log
ดังนั้นเพิ่ม library ใน project ด้วย

[gist id="3a5919006d87c78453e6f0fb78045365" file="pom.xml"]

แต่ปัญหาที่ตามมาคือ

  • การ config ที่เยอะขึ้น รวมทั้งเปลี่ยนแนวคิดด้วย
  • ลำดับของ log จะไม่สามารถควบคุมได้ ดังนั้นจะส่งผลต่อการนำ log ไปประมวลผลอื่น ๆ ต่อไป

Reference Websites

https://medium.com/@knowledge.cafe/async-logging-the-speed-boost-your-java-apps-d9d161ad1fe4

Viewing all 2000 articles
Browse latest View live