Category Archives: education

วิทย์ม.ต้น: รู้จัก Markdown ใน Jupyter Notebook, วิธีแก้ปัญหาแบบ Brute Force

วันนี้เด็กๆม.ต้นรู้ว่าใน Jupyter Notebook เราสามารถพิมพ์ข้อความ ใส่รูปภาพ ใส่วิดีโอ เพื่ออธิบายว่า notebook ของเราทำอะไรบ้างครับ วิธีทำก็คือไปที่เมนู Cell/Cell Type/Markdown ก็จะทำให้สิ่งที่เราจะพิมพ์เป็นข้อความแบบมีฟอร์แมทต่างๆเช่นตัวหนา ตัวเอียงได้ ไม่จำเป็นต้องเป็นคำสั่งเพื่อการคำนวณในภาษา Python อย่างเดียว

ตัวอย่างการใช้ Markdown ใน Jupyter Notebook ดูได้ในคลิปนี้ครับ ตัวอย่างให้เรามาลองเองอยู่ที่ลิงก์นี้ครับ:

สรุปคำสั่ง Markdown ดูได้ที่ Learn X in Y Minutes (Where X=markdown)  ครับ

สำหรับคนที่หัดใช้ Jupyter Notebook เรียนรู้จาก Jupyter Notebook for Beginners: A Tutorial หรือดูคลิปข้างล่างนี้ได้ครับ:

พอเราใส่คำอธิบายต่างๆด้วย Markdown ได้แล้ว เราสามารถสร้างเอกสารที่รวบรวมเนื้อหาและผลการคำนวณต่างๆไว้ด้วยกัน สามารถส่งให้กันได้ หรือให้คนอื่นเอาไปใช้ได้ง่ายๆครับ ตัวอย่างก็เช่น notebook ที่อาจารย์ Peter Norvig ทำไว้ที่ List of IPython (Jupyter) Notebooks by Peter Norvig สำหรับเด็กๆที่เรียนรู้เรื่องความน่าจะเป็นก็อาจเข้าไปดู A Concrete Introduction to Probability (using Python) เป็นตัวอย่างครับ

 ผมไปเจอวิดีโอสอน Python ที่ใช้ได้อีกอันหนึ่ง ยาว 4 ชั่วโมงกว่าๆ เลยเอามาแนะนำให้เด็กๆรู้จักด้วยครับ เผื่อใครชอบดูคลิปมากกว่าอ่าน:

เนื่องจากเด็กๆเล่นแก้ปัญหาที่ Brilliant.org จึงมีโจทย์ที่คิดไม่ค่อยออก ผมเลยทดลองเขียนโปรแกรมแก้ปัญหาเหล่านั้นแบบ Brute Force ซื่งแปลว่าแก้แบบลองใส่ค่าที่เป็นไปได้ทั้งหมดแล้วเช็คว่าค่าที่ใส่เข้าไปค่าไหนเป็นคำตอบผมบอกเด็กๆว่าถ้าค่าที่เป็นไปได้มีไม่เกินสักพันล้านแบบ เราอาจเขียนโปรแกรมลองมันหมดทุกตัวเลยเพราะคอมพิวเตอร์ตอนนี้เร็วมากแล้ว (และจะเร็วขึ้นอีกในอนาคต)

เช่นข้อแรกมีข้อความที่ถูกเข้ารหัสด้วย  Caesar cipher คือตัวอักษรภาษาอังกฤษถูกแทนที่ด้วยตัวอักษรอีกตัวที่ห่างออกไประยะคงที่ เช่นถ้าระยะเท่ากับ 2 ก็จะมีการแทนที่แบบ A => C, B => D, C => E, …, X => Z, Y => A, Z => B เป็นต้น ดังนั้นถ้ามีข้อความเข้ารหัสอ่านไม่ออกแบบนี้ เราก็สามารถทดลองการแทนที่ตัวอักษรกลับ 26 แบบแล้วลองอ่านข้อความที่ได้มาเลยก็ได้ครับ

ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
ตัวอย่างฟังก์ชั่นเข้ารหัสและถอดรหัสแบบ Caesar Cipher
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เข้ารหัสและถอดรหัสจะได้ข้อความตั้งต้น
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก
เราได้ข้อความที่เข้ารหัสมาอ่านไม่ออก แต่ทดลองถอดรหัสทุกแบบที่เป็นไปได้ แล้วจะพบข้อความที่อ่านออก

อีกข้อคือได้โจทย์ XX + YY + ZZ = XYZ โดยที่ X, Y, และ Z เป็นเลขโดด 0-9 ให้หาค่าของ X, Y, และ Z เราก็สามารถแก้ปัญหาแบบ brute force ได้เพราะแบบที่เป็นไปได้ของ  X, Y, และ Z มีเพียง 1,000 แบบเท่านั้น (X เป็นได้ 10 แบบ คูณกับ Y เป็นได้ 10 แบบ คูณกับ Z เป็นได้ 10 แบบ เท่ากับ 1,000 แบบ) เราเขียนโค้ด Python ง่ายๆแบบนี้ คือให้ค่า X, Y, และ Z  เปลี่ยนไปเรื่อยๆแล้วดูว่าค่าไหนทำให้ XX + YY + ZZ = XYZ ก็พิมพ์ผลออกมา จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบที่ไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198:

จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z  = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198
จะได้ว่า X, Y, Z คือ 0, 0, 0 หรือ 1, 9, 8 แต่คำตอบ 0, 0, 0 เป็นคำตอบไม่น่าสนใจ ดังนั้นเราจึงเลือก X, Y, Z = 1, 9, 8 ซึ่งทำให้ 11 + 99 + 88 = 198

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

ขว้างหลอดกาแฟ (ต่อ) การตกของกรวยกระดาษ (ต่อ) แรงโน้มถ่วงเทียม

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

(อัลบั้มบรรยากาศกิจกรรมต่างๆอยู่ที่นี่นะครับ กิจกรรมประถมคราวที่แล้วเรื่อง “ขว้างหลอดกาแฟ, การตกของกรวยกระดาษ, แรงโน้มถ่วงเทียม” ครับ รวมทุกกิจกรรมอยู่ที่นี่นะครับ)

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

กิจกรรมนี้ฝีกเด็กๆให้คิดแบบวิทยาศาสตร์ครับ มีการสังเกต การตั้งสมมุติฐานเพื่ออธิบายสิ่งที่สังเกตมา การตรวจสอบสมมุติฐานกับข้อมูลที่สังเกตมา การตั้งสมมุติฐานใหม่เมื่อสมมุติฐานเดิมขัดกับข้อมูล นอกจากนี้เราพยายามให้เด็กๆมีความกล้าคิดและออกความเห็นครับ

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

  มวล (g) ระยะ (cm) ระยะ (cm) ระยะ (cm) ระยะมากสุด (cm) ระยะมากสุด / มวล (cm/g)
ซาช่า 3.3 170 260 260 260                                 79
ต้นน้ำ 3.3 500 780 520 780                               236
อุ่น 1.7 300 310 300 310                               182
ต้นข้าว 2.4 100 150 150 150                                 63
กอหญ้า 1.5 450 500 200 500                               333
ซีน 3.4 450 500 200 500                               147
เจ๋ง 2.1 200 200 520 520                               248
ต้นบุญ 9.2 1030   320 1030                               112
พ่อโก้ 1.7       0                                  –  
เอม 2.4 450 350 450 450                               188
เรเน่ 2.6       0                                  –  
ทิกเกอร์ 3.5 200 200 150 200                                 57
กินเจ 2 200 320 390 390                               195
ขนมผิง 2.8   220   220                                 79
ริว 1.9       0                                  –  

เด็กๆสนุกกับการเล่นและประดิษฐ์ครับ:

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

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

 เด็กๆสังเกตเห็นผิวน้ำอยู่นิ่งๆ ไม่กระเพื่อมหรือกระฉอกไปมา บางคนคิดว่ามันคือเยลลี่ด้วยซ้ำ ต้องเอานิ้วจิ้มดูให้เห็นว่าเป็นน้ำเหลวๆจริงๆ

สำหรับเด็กตัวเล็กๆผมใช้ตะกร้าพลาสติกเล็กๆแทนตะกร้าใหญ่ ให้เขาลองแกว่งกันเองครับ ผมเคยบันทึกวิธีประดิษฐ์ไว้ในรายการเด็กจิ๋ว & ดร.โก้ครับ:

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

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

วิทย์ม.ต้น: แนะนำเว็บ PyMOTW-3, Skillshare.com, และ Brilliant.org

สำหรับวิทย์ม.ต้นวันนี้ ผมแนะนำเว็บที่น่าจะมีประโยชน์สำหรับเด็กๆ 3 เว็บ แล้วให้เขาทำแบบฝึกหัดที่  Repl.it ต่อไป

เว็บแรกคือ Python 3 Module of the Week เป็นเว็บที่มีตัวอย่างการใช้งานโมดูลไพธอนสำหรับงานต่างๆ ให้เด็กๆเข้าไปดูว่าจะใช้งานอะไรได้บ้าง และให้เขาพิมพ์/ก็อปปี้ตัวอย่างมาทดลองและดัดแปลงใน Jupyter Notebook ของเขาเอง

เว็บที่สองคือ Skillshare.com ที่มีคอร์สออนไลน์สอนทักษะต่างๆให้เลือกมากมาย เช่นหัดวาดรูป หัดถ่ายภาพ หัดเขียนหนังสือ ฯลฯ จะต่างจากคอร์สออนไลน์อื่นๆที่เน้นด้านวิชาการเป็นส่วนใหญ่

เว็บที่สามคือ Brilliant.org ที่มีปัญหาย่อยๆให้เราค่อยๆตอบแล้วเราก็จะเรียนรู้เรื่องต่างๆที่เราสนใจ อันนี้จะเน้นพวกวิทย์ คณิต ตรรกะ รวมถึงเทคโนโลยีทางคอมพิวเตอร์เช่น Neural Network และ Machine Learning

จากนั้นเด็กๆก็ลองดูเว็บที่แนะนำและทำแบบฝึกหัดที่ Repl.it ต่อครับ