rotate log

เรื่องมันเริ่มจากน้องใบไผ่ มาถามว่าผมทำ rotate log ยังไง ก็เลยพบความจริงว่า สมัยนั้นเราไม่ได้คิดเรื่องนี้กันจริงจัง เราเลยไม่ได้ทำ lol ซึ่งเมื่อวันที่โปรเจ็คมัน go live ไปแล้ว เราก็เลยได้เห็นกระบวนท่า shell script มาทำสิ่งนี้ให้แทน ถึงจุดนี้น้องก็เลยบอกว่าผมจะไปใช้ https://github.com/natefinch/lumberjack แล้วนะ ผมก็เลยลองไปค้นดูเจอใน stackoverflow กล่าวถึงเรื่องนี้อยู่เป็น abstract พอประมาณ ที่นี่

Continue reading →

go get private repo ทำอย่างไร

น่าจะมีหลายคนที่เริ่มใช้ go ในองค์กร บริษัทของตัวเอง บางคนเริ่มมีหลายโปรเจ็ค และอยากเอาของที่ใช้ซ้ำๆกันในหลายๆโปรเจ็คนั้น แยกออกไปเป็น library แล้วใช้ go get เข้ามาแทน ซึ่งผมเองก็เริ่มอยากทำแบบนั้นเหมือนกัน วันนี้เลยเอาประสบการณ์มาเหลาให้กันฟัง ว่าจะต้องทำอย่างไรบ้าง

Continue reading →

Variable scoping and shadowing in go

พอดีได้ยินชื่อ go-kit บ่อยๆ เลยไปเปิดดูของเขาหน่อย เผื่อจะมาทดลองใช้ แต่ทันที่ที่เปิดโค้ด ก็เกิดอาการตื่นตาตื่นใจขึ้นมา จนอดใจไม่ไหว ต้องเอามาเหลาให้สมาชิกที่ยังไม่เคยเห็น ได้ทดลองท่าใหม่ๆกันดูครับ หากใครเคยเห็นหรือรู้จักอยู่แล้วก็ขออภัยที่เอามะพร้าวห้าวมาขายสวนด้วยนะครับ มาดูตัวอย่างโค้ดบางส่วนกันหน่อย

Continue reading →

go unicode เมื่อคิดถึง special characters

คำว่า special characters มันมีความไม่เท่ากันในแต่ละทีนะครับ อย่าลืมข้อนี้ บางทีแค่ $%& พวกนี้บางที่ก็เรียก special characters แล้ว มองบนหนึ่งทีแล้วไปต่อ เนื่องจาก go นั้นทำงานกับ UTF-8 เป็น default ไม่เหมือนกับ c ที่มอง string เป็น char 8bits มาต่อกันเลย

Continue reading →

ความสนุกของ go

ผมชอบภาษาโกมาก เหตุผลก็คือมันสนุก แต่การจะอธิบายว่ามันสนุกตรงไหนนี่ก็ยากมาก วันนี้เลยอยากจะพยายามอีกสักครั้งที่จะบอกว่ามันสนุกยังไง

Continue reading →

type alias

go version 1.9 ออกมาหลายวันละ นับตั้งแต่วันที่ release ก็เข้าไปอ่านเจอบรรทัดแรกๆเลยที่กล่าวถึง type alias ผมบอกเลยว่า `อะไรวะ` แต่ก็เก็บความสงสัยไว้เงียบๆ กะว่าเดี๋ยวต้องมีใครมาอธิบายแน่ๆ ว่าแต่เขาไปอธิบายกันตรงไหนนะ ไม่มาบอกกันมั่งเลย วันนี้ผมก็เลยไปลองอ่าน proposal เรื่องนี้ อ่านๆไป บอกตรงๆอีกที ก็ยังนึกไม่ค่อยจะออกว่าจะเอาไปใช้ตรงไหน ต้องขอโทษคนที่เข้ามาอ่านด้วยนะครับ พอดีผมไม่ค่อยฉลาด เน้นถึก เลยจะมาเล่าแค่เท่าที่พอจะอ่านเจอว่ามันมีดียังไงก็แล้วกันนะครับ

Continue reading →

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 →