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

ว่าด้วยเรื่องของ Module, Subsystem และ Component

$
0
0

หลังจากที่ได้แบ่งปันเรื่องของ Microservices ไปว่า มีที่มาที่ไปอย่างไร
นำมาแก้ไขและสร้างปัญหาอะไรบ้าง
โดยหนึ่งในเรื่องที่น่าสนใจคือ
ก่อนที่จะมาถึง Microservices นั้น มักจะมีการพูดถึง
แนวคิดของ Module, Subsystem และ Component
ว่าแต่มันคืออะไร ต่างกันอย่างไร ?

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

เริ่มจากแนวคิด Module

เป็นการแบ่งกลุ่มตาม logical ของ code ที่มาหน้าที่ต่างกัน ออกจากกัน
โดยที่ code ในแต่ละ module ยังอยู่ที่เดียวกัน หรือ physical เดียวกัน
ซึ่งจะเห็นได้ชัดเจนจากภาษาโปรแกรมต่าง ๆ เช่น

  • Go คือ go module
  • Java คือ package
  • C# คือ namespace

มีเป้าหมายตามแนวคิด SRP (Single Responsibility Principle) นั่นเอง

ต่อมาเรื่องของ Subsystem

แปลตรงตัวก็คือ ระบบย่อย ๆ นั่นเอง
Subsystem คือ การจัดกลุ่มของ Module อีกชั้นหนึ่ง
ในแต่ละ Subsystem จะประกอบด้วย module ตั้งแต่ 1 ขึ้นไป
โดยแต่ละ Subsystem ไม่จำเป็นต้องแยกในระดับ physical

แต่ละ Subsystem อาจจะแบ่งตาม layer ของการทำงาน เช่น

  • Presentation layer
  • Business layer
  • Data layer

ถ้าแบ่งออกตาม physical แล้ว เราจะเรียกว่า Tier ใช่ไหม
เช่น Presentation tier, Business tier เป็นต้น

หรือตามกลุ่มของการทำงานในเชิง business ก็ได้ (Boundary context)
ซึ่งถ้าแยกกันตาม physical แล้ว อาจจะอยู่ในรูปแบบของ service เล็ก ๆ
ที่สามารถทำงานจบได้ด้วยตัวเอง เป็นอิสระจากส่วนอื่น ๆ
เราก็อาจจะเรียกว่า Microservices ก็เป็นได้นะ

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

เรื่องสุดท้ายคือ Component

ว่าด้วยการแยกส่วนการทำงานออกจากกันในเชิง physical นั่นเอง
ซึ่งในแต่ละ component สามารถประกอบไปด้วย Subsystem และ Module นั่นเอง
ในแต่ละ component จะมี interface ใช้สำหรับการติดต่อสื่อสาร
โดยที่ผู้ใช้งานไม่ต้องรู้ถึง implementation ข้างในเลยก็ได้
ทำให้ง่ายต่อการเปลี่ยนแปลง
รวมไปถึงการ deploy และ scale ที่ง่ายและเป็นอิสระขึ้น

ดังนั้นเรื่องของ Tier และ Microservices จึงมีพื้นฐานมาจาก Component ด้วยนั่นเอง
ต่างกันตรงที่รูปแบบของการแบ่งนั่นเอง ว่าเป็นอย่างไร

ปล. อย่าไปตีกับ component ในส่วนของพวก Frontend framework ละครับ !!


Go 1.18 ตัวเต็มออกมาแล้ววว

$
0
0

ในวันที่ 15 มีนาคมที่ผ่านมา Go 1.18 ตัวเต็มถูกปล่อยออกมาแล้ว
โดยจะมีทั้ง feature ใหม่ ๆ และการปรับปรุงเรื่อง performance
รวมทั้งการเปลี่ยนแปลงของภาษาที่เกิดขึ้น
แต่แน่นอนว่า ยังคง compatibility กับ version ก่อนหน้าเช่นเดิม

สิ่งที่น่าสนใจ เคยอธิบายใน blog ก่อน ๆ นี้ไปแล้วทั้ง

  • Generics
  • Fuzzing
  • Workspace ช่วยให้การทำงานของหลาย ๆ module สะดวกขึ้น
  • ปรับปรุงการทำงานของ CPU ดีขึ้น 20% ตรงนี้น่าสนใจ ไว้ต้องลองดู

อย่าลืม Download มาใช้งานกัน
รวมทั้ง Docker image ก็มีให้ใช้แล้วเช่นกัน
และอย่าลืม $go test ./... กันด้วย ว่ายังทำงานได้เช่นเดิมไหม
ว่าแต่เขียน test กันไหมนะ !!

สรุปเรื่อง Distributed system เพื่อให้มีความน่าเชื่อถือ

$
0
0

  • ลดการติดต่อสื่อสารภายใน หรือลด hop ของการทำงานให้เหลือเท่าที่จำเป็น
  • ลด data ที่ซ้ำซ้อนลง เพราะว่า ยิ่งมี data ที่ซ้ำซ้อนให้ลงมากเท่าไร การแก้ไขหรือ overhead ในการจัดการก็น้อยลง
  • ก่อนที่จะแยก service ออกจากกัน ลองดูก่อนว่า สามารถทำเป็น library ได้ไหม ดังนั้นแทนที่จะทำงานแบบ remote ให้เป็น local ก่อนดีกว่าไหม ตรงนี้น่าคิด
  • เรื่องของปัญหา นั่นคือถ้าบาง service มีปัญหา แล้วส่งผลต่อระบบอื่น ๆ มีปัญหาไปด้วย เราเรียกว่า cascade failure ดังนั้นเราต้องจัดการเรื่องนี้ด้วย หรือเรียกว่า isolate failure/error ให้ได้ ยกตัวอย่าง pattern ในการแก้ไขเช่น circuit breaker, bulkhead, timeout และ retry เป็นต้น
  • บาง service ถูกใช้งานเยอะ ๆ ก็ทำให้เกิดปัญหาด้วยเช่นกัน ดังนั้นต้องป้องกันอีก ไม่ว่าจะเป็นเรื่องของ backpressure, shard loading ไปจนถึงเรื่องการทำ caching รวมถึงการติดต่อสื่อสารจาก sync มาเป็น async อีก แล้วจะทำการการ scale มันยืดหยุ่นมากยิ่งขึ้น

ดังนั้นในการ design, develop และ deploy
จึงต้องให้ความสำคัญกับเรื่องเหล่านี้เป็นอย่างมาก

การใช้งาน Go workspace ใน Go 1.18

$
0
0

ใน Go 1.18 นั้นมี feature workspace
ที่ช่วยให้เราสามารถ reference module ต่าง ๆ บน local ได้ง่าย
โดยจะทำการเพิ่ม $go work เข้ามาให้ใช้งาน
จากนั้นก็เพิ่ม module ต่าง ๆ เข้ามาได้เลย

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

[gist id="13235e356ae9b3ca4b21a546a2f9a56b" file="1.txt"]

ซึ่งจะเปลี่ยนแปลงจาก version beta ที่เคยเขียนไว้

สวัสดี Java Simple Web Server ใน Java 18

$
0
0

หลังจากไปนั่งอ่าน feature ต่าง ๆ ใน Java 18 ที่เพิ่งปล่อยตัวเต็ม
มาในวันที่ 22 มีนาคม ที่ผ่านมา

  • JEP-400: UTF-8 by Default
  • JEP-408: Simple Web Server
  • JEP-413: Code Snippets in Java API Documentation
  • JEP-418: Internet-Address Resolution SPI
  • JEP-420: Pattern Matching for switch (Second Preview)
  • JEP-421: Deprecate Finalization for Removal


มี command tool ตัวใหม่ที่น่าสนใจคือ jwebserver
ใช้สำหรับสร้าง HTTP server แบบง่าย หรือพวก static web server นั่นเอง
เพื่อความสะดวกในการออกแบบ พัฒนา debug และทดสอบบนเครื่องของนักพัฒนาได้

ซึ่งเป็นอีกทางเลือกที่น่าสนใจสำหรับชาว Java

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

ลองศึกษาเพิ่มเติมกันดูครับ

Git มันยากหรือง่ายนะ ?

$
0
0

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

บางคนบอกว่า command line ใช้ยาก ไปหา GUI tool ใช้ง่ายกว่า
แต่ผมก็ไม่ได้ใช้ GUI เลย ไม่ค่อยเข้าใจเท่าไร

เลยลองไปหาดูใน Stackoverflow ว่ามีการถามเกี่ยวกับ Git เยอะหรือไม่


พบว่าคำถามที่ถูก Vote เยอะ ๆ นั้น
มีเกี่ยวกับ Git เยอะมาก ๆ
นั่นอาจจะหมายความว่า คนนิยมใช้มาก ๆ
แต่ก็มีปัญหาในการใช้งานพื้นฐานเช่นกัน
มันยากหรือง่ายนะ Git !!

ดังนี้

  • การยกเลิก commit ล่าสุด
  • git pull กับ fetch ต่างกันอย่างไร
  • การลบ branch บน local และ remote
  • เปลี่ยนชื่อ branch ทำอย่างไร
  • การทำงานของ git pull และการ overwrite
  • การแก้ไข commit message
  • การลบ file ที่ยังไม่ track ออกไปจาก repository

ใน xkcd: Git ก็มีการแซวด้วยอีก

สรุปแล้ว Git มันยากหรือง่ายนะ ?

เจอการเขียน Dockerfile แปลก ๆ สำหรับภาษา Go

$
0
0

วันนี้ทำการ review project ที่พัฒนาด้วยภาษา Go
มีสิ่งที่น่าสนใจคือ การเขียน Dockerfile
ซึ่งมีหลายรูปแบบเลย แถมแปลก ๆ ด้วย
จึงนำมาสรุปไว้นิดหน่อย

แบบที่ 1 Start มันไปเลย ไม่ต้อง Build

[gist id="a1b6e60952aa324085dcf77ca57e5bff" file="Dockerfile-00"]

ทำงานได้นะ แต่แบบนี้มันใช่ไหมเนี่ย !!!

แบบที่ 2 ทำการ build และ run ด้วยกันไปเลย

[gist id="a1b6e60952aa324085dcf77ca57e5bff" file="Dockerfile-01"]

สามารถทำงานได้เป็นปกติ
แต่ขนาดของ Docker image ใหญ่มาก ๆ ขนาด 300+ MB ขึ้นไป
คำถามคือ เราจะส่งมอบอะไร ? มันเยอะเกินไหม

แบบที่ 3 ทำการ copy binary จากเครื่องเข้าไปเลย !!

[gist id="a1b6e60952aa324085dcf77ca57e5bff" file="Dockerfile-02"]

ก็ทำงานได้ปกตินะ แต่การ build binary
ต้องกำหนด parameter พวก GOOS, GOARCH ให้ถูกด้วย
มิเช่นนั้นจะไม่สามารถใช้งานได้ เพราะว่า binary ที่ copy มาใส่ไม่ถูกต้องตา OS นั้น ๆ
และขนาดของ Docker image ก็เล็กมาก ๆ ด้วย

คำถามคือ ทั้ง 3 แบบ มันดีแล้วใช่ไหม ?

ผลสำรวจเรื่อง ความสุขของนักพัฒนาที่มีต่องาน จาก Stackoverflow

$
0
0

จากบทความเรื่อง New data: What makes developers happy at work
จาก Stackoverflow นั้น ทำการสรุปผลสำรวจ
เรื่องความสุขในการทำงานของนักพัฒนาว่าเป็นอย่างไร
มีอะไรที่ทำงานมีความสุขในการทำงานบ้าง ?
น่าจะเป็นอีกชุดข้อมูลที่น่าสนใจสำหรับบริษัทต่าง ๆ ด้วยเช่นกัน

โดยปัจจัยที่สำคัญต่อนักพัฒนา ประกอบไปด้วย

  • เงินเดือนที่สมเหตุสมผล 60%
  • work life balance 58%
  • flexibility 52%
  • productivity ในการทำงาน นั่นคือ environment นั่นเอง 52%
  • โอกาสในการเติบโต 49%
  • มองหาโอกาสใหม่ ๆ 20%

ส่วนสิ่งที่ทำให้นักพัฒนาไม่มีความสุขสูงสุด คือ
เรื่องของ productivity ที่ต่ำ เนื่องจากสภาวะแวดล้อมไม่เหมาะสม
ยิ่งช่วงนี้ทำงานแบบ Work From Home ด้วย
ทำให้เรื่องของ environment หรือสิ่งแวดล้อมขึ้นมาเป็นสิ่งสำคัญอันดับแรกเลย
โดยสิ่งแวดล้อมที่ดี ประกอบไปด้วย

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

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


มาแล้ว Robot Framework 5.0

$
0
0

Robot Framework 5.0 ตัวเต็ม ๆ ถูกปล่อยออกมาแล้ว
เป็น major release ที่ใหญมาก ๆ
โดยมีการเพิ่ม ปรับปรุงเปลี่ยนแปลงเยอะมาก
แต่มาจาก community ทั้งนั้น

สิ่งที่สำคัญมาก ๆ คือ จะใช้ได้กับ Python 3.6 ขึ้นไปเท่านั้น
ส่วน Python 2 เลิกสนับสนุนไปเลย
แต่ถ้ายังใช้งาน ก็อยู่ที่ Robot Framework 4 ต่อไปนะ !!

มาดู feature ที่น่าสนใจกัน

เรื่องแรกคือ การจัดการ error ต่าง ๆ ใน script

จะเพิ่ม error handling เข้ามาคือ TRY-EXCEPT
โดยสามารถดักจับ error message ในกรณีต่าง ๆ
เพื่อให้จัดการต่อไปได้ง่ายขึ้น

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

[gist id="bb7ac0301a9c2580bc30d1f2a2f25179" file="1.robot"]

เรื่องที่สอง ปรับปรุงการทำงานของ WHILE ให้เหมือนกับภาษาอื่น ๆ

โดยมีเงื่อนไขของการจบ loop
และค่า default จำนวนรอบการทำงานของ loop คือ 10,000 รอบ
เพื่อไม่ให้เกิด infinity loop ด้วย
และเรายังสามารถกำหนด limit ของ loop ได้เองอีกด้วย
ทั้งในแบบจำนวนรอบ และ เวลาการทำงาน

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

[gist id="bb7ac0301a9c2580bc30d1f2a2f25179" file="2.robot"]

เรื่องที่สาม inline IF หรือการใช้งาน IF แบบบรรทัดเดียว

ปรับปรุงเรื่องของการใช้งานและอ่านง่ายขึ้น
และใช้งานร่วมกับ ELSE, ELSE IF ได้เช่นเดิม แต่อ่านยากนะ

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

[gist id="bb7ac0301a9c2580bc30d1f2a2f25179" file="3.robot"]

จากตัวอย่างต่าง ๆ จะเห็นได้ว่า มีการเพิ่ม BREAK, CONTINUE และ RETURN
เข้ามาให้ใช้งานด้วย

ดังนั้นใน Robot Framework 5 นี้ ทำการปรับปรุง syntax ให้ใช้งานง่ายขึ้น
โดยนำปัญหาจาก community มาแก้ไข
แน่นอนว่า เราต้องเรียนรู้เพิ่มด้วยเช่นกัน

ส่วนของ deprecated feature ดูเพิ่มเติมได้

สุดท้ายแล้ว อย่าลืม upgrade และ run test กันด้วยครับ
ว่าจะสามารถทำงานได้เช่นเดิมหรือไม่

อีกอย่างรูปแบบของ User Guide เปลี่ยนแปลงแล้ว ดูอ่านง่ายขึ้นอีก

ว่าง ๆ มาติดตั้ง Apache Kafka แบบไม่มี zookeeper แก้เบื่อกัน (KRaft)

$
0
0

ตั้งแตก Apache Kafka 2.8 นั้นมี configuration ของ KRaft มาให้
ช่วยทำให้เราสามารถติดตั้ง cluster ของ Apache Kafka โดยไม่มี Zookeeper ได้
แต่ยังไม่แนะนำสำหรับบน production นะ

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

เริ่มด้วยการ Download Apache Kafka มาก่อน

โดยใช้ version 3.10
ต้องการสร้าง node ใน cluster จำนวน 3 node ดังนี้

[gist id="802a0bb6faf9c2bb5fe867ad46a65431" file="1.txt"]

จากนั้นทำการ config ที่ไฟล์ /config/kraft/server.properties

เพื่อเปิดใช้งาน KRaft
ในตัวอย่างจะสร้างขึ้นมา 3 ไฟล์ แยกเป็นแต่ละ nodeใน cluster นั่นเอง ดังนี้

  • server-01.properties
  • server-02.properties
  • server-03.properties

สิ่งที่ configเพิ่มสำหรับเปิดใช้งาน KRaft นั้น ประกอบไปด้วย

  • node.id กำหนดเป็น 1, 2, 3 ตามลำดับไปเลย คือ unique ของแต่ละ node ใน cluster นั่นเอง ซ้ำกันไม่ได้
  • process.roles โดยที่แต่ละ node สามารถมี role ได้ทั้ง broker หรือ controller ของ KRaft อยู่ที่ความต้องการ จากตัวอย่างจะกำหนดให้ทุก node เป็นทั้งคู่เลย แต่ถ้าไม่กำหนดจะเป็น zookeeper เช่นเดิม
  • กำหนดค่าให้แต่ละ broker และ controller คุยกันผ่าน inter.broker.listener.name และ controller.listener.names
  • กำหนด port ของ broker และ controller ของทั้ง 3 node โดยที่ port default ของ broker=9092 และ controller=19092 ด้วยการกำหนดค่าของ listeners
  • กำหนด path ในการเก็บ log ผ่าน log.dirs
  • กำหนด connection security ผ่าน listener.security.protocol.map
  • กำหนด controller ทั้งหมดใน cluster ผ่าน controller.quorum.voters

จะกำหนดเยอะไปไหนนะ ?

ตัวอย่างของ server-01.properties สำหรับ node ที่ 1

[gist id="802a0bb6faf9c2bb5fe867ad46a65431" file="server-01.properties"]

เมื่อสร้าง config ของแต่ละ node เรียบร้อยแล้ว ทำการสร้าง cluster

จากนั้นก็ทำการ add node เข้า cluster ต่อไป ดังนี้

[gist id="802a0bb6faf9c2bb5fe867ad46a65431" file="2.txt"]

และ start server ของแต่ละ node ขึ้นมา

[gist id="802a0bb6faf9c2bb5fe867ad46a65431" file="3.txt"]

จากนั้นก็ทำการสร้าง Topic และดูรายละเอียดได้แล้ว

  • topic ชื่อว่า kraft-test
  • partition = 3
  • replication factor = 3
[gist id="802a0bb6faf9c2bb5fe867ad46a65431" file="4.txt"]

สุดท้ายก็ลองสร้าง message เข้า topic ทั้งฝั่ง producer และ consumer

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

สรุปเรื่องการใช้ภาษา Go ที่ Bit.ly

$
0
0

จาก Golang weekly นั้น มี link บทความการนำภาษามาใช้งานในระบบของ Bit.ly
Why we write everything in Go ?
จึงทำการสรุปไว้นิดหน่อย

​เริ่มต้นด้วยระบบของ Bit.ly นั้น​​​

พัฒนาส่วนของ frontend ด้วย TypeScript/JavaScript
ส่วนของ backend ด้วย Python และภาษา C เป็นหลัก
เหตุผลที่ใช้ Python คือ ความง่ายในการพัฒนา และได้ performance ที่สมเหตุสมผล
รวมทั้งมี web server ที่ดีคือ Tornado ที่ทำงานแบบ non-blocking I/O

ส่วนงานที่ต้องการ performance สูง ๆ จะใช้ภาษา C
แต่ก็มีปัญหาเรื่องการ maintain และการหาคนที่มี skill ด้านนี้จริง ๆ

ส่วนระบบงานประกอบไปด้วย

  • ผู้ใช้งานใช้งาน service ประมาณ 15 service
  • มี internal api จำนวน 35 ตัว
  • มีการใช้ queue ซึ่งมี 130 queue
  • มี cron job 150 ตัว
  • มี datastore 20 ตัว
  • มี adhoc script อีกเพียบ

Bit.ly ใช้งาน Go มาตั้งแต่ปี 2014

โดยพัฒนา NSQ ขึ้นมาและเปิด open source ด้วย
สำหรับระบบ messaging ที่พัฒนาด้วยภาษา Go
เป็นจุดเริ่มต้นของการทำภาษา Go มาใช้งาน

สิ่งหนึ่งที่สำคัญคือ ในปริมาณ workload เท่าเดิม
เมื่อเปลี่ยมาใช้ภาษา Go แทน Python แล้ว
สามารถลดจำนวน server ลงไปได้เยอะ และได้ response time ที่ดีขึ้นกว่า 2 เท่าตัว

ตัวอย่างเช่น การ copy file ขึ้นไปยัง Google storage

โดยการเปลี่ยนแปลงมีผลกระทบต่าง ๆ ที่ตามมาดังนี้

backend จากทั้งหมดกว่า 270 services มี service จำนวน 155 services
ที่พัฒนาด้วยภาษา Go

แต่เพียงเรื่องของ performance มันยังไม่พอ
ยังต้องมองเรื่องอื่น ๆ อีกด้วย เช่น

  • Go community ที่เป็นมิตร และ active อย่างมาก
  • Documentation, tutorial และ เครื่องมือต่าง ๆ ที่ดี
  • ทางทีมพัฒนาของ Bit.ly นั้นจะทำตาม Effective Go

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

บันทึกไว้หน่อย เมื่อ Google Chrome ครบ 100

$
0
0

บันทึกไว้หน่อย สำหรับ Google Chrome ครบ 100 วัน (คงไม่กิน CPU ทะลุ 100% นะ)
หรือ version 100 แล้วนั่นเอง โดย version เต็ม ๆ คือ 100.0.4896.60
เห็นว่ามีการเปลี่ยนแปลง logo เล็กน้อยสำหรับ OS ต่าง ๆ อีกด้วย
แต่ที่ไม่น้อยคือ การแก้ไข bug หรือช่องโหว่ไปถึง 28 ตัวกันเลย

และเดี๋ยว Firefox 100 ก็จะปล่อยออกมาเช่นกัน !!

Features ที่น่าสนใจ

  • ใน DevTools ก็มีการเปลี่ยนแปลงเช่นกัน โดยตัวที่ชอบสุดคือ การปรับปรุง Recorder panel ที่สนับสนุน selector ต่าง ๆ เหล่านี้โดย default เช่น data-testid, data-test, data-cy, data-qa, data-testing เป็นต้น รวมทั้งสามารถ custom selectorได้เองอีกด้วย

สวัสดี Grafana Mimir

$
0
0

เห็นทาง Grafana ปล่อย Grafana Mimir ออกมาให้ใช้งาน
อ่านว่า มิเมียร์
เป็น open source project สำหรับจัดเก็บข้อมูล
ในรูปแบบ time series แบบ distributed
โดยบอกว่ามี performance ที่ดีที่สุดในตอนนี้
สามารถ scale ได้ง่าย และเร็วมาก ๆ

คุณสมบัติที่น่าสนใจ สำหรับการเริ่มต้นคือ

  • เริ่มต้นได้ง่ายทั้งการ config และ deploy (ไว้ต้องลองกันหน่อย)
  • ทำงานแบบ Cluster by default ทำให้สามารถ scale โดยการเพิ่มเครื่องเข้ามาได้ง่าย
  • สามารถทำ replica data ได้
  • ส่วนการเก็บข้อมูลรองรับ object storage เท่านั้น
  • Integrate กับระบบต่าง ๆ ได้

แน่นอนว่าสามารถทำงานร่วมกับ Prometheus ได้
โดยสามารถกำหนดเป็น remote storage ได้เลย
เนื่องจากตัว Grafana Mimir เกิดมาจาก Prometheus นี่แหละ

ลองใช้งานกันดูครับ สำหรับ Apache Mimir

Reference Websites

https://grafana.com/oss/mimir

Update สถานการณ์ของปัญหา Spring4Shell

$
0
0

หลาย ๆ คนน่าจะกำลังเผชิญอยู่กับปัญหาที่เรียกว่า Spring4Shell
หรือจาก CVE-2022-22965 : Spring Framework RCE via Data Binding on JDK 9+
โดยทางทีมพัฒนาของ Spring ได้เขียนสรุปปัญหาและการแก้ไขปัญหาต่าง ๆ
ไว้ในบทความนี้ Spring Framework RCE, Early Announcement

ปัญหานี้จะกระทบกับ Spring MVC และ Spring WebFlux ที่ทำงานบน JDK 9 ขึ้นไป
และต้องทำการ package และ deploy เป็น WAR file เท่านั้น บน Tomcat
ส่วนถ้าเป็น JAR file จะไม่มีปัญหา (แต่ก็ไม่นิ่งนอนใจ)

Spring framework ที่โดนผลกระทบนี้ มี version ดังนี้

  • 5.3.0 - 5.3.17
  • 5.2.0 - 5.2.19
  • และ version ที่ต่ำกว่านี้ จะโดนหมด

สถานะในตอนนี้

ทำการแก้ไขและ release Spring Framework 5.3.18 และ 5.2.20 แล้ว
ดังนั้น Spring Boot 2.6.6 และ 2.5.12 ถูกแก้ไขแล้ว เพราะว่าใช้งาน Spring Framework 5.3.18 นั่นเอง

แนวทางการแก้ไขเฉพาะหน้า (Workaround)

  • ทำการ update Spring Framework มาใช้ version 5.3.18 และ 5.2.20
  • ทำการปิดการ binding ใน code ของ project ดังนี้
[gist id="955382f5531f89e90ce08dc446b33bd3" file="1.java"]

จากบทความใน Reference Website ด้านล่างนั้น

ทางทีมพัฒนาของ Spring บอกว่า การที่ไป deprecated SerializationUtils นั้น
เป็นความเข้าใจที่ไม่ถูกต้อง และไม่เกี่ยวกับปัญหานี้เลย
รวมทั้งที่บอกว่ามีผลต่อ Spring Cloud Function ก็ไม่ใช่ด้วย

Reference Websites

https://twitter.com/LunaSecIO/status/1509084844042510336

เราจะรู้ได้อย่างไรว่า ใช้ Spring Framework version ไหม ?

$
0
0

มีคำถามเกี่ยวกับ Spring Boot มาว่า
เราจะรู้ได้อย่างไรว่า Spring Boot ที่เราใช้งานนั้น
มันไปใช้งาน Spring Framework version ไหน ?

คำตอบแบบง่ายที่สุดคือ ดูใน IDE ที่ใช้งานเลย

ยกตัวอย่างผมใช้งาน IntelliJ IDEA
กับการสร้าง project เป็น Apache Maven Project
จะแสดงตามภาพ
ผมใช้งาน Spring framework version 5.3.17
(Spring framework จะถูกแบ่งเป็น module ย่อย ๆ เพียบ)

แต่ถ้าตอบในมุมของ Developer ก็ต้องเขียน code สิ

ซึ่ง Spring framework :: Core module และ Spring Boot ได้เตรียมไว้ให้
นั่นก็คือ

  • SpringVersion.getVersion()
  • SpringBootVersion.getVersion()

ชิวมาก ๆ ไม่ต้องคิดอะไร

หรือถ้าอ่านเอกสารของ Spring Boot ก็จะบอกเลยว่า ใช้ Spring framework version อะไร

หรือสาย Maven ก็ใช้คำสั่ง $mvn dependency:tree

หรือใครอยากดูเองก็ลองดู reference ในไฟล์ pom.xml ก็ได้ แต่จะลึกหน่อย

หรือจะไปดูใน web ของ MavenCentral หรือ MvnRepository ก็ได้
ถ้าเรารู้ว่าใช้ Spring Boot version อะไร ?

หรือถ้าใช้ Spring Boot CLI ก็จะสบายขึ้นไปอีก

หรือถ้าไม่มีข้อมูลจริง ๆ ก็เอา JAR file มาหาค่า checksum
จากนั้นเอาไปเปรียบเทียบกับ ค่า checksum จาก Spring อีกที
เหมือนจะตลก แต่มันคือเรื่องจริง ที่หลาย ๆ คนเคยทำ !!


ปัญหาใน Go 1.18 :: syscall_darwin.1_13.go:25:3: //go:linkname must refer to declared function or variable

$
0
0

วันนี้ลอง build ระบบงานที่พัฒนาด้วยภาษา Go
โดยทำการ upgrade เป็น version 1.18 บน MacOS
ผลปรากฎว่า เจอ error ดังนี้

[gist id="03678d5e5e25341e37b7f33d2a10b2ca" file="1.txt"]

งานเข้าเลยทีนี้ !!!
ไม่เคยเจอปัญหานี้เลย

ไปอ่านก็เจอปัญหานี้ใน issue เช่นกัน

ปัญหาจริง ๆ คือ ในเครื่องเราใช้ package golang.org/x/sys
ที่เป็น version เก่า
ทำให้มีปัญหา !!

การแก้ไขคือ ต้อง update package เอง ดังนี้

[code] $go get -u golang.org/x/sys [/code]

[Golang] ทำไม JSON message ไม่เรียงตามที่ต้องการ

$
0
0

มีคำถามที่น่าสนใจคือ ในการ return JSON response
จาก REST API ที่พัฒนาด้วยภาษา Go
แล้วทำไมไม่เรียง property ตามที่เขียนใน code
โดย code ตัวอย่างเป็นดังนี้

จากตัวอย่างใช้ Gin

[gist id="92a16014e874e38d029097be074bf01c" file="api.go"]

ผลที่ได้จาก code เป็นดังนี้
โดยทำไมไม่เรียงตามที่เขียนใน code

[gist id="92a16014e874e38d029097be074bf01c" file="1.json"]

คำตอบ

เมื่อเข้าไปดู code ใน package encoding/json จะพบว่า
ในการ encode นั้นจะเก็บข้อมูลในรูปแบบของ Map ก่อน
จากนั้นทำการเรียงลำดับจากตัวอักษรจาก key ของ Map นั่นเอง

แต่ถ้าเราใช้ struct แทน จะการเรียงตาม index ให้เลย
ตัวอย่าง codeดังนี้

[gist id="92a16014e874e38d029097be074bf01c" file="api2.go"]

มาดู Software Architecture and Design InfoQ Trends Report :: April 2022

$
0
0

มาดู มาดู Software Architecture and Design InfoQ Trends Report
ประจำเดือนเมษายน 2022 จาก InfoQ กันหน่อย
ว่ามีอะไรเปลี่ยนแปลงและน่าสนใจกันบ้าง ?

สิ่งแรกที่น่าสนใจคือ Data + Architecture

มันคือการออกแบบ architecture โดยสนใจและใส่ใจเรื่องของ data หรือข้อมูลด้วย
เพื่อทำให้เข้าใจ data flow และ พฤติกรรมต่าง ๆ
จะได้นำมาช่วยในการตัดสินใจ และการนำมาทำ model ต่าง ๆ ได้ดียิ่งขึ้น
สิ่งที่ต้องคิด ประกอบไปด้วย

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

ในส่วนของ Architect นั้น ไม่ใช่แค่ทำงานเพียงคนกลุ่มเดียวอีกแล้ว
แต่ทางฝั่ง engineer สามารถเข้ามามีส่วนร่วมกับการออกแบบ architecture ด้วย
เพื่อให้เห็นมุมมองด้วยการ implement ต่าง ๆ มากขึ้น
โดยทาง Architect ต้องคอยช่วยประสานงานในส่วนต่าง ๆ ของขั้นตอนการทำงาน
เช่น

  • Trade-off analysis
  • Make good decision
  • Documentation
  • Communication

การทำงานส่วนใหญ่จะเป็นแบบ remote และมีการติดต่อสื่อสารแบบ asynchronous
ดังนั้นเรื่องการตัดสินใจทาง architecture จะต้องมีการบันทึกไว้
หนึ่งในรูปแบบที่น่าสนใจคือ Architecture Decision Records (ADRs)
รวมทั้งการทำงานเป็นรอบสั้น ๆ เพื่อรับฟัง feedback จากสิ่งที่ทำลงไป
เพื่อใช้ในการปรับปรุงอย่างต่อเนื่อง
ดังนั้นเรื่อง Evolutionary architecture จึงมีความสำคัญมาก ๆ

ในการออกแบบนั้นสิ่งที่น่าสนใจคือ พวก design for X เช่น

  • Design for Sustainability
  • Design for Portability
  • Design for Security
  • Design for Resilience
  • Design for Observability

มีอีกเรื่องหนึ่งที่น่าสนใจ แต่ยังไม่รู้เรื่องเลยคือ eBPF (extended Berkley packet filters)

ทำให้เราสามารถเขียน code ใน kernal sandbox ได้
โดยไม่ต้องไปแก้ไข code ใน kernel ของ Linux เลย
ทำให้นักพัฒนาสามารถเพิ่มความสามารถของ Linux ในช่วย runtime ได้เลย

รวมทั้งเรื่องของ Blockchain และ GraphQL federation ก็มาแล้วเช่นกัน

ว่าด้วยเรื่องของ Design for failure

$
0
0

จากบทความเรื่อง Software Architecture and Design InfoQ Trends Report :: April 2022 จาก InfoQ
ม่ีเรื่องที่น่าสนใจมากมาย
หนึ่งในนั้นคือ Design for failure
หรือการออกแบบระบบเพื่อให้สามารถรับมือกับความผิดพลาดได้
ทั้งความผิดพลาดที่เราคาดหวังและไม่คาดหวังได้

ระบบงานไม่ได้จบเพียงแค่ส่งมอบหรือ deploy เท่านั้น
แต่ยังต้องสนับสนุนทาง business และสร้างความพึงพอใจให้กับลูกค้าด้วย
ดังนั้นระบบงานที่ดี ควรประกอบไปด้วย

  • การทำงานอย่างถูกต้องตามที่คาดหวัง
  • ระบบมีความน่าเชื่อถือ
  • ระบบสามารถเข้าได้งานได้เสมอ (24x7)

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

เนื่องจากระบบงานหนึ่ง ๆ นั้นมีส่วนประกอบทั้ง service และ component มากมาย
รวมทั้งติดต่อกันผ่านระบบ network ต่าง ๆ อีก
แน่นอนว่าทำให้ระบบงาน สามารถเกิดข้อผิดพลาดได้อย่างมากมาย
ดังนั้นเราจึงต้องทำระบบ automatic fail-over และทำ redundancy ส่วนต่าง ๆ
หรืออาจจะต้องวางแผนการรับมือจากความผิดพลาด (Design for failure)
หรืออาจจะเรียกว่า resilience pattern
เพื่อทำให้ระบบรับมือกับความผิดพลาดได้
และสามารถช่วยให้ระบบกลับมาทำงานได้ปกติรวดเร็วที่สุด
หรือลดผลกระทบต่อผู้ใช้งานให้มากที่สุดนั่นเอง

เป้าหมายของระบบที่มักจะใช้งานคือ Availability

โดยจะมีส่วนประกอบจากค่า Uptime และ Downtime
นั่นคือเราจะเพิ่ม Uptime ให้มากที่สุด
และลดเวลา Downtime ให้น้อยที่สุด

ในการพัฒนาระบบสมัยใหม่นั้น
เราจะสนใจการลดเวลาการ Downtime ให้น้อยลง
ด้วยการลดเวลา Mean Time To Recovery
หรือ หรือเวลาการนำระบบกลับมาให้ทำงานได้แบบปกติ
ซึ่งประกอบไปด้วย เวลาต่าง ๆ เหล่านี้

  • เวลาที่เรารู้ว่าปัญหาเกิดขึ้น
  • เวลาในการหาต้นเหตุของปัญหา
  • เวลาในการแก้ไข
  • เวลาในการทดสอบ
  • เวลาในการ deploy
  • เวลาที่กลับมาทำงานได้ปกติ

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

รูปแบบของการออกแบบเพื่อรองรับข้อผิดพลาด

ประกอบไปด้วย

  • Redundancy
  • Replication data
  • Isolate หรือการแยกทั้ง service และ database หรืออาจจะใช้แนวคิด Bulkhead มาช่วย
  • Timeout
  • Retry
  • Fail fast
  • Fall back
  • Rate limit
  • Circuit breaker
  • Asynchronous communication

อะไรที่มันจะ fail ได้ มันย่อม fail เสมอ

Reference Websites

สวัสดี Docker Software Bill of Materials (SBOM) CLI plugin

$
0
0

ใน Docker Desktop 4.7.0 นั้น มีการเพิ่มความสามารถใหม่เข้ามา
ประกอบไปด้วย

ใน blog นี้ เรามาดูกับว่า SBOM cli plugin นั้นใช้งาน และทำงานอย่างไร ?

การติดตั้ง

สำหรับ Docker desktop นั้นจะติดตั้งมาให้เลย
แต่สำหรับ Linux นั้น ต้องติดตั้งเอง ดังนี้

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

ปล. คำสั่ง $docker sbom ยังเป็น experiment นะ ดังนั้นเปลี่ยนแปลงได้อีกเยอะ

โดยที่ SBOM นั้นคือโครงสร้างมาตรฐานของ software หนึ่ง ๆ
ว่าประกอบไปด้วย component, module และ library อะไรบ้าง
จากนั้นจะช่วยให้เราสามารถนำมาวิเคราะห์
รวมทั้งดูเรื่องของ security ที่มักจะพบเจอกันบ่อยมาก ๆ ได้ง่ายขึ้น
รวมทั้งสามารถนำมาไว้ใน cycle ของการพัฒนา software ได้อย่างสะดวก

นั่นหมายความว่า เราสามารถนำมาใช้

  • ดูว่า component, module และ library ที่นำมาใช้ปลอดภัยหรือไม่
  • ดูว่า component, module และ library ที่นำมาใช้นั้นล้าสมัยหรือไม่

การใช้งานง่าย ๆ รวมทั้งกำหนด format ที่ต้องการได้ด้วย

ตัวอย่างของการดู docker image ว่ามีปัญหาของ log4shell หรือไม่ ?

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

จัดเป็น JSON format และแสดงด้วย Grype

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

Reference Websites

Viewing all 2000 articles
Browse latest View live