เขียน AI ให้เกมส์ด้วย Minimax Algorithm

ในการเล่นเกมที่มีผู้เล่นสองฝ่ายแล้วผลัดกันเล่นอย่างเช่นหมากรุก หมากฮอส หรือว่า XO (Tic Tac Toe) การเดินหมากแต่ละครั้งสิ่งที่ผู้เล่นต้องดูคือ การที่เราวางหมากนั้นลงไปแล้วจะทำให้เรามีโอกาสชนะหรือไม่ ถ้าไม่ทำให้เกิดโอกาสเราได้เปรียบในตาถัดไปก็ต้องดูว่าจะกันฝ่ายตรงข้ามไม่ให้มีโอกาสชนะได้อย่างไร ซึ่งเรื่องนี้ต้องอาศัยประสบการณ์ของผู้เล่นเป็นอย่างมากถึงจะคาดเดาไปจนถึงขั้นจบกระดานด้วยการเดินแค่หมากเดียว ซึ่งหากเราจะเขียน AI ก็ไม่จำเป็นที่จะต้องจำรูปแบบการเล่นนั้นไว้ เราสามารถเขียนให้มันทดลองเดินหมากทุกรูปแบบ ทุกความเป็นไปได้ แล้วหาว่างมันมีหนทางที่จะชนะหรือป้องกันอีกฝ่ายไม่ให้ชนะก็ได้ หนึ่งในวิธีการตะบี้ตะบันเดินหมากให้ครบทุกความเป็นไปได้นี้นั่นก็คือ Minimax Algorithm ซึ่งสรุปได้ง่ายๆ ว่า

เอากระดานปัจจุบันเป็นที่ตั้งแล้วทดลองเดินดูว่า

  • แล้วพบรูปแบบหมากที่พาเราไปชนะ ก็ให้จำทางนั้นไว้แล้วให้คะแนนเป็นบวก
  • ถ้าเดินไปสุดทางแล้วเราแพ้ให้จำไว้แล้วให้คะแนนเป็นลบ
  • ถ้าเสมอก็ให้จำแล้วให้คะแนนเป็นศูนย์

ทำอย่างนี้ไปเรื่อยๆ จนกว่าจะครบทุกความเป็นไปได้แล้วเอาทุกรูปแบบมาเปรียบเทียบแล้วหาค่าที่ดีที่สุด
Continue reading “เขียน AI ให้เกมส์ด้วย Minimax Algorithm”

Advertisements

รันโค้ดจากระยะไกลด้วยช่องโหว่ของ Struts2

การ Hack ที่สวยงามที่สุด คือการที่ Hacker มามือเปล่า มีเพียงแค่ Browser แล้วได้ข้อมูลที่ไม่สามารถประเมินค่าได้กลับไปด้วย

เป็นประโยคที่ผมชอบมากที่สุดตอนสมัยเริ่มศึกษาเรื่องการเจาะระบบตอนเรียนอยู่มหาลัยช่วงปีหนึ่ง ซึ่งหนึ่งในเทคนิคที่ผมชอบก็คือการรันโค้ดจากระยะไกล หรือ Remote Code Execution (RCE)

ก่อนที่จะไปดู RCE ผมจะพาไปดูการรันโค้ดใดๆ ก็ได้บนเครื่องตัวเองก่อน แล้วค่อยไปดูการรันโค้ดใดๆ จากระยะไกล

Disclaimer: บทความนี้สอนให้รู้จัก Web Security เบื้องต้นเพื่อเป็นความรู้ในการป้องกันระบบเท่านั้น และช่องโหว่ที่ใช้ในการทดสอบนี้ได้มีการประกาศอย่างเป็นทางการและได้รับการ patch แล้วจึงสามารถเผยแพร่ได้ หากมีความเสียหายที่เกิดจากการเจาระระบบแล้วอ้างถึงบทความนี้ ทางผู้เขียนบทความขอไม่รับผิดชอบต่อความเสียหายใดๆ ที่เกิดขึ้น

Continue reading “รันโค้ดจากระยะไกลด้วยช่องโหว่ของ Struts2”

พื้นฐาน Web Application Security

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

มีน้องคนหนึ่งอยากให้ผมช่วยสอนเรื่องนี้ ก็เลยอยาก draft ไว้ให้เบื้องต้นเพื่อเป็นแนวทางในการศึกษาต่อไป

ประตูที่มีกุญแจล็อคไว้ไม่ได้หมายความว่าห้องของเราจะปลอดภัย เราเคยได้ยินเรื่องแนวนี้หรือไม่?

  • เวลาคนลืมกุญแจห้องแล้วต้องเรียกช่างมาแงะ
  • แอบปั้มกุญแจด้วยดินน้ำมัน
  • ใช้ไพ่รูดตรงลูกบิดประตูห้องพักโรงแรม
  • ในหนังที่ตัวร้ายใช้เครื่องตัดเหล็ก หรือทหารใช้ระเบิดวางไว้ที่ประตู

Continue reading “พื้นฐาน Web Application Security”

Functional Programming คือ?

ถ้าใครชอบคณิตศาสตร์ (ผมตกเลข) คงจะคุ้นเคยกับคำว่า function กันมาบ้าง หน้าตามันประมาณนี้ f(x) = x2 หรือ f(x, y) = 2x + y เวลาใช้งานเราก็ต้องแทนค่าตัวแปรใน function เช่นกำหนดให้

x = 5

f(5)
= 5 x 5
= 25

หรือส่งเป็นสมการเข้าไปได้เช่น

x = 5
y = x + 4

f(x, y)
= f(5, x + 4)
= f(5, 9)
= 2 x 5 + 9
= 10 + 9
= 19

แล้วมันเกี่ยวอย่างไรกับการเขียนโปรแกรม???
Continue reading “Functional Programming คือ?”

การทำงานของตัวแปร serialVersionUID บทที่ 2

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

  • Bean มีฟิลด์ไม่เท่ากันและไม่ได้มีการประกาศตัวแปร serialVersionUID
  • Bean มีฟิลด์ไม่เท่ากันแต่มีการประกาศตัวแปร serialVersionUID

Continue reading “การทำงานของตัวแปร serialVersionUID บทที่ 2”

Java 8 – Lambda Expression

Lambda Expression คือการสร้าง Anonymous Object ด้วย syntax ที่สั้นลง (anonymous object คือการ new interface แล้ว implement โค้ดกันสดๆ ตอนนั้นเลย) เช่นในตอนที่แล้วผมทำการลูป forEach แล้วลดรูปลง

สำหรับคนที่ต้องการใช้งาน lambda expression ไม่ใช่ว่าอยู่ๆ ก็จะสามารถใช้ได้เลยนะครับ โดยเขายึดหลักอยู่สามข้อดังนี้

  1. Logic ต้องง่าย หากมีความซับซ้อนก็ให้ไป new Class แล้วทำการ implement ตามปกติ
  2. Interface นั้นจะต้องอยู่ในรูปแบบที่เรียกว่า functional interface
  3. method นั้นจะต้องไม่มี side effect (pure functional) คือไม่ควรมีการไปแก้ไขค่าตัวแปรที่อยู่ข้างนอก scope ของ method

Continue reading “Java 8 – Lambda Expression”

forEach ใน Java 8

ผมเชื่อว่าหลายคนเคยเขียน loop เพื่อดึงค่าข้อมูลใน List มาใช้งานโดยใช้คำสั่ง for หน้าตาประมาณนี้

for (Integer value : values) {
	System.out.println(value);
}

เราเรียก loop ที่ได้ค่ามาโดยที่เราไม่ต้องระบุ index แบบนี้ว่า for-each ใน Java 8 ได้มีการเตรียมการ for-each ให้แล้ว เพียงแค่เรียกเมธอดเดียวก็สามารถใช้งานได้เลย ข้อแม้คือคลาสนั้นต้องมีการ implements Iterable ถึงจะใช้ได้
Continue reading “forEach ใน Java 8”