การแปล Tour of Go เป็นภาษาไทย มีความท้าทายอยู่หลายเรื่อง ถ้าจะนับตั้งแต่ครั้งแรกที่คิดจะทำ
- แปลให้อ่านรู้เรื่อง
- เอาไป merge กับชาวโลก
- deploy เข้า app engine
ใน 3 เรื่องนี้ ทุกวันนี้ข้อ 3 ยังวนเวียนมาสร้างความเวียนหัวให้ผมอยู่เรื่อยๆ โดยเฉพาะ 2ปีหลังมานี้ เพราะว่า Go เองก็มีการเปลี่ยนแปลงหลายๆเรื่อง ไม่ว่าจะเป็นการเปลี่ยน Theme ของ website ทั้งหมด และตัว source code ที่เก็บ Tour เองก็มีการเปลี่ยนแปลงอีกหลายอย่าง เช่น ย้าย repo ไปที่ใหม่ ไปจนถึงเปลี่ยนแปลงโครงสร้างของ code ไปยันวิธีการ deploy ก็เปลี่ยน และล่าสุดการมาของ Generics นอกจากจะเพิ่มเนื้อหาเข้าไปแล้ว ก็ยังมีเปลี่ยนโครงสร้าง code ไปอีกไกลมาก
วันนี้ก็เลยต้องมาบันทึกการแก้ไขเอาไว้ เพราะผมก็เหนื่อยเหมือนกัน 😅 ที่ต้องมา hack มันใหม่ทุกรอบ
ซึ่งก่อนหน้านี้ก็ยังแอบภูมิใจอยู่ว่า เราเป็น Tour ภาษาเดียวที่ไม่นับต้นฉบับ ที่สามารถใช้ Theme เดียวกับต้นฉบับได้อยู่ระยะหนึ่ง เหตุก็เพราะว่า มันต้อง hack และคงไม่ค่อยมีใครมาเสียเวลาอะไรแบบนี้เหมือนผม 🤣
เอาละ มาเริ่มกันเลยว่า ปัญหาการ deploy มันมีอะไรต้องทำบ้าง
1 คำสั่งที่จะใช้ run เฉพาะ Tour
เนื่องจากการเปลี่ยนแปลงครั้งใหญ่ก่อนหน้านี้อย่างหนึ่ง คือการรวบรวมเอา web site ที่เป็น official ของ Go เข้ามาไว้ด้วยกันที่ repo ใหม่ https://github.com/golang/website
ตัว repo นี้เวลาที่เรา run command มันจะได้ web site ทั้งหมดของ Go โดย Tour จะเป็น path หนึ่งของเขาคือ /tour อีกที
ข้อนี้เป็นปัญหาแรก เพราะเราจะเอาเฉพาะ Tour มา deploy ใน App Engine ของเรา แบบอยากให้เข้ามาแล้วเจอ Tour เลยตั้งแต่หน้าแรก ข้อนี้ผมก็เลยต้องไปตามหาคำสั่งที่ต้องการให้เจอ ซึ่งก็ไม่ได้ยากมาก
จากปกติต้องใช้คำสั่ง
go run ./cmd/golangorg
ตามคู่มือในหน้า README แต่ถ้าไปดูที่ dir /tour เองมันก็มีไฟล์ main.go อยู่เหมือนกัน และมันก็สามารถไป go run main.go
ในนั้นตรงเลยก็ได้ แล้วมันก็เปิดอ่านใน local เครื่องเราเองได้เลย อันนี้ก็ถือว่าหาเจอแล้ว
2 เมื่อเจอแล้วจะ deploy ไปที่ App Engine ยังไง
ข้อนี้เราเลยต้องเพิ่มไฟล์ app.yaml ลงไปใน /tour เอง ซึ่งโชคดีที่มั่วไปมั่วมาก็ได้ท่าง่ายสุดๆเลย
runtime: go116
main: ./tour
handlers:
- url: /.*
script: auto
secure: always
ถึงจุดนี้ เราสามารถเอา Tour ขึ้น GAE ได้แล้ว แต่ก็ยังติดอีกปัญหาใหญ่คือ ทุกๆหน้าของ Tour จะไม่สามารถกด Run โปรแกรมตัวอย่างได้เลย ซึ่งข้อนี้นำมาซึ่ง ปัญหาที่ 3
3 แก้เรื่อง Run โปรแกรม
ข้อนี้ผมแก้ด้วยการไปเพิ่ม ของในไฟล์ internal/proxy/proxy.go
func RegisterHandlers(mux *http.ServeMux) {
for _, host := range []string{"golang.org", "go.dev/_", "golang.google.cn", "go-tour-th.appspot.com/_"} {
mux.HandleFunc(host+"/compile", compile)
if host != "golang.google.cn" {
mux.HandleFunc(host+"/share", share)
}
mux.HandleFunc(host+"/fmt", fmtHandler)
}
}
โดยเติม host ของภาษาไทยลงไปดื้อๆเลย "go-tour-th.appspot.com/_" ค่านี้นะครับ
จากนั้นก็ไปเพิ่ม code อีกจุดใน internal/tour/local.go
proxy.RegisterHandlers(mux)
ผมเดาว่านี่คือบทสรุปหลังจากที่มั่วไปหลายอย่าง และถ้าให้กลับมาทำใหม่อีกทีก็จะงงว่าทำไปได้ไง เอาเป็นว่า โคตรมั่วเลยละกันครับ
ผมเขียนสิ่งนี้ไว้บอกตัวเองในอนาคตว่าต้องไปทำอะไรบ้าง ถ้าเผื่อดันไปเผลอลบ repo ซะก่อน
Top comments (0)