FizzBuzz Problem

FizzBuzz เป็นโจทย์ฝึกสมองเด็ก ที่ใช้ช่วยในการเรียนรู้เรื่องการหาร ซึ่งสามารถไปอ่านกฏเพิ่มเติมได้จากใน WIKI: FIZZBUZZ ครับ แต่บทความนี้ผมขอนำกฏของ FizzBuzz มาประยุกต์กับการเขียนโปรแกรม
FizzBuzz เป็นโจทย์ฝึกสมองเด็ก ที่ใช้ช่วยในการเรียนรู้เรื่องการหาร ซึ่งสามารถไปอ่านกฏเพิ่มเติมได้จากใน WIKI: FIZZBUZZ ครับ แต่บทความนี้ผมขอนำกฏของ FizzBuzz มาประยุกต์กับการเขียนโปรแกรม
วันนี้ได้ไปช่วยพี่ที่ทำงานมา ซึ่งตัวรายงานมี Layout ดังนี้ (ขอเบลอรูปนิดนึง 55) โดยโจทย์มีอยู่ว่า ชื่อของรายงาน @ReportName(หมายเลข 1 ในรูป) ขึ้นอยู่ผลรวม(SUM) ของ field #SumNetAmountGrandTotal(หมายเลข 2 ในรูป) โดยมีเงื่อนไข ดังนี้ ซึ่งในตัว Crystal Report เราสามารถเขียน formula เพื่อกำหนดการแสดงผลได้ ดังนี้ แต่เมื่อลองรัน Application และแสดงรายงานดูปรากฏว่า เงื่อนไขที่ได้กำหนดไว้ ไม่ทำงาน แล้วสาเหตุ คือ อะไร ? ลองกลับมาดูการทำงานของ Report กัน ตัว Crystal Report มีการ Render เหมือน Printer หรือถ้าในภาษาขอ Programming คือ Interpreter นี้แหละ เมื่อเรารู้ Consept การทำงานของการสร้าง Report แล้ว วกกลับมาดูที่ Layout ของ Report พบว่าส่วนของ @ReportName(หมายเลข 1 ในรูป) ถูกทำงานก่อนที่ระบบหาค่า #SumNetAmountGrandTotal(หมายเลข 2 ในรูป) ที่ถูกรวม (SUM) ก่อนอีก ? รู้สาเหตุแล้ว แก้ปัญหาอย่างไร ? เมื่อเข้าใจการทำงานของ Report ที่ทำงานจากบนลงล่างแบบ printer ดังนั้น วิธีแก้ คือ ต้องหาผลรวม(SUM) field #SumNetAmountGrandTotal ก่อนเข้าเงื่อนไข โดยแก้ไข formula ดังนี้ หมายเหตุ: จริงๆวิธีแก้ไขกับปัญหานี้มีได้หลายแบบ แต่ที่ผู้เขียนได้ยกตัวอย่างมา เพื่อให้ผู้อ่านได้เข้าใจ Consept การทำงานของ Report Writer แบบต่างๆ ซึ่งไม่จำเป็นต้องเป็น Crystal Report อย่างเดียวครับ…
หลังจากได้ Model มาแล้วสิ่งที่เราต้องทำต่อไป คือ การนำโมเดลที่ได้นั้นมาตรวจสอบความถูกต้อง และนำไปผลที่ได้ไปปรับแต่ง Model ของเราจนได้ผลลัพธ์ออกมาเป็นที่น่าพอใจแล้วนำไปทดสอบกับข้อมูลจริงๆ โดยการตรวจสอบ Model ที่ได้มานั้นมีขั้นตอน ดังนี้ เปิดโปรแกรม WEKA และทำการ load model ที่ได้ save ไว้ขึ้นมาจาก Blog ตอนที่แล้ว มาตั้ง Test Options (ไม่แน่ใจมาจาก sense เพราะมันไม่มี doc ให้อ่าน) Supplied training set: เปิดไฟล์ data ที่เราจะมา Test กับ Model <<เลือกอันนี้>> จากนั้นไปเลือกไฟล์ Customer_for_std_test ดังรูป คลิกขวาที่ Model เลือก Re-evaluate model on current test set สังเกตุผลลัพธ์ที่ได้ ดังรูป ซึ่งจะมีจำนวนที่ทำนายถูก Correctly Classified Instances 119 รายการ ซึ่งคิดเป็น 59.5% ซึ่งเราจะต้องปรับให้มันถูกเยอะๆ จนกว่าจะพอใจ เราสามารถที่จะดูผลลัพธ์ที่ระบบมันทายได้เทียบกับคำตอบ โดยคลิกขวาที่ Model เลือก Visualize Classify error จากนั้นกด save จากนั้นมาเปิดดูด้วย arffViewer ตามรูป หรือจะดูจาก Confusion Matrix ก็ได้ ถ้าเราไม่พอใจก็กลับไปทำใน หัวข้อ “สร้าง Model” และมาปรับค่าในส่วนของข้อที่ 6 และ 9 แต่ถ้าเรา OK กับตัว Model เราสามารถนำ Model ที่ได้ไปใช้งานเพื่อทำนายกับข้อมูลจริงๆได้เลยครับ 😀 การทำ Neural Network คือ…
บางครั้งเวลาเราพัฒนา Application ขึ้นมา เราอยากเก็บค่า Config บางอย่าง เช่น username ครั้งสุดท้ายที่ใช้ Log , ชื่อ Database ที่ใช้งานประจำ หรือเป็นขนาดความกว้าง ยาวของหน้าจอครั้งล่าสุด โดยอาจเราจะเก็บไว้ Text File, Registry หรือเก็บใน Project Setting ที่ทาง .Net Framework ได้เตรียมไว้ให้ โดยวันนี้ผมขอแนะนำการเก็บค่า Config ต่างๆลงใน Project Setting กันครับ คลิกขวาที่ Project File เลือก properties >> เลือกที่ส่วน Setting จากนั้นกำหนดข้อมูล Name : ชื่อ Setting Type : Data type ของ Setting โดย User สามารถกำหนดได้ว่าจะเก็บข้อมูลเป็น String, int หรือ boolean เป็นต้น Scope : ขอบเขตของ Setting นี้ว่าเป็นแบบ Application(ทีผลกับทุก user บนเครื่อง) หรือ เป็นแบบ User(แยก Config ตาม user ที่ใช้งาน) Roaming: กำหนดรูปแบบ Config ถ้า set เป็น True คือ สามารถเก็บ Config ไปใช้งานบนคอมพิวเตอร์เครื่องใดๆก็ได้บนเครือข่าย ที่มีการ Set Active Directory และกำหนด Roaming User Profiles ไว้ ยกตัวอย่างเช่น ถ้า Application ของเราทำงานบนเครื่อง Computer A โดย User…
เวันนี้เขียนโปรแกรม C# กับ SQLite อยู่ดีๆ Bulid ผ่านะ แต่ Runtime Error โดยมี Message แจ้ง ดังนี้ [A]System.Data.SQLite.SQLiteConnection cannot be cast to [B]System.Data.SQLite.SQLiteConnection. Type A originates from ‘System.Data.SQLite, Version=1.0.92.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139’ in the context ‘Default’ at location ‘C:\Users\Chatr_000\Desktop\InvConfig(AutoRegisDLL)\InvConfig\bin\Release\System.Data.SQLite.dll’. Type B originates from ‘System.Data.SQLite, Version=1.0.91.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139’ in the context ‘Default’ at location ‘C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data.SQLite\v4.0_1.0.91.0__db937bc2d44ff139\System.Data.SQLite.dll’. หลังจากไล่ Code อยู่นานพบว่าในเครื่องที่ใช้ Dev มี SQLite อยู่ 2 Version คือ 1.0.91.0 กับ 1.0.92.0 ติดตั้งอยู่ ซึ่งผมได้แก้ไขโดย ถอนการติดตั้ง SQLite Version 1.0.91.0 ออกไป ซึ่งการอัพเกรด Version ของ SQLite DLL ควรทำการ Uninstall Version แก่ก่อนลง Version ใหม่เสมอ ครับ ถ้าไม่เอาออก Registry ของ Windows มันจะมองเป็น 2 Version แก้ไขการโปรแกรมใหม่ ทั้งใน app config และ Reference ของ Project ให้ Reference ไปยังไฟล์…
หลายๆคนคงสงสัยว่า Keyword Abstract มัน คือ อะไร และเมื่อไหร่ที่ควรจะใช้ วันนี้ผมมีตัวอย่างง่ายๆในการอธิบายนะครับ โดยอาจจะแทรกเนื้อหาเกี่ยวกับ interface เพิ่มเข้าไปด้วยครับ เพราะลายคนสับสนกันเยอะ โดยผมขอเริ่มโจทย์ที่เราต้องใช้ Abstract Class ดังนี้ จงเขียน class Student ซึ่งประกอบด้วย data members ดังนี้ name (ชื่อนิสิต), test (อะเรย์ของคะแนน), NUM_OF_TESTS (ค่าคงที่เป็นจำนวนของ test) และ courseGrade (เกรดของวิชา) ให้สร้าง Constructor, methods get/set และ abstract method computeCourseGrade โดยมีวิธีการคำนวณต่างกันไปสำหรับนิสิตปริญญาตรี (UndergraduateStudent) และบัณฑิตศึกษา (GraduateStudent)ให้เขียน class UndergraduateStudent ซึ่งเป็น subclass ของ Student และ ทำการ implement method computeCourseGrade ตามเกณฑ์ต่อไปนี้คือ ถ้าคะแนนเฉลี่ย >= 70 ผ่าน (Pass) ถ้าคะแนนเฉลี่ย < 70 ไม่ผ่าน (Fail) ก่อนที่จะทำโจทย์ ผมอยากให้รู้จักคำศัพท์บางตัวก่อน Signature ของ Method คือ อะไร การกำหนดลักษณะของ Method name(ชื่อ method) + Parameter List(ตัวแปรที่จะส่งเข้าไป) Method Header คือ อะไร พูดง่ายๆ คือ Signature หรือการประกาศ Method ว่ามีซื่ออะไร รับอะไรมาบ้าง ส่วน Logic การทำงานของมันจะไปอยู่ใน Method Detail จ้า ดูตามรูปเลย จะมี pattern…
config eclipse.ini เพิ่ม Performance ให้ Eclipse ——- -startup plugins –launcher.library plugins -product org.eclipse.epp.package.standard.product –launcher.defaultAction openFile –launcher.XXMaxPermSize 384M -showsplash org.eclipse.platform –launcher.XXMaxPermSize 384m –launcher.defaultAction openFile –launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.7 -server -XX:PermSize=384m -XX:MaxPermSize=384m -Xss4m -Xms1G -Xmx1G -XX:MaxGCPauseMillis=10 -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
เมื่อเราพัฒนาระบบขึ้นมา ระบบต้องมีการโต้ตอบ หรือให้ข้อมูลต่างๆแก่ user ซึ่งถ้าเราแสดงตัวอักษรอย่างเดียวไป มันอาจจะทำให้อ่านยาก และไม่สวยงามด้วย วันนี้ผมมานำเสนอการพิมพ์ Bullet หรือจุดลิสต์รายการ เพื่อให้ข้อมูลแสดงออกมาให้ดูง่าย ดังนี้ ก่อนอีกเลย เราต้องรู้ว่าอักษร Bullet หรือ จุดนี่ มันมีค่า Unicode ค่าอะไร เมื่อประกาศค่าคงที่เรียบร้อยแล้ว เราสามารถนำใส่ต่อกับ String ที่ต้องการได้เลยครับ อันนี้ผมนำไปใช้เพื่อแสดงรายละเอียดการแก้ไขโปรแกรม หรือ change log ให้ดูได้ง่ายขึ้นนะครับ ตัวอย่างเมื่อ Run Program ครับ