[C#] Constants Interfaces ของ Java เทียบเท่ากับอะไรใน C#

ก่อนจะมาเข้าเรื่องของ C# กันลองย้อนไปทาง Java ก่อน โดยเจ้าภาษา Java นี่ มันไม่มี Global Variables ให้ ซึ่งถ้าเราต้องการ Set ค่าคงที่แล้วต้องการให้ทุก Class เห็น และสามารถใช้งานได้ เราต้องทำ Constants Interfaces มองง่ายๆเลย คือ Interface ที่มีแต่ Constant แหละ ตามตัวอย่างเลย มาทาง C# บ้าง ทำไม่ได้ครับ (ส่วนตัว ผมคิดว่าดีที่ C# ทำไม่ได้อ่า) เพราะมันแปลกๆกับการเอา Interface มาเก็บ Const และถ้ามีการจัดหมวดหมู่เยอะนี้ implement กันตาย แถมเป็น Anti-Pattern (ตามความเข้าใจของผม Interface ควรกำหนดการทำ มากกว่าจะไปกำหนด Data และพอทำเป็น Interface มันดันกลายเป็นการทำ public API ให้ชาวบ้านเห็นอีก โดยทางฝั่ง Java เองแนะนำให้ใช้เป็น static import แทนครับ) วกกลับมาสำหรับ C# ถ้าจำเป็นต้องทำให้ทำเป็น abstract class แทนครับ ดังตัวอย่าง แต่สำหรับเคสนี้ ควรทำเป็น Static Class (ใน C# กับ Java ไม่เหมือนกันนะครับ) ทำเป็น Global Variable ดีกว่านะครับ แต่ควรวางให้มันเห็นทั้ง Solution นะครับ (พอดีเคสที่ทำงานจริงไปเจอตอเข้า เพราะ ดันไปวาง static class ให้ project A ในชั้น UI และพอจะนำมาให้กับอีก project B ในชั้น Service พวก Business…

[JAVA] Shallow Copy กับ Deep Copy

จากบทความที่แล้วนะครับ จะเป็นการใช้แนวคิด Shallow Copy กับ Deep Copy ใน .Net Framework ภาษา C# ครับ คราวนี้มาถึงตาม Java บ้างครับ เปิดมาที่ Code เลยครับ ใน Blog ผมเตรียม Class Person ไว้ โดยมี Get / Set ปกติ และทำ จริงๆ ถ้าไม่อยากเขียนแบบนี้มันมีตัว BeanUtils.copyProperties ที่ช่วยทำ Shallow Copy ให้ครับ แต่มันมีความพิสดารของ Spring / Apache Common Param มันจะสลับกันครับ Ref: Result

Shallow Copy กับ Deep Copy มีประโยชน์อย่างไรบ้าง

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

[C#] Shallow Copy กับ Deep Copy

จากบทความตอนที่แล้ว ความแตกต่างระหว่าง Shallow copy กับ Deep copy คราวนี้เรามาลองดูการใช้งานจริงในภาษา C# บ้างนะครับ สำหรับวิธีการ Copy Object ใน C# มีวิธีที่สามารถทำได้ทั้งหมด ดังนี้ Implement Interface ICloneable MemberwiseClone Reflection Serialization สำหรับวิธีการนี้ ถ้าเป็น .NET Core 5 ไม่สามารถใช้งานได้แล้วนะครับ และถูกเอาออกถาวรใน .NET9Ref: Deserialization risks in use of BinaryFormatter and related types – .NET | Microsoft Learn Intermediate Language (IL) อ่านกันมาจนจบและ จะเห็นว่ามีหลากหลายวิธีนะครับ ในการ Copy Object ซึ่งใน C# รุ่นใหม่ตั้งแต่ 3.5 เป็นต้นไปมั้ง สามารถทำเป็น Extension Method (เป็นการเพิ่มความสามารถใช้กับ Object นั้น เวลาใครเอาไปใช้ Method พวกนี้ก็จะติดไปด้วยครับ) อ๋อและก็ส่วนตัวผมใช้ แบบ MemberwiseClone กับ Serialization(ถึงแม้จะช้า แต่มันก็ต่างกันไม่มากครับ ละก็ไม่เจอปัญหา Partial Trust Environments ด้วยครับ โดยทำเป็น Extension Method แหละง่ายดี ^___^

ความแตกต่างระหว่าง Shallow copy กับ Deep copy

วันนี้ผมขออธิบายคำศัพท์ 2 คำที่เกี่ยวกับการ Copy Object ครับ Shallow copy Shallow copy คือ การ Copy Object โดยที่ข้อมูลยังมี Reference เชื่อมโยงกันในหน่วยความจำครับ ดังรูป Deep copy  Deep copy การ Copy Object โดยสร้างอีก Object หนึ่งเลย โดยไม่มี Reference เชื่อมโยงกันในหน่วยความจำครับ ดังรูป สำหรับ Blog ในตอนต่อไปเป็นการแสดงตัวอย่างการ Copy Object ในภาษา Java และ C# ครับ สุดท้ายนี้ครับ เวลาเขียนโปรแกรม สิ่งที่เราต้องรู้ คือ Concept แนวคิดของแต่ละภาษาครับ เพราะเราจะเขียนได้ แต่ไม่สามารถพูดได้เต็มๆปากนะครับ ว่าเราสามารถเขียนเป็น เข้าใจ และมี Performance ดีครับ

[DB2] เรียง ID ของแถวตามเงื่อนไขด้วย Function ROW_NUMBER()

IBM DB2

จริงๆช่วงนี้มีอะไรให้เขียน Blog ได้หลายตอนครับ แต่เวลา และปริมาณงานนี่สิไม่เคยพอ เข้าเรื่องเลยดีกว่า ตอนนี้ผมมีหน้าจอนึง ซึ่งแต่ละแถวใน Grid จะมี Column ซ่อนไว้ ชื่อ “SEQNO” เอาไว้เป็น Key คู่กับ Column “COMPANYID” เพื่อเอาไปใช้อ้างอิงในหน้าจออื่นๆที่เรียกใช้งาน ตอนแรกดูเหมือนว่า IDEA นี้น่าจะดี แต่มันมีสิ่งที่ผิดพลาดเรื่องนึงครับ คือ Column “SEQNO” แทนที่มันจะ Auto Increment มันดันเอา Mx + 1 ครับ มันเลยเกิดปัญหาที่ว่า ถ้า User มีข้อมูลใน Grid 4 แถว Column “SEQNO” เรียง 1 ถึง 4 ตามลำดับ จากนั้นลบข้อมูลในแถวที่ 4 หละ แล้วเพิ่มข้อมูลใหม่ แถวใหม่ควรจะได้  “SEQNO” เป็น 5 แต่ระบบเดิมดันกำหนด “SEQNO” เป็น 4 มาให้แทนทำให้หน้าจออื่นที่เคยมีการอ้างอิงเอารายการที่ 4 ไปใช้ แสดงผลผิดครับ หลังจากทราบที่มาของปัญหาแล้ว ผมเข้ามาจัดการเก็บกวาดงานของคนเก่าปรับ Code เรียบร้อยและ แต่ปัญหา คือว่า ข้อมูลเหล่านี้ลุกนำขึ้นเตรียมสำหรับ UAT และ Migrate ต่อไปครับ ซวยละที่นี้ ผมต้องปรับข้อมูลเหล่านี้ให้ถูกต้องก่อนระบบขึ้น Production ครับ โดยคำสั่งที่ผมเอามาใช้ในการจัดการข้อมูลเหล่านี้ คือ ROW_NUMBER() มีหน้าที่ในการ Generate ตัวเลขขึ้นมา โดยสามารถกำหนดเงื่อนไขได้จากคำสั่ง OVER โดยมีรายละเอียด ดังนี้ อธิบายคร่าวๆไปแล้ว ลองมาดูตัวอย่างกันดีกว่าครับ Reference

ความเข้าใจผิดเกี่ยวกับ Open Source

ที่มาจาก http://opensource.com/sites/default/files/styles/image-full-size/public/images/law/OSCD_MPL2_520x292_FINAL.png?itok=2-otV3Z_

หลายคนอาจจะมองว่า Open Source เป็นของฟรี ถูกครับ แต่ยังุถูกไม่หมดครับ เพราะมองง่ายๆ ว่าใช้ฟรี แต่ถ้าเอาไปพัฒนาต่อก็ต้องดูสัญญาตามนี้นะครับ โดยผมขอสรุปเท่าที่ผมรู้บางตัวนะครับ GPL-GNU (General Public License) LGPL (Lesser General Public License) BSD(Berkeley Software Distribution License),MIT(Massachusetts Institute of Technology License) Apache License หมายเหตุ: ถ้าเอา Library ในกลุ่มพวกนี้มาใช้ควรศึกษากฏให้ดีด้วยนะครับ โดยเฉพาะตัว GPL และที่สำคัญควรให้เกียรติกับทีมงานที่พัฒนา Library ที่เราเอามาใช้ด้วยการอ้างอิงไว้ด้วยนะครับ ที่ต่างประเทศพลาดที่นี้ฟ้องกันจนเจ๊งเลยนะครับ References

[DB2] Auto Increment

IBM DB2

ดอง Blog ไว้นาน เนื่องจากถึงโค้งสุดท้ายของ Project Treasury ที่ได้ทำกับทางออมสินแล้ว วันนี้ขอเขียนต่อให้เสร็จเลยและกัน จะได้ไปเก็บตัว DataSet ต่อ สำหรับคนที่ใช้งาน DB2 อาจจะสงสัยว่ามันมี Auto Increment แบบ MySQL หรือป่าวครับ คำตอบมีครับ โดยสามารถกำหนดเพิ่ม ดังนี้ครับ โดยคำสั่งข้างต้น คือ การกำหนดให้ระบบสร้างตัวเลขที่ UNIQUE(IDENTITY) ทุกครั้ง โดยให้เริ่มจาก 1 และเพิ่มขึ้นที่ละ 1 ครับ สำหรับตัวอย่างคำสั่งเต็มที่ใช้งานจริมี ดังนี้ครับ โดยเป็นการกำหนดให้ Column ID เป็นแบบ Auto Increment ครับ สำหรับการ import ข้อมูลด้วย DB2MOVE แนะนำให้เลือก Option ตอน Create Table เป็น GENERATE BY DEFAULT แทน GENERATED ALWAYS เพราะ GENERATE BY DEFAULT สามารถยอมให้เอาข้อมูล import เข้า Table ได้ แต่ต้องไป SET ค่า Auto Increment ใหม่ ด้วยคำสั่ง แต่ถ้าอยากจัดการเองทั้งหมดสามารถใช้ GENERATEDOVERRIDE ได้

[DB2] BAT Script สำหรับ Restore DB

IBM DB2

ช่วงนี้มี UAT และต้องการนำ DB จาก SITE งานมาขึ้นที่ Environment ของบริษัทครับ โดยผมได้เขียนโครง BAT Script ง่ายๆ และก็ให้พี่ที่ทำงานปรับปรุงต่อนิดหน่อย โดยมีสาระสำคัญ ดังนี้

สอบ CU-TEP ครั้งแรก

ทำงานมาสักพักและ เริ่มได้แนวทางของตัวเองแล้วว่าจะไปต่อไปด้าน Software Engineer หรือ Business Software Development ครับ สิ่งที่ทำถัดมา คือ เตรียมตัวสอบอะไรที่จำเป็นก่อนครับ สำหรับผม คือ การสอบ CU-TEP เพราะมันต้องใช้ยื่นสอบปริญญาโท ม. จุฬา หรือ จะไปเทียบเข้ามหาวิทยาลัยอื่นก็ได้ครับ ช่วงแรก สมัครสอบ ช่วงที่สอง เตรียมตัวสอบ ช่วงที่สาม สอบครับ ช่วงสุดท้ายประกาศผลสอบครับ