Wall of Text #11: C Array and Fraps

น้องเค้ามีคำถามจากการบ้านว่า

จงเปรียบเทียบระหว่าง Array ในภาษาเก่าๆ กับ Python list

ผมชอบคำถามนี้นะ คำตอบที่เค้าเขียนคือ

ในภาษา C สมาชิกของ Array ทั้งหมดจะต้องเป็น data type เดียวกันทั้งหมด และขนาดของ Array จะตายตัว แต่ใน Python list สามารถคละ data type กันได้ และสามารถเปลี่ยนขนาดของ Array ได้โดยการเพิ่มหรือลบสมาชิก

ที่น่าสนใจคือ จริงๆ แล้ว C Array ไม่ได้มีขนาดตายตัว…. มันไม่มีขนาดด้วยซ้ำ

Array ในภาษา C จริงๆ แล้วมันคือ Pointer ซึ่งเก็บที่อยู่ของข้อมูล การใช้ Pointer ในภาษา C จะประมาณนี้

ถ้าลองรันดูจะเห็นว่า output คือ 10 ถึงเราจะไม่ได้แก้ x ตรงๆ แต่เราแก้ผ่าน pointer แทน

คำสั่ง *x_ptr จะเป็นการอ่านค่าที่ตำแหน่งที่ x_ptr ชี้ไปอยู่ ซึ่งจริงๆ แล้วคำสั่งนี้มีค่าเท่ากับ x_ptr[0]… แล้ว x_ptr[1] คืออะไรล่ะ?

x_ptr[1] มีค่าเท่ากับ *(x_ptr + 1) เนื่องจากใน C สมาชิกทุกตัวใน array จะอยู่ใน memory ตำแหน่งที่ติดกันไปเรื่อยๆ และสมาชิกทุกตัวมีขนาดเท่ากัน (เพราะเป็น data type เดียวกัน) ดังนั้นถ้าเราทราบที่อยู่ของสมาชิกตัวแรก ตัวถัดไปก็คือเลื่อนไปจากสมาชิกตัวแรกเท่ากับขนาดของสมาชิก 1 ตัว

ดังนั้นตัวแปรที่เก็บ C array จริงๆ แล้วไม่ได้เก็บ array แต่เก็บตำแหน่งของสมาชิกตัวแรกเท่านั้น ส่วนการประกาศ array จริงๆ แล้วก็คือการจองพื้นที่พอให้เก็บสมาชิกใน array ตามจำนวนที่ขอ และคืนตำแหน่งของสมาชิกตัวแรกมาให้

แต่จริงๆ แล้ว เราสามารถอ่านหรือเขียนค่าไปเกินกว่าพื้นที่ที่ขอได้เช่นเดียวกัน เนื่องจาก C ไม่มีการเก็บไว้ด้วยซ้ำว่า array มีขนาดเท่าไร (แต่ไม่การันตีผลลัพท์นะว่าถ้าอ่านเขียนเกินพื้นที่ที่จองไว้จะได้ผลอย่างไร)

Portable assembly

หลังฉากของภาษา C แล้วน่าสนใจว่ามันเป็นภาษาที่ไม่ค่อยสูงกว่า assembly เท่าไรนัก มันไม่พยายามซ่อนการทำงานของคอมพิวเตอร์ ซึ่งก็ตรงตามสิ่งที่ผู้สร้าง C คิดไว้คือมันเป็นเพียงแค่ Portable Assembly

ซึ่งในภาษา C เองก็ยังมีคำสั่ง __asm__ ที่เอาไว้เขียน assembly code ผสมกับภาษา C ได้เมื่อจำเป็น

และคำสั่งนี้ก็มีใช้อยู่ในโค้ดจริงๆ ด้วย เช่นถ้าเราไปอ่านโค้ดของ H.264 decoder ก็จะเห็นว่าเค้าใช้ Assembly ผสมกับโค้ด C เพราะการ decode video นั้นอาจจะใช้ฟีเจอร์เฉพาะของ CPU เข้ามาช่วยได้ ซึ่ง compiler อาจจะไม่สามารถแปลงโค้ด C เป็นคำสั่ง CPU พวกนี้ได้ (*)

Hardware acceleration

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

GPU ของ Raspberry Pi นั้นสามารถถอดรหัส video H.264 (mp4) ได้สบายๆ หลายคนเอา Raspberry Pi มาลง Kodi ดูหนังซึ่งก็จะเห็นว่าภาพก็ลื่นดี แต่ถ้าโปรแกรมที่ใช้นั้นไม่รองรับการใช้ hardware acceleration แล้วก็จะพบว่า CPU ของ Raspberry Pi decode ไฟล์ mp4 ไม่ไหวเลย

บน PC ก็เช่นเดียวกัน ถ้าเราดูไฟล์วิดีโอ MP4 ในเครื่อง จะเห็นว่า CPU load จะไม่ถึง 10% เท่านั้น แต่ถ้าลองดู YouTube 4K จะพบว่า CPU ขึ้นไปสูงถึง 50-100% เลยทีเดียว เนื่องจากฟอร์แมต VP9 (ในขณะที่เขียนนี้) hardware หลายๆ รุ่นยังไม่รองรับการถอดรหัส VP9 เลยจะต้องใช้พลัง CPU ประมวลผล ซึ่งนอกจากจะหน่วงเครื่องแล้วยังเปลืองแบตเตอรี่อีกด้วย

อย่าลืมปรับเป็น 4k 60fps

สมัย Windows XP ถ้าใครเคย Capture โปรแกรมวิดีโอด้วยปุ่ม print screen ก็จะเห็นว่ากรอบที่เล่น video จะเป็นจอดำ หรือเวลากด Print screen บนเกม Full screen ก็เช่นกัน วิธีแก้ไขก็คือใช้โปรแกรมพิเศษที่จับภาพหน้าจอเกมได้ เช่น Fraps

ที่เป็นอย่างนี้ก็เพราะ Video หรือเกมก็แล้วแต่นั้น ภาพถูกสร้างขึ้นบนการ์ดจอโดยตรงโดยไม่ได้ผ่าน desktop เมื่อเรากด print screen จึงจะเห็นแค่ฉากหลังดำๆ เท่านั้น

ตั้งแต่ Windows Vista เป็นต้นมา Desktop compositing (Aero) เป็นที่นิยมมากขึ้นซึ่งทำให้ประสบการณ์ใช้งาน desktop ดีขึ้น ภาพไม่กระพริบ เวลาลากโปรแกรมไม่กระตุก (ข้อเสียคือเกมที่รันใน Windowed mode จะไม่สามารถรันเร็วกว่าเฟรมเรทของ Compositor ได้ ซึ่งถ้าใครใช้จอ 120Hz อาจจะต้องรันเกมใน Full screen แทน) ซึ่ง Desktop compositing นี้ทำงานบนการ์ดจอทำให้การทำ Print screen เปลี่ยนไปและเรามักจะสามารถ screenshot ทุกอย่างบนหน้าจอได้หมดแล้ว นอกเหนือจากเกม Full screen


ผมคิดว่าการศึกษาการทำงานของคอมพิวเตอร์เป็นเรื่องที่น่าสนใจมาก ถ้ามีคนถามว่าทำไม print screen แล้วจอดำ เราจะได้เข้าใจเหตุผลว่ามันไม่ใช่ “เพราะคุณกด print screen จอเกมไม่ได้ถ้าไม่ได้ใช้ Fraps” แต่เพราะภาพมันอยู่ที่การ์ดจอแล้วเรา print screen บน CPU ต่างหากล่ะ

Wall of Text #10: Cloud

จากข่าว SCB Easy ล่มเพราะไปใช้ AWS ผมเดาไว้ใน Facebook ว่าเค้าน่าจะเอา ELB มาแล้ว load balance on premise แล้ว Link พัง น้องเค้าถามว่าเข้าใจว่าหมายถึงอะไร

ย้ำอีกทีว่าเรื่องที่เกี่ยวกับธนาคาร ผมก็เดามั่วไปเท่านั้นแหละ

On Premises

เพิ่งมารู้ว่าการเขียนว่า On Premise นี่ไม่ถูกต้อง ต้องเขียนว่า On Premises เสมอ เพราะ Premises แปลว่าที่ตั้งและมันไม่ใช่รูปพหูพจน์

สำหรับธนาคารแล้ว Server ต่างที่ให้บริการจะอยู่ในศูนย์ข้อมูลของธนาคารเอง เค้าก็เลยเรียกว่า On Premises ก็คือมันอยู่ในที่ตั้งของเรา

มาร์เก็ตติ้งของ Cloud มักจะใช้คำว่า On Premises หมายรวมไปถึงระบบที่ไม่ใช่ Cloud ทั้งหมดถึงมันจะไม่อยู่ที่ออฟฟิศของเราก็ตาม ซึ่งไม่ว่ามันจะถูกหรือผิดมันก็เห็นภาพชัดเจนดีเวลาเราบอกว่าย้ายระบบจาก On Premises ขึ้น Cloud ก็คือย้ายจาก server เดิมไปยังผู้ให้บริการ cloud

Cloud

ทีนี้ถามว่าทำไมธนาคารถึงจะอยากใช้ Cloud? Cloud คืออะไร…

มีตำนานเล่าว่านานมาแล้วมีอุกกาบาตตกลงทุ่งข้าวสาลี ในช่วง Black Friday มีคนเข้ามาซื้อของที่เว็บ Amazon.com เป็นจำนวนมาก Amazon ก็เลยจะต้องจัดซื้อ server มารองรับผู้ใช้งานมหาศาลไม่ให้ล่ม

ทีนี้พอนอกเทศกาล เครื่องมันก็ปล่อยว่างไว้ ทำยังไงดี? Amazon ก็เลยพัฒนา Amazon EC2 ขึ้นมาปล่อยเช่าเครื่อง

ในความเป็นจริงแล้วเรื่องข้างบนขี้โม้ทั้งเพ เพราะ Werner Vogels CTO ของ AWS ก็บอกว่าถ้าเอาเครื่องเหลือมาขายน่ะ 2 เดือนก็ได้ลูกค้ามาจนเครื่องไม่เหลือแล้ว และบริการตัวแรกของ AWS คือ S3 ไม่ใช่ EC2

ไม่ว่าจะจริงหรือไม่จริงแต่เรื่องมีคนเข้าเว็บเยอะบางเวลาเป็นเรื่องจริงที่ทุกคนมีปัญหา ไม่ใช่แค่ Amazon

ระบบลงทะเบียนมหาวิทยาลัยจะมีคนเข้าเยอะมากในช่วงเปิดลงทะเบียน กับเกรดออก

ธนาคารจะมีคนเข้าเยอะในช่วงปลายเดือนไปจนถึงต้นเดือนที่เงินเดือนออก

Startup จะมีคนเข้าเยอะในช่วงเปิดตัวผลิตภัณฑ์ใหม่

กรมสรรพากรจะมีคนเข้าเยอะในช่วงฤดูยื่นภาษี

การที่ระบบล่มส่งผลต่อการดำเนินธุรกิจของหน่วยงานเหล่านี้โดยตรง แล้วจะให้เค้าทำอย่างไร?

ถ้าสุดท้ายแล้วทุกคนซื้อ server มาเพื่อรองรับ spike load เหล่านี้คงจะสิ้นเปลืองมาก และไม่คุ้มทุนที่จะทำ

Cloud อนุญาตให้เราเช่าเครื่องได้เพียงยิง API เข้าไปสั่งเปิดเครื่อง แล้วรอ 2 นาทีให้เครื่องเปิดเสร็จ

Keyword สำคัญคือเช่า เราไม่ต้องมีเงินก้อนที่จะจัดซื้อเครื่องเซิร์ฟเวอร์ราคาแพงอีกต่อไปเพียงแค่จ่ายเงินค่าเช่าเท่านั้นก็สามารถมีเซิร์ฟเวอร์นับร้อยเครื่องได้

ยิ่งไปกว่านั้น สัญญาการเช่าปัจจุบันอยู่ที่ 1 วินาที (ขั้นต่ำ 10) นาที นั่นแปลว่าเซิร์ฟเวอร์นับร้อยเครื่องที่เปิดมารองรับผู้ใช้งานนั้น พอไม่ได้ใช้แล้วจะปิดเมื่อไรก็ได้ แล้วจะไม่เสียค่าอะไรอีกเลย

ไม่ว่าคิดบัญชียังไง Cloud ก็ดูจะคุ้มค่ากว่าเห็นๆ ใช้เท่าไหน จ่ายเท่านั้น เหมือนค่าไฟฟ้าที่ไม่เปิดไฟก็ไม่เสีย

แต่ราคาของ Cloud ไม่ถูก ราคาค่าเช่ามันแพงกว่าค่าเช่าซื้อเครื่องเซิร์ฟเวอร์ไว้เองด้วยซ้ำ แล้วทำไมมันถึงยังน่าสนใจ?

Scale

สิ่งที่ Cloud computing ต้องการเสนอขายไม่ใช่การให้เช่าระบบคอมพิวเตอร์ แต่เค้ากำลังจะขาย “ความสามารถที่จะ scale”

นอกเหนือไปจากการที่เราจะสามารถขยับจาก 0-100 server ได้ในเวลาไม่กี่นาทีแล้วนั้น ผู้ให้บริการ Cloud ยังมีบริการอื่นๆ อีกที่พร้อมจะโตไปกับโปรแกรมของเรา

ถ้าต้องการฐานข้อมูล AWS มีฐานข้อมูลระดับเดียวกับที่ Amazon ใช้ภายในให้บริการ หรือจะเป็น MySQL มาตรฐานก็ใช้ได้

ถ้าต้องการ Message queue AWS ก็มี API เปิดให้ใช้โดยไม่ต้องซื้อซอฟต์แวร์ Message queue ราคาแพง

ถ้าต้องการเก็บข้อมูล AWS มีระบบเก็บข้อมูลไว้ใช้ที่ขนาดแทบไม่จำกัด สามารถเปิดอ่านพร้อมกันได้ 5,500 ครั้งต่อวินาทีต่อโฟล์เดอร์

บริการเหล่านี้ Cloud มีให้เนื่องจากเป็นระบบที่ Application ส่วนมากจำเป็นต้องใช้ แล้วเราจะพัฒนาขึ้นเองทำไมในเมื่อ Cloud ทำให้แล้ว ในราคาที่ถูกกว่า รองรับผู้ใช้งานได้มหาศาล และไม่ต้องนั่งเฝ้าเซิร์ฟเวอร์เอง

Migrating to Cloud

นั่นคือเหตุผลที่ทุกคนกำลังย้ายไป Cloud ในขณะนี้ ถ้าบริษัทไม่ได้ใหญ่มากจนสามารถทำระบบแบบ Cloud ได้ในราคาที่คุ้มทุน และไม่ติดข้อกำหนดอะไรที่ต้องเอาข้อมูลไว้ On Premises การใช้ Cloud ทำให้ระบบมีเสถียรภาพได้ในราคาที่คุ้มค่า

ทีนี้จาก Diagram ของ SCB ซึ่งไม่มีบอกว่าระบบไหนอยู่ที่ไหน ผมเดาว่าสิ่งที่เกิดขึ้นคือ ด้านหน้าของ Experience API โดยปกติแล้วจะมีระบบ Load balancer ที่กระจาย load ให้กับ server ด้านหลังอีกที (Load balancer ทำแค่กระจายโหลดจึงใช้เครื่องน้อยกว่าเครื่องที่ประมวลผล)

ทีนี้ระบบบางส่วนน่าจะถูกย้ายขึ้นไปบน Cloud (ซึ่งเราไม่อาจจะเดาได้ว่ามีอะไรบ้าง) แต่ที่เห็นจากภายนอกคือ Load balancer ถูกย้ายไปด้วย

แต่ไม่ใช่ทั้งแอพที่ถูกย้ายไป ระบบที่อยู่บน Cloud ยังต้องเรียกข้อมูลจากระบบเดิมอยู่ ซึ่งการเชื่อมต่อระหว่าง Cloud กลับมาระบบ On Premises ก็มีอยู่สามวิธีคือ

  1. เรียกผ่านอินเทอร์เน็ตปกติ ข้อเสียคือไม่สามารถเรียกเครื่องที่ไม่มี IP จริงได้
  2. ติดตั้ง VPN แล้วเชื่อมทั้งสองระบบเข้าด้วยกัน
  3. ลากสายจาก Cloud มายังสถานที่เรา ซึ่งแน่นอนว่าแพงมาก

นอกเหนือจาก 1 แล้ว ปัญหาที่เกิดขึ้นได้คือการเชื่อมต่อจะเกิดคอขวดขึ้น เนื่องจากถ้าใช้ VPN การเชื่อมต่อทั้งหมดจะต้องวิ่งผ่าน VPN server ที่ต้องเข้ารหัสข้อมูลก่อนส่งไปปลายทาง หรือสายที่เชื่อมต่อไปยัง Cloud ก็อาจจะมีความเร็วจำกัด

ที่ยังเดาอะไรไม่ได้คือถ้าหากปัญหาอยู่ที่ตรงนี้จริงก็ควรจะสามารถตัดสินใจ Rollback ได้ไม่ยากเพียงแค่สลับไปใช้ Load balancer ชุดเดิม ก็เป็นไปได้ว่า Application อาจจะถูกย้ายไปแล้วทำให้สลับกลับไม่ได้ (เพราะต้องย้ายข้อมูลกลับมาด้วย)

#HugOps

ในคอนเสิร์ท ถ้า Sound Engineer ทำงานออกมาดีจะไม่มีใครรู้เลยว่ามีเค้าอยู่ แต่ถ้าไมค์หอนเมื่อไรทุกคนจะด่าทันที

ในช่วงเวลาที่แอพล่มแบบนี้ก็เช่นกัน เราอาจจะอารมณ์เสียที่เข้าแอพแล้วใช้งานไม่ได้

แต่ Operation ที่กำลังกู้ระบบ โปรแกรมเมอร์ที่นั่งจ้องหาบั๊ก Support ที่รับสายจนคอแห้ง ก็เป็นมนุษย์เหมือนกับเรา

โปรดใจดีกับ Operation