Python

Python

ข่าวและบทความที่เกี่ยวข้อง

All Python

PostType Filter En

บทความ

Chunking: ตัวช่วยสำคัญในการจัดการข้อมูลขนาดใหญ่ใน Python DataFrame 
เคยหรือไม่ที่คุณต้องเผชิญกับไฟล์ข้อมูลขนาดใหญ่จนโปรแกรมค้าง หรือหน่วยความจำ (RAM) ของเครื่องคอมพิวเตอร์ทำงานเกินขีดจำกัดจนไม่สามารถเปิดไฟล์เพื่ออ่านหรือประมวลผลได้ ปัญหานี้มักเกิดขึ้นบ่อยครั้งเมื่อต้องจัดการกับข้อมูลที่มีปริมาณมหาศาล โดยเฉพาะข้อมูลที่มีโครงสร้างซับซ้อน เช่น ไฟล์ CSV ขนาดใหญ่ ไฟล์บันทึก (Log files) ที่มีข้อมูลจำนวนมาก หรือแม้แต่ข้อมูลจากแหล่งข้อมูล Streaming ที่ไหลเข้ามาอย่างต่อเนื่อง การพยายามโหลดข้อมูลทั้งหมดเข้าสู่หน่วยความจำพร้อมกัน ไม่เพียงแต่จะทำให้เกิดปัญหาด้านทรัพยากรเท่านั้น แต่ยังส่งผลกระทบต่อประสิทธิภาพการทำงานของโปรแกรมโดยรวมอีกด้วย แล้วเราจะสามารถจัดการและประมวลผลข้อมูลขนาดใหญ่เหล่านี้ได้อย่างไรกัน  วันนี้ เราจะมาทำความรู้จักกับเทคนิคสำคัญที่ช่วยให้การจัดการข้อมูลขนาดใหญ่ ให้เป็นเรื่องที่ง่ายและมีประสิทธิภาพมากยิ่งขึ้น นั่นก็คือ “Chunking”   Chunking คืออะไร?  Chunking คือเทคนิคการแบ่งข้อมูลที่มีขนาดใหญ่ออกเป็นชิ้นส่วนย่อย ๆ ที่มีขนาดเล็กลง (หรือ “chunks”) เพื่อให้คอมพิวเตอร์สามารถประมวลผลข้อมูลทีละส่วน โดยไม่ต้องโหลดข้อมูลทั้งหมดลงในหน่วยความจำพร้อมกัน ซึ่งจะช่วยหลีกเลี่ยงปัญหา Memory Error ที่เกิดจากการใช้หน่วยความจำที่มากเกินไป   ทำไมต้องใช้ Chunking?  การนำเทคนิค Chunking มาใช้ มีข้อดีสำหรับการทำงานกับ Big Data โดยตรง เช่น   Chunking กับการจัดการ DataFrame ขนาดใหญ่ใน Python  ในบริบทของการวิเคราะห์ข้อมูลด้วยภาษา Python นั้น DataFrame จากไลบราลี่ Pandas เป็นโครงสร้างข้อมูลแบบตารางสองมิติที่ใช้งานกันอย่างแพร่หลาย โดยมีแถว (Rows) แทนข้อมูลแต่ละรายการ และ คอลัมน์ (Columns) แทนคุณลักษณะหรือตัวแปรต่าง ๆ อย่างไรก็ตามไฟล์ข้อมูลที่บรรจุ DataFrame ที่มีจำนวนแถวและคอลัมน์มหาศาลนั้น การพยายามอ่านข้อมูลโดยใช้คำสั่งอ่านไฟล์มาตรฐาน เช่น pd.read_csv() อาจไม่สามารถทำได้ เนื่องจากปัญหา MemoryError ที่กล่าวไว้ข้างต้น ดังนั้นบทความนี้ จะแนะนำขั้นตอนการจัดการกับ DataFrame ขนาดใหญ่โดยใช้ Chunking ซึ่งประกอบด้วย 3 ขั้นตอนหลัก ดังนี้  ขั้นตอนที่ 1 มุ่งเน้นกับข้อมูลที่ตรงประเด็น (Focus on relevant data)   ก่อนจะเริ่มแบ่งข้อมูลเป็น chunks การลดปริมาณข้อมูลที่ต้องโหลดในแต่ละส่วนย่อยตั้งแต่ต้น จะช่วยลดภาระการประมวลผลลงได้อย่างมาก ขั้นตอนนี้จึงมีความสำคัญไม่แพ้การทำ Chunking เริ่มต้นจากการพิจารณาว่ามีคอลัมน์ใดที่ต้องการนำไปประมวลผลบ้าง และมีเงื่อนไขอื่นใดอีกหรือไม่ที่จะสามารถกรองข้อมูลเฉพาะส่วนที่เกี่ยวข้องได้ เพื่อให้ได้ข้อมูลที่ตรงประเด็นที่สุด ในกรณีที่เราไม่ใช่เจ้าของข้อมูลโดยตรง การขอพจนานุกรมข้อมูล (Data Dictionary) จากเจ้าของข้อมูลจะช่วยให้เข้าใจความหมายของแต่ละคอลัมน์และเลือกคอลัมน์ที่จำเป็นได้อย่างถูกต้อง  ตัวอย่าง: สมมติเราใช้ไฟล์ชุดข้อมูลรถยนต์มือสอง (autos.csv จาก Kaggle Used Cars Dataset) และมีโจทย์ที่ต้องการวิเคราะห์ความสัมพันธ์ระหว่างราคารถกับคุณลักษณะบางอย่างของรถยนต์มือสอง แทนที่จะโหลดคอลัมน์ทั้งหมดที่มี เราควรกำหนดตัวแปรเพื่อเลือกเฉพาะคอลัมน์ที่เกี่ยวข้องกับการวิเคราะห์ตั้งแต่ขั้นตอนการอ่านไฟล์ โดยใช้พารามิเตอร์ usecols ร่วมกับคำสั่งอ่านไฟล์ของ Pandas เช่น   pd.read_csv(‘autos.csv', usecols= [‘price', ‘vehicleTypes', ‘brand', …])  นอกจากนี้ หากมีเงื่อนไขสำหรับกรองข้อมูลเบื้องต้น เช่น ต้องการเฉพาะรถยนต์ที่เสนอขาย (Angebot) เท่านั้น ในคอลัมน์ประเภทข้อเสนอ (offerType) ก็ควรกำหนดเงื่อนไขการกรองนี้ไว้ด้วย ดังภาพตัวอย่างโค้ด  อย่างไรก็ตาม การกรองข้อมูลแถวในแนวยาว (เช่น df_sale = df[df[‘offerType'] == ‘Angebot']) จะทำได้ก็ต่อเมื่อ DataFrame ที่เลือกคอลัมน์แล้วมีขนาดพอดีกับหน่วยความจำ หาก DataFrame นั้นมีขนาดใหญ่มากจนเกินหน่วยความจำ ก็มีความจำเป็นจะต้องทำการ Chunking เสียก่อน   ขั้นตอนที่ 2 โหลดข้อมูลทีละส่วน (Load Data in Chunks)  ขั้นตอนนี้เป็นหัวใจของการทำ Chunking  สำหรับไฟล์ข้อมูลขนาดใหญ่ที่ไม่สามารถโหลดเข้าหน่วยความจำทั้งหมดได้ เราจะใช้พารามิเตอร์ chunksize ในฟังก์ชันอ่านไฟล์ของ Pandas โดยระบุขนาดของ chunk ที่ต้องการ เมื่อมีการประมวลผล Pandas จะไม่ส่งคืน DataFrame ทั้งก้อนให้ทันที แต่จะส่งคืนวัตถุที่เรียกว่า Iterator ซึ่งเราสามารถวนลูปเพื่อดึงข้อมูลมาประมวลผลได้ทีละส่วน (ทีละ chunk) ตามขนาดที่ได้กำหนดไว้  จากตัวอย่างโค้ดในภาพ 1 หากไฟล์ข้อมูล มี DataFrame ขนาดใหญ่ที่ไม่สามารถกรองข้อมูลรายแถวออกมาได้ทันที เราจำเป็นจะต้องใช้พารามิเตอร์เพื่อกำหนดขนาด chunksize ร่วมกับการอ่านไฟล์ด้วย Pandas ดังนี้  df = pd.read_csv(‘autos.csv', chunksize = 50000)  เมื่อมีการกำหนด chunksize=50000 คำสั่งอ่านไฟล์จะส่งคืน Iterator ซึ่งเราต้องทำการวนลูป เพื่ออ่านและประมวลผลข้อมูลทีละส่วน เช่น กระบวนการกรองข้อมูลรายแถว chunk_filtered = chunk[chunk[‘offerType'] == ‘Angebot'] โดยแต่ละส่วนจะมีข้อมูลไม่เกิน 50,000 แถว และส่งคืนกลับมาในรูปแบบ DataFrame ขนาดเล็กหนึ่งก้อน การประมวลผลจะดำเนินการไปเรื่อย ๆ จนกระทั่งอ่านข้อมูลจากไฟล์ได้ครบทุกส่วน เมื่อการประมวลผลแต่ละส่วนเสร็จสิ้น เราจะได้ DataFrame ขนาดเล็กหลาย ๆ ก้อนที่ถูกกรองเป็นที่เรียบร้อย   ขั้นตอนที่ 3 บันทึกข้อมูลที่แก้ไขแล้วลงในไฟล์ใหม่ (Save modified data to new file)  หลังจากที่เราได้ทำการโหลดและประมวลผลข้อมูลขนาดใหญ่ทีละส่วนตามขั้นตอนที่ 2 แล้ว ขั้นตอนสุดท้ายที่สำคัญคือการรวม DataFrame ขนาดเล็กเหล่านี้เข้าด้วยกันโดยการใช้คำสั่ง pd.concat() เพื่อสร้าง DataFrame ขนาดใหญ่ที่สมบูรณ์ซึ่งมีเฉพาะข้อมูลที่เราต้องการ เช่น  df_sale = pd.concat(filtered_chunks)  และบันทึกข้อมูลนี้ลงในไฟล์ใหม่ เพื่อให้สามารถนำไปใช้งานต่อในขั้นตอนการวิเคราะห์ข้อมูลขั้นสูงได้โดยไม่ต้องโหลดข้อมูลดิบขนาดใหญ่อีกต่อไป  เทคนิค Chunking ใน Python Pandas ที่นำเสนอในบทความนี้ ถือเป็นแนวทางที่มีประสิทธิภาพอย่างยิ่งในการจัดการกับ DataFrame ขนาดใหญ่เกินหน่วยความจำ ด้วยสามขั้นตอนสำคัญ เราสามารถเอาชนะข้อจำกัดนี้ ทำให้การทำงานกับชุดข้อมูลขนาดมหึมาเป็นไปได้อย่างราบรื่น เป็นระบบ และพร้อมสำหรับการวิเคราะห์ Big Data โดยนักวิทยาศาสตร์ข้อมูลและวิศวกรข้อมูลสามารถประยุกต์ใช้ได้โดยไม่ต้องกังวลกับปัญหา MemoryError อีกต่อไป  แหล่งข้อมูลอ้างอิง 
16 May 2025

บทความ

การใช้เครื่องมือนำเสนอข้อมูล Python Visual บน Power BI Desktop
Power BI เป็นซอฟต์แวร์ของบริษัท Microsoft สำหรับใช้เป็นเครื่องมือในการจัดการและวิเคราะห์ข้อมูล โดยสามารถนำเสนอข้อมูล (Data Visualization) ได้ในรูปแบบของ Dashboard ในบทความนี้เราจะนำเสนอการใช้ซอฟต์แวร์ที่ชื่อ Power BI Desktop ซึ่งเป็นซอฟต์แวร์ในกลุ่มผลิตภัณฑ์ของ Power BI เป็นตัวอย่างในการอธิบายโดยใช้เครื่องมือนำเสนอข้อมูล (Visual Tool) ชื่อว่า Python Visual ซึ่งเป็น Visual ที่เกิดจากการสร้างชุดคำสั่ง (Script) ด้วยภาษาคอมพิวเตอร์ชื่อ Python รวมถึงการอธิบายสิ่งที่ผู้ใช้ควรรู้ก่อนการนำเครื่องมือตัวนี้ไปใช้ ในบทความฉบับนี้จะไม่ได้กล่าวถึงความรู้พื้นฐานในการสร้างชุดคำสั่งด้วยภาษา Python และการใช้งานเบื้องต้นของ Power BI Desktop ซึ่งผู้อ่านสามารถเรียนรู้เกี่ยวกับพื้นฐานเหล่านี้เพิ่มเติมได้ด้วยตนเอง ทั้งจากเอกสารอ้างอิงของบทความนี้และบทความอื่น ๆ ที่เกี่ยวข้อง ก่อนที่เราจะไปอธิบายการใช้เครื่องมือตัวนี้ ผู้เขียนขออธิบายก่อนว่าการใช้ชุดคำสั่งภาษา Python ใน Power BI Desktop สามารถทำได้หลักๆ 2 วิธี คือ โดยการใช้ชุดคำสั่งภาษา Python ทั้ง 2 วิธีนี้ ผู้ใช้งานจำเป็นต้องติดตั้ง Python และชุดคำสั่งสำเร็จรูป (Library) ที่เกี่ยวข้องบนเครื่องคอมพิวเตอร์ของตนเองก่อนที่จะนำชุดคำสั่งภาษา Python ไปใช้งานใน Power BI Desktop ขั้นตอนการใช้งาน Python Visual สิ่งที่ควรรู้ก่อนการใช้งานเครื่องมือ Python Visual         ถึงในจุดนี้ผู้อ่านคงจะเห็นแล้วว่าเครื่องมือ Python Visual เป็นเครื่องมือในซอฟต์แวร์ Power BI Desktop ที่มีประสิทธิภาพสูงและสามารถใช้งานได้โดยง่ายๆด้วยการเขียนชุดคำสั่งด้วยภาษา Python อย่างไรก็ดีผู้เขียนอยากอธิบายให้ผู้อ่านเข้าใจว่าตัวเครื่องมือดี ๆ เช่นนี้ ก็ยังมีข้อจำกัดบางอย่างที่ควรรู้ก่อนการนำไปใช้งาน เพื่อประโยชน์สูงสุดของตัวผู้ใช้เอง ซึ่งข้อจำกัดทั้งหมด ผู้ใช้สามารถศึกษาเพิ่มเติมได้จากบทความชื่อ สร้างวิชวล Power BI ด้วย Python โดยในบทความนี้ผู้เขียนจะขอสรุปแค่ส่วนสำคัญจากข้อจำกัดทั้งหมดที่ผู้ใช้ควรรู้ก่อนการนำเครื่องมือตัวนี้ไปใช้ ดังต่อไปนี้ ที่กล่าวมาทั้งหมด เป็นเพียงตัวอย่างส่วนหนึ่งของการใช้งานเครื่องมือ Python Visual บนซอฟต์แวร์ Power BI Desktop ผู้ใช้ยังสามารถสร้างการแสดงผลด้วยชุดคำสั่งอื่นๆในภาษา Python ด้วยเครื่องมือนี้ อย่างไรก็ดีผู้เขียนคิดว่าข้อควรรู้ก่อนการใช้งานเครื่องมือนี้ถือเป็นสิ่งที่สำคัญที่สุด เพราะหากผู้ใช้ไม่ศึกษาข้อจำกัดเหล่านี้ให้เข้าใจก่อนการใช้งาน ผู้ใช้มีความเสี่ยงที่จะพบปัญหาระหว่างการทำงานด้วยเครื่องมือ Python Visual ในภายหลังและอาจไม่สามารถแก้ไขปัญหานั้นได้โดยง่าย ซึ่งผู้เขียนหวังว่าบทความนี้จะเป็นประโยชน์ต่อ Data Scientist และ ผู้ใช้งาน Power BI Desktop ไม่มากก็น้อย บทความโดย ปฏิภาณ แสงเดือนตรวจทานและปรับปรุงโดย ปริสุทธิ์ จิตต์ภักดี เอกสารอ้างอิง
24 April 2024

บทความ

Bamboolib: หนึ่งใน Python Library ที่มีประโยชน์เป็นอย่างมากสำหรับนักวิเคราะห์ข้อมูลมือใหม่
Python Bamboolib หนึ่งใน Library ที่จะทำให้คุณมีความรู้สึกว่า ทำไมเราถึงไม่รู้จักเครื่องมือนี้มาก่อน ทำให้ผู้ใดก็สามารถทำการวิเคราะห์ข้อมูลใน Python ได้ โดยที่ไม่จำเป็นต้องเป็นโปรแกรมเมอร์ ผู้ใช้งานสามารถใช้ประโยชน์ของ Bamboolib ได้หลากหลาย ไม่ว่าจะเป็น การเตรียมข้อมูล (Data Preparation)  การจัดการข้อมูล เพื่อให้สามารถนำไปใช้ประโยชน์ได้ (Data Transformation) การแสดงผลข้อมูล (Data Visualization) และ การสำรวจข้อมูลเบื้องต้น (Data Exploration)
20 September 2023

บทความ

ประวัติและหลักการของเครือข่ายประสาทเทียม (Artificial Neural Networks - ANNs)
ประวัติและหลักการทำงานของ Neural Network เริ่มจากโมเดล Perceptron จากนั้นจึงเพิ่ม layer เข้าไปให้กลายเป็น Multilayer Perceptron โดยสามารถเชื่อมต่อ layer ได้หลายวิธี แต่ละวิธีมีชื่อเรียกต่างกันจึงเรียกรวม ๆ ว่า Artificial Neural Network
3 February 2023

บทความ

เชื่อมต่อ BigQuery ด้วย Python ใน 3 ขั้นตอน
การสำรองและกู้คืนข้อมูล PostgreSQL และการ sync ไฟล์ด้วย rsync แบบอัตโนมัติ
22 August 2022

บทความ

SCHEDULING 2: ตั้งเวลา run Python Script บน Windows ด้วย Task Scheduler กัน !
ในบทความนี้ เราจะพาเพื่อน ๆ ไปรู้จักและทดลองใช้ Task Scheduler เครื่องมือที่จะมาช่วยให้เราสามารถตั้งเวลาทำงานของ Python script โดยอัตโนมัติบน Windows กัน
15 August 2022

บทความ

คำสั่งแบบ Switch-Case Statements จะสามารถใช้ร่วมกับ Python ได้แล้ว!
Python คำสั่ง เวอร์ชั่นที่ออกมาใหม่ล่าสุดเผยให้เห็น New Logic (ตรรกะแบบใหม่) Python 3.10 เริ่มจะเต็มไปด้วยฟีเจอร์ใหม่ ๆ น่าทึ่งหลายอย่าง มีฟีเจอร์หนึ่งที่น่าสนใจมาก — Structural Pattern Matching (การเทียบเคียงรูปแบบแบบมีโครงสร้าง) — หรือที่พวกเรารู้จักกันคือ switch/case statement ซึ่ง Switch-statement ห่างหายไปจาก Python มานานแม้ว่าจะเป็นฟีเจอร์ทั่วไปของเกือบทุกภาษา ย้อนกลับไปปี 2006 ที่มีการสร้าง PEP 3103 ขึ้น โดยแนะนำให้ดำเนินการตามคำสั่ง Switch-case Statement แต่หลังจากทำแบบสำรวจที่ PyCon 2007 หรืองานสัมมนาเกี่ยวกับภาษาที่ใช้เขียนโปรแกรม พบว่าฟีเจอร์ดังกล่าวไม่ได้รับการสนับสนุนผู้พัฒนา Python จึงล้มเลิกการพัฒนาฟีเจอร์นี้ไป ในปี 2020 และ Guido van Rossum (กวีโด แวน รอสซัม) ผู้สร้าง Python นำเสนอเอกสารกำกับโปรแกรมฉบับแรกภายใต้หัวข้อ Switch-statement แบบใหม่ ที่ถูกตั้งชื่อว่า Structural Pattern Matching ตามที่พบใน PEP 634 โดยสิ่งที่เรามีในตอนนี้เป็นมากกว่าแค่ Switch-case Statement แบบเรียบง่าย  ซึ่งเดี๋ยวเราจะได้เห็นกันในบทความนี้ มาดูกันว่าตรรกะแบบใหม่นี้ทำงานอย่างไร Structural Pattern Matching Pattern Matching ใช้ค่าตัวเลขหลังจาก match และช่วยให้เราเขียนเคสที่อาจมีออกมาหลายกรณี โดยแต่ละกรณีจำกัดความว่าเป็น case ที่เท่าไหร่ และถ้าเราต้องจับคู่ระหว่าง Match และ Case หรือ match-case เราจะต้องใช้งานโค้ดตามลำดับ ตัวอย่างเช่น: ในส่วนนี้เราต้องตรวจดูเงื่อนไขหลายอย่าง รวมถึงการดำเนินการปฏิบัติการที่แตกต่างกัน โดยขึ้นอยู่กับค่าตัวเลขที่เราพบภายใน http_code จากแผนผังในด้านบน จะเห็นได้ชัดในทันทีว่าเราสามารถสร้างตรรกะเดียวกันโดยใช้กลุ่มของ If-elif-else Statement: อย่างไรก็ตาม เราสามารถใช้ Match-case Statement ลบการทำซ้ำของ http_code == ออก ซึ่งเมื่อทดสอบกับหลากหลายเงื่อนไขจะให้ผลลัพธ์ที่ดูง่ายกว่า อีกหนึ่งตัวอย่างของ Match-case Statement เราจะศึกษาตัวอย่างที่ดีของการใช้ Match-case Statement เพื่อปรับปรุงความสามารถในการอ่านโค้ดใน PEP 635 หนึ่งในนั้นคือตัวอย่างนี้ ซึ่งแสดงให้เราเห็นวิธีใช้ Match-case เพื่อตรวจดูประเภทและโครงสร้างของตัวทดสอบของเรา: ในส่วนนี้เรามักจะคาดหวังที่จะได้รายละเอียดการเชื่อมโยงในรูปแบบ Tuple (ทูเพิล) และมอบหมายค่าตัวเลขที่ให้มากับตัวแปรที่ถูกต้อง ซึ่งถ้า mode การเชื่อมโยงยังไม่ถูกกำหนดภายใน Tuple (ตัวอย่างเช่น มีเพียงค่าตัวเลขสองค่าที่ให้มาคือ host และ port) เราสันนิษฐานได้ว่าโหมดการเชื่อมโยงคือ “http”. อย่างไรก็ตามในกรณีอื่น ๆ เราอาจคาดการณ์ได้ว่าโหมดถูกกำหนดไว้แล้วอย่างชัดเจน เราจึงอาจจะได้รับ Tuple แบบ (<host>, <port>, "ftp") — ซึ่งในกรณีนี้เราไม่ได้อยากตั้ง mode เป็น “http” และถ้าเราอยากจะเขียนตรรกะเดียวกันโดยใช้ If-else Statement เราจะได้สิ่งนี้: การเลือกใช้ของแต่ละคนอาจจะแตกต่างกันตามความ แต่สำหรับผมแล้วการใช้งาน Match-case ดูได้สบายตากว่ามาก กรณีศึกษาของ JSON อีกกรณีศึกษาหนึ่งที่ดูน่าสนใจคือความสามารถในการแยกวิเคราะห์คำในพจนานุกรมที่แตกต่างกันตามโครงสร้างของมัน กรณีทดสอบที่ดีของเรื่องนี้คือการแยกวิเคราะห์ชุดข้อมูล SQuAD 2 โดยชุดข้อมูล SQuAD 2 เป็นชุดถาม-ตอบที่เป็นที่นิยมมาก ซึ่งใช้ในการฝึกโมเดลเรียนรู้ของเครื่องจักรสำหรับการถาม-ตอบ เราสามารถดาวน์โหลดข้อมูลได้ด้วย: ถ้าเรามาลองดูโครงสร้างของ SQuAD จะเห็นชัดว่ามีหลากหลายระดับ ซึ่งเราจะต้องพิจารณาเมื่อทำการแยกวิเคราะห์: แต่ปัญหาคือ ไม่ใช่ว่าทุกตัวอย่างจะสามารถใช้รูปแบบพจนานุกรมแบบเดียวกันได้ ถ้าเราดูสองสามตัวอย่างสุดท้าย เราจะเห็นรายการ qas มีทั้ง answers และ plausible_answers — ขณะที่ตัวอย่างมีเพียงแค่ answers: ทีนี้ลองมาใช้ Match-case Statement แบบใหม่เพื่อสร้างทางเลือกที่สบายตากว่าสำหรับตรรกะหนัก ๆ แบบ if-else ที่จำเป็นต้องใช้กับสิ่งนี้  อย่างแรก เราต้องโหลดข้อมูลมาก่อน: SQuAD JSON มีหลายระดับชั้น  หลังจากเข้าถึง squad['data']  เราจำเป็นต้องทำซ้ำในคำถามแต่ละ group: จากนั้นในแต่ละ paragraph แล้วในแต่ละ qas (คำถาม-คำตอบ) — ซึ่งดูเหมือน: และนี่คือจุดที่เริ่มสนุกแล้วล่ะ การใช้ตรรกะแบบ if-else เราจะได้อะไรแบบนี้: แม้ว่ามันจะดูไม่ค่อยสวย แต่มันก็สามารถใช้งานได้ ลองมาเขียนใหม่โดยใช้ตรรกะแบบ match-case ดูบ้าง: จะเห็นได้ว่า การใช้ ตรรกะนี้จะช่วยให้ดูซับซ้อนน้อยลงและถือเป็นอีกหนึ่งทางเลือกที่ดีเมื่อเทียบกับเวอร์ชั่นดั้งเดิมที่ใช้ตรรกะการแยกวิเคราะห์ ทั้งหมดมีแค่นี้เป็นเรื่องของ Structural Pattern Matching แบบใหม่ที่นำเสนอใน Python 3.10! แบบสั้น ๆ เท่านั้น เวอร์ชั่นเต็มคาดว่าจะออกมาในต้นเดือนตุลาคม 2021 ส่วนตัวแล้ว ผมคิดว่า Syntax แบบใหม่นี้ดูดีมาก ๆ — แม้ว่าตอนนี้จะมั่นใจได้แค่ 50/50 แต่เมื่อมีผู้ใช้ match-case ทำโค้ดมากขึ้น ผมมั่นใจว่าพวกเขาจะเลือกวิธีการที่ดีที่สุดในการเขียน บทความโดย James Briggsเนื้อหาจากบทความของ Mediumแปลและเรียบเรียงโดย ไอสวรรค์ ไชยชะนะตรวจทานและปรับปรุงโดยนววิทย์ พงศ์อนันต์
31 July 2022

บทความ

สร้าง Automated Workflow ในการส่ง Spark Job ขึ้นไปรันบน Amazon EMR Cluster โดยใช้ Apache Airflow
ในปัจจุบันนี้การใช้งานข้อมูลในธุรกิจต่าง ๆ เป็นเรื่องที่จำเป็นอย่างมาก การนำเอาข้อมูลมาใช้ และ การประมวลผลข้อมูล จะช่วยให้เรามีการตัดสินใจในการดำเนินธุรกิจได้อย่างมีประสิทธิภาพมากขึ้น และที่สำคัญคือ ถ้าธุรกิจไหนสามารถนำข้อมูลลูกค้า และที่ได้จากลูกค้า มาช่วยให้เข้าใจลูกค้ามากยิ่งขึ้น ตอบสนองความต้องการของลูกค้าได้ดีขึ้นแล้ว ธุรกิจนั้นจะมีพลังในการแข่งขันในตลาดสูงมากขึ้นอีกด้วย ปัญหาที่พบเจอปัญหาหนึ่งคือว่า เนื่องจากว่าข้อมูลที่เราได้มาในปัจจุบันเริ่มมีมาจากหลายช่องทาง และมีขนาดใหญ่ขึ้นเรื่อย ๆ จนที่เราไม่สามารถที่จะนำมาคำนวณใส่ Excel หรือเขียน Code เพื่อประมวลผลข้อมูลบนเครื่องโน้ตบุ๊กที่เราใช้งานอยู่ได้แล้ว เครื่องมือที่เป็นตัวเลือกแรก ๆ ที่มีความสามารถในการประมวลผลข้อมูลขนาดใหญ่ คือ Apache Spark นั่นเอง แต่ทีนี้การที่จะใช้งานกับข้อมูลที่มีขนาดใหญ่นั้น แน่นอนว่าเราไม่สามารถที่จะมารันบนเครื่องเราได้อีกแล้ว จำเป็นต้องไปนึกถึงการนำคอมพิวเตอร์หลาย ๆ เครื่องมาช่วยในการประมวลผล โดยส่วนใหญ่ระบบ Cloud จะเป็นตัวเลือกอันดับต้น ๆ เพราะช่วยให้เราสามารถสร้าง และจัดการ Cluster ของคอมพิวเตอร์ได้ภายในไม่กี่นาที โดยเราไม่ต้องมาปวดหัวกับการดูแลรักษาเครื่องคอมพิวเตอร์ต่าง ๆ ที่สร้างขึ้นมา สุดท้ายถ้าเราไม่ใช้งานแล้ว เราก็สามารถ Terminate ไปได้เลย ซึ่งจะช่วยประหยัดเงินไปอีก โดยในบทความนี้จะกล่าวถึงการใช้งานบริการของ AWS ที่ชื่อว่า Amazon EMR อย่างไรก็ดี ขั้นตอนในการประมวลผลข้อมูลมักจะเป็นขั้นตอนที่เราต้องทำซ้ำ ๆ และทำอยู่เรื่อย ๆ เป็นประจำ ดังนั้นการที่เราสามารถสร้าง Workflow ให้การประมวลผลข้อมูลนั้นทำงานได้โดยอัตโนมัติได้ ซึ่งตรงนี้ก็จะสามารถมาช่วยให้เราไม่ต้องไปเสียเวลา หรือไปลงแรงในการทำงานซ้ำ ๆ เราสามารถที่จะนำเอาเวลาทำงานของเราไปเน้นที่การวิเคราะห์ข้อมูล และช่วยตอบโจทย์ต่าง ๆ ทางธุรกิจได้ ดังนั้นในบทความนี้จะมานำเสนอวิธีการสร้าง Automated Workflow ที่จะส่ง Spark Job ขึ้นไปรันบน Amazon EMR Cluster โดยใช้ Apache Airflow ครับ ซึ่งคิดว่าแนวคิดนี้จะสามารถเอาไปประยุกต์ใช้กับงานประมวลผลข้อมูลขนาดใหญ่ด้านอื่น ๆ ได้อีกด้วย ภาพรวมของ Automated Workflow หรือ Airflow DAG (Directed Acyclic Graph) ของเราจะประกอบไปด้วย 4 ขั้นตอนดังต่อไปนี้ ก่อนเริ่มเราจำเป็นต้องเตรียมสิ่งต่าง ๆ ตามนี้ก่อนครับ เริ่มต้นเราจะสร้างสิ่งที่เรียกว่า Service Role เตรียมไว้ก่อน เพื่อที่จะให้ Amazon EMR สามารถจัดการ Resource ต่าง ๆ ได้เอง เราสามารถทำตาม Service role for Amazon EMR (EMR role) และ Service role for cluster EC2 instances (EC2 instance profile) หรือจะใช้ Awscli สร้างก็ได้เช่นเดียวกัน โดยรันคำสั่งตามนี้ครับ เสร็จแล้วเราจะสร้าง S3 Bucket เพื่อเก็บ Code ที่เราจะเรียกใช้งาน Spark ไว้ ซึ่งเราจะบอกให้ EMR มาหยิบโค้ดชุดนี้ไปรันใน Cluster ซึ่งเราสามารถเข้าไปสร้าง S3 Bucket ได้ผ่านทาง AWS Console หรือว่าจะใช้คำสั่งของ Awscli ตามด้านล่างนี้ ในบทความนี้ เราจะตั้งชื่อ S3 Bucket ว่า my-spark-scripts ไว้ที่ Region ชื่อ ap-southeast-1 หรือที่ Singapore นั่นเอง (ชื่อ S3 Bucket อาจจะซ้ำกับชื่อของคนอื่นได้) ในส่วน Code ที่เราจะเตรียมไว้ประมวลผลข้อมูล เราจะเขียน Spark Job ขึ้นมา และเพื่อให้ผู้อ่านได้เห็นภาพก่อนที่จะไปลองดึงข้อมูลจริง ๆ โดยเราจะสร้าง Spark App แบบง่าย ๆ ขึ้นมาเพื่อคำนวณหาเลขคี่ และแสดงผลออกมา 5 ตัวเลข เราจะเขียนไว้ที่ไฟล์ get_odds_numbers.py และมี Code ตามนี้ เสร็จแล้วก็ให้เราอัพโหลดสคริปของเราไปไว้ที่ S3 Bucket ที่ชื่อ my-sparks-scripts ที่เราสร้างไว้ก่อนหน้านี้ครับ เพราะว่าเดี๋ยวเราจะให้เครื่องใน EMR Cluster มาหยิบไฟล์นี้ไปส่งงานให้กับ Spark ถัดไปเราจะมาเริ่มแตะในส่วนของ Airflow กัน ซึ่งการที่จะให้ Airflow เชื่อมต่อไปยัง EMR ได้ เราจำเป็นต้องมี Service Account ก่อนครับ ดังนั้นเราจะไปสร้าง AWS User ขึ้นมา โดยให้เราไปที่ AWS Account ของเรา และตอนที่สร้าง User ให้เราเลือก Credential Type เป็น “Access Key – Programmatic Access” สำหรับบทความนี้จะให้สิทธิ์กับ User เป็นแบบ Administrator Access เลยนะครับ เพื่อความง่ายสำหรับการใช้งานในบทความนี้เท่านั้นนะครับ ซึ่งในการใช้งานจริง ๆ การให้สิทธิ์แบบนี้เป็นสิ่งที่ไม่ควรทำ เราสามารถอ่านเพิ่มเติมเกี่ยวกับการกำหนดสิทธิ์ของ User ได้ที่ Access Management for AWS Resources หลังจากที่เราสร้างเสร็จ เราจะได้ Access Key ID กับ Secret Access Key มาตามรูปด้านล่าง ให้เราคัดลอกเก็บไว้ ถัดไปให้เราเข้าไปที่ Airflow และสร้าง Airflow Connection ขึ้นมา โดยตั้งชื่อ Connection Id ว่า aws_conn เลือก Connection Type เป็น Amazon Web Services ตรงช่อง Login ให้ใส่ Access Key ID และช่อง Password ให้ใส่ Secret Access Key ที่เราได้มาในขั้นตอนก่อนหน้านี้...
14 June 2022

บทความ

การเข้ารหัสลับ (Encryption) เบื้องต้น สำหรับนักพัฒนา
บทความ “การเข้ารหัสลับ (Encryption) เบื้องต้น สำหรับนักพัฒนา” นี้ใช้แหล่งข้อมูลส่วนใหญ่จาก e-book ชื่อ Practical Cryptography for Developers อวจ: ที่อยู่ในบทความนั้นย่อมาจาก เอาไว้จำ จุดประสงค์ของผู้เขียนมีไว้เพื่อสรุปความสำหรับผู้อ่านที่มีความเข้าใจอยู่บ้างแล้ว หรืออ่านหัวข้อนั้นแล้วให้สามารถจำนิยามของหัวข้อนั้นได้ สาร ในบทความนี้ไม่ใช่ สารเคมี แต่เป็นข้อความ (message) ในปัจจุบันอินเทอร์เน็ตเข้ามาเป็นส่วนหนึ่งของชีวิตทุกคน แต่กระนั้นความสะดวกสบายที่มาพร้อมกับอินเทอร์เน็ต ก็ไม่ได้นำมาเฉพาะข้อดีเพียงอย่างเดียว หากมองในด้านความปลอดภัยด้วยนั้น อินเทอร์เน็ตจึงเป็นเหมือนดาบสองคม เนื่องจากว่าหากนักพัฒนา หรือผู้ใช้งานขาดความเข้าใจ ก็จะทำให้เกิดช่องโหว่ให้ผู้ไม่ประสงค์ดีโจมตีระบบ หรือเกิดการโจรกรรมทางไซเบอร์ได้ และหนึ่งในหัวใจสำคัญของการสื่อสารระหว่างผู้ใช้งาน (Client) กับแม่ข่าย (Server) นั่นก็คือ การเข้ารหัสลับ (Encryption) โดยบทความนี้จะค่อย ๆ ปูนิยามของศัพท์ต่าง ๆ ที่เกี่ยวข้อง เช่น การเข้ารหัส (Encoding), ฟังก์ชันแฮช (Hashing function) เป็นต้น จนนำไปสู่เรื่องการเข้ารหัสลับ (Encryption) ทีละหัวเรื่อง ดังต่อไปนี้ การเข้ารหัส (Encoding) อวจ: ด <-> d ; เสียง “ด” ในภาษาไทย คือเสียง “d” ในภาษาอังกฤษ ผู้เขียนใช้ภาษาไทยว่า การเข้ารหัส เพื่อแปลคำว่า Encoding และ การเข้ารหัสลับ เพื่อแปลคำว่า Encryption เนื่องจากทั้งสองสิ่งนี้แตกต่างกันอย่างมาก การเข้ารหัสนั้นไม่ได้ทำเพื่อรักษาความลับของสาร แต่ทำเพื่อความสะดวกในการรับส่งสาร หรืออ่านสารได้ง่ายขึ้น ตัวอย่างเช่น การแปลงเลขฐานสองเป็นฐานสิบ หรือการแปลงเลขฐานสิบเป็นสายอักขระ (byte array) หรือการแปลงสายอักขระเป็นสาร base64 เป็นต้น การเข้ารหัสนั้น สามารถย้อนกลับได้ง่ายด้วย การถอดรหัส (Decoding) ถ้าหากเรารู้ว่าสารที่เรารับมาถูกเข้ารหัสมาแบบใด เราก็จะสามารถถอดรหัสสารนั้นเป็นสิ่งที่เราต้องการได้ เช่น การแปลงสาร base64 เป็นสายอักขระ ตัวอย่าง การเข้ารหัสจากสายอักขระเป็นสาร base64 และถอดรหัสจากสาร base64 เป็นสายอักขระ ในภาษา python เกร็ด: ภาษาคาราโอเกะ ภาษาลู หรือคำผวน ก็เป็นการเข้ารหัสเช่นกัน 🙂 ฟังก์ชันแฮช (Hashing function) อวจ: คิดถึง -> 345e28e423062ecb7dad358f1b47e4abb836a0cd77cf9f47cf6e6478f8d43403 ; ให้แฮชของความคิดถึง แทนความซาบซึ้งในใจ (เพราะจำไม่ได้ 555) การแฮชนั้นคล้ายกับการเข้ารหัสตรงที่ ถ้าเรามีสาร และฟังก์ชันการแฮช เราก็สามารถ ผลิต เลขแฮชได้ แต่กลับกัน หากเราได้เลขแฮชมา เราจะไม่สามารถรู้ได้ว่า สารก่อนเข้าฟังก์ชันแฮชเขียนไว้ว่าอย่างไร ซึ่งจะนำไปสู่คุณสมบัติของฟังก์ชันแฮช คุณสมบัติของฟังก์ชันแฮชนั้นมีสองประการ คือ คำว่า แทบจะไม่มีสิทธิ์ชนกัน นั้น แน่นอนว่าอาจจะเกิดการชนกันได้ แต่เกิดขึ้นยาก อภิมหาโคตรยาก เรียกว่า การพยายามจะหาสารสองอันที่จะให้ผลลัพธ์เลขแฮชเดียวกัน ก็เหมือนกับการควานหาฝุ่นในจักรวาลก็ปานนั้น แต่ในอนาคตก็ไม่แน่ว่า Quantum Computer อาจจะทำให้ SHA-2 ที่ได้รับความนิยมอยู่ในปัจจุบันถูกโค่นลงได้สักวัน อันนี้ก็เป็นเรื่องของอนาคตที่เราต้องติดตามกันต่อไป ตัวอย่าง ฟังก์ชันแฮชในภาษา python ในที่นี้ ผู้เขียนขอใช้ตัวอย่างฟังก์ชัน sha256 หรือ SHA-2 มาเป็นตัวอย่าง เกร็ด: ยังมีกลุ่มฟังก์ชันที่มีแนวคิดคล้ายกับฟังก์ชันแฮชอีกสองอย่าง คือ check digit และ checksum แต่ต่างกันตรงความยากในการชนกัน เช่น หมายเหตุ: วิธีการคำนวน check digit นำมาจาก ที่นี่ จะสังเกตว่า การคำนวน check digit นั้นสามารถเกิดผลลัพธ์ที่ชนกัน (หรือเหมือนกันจากในตัวอย่างคือเลข หนึ่ง) ได้ค่อนข้างง่าย ส่วน checksum นั้นจะเกิดผลลัพธ์ที่ชนกันค่อนข้างยาก ตัวอย่างคือ SHA-1 ในอดีตฟังก์ชันนี้ถูกใช้เพื่อเป็นฟังก์ชันแฮชด้วย แต่ปัจจุบันมีผู้ที่สามารถหาผลลัพธ์ที่ทำให้เกิดผลลัพธ์ที่เหมือนกันได้แล้ว ดังนั้น SHA-1 จึงไม่ดีพอที่จะใช้เป็นฟังก์ชันแฮชเพื่อความปลอดภัยอีกต่อไป อย่างไรก็ดี SHA-1 นั้นยังมีการใช้เพื่อทำ checksum เพื่อตรวจสอบความถูกต้องของไฟล์อยู่ ฟังก์ชัน MAC อวจ: mac_func(สาร, รู้กันแค่เรา) -> ตัวเทียบว่าสารถูกต้อง ; นายเอส่งจดหมายรัก(สาร)หาน้องบีโดยใช้กระดาษสองแผ่นเสมอ(รู้กันแค่เรา) แต่วันหนึ่งไปรษณีย์ทำปลิวหายไปแผ่นหนึ่ง น้องบีจึงรู้ว่าจดหมายนั้นไม่ครบถ้วน(ไม่ถูกต้อง)เพราะไม่ครบสองแผ่น MAC ในที่นี้ย่อมาจาก Message Authenticaion Code ไม่ได้เกี่ยวข้องกับ MAC Address หรือ Media Access Control Address แต่อย่างใด MAC มีไว้เพื่อทำหน้าที่พิสูจน์ว่าสารที่เราได้รับมาถูกต้องสมบูรณ์หรือไม่ เนื่องจากการคำนวน MAC โดยวิธีใช้ hash_func(key + msg) นั้นไม่ปลอดภัยจากการโจมตีแบบ Length Extension Attack ดังนั้นฟังก์ชัน MAC ที่ปลอดภัยและได้รับความนิยมคือ HMAC (Hash-based MAC) โดยมีหน้าตาคือ mac = HMAC(key, msg, hash_func) ตัวอย่างฟังก์ชัน HMAC ในภาษา python ฟังก์ชัน KDF อวจ: kdf_func(เกลือ, รหัสผ่าน, อย่างอื่นถ้ามี) -> รหัสผ่านที่แปลงแล้ว KDF ย่อมาจาก Key Derivation Functions ฟังจากชื่อแล้วแอบน่ากลัวว่าจะเกี่ยวกับ Derivative ในคณิตศาสตร์ใช่ไหม แต่ไม่ใช่เช่นนั้น ฟังก์ชันนี้ไม่ได้เกี่ยวกับการคำนวน Derivative ผู้อ่านจึงไม่ต้องกังวล โดยในหัวข้อนี้จะพาผู้อ่านสู่ความเข้าใจ KDF ผ่านการจัดการรหัสผ่านระดับต่าง ๆ  ในการจัดการรหัสผ่าน (password) นั้นแน่นอนว่าเราไม่สามารถหลีกหนีเรื่องความปลอดภัยไปได้ และการเก็บรหัสผ่านของผู้ใช้ที่สามารถนำไปใช้งานกับระบบได้ทันทีก็เปรียบเสมือนการเก็บระเบิดเวลาไว้ในระบบ ผู้เขียนขอกล่าวถึง การจัดการรหัสผ่านโดยเริ่มตั้งแต่ระดับ อย่าหาทำ ไปจนถึงระดับ ควรทำ ระดับ อย่าหาทำ หรือเกรียนสุด วิธีการที่ง่ายสุด (และเกรียนที่สุดด้วย) นั่นคือการเก็บรหัสผ่านแบบ โต้ง ๆ ได้มาอย่างไรก็เก็บไปอย่างนั้นซะเลย ตัวอย่างเช่น ผู้ใช้งานกรอกรหัสผ่านตอนลงทะเบียนมาเป็น “hello123” ก็นำรหัสผ่านนี้เขียนลงในฐานข้อมูลตารางผู้ใช้เป็น “hello123” นั่นเอง แม้ว่าการจัดการรหัสผ่านของผู้ใช้โดยวิธีนี้จะไม่มีความซับซ้อน และไม่ต้องใช้...
27 May 2022
PDPA Icon

We use cookies to optimize your browsing experience and improve our website’s performance. Learn more at our Privacy Policy and adjust your cookie settings at Settings

Privacy Preferences

You can choose your cookie settings by turning on/off each type of cookie as needed, except for necessary cookies.

Accept all
Manage Consent Preferences
  • Strictly Necessary Cookies
    Always Active

    This type of cookie is essential for providing services on the website of the Personal Data Protection Committee Office, allowing you to access various parts of the site. It also helps remember information you have previously provided through the website. Disabling this type of cookie will result in your inability to use key services of the Personal Data Protection Committee Office that require cookies to function.
    Cookies Details

  • Performance Cookies

    This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

  • Functional Cookies

    This type of cookie enables the Big Data Institute (Public Organization)’s website to remember the choices you have made and deliver enhanced features and content tailored to your usage. For example, it can remember your username or changes you have made to font sizes or other customizable settings on the page. Disabling these cookies may result in the website not functioning properly.

  • Targeting Cookies

    "This type of cookie helps the Big Data Institute (Public Organization) understand user interactions with its website services, including which pages or areas of the site are most popular, as well as analyze other related data. The Big Data Institute (Public Organization) also uses this information to improve website performance and gain a better understanding of user behavior. Although the data collected by these cookies is non-identifiable and used solely for statistical analysis, disabling them will prevent the Big Data Institute (Public Organization) from knowing the number of website visitors and from evaluating the quality of its services.

Save settings
This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.