Elixir |> Functional |> Concurrent |> Pragmatic |> Fun


Functional |> Concurrent |> Pragmatic |> Fun


มีเพื่อนแนะนำให้ลอง Elixir พอได้ลองแล้ว บระเจ้า ชอบเลยครัช elixir ถูกเก็บเข้ามาเป็น 1 ในหลายๆภาษา ที่ผมชอบแล้ว เริ่มตั้งแต่ Go, Rust, Swift, Nodejs ก็พอได้ แต่จนมาพบกับ Elixir ผมว่าเป็นภาษาที่น่าสนุกเป็นอย่างยิ่ง

ทำไมต้องหลายๆภาษาด้วย ?
สำหรับผมนั้น Open mind ก็เรียนรู้ภาษาหลายๆภาษาเหมือนเราได้เรียนรู้วัฒนธรรมของภาษานั้นๆ เหมือนได้เปิดโลกอีกโลกหนึ่ง ยิ่งพูดได้หลายภาษา เราก็สามารถผูกมิตรกับเพื่อนๆ หลายๆประเทศได้เช่นภาษาคนนั้นล่ะ 

อีกอย่างอย่าไปยึดติด ว่าภาษานี้ซิดีกว่า ภาษานั้นซิดีกว่า เอาเป็นว่าภาษาคอมพิวเตอร์เป็นแค่เครื่องมืออันหนึ่ง ใช้งานมันให้ถูกทางก็พอแล้ว   และอีกอย่างบางภาษาก็มีข้อดี ช่วยพัฒนาให้การเขียนโปรแกรมของเราได้ดีขึ้น อย่างเช่นภาษาทางด้าน Functional Programming ที่กำลังมาแรงๆมากๆในตอนนี้


ถ้ามีเวลา ก็มาศึกษากับมันไปเถอะ เจ้าของบล๊อกนี้ก็เช่นกัน เพราะว่าต้องเอาไปใช้กับงานประจำด้วย ได้ใช้ทุกภาษาเลย ต้องนำไปเขียน Library กับ Plugin ให้คนอื่นๆใช้งานง่ายๆ ตอนนี้เลยต้องลองให้ได้เยอะที่สุด  แต่คิดว่าคงเริ่มง่ายละ ขอเพียงแต่เขียนโปรแกรมภาษาหนึ่งได้ ภาษาอื่นมันก็ไวเอง 

Happy Hacking ครัช

เทคนิค Vim ในการคอมเม้น และ เอาคอมเม้นออกอย่างรวดเร็ว

วันนี้ มาแนะนำการเซ็ต Vim บางที เราต้องการที่จะ comment หลายๆบรรทัด ต้องกดหลายปุ่มกว่าจะ comment และเอา comment ออกได้  วันนี้ มาเพิ่มความสะดวกกันนิดหน่อย โดยการเพิ่มความความดังข้างล่างนี้ ลงไปในไฟล์ ~/.vimrc หรือ ~/.vimrc.local  ก็ได้

autocmd FileType c,cpp,java,scala,js,go         let b:comment_leader = '// '
autocmd FileType sh,ruby,python,coffee          let b:comment_leader = '# '
autocmd FileType conf,fstab                     let b:comment_leader = '# '
autocmd FileType tex                            let b:comment_leader = '% '
autocmd FileType mail                           let b:comment_leader = '> '
autocmd FileType vim                            let b:comment_leader = '" '
noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:nohlsearch<CR>
noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:nohlsearch<CR>

เมื่อต้องการ comment ก็เพียงแต่กด  ",cc" (อย่าลืม เครื่องหมาย คอมม่าก่อนนะ) และ
ถ้าต้องการเอา comment ออก ก็เพียงแต่พิมพ์ ",cu"    แค่นี้ ชีวิตก็สบายขึ้นอีกหลายเท่าเลยครัช

** ถ้าต้องการ comment หลายๆ บรรทัด ก็ใช้ Shift + V แล้วกด j  เพื่อเลือกหลายๆบรรทัดก่อนที่จะพิมพ์ ,cc นะครับ

HackerOne แหล่งรวมแฮกเกอร์ในทางดี



ในอดีตการเป็นแฮกเกอร์มักจะถูกมองว่า ต้องการเอาความรู้ไปใช้แต่ในเรื่องที่ไม่ดี ต่างๆนาๆ หรือบางคนชอบลองนั้น ลองนี้ ศึกษาการเขียนโปรแกรมนั้นนี่ๆ ลองทำอะไรแปลกๆแผลงๆ ก็จะถูกมองว่าเป็นเป็ดบ้าง ไม่จริงจริงบ้าง หรือเป็นพวกนอกกรอบสุดติ่งกระดิ่งแมวก็ว่ากันไป

แต่ในตอนนี้ หนทางใหม่ของนักทดลองได้เปิดขึ้นแล้ว มีหลายๆเว็บที่เปิดรับสมัครนักเจาะระบบ ไม่ว่าจะเป็นของ โบว์อิ่ง ถ้าเจอบักของระบบเครื่องบิน ก็จะได้ตั๋วบินฟรี ตลอดชีวิตเป็นต้น หรือเจาะระบบของกาแฟยี่ห้อดัง ก็จะได้กินกาแฟฟรีตลอดชีวิต

ในวันนี้ มาแนะนำเว็บ HackerOne สำหรับบริษัทต่างๆที่ต้องการทดสอบระบบตัวเองปลอดภัยต่อการถูกเจาะหรือไม่ โดยถ้าเจาะได้ ก็จะได้เงินเป็นค่าตอบแทน ตั้งแต่ $50 - $15,000 ตามความสำคัญของบักนั้นๆ

เหล่าคนที่มีความรู้ก็จะได้ไม่ต้องเอาไปลองอะไรผิดที่ผิดทางได้แล้ว มาที่นี่ได้ทั้งความรู้ ได้ทั้งเงิน และได้ทำในสิ่งที่ตัวเองรักอีกตัว ดังนั้น มาเป็นแฮกเกอร์กันเถอะ

Multi Git Account on one machine


เครื่องที่บริษัทแจก Mac Air ตัวใหม่ เครื่องทีบ้าน ก็เป็น Mac เหมือนกัน แต่ไม่อยากกลับไปกลับมาหลายเครื่อง ตอนนี้ เครื่องที่ใช้บ่อยที่สุด ก็เครื่องที่บริษัท แต่มีปัญหาอยู่ว่า พอจะ Push Code ที่ไว้ฝึกฝีมือ กลับกลายเป็นอีกชื่อหนึ่ง


ดังนั้น หาวิธีในการ เซ็ตได้ดังนี้

1. Gen SSH Key ใหม่ โดยอ้างอิง email ของ github ตัวเดิม เช่นว่า

~ ❯❯❯ ssh-keygen -t rsa -C "34d30y@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Xpay/.ssh/id_rsa): /Users/Xpay/.ssh/id_rsa_34d30y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/Xpay/.ssh/id_rsa_34d30y.
Your public key has been saved in /Users/Xpay/.ssh/id_rsa_34d30y.pub.
The key fingerprint is:
bd:06:78:f1:93:55:ce:4b:35:93:7b:47:80:1f:42:11 34d30y@gmail.com

เปลี่ยนชื่อไฟล์หน่อย เพื่อไม่ให้มันซ้ำกับตัวเดิมที่มีอยู่แล้ว

2. cat ~/.ssh/id_rsa_34d30y.pub แล้วนำไปเพิ่มใน  profile -> setting -> ssh key บน github server

3. สร้างไฟล์ ~/.ssh/config เพื่อแยก user ระหว่าง user ที่ทำงานกับ user ส่วนตัว

~/D/c/go git:master ❯❯❯ cat ~/.ssh/config
Host XPay
    HostName github.com
    User Xpay
    IdentityFile ~/.ssh/id_rsa

Host 34d30y
    HostName github.com
    User 34d30y@gmail.com
    IdentityFile ~/.ssh/id_rsa_34d30y

4.  Clone Code ลงมาปกติ เช่น  git clone  git@github.com:user/repo.git

5.  ลบ ssh-key แคชของ key เกาๆก่อน โดยใช้
ssh-add -D

6. เซ็ต remote origin ใหม่ โดย ดังนี้
git remote add origin git@34d30y:34d30y/go.git

#34d30y  เป็นชื่ออ้างอิงของ github ส่วนตัว

7. เซ็ต user.name, user.email สำหรับ repo นี้
git config user.name <user>
git config user.email <email>


เสร็จแล้ว หลังจากนั้นลองแก้ไขไฟล์ และลอง push ดู

Go :: Gin Framework



วันนี้ ลองหา Framework ของภาษา Go สำหรับเขียน Web Application จริงๆ กะจะทำเป็น ทั้ง Web Mobile เลย เพราะว่าเขียนเป็น Backend ไว้ที่ DigitalOcean เท่าๆที่ไล่ดู Gin เป็นอะไรที่ลงตัวที่สุดล่ะ
การทำงานไวมากๆ ไวสัดๆๆ นี่ยังไม่ได้จูนนิ่งอะไรเลย 

เริ่มแปล Gin Gonic ไว้บ้างดีกว่า ตัวอย่างบนหน้าเว็บน้อยไปหน่อย แต่ก็สามารถทำความเข้าใจได้ไม่ยาก เพราะพวก Web Framework ก็น่าจะมีประมาณนี้  แต่ในทีนี้ จะนำมาใช้ในการเขียน Rest API
ให้โปรเจ็คที่คิดไว้ 

เครื่องที่ทดสอบก็เล็กมากๆ แต่ผลลัพธ์นี้ รองรับงานใหญ่ๆได้สบายๆ 

Learn Rust

Learn Rust

บทนี้ จะสอนท่านเกี่ยวกับการสร้างโปรเจ็คต่างๆ โดยใช้ภาษา Rust และจะสอนความรู้แบบลึกขึ้น 
ถ้าท่านต้องการจะศึกษาจากพื้นฐาน เพื่อให้ทราบที่มาที่ไปของ โครงสร้างภาษา Rust ลองมาอ่านได้ที่ Syntax and Semantics.

Hello, Cargo!

Hello, Cargo!


Cargo เป็นเครื่องมือสำหรับช่วยจัดการโปรเจ็คต่างๆ ของภาษา Rust ตอนนี้ เวอร์ชัน pre-1.0 และยังคงพัฒนาเพื่อให้ดีขึ้นอีก อย่างไร ก็ดี Cargo ถือว่าเป็นเครื่องมือที่ดีมาก 

Cargo ช่วยจัดการงาน 3 อย่างด้วยกันคือ  คอมไพล์ซอร์สโค้ด, ดาวนโหลดไลบรารี่ที่ซอร์สโค้ดเราเรียกใช้ และ คอมไพล์โค้ดไลบรารี่นั้นๆด้วยเช่นกัน ในขั้นต้น เรามาเรียนรู้โปรแกรมที่เป็นฟังก์ชั่นกันก่อนดีกว่า โดยที่ยังไม่มีการเรียกใช้ไลบรารี่จากข้างนอก หลังจากนั้น เราค่อยมาเรียนรู้ในการเรียกใช้ไลบรารี่จากข้างนอกอีกที


ถ้าหากท่านลง Rust จากวิธีที่ทางเราแนะนำ ก็จะมี คาร์โก (Cargo) มาพร้อมแล้ว ส่วนถ้าท่านลงจากวิธีอื่นๆ ลองเช็คว่ามีหรือไม่ โดยอ่านจาก  check the Cargo README 

ปลี่ยนมาใช้ Cargo กันดีกว่า


เรามาเปลี่ยนโปรเจ็คแรก ที่เป็น Hello World โดยใช้ Cargo กันดีกว่า

วิธีการใช้ Cargo นั้น จำต้องทำสองอย่างคือ  สร้างไฟล์ Cargo.toml ซึ่งเป็นไฟล์คอนฟิกของ Cargo และนำซอร์สโค้ดโปรแกรมของเรามาใส่ให้ถูกที่ตามพาทที่กำหนด มาเริ่มกัน
$ mkdir src
$ mv main.rs src/main.rs

จากข้างบน เราจะคอมไฟล์ให้เป็นโปรแกรมที่รันได้ แต่ถ้าหากต้องการสร้างไลบรารี่ ก็เพียงแต่ระบุในไฟล์ TOML ว่าให้เป็นไลบรารี่หรือไบนารี่ (โปรแกรมที่รันได้)  [[lib]] หรือ [[bin]]

Cargo จะกำหนดว่าซอร์สไฟล์โปรแกรมของเราจะถูกเก็บไว้ภายใต้ src 
ถัดมามาสร้างไฟล์คอนฟิก Cargo.toml
$ editor Cargo.toml
ระวังตรงชื่อไฟล์ ตัว C ต้องเป็นตัวใหญ่นะ
ใส่ข้อมูลข้างล่างลงไปครัช
[package]

name = "hello_world"
version = "0.0.1"
authors = [ "ชื่อเรา  <อีเมล์>" ]

ไฟ์จะอยู่ในรูปแบบ TOML 

TOML คล้ายๆกับไฟล์ .ini แต่มีบางอย่างที่ดีกว่า
พร้อมแล้ว มาลอง คอมไพล์โปรแกรมกันดีกว่า
$ cargo build
   Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
$ ./target/debug/hello_world
Hello, world!
เสร็จแล้ว cargo build, ลองรันโดยใช้คำสั่ง ./target/debug/hello_world. หรือจะใช้คำสั่ง cargo run: คำสั่งเดียวในการคอมไพล์และรันโปรแกรมก็ได้
$ cargo run
     Running `target/debug/hello_world`
Hello, world!

ข้อสังเกตุ หากซอร์สไฟล์ไม่มีการเปลี่ยนแปลง Cargo จะไม่คอมไพล์ไฟล์ซ้ำ จะกลายเป็นรันโปรแกรมเลย
$ cargo run
   Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
     Running `target/debug/hello_world`
Hello, world!

อาจจะดูเหมือนซับซ้อน กว่า การใช้คำสั่ง rustc  แต่ในอนาคตถ้าโปรแกรมเราใหญ่และซับซ้อน การใช้ Cargo จะช่วยได้มาก

ถ้าหากโปรแกรมเสร็จสมบูรณ์ ต้องการนำไปใช้ทุกๆให้ใช้ Option --release ด้วย ดังตัวอย่าง cargo build --release
ในการรัน จะเห็นว่า Cargo มีการสร้างไฟล์ใหม่ด้วยคือ: Cargo.lock.
[root]
name = "hello_world"
version = "0.0.1"

ไฟล์นี้ Cargo จะสร้างขึ้นมา สำหรับไว้เช็ค ไลบรารี่ ต่าองๆ ที่โปรแกรมเราต้องการใช้ แต่ตอนนี้ อาจจะยังไม่มี แต่ว่า ในครั้งต่อไป มีแน่นอน แต่เราไม่ต้องทำเองหรอกนะ เพราะ Cargo จัดการให้หมด

สำเร็จแล้ว ใช้ Cargo ในการรันโปรแกรม hello_world ควรที่จะใช้บ่อยๆนะ เช่นโปรเจ็คที่อยู่บน github ถ้ามีการเซ็ต Cargo.toml ไว้ เมื่อเราโหลดลงเครื่อง ก็สามารถรันได้เลย
$ git clone someurl.com/foo
$ cd foo
$ cargo build

าสร้างอีกโปรเจ็คกัน


มาดูวิธีการง่ายๆ ในการสร้างโปรเจ็คด้วย Cargo กัน โดยที่เราไม่ต้องคอยสร้างทีละอย่าง ใช้คำสั่ง cargo new ก็จะได้โครงสร้างทุกอย่างของโปรเจ็คนั้นเลย
พิมพ์ดังคำสั่งข้างล่างนี้ cargo new:
$ cargo new hello_world --bin

ใส่ Option --bin เพื่อที่จะบอกว่า เราจะคอมไพล์ออกมาเป็นโปรแกรมที่ใช้ทำงานได้ ถ้าเป็นไลบรารี่ ก็ไม่ต้องใส่ตรงจุดนี้

มาดูว่า Cargo สร้างอะไรให้เราบ้าง
$ cd hello_world
$ tree .
.
├── Cargo.toml
└── src
    └── main.rs

1 directory, 2 files
ถ้าไม่มีคำสั่ง tree ก็ไม่เป็นไร ก็คลิกเข้าไปดูใน ไดเร็กทอรี่ก็ได้
อย่างแรกที่จะดูคือไฟล์ Cargo.toml:
[package]

name = "hello_world"
version = "0.0.1"
authors = ["ชื่อ <อีเมล์>"]

จะเห็นว่า Cargo สร้างให้อัตโนมัติเลย
เปิดไฟล์มาดู src/main.rs:
fn main() {
    println!("Hello, world!");
}

Cargo สร้าง "Hello, World!" ให้เราแล้ว พร้อมที่จะรันได้เลย ถ้าอยากรู้จักการใช้งาน Cargo แบบลึกๆ ก็เข้ามาอ่านได้ที่ guide

ตอนนี้ เรารู้จัก เครื่องมือของ Rust พร้อมแล้ว ต่อไป จะเริ่มเรียนภาษา Rust กันแล้วนะ

มาถึงขึ้นนี้ มีสองทางเลือกคือหนึ่ง เริ่มเรียน Learn Rust’,    และสองไปศึกษาที่มาที่ไปของภาษาจาก Syntax and Semantics ส่วนใหญ่คนทั่วๆไปจะเริ่มจากการเรียนที่  Learn Rust’, ก่อนแต่ก็เลือกได้ตามใจที่ท่านต้องการได้เลยครัช