tour.golang.org ภาษาไทย

เครื่องมือสำหรับผู้เริ่มต้นเรียนภาษาโก ที่ผมชอบมาก tour.golang.org ที่จริงมันอ่านง่าย และเข้าใจง่ายมากกว่าถ้าอ่านเป็นภาษาอังกฤษ พอมาแปลแล้วบางที การแปลมากไปก็จะทำให้อ่านแล้วงง มากกว่าเข้าใจ แต่ประเด็นมันอยู่ตรงที่อยากให้มีภาษาไทยอยู่บนนั้นมากกว่า https://go-tour-th.appspot.com หลังจากแปลเสร็จเพิ่งเมล์ไปแจ้งเขา ไม่รู้เมื่อไหร่จะได้เพิ่ม link ใน tour.golang.org รอลุ้นต่อไปครับ

Continue reading →

reload config file on the fly

บางครั้งเวลาที่เราเขียนโปรแกรมมาใช้งานแล้วมีไฟล์คอนฟิก เอาไว้เก็บพวก url  หรือค่าต่างๆที่ต้องการให้เปลี่ยนไปตาม environment หรือจะด้วยเหตุผลอะไรก็แล้วแต่ หลายๆครั้งที่เราเขียนการโหลดข้อมูลเป็นแบบ lazy load แล้วมันก็จะจำค่านั้นไว้จนกว่าโปรแกรมจะหยุด มีโจทย์มาอีกว่า ทำอย่างไรถึงจะ reload ค่าเหล่านั้นโดยไม่ต้อง stop/start โปรแกรมใหม่ วันนี้มีเทคนิคหนึ่งมานำเสนอครับ

Continue reading →

มาใช้ go routine แยกไปทำงาน แต่ต้องการ rollback เมื่อมีตัวใดตัวหนึ่ง error

มีโจทย์มาว่า เนื่องจากมีงานๆหนึ่ง ต้องทำหลาย task ในคราวเดียว เช่น อาจจะต้องการยิง api ไปที่โน่นที่นี่ ซึ่งแต่ละที่อาจจะใช้เวลาไม่มาก แต่ถ้าเราต้องรอให้เสร็จทีละตัว รวมๆกันอาจจะกินเวลานานจนระบบหน้าบ้าน timeout หนีไปเสียก่อน ยังไม่พอ หากแต่ละ service ที่ยิงไป ถ้าหากว่ามีตัวใดตัวหนึ่ง error ก็อยากจะ rollback งานทั้งหมดที่ทำเสร็จไปแล้วด้วยอีกต่างหาก ในเมื่อมีโจทย์มาแบบนี้ เราก็ต้องหาวิธีแก้ปัญหาซึ่งถ้าหากใครสนใจสามารถไปดู source code ได้ที่นี่ https://github.com/golians/rollback

Continue reading →

อยากใช้ go routine กับ channel แบบ ไม่ fix จำนวน

โจทย์ของผมคือ ปกติการใช้ go routine + channel แบบง่ายๆที่เริ่มทำใหม่ๆ จำเป็นจะต้องรู้จำนวนของ go routine ที่ชัดเจน เพื่อเวลาที่เราจะจับของใส่ chan หรือจะเอาออกมา จะได้ทำได้ถูกตัว และครบจำนวน ผมอยากให้มัน dynamic แบบที่ไปตัดสินใจว่าจะแตก go routine กี่ตัวกันใน runtime เลย จะทำอย่างไร จึงเกิด code ชุดนี้ขึ้นมา https://github.com/golians/queue Use case คือ ถ้ามีข้อมูลจำนวนมากเป็น slice/array แล้วต้องการแตก go routine ออกไปช่วยกันทำงาน โดยต้องไม่ทำงานซ้ำกัน และต้องทำให้ครบทุกงาน เมื่อเริ่มใช้ queue ด้วยคำสั่ง q := NewQueue(100) คือการระบุจำนวนของ record ที่ต้องการทำ จังหวะนี้ Queue จะสร้าง buffer channel จำนวน […]

Continue reading →