บทความ

Connection Pool

รูปภาพ
Connection Pool                คือ  ระบบงานที่มีการติดต่อกับฐานข้อมูลตลอดเวลา หรือติดต่อบ้าง ไม่ติดต่อบ้าง  หรือมีจำนวน Client เข้ามาติดต่อเป็นจำนวนมาก เปิดฐานข้อมูล แล้วก็ปิด  แล้วรู้หรือไม่ครับ ว่ามันทำงานอย่างไร  การเรียกใช้ฐานข้อมูลแต่ละครั้ง  อย่างน้อยจะต้องมี Overhead ในส่วนของการสถาปนาการเชื่อมต่อ ซึ่งจุดนี้ครับ เป็นหัวใจครับ หากเราลดการสถาปนาการเชื่อมต่อกับฐานข้อมูลได้  การติดต่อระหว่าง Client ต่างๆ ที่จะเข้ามานั้น ก็จะมีประสิทธิภาพมากขึ้นนั่นเอง เราจึงต้องใช้ Connection Pool นะครับ วิธีที่ pool ทำงาน Conection pool ทำงานโดยใช้แนวคิดง่ายๆ สมมุติตัวแปรให้ *sql.DB มีชื่อเล่นว่า “คุณชาย d” ต้องการเข้าถึงฐานข้อมูลข้างใต้ออปเจ็กต์ *sql.DB และการเชื่อมต่อหรือ connection ชื่อเล่นว่าน้อง c นะ ชาย d จะร้องขอ connection หรือน้อง c จากบ้าน pool ก่อน ถ้ามีว่างเหลืออยู่ (idle) ก็จ่ายน้องมาให้ 1 คน ถ้าไม่มีก็จะปั๊มเพิ่มให้ใหม่ ถึงตอนนี้น้อง c จะถูกจับจองเป็นเจ้าของหัวใจ (owners...

Slice หมู!

ข้อมูลแบบ slice จากคราวก่อนที่บอกว่า  array  นั้นเป็นข้อมูลที่กำหนดขนาดชัดเจน array ที่มีขนาดต่างกัน ถือว่าเป็นข้อมูลคนละประเภทกันเลย เช่น var a [5]int var b [10]int ถือว่า a และ b เป็นข้อมูลคนละแบบ a เป็น array ของ int ขนาด 5 ตัว และ b เป็น array ของ int ขนาด 10 ตัว ทีนี้ ถ้าเราต้องการจัดการ array ที่มีขนาดต่างๆกัน เราจะทำอย่างไร สำหรับ Go ได้สร้างข้อมูลอีกประเภทขึ้นมาเลยคือ slice นั่นเอง การประกาศตัวแปรของ slice การประกาศตัวแปรของ slice ทำได้เกือบเหมือน array ต่างกันตรงไม่ต้องกำหนดขนาดนั่นเอง เช่น var a []int var b []int slice เป็นประเภทข้อมูลที่เอามาจัดการ array อีกที นั่นคือโครงสร้างภายในของ slice เป็น array นั่นเอง เราสามารถสร้าง array ให้กับ slice ได้สองแบบ แบบแรกคือใช้ keyword make อีกแบบคือใช้ operator [start : end] โดย start และ end เป็นตัวเลข index เริ่มต้น และ สิ้นสุด เพื่อช่วยตัดข้อมูลภายใน array ซึ่งเรามากเรียกเป็นคำกิริยากันว่า ทำการ slice ขอมูลของ array นั่นเอง นั่นละคือที่มาของคำว่าประเภทข้อมูลแบบ slice ตัวอย่างการใช้ operator slice [:...

Array สำหรับภาษา Go

ข้อมูลแบบ array                จริงๆเรื่องนี้เป็นเรื่องที่สำคัญมากๆ พี่บอสเลยขอหยิบเอา  array  ออกมาอีกโพสแล้วกันเพราะว่าใช้กันบ่อยๆ array  เป็นข้อมูลพื้นฐานสำหรับภาษา  Golang  ที่ทำหน้าที่เก็บข้อมูลเป็นลำดับของข้อมูลประเภทเดียวกันและกำหนดขนาดหรือจำนวนข้อมูลที่อยู่ภายใน  array  เอาไว้คงที่ตั้งแต่ต้น เข้าถึงได้โดยใช้หมายเลข  index ประเภทข้อมูล array Golang  ใช้  [เลขบอกจำนวนสมาชิก]  เอาไว้หน้าชื่อประเภทข้อมูล เพื่อบอกว่าประเภทข้อมูลที่เราต้องการจริงๆคือ  array  ของข้อมูลนั้น ที่มีจำนวนตามที่กำหนดภายใน [] ซึ่งถ้าจำนวนภายใน [] ต่างกัน ถือว่าเป็นข้อมูลคนละแบบกัน เช่น [10]int  แทน array ของ int จำนวน 10 ตัว [3]int แทน array ของ int จำนวน 3 ตัว [5]string  แทน array ของ string จำนวน 5 ตัว [1000]byte  แทน array ของ byte จำนวน 1000 ตัว ส่วนค่าคงที่ของ  array  จะใช้  { n1, n2, …}  ตามหลังประเภทข้อมูลซึ่ง n1, n2 เป็นข้อมูลที่อยู่ภายใน arr...

Go ดีกว่า C++ หรือ Python อย่างไร ?

             วันนี้พี่บอสจะมาพูดถึงภาษา Go เช่นเคยนะครับแต่จะมาเปรียบเทียบกันครับว่าทำไม Google ถึงต้องสร้างเจ้าภาษานี้ขึ้นมามันมีอะไรดีกว่า C++ หรือ Python อย่างไร ไปดูกันเลยครับ                             แม้ว่าภายในกูเกิลนั้นจะใช้งานภาษา C++ และ Python อย่างหนักก็ตาม แต่ทั้งสองภาษาก็ยังมีข้อจำกัดอยู่บางส่วน ภาษา C++ นั้นต้องเสียเวลาในการคอมไพล์นานในการแก้ไขแต่ละครั้ง ส่วนภาษา Python นั้นมีปัญหาเรื้อรังในการรองรับมัลติคอร์ เพื่อแก้ปัญหานี้กูเกิลจึงเสนอ "ทางสายกลาง" ให้กับเราๆ ท่านๆ ด้วยภาษา Go ภาษา Go เป็นภาษาที่ต้องการการคอมไพล์ เช่นเดียวกับภาษา C++ แต่มีข้อดีกว่าหลายประการคือ คอมไพล์เร็วมาก กูเกิลโชว์ให้ดูว่าการคอมไพล์โค้ดนับแสนบรรทัดทำได้ภายใน 10 วินาที บนโน้ตบุ๊ก มีระบบจัดการหน่วยความจำในตัว ไม่ต้องจัดการคืนตัวแปรเอง มี type เช่นเดียวกับ C++ รองรับมัลติคอร์เต็มรูปแบบ สนับสนุนการใช้ Coroutine แบบเดียวกับ Erlang  จบกันไปสำหรับวันนี้นะครับ หวังว่าทุ...

for loop!!

                            เรื่องการทำงานวนซ้ำสำหรับภาษา Go นั้นมี keyword หลักตัวเดียวนั้นคือ for ที่ทำหน้าที่วนซ้ำ ถ้าใครเคยใช้ภาษาในลักษณะ C มาก่อนน่าจะเข้าใจ รูปแบบการใช้งานเช่น for i : = 0 ; i < 10 ; i ++ { fmt . Println ( i ) } จะเห็นว่าคล้ายกับ C นั่นล่ะ แต่ไม่ต้องมีวงเล็บเปิดปิด ต่อมา ถ้าจะใช้งานในลักษณะเดียวกันแบบ while ของ C ทำได้เช่นกันดังนี้ i : = 0 for i < 10 { fmt . Println ( i ) i ++ } ถ้าเกิดต้องการวนซ้ำแบบไม่ต้องมีเงื่อนไขอะไรตรง for เลยทำได้ดังนี้ for { } นอกจากนั้น ถ้าเป็นการวนซ้ำในข้อมูลแบบ array, slice, หรือ map สามารถใช้ keyword range ช่วยเพื่อกำหนดค่า index หรือ key และ value ที่อยู่ภายในโครงสร้างข้อมูลที่ว่ามา ในแต่ละรอบของ for ได้ ซึ่ง for ก็จะวนจนครบทุกข้อมูลที่อยู่ภายใน เช่น a : = [ ] int { 1 , 2 , 3 } for index , value : = range a { } m : = map [ string ] string { "a" : "10" , "b" : "20" , } ...

Go ไม่มี class และ object แต่ทำไมถึงมี Method และ Interface !?

Go เป็น procedure language ที่เราสร้าง Type ใหม่เองได้ และ สร้าง method ให้เจาะจงแต่ละ Type ได้ แบบที่เคยเขียนไว้คราวก่อน “ Go ไม่มี class และ object แต่ทำไมถึงมี Method ”   ทีนี้เหตุที่ Go สร้าง Interface Type ขึ้นมาอีกเพราะต้องการกลไกการทำงานแบบ dynamic dispatch method นั่นคือสามารถเรียกใช้งาน method ของ Type ต่างๆผ่าน Type Interface ได้ ถ้า Type นั้นทำการ implement Interface ตัวอย่างพี่รูฟเคยเขียนไว้แล้วที่นี่  Interface ใน Go  Interface ทำให้ Go สามารถประกอบการทำงานขององค์ประกอบย่อยต่างๆเข้าด้วยกันได้ง่ายขึ้น ทดสอบการทำงานได้ง่ายขึ้น เพราะเราสามารถปรับเปลี่ยนชิ้นส่วนที่ทดสอบยาก ออกไป โดยสร้าง Type ใหม่ขึ้นมาให้ implement interface ที่ต้องการแล้วเปลี่ยนให้ค่าที่เราจะทดสอบได้

ประวัติความเป็นมาของภาษา Go

รูปภาพ
              Go    เป็นภาษาของบริษัท Google เริ่มต้นจากหนึ่งในโครงการทดลองทีเกิดขึ้นภายใต้กรอบนโยบายขอกูเกิ้ลที่เปิดโอกาสให้พนักงานของบริษัทสามารถใช้ 20% ของเวลาทำงานไปพัฒนาโครงการต่างๆ หากได้รับความเห็นชอบจากบริษัทว่ามีความน่าสนใจ ซึ่งล่าสุด Go ไม่ได้เป็นแค่โครงการทดลองเท่านั้น แต่กำลังได้รับการผลักดันอย่างเต็มที่จากทางกูเกิ้ลแล้วด้วย อย่างไรก็ตาม เนื่องจากยังเป็ํนภาษาโปรแกรมที่ยังใหม่มาก?กูเกิ้ลจึงยังไม่นำมันไปใช้ในการพัฒนาผลิตภัณฑ์ หรือบริการหลักของทางบริษัท แต่มันมีความแข็งแรงพอที่จะนำไปใช้พัฒนาซอฟต์แวร์ทำงานบนเซิร์ฟเวอร์ หรือในบราวเซอร์แล้ว             ทีมนักพัฒนาของกูเกิ้ล (google) เพิ่งประกาศโครงการชื่อว่า “Go” ภาษาโปรแกรมใหม่ที่ทางบริษัทจัดทำขึ้นในรูปแบบของโอเพ่นซอร์ส พร้อมทั้งเปิดเว็บไซต์สนับสนุนภาษาโปรแกรมดังกล่าวโดยเฉพาะ              ด้วยภาษาโปรแกรมที่มีอยู่ในปัจจุบันได้ถูกแก้ไขด้วย  Go  แล้ว โดยมันจะทำให้นักพัฒนาสามารถคอมไพล์ (การแปลงชุดคำสั่งโปรแกรมที...