วิธีใช้ AI โฮมุน Ragnarok

สวัสดีครับ วันนี้จะแนะนำเรื่องการใช้ AI โฮมุนใน Ragnarok เนื่องจากมีคนในเกมถามมา แต่อธิบายได้ไม่หมดภายในเกม จึงยกมาเขียนเป็นบทความนี้ครับ

วิธีติดตั้ง AI โฮมุน

AI ที่เราจะใช้คือ AzzyAI สามาดาวน์โหลดได้จากที่ AzzyAI Download ให้ดาวน์โหลดเวอร์ชั่นล่าสุด ในที่นี้คือ 1.551 โดยคลิกที่ Download AzzyAI 1.551 เพื่อดาวน์โหลดเลยครับ

หลังจากดาวน์โหลดมาแล้ว จะได้ไฟล์ AzzyAI 1.551.zip ให้แตกไฟล์นี้ออกมา จะได้โฟลเดอร์ AzzyAI 1.551 ข้างในจะมีไฟล์จำนวนมาก ให้ก็อบไฟล์ทั้งหมดไปไว้ในโฟลเดอร์ AI/USER_AI ในโฟเดอร์ที่ลง Ragnarok สุดท้ายจะได้ตามภาพ

2016-03-11_20-47-00edited

สังเกตว่าไฟล์ทั้งหมดอยู่ที่ไหนครับ เท่านี้ก็เพียงพอจะทำให้ AI ทำงานได้แล้วครับ

วิธีเปิดการทำงานของ AI ภายในเกม

สามารถเปิดโดยใช้คำสั่ง /hoai เมื่อพิมพ์แล้วจะมีข้อความระบุว่า AI ตัวไหนจะทำงาน มี 2 อย่างดังนี้

  1. Homunculus AI ถูกควบคุมโดย Default หมายถึง AI ที่กำลังใช้งานอยู่เป็น AI เริ่มต้นที่มากับเกม
  2. Homunculus AI ถูกควบคุมโดยผู้เล่น หมายถึง AI ที่กำลังใช้งานอยู่เป็น AI ที่อยู่ในโฟลเดอร์ USER_AI ซึ่งเป็นที่ๆ จัดไว้ให้ผู้เล่นลงเพิ่ม

ดังนั้นถ้าเราจะใช้ AI ที่เราเพิ่งลงไป ต้องพิมพ์คำสั่ง /hoai จนกว่าขึ้นตามข้อ 2

วิธีโหลดการตั้งค่า AI ใหม่ ภายในเกม

หมายถึง เมื่อเราตั้งค่า AI ระหว่างที่เราเปิดใช้งาน AI อยู่ เราจะสามารถทำให้ค่าที่เราตั้งเข้าไปใหม่นั้นทำงานได้ทันทีโดยไม่ต้องออกเกมและเข้าใหม่ เท่าที่ทราบมี 3 วิธีดังนี้

  1. ใช้สกิล Vaporize และ Call Homunculus
  2. เข้าวาปอะไรก็ได้
  3. วิ้ง

วิธีตั้งค่าการทำงาน AI พื้นฐาน

ให้เปิด AzzyAIConfig ใน AI/USER_AI ขึ้นมา หน้าตาจะเป็นดังนี้

2016-03-13_13-23-44edited

ถูกแท็บที่ผมวงสีแดงไว้ มีรายละเอียดดังนี้

  • Homunculus และ Mercenary ใช้ตั้งค่าพื้นฐานเกี่ยวกับ การทำงานของ AI
  • Homunculus Tactics และ Mercenary Tactics ใช้ตั้งค่าการโจมตีของโฮมุนและทหารรับจ้างตามแต่ตัวมอนสเตอร์ที่จะตีเช่น ตั้งว่า ไม่ต้องตี White plant เป็นต้น แต่ทหารรับจ้างไม่สามารถแยกมอนสเตอร์ออกจากกันได้ ดังนั้นจึงตั้งค่าได้แค่แบบเดียว ใช้กับมอนสเตอร์ทุกตัว

เมื่อตั้งค่าอะไรไปก็ตามแต่ ให้กด Apply Setting ด้วย เพื่อเป็นการบันทึกการตั้งค่า ถ้าไม่กดก็จะยังไม่มีความเปลี่ยนแปลงใดๆ ทั้งสิ้น

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

ค่าที่ต้องระบุ

หมายถึง ในการตั้งค่าต่างๆ(เช่น มองหามอนสเตอร์และทำการโจมตีเมื่อเลือดมากกว่ากี่เปอร์เซนต์) การระบุค่านั้นมีที่เป็นไปได้ 2 แบบ คือ

  1. ระบุเป็นตัวเลข เช่น ช่วงเวลา หน่วยเป็นเสี้ยววินาที หรือ เปอเซนต์
  2. ระบุเป็นค่าจริงหรือเท็จ True=จริง, False=เท็จ

แท็บ Homunculus

HealOwnerHP จะฮิลผู้เล่น เมื่อเลือดผู้เล่นต่ำกว่ากี่เปอเซนต์

HealSelfHP จะฮิลตัวเอง เมื่อเลือดต่ำกว่ากี่เปอเซนต์

AggroHP ระบุว่าเลือดมากกว่ากี่เปอเซนต์ จึงจะหามอนสเตอร์และโจมตีก่อน

MobileAggroDist ระบุว่าระหว่างผู้เล่นเคลื่อนที่ จะออกไปโจมตีในระยะเท่าไหร่วัดจากตัวผู้เล่น

RescueOwnerLowHP จะมาช่วยผู้เล่น เมื่อเลือดของผู้เล่นน้อยกว่ากี่เปอเซนต์ โดยไม่สนใจการตั้งค่าในแทคติก ตั้งค่าเป็น 0 เพื่อผิด

StationaryAggroDist เมื่อผู้เล่นยืนนิ่ง โฮมุนจะออกไปโจมตีในระยะเท่าไหร่วัดจากตัวผู้เล่น

DoNotUseRest หมายถึง ไม่ใช้การหยุดพัก(การหยุดพักคือ เมื่อผู้เล่นนั่ง โฮมุนจะไม่ออกไปโจมตี)

แท็บ Homunculus Tactics

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

2016-03-13_16-18-41edited

เราสามารถเพิ่มมอนสเตอร์ด้วยการกดปุ่ม Add และระบุชื่อมอนสเตอร์และไอดีของมอนสเตอร์ สามารถดูไอดีของมอนสเตอร์ได้ที่เว็บ ratemyserver โดยติกที่ Renewal ก่อน จากนั้นพิมพ์ชื่อมอนสเตอร์แล้วกด enter และมองหา Mob-ID# ซึ่งจะตามด้วยตัวเลข ตัวเลขนี้คือไอดีของมอนสเตอร์นั่นเอง

หากเมื่อเราค้นหาแล้วเจอมอนสเตอร์ชื่อเดียวกันหลายตัว ให้ดูที่แผนที่เกิดของมัน หากเป็นมอนสเตอร์ที่มีจริงๆ จะต้องมีที่เกิด ตัวอย่างดังภาพ

chrome_2016-03-13_16-38-46edit

ต่อไปเป็นการตั้งค่า Basic Behavior หรือพฤติกรรมพื้นฐาน มีดังต่อไปนี้

  • Tank โจมตีมอนสเตอร์ก่อน 1 ครั้ง แล้วรอจนกว่าจะมีคนมาฆ่า
  • Tank & Mob โจมตีมอนสเตอร์ก่อน 1 ครั้ง แล้วรอจนกว่าจะมีคนมาฆ่า ถ้ามีมอนสเตอร์มากพอที่กำลังตีโฮมุนอยู่ จะโจมตี 1 ตัวและใช้สกิลโจมตีหมู่ใส่
  • Ignore ไม่โจมตี ยกเว้นแต่ผู้เล่นจะสั่งเอง
  • Attack – Low มองหาและโจมตีมอนสเตอร์ เมื่อไม่มีมอนสเตอร์ที่มีลำดับความสำคัญกว่า และไม่ให้ความสำคัญในการโจมตีมอนสเตอร์ตัวนี้ แม้มันจะตีโฮมุนหรือผู้เล่น/สมาชิกปาตี้อยู่ ลำดับความสำคัญระดับต่ำ
  • Attack – Medium มองหาและโจมตีมอนสเตอร์ เมื่อไม่มีมอนสเตอร์ที่มีลำดับความสำคัญกว่า ลำดับความสำคัญระดับกลาง
  • Attack – High มองหาและโจมตีมอนสเตอร์ ถ้าไม่ได้กำลังโจมตีมอนสเตอร์ที่ตั้งค่าเป็น React อยู่ ลำดับความสำคัญระดับสูง
  • Attack – Top มองหาและโจมตีมอนสเตอร์ ลำดับความสำคัญสูงสุด
  • Attack – Last มองหาและโจมตีมอนสเตอร์ตัวนี้เป็นตัวสุดท้าย เหมาะกับตีเห็นหรือดอกไม้
  • React – Low โจมตีมอนสเตอร์ตัวนี้ทันที เมื่อมันโจมตี โฮมุน, ผู้เล่น, สมาชิกปาตี้ ลำดับความสำคัญต่ำ Attack – Medium และ Attack – High จะมีความสำคัญกว่าอันนี้ และไม่ให้ความสำคัญในการโจมตีมอนสเตอร์ตัวนี้ แม้มันจะตีโฮมุนหรือผู้เล่น/สมาชิกปาตี้อยู่
  • React – Medium โจมตีมอนสเตอร์ตัวนี้ทันที เมื่อมันโจมตี โฮมุน, ผู้เล่น, สมาชิกปาตี้ ลำดับความสำคัญปานกลาง
  • React – High โจมตีมอนสเตอร์ตัวนี้ทันที เมื่อมันโจมตี โฮมุน, ผู้เล่น, สมาชิกปาตี้ ลำดับความสำคัญสูง
  • React – Self โจมตีมอนสเตอร์ตัวนี้ทันที เมื่อมันโจมตี โฮมุน ลำดับความสำคัญสูงสุด
  • Attack – Row, React Medium เป็นการรวม 2 แบบเข้าด้วยการ จะมองหาและโจมตีมอนสเตอร์ เมื่อไม่มีมอนสเตอร์ที่มีลำดับความสำคัญกว่า ลำดับความสำคัญต่ำ และจะโจมตีมอนสเตอร์ตัวนี้ทันที เมื่อมันโจมตี โฮมุน, ผู้เล่น, สมาชิกปาตี้ ลำดับความสำคัญปานกลาง ใช้กับ steel chonchons
  • Snipe ทำเหมือน Attack ทุกอย่าง(มีระดับ high, medium, low) สิ่งที่เพิ่มมาคือ เมื่อโฮมุนกำลังตีมอนสเตอร์ตัวอื่นอยู่ และมีสกิลโจมตีที่เหมาะสมรวมถึงมี SP พอใช้สกิลและต้องไม่ได้กำลังจะใช้สกิลหมู่ โฮมุนจะใช้สกิลโจมตีมอนสเตอร์ที่มันไม่ได้กำลังสู้อยู่ 1 ครั้ง Snipe เหมาะสมกับสกิลอย่างเช่น Caprice

สรุปลำดับความสำคัญ

  1. Attack – Top
  2. React – Self
  3. React – High
  4. React – Medium
  5. Attack – High or Snipe – High
  6. Attack – Medium or Snipe – Medium
  7. React – Low
  8. Attack – Low or Snipe – Low
  9. Tank or Tank & Mob
  10. Attack – Last

ต่อไปคือ Use Attack Skills

มีด้วยกัน 4 แบบ

  1. Always ใช้สกิลโจมตีไปเรื่อยๆ จนกว่า SP จะหมดหรือถึงขีดจำกัด SP ที่ตั้งไว้
  2. Never ไม่ใช้
  3. This many time: ใช้สกิลโจมตีจำนวนเท่านี้ครั้ง
  4. once: level: ใช้สกิลโจมตีจำนวน 1 ครั้ง และใช้สกิลเลเวลเท่านี้

ต่อไปคือ Rescue

คือการช่วยเหลือ(ช่วยตีมอนสเตอร์ให้เมื่อสิ่งนั้นถูกมอนสเตอร์โจมตี) ตั้งค่าได้ 6 แบบ ดังนี้

  1. Never ไม่ช่วย
  2. Friend ช่วยเพื่อนในปาตี้
  3. Owner ช่วยเจ้าของ
  4. Owner’s merc ช่วยทหารเจ้าของ
  5. Self(homunculus) ช่วยตัวโฮมุนเอง
  6. All of the above ช่วยทุกอย่างที่กล่าวมาข้างบน

ผมสังเกตว่า เวลามันช่วย มันจะใช้สกิลเต็มที่ เพื่อฆ่ามอนสเตอร์ให้เร็วที่สุด

สุดท้ายที่จะแนะนำคือ Kill-steal

การแจมตั้งค่าได้ 3 แบบคือ

  1. Never
  2. Always แจมเสมอ
  3. Polite แจมแบบสุภาพ หมายถึง ถ้ามอนสเตอร์วิ่งตามอย่างอื่นไปแล้ว จะไม่ไปตีมอนสเตอร์ตัวนั้น

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

ทำความรู้จัก .NET สำหรับคนธรรมดา

สวัสดีครับ ขอเขียนอธิบายบทความเกี่ยวกับ .NET สำหรับคนธรรมดา เนื่องจากผมเองซึ่งศึกษามาทางนี้ยังรู้สึกสับสนกับความใหญ่และซับซ้อนของมัน คิดว่าอย่างน้อยก็คงมีซักคนที่อยากรู้ครับ

ศัพท์ที่ต้องรู้

Framework

คือสิ่งที่เป็นพื้นฐานสำหรับสร้างสิ่งใดสิ่งหนึ่ง ในที่นี้คือโปรแกรมหรือแอพพลิเคชั่นหรือส่วนใหญ่ๆ ภายในโปรแกรม ตัวอย่างใน .NET ถ้าเราจะสร้างบ้าน ต้องมีอุปกรณ์, แบบบ้าน,และวิศวกร/คนงาน สิ่งเหล่านี้เป็น Framework นั้นเอง

ส่วนถ้าพูดถึงรวมๆ ในวงการพัฒนาซอฟแวร์ Framework จะเหมือนชุดคำสั่งทางคอมพิวเตอร์ระดับพื้นฐานที่นำมาสร้างสิ่งใดซักสิ่งหนึ่ง เช่น Caliburn Micro เป็น Framework สำหรับสร้างโปรแกรมด้วยเทคโนโลยี WPF ด้วย ตามรูปแบบ MVVM ซึ่งภายใน Framework นี้ก็จะมีคำสั่งทั้งหมดที่จำเป็นที่จะทำให้โปรแกรมเราเป็นไปตามรูปแบบ MVVM

Library

คือเซตของคำสั่งที่เจาะจงใช้ทำอะไรอย่างหนึ่ง แต่ไม่ใหญ่ถึงขนาด Framework อาจจะเป็นสับเซตของ Framework  หรืออาจจะหมายถึงที่ๆ รวมเอา API เอาไว้ ตัวอย่างเช่น Task Parallel Library เป็นส่วนหนึ่งของ .NET Framework ประกอบด้วยคลาสต่างๆ ที่ใช้เขียนโปรแกรมแบบขนาน

API – Application programming interface

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

เมื่อรวมทั้ง 3 อย่างเข้าด้วยกัน เราสามารถพูดได้ว่า เราพัฒนา library สำหรับติดต่อกับบริการของผม library ตัวนี้ใช้ .NET Framework เป็นฐานในการเขียน(คือ ใช้ API ที่มีใน .NET Framework) ภายใน library นี้บรรจุ API เพื่อให้นักพัฒนานำไปใช้ทำอย่างอื่นต่อ

ต่อไปเข้าเรื่อง .NET เลยนะครับ

.NET Framework

เป็น Framework พื้นฐานสำหรับนักพัฒนาโปรแกรมบน Windows ทำได้งานแต่บน Windows เท่านั้น ปัจจุบันพัฒนาถึงเวอร์ชั่น 4.6 ซี่งมีติดมากับ Windows 10 ส่วน Windows เวอร์ชั่นต่ำกว่านี้ต้องโหลดมาลงเอง(จริงๆ ตอนนี้มีถึง 4.6.1 Windows 10 ก็ต้องโหลดมาลงด้วย) ประกอบด้วย

Framework Class Library เป็นที่บรรจุ API เอาไว้ในนักพัฒนาใช้งาน มี library แยกย่อยอีกทีนึงอีก เป็น Base Class Library(BCL) ซึ่งเป็นตัวหลักให้ library อื่นๆ ที่มาพร้อมกันอีกประเภทคือ Framework Class Library(FCL) ใช้งาน; FCL ที่มี เช่น LINQ Windows Forms, WPF, ASP.NET เป็นต้น

Compiler เอาไว้เปลี่ยนจากภาษาที่เราเขียน(ที่ .NET Framework รองรับ) เป็นภาษา Common Intermediate Language โดยจะถูกแพ็คในไฟล์ .exe หรือ .dll เรียกอีกอย่างว่า Assemblies

Common Language Runtime(CLR) หลังจากไฟล์ source code ถูก compile เป็น Assemblies แล้วเมื่อมันถูกเรียกใช้งาน Assemblies นี้จะถูก compile อีกทีหนึ่งเป็นภาษาเครื่องด้วย CLR ตรงนี้ยังมีรายละเอียดอื่นอยู่ แต่ละเอียดเกินขอไม่พูดถึงต่อนะครับ

.NET Core

เป็น Framework ที่ถูกทำขึ้นใหม่ โดยใช้แบบจาก .NET Framework แต่ถูกพัฒนาขึ้นโดยคำนึงถึงเรื่องแยกส่วน .NET Core ทำงานได้ทั้ง Windows, Linux และ OSX และ open source ด้วย

.NET Core มี 3 ส่วนหลักเหมือน .NET Framework แต่ส่วน Framework Class Library มีรายละเอียดดังนี้

dot net core stack

Unified BCL เป็น API ที่ใช้ร่วมกันไม่ว่าจะพัฒนา Windows Store App หรือ ASP.NET 5 

ASP.NET 5 เป็น framework ตัวใหม่ทั้งก้อน ที่สามารถเลือกว่าจะใช้ทำงานบน .NET Framework หรือ .NET Core ผมอาจจะยังไม่ได้บอกไปตอนต้นว่า ASP.NET ใช้ทำเว็บไซต์ฝั่งเซิฟเวอร์

Windows Store App เป็น framework ที่ทำงานบน .NET Core ใช้พัฒนาอะไรก็ตามที่เอาขึ้น Windows Store(Universal Windows Platform –  UWP)ได้

ข้อสังเกตเกี่ยวกับ .NET Core คือชื่อเวอร์ชั่นปัจจุบันคือ .NET Core 5 ซึ่งถูกนับต่อจาก .NET Framework ซึ่งในความเป็นจริงมันคือของใหม่ รวมถึง ASP.NET 5 ที่ออกแบบมาให้ใช้งานกับ .NET Core ก็เป็นของใหม่ที่ภายในอาจไม่เกี่ยวข้องอะไรกับ ASP.NET 4.6 ใน .NET Framework เลย

ด้วยเหตุนี้อนาคตจึงจะมีการเปลี่ยนชื่อดังนี้(ปัจจุบันยังไม่เปลี่ยน)

  • .NET Core 5 เปลี่ยน .NET Core 1.0.
  • ASP.NET 5 เปลี่ยนเป็น ASP.NET Core 1.0.

อีกข้อสังเกตของ .NET Core คือผู้ใช้ไม่จำเป็นต้องสนใจว่ามีมันอยู่ในเครื่อง เพราะมันจะถูกรวมมากับโปรแกรมที่เราโหลดมาจาก Windows App Store ซึ่งแตกต่างกับ .NET Framework ซึ่งจะรวมเอาแค่ส่วน 3rd party framework/library มาด้วยเท่านั้น

ข้อมูลจาก .NET Framework Wikipedia และ Introducing .NET Core

แชร์วิธีการทำโปรแกรมดาวน์โหลดไฟล์แบบง่ายๆ

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

โปรแกรมที่ผมทำมีชื่อว่า TirkxDownloader เป็นโปรแกรมจัดการการดาวน์โหลด(ดาวน์โหลดไฟล์,ทำคิวการดาวน์โหลด)

โปรแกรมนี้เขียนด้วย C# เกือบทั้งหมด มี Javascript บ้างตอนเขียน Extension สำหรับ Chrome ตัว GUI ใช้ WPF ซึ่งผมคิดว่าดีกว่า platform ใหม่ที่ Microsoft เปิดตัวใหม่อย่าง UWP(Universal windows plateform) ซะอีก(จริงๆ มันคนละเป้าหมายล่ะนะ)

รายละเอียดการเขียน

MVVM pattern

เป็น pattern การเขียนโปรแกรมของ WPF หรือแม้กระทั่ง platform อื่นที่สามารถนำไปประยุกต์ได้ รายละเอียดมีประมาณนี้

Model เป็นตัวข้อมูลที่จะถูกแสดงใน View ซึ่งส่วนใหญ่ผม implement INotifyPropertyChanged ไว้เพื่อทำ data binding ผ่าน ViewModel ตรงๆ เมื่อข้อมูลใน Model เปลี่ยนก็จะมีการแจ้งเตือนและทำให้ View อัพเดทข้อมูลตามไปด้วย นอกจากนี้ยังมี event OnDownloadComplete อีกเพื่อใช้สำหรับการจัดคิวต่อ

ViewModel เป็นส่วนที่ช่วยแสดงผล Model ใน View ซึ่ง 1 ViewModel จะมี 1 View ที่ตรงกันอยู่(บางอันมี 2) ที่ส่วนนี้ก็จะมีพวก event handler อยู่ด้วยซึ่งใช้ระบบ event ในแบบของ framework ที่ผมใช้อยู่

View เป็นส่วน GUI ที่เราเห็นจริงๆ ตรงนี้ผมเขียนแต่ xaml ล้วนๆ

MVVM Infrastructure framework ที่ ผมใช้คือ Caliburn Micro ซึ่งใช้งานง่ายมาก แต่การที่เน้น convention มากกว่า configuration อาจจะทำให้คนที่ไม่รู้เรื่อง WPF เลยแล้วมาเริ่มต้นงงซักเลยน้อย(ผมก็ด้วย) ดังนั้นถ้าจะใช้ WPF อย่างน้อยผมขอให้อ่านบทความ XAML Overview (WPF) หรือหาหนังสือสอน WPF มาอ่านก่อน

การโหลดไฟล์

ส่ง http request file ไปที่ server และ อ่าน response stream แบบ asynchronous จากนั้นก็เขียนลงเครื่องโดยตรง

[c-sharp] var request = (HttpWebRequest)HttpRequest.Create(url);
var response = await request.GetResponseAsync();
var inStream = response.GetResponseStream();
byte[] buffer = new byte[102400];
int readbyte;

using (FileStream outStream = new FileStream(_currentItem.FullName, FileMode.Open, FileAccess.Write, FileShare.None, 65536))
{
do {
readbyte = await inStream.ReadAsync(buffer, 0, buffer.Length);
await outStream.WriteAsync(buffer, 0, readbyte);
while {
}

[/c-sharp]

ซึ่งวิธีนี้เราจะได้ Stream มาซึ่งทำให้เราสามารถวัดความเร็วการดาวน์โหลด, ดาวน์โหลดต่อจากที่หยุดไว้และที่สำคัญที่สุดคือจำกัดความเร็วได้
วิธีที่ง่ายกว่านี้คือใช้ WebClient ซึ่งมี method DownloadFile ให้อยู่แล้ว วิธีนี้เราจะได้เปอเซนต์ที่เราดาวน์โหลดไปแล้ว, จำนวนข้อมูลที่เรารับมา(รับมาแล้วกี่ byte)และจำนวนข้อมูลทั้งหมดที่จะถูกดาวน์โหลดผ่านทาง event DownloadProgressChanged ตัวอย่าง

[c-sharp] public Task DownloadFile(string uri, string locationAndFileName)
{
DownloadProgressChanged += DownloadProgressCallback;
return await DownloadFileAsync(uri, locationAndFileName);
}

private static void DownloadProgressCallback(object sender, DownloadProgressChangedEventArgs e)
{
// Displays the operation identifier, and the transfer progress.
Console.WriteLine("{0} downloaded {1} of {2} bytes. {3} % complete…",
(string)e.UserState,
e.BytesReceived,
e.TotalBytesToReceive,
e.ProgressPercentage);
}
[/c-sharp]

event นี้จะใช้ได้ก็ต่อเมื่อเราใช้ asynchronous api รายละเอียดตามนี้ครับ WebClient.DownloadProgressChanged

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

ทำ Queue

ใช้ Queue(เป็น collection แบบหนึ่ง) เก็บ model ที่ต้องการดาวน์โหลดเอาไว้ และมี method ตัวหนึ่งทำหน้าที่เป็นตัวสั่งการดาวน์โหลดเองในตอนต้นและเป็น event handler ให้กับ model ที่การดาวน์โหลดเสร็จแล้วในภายหลัง(ไม่ว่าจะเสร็จสมบูรณ์, มี error และอื่นๆ) model ภายใน Queue จะถูกถึงออกมาดาวน์โหลดเรื่อยๆ จนกว่าจะหมดและจะไม่เพิ่มการดาวน์โหลดหากถึงจำนวนสูงสุดที่อนุญาติให้ดาวน์โหลดแล้ว
รายละเอียดโค้ดตรงนี้ยาวมากๆ ขอให้ไปดูรายละเอียดที่ Downloader เลยครับ

เก็บ Credential(username กับ password ของ website)

ผมเก็บไว้ใน Credential Manager ของ Windows  ซึ่งผมใช้ CredentialManagement  library ในการเข้าใช้งาน Credential Manager ตัวอย่างโค้ดก็ตามนี้ครับ AuthorizationManager และอีกส่วนที่ใช้ในการหาว่า url นี้จะใช้ credential อันไหนก็ตามนี้เลยครับ FileHostingUtil (อยู่ใน method FillCredential)

ในตอนนี้นั้นผมยังไม่ได้ทำให้โปรแกรมปลอดภัย วิธีทำให้ปลอยภัยขึ้นอีกก็ไม่ยาก เวลาเราจะให้ผู้ใช้ใส่รหัส ให้เราใช้ PasswordBox แทน TextBox ซึ่ง PasswordBox นั้นจะมี property ชื่อ SecurePassword อยู่ซึ่งเป็น SecureString จากนั้นเวลาจะสร้าง Credential หรือเก็บลงเครื่อง ให้ใช้ method หรือ constructor ที่รับ password เป็น SecureString เท่านั้น ห้ามเปลี่ยน SecureString เป็น string โดยเด็ดขาด ไม่อย่างงั้นก็จบเกม

สาเหตุที่เป็นชื่อนี้เป็นเพราะว่าตอนแรกนั้นต้องการจะทำโปรแกรมที่ใช้เปิดหาอนิเมะบนเว็บ Tirkx ได้โดยตรงโดยไม่ต้องเปิด web browser และไม่ใช้ API จากเว็บ Tirkx เองด้วย เพราะช่วงนั้นอยากลองใช้ html agility pack ในการอ่านหน้าเว็บไซต์และนำข้อมูลมาแสดง ซึ่งท้ายที่สุดก็ต้องยอมแพ้เนื่องจากส่วนที่แสดงไฟล์ให้ดาวน์โหลดนั้น เป็น javascript ซึ่งจำเป็นต้องใช้ web browser มา interpret มันออกมา ซึ่งช้าและใช้ทรัพยากรเครื่องมากเกินไป ท้ายที่สุดจึงทำออกมาเป็นโปรแกรม download manager ไว้ใช้ดาวน์โหลดไฟล์ทั้งหมดซะเลย

วิธีย้ายแอพพลิเคชั่นไปไว้ใน SD Card ด้วย Link2SD

สวัสดีครับ วันนี้จะแนะนำวิธีย้ายแอพพลิเคชั่นบนมือถือแอนดรอยด์ไปไว้ใน SD card ด้วย แอพ Link2SD นะครับ

การย้ายจะเป็นในรูปแบบการ link หรือก็คือการย้ายแอพไปไว้ที่ partition ที่ 2 ของ SD card (ซึ่ง partition นี้นั้นจะถูก mount ทุกครั้งที่บูตเครื่อง) จากนั้นก็จะทำการสร้าง Symbolic link เอาไว้ที่ตำแหน่งเดิมของมันโดย Symbolic link นี้จะชี้ไปที่ไฟล์ที่ถูกย้ายไปนั่นเอง

สิ่งที่จำเป็นคือ

  • Link2SD แอพสำหรับย้ายแอพภายในเครื่อง ตัวแอพนี้เป็นแอพเดียวที่ไม่สามารถย้ายไปได้
  • Class 10 SD card อันนี้ไม่จำเป็นว่าต้องเป็น Class 10 แต่เพื่อให้มันเร็วที่สุดเท่าที่จะเป็นไปได้ก็ควรใช้
  • MiniTool Partition Wizard Free Edition เอาไว้แบ่ง partition SD card
  • Android 4.0.11 ขึ้นไป
  • ต้อง Root เครื่องแล้ว

การแบ่ง partition SD card

ขั้นตอนแรกก็ต้องแบ่ง partition SD card ก่อนเลยครับ นำ SD card ใส่คอมเข้าไปแล้วเปิดโปรแกรม MiniTool Partition Wizard ขึ้นมา คลิกปุ่มด้านขวาเพื่อเข้าใช้งานโปรแกรม

partition01

สังเกตว่าเรามีดิสก์ 2 อัน อันแรกคือตัว HDD จริงๆ ในเครื่องส่วนอีกอันนึงก็เป็น SD card ที่ใส่เข้าไป อันนี้จะเป็นไปตามแต่ว่าเครื่องไหนมีเท่าไหร่นะครับ ของผม SD card มีอยู่ partition เดียว File system เป็นแบบ FAT32

partition02

อย่างแรกก็จะทำการแบ่ง partition ใหม่ก่อน ให้คลิกขวาที่ partition ที่ต้องการแบ่ง ในที่นี้ของผมเป็น drive H แล้วเลือก Split

partition03

จากนั้นปรับเลือกขนาด partition ใหม่ ส่วนที่เหลืออยู่จะถูกปรับให้เองอัตโนมัติ ในที่นี้ผมแบ่งออกมา 1 GB จากนั้นกด OK

partition04

เราก็จะได้ partition ใหม่ขึ้นมา สังเกตว่าเป็นประเภท Logical แล้ว File system เป็นแบบ FAT32 แต่ที่เราต้องการเป็นคือ File system แบบ Ext2 และประเภท partition เป็น Primary

partition05

คลิกขวาที่ partition ที่เราต้องการเปลี่ยน จากนั้นเลือก Set Partition as Primary เพื่อเปลี่ยนประเภทของ partition

partition06

คลิกขวาที่ partition ที่เราต้องการฟอแมท จากนั้นเลือก Format

partition07

เลือก File system เป็น Ext2 จากนั้นกด OK

partition08

ขั้นตอนสุดท้ายให้กดปุ่ม Apply ทางด้านมุมบนซ้ายเพื่อดำเนินการตามที่เราทำมาทั้งหมดจริงๆ

partition09

โปรแกรมจะถามว่าเราต้องดำเนินการตามที่เราทำมาหรือไม่ ให้เรากด Yes

partition10a

จากนั้นก็รอครับ

partition10

เมื่อเสร็จแล้ว โปรแกรมก็จะขึ้นมาเตือนว่าเสร็จแล้วให้เรากด OK ครับ

partition11

เป็นอันเสร็จเรียบร้อยแล้วสำหรับการเตรียม SD card ถ้าเราเอานำไปใส่โทรศัพท์ก็จะเห็นว่าเนื้อที่มันลดลงไปโดยเนื้อที่ๆ เหลือจะเหลือตามเนื้อที่เดิมลบกับเนื้อที่ๆ เราหักออกไปแล้วและเราจะมองไม่เห็น partition ใหม่ที่เราแบ่งออกมา

การใช้แอพ Link2SD

อย่างแรกก็คือไปโหลดแอพ Link2SD ลงเครื่องก่อน เมื่อเปิดแอพครั้งแรก จะถูกถามว่า second partition ของเป็นใช้ File system แบบไหน ให้เราเลือกแล้วกด OK ไปครับ(อันนี้ผมไม่ได้ใส่อันใหม่เข้าไปเพราะผม Link ไว้แล้วและกลัวมีปัญหาเวลาสร้าง mount script ซ้ำ ผมเลยเลือก recreate mount script เพื่อถ่ายรูปนี้มาให้ดูครับ ถ้าจำไม่ผิดหลังจากเรากด OK แล้วมันจะให้เรารีเครื่องเพื่อให้ใช้งานแอพได้ทันทีครับ)

Screenshot_2015-05-22-19-35-41

วิธีใช้ก็ไม่ได้ยากอะไรครับ แค่เลือกแอพที่ต้องการจะ Link จากนั้นกดปุ่ม Link to SD card และเลือกว่าจะ link อะไรบ้างเท่านั้นเองครับ

Screenshot_2015-05-23-16-50-20     Screenshot_2015-05-23-16-50-29

 

เพิ่มเติม

บางครั้งจะมีปัญหาเรื่อง mount script มีปัญหาทำให้หลังจากเปิดเครื่องแล้วแอพที่ลิ้งไปจะใช้งานไม่ได้(มองไม่เห็น) ตัวแอพ Link2SD นั้นจะเตือนเราให้เราไปเลือก File system ของ partition ใหม่และทำการรีเครื่องก็เป็นอันเสร็จเรียบร้อย

ส่วนใหญ่ที่ผมเจอปัญหานี้คือหลังจากที่ผมอัพรอมใหม่ ซึ่งระหว่างลงมันจะ wipe system (ผม link แต่ user application แทบทั้งหมด) ทำให้ mount script มีปัญหานั้นเอง

ใครมีปัญหาอะไรก็สอบถามได้เลยนะครับ

แนะนำมังงะที่อ่านอยู่

สวัสดีครับ เนื่องจากไม่ได้เขียนซะนานเพราะไม่มีเรื่องอะไรจะเขียน วันนี้ก็หาเรื่องที่อยากจะเขียนได้จนได้แล้ว

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

ドメスティックな彼女 – domestic na kanojo

domestic na kanojo

เรื่องนี้เป็นแนวดราม่าความรัก ระหว่างเด็กมัธยมปลายและอาจารย์ของตัวเอง เรื่องนี้ยังไม่จบแต่คาดว่าไม่มีฮาเร็มแน่นอน ในภาพคนกลางคือพระเอก ฟุจิ นัตสึโอะ คนผู้หญิงคนขวาชื่อ รุย ส่วนคนคนซ้ายชื่อ ฮินะ 2 คนนี้เป็นหนึ่งในคู่แข่งของเรานั่นเอง อ่านไปเรื่อยๆ จะมีผู้หญิงคนอื่นเข้ามาอีก ทดสอบความแน่วแน่ของกองอวยเป็นอย่างดี เขาแนะนำเพียงแค่นี้ ที่เหลืออยากให้ลองไปอ่านตอนแรกเป็น first impression ดูครับ อนึ่งเรื่องนี้มีฉาก NSFW อยู่บ้างเล็กน้อย สำหรับผมคิดว่าไม่เหมาะกับการอ่านที่โรงเรียนแน่นอน ;P

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

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

煉獄のカルマ – rengoku no karma

Rengoku no karmafuwa seiya

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

อ่านตอน 20 ซึ่งเป็นตอนล่าสุดก่อน public บทความนี้ รู้สึกจะตัดเรื่องขึ้นบทๆ ไปซะงั้น – -*

สปอยตอนแรก
ตอนแรกนานาเซะโดนแกล้งหนักมาก จนในที่สุดก็ทนไม่ไหวจึงได้ฆ่าตัวตายโดยหวังว่าคนอีก 6 คนที่แกล้งตัวเองจะต้องโชคร้ายไปด้วยตามข่าวที่ได้ฟังมา

賭ケグルイ – kakegurui

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

Saotome Meari

นางเอกของเราทางด้านซ้าย จาบามิ ยูเมะโกะ เป็นนักเรียนที่เพิ่งย้ายเข้ามาตอนแรกและถูกเพื่อนร่วมชั้นต้อนรับด้วยการท้าพนัน

ส่วนทางด้านขวาคือเพื่อนร่วมชั้นที่เป็นคนท้าพนันยูเมะโกะเป็นคนแรก ซาโอโตเมะ แมรี่

Half & half

เรื่องนี้เป็นเรื่องของผู้ชายคนหนึ่งที่เดินอยู่ดีๆ มีผู้หญิงอีกคนหนึ่งตกลงมาจากตึกทำให้ตายทั้งคู่ หลังจากตายไปแล้วก็มีเสียงพูดขึ้นมาว่าทั้งคู่จะกลับมามีชีวิตอีกครั้งหนึ่งเป็นเวลา 7 วันและเมื่อครบ 7 วันแล้วต้องเลือกว่าใครคนใดคนหนึ่งจะต้องตายไปจริงๆ ทั้งคู่ต้องใช้ชีวิตอยู่โดยมีประสาทสัมผัสร่วมกันทั้งหมดและไม่สามารถอยู่ห่างจากกันได้ ทำให้ทั้ง 2 คนต้องอยู่ร่วมกัน เรื่องนี้แนะนำอย่างแรงเลยครับ อ่านแล้วฟินมาก เรื่องนี้เขียนโดยอาจารย์ที่เขียนเรื่อง kimi no iru machi ซึ่งคงไม่ต้องแนะนำอะไรกันมากมาย

half & half

ตัวละครทางด้านซ้าย ยูกิ ซานาดะ เป็นคนที่ตกลงมาจากตึกลงมันทับผู้ชายสุดซวยทางด้านขวา ชินอิจิ นากาคาวะ แนะนำอีกครั้งเรื่องนี้ ต้องอ่านเลยครับ 😀