PETEPITTAWAT.DEV
Cover Image for ปัญญา

ปัญญา

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: วิเคราะห์อนาคตของ Flutter 2.2+

Flutter: วิเคราะห์อนาคตของ Flutter 2.2+

Google I/O งานอัพเดตใหญ่ประจำปีจาก Google ที่จะมาเปิดตัวนวัตกรรมใหม่ ๆ สำหรับผู้ใช้ทั่วไป และนักพัฒนา และในปีนี้ (2021) เอง ก็มีอัพเดตเกี่ยวกับ Flutter ใหม่ ๆ ในหลายเรื่องเช่นเดียวกัน และนั่นถือว่าเป็นสิ่งที่น่าสนใจมาก ๆ สำหรับอนาคตของ Flutter

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for JS: Event Bubbling and Capture

JS: Event Bubbling and Capture

Event ถือได้ว่าเป็นหนึ่งในหลักสำคัญสำหรับการเขียนโปรแกรมด้วยภาษา JavaScript สำหรับการทำงานกับ Browser เพราะ Event ทำให้เราสามารถสร้าง Event handler (callback) สำหรับทำงานเมื่อมี Event ที่เราสนใจเกิดขึ้นนั่นเอง อย่างไรก็ตามยังมีอีกหนึ่งหลักการที่อาจไม่ได้พบได้โดยทั่วไป แต่หากเจอก็อาจสร้างความสนุกสนานการในการจัดการและพยายามทำความเข้าใจในสิ่งที่เกิดขึ้นก็ได้ นั่นก็คือ Event Bubbling and Capture นั่นเอง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for คาดการณ์ Flutter Engage 2021

คาดการณ์ Flutter Engage 2021

อีกไม่นานแล้วสำหรับ Flutter Engage งานใหญ่ประจำปีของ Flutter ที่จะมาอัพเดตรวมถึงปล่อยของใหม่ ๆ ออกมามากมาย ตอนนี้ก็ถึงเวลามาคาดการณ์กันดีกว่าว่าภายในงานจะมีอะไรบ้าง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Review: LINE Developer Day 2020 - The past and future of machine learning research

Review: LINE Developer Day 2020 - The past and future of machine learning research

ใน Session นี้ คุณ​ Masashi Sugiyama ได้มาพูดถึงใน 3 ประเด็นหลัก ๆ ด้วยกัน นั่นคือ Trend in ML Research, Our Research, Future ML Research

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flask: จัดการกับ Form ให้ง่ายขึ้นด้วย Flask WTForm

Flask: จัดการกับ Form ให้ง่ายขึ้นด้วย Flask WTForm

หากใครที่ได้เริ่มต้นใช้ Flask ร่วมกับ Jinja ซึ่งเป็น Template Engine และต้องจัดการกับ Form คงคุ้นเคยกับ request.form.get("name") อะไรประมาณนี้กันเป็นอย่างดี เพื่อเข้าถึงข้อมูลที่ส่งมาจาก Front-end แน่นอนว่า เมื่อได้รับข้อมูลมาแล้วเราจะต้องมีการ Validate หรือยืนยันว่าข้อมูลเป็นไปตามรูปแบบที่กำหนดไว้หรือไม่อีกครั้ง ก่อนนำข้อมูลไปจัดการต่อ หากเขียนเป็นขั้นตอนคร่าว ๆ เราจะได้ว่า

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Deserializing failed due to Error: Bad State No element

Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Deserializing failed due to Error: Bad State No element

built_value Package ขวัญใจใครหลาย ๆ คน นี่เป็นหนึ่งใน Source Gen ที่ได้รับความนิยมมากที่สุด Package หนึ่งของชาว Flutter Developer อย่างไรก็ตามการทำงานกับมันอาจไม่ง่ายนัก และไม่ใช่ทุก Error Message ที่อ่านเข้าใจได้ง่าย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Deserializing failed due to '_InternalLinkedHashMap <String, dynamic>' is not subtype of type 'Iterable<dynamic>'

Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Deserializing failed due to '_InternalLinkedHashMap <String, dynamic>' is not subtype of type 'Iterable<dynamic>'

built_value Package ขวัญใจใครหลาย ๆ คน นี่เป็นหนึ่งใน Source Gen ที่ได้รับความนิยมมากที่สุด Package หนึ่งของชาว Flutter Developer อย่างไรก็ตามการทำงานกับมันอาจไม่ง่ายนัก และไม่ใช่ทุก Error Message ที่อ่านเข้าใจได้ง่าย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dart: เขียนโค้ดให้ดีขึ้นด้วยไฟล์ Analysis Options

Dart: เขียนโค้ดให้ดีขึ้นด้วยไฟล์ Analysis Options

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dart: Cascade Notation .. (จุดจุด) ที่ไม่ได้ให้เติมคำลงในช่องว่าง

Dart: Cascade Notation .. (จุดจุด) ที่ไม่ได้ให้เติมคำลงในช่องว่าง

หลาย ๆ ครั้งที่เราพัฒนาโปรแกรมโดยใช้ภาษา Dart โดยเฉพาะเวลาใช้ Package ของคนอื่น หรือเวลาเราเปิด Tutorial เรามักจะได้เห็นสัญลักษณ์ .. ตามด้วยชื่อของตัวแปรหรือฟังก์ชัน ว่าแต่ว่าเจ้า .. หรือ Cascade Notation นี่มันมีไว้ทำอะไรกันนะ

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: InteractiveViewer มาทำให้ Widget ของเรา Pan, Zoom กันเถอะ

Flutter: InteractiveViewer มาทำให้ Widget ของเรา Pan, Zoom กันเถอะ

หลายครั้งที่เรามี Content ที่มีขนาดใหญ่กว่าขนาดของหน้าจอหรือขนาดของ Parent Widget แต่เราก็ไม่อยากให้ผู้ใช้ของเราต้องสูญเสียข้อมูลที่อาจจะต้องการไป เช่น เรามีตารางขนาดใหญ่มาก จนตัวอักษรเล็กไปหมด แน่นอนว่าเราต้อง Zoom เพื่อให้เห็นได้ชัดเจนยิ่งขึ้น แต่นั่นก็จะทำให้ข้อมูลส่วนที่อยู่นอกหน้าจอหายไปด้วย จะดีกว่ามั้ยหากเราสามารถทำให้ผู้ใช้ของเรา Pan เลื่อนดูข้อมูลส่วนที่อยู่นอกหน้าจอได้ นั่นคือหน้าที่ของ InteractiveViewer นั่นเอง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for K-Means Clustering VS Hierarchical Clustering สองอย่างนี้ต่างกันยังไง

K-Means Clustering VS Hierarchical Clustering สองอย่างนี้ต่างกันยังไง

สำหรับ Unsupervised Learning แล้ว เราคงหนีไม่พ้นการทำ Clustering เพื่อหากลุ่มตามธรรมชาติของข้อมูล ซึ่งทำให้เราสามารถเข้าใจและได้ Insight ใหม่ ๆ จากข้อมูลเหล่านั้น ตัวอย่างในการทำ Clustering ที่เรามักพบเห็นได้บ่อยก็จะเป็น K-Means Clustering และ Hierarchical Clustering แต่ว่าจริง ๆ แล้วทั้งสองแบบนั้นทำงานแตกต่างกันอย่างไร

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: App Size Tool ส่องให้เห็นกันไปเลยว่าอะไรทำให้แอปเราบวม

Flutter: App Size Tool ส่องให้เห็นกันไปเลยว่าอะไรทำให้แอปเราบวม

แม้ว่าในปัจจุบัน Smartphone จะมาพร้อมขนาดของพื้นที่เก็บข้อมูลที่เพิ่มมากขึ้นในทุกปี โดยในปัจจุบัน Smartphone ส่วนใหญ่จะมาพร้อมความจุ 64 - 128GB (2020) อย่างไรก็ตามสิ่งที่นักพัฒนาแอปพลิเคชันต้องคำนึงไว้เสมอก็คือพื้นที่นั้นไม่ได้มีไว้ให้แอปของเราทั้งหมด

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: BuildContext Deep Dive รู้ให้ลึกกับ BuildContext

Flutter: BuildContext Deep Dive รู้ให้ลึกกับ BuildContext

BuildContext สิ่งที่ปรากฎตัวแทบทุกที่ในโค้ดของเรา และเป็นสิ่งที่นักพัฒนา Flutter ต้องใช้ชีวิตอยู่กับมันให้ได้ หลายครั้งบางคนก็อาจไม่เข้าใจว่าเราจะใช้ Context ไปทำไม แต่นี่ไม่ใช่คอนเซปใหม่เลย ในหลายภาษา Context ก็ไปปรากฎตัวเช่นเดียวกัน

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Unknown type on deserialization. Need either specifiedType or discriminator field.

Flutter: วิธีแก้ปัญหาใช้ built_value แล้วเจอ Unknown type on deserialization. Need either specifiedType or discriminator field.

built_value Package ขวัญใจใครหลาย ๆ คน นี่เป็นหนึ่งใน Source Gen ที่ได้รับความนิยมมากที่สุด Package หนึ่งของชาว Flutter Developer อย่างไรก็ตามการทำงานกับมันอาจไม่ง่ายนัก และไม่ใช่ทุก Error Message ที่อ่านเข้าใจได้ง่าย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: เลขเวอร์ชันของ Flutter มีความหมายอย่างไรบ้าง?

Flutter: เลขเวอร์ชันของ Flutter มีความหมายอย่างไรบ้าง?

เมื่อช่วงต้นปี (2020) ที่ผ่านมา Flutter ได้มีการปรับระบบการออกอัพเดท รวมถึงการตั้งเลขเวอร์ชันใหม่ เพื่อให้นักพัฒนาสามารถเข้าใจได้ง่ายขึ้น และผู้ที่สนใจจะช่วยก็สามารถช่วยร่วมพัฒนา Flutter ได้ง่ายขึ้นเช่นกัน

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: runZonedGuarded เอาไว้ทำอะไรนะ?

Flutter: runZonedGuarded เอาไว้ทำอะไรนะ?

การแยกประเภทของข้อผิดพลาดต่าง ๆ ออกจากกัน เช่น ข้อผิดพลดาที่เกิดจาก API ภายนอกที่แอปของเราเชื่อมโยงอยู่ หรือข้อผิดพลาดที่เกิดขึ้นจากแอปพลิเคชันของเราเอง เราอาจจะสามารถเขียน If-else มาดักการทำงานต่าง ๆ เห่านี้ได้ แต่จะดีกว่ามั้ยถ้ามีฟังก์ชันที่สวยงามและพร้อมให้เราใช้งานได้เลย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Extract as a Widget VS Extract as a Method ใช้แบบไหนดีนะ?

Flutter: Extract as a Widget VS Extract as a Method ใช้แบบไหนดีนะ?

2 วิธีหลัก ๆ ที่เรามักใช้กันในการสร้างความเป็นระเบียบของวิดเจ็ตทรี (Widget tree) ของเรานั่นคือ การแยกส่วนของโค้ดออกเป็นวิดเจ็ต (Extract as a Widget) และการแยกส่วนของโค้ดออกเป็นเมธอด (Extract as a Method) แน่นอนว่าทั้งสองแบบนั้นต่างช่วยให้เราสามารถนำโค้ดไปใช้ซ้ำได้ (Reusable code) แต่ควรจะใช้แบบไหนเมื่อใด และมีอะไรที่ต้องคำนึงถึงบ้าง บทความนี้จะพาไปตอบคำถามนั้น

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Print Debugging ทำแบบนี้ดีไหมนะ?

Print Debugging ทำแบบนี้ดีไหมนะ?

การพัฒนาโปรแกรมกับบัคนั้นอาจเรียกได้ว่าเป็นของคู่กัน ไม่ว่าเราจะตั้งใจหรือไม่ก็ตาม บัคก็มีอยู่หลายแบบ หลายประเภท หากเป็นบัคที่เราพิมพ์ผิด Syntax หรือบัคตระกูล Compile-time Error แบบนี้เราอาจจะแก้ไขได้ง่าย เพราะว่า Compiler จะบอกเราถึงจุดที่เราผิด รวมทถึงในบางครั้งก็แนะนำวิธีแก้ให้กับเราเรียบร้อย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: อัพเดทจัดเต็มกับ Flutter 1.20, Dart 2.9.0 และ Dart DevTools 0.9.0

Flutter: อัพเดทจัดเต็มกับ Flutter 1.20, Dart 2.9.0 และ Dart DevTools 0.9.0

เมื่อวานนี้เอง (5/8/2020) ที่ทาง Flutter ได้ทำการปล่อยอัพเดทใหญ่ออกมาในชื่อ Flutter 1.20 ซึ่งถือว่าเป็นอัพเดทที่ใหญ่ที่สุดที่ Flutter เคยปล่อยออกมา โดยในเวอร์ชันนี้ยังมาพร้อมกับ Dart 2.9.0 และ Dart DevTools เวอร์ชันใหม่ 0.9.0 ที่มากันแบบเต็ม ๆ รวมไปถึงการอัพเดท Plugin สำหรับ IDE ต่าง ๆ อีกด้วย รายละเอียดจะเป็นอย่างไรบ้างนั้น ไปติดตามกันเลย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dart: Extension Methods - มาเพิ่มความสามารถให้กับ Third-party Library กันเถอะ

Dart: Extension Methods - มาเพิ่มความสามารถให้กับ Third-party Library กันเถอะ

การใช้งาน Third-party Library นั้นมีความสำคัญเป็นอย่างมาก อย่างไรก็ตามหลายครั้งที่เรามักมีความรู้สึกว่า "ถ้ามี xxx มาด้วยก็ดีสินะ" หรือ "อยากให้ xxx ทำแบบนี้มากกว่าแบบที่ให้มาจังเลย" ปัญหาเหล่านี้ หากเป็น Library ที่เราพัฒนาขึ้นมาเอง หรือเป็นส่วนหนึ่งของโปรแกรมของเราก็คงไม่ใช่ปัญหาอะไรที่จะไปแก้ไขโค้ดในส่วนนั้น ๆ ให้มีความสามารถมากยิ่งขึ้น

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dogfooding: หนึ่งในรูปแบบการพัฒนาผลิตภัณฑ์ ที่จะช่วยทำให้ผลิตภัณฑ์ของเราดียิ่งขึ้น

Dogfooding: หนึ่งในรูปแบบการพัฒนาผลิตภัณฑ์ ที่จะช่วยทำให้ผลิตภัณฑ์ของเราดียิ่งขึ้น

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Triage Labels (Aug. 2020)

Flutter: Triage Labels (Aug. 2020)

ใครมีโอกาสได้ลองไปกดดู Issues ของ Flutter บน GitHub คงได้เห็น Label มากมาย มีทั้งอันที่อ่านเข้าใจได้ทันที และอันที่อ่านแล้วไม่เข้าใจ ในบทความนี้เราจะมาดูกันว่าแต่ละตัวมีความหมายอย่างไรบ้าง เผื่อใครที่อยากรู้ว่าในอนาคตอันใกล้ Next Release ของ Flutter จะมีอะไรบ้าง หรืออยากช่วย Contribute ให้กับ Flutter

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: อนาคตของ Flutter กับ iOS 14

Flutter: อนาคตของ Flutter กับ iOS 14

ประมาณ 1 เดือนก่อนหน้า Apple ได้จัดงาน WWDC2020 ซึ่งได้มีการเปิดตัวระบบปฏิบัติการเวอร์ชันใหม่ ๆ สำหรับผลิตภัณฑ์ต่าง ๆ โดยได้มีการปล่อยเวอร์ชัน Beta ออกมา เพื่อให้นักพัฒนาได้นำไปทดสอบว่า iOS 14 จะไม่มีปัญหากับแอปพลิเคชันในปัจจุบัน โดยในสังคมของนักพัฒนา Flutter เองก็ได้มีหลายสิ่งที่น่าสนใจเกิดขึ้นกับ iOS 14 ที่กำลังมาถึง จะมีอะไรบ้างนั้น ไปติดตามกันได้เลย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: bloc และ flutter_bloc v6 มาแล้ว!

Flutter: bloc และ flutter_bloc v6 มาแล้ว!

หลังจากที่ bloc v5 และ flutter_bloc v5 ได้ถูกปล่อยออกมาไม่นาน โดยมีการเปลี่ยนแปลงหลัก ๆ ในการนำ cubit มาเป็นพื้นฐานในการจัดการ State และสร้าง bloc on-top ขึ้นไปนั้น ไม่นานทางคุณ​ Felix Angelov ก็ได้ปล่อย bloc และ flutter_bloc v6 ออกมา โดยการเปลี่ยนแปลงหลัก ๆ จะเป็นการนำ cubit เข้ามาอยู่ภายใน bloc แทนที่จะเป็น Dependency ที่ bloc ไปเรียกใช้งาน นอกจากนี้ยังมีการปรับปรุงอื่น ๆ รวมถึงแก้ไขข้อผิดพลาด จะมีอะไรบ้างนั้นไปดูกันได้เลย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for HTML: <wbr> - tag ดี ๆ ที่หลายคนมองข้ามไป

HTML: <wbr> - tag ดี ๆ ที่หลายคนมองข้ามไป

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for หลักการพื้นฐานในการเขียนโค้ดที่ดีในทุกภาษา

หลักการพื้นฐานในการเขียนโค้ดที่ดีในทุกภาษา

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Review: Digimon Adventure: Last Evolution Kizuna ถ้อยคำถึงคนที่ยังไม่อยากโต และหลบหนีไปอยู่ในความทรงจำของวัยเด็ก

Review: Digimon Adventure: Last Evolution Kizuna ถ้อยคำถึงคนที่ยังไม่อยากโต และหลบหนีไปอยู่ในความทรงจำของวัยเด็ก

Digimon การ์ตูนขวัญใจใครหลาย ๆ คนในวัยเด็ก และเป็นการ์ตูนที่ใครหลาย ๆ คนโตกับมันมา สำหรับ Digimon Adventure Last Evolution Kizuna นั้นก็ถือเป็นบทสรุปเรื่องราวการเดินทางที่เต็มเปี่ยมไปด้วยความหมายของความสัมพันธ์ระหว่างเด็กที่ถูกเลือกและดิจิมอนกว่า 20 ปี โดยภาพยนตร์การ์ตูนเรื่องนี้เป็นส่วนหนึ่งของโครงการฉลองครบรอบ 20 ปีของดิจิมอน

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for pub.dev เวอร์ชันใหม่มาแล้ว!

pub.dev เวอร์ชันใหม่มาแล้ว!

pub.dev เว็บไซต์คู่ใจนักพัฒนาที่ใช้ภาษา Dart และ Framework อย่าง Flutter สำหรับใช้ในการค้นหา Package/Plugin ต่าง ๆ เพื่อนำมาใช้งานใน Application ของเรา โดยที่ไม่ต้องเขียนโค้ดเองทั้งหมด ในวันนี้ได้มีการอัพเดทเวอร์ชันใหม่ของเว็บไซต์ ซึ่งไม่เพียงแค่รูปลักษณ์ที่เปลี่ยนไปเท่านั้น แต่ยังมีฟีเจอร์อำนวยความสะดวกใหม่ ๆ เพิ่มขึ้นด้วย!

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: เพิ่ม Pull to Refresh ให้กับ ListView

Flutter: เพิ่ม Pull to Refresh ให้กับ ListView

หนึ่งในรูปแบบการใช้งานที่เรามักจะเห็นได้บ่อยสำหรับการโหลดข้อมูลใหม่ ๆ จากฝั่งผู้ใช้งาน โดยเฉพาะบน Android หรือแอปพลิเคชันที่ทำตาม Material Guideline ก็คือการ Swipe to Refresh นั่นเอง โดยทั่วไปเรามักจะมี List ซึ่งเราสามารถดึงลงมาได้มากกว่าปกติจากบนสุดแล้วปล่อย โดยระหว่างนั้นก็จะมี Indicator มาหมุนโชว์ให้ดูว่ากำลังดาวน์โหลดข้อมูลใหม่ ๆ เมื่อเสร็จแล้วก็จะหายไปและมีข้อมูลใหม่มาโชว์ที่ List นั่นเอง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Casting vs Coercing

Casting vs Coercing

แทบทุกโปรแกรมที่เราเขียนกันขึ้นมา เราคงหนีไม่พ้นการเปลี่ยนประเภทของตัวแปร/ค่านั้น ๆ (Type conversion) ไม่ว่าจะเปลี่ยนเพื่อให้ทำงานได้ง่ายขึ้น หรือเพราะต้องการนำไปใช้กับ Third-party library จริง ๆ แล้ว การเปลี่ยนประเภทตัวแปรนั้น แบ่งออกได้เป็นสองแบบหลัก ๆ นั่น ก็คือ Casting และ Coercing ในบทความนี้จะพาไปดูว่าสองแบบนี้ต่างกันอย่างไรบ้าง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: bloc และ flutter_bloc v5 มาแล้ว!

Flutter: bloc และ flutter_bloc v5 มาแล้ว!

หลาย ๆ คนที่เลือก BLoC เป็นแนวทางในการ Manage State ภายใน Application คงหนีไม่พ้นที่จะต้องใช้ Packages bloc และ flutter_bloc ซึ่งช่วยให้เรามี Boilerplate code ลดลง โดยตอนนี้ bloc ก็ได้มีการอัพเดทครั้งใหญ่ (Major version update) เป็นเวอร์ชัน 5 เป็นที่เรียบร้อย ในบทความนี้จะพาทุกคนไปดูกันว่ามีการเปลี่ยนแปลงอะไรบ้าง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Semantics

Flutter: Semantics

Application ที่ดี คือ Application ที่ทุกคนสามารถเข้าถึงแล้วใช้งานได้ Accessibility เป็นหนึ่งในเรื่องสำคัญที่ไม่เพียงแต่แสดงให้เห็นว่าเราเชื่อมั่นในความเท่าเทียมกันเท่านั้น แต่ในเชิงธุรกิจยังถือว่าเป็นการเปิดโอกาสใหม่ ๆ ในการเพิ่มฐานลูกค้าอีกด้วย ดังนั้นในบทความนี้จะพาทุกคนไปรู้จักกับ Semantics ซึ่งเป็นหนึ่งใน Widget ที่เกี่ยวข้องกับ Accessibility โดยเฉพาะผู้ใช้งานที่ใช้ Screen reader

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Flexible vs Expanded

Flutter: Flexible vs Expanded

บางครั้งเราต้องการให้ Widget ของเรา Take space ที่เหลือทั้งหมดของ Column/Row นั้น ๆ หรือ เราอาจต้องการให้ Widget แต่ละส่วนใน​ Column/Row ใช้ Space เท่า ๆ กัน แน่นอนว่า Widget 2 ตัว ที่มักถูกใช้รับมือกับสถานการณ์แบบนี้ คงหนีไม่พ้น Flexible และ Expanded แล้วทั้งสองตัวนี้ต่างกันอย่างไร?

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for JIT Compiler VS AOT Compiler

JIT Compiler VS AOT Compiler

หลาย ๆ ครั้งที่เราเขียนโปรแกรมด้วยภาษาบางภาษา มักจะต้องการ Compiler เพื่อแปลงภาษานั้น ๆ ให้กลายเป็นอีกภาษาหนึ่ง เช่น TypeScript ที่จะถูก Compile ไปเป็น JavaScript หรือจาก Java ที่จะถูก Compile ไปเป็น Java Bytecode (ซึ่งถูกนำไปใช้รันใน JVM อีกที) สองประเภทของ Compiler ที่มักจะมาปรากฎให้เราเห็นกัน ก็คือ JIT Compiler และ AOT Compiler นั่นเอง โดยบทความนี้จะพาไปดูกันว่ามันแตกต่างกันยังไง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Hot Reload vs Hot Restart vs Full Restart

Flutter: Hot Reload vs Hot Restart vs Full Restart

หนึ่งในข้อได้เปรียบของการพัฒนา Mobile Application บน Flutter คือ Hot Reload ที่ช่วยให้การพัฒนา UI ในโลกของ Mobile Application Development เป็นไปได้ด้วยดียิ่งขึ้น เพราะเราะสามารถเหตุผลลัพธ์ได้(เกือบจะ)ทันทีที่มีการบันทึกไฟล์โค้ดของเรา ซึ่งเป็นผลมาจากทีมที่พัฒนา Flutter นั้น แต่เดิมเป็นทีมที่พัฒนาเกี่ยวกับเว็บซึ่งมีการแสดงผลอย่างทันทีที่มีการบันทึกไฟล์ และต้องการจะนำประสบการณ์แบบเดียวกันมาสู่การพัฒนาแอปพลิเคชันบนอุปกรณ์เคลื่อนที่นั่นเอง

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: เพิ่ม Feedback สไตล์ Material ให้กับ Widget ด้วย InkWell

Flutter: เพิ่ม Feedback สไตล์ Material ให้กับ Widget ด้วย InkWell

ไม่ใช่ทุกปุ่มและการ์ดที่เตรียมมาให้เราใช้งานใน Flutter จะตอบโจทย์การออกแบบได้ทั้งหมด Flutter เองก็ตระหนักถึงความต้องการนี้ดี จึงมี Widget ที่ชื่อว่า GestureDetector มาให้เพื่อมอบ Flexbility ให้มากที่สุดเท่าที่เป็นไปได้กับ Developer ในการรังสรรค์ UI อันสวยงามขึ้นมา แต่อย่างไรก็ตาม GestureDetector แม้ว่าจะมาพร้อมกับความสามารถสารพัด แต่ก็ไม่ตอบโจทย์เสมอไป

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: TextField vs TextFormField ใช้ตัวไหนดีนะ?

Flutter: TextField vs TextFormField ใช้ตัวไหนดีนะ?

หลาย ๆ คนที่อยากจะรับข้อความสั้น ๆ จากผู้ใช้งาน อาจจะรู้สึกสับสนว่าจะใช้ Widget ใน Flutter เนื่องจาก มีทั้ง TextFormField และ TextField ให้เลือกใช้งาน ในบทความนี้เราจะมาหาคำตอบกัน

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for OS จัดการกับ Main Memory ยังไงนะ? - Memory Partitioning

OS จัดการกับ Main Memory ยังไงนะ? - Memory Partitioning

แน่นอนว่าระบบคอมพิวเตอร์หนึ่ง ๆ ต้องการพื้นที่สำหรับวางข้อมูลไว้เพื่อนำไปใช้ได้อย่างรวดเร็ว และ Main Memory ก็คือสิ่งที่เรากำลังพูดถึงกันอยู่นั่นเอง อย่างไรก็ตาม เราทุกคนต่างรู้ดีว่า Main Memory นั้นมีพื้นที่ต่อราคาที่ค่อนข้างแพงเมื่อเทียบกับ Hard Disk Drive (HDD) ด้วยเหตุนี้เองระบบปฏิบัติการ (OS) ก็ต้องพยายามทำอย่างไรก็ได้เพื่อให้การบริหารจัดการ Main Memory เป็นได้ด้วยความคุ้มค่ามากที่สุด

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Package กับ Plugin ต่างกันยังไงนะ?

Flutter: Package กับ Plugin ต่างกันยังไงนะ?

โลกของการพัฒนาซอฟต์แวร์ในปัจจุบัน เราแทบจะไม่เห็นโปรแกรมไหนที่ไม่พึ่งพา Public dependencies ในการพัฒนาอีกแล้ว อย่างน้อย ๆ พวก Utility ต่าง ๆ ในโปรแกรมที่เรามักจะใช้ประจำอย่างเช่น lodash Package ชื่อดังของ Node.js ที่แม้เราจะไม่ได้ใช้โดยตรงแต่หลาย ๆ Package ที่เราใช้ก็อาจจะนำมาใช้เช่นกัน

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dart: Sound Null Safety กำลังมาใน Dart 2.9!

Dart: Sound Null Safety กำลังมาใน Dart 2.9!

หลายครั้งที่เรามักจะมีปัญหาโดยมีสาเหตุมาจาก Null เพราะว่าตอนเขียนโปรแกรมเราไม่อาจรู้ได้เลยว่าตัวแปรที่ส่งมาจะเป็น Null หรือไม่ รู้ตัวอีกทีก็ตอน runtime ที่โปรแกรม Error ให้ผู้ใช้เห็นไปแล้ว Null safety จะมาเปลี่ยนแปลงสิ่งเหล่านั้นไป

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: การทำให้ Application รองรับ Dark Mode

Flutter: การทำให้ Application รองรับ Dark Mode

แน่นอนว่าเราควรเคารพการตั้งค่าของผู้ใช้งาน หากผู้ใช้งานตั้งค่าให้ OS เป็น Dark Mode แล้ว ทุกแอพก็ควรเคารพสิ่งนั้น แล้วเราจะสามารถทำแบบนั้นได้อย่างไรบ้างใน Flutter?

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Dart: Exception VS Error

Dart: Exception VS Error

แน่นอนว่าการเขียนโปรแกรมนั้นเราคงคาดหวังแต่ Happy Path ไม่ได้ หลายครั้งที่เราต้องคิดเผื่อเหตุการณ์ที่ไม่ได้เป็นไปในทางที่เราคาดหวังด้วย ซึ่งแน่นอนละว่าวิธีทั่วไปที่เราใช้กันในการรับมือกับเหตุการณ์ไม่คาดหวังก็คือ Error และ Exception นั่นเอง แต่สองคำนี้มันต่างกันยังไงละ?

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for REVIEW: Inferno เมื่อมนุษย์มีประชากรมากเกินไป

REVIEW: Inferno เมื่อมนุษย์มีประชากรมากเกินไป

Dan Brown ถือได้ว่าเป็นหนึ่งในนักเขียนนิยายที่ไม่เพียงเขียนได้อย่างน่าติดตาม และชวนให้เราลุ้นตลอดทั้งเล่มด้วยภาษา และสไตล์การดำเนินเรื่องอันเเป็นเอกลักษณ์ เขายังถือเป็นอีกคนหนึ่งที่ชวนเราตั้งคำถามยาก ๆ ที่หลายคนไม่กล้าแม้แต่จะคิด หรือเลือกที่จะมองข้ามมันไป ตลอดการเดินทางของ Robert Langdon ตัวเอกในหนังสือชุด Robert Langdon ของเขา ตั้งแต่การผจญภัยในกรุงโรม ในเล่ม Angels & Demons ที่ชวนให้เรากลับมาตั้งคำถามเกี่ยวกับศาสนาในยุคปัจจุบันผ่านการเดินทางอันตื่นเต้นทั่วกรุงโรม พร้อมองค์กรลับอย่าง Illuminati ผ่าน Davinci Code ที่พาเราสำรวจความเป็นไปได้ในอีกแง่มุมหนึ่งของ Holy Grail ในตำนาน ตลอดจน The Lost Symbol ที่พาเราไปผ่าองค์กรลับที่มีอยู่จริงจนถึงปัจจุบันอย่าง Mason รวมทั้งทำให้เราฉุกคิดถึงสิ่งที่เราตามหามาตลอดว่ามัน คือ อะไรกันแน่ จนกระทั่ง Inferno

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: Key สำคัญยังไงกันนะ

Flutter: Key สำคัญยังไงกันนะ

Key เป็นหนึ่งใน optional attribute ที่เราจะเห็นได้กับแทบทุก Widget ใน Flutter ซึ่งโดยทั่วไป เราก็มักจะไม่ได้ใส่ค่า Key เข้าไปโดยปกติ แล้วเวลาไหนบ้างละที่เราควรใช้ Key?

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: จดจำตำแหน่งการ Scroll ใน ListView ด้วย PageStorageKey

Flutter: จดจำตำแหน่งการ Scroll ใน ListView ด้วย PageStorageKey

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

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Parameter VS Argument มันต่างกันยังไงนะ !?

Parameter VS Argument มันต่างกันยังไงนะ !?

หลาย ๆ คนเขียนโปรแกรมมาสักพักย่อมหนีไม่พ้นที่จะสร้าง function (method/procerdure ในภาษาอื่น ๆ แต่ในบทความนี้จะขอใช้คำว่า function) ขึ้นมาใช้งาน ทั้งเพื่อการลดความซ้ำซ้อนของโค้ดชุดเดิม ๆ เพื่อให้เราสามารถนำไป reuse ได้ง่ายยิ่งขึ้น หรือจะเพื่อการ encapsulate ซ่อน logic ในการทำงานก็ตาม แน่นอนละว่าหลายครั้งที่เราสร้าง function ขึ้นมา เราต้องการที่จะรับข้อมูลรับเข้า (input) อะไรบางอย่างเข้ามาใน function ด้วย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: const vs final ใช้ยังไงดี!

Flutter: const vs final ใช้ยังไงดี!

หลาย ๆ คนถ้าได้เขียน Flutter มาสักพัก จะพบกับความแปลกประหลาดอย่างหนึ่งที่ไม่เหมือนภาษาอื่น นั่นก็คือ Dart ซึ่งเป็น programming language ของ Flutter มีทั้ง const และ final แล้วแบบนี้เราควรจะใช้ตัวไหนเมื่อไรดีละ!

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for Flutter: มีอะไรใหม่บ้างในเวอร์ชัน 1.17

Flutter: มีอะไรใหม่บ้างในเวอร์ชัน 1.17

Flutter 1.17 ถือได้ว่าเป็น major stable version แรกของ Flutter ที่ทำการปล่อยออกมาในปีนี้ (2020) และเป็นเวอร์ชันแรกที่เปลี่ยนมาใช้การนับเลขเวอร์ชันแบบใหม่อีกด้วย

Pittawat Taveekitworachai
Pittawat Taveekitworachai
Cover Image for REVIEW: Home Sapiens/Homo Deus/21 Lessons for 21st Century มหากาพย์การเดินทางของมนุษย์

REVIEW: Home Sapiens/Homo Deus/21 Lessons for 21st Century มหากาพย์การเดินทางของมนุษย์

ปฏิเสธไม่ได้เลยว่า Yuval Noah Harari เป็นมนุษย์คนหนึ่งที่มีวิสัยทัศน์และนำเสนอแนวคิดออกมาได้อย่างหน้าติดตามผ่านตัวหนังสือ ดังจะเห็นได้จากหนังสือของเขาทั้งสามเล่ม ชายคนนี้ได้พาเราเดินทางผ่านห้วงเลาอันยาวนานตั้งแต่รุ่งอรุณแรงสุดของมวลมนุษยชาติไปจนถึงอนาคตอันใกล้ และไกลผ่านเรื่องราวต่าง ๆ อันเป็นเอกลักษณ์ที่ผสมผสานแง่มุมทางประวัติศาสตร์ เศรษฐศาสตร์ ศาสนา และชีววิทยาได้อย่างลงตัว

Pittawat Taveekitworachai
Pittawat Taveekitworachai