วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2563

ทำไมถึงเขียน ภาษา C และ Gtk+ 2.0

หลังจากที่เริ่มเขียนโปรแกรมภาษา C และ Gtk+ 2.0 มาได้ประมาณ 2 สัปดาห์ ก็มีหยุดบ้างทำบ้าง มีหายไปประมาณ 3-4 วัน และบางทีก็ทำสลับกับงานอื่นๆ ไป แต่บางครั้งก็นั่งหน้าจอมากกว่า 12 ชั่วโมง เพื่อค้นหาข้อมูล คิดหาวิธีการเขียนโปรแกรม บางทีเมื่อคิดไม่ออกก็เปลี่ยนไปนั่งทำอย่างอื่นบ้าง ไปหาข้อมูลเกี่ยวกับ Micro-controller หรือไม่ก็ไปไสไม้ทำกล่อง ทำชั้นเรื่อยเปื่อย

เดิมทีจะเขียนระบบ Digital Designage

ถึงตอนนี้การเขียนภาษา C โดยใช้ Gtk+ ก็ถือว่าก้าวหน้าไประดับหนึ่ง สามารถเขียนได้เป็นเรื่องเป็นราว แต่ก็ยังติดขัดปัญหาอยู่บ้าง บางทีก็ติดเรื่องหาตัวอย่างและข้อมูลไม่ได้ทันที กว่าจะเจอก็ใช้เวลานานพอควร

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

ใน Gtk+ ก็มีสิ่งเหล่านี้รองรับหมดแล้ว และเหนือกว่าบางโปรแกรมด้วยซ้ำไป แต่ปัญหา คือ ตัวอย่างและเอกสารต่างๆ บางทีก็ยากที่จะเรียนรู้ หากเมื่อเทียบกับการเรียนรู้ FoxPro ในอดีต สิ่งหนึ่งที่ผู้เขียนชอบมาก คือ กดปุ่ม F1 เพื่ออ่าน Help ของโปรแกรม และแต่ละส่วนก็จะมีตัวอย่างให้เราพิมพ์ตาม จนแทบไม่ต้องหาจากหนังสือเลย (สมัยนั้นไม่มีแหล่งเรียนรู้ใน www ต้องหาจากหนังสือหรือ Help นี่แหละ และสมัยนั้นลงทุนซื้อหนังสือต่างประเทศราคา 2-3 พันบาทก็มี)


แต่เดี๋ยวหลังจากที่มี google การค้นหาก็ง่ายขึ้น แต่เนื้อหาสาระกลับไม่ถูกเรียบเรียงเหมือนเมื่อก่อน และกระจัดกระจายกว่าจะได้ข้อมูลที่ครบถ้วนก็ต้องค้นหาจากหลายเว็บไซต์

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

ตัวอย่างเช่น GdkEventKey หากดูจากเอกสาร https://developer.gnome.org/gdk2/2.24/ แล้วก็ไม่ง่ายเสียทีเดียว เข้าไปแล้วมีทุกอย่างแต่สำหรับมือใหม่ไม่รู้จะเริ่มต้นอย่างไร ไม่รู้จะจับจุดไหนก่อน ยอมรับว่าเมื่อก่อนพยายามเขียนโปรแกรมด้วยภาษา C แล้วไม่ประสบผลสำเร็จก็เพราะเหตุนี้แหละ แล้วก็เปลี่ยนไปเขียนด้วย Java พักหนึ่ง แล้วก็กลับไปที่เว็บเบส อย่าง php หรือ JavaScript และวนกลับไปที่ C# วนเวียนอย่างนี้ไปหลายปี เพราะพยายามที่จะหาโปรแกรมมาทดแทน Visual FoxPro ที่ถูกไมโครซอฟท์ซื้อมาดองและไม่มีการพัฒนาต่อ

สุดท้ายก็หาไม่เจอตอนแรกกะว่าจะจบที่ C# แล้ว เพราะเริ่มต้นเขียนอยู่พักหนึ่งก็เขียนได้ดีและเร็วเหมือนกัน แต่ก็ไม่ยั่งยืนสักเท่าใด เพราะใจเองก็ต่อต้านไมโครซอฟท์นิดๆ คือ หากใช้ C# ก็สลัด Microsoft Windows ไม่หลุดเสียที

พอมาสักพักก็พบว่า Qt C++ สามารถเขียนโปรแกรมได้ดีมาก และใช้งานได้หลายแพล็ตฟอร์ม ทำให้ย้ายไปค่าย Linux ได้อย่างสมบูรณ์แบบ แต่ปัญหา คือ การเขียนโปรแกรมด้วย C++ ก็มีรูปแบบอีกอย่างหนึ่ง ต้องเรียนรู้ใหม่ คือ ไปคนละทางกับ C แต่นั่นไม่ใช่ปัญหา เพราะเราสามารถสร้างความเคยชินได้ไม่ยาก แต่ปัญหาใหญ่ประการหนึ่ง คือ Qt ไม่ว่าเวอร์ชันไหน ก็ใช้ทรัพยากรในการพัฒนาเยอพอควร เมื่อเอาไปรันบนเครื่อง Arm ขนาดเล็กที่มีหน่วยความจำเพียง 512 MB. แล้วมีปัญหาในการเขียนโปรแกรมแบบ GUI พอสมควร สิ่งที่ทำได้ คือ เขียนในเครื่อง PC ก่อนแล้วค่อยเอาซอร์สโค้ดไปคอมไพล์ใหม่บน Arm Platform บางครั้งก็เกิดปัญหาเรื่องการแสดงผล ผิดเพี้ยนต้องปรับแก้ไขใหม่ ทำให้ผิดหลักการไปอีก

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

ในขณะที่กำลังเหยียบเรือสองแคมอยู่นั้นก็คิดได้ว่า เราควรไปให้สุดดีกว่า เลือกเอาสักทางหนึ่งจะไปทางไหน ตอนนี้เลยคิดว่าจะไปทางภาษา C ให้สุดก่อน แต่นั่นหมายถึงเราจะต้องทำอะไรสักอย่างหนึ่งเพื่อพัฒนาต่อไป ไม่ใช่ตันอยู่แค่ Text Mode เขียนแล้วรันบน Console เท่านั้น ต้องทำให้เป็น Application ให้ใช้งานให้ได้จริงๆ

อะไรคือแรงบันดาลใจในการเขียน App ด้วย C
หากถามว่าอะไร คือ สาเหตุที่ทำให้หันกลับมาเขียนภาษา C อย่างจริงจังเสียที หลังจดๆ จ้องๆ อยู่นานมาก จะว่าไปแล้วก็ 20 ปีเลยทีเดียว แต่ไม่สำเร็จสักที
เครื่องที่ใช้เขียนโปรแกรมพร้อม ups dc 5v

สำหรับสาเหตุนั้นจะว่าบังเอิญก็ว่าได้ เพราะหลังจากสถานการณ์ โควิด-19 บริษัทที่ทำงานอยู่ได้ปิดชั่วคราวเพราะเป็นสถานประกอบการเดินรถ เมื่อมีคำสั่งห้ามเดินทางข้ามจังหวัด ก็ต้องหยุดกิจการ เลยคิดว่าอยู่บ้านนานๆ จะทำอะไรดี ก็โหลดเอกสาร e-book ต่างๆ เพื่อกลับมาอ่านมาศึกษาตลอดเวลา 1 เดือน

แต่แล้วหลังจากหยุดตั้งแต่วันที่ 1 เมษายน 63 เป็นต้นมาก็ไม่สามารถรวบรวมสมาธิทำอะไรได้สักอย่าง เช่น จะอ่านหนังสือที่โหลดมา ก็เปิดไฟล์โน้นไฟล์นี้ไม่เป็นชิ้นเป็นอัน อ่านเล่มหนึ่งก็อยากเปิดเล่มอื่นดูไปเรื่อยเปื่อย ครั้นเปลี่ยนไปทำงานไม้ เดินไปที่โต๊ะงานไม้ก็คิดไม่ออกว่าจะทำอะไรดี ทำชั้น ทำกล่อง คิดสักพักก็วางเครื่องมือลงกลับมานั่งหน้าจอทีวี

ก็คิดจะเปิดดูหนังที่โหลดค้างไว้ ดูได้สักพักก็ไม่อยากดู เปิดดูข่าวก็เครียด วุ่นวาย บ่นก่นด่านโยบายนั่นนี่สารพัด

ผ่านไป 7 วันเข้าวันที่ 8 ไม่รู้จะทำอะไรดีก็เหลือบไปเห็น NanoPi M1, NanoPi 2 และ Raspberry Pi ก็เอามาลง OS เพื่อลองเล่นดู

ขณะนั้นก็มองไปที่ NanoPi M1 ที่ซื้อมานานแล้วแต่ไม่ได้ใช้ประโยชน์สักที สาเหตุที่ซื้อก็เพราะชอบรูปแบบของมัน มีพอร์ต HDMI และ Ethernet และมี USB ถึง 3 พอร์ต ตัวเล็กๆ ถือว่าจัดสรรได้ลงตัว เสียดายนิดเดียวที่ไม่มี WiFi นั่นเอง

เมื่อลงโปรแกรมแล้วตอนแรกก็คิดจะลง CodeBlocks เพื่อเอาไว้เขียนโปรแกรมเล็กๆ แต่แล้วก็ลงไม่ได้ เลยลองใช้ Geany เขียนโปรแกรมภาษา C ดูก็ถือว่าใช้ได้ดี ด้วยเครื่องมีทรัพยากรที่น้อยลง Qt ไม่ได้อย่างแน่นอน จึงคิดว่าจะเขียนโปรแกรม GUI ได้อย่างไร ก็ไปค้นเจอเอกสาร e-book เกี่ยวกับการเขียนด้วย Gtk และใช้ Geany เสียด้วย เลยลองเขียนตาม รู้สึกประหลาดใจ และโล่งๆ เบาหวิว เหมือนเจอทางออกหรือเห็นแสงสว่างปลายอุโมงค์ แม้แสงจะเล็กน้อยรำไรก็ตาม

สิ่งที่ประทับใจ คือ การเขียนโปรแกรมบน Geany ไม่เปลืองทรัพยากรเมื่อเทียบกับ Qt แต่ก็ไม่มี Debug ได้เหมือน  CodeBlocks โดยรวมแล้วก็พึงพอใจ

หน้าจอโปรแกรม Geany สำหรับเขียนโปรแกรมภาษา C และวิธีการเขียนบน Gtk+ แบบง่ายๆ 

หลังจากนั้นก็ลองเขียนโปรแกรม Gtk+ ด้วยภาษา C ผลที่ได้กลับไม่ยากอย่างที่คิด และเรียนรู้ได้ง่ายกว่า GUI อื่นๆ ที่สำคัญเหมาะสำหรับมือใหม่มากๆ ตรงที่การเขียนโปรแกรมเป็นการเขียนอย่างตรงไปตรงมา เขียนซอร์ดโค้ดด้วย Text Editor หรือ IDE ก็ได้ แต่การใช้ IDE จะมีข้อดี คือ ระบบ Auto Complete หรือ Tags ช่วยให้เรารู้ว่าคำสั่งนั้นถูกหรือผิด...

หลังจากได้ลองเขียนโปรแกรมและคิดที่จะเขียนแบบจริงจัง คือ วันที่ 10-11 เมษายน 63

เขียนอะไรดี...
หลังจากที่มีแนวทางการเขียนแล้วก็คิดต่อว่าจะทำระบบอะไรดี สำหรับการเขียนโปรแกรมครั้งนี้ เดิมทีจะทำระบบ Digital Signage เพื่อนำไปใช้ที่บริษัท แต่ดูแล้วก็ไม่สามารถที่จะพัฒนาได้เร็วๆ นี้ และต้องใช้เครื่อง NanoPi อีก 7 เครื่องซึ่งตอนนี้อัพเดทเป็นรุ่น NanoPi M1 Plus ราคาก็ 1,950 บาท แล้วหากรวมเคสและชุดจ่ายไฟก็ราวๆ 2,500 บาท ต่อจุด จึงต้องเลื่อนแนวคิดนี้ไปก่อน เพราะกะว่าจะซื้อ กล่อง Android ซึ่งมีราคาไม่แพง เพียงแค่ 800 บาทก็ใช้งานได้แล้ว และมีแอปพลิเคชันให้ดาวน์โหลดมาใช้งานได้

จากนั้นก็คิดต่อว่าจะทำอะไรดี ดูเหมือนจะหยุดชะงักไปนิดหนึ่ง เพราะมันคิดไม่ออกเอาดื้อๆ

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

หน้าจอ MyDB หัดเขียนครั้งแรกเพื่อเชื่อมต่อและจัดการฐานข้อมูลง่ายๆ 
หลังจากนั้นก็คิดต่อเนื่องไปอีกสักพักก็คิดได้ว่าระบบที่บริษัทยังค้างอีกชุดหนึ่ง คือ ระบบบริหารทรัพยากรทางด้านไอที คือ ที่มีอยู่ก็ยังกึ่งแมนวลด้วยซ้ำไป ด้วยระบบที่หามาส่วนใหญ่ก็เป็นระบบร้านขายอุปกรณ์คอมพิวเตอร์ซึ่งไม่ตรงกับงานที่ทำอยู่ คือใช้ได้เพียงครึ่งเดียวเท่านั้น ไม่สามารถทำงานได้ตามงานขององค์กร จึงคิดจะเขียนระบบขึ้นมาเอง แต่เดิมว่าจะเขียนบน Web เพื่อจะได้ใช้งานต่อบนมือถือได้ แต่ก็รอนานพอสมควร ยังไม่ขยับเสียที ตอนนี้เลยคิดว่าจะเขียนแอปพลิเคชันบน Desktop ก่อนเพื่อให้ใช้ในองค์กร แต่เมื่อออกไปหน้างานค่อยหาทางพัฒนาระบบที่เป็น Web App กันอีกที และจะใช้แบบ Mobile Application ก็ว่ากันใหม่

หลักการออกแบบโปรแกรม
โปรแกรมที่เขียนได้ตอนนี้บอกก่อนว่าย้อนอดีตไปราว 20 ปีเลยก็ว่าได้ ความรู้สึกเหมือนหัดเขียนโปรแกรมครั้งแรกด้วย Visual FoxPro เลยทีเดียว เพราะรูปแบบกราฟฟิคที่ได้มันรู้สึกเป็นกราฟฟิคในยุคนั้นจริงๆ

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

หากมองถึงแอปพลิเคชันทุกวันนี้ก็จะสร้างสคริปส์ sql ไว้ด้วย ก่อนติดตั้งก็ต้องสร้างฐานข้อมูลและตารางด้วยคำสั่งของ MySQL เสียก่อน

สำหรับโปรแกรมสมัยก่อนนั้นจะมีส่วนที่จัดการฐานข้อมูลให้ คือ เริ่มต้น, จัดเรียงข้อมูล, สำรองข้อมูล และอาจจะเพิ่มเมื่อสำรองข้อมูลเสร็จก็บีบอัดด้วย gzip อีกด้วยเพื่อให้ไฟล์เล็กลงจะได้คัดลอกลงฟล็อปปี้ดิสก์ได้ง่าย แต่สมัยนี้มีระบบการจัดเก็บข้อมูลที่ใหญ่มากๆ ไม่ค่อยห่วง แต่อย่างไรก็ตามหากต้องส่งไฟล์พวกนี้ผ่านเน็ตเวิร์กด้วยแล้วการบีบอัดข้อมูลย่อมทำให้การรับส่งได้เร็วขึ้น

ป้อนรหัสผ่านของ 
หลักการง่ายๆ เหล่านี้เราสามารถกำหนดตั้งแต่เริ่มต้นโปรแกรม เมื่อเข้าสู่ระบบก็จะตรวจสอบโดยเชื่อมต่อฐานข้อมูลตามรายละเอียดที่เก็บไว้ในไฟล์ db.dat ซึ่งเป็นไฟล์แบบไบนารี ไม่สามารถดูได้ด้วยโปรแกรม text editor ธรรมดา ซึ่งก็ช่วยปกปิดข้อมูลได้ระดับหนึ่ง ส่วนรหัสผ่านก็ต้องเข้ารหัสอีกครั้งหนึ่งก่อนจัดเก็บลงไฟล์ db.dat
สร้างฐานข้อมูลที่จะใช้งาน


เพิ่ม User สำหรับเชื่อต่อฐานข้อม
เมื่อเชื่อมต่อกับฐานข้อมูลไม่ได้ก็ให้ป้อนรหัสผ่าน root ของ mysql เพื่อเข้าไปเพิ่มฐานข้อมูลและ user, password สำหรับเชื่อมต่อฐานข้อมูล ชื่อผู้ใช้นี้ไม่ใช่ผู้ใช้ในระบบ เพราะเดี๋ยวจะมีโมดูลในการจัดการผู้ใช้งานและสิทธิ์ในการเข้าถึงเมนูต่างๆ อีกที

ขณะที่ป้อนข้อมูลรหัสผ่านนั้นก็ให้ตรวจสอบ คือ ป้อนรหัสผ่านสองรอบเพื่อตรวจสอบว่าตรงกันไหม เป็นการป้องกันการป้อนรหัสผ่านผิด ซึ่งเป็นปัญหามากสำหรับการจัดการฐานข้อมูลด้วย MySQL บางครั้งก็เข้าไม่ได้ บางทีเพราะพิมพ์รหัสผิดตั้งแต่ต้นนี่แหละ

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

แต่ปัญหาก็ใช่ว่าจะไม่เกิดเหมือนเกริ่นไว้ข้างต้น คือ แหล่งเรียนรู้ และข้อมูลมีมากเหลือเกินและส่วนใหญ่ไม่มีข้อมูลที่ตรงกับอยากได้แบบทันทีทันใด ต้องรวบรวม เรียบเรียงจากหลายๆ ที่ แรกๆ ก็ท้อเหมือนกัน แต่สุดท้ายพอเริ่มทำได้บ้างแล้ว ก็สนุก และหาวิธีการใหม่เพิ่มขึ้นเรื่อยๆ และวนกลับไปอ่านเอกสารของผู้พัฒนา Gtk+ ก็เริ่มเข้าใจดีกว่าเมื่อก่อน

เป้าหมายตอนนี้ คือ เขียนระบบด้วย C และ Gtk+2.0 ให้ได้และเข้าใจก่อน แล้วค่อยก้าวข้ามไปในส่วน Gtk+3.0 เวอร์ชันอื่นๆ หรือเครื่องมืออื่นๆ ตลอดถึงข้ามไปเขียนด้วย C++ หรือ Python บ้าง 

เหนือสิ่งอื่นใด คือ การรวมเอาไมโครคอนโทรลเลอร์มารวมเข้ากับระบบด้วยนั่นคือ wiringPi เพื่อเค้นเอาประสิทธิภาพของเครื่องออกมาให้มากที่สุด... ขอบคุณที่ติดตามอ่านจนจบนะครับ สวัสดี...













ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...