[Go] ใช้ bytes.Buffer เป็น io.Writer เพื่อเก็บ output ใน memory ก่อนแปลงเป็น string หรือ []byte

มีฟังก์ชันการทำงานหลายตัวที่รับค่าเป็น interface io.Writer เพื่อเขียน output ออกไป ซึ่งช่วยให้คนใช้งานเลือกได้ว่าจะเขียน output การทำงานออกไปทางไหนก็ได้ตามต้องการขอแค่การทำงานนั้นถูก implements ด้วย interface io.Writter ที่มี method Write([]byte) (int, error) อยู่ และ bytes.Buffer ก็เป็นหนึ่งใน io.Writer ที่ช่วยให้เราเอาผลลัพธ์การทำงานมาเก็บไว้ใน memory ก่อนแล้วค่อยเอาค่าไปใช้ต่อได้เช่นแปลงเป็น string แปลงเป็น []byte หรือแม้แต่ส่งไปให้ฟังก์ชันที่ต้องการ io.Reader เพราะ bytes.Buffer ก็ implement interface io.Reader ไว้เช่นกัน

Read full post gblog_arrow_right

[Go] สร้างฟังก์ชัน unmarshal json.RawMessage แบบ generic type และเช็คค่า null

มีเคสต้องกำหนดค่า request body field นึง ให้เป็น type json.RawMessage ไปก่อนแล้วค่อยไปเช็คเงื่อนไขอีกทีว่าจะ unmarshaling ไปใส่ตัวแปร type ไหน แต่ก็อยากรู้ด้วยว่าค่าใน json.RawMessage เป็น null value ของ JSON หรือไม่ เลยได้ลองสร้างฟังก์ชันที่เป็น generic รองรับการ parse ค่าจาก json.RawMessage เป็น type ใดๆดูพร้อมกับ return flag เพื่อบอกว่าเป็น null หรือไม่

Read full post gblog_arrow_right

[TypeScript] lookup ค่าใน object ด้วย key ที่มี type เป็น keyof type

ถ้าเราใช้ JavaScript โดยตรงเราสามารถ access property ใน object ได้โดยใช้ dot . หรือใช้ indexing operator [property_name] แบบนี้ แต่พอเป็น TypeScript ตอนเราใช้ indexing operator จะฟ้องว่าเราใส่ผิด type เราต้อง convert string ที่เราใส่ตรง [] เป็น type ของ key ของ object ก่อนด้วย keyof

ตัวอย่างโค้ดง่ายๆเช่น

type Point = { x: number; y: number };
type P = keyof Point;

const p: Point = { x: 10, y: 20 };
const y: string = "y";
console.log(p[y]);

เราจะโดน compiler แจ้ง type error ว่า

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Point'.
  No index signature with a parameter of type 'string' was found on type 'Point'.

วิธีแก้คือเราต้องกำหนด type ของ y ให้เป็น keyof Point แทนแบบนี้

Read full post gblog_arrow_right

[TypeScript] อ้างอิง type จาก property ของ type อื่นด้วยท่า indexed access type

บางค่าของ TypeScript เราต้องระบุ callback function ซึ่ง type ของ callback function ก็มี parameter ที่ต้องเหมือนกัน แทนที่เราจะต้องจำและใส่ให้ตรงเอง เราสามารถใช้ indexed access type ช่วยอ้างอิง type ของ property ที่เป็น callback function ได้เลย

Read full post gblog_arrow_right

[Go] ใช้ reflect ดึงข้อมูล parameter type และ return type ของ function

เมื่ออาทิตย์ที่ผ่านมาเจอ package นึงชื่อ tonic ช่วยในการเขียน Gin handler ให้มี request parameter และ return type ได้ เลยไปขุดดูว่าทำได้ยังไง เจอว่าใช้ reflect ในการหาข้อมูลของ handler function นั่นเองว่ารับ type อะไร หรือ return type อะไร

Read full post gblog_arrow_right

[C++] ใช้ CPU ให้เต็มที่ด้วย Boost Thread Pool

เมื่อวานมีงานที่ต้อง process ข้อมูลบางอย่างด้วย C++ เลยพยายามใช้ CPU ให้เต็มที่ทุก cores เท่าที่มีให้มากสุด ซึ่งก็ได้มาท่านึงก็คือใช้ library Boost Thread Pool เข้าช่วย

Read full post gblog_arrow_right

[React] จะ dispatch event ให้ DOM ที่สร้างจาก React ต้องกำหนด bubbles เป็น true เสมอ

เพิ่งเจอว่า DOM ที่ได้จาก React แม้ว่าเราจะ binding Event ผ่าน JSX มาแล้วแต่เราจะ query DOM มาแล้วสั่ง dispatchEvent เลยไม่ได้ ต้องกำหนด option bubbles ของ Event object ให้เป็น true เสมอ

Read full post gblog_arrow_right

[Go] Parse CSV/Excel columns ด้วย named constant และ map แทนที่จะใช้ index โดยตรง

ช่วงนี้มี usecase ที่ต้อง parse ข้อมูลจาก Excel แต่ว่าบ้างครั้งลำดับของ column ก็มีเปลี่ยนไป มีเพิ่ม มีลดกันบ้าง เลยได้ลองคิดท่าใหม่เพื่อให้โค้ดในการ parse ไม่ต้องแก้เยอะเพราะลำดับของ column เปลี่ยน ซึ่งก็คือใช้ constant และ map มาช่วยนั่นเอง

Read full post gblog_arrow_right

[JavaScript] ความต่างระหว่างใช้ Promise.all กับ for แล้ว await ทีละอัน

ถ้าเรามีหลาย async call แล้วอยากรอให้ทำงานเสร็จหมดก่อนค่อยไปต่อ มีสองท่าที่นึกออกคือใช้ Promise.all และ for แล้ว await ทีละอัน ซึ่งมันจะมีพฤติกรรมต่างกันอยู่ ขอบันทึกเอาไว้หน่อย

Read full post gblog_arrow_right