Feb 19, 2013
Tuesday, February 19, 2013

เริ่มต้นเขียนโปรแกรมด้วย AutoIt : 3

     หลายปีก่อนปรากฏแผ่น VCD ภาพยนตร์ฝังไว้ด้วยสิ่งที่จะปิดโปรแกรมเขียนซีดีในวินโดวส์อัตโนมัติ บางคนเรียกมันว่าไวรัสที่สร้างความลำบากแก่นักก็อป อย่างไรก็ตามในเวลาไม่ถึงเดือนโปรแกรมดังกล่าวกลับเป็นไร้ความหมาย ยุคแห่งความมืดมนของนักก็อปจึงสั้นนัก แม้วันเวลาล้างคราบไคลของความพยายามอันด่างพร้อยจนไม่มีผู้ใดจำมันได้ ทว่าก่อนทุกสิ่งจะเลือนจางไป คนผู้หนึ่งพูดขึ้น “มันทำจาก AutoIt”  ลมของถ้อยคำที่เบาบางรอดไรฟันจนแทบคล้ายเสียงกระซิบ

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

    [[1]] การออกแบบหน้าต่างโปรแกรม (GUI) เพื่อใช้รับคำสั่งของผู้ใช้จากการคลิกบนสั่งปุ่มหรือส่วนประกอบในหน้าต่างโปรแกรม รวมถึงแสดงการตอบสนองผลลัพธ์ต่างๆ ที่ปรากฏขึ้นมาให้ผู้ใช้รับทราบ การออกแบบหน้าต่างโปรแกรมไม่ใช่เรื่องยาก คุณไม่ต้องเสียเวลาเขียนโค้ดเอง เพียงจัดวางคอนโทรลต่างๆ ในโปรแกรม Koda ดังรูปด้านล่าง จากนั้นค่อยสั่งโปรแกรมสร้างเป็นโค้ดออกมาโดยอัตโนมัติ  (หนังสือ AutoIt เบื้องต้น สร้างหน้าต่างด้วยโปรแกรม Koda และวิธีเชื่อมโค้ดคำสั่งเข้ากับหน้าต่างโปรแกรม)



    [[2]] การกำหนดโค้ดที่จะทำงานร่วมหน้าต่างโปรแกรม ส่วนนี้จะเป็นส่วนที่มีความยุ่งยากกว่า เพราะหัวใจของโปรแกรมที่เราสร้างขึ้นจะมาจากส่วนนี้เอง ตัวอย่างโค้ดโปรแกรมแบบง่ายๆ ดูได้จากด้านล่างนี้



    ตัวโค้ดสำหรับหน้าต่างโปรแกรมที่สร้างจาก Koda จะเป็นตัวสีฟ้า ส่วนโค้ดที่เขียนเพิ่มเติมเข้าไปจะเป็นสีเขียว โค้ดสีเขียวนี้จะทำงานภายหลังจากคุณคลิกปุ่ม OK ในหน้าต่างโปรแกรม

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("pssix.blogspot.com", 305, 120, 955, 239)
GUISetBkColor(0x808080)
$Button1 = GUICtrlCreateButton("Button1", 216, 16, 75, 25)
GUICtrlSetBkColor(-1, 0xFFFFFF)
$Input1 = GUICtrlCreateInput("Input1", 16, 16, 121, 21)
$Input2 = GUICtrlCreateInput("Input2", 16, 64, 121, 21)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
         Case $Form1
        Case $Button1

;ใส่โค้ดคำสั่งหลังจากได้โค้ดสำเร็จรูปจากโปรแกรม Koda มาเรียบร้อยแล้ว
MsgBox(0,"สวัสดี","หลังจากนี้จะเปิดโปรแกรมโน้ตแพด") ;แสดงกล่องข้อความ
Run(@WindowsDir & "\notepad.exe")
;รันโปรแกรมโน้ดแพดขึ้นมา
        Case $Input1
        Case $Input2
    EndSwitch
WEnd
   
     ด้วยวิธีการข้างต้นนี้ ผมแสดงให้เห็นถึงวิธีการสร้างโปรแกรมอย่างง่ายๆ ขณะเดียวกันหากคุณต้องการสร้างโปรแกรมที่มีความซับซ้อนขึ้นไปอีก หลักวิธีดังกล่าวก็สามารถนำมาใช้ได้ เหตุที่ผู้คนส่วนใหญ่เมื่อเริ่มสร้างโปรแกรมติดปัญหา มักจะเกิดจากความที่ยังไม่ชำนาญคำสั่ง AutoIt เสียมาก ซึ่งพอเริ่มเขียนสคริปต์จะสะดุดลงตรงที่ไม่รู้ว่า ต้องเขียนอย่างไร ใช้คำสั่งไหน วางคำสั่งอย่างไร เทคนิคการจัดเรียงลำดับต่อเนื่อง การใช้ลูปเพื่อจัดการกับอาร์เรย์ เหล่านี้ต้องอาศัยพื้นฐานความรู้ AutoIt ที่ดีพอจึงจะสามารถทำได้

    คุณอาจเป็นนักตัดแปะสคริปต์ หรือนักเขียนสคริปต์ OK, Cancel ชอบเขียนคำสั่งอะไรที่ง่ายๆ (เหมือนตัวอย่างสคริปต์ด้านบน) คอมไพล์โปรแกรมเป็น exe เอาไปอวดคนที่เขียนโปรแกรมไม่เป็นว่าคุณเขียนเป็น ซึ่งไม่ใช่เรื่องผิดอะไร แต่ก็ไม่ใช่ผลดีสำหรับเส้นทางการเป็นนักเขียนสคริปต์ด้วยเช่นกัน อย่างที่ผมเคยบอกไว้ตั้งแต่บทแรก การเขียนสคริปต์เป็นทักษะ ต้องฝึกฝนศึกษาหาแนวทางเทคนิคการเขียนไปเรื่อยๆ แนวทางการฝึกฝนอาจใช้วิธีไล่เรียงดูตัวอย่างของคำสั่งที่สนใจ (คลิกที่คำสั่งแล้วกด F1 ดูคำอธิบาย) หรือใช้วิธีนั่งอ่านสคริปต์ที่เขียนสำเร็จเป็นโปรแกรมแล้วของคนอื่น เพื่อศึกษาเทคนิควิธีเขียน

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


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

    แน่นอนว่าในโลกนี้ยังมีคน “คิดนอกกรอบ” ได้จริง และอย่างแน่แท้ว่าไม่ใช่ผม บุคคลที่ว่าคือนาย jon (ผู้สร้าง AutoIt) นั่นเอง ผมขอย้อนความเกี่ยวกับ AutoIt ไปสักนิดหนึ่ง อย่างที่ทราบกันดี (ใครทราบกัน) สคริปต์ AutoIt ขับเคลื่อนด้วยตัว Interpreter แปลชุดคำสั่งภายใน ออกมาเป็นการกระทำต่างๆ ตามแต่ผู้เขียนสคริปต์จะสั่งการ เริ่มแรกไม่ว่าใครก็ไม่ทราบว่า AutoIt จะได้รับความนิยม แม้แต่นาย jon ก็ไม่รู้ ดังนั้นตัว Interpreter จึงผนึกคำสั่งทั้งหมดเอาไว้ ต่อเมื่อยุครุ่งเรืองแห่ง AutoIt มาถึง ผู้ร่วมพัฒนาหลายคนจึงเห็นว่าการสร้างคำสั่งและผนึกลงในตัว Interpreter ยิ่งทำให้ไฟล์เริ่มต้นมีขนาดใหญ่มากเกินไป

    การประชุมเพื่อวางแนวทางสำหรับแก้ไขปัญหานี้ หลายแนวถูกนำเสนอขึ้น ทั้งการสร้างไฟล์ dll เพื่อใช้เก็บคำสั่งที่เพิ่มเข้ามา รวมถึงการสร้างข้อมูลออกเป็นชุดๆ ใช้ลิงก์เข้าไปยังไฟล์โปรแกรมในขั้นตอนการคอมไพล์ วิธีการต่างๆ เหล่านี้ดูเหมือนจะช่วยแก้ไขปัญหาได้ แต่ ยังขาดสิ่งที่เรียกว่า ความเรียบง่ายและอิสระ หากเหล่าผู้พัฒนาใช้ข้อตกลงข้างต้นข้อใดข้อหนึ่ง ภาระสำหรับการเพิ่มคำสั่งจะตกของกับผู้พัฒนา Autoit อย่างหลีกเลี่ยงไม่ได้ ขณะที่ผู้ใช้ส่วนใหญ่ก็จะต้องรอให้มีการเพิ่มเติมคำสั่งที่ต้องการใช้งานอีก ที่สุดแล้วนาย jon จึงเสนอแนวคิดหนึ่ง คือ แยกคำสั่ง AutoIt ออกเป็น คำสั่งภายในและคำสั่งภายนอก (ภายหลังมีชื่อเรียกอย่างเป็นทางการคือ UDF)

     คำสั่งภายใน เป็นคำสั่งที่ผนึกถาวรไปกับตัว Interpreter จะสร้างคำสั่งภายในได้ต้องผ่านการรับรองจากกลุ่มผู้พัฒนา (ผู้ร่วมพัฒนาจะเห็นโค้ดที่ใช้สร้าง Interpreter ทั้งหมด) ซึ่งคุณสามารถเรียกใช้คำสั่งได้ทันที เช่น คำสั่ง Run ,WinSetState, Send, ControlSend, MouseClick, ControlClick, MsgBox ฯลฯ

     คำสั่งภายนอก เป็นคำสั่งที่ผู้ใช้เป็นผู้สร้างขึ้นมาใช้เอง (UDF) โดยสามารถแยกออกเป็นไฟล์ต่างหากไม่ปะปนกับสคริปต์ หากเรียกใช้คำสั่งดังกล่าวจะต้องมีการ #include ไฟล์ที่เขียนชุดคำสั่งนั้นเข้ามาในสคริปต์ด้วยเช่น คำสั่ง _ArrayAdd ต้อง #include <Array.au3> หรือคำสั่ง _Timer_Init() ต้อง #include <Timers.au3> เป็นต้น ชุดคำสั่งที่ผู้ใช้ทั่วไปสร้างแล้วกลุ่มผู้พัฒนาเห็นว่ามีประโยชน์ จะถูกบรรจุเข้าไปในชุดติดตั้งโปรแกรม AutoIt ด้วย

     หากคุณศึกษาภาษาตระกูล C มาก่อนจะเห็นว่ามีการใช้ include เช่นกัน ดังนั้นแนวคิดของนาย jon จึงนำเอาวิธีดั้งเดิมของภาษาที่เป็นจุดกำเนิด AutoIt มาใช้แก้ไขปัญหา มองในอีกแง่หนึ่งเมื่อสร้างภาษาคอมพิวเตอร์ใหม่ ตามความคิดคนทั่วไปก็ต้องจะทำสิ่งที่แตกต่างไม่เหมือนใครเพื่อแสดงการ “ออกนอกกรอบ” ซึ่งหารู้ไม่ว่าการคิดแบบนี้ ไม่ต่างจากการย้ายตัวเองจากกรอบเดิมไปยังกรอบอีกกรอบเท่านั้น

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


หนึ่งขบคิด ร้อยทางบรรลุ
     คำถาม: คำสั่ง AutoIt ด้านล่างนี้ เมื่อรันแล้วจะมีหน้าต่างโปรแกรม(GUI)หรือไม่

While Sleep(100)
    WEnd


และย่อมแน่นอนว่านี่คือ คำถามลวง ตามหลักเหตุผลทั่วไป ผู้ที่เริ่มศึกษา AutoIt จะตอบว่าสคริปต์นี้ไม่มีหน้าต่างโปรแกรม อย่างมากก็มีเพียงไอคอนและเมนูที่ System tray เท่านั้น ซึ่งเป็นคำตอบที่ผิด คำตอบที่แท้จริงก็คือ สคริปต์ด้านบนนี้มีหน้าต่าง (GUI)

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

   ด้วยเหตุผลข้างต้นจึงอาจกล่าวได้ว่า สคริปต์ AutoIt มิอาจไม่มีหน้าต่าง เพราะในตัว Interpreter จะสร้างหน้าต่างขึ้นมาอัตโนมัติและซ่อนมันเอาไว้จากสายตาของผู้ใช้ทั่วไปนั่นเอง

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

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


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

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

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

นี่คือ น้ำหนักของ AutoIt

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

###จบแล้วครับ###


3 comments:

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

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

    ReplyDelete
  3. มีวิธีเขียนโปรแกรมที่ใช้เล่นเกมส์แบบ เปิด10จออยากให้มันทำงานพร้อมกันทั้ง10จอตามที่เราโปรแกรมไว้จะได้ไหมครับ

    ReplyDelete

    ส่วนนี้สำหรับแสดงความคิดเห็นทั่วไป สอบถามปัญหาตั้งถามได้ที่ฟอรั่ม


>>> [โปรดอ่าน] เนื่องจาก บทความการใช้งานบางโปรแกรมได้โฟสไปนานแล้ว
โปรแกรมอาจมีการอัปเดท วิธีการใช้งาน อาจใช้ไม่ได้ หรือมีวิธีที่ง่ายกว่าในเวอร์ชั่นใหม่
หากคุณพบว่าวิธีการใช้งานไม่ตรงกับบทความในบล็อกนี้ สามารถแนะนำเพิ่มเติมได้ครับ