[DB2] SQL1159 Initialization error with DB2 .NET Data Provider / SQLSTATE IM004, Error Reason Code 10

IBM DB2

พอดี Application ที่ทำตัวเป็นลูกครึ่งผมระหว่างระบบเก่า และใหม่ จึงมีการเชื่อมต่อเข้ากับ DB2 2 แบบ ได้แก่ ODBC และ DB2 .NET Data Provider และพบ Error ดังนี้ สำหรับตัว ODBC มีรูปแบบ Error ดังนี้ สำหรับตัว DB2 .NET Data Provider มีรูปแบบ Error ดังนี้ การแก้ไข Reference

[Hudson, Jenkins] ใส่ไฟล์เพิ่มเข้าไปใน E-Mail แจ้งเตือน

jenkins

สำหรับ Blog ผมได้เขียนเกี่ยวกับการนำ Build Log ที่ได้จาก VB6 ไปใส่ใน Console Log ของตัว CI ครับ แต่ว่ามันทำไม่ได้ ผมเลยใช้วิธีง่ายๆเลยครับ แนบไฟล์ log ของการ Build ไปกับ Email ซะเลย 555 โดยมีขั้นตอน ดังนี้ สิ่งที่ต้องมี ขั้นตอนการ Config ครับ

ลองใช้ Hudson (ปัจจุบัน Jenkins) กับ Platform VB6

jenkins

พอดีเห็นงานที่บริษัทมันยุ่งยากมากกับการ Build Legacy Code เก่าอย่าง VBุ6 ที่มีปัญหามากมาย โดยย้าย Code จาก Microsoft Source Safe มายัง SVN แล้ว จากนั้นเชื่อมกับตัว Continuous Integration อย่าง Hudson ครับ เพื่อแก้ไขปัญหา ดังนี้ ลดข้อผิดพลาดจากการ Check In Source Code โดยทำให้ตัว CI Server ทดสอบ Build และแจ้งผลหากมีข้อผิดพลาด ทำ Automate Build ของ VB6 เพื่อลดการจากการอัตโนมือ ซึ่งมีข้ออผิดพลาดสูง และจากข้อที่แล้วที่มีการ Build สม่ำเสมอทำให้เราเอาตัว .exe หรือ DLL เหล่านั้นมาใช้ได้เลย โดยต้องมี ทำ Build Tools มาครอบ vb6.exe ดังนี้ pingkunga/VB6AutoBuildApp: VB6AutoBuildApp (github.com) //ได้ย้าย Code จาก svn > GitHub เลยมา Update Blog อีกที เพิ่ม job ใน Jenkins ให้มาเรียกตัว Build Tools พยายามทำ UI Test ถ้าทำได้ เพราะเท่าที่ลองหาข้อมูลดู Nunit กับ TestStack ในการทำ Test แบบ UI Test น่าจะมีความเป็นไปได้สูงสุด เพราะการไปปรับ Code ให้ VB6 รองรับ UnitTest เสียเวลามากเกินไป ยอม Rewrite เป็น…

[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