[Design Pattern] Decorator Pattern in Depth

ทำไมต้องใช้ Decorator Pattern อยากเพิ่มความสามารถของ Object (Object ทำงานเหมือนเดิมนะ แต่ถูกเพิ่มความสามารถ) เมื่อไหร่ควรจะใช้ ไม่อยากใช้คุณสมบัตินึงของ OOP-Inheritance มากเกินไป เพราะใช้ไปแล้ว ก็ต้อง Override ไปแก้ความสามารถที่ได้มาจาก Class แม่อีก หรือมี Class ลูก (Sub Class) ที่มากจนเกินไปครับ ซึ่งเจ้า Decorator มันมาช่วยตรงนี้ครับ ไม่ต้องแก้ แต่เราเพิ่ม (Wrap) ความสามารถใหม่ลงไป โดยที่ความสามารถเดิม ยังคงอยู่ ลดจำนวน Sub Class ลงได้ สนับสนุนแนวคิด Open-Close Principle ด้วย Open for Extension Closed for Modification Note: ไม่บอกว่าห้ามใช้ Inheritance นะครับ ใช้ให้มันพอดี ^__^ Pattern มันเป็นอย่างไร – Class Diagram Template ตัวอย่าง มุมมองตอน Runtime – Object Diagram ลักษณะของ Object หลังถูก Create มุมมองลำดับการทำงาน – Sequence Diagram ตอนสร้าง Object ตอนคำนวณราคา Real World Example Java.IO Class ไง มีการเพิ่มความสามารถจาก FileInputStream BufferedInputStream UpperCaseInputStream – สร้างเอง Code ของ Class UpperCaseInputStream เสริมความสามารถมาจาก FilterInputStream มาดู Code กันดีว่า ว่าเพิ่มความสามารถอย่างไร ? – อ่าน TestFile ซึ่ง FileInputStream มันอ่านที่ได้ละ…

[JAVA] Install MAVAN

วันนี้มาเขียน Blog สรุปชั้นตอน การ Install MAVEN ครับ สำหรับ Windows โดยมีชั้นตอน ดังนี้ เตรียมตัว ติดตั้ง Java Development Kit(JDK) ทำการกำหนด JAVA_HOME  เรียบร้อยแล้ว ซึ่งสามารถทดสอบโดยใช้คำสั่ง java -version  ซึ่งควรได้ผลลัพธ์ D:\BPMN\BPMNModel\CU_Case\java -version java version “1.8.0_152” Java(TM) SE Runtime Environment (build 1.8.0_152-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode) Download ตัวติดตั้ง Maven จาก  โดยเลือกไฟล์ apache-maven-X.X.X-bin.zip  ดังรูป ขั้นตอนการติดตั้ง แตก zip ไฟล์ตัวติดตั้ง MAVEN  จากนั้นนำว่าไปใน Path C:\Program Files\apache-maven  โดยใช้ Path นี้ไปใช้กับ Enviroment Variable ในขั้นตอนถัดไป กำหนด Enviroment Variable โดยไปคลิกขวาที่ This PC >> Properties >> Advanced System Settings  มาที่ Tab Advance >> Enviroment Variable เพิ่ม System Variable 2 ตัว (ที่เพิ่มทั้ง 2 ตัว เพราะกันไว้ดีกว่าแก้ครับ) M2_HOME  โดยใส่ค่า C:\Program Files\apache-maven  ดังรูป MAVEN_HOME  โดยใส่ค่า C:\Program Files\apache-maven  ดังรูป กำหนดตัวแปร PATH  โดยใส่ค่า %M2_HOME%\bin ดังรูป ทดสอบใช้งาน ทดสอบด้วยคำสั่ง mvn –version  โดยมีผลลัพธืที่ได้ดังนี้ D:\BPMN\BPMNModel\CU_Case\>mvn…

[Design Pattern] Observer Pattern in Depth

คราวนี้มาเป็น Pattern ที่ 2 แล้วที่ผมเขียนในเรื่อง Design Pattern in Depth โดยตอนนี้ขอเขียนเกี่ยวกับ BNK48 แล้วกันครับ น้องเณอปราง ^___^ ทำไมต้องใช้ Observer Pattern ถ้า Design ด้านแนวคิดที่ว่า อยากรู้ให้มาถาม (Server) สิ่งที่เกิดขึ้น คือ Client ต้องคอยวิ่งมาถาม (Request) ตรวจสอบว่าข้อมูลที่ Server มัน Update ยัง … Update ยังงง ถ้าเกิดข้อมูลที่ต้องกระจายเป็นข้อมูลของวง Girl Group อย่าง BNK48 กำหนดให้เป็น Class BNK48Data ซึ่งมีหน้าที่ (Operation) Method getMemberData() – ข้อมูลสมาชิก Method getVote() – ดูผลการโหวต Method BNKDataChange() – เอาไว้ Update Data ของกับหน้าจอของ User แล้วถ้าต้องเพิ่ม Dashboard สรุป stat ที่งาน (มโนไปไกลเลยเรา 555)  คือ แก้ Code ใน Class BNK48VoteDataOld !!!!!! มาดู Class Diagram แบบแรกกันครับ !!!! เราทำอย่างไรให้ Class BNK48Data นั้น Clean ที่สุด แก้อะไรก็แล้วเพิ่มแล้ว ไม้ต้องไปสั่ง Update ให้ Client ด้วย ถ้ามีดูที่ Class BNKVoteDateOld Method BNK48DataChange() มันต้องไป Update Display ทั้ง 2…

[CUSE] ใช้ EndNote X8 จัดการรายการอ้างอิง

หลังจากได้ติดตั้ง EndNote ไปแล้ว ขั้นตอนถัดมา ลุย!!!! จัดการรายการอ้างอิงกันครับ ‘ ก่อนที่เก็บรายการอ้างอิง ต้องมี Library ไว้จัดเก็บผลงานก่อนครับ โดยมีขั้นตอนการสร้าง Library ดังนี้ สร้าง Library กันก่อนครับ ลองเก็บ Reference – ทำได้ 2 วิธี ได้แก่ นำเข้าแบบ Manual และนำเข้าจากรายการอ้างอิงอื่นๆ เช่น Text file – วิธีแรก – นำเข้าแบบ Manual – วิธีสอง – นำเข้าจากรายการอ้างอิงอื่นๆ เช่น Textfile (ที่มีการจัดรูปแบบไว้) Reference ของ Chula มีหลายลิงค์เลย ผมก็แปะทุกลิงค์ครับ

[BPMN] สรุป Step การพัฒนา BPMN Application ด้วย Camunda BPMN Engine

หลังจากได้ลอง BPMN Engine ตัว Activiti ไป ช่วงมกราคม และลองตัว jBPM ไป แต่ไม่ค่อย Work เท่าไหร่ คราวนี้มาถึงคิวของ Camunda  บ้างแล้วครับ Camunda BPMN Engine คือ อะไร ขั้นตอนการพัฒนา BPMN Application บน Camunda ติดตั้งแบบจำลอง ทดสอบใช้งานครับ Note Reference

[C#] ให้ Log4net เขียน Log แยกตาม Process Id ของ Application

Ref https://pixabay.com/th/การวิเคราะห์-ข้อมูล-นวัตกรรม-3088958/

จาก Blog ตอนก่อนของ Site ได้ Deploy ตัว .Net App ไว้ที่ Windows Server ไว้ที่ Drive C: แล้วให้ User Remote เข้ามาใช้งานครับ แต่พอเวลามีปัญหามันดัน Write Log ไม่ได้ครับ เพราะ Application ทุกตัวที่ที่รันขึ้นมา ดันเขียน Log ลงไปที่ Path และไฟล์ชื่อเดียวกันครับ ทำให้ User สามารถเปิดโปรแกรมใช้งานได้แค่ 1 Instance เท่านั้นครับ เมื่อทาง Dev ต้องการหาสาเหตุของ Defect บางข้อครับ แต่เรื่องนี้มันก็ขัดใจสำหรับ User มากๆ ที่ไม่สามารทำงานได้ครับ สำหรับทางแก้ – ใช้ Log4Net มันเขียน Log File ตาม Process Id ของ exe ที่เปิดอยู่ครับ โดยสามารถไปแก้ที่ตัว Appender ได้ ดังนี้ ของเดิม – ที่ RollingLogFileAppender เขียน Log โดยระบุชื่อไฟ์ไปตรงๆเลยครับ <file value=”C:\\Ext\\Log\\EXTENSION_LOG.txt” /> ของใหม่ – มีการปรับที่ RollingLogFileAppender ให้ Log มันเข่ียนแยกตามไฟล์ โดยใช้ Log4Net Pattern String ครับ ซึ่งมีการกำหนด Pattern จาก Process Id ของ exe ที่ เปิดอยู่ในหน้าจอ Task Manager ครับ โดยดึง Process Id…

จะคุยกับลูกค้าแล้ว เราตกลงกันภายในแล้ว หรือยัง ?

สำหรับ Blog ตอนนี้ เป็น Blog ที่บ่นถึงปัญหาที่มักพบเจอในองค์กรที่รับพัฒนาซอฟต์แวร์ และก่อให้เกิดปัญหาจนเรียกว่า End Phase ปัญหาที่ 1 : ก่อนเริ่มต้นโครงการ ตกลงกันภายในแล้ว หรือยัง ? ตัวละครที่เกี่ยวข้อง – ทุกฝ่ายที่ช่วยให้ลูกค้า ตัดสินใจซื้อสินค้า และบริการจากเรา จุดประเด็น อย่าแถ ถ้าไม่รู้จริง หรือตกลงกันก่อน เคสนี้ผมโดนมากับตัวเลยครับ 555 ก่อนที่ทีม Technical เข้าไปคุยกับลูกค้า ฝ่ายที่ต้องไปคุยก่อน คือ ทีม Marketing / Business คุยก็ลูกค้าอย่างไร ไม่รู้ เนื้องานงอกเฉย พอทีม Technical เข้าไปคุยต่อฉันตอบไปคนละทางกับทีมแรก แต่สิ่งที่ลูกค้ารู้ Fact แรกที่ได้รับมัน คือ ความจริง เรื่องของเวลา อย่ามั่ว ถ้าอยากได้โครงการ เพราะ บางครั้งการบีบเวลาที่มากจนเกินไป งานเสร็จจริง แต่คุณภาพโหลยโถ่ย แถมทีมงานลาออก สิ่งที่ทีม PM และ Marketing ควรทำ คือ หาจุดที่เหมาะสมของเวลา ไม่ใช่ทำได้เสมอ เพราะในมุมมองของฝั่ง Technical พวกคุณ ไม่ได้ทำงานดึกข้ามคืนด้วยกันนะ และทุกคนมีแผนการจัดการเวลาของตัวเอง ปัญหาที่ 2 : ทำอะไร ควรมีหลักฐาน !!! ตัวละครที่เกี่ยวข้อง – ทุกทีมที่เกี่ยวกับการพัฒนาระบบในมุมเชิงเทคนิค / เชิงธุรกิจ และเชิงการจัดการ จุดประเด็น การเก็บ Requirement ไม่ใช่หน้าที่ของทีม Marketing การประเมินขอบเขต และราคา ควรเอาทุกฝ่ายช่วยกัน อย่างโปรเจคล่าลุดที่ผมเจอ Marketing จัดการทุกอย่างทั้ง Scope / Time และ Cost แถมดันไปเขียนสัญญาปลายเปิด ทีม Technical ที่ทำ…

[DB2] มาดูขนาดของ Table และ Database กันครับ

IBM DB2

สุขสันต์วันสงกรานต์นะครับ วันที่ชาวไอทีหลายคนอาจจะยังต้องทำงานอยู่รวมทั้งผมด้วย 5555 หลังจากแก้เคสด่วนของรายงานแบงค์ชาติ LQ1 ไป คราวนี้ลองมาแอบส่อง Database บ้าง จากกันไปปีกว่าๆ แต่ทำไมชนาดที่ Backup มันดูใหญ่โตจัง 5555 โดยผมได้เขียน Query ดังนี้ครับ Query ที่เขียนขึ้นครับ สำหรับ Query นี้หลังๆ ดึงจาก Table SYSIBMADM.ADMINTABINFO ครับ โดยเอาค่าของเนื่อข้อมูล( DATA_OBJECT_P_SIZE ) + ขนาด Index( INDEX_OBJECT_P_SIZE ) + ขนาดของ Long Object (LONG_OBJECT_P_SIZE) + ขนาดของ Stream (LOB) (LOB_OBJECT_P_SIZE ) และ ขนาดของ XML(XML_OBJECT_P_SIZE) โดยที่ _P (Physical) ถ้าไปดู Schema ดีๆมี _L ที่หมายถึง Logical ด้วยครับ ผลลัพธ์ที่ได้ ที่นี้เอาเราข้อมูลมาวิเคราห์ และสร้างกราฟนำเสนอให้ผู้บริหารต่อไปได้ครับ หรือจะเอาไปวิเคราะห์ทำเป็น MA ต่อไปครับ หากใช้ Database Microsoft SQL Server สามารถดูได้จาก Blog ตอนต่อไปครับ Reference

[CR] Jones Salad Steak เพื่อสุขภาพ

ร้าน Jones Salad ร้านอาหารเพื่อสุขภาพ หลายคนคงคิดว่า มันคงมีแต่ ผัก ผัก และก็ผัก !!!! แต่ในวันนี้ ผมมานำเสนอเมนูสเต็ก สำหรับสายสุขภาพกันนะครับ โดยทางร้านมีนำเสนอมา 3 เมนูด้วยกันครับ เมนูแรก: สเต็กหมูพอร์คช๊อป ราคา 275 บาท เมนูสอง: สเต็กอกไก่แคริบเบียน ราคา 169 บาท เมนูสาม: สเต็กอกไก่ อ่าวไทย ราคา 169 บาท หมายเหตุ 3 เมนูนี้ต้องรับประทานที่ร้านนะครับ การ Review เป็นความเห็นส่วนตัวของผมเองนะครับ  

[Design Pattern] Strategy Pattern in Depth

ภาพจาก https://commons.wikimedia.org/wiki/File:John_Lavery_-_IWM_War_Room.jpg

วันนี้ Blog นี้มาเน้นทางสาย Pattern กันเยอะ เชื่อว่าหลายๆคน Copy & Paste Development มาใช้งาน แต่ก็ไม่รู้ว่า มัน คือ อะไรครับ โดย Pattern ที่ผมมาเขียนลง Blog ในวันนี้ คือ Strategy Pattern ซึ่งข้อมูลส่วนใหญ่ผมเอามาจากของ Head First นะครับ ตัวอย่างมันอธิบายได้ง่ายดีครับ ทำไมต้องใช้ Strategy ทุกปัญหามันไม่สามารถแก้ไขด้วยกับใช้เทคนิคเดิมของ OOP – Inheritance ได้ไง ? ตัวอย่าง เช่น นายเจมส์ได้รับหน้าที่ในการสร้าง Class ของ Duck (เป็ด)  โดยที่เป็ดแต่ละชนิดมีพฤติกรรมที่แตกต่างกับครับ โดยที่เรา Design ไว้ให้ใช้มีพฤติกรรมที่ Class แม่ แล้วให้ Class ลูกสืบทอด(Inheritance) ไปใช้ครับ ซึ่งพอมีชนิดของเป็ดที่หลากหลายขึ้น ดันเกิดข้อขัดแย้งต้องมา Override แก้ไขพฤติกรรมมันซะงั้น จริงๆ มันควรทำอย่างนั้นเหรอ (ลูกดื้อ เปลี่ยนพฤติกรรมของแม่) ในเมื่อ Inheritance (IS-A) มันไม่ Work ต้องเปลี่ยนมาเป็นการประกอบร่าง composition (HAS-A) เมื่อไหร่ควรจะใช้ เมื่อต้องการเพิ่ม Maintainability – เลือกประกอบสิ่งที่สนใจได้ ตอน Runtime เช่น MullarDuck ตอนอายุน้อยกว่า 14 วัน ยังบินไม่ไม่ได้นะ แต่ถ้ามากกว่านั้น เราสามารถ Set ความสามารถบิน (FlyWithWings) เพิ่มเข้าไปได้ งานชิ้นเดียวกัน แต่มีวิธีการคิด (Algorithm/Behavior) ที่หลากหลาย เช่น การจ่ายค่าโดยสารรถเมล์ ซึ่งแต่ละรุ่นมีวิธีคิดที่แแตกต่างกัน การเดินหมากรุก ซึ่งหมากแต่ละตัวตอนเดิน กับการถูกกิน มันมีกฏที่แตกต่างกันไป Keyword Interface – เป็นสัญญาว่า…