[WordPress] แสดง Source Code อย่างมีสีสันบน Blog ของเรา

wordpress

ผมได้เขียน Blog มานานหลายปีแล้ว ซึ่งใน Blog แต่ละตอน อาจจะต้องมีแทรก Code snippet บ้าง เพื่ออธิบาย หรือเป็นตัวอย่างให้กับผู้อ่านได้เห็นภาพนะครับ โดยวันนี้ผมเลยอยากจะมีแนะนำ Plug-in ช่วยแสดง Source Code อย่างมีสีสันบน Blog ของเรา จากประสบการณ์ที่ได้ลองมาหลายตัวนะครับ Crayon Syntax Highlighter SyntaxHighlighter Evolved สำหรับ Plug-in ตัวนี้ ผมใช้มานานแล้วครับ หลังจากบอกจุดเด่น/จุดด้อยไปแล้ว ของแต่ละ Plugin ที่ผมคิดว่าดี และเหมาะกับ WordPress นะครับ สำหรับผมตอนนี้พยายามใช้ Crayon Syntax Highlighter เพราะ Config น้อยและไม่ต้องจำ Tag พิเศษเพิ่มนะครับ แสดง Highlight จากที่มาได้หลายแหล่งครับ และอาจจะเพิ่ม โดยอาจจะลิงค์จาก Git หลังจากที่สมัครไว้มานานเลย แต่ยังไม่ได้ commit อะไรขึ้นไป 555

2015 ผ่านไป Blog นี้มีอะไรบ้างนะ

หนึ่งปีผ่านไปไวเหมือนโกหก จากปีเคยสรุปสิ่งที่ผ่านมาของปี 2014 คราวนี้มาเป็นที่ของปี 2015 ที่เพิ่งผ่านไปครับ ถ้าดูจาก Jet Pack ที่เก็บสถิติแล้วจะพบว่าผมขยันเขียน Blog ที่สุดก็ข่วงต้นปีนะครับ หลังๆก็ว่างเว้นไป เพราะ ยังจัดปล่อยให้งานเข้ามารบกวนเวลาส่วนตัวมาจนเกินไป (เอางานกลับมาทำเพื่อให้โปรเจค มันสามารถ Go Live ได้ ปัญหาหลักๆของกรรมกรไอทีอย่างเราเลย เรื่องการประเมินเวลาทำงานจริง กับเวลาที่ลูกค้าต้องการ) โดยในปีนี้มี Blog ยอดนิยมที่มีผู้ชมทั้งหมด 5 เรื่อง ดังนี้ [.NET] ปรับ Speed ให้ Visual Studio เร็วแรงทะลุนรก (ปี 2015) [REVIEW] Lenovo P90 หลังใช้งานจริงมา 2 สัปดาห์ (ปี 2015 – หวังว่ามีใครจะมาจ้างให้รีวิวจริงๆจังบ้าง อยากได้ตังค์ 555) [JAVA] Abstract คือ อะไร และต่างกับ Interface อย่างไร (ปี 2014 – จำได้ว่าเคยมีปรับแกข้อมูล จากที่มีคนอ่านบอกว่าอ่านยากในปี 2015) ลองตัดแว่นกับร้านแว่นตาคนจน (ปี 2014) [C#] สรุปข้อดี-ข้อเสียในการอ่านกับเขียน Excel จากวิธีต่างๆ (ปี 2014) จากข้อมูลทั้งหมดพบว่า Blog ที่มีคนสนใจจะมีของปี 2015 แค่ 2 ฺBlog เท่านั้นครับ ส่วนที่เหลือจะเป็นของปีก่อนหน้านะครับ ถัดมาดูสถิติการเข้าชมของเว็บ โดยผมได้นำข้อมูลมาจาก 2 แหล่ง ดังนี Google Analytics นับจาก Unique User (ภาพที่ 1) นะครับ คราวนี้คนจะมาจาก Google ส่วนใหญ่นะครับ เพราะหลังๆไม่ค่อยได้แชร์ Blog แล้ว ถัดมาก็เป็นสัดสวนผู้ชมนะครับ และก็ช่วงเวลาที่มีการชม Blog…

คิดให้เยอะ ลงมือทำให้น้อยที่สุด

หลายๆคนอาจจะเคยเห็นภาพนี้แล้วนะครับ มันสื่อถึงอะไร หละ ? บางคนอ่านแล้ว ก็หัวเราะเลย บางคนยังไม่ Get  จากภาพนี้ในมุมของผม ตีความถึงการมองปัญหาครับ ทุกปัญหา เราไม่สามารถใช้วิธีการเดียวกันจัดการกับมันได้ เราต้องค่อยๆลับปัญหาเปลี่ยนมุมมองบ้าง โดยในแง่ของการพัฒนา Software สิ่งที่มาขยาย ปรับ องศา มุมมองที่มีต่อปัญหา ได้แก่ Requirement(ต้องชัดเจน ใช้ได้แค่ทฤษฏีนะ แต่ในความเป็นจริงก็รู้ๆกันอยู่ 555) Skill ที่ใช้ในการวิเคราะห์ปัญหา อันนี้อาจจะต้องใช้ประสบการณ์สะสมนะครับ ว่าแต่ละปัญหาเกิดจากอะไร ตรงนี้เป็นปัญหาสำหรับ Dev ส่วนใหญ่ที่ผมเจอมาเลย คือ เขียนโปรแกรมได้ แต่พอโปรแกรมผิิดขึ้นมา ยังไม่สามารถวิเคราะห์จุดที่ผิดได้ครับ (ตามรูปด้านบนที่ผมเอามาอ้างเลย) ความเข้าใจของคนกลุ่มต่างๆ ต่อชิ้นงานที่ทำ ตั้งแต่ User / PM / BA / SA และ DEV (อันนี้เคยมีภาพล้อเลียน ที่เกี่ยวกับการสรร้างชิงช้าขึ้นมา แต่ในมุมมองของแต่ละฝ่ายต่างกันไปคนละทางเลย) ความเชี่ยวชาญในเครื่องมือ และภาษาที่ใช้ ถ้ารู้เรื่องพวกนี้ มันจะช่วยได้ในแง่ของ Performance คิดตั้งแต่ตอน Code ดีกว่ามาไล่ปรับระบบที่ทำงานถูกต้องแล้ว การประุชม ปรึกษาครับ กับทีม และก็ User ครับ เพราะ บางครั้ง เรามี Bias อยู่ ทำให้เราอาจจะมองว่าวิธีนี้ดีมากกกกก จนทำให้ความเสี่ยงของปัญหามันหายไปดิ้อๆ แต่จู่ๆมาโผล่ตอนใช้งานจริง O.o (ผมเคยเจอประสบการณ์จริงเลย ที่ Process/ Business มันโผล่มาลอยๆ ดูมีหลักการ แต่ไม่เคยไปคุยกับ User เลย พอทำเสร็จ ก็ตู้มมมมมม ผิด) และอื่นๆ (แต่ผมนึกออกได้เท่านี้แหละ 555)

[DB2] ลองใช้ Execution Plan เพื่อดูว่า Query ที่เขียนนั้นแย่ หรือไม่

IBM DB2

บทความแรกของปี 2016 เลย (จริงๆ Plan ว่าจะเขียนนานแล้ว แต่ติดงานประจำที่ Change บ่อยมากๆ) วันนี้เลยไปเจอ Shell Script ของ AIX ตั้งนึง ที่ทำหน้าดึงข้อมูลมาใส่ใน Temp Table และส่งออกเป็น Text File ไประบบอื่นผ่าน FTP แต่ปัญหา คือ ว่ามันช้ามากกกกกกกกกกกกก รันเกือบ 20 นาทียังไม่ออกเลย จาก Query ตัวอย่าง เราจะพบว่า มัน Self Join เยอะมากก ซึ่งใน DBMS ถ้าตัวเจ๋งๆ มันจะแลาดพอที่จะแปลง Query ให้ดีขึ้น หรืออย่างน้อยมี Execution Plan ช่วยตรวจสอบครับ (ราคา License ของ DB แต่ละเจ้าที่มันแพงๆ ก็เพราะ Feature เหล่านี้แหละ) งานที่ทำอยู่ DB2 เลยลองใช้ Execution Plan บน Toad และกัน ตัว IBM Data Studio มันโคตรกินแรม 5555 Execution Plan ที่ได้ครับ พบว่ามันมีส่วนของ Table Scan เยอะมากกกกครับ จำเป็นที่จะต้องลง Table Scan ให้น้อยที่สุด โดยการเพิ่ม Index ครับ การเพิ่ม Index ที่ดี เราต้องมาดู Query ที่เราใช้กันบ่อยๆก่อนนะครับ เพราะ ถ้าเพิ่ม Index ไม่เหมาะสมมันส่งผลกับการ Insert/Update นะ และตอนนี้จากการ Scan Query คร่าวๆ ดูแล้วพวกว่ามีการ Self join…

[.NET] ปัญหาราวๆ กับตัวเลขจอมแสบ

หากได้ทำงานเกี่ยวกับระบบด้วยการเงินแล้วเนี่ย ตัวเลขสำคัญมากนะครับ ปัญหาของผมเกิดจากการพัฒนาระบบงานบน .NET ด้วย C# แล้วต้องไปเทียบตัวเลขกับ ระบบงานที่เป็น VB6 แล้วปรากฏว่า มันหายไป 0.01 เลขปริศนาที่หายไป แต่ฝ่ายบัญชีไม่ยอมมมมมม ถ้าหายไปสัก 50 ล้าน มันยังหาได้ง่ายกว่าเลย แล้วใครหละที่เป็นโจร ? จริงแล้วมันเป็นปัญหาที่สะสมมานานตั้งแต่ของ VB6 ที่มีการปัดทศนิยมเศษ 5 แปลกๆ ทำให้ทีมที่ทำระบบเดิมในยุคนั้นมีการ Custom Function ขึ้นมาแก้ปัญหาจุจิกนี้ โดยเฉพาะครับ ซึ่งมีแนวคิดว่าเจอ 5 ปัดขึ้น สำหรับแนวคิดนี้นิยมใช้ในการบัญชี การเงินครับ หลังจากดู Legacy Code เรามาดูอัลกอริทึมที่ VB6 ใช้ดีกว่าครับ เจ้า VB6 ใช้อัลกอริทึมในการ Rounding คือ Banker’s Rounding สาระสำคัญ คือ ต่ำกว่า 4 ปัดลง มากกว่า 6 ปัดขึ้น ปัญหา คือ เลข 5 เนี่ยแหละ ต้องดูตัวเลขข้างหน้า 5 หากเป็นเลขคี่ ก็ให้ปัดขึ้น หากไม่ใช่ก็ให้ปัดเศษทิ้ง (นายแบงค์นี่น่าเลือดจริงๆครับ) ระบบเดิมที่ผมไป Cross Check ใช้ Function Round5up ที่แก้ปัญหานี้เรียบร้อยแล้ว ขอเสริม อีกนิดนึง คือ ในคอม ถ้าเราป้อน 1.50 มันไม่ได้เก็บ 1.50 ลงไปนะครับ มันแปลงเป็นเลขฐาน 2 เนี่ยแหละ โดยอาจจะเป็น 1.4999999999999 แล้วมาใช้อัลกอริทึมในการ Rounding อีกทีนะครับ (เดี๋ยวไปเขียน Blog แยกไปอธิบายอีกทีครับ) จริงๆ .NET กับ VBA ก็ใช้วิธี Banker’s…

[DB2] Set DB2CODEPAGE

CODEPAGE คือ อะไร ? ทำไมภาษาไทย อันเดียวถึงมีหลากหลาย CODEPAGE ? CODEPAGE มีในระดับไหนบ้าง ? มีหลายระดับเลย ได้แก่ DB2 ดู CODEPAGE ได้อย่างไร คำสั่งที่ใช้ในการ SET CODEPAGE เช่น Windows- 874 สำหรับ ERROR CODE ที่ดูแล้วเป็นเรื่อง CODEPAGE มี ดังนี้ SQL0332N  Character conversion from the source code page “874” to the target code page “UNKNOWN” is not supported.  SQLSTATE=57017

[DB2] เปิดใช้งาน Hierarchical Queries

IBM DB2

Hierarchical queries อันนี้จริงๆเป็น Feature ลับของทาง Oracle ครับ โดยนำมาช่วยให้สามารถ Query ข้อมูลยาก และซับซ้อนได้ง่ายขึ้นครับ เช่น มีข้อมูล Company อยากรู้ว่า Company รายการนี้ มีบริษัทลูกกี่ตัว เป็นต้นครับ (อันนี้เดี๋ยวของไปเขียน Blog ยกอีกตอนครับ หุหุ) สำหรับการเปิดใช้ Feature Hierarchical queries สามารถใช้คำสั่งง่ายๆ ดังนี้ ข้อควรระวัง: การเปิดใช้ Hierarchical queries นั้นช่วยให้สามารถ Query ข้อมูลแบบลำดับขั้นได้แล้ว แต่ Performance ของ DB จะช้าลงด้วยนะครับ และ SQL จะมีรูปแบบพิเศษ ทำให้ยากต่อการ Port ไป DBMS ตัวอื่นๆ Reference: Hierarchical Queries

[CR] รีวิวร้านรถ Mother Trucker Burger

รีบกลิ้งจากออมสิน มาเพื่อกินร้านนี้ แต่..จะเรียกว่าเป็นร้าน หรือเป็นรถ โดยร้านนี้ตระเวณขาย Burger รอบกรุงเทพใน Concept “สะใจ ใหญ่ โหด” พอตอนไปถึงร้านที่ Lavilla อารีย์ มีเมนู 2 แบบนะครับ คือ หมู 150 บาท และก็เนื้อ 180 บาทครับ (ถ้าอยากได้แบบ Double ก็ 220 กับ 280 ครับ) จัดไปอย่ารอช้าเลยสั่งเนื้อมา 1 ชุดครับ (อีกสองอันของคนอื่น 5555) Burger ไม่ใหญ่ แต่หนาครับ ต้องค่อยๆกิน ปรับองศาให้พอดีกับปาก หรือจะใช้ช้อนส้อมมาตัดแบ่งก็ได้ครับ แป้งขนมปัง Burger ร้อน + ชีสเต็ม + หัวหอมทอด + เนื้อเข้มๆ ละมุนลิ้น + เบคอน และส่วนผสมอื่นๆ เข้ากันได้อย่างลงตัวครับ ติดอย่างเดียว คือ เรื่องราคาที่แพงไปนิดนึง ไม่งั้นคงได้กิน 3 ชิ้น 55555 ————————————————————————————————————– สำหรับใครอยากรู้ว่าร้านจะไปประจำที่ไหนบ้างคิดตาม FฺB Page ของทางรถ หรือทางร้านได้เลยครับ ————————————————————————————————————–

[AIX] Change Server Date

สำหรับคนที่ใช้ AIX อาจจะต้องมีการย้อนเวลาที่เครื่อง Server บ้าง เราสามารถใช้คำสั่ง date ได้ครับ โดยถ้าพิมพ์ [shell]date[/shell] เพื่อแสดงวันที่ปัจจุบัน แต่ถ้าต้องการแก้วันที่ เราต้องใช้คำสั่ง ดังนี้ครับ [shell] ::date MMDDHHMMYYYY << รูปแบบ Parameter ที่ต้องส่งเข้าไปเป็น เดือน วัน ชั่วโมง นาที และปี date 093015302015 [/shell] จากคำสั่งข้างต้นเป็นการ Set วันที่ให้ AIX เป็นวันที่ 9 กันยายน ปี 2015 (AIX ไม่รู้จัก พ.ศ. นะ) เวลา 15:30 ครับ