pyenv เป็นเครื่องมือที่ช่วยให้เราสามารถติดตั้งและใช้งาน Python หลายๆเวอร์ชันพร้อมกันในเครื่องเดียวกัน สามารถสลับไปมาได้ และ เวลาลง library ต่างๆด้วย pip ก็ไม่ทำให้ library มันตีกันจนใช้งานไม่ได้ สำหรับ post นี้จะพาไปลองใช้งาน pyenv และคำสั่งในการใช้งานเบื้องต้นกันครับ

Install pyenv

ติดตั้ง pyenv สำหรับใครที่ใช้ macOS และ hombrew ก็ติดตั้งผ่าน brew ได้เลยด้วยคำสั่ง

brew install pyenv

ลิสต์ version ของ Python ที่สามารถติดตั้งได้

ก่อนจะติดตั้ง เราสามารถใช้ pyenv ลิสต์ version ที่ support ออกมาได้ก่อนโดยใช้คำสั่ง

pyenv install -l

ติดตั้ง Python เวอร์ชันที่ต้องการ

ส่วนการติดตั้งก็ใช้คำสั่ง pyenv install ตามด้วยเลขเวอร์ชัน เช่นผมจะติดตั้งเวอร์ชัน 3.7.4 ก็สั่งด้วยคำสั่งดังนี้…


จากโพสต์ก่อนหน้านี้อธิบายไปแล้วว่า Rust จัดการคืนหน่วยความจำที่ไม่ใช้แล้ว โดยไม่ได้ใช้ GC (Garbage Collector) แต่จะทำการคืนหน่วยความจำก็ต่อเมื่อ scope ของตัวแปรที่เป็นเจ้าของหน่วยความจำนั้น (owner) จบการทำงานลง

ในเรื่องของ Ownership เรามาดูกันอีกครั้งว่าเมื่อเราสร้างตัวแปร String ขึ้นมาแบบนี้

fn main() {
let name = String::from("John");
println!("{}", name);
}

name เป็นตัวแปรที่เป็นเจ้าของค่า String::from("John")

Move Ownership

กฎเรื่อง Ownership ของ Rust นั้นมีอยู่อย่างนึงว่า ค่าใดๆ จะมีตัวแปรที่เป็นเจ้าของ (owner) ได้แค่ตัวแปรเดียวเท่านั้น และ เราสามารถเปลี่ยนเจ้าของเป็นตัวแปรอื่นได้ นั่นแหละคือการ Move Ownership เช่น…


รูปจากงาน GO GET TH #5 https://www.facebook.com/pg/gogetth

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

สำหรับใครที่ย้ายมาเขียน Go ใหม่ๆ โดยที่เขียนภาษาอื่นมาก่อนแล้วนั้น จะค่อนข้างรู้สึกว่ามันใช่เหรอ มันดีแล้วเหรอ เวลาเจอโค้ดง่ายๆแบบนี้

func sumInts(nums []int) int {
total := 0
for i := range nums {
total += nums[i]
}
return total
}

หรือแบบนี้ (โค้ดจาก https://golang.org/pkg/strings/#LastIndexByte)

// LastIndexByte returns the index of the last instance of c in s, or -1…


ภาษา Computer สมัยใหม่ ส่วนใหญ่ เลือกจะจัดการหน่วยความจำที่ไม่ใช้แล้วด้วยการเพิ่มระบบ GC (Garbage Collection) เข้าไปในระบบ runtime ของภาษา

GC มีหน้าที่ตรวจสอบ ไล่ดูว่ามีหน่วยความจำส่วนไหนที่จองไว้ แล้วไม่ได้ใช้งานอีกบ้าง คือไม่มีตัวแปรไหนอ้างอิงหน่วยความจำนี้อีกแล้ว GC ก็จะกวาดคืนระบบ (Operating System) ไป หรือบางครั้งก็ไม่คืน แต่มาร์คไว้ว่า เอาไปทำอย่างอื่นต่อได้แล้ว

Rust เป็นภาษาสมัยใหม่เช่นกัน แต่ เลือกวิธีการในการคืนหน่วยความจำที่ไม่ใช้แล้วโดยไม่ใช้ GC แต่ใช้กลไกในเรื่อง Ownership และความมีชีวิตอยู่ของตัวแปรใน Scope แล้ว Drop เพื่อคืนหน่วยความจำ…


Language Server Protocal คือเทคนิคใหม่ที่แยกฟีเจอร์การทำงานอย่าง Auto Complete, Go to definition ที่เราเห็นได้จาก Editor หรือ IDE ต่างๆ ออกเป็น service แล้ว Editor หรือ IDE ค่อยเรียกใช้งานอีกครั้ง ข้อดีคือทำให้คนสร้าง Editor หรือ IDE ไม่ต้องมานั่ง implement ของพวกนี้เองในแต่ละภาษา

สำหรับใครที่ใช้ VSCode ในการเขียน Go ตอนนี้ก็มีคนสร้าง Language Server ที่เราสามารถเอามาใช้งานกับ VSCode ได้แล้วเช่นกันชื่อ Bingo ซึ่งเราต้องลง Go Extension เอาไว้แล้ว หลังจากนั่นจะเริ่มจากติดตั้ง Bingo กันดังนี้

ติดตั้ง Bingo

ตอนนี้ Bingo ติดตั้งผ่าน source…


The Go Playground

สำหรับใครที่อยากลองเล่น Go โดยที่ไม่ต้องติดตั้ง Go ที่เครื่องตัวเองนั้น Go มีเว็บที่เรียกว่า The Go Playground ที่เราสามารถทดลองเขียน Go แล้วรันผ่านเว็บได้เลย

แม้มีข้อจำกัดอยู่บ้าง เช่นไม่สามารถใช้ package อื่นนอกจาก standard package, random แล้วได้ค่าเดิมเสมอ, time.Now แล้วได้เวลาเดิมเสมอ, ไม่สามารถเขียนโปรแกรมแบบ interactive และ network programming ได้ แต่ถ้าเป็นการเรียนรู้การใช้งาน syntax เบื้องต้นของภาษา ถือว่าใช้ได้เลยสำหรับเว็บนี้

เมื่อเข้าไปที่เว็บ https://play.golang.org/ เราจะเห็นหน้าจอคล้ายโปรแกรม Text Editor โดยมีโค้ดตัวอย่าง Hello, playground มาให้ และด้านบนมีปุ่มคำสั่งอยู่ 3 ปุ่ม กับอีก 1 checkbox ได้แก่

Run, Format, Share และ Imports checkbox

วิธีเล่นง่ายๆก็คือเขียนโค้ดลงไป แล้วกด Run ซึ่งการทำงานของ Go จะเริ่มทำที่ func main เสมอ

เราสามารถ auto format โค้ดได้โดยกด format และถ้าเรา check imports เอาไว้ด้วยจะทำให้มันเพิ่ม import package ให้เองด้วย

นอกจากนั้นถ้าเราต้องการส่งโค้ดที่เราเขียนให้คนอื่นดู เราสามารถกดปุ่ม Share แล้วมันจะสร้าง ลิ้งที่เมื่อเข้าไปแล้วจะเห็นโค้ดที่เราพิมพ์เอาไว้อีกด้วย เช่น https://play.golang.org/p/u_kZHEWvkle


package json เวลา Marshal สามารถเลือกตัดบาง field ได้ถ้าค่านั้น empty โดยเพิ่ม option omitemptyให้กับ struct tag แต่ empty ของ package นี้มีเงื่อนไขบางอย่างที่อาจไม่ตรงตามที่เราเข้าใจ

ก่อนหน้านี้ที่ผมใช้ package นี้ในการแปลงจากข้อมูลของ Go ไปเป็น json string นั้นผมคิดว่า omitempty จะหมายถึงไม่เอาค่า field นี้ไปสร้าง json ถ้าเกิดค่าใน field นั้นเป็น zero value ซึ่ง nil นั้นเป็น zero value ของpointer , map , slice , chan , function


สิ่งที่ต้องมีติดเครื่องก่อนคือ

  • Go ต้องเป็น v1.11 เพราะผมจะใช้ Go module
  • Git คิดว่าคนใช้ Go ทุกคนต้องมีอยู่แล้วแหละ
  • make อันนี้คิดว่าคนใช้ macOS และ Linux/Unix คงมีไว้แล้วเช่นกัน

จากนั้นไปที่หน้า git ของ buffalo

หลังจากนั้นก็ copy url ที่จะใช้ clone มาแล้วสั่งที่เครื่องเรา

git clone https://github.com/gobuffalo/buffalo.git

เสร็จแล้วก็เข้าไปที่ buffalo directory cd buffalo ซึ่งตอนนี้หลังจาก git clone มาใหม่ๆเราจะอยู่ที่ master branch แต่เราต้องการใช้ stable version ล่าสุด ให้เราใช้ checkout ไปที่ tag ของ version นั้นแบบนี้

git checkout tags/v0.13.0 -b v0.13.0

หลังจากนั้นให้สั่ง

GO111MODULE=on make install

ถ้าใครใช้ fish shell แทน bash ให้สั่งแบบนี้แทน

env GO111MODULE=on make install

ซึ่งเมื่อทำงานเสร็จจะติดตั้งคำสั่ง buffalo ไปที่ $GOBIN ส่วนใหญ่ก็คือ $GOPATH/bin นั่นแหละครับคิดว่าคนที่คง Go ไว้แล้วคงเพิ่ม path นี้ลงไปที่ environment variable $PATH ไปแล้วทำให้เราสั่งคำสั่ง buffalo ได้เลย


เราสามารถสร้าง HTTP server แบบง่ายๆเพื่อรับ HTTP request แล้ว process อะไรบางอย่างนิดๆหน่อยๆ เราสามารถใช้ gem rack ช่วยได้

จริงๆแล้ว rack เป็น library ที่เตรียมโครงสร้างการทำงานกับ HTTP เอาไว้ให้ ช่วยให้เราเขียนโปรแกรมจัดการ request ได้ง่าย และ อีกด้านหนึ่ง rack ก็เตรียมช่องทางให้เขียนส่วนจัดการในระดับ protocol เอาไว้ ทำให้สามารถเปลี่ยน webserver Handler ได้

สำหรับการสร้างโปรแกรมรองรับ HTTP request ให้เราสร้าง class ที่มี method ชื่อ call และรับ parameter หนึ่งตัวซึ่ง จะถูกส่งค่า env มาให้ซึ่งค่านี้เป็น object ที่ช่วยให้เราจัดการ…


ภาษาคอมพิวเตอร์ ก็เป็นภาษาที่ใช้สื่อสารด้วยวิธีการเขียนแบบหนึ่ง ซึ่งส่วนสำคัญที่ขาดไม่ได้เลยคือการจัดการข้อมูล ดังนั้นภาษาคอมพิวเตอร์ต้องมีวิธีเขียนสัญลักษณ์แทนข้อมูลในภาษานั้นๆ ภาษา Go ก็เช่นกัน ที่มีวิธีเขียนสัญลักษณ์แทนข้อมูลต่างๆดังนี้

จำนวนเต็ม

เบื้องต้นเขียนโดยใช้เลขอาราบิค ในรูปแบบเลขฐาน 10 เช่น

1
2
3

จำนวนแบบมีทศนิยม

เบื้องต้นเขียนด้วยเลขอาราบิค ในรูปแบบเลขฐาน 10 โดยคั่นส่วนที่เป็นทศนิยมด้วยเครื่องหมายจุด เช่น

1.5
2.6
3.7

อักษรหนึ่งตัว (unicode code point)

หรือสัญลักษณ์ที่แทน unicode code point 1 ตัว เขียนโดยใช้ single quote ครอบอักษรนั้นๆเช่น

'a'
'b'…

Weerasak Chongnguluam

I’m a Programmer.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store