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

สวัสดี Selenium Grid 4

$
0
0

Selenium Grid 4 ใช้ W3C WebDriver protocol
จากเดิมที่ยังใช้งาน JSONWire protocol ไป
และยังได้เพิ่มเรื่องของการสนับสนุน DevTools protocol อีกด้วย
แต่ยังอยู่ในช่วงของ experiment feature เท่านั้น

เรื่องที่น่ายินดีมาก ๆ คือ การปรับปรุงเอกสารให้อ่านง่าย เข้าใจได้ง่ายขึ้น

แน่นอนว่า ชัดเจนและทำตามได้ดีกว่าเดิมเยอะ
ลองไปอ่านกัน Selenium Grid 4 Documentation

ใน version นี้แบ่ง component ออกจากกันชัดเจน

ซึ่งประกอบไปด้วยดังนี้ (แต่ก็เพิ่มความซับซ้อนขึ้น)

  • Router
  • Session queue
  • Session map
  • Distributor
  • Event bus
  • Nodes

แสดงดังรูป

ในเรื่องของการติดตั้งทำได้ 4 แบบคือ

  • แบบที่ 1 คือ แยก Hub และ Node ตาม role ปกติ
  • แบบที่ 2 คือ standaone ซึ่งทำงานได้ทุก role ใน instance เดียว
  • แบบที่ 3 คือ distributed mode ซึ่งจะต้องสร้างแต่ละส่วนงานขึ้นมาตามลำดับ ก่อนที่จะทำการเพิ่ม node ดังนี้ Event bus, Session map, Session queue, distributor และ router นี่มันแนวคิด Microservices ชัด ๆ
  • แบบที่ 4 คือ การใช้งานผ่าน Docker

เปลี่ยนจาก Jetty มาเป็น Netty

ส่งผลให้การทำงานรวดเร็วขึ้นแต่ก็ยังต้องการใช้ Memory 1 GB ต่อ 1 process เช่นเดิม
นั่นหมายความว่า ยังคงกิน resource เยอะเช่นเดิม

เมื่อมี request ต่าง ๆ เข้ามา ยังคงเก็บเข้า queue ใน memory เช่นเดิม

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

เมื่อทำการเปลี่ยนแปลง configuration แล้ว จำเป็นต้อง restart เช่นเดิม

ถ้าต้องจัดการจำนวน instance เยอะ ๆ

แนะนำให้ไปใช้ Selenoid (Selenium + Docker) เลยดีกว่า

ไปดูอีก project ที่น่าสนใจคือ Moon

มันคือ Selenium in Kubernetes
น่าจะเป็นอีกทางเลือกที่น่าสนใจ

https://aerokube.com/https://aerokube.com/

สวัสดี OpenTelemetry

$
0
0

หลังจากที่ใช้งาน OpenTracing มานาน
ซึ่งตอนนี้ OpenTracing ได้รวมเข้ากับ OpenCensus แล้ว
มีชื่อว่า OpenTelemetry
จึงมาลองศึกษาและใช้งานดูกันหน่อย

ปล. พบว่า library มีการเปลี่ยนเยอะมาก ๆ
ก็พอจะนำไปใช้งานได้
แต่ต้องเรียนรู้เพิ่มกันหน่อย

OpenTelemetry คืออะไร

https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/overview.md

คือกลุ่มของ API, SDK, เครื่องมือ
รวมทั้งแนวทางการ integrate เข้ากับระบบงานต่าง ๆ
สำหรับการสร้างและดูแลรูปแบบข้อมูล telemetry ให้เป็นมาตรฐาน
นั่นก็คือรูปแบบข้อมูลของทั้ง trace, metric และ log
จะต่างกับ OpenTracing ที่เน้นเฉพาะเรื่องของ trace เท่านั้น
ซึ่งจะเรียกว่า Data Source

โครงสร้างของการทำงานดังรูป

โดยเป้าหมายหลัก ๆ คือ เรื่องของความยืดหยุ่นในการใช้งาน

เพื่อให้ทำงานได้ระบบที่เป็น opensource และ commercial
รวมทั้งสามารถนำข้อมูลที่ได้ ไปเก็บยังที่จัดเก็บต่าง ๆ ได้อีกด้วย
ซึ่งเป็นงานในส่วนของ Data Collection
ยกตัวอย่างเช่น Jaeger, Zipkin, Prometheus และ Fluent Bit เป็นต้น
แน่นอนว่า อาจจะเป็นระบบอื่น ๆ ก็ได้ ซึ่งไม่ผูกมัดแน่นอน

โครงสร้างของการทำงานดังรูป

มีตัวอย่างของการจัดเก็บข้อมูลให้ด้วย

ยกตัวอย่างเช่น การพัฒนาด้วยภาษา Go

  • Jaeger
  • Prometheus
  • Zipkin

เดี๋ยวมาเขียน code เพื่อสร้างและจัดเก็บข้อมูล Metric ใน service ด้วยภาษา Go กันต่อไป

มาใช้งาน Telepresence 2 กัน

$
0
0

Telepresence คือเครื่องมือที่ช่วยให้ developer สามารถพัฒนาระบบงาน
ที่ deploy บน Kubernetes ได้ง่ายและสะดวกขึ้น
ตามแนวคิดคือ Fast Local development in Kubernetes

นั่นคือ developer พัฒนาได้รวดเร็วยิ่งขึ้น
โดยไม่ต้องรอการ build, push image และสร้าง container เลย
ใช้งานร่วมกับ IDE ต่าง ๆ ได้ดี

ก่อนอื่น Telepresence 2.0 นั้น ทำการเขียนใหม่ด้วยภาษา Go
นำความรู้ที่ได้จาก version 1 มาปรับปรุงให้ดีขึ้น
ทั้งการใช้งานที่ง่าย และประสิทธิภาพที่ดีขึ้น

โครงสร้างของ Telepresence 2 เป็นดังภาพ

เพื่อความเข้าใจที่ดีขึ้น มาลองใช้กันดีกว่า

ขั้นตอนที่ 1

ทำการสร้างและ connect ไปยัง Kubernetes Cluster จริง ๆ
จากเครื่อง Local ของ developer ให้ได้
และทำการ deploy ระบบงานไปยัง Kubernetes Cluster แบบปกติก่อน

ขั้นตอนที่ 2

ทำการติดตั้ง TelePresence บนเครื่อง
จากนั้นทำการ connect จาก TelePresence ไปยัง Kubernetes Cluster

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

ขั้นตอนที่ 3

จาก service ที่ทำงาน deploy Kubernetes Cluster แล้วนั้น
สามารถเข้าถึงได้โดยตรงด้วยชื่อและ port ของ service ต่าง ๆ จาก Local ของเราแล้ว

ขั้นตอนที่ 4

ทำการ intercept request ต่าง ๆ ที่จะส่งเข้ามายัง service ใน Kubernetes Cluster
โดยจะส่ง request นั้นมายัง Local ของเรานั่นเอง
ดังนั้นถ้าเราแก้ไข code ที่ Local ก็จะเห็นการเปลี่ยนแปลงนั้น ๆ เลย
ช่วยให้เราทดสอบได้ง่ายขึ้น
ก่อนจะไปเข้าสู่ขั้นตอน build, push และ deploy ต่อไป ถ้าทุกอย่างเรียบร้อย
ด้วยการใช้คำสั่งดังนี้

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

ขั้นตอนที่ 5

อีกอย่างเราสามารถเลือกที่จะ intercept เฉพาะบาง URL ที่เรียกใช้งานมาอีกด้วย
หรือเรียกว่า การ intercept จาก Preview URL
โดยที่เราต้อง clear สิ่งที่ intercept ทั้งหมดก่อน
จากนั้นก็ intercept แบบปกติดังนี้

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

จากนั้นเรียกใช้งานผ่าน service ที่ทำการกำหนดไป
จะไปใช้งาน service ปลายทางจาก Local นั่นเอง

จากการใช้งานพบว่า

ช่วยให้การพัฒนาระบบงาน
และ deploy บน Kubernetes มีความยืดหยุ่นมากขึ้น
ที่สำคัญสามารถทดสอบการทำงานระหว่าง service ได้ง่ายและรวดเร็วขึ้น
เพื่อให้เรารู้ผลการทำงานได้รวดเร็วขึ้น
มีผลดีต่อ productivity อย่างมาก

มีตัวอย่างของ Application ที่พัฒนาด้วยภาษาต่าง ๆ ให้ลองใช้งาน

Reference Websites

สิ่งที่เปลี่ยนแปลงใน Golang 1.16 กับ Docker

$
0
0

วันนี้ลองเปลี่ยน Docker Image ของ Golang เป็น version 1.16
พบว่าจะทำการ build ไม่ผ่านนะ
เนื่องจาก Golang 1.16 นั้นใช้ Go Module เป็นค่า default แล้ว
ดังนั้นจึงแก้ไขขั้นตอนการสร้าง Docker Image ใหม่ดังนี้

ก่อนอื่น project ต้องเป็น Go Module
ด้วยการใช้คำสั่ง $go mod init <name>

ส่วนใน Dockerfile เพิ่มส่วนของ $go mod tidy ไปด้วย

[gist id="46c2adb4db8cf4b9391e75a1243ed11d" file="Dockerfile"]

เพิ่งสังเกตว่า Docker version ใหม่เปลี่ยน log การ build ดังนี้

[gist id="46c2adb4db8cf4b9391e75a1243ed11d" file="1.txt"]

แก้ไขแบบง่าย ๆ เรียบร้อยแล้ว

ไปดู library อื่น ๆ มาแทน Moment.js หน่อยสิ

$
0
0

วันนี้มีเหตุให้ต้องไปดู Library ที่จะมาใช้แทน Moment.js
ที่ใช้สำหรับการจัดการเรื่องของ Data Time ในระบบงาน
เนื่องจากคนดูแลทีมบอกว่า Moment.js เขาเลิกพัฒนาแล้วนะ
(คิดในใจ เขาแจ้งนานแล้วนะ เพิ่มรู้หรอ !!)
ก็เลยไปดูและลอง library ต่าง ๆ จากที่ทาง Moment.js แนะนำมาหน่อย

สิ่งแรกที่ไปดูก่อนคือ Trend ของการ Download library ต่าง ๆ จาก NPM มาใช้งาน

ก็พบเรื่องตลกร้ายว่า Moment.js ยังถูก Download เยอะมากเช่นเดิม
และดูเหมือนจะมากกว่าเดิมด้วยนะสิ !!
เพื่อร่วมชะตากรรมเยอะมาก ๆ
เอาไว้เป็นข้อมูลในการตัดสินใจก็แล้วกัน

ถ้าไปดูตัวอื่น ๆ จะพบว่าก็ มีการใช้งานสูงเช่นกัน
แต่อย่าเอาไปเทียบกับ Moment.js นะ !!
ยกตัวอย่างเช่น

  • Date-fns
  • Day.js
  • Luxon

โดยทั้งสามตัวนี้มีขนาดเล็กกว่ามาก
รวมทั้ง Date และ JavaScript Internationalization API อีกด้วย
ซึ่งเน้นไปที่การจัด format ข้อมูลชนิดต่าง ๆ
ไม่เจาะจงเพียง date เท่านั้น

แต่จากที่ลองใช้งานตาม use case ของระบบงาน
พบว่า Day.js น่าจะเป็นทางที่เหมาะสมพอสมควร
แต่อีกอย่างคือ เปลี่ยนแล้วได้อะไร และ เสียอะไรนะ ?

ตัวอย่างการลอง Day.js ก็ง่ายดี

Golang :: ว่าง ๆ มาลองใช้งาน chi router

$
0
0

ก่อนหน้านี้ทำการพัฒนา Go HTTP service นั้น
ใช้งานทั้ง net/http, Echo และ Gin เป็นหลัก
แต่มีอีกตัวที่น่าสนใจคือ Chi
หลัก ๆ ทำงานในส่วนของ router สำหรับ REST API
โดยที่สนับสนุน context package ของ Go ด้วย

จุดเด่นของ Chi ประกอบไปด้วย

  • มีขนาดเล็ก โดย code ประมาณ 1,000 บรรทัด และไม่มี depenedncy อื่น ๆ นอกจาก G standard และ net/http package เท่านั้น
  • มี Middleware ให้ใช้เพียบ
  • เร็วใช้ได้เลย
  • จัดการ router ง่ายมาก ๆ ทั้งจัด group และ sub-group
  • Doc generation (docgen) ทำการสร้างเอกสารจาก code ในรูปแบบ JSON หรือ Markdown แต่ยังไม่สนับสนุน Chi version 5

ลองเขียนนิดหน่อย

เริ่มจากการสร้าง router ของระบบก่อน

และใช้ middleware ตัวเดียวคือ Logger

[gist id="36dc98761fe0e9d08a63179aca7ce31f" file="main.go"]

ทำในส่วนของการทำงานของ /post นิดหน่อย

[gist id="36dc98761fe0e9d08a63179aca7ce31f" file="post.go"]

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

การเปลี่ยนแปลงใน Spring Initializr

$
0
0

มาดูกันหน่อยว่า Spring Initializr มีอะไรเปลี่ยนแปลงบ้าง ?

เริ่มด้วยการสนับสนุน Java 16 แทน 15 แล้ว

โดยมี feature ที่น่าสนใจคือ
pattern matching ใน instanceof และ record type
ดังนั้นตอนนี้ Spring จะสนับสนุน Java, 16, 11 และ 8

ต่อมาก็ Spring Boot 2.4.4 ที่เพิ่งแก้ไข bug ไปเพียบ

พร้อมกับ update documentation อีกเยอะเลย
อย่าลืม update และไปอ่านกันนะมีให้อ่ากันเกือบ 100 เรื่อง

เพิ่ม Dependency ของ Spring Native Beta มาให้แล้ว

หรือการ build นะบบที่พัฒนาด้วย Spring เป็น Native Image ด้วย GraalVM นั่นเอง
ทำให้ไม่ต้องมา configuration เองแล้ว
ที่สำคัญสนับสนุนทั้งภาษา Java และ Kotlin
ทำการ build ด้วยคำสั่ง

[code] $mvnw spring-boot:build-image $gradlew bootBuildImage [/code]

เป้าหมายของ Spring Native
คือการปรับใช้งานกับระบบที่พัฒนาก่อนหน้านี้ด้วย Spring
ให้สามารถใช้งานได้โดยไม่ต้องแก้ไขใด ๆ เลย
เป็นอีกตัวที่น่าสนใจ

ลองใช้งาน cosign สำหรับการ Signed Container Image กัน

$
0
0

ไปเจอเครื่องมือชื่อว่า cosign
สำหรับการ Signed Image แบบง่าย ๆ
เพื่อเพิ่มความปลอดภัยในการใช้งาน Container Image
โดยไม่ต้องแก้ไขหรือเพิ่ม configuration อะไร

การใช้งานมีขั้นตอนดังนี้
ทำการสร้าง Public และ Private Key ขึ้นมา (Asymmetric Key Encryption)
โดยสร้างด้วย algorithm ECDSA-P256 เท่านั้น
และทำการ sign ด้วยการใช้งาน private key และใส่ password
ได้อีกจากนั้นในการใช้งานก็ทำการ verify ด้วย public key และ password ได้เลย

พอลองใช้และลองไปดู source code ที่เขียนด้วยภาษา Go
ก็ได้ idea ในการเอาไปแก้ไข
และปรับปรุงให้ตรงกับความต้องการต่อไปแบบไม่ยากมากนัก


ทำไม Container Image มันถึงบอกว่า สร้างเมื่อ 41 ปีที่แล้ว

$
0
0

เนื่องจากลองสร้าง project กับ Spring Native (beta version)
ผ่าน Spring Initializr
โดยการทำงานจะใช้ buildpack และ GraalVM นั่นเอง
ซึ่งใช้เวลาในการ build นานใช้ได้
ยิ่งครั้งแรกจะ download และ build นานมาก ๆ

แต่สิ่งที่ตกใจมากคือ วันที่ของการสร้าง Container Image
ที่บอกว่าสร้างเมื่อ 41 ปีที่แล้ว !!

พอไปอ่านเอกสารทั้งจาก buildpack, ko และ jib
พบว่ามันคือ Reproducible Builds นั่นเอง
เป็นแนวทางในการออกแบบ
เพื่อทำให้มั่นใจว่า การ build แต่ละครั้งจะได้ผลเหมือนเดิมเสมอ
แต่มีข้อเสียคือ zero timestamp สำหรับ layer ต่าง ๆ
หรือดูเพิ่มเติมได้จาก Reproducible Builds Project

[Git] แนะนำ git jump ตัวช่วยจัดการ branch

$
0
0

ปัญหาอย่างหนึ่งสำหรับ Git repository ที่มี branch เยอะ ๆ
คือ การจัดการนั่นเอง
ไม่ว่าจะการเปลี่ยน, แก้ไขชื่อ และลบ branch
ไปจนถึงการค้นหา branch ผ่าน command line
ซึ่งไปเจอเครื่องมือที่ช่วยจัดการปัญหาเหล่านี้คือ Git Jump

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

แนะ Github1s :: เปิด GitHub repository บน VSCode

$
0
0

เพิ่งไปเห็นว่ามี project ชื่อว่า Github1s
(One second to read GitHub code with VS Code)
ใช้สำหรับการเปิด code ใน GitHub repository บน VSCode ผ่าน web ได้เลย
เพียงแค่เพิ่ม 1s เข้าไปใน url ของ GitHub
ยกตัวอย่างเช่น https://github1s.com/microsoft/vscode

เข้าใช้งานดังรูป

และก็มี project คล้าย ๆ กันคือ GitHub Surf

จดบันทึก กดลิฟท์ผิดชั้น จะยกเลิกอย่างไร ?

$
0
0

ในการขึ้นลิฟท์นั้น มีสองแบบคือ กดชั้นก่อนเข้าลิฟท์ แบบนี้ไม่ค่อยมีปัญหา
แต่อีกแบบคือ เข้าไปกดชั้นในลิฟท์
ซึ่งบ่อยครั้งคือ ชอบกดชั้นผิด คำถามในหัวคือ ยกเลิกอย่างไร ?

กลับมาถึงห้องก็ลองค้นหาดูหน่อยว่า
จะกดยกเลิกชั้นในลิฟท์อย่างไร ?
ก็พบว่า ลิฟท์แต่ละยี่ห้อก็กดยกเลิกต่างกันอีก มันจะเยอะไปไหน
ยกตัวอย่างยี่ห้อที่ลองใช้

  • Matsushita กดสองครั้งติดกัน
  • Mitsubishi กดชั้นที่ผิดสองครั้ง แล้วกดค้างไว้
  • Toshiba กดสองครั้งติดกัน แล้วกดค้าง 3-5 วินาที
  • Hitachi กดที่ชั้นค้างไว้

เป็นอีกเรื่องที่ไม่คิดว่า มันจะเยอะแบบนี้

ลองดูเพิ่มเติมที่นี่ Elevator car call cancellation

เพิ่งเห็นการเปลี่ยนเรื่อง default branch ใน Git 2.31.0

$
0
0

หลังจากที่ update Git มาเป็น version 2.31.0
เพิ่งเห็นว่ามีการเปลี่ยนแปลงเรื่อง default branch
นั่นคือ เมื่อเราทำการสร้าง หรือ init git repository ขึ้นมาที่ local แล้ว
จะแสดง message ให้ทำการเปลี่ยน default branch
จาก master ไปใช้ชื่ออื่น ๆ เช่น main, trunk หรือ development ก็ได้

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

อ่าน Release note เพิ่มได้ ว่ามีอะไรปลี่ยนแปลงและปรับปรุงบ้าง

ใช้งาน Selenium 4 กับ Chrome DevTool APIs

$
0
0

ใน Selenium 4 นั้นเป็นเหมือนกับการยกเครื่องใหม่ของ Selenium กันเลย
โดยหนึ่งใน API ที่เพิ่มเข้ามาก็คือ Chrome DevTool APIs
ทำให้ Selenium สามารถจัดการ browser ที่สร้างมาจาก Chromium ได้
ยกตัวอย่างเช่น Chrome, Opera และ Microsoft Edge
ช่วยให้ง่ายต่อการ debug และ investigate ปัญหาต่าง ๆ ของ web

มาดูความสามารถที่มีใน Selenium Chrome DevTool APIs

  • URL filter
  • เพิ่ม Header ของ HTTP Request ได้
  • Intercept ทั้ง request และ response ที่เข้าและออกจาก browser ทำหน้าที่เป็นเหมือน proxy นั่นเอง
  • ดึงข้อมูลเรื่อง performance metric การทำงานทั้ง browser และเรื่องของ network ได้
  • จำลองการทำงานของ Network ตามที่เราต้องการ
  • จัดการเรื่อง security
  • ทำงานกับ console
  • จัดการเรื่องของ Geo Location

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

มาดูตัวอย่างง่าย ๆ ที่พัฒนาด้วยภาษา Java

เริ่มจากการเพิ่ม dependency ของ Selenium 4 Java มา

ซึ่งยังเป็น beta version อยู่

[gist id="0f9342fa5a34f97bc2cdb5148eb99007" file="pom.xml"]

การสร้าง session การทำงานของ DevTools

ซึ่งสร้างจาก ChromeDriver ผลที่ได้คือ เปิด Chrome ขึ้นมา ดังนี้

[gist id="0f9342fa5a34f97bc2cdb5148eb99007" file="1.java"]

ทำการ Ignore certificated ที่ Errorถ้านึกไม่ออก

คือ หน้า error แบบนี้ จะทำการ ignore ไปเลย

ตัวอย่าง code

[gist id="0f9342fa5a34f97bc2cdb5148eb99007" file="2.java"]

เพียงเท่านี้ก็สามารถใช้งานได้แล้ว
ลองศึกษาเพิ่มเติมกันดูครับ

Reference Websites

Puppeteer ต่างจาก Puppeteer-core อย่างไร ?

$
0
0

คำถาม
ได้รับคำถามว่า puppeteer กับ puppeteer-core มันต่างกันอย่างไร ?
เราควรใช้อะไรดี ?

คำตอบ ผมก็ไม่รู้ ปกติใช้แต่ puppeteer !!

ถ้าใครใช้ puppeteer ตั้งแต่ version แรก ๆ จนมาถึง 1.6.x นั้น
พบว่าทุกครั้งที่ใช้งาน จะทำการ download ทั้ง library และ Chromium ลงมาด้วย
ซึ่งมีขนาดใหญ่มาก ๆ
เป้าหมายเพื่อทำการควบคุมการทำงานของ browser ผ่าน DevTools Protocol
และทำงานแบบ Headless คือ
ไม่ทำการเปิดหน้า UI ของ browser ขึ้นมากวนใจ หรือ ขัดจังหวะการทำงาน

ดังนั้นตั้งแต่ใน puppeteer 1.7 ขึ้นมา

จึงทำการแยก puppeteer-core ออกมา เพื่อไม่ต้อง download พวก Chromium ลงมา
ทำให้มีเฉพาะ library ที่จำเป็นเท่านั้น
และไปใช้งาน browser ที่ทำการติดตั้งไว้แล้ว
ไม่ว่าจะเป็น Google Chrome หรือพวก Microsoft Edge เป็นต้น

การใช้งานก็เพียงติดตั้ง puppeteer-core แล้วใช้งานเลย
และเขียน code ดังนี้

[gist id="de76ff9bf508d3af466a6aa3ffd7bb41" file="1.js"]

Reference Website


Six Levels of Cloud Maturity

$
0
0

จากหนังสือฟรีเรื่อง Architecting for Scale
เฉพาะในบทที่ 4 Service and Data
มีหนึ่งสิ่งที่น่าสนใจคือ การกำหนด Six Levels of Cloud Maturity
สำหรับขั้นตอนการนำ Cloud มาประยุกต์ใช้งานในองค์กร
ประกอบไปด้วย

Level 1—Experimenting: What is the cloud?
Level 2—Securing the cloud: Can we trust the cloud?
Level 3—Enabling servers and SaaS: Lift-and-shift, confirmation the cloud works pretty well.
Level 4—Enabling value-added services: Dynamic cloud becomes a practice.
Level 5—Enabling unique services: Dynamic cloud is deeply ingrained in the culture.
Level 6—Mandating cloud usage: Why do we need our own Data Center ?

สิ่งที่น่าสนใจคือ ในองค์กรของเรานั้น อยู่ในขั้นไหนกันบ้าง ?

[Golang] หนังสือ 2 เล่ม อ่านสนุกดี

$
0
0

เพิ่งเห็นว่าใน Golang Weekly มี link ของหนังสือ 2 เล่มที่น่าสนใจ
ประกอบไปด้วย

https://www.practical-go-lessons.com/chap-2-the-go-language

โดยที่หนังสือเล่มแรกนั้นอ่าน free บน web
แต่ถ้าอยากได้ soft file ก็ทำการซื้อหามาอ่านได้

ส่วนเล่มที่ 2 จะเป็น Google Docs ให้เข้าไปอ่านได้
เนื่องจากยังเป็น draft version อยู่

หนังสือทั้งสองเล่มมีความแตกต่างกันมากพอสมควร
เนื่องจากในเล่มแรกนั้น จะเหมาะสำหรับคนที่ต้องการเริ่มศึกษาภาษา Go
เริ่มตั้งแต่ประวัติความเป็นมา
การติดตั้ง การเริ่มเขียนโปรแกรม
ลงไปจนถึงแต่ละ feature ของตัวภาษา

ส่วนเล่มที่สอง จะเป็นเล่มสำหรับคนที่มีประสบการณ์มาพอสมควร
เพราะว่าจะเริ่มด้วย philosophy ของการพัฒนาระบบงาน
จะมีพวก quote ต่าง ๆ ในการพัฒนาที่น่าสนใจ
รวมทั้งแนวคิดที่ดีอีกมากมาย
จากนั้นเข้าสู่เรื่องการทำงานของ Go
จะลงลึกไปจนถึงเรื่องของ CPU และ Memory กันไปเลย
อาจจะทำให้เกิดอาการมืนลงเล็กน้อย แต่ได้ความรู้แน่นมาก ๆ
อีกทั้งยังมีเรื่องของการ ออกแบบระบบงานที่ดี
รวมทั้งเรื่องทีเด็ด เช่น Concurrency และ Generic เป็นต้น

การเขียน test ทำให้การพัฒนาช้าลง ?

$
0
0

เพิ่งอ่านบทความเรื่อง We didn’t write tests because we wanted to get our code out faster

กับเจอคำถามว่าในกลุ่ม QA & Testers Thailand ว่า

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

เป็นสิ่งที่น่าสนใจทั้งคู่ จึงสรุปไว้หน่อย

คำตอบในเรื่องที่สองคือ

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

แต่ถ้าแยกกันเป็นสองส่วนแล้ว ไม่ว่าจะด้วยเหตุผลใด ๆ ก็ตาม
ก่อนที่ทั้งสองจะมาทำงานด้วยกัน
ก็จำเป็นต้องทำให้มั่นใจก่อนว่า
แต่ละส่วนทำงานได้ตามที่ต้องการและตกลงกันไว้
ไม่ว่าจะ success หรือ failure ก็ตาม

ส่วนเรื่องข้ออ้างต่าง ๆ จะกลับไปที่บทความแรก

คือเราไม่เขียน test เพราะว่า ต้องการพัฒนาให้เร็วขึ้นมันจริงหรือเปล่า ?
เราเขียน test เพื่อทำให้มั่นใจว่าสิ่งที่เคย work มันจะยังคง work เสมอ
ไม่ว่าเราจะเพิ่มหรือลบ code ใด ๆ
ตราบเท่าที่ requirement ยังไม่เปลี่ยน

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

ยิ่งเวลาผ่านไปจำนวน feature เริ่มมากขึ้น
ความซับซ้อนสูงขึ้น
ความเป็นไปได้ของ bug ก็มากขึ้นตามจำนวน code

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

Always test ครับ
แต่จะ test แบบไหน ก็ตามใจ
แต่ต้อง repeat ได้
ได้รับ feedback ที่รวดเร็ว
เท่านี้ก็พอแล้ว ไม่ขออะไรมาก

จัดโครงสร้างของ Test ใน Jest แบบไหนดี ?

$
0
0

จากคำถามจากกลุ่มใน facebook :: ReactJS Developer Thailand
เรื่อง การจัดโครงสร้าง folder ของ test ใน Jest สำหรับ React
ว่าควรเป็นอย่างไรดี ?

จากสำหรับ React ที่สร้างด้วย Create React App
จะทำการสร้าง test ไว้ที่เดียวกับ production code ให้เลย
ซึ่งไม่แปลกอะไรหรือจะเปลี่ยนใหม่ตามใจเราก็ได้

สำหรับระบบอื่น ๆ ที่พัฒนาด้วยภาษา JavaScript

ทั้งฝั่ง Frontend และ Backend แล้วควรจะต้องเป็นแบบไหนละ ?

ในเอกสารของ Jest ก็บอกเพียงว่า
ขอให้ชื่อ file หรือ folder ตามที่กำหนดไว้ก็พอแล้ว
ที่เหลือก็แล้วแต่เราจะใช้งาน
หรือสามารถเปลี่ยน naming convention ใหม่ตามใจเราได้อีก

แต่ถ้าทีมไม่กำหนดโครงสร้างกันไว้ก่อน
คิดว่าน่าจะมั่วดังนั้นเรามากำหนดกันหน่อยดีไหม ?

ยกตัวอย่างจากที่ผมทำและเห็นบ่อย ๆ

มักจะทำดังนี้

  • แยก test ไปไว้ใน folder tests หรือ __tests__ กันไปเลย
  • เขียน test ไว้ที่เกียวกับ production code ไปเลย อาจจะมี suffix ด้วย tests หรือ specs ก็ว่าไป

แต่เพื่อความสนุกสนานในการเขียน test เพิ่มขึ้น
ก็มักจะแยกตาม level ของ test ใน folder tests เข้าไปอีก ยกตัวอย่างเช่น

  • unit test
  • integration test
  • component test
  • end-to-end test

หรือบางคนอาจจะใส่ test level ในชื่อไฟล์ไปอีกด้วย
เช่น index.unit.tests.js เป็นต้น
แต่เคยทำแล้ว มันแปลก ๆ ยังไงก็ไม่รู้
แต่ก็เป็นอีกทางเลือกนะ

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

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

เรื่องของโครงสร้าง จำเป็นต้องมีการปรับปรุงให้เหมาะสมเสมอ

VS Code :: แนะนำ Live Code และ Turbo Console Log

$
0
0

มีงานในฝั่ง Frontend ที่ต้องเขียนนิดหน่อย
เลยไปเจอ Extension ใน VS Code
ที่เอามาช่วยเพิ่ม productivity ให้การพัฒนาดีขึ้น
ประกอบไปด้วย

Live Code จะทำการ reload browser เมื่อเราแก้ไขไฟล์

ส่วน Turbo Log Console นั้น
จะช่วยจัดการเกี่ยวกับ การเขียน log console นั่นเอง
ทั้งแนะนำ message ที่ดี
ทั้งการเพิ่มหรือลบ log console ออกไปให้
ซึ่งสะดวกดีมาก ๆ


Viewing all 2000 articles
Browse latest View live