[DB] การออกแบบฐานข้อมูลที่ 1 Table Column เยอะๆ กับ หลาย Table แต่ต้อง Join อันไหนดีกว่ากัน

จริงๆ เรื่องนี้มันเป็นคำถามที่โลกแตกมากๆครับ ตอนที่เรียน Database Design มาการทำ Normalize จนถึง 3์NF หรือแบบสูดๆหน่อยก็ 6NF แล้วพอมาทำงานจริงเจอ 1 Table รวมมิตรสารพัดอย่าง แต่จริงๆแล้วเราควร Design เป็นแบบไหนหละ ?

จริงๆ เรื่องการออกแบบ Database มันส่งผลกับสถาปัตยกรรมของระบบนะ

รู้จักกับข้อมูลที่ต้องการจัดเก็บก่อน ?

  • ลักษณะการใช้งาน มันมีพฤติกรรมแบบไหนนะ ?
  • ต้องการให้ข้อมูลมันตรงหลังตาม ACID หรือป่าว ?

Solution ที่เป็นไปได้จากคำถามก่อนหน้า !!!!

  • เน้นสำหรับออกรายงาน หรือ Warehouse
    • พฤติกรรมของ TABLE เป็น READ เยอะ / INSERT เยอะ และควรจะ DELETE น้อยครั้ง
    • ออกแบบตารางในลักษณะของการทำ Warehouse ได้ครับ (จริงๆ คือ Unnormalized ครับ ลดกาาร Join)
    • ถ้าทำแบบนี้ได้ Performance ในส่วนของ Index จะดีครับ
  • เน้นสำหรับจัดการ Transaction ที่มีการเปลี่ยนบ่อย
    • พฤติกรรมของ TABLE เป็น INSERT, READ และ UPDATE เยอะครับ
    • อันนี้แนะนำให้ออกแบบตารางให้อย่ในรูป 3NF ก็พอครับ ส่วนพวกที่ต้อง Join เพิ่ม หรือ ข้อมูลที่ต้องดึงมาใช้งานด้วย อาจจะใช้วิธีของการทำ Cache ช่วยครับ
  • ที่สำคัญต้องแยก
    • Database Table ที่ทำ Transaction  กับที่เป็น Warehouse  ออกจากกัน
      • เพื่อป้องกันปัญหา เรื่อง Concurrent Access และ Deadlock ได้
      • เป็นไปได้ควรแยกให้อยู่ DataFile คนละอัน และ Disk คนละก้อนครับ พอแยกกันคนละอัน การ Access สามารถทำแยกจากกันได้อย่างอิสระมากขึ้นครับ
    • มองให้ออกว่าเราสนใจการจัดการข้อมูล หรือสนใจเรื่องการนำเสนอข้อมูลครับ เพราะ ถ้าแยกไม่ออกแล้ว ไปๆมาๆ
      • งานที่อย่างกองไปที่ Database ฉันรับมันไว้เอง
      • Query ที่ได้ โคตรซับซ้อน และถ้าข้อมูล เราต้องทำ Index แต่ถ้า Index มันเยอะไปหละ พื้นที่ที่ใช้ก็เยอะ Insert + Update ช้าลงอีก

ข้อมูลเยอะ เราควรให้ Business Logic ไปไว้ที่ไหนหละ

  • จริงๆแล้ว งานมันควรเน้นให้ Database ช่วยให้ได้มากที่สุดครับ ถ้า Software Product นั้นรองรับ Database แค่เจ้าเดียวเท่านั้นนะครับ
  • แล้วงานระดับไหนที่เหมาะกับ DB หละ
    • งานที่คำนวณที่ไม่ซับซ้อนมาก และไม่ควรถึงต้องเขียน Store Procedure ที่ซับซ้อนมาก
    • จัดการข้อมูลที่ไม่ Dynamic ถ้าทำ Pivot หรือ พวก Cross Tab งานนี้ Dabase มันเก่ง แค่ SELECT * FROM TABLE หรือ VIEW ที่มันรู้จักครับ
  • แต่ถ้า Software Product นั้น ต้องรองรับการใช้งาน Database ของหลายๆค่ายแล้ว

    ผมแนะนำให้ทำที่ Application ครับ เพราะ Maintain ได้ง่ายกว่า

    • ถ้าต้องเอางานมาทำที Appliation แล้ว Algorithm สำคัญมากครับ และอย่าลืม CPU กับ RAM เอามาใช้งานให้คุ้มนะครับ Design Software ให้รองรับพวก Thread ครับ ^___^
    • และที่สำคัญ ถ้า Logic แยกมาอยู่ที่ Application แล้ว มัน Design ให้สามารถ Test ได้ง่ายครับ

ปิดท้ายด้วย Normalized form จากแบบที่ไม่ระเบียบ มาจนมีระเบียบมากขึ้นครับ

  • Denormalization
  • UNF – Unnormalized form
  • 1NF – First normal form
  • 2NF – Second normal form
  • 3NF – Third normal form
  • EKNF – Elementary key normal form
  • BCNF – Boyce–Codd normal form
  • 4NF – Fourth normal form
  • ETNF – Essential tuple normal form
  • 5NF – Fifth normal form
  • 6NF – Sixth normal form
  • DKNF – Domain/key normal form

[UML] ตัวอย่าง Deployment Diagram สำหรับการใส่ Load Balance / Firewall และ High-Availability Database

ลองมากำหนดโจทย์กันดีกว่า อยากสร้าง Deployment Diagram โดยของ wong wian เว็บหาของกินท่ี่ใหญ่ที่สุด ในยุค 4.0 นี้ โดยกำหนดว่า

  • Client – มีทั้ง PC และ Mobile โดยเน้นให้เข้าระบบผ่าน Google Chrome
  • ก่อนที่ Request เข้ามายังระบบต้องมี Firewall โดยในที่นี้กำหนดเป็น Hardware เพื่อกรอง Request จากผู้ที่ประสงค์ร้ายออกไปได้
  • Load Balance – เพื่อให้รองรับได้อย่างน้อย 100,000 Request (เครื่อง App Server สามารถรองรับได้ เครื่องละ 30,000 Request)
  • Database Server – มี 2 เครื่อง Master และ Secondary โดยถ้าเครื่อง Master เกิดปัญหา เครื่อง Secondary สามารถทำงานได้ทันที

วาดรูปกัล โดยผมใช้ตัว Visual Paradigm ครับ

หมายเหตุ

  • มันมีบางที่ให้ดึงเอา Web Server(Public Access) แทรกไว้ก่อน Firewall นะครับ แต่สำหรับผม ผมมองว่า Firewall มัน Config ได้อยู่แล้วครับ ว่าให้ Allow Port ไหนบ้างครับ เลยวางไว้เป็นส่วนแรกสุดที่รับ Request มาจาก Client ครับ ^___^

[Analysis] ลองมาดูตัวอย่างจริง ของการนำ Analysis Pattern ของ Peter Coad กัน

จาก Blog ตอนก่อนที่ได้เขียนเกี่ยวกับ Analysis Pattern ของ Peter Coad ไปเมื่อนานมากแล้ว คราวนี้ลองมาดูกันว่า ถ้ามีโจทย์จริงๆ แล้วเราสามารถเอา Pattern มาประยุกต์ใช้งานได้เร็วแต่ไหนกันครับ เอาหละมาดูโจทย์กันได้เลย โดยโจทย์มีอยู่ว่า

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

ลองเอา Pattern ของ Peter Coad มาปรับใช้หละ ภาพที่ได้เป็นอย่างไร เอ้าลอง 1..2..3

แล้วมันมาจากไหนหละ มาดูคำตอบกันครับ

มีแต่ Pattern ของ Peter Coad เต็มไปหมดเลยครับ ^___^ มันมีประโยชน์นะครับ เห็นไหมว่าตอนนี้ ถ้าเราจับ Pattern ของปัญหาได้ สิ่งที่ได้ในตอนนี้ คือ Draft Analysis Class Diagram ครับ ถ้าดูจากรูปยังขาดอีกหลายส่วนของ อาทิ เ่ช่น

  • Attribute
  • Method
  • Multiplicity เป็นต้นครับ

 

[IT] แก้ปัญหา Remote Desktop ขึ้น CredSSP Encryption Oracle Remediation

หลังจากเครื่อง User ได้ Windows Update มาปุ๊บ ลองใช้ Remote Desktop อ้าวขึ้น Error ซะงั้นครับ

ถึงแม้ว่าจะเป็นงานที่ IT Support ต้องทำ แต่อะไรก็ตามที่เกี่ยวกับ IT ตัว DEV และ Programmer รับเละเหมือนกันครับ T___T เอาหล่ะมาดูที่ละปัญหาดีกว่า

CredSSP Encryption Oracle Remediation คือ อะไร

  • ก่อนที่จะแก้ไขอะไร เราต้องรู้จักกันก่อนครับ ตัว CredSSP เกิดจากช่องโหว่ความปลอดภัยเบอร์ CVE-2018-0886 ครับ ซึ่งช่องโหว่ CredSSP ซึ่งส่วนหนึ่งของ Authentication Provider สามารถทำให้เครื่องของผู้ถูกโจมตีจากระยะไกล โดยที่ไม่ได้รับอนุญาตได้ครับ และผู้โจมตีโจมตีใน Session ของผู้ใช้งานที่ใช้งานระบบอยู่ครับ เช่น Remote Desktop แต่ทุกคนไม่ต้องหวาดระแวงไปครับ ตอนนี้ทาง Microsoft ได้ออก Patch มาแล้วครับ ถ้าเป็น Windows 10 เป็น April Update 1803 นี่เองครับ
  • ผลข้างเคียงจาก Windows Update คือ ทำให้เครื่องปลายทางที่ยังไม่ได้ Update Security Patch เราจะไม่สามารถทำอะไรได้เลย เช่น Remote Desktop ไปเครื่องปลายทาง ครับ

การแก้ไขแบบยั่งยืน

  • Update Security Patch ที่เครื่องปลายทางครับ

ทางแก้ไขแบบชัวคราว

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

    • เปิด Local Group Database Policy โดยใช้คำสั่ง WIN + R จากนั้นพิมพ์คำสั่ง  gpedit.msc  แล้วกด Enter
    • เลือก Computer Configuration > Administrative Templates > System > Credentials Delegation
    • เลือก Encryption Oracle Remediation
    • กำหนดค่าเป็น Enable
    • จากนั้น Protection Level to Vulnerable จากนั้นกด OK ครับ

ส่งท้าย – การปรับ Config ของ Encryption Oracle Remediation ให้เป็น Vulnerable นันหมายถึงว่าเครื่องของคุณยอมรับความเสี่ยงที่จะถูกโจมตีนะครับ ถ้าใช้เสร็จแล้วรีบแก้ไข Config คืนด้วยนะครับ

[Design Pattern] Command Pattern in Depth

อันนี้น่าจะเป็น Paatern ที่ 4 ที่เขียนกันครับ

ทำไมต้องใช้ Command Pattern

  • ต้องการเชื่อมของหลายๆสิ่งเข้าด้วยกันได้ เช่น Remote กับเครื่องใช้ไฟฟ้า แต่ละอย่างในบ้าน เช่น หลอดไฟ, พัดลม หรือ ทีวี ที่มีลักษณะการทำงานคล้ายๆกัน เช่น เปิด(ON) หรือป ปิด(OFF) เป็นต้น แต่ไม่อยากให้มันผูกแน่นกันจนเกินไป
  • มาดูโจทย์ของเราดึงกว่า โดยผมรับ Requirement มาว่าให้ได้ออกแบบ Application ETradeStock อันนึงที่สามารถส่งคำสั่งไปที่ตลาดหุ้น SAT ซึ่งสำหรับ SAT มี API อยู่ 2 เจ้าครับ ได้แก่ DSC และ FWD
    • สิ่งที่ต้องการ คือ ทำอย่างไรก็ได้ให้ Application ของเรา สามารถส่งคำสั่งซื้อ-ขาย หลักทรัพย์ไปยังตลาดหุ้น SAT โดยที่ใช้ API ของ DSC และ FWD ได้ พร้อมทั้งรองรับการเพิ่ม API ได้ในอนาคตครับ

เมื่อไหร่ควรจะใช้

  • ต้องการสร้างสื่อกลางระหว่าง Control (คนสั่ง) กับ Receiver(คนทำตาม) แต่ไม่อยากให้ Controller รู้จักกับ Receiver มากนัก (อารมณ์เหมือนพวกแก๊งมาเฟีย ลูกน้องไม่รู้หรอกว่าใครสั่ง แต่ต้องทำตาม) สิ่งที่ต้องทำ คือ เพิ่มสื่อตรงกลางขั้นมา ซึ่งมัน คือ คำสั่ง (Command)
  • ต้องการเชื่อม Controller กับ Receiver แม้ว่าตัว Receiver ของแต่ละค่ายมันมี API เชื่อมต่างกันก็ตาม (ส่วนตัวมองว่าเป็น Special Case ของ Adapter Pattern นะ ตัว Command  == Adapter) เช่น
    • Event ระหว่าง Control ต่างๆ(คนสั่ง กับพวก Handler(คนทำตาม) มี่ Object Event มาเป็น Command
    • การเก็บ Log แม้ว่าจะเป็น Log ต่างๆค่ายกัน ถูกหุ้มด้วย Command แบบเดียวกัน
    • การ Implement ของ CallBack ในภาษากลุ่ม OOP
  • จากโจทย์ตัวอย่างของ Application ETradeStock มาแยกดีกว่าว่าแต่ละ Object เป็นอย่างไร
    • Control – ETradeStock
    • Receiver – DSCTradeService, FWDTradeService
    • Command – อันนี้ เป็นสิ่งที่ต้องเพิ่มครับ โดยระละเอียดดูได้จาหัวข้อถัดไปครับ

Pattern มันเป็นอย่างไร – Class Diagram

  • Template
  • Class Diagram จากโจทยฺ์ – ที่ผมแยกเป็น 2 แบบ เพราะ ถ้า Class Diagram จริงๆ บางทีอาจจะละตัว Invoker ไปเป็น Method ได้ครับ

มุมมองตอน Runtime – Object Diagram

  • Control >> Command >> Receiver

มุมมองลำดับการทำงาน – Sequence Diagram

  • แบบที่ใส่ตัว Invoker
  • แบบที่ไม่แสดงตัว Invoker

[MSSQL] รู้หรือไม่ว่า WHERE IN (มันมีข้อจำกัดนะ)

พอดีลองพัฒนาโมดูล Compliance ขึ้นมาใหม่ และลองทำ Stress Test ดูว่า ระบบมันรองรับได้มากที่สุดแค่ไหน โดยลองส่ง Portfolio ทีมีหลายร้อย Port เข้ามาตรวจดู ปรากฏว่าเจอ Exception ดังรูป

ถ้ามาดู Exception Message แบบละเอียดหละ

ซึ่งสาเหตุของมันเกิดจาก SQL ในส่วนของ WHERE IN (มันมีข้อจำกัด สำหรับ Microsoft SQL Server สามารถใส่ข้อมูล เข้าไปได้มากที่สุด 2100 ตัวเท่านั้น) โดยตัวอย่าง SQL IN เป็นแบบนี้

แล้วจำนวนเท่าไหร่ ถึงเหมาะสม

  • อันนี้ผมก็ตอบไม่ได้ครับ แต่ถ้าผมเป็นคนพัฒนาระบบ ผมเลือก Database ที่ต้องใช้ เช่น Oracle. MSSQL และ DB2 หาข้อจำกัดของมัน แล้วเลือกค่าที่น้อยที่สุดครับ ถ้า Parameter ที่ส่งมามันเกิน เราก็แอบสลับแบาง แล้วค่อยๆ ดึงข้อมูลออกมานะ

แล้ว Database ของเจ้าอื่นๆ มีข้อจำกัดที่เท่าไหร่

  • Oracle ได้จำนวน 1,000 Parameter
  • DB2 ได้จำนวน 1,000 Parameter
  • MSSQL ได้จำนวน 2,100 Parameter

 

[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 มันอ่านที่ได้ละ 1 byte / โดยให้อ่านมาเป็น Stream ที่ละ 8192 byte ใช้ BufferedInputStream ลด Operation ที่แสนหนักหน่วงไป และอ่านให้แปลงตัวอีกษรให้เป็นตัวพิมพ์ใหญ่ (UpperCase) จาก UpperCaseInputStream

[JAVA] Install MAVAN

วันนี้มาเขียน Blog สรุปชั้นตอน การ Install MAVEN ครับ สำหรับ Windows โดยมีชั้นตอน ดังนี้

เตรียมตัว

  • ติดตั้ง Java Development Kit(JDK)
  • ทำการกำหนด  JAVA_HOME  เรียบร้อยแล้ว
  • ซึ่งสามารถทดสอบโดยใช้คำสั่ง  java -version  ซึ่งควรได้ผลลัพธ์
  • Download ตัวติดตั้ง Maven จาก http://maven.apache.org/download.cgi#Installation โดยเลือกไฟล์  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  โดยมีผลลัพธืที่ได้ดังนี้

 

[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)
    1. Method getMemberData() – ข้อมูลสมาชิก
    2. Method getVote() – ดูผลการโหวต
    3. 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 เอง ตาม Code ดังนี้

เมื่อไหร่ควรจะใช้

  • ตอนที่จำเป็นต้องกระจายข้อมูลเยอะให้กับผู้รับที่มีจำนวนเยอะมากๆ (ONE TO MANY) อาทิ และไม่อยากให้ Server รับภาระให้การ Push ข้อมูลไปที่ Client เมื่อมีการเปลี่ยนแปลง เช่น
    • ตลาดหุ้น ต้องการส่งการแจ้งเตือนของราคาตลาดที่เปลี่ยนแปลง ไปยังโปรแกรม Trade หุ้นที่ได้ลงะทะบียนไว้ (Subscribe)
    • วงไอดอล BNK48 ต้องการแจ้งเตือนข้อมูลการออก Event ในแต่ละวันให้กับเหล่าโอดะที่ติดตามอยู่
  • สิ่งที่ได้ –  ลด coupling ระหว่าง class เพราะไม่ต้องรู้ว่ามีตัว Observer ทั้งหมดกี่รูปแบบ

Pattern มันเป็นอย่างไร – Class Diagram

  • ใช้ Observer แล้วเป็นอย่างไร มาดูกัน ภาระของ Subject BNK48VoteData ลดลงไปครับ
  • ส่วนประกอบที่สำคัญกันบ้าง
    • Subject – แหล่งข่าว (ONE)
    • Observer – ผู้สังเกตุการณ์ (MANY)

มุมมองตอน Runtime – Object Diagram

  • อันนี้ไม่ขออธิบายเยอะครับ รูปมันบอกอยู่แล้ว

มุมมองลำดับการทำงาน – Sequence Diagram

  • ตอน Register Observer ถ้าดูจาก Code ด้านล่างเป็น Method registerObserver(Observer o)
  • ตอน Notify
  • ตอน Notify – อันนี้ใช้ Loop เพราะถ้าของจริง คงไม่มี Display แค่ 2 อันครับ ถ้าดูจาก Code ด้านล่างเป็น Method notifyObservers()

ปิดท้ายด้วย Source Code (อาจจะรันไม่ได้ Code เทพ No Complier 5555) เพื่อให้เห็นภาพรวมตาม Sequence Diagram

  • ส่วนของ Subject
  • ส่วนของ Observer

หมายเหตุ

  • ทำไปทำมา ไม่น่าตั้วชื่อ Class เป็น BNK48 เลย มันดูเฉพาะเจาะจงมาก น่าจะปรับเป็น Class MemberVoting แทน จะได้เอาไปใช้กับหลายๆกรณีที่คล้ายคลึงกันครับ

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

หลังจากได้ติดตั้ง EndNote ไปแล้ว ขั้นตอนถัดมา ลุย!!!! จัดการรายการอ้างอิงกันครับ

  • ก่อนที่เก็บรายการอ้างอิง ต้องมี Library ไว้จัดเก็บผลงานก่อนครับ โดยมีขั้นตอนการสร้าง Library ดังนี้

สร้าง Library กันก่อนครับ

  • เข้าไปที่เมนู File >> New สร้าง Library ก่อนครับ
  • ตั้งชื่อ และเลือกที่จัดเก็บครับ

    • ขอผมเลือกเก็บไว้ Drive D: กันเหนียว เผื่อคอมพังครับ อย่างผมตั้งชื่อ  CUThesis.enl  ครับ
  • จากนั้นก็จะได้ Library มาแล้วครับ คราวหน้าเวลาจะไปเปิดเครื่องอื่น เอาไฟล์  .enl  ไปใช้ได้เลยครับ

ลองเก็บ Reference – ทำได้ 2 วิธี ได้แก่ นำเข้าแบบ Manual และนำเข้าจากรายการอ้างอิงอื่นๆ เช่น Textfile

  • วิธีแรก – นำเข้าแบบ Manual
    • เมนู Reference >> New Reference
    • เลือกเมนูชนิดของสื่อ (Reference Type) อย่างตอนนี้ผมเลือกแบบ Web Page ครับ
    • กรอกข้อมูลที่จำเป็นให้ครบครับ
    • จากนั้นเลือกเมนู File >> Close Reference ครับ
    • เมื่อมาที่หน้าจอ เราเห็นว่ามันมี แถบ Preview ด้านขวามือด้วย ถ้าสนใจ Output Format แบบอื่นๆ สามารถเลือกได้เลยครับ อย่างในตอนนี้ผมเลือกเป็นแบบ Numbered ครับ
  • วิธีสอง – นำเข้าจากรายการอ้างอิงอื่นๆ เช่น Textfile (ที่มีการจัดรูปแบบไว้)

 

Reference ของ Chula มีหลายลิงค์เลย ผมก็แปะทุกลิงค์ครับ