[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 ง่ายๆ และก็ให้พี่ที่ทำงานปรับปรุงต่อนิดหน่อย โดยมีสาระสำคัญ ดังนี้ ขั้นแรก โครงสร้างโฟลเดอร์ทีมี WAITING เอาไว้ใส่ไฟล์ DB ในรูปแบบ Zip ไฟล์ โดยข้างในมีไฟล์ Script ที่จำเป็นในการสร้างฐานข้อมูล และมีโฟลเดอร์ย่อย DBDATA ที่เก็บข้อมูล Back ของฐานข้อมูลในรูปแบบ .ixf ที่ Export มาจากเครื่อง AS400 ARCHIVE เอาไว้เก็บไฟล์ .Zip Restore เข้า DB เสร็จแล้ว ขั้นที่สอง กำหนด Step การทำงาน ดังนี้ กวาดหาไฟล์ .Zip ที่วางไว้ในโฟลเดอร์ WAITING เตรียมค่า Setting สำหรับส่ง E-mail ตรวจสอบว่ามีไฟล์ในโฟลเดอร์ WAITING  ว่ามี หรือไม่ ถ้าไม่มีก็ไม่จำเป็นต้องทำงานต่อ แค่ถ้ามีข้อมูล จะมี Step การทำงาน ดังนี้ ลบไฟล์ Result ที่เอาไว้เก็บผลลัพธ์ของการ Restore DB แตกไฟล์ .Zip ออกมา โดยของผมใช้ 7Zip เพราะมันฟรี Run Script และ Import ข้อมูล ย้ายไฟล์ที่ทำงานเสร็จ จากไฟล์ที่ Process อยู่ ไปยังโฟลเดอร์ ARCHIVE ทำการส่ง E-Mail ผ่านจาก STMP โดยใช้ Stunnel และ Blat ครับ ไฟล์ BAT Script ที่ได้มี ดังนี้ครับ (อย่าลืมเอา Comment ภาษาไทยออกก่อนนะครับ) ขั้นที่สาม เอาไฟล์…

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

ทำงานมาสักพักและ เริ่มได้แนวทางของตัวเองแล้วว่าจะไปต่อไปด้าน Software Engineer หรือ Business Software Development ครับ สิ่งที่ทำถัดมา คือ เตรียมตัวสอบอะไรที่จำเป็นก่อนครับ สำหรับผม คือ การสอบ CU-TEP เพราะมันต้องใช้ยื่นสอบปริญญาโท ม. จุฬา หรือ จะไปเทียบเข้ามหาวิทยาลัยอื่นก็ได้ครับ ช่วงแรก สมัครสอบ ใจเย็นๆ เพราะระบบมันก็มีอายุพอสมควรครับ อารมณ์เหมือนตอนลงทะเบียนใจเย็นๆ รอได้ก็รอครับ ตอนสมัครสมาชิกต้องกรอกข้อมูลให้ตรงกับบัตรประชาชนของเรานะครับ พวก ชื่อ-นามสกุล เลขประจำตัวบัตรประชาขน เพราะข้อมูลพวกนี้ มันใช้ยืนยันตัวเราตอนเข้าสอบครับ และเมื่อสมัครได้แล้ว อย่าลืมจ่ายเงิน และเก็บหลักฐานไว้นะครับ ช่วงที่สอง เตรียมตัวสอบ สำหรับมนุษย์เงินเดือนอย่างเราๆ ที่ไม่มีเวลาเตรียมตัวมาก ผมมีแพลนแนะนำครับ ข้อสอบช่วงแรก Listening ครับ มีข้อแนะนำ ดังนี้ ฟังวิทยุภาษาอังกฤษครับ อย่าง FM 88 ก็ได้ครับ เพราะมีข้อมูลหลากหลายพอสมควรทั้งข่าวสารบ้านเมือง โฆษณา เป็นต้นครับ ฟังไปเรื่อยตอนนั่งรถครับ เอาให้มันชินหู พอจะแกะคำได้ครับ ถ้าสงสัยเปิด Line Dictionary เป็นต้นครับ ข้อสอบข่วงที่สอง Reading มีข้อแนะนำ ดังนี้ พวก Passage สั้นยาวอะไรก็แล้ว แต่เวลาว่างๆ ระหว่างเล่น FB ในรถเมล์ตอนไปทำงานครับ ใช้เวลาวันละ 20-30 นาทีต่อวัน(อย่างกับทำงานผ่านเนต 555) ระหว่างเดินทาง รอข้าวก็ได้ครับ ลองมาอ่านบทความจากเว็บ หรือเพจเหล่านี้ครับ (มีเสียงให้เราฝึกฟังด้วยนะครับ) VOA Learning English: FB Page, WWW Bangkok Post Learning: FB Page, WWW ลองอ่านบทความสั้นๆ ค่อยๆขยับขยายไปครับ แต่ในข้อสอบจริงยาวเกือบ 1 A4 นะครับลองอ่านมาเยอะๆนะครับ หา Main Idea,…

[DB2] SQL1035N The operation failed because the specified database cannot be connected to in the mode requested. SQLSTATE=57019

IBM DB2

ช่วงนี้ต้องเอา DB จาก Site มาทดสอบที่บริษัททุกวันครับ ผมเลยทำ Bat ไว้ และก็ตั้ง Schedule ไว้ครับ โดยมีคำสั่งในส่วนของการ DROP & CREATE DATABASE ใหม่ ดังนี้ครับ เมื่อ Schedule Run ผลปรากฏว่าที่คำสั่ง DROP DATABASE มี Message แจ้งเตือน ดังนี้ครับ SQL1035N  The operation failed because the specified database cannot be  connected to in the mode requested.  SQLSTATE=57019 สาเหตุ DB2 ไม่ยอมให้ Drop ตรงๆผ่านการ Run แบบ Schedule ครับ การแก้ไข ก่อนที่เราจะ Run คำสั่ง Drop เราควรจะเตะ User ที่ใช้งาน Database อยู่ และปิด Database ก่อน Run คำสั่ง DROP ครับ โดยคำสั่งที่ได้มี ดังนี้ครับ

[REVIEW] Lenovo P90 หลังใช้งานจริงมา 2 สัปดาห์

2016-06-09 : มี Minor Update P90_S149_160504_ROW มาแล้วครับ ลองดูความเห็นส่วนตัวของผมได้ที่นี่ครับ 2016-02-01 : UPDATE นะครับ มือถือรุ่นนี้ โดยลอยแพเรื่องการ Update Android 5.0 (Lollipop) เรียบร้อยแล้วนะครับ โดยผมได้ไปสอบถามทาง FanPage Lenovo แต่ได้รับการบ่ายเบียง ถึงสาเหตุ ที่ไม่ได้ Update Software ครับ พอลองใช้งานนานๆสัก 2-3 เดือน เครื่องอืดมากครับ ใครที่คิดจะซื้อคิดดีๆก่อนนะครับ สำหรับ Update Lenovo รุ่นอื่นๆ สามารถติดตามได้จาก ที่นี่ ครับ  จริงๆผมไม่ได้อยากจะเปลี่ยนมือถือใหม่หรอกครับ แต่บังเอิญว่าเจ้า Lenovo P780 มันดันแยกร่าง 555 แยกในช่วงวันงาน Thailand Mobile Expo พอดี เลยได้ฤกษ์ในการเสียตังค์ครับ (จริงถ้าเครื่องนี้ไม่บึ้ม ผมมีแพลนที่จะเปลี่ยนช่วงเดือนกันยาอยู่แล้วครับ 2 ปี ุุ6 เดือน พอดีครับ) สำหรับ Spec ของเจ้า Lenovo P90 คร่าวๆครับ CPU Intel Atom Z3560 (Quad-core 1.83 GHz) GPU PowerVR G6430 RAM 2GB ROM 32 GB (ไม่สามารถใส่ SD Card เพิ่มได้ครับ หน้าจอ IPS 5.5 นิ้ว 1920 x 1080 pixel (รองรับ Multitouch ได้สูงสุด 5 นิ้วครับ ใส่ SIM ได้ 1 SIM แบบ Micro-SIM รองรับทุกค่ายมือถือในไทยรวมถึง 4G LTE…

[DB2] User Define Function – SQL Scalar Example

IBM DB2

พอดีมีรุ่นน้องให้สอนการเขียน Function บน DB2 ครับ โดย Function ที่ผมเขียนเป็นแบบ SQL Scalar Function โดยเจ้า SQL Scalar Function เป็น Function ที่คืนค่าผลลัพธ์ มีการคืนผลลัพธ์ออกมาค่าเดียวเสมอ โดยมีรูปแบบข้อมูล เช่น datetime, int, varchar เป็นต้นครับ ตัวอย่าง Scalar Function ที่มีในระบบพวก ABS() ที่ส่งตัวเลข เข้าไป คืนผลลัพธ์ที่ตัวเครื่องหมายแล้ว ออกมาค่าเดียวครับ เช่น ABS(-5) = 5 สำหรับ Function นี้ ผมขอเอาตัวอย่างจริงเลยและกัน(ขี้เกียจคิดครับ ฮ่าๆ) โดย Function นี้มีหน้าที่แปลงรอบการจ่าย COUPON FREQUENCY(รอบการจ่ายดอกเบี้ย) ของ BOND ออกมาเป็น TENOR CODE(ช่วงเวลาครับ เช่น 1 เดือน / 2 เดือน เป็นต้นครับ) เพราะในระบบเดิมมันเก็บ COUPON FREQUENCY ใน Table FIXEDINCOME ดังนี้ครับ  ID ในระบบ  ความหมาย 1 Monthly 2 Two Month 3 Quarterly 4 TRI-ANNUALLY 5 SEMI-ANNUALLY 6 ANNUALLY 7 AT CALL ซึ่งมันไม่สื่อถึงเวลาครับ โดยเจ้าข้อมูลที่สื่อถึงเวลามันอยู่ใน Table TENOR ดังนี้ครับ โดยมี Field ที่จำเป็น ดังนี้ Field Name ความหมาย TENOR ID ID ของ…