Sinthorn bookmark

พรุ่งนี้รีบเข้าหุ้น…ด่วนที่สุด แล้วต้องออกเมื่อไหร่ ตามเจ้าให้ทัน ติดหุ้นครับ cut loss ไม่ทัน ต้องเป็น VI จำเป็น ทำไงดี ลงทุนแบบ DCA ผ่านกองทุนย้อนหลัง 7 ปี ๙ แล้ว ๖ ๖ แล้ว ๙ หลังไมค์ว่าด้วย “๙ก้าวแล้ว๖หกล้ม” ที่ถามมาคือ หกล้มไปแล้วจะลุกขึ้นมาก้าวเดินใหม่อย่างไร ? แชร์ประสบการณ์ มนุษย์เงินเดือน เปิดบริษัท ครบรอบหนึ่งปี สำหรับคนที่กำลังสนใจในเรื่อง System Trade ผมว่าบทความนี้จาก pantip ดีมาก น่าอ่าน ผ่อนรถยนต์ ราคา 700,000 บาท 5 ปี เท่ากับคุณได้ทำเงินหายไป 1.3 ล้านบาท ในการออมเงินในหุ้น Excel ตารางบันทึกการซื้อขายหุ้น สอนการคิดค่างวดขั้นต่ำ (สำหรับผ่อนบ้าน/ที่อยู่อาศัย) เอาตารางคำนวณดอกเบี้ยบ้านใน Excel มาฝากครับ ผลตอบแทนแบบทบต้นตั้งแต่ลงทุน เครื่องมือวัดผลที่ควรใส่ใจ แจกโปรแกรมวิเคราะห์ผลตอบแทนเพื่อการศึกษาและเรียนรู้โดยไม่มีค่าใช้จ่ายใดๆทั้งสิ้น

[DB2] SQL0668N Operation not allowed for reason code 7 on table

IBM DB2

วันนี้ผมนั่งทำงานเขียน Code เขียน Query อย่างเบลอๆ พอลองมา Test Program ปุบ เจอ Error Message แจ้งเตือน ดังรูป โดยเจ้า Error Message นี้ เป็นการบอกว่า Table ของเราอยู่สถานะ Pending รอการ REORG TABLE (สำหรับคนที่ส่งสัยว่า REORG คือ อะไร ให้ตามไปอ่านกันครับ) ซึ่งมีสาเหตุ มาจากการที่ผมไปแก้ Datatype ของ Column ‘USERDESC’ ใน Table จาก varchar(30) ไปเป็น varchar(3oo) ครับ ส่วนทางแก้ไข ก็ง่ายๆครับ แต่รันคำสั่ง REORG TABLE  ที่เกิดปัญหา จากนั้นลอง Query ดูพบว่าสามารถใช้งานได้แล้วครับ Reference SQL0668N Operation not allowed for reason code 7

[SQL Server] ไม่สามารถแก้ไขโครงสร้าง Table ใน SQL Server 2008 ได้

สำหรับ DEV หรือ DBA มือใหม่ เมื่อได้สร้าง Table แล้ว เกิดต้องมีเหตุ กลับเข้ามาแก้ไขโครงสร้างของ Table อาจจะเกิดการ Change Requirement (จริงๆ จะแก้อะไรมันก็มาจากกรณีนี้เยอะมาก 555) หรือ ปรับโครงสร้างเพื่อเพิ่ม Performance เป็นต้น จะพบว่าตัว SQL Server เอง มันไม่ยอมให้เราแก้ไข โดยมี Message แจ้ง ดังรูป ก่อนที่เราจะรู้วิธีการแก้ไข ผมว่าเรามารู้ถึงสาเหตุดีกว่า ทำไมตัว SQL Server ถึงไม่ให้ก่อนดีว่า เพราะเนื่องจากบาง Operation ต้องมีการ Re-Created Table ใหม่ ซึ่งส่งผลกับ Data เดิมที่มีอยู่ใน Table เนื่องจากในบางกรณี เช่น การเปลี่ยน Data type ของข้อมูลใหม่ ถ้าเป็นข้อมูลประเภทตัวเลข อาจจะส่งผลถึงค่าพวกทศนิยม หรือการปัดเป็นจำนวนเต็ม จนทำให้ข้อมูลผิดพลาดได้ เป็นต้น โดยกลุ่มของ Operation ที่สางผลให้มีการ Re-Created Table ใหม่ จากประสบการณ์ที่ผมเจอมา มีดังนี้ การกำหนด Primary key เปลี่ยน data type ของ column ขยายขนาดของ column เช่น nchar(100) ไปเป็น nchar(200) สร้าง column ใหม่แล้วแทรกไปก่อนหน้า column เดิม ลบ column แก้ไขค่า null หรือ ค่า Default ของ column เปลี่ยนลำดับของ column พอรู้ถึงสาเหตุแล้ว ก็มาวิธีแก้ไขบ้าง โดยทำตามขั้นตอน ดังนี้ เข้าไปที่…

[DB2] การเพิ่ม Database Connection ใน Toad for DB2

IBM DB2

ถ้าคนที่เคยใช้ DB2 มา จะพบว่าตัว Database Manager ที่ใช้ในการจัดการ Query ต่างๆ มันช้า และไม่มี Feature ที่ช่วย User ได้ดีอย่างทางฝั่ง SQL Server และ Oracle และหลายๆคนก็น่าเคยใช้ Tools ตัวนึงที่ชื่อว่า Toad for DB2  กัน โดยวันนี้ผมมาแนะนำวิธีการ Setup DB Connection ครับ กรณีที่โปรแกรม ไม่สามารถไปดึงข้อมูลจาก ODBC ที่ตั้งไว้ครับ

[C#] คำแนะนำสำหรับการพัฒนา App แบบ Console เพื่อทำงานเป็น Batch ผ่าน Schedule Task

วันนี้มาเขียน Blog ดึกไปหน่อย ถือว่าฉลองเดือนธันวาคมที่แสนอบอุ่นและกัน 555 มาเข้าเรื่องกัน โดยหลายๆครั้งที่เราต้องพัฒนา Console App เพื่อทำงานในลักษณะที่เป็น Background Process ถ้าเป็นการเรียกใช้งานผ่านตัว User หรือ Application อื่นๆ อย่าง Winform โดยตรงมันก็ไม่มีปัญหาอะไรนัก แต่ถ้าเป็นการเรียกใช้ผ่าน Task Schedule หละ ? ปัญหาของผม คือ ว่า เราจะทำให้ตัว Task Schedule(หรืออาจจะเป็น App อื่นที่เรียกใช้ใน Batch) รู้ได้อย่างไรว่า Exe ที่เรียกใข้งาน มันทำงานเสร็จแล้ว ? ในตอนแรก ผมคิดว่าต้อง Kill Process นี้ทิ่งด้วยคำสั่ง [c language=”#”] Environment.Exit(); [/c] แต่สิ่งที่ผมคิดนั้น มันผิด เพราะตัว Caller อย่าง Task Schedule มันไม่รู้ว่าไฟล์ .exe ของเราเนี่ย ทำงานเสร็จ หรือยัง ทำให้เมื่่อถือเวลาที่ Schedule นั้นต้องทำงานอีกรอบ ระบบได้ไปสร้าง Thread ใหม่ขึ้นมาทำงานขนานกัน ซึ่ง Task ของผมตั้งให้มันทำงานทุกๆ 1 ชั่วโมง แต่ละครั้งมันจะใช้ Memory ประมาณ 500 MB ถ้าเจ้า Task Schedule มันไปสร้าง Thread ใหม่อีก 10 ครั้งหละ ? !!! System down !!! ลองไล่ดูอีกทีเราจะพบว่าทำไมระบบถึง Down ได้ สาเหตุเพราะว่าเจ้า Task Schedule มันไปสร้าง Task งานทุกๆ 1 ชั่วโมง…

[DB2] SQL0964C Transaction log for database is full

น่าจะเป็น Blog แรกของเดือนนี้มั้งที่ได้ Public พอดีช่วงนี้งานเยอะ เลยไม่ได้มาเขียนบ่อยๆ เขาเรื่องเลยและกัน คือ งานชิ้นปัจจุบันของผมใช้งาน Database DB2 ของ IBM ใช้ไปใช้มาพอถึงวันนึง จะ Delete ข้อมูลเท่านั้นแหละ ระบบได้แจ้ง Message เตือนขึ้นมา ดังรูป ก่อนจะเข้าเรืองกัน เราควรจะมีรู้เรื่องก่อนว่าเจ้า Transaction log คือ อะไร โดยตัว Transaction log มัน คือ บันทึกการทำงานของ Database เราทุกอย่างตั้งแต่ INSERT, UPDATE, DELETE หรือจะเป็นการแก้ไขโครงสร้างข้อมูลครับข้อมูล Log ที่เก็บไว้พวกนี้จะมีประโยชน์ในการใช้ Recovery Database ตอนที่ฐานข้อมูลของเราเกิดปัญหาครับ คราวนี้กลับมาที่ DB2 กันบ้าง โดยทางแก้ในการจัดการปัญหา SQL0964C Transaction log for database is full คือ การปรับแก้ Parameter LOGFILSIZ, LOGPRIMARY และ LOGSECOND เพื่อเพิ่มพื้นที่การจัดการกับ Transaction log ครับ โดยมีขั้นตอนคร่าวๆ ดังนี้ จากนั้นเราลองมาแก้ค่า Parameter ของแต่ละตัวกันครับ เมื่อแก้ไขข้อมูลครบถ้วนแล้ว เราก็ Restart Database ด้วยคำสั่ง db2stop และ db2start ก็เป็นอันเรียบร้อยครับ (อย่าลืมตรวจสอบว่ามีคนใช้งาน DB อยู่ หรือป่าวนะครับ ฮ่าๆ) วิธีนี้เป็นวิธิหนึ่งในการแก้ไขนะครับ โดยจะเป็นการขยายพื้นที่เพิ่มสำหรับเก็บ Log แต่จริงๆ ยังมีวิธีดู DB ด้วย db2pd จะได้ kill AppI Id ที่ update /…

[C#] Code Snipplet สำหรับการอ่าน CSV และยัดลง DataTable โดยใช้ CSVHelper

[c] DataTable dt = new DataTable(); using (var stream = File.OpenRead(filePath)) { using (var reader = new StreamReader(stream)) { using (var csvReader = new CsvReader(reader)) { int i = 0; while (csvReader.Read()) { if (i == 0) { foreach (var field in csvReader.FieldHeaders) { dt.Columns.Add(field); } } DataRow row = dt.NewRow(); foreach (var field in csvReader.FieldHeaders) { row[field] = csvReader.GetField(field); } dt.Rows.Add(row); i += 1; } } } } return dt; [/c]

[Database] ข้อควรระวังในการใช้ TABLOCKX

brass padlock on rusty metal wire

ก่อนอื่นเลยขอบอกเลยว่า ปัญหานี้เกิดจากความสะเพร่าของผมเอง (ยังดีที่ไม่ส่งโปรแกรมให้ลูกค้า ไม่งั้นยาว) เกิดจากการเขียน Query ที่ผิดพลาด ทำให้ Table ใน Database ถูก Lock ไม่ให้แก้ไข ซึ่งส่งผลให้ User คนอื่นๆทำงานไม่ได้ เดี๋ยวจะงงไปกันใหญ่ว่าทำไมผิดเขียนโปรแกรมแล้ว Table ดัน Lock ได้  ผมของอธิบายที่มากันก่อน ปัญหา ปัญหา คือ เราต้องตรวจสอบการ Accept Transaction ของลูกค้า ว่าได้ถูก Accept โดยพนักงานไป หรือไม่ แต่ปัญหามันเกิดว่าเครื่องแรกกด Accept ไปแล้ว แต่เครื่องที่ 2 ไม่เห็นทำให้เกิดการ Accept รายการซ้ำ ทำให้ข้อมูลที่ได้ ไม่ถูกต้อง การแก้ไข ทางทีมเลยใช้หลักการ ISOLATION Level ของฐานข้อมูลมาแก้ปัญหา โดยนำคำสั่ง TABLOCKX เพื่อ Lock Table ให้สามารถอ่านได้เพียงอย่างเดียวเท่านั้น แต่มีอีกสาเหตุด้วย คือ การเขียน Query ที่ ทำให้เกิด DeadLock คือ Table นั้นไม่สามารถแก้ไขได้ ลองดูตัวอย่างครับ เขียนทั้งแบบ SELECT ทุก Column และไม่มีการกรองเงื่อนไขใดๆด้วย พอไปเจอคุณสมบัติของ TABLOCKX กลายเป็นว่าแทนที่จะ Lock Record ที่สนใจ กลายเป็นว่า Lock ทั้ง Table พออีก Process ที่เข้ามา INSERT หรือ SELECT มันอ่านไม่ได้ และเกิด Timeout ไปครับ ที่ควรทำตอน Lock Table ควรกำหนดเงื่อนไขด้วย และเลือกเฉพาะข้อมูลที่ต้องการใช้งานจริงๆครับ หมายเหตุ การ Lock แบบนี้จะเป็นแบบ…

[C#] สรุปข้อดี-ข้อเสียในการอ่านกับเขียน Excel จากวิธีต่างๆ

พอดีช่วงนี้มีงานที่ให้ดึงไฟล์จากเว็บมา และเรามาจัดแต่งรูปแบบไฟล์ Excel นั้น เพื่อ Import เข้าระบบครับ โดยผมได้ทดลองศึกษามา และขอเปรียบเทียบข้อดีข้อเสียไว้ เผื่อมีคนอื่นมาใช้งานครับ แนวทางที่ 1: การใช้ OLEDB จุดเด่น ทำงานได้รวดเร็ว ไม่จำเป็นต้องติดตั้ง Microsoft Office ลงที่เครื่อง Data Type ของแต่ละ Column ระบบจะมองเป็นจากแนวแรกที่อ่าน (อารมณ์เดียวกับการใช้ตารางครับ) จุดด้อย การอ่านข้อมูลเฉพาะตามเงื่อนไข หรือ Pattern ที่กำหนดนั้นทำได้ยาก การแก้ไขไฟล์ Excel นั้นทำได้ยาก แนวทางที่ 2: การใช้ Excel Interop Object จุดเด่น สามารถจัดการอ่าน/เขียนไฟล์ Excel ที่ซับซ้อนได้ เช่น อ่านตาม Worksheet และอ่านไปที่ Cell A23 ถึง F23 เป็นต้น จุดด้อย ต้องลง Microsoft Office และต้องดูด้วยว่าเวอร์ชันของ DLL นั้นเหมาะสมกับรูปแบบไฟล์ที่ต้องการจัดการ หรือไม่ ทำงานได้ช้า เมื่อเทียบกับแนวทางที่ 1 แนวทางที่ 3: ใช้ Component เสริม ที่เป็น Third Party ครับ ซึ่งมีอยู่มากมายลงหาจาก Google ดูครับ จุดเด่น ไม่ต้องมี Code กับการจัดการในส่วนของการติดต่อไฟล์มากมาย จุดด้อย ต้องศึกษาคุณสมบัติของ Component แต่ละตัวว่าเหมาะสมกับงานที่เราต้องการใช้ง่าน หรือไม่ เพราะ ถ้า Requirement เปลี่ยนที่ เราอาจจต้องเปลี่ยน Component เสริม ครับ แนวทางที่ 4: ใช้ Excel VBA จัดการ จุดเด่น…

[XM] 1st Time: ไปประชุมผู้ถือหุ้นครั้งแรก

สำหรับนักลงทุน ผลประโยชน์ที่ได้รับการจากลงทุนนอกจากความรู้ด้านการเงินแล้ว ยังมีผลประโยชน์ที่ได้จากส่วนต่าง (Capital Gain) ที่เกิดจากการขายหุ้นนั้นออกไป และสิทธิประโยชน์ต่างๆในหุ้น(Corporate Action) ถ้าใครงงเจ้าตัว Corporate Action ลองนึกตัวอย่างใกล้ตัวที่สุด คือ XD, XR และตระกูล X ทั้งหลาย ตอนนี้ผมขอโฟกัสที่ XM นะครับ โดยตัว XM คือ สิทธิที่ได้รับการเข้าประชุมของหุ้นที่เราได้ถืออยู่นะครับ XM มันมีดีอย่างไร เป็นงานแรกที่เราจะได้พบผู้บริหารได้อย่างใกล้ชิด มีโอกาศสอบถามข้อสงสัยต่างๆได้ ได้พบปะ นักลงทุนคนอื่นๆ และแลกเปลี่ยนความคิดเห็นครับ อาหารฟรี และของที่ระลึกครับ (มีบางคนถือหุ้น 100 หน่วย มาเพื่อเดินสายในงานนี้ โดยเฉพาะนะครับ) การไปใช้สิทธิ XM เราต้องเตรียมตัวอย่างไร อ่านเอกสารที่ได้มา อย่างครบถ้วนครับ จงอย่าลืมว่าเราซื้อหุ้น หมายถึง เราเป็นเจ้าของคนนึงของบริษัทที่เราสนใจนะครับ ซึ่งจะต่างกับการซื้อพันธบัตร หุ้นกู้ ที่เราจะเป็นเจ้าหนี้ของบริษัท ตรวจสอบเอกสารที่แนบมาครับ โดยจะมีอย่างน้อย 2 อย่าง ได้แก่ แบบฟอร์มลงทะเบียน และ หนังสือเชิญชวนครับ (แต่บางทีอาจจะมีรายงานความเห็นของที่ปรึกษาทางการเงิน แนบมาเพิ่มด้วยครับ ศึกษาเส้นทางการไปสถานที่ประชุม เมื่อถึงวันประชุมผู้ถือหุ้น ? เข้านอนเร็วๆ จะได้ไม่ตื่นสาย อย่าลืมเอกสารสำคัญที่ทางบริษัทส่งให้ครับ และเอกสารแสดงตัวตน เช่น บัตรประจำตัวประชาชน หรือเอกสารการรับอำนาจในการใช้สิทธิแทนครับ อย่าลืมสติไปครับ สำหรับหุ้นที่ผมไปใช้สิทธิในการประชุมครั้งนี้ คือ IFEC ครับ พอดีวันที่ประชุมเป็นวันศุกร์ที่ 24 ตุลาคม พ.ศ. 2557 ปกติคนส่วนใหญ่จะลาหยุดกัน ผมเลยถือโอกาสมาด้วย เพื่อมาฟังการประชุมผู้ถือหุ้นครั้งแรกครับ โดยเมื่อมาถึงสถานที่ประชุม สิ่งที่เราต้องทำ คือ ตรวจสอบเอกสาร ลงทะเบียนเข้าประชุม โดยพนักงานจะนำตัวอ่าน Barcode มาอ่านข้อมูลจากแบบฟอร์มลงทะเบียนไปนะครับ ทางที่ดีอย่าให้ใบนี้ยับ หรือขาด เด็ดขาดครับ หาสถานที่ดีๆครับ เผื่อมีสื่อต่างๆ เช่น Power Point หรือ Video…